From 58c89eecf9fef17248dacab1d4925c236c7ac17e Mon Sep 17 00:00:00 2001 From: Matthew Dean Date: Tue, 28 Jul 2020 19:14:29 -0700 Subject: [PATCH 01/19] Remove math=strict-legacy, set default=parens-division --- packages/less/bin/lessc | 17 +- packages/less/src/less/constants.js | 2 +- packages/less/src/less/default-options.js | 44 +-- .../src/less/functions/function-caller.js | 40 ++- packages/less/src/less/tree/expression.js | 4 +- packages/less/src/less/utils.js | 6 +- packages/less/test/index.js | 17 +- .../always}/mixins-guards.css | 0 .../always}/no-sm-operations.css | 0 .../test-data/css/math/strict-legacy/css.css | 95 ------- .../css/math/strict-legacy/media-math.css | 10 - .../css/math/strict-legacy/mixins-args.css | 163 ----------- .../css/math/strict-legacy/parens.css | 40 --- .../no-strict/no-strict.css} | 0 .../strict}/strict-units.css | 0 .../always}/mixins-guards.less | 0 .../always}/no-sm-operations.less | 0 .../less/math/strict-legacy/css.less | 108 ------- .../less/math/strict-legacy/media-math.less | 9 - .../less/math/strict-legacy/mixins-args.less | 263 ------------------ .../less/math/strict-legacy/parens.less | 50 ---- .../less/namespacing/namespacing-3.less | 2 +- .../no-strict/no-strict.less} | 0 .../strict}/strict-units.less | 0 24 files changed, 68 insertions(+), 802 deletions(-) rename packages/test-data/css/{no-strict-math => math/always}/mixins-guards.css (100%) rename packages/test-data/css/{no-strict-math => math/always}/no-sm-operations.css (100%) delete mode 100644 packages/test-data/css/math/strict-legacy/css.css delete mode 100644 packages/test-data/css/math/strict-legacy/media-math.css delete mode 100644 packages/test-data/css/math/strict-legacy/mixins-args.css delete mode 100644 packages/test-data/css/math/strict-legacy/parens.css rename packages/test-data/css/{legacy/legacy.css => units/no-strict/no-strict.css} (100%) rename packages/test-data/css/{strict-units => units/strict}/strict-units.css (100%) rename packages/test-data/less/{no-strict-math => math/always}/mixins-guards.less (100%) rename packages/test-data/less/{no-strict-math => math/always}/no-sm-operations.less (100%) delete mode 100644 packages/test-data/less/math/strict-legacy/css.less delete mode 100644 packages/test-data/less/math/strict-legacy/media-math.less delete mode 100644 packages/test-data/less/math/strict-legacy/mixins-args.less delete mode 100644 packages/test-data/less/math/strict-legacy/parens.less rename packages/test-data/less/{legacy/legacy.less => units/no-strict/no-strict.less} (100%) rename packages/test-data/less/{strict-units => units/strict}/strict-units.less (100%) diff --git a/packages/less/bin/lessc b/packages/less/bin/lessc index 18599a728..6037df5e8 100755 --- a/packages/less/bin/lessc +++ b/packages/less/bin/lessc @@ -554,7 +554,7 @@ function processPluginQueue() { if (checkArgFunc(arg, match[2])) { if (checkBooleanArg(match[2])) { - options.math = Constants.Math.STRICT_LEGACY; + options.math = Constants.Math.PARENS; } } @@ -562,8 +562,19 @@ function processPluginQueue() { case 'm': case 'math': - if (checkArgFunc(arg, match[2])) { - options.math = match[2]; + var m = match[2]; + if (checkArgFunc(arg, m)) { + if (m === 'always') { + console.warn('--math=always is deprecated and will be removed in the future.'); + options.math = Constants.Math.ALWAYS; + } else if (m === 'parens-division') { + options.math = Constants.Math.PARENS_DIVISION; + } else if (m === 'parens' || m === 'strict') { + options.math = Constants.Math.PARENS; + } else if (m === 'strict-legacy') { + console.warn('--math=strict-legacy has been removed. Defaulting to --math=strict'); + options.math = Constants.Math.PARENS; + } } break; diff --git a/packages/less/src/less/constants.js b/packages/less/src/less/constants.js index 3c57c7ec6..635583ae7 100644 --- a/packages/less/src/less/constants.js +++ b/packages/less/src/less/constants.js @@ -3,7 +3,7 @@ export const Math = { ALWAYS: 0, PARENS_DIVISION: 1, PARENS: 2, - STRICT_LEGACY: 3 + // removed - STRICT_LEGACY: 3 }; export const RewriteUrls = { diff --git a/packages/less/src/less/default-options.js b/packages/less/src/less/default-options.js index a87b84333..4c7063f17 100644 --- a/packages/less/src/less/default-options.js +++ b/packages/less/src/less/default-options.js @@ -7,60 +7,60 @@ export default () => ({ depends: false, /* (DEPRECATED) Compress using less built-in compression. - * This does an okay job but does not utilise all the tricks of - * dedicated css compression. */ + * This does an okay job but does not utilise all the tricks of + * dedicated css compression. */ compress: false, /* Runs the less parser and just reports errors without any output. */ lint: false, /* Sets available include paths. - * If the file in an @import rule does not exist at that exact location, - * less will look for it at the location(s) passed to this option. - * You might use this for instance to specify a path to a library which - * you want to be referenced simply and relatively in the less files. */ + * If the file in an @import rule does not exist at that exact location, + * less will look for it at the location(s) passed to this option. + * You might use this for instance to specify a path to a library which + * you want to be referenced simply and relatively in the less files. */ paths: [], /* color output in the terminal */ color: true, /* The strictImports controls whether the compiler will allow an @import inside of either - * @media blocks or (a later addition) other selector blocks. - * See: https://github.com/less/less.js/issues/656 */ + * @media blocks or (a later addition) other selector blocks. + * See: https://github.com/less/less.js/issues/656 */ strictImports: false, /* Allow Imports from Insecure HTTPS Hosts */ insecure: false, /* Allows you to add a path to every generated import and url in your css. - * This does not affect less import statements that are processed, just ones - * that are left in the output css. */ + * This does not affect less import statements that are processed, just ones + * that are left in the output css. */ rootpath: '', /* By default URLs are kept as-is, so if you import a file in a sub-directory - * that references an image, exactly the same URL will be output in the css. - * This option allows you to re-write URL's in imported files so that the - * URL is always relative to the base imported file */ + * that references an image, exactly the same URL will be output in the css. + * This option allows you to re-write URL's in imported files so that the + * URL is always relative to the base imported file */ rewriteUrls: false, /* How to process math - * 0 always - eagerly try to solve all operations - * 1 parens-division - require parens for division "/" - * 2 parens | strict - require parens for all operations - * 3 strict-legacy - legacy strict behavior (super-strict) - */ - math: 0, + * 0 always - eagerly try to solve all operations + * 1 parens-division - require parens for division "/" + * 2 parens | strict - require parens for all operations + * 3 strict-legacy - legacy strict behavior (super-strict) + */ + math: 1, /* Without this option, less attempts to guess at the output unit when it does maths. */ strictUnits: false, /* Effectively the declaration is put at the top of your base Less file, - * meaning it can be used but it also can be overridden if this variable - * is defined in the file. */ + * meaning it can be used but it also can be overridden if this variable + * is defined in the file. */ globalVars: null, /* As opposed to the global variable option, this puts the declaration at the - * end of your base file, meaning it will override anything defined in your Less file. */ + * end of your base file, meaning it will override anything defined in your Less file. */ modifyVars: null, /* This option allows you to specify a argument to go on to every URL. */ diff --git a/packages/less/src/less/functions/function-caller.js b/packages/less/src/less/functions/function-caller.js index 346ab82e4..109923f25 100644 --- a/packages/less/src/less/functions/function-caller.js +++ b/packages/less/src/less/functions/function-caller.js @@ -15,36 +15,30 @@ class functionCaller { } call(args) { + if (!(Array.isArray(args))) { + args = [args]; + } const evalArgs = this.func.evalArgs; if (evalArgs !== false) { args = args.map(a => a.eval(this.context)); } + const commentFilter = item => !(item.type === 'Comment'); + // This code is terrible and should be replaced as per this issue... // https://github.com/less/less.js/issues/2477 - if (Array.isArray(args)) { - args = args.filter(item => { - if (item.type === 'Comment') { - return false; - } - return true; - }) - .map(item => { - if (item.type === 'Expression') { - const subNodes = item.value.filter(item => { - if (item.type === 'Comment') { - return false; - } - return true; - }); - if (subNodes.length === 1) { - return subNodes[0]; - } else { - return new Expression(subNodes); - } + args = args + .filter(commentFilter) + .map(item => { + if (item.type === 'Expression') { + const subNodes = item.value.filter(commentFilter); + if (subNodes.length === 1) { + return subNodes[0]; + } else { + return new Expression(subNodes); } - return item; - }); - } + } + return item; + }); if (evalArgs === false) { return this.func(this.context, ...args); diff --git a/packages/less/src/less/tree/expression.js b/packages/less/src/less/tree/expression.js index d1be1a9ac..b4fc83a3f 100644 --- a/packages/less/src/less/tree/expression.js +++ b/packages/less/src/less/tree/expression.js @@ -23,9 +23,7 @@ class Expression extends Node { eval(context) { let returnValue; const mathOn = context.isMathOn(); - - const inParenthesis = this.parens && - (context.math !== MATH.STRICT_LEGACY || !this.parensInOp); + const inParenthesis = this.parens; let doubleParen = false; if (inParenthesis) { diff --git a/packages/less/src/less/utils.js b/packages/less/src/less/utils.js index 5c55ca979..a602f70b6 100644 --- a/packages/less/src/less/utils.js +++ b/packages/less/src/less/utils.js @@ -59,7 +59,7 @@ export function copyOptions(obj1, obj2) { } const opts = defaults(obj1, obj2); if (opts.strictMath) { - opts.math = Constants.Math.STRICT_LEGACY; + opts.math = Constants.Math.PARENS; } // Back compat with changed relativeUrls option if (opts.relativeUrls) { @@ -77,8 +77,8 @@ export function copyOptions(obj1, obj2) { case 'parens': opts.math = Constants.Math.PARENS; break; - case 'strict-legacy': - opts.math = Constants.Math.STRICT_LEGACY; + default: + opts.math = Constants.Math.PARENS; } } if (typeof opts.rewriteUrls === 'string') { diff --git a/packages/less/test/index.js b/packages/less/test/index.js index 6dba330ed..0924725f6 100644 --- a/packages/less/test/index.js +++ b/packages/less/test/index.js @@ -13,15 +13,15 @@ var testMap = [ javascriptEnabled: true }, '_main/'], [{}, 'namespacing/'], - [{ - math: 'strict-legacy' - }, 'math/strict-legacy/'], [{ math: 'parens' }, 'math/strict/'], [{ math: 'parens-division' }, 'math/parens-division/'], + [{ + math: 'always' + }, 'math/always/'], // Use legacy strictMath: true here to demonstrate it still works [{strictMath: true, strictUnits: true, javascriptEnabled: true}, '../errors/eval/', lessTester.testErrors, null], @@ -39,8 +39,10 @@ var testMap = [ // TODO: Change this to rewriteUrls: false once the relativeUrls option is removed [{math: 'strict', relativeUrls: false, rootpath: 'folder (1)/'}, 'static-urls/'], [{math: 'strict', compress: true}, 'compression/'], - [{math: 0, strictUnits: true}, 'strict-units/'], - [{}, 'legacy/'], + + [{math: 0, strictUnits: true}, 'units/strict/'], + [{math: 0, strictUnits: false}, 'units/no-strict/'], + [{math: 'strict', strictUnits: true, sourceMap: true, globalVars: true }, 'sourcemaps/', lessTester.testSourcemap, null, null, function(filename, type, baseFolder) { @@ -74,8 +76,7 @@ var testMap = [ [{plugin: 'test/plugins/preprocess/'}, 'preProcessorPlugin/'], [{plugin: 'test/plugins/visitor/'}, 'visitorPlugin/'], [{plugin: 'test/plugins/filemanager/'}, 'filemanagerPlugin/'], - [{}, 'no-strict-math/'], - [{}, '3rd-party/'], + [{math: 0}, '3rd-party/'], [{ processImports: false }, 'process-imports/'] ]; testMap.forEach(function(args) { @@ -83,7 +84,7 @@ testMap.forEach(function(args) { }); lessTester.testSyncronous({syncImport: true}, '_main/import'); lessTester.testSyncronous({syncImport: true}, '_main/plugin'); -lessTester.testSyncronous({syncImport: true}, 'math/strict-legacy/css'); +lessTester.testSyncronous({syncImport: true}, 'math/strict/css'); lessTester.testNoOptions(); lessTester.testJSImport(); lessTester.finished(); diff --git a/packages/test-data/css/no-strict-math/mixins-guards.css b/packages/test-data/css/math/always/mixins-guards.css similarity index 100% rename from packages/test-data/css/no-strict-math/mixins-guards.css rename to packages/test-data/css/math/always/mixins-guards.css diff --git a/packages/test-data/css/no-strict-math/no-sm-operations.css b/packages/test-data/css/math/always/no-sm-operations.css similarity index 100% rename from packages/test-data/css/no-strict-math/no-sm-operations.css rename to packages/test-data/css/math/always/no-sm-operations.css diff --git a/packages/test-data/css/math/strict-legacy/css.css b/packages/test-data/css/math/strict-legacy/css.css deleted file mode 100644 index 633640781..000000000 --- a/packages/test-data/css/math/strict-legacy/css.css +++ /dev/null @@ -1,95 +0,0 @@ -@charset "utf-8"; -div { - color: black; -} -div { - width: 99%; -} -* { - min-width: 45em; -} -h1, -h2 > a > p, -h3 { - color: none; -} -div.class { - color: blue; -} -div#id { - color: green; -} -.class#id { - color: purple; -} -.one.two.three { - color: grey; -} -@media print { - * { - font-size: 3em; - } -} -@media screen { - * { - font-size: 10px; - } -} -@font-face { - font-family: 'Garamond Pro'; -} -a:hover, -a:link { - color: #999; -} -p, -p:first-child { - text-transform: none; -} -q:lang(no) { - quotes: none; -} -p + h1 { - font-size: 2.2em; -} -#shorthands { - border: 1px solid #000; - font: 12px/16px Arial; - font: 100%/16px Arial; - margin: 1px 0; - padding: 0 auto; -} -#more-shorthands { - margin: 0; - padding: 1px 0 2px 0; - font: normal small / 20px 'Trebuchet MS', Verdana, sans-serif; - font: 0/0 a; - border-radius: 5px / 10px; -} -.misc { - -moz-border-radius: 2px; - display: -moz-inline-stack; - width: 0.1em; - background-color: #009998; - background: -webkit-gradient(linear, left top, left bottom, from(red), to(blue)); - margin: ; - filter: alpha(opacity=100); - width: auto\9; -} -.misc .nested-multiple { - multiple-semi-colons: yes; -} -#important { - color: red !important; - width: 100%!important; - height: 20px ! important; -} -@font-face { - font-family: font-a; -} -@font-face { - font-family: font-b; -} -.æøå { - margin: 0; -} diff --git a/packages/test-data/css/math/strict-legacy/media-math.css b/packages/test-data/css/math/strict-legacy/media-math.css deleted file mode 100644 index 1d2452a0a..000000000 --- a/packages/test-data/css/math/strict-legacy/media-math.css +++ /dev/null @@ -1,10 +0,0 @@ -@media (min-width: 16 + 1) { - .foo { - bar: 1; - } -} -@media (min-width: 16 / 9) { - .foo { - bar: 1; - } -} diff --git a/packages/test-data/css/math/strict-legacy/mixins-args.css b/packages/test-data/css/math/strict-legacy/mixins-args.css deleted file mode 100644 index f5d37b20f..000000000 --- a/packages/test-data/css/math/strict-legacy/mixins-args.css +++ /dev/null @@ -1,163 +0,0 @@ -#hidden { - color: transparent; -} -#hidden1 { - color: transparent; -} -.two-args { - color: blue; - width: 10px; - height: 99%; - border: 2px dotted black; -} -.one-arg { - width: 15px; - height: 49%; -} -.no-parens { - width: 5px; - height: 49%; -} -.no-args { - width: 5px; - height: 49%; -} -.var-args { - width: 45; - height: 17%; -} -.multi-mix { - width: 10px; - height: 29%; - margin: 4; - padding: 5; -} -body { - padding: 30px; - color: #f00; -} -.scope-mix { - width: 8; -} -.content { - width: 600px; -} -.content .column { - margin: 600px; -} -#same-var-name { - radius: 5px; -} -#var-inside { - width: 10px; -} -.arguments { - border: 1px solid black; - width: 1px; -} -.arguments2 { - border: 0px; - width: 0px; -} -.arguments3 { - border: 0px; - width: 0px; -} -.arguments4 { - border: 0 1 2 3 4; - rest: 1 2 3 4; - width: 0; -} -.edge-case { - border: "{"; - width: "{"; -} -.slash-vs-math { - border-radius: 2px/5px; - border-radius: 5px/10px; - border-radius: 6px; -} -.comma-vs-semi-colon { - one: a; - two: b, c; - one: d, e; - two: f; - one: g; - one: h; - one: i; - one: j; - one: k; - two: l; - one: m, n; - one: o, p; - two: q; - one: r, s; - two: t; -} -#named-conflict { - four: a, 11, 12, 13; - four: a, 21, 22, 23; -} -.test-rule-mixin-default-arg { - defaults: 1px 1px 1px; - defaults: 2px 2px 2px; -} -.selector { - margin: 2, 2, 2, 2; -} -.selector2 { - margin: 2, 2, 2, 2; -} -.selector3 { - margin: 4; -} -mixins-args-expand-op-1 { - m3: 1, 2, 3; -} -mixins-args-expand-op-2 { - m3: 4, 5, 6; -} -mixins-args-expand-op-3a { - m3: a, b, c; -} -mixins-args-expand-op-3b { - m4: 0, a, b, c; -} -mixins-args-expand-op-3c { - m4: a, b, c, 4; -} -mixins-args-expand-op-4a { - m3: a, b, c, d; -} -mixins-args-expand-op-4b { - m4: 0, a, b, c, d; -} -mixins-args-expand-op-4c { - m4: a, b, c, d, 4; -} -mixins-args-expand-op-5a { - m3: 1, 2, 3; -} -mixins-args-expand-op-5b { - m4: 0, 1, 2, 3; -} -mixins-args-expand-op-5c { - m4: 1, 2, 3, 4; -} -mixins-args-expand-op-6 { - m4: 0, 1, 2, 3; -} -mixins-args-expand-op-7 { - m4: 0, 1, 2, 3; -} -mixins-args-expand-op-8 { - m4: 1, 1.5, 2, 3; -} -mixins-args-expand-op-9 { - aa: 4 5 6 1 2 3 and again 4 5 6; - a4: and; - a8: 5; -} -#test-mixin-matching-when-default-2645 { - height: 20px; -} diff --git a/packages/test-data/css/math/strict-legacy/parens.css b/packages/test-data/css/math/strict-legacy/parens.css deleted file mode 100644 index 89fe108a3..000000000 --- a/packages/test-data/css/math/strict-legacy/parens.css +++ /dev/null @@ -1,40 +0,0 @@ -.parens { - border: 2px solid black; - margin: 1px 3px 16 3; - width: 36; - padding: 2px 36px; -} -.in-function { - value: 2 + 1; -} -.more-parens { - padding: 8 4 4 4px; - width-all: 96; - width-first: 16 * 6; - width-keep: (4 * 4) * 6; - height: calc(100% + (25vh - 20px)); - height-keep: (7 * 7) + (8 * 8); - height-all: 113; - height-parts: 49 + 64; - margin-keep: (4 * (5 + 5) / 2) - (4 * 2); - margin-parts: 20 - 8; - margin-all: 12; - border-radius-keep: 4px * (1 + 1) / 4 + 3px; - border-radius-parts: 8px / 7px; - border-radius-all: 5px; -} -.negative { - neg-var: -1; - neg-var-paren: -1; -} -.nested-parens { - width: 2 * (4 * (2 + (1 + 6))) - 1; - height: ((2 + 3) * (2 + 3) / (9 - 4)) + 1; -} -.mixed-units { - margin: 2px 4em 1 5pc; - padding: 6px 1em 2px 2; -} -.test-rule-false-negatives { - a: (; -} diff --git a/packages/test-data/css/legacy/legacy.css b/packages/test-data/css/units/no-strict/no-strict.css similarity index 100% rename from packages/test-data/css/legacy/legacy.css rename to packages/test-data/css/units/no-strict/no-strict.css diff --git a/packages/test-data/css/strict-units/strict-units.css b/packages/test-data/css/units/strict/strict-units.css similarity index 100% rename from packages/test-data/css/strict-units/strict-units.css rename to packages/test-data/css/units/strict/strict-units.css diff --git a/packages/test-data/less/no-strict-math/mixins-guards.less b/packages/test-data/less/math/always/mixins-guards.less similarity index 100% rename from packages/test-data/less/no-strict-math/mixins-guards.less rename to packages/test-data/less/math/always/mixins-guards.less diff --git a/packages/test-data/less/no-strict-math/no-sm-operations.less b/packages/test-data/less/math/always/no-sm-operations.less similarity index 100% rename from packages/test-data/less/no-strict-math/no-sm-operations.less rename to packages/test-data/less/math/always/no-sm-operations.less diff --git a/packages/test-data/less/math/strict-legacy/css.less b/packages/test-data/less/math/strict-legacy/css.less deleted file mode 100644 index 0cdebae89..000000000 --- a/packages/test-data/less/math/strict-legacy/css.less +++ /dev/null @@ -1,108 +0,0 @@ -@charset "utf-8"; -div { color: black; } -div { width: 99%; } - -* { - min-width: 45em; -} - -h1, h2 > a > p, h3 { - color: none; -} - -div.class { - color: blue; -} - -div#id { - color: green; -} - -.class#id { - color: purple; -} - -.one.two.three { - color: grey; -} - -@media print { - * { - font-size: 3em; - } -} - -@media screen { - * { - font-size: 10px; - } -} - -@font-face { - font-family: 'Garamond Pro'; -} - -a:hover, a:link { - color: #999; -} - -p, p:first-child { - text-transform: none; -} - -q:lang(no) { - quotes: none; -} - -p + h1 { - font-size: +2.2em; -} - -#shorthands { - border: 1px solid #000; - font: 12px/16px Arial; - font: 100%/16px Arial; - margin: 1px 0; - padding: 0 auto; -} - -#more-shorthands { - margin: 0; - padding: 1px 0 2px 0; - font: normal small/20px 'Trebuchet MS', Verdana, sans-serif; - font: 0/0 a; - border-radius: 5px / 10px; -} - -.misc { - -moz-border-radius: 2px; - display: -moz-inline-stack; - width: .1em; - background-color: #009998; - background: -webkit-gradient(linear, left top, left bottom, from(red), to(blue)); - margin: ; - .nested-multiple { - multiple-semi-colons: yes;;;;;; - }; - filter: alpha(opacity=100); - width: auto\9; -} - -#important { - color: red !important; - width: 100%!important; - height: 20px ! important; -} - -.def-font(@name) { - @font-face { - font-family: @name - } -} - -.def-font(font-a); -.def-font(font-b); - -.æøå { - margin: 0; -} diff --git a/packages/test-data/less/math/strict-legacy/media-math.less b/packages/test-data/less/math/strict-legacy/media-math.less deleted file mode 100644 index b3df9118e..000000000 --- a/packages/test-data/less/math/strict-legacy/media-math.less +++ /dev/null @@ -1,9 +0,0 @@ -@var: 16; - -@media (min-width: @var + 1) { - .foo { bar: 1; } -} - -@media (min-width: @var / 9) { - .foo { bar: 1; } -} \ No newline at end of file diff --git a/packages/test-data/less/math/strict-legacy/mixins-args.less b/packages/test-data/less/math/strict-legacy/mixins-args.less deleted file mode 100644 index 1bc868a59..000000000 --- a/packages/test-data/less/math/strict-legacy/mixins-args.less +++ /dev/null @@ -1,263 +0,0 @@ -.mixin (@a: 1px, @b: 50%) { - width: (@a * 5); - height: (@b - 1%); -} - -.mixina (@style, @width, @color: black) { - border: @width @style @color; -} - -.mixiny -(@a: 0, @b: 0) { - margin: @a; - padding: @b; -} - -.hidden() { - color: transparent; // asd -} - -#hidden { - .hidden; -} - -#hidden1 { - .hidden(); -} - -.two-args { - color: blue; - .mixin(2px, 100%); - .mixina(dotted, 2px); -} - -.one-arg { - .mixin(3px); -} - -.no-parens { - .mixin; -} - -.no-args { - .mixin(); -} - -.var-args { - @var: 9; - .mixin(@var, (@var * 2)); -} - -.multi-mix { - .mixin(2px, 30%); - .mixiny(4, 5); -} - -.maxa(@arg1: 10, @arg2: #f00) { - padding: (@arg1 * 2px); - color: @arg2; -} - -body { - .maxa(15); -} - -@glob: 5; -.global-mixin(@a:2) { - width: (@glob + @a); -} - -.scope-mix { - .global-mixin(3); -} - -.nested-ruleset (@width: 200px) { - width: @width; - .column { margin: @width; } -} -.content { - .nested-ruleset(600px); -} - -// - -.same-var-name2(@radius) { - radius: @radius; -} -.same-var-name(@radius) { - .same-var-name2(@radius); -} -#same-var-name { - .same-var-name(5px); -} - -// - -.var-inside () { - @var: 10px; - width: @var; -} -#var-inside { .var-inside; } - -.mixin-arguments (@width: 0px, ...) { - border: @arguments; - width: @width; -} - -.arguments { - .mixin-arguments(1px, solid, black); -} -.arguments2 { - .mixin-arguments(); -} -.arguments3 { - .mixin-arguments; -} - -.mixin-arguments2 (@width, @rest...) { - border: @arguments; - rest: @rest; - width: @width; -} -.arguments4 { - .mixin-arguments2(0, 1, 2, 3, 4); -} - -// Edge cases - -.edge-case { - .mixin-arguments("{"); -} - -// Division vs. Literal Slash -.border-radius(@r: 2px/5px) { - border-radius: @r; -} -.slash-vs-math { - .border-radius(); - .border-radius(5px/10px); - .border-radius((3px * 2)); -} -// semi-colon vs comma for delimiting - -.mixin-takes-one(@a) { - one: @a; -} - -.mixin-takes-two(@a; @b) { - one: @a; - two: @b; -} - -.comma-vs-semi-colon { - .mixin-takes-two(@a : a; @b : b, c); - .mixin-takes-two(@a : d, e; @b : f); - .mixin-takes-one(@a: g); - .mixin-takes-one(@a : h;); - .mixin-takes-one(i); - .mixin-takes-one(j;); - .mixin-takes-two(k, l); - .mixin-takes-one(m, n;); - .mixin-takes-two(o, p; q); - .mixin-takes-two(r, s; t;); -} - -.mixin-conflict(@a:defA, @b:defB, @c:defC) { - three: @a, @b, @c; -} - -.mixin-conflict(@a:defA, @b:defB, @c:defC, @d:defD) { - four: @a, @b, @c, @d; -} - -#named-conflict { - .mixin-conflict(11, 12, 13, @a:a); - .mixin-conflict(@a:a, 21, 22, 23); -} -@a: 3px; -.mixin-default-arg(@a: 1px, @b: @a, @c: @b) { - defaults: 1px 1px 1px; - defaults: 2px 2px 2px; -} - -.test-rule-mixin-default-arg { - .mixin-default-arg(); - .mixin-default-arg(2px); -} - -.mixin-comma-default1(@color; @padding; @margin: 2, 2, 2, 2) { - margin: @margin; -} -.selector { - .mixin-comma-default1(#33acfe; 4); -} -.mixin-comma-default2(@margin: 2, 2, 2, 2;) { - margin: @margin; -} -.selector2 { - .mixin-comma-default2(); -} -.mixin-comma-default3(@margin: 2, 2, 2, 2) { - margin: @margin; -} -.selector3 { - .mixin-comma-default3(4,2,2,2); -} - -.test-rule-calling-one-arg-mixin(@a) { -} - -.test-rule-calling-one-arg-mixin(@a, @b, @rest...) { -} - -div { - .test-rule-calling-one-arg-mixin(1); -} - -mixins-args-expand-op- { - @x: 1, 2, 3; - @y: 4 5 6; - - &1 {.m3(@x...)} - &2 {.m3(@y...)} - &3 {.wr(a, b, c)} - &4 {.wr(a; b; c, d)} - &5 {.wr(@x...)} - &6 {.m4(0; @x...)} - &7 {.m4(@x..., @a: 0)} - &8 {.m4(@b: 1.5; @x...)} - &9 {.aa(@y, @x..., and again, @y...)} - - .m3(@a, @b, @c) { - m3: @a, @b, @c; - } - - .m4(@a, @b, @c, @d) { - m4: @a, @b, @c, @d; - } - - .wr(@a...) { - &a {.m3(@a...)} - &b {.m4(0, @a...)} - &c {.m4(@a..., 4)} - } - - .aa(@a...) { - aa: @a; - a4: extract(@a, 5); - a8: extract(@a, 8); - } -} -#test-mixin-matching-when-default-2645 { - .mixin(@height) { - height: @height; - } - - .mixin(@width, @height: 10px) { - width: @width; - - .mixin(@height: @height); - } - - .mixin(@height: 20px); -} \ No newline at end of file diff --git a/packages/test-data/less/math/strict-legacy/parens.less b/packages/test-data/less/math/strict-legacy/parens.less deleted file mode 100644 index 4520119fc..000000000 --- a/packages/test-data/less/math/strict-legacy/parens.less +++ /dev/null @@ -1,50 +0,0 @@ -.parens { - @var: 1px; - border: (@var * 2) solid black; - margin: (@var * 1) (@var + 2) (4 * 4) 3; - width: (6 * 6); - padding: 2px (6 * 6px); -} - -.in-function { - value: min((1 + 1)) + 1; -} - -.more-parens { - @var: (2 * 2); - padding: (2 * @var) 4 4 (@var * 1px); - width-all: ((@var * @var) * 6); - width-first: ((@var * @var)) * 6; - width-keep: (@var * @var) * 6; - height: calc(100% + (25vh - 20px)); - height-keep: (7 * 7) + (8 * 8); - height-all: ((7 * 7) + (8 * 8)); - height-parts: ((7 * 7)) + ((8 * 8)); - margin-keep: (4 * (5 + 5) / 2) - (@var * 2); - margin-parts: ((4 * (5 + 5) / 2)) - ((@var * 2)); - margin-all: ((4 * (5 + 5) / 2) + (-(@var * 2))); - border-radius-keep: 4px * (1 + 1) / @var + 3px; - border-radius-parts: ((4px * (1 + 1))) / ((@var + 3px)); - border-radius-all: (4px * (1 + 1) / @var + 3px); - // margin: (6 * 6)px; -} - -.negative { - @var: 1; - neg-var: -@var; // -1 ? - neg-var-paren: -(@var); // -(1) ? -} - -.nested-parens { - width: 2 * (4 * (2 + (1 + 6))) - 1; - height: ((2 + 3) * (2 + 3) / (9 - 4)) + 1; -} - -.mixed-units { - margin: 2px 4em 1 5pc; - padding: (2px + 4px) 1em 2px 2; -} - -.test-rule-false-negatives { - a: ~"("; -} diff --git a/packages/test-data/less/namespacing/namespacing-3.less b/packages/test-data/less/namespacing/namespacing-3.less index f184f6904..84e7f091f 100644 --- a/packages/test-data/less/namespacing/namespacing-3.less +++ b/packages/test-data/less/namespacing/namespacing-3.less @@ -34,7 +34,7 @@ ten: 10px; } .cell { - margin: @margins[zero] @margins[ten]/2 !important; + margin: @margins[zero] (@margins[ten]/2) !important; } .mixin(@color: black; @margin: 10px; @padding: 20px) { diff --git a/packages/test-data/less/legacy/legacy.less b/packages/test-data/less/units/no-strict/no-strict.less similarity index 100% rename from packages/test-data/less/legacy/legacy.less rename to packages/test-data/less/units/no-strict/no-strict.less diff --git a/packages/test-data/less/strict-units/strict-units.less b/packages/test-data/less/units/strict/strict-units.less similarity index 100% rename from packages/test-data/less/strict-units/strict-units.less rename to packages/test-data/less/units/strict/strict-units.less From 3d555a69cb65efaabafd1ca241b22bead19d0c96 Mon Sep 17 00:00:00 2001 From: Matthew Dean Date: Tue, 28 Jul 2020 19:50:14 -0700 Subject: [PATCH 02/19] Support for comma-less color functions --- packages/less/src/less/functions/color.js | 39 ++++++++++++++++++++-- packages/test-data/css/_main/colors2.css | 6 ++++ packages/test-data/less/_main/colors2.less | 6 ++++ 3 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 packages/test-data/css/_main/colors2.css create mode 100644 packages/test-data/less/_main/colors2.less diff --git a/packages/less/src/less/functions/color.js b/packages/less/src/less/functions/color.js index ba0e0baf6..f070e1690 100644 --- a/packages/less/src/less/functions/color.js +++ b/packages/less/src/less/functions/color.js @@ -2,6 +2,8 @@ import Dimension from '../tree/dimension'; import Color from '../tree/color'; import Quoted from '../tree/quoted'; import Anonymous from '../tree/anonymous'; +import Expression from '../tree/expression'; +import Operation from '../tree/operation'; let colorFunctions; function clamp(val) { @@ -56,7 +58,27 @@ function scaled(n, size) { } colorFunctions = { rgb: function (r, g, b) { - const color = colorFunctions.rgba(r, g, b, 1.0); + let a = 1 + /** + * Comma-less syntax + * e.g. rgb(0 128 255 / 50%) + */ + if (r instanceof Expression) { + const val = r.value + r = val[0] + g = val[1] + b = val[2] + /** + * @todo - should this be normalized in + * function caller? Or parsed differently? + */ + if (b instanceof Operation) { + const op = b + b = op.operands[0] + a = op.operands[1] + } + } + const color = colorFunctions.rgba(r, g, b, a); if (color) { color.value = 'rgb'; return color; @@ -79,7 +101,20 @@ colorFunctions = { catch (e) {} }, hsl: function (h, s, l) { - const color = colorFunctions.hsla(h, s, l, 1.0); + let a = 1 + if (h instanceof Expression) { + const val = h.value + h = val[0] + s = val[1] + l = val[2] + + if (l instanceof Operation) { + const op = l + l = op.operands[0] + a = op.operands[1] + } + } + const color = colorFunctions.hsla(h, s, l, a); if (color) { color.value = 'hsl'; return color; diff --git a/packages/test-data/css/_main/colors2.css b/packages/test-data/css/_main/colors2.css new file mode 100644 index 000000000..e23287f26 --- /dev/null +++ b/packages/test-data/css/_main/colors2.css @@ -0,0 +1,6 @@ +foo { + color: #0080ff; + color: rgba(0, 128, 255, 0.5); + color: hsl(198, 28%, 50%); + color: hsla(198, 28%, 50%, 0.5); +} diff --git a/packages/test-data/less/_main/colors2.less b/packages/test-data/less/_main/colors2.less new file mode 100644 index 000000000..12837736a --- /dev/null +++ b/packages/test-data/less/_main/colors2.less @@ -0,0 +1,6 @@ +foo { + color: rgb(0 128 255); + color: rgb(0 128 255 / 50%); + color: hsl(198deg 28% 50%); + color: hsl(198deg 28% 50% / 50%); +} \ No newline at end of file From 67ce1038e5f81dffe785cb7bbdaa151c2f31e071 Mon Sep 17 00:00:00 2001 From: Matthew Dean Date: Wed, 29 Jul 2020 08:59:12 -0700 Subject: [PATCH 03/19] Require parens after mixin call --- packages/less/src/less/parser/parser.js | 6 +- packages/test-data/css/3rd-party/uikit.css | 8955 ----------------- .../test-data/css/_main/import-remote.css | 2 +- .../css/math/parens-division/mixins-args.css | 5 - .../test-data/css/math/strict/mixins-args.css | 5 - .../eval/mixin-not-visible-in-scope-1.less | 2 +- .../eval/mixin-not-visible-in-scope-1.txt | 2 +- packages/test-data/less/3rd-party/uikit.less | 1 - .../test-data/less/_main/css-escapes.less | 2 +- .../less/_main/directives-bubling.less | 2 +- .../less/_main/extract-and-length.less | 4 +- .../test-data/less/_main/import-remote.less | 4 +- packages/test-data/less/_main/import.less | 2 +- .../import-and-relative-paths-test.less | 4 +- .../test-data/less/_main/mixins-closure.less | 6 +- .../test-data/less/_main/mixins-guards.less | 4 +- .../less/_main/mixins-important.less | 2 +- .../less/_main/mixins-interpolated.less | 14 +- packages/test-data/less/_main/mixins.less | 34 +- packages/test-data/less/_main/scope.less | 4 +- packages/test-data/less/_main/urls.less | 4 +- .../math/parens-division/mixins-args.less | 10 +- .../less/math/strict/mixins-args.less | 10 +- .../less/namespacing/namespacing-4.less | 2 +- 24 files changed, 56 insertions(+), 9030 deletions(-) delete mode 100644 packages/test-data/css/3rd-party/uikit.css delete mode 100644 packages/test-data/less/3rd-party/uikit.less diff --git a/packages/less/src/less/parser/parser.js b/packages/less/src/less/parser/parser.js index 3f3ea563f..91db608aa 100644 --- a/packages/less/src/less/parser/parser.js +++ b/packages/less/src/less/parser/parser.js @@ -908,9 +908,9 @@ const Parser = function Parser(context, imports, fileInfo) { return; } - if (inValue && !lookups && !hasParens) { - // This isn't a valid in-value mixin call - parserInput.restore(); + if (!lookups && !hasParens) { + // This isn't a valid mixin call + parserInput.restore('Unrecognized input. Possibly missing \'(\' in mixin call.'); return; } diff --git a/packages/test-data/css/3rd-party/uikit.css b/packages/test-data/css/3rd-party/uikit.css deleted file mode 100644 index d3be4ea5a..000000000 --- a/packages/test-data/css/3rd-party/uikit.css +++ /dev/null @@ -1,8955 +0,0 @@ -/* ======================================================================== - Component: Base - ========================================================================== */ -/* - * 1. Normalize default `font-family` and set `font-size` to support `rem` units - * 2. Prevents iOS text size adjust after orientation change, without disabling user zoom - * 3. Style - */ -html { - /* 1 */ - font: normal 14px / 20px "Helvetica Neue", Helvetica, Arial, sans-serif; - /* 2 */ - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; - /* 3 */ - background: #fff; - color: #444; -} -/* - * Removes default margin. - */ -body { - margin: 0; -} -/* Links - ========================================================================== */ -/* - * Remove the gray background color from active links in IE 10. - */ -a { - background: transparent; -} -/* - * Improve readability of focused elements when they are also in an active/hover state. - */ -a:active, -a:hover { - outline: 0; -} -/* - * Style - */ -a, -.uk-link { - color: #07D; - text-decoration: none; - cursor: pointer; -} -a:hover, -.uk-link:hover { - color: #059; - text-decoration: underline; -} -/* Text-level semantics - ========================================================================== */ -/* - * Address styling not present in IE 8/9/10/11, Safari, and Chrome. - */ -abbr[title] { - border-bottom: 1px dotted; -} -/* - * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. - */ -b, -strong { - font-weight: bold; -} -/* - * 1. Address odd `em`-unit font size rendering in all browsers. - * 2. Consolas has a better baseline in running text compared to `Courier` - */ -:not(pre) > code, -:not(pre) > kbd, -:not(pre) > samp { - /* 1 */ - font-size: 12px; - /* 2 */ - font-family: Consolas, monospace, serif; - /* 3 */ - color: #D05; - white-space: nowrap; -} -/* - * Emphasize - */ -em { - color: #D05; -} -/* - * Insert - */ -ins { - background: #ffa; - color: #444; - text-decoration: none; -} -/* - * Mark - * Note: Addresses styling not present in IE 8/9. - */ -mark { - background: #ffa; - color: #444; -} -/* - * Quote - */ -q { - font-style: italic; -} -/* - * Addresses inconsistent and variable font size in all browsers. - */ -small { - font-size: 80%; -} -/* - * Prevents `sub` and `sup` affecting `line-height` in all browsers. - */ -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} -sup { - top: -0.5em; -} -sub { - bottom: -0.25em; -} -/* Embedded content - ========================================================================== */ -/* - * Remove the gap between embedded content and the bottom of their containers. - */ -audio, -canvas, -iframe, -img, -svg, -video { - vertical-align: middle; -} -/* - * Responsiveness - * 1. Sets a maximum width relative to the parent and auto scales the height - * 2. Corrects `max-width` behavior if padding and border are used - */ -audio, -canvas, -img, -svg, -video { - /* 1 */ - max-width: 100%; - height: auto; - /* 2 */ - box-sizing: border-box; -} -/* - * Preserve original dimensions - */ -.uk-img-preserve, -.uk-img-preserve audio, -.uk-img-preserve canvas, -.uk-img-preserve img, -.uk-img-preserve svg, -.uk-img-preserve video { - max-width: none; -} -/* - * Remove border when inside `a` element in IE 8/9/10. - */ -img { - border: 0; -} -/* - * Correct overflow not hidden in IE 9/10/11. - */ -svg:not(:root) { - overflow: hidden; -} -/* Block elements - ========================================================================== */ -/* - * Reset margin - */ -blockquote, -figure { - margin: 0; -} -/* - * Margins - */ -p, -ul, -ol, -dl, -blockquote, -pre, -address, -fieldset, -figure { - margin: 0 0 15px 0; -} -* + p, -* + ul, -* + ol, -* + dl, -* + blockquote, -* + pre, -* + address, -* + fieldset, -* + figure { - margin-top: 15px; -} -/* Headings - ========================================================================== */ -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 0 0 15px 0; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-weight: normal; - color: #444; - text-transform: none; -} -/* - * Margins - */ -* + h1, -* + h2, -* + h3, -* + h4, -* + h5, -* + h6 { - margin-top: 25px; -} -/* - * Sizes - */ -h1, -.uk-h1 { - font-size: 36px; - line-height: 42px; -} -h2, -.uk-h2 { - font-size: 24px; - line-height: 30px; -} -h3, -.uk-h3 { - font-size: 18px; - line-height: 24px; -} -h4, -.uk-h4 { - font-size: 16px; - line-height: 22px; -} -h5, -.uk-h5 { - font-size: 14px; - line-height: 20px; -} -h6, -.uk-h6 { - font-size: 12px; - line-height: 18px; -} -/* Lists - ========================================================================== */ -ul, -ol { - padding-left: 30px; -} -/* - * Reset margin for nested lists - */ -ul > li > ul, -ul > li > ol, -ol > li > ol, -ol > li > ul { - margin: 0; -} -/* Description lists - ========================================================================== */ -dt { - font-weight: bold; -} -dd { - margin-left: 0; -} -/* Horizontal rules - ========================================================================== */ -/* - * 1. Address differences between Firefox and other browsers. - * 2. Style - */ -hr { - /* 1 */ - box-sizing: content-box; - height: 0; - /* 2 */ - margin: 15px 0; - border: 0; - border-top: 1px solid #ddd; -} -/* Address - ========================================================================== */ -address { - font-style: normal; -} -/* Blockquotes - ========================================================================== */ -blockquote { - padding-left: 15px; - border-left: 5px solid #ddd; - font-size: 16px; - line-height: 22px; - font-style: italic; -} -/* Preformatted text - ========================================================================== */ -/* - * 1. Contain overflow in all browsers. - */ -pre { - padding: 10px; - background: #f5f5f5; - font: 12px / 18px Consolas, monospace, serif; - color: #444; - -moz-tab-size: 4; - tab-size: 4; - /* 1 */ - overflow: auto; -} -/* Selection pseudo-element - ========================================================================== */ -::-moz-selection { - background: #39f; - color: #fff; - text-shadow: none; -} -::selection { - background: #39f; - color: #fff; - text-shadow: none; -} -/* HTML5 elements - ========================================================================== */ -/* - * Correct `block` display not defined for any HTML5 element in IE 8/9. - * Correct `block` display not defined for `details` or `summary` in IE 10/11 and Firefox. - * Correct `block` display not defined for `main` in IE 11. - */ -article, -aside, -details, -figcaption, -figure, -footer, -header, -main, -nav, -section, -summary { - display: block; -} -/* - * Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. - */ -progress { - vertical-align: baseline; -} -/* - * Prevent displaying `audio` without controls in Chrome, Safari and Opera - */ -audio:not([controls]) { - display: none; -} -/* - * Address `[hidden]` styling not present in IE 8/9/10. - * Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22. - */ -[hidden], -template { - display: none; -} -/* Iframe - ========================================================================== */ -iframe { - border: 0; -} -/* Fix viewport for IE10 snap mode - ========================================================================== */ -@media screen and (max-width: 400px) { - @-ms-viewport { - width: device-width; - } -} -/* ======================================================================== - Component: Grid - ========================================================================== */ -/* - * 1. Makes grid more robust so that it can be used with other block elements like lists - */ -.uk-grid { - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -ms-flex-wrap: wrap; - -webkit-flex-wrap: wrap; - flex-wrap: wrap; - /* 1 */ - margin: 0; - padding: 0; - list-style: none; -} -/* - * DEPRECATED - * Micro clearfix - * Can't use `table` because it creates a 1px gap when it becomes a flex item, only in Webkit - */ -.uk-grid:before, -.uk-grid:after { - content: ""; - display: block; - overflow: hidden; -} -.uk-grid:after { - clear: both; -} -/* - * Grid cell - * 1. Space is allocated solely based on content dimensions - * 2. Makes grid more robust so that it can be used with other block elements - * 3. DEPRECATED Using `float` to support IE9 - */ -.uk-grid > * { - /* 1 */ - -ms-flex: none; - -webkit-flex: none; - flex: none; - /* 2 */ - margin: 0; - /* 3 */ - float: left; -} -/* - * Remove margin from the last-child - */ -.uk-grid > * > :last-child { - margin-bottom: 0; -} -/* Grid gutter - ========================================================================== */ -/* - * Default gutter - */ -/* Horizontal */ -.uk-grid { - margin-left: -25px; -} -.uk-grid > * { - padding-left: 25px; -} -/* Vertical */ -.uk-grid + .uk-grid, -.uk-grid-margin, -.uk-grid > * > .uk-panel + .uk-panel { - margin-top: 25px; -} -/* Large screen and bigger */ -@media (min-width: 1220px) { - /* Horizontal */ - .uk-grid { - margin-left: -35px; - } - .uk-grid > * { - padding-left: 35px; - } - /* Vertical */ - .uk-grid + .uk-grid, - .uk-grid-margin, - .uk-grid > * > .uk-panel + .uk-panel { - margin-top: 35px; - } -} -/* - * Collapse gutter - */ -/* Horizontal */ -.uk-grid-collapse { - margin-left: 0; -} -.uk-grid-collapse > * { - padding-left: 0; -} -/* Vertical */ -.uk-grid-collapse + .uk-grid-collapse, -.uk-grid-collapse > .uk-grid-margin, -.uk-grid-collapse > * > .uk-panel + .uk-panel { - margin-top: 0; -} -/* - * Small gutter - */ -/* Horizontal */ -.uk-grid-small { - margin-left: -10px; -} -.uk-grid-small > * { - padding-left: 10px; -} -/* Vertical */ -.uk-grid-small + .uk-grid-small, -.uk-grid-small > .uk-grid-margin, -.uk-grid-small > * > .uk-panel + .uk-panel { - margin-top: 10px; -} -/* - * Medium gutter - */ -/* Horizontal */ -.uk-grid-medium { - margin-left: -25px; -} -.uk-grid-medium > * { - padding-left: 25px; -} -/* Vertical */ -.uk-grid-medium + .uk-grid-medium, -.uk-grid-medium > .uk-grid-margin, -.uk-grid-medium > * > .uk-panel + .uk-panel { - margin-top: 25px; -} -/* - * Large gutter - */ -/* Large screen and bigger */ -@media (min-width: 960px) { - /* Horizontal */ - .uk-grid-large { - margin-left: -35px; - } - .uk-grid-large > * { - padding-left: 35px; - } - /* Vertical */ - .uk-grid-large + .uk-grid-large, - .uk-grid-large-margin, - .uk-grid-large > * > .uk-panel + .uk-panel { - margin-top: 35px; - } -} -/* Extra Large screens */ -@media (min-width: 1220px) { - /* Horizontal */ - .uk-grid-large { - margin-left: -50px; - } - .uk-grid-large > * { - padding-left: 50px; - } - /* Vertical */ - .uk-grid-large + .uk-grid-large, - .uk-grid-large-margin, - .uk-grid-large > * > .uk-panel + .uk-panel { - margin-top: 50px; - } -} -/* Modifier: `uk-grid-divider` - ========================================================================== */ -/* - * Horizontal divider - * Only works with the default gutter. Does not work with gutter collapse, small or large. - * Does not work with `uk-push-*`, `uk-pull-*` and not if the columns float into the next row. - */ -.uk-grid-divider:not(:empty) { - margin-left: -25px; - margin-right: -25px; -} -.uk-grid-divider > * { - padding-left: 25px; - padding-right: 25px; -} -.uk-grid-divider > [class*='uk-width-1-']:not(.uk-width-1-1):nth-child(n+2), -.uk-grid-divider > [class*='uk-width-2-']:nth-child(n+2), -.uk-grid-divider > [class*='uk-width-3-']:nth-child(n+2), -.uk-grid-divider > [class*='uk-width-4-']:nth-child(n+2), -.uk-grid-divider > [class*='uk-width-5-']:nth-child(n+2), -.uk-grid-divider > [class*='uk-width-6-']:nth-child(n+2), -.uk-grid-divider > [class*='uk-width-7-']:nth-child(n+2), -.uk-grid-divider > [class*='uk-width-8-']:nth-child(n+2), -.uk-grid-divider > [class*='uk-width-9-']:nth-child(n+2) { - border-left: 1px solid #ddd; -} -/* Tablet and bigger */ -@media (min-width: 768px) { - .uk-grid-divider > [class*='uk-width-medium-']:not(.uk-width-medium-1-1):nth-child(n+2) { - border-left: 1px solid #ddd; - } -} -/* Desktop and bigger */ -@media (min-width: 960px) { - .uk-grid-divider > [class*='uk-width-large-']:not(.uk-width-large-1-1):nth-child(n+2) { - border-left: 1px solid #ddd; - } -} -/* Large screen and bigger */ -@media (min-width: 1220px) { - /* - * Large gutter - */ - .uk-grid-divider:not(:empty) { - margin-left: -35px; - margin-right: -35px; - } - .uk-grid-divider > * { - padding-left: 35px; - padding-right: 35px; - } - .uk-grid-divider:empty { - margin-top: 35px; - margin-bottom: 35px; - } -} -/* - * Vertical divider - */ -.uk-grid-divider:empty { - margin-top: 25px; - margin-bottom: 25px; - border-top: 1px solid #ddd; -} -/* Match panels in grids - ========================================================================== */ -/* - * 1. Behave like a block element - */ -.uk-grid-match > * { - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - /* 1 */ - -ms-flex-wrap: wrap; - -webkit-flex-wrap: wrap; - flex-wrap: wrap; -} -.uk-grid-match > * > * { - /* 1 */ - -ms-flex: none; - -webkit-flex: none; - flex: none; - box-sizing: border-box; - width: 100%; -} -/* Even grid cell widths - ========================================================================== */ -[class*='uk-grid-width'] > * { - box-sizing: border-box; - width: 100%; -} -.uk-grid-width-1-2 > * { - width: 50%; -} -.uk-grid-width-1-3 > * { - width: 33.333%; -} -.uk-grid-width-1-4 > * { - width: 25%; -} -.uk-grid-width-1-5 > * { - width: 20%; -} -.uk-grid-width-1-6 > * { - width: 16.666%; -} -.uk-grid-width-1-10 > * { - width: 10%; -} -.uk-grid-width-auto > * { - width: auto; -} -/* Phone landscape and bigger */ -@media (min-width: 480px) { - .uk-grid-width-small-1-1 > * { - width: 100%; - } - .uk-grid-width-small-1-2 > * { - width: 50%; - } - .uk-grid-width-small-1-3 > * { - width: 33.333%; - } - .uk-grid-width-small-1-4 > * { - width: 25%; - } - .uk-grid-width-small-1-5 > * { - width: 20%; - } - .uk-grid-width-small-1-6 > * { - width: 16.666%; - } - .uk-grid-width-small-1-10 > * { - width: 10%; - } -} -/* Tablet and bigger */ -@media (min-width: 768px) { - .uk-grid-width-medium-1-1 > * { - width: 100%; - } - .uk-grid-width-medium-1-2 > * { - width: 50%; - } - .uk-grid-width-medium-1-3 > * { - width: 33.333%; - } - .uk-grid-width-medium-1-4 > * { - width: 25%; - } - .uk-grid-width-medium-1-5 > * { - width: 20%; - } - .uk-grid-width-medium-1-6 > * { - width: 16.666%; - } - .uk-grid-width-medium-1-10 > * { - width: 10%; - } -} -/* Desktop and bigger */ -@media (min-width: 960px) { - .uk-grid-width-large-1-1 > * { - width: 100%; - } - .uk-grid-width-large-1-2 > * { - width: 50%; - } - .uk-grid-width-large-1-3 > * { - width: 33.333%; - } - .uk-grid-width-large-1-4 > * { - width: 25%; - } - .uk-grid-width-large-1-5 > * { - width: 20%; - } - .uk-grid-width-large-1-6 > * { - width: 16.666%; - } - .uk-grid-width-large-1-10 > * { - width: 10%; - } -} -/* Large screen and bigger */ -@media (min-width: 1220px) { - .uk-grid-width-xlarge-1-1 > * { - width: 100%; - } - .uk-grid-width-xlarge-1-2 > * { - width: 50%; - } - .uk-grid-width-xlarge-1-3 > * { - width: 33.333%; - } - .uk-grid-width-xlarge-1-4 > * { - width: 25%; - } - .uk-grid-width-xlarge-1-5 > * { - width: 20%; - } - .uk-grid-width-xlarge-1-6 > * { - width: 16.666%; - } - .uk-grid-width-xlarge-1-10 > * { - width: 10%; - } -} -/* Sub-objects: `uk-width-*` - ========================================================================== */ -[class*='uk-width'] { - box-sizing: border-box; - width: 100%; -} -/* - * Widths - */ -/* Whole */ -.uk-width-1-1 { - width: 100%; -} -/* Halves */ -.uk-width-1-2, -.uk-width-2-4, -.uk-width-3-6, -.uk-width-5-10 { - width: 50%; -} -/* Thirds */ -.uk-width-1-3, -.uk-width-2-6 { - width: 33.333%; -} -.uk-width-2-3, -.uk-width-4-6 { - width: 66.666%; -} -/* Quarters */ -.uk-width-1-4 { - width: 25%; -} -.uk-width-3-4 { - width: 75%; -} -/* Fifths */ -.uk-width-1-5, -.uk-width-2-10 { - width: 20%; -} -.uk-width-2-5, -.uk-width-4-10 { - width: 40%; -} -.uk-width-3-5, -.uk-width-6-10 { - width: 60%; -} -.uk-width-4-5, -.uk-width-8-10 { - width: 80%; -} -/* Sixths */ -.uk-width-1-6 { - width: 16.666%; -} -.uk-width-5-6 { - width: 83.333%; -} -/* Tenths */ -.uk-width-1-10 { - width: 10%; -} -.uk-width-3-10 { - width: 30%; -} -.uk-width-7-10 { - width: 70%; -} -.uk-width-9-10 { - width: 90%; -} -/* Phone landscape and bigger */ -@media (min-width: 480px) { - /* Whole */ - .uk-width-small-1-1 { - width: 100%; - } - /* Halves */ - .uk-width-small-1-2, - .uk-width-small-2-4, - .uk-width-small-3-6, - .uk-width-small-5-10 { - width: 50%; - } - /* Thirds */ - .uk-width-small-1-3, - .uk-width-small-2-6 { - width: 33.333%; - } - .uk-width-small-2-3, - .uk-width-small-4-6 { - width: 66.666%; - } - /* Quarters */ - .uk-width-small-1-4 { - width: 25%; - } - .uk-width-small-3-4 { - width: 75%; - } - /* Fifths */ - .uk-width-small-1-5, - .uk-width-small-2-10 { - width: 20%; - } - .uk-width-small-2-5, - .uk-width-small-4-10 { - width: 40%; - } - .uk-width-small-3-5, - .uk-width-small-6-10 { - width: 60%; - } - .uk-width-small-4-5, - .uk-width-small-8-10 { - width: 80%; - } - /* Sixths */ - .uk-width-small-1-6 { - width: 16.666%; - } - .uk-width-small-5-6 { - width: 83.333%; - } - /* Tenths */ - .uk-width-small-1-10 { - width: 10%; - } - .uk-width-small-3-10 { - width: 30%; - } - .uk-width-small-7-10 { - width: 70%; - } - .uk-width-small-9-10 { - width: 90%; - } -} -/* Tablet and bigger */ -@media (min-width: 768px) { - /* Whole */ - .uk-width-medium-1-1 { - width: 100%; - } - /* Halves */ - .uk-width-medium-1-2, - .uk-width-medium-2-4, - .uk-width-medium-3-6, - .uk-width-medium-5-10 { - width: 50%; - } - /* Thirds */ - .uk-width-medium-1-3, - .uk-width-medium-2-6 { - width: 33.333%; - } - .uk-width-medium-2-3, - .uk-width-medium-4-6 { - width: 66.666%; - } - /* Quarters */ - .uk-width-medium-1-4 { - width: 25%; - } - .uk-width-medium-3-4 { - width: 75%; - } - /* Fifths */ - .uk-width-medium-1-5, - .uk-width-medium-2-10 { - width: 20%; - } - .uk-width-medium-2-5, - .uk-width-medium-4-10 { - width: 40%; - } - .uk-width-medium-3-5, - .uk-width-medium-6-10 { - width: 60%; - } - .uk-width-medium-4-5, - .uk-width-medium-8-10 { - width: 80%; - } - /* Sixths */ - .uk-width-medium-1-6 { - width: 16.666%; - } - .uk-width-medium-5-6 { - width: 83.333%; - } - /* Tenths */ - .uk-width-medium-1-10 { - width: 10%; - } - .uk-width-medium-3-10 { - width: 30%; - } - .uk-width-medium-7-10 { - width: 70%; - } - .uk-width-medium-9-10 { - width: 90%; - } -} -/* Desktop and bigger */ -@media (min-width: 960px) { - /* Whole */ - .uk-width-large-1-1 { - width: 100%; - } - /* Halves */ - .uk-width-large-1-2, - .uk-width-large-2-4, - .uk-width-large-3-6, - .uk-width-large-5-10 { - width: 50%; - } - /* Thirds */ - .uk-width-large-1-3, - .uk-width-large-2-6 { - width: 33.333%; - } - .uk-width-large-2-3, - .uk-width-large-4-6 { - width: 66.666%; - } - /* Quarters */ - .uk-width-large-1-4 { - width: 25%; - } - .uk-width-large-3-4 { - width: 75%; - } - /* Fifths */ - .uk-width-large-1-5, - .uk-width-large-2-10 { - width: 20%; - } - .uk-width-large-2-5, - .uk-width-large-4-10 { - width: 40%; - } - .uk-width-large-3-5, - .uk-width-large-6-10 { - width: 60%; - } - .uk-width-large-4-5, - .uk-width-large-8-10 { - width: 80%; - } - /* Sixths */ - .uk-width-large-1-6 { - width: 16.666%; - } - .uk-width-large-5-6 { - width: 83.333%; - } - /* Tenths */ - .uk-width-large-1-10 { - width: 10%; - } - .uk-width-large-3-10 { - width: 30%; - } - .uk-width-large-7-10 { - width: 70%; - } - .uk-width-large-9-10 { - width: 90%; - } -} -/* Large screen and bigger */ -@media (min-width: 1220px) { - /* Whole */ - .uk-width-xlarge-1-1 { - width: 100%; - } - /* Halves */ - .uk-width-xlarge-1-2, - .uk-width-xlarge-2-4, - .uk-width-xlarge-3-6, - .uk-width-xlarge-5-10 { - width: 50%; - } - /* Thirds */ - .uk-width-xlarge-1-3, - .uk-width-xlarge-2-6 { - width: 33.333%; - } - .uk-width-xlarge-2-3, - .uk-width-xlarge-4-6 { - width: 66.666%; - } - /* Quarters */ - .uk-width-xlarge-1-4 { - width: 25%; - } - .uk-width-xlarge-3-4 { - width: 75%; - } - /* Fifths */ - .uk-width-xlarge-1-5, - .uk-width-xlarge-2-10 { - width: 20%; - } - .uk-width-xlarge-2-5, - .uk-width-xlarge-4-10 { - width: 40%; - } - .uk-width-xlarge-3-5, - .uk-width-xlarge-6-10 { - width: 60%; - } - .uk-width-xlarge-4-5, - .uk-width-xlarge-8-10 { - width: 80%; - } - /* Sixths */ - .uk-width-xlarge-1-6 { - width: 16.666%; - } - .uk-width-xlarge-5-6 { - width: 83.333%; - } - /* Tenths */ - .uk-width-xlarge-1-10 { - width: 10%; - } - .uk-width-xlarge-3-10 { - width: 30%; - } - .uk-width-xlarge-7-10 { - width: 70%; - } - .uk-width-xlarge-9-10 { - width: 90%; - } -} -/* Sub-object: `uk-push-*` and `uk-pull-*` - ========================================================================== */ -/* - * Source ordering - * Works only with `uk-width-medium-*` - */ -/* Tablet and bigger */ -@media (min-width: 768px) { - [class*='uk-push-'], - [class*='uk-pull-'] { - position: relative; - } - /* - * Push - */ - /* Halves */ - .uk-push-1-2, - .uk-push-2-4, - .uk-push-3-6, - .uk-push-5-10 { - left: 50%; - } - /* Thirds */ - .uk-push-1-3, - .uk-push-2-6 { - left: 33.333%; - } - .uk-push-2-3, - .uk-push-4-6 { - left: 66.666%; - } - /* Quarters */ - .uk-push-1-4 { - left: 25%; - } - .uk-push-3-4 { - left: 75%; - } - /* Fifths */ - .uk-push-1-5, - .uk-push-2-10 { - left: 20%; - } - .uk-push-2-5, - .uk-push-4-10 { - left: 40%; - } - .uk-push-3-5, - .uk-push-6-10 { - left: 60%; - } - .uk-push-4-5, - .uk-push-8-10 { - left: 80%; - } - /* Sixths */ - .uk-push-1-6 { - left: 16.666%; - } - .uk-push-5-6 { - left: 83.333%; - } - /* Tenths */ - .uk-push-1-10 { - left: 10%; - } - .uk-push-3-10 { - left: 30%; - } - .uk-push-7-10 { - left: 70%; - } - .uk-push-9-10 { - left: 90%; - } - /* - * Pull - */ - /* Halves */ - .uk-pull-1-2, - .uk-pull-2-4, - .uk-pull-3-6, - .uk-pull-5-10 { - left: -50%; - } - /* Thirds */ - .uk-pull-1-3, - .uk-pull-2-6 { - left: -33.333%; - } - .uk-pull-2-3, - .uk-pull-4-6 { - left: -66.666%; - } - /* Quarters */ - .uk-pull-1-4 { - left: -25%; - } - .uk-pull-3-4 { - left: -75%; - } - /* Fifths */ - .uk-pull-1-5, - .uk-pull-2-10 { - left: -20%; - } - .uk-pull-2-5, - .uk-pull-4-10 { - left: -40%; - } - .uk-pull-3-5, - .uk-pull-6-10 { - left: -60%; - } - .uk-pull-4-5, - .uk-pull-8-10 { - left: -80%; - } - /* Sixths */ - .uk-pull-1-6 { - left: -16.666%; - } - .uk-pull-5-6 { - left: -83.333%; - } - /* Tenths */ - .uk-pull-1-10 { - left: -10%; - } - .uk-pull-3-10 { - left: -30%; - } - .uk-pull-7-10 { - left: -70%; - } - .uk-pull-9-10 { - left: -90%; - } -} -/* ======================================================================== - Component: Panel - ========================================================================== */ -/* - * 1. Needed for `a` elements - * 2. Create position context for badges - */ -.uk-panel { - /* 1 */ - display: block; - /* 2 */ - position: relative; -} -/* - * Allow panels to be anchors - */ -.uk-panel, -.uk-panel:hover { - text-decoration: none; -} -/* - * Micro clearfix to make panels more robust - */ -.uk-panel:before, -.uk-panel:after { - content: ""; - display: table; -} -.uk-panel:after { - clear: both; -} -/* - * Remove margin from the last-child if not `uk-widget-title` - */ -.uk-panel > :not(.uk-panel-title):last-child { - margin-bottom: 0; -} -/* Sub-object: `uk-panel-title` - ========================================================================== */ -.uk-panel-title { - margin-top: 0; - margin-bottom: 15px; - font-size: 18px; - line-height: 24px; - font-weight: normal; - text-transform: none; - color: #444; -} -/* Sub-object: `uk-panel-badge` - ========================================================================== */ -.uk-panel-badge { - position: absolute; - top: 0; - right: 0; - z-index: 1; -} -/* Sub-object: `uk-panel-teaser` - ========================================================================== */ -.uk-panel-teaser { - margin-bottom: 15px; -} -/* Sub-object: `uk-panel-body` - ========================================================================== */ -.uk-panel-body { - padding: 15px; -} -/* Modifier: `uk-panel-box` - ========================================================================== */ -.uk-panel-box { - padding: 15px; - background: #f5f5f5; - color: #444; -} -.uk-panel-box-hover:hover { - color: #444; -} -.uk-panel-box .uk-panel-title { - color: #444; -} -.uk-panel-box .uk-panel-badge { - top: 10px; - right: 10px; -} -.uk-panel-box > .uk-panel-teaser { - margin-top: -15px; - margin-left: -15px; - margin-right: -15px; -} -/* - * Nav in panel - */ -.uk-panel-box > .uk-nav-side { - margin: 0 -15px; -} -/* - * Sub-modifier: `uk-panel-box-primary` - */ -.uk-panel-box-primary { - background-color: #ebf7fd; - color: #2d7091; -} -.uk-panel-box-primary-hover:hover { - color: #2d7091; -} -.uk-panel-box-primary .uk-panel-title { - color: #2d7091; -} -/* - * Sub-modifier: `uk-panel-box-secondary` - */ -.uk-panel-box-secondary { - background-color: #eee; - color: #444; -} -.uk-panel-box-secondary-hover:hover { - color: #444; -} -.uk-panel-box-secondary .uk-panel-title { - color: #444; -} -/* Modifier: `uk-panel-hover` - ========================================================================== */ -.uk-panel-hover { - padding: 15px; - color: #444; -} -.uk-panel-hover:hover { - background: #f5f5f5; - color: #444; -} -.uk-panel-hover .uk-panel-badge { - top: 10px; - right: 10px; -} -.uk-panel-hover > .uk-panel-teaser { - margin-top: -15px; - margin-left: -15px; - margin-right: -15px; -} -/* Modifier: `uk-panel-header` - ========================================================================== */ -.uk-panel-header .uk-panel-title { - padding-bottom: 10px; - border-bottom: 1px solid #ddd; - color: #444; -} -/* Modifier: `uk-panel-space` - ========================================================================== */ -.uk-panel-space { - padding: 30px; -} -.uk-panel-space .uk-panel-badge { - top: 30px; - right: 30px; -} -/* Modifier: `uk-panel-divider` - ========================================================================== */ -.uk-panel + .uk-panel-divider { - margin-top: 50px !important; -} -.uk-panel + .uk-panel-divider:before { - content: ""; - display: block; - position: absolute; - top: -25px; - left: 0; - right: 0; - border-top: 1px solid #ddd; -} -/* Large screen and bigger */ -@media (min-width: 1220px) { - .uk-panel + .uk-panel-divider { - margin-top: 70px !important; - } - .uk-panel + .uk-panel-divider:before { - top: -35px; - } -} -/* ======================================================================== - Component: Block - ========================================================================== */ -.uk-block { - position: relative; - box-sizing: border-box; - padding-top: 20px; - padding-bottom: 20px; -} -/* Phone landscape and bigger */ -@media (min-width: 768px) { - .uk-block { - padding-top: 50px; - padding-bottom: 50px; - } -} -/* - * Micro clearfix to make blocks more robust - */ -.uk-block:before, -.uk-block:after { - content: ""; - display: table; -} -.uk-block:after { - clear: both; -} -/* - * Remove margin from the last-child - */ -.uk-block > :last-child { - margin-bottom: 0; -} -/* Padding Modifier - ========================================================================== */ -/* - * Large padding - */ -.uk-block-large { - padding-top: 20px; - padding-bottom: 20px; -} -/* Tablets and bigger */ -@media (min-width: 768px) { - .uk-block-large { - padding-top: 50px; - padding-bottom: 50px; - } -} -/* Desktop and bigger */ -@media (min-width: 960px) { - .uk-block-large { - padding-top: 100px; - padding-bottom: 100px; - } -} -/* Color Modifier - ========================================================================== */ -/* - * Default - */ -.uk-block-default { - background: #fff; -} -/* - * Muted - */ -.uk-block-muted { - background: #f9f9f9; -} -/* - * Primary - */ -.uk-block-primary { - background: #00a8e6; -} -/* - * Secondary - */ -.uk-block-secondary { - background: #222; -} -/* ======================================================================== - Component: Article - ========================================================================== */ -/* - * Micro clearfix to make articles more robust - */ -.uk-article:before, -.uk-article:after { - content: ""; - display: table; -} -.uk-article:after { - clear: both; -} -/* - * Remove margin from the last-child - */ -.uk-article > :last-child { - margin-bottom: 0; -} -/* - * Vertical gutter for articles - */ -.uk-article + .uk-article { - margin-top: 25px; -} -/* Sub-object `uk-article-title` - ========================================================================== */ -.uk-article-title { - font-size: 36px; - line-height: 42px; - font-weight: normal; - text-transform: none; -} -.uk-article-title a { - color: inherit; - text-decoration: none; -} -/* Sub-object `uk-article-meta` - ========================================================================== */ -.uk-article-meta { - font-size: 12px; - line-height: 18px; - color: #999; -} -/* Sub-object `uk-article-lead` - ========================================================================== */ -.uk-article-lead { - color: #444; - font-size: 18px; - line-height: 24px; - font-weight: normal; -} -/* Sub-object `uk-article-divider` - ========================================================================== */ -.uk-article-divider { - margin-bottom: 25px; - border-color: #ddd; -} -* + .uk-article-divider { - margin-top: 25px; -} -/* ======================================================================== - Component: Comment - ========================================================================== */ -/* Sub-object `uk-comment-header` - ========================================================================== */ -.uk-comment-header { - margin-bottom: 15px; -} -/* - * Micro clearfix - */ -.uk-comment-header:before, -.uk-comment-header:after { - content: ""; - display: table; -} -.uk-comment-header:after { - clear: both; -} -/* Sub-object `uk-comment-avatar` - ========================================================================== */ -.uk-comment-avatar { - margin-right: 15px; - float: left; -} -/* Sub-object `uk-comment-title` - ========================================================================== */ -.uk-comment-title { - margin: 5px 0 0 0; - font-size: 16px; - line-height: 22px; -} -/* Sub-object `uk-comment-meta` - ========================================================================== */ -.uk-comment-meta { - margin: 2px 0 0 0; - font-size: 11px; - line-height: 16px; - color: #999; -} -/* Sub-object `uk-comment-body` - ========================================================================== */ -/* - * Remove margin from the last-child - */ -.uk-comment-body > :last-child { - margin-bottom: 0; -} -/* Sub-object `uk-comment-list` - ========================================================================== */ -.uk-comment-list { - padding: 0; - list-style: none; -} -.uk-comment-list .uk-comment + ul { - margin: 15px 0 0 0; - list-style: none; -} -.uk-comment-list > li:nth-child(n+2), -.uk-comment-list .uk-comment + ul > li:nth-child(n+2) { - margin-top: 15px; -} -/* Tablet and bigger */ -@media (min-width: 768px) { - .uk-comment-list .uk-comment + ul { - padding-left: 100px; - } -} -/* Modifier `uk-comment-primary` - ========================================================================== */ -/* ======================================================================== - Component: Cover - ========================================================================== */ -/* - * Background image always covers and centers its element - */ -.uk-cover-background { - background-position: 50% 50%; - background-size: cover; - background-repeat: no-repeat; -} -/* - * Emulates image cover, works with video and image elements - * 1. Parent container which clips resized object - * 2. Resizes the object to always covers its container - * 3. Reset the responsive image CSS - * 4. Center object - */ -/* 1 */ -.uk-cover { - overflow: hidden; -} -.uk-cover-object { - /* 2 */ - width: auto; - height: auto; - min-width: 100%; - min-height: 100%; - /* 3 */ - max-width: none; - /* 4 */ - position: relative; - left: 50%; - top: 50%; - -webkit-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); -} -/* - * To center iframes use `data-uk-cover` JavaScript - */ -[data-uk-cover] { - position: relative; - left: 50%; - top: 50%; - -webkit-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); -} -/* ======================================================================== - Component: Nav - ========================================================================== */ -.uk-nav, -.uk-nav ul { - margin: 0; - padding: 0; - list-style: none; -} -/* - * Items - */ -.uk-nav li > a { - display: block; - text-decoration: none; -} -.uk-nav > li > a { - padding: 5px 15px; -} -/* - * Nested items - */ -.uk-nav ul { - padding-left: 15px; -} -.uk-nav ul a { - padding: 2px 0; -} -/* - * Item subtitle - */ -.uk-nav li > a > div { - font-size: 12px; - line-height: 18px; -} -/* Sub-object: `uk-nav-header` - ========================================================================== */ -.uk-nav-header { - padding: 5px 15px; - text-transform: uppercase; - font-weight: bold; - font-size: 12px; -} -.uk-nav-header:not(:first-child) { - margin-top: 15px; -} -/* Sub-object: `uk-nav-divider` - ========================================================================== */ -.uk-nav-divider { - margin: 9px 15px; -} -/* Sub-object: `uk-nav-sub` - ========================================================================== */ -/* - * `ul` needed for higher specificity to override padding - */ -ul.uk-nav-sub { - padding: 5px 0 5px 15px; -} -/* Modifier: `uk-nav-parent-icon` - ========================================================================== */ -.uk-nav-parent-icon > .uk-parent > a:after { - content: "\f104"; - width: 20px; - margin-right: -10px; - float: right; - font-family: FontAwesome; - text-align: center; -} -.uk-nav-parent-icon > .uk-parent.uk-open > a:after { - content: "\f107"; -} -/* Modifier `uk-nav-side` - ========================================================================== */ -/* - * Items - */ -.uk-nav-side > li > a { - color: #444; -} -/* - * Hover - * 1. Apply hover style also to focus state - * 2. Remove default focus style - */ -.uk-nav-side > li > a:hover, -.uk-nav-side > li > a:focus { - background: rgba(0, 0, 0, 0.05); - color: #444; - /* 2 */ - outline: none; -} -/* Active */ -.uk-nav-side > li.uk-active > a { - background: #00a8e6; - color: #fff; -} -/* - * Sub-object: `uk-nav-header` - */ -.uk-nav-side .uk-nav-header { - color: #444; -} -/* - * Sub-object: `uk-nav-divider` - */ -.uk-nav-side .uk-nav-divider { - border-top: 1px solid #ddd; -} -/* - * Nested items - */ -.uk-nav-side ul a { - color: #07D; -} -.uk-nav-side ul a:hover { - color: #059; -} -/* Modifier `uk-nav-dropdown` - ========================================================================== */ -/* - * Items - */ -.uk-nav-dropdown > li > a { - color: #444; -} -/* - * Hover - * 1. Apply hover style also to focus state - * 2. Remove default focus style - */ -.uk-nav-dropdown > li > a:hover, -.uk-nav-dropdown > li > a:focus { - background: #00a8e6; - color: #fff; - /* 2 */ - outline: none; -} -/* - * Sub-object: `uk-nav-header` - */ -.uk-nav-dropdown .uk-nav-header { - color: #999; -} -/* - * Sub-object: `uk-nav-divider` - */ -.uk-nav-dropdown .uk-nav-divider { - border-top: 1px solid #ddd; -} -/* - * Nested items - */ -.uk-nav-dropdown ul a { - color: #07D; -} -.uk-nav-dropdown ul a:hover { - color: #059; -} -/* Modifier `uk-nav-navbar` - ========================================================================== */ -/* - * Items - */ -.uk-nav-navbar > li > a { - color: #444; -} -/* - * Hover - * 1. Apply hover style also to focus state - * 2. Remove default focus style - */ -.uk-nav-navbar > li > a:hover, -.uk-nav-navbar > li > a:focus { - background: #00a8e6; - color: #fff; - /* 2 */ - outline: none; -} -/* - * Sub-object: `uk-nav-header` - */ -.uk-nav-navbar .uk-nav-header { - color: #999; -} -/* - * Sub-object: `uk-nav-divider` - */ -.uk-nav-navbar .uk-nav-divider { - border-top: 1px solid #ddd; -} -/* - * Nested items - */ -.uk-nav-navbar ul a { - color: #07D; -} -.uk-nav-navbar ul a:hover { - color: #059; -} -/* Modifier `uk-nav-offcanvas` - ========================================================================== */ -/* - * Items - */ -.uk-nav-offcanvas > li > a { - color: #ccc; - padding: 10px 15px; -} -/* - * Hover - * No hover on touch devices because it behaves buggy in fixed offcanvas - * 1. Apply hover style also to focus state - * 2. Remove default focus style - */ -.uk-nav-offcanvas > .uk-open > a, -html:not(.uk-touch) .uk-nav-offcanvas > li > a:hover, -html:not(.uk-touch) .uk-nav-offcanvas > li > a:focus { - background: #404040; - color: #fff; - /* 2 */ - outline: none; -} -/* - * Active - * `html .uk-nav` needed for higher specificity to override hover - */ -html .uk-nav.uk-nav-offcanvas > li.uk-active > a { - background: #1a1a1a; - color: #fff; -} -/* - * Sub-object: `uk-nav-header` - */ -.uk-nav-offcanvas .uk-nav-header { - color: #777; -} -/* - * Sub-object: `uk-nav-divider` - */ -.uk-nav-offcanvas .uk-nav-divider { - border-top: 1px solid #1a1a1a; -} -/* - * Nested items - * No hover on touch devices because it behaves buggy in fixed offcanvas - */ -.uk-nav-offcanvas ul a { - color: #ccc; -} -html:not(.uk-touch) .uk-nav-offcanvas ul a:hover { - color: #fff; -} -/* ======================================================================== - Component: Navbar - ========================================================================== */ -.uk-navbar { - background: #eee; - color: #444; -} -/* - * Micro clearfix - */ -.uk-navbar:before, -.uk-navbar:after { - content: ""; - display: table; -} -.uk-navbar:after { - clear: both; -} -/* Sub-object: `uk-navbar-nav` - ========================================================================== */ -.uk-navbar-nav { - margin: 0; - padding: 0; - list-style: none; - float: left; -} -/* - * 1. Create position context for dropdowns - */ -.uk-navbar-nav > li { - float: left; - /* 1 */ - position: relative; -} -/* - * 1. Dimensions - * 2. Style - */ -.uk-navbar-nav > li > a { - display: block; - box-sizing: border-box; - text-decoration: none; - /* 1 */ - height: 40px; - padding: 0 15px; - line-height: 40px; - /* 2 */ - color: #444; - font-size: 14px; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-weight: normal; -} -/* Appear not as link */ -.uk-navbar-nav > li > a[href='#'] { - cursor: text; -} -/* - * Hover - * 1. Apply hover style also to focus state - * 2. Also apply if dropdown is opened - * 3. Remove default focus style - */ -.uk-navbar-nav > li:hover > a, -.uk-navbar-nav > li > a:focus, -.uk-navbar-nav > li.uk-open > a { - background-color: #f5f5f5; - color: #444; - /* 3 */ - outline: none; -} -/* OnClick */ -.uk-navbar-nav > li > a:active { - background-color: #ddd; - color: #444; -} -/* Active */ -.uk-navbar-nav > li.uk-active > a { - background-color: #f5f5f5; - color: #444; -} -/* Sub-objects: `uk-navbar-nav-subtitle` - ========================================================================== */ -.uk-navbar-nav .uk-navbar-nav-subtitle { - line-height: 28px; -} -.uk-navbar-nav-subtitle > div { - margin-top: -6px; - font-size: 10px; - line-height: 12px; -} -/* Sub-objects: `uk-navbar-content`, `uk-navbar-brand`, `uk-navbar-toggle` - ========================================================================== */ -/* - * Imitate navbar items - */ -.uk-navbar-content, -.uk-navbar-brand, -.uk-navbar-toggle { - box-sizing: border-box; - display: block; - height: 40px; - padding: 0 15px; - float: left; -} -/* - * Helper to center all child elements vertically - */ -.uk-navbar-content:before, -.uk-navbar-brand:before, -.uk-navbar-toggle:before { - content: ''; - display: inline-block; - height: 100%; - vertical-align: middle; -} -/* Sub-objects: `uk-navbar-content` - ========================================================================== */ -/* - * Better sibling spacing - */ -.uk-navbar-content + .uk-navbar-content:not(.uk-navbar-center) { - padding-left: 0; -} -/* - * Link colors - */ -.uk-navbar-content > a:not([class]) { - color: #07D; -} -.uk-navbar-content > a:not([class]):hover { - color: #059; -} -/* Sub-objects: `uk-navbar-brand` - ========================================================================== */ -.uk-navbar-brand { - font-size: 18px; - color: #444; - text-decoration: none; -} -/* - * 1. Apply hover style also to focus state - * 2. Remove default focus style - */ -.uk-navbar-brand:hover, -.uk-navbar-brand:focus { - color: #444; - text-decoration: none; - /* 2 */ - outline: none; -} -/* Sub-object: `uk-navbar-toggle` - ========================================================================== */ -.uk-navbar-toggle { - font-size: 18px; - color: #444; - text-decoration: none; -} -/* - * 1. Apply hover style also to focus state - * 2. Remove default focus style - */ -.uk-navbar-toggle:hover, -.uk-navbar-toggle:focus { - color: #444; - text-decoration: none; - /* 2 */ - outline: none; -} -/* - * 1. Center icon vertically - */ -.uk-navbar-toggle:after { - content: "\f0c9"; - font-family: FontAwesome; - /* 1 */ - vertical-align: middle; -} -.uk-navbar-toggle-alt:after { - content: "\f002"; -} -/* Sub-object: `uk-navbar-center` - ========================================================================== */ -/* - * The element with this class needs to be last child in the navbar - * 1. This hack is needed because other float elements shift centered text - */ -.uk-navbar-center { - float: none; - text-align: center; - /* 1 */ - max-width: 50%; - margin-left: auto; - margin-right: auto; -} -/* Sub-object: `uk-navbar-flip` - ========================================================================== */ -.uk-navbar-flip { - float: right; -} -/* ======================================================================== - Component: Subnav - ========================================================================== */ -/* - * 1. Gutter - * 2. Remove default list style - */ -.uk-subnav { - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -ms-flex-wrap: wrap; - -webkit-flex-wrap: wrap; - flex-wrap: wrap; - /* 1 */ - margin-left: -10px; - margin-top: -10px; - /* 2 */ - padding: 0; - list-style: none; -} -/* - * 1. Space is allocated solely based on content dimensions - * 2. Horizontal gutter is using `padding` so `uk-width-*` classes can be applied - * 3. Create position context for dropdowns - */ -.uk-subnav > * { - /* 1 */ - -ms-flex: none; - -webkit-flex: none; - flex: none; - /* 2 */ - padding-left: 10px; - margin-top: 10px; - /* 3 */ - position: relative; -} -/* - * DEPRECATED IE9 Support - */ -.uk-subnav:before, -.uk-subnav:after { - content: ""; - display: block; - overflow: hidden; -} -.uk-subnav:after { - clear: both; -} -.uk-subnav > * { - float: left; -} -/* Items - ========================================================================== */ -.uk-subnav > * > * { - display: inline-block; - color: #444; -} -/* - * Hover - * 1. Apply hover style also to focus state - */ -.uk-subnav > * > :hover, -.uk-subnav > * > :focus { - color: #07D; - text-decoration: none; -} -/* - * Active - */ -.uk-subnav > .uk-active > * { - color: #07D; -} -/* Modifier: 'subnav-line' - ========================================================================== */ -.uk-subnav-line > :before { - content: ""; - display: inline-block; - height: 10px; - vertical-align: middle; -} -.uk-subnav-line > :nth-child(n+2):before { - margin-right: 10px; - border-left: 1px solid #ddd; -} -/* Modifier: 'subnav-pill' - ========================================================================== */ -.uk-subnav-pill > * > * { - padding: 3px 9px; -} -/* - * Hover - * 1. Apply hover style also to focus state - * 2. Remove default focus style - */ -.uk-subnav-pill > * > :hover, -.uk-subnav-pill > * > :focus { - background: #eee; - color: #444; - text-decoration: none; - /* 2 */ - outline: none; -} -/* - * Active - * `li` needed for higher specificity to override hover - */ -.uk-subnav-pill > .uk-active > * { - background: #00a8e6; - color: #fff; -} -/* Disabled state - ========================================================================== */ -.uk-subnav > .uk-disabled > * { - background: none; - color: #999; - text-decoration: none; - cursor: text; -} -/* ======================================================================== - Component: Breadcrumb - ========================================================================== */ -/* - * 1. Remove default list style - * 2. Remove whitespace between child elements when using `inline-block` - */ -.uk-breadcrumb { - /* 1 */ - padding: 0; - list-style: none; - /* 2 */ - font-size: 0.001px; -} -/* Items - ========================================================================== */ -/* - * Reset whitespace hack - */ -.uk-breadcrumb > li { - font-size: 1rem; - vertical-align: top; -} -.uk-breadcrumb > li, -.uk-breadcrumb > li > a, -.uk-breadcrumb > li > span { - display: inline-block; -} -.uk-breadcrumb > li:nth-child(n+2):before { - content: "/"; - display: inline-block; - margin: 0 8px; -} -/* - * Disabled - */ -.uk-breadcrumb > li:not(.uk-active) > span { - color: #999; -} -/* ======================================================================== - Component: Pagination - ========================================================================== */ -/* - * 1. Remove default list style - * 2. Center pagination by default - * 3. Remove whitespace between child elements when using `inline-block` - */ -.uk-pagination { - /* 1 */ - padding: 0; - list-style: none; - /* 2 */ - text-align: center; - /* 3 */ - font-size: 0.001px; -} -/* - * Micro clearfix - * Needed if `uk-pagination-previous` or `uk-pagination-next` sub-objects are used - */ -.uk-pagination:before, -.uk-pagination:after { - content: ""; - display: table; -} -.uk-pagination:after { - clear: both; -} -/* Items - ========================================================================== */ -/* - * 1. Reset whitespace hack - * 2. Remove the gap at the bottom of it container - */ -.uk-pagination > li { - display: inline-block; - /* 1 */ - font-size: 1rem; - /* 2 */ - vertical-align: top; -} -.uk-pagination > li:nth-child(n+2) { - margin-left: 5px; -} -/* - * 1. Makes pagination more robust against different box-sizing use - * 2. Reset text-align to center if alignment modifier is used - */ -.uk-pagination > li > a, -.uk-pagination > li > span { - display: inline-block; - min-width: 16px; - padding: 3px 5px; - line-height: 20px; - text-decoration: none; - /* 1 */ - box-sizing: content-box; - /* 2 */ - text-align: center; -} -/* - * Links - */ -.uk-pagination > li > a { - background: #eee; - color: #444; -} -/* - * Hover - * 1. Apply hover style also to focus state - * 2. Remove default focus style - */ -.uk-pagination > li > a:hover, -.uk-pagination > li > a:focus { - background-color: #f5f5f5; - color: #444; - /* 2 */ - outline: none; -} -/* OnClick */ -.uk-pagination > li > a:active { - background-color: #ddd; - color: #444; -} -/* - * Active - */ -.uk-pagination > .uk-active > span { - background: #00a8e6; - color: #fff; -} -/* - * Disabled - */ -.uk-pagination > .uk-disabled > span { - background-color: #f5f5f5; - color: #999; -} -/* Previous and next navigation - ========================================================================== */ -.uk-pagination-previous { - float: left; -} -.uk-pagination-next { - float: right; -} -/* Alignment modifiers - ========================================================================== */ -.uk-pagination-left { - text-align: left; -} -.uk-pagination-right { - text-align: right; -} -/* ======================================================================== - Component: Tab - ========================================================================== */ -.uk-tab { - margin: 0; - padding: 0; - list-style: none; - border-bottom: 1px solid #ddd; -} -/* - * Micro clearfix on the deepest container - */ -.uk-tab:before, -.uk-tab:after { - content: ""; - display: table; -} -.uk-tab:after { - clear: both; -} -/* - * Items - * 1. Create position context for dropdowns - */ -.uk-tab > li { - margin-bottom: -1px; - float: left; - /* 1 */ - position: relative; -} -.uk-tab > li > a { - display: block; - padding: 8px 12px 8px 12px; - border: 1px solid transparent; - border-bottom-width: 0; - color: #07D; - text-decoration: none; -} -.uk-tab > li:nth-child(n+2) > a { - margin-left: 5px; -} -/* - * Hover - * 1. Apply hover style also to focus state - * 2. Also apply if dropdown is opened - * 3. Remove default focus style - */ -.uk-tab > li > a:hover, -.uk-tab > li > a:focus, -.uk-tab > li.uk-open > a { - border-color: #f5f5f5; - background: #f5f5f5; - color: #059; - /* 2 */ - outline: none; -} -.uk-tab > li:not(.uk-active) > a:hover, -.uk-tab > li:not(.uk-active) > a:focus, -.uk-tab > li.uk-open:not(.uk-active) > a { - margin-bottom: 1px; - padding-bottom: 7px; -} -/* Active */ -.uk-tab > li.uk-active > a { - border-color: #ddd; - border-bottom-color: transparent; - background: #fff; - color: #444; -} -/* Disabled */ -.uk-tab > li.uk-disabled > a { - color: #999; - cursor: text; -} -.uk-tab > li.uk-disabled > a:hover, -.uk-tab > li.uk-disabled > a:focus, -.uk-tab > li.uk-disabled.uk-active > a { - background: none; - border-color: transparent; -} -/* Modifier: 'tab-flip' - ========================================================================== */ -.uk-tab-flip > li { - float: right; -} -.uk-tab-flip > li:nth-child(n+2) > a { - margin-left: 0; - margin-right: 5px; -} -/* Modifier: 'tab-responsive' - ========================================================================== */ -.uk-tab > li.uk-tab-responsive > a { - margin-left: 0; - margin-right: 0; -} -/* - * Icon - */ -.uk-tab-responsive > a:before { - content: "\f0c9\00a0"; - font-family: FontAwesome; -} -/* Modifier: 'tab-center' - ========================================================================== */ -.uk-tab-center { - border-bottom: 1px solid #ddd; -} -.uk-tab-center-bottom { - border-bottom: none; - border-top: 1px solid #ddd; -} -.uk-tab-center:before, -.uk-tab-center:after { - content: ""; - display: table; -} -.uk-tab-center:after { - clear: both; -} -/* - * 1. Using `right` to prevent vertical scrollbar caused by centering if to many tabs - */ -.uk-tab-center .uk-tab { - position: relative; - right: 50%; - border: none; - float: right; -} -.uk-tab-center .uk-tab > li { - position: relative; - right: -50%; -} -.uk-tab-center .uk-tab > li > a { - text-align: center; -} -/* Modifier: 'tab-bottom' - ========================================================================== */ -.uk-tab-bottom { - border-top: 1px solid #ddd; - border-bottom: none; -} -.uk-tab-bottom > li { - margin-top: -1px; - margin-bottom: 0; -} -.uk-tab-bottom > li > a { - padding-top: 8px; - padding-bottom: 8px; - border-bottom-width: 1px; - border-top-width: 0; -} -.uk-tab-bottom > li:not(.uk-active) > a:hover, -.uk-tab-bottom > li:not(.uk-active) > a:focus, -.uk-tab-bottom > li.uk-open:not(.uk-active) > a { - margin-bottom: 0; - margin-top: 1px; - padding-bottom: 8px; - padding-top: 7px; -} -.uk-tab-bottom > li.uk-active > a { - border-top-color: transparent; - border-bottom-color: #ddd; -} -/* Modifier: 'tab-grid' - ========================================================================== */ -/* - * 1. Create position context to prevent hidden border because of negative `z-index` - */ -.uk-tab-grid { - margin-left: -5px; - border-bottom: none; - /* 1 */ - position: relative; - z-index: 0; -} -.uk-tab-grid:before { - display: block; - position: absolute; - left: 5px; - right: 0; - bottom: -1px; - border-top: 1px solid #ddd; - /* 1 */ - z-index: -1; -} -.uk-tab-grid > li:first-child > a { - margin-left: 5px; -} -.uk-tab-grid > li > a { - text-align: center; -} -/* - * If `uk-tab-bottom` - */ -.uk-tab-grid.uk-tab-bottom { - border-top: none; -} -.uk-tab-grid.uk-tab-bottom:before { - top: -1px; - bottom: auto; -} -/* Modifier: 'tab-left', 'tab-right' - ========================================================================== */ -/* Tablet and bigger */ -@media (min-width: 768px) { - .uk-tab-left, - .uk-tab-right { - border-bottom: none; - } - .uk-tab-left > li, - .uk-tab-right > li { - margin-bottom: 0; - float: none; - } - .uk-tab-left > li > a, - .uk-tab-right > li > a { - padding-top: 8px; - padding-bottom: 8px; - } - .uk-tab-left > li:nth-child(n+2) > a, - .uk-tab-right > li:nth-child(n+2) > a { - margin-left: 0; - margin-top: 5px; - } - .uk-tab-left > li.uk-active > a, - .uk-tab-right > li.uk-active > a { - border-color: #ddd; - } - /* - * Modifier: 'tab-left' - */ - .uk-tab-left { - border-right: 1px solid #ddd; - } - .uk-tab-left > li { - margin-right: -1px; - } - .uk-tab-left > li > a { - border-bottom-width: 1px; - border-right-width: 0; - } - .uk-tab-left > li:not(.uk-active) > a:hover, - .uk-tab-left > li:not(.uk-active) > a:focus { - margin-bottom: 0; - margin-right: 1px; - padding-bottom: 8px; - padding-right: 11px; - } - .uk-tab-left > li.uk-active > a { - border-right-color: transparent; - } - /* - * Modifier: 'tab-right' - */ - .uk-tab-right { - border-left: 1px solid #ddd; - } - .uk-tab-right > li { - margin-left: -1px; - } - .uk-tab-right > li > a { - border-bottom-width: 1px; - border-left-width: 0; - } - .uk-tab-right > li:not(.uk-active) > a:hover, - .uk-tab-right > li:not(.uk-active) > a:focus { - margin-bottom: 0; - margin-left: 1px; - padding-bottom: 8px; - padding-left: 11px; - } - .uk-tab-right > li.uk-active > a { - border-left-color: transparent; - } -} -/* ======================================================================== - Component: Thumbnav - ========================================================================== */ -/* - * 1. Gutter - * 2. Remove default list style - */ -.uk-thumbnav { - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -ms-flex-wrap: wrap; - -webkit-flex-wrap: wrap; - flex-wrap: wrap; - /* 1 */ - margin-left: -10px; - margin-top: -10px; - /* 2 */ - padding: 0; - list-style: none; -} -/* - * 1. Space is allocated solely based on content dimensions - * 2. Horizontal gutter is using `padding` so `uk-width-*` classes can be applied - */ -.uk-thumbnav > * { - /* 1 */ - -ms-flex: none; - -webkit-flex: none; - flex: none; - /* 2 */ - padding-left: 10px; - margin-top: 10px; -} -/* - * DEPRECATED IE9 Support - */ -.uk-thumbnav:before, -.uk-thumbnav:after { - content: ""; - display: block; - overflow: hidden; -} -.uk-thumbnav:after { - clear: both; -} -.uk-thumbnav > * { - float: left; -} -/* Items - ========================================================================== */ -.uk-thumbnav > * > * { - display: block; - background: #fff; -} -.uk-thumbnav > * > * > img { - opacity: 0.7; - -webkit-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; -} -/* - * Hover - */ -.uk-thumbnav > * > :hover > img, -.uk-thumbnav > * > :focus > img { - opacity: 1; -} -/* - * Active - */ -.uk-thumbnav > .uk-active > * > img { - opacity: 1; -} -/* ======================================================================== - Component: List - ========================================================================== */ -.uk-list { - padding: 0; - list-style: none; -} -/* - * Micro clearfix to make list more robust - */ -.uk-list > li:before, -.uk-list > li:after { - content: ""; - display: table; -} -.uk-list > li:after { - clear: both; -} -/* - * Remove margin from the last-child - */ -.uk-list > li > :last-child { - margin-bottom: 0; -} -/* - * Nested lists - */ -.uk-list ul { - margin: 0; - padding-left: 20px; - list-style: none; -} -/* Modifier: `uk-list-line` - ========================================================================== */ -.uk-list-line > li:nth-child(n+2) { - margin-top: 5px; - padding-top: 5px; - border-top: 1px solid #ddd; -} -/* Modifier: `uk-list-striped` - ========================================================================== */ -.uk-list-striped > li { - padding: 5px 5px; -} -.uk-list-striped > li:nth-of-type(odd) { - background: #f5f5f5; -} -/* Modifier: `uk-list-space` - ========================================================================== */ -.uk-list-space > li:nth-child(n+2) { - margin-top: 10px; -} -/* ======================================================================== - Component: Description list - ========================================================================== */ -/* Modifier: `uk-description-list-horizontal` - ========================================================================== */ -/* Tablet and bigger */ -@media (min-width: 768px) { - .uk-description-list-horizontal { - overflow: hidden; - } - .uk-description-list-horizontal > dt { - width: 160px; - float: left; - clear: both; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } - .uk-description-list-horizontal > dd { - margin-left: 180px; - } -} -/* Modifier: `uk-description-list-line` - ========================================================================== */ -.uk-description-list-line > dt { - font-weight: normal; -} -.uk-description-list-line > dt:nth-child(n+2) { - margin-top: 5px; - padding-top: 5px; - border-top: 1px solid #ddd; -} -.uk-description-list-line > dd { - color: #999; -} -/* ======================================================================== - Component: Table - ========================================================================== */ -/* - * 1. Remove most spacing between table cells. - * 2. Block element behavior - * 3. Style - */ -.uk-table { - /* 1 */ - border-collapse: collapse; - border-spacing: 0; - /* 2 */ - width: 100%; - /* 3 */ - margin-bottom: 15px; -} -/* - * Add margin if adjacent element - */ -* + .uk-table { - margin-top: 15px; -} -.uk-table th, -.uk-table td { - padding: 8px 8px; -} -/* - * Set alignment - */ -.uk-table th { - text-align: left; -} -.uk-table td { - vertical-align: top; -} -.uk-table thead th { - vertical-align: bottom; -} -/* - * Caption and footer - */ -.uk-table caption, -.uk-table tfoot { - font-size: 12px; - font-style: italic; -} -.uk-table caption { - text-align: left; - color: #999; -} -/* - * Active State - */ -.uk-table tbody tr.uk-active { - background: #EEE; -} -/* Sub-modifier: `uk-table-middle` - ========================================================================== */ -.uk-table-middle, -.uk-table-middle td { - vertical-align: middle !important; -} -/* Modifier: `uk-table-striped` - ========================================================================== */ -.uk-table-striped tbody tr:nth-of-type(odd) { - background: #f5f5f5; -} -/* Modifier: `uk-table-condensed` - ========================================================================== */ -.uk-table-condensed td { - padding: 4px 8px; -} -/* Modifier: `uk-table-hover` - ========================================================================== */ -.uk-table-hover tbody tr:hover { - background: #EEE; -} -/* ======================================================================== - Component: Form - ========================================================================== */ -/* - * 1. Define consistent box sizing. - * Default is `content-box` with following exceptions set to `border-box` - * `button`, `select`, `input[type="checkbox"]` and `input[type="radio"]` - * `input[type="search"]` in Chrome, Safari and Opera - * `input[type="color"]` in Firefox - * 2. Address margins set differently in Firefox/IE and Chrome/Safari/Opera. - * 3. Remove `border-radius` in iOS. - * 4. Correct `font` properties and `color` not being inherited. - */ -.uk-form input, -.uk-form select, -.uk-form textarea { - /* 1 */ - box-sizing: border-box; - /* 2 */ - margin: 0; - /* 3 */ - border-radius: 0; - /* 4 */ - font: inherit; - color: inherit; -} -/* - * Address inconsistent `text-transform` inheritance which is only inherit in Firefox - */ -.uk-form select { - text-transform: none; -} -/* - * 1. Correct `font` properties not being inherited. - * 2. Don't inherit the `font-weight` and use `bold` instead. - * NOTE: Both declarations don't work in Chrome, Safari and Opera. - */ -.uk-form optgroup { - /* 1 */ - font: inherit; - /* 2 */ - font-weight: bold; -} -/* - * Removes inner padding and border in Firefox 4+. - */ -.uk-form input::-moz-focus-inner { - border: 0; - padding: 0; -} -/* - * Removes excess padding in IE 8/9/10. - */ -.uk-form input[type="checkbox"], -.uk-form input[type="radio"] { - padding: 0; -} -/* - * Improves consistency of cursor style for clickable elements - */ -.uk-form input[type="checkbox"]:not(:disabled), -.uk-form input[type="radio"]:not(:disabled) { - cursor: pointer; -} -/* - * Remove default style in iOS. - */ -.uk-form textarea, -.uk-form input:not([type]), -.uk-form input[type="text"], -.uk-form input[type="password"], -.uk-form input[type="email"], -.uk-form input[type="url"], -.uk-form input[type="search"], -.uk-form input[type="tel"], -.uk-form input[type="number"], -.uk-form input[type="datetime"] { - -webkit-appearance: none; -} -/* - * Remove inner padding and search cancel button in Chrome, Safari and Opera on OS X. - */ -.uk-form input[type="search"]::-webkit-search-cancel-button, -.uk-form input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} -/* - * Fix the cursor style for Chrome's increment/decrement buttons. For certain - * `font-size` values of the `input`, it causes the cursor style of the - * decrement button to change from `default` to `text`. - */ -.uk-form input[type="number"]::-webkit-inner-spin-button, -.uk-form input[type="number"]::-webkit-outer-spin-button { - height: auto; -} -/* - * Define consistent border, margin, and padding. - */ -.uk-form fieldset { - border: none; - margin: 0; - padding: 0; -} -/* - * 1. Remove default vertical scrollbar in IE 8/9/10/11. - * 2. Improve readability and alignment in all browsers. - */ -.uk-form textarea { - /* 1 */ - overflow: auto; - /* 2 */ - vertical-align: top; -} -/* - * Removes placeholder transparency in Firefox. - */ -.uk-form ::-moz-placeholder { - opacity: 1; -} -/* - * Removes `box-shadow` for invalid controls in Firefox. - */ -.uk-form :invalid { - box-shadow: none; -} -/* - * Vertical alignment - */ -.uk-form input:not([type="radio"]):not([type="checkbox"]), -.uk-form select { - vertical-align: middle; -} -/* Style - ========================================================================== */ -/* - * Remove margin from the last-child - */ -.uk-form > :last-child { - margin-bottom: 0; -} -/* - * Controls - * Except for `range`, `radio`, `checkbox`, `file`, `submit`, `reset`, `button` and `image` - * 1. Must be `height` because `min-height` is not working in OSX - * 2. Responsiveness: Sets a maximum width relative to the parent to scale on narrower viewports - * 3. Vertical `padding` needed for `select` elements in Firefox - * 4. Style - */ -.uk-form select, -.uk-form textarea, -.uk-form input:not([type]), -.uk-form input[type="text"], -.uk-form input[type="password"], -.uk-form input[type="datetime"], -.uk-form input[type="datetime-local"], -.uk-form input[type="date"], -.uk-form input[type="month"], -.uk-form input[type="time"], -.uk-form input[type="week"], -.uk-form input[type="number"], -.uk-form input[type="email"], -.uk-form input[type="url"], -.uk-form input[type="search"], -.uk-form input[type="tel"], -.uk-form input[type="color"] { - /* 1 */ - height: 30px; - /* 2 */ - max-width: 100%; - /* 3 */ - padding: 4px 6px; - /* 4 */ - border: 1px solid #ddd; - background: #fff; - color: #444; - -webkit-transition: all 0.2s linear; - -webkit-transition-property: border, background, color, box-shadow, padding; - transition: all 0.2s linear; - transition-property: border, background, color, box-shadow, padding; -} -.uk-form select:focus, -.uk-form textarea:focus, -.uk-form input:not([type]):focus, -.uk-form input[type="text"]:focus, -.uk-form input[type="password"]:focus, -.uk-form input[type="datetime"]:focus, -.uk-form input[type="datetime-local"]:focus, -.uk-form input[type="date"]:focus, -.uk-form input[type="month"]:focus, -.uk-form input[type="time"]:focus, -.uk-form input[type="week"]:focus, -.uk-form input[type="number"]:focus, -.uk-form input[type="email"]:focus, -.uk-form input[type="url"]:focus, -.uk-form input[type="search"]:focus, -.uk-form input[type="tel"]:focus, -.uk-form input[type="color"]:focus { - border-color: #99baca; - outline: 0; - background: #f5fbfe; - color: #444; -} -.uk-form select:disabled, -.uk-form textarea:disabled, -.uk-form input:not([type]):disabled, -.uk-form input[type="text"]:disabled, -.uk-form input[type="password"]:disabled, -.uk-form input[type="datetime"]:disabled, -.uk-form input[type="datetime-local"]:disabled, -.uk-form input[type="date"]:disabled, -.uk-form input[type="month"]:disabled, -.uk-form input[type="time"]:disabled, -.uk-form input[type="week"]:disabled, -.uk-form input[type="number"]:disabled, -.uk-form input[type="email"]:disabled, -.uk-form input[type="url"]:disabled, -.uk-form input[type="search"]:disabled, -.uk-form input[type="tel"]:disabled, -.uk-form input[type="color"]:disabled { - border-color: #ddd; - background-color: #f5f5f5; - color: #999; -} -/* - * Placeholder - */ -.uk-form :-ms-input-placeholder { - color: #999 !important; -} -.uk-form ::-moz-placeholder { - color: #999; -} -.uk-form ::-webkit-input-placeholder { - color: #999; -} -.uk-form :disabled:-ms-input-placeholder { - color: #999 !important; -} -.uk-form :disabled::-moz-placeholder { - color: #999; -} -.uk-form :disabled::-webkit-input-placeholder { - color: #999; -} -/* - * Legend - * 1. Behave like block element - * 2. Correct `color` not being inherited in IE 8/9/10/11. - * 3. Remove padding - * 4. `margin-bottom` is not working in Safari and Opera. - * Using `padding` and :after instead to create the border - * 5. Style - */ -.uk-form legend { - /* 1 */ - width: 100%; - /* 2 */ - border: 0; - /* 3 */ - padding: 0; - /* 4 */ - padding-bottom: 15px; - /* 5 */ - font-size: 18px; - line-height: 30px; -} -/* - * 1. Fixes IE9 - */ -.uk-form legend:after { - content: ""; - display: block; - border-bottom: 1px solid #ddd; - /* 1 */ - width: 100%; -} -/* Size modifiers - * Higher specificity needed to override defaults - ========================================================================== */ -select.uk-form-small, -textarea.uk-form-small, -input[type].uk-form-small, -input:not([type]).uk-form-small { - height: 25px; - padding: 3px 3px; - font-size: 12px; -} -select.uk-form-large, -textarea.uk-form-large, -input[type].uk-form-large, -input:not([type]).uk-form-large { - height: 40px; - padding: 8px 6px; - font-size: 16px; -} -/* Reset height - * Must be after size modifiers - ========================================================================== */ -.uk-form textarea, -.uk-form select[multiple], -.uk-form select[size] { - height: auto; -} -/* Validation states - * Using !important to keep the selector simple - ========================================================================== */ -/* - * Error state - */ -.uk-form-danger { - border-color: #dc8d99 !important; - background: #fff7f8 !important; - color: #d85030 !important; -} -/* - * Success state - */ -.uk-form-success { - border-color: #8ec73b !important; - background: #fafff2 !important; - color: #659f13 !important; -} -/* Style modifiers - * Using !important to keep the selector simple - ========================================================================== */ -/* - * Blank form - */ -.uk-form-blank { - border-color: transparent !important; - border-style: dashed !important; - background: none !important; -} -.uk-form-blank:focus { - border-color: #ddd !important; -} -/* Size sub-modifiers - ========================================================================== */ -/* - * Fixed widths - * Different widths for mini sized `input` and `select` elements - */ -input.uk-form-width-mini { - width: 40px; -} -select.uk-form-width-mini { - width: 65px; -} -.uk-form-width-small { - width: 130px; -} -.uk-form-width-medium { - width: 200px; -} -.uk-form-width-large { - width: 500px; -} -/* Sub-objects: `uk-form-row` - * Groups labels and controls in rows - ========================================================================== */ -/* - * Micro clearfix - * Needed for `uk-form-horizontal` modifier - */ -.uk-form-row:before, -.uk-form-row:after { - content: ""; - display: table; -} -.uk-form-row:after { - clear: both; -} -/* - * Vertical gutter - */ -.uk-form-row + .uk-form-row { - margin-top: 15px; -} -/* Help text - * Sub-object: `uk-form-help-inline`, `uk-form-help-block` - ========================================================================== */ -.uk-form-help-inline { - display: inline-block; - margin: 0 0 0 10px; -} -.uk-form-help-block { - margin: 5px 0 0 0; -} -/* Controls content - * Sub-object: `uk-form-controls`, `uk-form-controls-condensed` - ========================================================================== */ -/* - * Remove margins - */ -.uk-form-controls > :first-child { - margin-top: 0; -} -.uk-form-controls > :last-child { - margin-bottom: 0; -} -/* - * Group controls and text into blocks with a small spacing between blocks - */ -.uk-form-controls-condensed { - margin: 5px 0; -} -/* Modifier: `uk-form-stacked` - * Requires sub-object: `uk-form-label` - ========================================================================== */ -.uk-form-stacked .uk-form-label { - display: block; - margin-bottom: 5px; - font-weight: bold; -} -/* Modifier: `uk-form-horizontal` - * Requires sub-objects: `uk-form-label`, `uk-form-controls` - ========================================================================== */ -/* Tablet portrait and smaller */ -@media (max-width: 959px) { - /* Behave like `uk-form-stacked` */ - .uk-form-horizontal .uk-form-label { - display: block; - margin-bottom: 5px; - font-weight: bold; - } -} -/* Desktop and bigger */ -@media (min-width: 960px) { - .uk-form-horizontal .uk-form-label { - width: 200px; - margin-top: 5px; - float: left; - } - .uk-form-horizontal .uk-form-controls { - margin-left: 215px; - } - /* Better vertical alignment if controls are checkboxes and radio buttons with text */ - .uk-form-horizontal .uk-form-controls-text { - padding-top: 5px; - } -} -/* Sub-object: `uk-form-icon` - ========================================================================== */ -/* - * 1. Container width fits its content - * 2. Create position context - * 3. Prevent `inline-block` consequences - */ -.uk-form-icon { - /* 1 */ - display: inline-block; - /* 2 */ - position: relative; - /* 3 */ - max-width: 100%; -} -/* - * 1. Make form element clickable through icon - */ -.uk-form-icon > [class*='uk-icon-'] { - position: absolute; - top: 50%; - width: 30px; - margin-top: -7px; - font-size: 14px; - color: #999; - text-align: center; - /* 1 */ - pointer-events: none; -} -.uk-form-icon:not(.uk-form-icon-flip) > input { - padding-left: 30px !important; -} -/* - * Sub-modifier: `uk-form-icon-flip` - */ -.uk-form-icon-flip > [class*='uk-icon-'] { - right: 0; -} -.uk-form-icon-flip > input { - padding-right: 30px !important; -} -/* ======================================================================== - Component: Button - ========================================================================== */ -/* - * Removes inner padding and border in Firefox 4+. - */ -.uk-button::-moz-focus-inner { - border: 0; - padding: 0; -} -/* - * 1. Correct inability to style clickable `input` types in iOS. - * 2. Remove margins in Chrome, Safari and Opera. - * 3. Remove borders for `button`. - * 4. Address `overflow` set to `hidden` in IE 8/9/10/11. - * 5. Correct `font` properties and `color` not being inherited for `button`. - * 6. Address inconsistent `text-transform` inheritance which is only inherit in Firefox and IE - * 7. Style - * 8. `line-height` is used to create a height - * 9. `min-height` is necessary for `input` elements in Firefox and Opera because `line-height` is not working. - * 10. Reset button group whitespace hack - * 11. Required for `a`. - */ -.uk-button { - /* 1 */ - -webkit-appearance: none; - /* 2 */ - margin: 0; - /* 3 */ - border: none; - /* 4 */ - overflow: visible; - /* 5 */ - font: inherit; - color: #444; - /* 6 */ - text-transform: none; - /* 7 */ - display: inline-block; - box-sizing: border-box; - padding: 0 12px; - background: #eee; - vertical-align: middle; - /* 8 */ - line-height: 30px; - /* 9 */ - min-height: 30px; - /* 10 */ - font-size: 1rem; - /* 11 */ - text-decoration: none; - text-align: center; -} -.uk-button:not(:disabled) { - cursor: pointer; -} -/* - * Hover - * 1. Apply hover style also to focus state - * 2. Remove default focus style - * 3. Required for `a` elements - */ -.uk-button:hover, -.uk-button:focus { - background-color: #f5f5f5; - color: #444; - /* 2 */ - outline: none; - /* 3 */ - text-decoration: none; -} -/* Active */ -.uk-button:active, -.uk-button.uk-active { - background-color: #ddd; - color: #444; -} -/* Color modifiers - ========================================================================== */ -/* - * Modifier: `uk-button-primary` - */ -.uk-button-primary { - background-color: #00a8e6; - color: #fff; -} -/* Hover */ -.uk-button-primary:hover, -.uk-button-primary:focus { - background-color: #35b3ee; - color: #fff; -} -/* Active */ -.uk-button-primary:active, -.uk-button-primary.uk-active { - background-color: #0091ca; - color: #fff; -} -/* - * Modifier: `uk-button-success` - */ -.uk-button-success { - background-color: #8cc14c; - color: #fff; -} -/* Hover */ -.uk-button-success:hover, -.uk-button-success:focus { - background-color: #8ec73b; - color: #fff; -} -/* Active */ -.uk-button-success:active, -.uk-button-success.uk-active { - background-color: #72ae41; - color: #fff; -} -/* - * Modifier: `uk-button-danger` - */ -.uk-button-danger { - background-color: #da314b; - color: #fff; -} -/* Hover */ -.uk-button-danger:hover, -.uk-button-danger:focus { - background-color: #e4354f; - color: #fff; -} -/* Active */ -.uk-button-danger:active, -.uk-button-danger.uk-active { - background-color: #c91032; - color: #fff; -} -/* Disabled state - * Overrides also the color modifiers - ========================================================================== */ -/* Equal for all button types */ -.uk-button:disabled { - background-color: #f5f5f5; - color: #999; -} -/* Modifier: `uk-button-link` - ========================================================================== */ -/* Reset */ -.uk-button-link, -.uk-button-link:hover, -.uk-button-link:focus, -.uk-button-link:active, -.uk-button-link.uk-active, -.uk-button-link:disabled { - border-color: transparent; - background: none; -} -/* Color */ -.uk-button-link { - color: #07D; -} -.uk-button-link:hover, -.uk-button-link:focus, -.uk-button-link:active, -.uk-button-link.uk-active { - color: #059; - text-decoration: underline; -} -.uk-button-link:disabled { - color: #999; -} -/* Focus */ -.uk-button-link:focus { - outline: 1px dotted; -} -/* Size modifiers - ========================================================================== */ -.uk-button-mini { - min-height: 20px; - padding: 0 6px; - line-height: 20px; - font-size: 11px; -} -.uk-button-small { - min-height: 25px; - padding: 0 10px; - line-height: 25px; - font-size: 12px; -} -.uk-button-large { - min-height: 40px; - padding: 0 15px; - line-height: 40px; - font-size: 16px; -} -/* Sub-object `uk-button-group` - ========================================================================== */ -/* - * 1. Behave like buttons - * 2. Create position context for dropdowns - * 3. Remove whitespace between child elements when using `inline-block` - * 4. Prevent buttons from wrapping - * 5. Remove whitespace between child elements when using `inline-block` - */ -.uk-button-group { - /* 1 */ - display: inline-block; - vertical-align: middle; - /* 2 */ - position: relative; - /* 3 */ - font-size: 0.001px; - /* 4 */ - white-space: nowrap; -} -.uk-button-group > * { - display: inline-block; -} -/* 5 */ -.uk-button-group .uk-button { - vertical-align: top; -} -/* Sub-object: `uk-button-dropdown` - ========================================================================== */ -/* - * 1. Behave like buttons - * 2. Create position context for dropdowns - */ -.uk-button-dropdown { - /* 1 */ - display: inline-block; - vertical-align: middle; - /* 2 */ - position: relative; -} -/* ======================================================================== - Component: Icon - ========================================================================== */ -@font-face { - font-family: 'FontAwesome'; - src: url("../fonts/fontawesome-webfont.woff2") format('woff2'), url("../fonts/fontawesome-webfont.woff") format("woff"), url("../fonts/fontawesome-webfont.ttf") format("truetype"); - font-weight: normal; - font-style: normal; -} -/* - * 1. Allow margin - * 2. Prevent inherit font style - * 4. Correct line-height - * 5. Better font rendering - * 6. Remove `text-decoration` for anchors - */ -[class*='uk-icon-'] { - font-family: FontAwesome; - /* 1 */ - display: inline-block; - /* 2 */ - font-weight: normal; - font-style: normal; - /* 4 */ - line-height: 1; - /* 5 */ - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} -/* 6 */ -[class*='uk-icon-'], -[class*='uk-icon-']:hover, -[class*='uk-icon-']:focus { - text-decoration: none; -} -/* Size modifiers - ========================================================================== */ -.uk-icon-small { - font-size: 150%; - vertical-align: -10%; -} -.uk-icon-medium { - font-size: 200%; - vertical-align: -16%; -} -.uk-icon-large { - font-size: 250%; - vertical-align: -22%; -} -/* Modifier: `uk-icon-justify` - ========================================================================== */ -.uk-icon-justify { - width: 1em; - text-align: center; -} -/* Modifier: `uk-icon-spin` - ========================================================================== */ -.uk-icon-spin { - display: inline-block; - -webkit-animation: uk-rotate 2s infinite linear; - animation: uk-rotate 2s infinite linear; -} -/* Modifier: `uk-icon-hover` - ========================================================================== */ -.uk-icon-hover { - color: #999; -} -/* - * Hover - */ -.uk-icon-hover:hover { - color: #444; -} -/* Modifier: `uk-icon-button` - ========================================================================== */ -.uk-icon-button { - box-sizing: border-box; - display: inline-block; - width: 35px; - height: 35px; - border-radius: 100%; - background: #eee; - line-height: 35px; - color: #444; - font-size: 18px; - text-align: center; -} -/* - * Hover - * 1. Apply hover style also to focus state - * 2. Remove default focus style - */ -.uk-icon-button:hover, -.uk-icon-button:focus { - background-color: #f5f5f5; - color: #444; - /* 2 */ - outline: none; -} -/* Active */ -.uk-icon-button:active { - background-color: #ddd; - color: #444; -} -/* Icon mapping - ========================================================================== */ -.uk-icon-glass:before { - content: "\f000"; -} -.uk-icon-music:before { - content: "\f001"; -} -.uk-icon-search:before { - content: "\f002"; -} -.uk-icon-envelope-o:before { - content: "\f003"; -} -.uk-icon-heart:before { - content: "\f004"; -} -.uk-icon-star:before { - content: "\f005"; -} -.uk-icon-star-o:before { - content: "\f006"; -} -.uk-icon-user:before { - content: "\f007"; -} -.uk-icon-film:before { - content: "\f008"; -} -.uk-icon-th-large:before { - content: "\f009"; -} -.uk-icon-th:before { - content: "\f00a"; -} -.uk-icon-th-list:before { - content: "\f00b"; -} -.uk-icon-check:before { - content: "\f00c"; -} -.uk-icon-remove:before, -.uk-icon-close:before, -.uk-icon-times:before { - content: "\f00d"; -} -.uk-icon-search-plus:before { - content: "\f00e"; -} -.uk-icon-search-minus:before { - content: "\f010"; -} -.uk-icon-power-off:before { - content: "\f011"; -} -.uk-icon-signal:before { - content: "\f012"; -} -.uk-icon-gear:before, -.uk-icon-cog:before { - content: "\f013"; -} -.uk-icon-trash-o:before { - content: "\f014"; -} -.uk-icon-home:before { - content: "\f015"; -} -.uk-icon-file-o:before { - content: "\f016"; -} -.uk-icon-clock-o:before { - content: "\f017"; -} -.uk-icon-road:before { - content: "\f018"; -} -.uk-icon-download:before { - content: "\f019"; -} -.uk-icon-arrow-circle-o-down:before { - content: "\f01a"; -} -.uk-icon-arrow-circle-o-up:before { - content: "\f01b"; -} -.uk-icon-inbox:before { - content: "\f01c"; -} -.uk-icon-play-circle-o:before { - content: "\f01d"; -} -.uk-icon-rotate-right:before, -.uk-icon-repeat:before { - content: "\f01e"; -} -.uk-icon-refresh:before { - content: "\f021"; -} -.uk-icon-list-alt:before { - content: "\f022"; -} -.uk-icon-lock:before { - content: "\f023"; -} -.uk-icon-flag:before { - content: "\f024"; -} -.uk-icon-headphones:before { - content: "\f025"; -} -.uk-icon-volume-off:before { - content: "\f026"; -} -.uk-icon-volume-down:before { - content: "\f027"; -} -.uk-icon-volume-up:before { - content: "\f028"; -} -.uk-icon-qrcode:before { - content: "\f029"; -} -.uk-icon-barcode:before { - content: "\f02a"; -} -.uk-icon-tag:before { - content: "\f02b"; -} -.uk-icon-tags:before { - content: "\f02c"; -} -.uk-icon-book:before { - content: "\f02d"; -} -.uk-icon-bookmark:before { - content: "\f02e"; -} -.uk-icon-print:before { - content: "\f02f"; -} -.uk-icon-camera:before { - content: "\f030"; -} -.uk-icon-font:before { - content: "\f031"; -} -.uk-icon-bold:before { - content: "\f032"; -} -.uk-icon-italic:before { - content: "\f033"; -} -.uk-icon-text-height:before { - content: "\f034"; -} -.uk-icon-text-width:before { - content: "\f035"; -} -.uk-icon-align-left:before { - content: "\f036"; -} -.uk-icon-align-center:before { - content: "\f037"; -} -.uk-icon-align-right:before { - content: "\f038"; -} -.uk-icon-align-justify:before { - content: "\f039"; -} -.uk-icon-list:before { - content: "\f03a"; -} -.uk-icon-dedent:before, -.uk-icon-outdent:before { - content: "\f03b"; -} -.uk-icon-indent:before { - content: "\f03c"; -} -.uk-icon-video-camera:before { - content: "\f03d"; -} -.uk-icon-photo:before, -.uk-icon-image:before, -.uk-icon-picture-o:before { - content: "\f03e"; -} -.uk-icon-pencil:before { - content: "\f040"; -} -.uk-icon-map-marker:before { - content: "\f041"; -} -.uk-icon-adjust:before { - content: "\f042"; -} -.uk-icon-tint:before { - content: "\f043"; -} -.uk-icon-edit:before, -.uk-icon-pencil-square-o:before { - content: "\f044"; -} -.uk-icon-share-square-o:before { - content: "\f045"; -} -.uk-icon-check-square-o:before { - content: "\f046"; -} -.uk-icon-arrows:before { - content: "\f047"; -} -.uk-icon-step-backward:before { - content: "\f048"; -} -.uk-icon-fast-backward:before { - content: "\f049"; -} -.uk-icon-backward:before { - content: "\f04a"; -} -.uk-icon-play:before { - content: "\f04b"; -} -.uk-icon-pause:before { - content: "\f04c"; -} -.uk-icon-stop:before { - content: "\f04d"; -} -.uk-icon-forward:before { - content: "\f04e"; -} -.uk-icon-fast-forward:before { - content: "\f050"; -} -.uk-icon-step-forward:before { - content: "\f051"; -} -.uk-icon-eject:before { - content: "\f052"; -} -.uk-icon-chevron-left:before { - content: "\f053"; -} -.uk-icon-chevron-right:before { - content: "\f054"; -} -.uk-icon-plus-circle:before { - content: "\f055"; -} -.uk-icon-minus-circle:before { - content: "\f056"; -} -.uk-icon-times-circle:before { - content: "\f057"; -} -.uk-icon-check-circle:before { - content: "\f058"; -} -.uk-icon-question-circle:before { - content: "\f059"; -} -.uk-icon-info-circle:before { - content: "\f05a"; -} -.uk-icon-crosshairs:before { - content: "\f05b"; -} -.uk-icon-times-circle-o:before { - content: "\f05c"; -} -.uk-icon-check-circle-o:before { - content: "\f05d"; -} -.uk-icon-ban:before { - content: "\f05e"; -} -.uk-icon-arrow-left:before { - content: "\f060"; -} -.uk-icon-arrow-right:before { - content: "\f061"; -} -.uk-icon-arrow-up:before { - content: "\f062"; -} -.uk-icon-arrow-down:before { - content: "\f063"; -} -.uk-icon-mail-forward:before, -.uk-icon-share:before { - content: "\f064"; -} -.uk-icon-expand:before { - content: "\f065"; -} -.uk-icon-compress:before { - content: "\f066"; -} -.uk-icon-plus:before { - content: "\f067"; -} -.uk-icon-minus:before { - content: "\f068"; -} -.uk-icon-asterisk:before { - content: "\f069"; -} -.uk-icon-exclamation-circle:before { - content: "\f06a"; -} -.uk-icon-gift:before { - content: "\f06b"; -} -.uk-icon-leaf:before { - content: "\f06c"; -} -.uk-icon-fire:before { - content: "\f06d"; -} -.uk-icon-eye:before { - content: "\f06e"; -} -.uk-icon-eye-slash:before { - content: "\f070"; -} -.uk-icon-warning:before, -.uk-icon-exclamation-triangle:before { - content: "\f071"; -} -.uk-icon-plane:before { - content: "\f072"; -} -.uk-icon-calendar:before { - content: "\f073"; -} -.uk-icon-random:before { - content: "\f074"; -} -.uk-icon-comment:before { - content: "\f075"; -} -.uk-icon-magnet:before { - content: "\f076"; -} -.uk-icon-chevron-up:before { - content: "\f077"; -} -.uk-icon-chevron-down:before { - content: "\f078"; -} -.uk-icon-retweet:before { - content: "\f079"; -} -.uk-icon-shopping-cart:before { - content: "\f07a"; -} -.uk-icon-folder:before { - content: "\f07b"; -} -.uk-icon-folder-open:before { - content: "\f07c"; -} -.uk-icon-arrows-v:before { - content: "\f07d"; -} -.uk-icon-arrows-h:before { - content: "\f07e"; -} -.uk-icon-bar-chart-o:before, -.uk-icon-bar-chart:before { - content: "\f080"; -} -.uk-icon-twitter-square:before { - content: "\f081"; -} -.uk-icon-facebook-square:before { - content: "\f082"; -} -.uk-icon-camera-retro:before { - content: "\f083"; -} -.uk-icon-key:before { - content: "\f084"; -} -.uk-icon-gears:before, -.uk-icon-cogs:before { - content: "\f085"; -} -.uk-icon-comments:before { - content: "\f086"; -} -.uk-icon-thumbs-o-up:before { - content: "\f087"; -} -.uk-icon-thumbs-o-down:before { - content: "\f088"; -} -.uk-icon-star-half:before { - content: "\f089"; -} -.uk-icon-heart-o:before { - content: "\f08a"; -} -.uk-icon-sign-out:before { - content: "\f08b"; -} -.uk-icon-linkedin-square:before { - content: "\f08c"; -} -.uk-icon-thumb-tack:before { - content: "\f08d"; -} -.uk-icon-external-link:before { - content: "\f08e"; -} -.uk-icon-sign-in:before { - content: "\f090"; -} -.uk-icon-trophy:before { - content: "\f091"; -} -.uk-icon-github-square:before { - content: "\f092"; -} -.uk-icon-upload:before { - content: "\f093"; -} -.uk-icon-lemon-o:before { - content: "\f094"; -} -.uk-icon-phone:before { - content: "\f095"; -} -.uk-icon-square-o:before { - content: "\f096"; -} -.uk-icon-bookmark-o:before { - content: "\f097"; -} -.uk-icon-phone-square:before { - content: "\f098"; -} -.uk-icon-twitter:before { - content: "\f099"; -} -.uk-icon-facebook-f:before, -.uk-icon-facebook:before { - content: "\f09a"; -} -.uk-icon-github:before { - content: "\f09b"; -} -.uk-icon-unlock:before { - content: "\f09c"; -} -.uk-icon-credit-card:before { - content: "\f09d"; -} -.uk-icon-rss:before { - content: "\f09e"; -} -.uk-icon-hdd-o:before { - content: "\f0a0"; -} -.uk-icon-bullhorn:before { - content: "\f0a1"; -} -.uk-icon-bell:before { - content: "\f0f3"; -} -.uk-icon-certificate:before { - content: "\f0a3"; -} -.uk-icon-hand-o-right:before { - content: "\f0a4"; -} -.uk-icon-hand-o-left:before { - content: "\f0a5"; -} -.uk-icon-hand-o-up:before { - content: "\f0a6"; -} -.uk-icon-hand-o-down:before { - content: "\f0a7"; -} -.uk-icon-arrow-circle-left:before { - content: "\f0a8"; -} -.uk-icon-arrow-circle-right:before { - content: "\f0a9"; -} -.uk-icon-arrow-circle-up:before { - content: "\f0aa"; -} -.uk-icon-arrow-circle-down:before { - content: "\f0ab"; -} -.uk-icon-globe:before { - content: "\f0ac"; -} -.uk-icon-wrench:before { - content: "\f0ad"; -} -.uk-icon-tasks:before { - content: "\f0ae"; -} -.uk-icon-filter:before { - content: "\f0b0"; -} -.uk-icon-briefcase:before { - content: "\f0b1"; -} -.uk-icon-arrows-alt:before { - content: "\f0b2"; -} -.uk-icon-group:before, -.uk-icon-users:before { - content: "\f0c0"; -} -.uk-icon-chain:before, -.uk-icon-link:before { - content: "\f0c1"; -} -.uk-icon-cloud:before { - content: "\f0c2"; -} -.uk-icon-flask:before { - content: "\f0c3"; -} -.uk-icon-cut:before, -.uk-icon-scissors:before { - content: "\f0c4"; -} -.uk-icon-copy:before, -.uk-icon-files-o:before { - content: "\f0c5"; -} -.uk-icon-paperclip:before { - content: "\f0c6"; -} -.uk-icon-save:before, -.uk-icon-floppy-o:before { - content: "\f0c7"; -} -.uk-icon-square:before { - content: "\f0c8"; -} -.uk-icon-navicon:before, -.uk-icon-reorder:before, -.uk-icon-bars:before { - content: "\f0c9"; -} -.uk-icon-list-ul:before { - content: "\f0ca"; -} -.uk-icon-list-ol:before { - content: "\f0cb"; -} -.uk-icon-strikethrough:before { - content: "\f0cc"; -} -.uk-icon-underline:before { - content: "\f0cd"; -} -.uk-icon-table:before { - content: "\f0ce"; -} -.uk-icon-magic:before { - content: "\f0d0"; -} -.uk-icon-truck:before { - content: "\f0d1"; -} -.uk-icon-pinterest:before { - content: "\f0d2"; -} -.uk-icon-pinterest-square:before { - content: "\f0d3"; -} -.uk-icon-google-plus-square:before { - content: "\f0d4"; -} -.uk-icon-google-plus:before { - content: "\f0d5"; -} -.uk-icon-money:before { - content: "\f0d6"; -} -.uk-icon-caret-down:before { - content: "\f0d7"; -} -.uk-icon-caret-up:before { - content: "\f0d8"; -} -.uk-icon-caret-left:before { - content: "\f0d9"; -} -.uk-icon-caret-right:before { - content: "\f0da"; -} -.uk-icon-columns:before { - content: "\f0db"; -} -.uk-icon-unsorted:before, -.uk-icon-sort:before { - content: "\f0dc"; -} -.uk-icon-sort-down:before, -.uk-icon-sort-desc:before { - content: "\f0dd"; -} -.uk-icon-sort-up:before, -.uk-icon-sort-asc:before { - content: "\f0de"; -} -.uk-icon-envelope:before { - content: "\f0e0"; -} -.uk-icon-linkedin:before { - content: "\f0e1"; -} -.uk-icon-rotate-left:before, -.uk-icon-undo:before { - content: "\f0e2"; -} -.uk-icon-legal:before, -.uk-icon-gavel:before { - content: "\f0e3"; -} -.uk-icon-dashboard:before, -.uk-icon-tachometer:before { - content: "\f0e4"; -} -.uk-icon-comment-o:before { - content: "\f0e5"; -} -.uk-icon-comments-o:before { - content: "\f0e6"; -} -.uk-icon-flash:before, -.uk-icon-bolt:before { - content: "\f0e7"; -} -.uk-icon-sitemap:before { - content: "\f0e8"; -} -.uk-icon-umbrella:before { - content: "\f0e9"; -} -.uk-icon-paste:before, -.uk-icon-clipboard:before { - content: "\f0ea"; -} -.uk-icon-lightbulb-o:before { - content: "\f0eb"; -} -.uk-icon-exchange:before { - content: "\f0ec"; -} -.uk-icon-cloud-download:before { - content: "\f0ed"; -} -.uk-icon-cloud-upload:before { - content: "\f0ee"; -} -.uk-icon-user-md:before { - content: "\f0f0"; -} -.uk-icon-stethoscope:before { - content: "\f0f1"; -} -.uk-icon-suitcase:before { - content: "\f0f2"; -} -.uk-icon-bell-o:before { - content: "\f0a2"; -} -.uk-icon-coffee:before { - content: "\f0f4"; -} -.uk-icon-cutlery:before { - content: "\f0f5"; -} -.uk-icon-file-text-o:before { - content: "\f0f6"; -} -.uk-icon-building-o:before { - content: "\f0f7"; -} -.uk-icon-hospital-o:before { - content: "\f0f8"; -} -.uk-icon-ambulance:before { - content: "\f0f9"; -} -.uk-icon-medkit:before { - content: "\f0fa"; -} -.uk-icon-fighter-jet:before { - content: "\f0fb"; -} -.uk-icon-beer:before { - content: "\f0fc"; -} -.uk-icon-h-square:before { - content: "\f0fd"; -} -.uk-icon-plus-square:before { - content: "\f0fe"; -} -.uk-icon-angle-double-left:before { - content: "\f100"; -} -.uk-icon-angle-double-right:before { - content: "\f101"; -} -.uk-icon-angle-double-up:before { - content: "\f102"; -} -.uk-icon-angle-double-down:before { - content: "\f103"; -} -.uk-icon-angle-left:before { - content: "\f104"; -} -.uk-icon-angle-right:before { - content: "\f105"; -} -.uk-icon-angle-up:before { - content: "\f106"; -} -.uk-icon-angle-down:before { - content: "\f107"; -} -.uk-icon-desktop:before { - content: "\f108"; -} -.uk-icon-laptop:before { - content: "\f109"; -} -.uk-icon-tablet:before { - content: "\f10a"; -} -.uk-icon-mobile-phone:before, -.uk-icon-mobile:before { - content: "\f10b"; -} -.uk-icon-circle-o:before { - content: "\f10c"; -} -.uk-icon-quote-left:before { - content: "\f10d"; -} -.uk-icon-quote-right:before { - content: "\f10e"; -} -.uk-icon-spinner:before { - content: "\f110"; -} -.uk-icon-circle:before { - content: "\f111"; -} -.uk-icon-mail-reply:before, -.uk-icon-reply:before { - content: "\f112"; -} -.uk-icon-github-alt:before { - content: "\f113"; -} -.uk-icon-folder-o:before { - content: "\f114"; -} -.uk-icon-folder-open-o:before { - content: "\f115"; -} -.uk-icon-smile-o:before { - content: "\f118"; -} -.uk-icon-frown-o:before { - content: "\f119"; -} -.uk-icon-meh-o:before { - content: "\f11a"; -} -.uk-icon-gamepad:before { - content: "\f11b"; -} -.uk-icon-keyboard-o:before { - content: "\f11c"; -} -.uk-icon-flag-o:before { - content: "\f11d"; -} -.uk-icon-flag-checkered:before { - content: "\f11e"; -} -.uk-icon-terminal:before { - content: "\f120"; -} -.uk-icon-code:before { - content: "\f121"; -} -.uk-icon-mail-reply-all:before, -.uk-icon-reply-all:before { - content: "\f122"; -} -.uk-icon-star-half-empty:before, -.uk-icon-star-half-full:before, -.uk-icon-star-half-o:before { - content: "\f123"; -} -.uk-icon-location-arrow:before { - content: "\f124"; -} -.uk-icon-crop:before { - content: "\f125"; -} -.uk-icon-code-fork:before { - content: "\f126"; -} -.uk-icon-unlink:before, -.uk-icon-chain-broken:before { - content: "\f127"; -} -.uk-icon-question:before { - content: "\f128"; -} -.uk-icon-info:before { - content: "\f129"; -} -.uk-icon-exclamation:before { - content: "\f12a"; -} -.uk-icon-superscript:before { - content: "\f12b"; -} -.uk-icon-subscript:before { - content: "\f12c"; -} -.uk-icon-eraser:before { - content: "\f12d"; -} -.uk-icon-puzzle-piece:before { - content: "\f12e"; -} -.uk-icon-microphone:before { - content: "\f130"; -} -.uk-icon-microphone-slash:before { - content: "\f131"; -} -.uk-icon-shield:before { - content: "\f132"; -} -.uk-icon-calendar-o:before { - content: "\f133"; -} -.uk-icon-fire-extinguisher:before { - content: "\f134"; -} -.uk-icon-rocket:before { - content: "\f135"; -} -.uk-icon-maxcdn:before { - content: "\f136"; -} -.uk-icon-chevron-circle-left:before { - content: "\f137"; -} -.uk-icon-chevron-circle-right:before { - content: "\f138"; -} -.uk-icon-chevron-circle-up:before { - content: "\f139"; -} -.uk-icon-chevron-circle-down:before { - content: "\f13a"; -} -.uk-icon-html5:before { - content: "\f13b"; -} -.uk-icon-css3:before { - content: "\f13c"; -} -.uk-icon-anchor:before { - content: "\f13d"; -} -.uk-icon-unlock-alt:before { - content: "\f13e"; -} -.uk-icon-bullseye:before { - content: "\f140"; -} -.uk-icon-ellipsis-h:before { - content: "\f141"; -} -.uk-icon-ellipsis-v:before { - content: "\f142"; -} -.uk-icon-rss-square:before { - content: "\f143"; -} -.uk-icon-play-circle:before { - content: "\f144"; -} -.uk-icon-ticket:before { - content: "\f145"; -} -.uk-icon-minus-square:before { - content: "\f146"; -} -.uk-icon-minus-square-o:before { - content: "\f147"; -} -.uk-icon-level-up:before { - content: "\f148"; -} -.uk-icon-level-down:before { - content: "\f149"; -} -.uk-icon-check-square:before { - content: "\f14a"; -} -.uk-icon-pencil-square:before { - content: "\f14b"; -} -.uk-icon-external-link-square:before { - content: "\f14c"; -} -.uk-icon-share-square:before { - content: "\f14d"; -} -.uk-icon-compass:before { - content: "\f14e"; -} -.uk-icon-toggle-down:before, -.uk-icon-caret-square-o-down:before { - content: "\f150"; -} -.uk-icon-toggle-up:before, -.uk-icon-caret-square-o-up:before { - content: "\f151"; -} -.uk-icon-toggle-right:before, -.uk-icon-caret-square-o-right:before { - content: "\f152"; -} -.uk-icon-euro:before, -.uk-icon-eur:before { - content: "\f153"; -} -.uk-icon-gbp:before { - content: "\f154"; -} -.uk-icon-dollar:before, -.uk-icon-usd:before { - content: "\f155"; -} -.uk-icon-rupee:before, -.uk-icon-inr:before { - content: "\f156"; -} -.uk-icon-cny:before, -.uk-icon-rmb:before, -.uk-icon-yen:before, -.uk-icon-jpy:before { - content: "\f157"; -} -.uk-icon-ruble:before, -.uk-icon-rouble:before, -.uk-icon-rub:before { - content: "\f158"; -} -.uk-icon-won:before, -.uk-icon-krw:before { - content: "\f159"; -} -.uk-icon-bitcoin:before, -.uk-icon-btc:before { - content: "\f15a"; -} -.uk-icon-file:before { - content: "\f15b"; -} -.uk-icon-file-text:before { - content: "\f15c"; -} -.uk-icon-sort-alpha-asc:before { - content: "\f15d"; -} -.uk-icon-sort-alpha-desc:before { - content: "\f15e"; -} -.uk-icon-sort-amount-asc:before { - content: "\f160"; -} -.uk-icon-sort-amount-desc:before { - content: "\f161"; -} -.uk-icon-sort-numeric-asc:before { - content: "\f162"; -} -.uk-icon-sort-numeric-desc:before { - content: "\f163"; -} -.uk-icon-thumbs-up:before { - content: "\f164"; -} -.uk-icon-thumbs-down:before { - content: "\f165"; -} -.uk-icon-youtube-square:before { - content: "\f166"; -} -.uk-icon-youtube:before { - content: "\f167"; -} -.uk-icon-xing:before { - content: "\f168"; -} -.uk-icon-xing-square:before { - content: "\f169"; -} -.uk-icon-youtube-play:before { - content: "\f16a"; -} -.uk-icon-dropbox:before { - content: "\f16b"; -} -.uk-icon-stack-overflow:before { - content: "\f16c"; -} -.uk-icon-instagram:before { - content: "\f16d"; -} -.uk-icon-flickr:before { - content: "\f16e"; -} -.uk-icon-adn:before { - content: "\f170"; -} -.uk-icon-bitbucket:before { - content: "\f171"; -} -.uk-icon-bitbucket-square:before { - content: "\f172"; -} -.uk-icon-tumblr:before { - content: "\f173"; -} -.uk-icon-tumblr-square:before { - content: "\f174"; -} -.uk-icon-long-arrow-down:before { - content: "\f175"; -} -.uk-icon-long-arrow-up:before { - content: "\f176"; -} -.uk-icon-long-arrow-left:before { - content: "\f177"; -} -.uk-icon-long-arrow-right:before { - content: "\f178"; -} -.uk-icon-apple:before { - content: "\f179"; -} -.uk-icon-windows:before { - content: "\f17a"; -} -.uk-icon-android:before { - content: "\f17b"; -} -.uk-icon-linux:before { - content: "\f17c"; -} -.uk-icon-dribbble:before { - content: "\f17d"; -} -.uk-icon-skype:before { - content: "\f17e"; -} -.uk-icon-foursquare:before { - content: "\f180"; -} -.uk-icon-trello:before { - content: "\f181"; -} -.uk-icon-female:before { - content: "\f182"; -} -.uk-icon-male:before { - content: "\f183"; -} -.uk-icon-gittip:before, -.uk-icon-gratipay:before { - content: "\f184"; -} -.uk-icon-sun-o:before { - content: "\f185"; -} -.uk-icon-moon-o:before { - content: "\f186"; -} -.uk-icon-archive:before { - content: "\f187"; -} -.uk-icon-bug:before { - content: "\f188"; -} -.uk-icon-vk:before { - content: "\f189"; -} -.uk-icon-weibo:before { - content: "\f18a"; -} -.uk-icon-renren:before { - content: "\f18b"; -} -.uk-icon-pagelines:before { - content: "\f18c"; -} -.uk-icon-stack-exchange:before { - content: "\f18d"; -} -.uk-icon-arrow-circle-o-right:before { - content: "\f18e"; -} -.uk-icon-arrow-circle-o-left:before { - content: "\f190"; -} -.uk-icon-toggle-left:before, -.uk-icon-caret-square-o-left:before { - content: "\f191"; -} -.uk-icon-dot-circle-o:before { - content: "\f192"; -} -.uk-icon-wheelchair:before { - content: "\f193"; -} -.uk-icon-vimeo-square:before { - content: "\f194"; -} -.uk-icon-turkish-lira:before, -.uk-icon-try:before { - content: "\f195"; -} -.uk-icon-plus-square-o:before { - content: "\f196"; -} -.uk-icon-space-shuttle:before { - content: "\f197"; -} -.uk-icon-slack:before { - content: "\f198"; -} -.uk-icon-envelope-square:before { - content: "\f199"; -} -.uk-icon-wordpress:before { - content: "\f19a"; -} -.uk-icon-openid:before { - content: "\f19b"; -} -.uk-icon-institution:before, -.uk-icon-bank:before, -.uk-icon-university:before { - content: "\f19c"; -} -.uk-icon-mortar-board:before, -.uk-icon-graduation-cap:before { - content: "\f19d"; -} -.uk-icon-yahoo:before { - content: "\f19e"; -} -.uk-icon-google:before { - content: "\f1a0"; -} -.uk-icon-reddit:before { - content: "\f1a1"; -} -.uk-icon-reddit-square:before { - content: "\f1a2"; -} -.uk-icon-stumbleupon-circle:before { - content: "\f1a3"; -} -.uk-icon-stumbleupon:before { - content: "\f1a4"; -} -.uk-icon-delicious:before { - content: "\f1a5"; -} -.uk-icon-digg:before { - content: "\f1a6"; -} -.uk-icon-pied-piper:before { - content: "\f1a7"; -} -.uk-icon-pied-piper-alt:before { - content: "\f1a8"; -} -.uk-icon-drupal:before { - content: "\f1a9"; -} -.uk-icon-joomla:before { - content: "\f1aa"; -} -.uk-icon-language:before { - content: "\f1ab"; -} -.uk-icon-fax:before { - content: "\f1ac"; -} -.uk-icon-building:before { - content: "\f1ad"; -} -.uk-icon-child:before { - content: "\f1ae"; -} -.uk-icon-paw:before { - content: "\f1b0"; -} -.uk-icon-spoon:before { - content: "\f1b1"; -} -.uk-icon-cube:before { - content: "\f1b2"; -} -.uk-icon-cubes:before { - content: "\f1b3"; -} -.uk-icon-behance:before { - content: "\f1b4"; -} -.uk-icon-behance-square:before { - content: "\f1b5"; -} -.uk-icon-steam:before { - content: "\f1b6"; -} -.uk-icon-steam-square:before { - content: "\f1b7"; -} -.uk-icon-recycle:before { - content: "\f1b8"; -} -.uk-icon-automobile:before, -.uk-icon-car:before { - content: "\f1b9"; -} -.uk-icon-cab:before, -.uk-icon-taxi:before { - content: "\f1ba"; -} -.uk-icon-tree:before { - content: "\f1bb"; -} -.uk-icon-spotify:before { - content: "\f1bc"; -} -.uk-icon-deviantart:before { - content: "\f1bd"; -} -.uk-icon-soundcloud:before { - content: "\f1be"; -} -.uk-icon-database:before { - content: "\f1c0"; -} -.uk-icon-file-pdf-o:before { - content: "\f1c1"; -} -.uk-icon-file-word-o:before { - content: "\f1c2"; -} -.uk-icon-file-excel-o:before { - content: "\f1c3"; -} -.uk-icon-file-powerpoint-o:before { - content: "\f1c4"; -} -.uk-icon-file-photo-o:before, -.uk-icon-file-picture-o:before, -.uk-icon-file-image-o:before { - content: "\f1c5"; -} -.uk-icon-file-zip-o:before, -.uk-icon-file-archive-o:before { - content: "\f1c6"; -} -.uk-icon-file-sound-o:before, -.uk-icon-file-audio-o:before { - content: "\f1c7"; -} -.uk-icon-file-movie-o:before, -.uk-icon-file-video-o:before { - content: "\f1c8"; -} -.uk-icon-file-code-o:before { - content: "\f1c9"; -} -.uk-icon-vine:before { - content: "\f1ca"; -} -.uk-icon-codepen:before { - content: "\f1cb"; -} -.uk-icon-jsfiddle:before { - content: "\f1cc"; -} -.uk-icon-life-bouy:before, -.uk-icon-life-buoy:before, -.uk-icon-life-saver:before, -.uk-icon-support:before, -.uk-icon-life-ring:before { - content: "\f1cd"; -} -.uk-icon-circle-o-notch:before { - content: "\f1ce"; -} -.uk-icon-ra:before, -.uk-icon-rebel:before { - content: "\f1d0"; -} -.uk-icon-ge:before, -.uk-icon-empire:before { - content: "\f1d1"; -} -.uk-icon-git-square:before { - content: "\f1d2"; -} -.uk-icon-git:before { - content: "\f1d3"; -} -.uk-icon-hacker-news:before { - content: "\f1d4"; -} -.uk-icon-tencent-weibo:before { - content: "\f1d5"; -} -.uk-icon-qq:before { - content: "\f1d6"; -} -.uk-icon-wechat:before, -.uk-icon-weixin:before { - content: "\f1d7"; -} -.uk-icon-send:before, -.uk-icon-paper-plane:before { - content: "\f1d8"; -} -.uk-icon-send-o:before, -.uk-icon-paper-plane-o:before { - content: "\f1d9"; -} -.uk-icon-history:before { - content: "\f1da"; -} -.uk-icon-genderless:before, -.uk-icon-circle-thin:before { - content: "\f1db"; -} -.uk-icon-header:before { - content: "\f1dc"; -} -.uk-icon-paragraph:before { - content: "\f1dd"; -} -.uk-icon-sliders:before { - content: "\f1de"; -} -.uk-icon-share-alt:before { - content: "\f1e0"; -} -.uk-icon-share-alt-square:before { - content: "\f1e1"; -} -.uk-icon-bomb:before { - content: "\f1e2"; -} -.uk-icon-soccer-ball-o:before, -.uk-icon-futbol-o:before { - content: "\f1e3"; -} -.uk-icon-tty:before { - content: "\f1e4"; -} -.uk-icon-binoculars:before { - content: "\f1e5"; -} -.uk-icon-plug:before { - content: "\f1e6"; -} -.uk-icon-slideshare:before { - content: "\f1e7"; -} -.uk-icon-twitch:before { - content: "\f1e8"; -} -.uk-icon-yelp:before { - content: "\f1e9"; -} -.uk-icon-newspaper-o:before { - content: "\f1ea"; -} -.uk-icon-wifi:before { - content: "\f1eb"; -} -.uk-icon-calculator:before { - content: "\f1ec"; -} -.uk-icon-paypal:before { - content: "\f1ed"; -} -.uk-icon-google-wallet:before { - content: "\f1ee"; -} -.uk-icon-cc-visa:before { - content: "\f1f0"; -} -.uk-icon-cc-mastercard:before { - content: "\f1f1"; -} -.uk-icon-cc-discover:before { - content: "\f1f2"; -} -.uk-icon-cc-amex:before { - content: "\f1f3"; -} -.uk-icon-cc-paypal:before { - content: "\f1f4"; -} -.uk-icon-cc-stripe:before { - content: "\f1f5"; -} -.uk-icon-bell-slash:before { - content: "\f1f6"; -} -.uk-icon-bell-slash-o:before { - content: "\f1f7"; -} -.uk-icon-trash:before { - content: "\f1f8"; -} -.uk-icon-copyright:before { - content: "\f1f9"; -} -.uk-icon-at:before { - content: "\f1fa"; -} -.uk-icon-eyedropper:before { - content: "\f1fb"; -} -.uk-icon-paint-brush:before { - content: "\f1fc"; -} -.uk-icon-birthday-cake:before { - content: "\f1fd"; -} -.uk-icon-area-chart:before { - content: "\f1fe"; -} -.uk-icon-pie-chart:before { - content: "\f200"; -} -.uk-icon-line-chart:before { - content: "\f201"; -} -.uk-icon-lastfm:before { - content: "\f202"; -} -.uk-icon-lastfm-square:before { - content: "\f203"; -} -.uk-icon-toggle-off:before { - content: "\f204"; -} -.uk-icon-toggle-on:before { - content: "\f205"; -} -.uk-icon-bicycle:before { - content: "\f206"; -} -.uk-icon-bus:before { - content: "\f207"; -} -.uk-icon-ioxhost:before { - content: "\f208"; -} -.uk-icon-angellist:before { - content: "\f209"; -} -.uk-icon-cc:before { - content: "\f20a"; -} -.uk-icon-shekel:before, -.uk-icon-sheqel:before, -.uk-icon-ils:before { - content: "\f20b"; -} -.uk-icon-meanpath:before { - content: "\f20c"; -} -.uk-icon-buysellads:before { - content: "\f20d"; -} -.uk-icon-connectdevelop:before { - content: "\f20e"; -} -.uk-icon-dashcube:before { - content: "\f210"; -} -.uk-icon-forumbee:before { - content: "\f211"; -} -.uk-icon-leanpub:before { - content: "\f212"; -} -.uk-icon-sellsy:before { - content: "\f213"; -} -.uk-icon-shirtsinbulk:before { - content: "\f214"; -} -.uk-icon-simplybuilt:before { - content: "\f215"; -} -.uk-icon-skyatlas:before { - content: "\f216"; -} -.uk-icon-cart-plus:before { - content: "\f217"; -} -.uk-icon-cart-arrow-down:before { - content: "\f218"; -} -.uk-icon-diamond:before { - content: "\f219"; -} -.uk-icon-ship:before { - content: "\f21a"; -} -.uk-icon-user-secret:before { - content: "\f21b"; -} -.uk-icon-motorcycle:before { - content: "\f21c"; -} -.uk-icon-street-view:before { - content: "\f21d"; -} -.uk-icon-heartbeat:before { - content: "\f21e"; -} -.uk-icon-venus:before { - content: "\f221"; -} -.uk-icon-mars:before { - content: "\f222"; -} -.uk-icon-mercury:before { - content: "\f223"; -} -.uk-icon-transgender:before { - content: "\f224"; -} -.uk-icon-transgender-alt:before { - content: "\f225"; -} -.uk-icon-venus-double:before { - content: "\f226"; -} -.uk-icon-mars-double:before { - content: "\f227"; -} -.uk-icon-venus-mars:before { - content: "\f228"; -} -.uk-icon-mars-stroke:before { - content: "\f229"; -} -.uk-icon-mars-stroke-v:before { - content: "\f22a"; -} -.uk-icon-mars-stroke-h:before { - content: "\f22b"; -} -.uk-icon-neuter:before { - content: "\f22c"; -} -.uk-icon-facebook-official:before { - content: "\f230"; -} -.uk-icon-pinterest-p:before { - content: "\f231"; -} -.uk-icon-whatsapp:before { - content: "\f232"; -} -.uk-icon-server:before { - content: "\f233"; -} -.uk-icon-user-plus:before { - content: "\f234"; -} -.uk-icon-user-times:before { - content: "\f235"; -} -.uk-icon-hotel:before, -.uk-icon-bed:before { - content: "\f236"; -} -.uk-icon-viacoin:before { - content: "\f237"; -} -.uk-icon-train:before { - content: "\f238"; -} -.uk-icon-subway:before { - content: "\f239"; -} -.uk-icon-medium-logo:before { - content: "\f23a"; -} -.uk-icon-500px:before { - content: "\f26e"; -} -.uk-icon-amazon:before { - content: "\f270"; -} -.uk-icon-balance-scale:before { - content: "\f24e"; -} -.uk-icon-battery-empty:before, -.uk-icon-battery-0:before { - content: "\f244"; -} -.uk-icon-battery-quarter:before, -.uk-icon-battery-1:before { - content: "\f243"; -} -.uk-icon-battery-half:before, -.uk-icon-battery-2:before { - content: "\f242"; -} -.uk-icon-battery-three-quarters:before, -.uk-icon-battery-3:before { - content: "\f241"; -} -.uk-icon-battery-full:before, -.uk-icon-battery-4:before { - content: "\f240"; -} -.uk-icon-black-tie:before { - content: "\f27e"; -} -.uk-icon-calendar-check-o:before { - content: "\f274"; -} -.uk-icon-calendar-minus-o:before { - content: "\f272"; -} -.uk-icon-calendar-plus-o:before { - content: "\f271"; -} -.uk-icon-calendar-times-o:before { - content: "\f273"; -} -.uk-icon-cc-diners-club:before { - content: "\f24c"; -} -.uk-icon-cc-jcb:before { - content: "\f24b"; -} -.uk-icon-chrome:before { - content: "\f268"; -} -.uk-icon-clone:before { - content: "\f24d"; -} -.uk-icon-commenting:before { - content: "\f27a"; -} -.uk-icon-commenting-o:before { - content: "\f27b"; -} -.uk-icon-contao:before { - content: "\f26d"; -} -.uk-icon-creative-commons:before { - content: "\f25e"; -} -.uk-icon-expeditedssl:before { - content: "\f23e"; -} -.uk-icon-firefox:before { - content: "\f269"; -} -.uk-icon-fonticons:before { - content: "\f280"; -} -.uk-icon-get-pocket:before { - content: "\f265"; -} -.uk-icon-gg:before { - content: "\f260"; -} -.uk-icon-gg-circle:before { - content: "\f261"; -} -.uk-icon-hand-lizard-o:before { - content: "\f258"; -} -.uk-icon-hand-stop-o:before, -.uk-icon-hand-paper-o:before { - content: "\f256"; -} -.uk-icon-hand-peace-o:before { - content: "\f25b"; -} -.uk-icon-hand-pointer-o:before { - content: "\f25a"; -} -.uk-icon-hand-grab-o:before, -.uk-icon-hand-rock-o:before { - content: "\f255"; -} -.uk-icon-hand-scissors-o:before { - content: "\f257"; -} -.uk-icon-hand-spock-o:before { - content: "\f259"; -} -.uk-icon-hourglass:before { - content: "\f254"; -} -.uk-icon-hourglass-o:before { - content: "\f250"; -} -.uk-icon-hourglass-1:before, -.uk-icon-hourglass-start:before { - content: "\f251"; -} -.uk-icon-hourglass-2:before, -.uk-icon-hourglass-half:before { - content: "\f252"; -} -.uk-icon-hourglass-3:before, -.uk-icon-hourglass-end:before { - content: "\f253"; -} -.uk-icon-houzz:before { - content: "\f27c"; -} -.uk-icon-i-cursor:before { - content: "\f246"; -} -.uk-icon-industry:before { - content: "\f275"; -} -.uk-icon-internet-explorer:before { - content: "\f26b"; -} -.uk-icon-map:before { - content: "\f279"; -} -.uk-icon-map-o:before { - content: "\f278"; -} -.uk-icon-map-pin:before { - content: "\f276"; -} -.uk-icon-map-signs:before { - content: "\f277"; -} -.uk-icon-mouse-pointer:before { - content: "\f245"; -} -.uk-icon-object-group:before { - content: "\f247"; -} -.uk-icon-object-ungroup:before { - content: "\f248"; -} -.uk-icon-odnoklassniki:before { - content: "\f263"; -} -.uk-icon-odnoklassniki-square:before { - content: "\f264"; -} -.uk-icon-opencart:before { - content: "\f23d"; -} -.uk-icon-opera:before { - content: "\f26a"; -} -.uk-icon-optin-monster:before { - content: "\f23c"; -} -.uk-icon-registered:before { - content: "\f25d"; -} -.uk-icon-safari:before { - content: "\f267"; -} -.uk-icon-sticky-note:before { - content: "\f249"; -} -.uk-icon-sticky-note-o:before { - content: "\f24a"; -} -.uk-icon-tv:before, -.uk-icon-television:before { - content: "\f26c"; -} -.uk-icon-trademark:before { - content: "\f25c"; -} -.uk-icon-tripadvisor:before { - content: "\f262"; -} -.uk-icon-vimeo:before { - content: "\f27d"; -} -.uk-icon-wikipedia-w:before { - content: "\f266"; -} -.uk-icon-yc:before, -.uk-icon-y-combinator:before { - content: "\f23b"; -} -.uk-icon-yc-square:before, -.uk-icon-y-combinator-square:before { - content: "\f1d4"; -} -.uk-icon-bluetooth:before { - content: "\f293"; -} -.uk-icon-bluetooth-b:before { - content: "\f294"; -} -.uk-icon-codiepie:before { - content: "\f284"; -} -.uk-icon-credit-card-alt:before { - content: "\f283"; -} -.uk-icon-edge:before { - content: "\f282"; -} -.uk-icon-fort-awesome:before { - content: "\f286"; -} -.uk-icon-hashtag:before { - content: "\f292"; -} -.uk-icon-mixcloud:before { - content: "\f289"; -} -.uk-icon-modx:before { - content: "\f285"; -} -.uk-icon-pause-circle:before { - content: "\f28b"; -} -.uk-icon-pause-circle-o:before { - content: "\f28c"; -} -.uk-icon-percent:before { - content: "\f295"; -} -.uk-icon-product-hunt:before { - content: "\f288"; -} -.uk-icon-reddit-alien:before { - content: "\f281"; -} -.uk-icon-scribd:before { - content: "\f28a"; -} -.uk-icon-shopping-bag:before { - content: "\f290"; -} -.uk-icon-shopping-basket:before { - content: "\f291"; -} -.uk-icon-stop-circle:before { - content: "\f28d"; -} -.uk-icon-stop-circle-o:before { - content: "\f28e"; -} -.uk-icon-usb:before { - content: "\f287"; -} -.uk-icon-american-sign-language-interpreting:before, -.uk-icon-asl-interpreting:before { - content: "\f2a3"; -} -.uk-icon-assistive-listening-systems:before { - content: "\f2a2"; -} -.uk-icon-audio-description:before { - content: "\f29e"; -} -.uk-icon-blind:before { - content: "\f29d"; -} -.uk-icon-braille:before { - content: "\f2a1"; -} -.uk-icon-deaf:before, -.uk-icon-deafness:before { - content: "\f2a4"; -} -.uk-icon-envira:before { - content: "\f299"; -} -.uk-icon-font-awesome:before, -.uk-icon-fa:before { - content: "\f2b4"; -} -.uk-icon-first-order:before { - content: "\f2b0"; -} -.uk-icon-gitlab:before { - content: "\f296"; -} -.uk-icon-glide:before { - content: "\f2a5"; -} -.uk-icon-glide-g:before { - content: "\f2a6"; -} -.uk-icon-hard-of-hearing:before { - content: "\f2a4"; -} -.uk-icon-low-vision:before { - content: "\f2a8"; -} -.uk-icon-question-circle-o:before { - content: "\f29c"; -} -.uk-icon-sign-language:before, -.uk-icon-signing:before { - content: "\f2a7"; -} -.uk-icon-snapchat:before { - content: "\f2ab"; -} -.uk-icon-snapchat-ghost:before { - content: "\f2ac"; -} -.uk-icon-snapchat-square:before { - content: "\f2ad"; -} -.uk-icon-themeisle:before { - content: "\f2b2"; -} -.uk-icon-universal-access:before { - content: "\f29a"; -} -.uk-icon-viadeo:before { - content: "\f2a9"; -} -.uk-icon-viadeo-square:before { - content: "\f2aa"; -} -.uk-icon-volume-control-phone:before { - content: "\f2a0"; -} -.uk-icon-wheelchair-alt:before { - content: "\f29b"; -} -.uk-icon-wpbeginner:before { - content: "\f297"; -} -.uk-icon-wpforms:before { - content: "\f298"; -} -.uk-icon-yoast:before { - content: "\f2b1"; -} -.uk-icon-adress-book:before { - content: "\f2b9"; -} -.uk-icon-adress-book-o:before { - content: "\f2ba"; -} -.uk-icon-adress-card:before { - content: "\f2bb"; -} -.uk-icon-adress-card-o:before { - content: "\f2bc"; -} -.uk-icon-bandcamp:before { - content: "\f2d5"; -} -.uk-icon-bath:before { - content: "\f2cd"; -} -.uk-icon-bathub:before { - content: "\f2cd"; -} -.uk-icon-drivers-license:before { - content: "\f2c2"; -} -.uk-icon-drivers-license-o:before { - content: "\f2c3"; -} -.uk-icon-eercast:before { - content: "\f2da"; -} -.uk-icon-envelope-open:before { - content: "\f2b6"; -} -.uk-icon-envelope-open-o:before { - content: "\f2b7"; -} -.uk-icon-etsy:before { - content: "\f2d7"; -} -.uk-icon-free-code-camp:before { - content: "\f2c5"; -} -.uk-icon-grav:before { - content: "\f2d6"; -} -.uk-icon-handshake-o:before { - content: "\f2b5"; -} -.uk-icon-id-badge:before { - content: "\f2c1"; -} -.uk-icon-id-card:before { - content: "\f2c2"; -} -.uk-icon-id-card-o:before { - content: "\f2c3"; -} -.uk-icon-imdb:before { - content: "\f2d8"; -} -.uk-icon-linode:before { - content: "\f2b8"; -} -.uk-icon-meetup:before { - content: "\f2e0"; -} -.uk-icon-microchip:before { - content: "\f2db"; -} -.uk-icon-podcast:before { - content: "\f2ce"; -} -.uk-icon-quora:before { - content: "\f2c4"; -} -.uk-icon-ravelry:before { - content: "\f2d9"; -} -.uk-icon-s15:before { - content: "\f2cd"; -} -.uk-icon-shower:before { - content: "\f2cc"; -} -.uk-icon-snowflake-o:before { - content: "\f2dc"; -} -.uk-icon-superpowers:before { - content: "\f2dd"; -} -.uk-icon-telegram:before { - content: "\f2c6"; -} -.uk-icon-thermometer:before { - content: "\f2c7"; -} -.uk-icon-thermometer-0:before { - content: "\f2cb"; -} -.uk-icon-thermometer-1:before { - content: "\f2ca"; -} -.uk-icon-thermometer-2:before { - content: "\f2c9"; -} -.uk-icon-thermometer-3:before { - content: "\f2c8"; -} -.uk-icon-thermometer-4:before { - content: "\f2c7"; -} -.uk-icon-thermometer-empty:before { - content: "\f2cb"; -} -.uk-icon-thermometer-full:before { - content: "\f2c7"; -} -.uk-icon-thermometer-half:before { - content: "\f2c9"; -} -.uk-icon-thermometer-quarter:before { - content: "\f2ca"; -} -.uk-icon-thermometer-three-quarters:before { - content: "\f2c8"; -} -.uk-icon-times-rectangle:before { - content: "\f2d3"; -} -.uk-icon-times-rectangle-o:before { - content: "\f2d4"; -} -.uk-icon-user-circle:before { - content: "\f2bd"; -} -.uk-icon-user-circle-o:before { - content: "\f2be"; -} -.uk-icon-user-o:before { - content: "\f2c0"; -} -.uk-icon-vcard:before { - content: "\f2bb"; -} -.uk-icon-vcard-o:before { - content: "\f2bc"; -} -.uk-icon-widow-close:before { - content: "\f2d3"; -} -.uk-icon-widow-close-o:before { - content: "\f2d4"; -} -.uk-icon-window-maximize:before { - content: "\f2d0"; -} -.uk-icon-window-minimize:before { - content: "\f2d1"; -} -.uk-icon-window-restore:before { - content: "\f2d2"; -} -.uk-icon-wpexplorer:before { - content: "\f2de"; -} -/* ======================================================================== - Component: Close - ========================================================================== */ -/* - * Removes inner padding and border in Firefox 4+. - */ -.uk-close::-moz-focus-inner { - border: 0; - padding: 0; -} -/* - * 1. Correct inability to style clickable `input` types in iOS. - * 2. Remove margins in Chrome, Safari and Opera. - * 3. Remove borders for `button`. - * 4. Address `overflow` set to `hidden` in IE 8/9/10/11. - * 5. Correct `font` properties and `color` not being inherited for `button`. - * 6. Address inconsistent `text-transform` inheritance which is only inherit in Firefox and IE - * 7. Remove default `button` padding and background color - * 8. Style - */ -.uk-close { - /* 1 */ - -webkit-appearance: none; - /* 2 */ - margin: 0; - /* 3 */ - border: none; - /* 4 */ - overflow: visible; - /* 5 */ - font: inherit; - color: inherit; - /* 6 */ - text-transform: none; - /* 7. */ - padding: 0; - background: transparent; - /* 8 */ - display: inline-block; - box-sizing: content-box; - width: 20px; - line-height: 20px; - text-align: center; - vertical-align: middle; - opacity: 0.3; -} -/* Icon */ -.uk-close:after { - display: block; - content: "\f00d"; - font-family: FontAwesome; -} -/* - * Hover - * 1. Apply hover style also to focus state - * 2. Remove default focus style - * 3. Required for `a` elements - */ -.uk-close:hover, -.uk-close:focus { - opacity: 0.5; - /* 2 */ - outline: none; - /* 3 */ - color: inherit; - text-decoration: none; - cursor: pointer; -} -/* Modifier - ========================================================================== */ -.uk-close-alt { - padding: 2px; - border-radius: 50%; - background: #eee; - opacity: 1; -} -/* Hover */ -.uk-close-alt:hover, -.uk-close-alt:focus { - opacity: 1; -} -/* Icon */ -.uk-close-alt:after { - opacity: 0.5; -} -.uk-close-alt:hover:after, -.uk-close-alt:focus:after { - opacity: 0.8; -} -/* ======================================================================== - Component: Badge - ========================================================================== */ -.uk-badge { - display: inline-block; - padding: 0 5px; - background: #00a8e6; - font-size: 10px; - font-weight: bold; - line-height: 14px; - color: #fff; - text-align: center; - vertical-align: middle; - text-transform: none; -} -/* - * Keep color when badge is a link - */ -a.uk-badge:hover { - color: #fff; -} -/* Modifier: `uk-badge-notification`; - ========================================================================== */ -.uk-badge-notification { - box-sizing: border-box; - min-width: 18px; - border-radius: 500px; - font-size: 12px; - line-height: 18px; -} -/* Color modifier - ========================================================================== */ -/* - * Modifier: `uk-badge-success` - */ -.uk-badge-success { - background-color: #8cc14c; -} -/* - * Modifier: `uk-badge-warning` - */ -.uk-badge-warning { - background-color: #faa732; -} -/* - * Modifier: `uk-badge-danger` - */ -.uk-badge-danger { - background-color: #da314b; -} -/* ======================================================================== - Component: Alert - ========================================================================== */ -.uk-alert { - margin-bottom: 15px; - padding: 10px; - background: #ebf7fd; - color: #2d7091; -} -/* - * Add margin if adjacent element - */ -* + .uk-alert { - margin-top: 15px; -} -/* - * Remove margin from the last-child - */ -.uk-alert > :last-child { - margin-bottom: 0; -} -/* - * Keep color for headings if the default heading color is changed - */ -.uk-alert h1, -.uk-alert h2, -.uk-alert h3, -.uk-alert h4, -.uk-alert h5, -.uk-alert h6 { - color: inherit; -} -/* Close in alert - ========================================================================== */ -.uk-alert > .uk-close:first-child { - float: right; -} -/* - * Remove margin from adjacent element - */ -.uk-alert > .uk-close:first-child + * { - margin-top: 0; -} -/* Modifier: `uk-alert-success` - ========================================================================== */ -.uk-alert-success { - background: #f2fae3; - color: #659f13; -} -/* Modifier: `uk-alert-warning` - ========================================================================== */ -.uk-alert-warning { - background: #fffceb; - color: #e28327; -} -/* Modifier: `uk-alert-danger` - ========================================================================== */ -.uk-alert-danger { - background: #fff1f0; - color: #d85030; -} -/* Modifier: `uk-alert-large` - ========================================================================== */ -.uk-alert-large { - padding: 20px; -} -.uk-alert-large > .uk-close:first-child { - margin: -10px -10px 0 0; -} -/* ======================================================================== - Component: Thumbnail - ========================================================================== */ -/* - * 1. Container width fits its content - * 2. Responsive behavior - * 3. Corrects `max-width` behavior sed - * 4. Required for `figure` element - * 5. Style - */ -.uk-thumbnail { - /* 1 */ - display: inline-block; - /* 2 */ - max-width: 100%; - /* 3 */ - box-sizing: border-box; - /* 3 */ - margin: 0; - /* 4 */ - padding: 4px; - border: 1px solid #ddd; - background: #fff; -} -/* - * Hover state for `a` elements - * 1. Apply hover style also to focus state - * 2. Needed for caption - * 3. Remove default focus style - */ -a.uk-thumbnail:hover, -a.uk-thumbnail:focus { - border-color: #aaa; - background-color: #fff; - /* 2 */ - text-decoration: none; - /* 3 */ - outline: none; -} -/* Caption - ========================================================================== */ -.uk-thumbnail-caption { - padding-top: 4px; - text-align: center; - color: #444; -} -/* Sizes - ========================================================================== */ -.uk-thumbnail-mini { - width: 150px; -} -.uk-thumbnail-small { - width: 200px; -} -.uk-thumbnail-medium { - width: 300px; -} -.uk-thumbnail-large { - width: 400px; -} -.uk-thumbnail-expand, -.uk-thumbnail-expand > img { - width: 100%; -} -/* ======================================================================== - Component: Overlay - ========================================================================== */ -/* - * 1. Container width fits its content - * 2. Create position context - * 3. Set max-width for responsive images to prevent `inline-block` consequences - * 4. Remove the gap between the container and its child element - * 5. Needed for transitions and to fixed wrong scaling calculation for images in Chrome - * 6. Fixed `overflow: hidden` to be ignored with border-radius and CSS transforms in Webkit - * 7. Reset margin - */ -.uk-overlay { - /* 1 */ - display: inline-block; - /* 2 */ - position: relative; - /* 3 */ - max-width: 100%; - /* 4 */ - vertical-align: middle; - /* 5 */ - overflow: hidden; - /* 6 */ - -webkit-transform: translateZ(0); - /* 7 */ - margin: 0; -} -/* 6 for Safari */ -.uk-overlay.uk-border-circle { - -webkit-mask-image: -webkit-radial-gradient(circle, white 100%, black 100%); -} -/* - * Remove margin from content - */ -.uk-overlay > :first-child { - margin-bottom: 0; -} -/* Sub-object `uk-overlay-panel` - ========================================================================== */ -/* - * 1. Position cover - * 2. Style - */ -.uk-overlay-panel { - /* 1 */ - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - /* 2 */ - padding: 20px; - color: #fff; -} -/* - * Remove margin from the last-child - */ -.uk-overlay-panel > :last-child, -.uk-overlay-panel.uk-flex > * > :last-child { - margin-bottom: 0; -} -/* - * Keep color for headings if the default heading color is changed - */ -.uk-overlay-panel h1, -.uk-overlay-panel h2, -.uk-overlay-panel h3, -.uk-overlay-panel h4, -.uk-overlay-panel h5, -.uk-overlay-panel h6 { - color: inherit; -} -.uk-overlay-panel a:not([class]) { - color: inherit; - text-decoration: underline; -} -.uk-overlay-panel a[class*='uk-icon-']:not(.uk-icon-button) { - color: inherit; -} -/* Sub-object `uk-overlay-hover` and `uk-overlay-active` - ========================================================================== */ -.uk-overlay-hover:not(:hover):not(.uk-hover) .uk-overlay-panel:not(.uk-ignore) { - opacity: 0; -} -.uk-overlay-active :not(.uk-active) > .uk-overlay-panel:not(.uk-ignore) { - opacity: 0; -} -/* Modifier `uk-overlay-background` - ========================================================================== */ -.uk-overlay-background { - background: rgba(0, 0, 0, 0.5); -} -/* Modifier `uk-overlay-image` - ========================================================================== */ -/* - * Reset panel - */ -.uk-overlay-image { - padding: 0; -} -/* Position modifiers - ========================================================================== */ -.uk-overlay-top { - bottom: auto; -} -.uk-overlay-bottom { - top: auto; -} -.uk-overlay-left { - right: auto; -} -.uk-overlay-right { - left: auto; -} -/* Sub-object `uk-overlay-icon` - ========================================================================== */ -.uk-overlay-icon:before { - content: "\f002"; - position: absolute; - top: 50%; - left: 50%; - width: 50px; - height: 50px; - margin-top: -25px; - margin-left: -25px; - font-size: 50px; - line-height: 1; - font-family: FontAwesome; - text-align: center; - color: #fff; -} -/* Transitions - ========================================================================== */ -.uk-overlay-fade, -.uk-overlay-scale, -.uk-overlay-spin, -.uk-overlay-grayscale, -.uk-overlay-blur, -[class*='uk-overlay-slide'] { - transition-duration: 0.3s; - transition-timing-function: ease-out; - transition-property: opacity, transform, filter; -} -.uk-overlay-active .uk-overlay-fade, -.uk-overlay-active .uk-overlay-scale, -.uk-overlay-active .uk-overlay-spin, -.uk-overlay-active [class*='uk-overlay-slide'] { - transition-duration: 0.8s; -} -/* - * Fade - */ -.uk-overlay-fade { - opacity: 0.7; -} -.uk-overlay-hover:hover .uk-overlay-fade, -.uk-overlay-hover.uk-hover .uk-overlay-fade, -.uk-overlay-active .uk-active > .uk-overlay-fade { - opacity: 1; -} -/* - * Scale - */ -.uk-overlay-scale { - -webkit-transform: scale(1); - transform: scale(1); -} -.uk-overlay-hover:hover .uk-overlay-scale, -.uk-overlay-hover.uk-hover .uk-overlay-scale, -.uk-overlay-active .uk-active > .uk-overlay-scale { - -webkit-transform: scale(1.1); - transform: scale(1.1); -} -/* - * Spin - */ -.uk-overlay-spin { - -webkit-transform: scale(1) rotate(0deg); - transform: scale(1) rotate(0deg); -} -.uk-overlay-hover:hover .uk-overlay-spin, -.uk-overlay-hover.uk-hover .uk-overlay-spin, -.uk-overlay-active .uk-active > .uk-overlay-spin { - -webkit-transform: scale(1.1) rotate(3deg); - transform: scale(1.1) rotate(3deg); -} -/* - * Grayscale - */ -.uk-overlay-grayscale { - -webkit-filter: grayscale(100%); - filter: grayscale(100%); -} -.uk-overlay-hover:hover .uk-overlay-grayscale, -.uk-overlay-hover.uk-hover .uk-overlay-grayscale, -.uk-overlay-active .uk-active > .uk-overlay-grayscale { - -webkit-filter: grayscale(0%); - filter: grayscale(0%); -} -/* - * Slide - */ -[class*='uk-overlay-slide'] { - opacity: 0; -} -/* Top */ -.uk-overlay-slide-top { - -webkit-transform: translateY(-100%); - transform: translateY(-100%); -} -/* Bottom */ -.uk-overlay-slide-bottom { - -webkit-transform: translateY(100%); - transform: translateY(100%); -} -/* Left */ -.uk-overlay-slide-left { - -webkit-transform: translateX(-100%); - transform: translateX(-100%); -} -/* Right */ -.uk-overlay-slide-right { - -webkit-transform: translateX(100%); - transform: translateX(100%); -} -/* Hover */ -.uk-overlay-hover:hover [class*='uk-overlay-slide'], -.uk-overlay-hover.uk-hover [class*='uk-overlay-slide'], -.uk-overlay-active .uk-active > [class*='uk-overlay-slide'] { - opacity: 1; - -webkit-transform: translateX(0) translateY(0); - transform: translateX(0) translateY(0); -} -/* DEPRECATED - * Sub-object `uk-overlay-area` - ========================================================================== */ -/* - * 1. Set position - * 2. Set style - * 3. Fade-in transition - */ -.uk-overlay-area { - /* 1 */ - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - /* 2 */ - background: rgba(0, 0, 0, 0.3); - /* 3 */ - opacity: 0; - -webkit-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; - -webkit-transform: translate3d(0, 0, 0); -} -/* - * Hover - * 1. `uk-hover` to support touch devices - * 2. Use optional `uk-overlay-toggle` to trigger the overlay earlier - */ -.uk-overlay:hover .uk-overlay-area, -.uk-overlay.uk-hover .uk-overlay-area, -.uk-overlay-toggle:hover .uk-overlay-area, -.uk-overlay-toggle.uk-hover .uk-overlay-area { - opacity: 1; -} -/* - * Icon - */ -.uk-overlay-area:empty:before { - content: "\f002"; - position: absolute; - top: 50%; - left: 50%; - width: 50px; - height: 50px; - margin-top: -25px; - margin-left: -25px; - font-size: 50px; - line-height: 1; - font-family: FontAwesome; - text-align: center; - color: #fff; -} -/* DEPRECATED - * Sub-object `uk-overlay-area-content` - ========================================================================== */ -/* - * Remove whitespace between child elements when using `inline-block` - * Needed for Firefox - */ -.uk-overlay-area:not(:empty) { - font-size: 0.001px; -} -/* - * 1. Needed for vertical alignment - */ -.uk-overlay-area:not(:empty):before { - content: ''; - display: inline-block; - height: 100%; - vertical-align: middle; -} -/* - * 1. Set vertical alignment - * 2. Reset whitespace hack - * 3. Set horizontal alignment - * 4. Set style - */ -.uk-overlay-area-content { - /* 1 */ - display: inline-block; - box-sizing: border-box; - width: 100%; - vertical-align: middle; - /* 2 */ - font-size: 1rem; - /* 3 */ - text-align: center; - /* 4 */ - padding: 0 15px; - color: #fff; -} -/* - * Remove margin from the last-child - */ -.uk-overlay-area-content > :last-child { - margin-bottom: 0; -} -/* - * Links in overlay area - */ -.uk-overlay-area-content a:not([class]), -.uk-overlay-area-content a:not([class]):hover { - color: inherit; -} -/* DEPRECATED - * Sub-object `uk-overlay-caption` - ========================================================================== */ -/* - * 1. Set position - * 2. Set style - * 3. Fade-in transition - */ -.uk-overlay-caption { - /* 1 */ - position: absolute; - bottom: 0; - left: 0; - right: 0; - /* 2 */ - padding: 15px; - background: rgba(0, 0, 0, 0.5); - color: #fff; - /* 3 */ - opacity: 0; - -webkit-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; - -webkit-transform: translate3d(0, 0, 0); -} -/* - * Hover - * 1. `uk-hover` to support touch devices - * 2. Use optional `uk-overlay-toggle` to trigger the overlay earlier - */ -.uk-overlay:hover .uk-overlay-caption, -.uk-overlay.uk-hover .uk-overlay-caption, -.uk-overlay-toggle:hover .uk-overlay-caption, -.uk-overlay-toggle.uk-hover .uk-overlay-caption { - opacity: 1; -} -/* ======================================================================== - Component: Column - ========================================================================== */ -[class*='uk-column-'] { - -webkit-column-gap: 25px; - -moz-column-gap: 25px; - column-gap: 25px; -} -/* Width modifiers - ========================================================================== */ -.uk-column-1-2 { - -webkit-column-count: 2; - -moz-column-count: 2; - column-count: 2; -} -.uk-column-1-3 { - -webkit-column-count: 3; - -moz-column-count: 3; - column-count: 3; -} -.uk-column-1-4 { - -webkit-column-count: 4; - -moz-column-count: 4; - column-count: 4; -} -.uk-column-1-5 { - -webkit-column-count: 5; - -moz-column-count: 5; - column-count: 5; -} -.uk-column-1-6 { - -webkit-column-count: 6; - -moz-column-count: 6; - column-count: 6; -} -/* Phone landscape and bigger */ -@media (min-width: 480px) { - .uk-column-small-1-2 { - -webkit-column-count: 2; - -moz-column-count: 2; - column-count: 2; - } - .uk-column-small-1-3 { - -webkit-column-count: 3; - -moz-column-count: 3; - column-count: 3; - } - .uk-column-small-1-4 { - -webkit-column-count: 4; - -moz-column-count: 4; - column-count: 4; - } - .uk-column-small-1-5 { - -webkit-column-count: 5; - -moz-column-count: 5; - column-count: 5; - } - .uk-column-small-1-6 { - -webkit-column-count: 6; - -moz-column-count: 6; - column-count: 6; - } -} -/* Tablet and bigger */ -@media (min-width: 768px) { - .uk-column-medium-1-2 { - -webkit-column-count: 2; - -moz-column-count: 2; - column-count: 2; - } - .uk-column-medium-1-3 { - -webkit-column-count: 3; - -moz-column-count: 3; - column-count: 3; - } - .uk-column-medium-1-4 { - -webkit-column-count: 4; - -moz-column-count: 4; - column-count: 4; - } - .uk-column-medium-1-5 { - -webkit-column-count: 5; - -moz-column-count: 5; - column-count: 5; - } - .uk-column-medium-1-6 { - -webkit-column-count: 6; - -moz-column-count: 6; - column-count: 6; - } -} -/* Desktop and bigger */ -@media (min-width: 960px) { - .uk-column-large-1-2 { - -webkit-column-count: 2; - -moz-column-count: 2; - column-count: 2; - } - .uk-column-large-1-3 { - -webkit-column-count: 3; - -moz-column-count: 3; - column-count: 3; - } - .uk-column-large-1-4 { - -webkit-column-count: 4; - -moz-column-count: 4; - column-count: 4; - } - .uk-column-large-1-5 { - -webkit-column-count: 5; - -moz-column-count: 5; - column-count: 5; - } - .uk-column-large-1-6 { - -webkit-column-count: 6; - -moz-column-count: 6; - column-count: 6; - } -} -/* Large screen and bigger */ -@media (min-width: 1220px) { - .uk-column-xlarge-1-2 { - -webkit-column-count: 2; - -moz-column-count: 2; - column-count: 2; - } - .uk-column-xlarge-1-3 { - -webkit-column-count: 3; - -moz-column-count: 3; - column-count: 3; - } - .uk-column-xlarge-1-4 { - -webkit-column-count: 4; - -moz-column-count: 4; - column-count: 4; - } - .uk-column-xlarge-1-5 { - -webkit-column-count: 5; - -moz-column-count: 5; - column-count: 5; - } - .uk-column-xlarge-1-6 { - -webkit-column-count: 6; - -moz-column-count: 6; - column-count: 6; - } -} -/* ======================================================================== - Component: Animation - ========================================================================== */ -[class*='uk-animation-'] { - -webkit-animation-duration: 0.5s; - animation-duration: 0.5s; - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; -} -/* Hide animated element if scrollspy is used */ -@media screen { - [data-uk-scrollspy*='uk-animation-']:not([data-uk-scrollspy*='target']) { - opacity: 0; - } -} -/* - * Fade - * Higher specificity (!important) needed because of reverse modifier - */ -.uk-animation-fade { - -webkit-animation-name: uk-fade; - animation-name: uk-fade; - -webkit-animation-duration: 0.8s; - animation-duration: 0.8s; - -webkit-animation-timing-function: linear !important; - animation-timing-function: linear !important; -} -/* - * Fade with scale - */ -.uk-animation-scale-up { - -webkit-animation-name: uk-fade-scale-02; - animation-name: uk-fade-scale-02; -} -.uk-animation-scale-down { - -webkit-animation-name: uk-fade-scale-18; - animation-name: uk-fade-scale-18; -} -/* - * Fade with slide - */ -.uk-animation-slide-top { - -webkit-animation-name: uk-fade-top; - animation-name: uk-fade-top; -} -.uk-animation-slide-bottom { - -webkit-animation-name: uk-fade-bottom; - animation-name: uk-fade-bottom; -} -.uk-animation-slide-left { - -webkit-animation-name: uk-fade-left; - animation-name: uk-fade-left; -} -.uk-animation-slide-right { - -webkit-animation-name: uk-fade-right; - animation-name: uk-fade-right; -} -/* - * Scale - */ -.uk-animation-scale { - -webkit-animation-name: uk-scale-12; - animation-name: uk-scale-12; -} -/* - * Shake - */ -.uk-animation-shake { - -webkit-animation-name: uk-shake; - animation-name: uk-shake; -} -/* Direction modifiers - ========================================================================== */ -.uk-animation-reverse { - -webkit-animation-direction: reverse; - animation-direction: reverse; - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; -} -/* Duration modifiers -========================================================================== */ -.uk-animation-15 { - -webkit-animation-duration: 15s; - animation-duration: 15s; -} -/* Origin modifiers -========================================================================== */ -.uk-animation-top-left { - -webkit-transform-origin: 0 0; - transform-origin: 0 0; -} -.uk-animation-top-center { - -webkit-transform-origin: 50% 0; - transform-origin: 50% 0; -} -.uk-animation-top-right { - -webkit-transform-origin: 100% 0; - transform-origin: 100% 0; -} -.uk-animation-middle-left { - -webkit-transform-origin: 0 50%; - transform-origin: 0 50%; -} -.uk-animation-middle-right { - -webkit-transform-origin: 100% 50%; - transform-origin: 100% 50%; -} -.uk-animation-bottom-left { - -webkit-transform-origin: 0 100%; - transform-origin: 0 100%; -} -.uk-animation-bottom-center { - -webkit-transform-origin: 50% 100%; - transform-origin: 50% 100%; -} -.uk-animation-bottom-right { - -webkit-transform-origin: 100% 100%; - transform-origin: 100% 100%; -} -/* Sub-object: `uk-animation-hover` -========================================================================== */ -/* - * Enable animation only on hover - * Note: Firefox also needs this because animations are not triggered when switching between display `hidden` and `block` - */ -.uk-animation-hover:not(:hover), -.uk-animation-hover:not(:hover) [class*='uk-animation-'], -.uk-touch .uk-animation-hover:not(.uk-hover), -.uk-touch .uk-animation-hover:not(.uk-hover) [class*='uk-animation-'] { - -webkit-animation-name: none; - animation-name: none; -} -/* Keyframes: Fade - * Used by dropdown, datepicker and slideshow component - ========================================================================== */ -@-webkit-keyframes uk-fade { - 0% { - opacity: 0; - } - 100% { - opacity: 1; - } -} -@keyframes uk-fade { - 0% { - opacity: 0; - } - 100% { - opacity: 1; - } -} -/* Keyframes: Fade with slide - ========================================================================== */ -/* - * Top - */ -@-webkit-keyframes uk-fade-top { - 0% { - opacity: 0; - -webkit-transform: translateY(-100%); - } - 100% { - opacity: 1; - -webkit-transform: translateY(0); - } -} -@keyframes uk-fade-top { - 0% { - opacity: 0; - transform: translateY(-100%); - } - 100% { - opacity: 1; - transform: translateY(0); - } -} -/* - * Bottom - */ -@-webkit-keyframes uk-fade-bottom { - 0% { - opacity: 0; - -webkit-transform: translateY(100%); - } - 100% { - opacity: 1; - -webkit-transform: translateY(0); - } -} -@keyframes uk-fade-bottom { - 0% { - opacity: 0; - transform: translateY(100%); - } - 100% { - opacity: 1; - transform: translateY(0); - } -} -/* - * Left - */ -@-webkit-keyframes uk-fade-left { - 0% { - opacity: 0; - -webkit-transform: translateX(-100%); - } - 100% { - opacity: 1; - -webkit-transform: translateX(0); - } -} -@keyframes uk-fade-left { - 0% { - opacity: 0; - transform: translateX(-100%); - } - 100% { - opacity: 1; - transform: translateX(0); - } -} -/* - * Right - */ -@-webkit-keyframes uk-fade-right { - 0% { - opacity: 0; - -webkit-transform: translateX(100%); - } - 100% { - opacity: 1; - -webkit-transform: translateX(0); - } -} -@keyframes uk-fade-right { - 0% { - opacity: 0; - transform: translateX(100%); - } - 100% { - opacity: 1; - transform: translateX(0); - } -} -/* Keyframes: Fade with scale - ========================================================================== */ -/* - * Scale by 0.2 - */ -@-webkit-keyframes uk-fade-scale-02 { - 0% { - opacity: 0; - -webkit-transform: scale(0.2); - } - 100% { - opacity: 1; - -webkit-transform: scale(1); - } -} -@keyframes uk-fade-scale-02 { - 0% { - opacity: 0; - transform: scale(0.2); - } - 100% { - opacity: 1; - transform: scale(1); - } -} -/* - * Scale by 1.5 - * Used by slideshow component - */ -@-webkit-keyframes uk-fade-scale-15 { - 0% { - opacity: 0; - -webkit-transform: scale(1.5); - } - 100% { - opacity: 1; - -webkit-transform: scale(1); - } -} -@keyframes uk-fade-scale-15 { - 0% { - opacity: 0; - transform: scale(1.5); - } - 100% { - opacity: 1; - transform: scale(1); - } -} -/* - * Scale by 1.8 - */ -@-webkit-keyframes uk-fade-scale-18 { - 0% { - opacity: 0; - -webkit-transform: scale(1.8); - } - 100% { - opacity: 1; - -webkit-transform: scale(1); - } -} -@keyframes uk-fade-scale-18 { - 0% { - opacity: 0; - transform: scale(1.8); - } - 100% { - opacity: 1; - transform: scale(1); - } -} -/* Keyframes: Slide - * Used by slideshow component - ========================================================================== */ -/* - * Left - */ -@-webkit-keyframes uk-slide-left { - 0% { - -webkit-transform: translateX(-100%); - } - 100% { - -webkit-transform: translateX(0); - } -} -@keyframes uk-slide-left { - 0% { - transform: translateX(-100%); - } - 100% { - transform: translateX(0); - } -} -/* - * Right - */ -@-webkit-keyframes uk-slide-right { - 0% { - -webkit-transform: translateX(100%); - } - 100% { - -webkit-transform: translateX(0); - } -} -@keyframes uk-slide-right { - 0% { - transform: translateX(100%); - } - 100% { - transform: translateX(0); - } -} -/* - * Left third - */ -@-webkit-keyframes uk-slide-left-33 { - 0% { - -webkit-transform: translateX(33%); - } - 100% { - -webkit-transform: translateX(0); - } -} -@keyframes uk-slide-left-33 { - 0% { - transform: translateX(33%); - } - 100% { - transform: translateX(0); - } -} -/* - * Right third - */ -@-webkit-keyframes uk-slide-right-33 { - 0% { - -webkit-transform: translateX(-33%); - } - 100% { - -webkit-transform: translateX(0); - } -} -@keyframes uk-slide-right-33 { - 0% { - transform: translateX(-33%); - } - 100% { - transform: translateX(0); - } -} -/* Keyframes: Scale - ========================================================================== */ -@-webkit-keyframes uk-scale-12 { - 0% { - -webkit-transform: scale(1.2); - } - 100% { - -webkit-transform: scale(1); - } -} -@keyframes uk-scale-12 { - 0% { - transform: scale(1.2); - } - 100% { - transform: scale(1); - } -} -/* Keyframes: Rotate - * Used by icon component - ========================================================================== */ -@-webkit-keyframes uk-rotate { - 0% { - -webkit-transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(359deg); - } -} -@keyframes uk-rotate { - 0% { - transform: rotate(0deg); - } - 100% { - transform: rotate(359deg); - } -} -/* Keyframes: Shake - ========================================================================== */ -@-webkit-keyframes uk-shake { - 0%, - 100% { - -webkit-transform: translateX(0); - } - 10% { - -webkit-transform: translateX(-9px); - } - 20% { - -webkit-transform: translateX(8px); - } - 30% { - -webkit-transform: translateX(-7px); - } - 40% { - -webkit-transform: translateX(6px); - } - 50% { - -webkit-transform: translateX(-5px); - } - 60% { - -webkit-transform: translateX(4px); - } - 70% { - -webkit-transform: translateX(-3px); - } - 80% { - -webkit-transform: translateX(2px); - } - 90% { - -webkit-transform: translateX(-1px); - } -} -@keyframes uk-shake { - 0%, - 100% { - transform: translateX(0); - } - 10% { - transform: translateX(-9px); - } - 20% { - transform: translateX(8px); - } - 30% { - transform: translateX(-7px); - } - 40% { - transform: translateX(6px); - } - 50% { - transform: translateX(-5px); - } - 60% { - transform: translateX(4px); - } - 70% { - transform: translateX(-3px); - } - 80% { - transform: translateX(2px); - } - 90% { - transform: translateX(-1px); - } -} -/* Keyframes: Fade with slide fixed - * Used by dropdown and search component - ========================================================================== */ -/* - * Top fixed - */ -@-webkit-keyframes uk-slide-top-fixed { - 0% { - opacity: 0; - -webkit-transform: translateY(-10px); - } - 100% { - opacity: 1; - -webkit-transform: translateY(0); - } -} -@keyframes uk-slide-top-fixed { - 0% { - opacity: 0; - transform: translateY(-10px); - } - 100% { - opacity: 1; - transform: translateY(0); - } -} -/* - * Bottom fixed - */ -@-webkit-keyframes uk-slide-bottom-fixed { - 0% { - opacity: 0; - -webkit-transform: translateY(10px); - } - 100% { - opacity: 1; - -webkit-transform: translateY(0); - } -} -@keyframes uk-slide-bottom-fixed { - 0% { - opacity: 0; - transform: translateY(10px); - } - 100% { - opacity: 1; - transform: translateY(0); - } -} -/* ======================================================================== - Component: Dropdown - ========================================================================== */ -/* - * 1. Hide by default - * 2. Set position - * 3. Box-sizing is needed for `uk-dropdown-justify` - * 4. Set width - */ -.uk-dropdown, -.uk-dropdown-blank { - /* 1 */ - display: none; - /* 2 */ - position: absolute; - z-index: 970; - /* 3 */ - box-sizing: border-box; - /* 4 */ - width: 200px; -} -/* - * Dropdown style - * 1. Reset button group whitespace hack - */ -.uk-dropdown { - padding: 15px; - background: #f5f5f5; - color: #444; - /* 1 */ - font-size: 1rem; - vertical-align: top; -} -/* Focus */ -.uk-dropdown:focus { - outline: none; -} -/* - * 1. Show dropdown - * 2. Set animation - * 3. Needed for scale animation - */ -.uk-open > .uk-dropdown, -.uk-open > .uk-dropdown-blank { - /* 1 */ - display: block; - /* 2 */ - -webkit-animation: uk-fade 0.2s ease-in-out; - animation: uk-fade 0.2s ease-in-out; - /* 3 */ - -webkit-transform-origin: 0 0; - transform-origin: 0 0; -} -/* Alignment modifiers - ========================================================================== */ -/* - * Modifier - */ -.uk-dropdown-top { - margin-top: -5px; -} -.uk-dropdown-bottom { - margin-top: 5px; -} -.uk-dropdown-left { - margin-left: -5px; -} -.uk-dropdown-right { - margin-left: 5px; -} -/* Nav in dropdown - ========================================================================== */ -.uk-dropdown .uk-nav { - margin: 0 -15px; -} -/* Grid and panel in dropdown - ========================================================================== */ -/* -* Vertical gutter -*/ -/* - * Grid - * Higher specificity to override large gutter - */ -.uk-grid .uk-dropdown-grid + .uk-dropdown-grid { - margin-top: 15px; -} -/* Panels */ -.uk-dropdown-grid > [class*='uk-width-'] > .uk-panel + .uk-panel { - margin-top: 15px; -} -/* Tablet and bigger */ -@media (min-width: 768px) { - /* - * Horizontal gutter - */ - .uk-dropdown:not(.uk-dropdown-stack) > .uk-dropdown-grid { - margin-left: -15px; - margin-right: -15px; - } - .uk-dropdown:not(.uk-dropdown-stack) > .uk-dropdown-grid > [class*='uk-width-'] { - padding-left: 15px; - padding-right: 15px; - } - /* - * Column divider - */ - .uk-dropdown:not(.uk-dropdown-stack) > .uk-dropdown-grid > [class*='uk-width-']:nth-child(n+2) { - border-left: 1px solid #ddd; - } - /* - * Width multiplier for dropdown columns - */ - .uk-dropdown-width-2:not(.uk-dropdown-stack) { - width: 400px; - } - .uk-dropdown-width-3:not(.uk-dropdown-stack) { - width: 600px; - } - .uk-dropdown-width-4:not(.uk-dropdown-stack) { - width: 800px; - } - .uk-dropdown-width-5:not(.uk-dropdown-stack) { - width: 1000px; - } -} -/* Phone landscape and smaller */ -@media (max-width: 767px) { - /* - * Stack columns and take full width - */ - .uk-dropdown-grid > [class*='uk-width-'] { - width: 100%; - } - /* - * Vertical gutter - */ - .uk-dropdown-grid > [class*='uk-width-']:nth-child(n+2) { - margin-top: 15px; - } -} -/* -* Stack grid columns -*/ -.uk-dropdown-stack > .uk-dropdown-grid > [class*='uk-width-'] { - width: 100%; -} -.uk-dropdown-stack > .uk-dropdown-grid > [class*='uk-width-']:nth-child(n+2) { - margin-top: 15px; -} -/* Modifier `uk-dropdown-small` - ========================================================================== */ -/* - * Set min-width and text expands dropdown if needed - */ -.uk-dropdown-small { - min-width: 150px; - width: auto; - padding: 5px; - white-space: nowrap; -} -/* - * Nav in dropdown - */ -.uk-dropdown-small .uk-nav { - margin: 0 -5px; -} -/* Modifier: `uk-dropdown-navbar` - ========================================================================== */ -.uk-dropdown-navbar { - margin-top: 0; - background: #f5f5f5; - color: #444; -} -.uk-open > .uk-dropdown-navbar { - -webkit-animation: uk-slide-top-fixed 0.2s ease-in-out; - animation: uk-slide-top-fixed 0.2s ease-in-out; -} -/* Modifier `uk-dropdown-scrollable` - ========================================================================== */ -/* - * Usefull for long lists - */ -.uk-dropdown-scrollable { - overflow-y: auto; - max-height: 200px; -} -/* Sub-object: `uk-dropdown-overlay` - ========================================================================== */ -/* ======================================================================== - Component: Modal - ========================================================================== */ -/* - * This is the modal overlay and modal dialog container - * 1. Hide by default - * 2. Set fixed position - * 3. Allow scrolling for the modal dialog - * 4. Mask the background page - * 5. Fade-in transition - * 6. Deactivate browser history navigation in IE11 - * 7. force hardware acceleration to prevent browser rendering hiccups - */ -.uk-modal { - /* 1 */ - display: none; - /* 2 */ - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1010; - /* 3 */ - overflow-y: auto; - -webkit-overflow-scrolling: touch; - /* 4 */ - background: rgba(0, 0, 0, 0.6); - /* 5 */ - opacity: 0; - -webkit-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; - /* 6 */ - touch-action: cross-slide-y pinch-zoom double-tap-zoom; - /* 7 */ - -webkit-transform: translateZ(0); - transform: translateZ(0); -} -/* - * Open state - */ -.uk-modal.uk-open { - opacity: 1; -} -/* - * Prevents duplicated scrollbar caused by 4. - */ -.uk-modal-page, -.uk-modal-page body { - overflow: hidden; -} -/* Sub-object: `uk-modal-dialog` - ========================================================================== */ -/* - * 1. Create position context for caption, spinner and close button - * 2. Set box sizing - * 3. Set style - * 4. Slide-in transition - */ -.uk-modal-dialog { - /* 1 */ - position: relative; - /* 2 */ - box-sizing: border-box; - margin: 50px auto; - padding: 20px; - width: 600px; - max-width: 100%; - max-width: calc(100% - 20px); - /* 3 */ - background: #fff; - /* 4 */ - opacity: 0; - -webkit-transform: translateY(-100px); - transform: translateY(-100px); - -webkit-transition: opacity 0.3s linear, -webkit-transform 0.3s ease-out; - transition: opacity 0.3s linear, transform 0.3s ease-out; -} -/* Phone landscape and smaller */ -@media (max-width: 767px) { - /* - * Fit in small screen - */ - .uk-modal-dialog { - width: auto; - margin: 10px auto; - } -} -/* - * Open state - */ -.uk-open .uk-modal-dialog { - /* 4 */ - opacity: 1; - -webkit-transform: translateY(0); - transform: translateY(0); -} -/* - * Remove margin from the last-child - */ -.uk-modal-dialog > :not([class*='uk-modal-']):last-child { - margin-bottom: 0; -} -/* Close in modal - ========================================================================== */ -.uk-modal-dialog > .uk-close:first-child { - margin: -10px -10px 0 0; - float: right; -} -/* - * Remove margin from adjacent element - */ -.uk-modal-dialog > .uk-close:first-child + :not([class*='uk-modal-']) { - margin-top: 0; -} -/* Modifier: `uk-modal-dialog-lightbox` - ========================================================================== */ -.uk-modal-dialog-lightbox { - margin: 15px auto; - padding: 0; - max-width: 95%; - max-width: calc(100% - 30px); - min-height: 50px; -} -/* - * Close button - */ -.uk-modal-dialog-lightbox > .uk-close:first-child { - position: absolute; - top: -12px; - right: -12px; - margin: 0; - float: none; -} -/* Phone landscape and smaller */ -@media (max-width: 767px) { - .uk-modal-dialog-lightbox > .uk-close:first-child { - top: -7px; - right: -7px; - } -} -/* Modifier: `uk-modal-dialog-blank` - ========================================================================== */ -.uk-modal-dialog-blank { - margin: 0; - padding: 0; - width: 100%; - max-width: 100%; - -webkit-transition: opacity 0.3s linear; - transition: opacity 0.3s linear; -} -/* -* Close button -*/ -.uk-modal-dialog-blank > .uk-close:first-child { - position: absolute; - top: 20px; - right: 20px; - z-index: 1; - margin: 0; - float: none; -} -/* Modifier: `uk-modal-dialog-large` - ========================================================================== */ -/* Tablet and bigger */ -@media (min-width: 768px) { - .uk-modal-dialog-large { - width: 930px; - } -} -/* Large screen and bigger */ -@media (min-width: 1220px) { - .uk-modal-dialog-large { - width: 1130px; - } -} -/* Sub-Object: `uk-modal-header` and `uk-modal-footer` - ========================================================================== */ -.uk-modal-header { - margin-bottom: 15px; -} -.uk-modal-footer { - margin-top: 15px; -} -/* - * Remove margin from the last-child - */ -.uk-modal-header > :last-child, -.uk-modal-footer > :last-child { - margin-bottom: 0; -} -/* Sub-Object: `uk-modal-caption` - ========================================================================== */ -.uk-modal-caption { - position: absolute; - left: 0; - right: 0; - bottom: -20px; - margin-bottom: -10px; - color: #fff; - text-align: center; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -/* Sub-Object: `uk-modal-spinner` - ========================================================================== */ -.uk-modal-spinner { - position: absolute; - top: 50%; - left: 50%; - -webkit-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); - font-size: 25px; - color: #ddd; -} -.uk-modal-spinner:after { - content: "\f110"; - display: block; - font-family: FontAwesome; - -webkit-animation: uk-rotate 2s infinite linear; - animation: uk-rotate 2s infinite linear; -} -/* ======================================================================== - Component: Off-canvas - ========================================================================== */ -/* - * This is the offcanvas overlay and bar container - * 1. Hide by default - * 2. Set fixed position - * 3. Deactivate browser touch actions in IE11 - * 4. Mask the background page - */ -.uk-offcanvas { - /* 1 */ - display: none; - /* 2 */ - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1000; - /* 3 */ - touch-action: none; - /* 4 */ - background: rgba(0, 0, 0, 0.1); -} -.uk-offcanvas.uk-active { - display: block; -} -/* Sub-object `uk-offcanvas-page` - ========================================================================== */ -/* - * Prepares the whole HTML page to slide-out - * 1. Fix the main page and disallow scrolling - * 2. Side-out transition - * 3. Needed for the transition to work instead of just letting it pop to the side - */ -.uk-offcanvas-page { - /* 1 */ - position: fixed; - /* 2 */ - -webkit-transition: margin-left 0.3s ease-in-out; - transition: margin-left 0.3s ease-in-out; - /* 3 */ - margin-left: 0; -} -/* Sub-object `uk-offcanvas-bar` - ========================================================================== */ -/* - * This is the offcanvas bar - * 1. Set fixed position - * 2. Size and style - * 3. Allow scrolling - * 4. Side-out transition - * 5. Deactivate scroll chaining in IE11 - */ -.uk-offcanvas-bar { - /* 1 */ - position: fixed; - top: 0; - bottom: 0; - left: 0; - -webkit-transform: translateX(-100%); - transform: translateX(-100%); - z-index: 1001; - /* 2 */ - width: 270px; - max-width: 100%; - background: #333; - /* 3 */ - overflow-y: auto; - -webkit-overflow-scrolling: touch; - /* 4 */ - -webkit-transition: -webkit-transform 0.3s ease-in-out; - transition: transform 0.3s ease-in-out; - /* 5 */ - -ms-scroll-chaining: none; -} -.uk-offcanvas.uk-active .uk-offcanvas-bar.uk-offcanvas-bar-show { - -webkit-transform: translateX(0%); - transform: translateX(0%); -} -/* Modifier `uk-offcanvas-bar-flip` - ========================================================================== */ -.uk-offcanvas-bar-flip { - left: auto; - right: 0; - -webkit-transform: translateX(100%); - transform: translateX(100%); -} -/* Offcanvase modes - ========================================================================== */ -.uk-offcanvas-bar[mode='none'] { - -webkit-transition: none; - transition: none; -} -.uk-offcanvas-bar[mode='reveal'] { - -webkit-transform: translateX(0%); - transform: translateX(0%); - clip: rect(0, 0, 100vh, 0); - -webkit-transition: -webkit-transform 0.3s ease-in-out, clip 0.3s ease-in-out; - transition: transform 0.3s ease-in-out, clip 0.3s ease-in-out; -} -.uk-offcanvas-bar-flip[mode='reveal'] { - clip: none; - -webkit-transform: translateX(100%); - transform: translateX(100%); -} -.uk-offcanvas-bar-flip[mode='reveal'] > * { - -webkit-transform: translateX(-100%); - transform: translateX(-100%); - -webkit-transition: -webkit-transform 0.3s ease-in-out; - transition: transform 0.3s ease-in-out; -} -.uk-offcanvas.uk-active .uk-offcanvas-bar-flip[mode='reveal'].uk-offcanvas-bar-show > * { - -webkit-transform: translateX(0%); - transform: translateX(0%); -} -/* Panel in offcanvas - ========================================================================== */ -.uk-offcanvas .uk-panel { - margin: 20px 15px; - color: #777; -} -.uk-offcanvas .uk-panel-title { - color: #ccc; -} -.uk-offcanvas .uk-panel a:not([class]) { - color: #ccc; -} -.uk-offcanvas .uk-panel a:not([class]):hover { - color: #fff; -} -/* ======================================================================== - Component: Switcher - ========================================================================== */ -/* - * 1. Deactivate browser history navigation in IE11 - */ -.uk-switcher { - margin: 0; - padding: 0; - list-style: none; - /* 1 */ - touch-action: cross-slide-y pinch-zoom double-tap-zoom; -} -/* - * Items - */ -.uk-switcher > :not(.uk-active) { - display: none; -} -/* ======================================================================== - Component: Text - ========================================================================== */ -/* Size modifiers - ========================================================================== */ -.uk-text-small { - font-size: 11px; - line-height: 16px; -} -.uk-text-large { - font-size: 18px; - line-height: 24px; - font-weight: normal; -} -/* Weight modifiers - ========================================================================== */ -.uk-text-bold { - font-weight: bold; -} -/* Color modifiers - ========================================================================== */ -.uk-text-muted { - color: #999 !important; -} -.uk-text-primary { - color: #2d7091 !important; -} -.uk-text-success { - color: #659f13 !important; -} -.uk-text-warning { - color: #e28327 !important; -} -.uk-text-danger { - color: #d85030 !important; -} -.uk-text-contrast { - color: #fff !important; -} -/* Alignment modifiers - ========================================================================== */ -.uk-text-left { - text-align: left !important; -} -.uk-text-right { - text-align: right !important; -} -.uk-text-center { - text-align: center !important; -} -.uk-text-justify { - text-align: justify !important; -} -.uk-text-top { - vertical-align: top !important; -} -.uk-text-middle { - vertical-align: middle !important; -} -.uk-text-bottom { - vertical-align: bottom !important; -} -/* Only tablets portrait and smaller */ -@media (max-width: 959px) { - .uk-text-center-medium { - text-align: center !important; - } - .uk-text-left-medium { - text-align: left !important; - } -} -/* Phone landscape and smaller */ -@media (max-width: 767px) { - .uk-text-center-small { - text-align: center !important; - } - .uk-text-left-small { - text-align: left !important; - } -} -/* Wrap modifiers - ========================================================================== */ -/* - * Prevent text from wrapping onto multiple lines - */ -.uk-text-nowrap { - white-space: nowrap; -} -/* - * Prevent text from wrapping onto multiple lines, and truncate with an ellipsis - */ -.uk-text-truncate { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -/* - * Break strings if their length exceeds the width of their container - */ -.uk-text-break { - word-wrap: break-word; - -webkit-hyphens: auto; - -ms-hyphens: auto; - -moz-hyphens: auto; - hyphens: auto; -} -/* Transform modifiers - ========================================================================== */ -.uk-text-capitalize { - text-transform: capitalize !important; -} -.uk-text-lowercase { - text-transform: lowercase !important; -} -.uk-text-uppercase { - text-transform: uppercase !important; -} -/* ======================================================================== - Component: Utility - ========================================================================== */ -/* Container - ========================================================================== */ -.uk-container { - box-sizing: border-box; - max-width: 980px; - padding: 0 25px; -} -/* Large screen and bigger */ -@media (min-width: 1220px) { - .uk-container { - max-width: 1200px; - padding: 0 35px; - } -} -/* - * Micro clearfix - */ -.uk-container:before, -.uk-container:after { - content: ""; - display: table; -} -.uk-container:after { - clear: both; -} -/* - * Center container - */ -.uk-container-center { - margin-left: auto; - margin-right: auto; -} -/* Clearing - ========================================================================== */ -/* - * Micro clearfix -* `table-cell` is used with `:before` because `table` creates a 1px gap when it becomes a flex item, only in Webkit - * `table` is used again with `:after` because `clear` only works with block elements. - * Note: `display: block` with `overflow: hidden` is currently not working in the latest Safari - */ -.uk-clearfix:before { - content: ""; - display: table-cell; -} -.uk-clearfix:after { - content: ""; - display: table; - clear: both; -} -/* - * Create a new block formatting context - */ -.uk-nbfc { - overflow: hidden; -} -.uk-nbfc-alt { - display: table-cell; - width: 10000px; -} -/* Alignment of block elements - ========================================================================== */ -/* - * Float blocks - * 1. Prevent content overflow on small devices - */ -.uk-float-left { - float: left; -} -.uk-float-right { - float: right; -} -/* 1 */ -[class*='uk-float-'] { - max-width: 100%; -} -/* Alignment of images and objects - ========================================================================== */ -/* - * Alignment - */ -[class*='uk-align-'] { - display: block; - margin-bottom: 15px; -} -.uk-align-left { - margin-right: 15px; - float: left; -} -.uk-align-right { - margin-left: 15px; - float: right; -} -/* Tablet and bigger */ -@media (min-width: 768px) { - .uk-align-medium-left { - margin-right: 15px; - float: left; - } - .uk-align-medium-right { - margin-left: 15px; - float: right; - } -} -.uk-align-center { - margin-left: auto; - margin-right: auto; -} -/* Vertical alignment - ========================================================================== */ -/* - * Remove whitespace between child elements when using `inline-block` - */ -.uk-vertical-align { - font-size: 0.001px; -} -/* - * The `uk-vertical-align` container needs a specific height - */ -.uk-vertical-align:before { - content: ''; - display: inline-block; - height: 100%; - vertical-align: middle; -} -/* - * Sub-object which can have any height - * 1. Reset whitespace hack - */ -.uk-vertical-align-middle, -.uk-vertical-align-bottom { - display: inline-block; - max-width: 100%; - /* 1 */ - font-size: 1rem; -} -.uk-vertical-align-middle { - vertical-align: middle; -} -.uk-vertical-align-bottom { - vertical-align: bottom; -} -/* Height - ========================================================================== */ -/* - * More robust if padding and border are used - */ -[class*='uk-height'] { - box-sizing: border-box; -} -/* - * Useful to extend the `html` and `body` element to the full height of the page. - */ -.uk-height-1-1 { - height: 100%; -} -/* - * Useful to create image teasers - */ -.uk-height-viewport { - height: 100vh; - min-height: 600px; -} -/* Responsive objects - * Note: Images are already responsive by default, see Base component - ========================================================================== */ -/* - * 1. Corrects `max-width` and `max-height` behavior if padding and border are used - */ -.uk-responsive-width, -.uk-responsive-height { - box-sizing: border-box; -} -/* - * Responsiveness: Sets a maximum width relative to the parent and auto scales the height - * `important` needed to override `uk-img-preserve img` - */ -.uk-responsive-width { - max-width: 100% !important; - height: auto; -} -/* - * Responsiveness: Sets a maximum height relative to the parent and auto scales the width - * Only works if the parent element has a fixed height. - */ -.uk-responsive-height { - max-height: 100%; - width: auto; -} -/* Margin - ========================================================================== */ -/* - * Create a block with the same margin of a paragraph - * Add margin if adjacent element - */ -.uk-margin { - margin-bottom: 15px; -} -* + .uk-margin { - margin-top: 15px; -} -.uk-margin-top { - margin-top: 15px !important; -} -.uk-margin-bottom { - margin-bottom: 15px !important; -} -.uk-margin-left { - margin-left: 15px !important; -} -.uk-margin-right { - margin-right: 15px !important; -} -/* - * Larger margins - */ -.uk-margin-large { - margin-bottom: 50px; -} -* + .uk-margin-large { - margin-top: 50px; -} -.uk-margin-large-top { - margin-top: 50px !important; -} -.uk-margin-large-bottom { - margin-bottom: 50px !important; -} -.uk-margin-large-left { - margin-left: 50px !important; -} -.uk-margin-large-right { - margin-right: 50px !important; -} -/* - * Smaller margins - */ -.uk-margin-small { - margin-bottom: 5px; -} -* + .uk-margin-small { - margin-top: 5px; -} -.uk-margin-small-top { - margin-top: 5px !important; -} -.uk-margin-small-bottom { - margin-bottom: 5px !important; -} -.uk-margin-small-left { - margin-left: 5px !important; -} -.uk-margin-small-right { - margin-right: 5px !important; -} -/* - * Remove margins - */ -.uk-margin-remove { - margin: 0 !important; -} -.uk-margin-top-remove { - margin-top: 0 !important; -} -.uk-margin-bottom-remove { - margin-bottom: 0 !important; -} -/* Padding - ========================================================================== */ -.uk-padding-remove { - padding: 0 !important; -} -.uk-padding-top-remove { - padding-top: 0 !important; -} -.uk-padding-bottom-remove { - padding-bottom: 0 !important; -} -.uk-padding-vertical-remove { - padding-top: 0 !important; - padding-bottom: 0 !important; -} -/* Border - ========================================================================== */ -.uk-border-circle { - border-radius: 50%; -} -.uk-border-rounded { - border-radius: 5px; -} -/* Headings - ========================================================================== */ -.uk-heading-large { - font-size: 36px; - line-height: 42px; -} -/* Tablet and bigger */ -@media (min-width: 768px) { - .uk-heading-large { - font-size: 52px; - line-height: 64px; - } -} -/* Link - ========================================================================== */ -/* - * Let links appear in default text color - */ -.uk-link-muted, -.uk-link-muted a { - color: #444; -} -.uk-link-muted:hover, -.uk-link-muted a:hover { - color: #444; -} -/* - * Reset link style - */ -.uk-link-reset, -.uk-link-reset a, -.uk-link-reset:hover, -.uk-link-reset a:hover, -.uk-link-reset:focus, -.uk-link-reset a:focus { - color: inherit; - text-decoration: none; -} -/* Scrollable - ========================================================================== */ -/* - * Enable scrolling for preformatted text - */ -.uk-scrollable-text { - height: 300px; - overflow-y: scroll; - -webkit-overflow-scrolling: touch; - resize: both; -} -/* - * Box with scrolling enabled - */ -.uk-scrollable-box { - box-sizing: border-box; - height: 170px; - padding: 10px; - border: 1px solid #ddd; - overflow: auto; - -webkit-overflow-scrolling: touch; - resize: both; -} -.uk-scrollable-box > :last-child { - margin-bottom: 0; -} -/* Overflow - ========================================================================== */ -.uk-overflow-hidden { - overflow: hidden; -} -/* - * Enable scrollbars if content is clipped - */ -.uk-overflow-container { - overflow: auto; - -webkit-overflow-scrolling: touch; -} -.uk-overflow-container > :last-child { - margin-bottom: 0; -} -/* Position - ========================================================================== */ -.uk-position-absolute, -[class*='uk-position-top'], -[class*='uk-position-bottom'] { - position: absolute !important; -} -/* Don't use `width: 100%` because it is wrong if the parent has padding. */ -.uk-position-top { - top: 0; - left: 0; - right: 0; -} -.uk-position-bottom { - bottom: 0; - left: 0; - right: 0; -} -.uk-position-top-left { - top: 0; - left: 0; -} -.uk-position-top-right { - top: 0; - right: 0; -} -.uk-position-bottom-left { - bottom: 0; - left: 0; -} -.uk-position-bottom-right { - bottom: 0; - right: 0; -} -/* - * Cover - */ -.uk-position-cover { - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; -} -/* - * Relative - */ -.uk-position-relative { - position: relative !important; -} -/* - * Z-index - */ -.uk-position-z-index { - z-index: 1; -} -/* Display - ========================================================================== */ -/* - * Display - * 1. Required if child is a responsive image - */ -.uk-display-block { - display: block !important; -} -.uk-display-inline { - display: inline !important; -} -.uk-display-inline-block { - display: inline-block !important; - /* 1 */ - max-width: 100%; -} -/* - * Visibility - * Avoids setting display to `block` so it works also with `inline-block` and `table` - */ -/* Desktop and bigger */ -@media (min-width: 960px) { - .uk-visible-small { - display: none !important; - } - .uk-visible-medium { - display: none !important; - } - .uk-hidden-large { - display: none !important; - } -} -/* Tablets portrait */ -@media (min-width: 768px) and (max-width: 959px) { - .uk-visible-small { - display: none !important; - } - .uk-visible-large { - display: none !important ; - } - .uk-hidden-medium { - display: none !important; - } -} -/* Phone landscape and smaller*/ -@media (max-width: 767px) { - .uk-visible-medium { - display: none !important; - } - .uk-visible-large { - display: none !important; - } - .uk-hidden-small { - display: none !important; - } -} -/* Remove from the flow and screen readers on any device */ -.uk-hidden { - display: none !important; - visibility: hidden !important; -} -/* It's hidden, but still affects layout */ -.uk-invisible { - visibility: hidden !important; -} -/* Show on hover */ -.uk-visible-hover:hover .uk-hidden, -.uk-visible-hover:hover .uk-invisible { - display: block !important; - visibility: visible !important; -} -.uk-visible-hover-inline:hover .uk-hidden, -.uk-visible-hover-inline:hover .uk-invisible { - display: inline-block !important; - visibility: visible !important; -} -/* Hide on touch */ -.uk-touch .uk-hidden-touch, -.uk-notouch .uk-hidden-notouch { - display: none !important; -} -/* ======================================================================== - Component: Flex - ========================================================================== */ -.uk-flex { - display: -ms-flexbox; - display: -webkit-flex; - display: flex; -} -.uk-flex-inline { - display: -ms-inline-flexbox; - display: -webkit-inline-flex; - display: inline-flex; -} -/* - * Fixes initial flex-shrink value in IE10 - */ -.uk-flex > *, -.uk-flex-inline > * { - -ms-flex-negative: 1; -} -/* Alignment - ========================================================================== */ -/* - * Vertical alignment - * Default value is `stretch` - */ -.uk-flex-top { - -ms-flex-align: start; - -webkit-align-items: flex-start; - align-items: flex-start; -} -.uk-flex-middle { - -ms-flex-align: center; - -webkit-align-items: center; - align-items: center; -} -.uk-flex-bottom { - -ms-flex-align: end; - -webkit-align-items: flex-end; - align-items: flex-end; -} -/* - * Horizontal alignment - * Default value is `flex-start` - */ -.uk-flex-center { - -ms-flex-pack: center; - -webkit-justify-content: center; - justify-content: center; -} -.uk-flex-right { - -ms-flex-pack: end; - -webkit-justify-content: flex-end; - justify-content: flex-end; -} -.uk-flex-space-between { - -ms-flex-pack: justify; - -webkit-justify-content: space-between; - justify-content: space-between; -} -.uk-flex-space-around { - -ms-flex-pack: distribute; - -webkit-justify-content: space-around; - justify-content: space-around; -} -/* Direction - ========================================================================== */ -.uk-flex-row-reverse { - -ms-flex-direction: row-reverse; - -webkit-flex-direction: row-reverse; - flex-direction: row-reverse; -} -.uk-flex-column { - -ms-flex-direction: column; - -webkit-flex-direction: column; - flex-direction: column; -} -.uk-flex-column-reverse { - -ms-flex-direction: column-reverse; - -webkit-flex-direction: column-reverse; - flex-direction: column-reverse; -} -/* Wrap - ========================================================================== */ -.uk-flex-nowrap { - -ms-flex-wrap: nowrap; - -webkit-flex-wrap: nowrap; - flex-wrap: nowrap; -} -.uk-flex-wrap { - -ms-flex-wrap: wrap; - -webkit-flex-wrap: wrap; - flex-wrap: wrap; -} -.uk-flex-wrap-reverse { - -ms-flex-wrap: wrap-reverse; - -webkit-flex-wrap: wrap-reverse; - flex-wrap: wrap-reverse; -} -/* - * Horizontal alignment - * Default value is `stretch` - */ -.uk-flex-wrap-top { - -ms-flex-line-pack: start; - -webkit-align-content: flex-start; - align-content: flex-start; -} -.uk-flex-wrap-middle { - -ms-flex-line-pack: center; - -webkit-align-content: center; - align-content: center; -} -.uk-flex-wrap-bottom { - -ms-flex-line-pack: end; - -webkit-align-content: flex-end; - align-content: flex-end; -} -.uk-flex-wrap-space-between { - -ms-flex-line-pack: justify; - -webkit-align-content: space-between; - align-content: space-between; -} -.uk-flex-wrap-space-around { - -ms-flex-line-pack: distribute; - -webkit-align-content: space-around; - align-content: space-around; -} -/* Item ordering - ========================================================================== */ -/* - * Default is 0 - */ -.uk-flex-order-first { - -ms-flex-order: -1; - -webkit-order: -1; - order: -1; -} -.uk-flex-order-last { - -ms-flex-order: 99; - -webkit-order: 99; - order: 99; -} -/* Phone landscape and bigger */ -@media (min-width: 480px) { - .uk-flex-order-first-small { - -ms-flex-order: -1; - -webkit-order: -1; - order: -1; - } - .uk-flex-order-last-small { - -ms-flex-order: 99; - -webkit-order: 99; - order: 99; - } -} -/* Tablet and bigger */ -@media (min-width: 768px) { - .uk-flex-order-first-medium { - -ms-flex-order: -1; - -webkit-order: -1; - order: -1; - } - .uk-flex-order-last-medium { - -ms-flex-order: 99; - -webkit-order: 99; - order: 99; - } -} -/* Desktop and bigger */ -@media (min-width: 960px) { - .uk-flex-order-first-large { - -ms-flex-order: -1; - -webkit-order: -1; - order: -1; - } - .uk-flex-order-last-large { - -ms-flex-order: 99; - -webkit-order: 99; - order: 99; - } -} -/* Large screen and bigger */ -@media (min-width: 1220px) { - .uk-flex-order-first-xlarge { - -ms-flex-order: -1; - -webkit-order: -1; - order: -1; - } - .uk-flex-order-last-xlarge { - -ms-flex-order: 99; - -webkit-order: 99; - order: 99; - } -} -/* Item dimensions - ========================================================================== */ -/* - * Initial: 0 1 auto - * Content dimensions, but shrinks - */ -/* - * No Flex: 0 0 auto - * Content dimensions - */ -.uk-flex-item-none { - -ms-flex: none; - -webkit-flex: none; - flex: none; -} -/* - * Relative Flex: 1 1 auto - * Space is allocated considering content - * 1. Fixes flex-shrink value in IE10 - */ -.uk-flex-item-auto { - -ms-flex: auto; - -webkit-flex: auto; - flex: auto; - /* 1 */ - -ms-flex-negative: 1; -} -/* - * Absolute Flex: 1 1 0% - * Space is allocated solely based on flex - */ -.uk-flex-item-1 { - -ms-flex: 1; - -webkit-flex: 1; - flex: 1; -} -/* ======================================================================== - Component: Contrast - ========================================================================== */ -.uk-contrast { - color: #fff; - /* Active */ -} -.uk-contrast a:not([class]), -.uk-contrast .uk-link { - color: rgba(255, 255, 255, 0.7); - text-decoration: none; -} -.uk-contrast a:not([class]):hover, -.uk-contrast .uk-link:hover { - color: #fff; - text-decoration: underline; -} -.uk-contrast :not(pre) > code, -.uk-contrast :not(pre) > kbd, -.uk-contrast :not(pre) > samp { - color: #fff; -} -.uk-contrast em { - color: #fff; -} -.uk-contrast h1, -.uk-contrast h2, -.uk-contrast h3, -.uk-contrast h4, -.uk-contrast h5, -.uk-contrast h6 { - color: #fff; -} -.uk-contrast hr { - border-top-color: rgba(255, 255, 255, 0.2); -} -.uk-contrast .uk-nav li > a, -.uk-contrast .uk-nav li > a:hover { - text-decoration: none; -} -.uk-contrast .uk-nav-side > li > a { - color: #fff; -} -.uk-contrast .uk-nav-side > li > a:hover, -.uk-contrast .uk-nav-side > li > a:focus { - background: rgba(255, 255, 255, 0.1); - color: #fff; -} -.uk-contrast .uk-nav-side > li.uk-active > a { - background: #fff; - color: #444; -} -.uk-contrast .uk-nav-side .uk-nav-header { - color: #fff; -} -.uk-contrast .uk-nav-side .uk-nav-divider { - border-top-color: rgba(255, 255, 255, 0.2); -} -.uk-contrast .uk-nav-side ul a { - color: rgba(255, 255, 255, 0.7); -} -.uk-contrast .uk-nav-side ul a:hover { - color: #fff; -} -.uk-contrast .uk-subnav > * > a { - color: rgba(255, 255, 255, 0.7); - text-decoration: none; -} -.uk-contrast .uk-subnav > * > a:hover, -.uk-contrast .uk-subnav > * > a:focus { - color: #fff; - text-decoration: none; -} -.uk-contrast .uk-subnav > .uk-active > a { - color: #fff; -} -.uk-contrast .uk-subnav-line > :nth-child(n+2):before { - border-left-color: rgba(255, 255, 255, 0.2); -} -.uk-contrast .uk-subnav-pill > * > a:hover, -.uk-contrast .uk-subnav-pill > * > a:focus { - background: rgba(255, 255, 255, 0.7); - color: #444; - text-decoration: none; -} -.uk-contrast .uk-subnav-pill > .uk-active > a { - background: #fff; - color: #444; -} -.uk-contrast .uk-tab { - border-bottom-color: rgba(255, 255, 255, 0.2); -} -.uk-contrast .uk-tab > li > a { - border-color: transparent; - color: rgba(255, 255, 255, 0.7); -} -.uk-contrast .uk-tab > li > a:hover, -.uk-contrast .uk-tab > li > a:focus, -.uk-contrast .uk-tab > li.uk-open > a { - border-color: rgba(255, 255, 255, 0.7); - background: rgba(255, 255, 255, 0.7); - color: #444; - text-decoration: none; -} -.uk-contrast .uk-tab > li.uk-active > a { - border-color: rgba(255, 255, 255, 0.2); - border-bottom-color: transparent; - background: #fff; - color: #444; -} -.uk-contrast .uk-tab-center { - border-bottom-color: rgba(255, 255, 255, 0.2); -} -.uk-contrast .uk-tab-grid:before { - border-top-color: rgba(255, 255, 255, 0.2); -} -.uk-contrast .uk-list-line > li:nth-child(n+2) { - border-top-color: rgba(255, 255, 255, 0.2); -} -.uk-contrast .uk-form select, -.uk-contrast .uk-form textarea, -.uk-contrast .uk-form input:not([type]), -.uk-contrast .uk-form input[type="text"], -.uk-contrast .uk-form input[type="password"], -.uk-contrast .uk-form input[type="datetime"], -.uk-contrast .uk-form input[type="datetime-local"], -.uk-contrast .uk-form input[type="date"], -.uk-contrast .uk-form input[type="month"], -.uk-contrast .uk-form input[type="time"], -.uk-contrast .uk-form input[type="week"], -.uk-contrast .uk-form input[type="number"], -.uk-contrast .uk-form input[type="email"], -.uk-contrast .uk-form input[type="url"], -.uk-contrast .uk-form input[type="search"], -.uk-contrast .uk-form input[type="tel"], -.uk-contrast .uk-form input[type="color"] { - border-color: rgba(255, 255, 255, 0.8); - background: rgba(255, 255, 255, 0.8); - color: #444; - background-clip: padding-box; -} -.uk-contrast .uk-form select:focus, -.uk-contrast .uk-form textarea:focus, -.uk-contrast .uk-form input:not([type]):focus, -.uk-contrast .uk-form input[type="text"]:focus, -.uk-contrast .uk-form input[type="password"]:focus, -.uk-contrast .uk-form input[type="datetime"]:focus, -.uk-contrast .uk-form input[type="datetime-local"]:focus, -.uk-contrast .uk-form input[type="date"]:focus, -.uk-contrast .uk-form input[type="month"]:focus, -.uk-contrast .uk-form input[type="time"]:focus, -.uk-contrast .uk-form input[type="week"]:focus, -.uk-contrast .uk-form input[type="number"]:focus, -.uk-contrast .uk-form input[type="email"]:focus, -.uk-contrast .uk-form input[type="url"]:focus, -.uk-contrast .uk-form input[type="search"]:focus, -.uk-contrast .uk-form input[type="tel"]:focus, -.uk-contrast .uk-form input[type="color"]:focus { - border-color: #fff; - background: #fff; - color: #444; -} -.uk-contrast .uk-form :-ms-input-placeholder { - color: rgba(68, 68, 68, 0.7) !important; -} -.uk-contrast .uk-form ::-moz-placeholder { - color: rgba(68, 68, 68, 0.7); -} -.uk-contrast .uk-form ::-webkit-input-placeholder { - color: rgba(68, 68, 68, 0.7); -} -.uk-contrast .uk-button { - color: #444; - background: #fff; -} -.uk-contrast .uk-button:hover, -.uk-contrast .uk-button:focus { - background-color: rgba(255, 255, 255, 0.8); - color: #444; -} -.uk-contrast .uk-button:active, -.uk-contrast .uk-button.uk-active { - background-color: rgba(255, 255, 255, 0.7); - color: #444; -} -.uk-contrast .uk-button-primary { - background-color: #00a8e6; - color: #fff; -} -.uk-contrast .uk-button-primary:hover, -.uk-contrast .uk-button-primary:focus { - background-color: #35b3ee; - color: #fff; -} -.uk-contrast .uk-button-primary:active, -.uk-contrast .uk-button-primary.uk-active { - background-color: #0091ca; - color: #fff; -} -.uk-contrast .uk-icon-hover { - color: rgba(255, 255, 255, 0.7); -} -.uk-contrast .uk-icon-hover:hover { - color: #fff; -} -.uk-contrast .uk-icon-button { - background: #fff; - color: #444; -} -.uk-contrast .uk-icon-button:hover, -.uk-contrast .uk-icon-button:focus { - background-color: rgba(255, 255, 255, 0.8); - color: #444; -} -.uk-contrast .uk-icon-button:active { - background-color: rgba(255, 255, 255, 0.7); - color: #444; -} -.uk-contrast .uk-text-muted { - color: rgba(255, 255, 255, 0.6) !important; -} -.uk-contrast .uk-text-primary { - color: #2d7091 !important; -} -/* ======================================================================== - Component: Print - ========================================================================== */ -@media print { - *, - *:before, - *:after { - background: transparent !important; - color: black !important; - box-shadow: none !important; - text-shadow: none !important; - } - a, - a:visited { - text-decoration: underline; - } - pre, - blockquote { - border: 1px solid #999; - page-break-inside: avoid; - } - thead { - display: table-header-group; - } - tr, - img { - page-break-inside: avoid; - } - img { - max-width: 100% !important; - } - @page { - margin: 0.5cm; - } - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - h2, - h3 { - page-break-after: avoid; - } -} diff --git a/packages/test-data/css/_main/import-remote.css b/packages/test-data/css/_main/import-remote.css index 23ef8dbcc..e32befca0 100644 --- a/packages/test-data/css/_main/import-remote.css +++ b/packages/test-data/css/_main/import-remote.css @@ -1,3 +1,3 @@ .test { - color: blue; + color: 42; } diff --git a/packages/test-data/css/math/parens-division/mixins-args.css b/packages/test-data/css/math/parens-division/mixins-args.css index ca82850f1..82407441e 100644 --- a/packages/test-data/css/math/parens-division/mixins-args.css +++ b/packages/test-data/css/math/parens-division/mixins-args.css @@ -16,11 +16,6 @@ height: 49%; depth: 49%; } -.no-parens { - width: 5px; - height: 49%; - depth: 49%; -} .no-args { width: 5px; height: 49%; diff --git a/packages/test-data/css/math/strict/mixins-args.css b/packages/test-data/css/math/strict/mixins-args.css index 138ce0ae3..78ce9a85d 100644 --- a/packages/test-data/css/math/strict/mixins-args.css +++ b/packages/test-data/css/math/strict/mixins-args.css @@ -16,11 +16,6 @@ height: 49%; depth: 50% - 1%; } -.no-parens { - width: 5px; - height: 49%; - depth: 50% - 1%; -} .no-args { width: 5px; height: 49%; diff --git a/packages/test-data/errors/eval/mixin-not-visible-in-scope-1.less b/packages/test-data/errors/eval/mixin-not-visible-in-scope-1.less index 2842613ef..4ba2e3a49 100644 --- a/packages/test-data/errors/eval/mixin-not-visible-in-scope-1.less +++ b/packages/test-data/errors/eval/mixin-not-visible-in-scope-1.less @@ -4,6 +4,6 @@ } & { - .b {.a} // was Err. before 1.6.2 + .b {.a()} // was Err. before 1.6.2 } } \ No newline at end of file diff --git a/packages/test-data/errors/eval/mixin-not-visible-in-scope-1.txt b/packages/test-data/errors/eval/mixin-not-visible-in-scope-1.txt index 15e64dc20..1d8b96cef 100644 --- a/packages/test-data/errors/eval/mixin-not-visible-in-scope-1.txt +++ b/packages/test-data/errors/eval/mixin-not-visible-in-scope-1.txt @@ -1,4 +1,4 @@ NameError: .a is undefined in {path}mixin-not-visible-in-scope-1.less on line 7, column 13: 6 & { -7 .b {.a} // was Err. before 1.6.2 +7 .b {.a()} // was Err. before 1.6.2 8 } diff --git a/packages/test-data/less/3rd-party/uikit.less b/packages/test-data/less/3rd-party/uikit.less deleted file mode 100644 index b8ac9a70a..000000000 --- a/packages/test-data/less/3rd-party/uikit.less +++ /dev/null @@ -1 +0,0 @@ -@import "uikit/src/less/uikit"; \ No newline at end of file diff --git a/packages/test-data/less/_main/css-escapes.less b/packages/test-data/less/_main/css-escapes.less index a132f39f4..cf42940e7 100644 --- a/packages/test-data/less/_main/css-escapes.less +++ b/packages/test-data/less/_main/css-escapes.less @@ -14,7 +14,7 @@ strong { color: @ugly; - .mixin\!tUp; + .mixin\!tUp(); } } diff --git a/packages/test-data/less/_main/directives-bubling.less b/packages/test-data/less/_main/directives-bubling.less index be3523869..8217ecc36 100644 --- a/packages/test-data/less/_main/directives-bubling.less +++ b/packages/test-data/less/_main/directives-bubling.less @@ -122,7 +122,7 @@ } html { - .nestedSupportsMixin; + .nestedSupportsMixin(); } // selectors should not propagate into all directive types diff --git a/packages/test-data/less/_main/extract-and-length.less b/packages/test-data/less/_main/extract-and-length.less index d064bdb9d..8de68d1e8 100644 --- a/packages/test-data/less/_main/extract-and-length.less +++ b/packages/test-data/less/_main/extract-and-length.less @@ -5,12 +5,12 @@ .a(@i: length(@cols)) when (@i > 0) { @divider: e(extract(@cols, @i)); } -.a; +.a(); .b(@j: 1) when (@j < length(@cols)) { @divider: e(extract(@cols, @j)); } -.b; +.b(); // simple array/list: diff --git a/packages/test-data/less/_main/import-remote.less b/packages/test-data/less/_main/import-remote.less index 6e2a947cf..b7f1b6350 100644 --- a/packages/test-data/less/_main/import-remote.less +++ b/packages/test-data/less/_main/import-remote.less @@ -1,8 +1,8 @@ // https://github.com/less/less.js/issues/3541 @import (reference) url(https://cdn.jsdelivr.net/npm/@less/test-data/less/_main/selectors.less); -@import (reference) url("https://cdn.jsdelivr.net/npm/@less/test-data/less/_main/scope.less"); +@import (reference) url("https://cdn.jsdelivr.net/npm/@less/test-data/less/_main/media.less"); @import (reference) url("https://cdn.jsdelivr.net/npm/@less/test-data/less/_main/empty.less?arg"); .test { - color: @x; + color: @var; } \ No newline at end of file diff --git a/packages/test-data/less/_main/import.less b/packages/test-data/less/_main/import.less index 2b0d19ed5..e7d175692 100644 --- a/packages/test-data/less/_main/import.less +++ b/packages/test-data/less/_main/import.less @@ -9,7 +9,7 @@ @import url("//ha.com/file.css") (min-width:@var); #import-test { - .mixin; + .mixin(); width: 10px; height: (@a + 10%); value: pi-anon(); diff --git a/packages/test-data/less/_main/import/import-and-relative-paths-test.less b/packages/test-data/less/_main/import/import-and-relative-paths-test.less index d6256c6b8..6d8286b55 100644 --- a/packages/test-data/less/_main/import/import-and-relative-paths-test.less +++ b/packages/test-data/less/_main/import/import-and-relative-paths-test.less @@ -12,6 +12,6 @@ } #imported-relative-path { - .unquoted-relative-path-bg; - .quoted-relative-path-border-image; + .unquoted-relative-path-bg(); + .quoted-relative-path-border-image(); } \ No newline at end of file diff --git a/packages/test-data/less/_main/mixins-closure.less b/packages/test-data/less/_main/mixins-closure.less index 26c8b6e90..d60378f9b 100644 --- a/packages/test-data/less/_main/mixins-closure.less +++ b/packages/test-data/less/_main/mixins-closure.less @@ -6,12 +6,12 @@ } .class { - .scope > .mixin; + .scope > .mixin(); } .overwrite { @var: 0px; - .scope > .mixin; + .scope > .mixin(); } .nested { @@ -21,6 +21,6 @@ } .class { @var: 10px; - .mixin; + .mixin(); } } diff --git a/packages/test-data/less/_main/mixins-guards.less b/packages/test-data/less/_main/mixins-guards.less index 338ece786..6a88f52cd 100644 --- a/packages/test-data/less/_main/mixins-guards.less +++ b/packages/test-data/less/_main/mixins-guards.less @@ -60,7 +60,7 @@ .default (@a: inherit) when (@a = inherit) { content: default; } -.default1 { .default } +.default1 { .default() } // true & false keywords .test-rule (@a) when (@a) { @@ -94,7 +94,7 @@ .bool () when not (true) and not (true) { content: not true and not true } .bool () when not (false) and (false), not (false) { content: not false and false, not false } -.bool1 { .bool } +.bool1 { .bool() } .equality-unit-test(@num) when (@num = 1%) { test: fail; diff --git a/packages/test-data/less/_main/mixins-important.less b/packages/test-data/less/_main/mixins-important.less index ecdb29234..0733db6af 100644 --- a/packages/test-data/less/_main/mixins-important.less +++ b/packages/test-data/less/_main/mixins-important.less @@ -20,7 +20,7 @@ .mixin(3); .mixin(4) !important; .mixin(5); - .mixin !important; + .mixin() !important; .mixin(9); } .size(@aaa: auto) { diff --git a/packages/test-data/less/_main/mixins-interpolated.less b/packages/test-data/less/_main/mixins-interpolated.less index b79fa89a6..4be88c991 100644 --- a/packages/test-data/less/_main/mixins-interpolated.less +++ b/packages/test-data/less/_main/mixins-interpolated.less @@ -25,9 +25,9 @@ } mi-test-a { - .123; - .foo; - #foo; + .123(); + .foo(); + #foo(); } .b .bb { @@ -39,7 +39,7 @@ mi-test-a { } mi-test-b { - .b.bb.foo-xxx.yyy-foo#foo.foo.bbb; + .b.bb.foo-xxx.yyy-foo#foo.foo.bbb(); } @c1: @a1; @@ -55,9 +55,9 @@ mi-test-b { } mi-test-c { - &-1 {#foo-foo;} - &-2 {#foo-foo > .bar;} - &-3 {#foo-foo > .bar.baz;} + &-1 {#foo-foo();} + &-2 {#foo-foo > .bar();} + &-3 {#foo-foo > .bar.baz();} } .Person(@name, @gender_) { diff --git a/packages/test-data/less/_main/mixins.less b/packages/test-data/less/_main/mixins.less index 7ffa9dacc..b887c860d 100644 --- a/packages/test-data/less/_main/mixins.less +++ b/packages/test-data/less/_main/mixins.less @@ -21,30 +21,30 @@ } #container { color: black; - .mixin; - .mixout; - #theme > .mixin; + .mixin(); + .mixout(); + #theme > .mixin(); } #header { .milk { color: inherit; - .mixin; - #theme > .mixin; + .mixin(); + #theme > .mixin(); } #cookie { .chips { - #namespace .borders; + #namespace .borders(); .calories { - #container; + #container(); } } - .borders; + .borders(); } } -.secure-zone { #namespace .biohazard .man; } +.secure-zone { #namespace .biohazard .man(); } .direct { - #namespace > .borders; + #namespace > .borders(); } .bo, .bar { @@ -71,11 +71,11 @@ } } .extended { - .bo; - .jo.ki; - .amp.support; - .amp.support.higher; - .amp.support.deeper; + .bo(); + .jo.ki(); + .amp.support(); + .amp.support.higher(); + .amp.support.deeper(); } .do .re .mi .fa { .sol .la { @@ -85,10 +85,10 @@ } } .mutli-selector-parents { - .do.re.mi.fa.sol.la.si; + .do.re.mi.fa.sol.la.si(); } .foo .bar { - .bar; + .bar(); } .has_parents() { & .underParents { diff --git a/packages/test-data/less/_main/scope.less b/packages/test-data/less/_main/scope.less index 13d01a170..5cdcc74bc 100644 --- a/packages/test-data/less/_main/scope.less +++ b/packages/test-data/less/_main/scope.less @@ -9,7 +9,7 @@ @mix: blue; .tiny-scope { color: @mix; // #989 - .mixin; + .mixin(); } .scope1 { @@ -57,7 +57,7 @@ } .importRuleset(); .testImported { - .imported; + .imported(); } @parameterDefault: 'top level'; diff --git a/packages/test-data/less/_main/urls.less b/packages/test-data/less/_main/urls.less index 244488bfc..73de12b63 100644 --- a/packages/test-data/less/_main/urls.less +++ b/packages/test-data/less/_main/urls.less @@ -39,8 +39,8 @@ @import "import/import-and-relative-paths-test"; #relative-url-import { - .unquoted-relative-path-bg; - .quoted-relative-path-border-image; + .unquoted-relative-path-bg(); + .quoted-relative-path-border-image(); } #data-uri { diff --git a/packages/test-data/less/math/parens-division/mixins-args.less b/packages/test-data/less/math/parens-division/mixins-args.less index fe006de9e..d4749ac1f 100644 --- a/packages/test-data/less/math/parens-division/mixins-args.less +++ b/packages/test-data/less/math/parens-division/mixins-args.less @@ -19,7 +19,7 @@ } #hidden { - .hidden; + .hidden(); } #hidden1 { @@ -36,10 +36,6 @@ .mixin(3px); } -.no-parens { - .mixin; -} - .no-args { .mixin(); } @@ -98,7 +94,7 @@ body { @var: 10px; width: @var; } -#var-inside { .var-inside; } +#var-inside { .var-inside(); } .mixin-arguments (@width: 0px, ...) { border: @arguments; @@ -112,7 +108,7 @@ body { .mixin-arguments(); } .arguments3 { - .mixin-arguments; + .mixin-arguments(); } .mixin-arguments2 (@width, @rest...) { diff --git a/packages/test-data/less/math/strict/mixins-args.less b/packages/test-data/less/math/strict/mixins-args.less index fe006de9e..d4749ac1f 100644 --- a/packages/test-data/less/math/strict/mixins-args.less +++ b/packages/test-data/less/math/strict/mixins-args.less @@ -19,7 +19,7 @@ } #hidden { - .hidden; + .hidden(); } #hidden1 { @@ -36,10 +36,6 @@ .mixin(3px); } -.no-parens { - .mixin; -} - .no-args { .mixin(); } @@ -98,7 +94,7 @@ body { @var: 10px; width: @var; } -#var-inside { .var-inside; } +#var-inside { .var-inside(); } .mixin-arguments (@width: 0px, ...) { border: @arguments; @@ -112,7 +108,7 @@ body { .mixin-arguments(); } .arguments3 { - .mixin-arguments; + .mixin-arguments(); } .mixin-arguments2 (@width, @rest...) { diff --git a/packages/test-data/less/namespacing/namespacing-4.less b/packages/test-data/less/namespacing/namespacing-4.less index cbd32a277..bf003a621 100644 --- a/packages/test-data/less/namespacing/namespacing-4.less +++ b/packages/test-data/less/namespacing/namespacing-4.less @@ -26,7 +26,7 @@ } .foo { - .colors() { #library.core.colors; } + .colors() { #library.core.colors(); } width: .alias[@a]; background: .colors[primary]; color: .colors[foreground]; From 93a2ac088e2ca6a1c036344783f8e675ebc7eade Mon Sep 17 00:00:00 2001 From: Matthew Dean Date: Sun, 2 Aug 2020 12:22:02 -0700 Subject: [PATCH 04/19] Output invalid JS functions in CSS --- packages/less/src/less/tree/call.js | 45 ++++++++------------ packages/test-data/css/_main/functions.css | 1 + packages/test-data/less/_main/functions.less | 1 + 3 files changed, 19 insertions(+), 28 deletions(-) diff --git a/packages/less/src/less/tree/call.js b/packages/less/src/less/tree/call.js index f94af57fa..ba820a995 100644 --- a/packages/less/src/less/tree/call.js +++ b/packages/less/src/less/tree/call.js @@ -1,6 +1,7 @@ import Node from './node'; import Anonymous from './anonymous'; import FunctionCaller from '../functions/function-caller'; +import logger from '../logger'; // // A function call node. @@ -56,36 +57,24 @@ class Call extends Node { if (funcCaller.isValid()) { try { result = funcCaller.call(this.args); - exitCalc(); - } catch (e) { - if (e.hasOwnProperty('line') && e.hasOwnProperty('column')) { - throw e - } - throw { - type: e.type || 'Runtime', - message: `error evaluating function \`${this.name}\`${e.message ? `: ${e.message}` : ''}`, - index: this.getIndex(), - filename: this.fileInfo().filename, - line: e.lineNumber, - column: e.columnNumber - }; - } - - if (result !== null && result !== undefined) { - // Results that that are not nodes are cast as Anonymous nodes - // Falsy values or booleans are returned as empty nodes - if (!(result instanceof Node)) { - if (!result || result === true) { - result = new Anonymous(null); - } - else { - result = new Anonymous(result.toString()); + if (result !== null && result !== undefined) { + exitCalc(); + // Results that that are not nodes are cast as Anonymous nodes + // Falsy values or booleans are returned as empty nodes + if (!(result instanceof Node)) { + if (!result || result === true) { + result = new Anonymous(null); + } + else { + result = new Anonymous(result.toString()); + } } - + result._index = this._index; + result._fileInfo = this._fileInfo; + return result; } - result._index = this._index; - result._fileInfo = this._fileInfo; - return result; + } catch (e) { + logger.warn(`Could not evaluate function '${this.name}'. Will output as-is.`); } } diff --git a/packages/test-data/css/_main/functions.css b/packages/test-data/css/_main/functions.css index 99323620e..5722baa34 100644 --- a/packages/test-data/css/_main/functions.css +++ b/packages/test-data/css/_main/functions.css @@ -111,6 +111,7 @@ min: 3mm; max: 3; max: 5em; + max-native: max(10vw, 100px); percentage: 20%; color-quoted-digit: #dda0dd; color-quoted-keyword: #dda0dd; diff --git a/packages/test-data/less/_main/functions.less b/packages/test-data/less/_main/functions.less index f6db3b41c..b541e55ba 100644 --- a/packages/test-data/less/_main/functions.less +++ b/packages/test-data/less/_main/functions.less @@ -118,6 +118,7 @@ min: min(1cm, 3mm); max: max(1, 3); max: max(3em, 1em, 2em, 5em); + max-native: max(10vw, 100px); percentage: percentage((10px / 50)); color-quoted-digit: color("#dda0dd"); color-quoted-keyword: color("plum"); From cf86f242f7a2739b1d2400082d26e887640062ec Mon Sep 17 00:00:00 2001 From: Matthew Dean Date: Mon, 31 Aug 2020 19:49:32 -0700 Subject: [PATCH 05/19] Escape parens and revert pass-through function errors --- packages/less/src/less/functions/list.js | 7 +++ packages/less/src/less/functions/number.js | 8 +++- packages/less/src/less/parser/parser.js | 2 +- packages/less/src/less/tree/call.js | 46 ++++++++++++------- .../less/src/less/visitors/to-css-visitor.js | 2 +- packages/test-data/css/_main/functions.css | 9 ++++ .../eval/color-func-invalid-color-2.txt | 2 +- .../errors/eval/color-func-invalid-color.txt | 2 +- .../errors/eval/css-guard-default-func.txt | 2 +- .../test-data/errors/eval/functions-1.txt | 2 +- .../errors/eval/functions-4-call.txt | 2 +- .../eval/percentage-non-number-argument.txt | 2 +- .../errors/eval/recursive-variable.txt | 2 +- .../errors/eval/root-func-undefined-1.txt | 2 +- .../errors/eval/root-func-undefined-2.txt | 2 +- .../test-data/errors/eval/svg-gradient1.txt | 2 +- .../test-data/errors/eval/svg-gradient2.txt | 2 +- .../test-data/errors/eval/svg-gradient3.txt | 2 +- .../test-data/errors/eval/svg-gradient4.txt | 2 +- .../test-data/errors/eval/svg-gradient5.txt | 2 +- .../test-data/errors/eval/svg-gradient6.txt | 2 +- .../test-data/errors/eval/unit-function.txt | 2 +- packages/test-data/less/_main/functions.less | 14 ++++++ 23 files changed, 83 insertions(+), 37 deletions(-) diff --git a/packages/less/src/less/functions/list.js b/packages/less/src/less/functions/list.js index 1463a5232..98a4c72c9 100644 --- a/packages/less/src/less/functions/list.js +++ b/packages/less/src/less/functions/list.js @@ -7,6 +7,7 @@ import Ruleset from '../tree/ruleset'; import Selector from '../tree/selector'; import Element from '../tree/element'; import Quote from '../tree/quoted'; +import Value from '../tree/value'; const getItemsFromNode = node => { // handle non-array values as an array of length 1 @@ -21,6 +22,12 @@ export default { _SELF: function(n) { return n; }, + '~': function(...expr) { + if (expr.length === 1) { + return expr[0]; + } + return new Value(expr); + }, extract: function(values, index) { // (1-based index) index = index.value - 1; diff --git a/packages/less/src/less/functions/number.js b/packages/less/src/less/functions/number.js index 2575c9288..f01689472 100644 --- a/packages/less/src/less/functions/number.js +++ b/packages/less/src/less/functions/number.js @@ -57,10 +57,14 @@ const minMax = function (isMin, args) { export default { min: function(...args) { - return minMax(true, args); + try { + return minMax(true, args); + } catch (e) {} }, max: function(...args) { - return minMax(false, args); + try { + return minMax(false, args); + } catch (e) {} }, convert: function (val, unit) { return val.convertTo(unit.value); diff --git a/packages/less/src/less/parser/parser.js b/packages/less/src/less/parser/parser.js index 91db608aa..6b8ab9a80 100644 --- a/packages/less/src/less/parser/parser.js +++ b/packages/less/src/less/parser/parser.js @@ -421,7 +421,7 @@ const Parser = function Parser(context, imports, fileInfo) { parserInput.save(); - name = parserInput.$re(/^([\w-]+|%|progid:[\w\.]+)\(/); + name = parserInput.$re(/^([\w-]+|%|~|progid:[\w\.]+)\(/); if (!name) { parserInput.forget(); return; diff --git a/packages/less/src/less/tree/call.js b/packages/less/src/less/tree/call.js index ba820a995..e09062764 100644 --- a/packages/less/src/less/tree/call.js +++ b/packages/less/src/less/tree/call.js @@ -57,25 +57,37 @@ class Call extends Node { if (funcCaller.isValid()) { try { result = funcCaller.call(this.args); - if (result !== null && result !== undefined) { - exitCalc(); - // Results that that are not nodes are cast as Anonymous nodes - // Falsy values or booleans are returned as empty nodes - if (!(result instanceof Node)) { - if (!result || result === true) { - result = new Anonymous(null); - } - else { - result = new Anonymous(result.toString()); - } - } - result._index = this._index; - result._fileInfo = this._fileInfo; - return result; - } + exitCalc(); } catch (e) { - logger.warn(`Could not evaluate function '${this.name}'. Will output as-is.`); + if (e.hasOwnProperty('line') && e.hasOwnProperty('column')) { + throw e; + } + throw { + type: e.type || 'Runtime', + message: `Error evaluating function \`${this.name}\`${e.message ? `: ${e.message}` : ''}`, + index: this.getIndex(), + filename: this.fileInfo().filename, + line: e.lineNumber, + column: e.columnNumber + }; + } + } + + if (result !== null && result !== undefined) { + // Results that that are not nodes are cast as Anonymous nodes + // Falsy values or booleans are returned as empty nodes + if (!(result instanceof Node)) { + if (!result || result === true) { + result = new Anonymous(null); + } + else { + result = new Anonymous(result.toString()); + } + } + result._index = this._index; + result._fileInfo = this._fileInfo; + return result; } const args = this.args.map(a => a.eval(context)); diff --git a/packages/less/src/less/visitors/to-css-visitor.js b/packages/less/src/less/visitors/to-css-visitor.js index 0761b4675..d49987ea7 100644 --- a/packages/less/src/less/visitors/to-css-visitor.js +++ b/packages/less/src/less/visitors/to-css-visitor.js @@ -207,7 +207,7 @@ ToCSSVisitor.prototype = { index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename}; } if (ruleNode instanceof tree.Call) { - throw { message: `Function '${ruleNode.name}' is undefined`, + throw { message: `Function '${ruleNode.name}' did not return a root node`, index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename}; } if (ruleNode.type && !ruleNode.allowRoot) { diff --git a/packages/test-data/css/_main/functions.css b/packages/test-data/css/_main/functions.css index 5722baa34..83a8e85af 100644 --- a/packages/test-data/css/_main/functions.css +++ b/packages/test-data/css/_main/functions.css @@ -233,3 +233,12 @@ html { color: green; color: purple; } +.paren-escapes { + list-1: 1, 2, 3; + length-1: 3; + item-1: 4; + item-2: 5; + item-3: 6; + list-2: 1, 2, 3; + list-3: 7, 8, 9; +} diff --git a/packages/test-data/errors/eval/color-func-invalid-color-2.txt b/packages/test-data/errors/eval/color-func-invalid-color-2.txt index 39dd5887c..4f5701761 100644 --- a/packages/test-data/errors/eval/color-func-invalid-color-2.txt +++ b/packages/test-data/errors/eval/color-func-invalid-color-2.txt @@ -1,3 +1,3 @@ -RuntimeError: error evaluating function `darken`: Argument cannot be evaluated to a color in {path}color-func-invalid-color-2.less on line 2, column 14: +RuntimeError: Error evaluating function `darken`: Argument cannot be evaluated to a color in {path}color-func-invalid-color-2.less on line 2, column 14: 1 // https://github.com/less/less.js/issues/3338 2 @base-color: darken(var(--baseColor, red), 50%); diff --git a/packages/test-data/errors/eval/color-func-invalid-color.txt b/packages/test-data/errors/eval/color-func-invalid-color.txt index c96013034..a5a7a112a 100644 --- a/packages/test-data/errors/eval/color-func-invalid-color.txt +++ b/packages/test-data/errors/eval/color-func-invalid-color.txt @@ -1,4 +1,4 @@ -ArgumentError: error evaluating function `color`: argument must be a color keyword or 3|4|6|8 digit hex e.g. #FFF in {path}color-func-invalid-color.less on line 2, column 10: +ArgumentError: Error evaluating function `color`: argument must be a color keyword or 3|4|6|8 digit hex e.g. #FFF in {path}color-func-invalid-color.less on line 2, column 10: 1 .test-rule { 2 color: color("NOT A COLOR"); 3 } diff --git a/packages/test-data/errors/eval/css-guard-default-func.txt b/packages/test-data/errors/eval/css-guard-default-func.txt index 022f5222e..4b101d81a 100644 --- a/packages/test-data/errors/eval/css-guard-default-func.txt +++ b/packages/test-data/errors/eval/css-guard-default-func.txt @@ -1,4 +1,4 @@ -SyntaxError: error evaluating function `default`: it is currently only allowed in parametric mixin guards, in {path}css-guard-default-func.less on line 2, column 16: +SyntaxError: Error evaluating function `default`: it is currently only allowed in parametric mixin guards, in {path}css-guard-default-func.less on line 2, column 16: 1 2 selector when (default()) { 3 color: red; diff --git a/packages/test-data/errors/eval/functions-1.txt b/packages/test-data/errors/eval/functions-1.txt index d029986ee..66696123d 100644 --- a/packages/test-data/errors/eval/functions-1.txt +++ b/packages/test-data/errors/eval/functions-1.txt @@ -1,3 +1,3 @@ -SyntaxError: Function 'test-undefined' is undefined in {path}functions-1.less on line 2, column 1: +SyntaxError: Function 'test-undefined' did not return a root node in {path}functions-1.less on line 2, column 1: 1 @plugin "../../plugin/plugin-tree-nodes"; 2 test-undefined(); diff --git a/packages/test-data/errors/eval/functions-4-call.txt b/packages/test-data/errors/eval/functions-4-call.txt index 3d57bc0f2..4144723f9 100644 --- a/packages/test-data/errors/eval/functions-4-call.txt +++ b/packages/test-data/errors/eval/functions-4-call.txt @@ -1,3 +1,3 @@ -SyntaxError: Function 'foo' is undefined in {path}functions-4-call.less on line 2, column 1: +SyntaxError: Function 'foo' did not return a root node in {path}functions-4-call.less on line 2, column 1: 1 @plugin "../../plugin/plugin-tree-nodes"; 2 test-call(); diff --git a/packages/test-data/errors/eval/percentage-non-number-argument.txt b/packages/test-data/errors/eval/percentage-non-number-argument.txt index f01a1e546..c96dfca79 100644 --- a/packages/test-data/errors/eval/percentage-non-number-argument.txt +++ b/packages/test-data/errors/eval/percentage-non-number-argument.txt @@ -1,4 +1,4 @@ -ArgumentError: error evaluating function `percentage`: argument must be a number in {path}percentage-non-number-argument.less on line 2, column 15: +ArgumentError: Error evaluating function `percentage`: argument must be a number in {path}percentage-non-number-argument.less on line 2, column 15: 1 div { 2 percentage: percentage(16/17); 3 } diff --git a/packages/test-data/errors/eval/recursive-variable.txt b/packages/test-data/errors/eval/recursive-variable.txt index b8bd6fdd9..9e7e22542 100644 --- a/packages/test-data/errors/eval/recursive-variable.txt +++ b/packages/test-data/errors/eval/recursive-variable.txt @@ -1,2 +1,2 @@ -NameError: error evaluating function `darken`: Recursive variable definition for @bodyColor in {path}recursive-variable.less on line 1, column 13: +NameError: Error evaluating function `darken`: Recursive variable definition for @bodyColor in {path}recursive-variable.less on line 1, column 13: 1 @bodyColor: darken(@bodyColor, 30%); diff --git a/packages/test-data/errors/eval/root-func-undefined-1.txt b/packages/test-data/errors/eval/root-func-undefined-1.txt index a07480e61..563725a27 100644 --- a/packages/test-data/errors/eval/root-func-undefined-1.txt +++ b/packages/test-data/errors/eval/root-func-undefined-1.txt @@ -1,2 +1,2 @@ -SyntaxError: Function 'func' is undefined in {path}root-func-undefined-1.less on line 1, column 1: +SyntaxError: Function 'func' did not return a root node in {path}root-func-undefined-1.less on line 1, column 1: 1 func(); diff --git a/packages/test-data/errors/eval/root-func-undefined-2.txt b/packages/test-data/errors/eval/root-func-undefined-2.txt index 4c88b97d9..d553673ef 100644 --- a/packages/test-data/errors/eval/root-func-undefined-2.txt +++ b/packages/test-data/errors/eval/root-func-undefined-2.txt @@ -1,3 +1,3 @@ -SyntaxError: Function 'test-undefined' is undefined in {path}root-func-undefined-2.less on line 2, column 1: +SyntaxError: Function 'test-undefined' did not return a root node in {path}root-func-undefined-2.less on line 2, column 1: 1 @plugin "../../plugin/plugin-tree-nodes.js"; 2 test-undefined(); diff --git a/packages/test-data/errors/eval/svg-gradient1.txt b/packages/test-data/errors/eval/svg-gradient1.txt index ec662fe60..65ed9af7c 100644 --- a/packages/test-data/errors/eval/svg-gradient1.txt +++ b/packages/test-data/errors/eval/svg-gradient1.txt @@ -1,4 +1,4 @@ -ArgumentError: error evaluating function `svg-gradient`: svg-gradient direction must be 'to bottom', 'to right', 'to bottom right', 'to top right' or 'ellipse at center' in {path}svg-gradient1.less on line 2, column 6: +ArgumentError: Error evaluating function `svg-gradient`: svg-gradient direction must be 'to bottom', 'to right', 'to bottom right', 'to top right' or 'ellipse at center' in {path}svg-gradient1.less on line 2, column 6: 1 .a { 2 a: svg-gradient(horizontal, black, white); 3 } diff --git a/packages/test-data/errors/eval/svg-gradient2.txt b/packages/test-data/errors/eval/svg-gradient2.txt index 1f2e1bfc9..45548cbc3 100644 --- a/packages/test-data/errors/eval/svg-gradient2.txt +++ b/packages/test-data/errors/eval/svg-gradient2.txt @@ -1,4 +1,4 @@ -ArgumentError: error evaluating function `svg-gradient`: svg-gradient expects direction, start_color [start_position], [color position,]..., end_color [end_position] or direction, color list in {path}svg-gradient2.less on line 2, column 6: +ArgumentError: Error evaluating function `svg-gradient`: svg-gradient expects direction, start_color [start_position], [color position,]..., end_color [end_position] or direction, color list in {path}svg-gradient2.less on line 2, column 6: 1 .a { 2 a: svg-gradient(to bottom, black, orange, 45%, white); 3 } diff --git a/packages/test-data/errors/eval/svg-gradient3.txt b/packages/test-data/errors/eval/svg-gradient3.txt index f77a353ac..9a19a74f9 100644 --- a/packages/test-data/errors/eval/svg-gradient3.txt +++ b/packages/test-data/errors/eval/svg-gradient3.txt @@ -1,4 +1,4 @@ -ArgumentError: error evaluating function `svg-gradient`: svg-gradient direction must be 'to bottom', 'to right', 'to bottom right', 'to top right' or 'ellipse at center' in {path}svg-gradient3.less on line 2, column 6: +ArgumentError: Error evaluating function `svg-gradient`: svg-gradient direction must be 'to bottom', 'to right', 'to bottom right', 'to top right' or 'ellipse at center' in {path}svg-gradient3.less on line 2, column 6: 1 .a { 2 a: svg-gradient(black, orange); 3 } diff --git a/packages/test-data/errors/eval/svg-gradient4.txt b/packages/test-data/errors/eval/svg-gradient4.txt index c0d41e94f..102d03c8c 100644 --- a/packages/test-data/errors/eval/svg-gradient4.txt +++ b/packages/test-data/errors/eval/svg-gradient4.txt @@ -1,4 +1,4 @@ -ArgumentError: error evaluating function `svg-gradient`: svg-gradient direction must be 'to bottom', 'to right', 'to bottom right', 'to top right' or 'ellipse at center' in {path}svg-gradient4.less on line 2, column 6: +ArgumentError: Error evaluating function `svg-gradient`: svg-gradient direction must be 'to bottom', 'to right', 'to bottom right', 'to top right' or 'ellipse at center' in {path}svg-gradient4.less on line 2, column 6: 1 .a { 2 a: svg-gradient(horizontal, @colors); 3 } diff --git a/packages/test-data/errors/eval/svg-gradient5.txt b/packages/test-data/errors/eval/svg-gradient5.txt index 41f8f46f2..9a501ddc9 100644 --- a/packages/test-data/errors/eval/svg-gradient5.txt +++ b/packages/test-data/errors/eval/svg-gradient5.txt @@ -1,4 +1,4 @@ -ArgumentError: error evaluating function `svg-gradient`: svg-gradient expects direction, start_color [start_position], [color position,]..., end_color [end_position] or direction, color list in {path}svg-gradient5.less on line 2, column 6: +ArgumentError: Error evaluating function `svg-gradient`: svg-gradient expects direction, start_color [start_position], [color position,]..., end_color [end_position] or direction, color list in {path}svg-gradient5.less on line 2, column 6: 1 .a { 2 a: svg-gradient(to bottom, @colors); 3 } diff --git a/packages/test-data/errors/eval/svg-gradient6.txt b/packages/test-data/errors/eval/svg-gradient6.txt index 2ce85cf6b..8743cb1da 100644 --- a/packages/test-data/errors/eval/svg-gradient6.txt +++ b/packages/test-data/errors/eval/svg-gradient6.txt @@ -1,4 +1,4 @@ -ArgumentError: error evaluating function `svg-gradient`: svg-gradient direction must be 'to bottom', 'to right', 'to bottom right', 'to top right' or 'ellipse at center' in {path}svg-gradient6.less on line 2, column 6: +ArgumentError: Error evaluating function `svg-gradient`: svg-gradient direction must be 'to bottom', 'to right', 'to bottom right', 'to top right' or 'ellipse at center' in {path}svg-gradient6.less on line 2, column 6: 1 .a { 2 a: svg-gradient(black, @colors); 3 } diff --git a/packages/test-data/errors/eval/unit-function.txt b/packages/test-data/errors/eval/unit-function.txt index baf90f422..e680324bc 100644 --- a/packages/test-data/errors/eval/unit-function.txt +++ b/packages/test-data/errors/eval/unit-function.txt @@ -1,4 +1,4 @@ -ArgumentError: error evaluating function `unit`: the first argument to unit must be a number. Have you forgotten parenthesis? in {path}unit-function.less on line 2, column 14: +ArgumentError: Error evaluating function `unit`: the first argument to unit must be a number. Have you forgotten parenthesis? in {path}unit-function.less on line 2, column 14: 1 .a { 2 font-size: unit(80/16,rem); 3 } diff --git a/packages/test-data/less/_main/functions.less b/packages/test-data/less/_main/functions.less index b541e55ba..c486cc4e8 100644 --- a/packages/test-data/less/_main/functions.less +++ b/packages/test-data/less/_main/functions.less @@ -283,3 +283,17 @@ html { }); @falsey(); } + +.paren-escapes { + list-1: ~(1, 2, 3); + length-1: length($list-1); + each(~(1 2 3); { + item-@{value}: @value + 3; + }) + + .mixin(@list-1; @list-2) { + list-2: @list-1; + list-3: @list-2; + } + .mixin($list-1, ~(7; 8; 9)); +} From fe223b68fe0a5dbc3bc6847cb32d45e9dbf7da29 Mon Sep 17 00:00:00 2001 From: Matthew Dean Date: Sat, 5 Dec 2020 09:00:20 -0800 Subject: [PATCH 06/19] Rerun lebab on original ES5 --- packages/less/Gruntfile.js | 2 +- packages/less/src/less-node/file-manager.js | 9 +- packages/less/src/less-node/index.js | 16 +- packages/less/src/less/contexts.js | 171 +++++++++--------- packages/less/src/less/default-options.js | 108 +++++------ .../less/environment/abstract-file-manager.js | 23 ++- .../environment/abstract-plugin-loader.js | 16 +- .../less/src/less/environment/environment.js | 4 +- packages/less/src/less/import-manager.js | 36 ++-- packages/less/src/less/index.js | 75 +++----- packages/less/src/less/less-error.js | 14 +- packages/less/src/less/parse-tree.js | 10 +- packages/less/src/less/parse.js | 14 +- packages/less/src/less/parser/chunker.js | 2 +- packages/less/src/less/plugin-manager.js | 2 +- packages/less/src/less/render.js | 9 +- packages/less/src/less/source-map-builder.js | 2 +- packages/less/src/less/source-map-output.js | 9 +- packages/less/src/less/transform-tree.js | 15 +- packages/less/src/less/tree/atrule.js | 19 +- packages/less/src/less/tree/color.js | 69 ++++--- packages/less/src/less/tree/condition.js | 2 +- packages/less/src/less/tree/debug-info.js | 59 +++--- packages/less/src/less/tree/declaration.js | 7 +- packages/less/src/less/tree/dimension.js | 12 +- packages/less/src/less/tree/element.js | 3 +- packages/less/src/less/tree/expression.js | 6 +- packages/less/src/less/tree/extend.js | 4 +- packages/less/src/less/tree/import.js | 2 +- packages/less/src/less/tree/index.js | 2 - packages/less/src/less/tree/js-eval-node.js | 6 +- packages/less/src/less/tree/mixin-call.js | 33 ++-- .../less/src/less/tree/mixin-definition.js | 6 +- .../less/src/less/tree/namespace-value.js | 7 +- packages/less/src/less/tree/node.js | 81 +++++---- packages/less/src/less/tree/operation.js | 4 +- packages/less/src/less/tree/property.js | 2 +- packages/less/src/less/tree/quoted.js | 5 +- packages/less/src/less/tree/ruleset.js | 74 +++----- packages/less/src/less/tree/selector.js | 14 +- packages/less/src/less/tree/unit.js | 5 +- packages/less/src/less/tree/url.js | 2 +- packages/less/src/less/tree/value.js | 4 +- packages/less/src/less/tree/variable.js | 5 +- .../less/src/less/visitors/extend-visitor.js | 33 ++-- .../src/less/visitors/import-sequencer.js | 18 +- .../less/src/less/visitors/import-visitor.js | 12 +- .../less/visitors/join-selector-visitor.js | 2 +- packages/less/src/less/visitors/visitor.js | 14 +- .../less/errors/image-height-error.txt | 2 +- .../browser/less/errors/image-size-error.txt | 2 +- .../browser/less/errors/image-width-error.txt | 2 +- 52 files changed, 499 insertions(+), 556 deletions(-) diff --git a/packages/less/Gruntfile.js b/packages/less/Gruntfile.js index bf967b102..0e7f044ba 100644 --- a/packages/less/Gruntfile.js +++ b/packages/less/Gruntfile.js @@ -230,7 +230,7 @@ module.exports = function(grunt) { }, test: { command: [ - tsNodeRuntime + " test/test-es6.ts", + // tsNodeRuntime + " test/test-es6.ts", "node test/index.js" ].join(' && ') }, diff --git a/packages/less/src/less-node/file-manager.js b/packages/less/src/less-node/file-manager.js index 4b9235a91..f816549ea 100644 --- a/packages/less/src/less-node/file-manager.js +++ b/packages/less/src/less-node/file-manager.js @@ -26,7 +26,7 @@ class FileManager extends AbstractFileManager { const paths = isAbsoluteFilename ? [''] : [currentDirectory]; - if (options.paths) { paths.push(...options.paths); } + if (options.paths) { paths.push.apply(paths, options.paths); } if (!isAbsoluteFilename && paths.indexOf('.') === -1) { paths.push('.'); } @@ -101,7 +101,7 @@ class FileManager extends AbstractFileManager { fullFilename = extFilename; } } - + const readFileArgs = [fullFilename]; if (!options.rawBuffer) { readFileArgs.push('utf-8'); @@ -121,11 +121,12 @@ class FileManager extends AbstractFileManager { if (e) { filenamesTried.push(isNodeModule ? npmPrefix + fullFilename : fullFilename); return tryPrefix(j + 1); - } + } fulfill({ contents: data, filename: fullFilename}); }); fs.readFile.apply(this, readFileArgs); } + } else { tryPathIndex(i + 1); @@ -144,4 +145,4 @@ class FileManager extends AbstractFileManager { } } -export default FileManager; \ No newline at end of file +export default FileManager; diff --git a/packages/less/src/less-node/index.js b/packages/less/src/less-node/index.js index ae08a8952..fec503988 100644 --- a/packages/less/src/less-node/index.js +++ b/packages/less/src/less-node/index.js @@ -2,26 +2,22 @@ import environment from './environment'; import FileManager from './file-manager'; import UrlFileManager from './url-file-manager'; import createFromEnvironment from '../less'; -import lesscHelper from './lessc-helper'; -import PluginLoader from './plugin-loader'; -import fs from './fs'; -import defaultOptions from '../less/default-options'; -import imageSize from './image-size'; - const less = createFromEnvironment(environment, [new FileManager(), new UrlFileManager()]); +import lesscHelper from './lessc-helper'; +import path from 'path'; // allow people to create less with their own environment less.createFromEnvironment = createFromEnvironment; less.lesscHelper = lesscHelper; -less.PluginLoader = PluginLoader; -less.fs = fs; +less.PluginLoader = require('./plugin-loader').default; +less.fs = require('./fs').default; less.FileManager = FileManager; less.UrlFileManager = UrlFileManager; // Set up options -less.options = defaultOptions(); +less.options = require('../less/default-options').default(); // provide image-size functionality -imageSize(less.environment); +require('./image-size').default(less.environment); export default less; diff --git a/packages/less/src/less/contexts.js b/packages/less/src/less/contexts.js index 803b8c6c9..d6b4540c2 100644 --- a/packages/less/src/less/contexts.js +++ b/packages/less/src/less/contexts.js @@ -43,6 +43,7 @@ contexts.Parse = function(options) { const evalCopyProperties = [ 'paths', // additional include paths 'compress', // whether to compress + 'ieCompat', // whether to enforce IE compatibility (IE8 data-uri) 'math', // whether math has to be within parenthesis 'strictUnits', // whether units need to evaluate correctly 'sourceMap', // whether to output a source map @@ -54,111 +55,111 @@ const evalCopyProperties = [ 'rewriteUrls' // option - whether to adjust URL's to be relative ]; -function isPathRelative(path) { - return !/^(?:[a-z-]+:|\/|#)/i.test(path); -} +contexts.Eval = function(options, frames) { + copyFromOriginal(options, this, evalCopyProperties); -function isPathLocalRelative(path) { - return path.charAt(0) === '.'; -} + if (typeof this.paths === 'string') { this.paths = [this.paths]; } -contexts.Eval = class { - constructor(options, frames) { - copyFromOriginal(options, this, evalCopyProperties); + this.frames = frames || []; + this.importantScope = this.importantScope || []; +}; - if (typeof this.paths === 'string') { this.paths = [this.paths]; } +contexts.Eval.prototype.enterCalc = function () { + if (!this.calcStack) { + this.calcStack = []; + } + this.calcStack.push(true); + this.inCalc = true; +}; - this.frames = frames || []; - this.importantScope = this.importantScope || []; +contexts.Eval.prototype.exitCalc = function () { + this.calcStack.pop(); + if (!this.calcStack.length) { this.inCalc = false; - this.mathOn = true; } +}; - enterCalc() { - if (!this.calcStack) { - this.calcStack = []; - } - this.calcStack.push(true); - this.inCalc = true; +contexts.Eval.prototype.inParenthesis = function () { + if (!this.parensStack) { + this.parensStack = []; } + this.parensStack.push(true); +}; - exitCalc() { - this.calcStack.pop(); - if (!this.calcStack.length) { - this.inCalc = false; - } +contexts.Eval.prototype.outOfParenthesis = function () { + this.parensStack.pop(); +}; + +contexts.Eval.prototype.inCalc = false; +contexts.Eval.prototype.mathOn = true; +contexts.Eval.prototype.isMathOn = function (op) { + if (!this.mathOn) { + return false; + } + if (op === '/' && this.math !== Constants.Math.ALWAYS && (!this.parensStack || !this.parensStack.length)) { + return false; } + if (this.math > Constants.Math.PARENS_DIVISION) { + return this.parensStack && this.parensStack.length; + } + return true; +}; - inParenthesis() { - if (!this.parensStack) { - this.parensStack = []; - } - this.parensStack.push(true); - }; +contexts.Eval.prototype.pathRequiresRewrite = function (path) { + const isRelative = this.rewriteUrls === Constants.RewriteUrls.LOCAL ? isPathLocalRelative : isPathRelative; - outOfParenthesis() { - this.parensStack.pop(); - }; + return isRelative(path); +}; - isMathOn(op) { - if (!this.mathOn) { - return false; - } - if (op === '/' && this.math !== Constants.Math.ALWAYS && (!this.parensStack || !this.parensStack.length)) { - return false; - } - if (this.math > Constants.Math.PARENS_DIVISION) { - return this.parensStack && this.parensStack.length; - } - return true; - } +contexts.Eval.prototype.rewritePath = function (path, rootpath) { + let newPath; - pathRequiresRewrite(path) { - const isRelative = this.rewriteUrls === Constants.RewriteUrls.LOCAL ? isPathLocalRelative : isPathRelative; + rootpath = rootpath || ''; + newPath = this.normalizePath(rootpath + path); - return isRelative(path); + // If a path was explicit relative and the rootpath was not an absolute path + // we must ensure that the new path is also explicit relative. + if (isPathLocalRelative(path) && + isPathRelative(rootpath) && + isPathLocalRelative(newPath) === false) { + newPath = `./${newPath}`; } - rewritePath(path, rootpath) { - let newPath; - - rootpath = rootpath || ''; - newPath = this.normalizePath(rootpath + path); + return newPath; +}; - // If a path was explicit relative and the rootpath was not an absolute path - // we must ensure that the new path is also explicit relative. - if (isPathLocalRelative(path) && - isPathRelative(rootpath) && - isPathLocalRelative(newPath) === false) { - newPath = `./${newPath}`; +contexts.Eval.prototype.normalizePath = function (path) { + const segments = path.split('/').reverse(); + let segment; + + path = []; + while (segments.length !== 0) { + segment = segments.pop(); + switch ( segment ) { + case '.': + break; + case '..': + if ((path.length === 0) || (path[path.length - 1] === '..')) { + path.push( segment ); + } else { + path.pop(); + } + break; + default: + path.push(segment); + break; } - - return newPath; } - normalizePath(path) { - const segments = path.split('/').reverse(); - let segment; - - path = []; - while (segments.length !== 0) { - segment = segments.pop(); - switch ( segment ) { - case '.': - break; - case '..': - if ((path.length === 0) || (path[path.length - 1] === '..')) { - path.push( segment ); - } else { - path.pop(); - } - break; - default: - path.push(segment); - break; - } - } + return path.join('/'); +}; - return path.join('/'); - } +function isPathRelative(path) { + return !/^(?:[a-z-]+:|\/|#)/i.test(path); } + +function isPathLocalRelative(path) { + return path.charAt(0) === '.'; +} + +// todo - do the same for the toCSS ? diff --git a/packages/less/src/less/default-options.js b/packages/less/src/less/default-options.js index 4c7063f17..839762f0e 100644 --- a/packages/less/src/less/default-options.js +++ b/packages/less/src/less/default-options.js @@ -1,68 +1,70 @@ // Export a new default each time -export default () => ({ - /* Inline Javascript - @plugin still allowed */ - javascriptEnabled: false, +export default function() { + return { + /* Inline Javascript - @plugin still allowed */ + javascriptEnabled: false, - /* Outputs a makefile import dependency list to stdout. */ - depends: false, + /* Outputs a makefile import dependency list to stdout. */ + depends: false, - /* (DEPRECATED) Compress using less built-in compression. - * This does an okay job but does not utilise all the tricks of - * dedicated css compression. */ - compress: false, + /* (DEPRECATED) Compress using less built-in compression. + * This does an okay job but does not utilise all the tricks of + * dedicated css compression. */ + compress: false, - /* Runs the less parser and just reports errors without any output. */ - lint: false, + /* Runs the less parser and just reports errors without any output. */ + lint: false, - /* Sets available include paths. - * If the file in an @import rule does not exist at that exact location, - * less will look for it at the location(s) passed to this option. - * You might use this for instance to specify a path to a library which - * you want to be referenced simply and relatively in the less files. */ - paths: [], + /* Sets available include paths. + * If the file in an @import rule does not exist at that exact location, + * less will look for it at the location(s) passed to this option. + * You might use this for instance to specify a path to a library which + * you want to be referenced simply and relatively in the less files. */ + paths: [], - /* color output in the terminal */ - color: true, + /* color output in the terminal */ + color: true, - /* The strictImports controls whether the compiler will allow an @import inside of either - * @media blocks or (a later addition) other selector blocks. - * See: https://github.com/less/less.js/issues/656 */ - strictImports: false, + /* The strictImports controls whether the compiler will allow an @import inside of either + * @media blocks or (a later addition) other selector blocks. + * See: https://github.com/less/less.js/issues/656 */ + strictImports: false, - /* Allow Imports from Insecure HTTPS Hosts */ - insecure: false, + /* Allow Imports from Insecure HTTPS Hosts */ + insecure: false, - /* Allows you to add a path to every generated import and url in your css. - * This does not affect less import statements that are processed, just ones - * that are left in the output css. */ - rootpath: '', + /* Allows you to add a path to every generated import and url in your css. + * This does not affect less import statements that are processed, just ones + * that are left in the output css. */ + rootpath: '', - /* By default URLs are kept as-is, so if you import a file in a sub-directory - * that references an image, exactly the same URL will be output in the css. - * This option allows you to re-write URL's in imported files so that the - * URL is always relative to the base imported file */ - rewriteUrls: false, + /* By default URLs are kept as-is, so if you import a file in a sub-directory + * that references an image, exactly the same URL will be output in the css. + * This option allows you to re-write URL's in imported files so that the + * URL is always relative to the base imported file */ + rewriteUrls: false, - /* How to process math - * 0 always - eagerly try to solve all operations - * 1 parens-division - require parens for division "/" - * 2 parens | strict - require parens for all operations - * 3 strict-legacy - legacy strict behavior (super-strict) - */ - math: 1, + /* How to process math + * 0 always - eagerly try to solve all operations + * 1 parens-division - require parens for division "/" + * 2 parens | strict - require parens for all operations + * 3 strict-legacy - legacy strict behavior (super-strict) + */ + math: 1, - /* Without this option, less attempts to guess at the output unit when it does maths. */ - strictUnits: false, + /* Without this option, less attempts to guess at the output unit when it does maths. */ + strictUnits: false, - /* Effectively the declaration is put at the top of your base Less file, - * meaning it can be used but it also can be overridden if this variable - * is defined in the file. */ - globalVars: null, + /* Effectively the declaration is put at the top of your base Less file, + * meaning it can be used but it also can be overridden if this variable + * is defined in the file. */ + globalVars: null, - /* As opposed to the global variable option, this puts the declaration at the - * end of your base file, meaning it will override anything defined in your Less file. */ - modifyVars: null, + /* As opposed to the global variable option, this puts the declaration at the + * end of your base file, meaning it will override anything defined in your Less file. */ + modifyVars: null, - /* This option allows you to specify a argument to go on to every URL. */ - urlArgs: '' -}); \ No newline at end of file + /* This option allows you to specify a argument to go on to every URL. */ + urlArgs: '' + } +}; \ No newline at end of file diff --git a/packages/less/src/less/environment/abstract-file-manager.js b/packages/less/src/less/environment/abstract-file-manager.js index 873e21d8e..03ca08613 100644 --- a/packages/less/src/less/environment/abstract-file-manager.js +++ b/packages/less/src/less/environment/abstract-file-manager.js @@ -20,28 +20,34 @@ class AbstractFileManager { tryAppendLessExtension(path) { return this.tryAppendExtension(path, '.less'); - }; + } - supportsSync() { return false; } + supportsSync() { + return false; + } - alwaysMakePathsAbsolute() { return false; } + alwaysMakePathsAbsolute() { + return false; + } isPathAbsolute(filename) { return (/^(?:[a-z-]+:|\/|\\|#)/i).test(filename); } + // TODO: pull out / replace? join(basePath, laterPath) { if (!basePath) { return laterPath; } return basePath + laterPath; - }; + } pathDiff(url, baseUrl) { // diff between two paths to create a relative path + const urlParts = this.extractUrlParts(url); - const baseUrlParts = this.extractUrlParts(baseUrl); + const baseUrlParts = this.extractUrlParts(baseUrl); let i; let max; let urlDirectories; @@ -63,7 +69,8 @@ class AbstractFileManager { diff += `${urlDirectories[i]}/`; } return diff; - }; + } + // helper function, not part of API extractUrlParts(url, baseUrl) { // urlParts[1] = protocol://hostname/ OR / @@ -121,7 +128,7 @@ class AbstractFileManager { returner.fileUrl = returner.path + (urlParts[4] || ''); returner.url = returner.fileUrl + (urlParts[5] || ''); return returner; - }; + } } -export default AbstractFileManager; \ No newline at end of file +export default AbstractFileManager; diff --git a/packages/less/src/less/environment/abstract-plugin-loader.js b/packages/less/src/less/environment/abstract-plugin-loader.js index 50caeb4bb..917c24baa 100644 --- a/packages/less/src/less/environment/abstract-plugin-loader.js +++ b/packages/less/src/less/environment/abstract-plugin-loader.js @@ -4,17 +4,14 @@ import LessError from '../less-error'; class AbstractPluginLoader { constructor() { // Implemented by Node.js plugin loader - this.require = () => null + this.require = function() { + return null; + } } evalPlugin(contents, context, imports, pluginOptions, fileInfo) { - let loader; - let registry; - let pluginObj; - let localModule; - let pluginManager; - let filename; - let result; + + let loader, registry, pluginObj, localModule, pluginManager, filename, result; pluginManager = context.pluginManager; @@ -55,7 +52,7 @@ class AbstractPluginLoader { }; registry = functionRegistry.create(); - const registerPlugin = obj => { + const registerPlugin = function(obj) { pluginObj = obj; }; @@ -116,6 +113,7 @@ class AbstractPluginLoader { } return pluginObj; + } trySetOptions(plugin, filename, name, options) { diff --git a/packages/less/src/less/environment/environment.js b/packages/less/src/less/environment/environment.js index 340c8e14b..39de0d315 100644 --- a/packages/less/src/less/environment/environment.js +++ b/packages/less/src/less/environment/environment.js @@ -5,7 +5,7 @@ import logger from '../logger'; -class environment { +class Environment { constructor(externalEnvironment, fileManagers) { this.fileManagers = fileManagers || []; externalEnvironment = externalEnvironment || {}; @@ -56,4 +56,4 @@ class environment { } } -export default environment; +export default Environment; diff --git a/packages/less/src/less/import-manager.js b/packages/less/src/less/import-manager.js index dd36c32a1..11326ade9 100644 --- a/packages/less/src/less/import-manager.js +++ b/packages/less/src/less/import-manager.js @@ -4,7 +4,7 @@ import LessError from './less-error'; import * as utils from './utils'; import logger from './logger'; -export default environment => { +export default function(environment) { // FileInfo = { // 'rewriteUrls' - option - whether to adjust URL's to be relative // 'filename' - full resolved filename of current file @@ -26,7 +26,7 @@ export default environment => { this.context = context; // Deprecated? Unused outside of here, could be useful. this.queue = []; // Files which haven't been imported yet - this.files = []; // List of files imported + this.files = {}; // Holds the imported parse trees. } /** @@ -38,12 +38,11 @@ export default environment => { * @param callback - callback for when it is imported */ push(path, tryAppendExtension, currentFileInfo, importOptions, callback) { - const importManager = this; - const pluginLoader = this.context.pluginManager.Loader; + const importManager = this, pluginLoader = this.context.pluginManager.Loader; this.queue.push(path); - const fileParsedFunc = (e, root, fullPath) => { + const fileParsedFunc = function (e, root, fullPath) { importManager.queue.splice(importManager.queue.indexOf(path), 1); // Remove the path from the queue const importedEqualsRoot = fullPath === importManager.rootFilename; @@ -52,9 +51,11 @@ export default environment => { logger.info(`The file ${fullPath} was skipped because it was not found and the import was marked optional.`); } else { - const files = importManager.files - if (files.indexOf(fullPath) === -1) { - files.push(fullPath) + // Inline imports aren't cached here. + // If we start to cache them, please make sure they won't conflict with non-inline imports of the + // same name as they used to do before this comment and the condition below have been added. + if (!importManager.files[fullPath] && !importOptions.inline) { + importManager.files[fullPath] = { root, options: importOptions }; } if (e && !importManager.error) { importManager.error = e; } callback(e, root, importedEqualsRoot, fullPath); @@ -75,7 +76,7 @@ export default environment => { return; } - const loadFileCallback = loadedFile => { + const loadFileCallback = function(loadedFile) { let plugin; const resolvedFilename = loadedFile.filename; const contents = loadedFile.contents.replace(/^\uFEFF/, ''); @@ -120,9 +121,20 @@ export default environment => { } else if (importOptions.inline) { fileParsedFunc(null, contents, resolvedFilename); } else { - new Parser(newEnv, importManager, newFileInfo).parse(contents, (e, root) => { - fileParsedFunc(e, root, resolvedFilename); - }); + + // import (multiple) parse trees apparently get altered and can't be cached. + // TODO: investigate why this is + if (importManager.files[resolvedFilename] + && !importManager.files[resolvedFilename].options.multiple + && !importOptions.multiple) { + + fileParsedFunc(null, importManager.files[resolvedFilename].root, resolvedFilename); + } + else { + new Parser(newEnv, importManager, newFileInfo).parse(contents, function (e, root) { + fileParsedFunc(e, root, resolvedFilename); + }); + } } }; let loadedFile; diff --git a/packages/less/src/less/index.js b/packages/less/src/less/index.js index f0b05fff3..f027de952 100644 --- a/packages/less/src/less/index.js +++ b/packages/less/src/less/index.js @@ -1,48 +1,38 @@ +import Environment from './environment/environment'; import data from './data'; import tree from './tree'; -import Environment from './environment/environment'; import AbstractFileManager from './environment/abstract-file-manager'; import AbstractPluginLoader from './environment/abstract-plugin-loader'; import visitors from './visitors'; import Parser from './parser/parser'; -import Functions from './functions'; +import functions from './functions'; import contexts from './contexts'; -import sourceMapOutput from './source-map-output'; -import sourceMapBuilder from './source-map-builder'; -import parseTree from './parse-tree'; -import importManager from './import-manager'; -import Render from './render'; -import Parse from './parse'; import LessError from './less-error'; import transformTree from './transform-tree'; import * as utils from './utils'; import PluginManager from './plugin-manager'; import logger from './logger'; +import SourceMapOutput from './source-map-output'; +import SourceMapBuilder from './source-map-builder'; +import ParseTree from './parse-tree'; +import ImportManager from './import-manager'; +import Parse from './parse'; +import Render from './render'; + +export default function(environment, fileManagers) { + let sourceMapOutput, sourceMapBuilder, parseTree, importManager; -export default (environment, fileManagers) => { - /** - * @todo - * This original code could be improved quite a bit. - * Many classes / modules currently add side-effects / mutations to passed in objects, - * which makes it hard to refactor and reason about. - */ environment = new Environment(environment, fileManagers); + sourceMapOutput = SourceMapOutput(environment); + sourceMapBuilder = SourceMapBuilder(sourceMapOutput, environment); + parseTree = ParseTree(sourceMapBuilder); + importManager = ImportManager(environment); - const SourceMapOutput = sourceMapOutput(environment); - const SourceMapBuilder = sourceMapBuilder(SourceMapOutput, environment); - const ParseTree = parseTree(SourceMapBuilder); - const ImportManager = importManager(environment); - const render = Render(environment, ParseTree, ImportManager); - const parse = Parse(environment, ParseTree, ImportManager); - const functions = Functions(environment); + const render = Render(environment, parseTree, importManager); + const parse = Parse(environment, parseTree, importManager); - /** - * @todo - * This root properties / methods need to be organized. - * It's not clear what should / must be public and why. - */ const initial = { - version: [3, 12, 2], + version: [4, 0, 0], data, tree, Environment, @@ -51,12 +41,12 @@ export default (environment, fileManagers) => { environment, visitors, Parser, - functions, + functions: functions(environment), contexts, - SourceMapOutput, - SourceMapBuilder, - ParseTree, - ImportManager, + SourceMapOutput: sourceMapOutput, + SourceMapBuilder: sourceMapBuilder, + ParseTree: parseTree, + ImportManager: importManager, render, parse, LessError, @@ -67,10 +57,14 @@ export default (environment, fileManagers) => { }; // Create a public API - const ctor = t => function (...args) { - return new t(...args); - }; + const ctor = function(t) { + return function() { + const obj = Object.create(t.prototype); + t.apply(obj, Array.prototype.slice.call(arguments, 0)); + return obj; + }; + }; let t; const api = Object.create(initial); for (const n in initial.tree) { @@ -88,14 +82,5 @@ export default (environment, fileManagers) => { } } - /** - * Some of the functions assume a `this` context of the API object, - * which causes it to fail when wrapped for ES6 imports. - * - * An assumed `this` should be removed in the future. - */ - initial.parse = initial.parse.bind(api); - initial.render = initial.render.bind(api); - return api; }; diff --git a/packages/less/src/less/less-error.js b/packages/less/src/less/less-error.js index e4100c82e..9bd1aeb5a 100644 --- a/packages/less/src/less/less-error.js +++ b/packages/less/src/less/less-error.js @@ -24,7 +24,7 @@ const anonymousFunc = /(|Function):(\d+):(\d+)/; * @param {Object} fileContentMap - An object with file contents in 'contents' property (like importManager) @todo - move to fileManager? * @param {string} [currentFilename] */ -const LessError = function LessError(e, fileContentMap, currentFilename) { +const LessError = function(e, fileContentMap, currentFilename) { Error.call(this); const filename = e.filename || currentFilename; @@ -35,7 +35,7 @@ const LessError = function LessError(e, fileContentMap, currentFilename) { if (fileContentMap && filename) { const input = fileContentMap.contents[filename]; const loc = utils.getLocation(e.index, input); - const line = loc.line; + var line = loc.line; const col = loc.column; const callLine = e.call && utils.getLocation(e.call, input).line; const lines = input ? input.split('\n') : ''; @@ -62,7 +62,7 @@ const LessError = function LessError(e, fileContentMap, currentFilename) { func(); } catch (e) { const match = e.stack.match(anonymousFunc); - const line = parseInt(match[2]); + var line = parseInt(match[2]); lineAdjust = 1 - line; } @@ -89,7 +89,7 @@ const LessError = function LessError(e, fileContentMap, currentFilename) { }; if (typeof Object.create === 'undefined') { - const F = () => {}; + const F = function () {}; F.prototype = Error.prototype; LessError.prototype = new F(); } else { @@ -105,11 +105,13 @@ LessError.prototype.constructor = LessError; * @param {Object} options * @returns {string} */ -LessError.prototype.toString = function(options = {}) { +LessError.prototype.toString = function(options) { + options = options || {}; + let message = ''; const extract = this.extract || []; let error = []; - let stylize = str => str; + let stylize = function (str) { return str; }; if (options.stylize) { const type = typeof options.stylize; if (type !== 'function') { diff --git a/packages/less/src/less/parse-tree.js b/packages/less/src/less/parse-tree.js index 2741a0441..44f7deece 100644 --- a/packages/less/src/less/parse-tree.js +++ b/packages/less/src/less/parse-tree.js @@ -2,7 +2,7 @@ import LessError from './less-error'; import transformTree from './transform-tree'; import logger from './logger'; -export default SourceMapBuilder => { +export default function(SourceMapBuilder) { class ParseTree { constructor(root, imports) { this.root = root; @@ -52,8 +52,12 @@ export default SourceMapBuilder => { result.map = sourceMapBuilder.getExternalSourceMap(); } - const rootFilename = this.imports.rootFilename - result.imports = this.imports.files.filter(file => file !== rootFilename); + result.imports = []; + for (const file in this.imports.files) { + if (this.imports.files.hasOwnProperty(file) && file !== this.imports.rootFilename) { + result.imports.push(file); + } + } return result; } } diff --git a/packages/less/src/less/parse.js b/packages/less/src/less/parse.js index 159dd956f..931c9a91c 100644 --- a/packages/less/src/less/parse.js +++ b/packages/less/src/less/parse.js @@ -1,11 +1,10 @@ -let PromiseConstructor; import contexts from './contexts'; import Parser from './parser/parser'; import PluginManager from './plugin-manager'; import LessError from './less-error'; import * as utils from './utils'; -export default (environment, ParseTree, ImportManager) => { +export default function(environment, ParseTree, ImportManager) { const parse = function (input, options, callback) { if (typeof options === 'function') { @@ -18,8 +17,8 @@ export default (environment, ParseTree, ImportManager) => { if (!callback) { const self = this; - return new Promise((resolve, reject) => { - parse.call(self, input, options, (err, output) => { + return new Promise(function (resolve, reject) { + parse.call(self, input, options, function(err, output) { if (err) { reject(err); } else { @@ -62,9 +61,8 @@ export default (environment, ParseTree, ImportManager) => { // Do an async plugin queue like lessc if (options.plugins) { - options.plugins.forEach(plugin => { - let evalResult; - let contents; + options.plugins.forEach(function(plugin) { + let evalResult, contents; if (plugin.fileContent) { contents = plugin.fileContent.replace(/^\uFEFF/, ''); evalResult = pluginManager.Loader.evalPlugin(contents, context, imports, plugin.options, plugin.filename); @@ -79,7 +77,7 @@ export default (environment, ParseTree, ImportManager) => { } new Parser(context, imports, rootFileInfo) - .parse(input, (e, root) => { + .parse(input, function (e, root) { if (e) { return callback(e); } callback(null, root, imports, options); }, options); diff --git a/packages/less/src/less/parser/chunker.js b/packages/less/src/less/parser/chunker.js index 9c35f3f5a..8dae722f6 100644 --- a/packages/less/src/less/parser/chunker.js +++ b/packages/less/src/less/parser/chunker.js @@ -1,5 +1,5 @@ // Split the input into chunks. -export default (input, fail) => { +export default function (input, fail) { const len = input.length; let level = 0; let parenLevel = 0; diff --git a/packages/less/src/less/plugin-manager.js b/packages/less/src/less/plugin-manager.js index 977b1c5ee..48002fbcd 100644 --- a/packages/less/src/less/plugin-manager.js +++ b/packages/less/src/less/plugin-manager.js @@ -157,7 +157,7 @@ class PluginManager { let pm; -function PluginManagerFactory(less, newFactory) { +const PluginManagerFactory = function(less, newFactory) { if (newFactory || !pm) { pm = new PluginManager(less); } diff --git a/packages/less/src/less/render.js b/packages/less/src/less/render.js index faa8d5e45..9920d2fd1 100644 --- a/packages/less/src/less/render.js +++ b/packages/less/src/less/render.js @@ -1,7 +1,6 @@ -let PromiseConstructor; import * as utils from './utils'; -export default (environment, ParseTree, ImportManager) => { +export default function(environment, ParseTree, ImportManager) { const render = function (input, options, callback) { if (typeof options === 'function') { callback = options; @@ -13,8 +12,8 @@ export default (environment, ParseTree, ImportManager) => { if (!callback) { const self = this; - return new Promise((resolve, reject) => { - render.call(self, input, options, (err, output) => { + return new Promise(function (resolve, reject) { + render.call(self, input, options, function(err, output) { if (err) { reject(err); } else { @@ -23,7 +22,7 @@ export default (environment, ParseTree, ImportManager) => { }); }); } else { - this.parse(input, options, (err, root, imports, options) => { + this.parse(input, options, function(err, root, imports, options) { if (err) { return callback(err); } let result; diff --git a/packages/less/src/less/source-map-builder.js b/packages/less/src/less/source-map-builder.js index 853ff538c..53a6860a5 100644 --- a/packages/less/src/less/source-map-builder.js +++ b/packages/less/src/less/source-map-builder.js @@ -1,4 +1,4 @@ -export default (SourceMapOutput, environment) => { +export default function (SourceMapOutput, environment) { class SourceMapBuilder { constructor(options) { this.options = options; diff --git a/packages/less/src/less/source-map-output.js b/packages/less/src/less/source-map-output.js index d30966e8e..bf776ca32 100644 --- a/packages/less/src/less/source-map-output.js +++ b/packages/less/src/less/source-map-output.js @@ -1,4 +1,4 @@ -export default environment => { +export default function (environment) { class SourceMapOutput { constructor(options) { this._css = []; @@ -46,16 +46,13 @@ export default environment => { } add(chunk, fileInfo, index, mapLines) { + // ignore adding empty strings if (!chunk) { return; } - let lines; - let sourceLines; - let columns; - let sourceColumns; - let i; + let lines, sourceLines, columns, sourceColumns, i; if (fileInfo && fileInfo.filename) { let inputSource = this._contentsMap[fileInfo.filename]; diff --git a/packages/less/src/less/transform-tree.js b/packages/less/src/less/transform-tree.js index 79eee5064..f2197f2c4 100644 --- a/packages/less/src/less/transform-tree.js +++ b/packages/less/src/less/transform-tree.js @@ -2,7 +2,8 @@ import contexts from './contexts'; import visitor from './visitors'; import tree from './tree'; -export default (root, options = {}) => { +export default function(root, options) { + options = options || {}; let evaldRoot; let variables = options.variables; const evalEnv = new contexts.Eval(options); @@ -21,7 +22,7 @@ export default (root, options = {}) => { // ) // if (typeof variables === 'object' && !Array.isArray(variables)) { - variables = Object.keys(variables).map(k => { + variables = Object.keys(variables).map(function (k) { let value = variables[k]; if (!(value instanceof tree.Value)) { @@ -36,11 +37,11 @@ export default (root, options = {}) => { } const visitors = [ - new visitor.JoinSelectorVisitor(), - new visitor.MarkVisibleSelectorsVisitor(true), - new visitor.ExtendVisitor(), - new visitor.ToCSSVisitor({compress: Boolean(options.compress)}) - ]; + new visitor.JoinSelectorVisitor(), + new visitor.MarkVisibleSelectorsVisitor(true), + new visitor.ExtendVisitor(), + new visitor.ToCSSVisitor({compress: Boolean(options.compress)}) + ]; const preEvalVisitors = []; let v; diff --git a/packages/less/src/less/tree/atrule.js b/packages/less/src/less/tree/atrule.js index 350a6f62a..4bfb8f0b6 100644 --- a/packages/less/src/less/tree/atrule.js +++ b/packages/less/src/less/tree/atrule.js @@ -41,8 +41,7 @@ class AtRule extends Node { } accept(visitor) { - const value = this.value; - const rules = this.rules; + const value = this.value, rules = this.rules; if (rules) { this.rules = visitor.visitArray(rules); } @@ -60,8 +59,7 @@ class AtRule extends Node { } genCSS(context, output) { - const value = this.value; - const rules = this.rules; + const value = this.value, rules = this.rules; output.add(this.name, this.fileInfo(), this.getIndex()); if (value) { output.add(' '); @@ -75,10 +73,7 @@ class AtRule extends Node { } eval(context) { - let mediaPathBackup; - let mediaBlocksBackup; - let value = this.value; - let rules = this.rules; + let mediaPathBackup, mediaBlocksBackup, value = this.value, rules = this.rules; // media stored inside other atrule should not bubble over it // backpup media bubbling information @@ -111,10 +106,10 @@ class AtRule extends Node { } } - find(...args) { + find() { if (this.rules) { // assuming that there is only one rule at this point - that is how parser constructs the rule - return Ruleset.prototype.find.apply(this.rules[0], args); + return Ruleset.prototype.find.apply(this.rules[0], arguments); } } @@ -142,9 +137,7 @@ class AtRule extends Node { } // Non-compressed - const tabSetStr = `\n${Array(context.tabLevel).join(' ')}`; - - const tabRuleStr = `${tabSetStr} `; + const tabSetStr = `\n${Array(context.tabLevel).join(' ')}`, tabRuleStr = `${tabSetStr} `; if (!ruleCnt) { output.add(` {${tabSetStr}}`); } else { diff --git a/packages/less/src/less/tree/color.js b/packages/less/src/less/tree/color.js index f945def20..e44af7079 100644 --- a/packages/less/src/less/tree/color.js +++ b/packages/less/src/less/tree/color.js @@ -19,7 +19,7 @@ class Color extends Node { this.rgb = rgb; } else if (rgb.length >= 6) { this.rgb = []; - rgb.match(/.{2}/g).map((c, i) => { + rgb.match(/.{2}/g).map(function (c, i) { if (i < 3) { self.rgb.push(parseInt(c, 16)); } else { @@ -28,7 +28,7 @@ class Color extends Node { }); } else { this.rgb = []; - rgb.split('').map((c, i) => { + rgb.split('').map(function (c, i) { if (i < 3) { self.rgb.push(parseInt(c + c, 16)); } else { @@ -43,9 +43,7 @@ class Color extends Node { } luma() { - let r = this.rgb[0] / 255; - let g = this.rgb[1] / 255; - let b = this.rgb[2] / 255; + let r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255; r = (r <= 0.03928) ? r / 12.92 : Math.pow(((r + 0.055) / 1.055), 2.4); g = (g <= 0.03928) ? g / 12.92 : Math.pow(((g + 0.055) / 1.055), 2.4); @@ -92,7 +90,9 @@ class Color extends Node { switch (colorFunction) { case 'rgba': - args = this.rgb.map(c => clamp(Math.round(c), 255)).concat(clamp(alpha, 1)); + args = this.rgb.map(function (c) { + return clamp(Math.round(c), 255); + }).concat(clamp(alpha, 1)); break; case 'hsla': args.push(clamp(alpha, 1)); @@ -144,12 +144,9 @@ class Color extends Node { } toHSL() { - const r = this.rgb[0] / 255; - const g = this.rgb[1] / 255; - const b = this.rgb[2] / 255; - const a = this.alpha; - const max = Math.max(r, g, b); - const min = Math.min(r, g, b); + const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha; + + const max = Math.max(r, g, b), min = Math.min(r, g, b); let h; let s; const l = (max + min) / 2; @@ -172,12 +169,9 @@ class Color extends Node { // Adapted from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript toHSV() { - const r = this.rgb[0] / 255; - const g = this.rgb[1] / 255; - const b = this.rgb[2] / 255; - const a = this.alpha; - const max = Math.max(r, g, b); - const min = Math.min(r, g, b); + const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha; + + const max = Math.max(r, g, b), min = Math.min(r, g, b); let h; let s; const v = max; @@ -213,6 +207,22 @@ class Color extends Node { x.rgb[2] === this.rgb[2] && x.alpha === this.alpha) ? 0 : undefined; } + + static fromKeyword(keyword) { + let c; + const key = keyword.toLowerCase(); + if (colors.hasOwnProperty(key)) { + c = new Color(colors[key].slice(1)); + } + else if (key === 'transparent') { + c = new Color([0, 0, 0], 0); + } + + if (c) { + c.value = keyword; + return c; + } + } } Color.prototype.type = 'Color'; @@ -222,25 +232,10 @@ function clamp(v, max) { } function toHex(v) { - return `#${v.map(c => { - c = clamp(Math.round(c), 255); - return (c < 16 ? '0' : '') + c.toString(16); - }).join('')}`; + return `#${v.map(function (c) { + c = clamp(Math.round(c), 255); + return (c < 16 ? '0' : '') + c.toString(16); +}).join('')}`; } -Color.fromKeyword = keyword => { - let c; - const key = keyword.toLowerCase(); - if (colors.hasOwnProperty(key)) { - c = new Color(colors[key].slice(1)); - } - else if (key === 'transparent') { - c = new Color([0, 0, 0], 0); - } - - if (c) { - c.value = keyword; - return c; - } -}; export default Color; diff --git a/packages/less/src/less/tree/condition.js b/packages/less/src/less/tree/condition.js index 857624baa..73d8a0464 100644 --- a/packages/less/src/less/tree/condition.js +++ b/packages/less/src/less/tree/condition.js @@ -17,7 +17,7 @@ class Condition extends Node { } eval(context) { - const result = ((op, a, b) => { + const result = (function (op, a, b) { switch (op) { case 'and': return a && b; case 'or': return a || b; diff --git a/packages/less/src/less/tree/debug-info.js b/packages/less/src/less/tree/debug-info.js index 71424c8dd..654f16168 100644 --- a/packages/less/src/less/tree/debug-info.js +++ b/packages/less/src/less/tree/debug-info.js @@ -1,35 +1,38 @@ -const debugInfo = (context, ctx, lineSeparator) => { - let result = ''; - if (context.dumpLineNumbers && !context.compress) { - switch (context.dumpLineNumbers) { - case 'comments': - result = debugInfo.asComment(ctx); - break; - case 'mediaquery': - result = debugInfo.asMediaQuery(ctx); - break; - case 'all': - result = debugInfo.asComment(ctx) + (lineSeparator || '') + debugInfo.asMediaQuery(ctx); - break; +class debugInfo { + constructor(context, ctx, lineSeparator) { + let result = ''; + if (context.dumpLineNumbers && !context.compress) { + switch (context.dumpLineNumbers) { + case 'comments': + result = debugInfo.asComment(ctx); + break; + case 'mediaquery': + result = debugInfo.asMediaQuery(ctx); + break; + case 'all': + result = debugInfo.asComment(ctx) + (lineSeparator || '') + debugInfo.asMediaQuery(ctx); + break; + } } + return result; } - return result; -}; -debugInfo.asComment = ctx => ctx.debugInfo ? `/* line ${ctx.debugInfo.lineNumber}, ${ctx.debugInfo.fileName} */\n` : ''; - -debugInfo.asMediaQuery = ctx => { - if (!ctx.debugInfo) { return ''; } - let filenameWithProtocol = ctx.debugInfo.fileName; - if (!/^[a-z]+:\/\//i.test(filenameWithProtocol)) { - filenameWithProtocol = `file://${filenameWithProtocol}`; + static asComment(ctx) { + return `/* line ${ctx.debugInfo.lineNumber}, ${ctx.debugInfo.fileName} */\n`; } - return `@media -sass-debug-info{filename{font-family:${filenameWithProtocol.replace(/([.:\/\\])/g, a => { - if (a == '\\') { - a = '\/'; + + static asMediaQuery(ctx) { + let filenameWithProtocol = ctx.debugInfo.fileName; + if (!/^[a-z]+:\/\//i.test(filenameWithProtocol)) { + filenameWithProtocol = `file://${filenameWithProtocol}`; } - return `\\${a}`; - })}}line{font-family:\\00003${ctx.debugInfo.lineNumber}}}\n`; -}; + return `@media -sass-debug-info{filename{font-family:${filenameWithProtocol.replace(/([.:\/\\])/g, function (a) { + if (a == '\\') { + a = '\/'; + } + return `\\${a}`; +})}}line{font-family:\\00003${ctx.debugInfo.lineNumber}}}\n`; + } +} export default debugInfo; diff --git a/packages/less/src/less/tree/declaration.js b/packages/less/src/less/tree/declaration.js index 74834e0fe..e498ea4a7 100644 --- a/packages/less/src/less/tree/declaration.js +++ b/packages/less/src/less/tree/declaration.js @@ -5,7 +5,6 @@ import Anonymous from './anonymous'; import * as Constants from '../constants'; const MATH = Constants.Math; - class Declaration extends Node { constructor(name, value, important, merge, index, currentFileInfo, inline, variable) { super(); @@ -37,11 +36,7 @@ class Declaration extends Node { } eval(context) { - let mathBypass = false; - let prevMath; - let name = this.name; - let evaldValue; - let variable = this.variable; + let mathBypass = false, prevMath, name = this.name, evaldValue, variable = this.variable; if (typeof name !== 'string') { // expand 'primitive' name directly to get // things faster (~10% for benchmark.less): diff --git a/packages/less/src/less/tree/dimension.js b/packages/less/src/less/tree/dimension.js index 314a6b936..d6b2a28c5 100644 --- a/packages/less/src/less/tree/dimension.js +++ b/packages/less/src/less/tree/dimension.js @@ -66,9 +66,7 @@ class Dimension extends Node { // so `1px + 2` will yield `3px`. operate(context, op, other) { /* jshint noempty:false */ - let value = this._operate(context, op, this.value, other.value); - - let unit = this.unit.clone(); + let value = this._operate(context, op, this.value, other.value), unit = this.unit.clone(); if (op === '+' || op === '-') { if (unit.numerator.length === 0 && unit.denominator.length === 0) { @@ -82,8 +80,7 @@ class Dimension extends Node { other = other.convertTo(this.unit.usedUnits()); if (context.strictUnits && other.unit.toString() !== unit.toString()) { - throw new Error(`Incompatible units. Change the units or use the unit function. ` + - `Bad units: '${unit.toString()}' and '${other.unit.toString()}'.`); + throw new Error(`Incompatible units. Change the units or use the unit function. Bad units: '${unit.toString()}' and '${other.unit.toString()}'.`); } value = this._operate(context, op, this.value, other.value); @@ -101,8 +98,7 @@ class Dimension extends Node { } compare(other) { - let a; - let b; + let a, b; if (!(other instanceof Dimension)) { return undefined; @@ -145,7 +141,7 @@ class Dimension extends Node { } conversions = derivedConversions; } - applyUnit = (atomicUnit, denominator) => { + applyUnit = function (atomicUnit, denominator) { /* jshint loopfunc:true */ if (group.hasOwnProperty(atomicUnit)) { if (denominator) { diff --git a/packages/less/src/less/tree/element.js b/packages/less/src/less/tree/element.js index b96d2da21..8374fe20e 100644 --- a/packages/less/src/less/tree/element.js +++ b/packages/less/src/less/tree/element.js @@ -51,7 +51,8 @@ class Element extends Node { output.add(this.toCSS(context), this.fileInfo(), this.getIndex()); } - toCSS(context = {}) { + toCSS(context) { + context = context || {}; let value = this.value; const firstSelector = context.firstSelector; if (value instanceof Paren) { diff --git a/packages/less/src/less/tree/expression.js b/packages/less/src/less/tree/expression.js index b4fc83a3f..987c43252 100644 --- a/packages/less/src/less/tree/expression.js +++ b/packages/less/src/less/tree/expression.js @@ -30,7 +30,7 @@ class Expression extends Node { context.inParenthesis(); } if (this.value.length > 1) { - returnValue = new Expression(this.value.map(e => { + returnValue = new Expression(this.value.map(function (e) { if (!e.eval) { return e; } @@ -64,7 +64,9 @@ class Expression extends Node { } throwAwayComments() { - this.value = this.value.filter(v => !(v instanceof Comment)); + this.value = this.value.filter(function(v) { + return !(v instanceof Comment); + }); } } diff --git a/packages/less/src/less/tree/extend.js b/packages/less/src/less/tree/extend.js index d78bf92ca..b3499a5ba 100644 --- a/packages/less/src/less/tree/extend.js +++ b/packages/less/src/less/tree/extend.js @@ -41,9 +41,7 @@ class Extend extends Node { // it concatenates (joins) all selectors in selector array findSelfSelectors(selectors) { - let selfElements = []; - let i; - let selectorElements; + let selfElements = [], i, selectorElements; for (i = 0; i < selectors.length; i++) { selectorElements = selectors[i].elements; diff --git a/packages/less/src/less/tree/import.js b/packages/less/src/less/tree/import.js index 7ee13b841..1c32cc327 100644 --- a/packages/less/src/less/tree/import.js +++ b/packages/less/src/less/tree/import.js @@ -115,7 +115,7 @@ class Import extends Node { const result = this.doEval(context); if (this.options.reference || this.blocksVisibility()) { if (result.length || result.length === 0) { - result.forEach(node => { + result.forEach(function (node) { node.addVisibilityBlock(); } ); diff --git a/packages/less/src/less/tree/index.js b/packages/less/src/less/tree/index.js index 912697c75..cf506ac59 100644 --- a/packages/less/src/less/tree/index.js +++ b/packages/less/src/less/tree/index.js @@ -1,5 +1,3 @@ -const tree = Object.create(null); - import Node from './node'; import Color from './color'; import AtRule from './atrule'; diff --git a/packages/less/src/less/tree/js-eval-node.js b/packages/less/src/less/tree/js-eval-node.js index 5fbb018c1..94680a8da 100644 --- a/packages/less/src/less/tree/js-eval-node.js +++ b/packages/less/src/less/tree/js-eval-node.js @@ -13,7 +13,9 @@ class JsEvalNode extends Node { index: this.getIndex() }; } - expression = expression.replace(/@\{([\w-]+)\}/g, (_, name) => that.jsify(new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context))); + expression = expression.replace(/@\{([\w-]+)\}/g, function (_, name) { + return that.jsify(new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context)); + }); try { expression = new Function(`return (${expression})`); @@ -48,7 +50,7 @@ class JsEvalNode extends Node { jsify(obj) { if (Array.isArray(obj.value) && (obj.value.length > 1)) { - return `[${obj.value.map(v => v.toCSS()).join(', ')}]`; + return `[${obj.value.map(function (v) { return v.toCSS(); }).join(', ')}]`; } else { return obj.toCSS(); } diff --git a/packages/less/src/less/tree/mixin-call.js b/packages/less/src/less/tree/mixin-call.js index ec63968da..63b86308c 100644 --- a/packages/less/src/less/tree/mixin-call.js +++ b/packages/less/src/less/tree/mixin-call.js @@ -54,9 +54,7 @@ class MixinCall extends Node { this.selector = this.selector.eval(context); function calcDefGroup(mixin, mixinPath) { - let f; - let p; - let namespace; + let f, p, namespace; for (f = 0; f < 2; f++) { conditionResult[f] = true; @@ -95,7 +93,7 @@ class MixinCall extends Node { } } - noArgumentsFilter = rule => rule.matchArgs(null, context); + noArgumentsFilter = function(rule) {return rule.matchArgs(null, context);}; for (i = 0; i < context.frames.length; i++) { if ((mixins = context.frames[i].find(this.selector, null, noArgumentsFilter)).length > 0) { @@ -185,8 +183,7 @@ class MixinCall extends Node { } _setVisibilityToReplacement(replacement) { - let i; - let rule; + let i, rule; if (this.blocksVisibility()) { for (i = 0; i < replacement.length; i++) { rule = replacement[i]; @@ -196,18 +193,18 @@ class MixinCall extends Node { } format(args) { - return `${this.selector.toCSS().trim()}(${args ? args.map(a => { - let argValue = ''; - if (a.name) { - argValue += `${a.name}:`; - } - if (a.value.toCSS) { - argValue += a.value.toCSS(); - } else { - argValue += '???'; - } - return argValue; - }).join(', ') : ''})`; + return `${this.selector.toCSS().trim()}(${args ? args.map(function (a) { + let argValue = ''; + if (a.name) { + argValue += `${a.name}:`; + } + if (a.value.toCSS) { + argValue += a.value.toCSS(); + } else { + argValue += '???'; + } + return argValue; + }).join(', ') : ''})`; } } diff --git a/packages/less/src/less/tree/mixin-definition.js b/packages/less/src/less/tree/mixin-definition.js index 0feb8e577..a10da6efe 100644 --- a/packages/less/src/less/tree/mixin-definition.js +++ b/packages/less/src/less/tree/mixin-definition.js @@ -20,7 +20,7 @@ class Definition extends Ruleset { this.rules = rules; this._lookups = {}; const optionalParameters = []; - this.required = params.reduce((count, p) => { + this.required = params.reduce(function (count, p) { if (!p.name || (p.name && !p.value)) { return count + 1; } @@ -138,7 +138,7 @@ class Definition extends Ruleset { } makeImportant() { - const rules = !this.rules ? this.rules : this.rules.map(r => { + const rules = !this.rules ? this.rules : this.rules.map(function (r) { if (r.makeImportant) { return r.makeImportant(true); } else { @@ -189,7 +189,7 @@ class Definition extends Ruleset { const allArgsCnt = (args && args.length) || 0; let len; const optionalParameters = this.optionalParameters; - const requiredArgsCnt = !args ? 0 : args.reduce((count, p) => { + const requiredArgsCnt = !args ? 0 : args.reduce(function (count, p) { if (optionalParameters.indexOf(p.name) < 0) { return count + 1; } else { diff --git a/packages/less/src/less/tree/namespace-value.js b/packages/less/src/less/tree/namespace-value.js index 70982b7ab..7cec6f190 100644 --- a/packages/less/src/less/tree/namespace-value.js +++ b/packages/less/src/less/tree/namespace-value.js @@ -14,11 +14,8 @@ class NamespaceValue extends Node { } eval(context) { - let i; - let j; - let name; - let rules = this.value.eval(context); - + let i, j, name, rules = this.value.eval(context); + for (i = 0; i < this.lookups.length; i++) { name = this.lookups[i]; diff --git a/packages/less/src/less/tree/node.js b/packages/less/src/less/tree/node.js index 39d4ec018..e65c7d13a 100644 --- a/packages/less/src/less/tree/node.js +++ b/packages/less/src/less/tree/node.js @@ -38,9 +38,7 @@ class Node { return this._fileInfo || (this.parent && this.parent.fileInfo()) || {}; } - isRulesetLike() { - return false; - } + isRulesetLike() { return false; } toCSS(context) { const strs = []; @@ -80,6 +78,46 @@ class Node { return (precision) ? Number((value + 2e-16).toFixed(precision)) : value; } + static compare(a, b) { + /* returns: + -1: a < b + 0: a = b + 1: a > b + and *any* other value for a != b (e.g. undefined, NaN, -2 etc.) */ + + if ((a.compare) && + // for "symmetric results" force toCSS-based comparison + // of Quoted or Anonymous if either value is one of those + !(b.type === 'Quoted' || b.type === 'Anonymous')) { + return a.compare(b); + } else if (b.compare) { + return -b.compare(a); + } else if (a.type !== b.type) { + return undefined; + } + + a = a.value; + b = b.value; + if (!Array.isArray(a)) { + return a === b ? 0 : undefined; + } + if (a.length !== b.length) { + return undefined; + } + for (let i = 0; i < a.length; i++) { + if (Node.compare(a[i], b[i]) !== 0) { + return undefined; + } + } + return 0; + } + + static numericCompare(a, b) { + return a < b ? -1 + : a === b ? 0 + : a > b ? 1 : undefined; + } + // Returns true if this node represents root of ast imported by reference blocksVisibility() { if (this.visibilityBlocks == null) { @@ -138,41 +176,4 @@ class Node { } } -Node.compare = (a, b) => { - /* returns: - -1: a < b - 0: a = b - 1: a > b - and *any* other value for a != b (e.g. undefined, NaN, -2 etc.) */ - - if ((a.compare) && - // for "symmetric results" force toCSS-based comparison - // of Quoted or Anonymous if either value is one of those - !(b.type === 'Quoted' || b.type === 'Anonymous')) { - return a.compare(b); - } else if (b.compare) { - return -b.compare(a); - } else if (a.type !== b.type) { - return undefined; - } - - a = a.value; - b = b.value; - if (!Array.isArray(a)) { - return a === b ? 0 : undefined; - } - if (a.length !== b.length) { - return undefined; - } - for (let i = 0; i < a.length; i++) { - if (Node.compare(a[i], b[i]) !== 0) { - return undefined; - } - } - return 0; -}; - -Node.numericCompare = (a, b) => a < b ? -1 - : a === b ? 0 - : a > b ? 1 : undefined; export default Node; diff --git a/packages/less/src/less/tree/operation.js b/packages/less/src/less/tree/operation.js index 46a8cf1de..12ce813c8 100644 --- a/packages/less/src/less/tree/operation.js +++ b/packages/less/src/less/tree/operation.js @@ -19,9 +19,7 @@ class Operation extends Node { } eval(context) { - let a = this.operands[0].eval(context); - let b = this.operands[1].eval(context); - let op; + let a = this.operands[0].eval(context), b = this.operands[1].eval(context), op; if (context.isMathOn(this.op)) { op = this.op === './' ? '/' : this.op; diff --git a/packages/less/src/less/tree/property.js b/packages/less/src/less/tree/property.js index 2deca3349..34bea7245 100644 --- a/packages/less/src/less/tree/property.js +++ b/packages/less/src/less/tree/property.js @@ -25,7 +25,7 @@ class Property extends Node { this.evaluating = true; - property = this.find(context.frames, frame => { + property = this.find(context.frames, function (frame) { let v; const vArr = frame.property(name); if (vArr) { diff --git a/packages/less/src/less/tree/quoted.js b/packages/less/src/less/tree/quoted.js index 7dc1d2001..b0df18b84 100644 --- a/packages/less/src/less/tree/quoted.js +++ b/packages/less/src/less/tree/quoted.js @@ -34,11 +34,11 @@ class Quoted extends Node { eval(context) { const that = this; let value = this.value; - const variableReplacement = (_, name) => { + const variableReplacement = function (_, name) { const v = new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context, true); return (v instanceof Quoted) ? v.value : v.toCSS(); }; - const propertyReplacement = (_, name) => { + const propertyReplacement = function (_, name) { const v = new Property(`$${name}`, that.getIndex(), that.fileInfo()).eval(context, true); return (v instanceof Quoted) ? v.value : v.toCSS(); }; @@ -52,7 +52,6 @@ class Quoted extends Node { } value = iterativeReplace(value, this.variableRegex, variableReplacement); value = iterativeReplace(value, this.propRegex, propertyReplacement); - return new Quoted(this.quote + value + this.quote, value, this.escaped, this.getIndex(), this.fileInfo()); } diff --git a/packages/less/src/less/tree/ruleset.js b/packages/less/src/less/tree/ruleset.js index a746dbc6e..25a95f74e 100644 --- a/packages/less/src/less/tree/ruleset.js +++ b/packages/less/src/less/tree/ruleset.js @@ -30,9 +30,7 @@ class Ruleset extends Node { } - isRulesetLike() { - return true; - } + isRulesetLike() { return true; } accept(visitor) { if (this.paths) { @@ -86,7 +84,7 @@ class Ruleset extends Node { ["selectors"], selectors[0].getIndex(), selectors[0].fileInfo(), - (err, result) => { + function(err, result) { if (result) { selectors = utils.flattenArray(result); } @@ -118,7 +116,7 @@ class Ruleset extends Node { // inherit a function registry from the frames stack when possible; // otherwise from the global registry - ruleset.functionRegistry = (frames => { + ruleset.functionRegistry = (function (frames) { let i = 0; const n = frames.length; let found; @@ -127,7 +125,7 @@ class Ruleset extends Node { if ( found ) { return found; } } return globalFunctionRegistry; - })(context.frames).inherit(); + }(context.frames)).inherit(); // push the current ruleset to the frames stack const ctxFrames = context.frames; @@ -160,7 +158,7 @@ class Ruleset extends Node { for (i = 0; (rule = rsRules[i]); i++) { if (rule.type === 'MixinCall') { /* jshint loopfunc:true */ - rules = rule.eval(context).filter(r => { + rules = rule.eval(context).filter(function(r) { if ((r instanceof Declaration) && r.variable) { // do not pollute the scope if the variable is // already there. consider returning false here @@ -169,19 +167,19 @@ class Ruleset extends Node { } return true; }); - rsRules.splice(...[i, 1].concat(rules)); + rsRules.splice.apply(rsRules, [i, 1].concat(rules)); i += rules.length - 1; ruleset.resetCache(); } else if (rule.type === 'VariableCall') { /* jshint loopfunc:true */ - rules = rule.eval(context).rules.filter(r => { + rules = rule.eval(context).rules.filter(function(r) { if ((r instanceof Declaration) && r.variable) { // do not pollute the scope at all return false; } return true; }); - rsRules.splice(...[i, 1].concat(rules)); + rsRules.splice.apply(rsRules, [i, 1].concat(rules)); i += rules.length - 1; ruleset.resetCache(); } @@ -237,7 +235,7 @@ class Ruleset extends Node { if (rules[i].type === 'Import') { importRules = rules[i].eval(context); if (importRules && (importRules.length || importRules.length === 0)) { - rules.splice(...[i, 1].concat(importRules)); + rules.splice.apply(rules, [i, 1].concat(importRules)); i += importRules.length - 1; } else { rules.splice(i, 1, importRules); @@ -248,7 +246,7 @@ class Ruleset extends Node { } makeImportant() { - const result = new Ruleset(this.selectors, this.rules.map(r => { + const result = new Ruleset(this.selectors, this.rules.map(function (r) { if (r.makeImportant) { return r.makeImportant(); } else { @@ -287,7 +285,7 @@ class Ruleset extends Node { variables() { if (!this._variables) { - this._variables = !this.rules ? {} : this.rules.reduce((hash, r) => { + this._variables = !this.rules ? {} : this.rules.reduce(function (hash, r) { if (r instanceof Declaration && r.variable === true) { hash[r.name] = r; } @@ -310,7 +308,7 @@ class Ruleset extends Node { properties() { if (!this._properties) { - this._properties = !this.rules ? {} : this.rules.reduce((hash, r) => { + this._properties = !this.rules ? {} : this.rules.reduce(function (hash, r) { if (r instanceof Declaration && r.variable !== true) { const name = (r.name.length === 1) && (r.name[0] instanceof Keyword) ? r.name[0].value : r.name; @@ -361,7 +359,7 @@ class Ruleset extends Node { ['value', 'important'], decl.value.getIndex(), decl.fileInfo(), - (err, result) => { + function(err, result) { if (err) { decl.parsed = true; } @@ -386,7 +384,7 @@ class Ruleset extends Node { } else { const nodes = []; - toParse.forEach(n => { + toParse.forEach(function(n) { nodes.push(transformDeclaration.call(self, n)); }); return nodes; @@ -420,7 +418,8 @@ class Ruleset extends Node { this.setParent(rule, this); } - find(selector, self = this, filter) { + find(selector, self, filter) { + self = self || this; const rules = []; let match; let foundMixins; @@ -428,7 +427,7 @@ class Ruleset extends Node { if (key in this._lookups) { return this._lookups[key]; } - this.rulesets().forEach(rule => { + this.rulesets().forEach(function (rule) { if (rule !== self) { for (let j = 0; j < rule.selectors.length; j++) { match = selector.match(rule.selectors[j]); @@ -460,7 +459,7 @@ class Ruleset extends Node { let ruleNodes = []; let // Line number debugging - debugInfo; + debugInfo; let rule; let path; @@ -573,9 +572,9 @@ class Ruleset extends Node { } joinSelector(paths, context, selector) { + function createParenthesis(elementsToPak, originalElement) { - let replacementParen; - let j; + let replacementParen, j; if (elementsToPak.length === 0) { replacementParen = new Paren(elementsToPak[0]); } else { @@ -595,8 +594,7 @@ class Ruleset extends Node { } function createSelector(containedElement, originalElement) { - let element; - let selector; + let element, selector; element = new Element(null, containedElement, originalElement.isVariable, originalElement._index, originalElement._fileInfo); selector = new Selector([element]); return selector; @@ -606,9 +604,7 @@ class Ruleset extends Node { // `replacedElement` contains element that is being replaced by `addPath` // returns concatenated path function addReplacementIntoPath(beginningPath, addPath, replacedElement, originalSelector) { - let newSelectorPath; - let lastSelector; - let newJoinedSelector; + let newSelectorPath, lastSelector, newJoinedSelector; // our new selector path newSelectorPath = []; @@ -654,7 +650,9 @@ class Ruleset extends Node { // put together the parent selectors after the join (e.g. the rest of the parent) if (addPath.length > 1) { let restOfPath = addPath.slice(1); - restOfPath = restOfPath.map(selector => selector.createDerived(selector.elements, [])); + restOfPath = restOfPath.map(function (selector) { + return selector.createDerived(selector.elements, []); + }); newSelectorPath = newSelectorPath.concat(restOfPath); } return newSelectorPath; @@ -673,8 +671,7 @@ class Ruleset extends Node { } function mergeElementsOnToSelectors(elements, selectors) { - let i; - let sel; + let i, sel; if (elements.length === 0) { return ; @@ -709,18 +706,7 @@ class Ruleset extends Node { // } // == [[.a] [.c]] [[.b] [.c]] // - let i; - - let j; - let k; - let currentElements; - let newSelectors; - let selectorsMultiplied; - let sel; - let el; - let hadParentSelector = false; - let length; - let lastSelector; + let i, j, k, currentElements, newSelectors, selectorsMultiplied, sel, el, hadParentSelector = false, length, lastSelector; function findNestedSelector(element) { let maybeSelector; if (!(element.value instanceof Paren)) { @@ -832,10 +818,7 @@ class Ruleset extends Node { } // joinSelector code follows - let i; - - let newPaths; - let hadParentSelector; + let i, newPaths, hadParentSelector; newPaths = []; hadParentSelector = replaceParentSelector(newPaths, context, selector); @@ -859,6 +842,7 @@ class Ruleset extends Node { for (i = 0; i < newPaths.length; i++) { paths.push(newPaths[i]); } + } } diff --git a/packages/less/src/less/tree/selector.js b/packages/less/src/less/tree/selector.js index 2d5be797c..03be0eec2 100644 --- a/packages/less/src/less/tree/selector.js +++ b/packages/less/src/less/tree/selector.js @@ -62,8 +62,7 @@ class Selector extends Node { } createEmptySelectors() { - const el = new Element('', '&', false, this._index, this._fileInfo); - const sels = [new Selector([el], null, null, this._index, this._fileInfo)]; + const el = new Element('', '&', false, this._index, this._fileInfo), sels = [new Selector([el], null, null, this._index, this._fileInfo)]; sels[0].mediaEmpty = true; return sels; } @@ -94,7 +93,9 @@ class Selector extends Node { return this.mixinElements_; } - let elements = this.elements.map( v => v.combinator.value + (v.value.value || v.value)).join('').match(/[,&#\*\.\w-]([\w-]|(\\.))*/g); + let elements = this.elements.map( function(v) { + return v.combinator.value + (v.value.value || v.value); + }).join('').match(/[,&#\*\.\w-]([\w-]|(\\.))*/g); if (elements) { if (elements[0] === '&') { @@ -119,15 +120,14 @@ class Selector extends Node { let elements = this.elements; let extendList = this.extendList; - elements = elements && elements.map(e => e.eval(context)); - extendList = extendList && extendList.map(extend => extend.eval(context)); + elements = elements && elements.map(function (e) { return e.eval(context); }); + extendList = extendList && extendList.map(function(extend) { return extend.eval(context); }); return this.createDerived(elements, extendList, evaldCondition); } genCSS(context, output) { - let i; - let element; + let i, element; if ((!context || !context.firstSelector) && this.elements[0].combinator.value === '') { output.add(' ', this.fileInfo(), this.getIndex()); } diff --git a/packages/less/src/less/tree/unit.js b/packages/less/src/less/tree/unit.js index d76b47722..aae8d0e8b 100644 --- a/packages/less/src/less/tree/unit.js +++ b/packages/less/src/less/tree/unit.js @@ -32,8 +32,7 @@ class Unit extends Node { } toString() { - let i; - let returnStr = this.numerator.join('*'); + let i, returnStr = this.numerator.join('*'); for (i = 0; i < this.denominator.length; i++) { returnStr += `/${this.denominator[i]}`; } @@ -78,7 +77,7 @@ class Unit extends Node { let mapUnit; let groupName; - mapUnit = atomicUnit => { + mapUnit = function (atomicUnit) { /* jshint loopfunc:true */ if (group.hasOwnProperty(atomicUnit) && !result[groupName]) { result[groupName] = atomicUnit; diff --git a/packages/less/src/less/tree/url.js b/packages/less/src/less/tree/url.js index 4c1acdc16..ccdf7f333 100644 --- a/packages/less/src/less/tree/url.js +++ b/packages/less/src/less/tree/url.js @@ -59,7 +59,7 @@ class URL extends Node { URL.prototype.type = 'Url'; function escapePath(path) { - return path.replace(/[\(\)'"\s]/g, match => `\\${match}`); + return path.replace(/[\(\)'"\s]/g, function(match) { return `\\${match}`; }); } export default URL; diff --git a/packages/less/src/less/tree/value.js b/packages/less/src/less/tree/value.js index c21d0b294..f98d62f88 100644 --- a/packages/less/src/less/tree/value.js +++ b/packages/less/src/less/tree/value.js @@ -25,7 +25,9 @@ class Value extends Node { if (this.value.length === 1) { return this.value[0].eval(context); } else { - return new Value(this.value.map(v => v.eval(context))); + return new Value(this.value.map(function (v) { + return v.eval(context); + })); } } diff --git a/packages/less/src/less/tree/variable.js b/packages/less/src/less/tree/variable.js index 1c7e5f0c7..3b07e646a 100644 --- a/packages/less/src/less/tree/variable.js +++ b/packages/less/src/less/tree/variable.js @@ -11,8 +11,7 @@ class Variable extends Node { } eval(context) { - let variable; - let name = this.name; + let variable, name = this.name; if (name.indexOf('@@') === 0) { name = `@${new Variable(name.slice(1), this.getIndex(), this.fileInfo()).eval(context).value}`; @@ -27,7 +26,7 @@ class Variable extends Node { this.evaluating = true; - variable = this.find(context.frames, frame => { + variable = this.find(context.frames, function (frame) { const v = frame.variable(name); if (v) { if (v.important) { diff --git a/packages/less/src/less/visitors/extend-visitor.js b/packages/less/src/less/visitors/extend-visitor.js index f9e5b40c0..04a538f08 100644 --- a/packages/less/src/less/visitors/extend-visitor.js +++ b/packages/less/src/less/visitors/extend-visitor.js @@ -38,9 +38,7 @@ class ExtendFinderVisitor { let extendList; // get &:extend(.a); rules which apply to all selectors in this ruleset - const rules = rulesetNode.rules; - - const ruleCnt = rules ? rules.length : 0; + const rules = rulesetNode.rules, ruleCnt = rules ? rules.length : 0; for (i = 0; i < ruleCnt; i++) { if (rulesetNode.rules[i] instanceof tree.Extend) { allSelectorsExtendList.push(rules[i]); @@ -52,15 +50,15 @@ class ExtendFinderVisitor { // and the ones which apply to an individual extend const paths = rulesetNode.paths; for (i = 0; i < paths.length; i++) { - const selectorPath = paths[i]; - const selector = selectorPath[selectorPath.length - 1]; - const selExtendList = selector.extendList; + const selectorPath = paths[i], selector = selectorPath[selectorPath.length - 1], selExtendList = selector.extendList; extendList = selExtendList ? utils.copyArray(selExtendList).concat(allSelectorsExtendList) : allSelectorsExtendList; if (extendList) { - extendList = extendList.map(allSelectorsExtend => allSelectorsExtend.clone()); + extendList = extendList.map(function(allSelectorsExtend) { + return allSelectorsExtend.clone(); + }); } for (j = 0; j < extendList.length; j++) { @@ -120,7 +118,9 @@ class ProcessExtendsVisitor { checkExtendsForNonMatched(extendList) { const indices = this.extendIndices; - extendList.filter(extend => !extend.hasFoundMatches && extend.parent_ids.length == 1).forEach(extend => { + extendList.filter(function(extend) { + return !extend.hasFoundMatches && extend.parent_ids.length == 1; + }).forEach(function(extend) { let selector = '_unknown_'; try { selector = extend.selector.toCSS({}); @@ -181,7 +181,7 @@ class ProcessExtendsVisitor { extend.hasFoundMatches = true; // we found a match, so for each self selector.. - extend.selfSelectors.forEach(selfSelector => { + extend.selfSelectors.forEach(function(selfSelector) { const info = targetExtend.visibilityInfo(); // process the extend as usual @@ -276,7 +276,7 @@ class ProcessExtendsVisitor { if (matches.length) { allExtends[extendIndex].hasFoundMatches = true; - allExtends[extendIndex].selfSelectors.forEach(selfSelector => { + allExtends[extendIndex].selfSelectors.forEach(function(selfSelector) { let extendedSelectors; extendedSelectors = extendVisitor.extendSelector(matches, selectorPath, selfSelector, allExtends[extendIndex].isVisible()); selectorsToAdd.push(extendedSelectors); @@ -406,17 +406,10 @@ class ProcessExtendsVisitor { } extendSelector(matches, selectorPath, replacementSelector, isVisible) { - // for a set of matches, replace each match with the replacement selector - let currentSelectorPathIndex = 0; + // for a set of matches, replace each match with the replacement selector - let currentSelectorPathElementIndex = 0; - let path = []; - let matchIndex; - let selector; - let firstElement; - let match; - let newElements; + let currentSelectorPathIndex = 0, currentSelectorPathElementIndex = 0, path = [], matchIndex, selector, firstElement, match, newElements; for (matchIndex = 0; matchIndex < matches.length; matchIndex++) { match = matches[matchIndex]; @@ -466,7 +459,7 @@ class ProcessExtendsVisitor { } path = path.concat(selectorPath.slice(currentSelectorPathIndex, selectorPath.length)); - path = path.map(currentValue => { + path = path.map(function (currentValue) { // we can re-use elements here, because the visibility property matters only for selectors const derived = currentValue.createDerived(currentValue.elements); if (isVisible) { diff --git a/packages/less/src/less/visitors/import-sequencer.js b/packages/less/src/less/visitors/import-sequencer.js index b21f628b4..c2ddcc6e2 100644 --- a/packages/less/src/less/visitors/import-sequencer.js +++ b/packages/less/src/less/visitors/import-sequencer.js @@ -7,17 +7,15 @@ class ImportSequencer { } addImport(callback) { - const importSequencer = this; - - const importItem = { - callback, - args: null, - isReady: false - }; - + const importSequencer = this, + importItem = { + callback, + args: null, + isReady: false + }; this.imports.push(importItem); - return function(...args) { - importItem.args = Array.prototype.slice.call(args, 0); + return function() { + importItem.args = Array.prototype.slice.call(arguments, 0); importItem.isReady = true; importSequencer.tryRun(); }; diff --git a/packages/less/src/less/visitors/import-visitor.js b/packages/less/src/less/visitors/import-visitor.js index a83cd4331..d177c434d 100644 --- a/packages/less/src/less/visitors/import-visitor.js +++ b/packages/less/src/less/visitors/import-visitor.js @@ -67,6 +67,7 @@ ImportVisitor.prototype = { } if (evaldImportNode && (!evaldImportNode.css || inlineCSS)) { + if (evaldImportNode.options.multiple) { context.importMultiple = true; } @@ -81,8 +82,7 @@ ImportVisitor.prototype = { } } - const onImported = this.onImported.bind(this, evaldImportNode, context); - const sequencedOnImported = this._sequencer.addImport(onImported); + const onImported = this.onImported.bind(this, evaldImportNode, context), sequencedOnImported = this._sequencer.addImport(onImported); this._importer.push(evaldImportNode.getPath(), tryAppendLessExtension, evaldImportNode.fileInfo(), evaldImportNode.options, sequencedOnImported); @@ -101,17 +101,13 @@ ImportVisitor.prototype = { this.error = e; } - const importVisitor = this; - const inlineCSS = importNode.options.inline; - const isPlugin = importNode.options.isPlugin; - const isOptional = importNode.options.optional; - const duplicateImport = importedAtRoot || fullPath in importVisitor.recursionDetector; + const importVisitor = this, inlineCSS = importNode.options.inline, isPlugin = importNode.options.isPlugin, isOptional = importNode.options.optional, duplicateImport = importedAtRoot || fullPath in importVisitor.recursionDetector; if (!context.importMultiple) { if (duplicateImport) { importNode.skip = true; } else { - importNode.skip = () => { + importNode.skip = function() { if (fullPath in importVisitor.onceFileDetectionMap) { return true; } diff --git a/packages/less/src/less/visitors/join-selector-visitor.js b/packages/less/src/less/visitors/join-selector-visitor.js index d042ee3d0..6ec312709 100644 --- a/packages/less/src/less/visitors/join-selector-visitor.js +++ b/packages/less/src/less/visitors/join-selector-visitor.js @@ -28,7 +28,7 @@ class JoinSelectorVisitor { if (!rulesetNode.root) { selectors = rulesetNode.selectors; if (selectors) { - selectors = selectors.filter(selector => selector.getIsOutput()); + selectors = selectors.filter(function(selector) { return selector.getIsOutput(); }); rulesetNode.selectors = selectors.length ? selectors : (selectors = null); if (selectors) { rulesetNode.joinSelectors(paths, context, selectors); } } diff --git a/packages/less/src/less/visitors/visitor.js b/packages/less/src/less/visitors/visitor.js index 6f6bc5b08..9db634f4f 100644 --- a/packages/less/src/less/visitors/visitor.js +++ b/packages/less/src/less/visitors/visitor.js @@ -1,4 +1,5 @@ import tree from '../tree'; + const _visitArgs = { visitDeeper: true }; let _hasIndexed = false; @@ -8,9 +9,7 @@ function _noop(node) { function indexNodeTypes(parent, ticker) { // add .typeIndex to tree node types for lookup table - let key; - - let child; + let key, child; for (key in parent) { /* eslint guard-for-in: 0 */ child = parent[key]; @@ -82,7 +81,7 @@ class Visitor { if (visitArgs.visitDeeper && node) { if (node.length) { - for (var i = 0, cnt = node.length; i < cnt; i++) { + for (let i = 0, cnt = node.length; i < cnt; i++) { if (node[i].accept) { node[i].accept(this); } @@ -134,12 +133,7 @@ class Visitor { out = []; } - let cnt; - let i; - let item; - let nestedCnt; - let j; - let nestedItem; + let cnt, i, item, nestedCnt, j, nestedItem; for (i = 0, cnt = arr.length; i < cnt; i++) { item = arr[i]; diff --git a/packages/less/test/browser/less/errors/image-height-error.txt b/packages/less/test/browser/less/errors/image-height-error.txt index b5493fcd3..c5116d0a2 100644 --- a/packages/less/test/browser/less/errors/image-height-error.txt +++ b/packages/less/test/browser/less/errors/image-height-error.txt @@ -1,4 +1,4 @@ -RuntimeError: error evaluating function `image-height`: Image size functions are not supported in browser version of less in image-height-error.less on line 2, column 11: +RuntimeError: Error evaluating function `image-height`: Image size functions are not supported in browser version of less in image-height-error.less on line 2, column 11: 1 .test-height{ 2 height: image-height("../data/image.jpg") 3 } \ No newline at end of file diff --git a/packages/less/test/browser/less/errors/image-size-error.txt b/packages/less/test/browser/less/errors/image-size-error.txt index fdb0f37ba..399be5137 100644 --- a/packages/less/test/browser/less/errors/image-size-error.txt +++ b/packages/less/test/browser/less/errors/image-size-error.txt @@ -1,4 +1,4 @@ -RuntimeError: error evaluating function `image-size`: Image size functions are not supported in browser version of less in image-size-error.less on line 2, column 9: +RuntimeError: Error evaluating function `image-size`: Image size functions are not supported in browser version of less in image-size-error.less on line 2, column 9: 1 .test-size{ 2 size: image-size("../data/image.jpg") 3 } \ No newline at end of file diff --git a/packages/less/test/browser/less/errors/image-width-error.txt b/packages/less/test/browser/less/errors/image-width-error.txt index 57d85f4a9..03d814a9b 100644 --- a/packages/less/test/browser/less/errors/image-width-error.txt +++ b/packages/less/test/browser/less/errors/image-width-error.txt @@ -1,4 +1,4 @@ -RuntimeError: error evaluating function `image-width`: Image size functions are not supported in browser version of less in image-width-error.less on line 2, column 10: +RuntimeError: Error evaluating function `image-width`: Image size functions are not supported in browser version of less in image-width-error.less on line 2, column 10: 1 .test-width{ 2 width: image-width("../data/image.jpg") 3 } \ No newline at end of file From af37b0573073ce11d0c99df7c5b6364a1b057fd5 Mon Sep 17 00:00:00 2001 From: Matthew Dean Date: Sat, 5 Dec 2020 09:04:01 -0800 Subject: [PATCH 07/19] Restore this context for parse/render --- packages/less/Gruntfile.js | 2 +- packages/less/src/less/index.js | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/less/Gruntfile.js b/packages/less/Gruntfile.js index 0e7f044ba..bf967b102 100644 --- a/packages/less/Gruntfile.js +++ b/packages/less/Gruntfile.js @@ -230,7 +230,7 @@ module.exports = function(grunt) { }, test: { command: [ - // tsNodeRuntime + " test/test-es6.ts", + tsNodeRuntime + " test/test-es6.ts", "node test/index.js" ].join(' && ') }, diff --git a/packages/less/src/less/index.js b/packages/less/src/less/index.js index f027de952..ab7f7e411 100644 --- a/packages/less/src/less/index.js +++ b/packages/less/src/less/index.js @@ -82,5 +82,14 @@ export default function(environment, fileManagers) { } } + /** + * Some of the functions assume a `this` context of the API object, + * which causes it to fail when wrapped for ES6 imports. + * + * An assumed `this` should be removed in the future. + */ + initial.parse = initial.parse.bind(api); + initial.render = initial.render.bind(api); + return api; }; From ed7340982be9404298c8713cf00f12b8a5ae78c3 Mon Sep 17 00:00:00 2001 From: Matthew Dean Date: Sat, 5 Dec 2020 09:07:28 -0800 Subject: [PATCH 08/19] Version bump --- packages/less/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/less/package.json b/packages/less/package.json index 813fcb58c..e41b02a7d 100644 --- a/packages/less/package.json +++ b/packages/less/package.json @@ -1,6 +1,6 @@ { "name": "less", - "version": "3.12.2", + "version": "4.0.0", "description": "Leaner CSS", "homepage": "http://lesscss.org", "author": { From fe9ae944f689774c8c6558fc551361064886d1e1 Mon Sep 17 00:00:00 2001 From: Matthew Dean Date: Sat, 5 Dec 2020 09:11:38 -0800 Subject: [PATCH 09/19] Updated dist files --- dist/less.js | 22415 +++++++++++++-------------- dist/less.min.js | 4 +- dist/less.min.js.map | 2 +- packages/less/dist/less.js | 22415 +++++++++++++-------------- packages/less/dist/less.min.js | 4 +- packages/less/dist/less.min.js.map | 2 +- 6 files changed, 22398 insertions(+), 22444 deletions(-) diff --git a/dist/less.js b/dist/less.js index 8305c57f9..06749c853 100644 --- a/dist/less.js +++ b/dist/less.js @@ -1,5 +1,5 @@ /** - * Less - Leaner CSS v3.12.2 + * Less - Leaner CSS v3.12.1-alpha.13+ed734098 * http://lesscss.org * * Copyright (c) 2009-2020, Alexis Sellier @@ -9,11326 +9,11303 @@ */ (function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : - typeof define === 'function' && define.amd ? define(factory) : - (global = global || self, global.less = factory()); + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, global.less = factory()); }(this, (function () { 'use strict'; - // Export a new default each time - var defaultOptions = (function () { return ({ - /* Inline Javascript - @plugin still allowed */ - javascriptEnabled: false, - /* Outputs a makefile import dependency list to stdout. */ - depends: false, - /* (DEPRECATED) Compress using less built-in compression. - * This does an okay job but does not utilise all the tricks of - * dedicated css compression. */ - compress: false, - /* Runs the less parser and just reports errors without any output. */ - lint: false, - /* Sets available include paths. - * If the file in an @import rule does not exist at that exact location, - * less will look for it at the location(s) passed to this option. - * You might use this for instance to specify a path to a library which - * you want to be referenced simply and relatively in the less files. */ - paths: [], - /* color output in the terminal */ - color: true, - /* The strictImports controls whether the compiler will allow an @import inside of either - * @media blocks or (a later addition) other selector blocks. - * See: https://github.com/less/less.js/issues/656 */ - strictImports: false, - /* Allow Imports from Insecure HTTPS Hosts */ - insecure: false, - /* Allows you to add a path to every generated import and url in your css. - * This does not affect less import statements that are processed, just ones - * that are left in the output css. */ - rootpath: '', - /* By default URLs are kept as-is, so if you import a file in a sub-directory - * that references an image, exactly the same URL will be output in the css. - * This option allows you to re-write URL's in imported files so that the - * URL is always relative to the base imported file */ - rewriteUrls: false, - /* How to process math - * 0 always - eagerly try to solve all operations - * 1 parens-division - require parens for division "/" - * 2 parens | strict - require parens for all operations - * 3 strict-legacy - legacy strict behavior (super-strict) - */ - math: 0, - /* Without this option, less attempts to guess at the output unit when it does maths. */ - strictUnits: false, - /* Effectively the declaration is put at the top of your base Less file, - * meaning it can be used but it also can be overridden if this variable - * is defined in the file. */ - globalVars: null, - /* As opposed to the global variable option, this puts the declaration at the - * end of your base file, meaning it will override anything defined in your Less file. */ - modifyVars: null, - /* This option allows you to specify a argument to go on to every URL. */ - urlArgs: '' - }); }); + // Export a new default each time + function defaultOptions () { + return { + /* Inline Javascript - @plugin still allowed */ + javascriptEnabled: false, + /* Outputs a makefile import dependency list to stdout. */ + depends: false, + /* (DEPRECATED) Compress using less built-in compression. + * This does an okay job but does not utilise all the tricks of + * dedicated css compression. */ + compress: false, + /* Runs the less parser and just reports errors without any output. */ + lint: false, + /* Sets available include paths. + * If the file in an @import rule does not exist at that exact location, + * less will look for it at the location(s) passed to this option. + * You might use this for instance to specify a path to a library which + * you want to be referenced simply and relatively in the less files. */ + paths: [], + /* color output in the terminal */ + color: true, + /* The strictImports controls whether the compiler will allow an @import inside of either + * @media blocks or (a later addition) other selector blocks. + * See: https://github.com/less/less.js/issues/656 */ + strictImports: false, + /* Allow Imports from Insecure HTTPS Hosts */ + insecure: false, + /* Allows you to add a path to every generated import and url in your css. + * This does not affect less import statements that are processed, just ones + * that are left in the output css. */ + rootpath: '', + /* By default URLs are kept as-is, so if you import a file in a sub-directory + * that references an image, exactly the same URL will be output in the css. + * This option allows you to re-write URL's in imported files so that the + * URL is always relative to the base imported file */ + rewriteUrls: false, + /* How to process math + * 0 always - eagerly try to solve all operations + * 1 parens-division - require parens for division "/" + * 2 parens | strict - require parens for all operations + * 3 strict-legacy - legacy strict behavior (super-strict) + */ + math: 1, + /* Without this option, less attempts to guess at the output unit when it does maths. */ + strictUnits: false, + /* Effectively the declaration is put at the top of your base Less file, + * meaning it can be used but it also can be overridden if this variable + * is defined in the file. */ + globalVars: null, + /* As opposed to the global variable option, this puts the declaration at the + * end of your base file, meaning it will override anything defined in your Less file. */ + modifyVars: null, + /* This option allows you to specify a argument to go on to every URL. */ + urlArgs: '' + }; + } - function extractId(href) { - return href.replace(/^[a-z-]+:\/+?[^\/]+/, '') // Remove protocol & domain - .replace(/[\?\&]livereload=\w+/, '') // Remove LiveReload cachebuster - .replace(/^\//, '') // Remove root / - .replace(/\.[a-zA-Z]+$/, '') // Remove simple extension - .replace(/[^\.\w-]+/g, '-') // Replace illegal characters - .replace(/\./g, ':'); // Replace dots with colons(for valid id) - } - function addDataAttr(options, tag) { - for (var opt in tag.dataset) { - if (tag.dataset.hasOwnProperty(opt)) { - if (opt === 'env' || opt === 'dumpLineNumbers' || opt === 'rootpath' || opt === 'errorReporting') { - options[opt] = tag.dataset[opt]; - } - else { - try { - options[opt] = JSON.parse(tag.dataset[opt]); - } - catch (_) { } - } - } - } - } + function extractId(href) { + return href.replace(/^[a-z-]+:\/+?[^\/]+/, '') // Remove protocol & domain + .replace(/[\?\&]livereload=\w+/, '') // Remove LiveReload cachebuster + .replace(/^\//, '') // Remove root / + .replace(/\.[a-zA-Z]+$/, '') // Remove simple extension + .replace(/[^\.\w-]+/g, '-') // Replace illegal characters + .replace(/\./g, ':'); // Replace dots with colons(for valid id) + } + function addDataAttr(options, tag) { + for (var opt in tag.dataset) { + if (tag.dataset.hasOwnProperty(opt)) { + if (opt === 'env' || opt === 'dumpLineNumbers' || opt === 'rootpath' || opt === 'errorReporting') { + options[opt] = tag.dataset[opt]; + } + else { + try { + options[opt] = JSON.parse(tag.dataset[opt]); + } + catch (_) { } + } + } + } + } - var browser = { - createCSS: function (document, styles, sheet) { - // Strip the query-string - var href = sheet.href || ''; - // If there is no title set, use the filename, minus the extension - var id = "less:" + (sheet.title || extractId(href)); - // If this has already been inserted into the DOM, we may need to replace it - var oldStyleNode = document.getElementById(id); - var keepOldStyleNode = false; - // Create a new stylesheet node for insertion or (if necessary) replacement - var styleNode = document.createElement('style'); - styleNode.setAttribute('type', 'text/css'); - if (sheet.media) { - styleNode.setAttribute('media', sheet.media); - } - styleNode.id = id; - if (!styleNode.styleSheet) { - styleNode.appendChild(document.createTextNode(styles)); - // If new contents match contents of oldStyleNode, don't replace oldStyleNode - keepOldStyleNode = (oldStyleNode !== null && oldStyleNode.childNodes.length > 0 && styleNode.childNodes.length > 0 && - oldStyleNode.firstChild.nodeValue === styleNode.firstChild.nodeValue); - } - var head = document.getElementsByTagName('head')[0]; - // If there is no oldStyleNode, just append; otherwise, only append if we need - // to replace oldStyleNode with an updated stylesheet - if (oldStyleNode === null || keepOldStyleNode === false) { - var nextEl = sheet && sheet.nextSibling || null; - if (nextEl) { - nextEl.parentNode.insertBefore(styleNode, nextEl); - } - else { - head.appendChild(styleNode); - } - } - if (oldStyleNode && keepOldStyleNode === false) { - oldStyleNode.parentNode.removeChild(oldStyleNode); - } - // For IE. - // This needs to happen *after* the style element is added to the DOM, otherwise IE 7 and 8 may crash. - // See http://social.msdn.microsoft.com/Forums/en-US/7e081b65-878a-4c22-8e68-c10d39c2ed32/internet-explorer-crashes-appending-style-element-to-head - if (styleNode.styleSheet) { - try { - styleNode.styleSheet.cssText = styles; - } - catch (e) { - throw new Error('Couldn\'t reassign styleSheet.cssText.'); - } - } - }, - currentScript: function (window) { - var document = window.document; - return document.currentScript || (function () { - var scripts = document.getElementsByTagName('script'); - return scripts[scripts.length - 1]; - })(); - } - }; + var browser = { + createCSS: function (document, styles, sheet) { + // Strip the query-string + var href = sheet.href || ''; + // If there is no title set, use the filename, minus the extension + var id = "less:" + (sheet.title || extractId(href)); + // If this has already been inserted into the DOM, we may need to replace it + var oldStyleNode = document.getElementById(id); + var keepOldStyleNode = false; + // Create a new stylesheet node for insertion or (if necessary) replacement + var styleNode = document.createElement('style'); + styleNode.setAttribute('type', 'text/css'); + if (sheet.media) { + styleNode.setAttribute('media', sheet.media); + } + styleNode.id = id; + if (!styleNode.styleSheet) { + styleNode.appendChild(document.createTextNode(styles)); + // If new contents match contents of oldStyleNode, don't replace oldStyleNode + keepOldStyleNode = (oldStyleNode !== null && oldStyleNode.childNodes.length > 0 && styleNode.childNodes.length > 0 && + oldStyleNode.firstChild.nodeValue === styleNode.firstChild.nodeValue); + } + var head = document.getElementsByTagName('head')[0]; + // If there is no oldStyleNode, just append; otherwise, only append if we need + // to replace oldStyleNode with an updated stylesheet + if (oldStyleNode === null || keepOldStyleNode === false) { + var nextEl = sheet && sheet.nextSibling || null; + if (nextEl) { + nextEl.parentNode.insertBefore(styleNode, nextEl); + } + else { + head.appendChild(styleNode); + } + } + if (oldStyleNode && keepOldStyleNode === false) { + oldStyleNode.parentNode.removeChild(oldStyleNode); + } + // For IE. + // This needs to happen *after* the style element is added to the DOM, otherwise IE 7 and 8 may crash. + // See http://social.msdn.microsoft.com/Forums/en-US/7e081b65-878a-4c22-8e68-c10d39c2ed32/internet-explorer-crashes-appending-style-element-to-head + if (styleNode.styleSheet) { + try { + styleNode.styleSheet.cssText = styles; + } + catch (e) { + throw new Error('Couldn\'t reassign styleSheet.cssText.'); + } + } + }, + currentScript: function (window) { + var document = window.document; + return document.currentScript || (function () { + var scripts = document.getElementsByTagName('script'); + return scripts[scripts.length - 1]; + })(); + } + }; - var addDefaultOptions = (function (window, options) { - // use options from the current script tag data attribues - addDataAttr(options, browser.currentScript(window)); - if (options.isFileProtocol === undefined) { - options.isFileProtocol = /^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(window.location.protocol); - } - // Load styles asynchronously (default: false) - // - // This is set to `false` by default, so that the body - // doesn't start loading before the stylesheets are parsed. - // Setting this to `true` can result in flickering. - // - options.async = options.async || false; - options.fileAsync = options.fileAsync || false; - // Interval between watch polls - options.poll = options.poll || (options.isFileProtocol ? 1000 : 1500); - options.env = options.env || (window.location.hostname == '127.0.0.1' || - window.location.hostname == '0.0.0.0' || - window.location.hostname == 'localhost' || - (window.location.port && - window.location.port.length > 0) || - options.isFileProtocol ? 'development' - : 'production'); - var dumpLineNumbers = /!dumpLineNumbers:(comments|mediaquery|all)/.exec(window.location.hash); - if (dumpLineNumbers) { - options.dumpLineNumbers = dumpLineNumbers[1]; - } - if (options.useFileCache === undefined) { - options.useFileCache = true; - } - if (options.onReady === undefined) { - options.onReady = true; - } - if (options.relativeUrls) { - options.rewriteUrls = 'all'; - } - }); + var addDefaultOptions = (function (window, options) { + // use options from the current script tag data attribues + addDataAttr(options, browser.currentScript(window)); + if (options.isFileProtocol === undefined) { + options.isFileProtocol = /^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(window.location.protocol); + } + // Load styles asynchronously (default: false) + // + // This is set to `false` by default, so that the body + // doesn't start loading before the stylesheets are parsed. + // Setting this to `true` can result in flickering. + // + options.async = options.async || false; + options.fileAsync = options.fileAsync || false; + // Interval between watch polls + options.poll = options.poll || (options.isFileProtocol ? 1000 : 1500); + options.env = options.env || (window.location.hostname == '127.0.0.1' || + window.location.hostname == '0.0.0.0' || + window.location.hostname == 'localhost' || + (window.location.port && + window.location.port.length > 0) || + options.isFileProtocol ? 'development' + : 'production'); + var dumpLineNumbers = /!dumpLineNumbers:(comments|mediaquery|all)/.exec(window.location.hash); + if (dumpLineNumbers) { + options.dumpLineNumbers = dumpLineNumbers[1]; + } + if (options.useFileCache === undefined) { + options.useFileCache = true; + } + if (options.onReady === undefined) { + options.onReady = true; + } + if (options.relativeUrls) { + options.rewriteUrls = 'all'; + } + }); - /*! ***************************************************************************** - Copyright (c) Microsoft Corporation. + var logger = { + error: function (msg) { + this._fireEvent('error', msg); + }, + warn: function (msg) { + this._fireEvent('warn', msg); + }, + info: function (msg) { + this._fireEvent('info', msg); + }, + debug: function (msg) { + this._fireEvent('debug', msg); + }, + addListener: function (listener) { + this._listeners.push(listener); + }, + removeListener: function (listener) { + for (var i = 0; i < this._listeners.length; i++) { + if (this._listeners[i] === listener) { + this._listeners.splice(i, 1); + return; + } + } + }, + _fireEvent: function (type, msg) { + for (var i = 0; i < this._listeners.length; i++) { + var logFunction = this._listeners[i][type]; + if (logFunction) { + logFunction(msg); + } + } + }, + _listeners: [] + }; - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted. + /** + * @todo Document why this abstraction exists, and the relationship between + * environment, file managers, and plugin manager + */ + var Environment = /** @class */ (function () { + function Environment(externalEnvironment, fileManagers) { + this.fileManagers = fileManagers || []; + externalEnvironment = externalEnvironment || {}; + var optionalFunctions = ['encodeBase64', 'mimeLookup', 'charsetLookup', 'getSourceMapGenerator']; + var requiredFunctions = []; + var functions = requiredFunctions.concat(optionalFunctions); + for (var i = 0; i < functions.length; i++) { + var propName = functions[i]; + var environmentFunc = externalEnvironment[propName]; + if (environmentFunc) { + this[propName] = environmentFunc.bind(externalEnvironment); + } + else if (i < requiredFunctions.length) { + this.warn("missing required function in environment - " + propName); + } + } + } + Environment.prototype.getFileManager = function (filename, currentDirectory, options, environment, isSync) { + if (!filename) { + logger.warn('getFileManager called with no filename.. Please report this issue. continuing.'); + } + if (currentDirectory == null) { + logger.warn('getFileManager called with null directory.. Please report this issue. continuing.'); + } + var fileManagers = this.fileManagers; + if (options.pluginManager) { + fileManagers = [].concat(fileManagers).concat(options.pluginManager.getFileManagers()); + } + for (var i = fileManagers.length - 1; i >= 0; i--) { + var fileManager = fileManagers[i]; + if (fileManager[isSync ? 'supportsSync' : 'supports'](filename, currentDirectory, options, environment)) { + return fileManager; + } + } + return null; + }; + Environment.prototype.addFileManager = function (fileManager) { + this.fileManagers.push(fileManager); + }; + Environment.prototype.clearFileManagers = function () { + this.fileManagers = []; + }; + return Environment; + }()); - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, - INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR - OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. - ***************************************************************************** */ - /* global Reflect, Promise */ - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) - if (b.hasOwnProperty(p)) - d[p] = b[p]; }; - return extendStatics(d, b); - }; - function __extends(d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - } - var __assign = function () { - __assign = Object.assign || function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) - if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); - }; - function __spreadArrays() { - for (var s = 0, i = 0, il = arguments.length; i < il; i++) - s += arguments[i].length; - for (var r = Array(s), k = 0, i = 0; i < il; i++) - for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) - r[k] = a[j]; - return r; - } + var colors = { + 'aliceblue': '#f0f8ff', + 'antiquewhite': '#faebd7', + 'aqua': '#00ffff', + 'aquamarine': '#7fffd4', + 'azure': '#f0ffff', + 'beige': '#f5f5dc', + 'bisque': '#ffe4c4', + 'black': '#000000', + 'blanchedalmond': '#ffebcd', + 'blue': '#0000ff', + 'blueviolet': '#8a2be2', + 'brown': '#a52a2a', + 'burlywood': '#deb887', + 'cadetblue': '#5f9ea0', + 'chartreuse': '#7fff00', + 'chocolate': '#d2691e', + 'coral': '#ff7f50', + 'cornflowerblue': '#6495ed', + 'cornsilk': '#fff8dc', + 'crimson': '#dc143c', + 'cyan': '#00ffff', + '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': '#ff00ff', + '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': '#778899', + 'lightslategrey': '#778899', + 'lightsteelblue': '#b0c4de', + 'lightyellow': '#ffffe0', + 'lime': '#00ff00', + 'limegreen': '#32cd32', + 'linen': '#faf0e6', + 'magenta': '#ff00ff', + 'maroon': '#800000', + 'mediumaquamarine': '#66cdaa', + 'mediumblue': '#0000cd', + 'mediumorchid': '#ba55d3', + 'mediumpurple': '#9370d8', + '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': '#d87093', + 'papayawhip': '#ffefd5', + 'peachpuff': '#ffdab9', + 'peru': '#cd853f', + 'pink': '#ffc0cb', + 'plum': '#dda0dd', + 'powderblue': '#b0e0e6', + 'purple': '#800080', + 'rebeccapurple': '#663399', + 'red': '#ff0000', + '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': '#ffffff', + 'whitesmoke': '#f5f5f5', + 'yellow': '#ffff00', + 'yellowgreen': '#9acd32' + }; - var colors = { - 'aliceblue': '#f0f8ff', - 'antiquewhite': '#faebd7', - 'aqua': '#00ffff', - 'aquamarine': '#7fffd4', - 'azure': '#f0ffff', - 'beige': '#f5f5dc', - 'bisque': '#ffe4c4', - 'black': '#000000', - 'blanchedalmond': '#ffebcd', - 'blue': '#0000ff', - 'blueviolet': '#8a2be2', - 'brown': '#a52a2a', - 'burlywood': '#deb887', - 'cadetblue': '#5f9ea0', - 'chartreuse': '#7fff00', - 'chocolate': '#d2691e', - 'coral': '#ff7f50', - 'cornflowerblue': '#6495ed', - 'cornsilk': '#fff8dc', - 'crimson': '#dc143c', - 'cyan': '#00ffff', - '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': '#ff00ff', - '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': '#778899', - 'lightslategrey': '#778899', - 'lightsteelblue': '#b0c4de', - 'lightyellow': '#ffffe0', - 'lime': '#00ff00', - 'limegreen': '#32cd32', - 'linen': '#faf0e6', - 'magenta': '#ff00ff', - 'maroon': '#800000', - 'mediumaquamarine': '#66cdaa', - 'mediumblue': '#0000cd', - 'mediumorchid': '#ba55d3', - 'mediumpurple': '#9370d8', - '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': '#d87093', - 'papayawhip': '#ffefd5', - 'peachpuff': '#ffdab9', - 'peru': '#cd853f', - 'pink': '#ffc0cb', - 'plum': '#dda0dd', - 'powderblue': '#b0e0e6', - 'purple': '#800080', - 'rebeccapurple': '#663399', - 'red': '#ff0000', - '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': '#ffffff', - 'whitesmoke': '#f5f5f5', - 'yellow': '#ffff00', - 'yellowgreen': '#9acd32' - }; + var unitConversions = { + length: { + 'm': 1, + 'cm': 0.01, + 'mm': 0.001, + 'in': 0.0254, + 'px': 0.0254 / 96, + 'pt': 0.0254 / 72, + 'pc': 0.0254 / 72 * 12 + }, + duration: { + 's': 1, + 'ms': 0.001 + }, + angle: { + 'rad': 1 / (2 * Math.PI), + 'deg': 1 / 360, + 'grad': 1 / 400, + 'turn': 1 + } + }; - var unitConversions = { - length: { - 'm': 1, - 'cm': 0.01, - 'mm': 0.001, - 'in': 0.0254, - 'px': 0.0254 / 96, - 'pt': 0.0254 / 72, - 'pc': 0.0254 / 72 * 12 - }, - duration: { - 's': 1, - 'ms': 0.001 - }, - angle: { - 'rad': 1 / (2 * Math.PI), - 'deg': 1 / 360, - 'grad': 1 / 400, - 'turn': 1 - } - }; + var data = { colors: colors, unitConversions: unitConversions }; - var data = { colors: colors, unitConversions: unitConversions }; + var Node = /** @class */ (function () { + function Node() { + this.parent = null; + this.visibilityBlocks = undefined; + this.nodeVisible = undefined; + this.rootNode = null; + this.parsed = null; + var self = this; + Object.defineProperty(this, 'currentFileInfo', { + get: function () { return self.fileInfo(); } + }); + Object.defineProperty(this, 'index', { + get: function () { return self.getIndex(); } + }); + } + Node.prototype.setParent = function (nodes, parent) { + function set(node) { + if (node && node instanceof Node) { + node.parent = parent; + } + } + if (Array.isArray(nodes)) { + nodes.forEach(set); + } + else { + set(nodes); + } + }; + Node.prototype.getIndex = function () { + return this._index || (this.parent && this.parent.getIndex()) || 0; + }; + Node.prototype.fileInfo = function () { + return this._fileInfo || (this.parent && this.parent.fileInfo()) || {}; + }; + Node.prototype.isRulesetLike = function () { return false; }; + Node.prototype.toCSS = function (context) { + var strs = []; + this.genCSS(context, { + add: function (chunk, fileInfo, index) { + strs.push(chunk); + }, + isEmpty: function () { + return strs.length === 0; + } + }); + return strs.join(''); + }; + Node.prototype.genCSS = function (context, output) { + output.add(this.value); + }; + Node.prototype.accept = function (visitor) { + this.value = visitor.visit(this.value); + }; + Node.prototype.eval = function () { return this; }; + Node.prototype._operate = function (context, op, a, b) { + switch (op) { + case '+': return a + b; + case '-': return a - b; + case '*': return a * b; + case '/': return a / b; + } + }; + Node.prototype.fround = function (context, value) { + var precision = context && context.numPrecision; + // add "epsilon" to ensure numbers like 1.000000005 (represented as 1.000000004999...) are properly rounded: + return (precision) ? Number((value + 2e-16).toFixed(precision)) : value; + }; + Node.compare = function (a, b) { + /* returns: + -1: a < b + 0: a = b + 1: a > b + and *any* other value for a != b (e.g. undefined, NaN, -2 etc.) */ + if ((a.compare) && + // for "symmetric results" force toCSS-based comparison + // of Quoted or Anonymous if either value is one of those + !(b.type === 'Quoted' || b.type === 'Anonymous')) { + return a.compare(b); + } + else if (b.compare) { + return -b.compare(a); + } + else if (a.type !== b.type) { + return undefined; + } + a = a.value; + b = b.value; + if (!Array.isArray(a)) { + return a === b ? 0 : undefined; + } + if (a.length !== b.length) { + return undefined; + } + for (var i = 0; i < a.length; i++) { + if (Node.compare(a[i], b[i]) !== 0) { + return undefined; + } + } + return 0; + }; + Node.numericCompare = function (a, b) { + return a < b ? -1 + : a === b ? 0 + : a > b ? 1 : undefined; + }; + // Returns true if this node represents root of ast imported by reference + Node.prototype.blocksVisibility = function () { + if (this.visibilityBlocks == null) { + this.visibilityBlocks = 0; + } + return this.visibilityBlocks !== 0; + }; + Node.prototype.addVisibilityBlock = function () { + if (this.visibilityBlocks == null) { + this.visibilityBlocks = 0; + } + this.visibilityBlocks = this.visibilityBlocks + 1; + }; + Node.prototype.removeVisibilityBlock = function () { + if (this.visibilityBlocks == null) { + this.visibilityBlocks = 0; + } + this.visibilityBlocks = this.visibilityBlocks - 1; + }; + // Turns on node visibility - if called node will be shown in output regardless + // of whether it comes from import by reference or not + Node.prototype.ensureVisibility = function () { + this.nodeVisible = true; + }; + // Turns off node visibility - if called node will NOT be shown in output regardless + // of whether it comes from import by reference or not + Node.prototype.ensureInvisibility = function () { + this.nodeVisible = false; + }; + // return values: + // false - the node must not be visible + // true - the node must be visible + // undefined or null - the node has the same visibility as its parent + Node.prototype.isVisible = function () { + return this.nodeVisible; + }; + Node.prototype.visibilityInfo = function () { + return { + visibilityBlocks: this.visibilityBlocks, + nodeVisible: this.nodeVisible + }; + }; + Node.prototype.copyVisibilityInfo = function (info) { + if (!info) { + return; + } + this.visibilityBlocks = info.visibilityBlocks; + this.nodeVisible = info.nodeVisible; + }; + return Node; + }()); - var Node = /** @class */ (function () { - function Node() { - this.parent = null; - this.visibilityBlocks = undefined; - this.nodeVisible = undefined; - this.rootNode = null; - this.parsed = null; - var self = this; - Object.defineProperty(this, 'currentFileInfo', { - get: function () { return self.fileInfo(); } - }); - Object.defineProperty(this, 'index', { - get: function () { return self.getIndex(); } - }); - } - Node.prototype.setParent = function (nodes, parent) { - function set(node) { - if (node && node instanceof Node) { - node.parent = parent; - } - } - if (Array.isArray(nodes)) { - nodes.forEach(set); - } - else { - set(nodes); - } - }; - Node.prototype.getIndex = function () { - return this._index || (this.parent && this.parent.getIndex()) || 0; - }; - Node.prototype.fileInfo = function () { - return this._fileInfo || (this.parent && this.parent.fileInfo()) || {}; - }; - Node.prototype.isRulesetLike = function () { - return false; - }; - Node.prototype.toCSS = function (context) { - var strs = []; - this.genCSS(context, { - add: function (chunk, fileInfo, index) { - strs.push(chunk); - }, - isEmpty: function () { - return strs.length === 0; - } - }); - return strs.join(''); - }; - Node.prototype.genCSS = function (context, output) { - output.add(this.value); - }; - Node.prototype.accept = function (visitor) { - this.value = visitor.visit(this.value); - }; - Node.prototype.eval = function () { return this; }; - Node.prototype._operate = function (context, op, a, b) { - switch (op) { - case '+': return a + b; - case '-': return a - b; - case '*': return a * b; - case '/': return a / b; - } - }; - Node.prototype.fround = function (context, value) { - var precision = context && context.numPrecision; - // add "epsilon" to ensure numbers like 1.000000005 (represented as 1.000000004999...) are properly rounded: - return (precision) ? Number((value + 2e-16).toFixed(precision)) : value; - }; - // Returns true if this node represents root of ast imported by reference - Node.prototype.blocksVisibility = function () { - if (this.visibilityBlocks == null) { - this.visibilityBlocks = 0; - } - return this.visibilityBlocks !== 0; - }; - Node.prototype.addVisibilityBlock = function () { - if (this.visibilityBlocks == null) { - this.visibilityBlocks = 0; - } - this.visibilityBlocks = this.visibilityBlocks + 1; - }; - Node.prototype.removeVisibilityBlock = function () { - if (this.visibilityBlocks == null) { - this.visibilityBlocks = 0; - } - this.visibilityBlocks = this.visibilityBlocks - 1; - }; - // Turns on node visibility - if called node will be shown in output regardless - // of whether it comes from import by reference or not - Node.prototype.ensureVisibility = function () { - this.nodeVisible = true; - }; - // Turns off node visibility - if called node will NOT be shown in output regardless - // of whether it comes from import by reference or not - Node.prototype.ensureInvisibility = function () { - this.nodeVisible = false; - }; - // return values: - // false - the node must not be visible - // true - the node must be visible - // undefined or null - the node has the same visibility as its parent - Node.prototype.isVisible = function () { - return this.nodeVisible; - }; - Node.prototype.visibilityInfo = function () { - return { - visibilityBlocks: this.visibilityBlocks, - nodeVisible: this.nodeVisible - }; - }; - Node.prototype.copyVisibilityInfo = function (info) { - if (!info) { - return; - } - this.visibilityBlocks = info.visibilityBlocks; - this.nodeVisible = info.nodeVisible; - }; - return Node; - }()); - Node.compare = function (a, b) { - /* returns: - -1: a < b - 0: a = b - 1: a > b - and *any* other value for a != b (e.g. undefined, NaN, -2 etc.) */ - if ((a.compare) && - // for "symmetric results" force toCSS-based comparison - // of Quoted or Anonymous if either value is one of those - !(b.type === 'Quoted' || b.type === 'Anonymous')) { - return a.compare(b); - } - else if (b.compare) { - return -b.compare(a); - } - else if (a.type !== b.type) { - return undefined; - } - a = a.value; - b = b.value; - if (!Array.isArray(a)) { - return a === b ? 0 : undefined; - } - if (a.length !== b.length) { - return undefined; - } - for (var i = 0; i < a.length; i++) { - if (Node.compare(a[i], b[i]) !== 0) { - return undefined; - } - } - return 0; - }; - Node.numericCompare = function (a, b) { return a < b ? -1 - : a === b ? 0 - : a > b ? 1 : undefined; }; + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. - // - // RGB Colors - #ff0014, #eee - // - var Color = /** @class */ (function (_super) { - __extends(Color, _super); - function Color(rgb, a, originalForm) { - var _this = _super.call(this) || this; - var self = _this; - // - // The end goal here, is to parse the arguments - // into an integer triplet, such as `128, 255, 0` - // - // This facilitates operations and conversions. - // - if (Array.isArray(rgb)) { - _this.rgb = rgb; - } - else if (rgb.length >= 6) { - _this.rgb = []; - rgb.match(/.{2}/g).map(function (c, i) { - if (i < 3) { - self.rgb.push(parseInt(c, 16)); - } - else { - self.alpha = (parseInt(c, 16)) / 255; - } - }); - } - else { - _this.rgb = []; - rgb.split('').map(function (c, i) { - if (i < 3) { - self.rgb.push(parseInt(c + c, 16)); - } - else { - self.alpha = (parseInt(c + c, 16)) / 255; - } - }); - } - _this.alpha = _this.alpha || (typeof a === 'number' ? a : 1); - if (typeof originalForm !== 'undefined') { - _this.value = originalForm; - } - return _this; - } - Color.prototype.luma = function () { - var r = this.rgb[0] / 255; - var g = this.rgb[1] / 255; - var b = this.rgb[2] / 255; - r = (r <= 0.03928) ? r / 12.92 : Math.pow(((r + 0.055) / 1.055), 2.4); - g = (g <= 0.03928) ? g / 12.92 : Math.pow(((g + 0.055) / 1.055), 2.4); - b = (b <= 0.03928) ? b / 12.92 : Math.pow(((b + 0.055) / 1.055), 2.4); - return 0.2126 * r + 0.7152 * g + 0.0722 * b; - }; - Color.prototype.genCSS = function (context, output) { - output.add(this.toCSS(context)); - }; - Color.prototype.toCSS = function (context, doNotCompress) { - var compress = context && context.compress && !doNotCompress; - var color; - var alpha; - var colorFunction; - var args = []; - // `value` is set if this color was originally - // converted from a named color string so we need - // to respect this and try to output named color too. - alpha = this.fround(context, this.alpha); - if (this.value) { - if (this.value.indexOf('rgb') === 0) { - if (alpha < 1) { - colorFunction = 'rgba'; - } - } - else if (this.value.indexOf('hsl') === 0) { - if (alpha < 1) { - colorFunction = 'hsla'; - } - else { - colorFunction = 'hsl'; - } - } - else { - return this.value; - } - } - else { - if (alpha < 1) { - colorFunction = 'rgba'; - } - } - switch (colorFunction) { - case 'rgba': - args = this.rgb.map(function (c) { return clamp(Math.round(c), 255); }).concat(clamp(alpha, 1)); - break; - case 'hsla': - args.push(clamp(alpha, 1)); - case 'hsl': - color = this.toHSL(); - args = [ - this.fround(context, color.h), - this.fround(context, color.s * 100) + "%", - this.fround(context, color.l * 100) + "%" - ].concat(args); - } - if (colorFunction) { - // Values are capped between `0` and `255`, rounded and zero-padded. - return colorFunction + "(" + args.join("," + (compress ? '' : ' ')) + ")"; - } - color = this.toRGB(); - if (compress) { - var splitcolor = color.split(''); - // Convert color to short format - if (splitcolor[1] === splitcolor[2] && splitcolor[3] === splitcolor[4] && splitcolor[5] === splitcolor[6]) { - color = "#" + splitcolor[1] + splitcolor[3] + splitcolor[5]; - } - } - return color; - }; - // - // Operations have to be done per-channel, if not, - // channels will spill onto each other. Once we have - // our result, in the form of an integer triplet, - // we create a new Color node to hold the result. - // - Color.prototype.operate = function (context, op, other) { - var rgb = new Array(3); - var alpha = this.alpha * (1 - other.alpha) + other.alpha; - for (var c = 0; c < 3; c++) { - rgb[c] = this._operate(context, op, this.rgb[c], other.rgb[c]); - } - return new Color(rgb, alpha); - }; - Color.prototype.toRGB = function () { - return toHex(this.rgb); - }; - Color.prototype.toHSL = function () { - var r = this.rgb[0] / 255; - var g = this.rgb[1] / 255; - var b = this.rgb[2] / 255; - var a = this.alpha; - var max = Math.max(r, g, b); - var min = Math.min(r, g, b); - var h; - var s; - var l = (max + min) / 2; - var d = max - min; - if (max === min) { - h = s = 0; - } - else { - s = l > 0.5 ? d / (2 - max - min) : d / (max + min); - switch (max) { - case r: - h = (g - b) / d + (g < b ? 6 : 0); - break; - case g: - h = (b - r) / d + 2; - break; - case b: - h = (r - g) / d + 4; - break; - } - h /= 6; - } - return { h: h * 360, s: s, l: l, a: a }; - }; - // Adapted from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript - Color.prototype.toHSV = function () { - var r = this.rgb[0] / 255; - var g = this.rgb[1] / 255; - var b = this.rgb[2] / 255; - var a = this.alpha; - var max = Math.max(r, g, b); - var min = Math.min(r, g, b); - var h; - var s; - var v = max; - var d = max - min; - if (max === 0) { - s = 0; - } - else { - s = d / max; - } - if (max === min) { - h = 0; - } - else { - switch (max) { - case r: - h = (g - b) / d + (g < b ? 6 : 0); - break; - case g: - h = (b - r) / d + 2; - break; - case b: - h = (r - g) / d + 4; - break; - } - h /= 6; - } - return { h: h * 360, s: s, v: v, a: a }; - }; - Color.prototype.toARGB = function () { - return toHex([this.alpha * 255].concat(this.rgb)); - }; - Color.prototype.compare = function (x) { - return (x.rgb && - x.rgb[0] === this.rgb[0] && - x.rgb[1] === this.rgb[1] && - x.rgb[2] === this.rgb[2] && - x.alpha === this.alpha) ? 0 : undefined; - }; - return Color; - }(Node)); - Color.prototype.type = 'Color'; - function clamp(v, max) { - return Math.min(Math.max(v, 0), max); - } - function toHex(v) { - return "#" + v.map(function (c) { - c = clamp(Math.round(c), 255); - return (c < 16 ? '0' : '') + c.toString(16); - }).join(''); - } - Color.fromKeyword = function (keyword) { - var c; - var key = keyword.toLowerCase(); - if (colors.hasOwnProperty(key)) { - c = new Color(colors[key].slice(1)); - } - else if (key === 'transparent') { - c = new Color([0, 0, 0], 0); - } - if (c) { - c.value = keyword; - return c; - } - }; + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted. - var Paren = /** @class */ (function (_super) { - __extends(Paren, _super); - function Paren(node) { - var _this = _super.call(this) || this; - _this.value = node; - return _this; - } - Paren.prototype.genCSS = function (context, output) { - output.add('('); - this.value.genCSS(context, output); - output.add(')'); - }; - Paren.prototype.eval = function (context) { - return new Paren(this.value.eval(context)); - }; - return Paren; - }(Node)); - Paren.prototype.type = 'Paren'; + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + ***************************************************************************** */ + /* global Reflect, Promise */ + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) + if (b.hasOwnProperty(p)) + d[p] = b[p]; }; + return extendStatics(d, b); + }; + function __extends(d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + } + var __assign = function () { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + function __spreadArrays() { + for (var s = 0, i = 0, il = arguments.length; i < il; i++) + s += arguments[i].length; + for (var r = Array(s), k = 0, i = 0; i < il; i++) + for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) + r[k] = a[j]; + return r; + } - var _noSpaceCombinators = { - '': true, - ' ': true, - '|': true - }; - var Combinator = /** @class */ (function (_super) { - __extends(Combinator, _super); - function Combinator(value) { - var _this = _super.call(this) || this; - if (value === ' ') { - _this.value = ' '; - _this.emptyOrWhitespace = true; - } - else { - _this.value = value ? value.trim() : ''; - _this.emptyOrWhitespace = _this.value === ''; - } - return _this; - } - Combinator.prototype.genCSS = function (context, output) { - var spaceOrEmpty = (context.compress || _noSpaceCombinators[this.value]) ? '' : ' '; - output.add(spaceOrEmpty + this.value + spaceOrEmpty); - }; - return Combinator; - }(Node)); - Combinator.prototype.type = 'Combinator'; + // + // RGB Colors - #ff0014, #eee + // + var Color = /** @class */ (function (_super) { + __extends(Color, _super); + function Color(rgb, a, originalForm) { + var _this = _super.call(this) || this; + var self = _this; + // + // The end goal here, is to parse the arguments + // into an integer triplet, such as `128, 255, 0` + // + // This facilitates operations and conversions. + // + if (Array.isArray(rgb)) { + _this.rgb = rgb; + } + else if (rgb.length >= 6) { + _this.rgb = []; + rgb.match(/.{2}/g).map(function (c, i) { + if (i < 3) { + self.rgb.push(parseInt(c, 16)); + } + else { + self.alpha = (parseInt(c, 16)) / 255; + } + }); + } + else { + _this.rgb = []; + rgb.split('').map(function (c, i) { + if (i < 3) { + self.rgb.push(parseInt(c + c, 16)); + } + else { + self.alpha = (parseInt(c + c, 16)) / 255; + } + }); + } + _this.alpha = _this.alpha || (typeof a === 'number' ? a : 1); + if (typeof originalForm !== 'undefined') { + _this.value = originalForm; + } + return _this; + } + Color.prototype.luma = function () { + var r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255; + r = (r <= 0.03928) ? r / 12.92 : Math.pow(((r + 0.055) / 1.055), 2.4); + g = (g <= 0.03928) ? g / 12.92 : Math.pow(((g + 0.055) / 1.055), 2.4); + b = (b <= 0.03928) ? b / 12.92 : Math.pow(((b + 0.055) / 1.055), 2.4); + return 0.2126 * r + 0.7152 * g + 0.0722 * b; + }; + Color.prototype.genCSS = function (context, output) { + output.add(this.toCSS(context)); + }; + Color.prototype.toCSS = function (context, doNotCompress) { + var compress = context && context.compress && !doNotCompress; + var color; + var alpha; + var colorFunction; + var args = []; + // `value` is set if this color was originally + // converted from a named color string so we need + // to respect this and try to output named color too. + alpha = this.fround(context, this.alpha); + if (this.value) { + if (this.value.indexOf('rgb') === 0) { + if (alpha < 1) { + colorFunction = 'rgba'; + } + } + else if (this.value.indexOf('hsl') === 0) { + if (alpha < 1) { + colorFunction = 'hsla'; + } + else { + colorFunction = 'hsl'; + } + } + else { + return this.value; + } + } + else { + if (alpha < 1) { + colorFunction = 'rgba'; + } + } + switch (colorFunction) { + case 'rgba': + args = this.rgb.map(function (c) { + return clamp(Math.round(c), 255); + }).concat(clamp(alpha, 1)); + break; + case 'hsla': + args.push(clamp(alpha, 1)); + case 'hsl': + color = this.toHSL(); + args = [ + this.fround(context, color.h), + this.fround(context, color.s * 100) + "%", + this.fround(context, color.l * 100) + "%" + ].concat(args); + } + if (colorFunction) { + // Values are capped between `0` and `255`, rounded and zero-padded. + return colorFunction + "(" + args.join("," + (compress ? '' : ' ')) + ")"; + } + color = this.toRGB(); + if (compress) { + var splitcolor = color.split(''); + // Convert color to short format + if (splitcolor[1] === splitcolor[2] && splitcolor[3] === splitcolor[4] && splitcolor[5] === splitcolor[6]) { + color = "#" + splitcolor[1] + splitcolor[3] + splitcolor[5]; + } + } + return color; + }; + // + // Operations have to be done per-channel, if not, + // channels will spill onto each other. Once we have + // our result, in the form of an integer triplet, + // we create a new Color node to hold the result. + // + Color.prototype.operate = function (context, op, other) { + var rgb = new Array(3); + var alpha = this.alpha * (1 - other.alpha) + other.alpha; + for (var c = 0; c < 3; c++) { + rgb[c] = this._operate(context, op, this.rgb[c], other.rgb[c]); + } + return new Color(rgb, alpha); + }; + Color.prototype.toRGB = function () { + return toHex(this.rgb); + }; + Color.prototype.toHSL = function () { + var r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha; + var max = Math.max(r, g, b), min = Math.min(r, g, b); + var h; + var s; + var l = (max + min) / 2; + var d = max - min; + if (max === min) { + h = s = 0; + } + else { + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + switch (max) { + case r: + h = (g - b) / d + (g < b ? 6 : 0); + break; + case g: + h = (b - r) / d + 2; + break; + case b: + h = (r - g) / d + 4; + break; + } + h /= 6; + } + return { h: h * 360, s: s, l: l, a: a }; + }; + // Adapted from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript + Color.prototype.toHSV = function () { + var r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha; + var max = Math.max(r, g, b), min = Math.min(r, g, b); + var h; + var s; + var v = max; + var d = max - min; + if (max === 0) { + s = 0; + } + else { + s = d / max; + } + if (max === min) { + h = 0; + } + else { + switch (max) { + case r: + h = (g - b) / d + (g < b ? 6 : 0); + break; + case g: + h = (b - r) / d + 2; + break; + case b: + h = (r - g) / d + 4; + break; + } + h /= 6; + } + return { h: h * 360, s: s, v: v, a: a }; + }; + Color.prototype.toARGB = function () { + return toHex([this.alpha * 255].concat(this.rgb)); + }; + Color.prototype.compare = function (x) { + return (x.rgb && + x.rgb[0] === this.rgb[0] && + x.rgb[1] === this.rgb[1] && + x.rgb[2] === this.rgb[2] && + x.alpha === this.alpha) ? 0 : undefined; + }; + Color.fromKeyword = function (keyword) { + var c; + var key = keyword.toLowerCase(); + if (colors.hasOwnProperty(key)) { + c = new Color(colors[key].slice(1)); + } + else if (key === 'transparent') { + c = new Color([0, 0, 0], 0); + } + if (c) { + c.value = keyword; + return c; + } + }; + return Color; + }(Node)); + Color.prototype.type = 'Color'; + function clamp(v, max) { + return Math.min(Math.max(v, 0), max); + } + function toHex(v) { + return "#" + v.map(function (c) { + c = clamp(Math.round(c), 255); + return (c < 16 ? '0' : '') + c.toString(16); + }).join(''); + } - var Element = /** @class */ (function (_super) { - __extends(Element, _super); - function Element(combinator, value, isVariable, index, currentFileInfo, visibilityInfo) { - var _this = _super.call(this) || this; - _this.combinator = combinator instanceof Combinator ? - combinator : new Combinator(combinator); - if (typeof value === 'string') { - _this.value = value.trim(); - } - else if (value) { - _this.value = value; - } - else { - _this.value = ''; - } - _this.isVariable = isVariable; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.copyVisibilityInfo(visibilityInfo); - _this.setParent(_this.combinator, _this); - return _this; - } - Element.prototype.accept = function (visitor) { - var value = this.value; - this.combinator = visitor.visit(this.combinator); - if (typeof value === 'object') { - this.value = visitor.visit(value); - } - }; - Element.prototype.eval = function (context) { - return new Element(this.combinator, this.value.eval ? this.value.eval(context) : this.value, this.isVariable, this.getIndex(), this.fileInfo(), this.visibilityInfo()); - }; - Element.prototype.clone = function () { - return new Element(this.combinator, this.value, this.isVariable, this.getIndex(), this.fileInfo(), this.visibilityInfo()); - }; - Element.prototype.genCSS = function (context, output) { - output.add(this.toCSS(context), this.fileInfo(), this.getIndex()); - }; - Element.prototype.toCSS = function (context) { - if (context === void 0) { context = {}; } - var value = this.value; - var firstSelector = context.firstSelector; - if (value instanceof Paren) { - // selector in parens should not be affected by outer selector - // flags (breaks only interpolated selectors - see #1973) - context.firstSelector = true; - } - value = value.toCSS ? value.toCSS(context) : value; - context.firstSelector = firstSelector; - if (value === '' && this.combinator.value.charAt(0) === '&') { - return ''; - } - else { - return this.combinator.toCSS(context) + value; - } - }; - return Element; - }(Node)); - Element.prototype.type = 'Element'; + var Paren = /** @class */ (function (_super) { + __extends(Paren, _super); + function Paren(node) { + var _this = _super.call(this) || this; + _this.value = node; + return _this; + } + Paren.prototype.genCSS = function (context, output) { + output.add('('); + this.value.genCSS(context, output); + output.add(')'); + }; + Paren.prototype.eval = function (context) { + return new Paren(this.value.eval(context)); + }; + return Paren; + }(Node)); + Paren.prototype.type = 'Paren'; - var Math$1 = { - ALWAYS: 0, - PARENS_DIVISION: 1, - PARENS: 2, - STRICT_LEGACY: 3 - }; - var RewriteUrls = { - OFF: 0, - LOCAL: 1, - ALL: 2 - }; + var _noSpaceCombinators = { + '': true, + ' ': true, + '|': true + }; + var Combinator = /** @class */ (function (_super) { + __extends(Combinator, _super); + function Combinator(value) { + var _this = _super.call(this) || this; + if (value === ' ') { + _this.value = ' '; + _this.emptyOrWhitespace = true; + } + else { + _this.value = value ? value.trim() : ''; + _this.emptyOrWhitespace = _this.value === ''; + } + return _this; + } + Combinator.prototype.genCSS = function (context, output) { + var spaceOrEmpty = (context.compress || _noSpaceCombinators[this.value]) ? '' : ' '; + output.add(spaceOrEmpty + this.value + spaceOrEmpty); + }; + return Combinator; + }(Node)); + Combinator.prototype.type = 'Combinator'; - function getLocation(index, inputStream) { - var n = index + 1; - var line = null; - var column = -1; - while (--n >= 0 && inputStream.charAt(n) !== '\n') { - column++; - } - if (typeof index === 'number') { - line = (inputStream.slice(0, index).match(/\n/g) || '').length; - } - return { - line: line, - column: column - }; - } - function copyArray(arr) { - var i; - var length = arr.length; - var copy = new Array(length); - for (i = 0; i < length; i++) { - copy[i] = arr[i]; - } - return copy; - } - function clone(obj) { - var cloned = {}; - for (var prop in obj) { - if (obj.hasOwnProperty(prop)) { - cloned[prop] = obj[prop]; - } - } - return cloned; - } - function defaults(obj1, obj2) { - var newObj = obj2 || {}; - if (!obj2._defaults) { - newObj = {}; - var defaults_1 = __assign({}, obj1); - newObj._defaults = defaults_1; - var cloned = obj2 ? __assign({}, obj2) : {}; - Object.assign(newObj, defaults_1, cloned); - } - return newObj; - } - function copyOptions(obj1, obj2) { - if (obj2 && obj2._defaults) { - return obj2; - } - var opts = defaults(obj1, obj2); - if (opts.strictMath) { - opts.math = Math$1.STRICT_LEGACY; - } - // Back compat with changed relativeUrls option - if (opts.relativeUrls) { - opts.rewriteUrls = RewriteUrls.ALL; - } - if (typeof opts.math === 'string') { - switch (opts.math.toLowerCase()) { - case 'always': - opts.math = Math$1.ALWAYS; - break; - case 'parens-division': - opts.math = Math$1.PARENS_DIVISION; - break; - case 'strict': - case 'parens': - opts.math = Math$1.PARENS; - break; - case 'strict-legacy': - opts.math = Math$1.STRICT_LEGACY; - } - } - if (typeof opts.rewriteUrls === 'string') { - switch (opts.rewriteUrls.toLowerCase()) { - case 'off': - opts.rewriteUrls = RewriteUrls.OFF; - break; - case 'local': - opts.rewriteUrls = RewriteUrls.LOCAL; - break; - case 'all': - opts.rewriteUrls = RewriteUrls.ALL; - break; - } - } - return opts; - } - function merge(obj1, obj2) { - for (var prop in obj2) { - if (obj2.hasOwnProperty(prop)) { - obj1[prop] = obj2[prop]; - } - } - return obj1; - } - function flattenArray(arr, result) { - if (result === void 0) { result = []; } - for (var i = 0, length_1 = arr.length; i < length_1; i++) { - var value = arr[i]; - if (Array.isArray(value)) { - flattenArray(value, result); - } - else { - if (value !== undefined) { - result.push(value); - } - } - } - return result; - } + var Element = /** @class */ (function (_super) { + __extends(Element, _super); + function Element(combinator, value, isVariable, index, currentFileInfo, visibilityInfo) { + var _this = _super.call(this) || this; + _this.combinator = combinator instanceof Combinator ? + combinator : new Combinator(combinator); + if (typeof value === 'string') { + _this.value = value.trim(); + } + else if (value) { + _this.value = value; + } + else { + _this.value = ''; + } + _this.isVariable = isVariable; + _this._index = index; + _this._fileInfo = currentFileInfo; + _this.copyVisibilityInfo(visibilityInfo); + _this.setParent(_this.combinator, _this); + return _this; + } + Element.prototype.accept = function (visitor) { + var value = this.value; + this.combinator = visitor.visit(this.combinator); + if (typeof value === 'object') { + this.value = visitor.visit(value); + } + }; + Element.prototype.eval = function (context) { + return new Element(this.combinator, this.value.eval ? this.value.eval(context) : this.value, this.isVariable, this.getIndex(), this.fileInfo(), this.visibilityInfo()); + }; + Element.prototype.clone = function () { + return new Element(this.combinator, this.value, this.isVariable, this.getIndex(), this.fileInfo(), this.visibilityInfo()); + }; + Element.prototype.genCSS = function (context, output) { + output.add(this.toCSS(context), this.fileInfo(), this.getIndex()); + }; + Element.prototype.toCSS = function (context) { + context = context || {}; + var value = this.value; + var firstSelector = context.firstSelector; + if (value instanceof Paren) { + // selector in parens should not be affected by outer selector + // flags (breaks only interpolated selectors - see #1973) + context.firstSelector = true; + } + value = value.toCSS ? value.toCSS(context) : value; + context.firstSelector = firstSelector; + if (value === '' && this.combinator.value.charAt(0) === '&') { + return ''; + } + else { + return this.combinator.toCSS(context) + value; + } + }; + return Element; + }(Node)); + Element.prototype.type = 'Element'; - var utils = /*#__PURE__*/Object.freeze({ - __proto__: null, - getLocation: getLocation, - copyArray: copyArray, - clone: clone, - defaults: defaults, - copyOptions: copyOptions, - merge: merge, - flattenArray: flattenArray - }); + var Math$1 = { + ALWAYS: 0, + PARENS_DIVISION: 1, + PARENS: 2, + }; + var RewriteUrls = { + OFF: 0, + LOCAL: 1, + ALL: 2 + }; - var anonymousFunc = /(|Function):(\d+):(\d+)/; - /** - * This is a centralized class of any error that could be thrown internally (mostly by the parser). - * Besides standard .message it keeps some additional data like a path to the file where the error - * occurred along with line and column numbers. - * - * @class - * @extends Error - * @type {module.LessError} - * - * @prop {string} type - * @prop {string} filename - * @prop {number} index - * @prop {number} line - * @prop {number} column - * @prop {number} callLine - * @prop {number} callExtract - * @prop {string[]} extract - * - * @param {Object} e - An error object to wrap around or just a descriptive object - * @param {Object} fileContentMap - An object with file contents in 'contents' property (like importManager) @todo - move to fileManager? - * @param {string} [currentFilename] - */ - var LessError = function LessError(e, fileContentMap, currentFilename) { - Error.call(this); - var filename = e.filename || currentFilename; - this.message = e.message; - this.stack = e.stack; - if (fileContentMap && filename) { - var input = fileContentMap.contents[filename]; - var loc = getLocation(e.index, input); - var line = loc.line; - var col = loc.column; - var callLine = e.call && getLocation(e.call, input).line; - var lines = input ? input.split('\n') : ''; - this.type = e.type || 'Syntax'; - this.filename = filename; - this.index = e.index; - this.line = typeof line === 'number' ? line + 1 : null; - this.column = col; - if (!this.line && this.stack) { - var found = this.stack.match(anonymousFunc); - /** - * We have to figure out how this environment stringifies anonymous functions - * so we can correctly map plugin errors. - * - * Note, in Node 8, the output of anonymous funcs varied based on parameters - * being present or not, so we inject dummy params. - */ - var func = new Function('a', 'throw new Error()'); - var lineAdjust = 0; - try { - func(); - } - catch (e) { - var match = e.stack.match(anonymousFunc); - var line_1 = parseInt(match[2]); - lineAdjust = 1 - line_1; - } - if (found) { - if (found[2]) { - this.line = parseInt(found[2]) + lineAdjust; - } - if (found[3]) { - this.column = parseInt(found[3]); - } - } - } - this.callLine = callLine + 1; - this.callExtract = lines[callLine]; - this.extract = [ - lines[this.line - 2], - lines[this.line - 1], - lines[this.line] - ]; - } - }; - if (typeof Object.create === 'undefined') { - var F = function () { }; - F.prototype = Error.prototype; - LessError.prototype = new F(); - } - else { - LessError.prototype = Object.create(Error.prototype); - } - LessError.prototype.constructor = LessError; - /** - * An overridden version of the default Object.prototype.toString - * which uses additional information to create a helpful message. - * - * @param {Object} options - * @returns {string} - */ - LessError.prototype.toString = function (options) { - if (options === void 0) { options = {}; } - var message = ''; - var extract = this.extract || []; - var error = []; - var stylize = function (str) { return str; }; - if (options.stylize) { - var type = typeof options.stylize; - if (type !== 'function') { - throw Error("options.stylize should be a function, got a " + type + "!"); - } - stylize = options.stylize; - } - if (this.line !== null) { - if (typeof extract[0] === 'string') { - error.push(stylize(this.line - 1 + " " + extract[0], 'grey')); - } - if (typeof extract[1] === 'string') { - var errorTxt = this.line + " "; - if (extract[1]) { - errorTxt += extract[1].slice(0, this.column) + - stylize(stylize(stylize(extract[1].substr(this.column, 1), 'bold') + - extract[1].slice(this.column + 1), 'red'), 'inverse'); - } - error.push(errorTxt); - } - if (typeof extract[2] === 'string') { - error.push(stylize(this.line + 1 + " " + extract[2], 'grey')); - } - error = error.join('\n') + stylize('', 'reset') + "\n"; - } - message += stylize(this.type + "Error: " + this.message, 'red'); - if (this.filename) { - message += stylize(' in ', 'red') + this.filename; - } - if (this.line) { - message += stylize(" on line " + this.line + ", column " + (this.column + 1) + ":", 'grey'); - } - message += "\n" + error; - if (this.callLine) { - message += stylize('from ', 'red') + (this.filename || '') + "/n"; - message += stylize(this.callLine, 'grey') + " " + this.callExtract + "/n"; - } - return message; - }; + function getLocation(index, inputStream) { + var n = index + 1; + var line = null; + var column = -1; + while (--n >= 0 && inputStream.charAt(n) !== '\n') { + column++; + } + if (typeof index === 'number') { + line = (inputStream.slice(0, index).match(/\n/g) || '').length; + } + return { + line: line, + column: column + }; + } + function copyArray(arr) { + var i; + var length = arr.length; + var copy = new Array(length); + for (i = 0; i < length; i++) { + copy[i] = arr[i]; + } + return copy; + } + function clone(obj) { + var cloned = {}; + for (var prop in obj) { + if (obj.hasOwnProperty(prop)) { + cloned[prop] = obj[prop]; + } + } + return cloned; + } + function defaults(obj1, obj2) { + var newObj = obj2 || {}; + if (!obj2._defaults) { + newObj = {}; + var defaults_1 = __assign({}, obj1); + newObj._defaults = defaults_1; + var cloned = obj2 ? __assign({}, obj2) : {}; + Object.assign(newObj, defaults_1, cloned); + } + return newObj; + } + function copyOptions(obj1, obj2) { + if (obj2 && obj2._defaults) { + return obj2; + } + var opts = defaults(obj1, obj2); + if (opts.strictMath) { + opts.math = Math$1.PARENS; + } + // Back compat with changed relativeUrls option + if (opts.relativeUrls) { + opts.rewriteUrls = RewriteUrls.ALL; + } + if (typeof opts.math === 'string') { + switch (opts.math.toLowerCase()) { + case 'always': + opts.math = Math$1.ALWAYS; + break; + case 'parens-division': + opts.math = Math$1.PARENS_DIVISION; + break; + case 'strict': + case 'parens': + opts.math = Math$1.PARENS; + break; + default: + opts.math = Math$1.PARENS; + } + } + if (typeof opts.rewriteUrls === 'string') { + switch (opts.rewriteUrls.toLowerCase()) { + case 'off': + opts.rewriteUrls = RewriteUrls.OFF; + break; + case 'local': + opts.rewriteUrls = RewriteUrls.LOCAL; + break; + case 'all': + opts.rewriteUrls = RewriteUrls.ALL; + break; + } + } + return opts; + } + function merge(obj1, obj2) { + for (var prop in obj2) { + if (obj2.hasOwnProperty(prop)) { + obj1[prop] = obj2[prop]; + } + } + return obj1; + } + function flattenArray(arr, result) { + if (result === void 0) { result = []; } + for (var i = 0, length_1 = arr.length; i < length_1; i++) { + var value = arr[i]; + if (Array.isArray(value)) { + flattenArray(value, result); + } + else { + if (value !== undefined) { + result.push(value); + } + } + } + return result; + } - var Selector = /** @class */ (function (_super) { - __extends(Selector, _super); - function Selector(elements, extendList, condition, index, currentFileInfo, visibilityInfo) { - var _this = _super.call(this) || this; - _this.extendList = extendList; - _this.condition = condition; - _this.evaldCondition = !condition; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.elements = _this.getElements(elements); - _this.mixinElements_ = undefined; - _this.copyVisibilityInfo(visibilityInfo); - _this.setParent(_this.elements, _this); - return _this; - } - Selector.prototype.accept = function (visitor) { - if (this.elements) { - this.elements = visitor.visitArray(this.elements); - } - if (this.extendList) { - this.extendList = visitor.visitArray(this.extendList); - } - if (this.condition) { - this.condition = visitor.visit(this.condition); - } - }; - Selector.prototype.createDerived = function (elements, extendList, evaldCondition) { - elements = this.getElements(elements); - var newSelector = new Selector(elements, extendList || this.extendList, null, this.getIndex(), this.fileInfo(), this.visibilityInfo()); - newSelector.evaldCondition = (evaldCondition != null) ? evaldCondition : this.evaldCondition; - newSelector.mediaEmpty = this.mediaEmpty; - return newSelector; - }; - Selector.prototype.getElements = function (els) { - if (!els) { - return [new Element('', '&', false, this._index, this._fileInfo)]; - } - if (typeof els === 'string') { - this.parse.parseNode(els, ['selector'], this._index, this._fileInfo, function (err, result) { - if (err) { - throw new LessError({ - index: err.index, - message: err.message - }, this.parse.imports, this._fileInfo.filename); - } - els = result[0].elements; - }); - } - return els; - }; - Selector.prototype.createEmptySelectors = function () { - var el = new Element('', '&', false, this._index, this._fileInfo); - var sels = [new Selector([el], null, null, this._index, this._fileInfo)]; - sels[0].mediaEmpty = true; - return sels; - }; - Selector.prototype.match = function (other) { - var elements = this.elements; - var len = elements.length; - var olen; - var i; - other = other.mixinElements(); - olen = other.length; - if (olen === 0 || len < olen) { - return 0; - } - else { - for (i = 0; i < olen; i++) { - if (elements[i].value !== other[i]) { - return 0; - } - } - } - return olen; // return number of matched elements - }; - Selector.prototype.mixinElements = function () { - if (this.mixinElements_) { - return this.mixinElements_; - } - var elements = this.elements.map(function (v) { return v.combinator.value + (v.value.value || v.value); }).join('').match(/[,&#\*\.\w-]([\w-]|(\\.))*/g); - if (elements) { - if (elements[0] === '&') { - elements.shift(); - } - } - else { - elements = []; - } - return (this.mixinElements_ = elements); - }; - Selector.prototype.isJustParentSelector = function () { - return !this.mediaEmpty && - this.elements.length === 1 && - this.elements[0].value === '&' && - (this.elements[0].combinator.value === ' ' || this.elements[0].combinator.value === ''); - }; - Selector.prototype.eval = function (context) { - var evaldCondition = this.condition && this.condition.eval(context); - var elements = this.elements; - var extendList = this.extendList; - elements = elements && elements.map(function (e) { return e.eval(context); }); - extendList = extendList && extendList.map(function (extend) { return extend.eval(context); }); - return this.createDerived(elements, extendList, evaldCondition); - }; - Selector.prototype.genCSS = function (context, output) { - var i; - var element; - if ((!context || !context.firstSelector) && this.elements[0].combinator.value === '') { - output.add(' ', this.fileInfo(), this.getIndex()); - } - for (i = 0; i < this.elements.length; i++) { - element = this.elements[i]; - element.genCSS(context, output); - } - }; - Selector.prototype.getIsOutput = function () { - return this.evaldCondition; - }; - return Selector; - }(Node)); - Selector.prototype.type = 'Selector'; + var utils = /*#__PURE__*/Object.freeze({ + __proto__: null, + getLocation: getLocation, + copyArray: copyArray, + clone: clone, + defaults: defaults, + copyOptions: copyOptions, + merge: merge, + flattenArray: flattenArray + }); - var Value = /** @class */ (function (_super) { - __extends(Value, _super); - function Value(value) { - var _this = _super.call(this) || this; - if (!value) { - throw new Error('Value requires an array argument'); - } - if (!Array.isArray(value)) { - _this.value = [value]; - } - else { - _this.value = value; - } - return _this; - } - Value.prototype.accept = function (visitor) { - if (this.value) { - this.value = visitor.visitArray(this.value); - } - }; - Value.prototype.eval = function (context) { - if (this.value.length === 1) { - return this.value[0].eval(context); - } - else { - return new Value(this.value.map(function (v) { return v.eval(context); })); - } - }; - Value.prototype.genCSS = function (context, output) { - var i; - for (i = 0; i < this.value.length; i++) { - this.value[i].genCSS(context, output); - if (i + 1 < this.value.length) { - output.add((context && context.compress) ? ',' : ', '); - } - } - }; - return Value; - }(Node)); - Value.prototype.type = 'Value'; + var anonymousFunc = /(|Function):(\d+):(\d+)/; + /** + * This is a centralized class of any error that could be thrown internally (mostly by the parser). + * Besides standard .message it keeps some additional data like a path to the file where the error + * occurred along with line and column numbers. + * + * @class + * @extends Error + * @type {module.LessError} + * + * @prop {string} type + * @prop {string} filename + * @prop {number} index + * @prop {number} line + * @prop {number} column + * @prop {number} callLine + * @prop {number} callExtract + * @prop {string[]} extract + * + * @param {Object} e - An error object to wrap around or just a descriptive object + * @param {Object} fileContentMap - An object with file contents in 'contents' property (like importManager) @todo - move to fileManager? + * @param {string} [currentFilename] + */ + var LessError = function (e, fileContentMap, currentFilename) { + Error.call(this); + var filename = e.filename || currentFilename; + this.message = e.message; + this.stack = e.stack; + if (fileContentMap && filename) { + var input = fileContentMap.contents[filename]; + var loc = getLocation(e.index, input); + var line = loc.line; + var col = loc.column; + var callLine = e.call && getLocation(e.call, input).line; + var lines = input ? input.split('\n') : ''; + this.type = e.type || 'Syntax'; + this.filename = filename; + this.index = e.index; + this.line = typeof line === 'number' ? line + 1 : null; + this.column = col; + if (!this.line && this.stack) { + var found = this.stack.match(anonymousFunc); + /** + * We have to figure out how this environment stringifies anonymous functions + * so we can correctly map plugin errors. + * + * Note, in Node 8, the output of anonymous funcs varied based on parameters + * being present or not, so we inject dummy params. + */ + var func = new Function('a', 'throw new Error()'); + var lineAdjust = 0; + try { + func(); + } + catch (e) { + var match = e.stack.match(anonymousFunc); + var line = parseInt(match[2]); + lineAdjust = 1 - line; + } + if (found) { + if (found[2]) { + this.line = parseInt(found[2]) + lineAdjust; + } + if (found[3]) { + this.column = parseInt(found[3]); + } + } + } + this.callLine = callLine + 1; + this.callExtract = lines[callLine]; + this.extract = [ + lines[this.line - 2], + lines[this.line - 1], + lines[this.line] + ]; + } + }; + if (typeof Object.create === 'undefined') { + var F = function () { }; + F.prototype = Error.prototype; + LessError.prototype = new F(); + } + else { + LessError.prototype = Object.create(Error.prototype); + } + LessError.prototype.constructor = LessError; + /** + * An overridden version of the default Object.prototype.toString + * which uses additional information to create a helpful message. + * + * @param {Object} options + * @returns {string} + */ + LessError.prototype.toString = function (options) { + options = options || {}; + var message = ''; + var extract = this.extract || []; + var error = []; + var stylize = function (str) { return str; }; + if (options.stylize) { + var type = typeof options.stylize; + if (type !== 'function') { + throw Error("options.stylize should be a function, got a " + type + "!"); + } + stylize = options.stylize; + } + if (this.line !== null) { + if (typeof extract[0] === 'string') { + error.push(stylize(this.line - 1 + " " + extract[0], 'grey')); + } + if (typeof extract[1] === 'string') { + var errorTxt = this.line + " "; + if (extract[1]) { + errorTxt += extract[1].slice(0, this.column) + + stylize(stylize(stylize(extract[1].substr(this.column, 1), 'bold') + + extract[1].slice(this.column + 1), 'red'), 'inverse'); + } + error.push(errorTxt); + } + if (typeof extract[2] === 'string') { + error.push(stylize(this.line + 1 + " " + extract[2], 'grey')); + } + error = error.join('\n') + stylize('', 'reset') + "\n"; + } + message += stylize(this.type + "Error: " + this.message, 'red'); + if (this.filename) { + message += stylize(' in ', 'red') + this.filename; + } + if (this.line) { + message += stylize(" on line " + this.line + ", column " + (this.column + 1) + ":", 'grey'); + } + message += "\n" + error; + if (this.callLine) { + message += stylize('from ', 'red') + (this.filename || '') + "/n"; + message += stylize(this.callLine, 'grey') + " " + this.callExtract + "/n"; + } + return message; + }; - var Keyword = /** @class */ (function (_super) { - __extends(Keyword, _super); - function Keyword(value) { - var _this = _super.call(this) || this; - _this.value = value; - return _this; - } - Keyword.prototype.genCSS = function (context, output) { - if (this.value === '%') { - throw { type: 'Syntax', message: 'Invalid % without number' }; - } - output.add(this.value); - }; - return Keyword; - }(Node)); - Keyword.prototype.type = 'Keyword'; - Keyword.True = new Keyword('true'); - Keyword.False = new Keyword('false'); + var Selector = /** @class */ (function (_super) { + __extends(Selector, _super); + function Selector(elements, extendList, condition, index, currentFileInfo, visibilityInfo) { + var _this = _super.call(this) || this; + _this.extendList = extendList; + _this.condition = condition; + _this.evaldCondition = !condition; + _this._index = index; + _this._fileInfo = currentFileInfo; + _this.elements = _this.getElements(elements); + _this.mixinElements_ = undefined; + _this.copyVisibilityInfo(visibilityInfo); + _this.setParent(_this.elements, _this); + return _this; + } + Selector.prototype.accept = function (visitor) { + if (this.elements) { + this.elements = visitor.visitArray(this.elements); + } + if (this.extendList) { + this.extendList = visitor.visitArray(this.extendList); + } + if (this.condition) { + this.condition = visitor.visit(this.condition); + } + }; + Selector.prototype.createDerived = function (elements, extendList, evaldCondition) { + elements = this.getElements(elements); + var newSelector = new Selector(elements, extendList || this.extendList, null, this.getIndex(), this.fileInfo(), this.visibilityInfo()); + newSelector.evaldCondition = (evaldCondition != null) ? evaldCondition : this.evaldCondition; + newSelector.mediaEmpty = this.mediaEmpty; + return newSelector; + }; + Selector.prototype.getElements = function (els) { + if (!els) { + return [new Element('', '&', false, this._index, this._fileInfo)]; + } + if (typeof els === 'string') { + this.parse.parseNode(els, ['selector'], this._index, this._fileInfo, function (err, result) { + if (err) { + throw new LessError({ + index: err.index, + message: err.message + }, this.parse.imports, this._fileInfo.filename); + } + els = result[0].elements; + }); + } + return els; + }; + Selector.prototype.createEmptySelectors = function () { + var el = new Element('', '&', false, this._index, this._fileInfo), sels = [new Selector([el], null, null, this._index, this._fileInfo)]; + sels[0].mediaEmpty = true; + return sels; + }; + Selector.prototype.match = function (other) { + var elements = this.elements; + var len = elements.length; + var olen; + var i; + other = other.mixinElements(); + olen = other.length; + if (olen === 0 || len < olen) { + return 0; + } + else { + for (i = 0; i < olen; i++) { + if (elements[i].value !== other[i]) { + return 0; + } + } + } + return olen; // return number of matched elements + }; + Selector.prototype.mixinElements = function () { + if (this.mixinElements_) { + return this.mixinElements_; + } + var elements = this.elements.map(function (v) { + return v.combinator.value + (v.value.value || v.value); + }).join('').match(/[,&#\*\.\w-]([\w-]|(\\.))*/g); + if (elements) { + if (elements[0] === '&') { + elements.shift(); + } + } + else { + elements = []; + } + return (this.mixinElements_ = elements); + }; + Selector.prototype.isJustParentSelector = function () { + return !this.mediaEmpty && + this.elements.length === 1 && + this.elements[0].value === '&' && + (this.elements[0].combinator.value === ' ' || this.elements[0].combinator.value === ''); + }; + Selector.prototype.eval = function (context) { + var evaldCondition = this.condition && this.condition.eval(context); + var elements = this.elements; + var extendList = this.extendList; + elements = elements && elements.map(function (e) { return e.eval(context); }); + extendList = extendList && extendList.map(function (extend) { return extend.eval(context); }); + return this.createDerived(elements, extendList, evaldCondition); + }; + Selector.prototype.genCSS = function (context, output) { + var i, element; + if ((!context || !context.firstSelector) && this.elements[0].combinator.value === '') { + output.add(' ', this.fileInfo(), this.getIndex()); + } + for (i = 0; i < this.elements.length; i++) { + element = this.elements[i]; + element.genCSS(context, output); + } + }; + Selector.prototype.getIsOutput = function () { + return this.evaldCondition; + }; + return Selector; + }(Node)); + Selector.prototype.type = 'Selector'; - var Anonymous = /** @class */ (function (_super) { - __extends(Anonymous, _super); - function Anonymous(value, index, currentFileInfo, mapLines, rulesetLike, visibilityInfo) { - var _this = _super.call(this) || this; - _this.value = value; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.mapLines = mapLines; - _this.rulesetLike = (typeof rulesetLike === 'undefined') ? false : rulesetLike; - _this.allowRoot = true; - _this.copyVisibilityInfo(visibilityInfo); - return _this; - } - Anonymous.prototype.eval = function () { - return new Anonymous(this.value, this._index, this._fileInfo, this.mapLines, this.rulesetLike, this.visibilityInfo()); - }; - Anonymous.prototype.compare = function (other) { - return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined; - }; - Anonymous.prototype.isRulesetLike = function () { - return this.rulesetLike; - }; - Anonymous.prototype.genCSS = function (context, output) { - this.nodeVisible = Boolean(this.value); - if (this.nodeVisible) { - output.add(this.value, this._fileInfo, this._index, this.mapLines); - } - }; - return Anonymous; - }(Node)); - Anonymous.prototype.type = 'Anonymous'; + var Value = /** @class */ (function (_super) { + __extends(Value, _super); + function Value(value) { + var _this = _super.call(this) || this; + if (!value) { + throw new Error('Value requires an array argument'); + } + if (!Array.isArray(value)) { + _this.value = [value]; + } + else { + _this.value = value; + } + return _this; + } + Value.prototype.accept = function (visitor) { + if (this.value) { + this.value = visitor.visitArray(this.value); + } + }; + Value.prototype.eval = function (context) { + if (this.value.length === 1) { + return this.value[0].eval(context); + } + else { + return new Value(this.value.map(function (v) { + return v.eval(context); + })); + } + }; + Value.prototype.genCSS = function (context, output) { + var i; + for (i = 0; i < this.value.length; i++) { + this.value[i].genCSS(context, output); + if (i + 1 < this.value.length) { + output.add((context && context.compress) ? ',' : ', '); + } + } + }; + return Value; + }(Node)); + Value.prototype.type = 'Value'; - var MATH = Math$1; - var Declaration = /** @class */ (function (_super) { - __extends(Declaration, _super); - function Declaration(name, value, important, merge, index, currentFileInfo, inline, variable) { - var _this = _super.call(this) || this; - _this.name = name; - _this.value = (value instanceof Node) ? value : new Value([value ? new Anonymous(value) : null]); - _this.important = important ? " " + important.trim() : ''; - _this.merge = merge; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.inline = inline || false; - _this.variable = (variable !== undefined) ? variable - : (name.charAt && (name.charAt(0) === '@')); - _this.allowRoot = true; - _this.setParent(_this.value, _this); - return _this; - } - Declaration.prototype.genCSS = function (context, output) { - output.add(this.name + (context.compress ? ':' : ': '), this.fileInfo(), this.getIndex()); - try { - this.value.genCSS(context, output); - } - catch (e) { - e.index = this._index; - e.filename = this._fileInfo.filename; - throw e; - } - output.add(this.important + ((this.inline || (context.lastRule && context.compress)) ? '' : ';'), this._fileInfo, this._index); - }; - Declaration.prototype.eval = function (context) { - var mathBypass = false; - var prevMath; - var name = this.name; - var evaldValue; - var variable = this.variable; - if (typeof name !== 'string') { - // expand 'primitive' name directly to get - // things faster (~10% for benchmark.less): - name = (name.length === 1) && (name[0] instanceof Keyword) ? - name[0].value : evalName(context, name); - variable = false; // never treat expanded interpolation as new variable name - } - // @todo remove when parens-division is default - if (name === 'font' && context.math === MATH.ALWAYS) { - mathBypass = true; - prevMath = context.math; - context.math = MATH.PARENS_DIVISION; - } - try { - context.importantScope.push({}); - evaldValue = this.value.eval(context); - if (!this.variable && evaldValue.type === 'DetachedRuleset') { - throw { message: 'Rulesets cannot be evaluated on a property.', - index: this.getIndex(), filename: this.fileInfo().filename }; - } - var important = this.important; - var importantResult = context.importantScope.pop(); - if (!important && importantResult.important) { - important = importantResult.important; - } - return new Declaration(name, evaldValue, important, this.merge, this.getIndex(), this.fileInfo(), this.inline, variable); - } - catch (e) { - if (typeof e.index !== 'number') { - e.index = this.getIndex(); - e.filename = this.fileInfo().filename; - } - throw e; - } - finally { - if (mathBypass) { - context.math = prevMath; - } - } - }; - Declaration.prototype.makeImportant = function () { - return new Declaration(this.name, this.value, '!important', this.merge, this.getIndex(), this.fileInfo(), this.inline); - }; - return Declaration; - }(Node)); - function evalName(context, name) { - var value = ''; - var i; - var n = name.length; - var output = { add: function (s) { value += s; } }; - for (i = 0; i < n; i++) { - name[i].eval(context).genCSS(context, output); - } - return value; - } - Declaration.prototype.type = 'Declaration'; + var Keyword = /** @class */ (function (_super) { + __extends(Keyword, _super); + function Keyword(value) { + var _this = _super.call(this) || this; + _this.value = value; + return _this; + } + Keyword.prototype.genCSS = function (context, output) { + if (this.value === '%') { + throw { type: 'Syntax', message: 'Invalid % without number' }; + } + output.add(this.value); + }; + return Keyword; + }(Node)); + Keyword.prototype.type = 'Keyword'; + Keyword.True = new Keyword('true'); + Keyword.False = new Keyword('false'); - var debugInfo = function (context, ctx, lineSeparator) { - var result = ''; - if (context.dumpLineNumbers && !context.compress) { - switch (context.dumpLineNumbers) { - case 'comments': - result = debugInfo.asComment(ctx); - break; - case 'mediaquery': - result = debugInfo.asMediaQuery(ctx); - break; - case 'all': - result = debugInfo.asComment(ctx) + (lineSeparator || '') + debugInfo.asMediaQuery(ctx); - break; - } - } - return result; - }; - debugInfo.asComment = function (ctx) { return ctx.debugInfo ? "/* line " + ctx.debugInfo.lineNumber + ", " + ctx.debugInfo.fileName + " */\n" : ''; }; - debugInfo.asMediaQuery = function (ctx) { - if (!ctx.debugInfo) { - return ''; - } - var filenameWithProtocol = ctx.debugInfo.fileName; - if (!/^[a-z]+:\/\//i.test(filenameWithProtocol)) { - filenameWithProtocol = "file://" + filenameWithProtocol; - } - return "@media -sass-debug-info{filename{font-family:" + filenameWithProtocol.replace(/([.:\/\\])/g, function (a) { - if (a == '\\') { - a = '\/'; - } - return "\\" + a; - }) + "}line{font-family:\\00003" + ctx.debugInfo.lineNumber + "}}\n"; - }; + var Anonymous = /** @class */ (function (_super) { + __extends(Anonymous, _super); + function Anonymous(value, index, currentFileInfo, mapLines, rulesetLike, visibilityInfo) { + var _this = _super.call(this) || this; + _this.value = value; + _this._index = index; + _this._fileInfo = currentFileInfo; + _this.mapLines = mapLines; + _this.rulesetLike = (typeof rulesetLike === 'undefined') ? false : rulesetLike; + _this.allowRoot = true; + _this.copyVisibilityInfo(visibilityInfo); + return _this; + } + Anonymous.prototype.eval = function () { + return new Anonymous(this.value, this._index, this._fileInfo, this.mapLines, this.rulesetLike, this.visibilityInfo()); + }; + Anonymous.prototype.compare = function (other) { + return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined; + }; + Anonymous.prototype.isRulesetLike = function () { + return this.rulesetLike; + }; + Anonymous.prototype.genCSS = function (context, output) { + this.nodeVisible = Boolean(this.value); + if (this.nodeVisible) { + output.add(this.value, this._fileInfo, this._index, this.mapLines); + } + }; + return Anonymous; + }(Node)); + Anonymous.prototype.type = 'Anonymous'; - var Comment = /** @class */ (function (_super) { - __extends(Comment, _super); - function Comment(value, isLineComment, index, currentFileInfo) { - var _this = _super.call(this) || this; - _this.value = value; - _this.isLineComment = isLineComment; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.allowRoot = true; - return _this; - } - Comment.prototype.genCSS = function (context, output) { - if (this.debugInfo) { - output.add(debugInfo(context, this), this.fileInfo(), this.getIndex()); - } - output.add(this.value); - }; - Comment.prototype.isSilent = function (context) { - var isCompressed = context.compress && this.value[2] !== '!'; - return this.isLineComment || isCompressed; - }; - return Comment; - }(Node)); - Comment.prototype.type = 'Comment'; + var MATH = Math$1; + var Declaration = /** @class */ (function (_super) { + __extends(Declaration, _super); + function Declaration(name, value, important, merge, index, currentFileInfo, inline, variable) { + var _this = _super.call(this) || this; + _this.name = name; + _this.value = (value instanceof Node) ? value : new Value([value ? new Anonymous(value) : null]); + _this.important = important ? " " + important.trim() : ''; + _this.merge = merge; + _this._index = index; + _this._fileInfo = currentFileInfo; + _this.inline = inline || false; + _this.variable = (variable !== undefined) ? variable + : (name.charAt && (name.charAt(0) === '@')); + _this.allowRoot = true; + _this.setParent(_this.value, _this); + return _this; + } + Declaration.prototype.genCSS = function (context, output) { + output.add(this.name + (context.compress ? ':' : ': '), this.fileInfo(), this.getIndex()); + try { + this.value.genCSS(context, output); + } + catch (e) { + e.index = this._index; + e.filename = this._fileInfo.filename; + throw e; + } + output.add(this.important + ((this.inline || (context.lastRule && context.compress)) ? '' : ';'), this._fileInfo, this._index); + }; + Declaration.prototype.eval = function (context) { + var mathBypass = false, prevMath, name = this.name, evaldValue, variable = this.variable; + if (typeof name !== 'string') { + // expand 'primitive' name directly to get + // things faster (~10% for benchmark.less): + name = (name.length === 1) && (name[0] instanceof Keyword) ? + name[0].value : evalName(context, name); + variable = false; // never treat expanded interpolation as new variable name + } + // @todo remove when parens-division is default + if (name === 'font' && context.math === MATH.ALWAYS) { + mathBypass = true; + prevMath = context.math; + context.math = MATH.PARENS_DIVISION; + } + try { + context.importantScope.push({}); + evaldValue = this.value.eval(context); + if (!this.variable && evaldValue.type === 'DetachedRuleset') { + throw { message: 'Rulesets cannot be evaluated on a property.', + index: this.getIndex(), filename: this.fileInfo().filename }; + } + var important = this.important; + var importantResult = context.importantScope.pop(); + if (!important && importantResult.important) { + important = importantResult.important; + } + return new Declaration(name, evaldValue, important, this.merge, this.getIndex(), this.fileInfo(), this.inline, variable); + } + catch (e) { + if (typeof e.index !== 'number') { + e.index = this.getIndex(); + e.filename = this.fileInfo().filename; + } + throw e; + } + finally { + if (mathBypass) { + context.math = prevMath; + } + } + }; + Declaration.prototype.makeImportant = function () { + return new Declaration(this.name, this.value, '!important', this.merge, this.getIndex(), this.fileInfo(), this.inline); + }; + return Declaration; + }(Node)); + function evalName(context, name) { + var value = ''; + var i; + var n = name.length; + var output = { add: function (s) { value += s; } }; + for (i = 0; i < n; i++) { + name[i].eval(context).genCSS(context, output); + } + return value; + } + Declaration.prototype.type = 'Declaration'; - var contexts = {}; - var copyFromOriginal = function copyFromOriginal(original, destination, propertiesToCopy) { - if (!original) { - return; - } - for (var i = 0; i < propertiesToCopy.length; i++) { - if (original.hasOwnProperty(propertiesToCopy[i])) { - destination[propertiesToCopy[i]] = original[propertiesToCopy[i]]; - } - } - }; - /* - parse is used whilst parsing - */ - var parseCopyProperties = [ - // options - 'paths', - 'rewriteUrls', - 'rootpath', - 'strictImports', - 'insecure', - 'dumpLineNumbers', - 'compress', - 'syncImport', - 'chunkInput', - 'mime', - 'useFileCache', - // context - 'processImports', - // Used by the import manager to stop multiple import visitors being created. - 'pluginManager' // Used as the plugin manager for the session - ]; - contexts.Parse = function (options) { - copyFromOriginal(options, this, parseCopyProperties); - if (typeof this.paths === 'string') { - this.paths = [this.paths]; - } - }; - var evalCopyProperties = [ - 'paths', - 'compress', - 'math', - 'strictUnits', - 'sourceMap', - 'importMultiple', - 'urlArgs', - 'javascriptEnabled', - 'pluginManager', - 'importantScope', - 'rewriteUrls' // option - whether to adjust URL's to be relative - ]; - function isPathRelative(path) { - return !/^(?:[a-z-]+:|\/|#)/i.test(path); - } - function isPathLocalRelative(path) { - return path.charAt(0) === '.'; - } - contexts.Eval = /** @class */ (function () { - function Eval(options, frames) { - copyFromOriginal(options, this, evalCopyProperties); - if (typeof this.paths === 'string') { - this.paths = [this.paths]; - } - this.frames = frames || []; - this.importantScope = this.importantScope || []; - this.inCalc = false; - this.mathOn = true; - } - Eval.prototype.enterCalc = function () { - if (!this.calcStack) { - this.calcStack = []; - } - this.calcStack.push(true); - this.inCalc = true; - }; - Eval.prototype.exitCalc = function () { - this.calcStack.pop(); - if (!this.calcStack.length) { - this.inCalc = false; - } - }; - Eval.prototype.inParenthesis = function () { - if (!this.parensStack) { - this.parensStack = []; - } - this.parensStack.push(true); - }; - Eval.prototype.outOfParenthesis = function () { - this.parensStack.pop(); - }; - Eval.prototype.isMathOn = function (op) { - if (!this.mathOn) { - return false; - } - if (op === '/' && this.math !== Math$1.ALWAYS && (!this.parensStack || !this.parensStack.length)) { - return false; - } - if (this.math > Math$1.PARENS_DIVISION) { - return this.parensStack && this.parensStack.length; - } - return true; - }; - Eval.prototype.pathRequiresRewrite = function (path) { - var isRelative = this.rewriteUrls === RewriteUrls.LOCAL ? isPathLocalRelative : isPathRelative; - return isRelative(path); - }; - Eval.prototype.rewritePath = function (path, rootpath) { - var newPath; - rootpath = rootpath || ''; - newPath = this.normalizePath(rootpath + path); - // If a path was explicit relative and the rootpath was not an absolute path - // we must ensure that the new path is also explicit relative. - if (isPathLocalRelative(path) && - isPathRelative(rootpath) && - isPathLocalRelative(newPath) === false) { - newPath = "./" + newPath; - } - return newPath; - }; - Eval.prototype.normalizePath = function (path) { - var segments = path.split('/').reverse(); - var segment; - path = []; - while (segments.length !== 0) { - segment = segments.pop(); - switch (segment) { - case '.': - break; - case '..': - if ((path.length === 0) || (path[path.length - 1] === '..')) { - path.push(segment); - } - else { - path.pop(); - } - break; - default: - path.push(segment); - break; - } - } - return path.join('/'); - }; - return Eval; - }()); + var debugInfo = /** @class */ (function () { + function debugInfo(context, ctx, lineSeparator) { + var result = ''; + if (context.dumpLineNumbers && !context.compress) { + switch (context.dumpLineNumbers) { + case 'comments': + result = debugInfo.asComment(ctx); + break; + case 'mediaquery': + result = debugInfo.asMediaQuery(ctx); + break; + case 'all': + result = debugInfo.asComment(ctx) + (lineSeparator || '') + debugInfo.asMediaQuery(ctx); + break; + } + } + return result; + } + debugInfo.asComment = function (ctx) { + return "/* line " + ctx.debugInfo.lineNumber + ", " + ctx.debugInfo.fileName + " */\n"; + }; + debugInfo.asMediaQuery = function (ctx) { + var filenameWithProtocol = ctx.debugInfo.fileName; + if (!/^[a-z]+:\/\//i.test(filenameWithProtocol)) { + filenameWithProtocol = "file://" + filenameWithProtocol; + } + return "@media -sass-debug-info{filename{font-family:" + filenameWithProtocol.replace(/([.:\/\\])/g, function (a) { + if (a == '\\') { + a = '\/'; + } + return "\\" + a; + }) + "}line{font-family:\\00003" + ctx.debugInfo.lineNumber + "}}\n"; + }; + return debugInfo; + }()); - function makeRegistry(base) { - return { - _data: {}, - add: function (name, func) { - // precautionary case conversion, as later querying of - // the registry by function-caller uses lower case as well. - name = name.toLowerCase(); - if (this._data.hasOwnProperty(name)) ; - this._data[name] = func; - }, - addMultiple: function (functions) { - var _this = this; - Object.keys(functions).forEach(function (name) { - _this.add(name, functions[name]); - }); - }, - get: function (name) { - return this._data[name] || (base && base.get(name)); - }, - getLocalFunctions: function () { - return this._data; - }, - inherit: function () { - return makeRegistry(this); - }, - create: function (base) { - return makeRegistry(base); - } - }; - } - var functionRegistry = makeRegistry(null); + var Comment = /** @class */ (function (_super) { + __extends(Comment, _super); + function Comment(value, isLineComment, index, currentFileInfo) { + var _this = _super.call(this) || this; + _this.value = value; + _this.isLineComment = isLineComment; + _this._index = index; + _this._fileInfo = currentFileInfo; + _this.allowRoot = true; + return _this; + } + Comment.prototype.genCSS = function (context, output) { + if (this.debugInfo) { + output.add(debugInfo(context, this), this.fileInfo(), this.getIndex()); + } + output.add(this.value); + }; + Comment.prototype.isSilent = function (context) { + var isCompressed = context.compress && this.value[2] !== '!'; + return this.isLineComment || isCompressed; + }; + return Comment; + }(Node)); + Comment.prototype.type = 'Comment'; - var defaultFunc = { - eval: function () { - var v = this.value_; - var e = this.error_; - if (e) { - throw e; - } - if (v != null) { - return v ? Keyword.True : Keyword.False; - } - }, - value: function (v) { - this.value_ = v; - }, - error: function (e) { - this.error_ = e; - }, - reset: function () { - this.value_ = this.error_ = null; - } - }; + var contexts = {}; + var copyFromOriginal = function copyFromOriginal(original, destination, propertiesToCopy) { + if (!original) { + return; + } + for (var i = 0; i < propertiesToCopy.length; i++) { + if (original.hasOwnProperty(propertiesToCopy[i])) { + destination[propertiesToCopy[i]] = original[propertiesToCopy[i]]; + } + } + }; + /* + parse is used whilst parsing + */ + var parseCopyProperties = [ + // options + 'paths', + 'rewriteUrls', + 'rootpath', + 'strictImports', + 'insecure', + 'dumpLineNumbers', + 'compress', + 'syncImport', + 'chunkInput', + 'mime', + 'useFileCache', + // context + 'processImports', + // Used by the import manager to stop multiple import visitors being created. + 'pluginManager' // Used as the plugin manager for the session + ]; + contexts.Parse = function (options) { + copyFromOriginal(options, this, parseCopyProperties); + if (typeof this.paths === 'string') { + this.paths = [this.paths]; + } + }; + var evalCopyProperties = [ + 'paths', + 'compress', + 'ieCompat', + 'math', + 'strictUnits', + 'sourceMap', + 'importMultiple', + 'urlArgs', + 'javascriptEnabled', + 'pluginManager', + 'importantScope', + 'rewriteUrls' // option - whether to adjust URL's to be relative + ]; + contexts.Eval = function (options, frames) { + copyFromOriginal(options, this, evalCopyProperties); + if (typeof this.paths === 'string') { + this.paths = [this.paths]; + } + this.frames = frames || []; + this.importantScope = this.importantScope || []; + }; + contexts.Eval.prototype.enterCalc = function () { + if (!this.calcStack) { + this.calcStack = []; + } + this.calcStack.push(true); + this.inCalc = true; + }; + contexts.Eval.prototype.exitCalc = function () { + this.calcStack.pop(); + if (!this.calcStack.length) { + this.inCalc = false; + } + }; + contexts.Eval.prototype.inParenthesis = function () { + if (!this.parensStack) { + this.parensStack = []; + } + this.parensStack.push(true); + }; + contexts.Eval.prototype.outOfParenthesis = function () { + this.parensStack.pop(); + }; + contexts.Eval.prototype.inCalc = false; + contexts.Eval.prototype.mathOn = true; + contexts.Eval.prototype.isMathOn = function (op) { + if (!this.mathOn) { + return false; + } + if (op === '/' && this.math !== Math$1.ALWAYS && (!this.parensStack || !this.parensStack.length)) { + return false; + } + if (this.math > Math$1.PARENS_DIVISION) { + return this.parensStack && this.parensStack.length; + } + return true; + }; + contexts.Eval.prototype.pathRequiresRewrite = function (path) { + var isRelative = this.rewriteUrls === RewriteUrls.LOCAL ? isPathLocalRelative : isPathRelative; + return isRelative(path); + }; + contexts.Eval.prototype.rewritePath = function (path, rootpath) { + var newPath; + rootpath = rootpath || ''; + newPath = this.normalizePath(rootpath + path); + // If a path was explicit relative and the rootpath was not an absolute path + // we must ensure that the new path is also explicit relative. + if (isPathLocalRelative(path) && + isPathRelative(rootpath) && + isPathLocalRelative(newPath) === false) { + newPath = "./" + newPath; + } + return newPath; + }; + contexts.Eval.prototype.normalizePath = function (path) { + var segments = path.split('/').reverse(); + var segment; + path = []; + while (segments.length !== 0) { + segment = segments.pop(); + switch (segment) { + case '.': + break; + case '..': + if ((path.length === 0) || (path[path.length - 1] === '..')) { + path.push(segment); + } + else { + path.pop(); + } + break; + default: + path.push(segment); + break; + } + } + return path.join('/'); + }; + function isPathRelative(path) { + return !/^(?:[a-z-]+:|\/|#)/i.test(path); + } + function isPathLocalRelative(path) { + return path.charAt(0) === '.'; + } + // todo - do the same for the toCSS ? - var Ruleset = /** @class */ (function (_super) { - __extends(Ruleset, _super); - function Ruleset(selectors, rules, strictImports, visibilityInfo) { - var _this = _super.call(this) || this; - _this.selectors = selectors; - _this.rules = rules; - _this._lookups = {}; - _this._variables = null; - _this._properties = null; - _this.strictImports = strictImports; - _this.copyVisibilityInfo(visibilityInfo); - _this.allowRoot = true; - _this.setParent(_this.selectors, _this); - _this.setParent(_this.rules, _this); - return _this; - } - Ruleset.prototype.isRulesetLike = function () { - return true; - }; - Ruleset.prototype.accept = function (visitor) { - if (this.paths) { - this.paths = visitor.visitArray(this.paths, true); - } - else if (this.selectors) { - this.selectors = visitor.visitArray(this.selectors); - } - if (this.rules && this.rules.length) { - this.rules = visitor.visitArray(this.rules); - } - }; - Ruleset.prototype.eval = function (context) { - var selectors; - var selCnt; - var selector; - var i; - var hasVariable; - var hasOnePassingSelector = false; - if (this.selectors && (selCnt = this.selectors.length)) { - selectors = new Array(selCnt); - defaultFunc.error({ - type: 'Syntax', - message: 'it is currently only allowed in parametric mixin guards,' - }); - for (i = 0; i < selCnt; i++) { - selector = this.selectors[i].eval(context); - for (var j = 0; j < selector.elements.length; j++) { - if (selector.elements[j].isVariable) { - hasVariable = true; - break; - } - } - selectors[i] = selector; - if (selector.evaldCondition) { - hasOnePassingSelector = true; - } - } - if (hasVariable) { - var toParseSelectors = new Array(selCnt); - for (i = 0; i < selCnt; i++) { - selector = selectors[i]; - toParseSelectors[i] = selector.toCSS(context); - } - this.parse.parseNode(toParseSelectors.join(','), ["selectors"], selectors[0].getIndex(), selectors[0].fileInfo(), function (err, result) { - if (result) { - selectors = flattenArray(result); - } - }); - } - defaultFunc.reset(); - } - else { - hasOnePassingSelector = true; - } - var rules = this.rules ? copyArray(this.rules) : null; - var ruleset = new Ruleset(selectors, rules, this.strictImports, this.visibilityInfo()); - var rule; - var subRule; - ruleset.originalRuleset = this; - ruleset.root = this.root; - ruleset.firstRoot = this.firstRoot; - ruleset.allowImports = this.allowImports; - if (this.debugInfo) { - ruleset.debugInfo = this.debugInfo; - } - if (!hasOnePassingSelector) { - rules.length = 0; - } - // inherit a function registry from the frames stack when possible; - // otherwise from the global registry - ruleset.functionRegistry = (function (frames) { - var i = 0; - var n = frames.length; - var found; - for (; i !== n; ++i) { - found = frames[i].functionRegistry; - if (found) { - return found; - } - } - return functionRegistry; - })(context.frames).inherit(); - // push the current ruleset to the frames stack - var ctxFrames = context.frames; - ctxFrames.unshift(ruleset); - // currrent selectors - var ctxSelectors = context.selectors; - if (!ctxSelectors) { - context.selectors = ctxSelectors = []; - } - ctxSelectors.unshift(this.selectors); - // Evaluate imports - if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) { - ruleset.evalImports(context); - } - // Store the frames around mixin definitions, - // so they can be evaluated like closures when the time comes. - var rsRules = ruleset.rules; - for (i = 0; (rule = rsRules[i]); i++) { - if (rule.evalFirst) { - rsRules[i] = rule.eval(context); - } - } - var mediaBlockCount = (context.mediaBlocks && context.mediaBlocks.length) || 0; - // Evaluate mixin calls. - for (i = 0; (rule = rsRules[i]); i++) { - if (rule.type === 'MixinCall') { - /* jshint loopfunc:true */ - rules = rule.eval(context).filter(function (r) { - if ((r instanceof Declaration) && r.variable) { - // do not pollute the scope if the variable is - // already there. consider returning false here - // but we need a way to "return" variable from mixins - return !(ruleset.variable(r.name)); - } - return true; - }); - rsRules.splice.apply(rsRules, [i, 1].concat(rules)); - i += rules.length - 1; - ruleset.resetCache(); - } - else if (rule.type === 'VariableCall') { - /* jshint loopfunc:true */ - rules = rule.eval(context).rules.filter(function (r) { - if ((r instanceof Declaration) && r.variable) { - // do not pollute the scope at all - return false; - } - return true; - }); - rsRules.splice.apply(rsRules, [i, 1].concat(rules)); - i += rules.length - 1; - ruleset.resetCache(); - } - } - // Evaluate everything else - for (i = 0; (rule = rsRules[i]); i++) { - if (!rule.evalFirst) { - rsRules[i] = rule = rule.eval ? rule.eval(context) : rule; - } - } - // Evaluate everything else - for (i = 0; (rule = rsRules[i]); i++) { - // for rulesets, check if it is a css guard and can be removed - if (rule instanceof Ruleset && rule.selectors && rule.selectors.length === 1) { - // check if it can be folded in (e.g. & where) - if (rule.selectors[0] && rule.selectors[0].isJustParentSelector()) { - rsRules.splice(i--, 1); - for (var j = 0; (subRule = rule.rules[j]); j++) { - if (subRule instanceof Node) { - subRule.copyVisibilityInfo(rule.visibilityInfo()); - if (!(subRule instanceof Declaration) || !subRule.variable) { - rsRules.splice(++i, 0, subRule); - } - } - } - } - } - } - // Pop the stack - ctxFrames.shift(); - ctxSelectors.shift(); - if (context.mediaBlocks) { - for (i = mediaBlockCount; i < context.mediaBlocks.length; i++) { - context.mediaBlocks[i].bubbleSelectors(selectors); - } - } - return ruleset; - }; - Ruleset.prototype.evalImports = function (context) { - var rules = this.rules; - var i; - var importRules; - if (!rules) { - return; - } - for (i = 0; i < rules.length; i++) { - if (rules[i].type === 'Import') { - importRules = rules[i].eval(context); - if (importRules && (importRules.length || importRules.length === 0)) { - rules.splice.apply(rules, [i, 1].concat(importRules)); - i += importRules.length - 1; - } - else { - rules.splice(i, 1, importRules); - } - this.resetCache(); - } - } - }; - Ruleset.prototype.makeImportant = function () { - var result = new Ruleset(this.selectors, this.rules.map(function (r) { - if (r.makeImportant) { - return r.makeImportant(); - } - else { - return r; - } - }), this.strictImports, this.visibilityInfo()); - return result; - }; - Ruleset.prototype.matchArgs = function (args) { - return !args || args.length === 0; - }; - // lets you call a css selector with a guard - Ruleset.prototype.matchCondition = function (args, context) { - var lastSelector = this.selectors[this.selectors.length - 1]; - if (!lastSelector.evaldCondition) { - return false; - } - if (lastSelector.condition && - !lastSelector.condition.eval(new contexts.Eval(context, context.frames))) { - return false; - } - return true; - }; - Ruleset.prototype.resetCache = function () { - this._rulesets = null; - this._variables = null; - this._properties = null; - this._lookups = {}; - }; - Ruleset.prototype.variables = function () { - if (!this._variables) { - this._variables = !this.rules ? {} : this.rules.reduce(function (hash, r) { - if (r instanceof Declaration && r.variable === true) { - hash[r.name] = r; - } - // when evaluating variables in an import statement, imports have not been eval'd - // so we need to go inside import statements. - // guard against root being a string (in the case of inlined less) - if (r.type === 'Import' && r.root && r.root.variables) { - var vars = r.root.variables(); - for (var name_1 in vars) { - if (vars.hasOwnProperty(name_1)) { - hash[name_1] = r.root.variable(name_1); - } - } - } - return hash; - }, {}); - } - return this._variables; - }; - Ruleset.prototype.properties = function () { - if (!this._properties) { - this._properties = !this.rules ? {} : this.rules.reduce(function (hash, r) { - if (r instanceof Declaration && r.variable !== true) { - var name_2 = (r.name.length === 1) && (r.name[0] instanceof Keyword) ? - r.name[0].value : r.name; - // Properties don't overwrite as they can merge - if (!hash["$" + name_2]) { - hash["$" + name_2] = [r]; - } - else { - hash["$" + name_2].push(r); - } - } - return hash; - }, {}); - } - return this._properties; - }; - Ruleset.prototype.variable = function (name) { - var decl = this.variables()[name]; - if (decl) { - return this.parseValue(decl); - } - }; - Ruleset.prototype.property = function (name) { - var decl = this.properties()[name]; - if (decl) { - return this.parseValue(decl); - } - }; - Ruleset.prototype.lastDeclaration = function () { - for (var i = this.rules.length; i > 0; i--) { - var decl = this.rules[i - 1]; - if (decl instanceof Declaration) { - return this.parseValue(decl); - } - } - }; - Ruleset.prototype.parseValue = function (toParse) { - var self = this; - function transformDeclaration(decl) { - if (decl.value instanceof Anonymous && !decl.parsed) { - if (typeof decl.value.value === 'string') { - this.parse.parseNode(decl.value.value, ['value', 'important'], decl.value.getIndex(), decl.fileInfo(), function (err, result) { - if (err) { - decl.parsed = true; - } - if (result) { - decl.value = result[0]; - decl.important = result[1] || ''; - decl.parsed = true; - } - }); - } - else { - decl.parsed = true; - } - return decl; - } - else { - return decl; - } - } - if (!Array.isArray(toParse)) { - return transformDeclaration.call(self, toParse); - } - else { - var nodes_1 = []; - toParse.forEach(function (n) { - nodes_1.push(transformDeclaration.call(self, n)); - }); - return nodes_1; - } - }; - Ruleset.prototype.rulesets = function () { - if (!this.rules) { - return []; - } - var filtRules = []; - var rules = this.rules; - var i; - var rule; - for (i = 0; (rule = rules[i]); i++) { - if (rule.isRuleset) { - filtRules.push(rule); - } - } - return filtRules; - }; - Ruleset.prototype.prependRule = function (rule) { - var rules = this.rules; - if (rules) { - rules.unshift(rule); - } - else { - this.rules = [rule]; - } - this.setParent(rule, this); - }; - Ruleset.prototype.find = function (selector, self, filter) { - if (self === void 0) { self = this; } - var rules = []; - var match; - var foundMixins; - var key = selector.toCSS(); - if (key in this._lookups) { - return this._lookups[key]; - } - this.rulesets().forEach(function (rule) { - if (rule !== self) { - for (var j = 0; j < rule.selectors.length; j++) { - match = selector.match(rule.selectors[j]); - if (match) { - if (selector.elements.length > match) { - if (!filter || filter(rule)) { - foundMixins = rule.find(new Selector(selector.elements.slice(match)), self, filter); - for (var i = 0; i < foundMixins.length; ++i) { - foundMixins[i].path.push(rule); - } - Array.prototype.push.apply(rules, foundMixins); - } - } - else { - rules.push({ rule: rule, path: [] }); - } - break; - } - } - } - }); - this._lookups[key] = rules; - return rules; - }; - Ruleset.prototype.genCSS = function (context, output) { - var i; - var j; - var charsetRuleNodes = []; - var ruleNodes = []; - var // Line number debugging - debugInfo$1; - var rule; - var path; - context.tabLevel = (context.tabLevel || 0); - if (!this.root) { - context.tabLevel++; - } - var tabRuleStr = context.compress ? '' : Array(context.tabLevel + 1).join(' '); - var tabSetStr = context.compress ? '' : Array(context.tabLevel).join(' '); - var sep; - var charsetNodeIndex = 0; - var importNodeIndex = 0; - for (i = 0; (rule = this.rules[i]); i++) { - if (rule instanceof Comment) { - if (importNodeIndex === i) { - importNodeIndex++; - } - ruleNodes.push(rule); - } - else if (rule.isCharset && rule.isCharset()) { - ruleNodes.splice(charsetNodeIndex, 0, rule); - charsetNodeIndex++; - importNodeIndex++; - } - else if (rule.type === 'Import') { - ruleNodes.splice(importNodeIndex, 0, rule); - importNodeIndex++; - } - else { - ruleNodes.push(rule); - } - } - ruleNodes = charsetRuleNodes.concat(ruleNodes); - // If this is the root node, we don't render - // a selector, or {}. - if (!this.root) { - debugInfo$1 = debugInfo(context, this, tabSetStr); - if (debugInfo$1) { - output.add(debugInfo$1); - output.add(tabSetStr); - } - var paths = this.paths; - var pathCnt = paths.length; - var pathSubCnt = void 0; - sep = context.compress ? ',' : (",\n" + tabSetStr); - for (i = 0; i < pathCnt; i++) { - path = paths[i]; - if (!(pathSubCnt = path.length)) { - continue; - } - if (i > 0) { - output.add(sep); - } - context.firstSelector = true; - path[0].genCSS(context, output); - context.firstSelector = false; - for (j = 1; j < pathSubCnt; j++) { - path[j].genCSS(context, output); - } - } - output.add((context.compress ? '{' : ' {\n') + tabRuleStr); - } - // Compile rules and rulesets - for (i = 0; (rule = ruleNodes[i]); i++) { - if (i + 1 === ruleNodes.length) { - context.lastRule = true; - } - var currentLastRule = context.lastRule; - if (rule.isRulesetLike(rule)) { - context.lastRule = false; - } - if (rule.genCSS) { - rule.genCSS(context, output); - } - else if (rule.value) { - output.add(rule.value.toString()); - } - context.lastRule = currentLastRule; - if (!context.lastRule && rule.isVisible()) { - output.add(context.compress ? '' : ("\n" + tabRuleStr)); - } - else { - context.lastRule = false; - } - } - if (!this.root) { - output.add((context.compress ? '}' : "\n" + tabSetStr + "}")); - context.tabLevel--; - } - if (!output.isEmpty() && !context.compress && this.firstRoot) { - output.add('\n'); - } - }; - Ruleset.prototype.joinSelectors = function (paths, context, selectors) { - for (var s = 0; s < selectors.length; s++) { - this.joinSelector(paths, context, selectors[s]); - } - }; - Ruleset.prototype.joinSelector = function (paths, context, selector) { - function createParenthesis(elementsToPak, originalElement) { - var replacementParen; - var j; - if (elementsToPak.length === 0) { - replacementParen = new Paren(elementsToPak[0]); - } - else { - var insideParent = new Array(elementsToPak.length); - for (j = 0; j < elementsToPak.length; j++) { - insideParent[j] = new Element(null, elementsToPak[j], originalElement.isVariable, originalElement._index, originalElement._fileInfo); - } - replacementParen = new Paren(new Selector(insideParent)); - } - return replacementParen; - } - function createSelector(containedElement, originalElement) { - var element; - var selector; - element = new Element(null, containedElement, originalElement.isVariable, originalElement._index, originalElement._fileInfo); - selector = new Selector([element]); - return selector; - } - // joins selector path from `beginningPath` with selector path in `addPath` - // `replacedElement` contains element that is being replaced by `addPath` - // returns concatenated path - function addReplacementIntoPath(beginningPath, addPath, replacedElement, originalSelector) { - var newSelectorPath; - var lastSelector; - var newJoinedSelector; - // our new selector path - newSelectorPath = []; - // construct the joined selector - if & is the first thing this will be empty, - // if not newJoinedSelector will be the last set of elements in the selector - if (beginningPath.length > 0) { - newSelectorPath = copyArray(beginningPath); - lastSelector = newSelectorPath.pop(); - newJoinedSelector = originalSelector.createDerived(copyArray(lastSelector.elements)); - } - else { - newJoinedSelector = originalSelector.createDerived([]); - } - if (addPath.length > 0) { - // /deep/ is a CSS4 selector - (removed, so should deprecate) - // that is valid without anything in front of it - // so if the & does not have a combinator that is "" or " " then - // and there is a combinator on the parent, then grab that. - // this also allows + a { & .b { .a & { ... though not sure why you would want to do that - var combinator = replacedElement.combinator; - var parentEl = addPath[0].elements[0]; - if (combinator.emptyOrWhitespace && !parentEl.combinator.emptyOrWhitespace) { - combinator = parentEl.combinator; - } - // join the elements so far with the first part of the parent - newJoinedSelector.elements.push(new Element(combinator, parentEl.value, replacedElement.isVariable, replacedElement._index, replacedElement._fileInfo)); - newJoinedSelector.elements = newJoinedSelector.elements.concat(addPath[0].elements.slice(1)); - } - // now add the joined selector - but only if it is not empty - if (newJoinedSelector.elements.length !== 0) { - newSelectorPath.push(newJoinedSelector); - } - // put together the parent selectors after the join (e.g. the rest of the parent) - if (addPath.length > 1) { - var restOfPath = addPath.slice(1); - restOfPath = restOfPath.map(function (selector) { return selector.createDerived(selector.elements, []); }); - newSelectorPath = newSelectorPath.concat(restOfPath); - } - return newSelectorPath; - } - // joins selector path from `beginningPath` with every selector path in `addPaths` array - // `replacedElement` contains element that is being replaced by `addPath` - // returns array with all concatenated paths - function addAllReplacementsIntoPath(beginningPath, addPaths, replacedElement, originalSelector, result) { - var j; - for (j = 0; j < beginningPath.length; j++) { - var newSelectorPath = addReplacementIntoPath(beginningPath[j], addPaths, replacedElement, originalSelector); - result.push(newSelectorPath); - } - return result; - } - function mergeElementsOnToSelectors(elements, selectors) { - var i; - var sel; - if (elements.length === 0) { - return; - } - if (selectors.length === 0) { - selectors.push([new Selector(elements)]); - return; - } - for (i = 0; (sel = selectors[i]); i++) { - // if the previous thing in sel is a parent this needs to join on to it - if (sel.length > 0) { - sel[sel.length - 1] = sel[sel.length - 1].createDerived(sel[sel.length - 1].elements.concat(elements)); - } - else { - sel.push(new Selector(elements)); - } - } - } - // replace all parent selectors inside `inSelector` by content of `context` array - // resulting selectors are returned inside `paths` array - // returns true if `inSelector` contained at least one parent selector - function replaceParentSelector(paths, context, inSelector) { - // The paths are [[Selector]] - // The first list is a list of comma separated selectors - // The inner list is a list of inheritance separated selectors - // e.g. - // .a, .b { - // .c { - // } - // } - // == [[.a] [.c]] [[.b] [.c]] - // - var i; - var j; - var k; - var currentElements; - var newSelectors; - var selectorsMultiplied; - var sel; - var el; - var hadParentSelector = false; - var length; - var lastSelector; - function findNestedSelector(element) { - var maybeSelector; - if (!(element.value instanceof Paren)) { - return null; - } - maybeSelector = element.value.value; - if (!(maybeSelector instanceof Selector)) { - return null; - } - return maybeSelector; - } - // the elements from the current selector so far - currentElements = []; - // the current list of new selectors to add to the path. - // We will build it up. We initiate it with one empty selector as we "multiply" the new selectors - // by the parents - newSelectors = [ - [] - ]; - for (i = 0; (el = inSelector.elements[i]); i++) { - // non parent reference elements just get added - if (el.value !== '&') { - var nestedSelector = findNestedSelector(el); - if (nestedSelector != null) { - // merge the current list of non parent selector elements - // on to the current list of selectors to add - mergeElementsOnToSelectors(currentElements, newSelectors); - var nestedPaths = []; - var replaced = void 0; - var replacedNewSelectors = []; - replaced = replaceParentSelector(nestedPaths, context, nestedSelector); - hadParentSelector = hadParentSelector || replaced; - // the nestedPaths array should have only one member - replaceParentSelector does not multiply selectors - for (k = 0; k < nestedPaths.length; k++) { - var replacementSelector = createSelector(createParenthesis(nestedPaths[k], el), el); - addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors); - } - newSelectors = replacedNewSelectors; - currentElements = []; - } - else { - currentElements.push(el); - } - } - else { - hadParentSelector = true; - // the new list of selectors to add - selectorsMultiplied = []; - // merge the current list of non parent selector elements - // on to the current list of selectors to add - mergeElementsOnToSelectors(currentElements, newSelectors); - // loop through our current selectors - for (j = 0; j < newSelectors.length; j++) { - sel = newSelectors[j]; - // if we don't have any parent paths, the & might be in a mixin so that it can be used - // whether there are parents or not - if (context.length === 0) { - // the combinator used on el should now be applied to the next element instead so that - // it is not lost - if (sel.length > 0) { - sel[0].elements.push(new Element(el.combinator, '', el.isVariable, el._index, el._fileInfo)); - } - selectorsMultiplied.push(sel); - } - else { - // and the parent selectors - for (k = 0; k < context.length; k++) { - // We need to put the current selectors - // then join the last selector's elements on to the parents selectors - var newSelectorPath = addReplacementIntoPath(sel, context[k], el, inSelector); - // add that to our new set of selectors - selectorsMultiplied.push(newSelectorPath); - } - } - } - // our new selectors has been multiplied, so reset the state - newSelectors = selectorsMultiplied; - currentElements = []; - } - } - // if we have any elements left over (e.g. .a& .b == .b) - // add them on to all the current selectors - mergeElementsOnToSelectors(currentElements, newSelectors); - for (i = 0; i < newSelectors.length; i++) { - length = newSelectors[i].length; - if (length > 0) { - paths.push(newSelectors[i]); - lastSelector = newSelectors[i][length - 1]; - newSelectors[i][length - 1] = lastSelector.createDerived(lastSelector.elements, inSelector.extendList); - } - } - return hadParentSelector; - } - function deriveSelector(visibilityInfo, deriveFrom) { - var newSelector = deriveFrom.createDerived(deriveFrom.elements, deriveFrom.extendList, deriveFrom.evaldCondition); - newSelector.copyVisibilityInfo(visibilityInfo); - return newSelector; - } - // joinSelector code follows - var i; - var newPaths; - var hadParentSelector; - newPaths = []; - hadParentSelector = replaceParentSelector(newPaths, context, selector); - if (!hadParentSelector) { - if (context.length > 0) { - newPaths = []; - for (i = 0; i < context.length; i++) { - var concatenated = context[i].map(deriveSelector.bind(this, selector.visibilityInfo())); - concatenated.push(selector); - newPaths.push(concatenated); - } - } - else { - newPaths = [[selector]]; - } - } - for (i = 0; i < newPaths.length; i++) { - paths.push(newPaths[i]); - } - }; - return Ruleset; - }(Node)); - Ruleset.prototype.type = 'Ruleset'; - Ruleset.prototype.isRuleset = true; + function makeRegistry(base) { + return { + _data: {}, + add: function (name, func) { + // precautionary case conversion, as later querying of + // the registry by function-caller uses lower case as well. + name = name.toLowerCase(); + if (this._data.hasOwnProperty(name)) ; + this._data[name] = func; + }, + addMultiple: function (functions) { + var _this = this; + Object.keys(functions).forEach(function (name) { + _this.add(name, functions[name]); + }); + }, + get: function (name) { + return this._data[name] || (base && base.get(name)); + }, + getLocalFunctions: function () { + return this._data; + }, + inherit: function () { + return makeRegistry(this); + }, + create: function (base) { + return makeRegistry(base); + } + }; + } + var functionRegistry = makeRegistry(null); - var AtRule = /** @class */ (function (_super) { - __extends(AtRule, _super); - function AtRule(name, value, rules, index, currentFileInfo, debugInfo, isRooted, visibilityInfo) { - var _this = _super.call(this) || this; - var i; - _this.name = name; - _this.value = (value instanceof Node) ? value : (value ? new Anonymous(value) : value); - if (rules) { - if (Array.isArray(rules)) { - _this.rules = rules; - } - else { - _this.rules = [rules]; - _this.rules[0].selectors = (new Selector([], null, null, index, currentFileInfo)).createEmptySelectors(); - } - for (i = 0; i < _this.rules.length; i++) { - _this.rules[i].allowImports = true; - } - _this.setParent(_this.rules, _this); - } - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.debugInfo = debugInfo; - _this.isRooted = isRooted || false; - _this.copyVisibilityInfo(visibilityInfo); - _this.allowRoot = true; - return _this; - } - AtRule.prototype.accept = function (visitor) { - var value = this.value; - var rules = this.rules; - if (rules) { - this.rules = visitor.visitArray(rules); - } - if (value) { - this.value = visitor.visit(value); - } - }; - AtRule.prototype.isRulesetLike = function () { - return this.rules || !this.isCharset(); - }; - AtRule.prototype.isCharset = function () { - return '@charset' === this.name; - }; - AtRule.prototype.genCSS = function (context, output) { - var value = this.value; - var rules = this.rules; - output.add(this.name, this.fileInfo(), this.getIndex()); - if (value) { - output.add(' '); - value.genCSS(context, output); - } - if (rules) { - this.outputRuleset(context, output, rules); - } - else { - output.add(';'); - } - }; - AtRule.prototype.eval = function (context) { - var mediaPathBackup; - var mediaBlocksBackup; - var value = this.value; - var rules = this.rules; - // media stored inside other atrule should not bubble over it - // backpup media bubbling information - mediaPathBackup = context.mediaPath; - mediaBlocksBackup = context.mediaBlocks; - // deleted media bubbling information - context.mediaPath = []; - context.mediaBlocks = []; - if (value) { - value = value.eval(context); - } - if (rules) { - // assuming that there is only one rule at this point - that is how parser constructs the rule - rules = [rules[0].eval(context)]; - rules[0].root = true; - } - // restore media bubbling information - context.mediaPath = mediaPathBackup; - context.mediaBlocks = mediaBlocksBackup; - return new AtRule(this.name, value, rules, this.getIndex(), this.fileInfo(), this.debugInfo, this.isRooted, this.visibilityInfo()); - }; - AtRule.prototype.variable = function (name) { - if (this.rules) { - // assuming that there is only one rule at this point - that is how parser constructs the rule - return Ruleset.prototype.variable.call(this.rules[0], name); - } - }; - AtRule.prototype.find = function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } - if (this.rules) { - // assuming that there is only one rule at this point - that is how parser constructs the rule - return Ruleset.prototype.find.apply(this.rules[0], args); - } - }; - AtRule.prototype.rulesets = function () { - if (this.rules) { - // assuming that there is only one rule at this point - that is how parser constructs the rule - return Ruleset.prototype.rulesets.apply(this.rules[0]); - } - }; - AtRule.prototype.outputRuleset = function (context, output, rules) { - var ruleCnt = rules.length; - var i; - context.tabLevel = (context.tabLevel | 0) + 1; - // Compressed - if (context.compress) { - output.add('{'); - for (i = 0; i < ruleCnt; i++) { - rules[i].genCSS(context, output); - } - output.add('}'); - context.tabLevel--; - return; - } - // Non-compressed - var tabSetStr = "\n" + Array(context.tabLevel).join(' '); - var tabRuleStr = tabSetStr + " "; - if (!ruleCnt) { - output.add(" {" + tabSetStr + "}"); - } - else { - output.add(" {" + tabRuleStr); - rules[0].genCSS(context, output); - for (i = 1; i < ruleCnt; i++) { - output.add(tabRuleStr); - rules[i].genCSS(context, output); - } - output.add(tabSetStr + "}"); - } - context.tabLevel--; - }; - return AtRule; - }(Node)); - AtRule.prototype.type = 'AtRule'; + var defaultFunc = { + eval: function () { + var v = this.value_; + var e = this.error_; + if (e) { + throw e; + } + if (v != null) { + return v ? Keyword.True : Keyword.False; + } + }, + value: function (v) { + this.value_ = v; + }, + error: function (e) { + this.error_ = e; + }, + reset: function () { + this.value_ = this.error_ = null; + } + }; - var DetachedRuleset = /** @class */ (function (_super) { - __extends(DetachedRuleset, _super); - function DetachedRuleset(ruleset, frames) { - var _this = _super.call(this) || this; - _this.ruleset = ruleset; - _this.frames = frames; - _this.setParent(_this.ruleset, _this); - return _this; - } - DetachedRuleset.prototype.accept = function (visitor) { - this.ruleset = visitor.visit(this.ruleset); - }; - DetachedRuleset.prototype.eval = function (context) { - var frames = this.frames || copyArray(context.frames); - return new DetachedRuleset(this.ruleset, frames); - }; - DetachedRuleset.prototype.callEval = function (context) { - return this.ruleset.eval(this.frames ? new contexts.Eval(context, this.frames.concat(context.frames)) : context); - }; - return DetachedRuleset; - }(Node)); - DetachedRuleset.prototype.type = 'DetachedRuleset'; - DetachedRuleset.prototype.evalFirst = true; + var Ruleset = /** @class */ (function (_super) { + __extends(Ruleset, _super); + function Ruleset(selectors, rules, strictImports, visibilityInfo) { + var _this = _super.call(this) || this; + _this.selectors = selectors; + _this.rules = rules; + _this._lookups = {}; + _this._variables = null; + _this._properties = null; + _this.strictImports = strictImports; + _this.copyVisibilityInfo(visibilityInfo); + _this.allowRoot = true; + _this.setParent(_this.selectors, _this); + _this.setParent(_this.rules, _this); + return _this; + } + Ruleset.prototype.isRulesetLike = function () { return true; }; + Ruleset.prototype.accept = function (visitor) { + if (this.paths) { + this.paths = visitor.visitArray(this.paths, true); + } + else if (this.selectors) { + this.selectors = visitor.visitArray(this.selectors); + } + if (this.rules && this.rules.length) { + this.rules = visitor.visitArray(this.rules); + } + }; + Ruleset.prototype.eval = function (context) { + var selectors; + var selCnt; + var selector; + var i; + var hasVariable; + var hasOnePassingSelector = false; + if (this.selectors && (selCnt = this.selectors.length)) { + selectors = new Array(selCnt); + defaultFunc.error({ + type: 'Syntax', + message: 'it is currently only allowed in parametric mixin guards,' + }); + for (i = 0; i < selCnt; i++) { + selector = this.selectors[i].eval(context); + for (var j = 0; j < selector.elements.length; j++) { + if (selector.elements[j].isVariable) { + hasVariable = true; + break; + } + } + selectors[i] = selector; + if (selector.evaldCondition) { + hasOnePassingSelector = true; + } + } + if (hasVariable) { + var toParseSelectors = new Array(selCnt); + for (i = 0; i < selCnt; i++) { + selector = selectors[i]; + toParseSelectors[i] = selector.toCSS(context); + } + this.parse.parseNode(toParseSelectors.join(','), ["selectors"], selectors[0].getIndex(), selectors[0].fileInfo(), function (err, result) { + if (result) { + selectors = flattenArray(result); + } + }); + } + defaultFunc.reset(); + } + else { + hasOnePassingSelector = true; + } + var rules = this.rules ? copyArray(this.rules) : null; + var ruleset = new Ruleset(selectors, rules, this.strictImports, this.visibilityInfo()); + var rule; + var subRule; + ruleset.originalRuleset = this; + ruleset.root = this.root; + ruleset.firstRoot = this.firstRoot; + ruleset.allowImports = this.allowImports; + if (this.debugInfo) { + ruleset.debugInfo = this.debugInfo; + } + if (!hasOnePassingSelector) { + rules.length = 0; + } + // inherit a function registry from the frames stack when possible; + // otherwise from the global registry + ruleset.functionRegistry = (function (frames) { + var i = 0; + var n = frames.length; + var found; + for (; i !== n; ++i) { + found = frames[i].functionRegistry; + if (found) { + return found; + } + } + return functionRegistry; + }(context.frames)).inherit(); + // push the current ruleset to the frames stack + var ctxFrames = context.frames; + ctxFrames.unshift(ruleset); + // currrent selectors + var ctxSelectors = context.selectors; + if (!ctxSelectors) { + context.selectors = ctxSelectors = []; + } + ctxSelectors.unshift(this.selectors); + // Evaluate imports + if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) { + ruleset.evalImports(context); + } + // Store the frames around mixin definitions, + // so they can be evaluated like closures when the time comes. + var rsRules = ruleset.rules; + for (i = 0; (rule = rsRules[i]); i++) { + if (rule.evalFirst) { + rsRules[i] = rule.eval(context); + } + } + var mediaBlockCount = (context.mediaBlocks && context.mediaBlocks.length) || 0; + // Evaluate mixin calls. + for (i = 0; (rule = rsRules[i]); i++) { + if (rule.type === 'MixinCall') { + /* jshint loopfunc:true */ + rules = rule.eval(context).filter(function (r) { + if ((r instanceof Declaration) && r.variable) { + // do not pollute the scope if the variable is + // already there. consider returning false here + // but we need a way to "return" variable from mixins + return !(ruleset.variable(r.name)); + } + return true; + }); + rsRules.splice.apply(rsRules, [i, 1].concat(rules)); + i += rules.length - 1; + ruleset.resetCache(); + } + else if (rule.type === 'VariableCall') { + /* jshint loopfunc:true */ + rules = rule.eval(context).rules.filter(function (r) { + if ((r instanceof Declaration) && r.variable) { + // do not pollute the scope at all + return false; + } + return true; + }); + rsRules.splice.apply(rsRules, [i, 1].concat(rules)); + i += rules.length - 1; + ruleset.resetCache(); + } + } + // Evaluate everything else + for (i = 0; (rule = rsRules[i]); i++) { + if (!rule.evalFirst) { + rsRules[i] = rule = rule.eval ? rule.eval(context) : rule; + } + } + // Evaluate everything else + for (i = 0; (rule = rsRules[i]); i++) { + // for rulesets, check if it is a css guard and can be removed + if (rule instanceof Ruleset && rule.selectors && rule.selectors.length === 1) { + // check if it can be folded in (e.g. & where) + if (rule.selectors[0] && rule.selectors[0].isJustParentSelector()) { + rsRules.splice(i--, 1); + for (var j = 0; (subRule = rule.rules[j]); j++) { + if (subRule instanceof Node) { + subRule.copyVisibilityInfo(rule.visibilityInfo()); + if (!(subRule instanceof Declaration) || !subRule.variable) { + rsRules.splice(++i, 0, subRule); + } + } + } + } + } + } + // Pop the stack + ctxFrames.shift(); + ctxSelectors.shift(); + if (context.mediaBlocks) { + for (i = mediaBlockCount; i < context.mediaBlocks.length; i++) { + context.mediaBlocks[i].bubbleSelectors(selectors); + } + } + return ruleset; + }; + Ruleset.prototype.evalImports = function (context) { + var rules = this.rules; + var i; + var importRules; + if (!rules) { + return; + } + for (i = 0; i < rules.length; i++) { + if (rules[i].type === 'Import') { + importRules = rules[i].eval(context); + if (importRules && (importRules.length || importRules.length === 0)) { + rules.splice.apply(rules, [i, 1].concat(importRules)); + i += importRules.length - 1; + } + else { + rules.splice(i, 1, importRules); + } + this.resetCache(); + } + } + }; + Ruleset.prototype.makeImportant = function () { + var result = new Ruleset(this.selectors, this.rules.map(function (r) { + if (r.makeImportant) { + return r.makeImportant(); + } + else { + return r; + } + }), this.strictImports, this.visibilityInfo()); + return result; + }; + Ruleset.prototype.matchArgs = function (args) { + return !args || args.length === 0; + }; + // lets you call a css selector with a guard + Ruleset.prototype.matchCondition = function (args, context) { + var lastSelector = this.selectors[this.selectors.length - 1]; + if (!lastSelector.evaldCondition) { + return false; + } + if (lastSelector.condition && + !lastSelector.condition.eval(new contexts.Eval(context, context.frames))) { + return false; + } + return true; + }; + Ruleset.prototype.resetCache = function () { + this._rulesets = null; + this._variables = null; + this._properties = null; + this._lookups = {}; + }; + Ruleset.prototype.variables = function () { + if (!this._variables) { + this._variables = !this.rules ? {} : this.rules.reduce(function (hash, r) { + if (r instanceof Declaration && r.variable === true) { + hash[r.name] = r; + } + // when evaluating variables in an import statement, imports have not been eval'd + // so we need to go inside import statements. + // guard against root being a string (in the case of inlined less) + if (r.type === 'Import' && r.root && r.root.variables) { + var vars = r.root.variables(); + for (var name_1 in vars) { + if (vars.hasOwnProperty(name_1)) { + hash[name_1] = r.root.variable(name_1); + } + } + } + return hash; + }, {}); + } + return this._variables; + }; + Ruleset.prototype.properties = function () { + if (!this._properties) { + this._properties = !this.rules ? {} : this.rules.reduce(function (hash, r) { + if (r instanceof Declaration && r.variable !== true) { + var name_2 = (r.name.length === 1) && (r.name[0] instanceof Keyword) ? + r.name[0].value : r.name; + // Properties don't overwrite as they can merge + if (!hash["$" + name_2]) { + hash["$" + name_2] = [r]; + } + else { + hash["$" + name_2].push(r); + } + } + return hash; + }, {}); + } + return this._properties; + }; + Ruleset.prototype.variable = function (name) { + var decl = this.variables()[name]; + if (decl) { + return this.parseValue(decl); + } + }; + Ruleset.prototype.property = function (name) { + var decl = this.properties()[name]; + if (decl) { + return this.parseValue(decl); + } + }; + Ruleset.prototype.lastDeclaration = function () { + for (var i = this.rules.length; i > 0; i--) { + var decl = this.rules[i - 1]; + if (decl instanceof Declaration) { + return this.parseValue(decl); + } + } + }; + Ruleset.prototype.parseValue = function (toParse) { + var self = this; + function transformDeclaration(decl) { + if (decl.value instanceof Anonymous && !decl.parsed) { + if (typeof decl.value.value === 'string') { + this.parse.parseNode(decl.value.value, ['value', 'important'], decl.value.getIndex(), decl.fileInfo(), function (err, result) { + if (err) { + decl.parsed = true; + } + if (result) { + decl.value = result[0]; + decl.important = result[1] || ''; + decl.parsed = true; + } + }); + } + else { + decl.parsed = true; + } + return decl; + } + else { + return decl; + } + } + if (!Array.isArray(toParse)) { + return transformDeclaration.call(self, toParse); + } + else { + var nodes_1 = []; + toParse.forEach(function (n) { + nodes_1.push(transformDeclaration.call(self, n)); + }); + return nodes_1; + } + }; + Ruleset.prototype.rulesets = function () { + if (!this.rules) { + return []; + } + var filtRules = []; + var rules = this.rules; + var i; + var rule; + for (i = 0; (rule = rules[i]); i++) { + if (rule.isRuleset) { + filtRules.push(rule); + } + } + return filtRules; + }; + Ruleset.prototype.prependRule = function (rule) { + var rules = this.rules; + if (rules) { + rules.unshift(rule); + } + else { + this.rules = [rule]; + } + this.setParent(rule, this); + }; + Ruleset.prototype.find = function (selector, self, filter) { + self = self || this; + var rules = []; + var match; + var foundMixins; + var key = selector.toCSS(); + if (key in this._lookups) { + return this._lookups[key]; + } + this.rulesets().forEach(function (rule) { + if (rule !== self) { + for (var j = 0; j < rule.selectors.length; j++) { + match = selector.match(rule.selectors[j]); + if (match) { + if (selector.elements.length > match) { + if (!filter || filter(rule)) { + foundMixins = rule.find(new Selector(selector.elements.slice(match)), self, filter); + for (var i = 0; i < foundMixins.length; ++i) { + foundMixins[i].path.push(rule); + } + Array.prototype.push.apply(rules, foundMixins); + } + } + else { + rules.push({ rule: rule, path: [] }); + } + break; + } + } + } + }); + this._lookups[key] = rules; + return rules; + }; + Ruleset.prototype.genCSS = function (context, output) { + var i; + var j; + var charsetRuleNodes = []; + var ruleNodes = []; + var // Line number debugging + debugInfo$1; + var rule; + var path; + context.tabLevel = (context.tabLevel || 0); + if (!this.root) { + context.tabLevel++; + } + var tabRuleStr = context.compress ? '' : Array(context.tabLevel + 1).join(' '); + var tabSetStr = context.compress ? '' : Array(context.tabLevel).join(' '); + var sep; + var charsetNodeIndex = 0; + var importNodeIndex = 0; + for (i = 0; (rule = this.rules[i]); i++) { + if (rule instanceof Comment) { + if (importNodeIndex === i) { + importNodeIndex++; + } + ruleNodes.push(rule); + } + else if (rule.isCharset && rule.isCharset()) { + ruleNodes.splice(charsetNodeIndex, 0, rule); + charsetNodeIndex++; + importNodeIndex++; + } + else if (rule.type === 'Import') { + ruleNodes.splice(importNodeIndex, 0, rule); + importNodeIndex++; + } + else { + ruleNodes.push(rule); + } + } + ruleNodes = charsetRuleNodes.concat(ruleNodes); + // If this is the root node, we don't render + // a selector, or {}. + if (!this.root) { + debugInfo$1 = debugInfo(context, this, tabSetStr); + if (debugInfo$1) { + output.add(debugInfo$1); + output.add(tabSetStr); + } + var paths = this.paths; + var pathCnt = paths.length; + var pathSubCnt = void 0; + sep = context.compress ? ',' : (",\n" + tabSetStr); + for (i = 0; i < pathCnt; i++) { + path = paths[i]; + if (!(pathSubCnt = path.length)) { + continue; + } + if (i > 0) { + output.add(sep); + } + context.firstSelector = true; + path[0].genCSS(context, output); + context.firstSelector = false; + for (j = 1; j < pathSubCnt; j++) { + path[j].genCSS(context, output); + } + } + output.add((context.compress ? '{' : ' {\n') + tabRuleStr); + } + // Compile rules and rulesets + for (i = 0; (rule = ruleNodes[i]); i++) { + if (i + 1 === ruleNodes.length) { + context.lastRule = true; + } + var currentLastRule = context.lastRule; + if (rule.isRulesetLike(rule)) { + context.lastRule = false; + } + if (rule.genCSS) { + rule.genCSS(context, output); + } + else if (rule.value) { + output.add(rule.value.toString()); + } + context.lastRule = currentLastRule; + if (!context.lastRule && rule.isVisible()) { + output.add(context.compress ? '' : ("\n" + tabRuleStr)); + } + else { + context.lastRule = false; + } + } + if (!this.root) { + output.add((context.compress ? '}' : "\n" + tabSetStr + "}")); + context.tabLevel--; + } + if (!output.isEmpty() && !context.compress && this.firstRoot) { + output.add('\n'); + } + }; + Ruleset.prototype.joinSelectors = function (paths, context, selectors) { + for (var s = 0; s < selectors.length; s++) { + this.joinSelector(paths, context, selectors[s]); + } + }; + Ruleset.prototype.joinSelector = function (paths, context, selector) { + function createParenthesis(elementsToPak, originalElement) { + var replacementParen, j; + if (elementsToPak.length === 0) { + replacementParen = new Paren(elementsToPak[0]); + } + else { + var insideParent = new Array(elementsToPak.length); + for (j = 0; j < elementsToPak.length; j++) { + insideParent[j] = new Element(null, elementsToPak[j], originalElement.isVariable, originalElement._index, originalElement._fileInfo); + } + replacementParen = new Paren(new Selector(insideParent)); + } + return replacementParen; + } + function createSelector(containedElement, originalElement) { + var element, selector; + element = new Element(null, containedElement, originalElement.isVariable, originalElement._index, originalElement._fileInfo); + selector = new Selector([element]); + return selector; + } + // joins selector path from `beginningPath` with selector path in `addPath` + // `replacedElement` contains element that is being replaced by `addPath` + // returns concatenated path + function addReplacementIntoPath(beginningPath, addPath, replacedElement, originalSelector) { + var newSelectorPath, lastSelector, newJoinedSelector; + // our new selector path + newSelectorPath = []; + // construct the joined selector - if & is the first thing this will be empty, + // if not newJoinedSelector will be the last set of elements in the selector + if (beginningPath.length > 0) { + newSelectorPath = copyArray(beginningPath); + lastSelector = newSelectorPath.pop(); + newJoinedSelector = originalSelector.createDerived(copyArray(lastSelector.elements)); + } + else { + newJoinedSelector = originalSelector.createDerived([]); + } + if (addPath.length > 0) { + // /deep/ is a CSS4 selector - (removed, so should deprecate) + // that is valid without anything in front of it + // so if the & does not have a combinator that is "" or " " then + // and there is a combinator on the parent, then grab that. + // this also allows + a { & .b { .a & { ... though not sure why you would want to do that + var combinator = replacedElement.combinator; + var parentEl = addPath[0].elements[0]; + if (combinator.emptyOrWhitespace && !parentEl.combinator.emptyOrWhitespace) { + combinator = parentEl.combinator; + } + // join the elements so far with the first part of the parent + newJoinedSelector.elements.push(new Element(combinator, parentEl.value, replacedElement.isVariable, replacedElement._index, replacedElement._fileInfo)); + newJoinedSelector.elements = newJoinedSelector.elements.concat(addPath[0].elements.slice(1)); + } + // now add the joined selector - but only if it is not empty + if (newJoinedSelector.elements.length !== 0) { + newSelectorPath.push(newJoinedSelector); + } + // put together the parent selectors after the join (e.g. the rest of the parent) + if (addPath.length > 1) { + var restOfPath = addPath.slice(1); + restOfPath = restOfPath.map(function (selector) { + return selector.createDerived(selector.elements, []); + }); + newSelectorPath = newSelectorPath.concat(restOfPath); + } + return newSelectorPath; + } + // joins selector path from `beginningPath` with every selector path in `addPaths` array + // `replacedElement` contains element that is being replaced by `addPath` + // returns array with all concatenated paths + function addAllReplacementsIntoPath(beginningPath, addPaths, replacedElement, originalSelector, result) { + var j; + for (j = 0; j < beginningPath.length; j++) { + var newSelectorPath = addReplacementIntoPath(beginningPath[j], addPaths, replacedElement, originalSelector); + result.push(newSelectorPath); + } + return result; + } + function mergeElementsOnToSelectors(elements, selectors) { + var i, sel; + if (elements.length === 0) { + return; + } + if (selectors.length === 0) { + selectors.push([new Selector(elements)]); + return; + } + for (i = 0; (sel = selectors[i]); i++) { + // if the previous thing in sel is a parent this needs to join on to it + if (sel.length > 0) { + sel[sel.length - 1] = sel[sel.length - 1].createDerived(sel[sel.length - 1].elements.concat(elements)); + } + else { + sel.push(new Selector(elements)); + } + } + } + // replace all parent selectors inside `inSelector` by content of `context` array + // resulting selectors are returned inside `paths` array + // returns true if `inSelector` contained at least one parent selector + function replaceParentSelector(paths, context, inSelector) { + // The paths are [[Selector]] + // The first list is a list of comma separated selectors + // The inner list is a list of inheritance separated selectors + // e.g. + // .a, .b { + // .c { + // } + // } + // == [[.a] [.c]] [[.b] [.c]] + // + var i, j, k, currentElements, newSelectors, selectorsMultiplied, sel, el, hadParentSelector = false, length, lastSelector; + function findNestedSelector(element) { + var maybeSelector; + if (!(element.value instanceof Paren)) { + return null; + } + maybeSelector = element.value.value; + if (!(maybeSelector instanceof Selector)) { + return null; + } + return maybeSelector; + } + // the elements from the current selector so far + currentElements = []; + // the current list of new selectors to add to the path. + // We will build it up. We initiate it with one empty selector as we "multiply" the new selectors + // by the parents + newSelectors = [ + [] + ]; + for (i = 0; (el = inSelector.elements[i]); i++) { + // non parent reference elements just get added + if (el.value !== '&') { + var nestedSelector = findNestedSelector(el); + if (nestedSelector != null) { + // merge the current list of non parent selector elements + // on to the current list of selectors to add + mergeElementsOnToSelectors(currentElements, newSelectors); + var nestedPaths = []; + var replaced = void 0; + var replacedNewSelectors = []; + replaced = replaceParentSelector(nestedPaths, context, nestedSelector); + hadParentSelector = hadParentSelector || replaced; + // the nestedPaths array should have only one member - replaceParentSelector does not multiply selectors + for (k = 0; k < nestedPaths.length; k++) { + var replacementSelector = createSelector(createParenthesis(nestedPaths[k], el), el); + addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors); + } + newSelectors = replacedNewSelectors; + currentElements = []; + } + else { + currentElements.push(el); + } + } + else { + hadParentSelector = true; + // the new list of selectors to add + selectorsMultiplied = []; + // merge the current list of non parent selector elements + // on to the current list of selectors to add + mergeElementsOnToSelectors(currentElements, newSelectors); + // loop through our current selectors + for (j = 0; j < newSelectors.length; j++) { + sel = newSelectors[j]; + // if we don't have any parent paths, the & might be in a mixin so that it can be used + // whether there are parents or not + if (context.length === 0) { + // the combinator used on el should now be applied to the next element instead so that + // it is not lost + if (sel.length > 0) { + sel[0].elements.push(new Element(el.combinator, '', el.isVariable, el._index, el._fileInfo)); + } + selectorsMultiplied.push(sel); + } + else { + // and the parent selectors + for (k = 0; k < context.length; k++) { + // We need to put the current selectors + // then join the last selector's elements on to the parents selectors + var newSelectorPath = addReplacementIntoPath(sel, context[k], el, inSelector); + // add that to our new set of selectors + selectorsMultiplied.push(newSelectorPath); + } + } + } + // our new selectors has been multiplied, so reset the state + newSelectors = selectorsMultiplied; + currentElements = []; + } + } + // if we have any elements left over (e.g. .a& .b == .b) + // add them on to all the current selectors + mergeElementsOnToSelectors(currentElements, newSelectors); + for (i = 0; i < newSelectors.length; i++) { + length = newSelectors[i].length; + if (length > 0) { + paths.push(newSelectors[i]); + lastSelector = newSelectors[i][length - 1]; + newSelectors[i][length - 1] = lastSelector.createDerived(lastSelector.elements, inSelector.extendList); + } + } + return hadParentSelector; + } + function deriveSelector(visibilityInfo, deriveFrom) { + var newSelector = deriveFrom.createDerived(deriveFrom.elements, deriveFrom.extendList, deriveFrom.evaldCondition); + newSelector.copyVisibilityInfo(visibilityInfo); + return newSelector; + } + // joinSelector code follows + var i, newPaths, hadParentSelector; + newPaths = []; + hadParentSelector = replaceParentSelector(newPaths, context, selector); + if (!hadParentSelector) { + if (context.length > 0) { + newPaths = []; + for (i = 0; i < context.length; i++) { + var concatenated = context[i].map(deriveSelector.bind(this, selector.visibilityInfo())); + concatenated.push(selector); + newPaths.push(concatenated); + } + } + else { + newPaths = [[selector]]; + } + } + for (i = 0; i < newPaths.length; i++) { + paths.push(newPaths[i]); + } + }; + return Ruleset; + }(Node)); + Ruleset.prototype.type = 'Ruleset'; + Ruleset.prototype.isRuleset = true; - var Unit = /** @class */ (function (_super) { - __extends(Unit, _super); - function Unit(numerator, denominator, backupUnit) { - var _this = _super.call(this) || this; - _this.numerator = numerator ? copyArray(numerator).sort() : []; - _this.denominator = denominator ? copyArray(denominator).sort() : []; - if (backupUnit) { - _this.backupUnit = backupUnit; - } - else if (numerator && numerator.length) { - _this.backupUnit = numerator[0]; - } - return _this; - } - Unit.prototype.clone = function () { - return new Unit(copyArray(this.numerator), copyArray(this.denominator), this.backupUnit); - }; - Unit.prototype.genCSS = function (context, output) { - // Dimension checks the unit is singular and throws an error if in strict math mode. - var strictUnits = context && context.strictUnits; - if (this.numerator.length === 1) { - output.add(this.numerator[0]); // the ideal situation - } - else if (!strictUnits && this.backupUnit) { - output.add(this.backupUnit); - } - else if (!strictUnits && this.denominator.length) { - output.add(this.denominator[0]); - } - }; - Unit.prototype.toString = function () { - var i; - var returnStr = this.numerator.join('*'); - for (i = 0; i < this.denominator.length; i++) { - returnStr += "/" + this.denominator[i]; - } - return returnStr; - }; - Unit.prototype.compare = function (other) { - return this.is(other.toString()) ? 0 : undefined; - }; - Unit.prototype.is = function (unitString) { - return this.toString().toUpperCase() === unitString.toUpperCase(); - }; - Unit.prototype.isLength = function () { - return RegExp('^(px|em|ex|ch|rem|in|cm|mm|pc|pt|ex|vw|vh|vmin|vmax)$', 'gi').test(this.toCSS()); - }; - Unit.prototype.isEmpty = function () { - return this.numerator.length === 0 && this.denominator.length === 0; - }; - Unit.prototype.isSingular = function () { - return this.numerator.length <= 1 && this.denominator.length === 0; - }; - Unit.prototype.map = function (callback) { - var i; - for (i = 0; i < this.numerator.length; i++) { - this.numerator[i] = callback(this.numerator[i], false); - } - for (i = 0; i < this.denominator.length; i++) { - this.denominator[i] = callback(this.denominator[i], true); - } - }; - Unit.prototype.usedUnits = function () { - var group; - var result = {}; - var mapUnit; - var groupName; - mapUnit = function (atomicUnit) { - /* jshint loopfunc:true */ - if (group.hasOwnProperty(atomicUnit) && !result[groupName]) { - result[groupName] = atomicUnit; - } - return atomicUnit; - }; - for (groupName in unitConversions) { - if (unitConversions.hasOwnProperty(groupName)) { - group = unitConversions[groupName]; - this.map(mapUnit); - } - } - return result; - }; - Unit.prototype.cancel = function () { - var counter = {}; - var atomicUnit; - var i; - for (i = 0; i < this.numerator.length; i++) { - atomicUnit = this.numerator[i]; - counter[atomicUnit] = (counter[atomicUnit] || 0) + 1; - } - for (i = 0; i < this.denominator.length; i++) { - atomicUnit = this.denominator[i]; - counter[atomicUnit] = (counter[atomicUnit] || 0) - 1; - } - this.numerator = []; - this.denominator = []; - for (atomicUnit in counter) { - if (counter.hasOwnProperty(atomicUnit)) { - var count = counter[atomicUnit]; - if (count > 0) { - for (i = 0; i < count; i++) { - this.numerator.push(atomicUnit); - } - } - else if (count < 0) { - for (i = 0; i < -count; i++) { - this.denominator.push(atomicUnit); - } - } - } - } - this.numerator.sort(); - this.denominator.sort(); - }; - return Unit; - }(Node)); - Unit.prototype.type = 'Unit'; + var AtRule = /** @class */ (function (_super) { + __extends(AtRule, _super); + function AtRule(name, value, rules, index, currentFileInfo, debugInfo, isRooted, visibilityInfo) { + var _this = _super.call(this) || this; + var i; + _this.name = name; + _this.value = (value instanceof Node) ? value : (value ? new Anonymous(value) : value); + if (rules) { + if (Array.isArray(rules)) { + _this.rules = rules; + } + else { + _this.rules = [rules]; + _this.rules[0].selectors = (new Selector([], null, null, index, currentFileInfo)).createEmptySelectors(); + } + for (i = 0; i < _this.rules.length; i++) { + _this.rules[i].allowImports = true; + } + _this.setParent(_this.rules, _this); + } + _this._index = index; + _this._fileInfo = currentFileInfo; + _this.debugInfo = debugInfo; + _this.isRooted = isRooted || false; + _this.copyVisibilityInfo(visibilityInfo); + _this.allowRoot = true; + return _this; + } + AtRule.prototype.accept = function (visitor) { + var value = this.value, rules = this.rules; + if (rules) { + this.rules = visitor.visitArray(rules); + } + if (value) { + this.value = visitor.visit(value); + } + }; + AtRule.prototype.isRulesetLike = function () { + return this.rules || !this.isCharset(); + }; + AtRule.prototype.isCharset = function () { + return '@charset' === this.name; + }; + AtRule.prototype.genCSS = function (context, output) { + var value = this.value, rules = this.rules; + output.add(this.name, this.fileInfo(), this.getIndex()); + if (value) { + output.add(' '); + value.genCSS(context, output); + } + if (rules) { + this.outputRuleset(context, output, rules); + } + else { + output.add(';'); + } + }; + AtRule.prototype.eval = function (context) { + var mediaPathBackup, mediaBlocksBackup, value = this.value, rules = this.rules; + // media stored inside other atrule should not bubble over it + // backpup media bubbling information + mediaPathBackup = context.mediaPath; + mediaBlocksBackup = context.mediaBlocks; + // deleted media bubbling information + context.mediaPath = []; + context.mediaBlocks = []; + if (value) { + value = value.eval(context); + } + if (rules) { + // assuming that there is only one rule at this point - that is how parser constructs the rule + rules = [rules[0].eval(context)]; + rules[0].root = true; + } + // restore media bubbling information + context.mediaPath = mediaPathBackup; + context.mediaBlocks = mediaBlocksBackup; + return new AtRule(this.name, value, rules, this.getIndex(), this.fileInfo(), this.debugInfo, this.isRooted, this.visibilityInfo()); + }; + AtRule.prototype.variable = function (name) { + if (this.rules) { + // assuming that there is only one rule at this point - that is how parser constructs the rule + return Ruleset.prototype.variable.call(this.rules[0], name); + } + }; + AtRule.prototype.find = function () { + if (this.rules) { + // assuming that there is only one rule at this point - that is how parser constructs the rule + return Ruleset.prototype.find.apply(this.rules[0], arguments); + } + }; + AtRule.prototype.rulesets = function () { + if (this.rules) { + // assuming that there is only one rule at this point - that is how parser constructs the rule + return Ruleset.prototype.rulesets.apply(this.rules[0]); + } + }; + AtRule.prototype.outputRuleset = function (context, output, rules) { + var ruleCnt = rules.length; + var i; + context.tabLevel = (context.tabLevel | 0) + 1; + // Compressed + if (context.compress) { + output.add('{'); + for (i = 0; i < ruleCnt; i++) { + rules[i].genCSS(context, output); + } + output.add('}'); + context.tabLevel--; + return; + } + // Non-compressed + var tabSetStr = "\n" + Array(context.tabLevel).join(' '), tabRuleStr = tabSetStr + " "; + if (!ruleCnt) { + output.add(" {" + tabSetStr + "}"); + } + else { + output.add(" {" + tabRuleStr); + rules[0].genCSS(context, output); + for (i = 1; i < ruleCnt; i++) { + output.add(tabRuleStr); + rules[i].genCSS(context, output); + } + output.add(tabSetStr + "}"); + } + context.tabLevel--; + }; + return AtRule; + }(Node)); + AtRule.prototype.type = 'AtRule'; - // - // A number with a unit - // - var Dimension = /** @class */ (function (_super) { - __extends(Dimension, _super); - function Dimension(value, unit) { - var _this = _super.call(this) || this; - _this.value = parseFloat(value); - if (isNaN(_this.value)) { - throw new Error('Dimension is not a number.'); - } - _this.unit = (unit && unit instanceof Unit) ? unit : - new Unit(unit ? [unit] : undefined); - _this.setParent(_this.unit, _this); - return _this; - } - Dimension.prototype.accept = function (visitor) { - this.unit = visitor.visit(this.unit); - }; - Dimension.prototype.eval = function (context) { - return this; - }; - Dimension.prototype.toColor = function () { - return new Color([this.value, this.value, this.value]); - }; - Dimension.prototype.genCSS = function (context, output) { - if ((context && context.strictUnits) && !this.unit.isSingular()) { - throw new Error("Multiple units in dimension. Correct the units or use the unit function. Bad unit: " + this.unit.toString()); - } - var value = this.fround(context, this.value); - var strValue = String(value); - if (value !== 0 && value < 0.000001 && value > -0.000001) { - // would be output 1e-6 etc. - strValue = value.toFixed(20).replace(/0+$/, ''); - } - if (context && context.compress) { - // Zero values doesn't need a unit - if (value === 0 && this.unit.isLength()) { - output.add(strValue); - return; - } - // Float values doesn't need a leading zero - if (value > 0 && value < 1) { - strValue = (strValue).substr(1); - } - } - output.add(strValue); - this.unit.genCSS(context, output); - }; - // In an operation between two Dimensions, - // we default to the first Dimension's unit, - // so `1px + 2` will yield `3px`. - Dimension.prototype.operate = function (context, op, other) { - /* jshint noempty:false */ - var value = this._operate(context, op, this.value, other.value); - var unit = this.unit.clone(); - if (op === '+' || op === '-') { - if (unit.numerator.length === 0 && unit.denominator.length === 0) { - unit = other.unit.clone(); - if (this.unit.backupUnit) { - unit.backupUnit = this.unit.backupUnit; - } - } - else if (other.unit.numerator.length === 0 && unit.denominator.length === 0) ; - else { - other = other.convertTo(this.unit.usedUnits()); - if (context.strictUnits && other.unit.toString() !== unit.toString()) { - throw new Error("Incompatible units. Change the units or use the unit function. " + - ("Bad units: '" + unit.toString() + "' and '" + other.unit.toString() + "'.")); - } - value = this._operate(context, op, this.value, other.value); - } - } - else if (op === '*') { - unit.numerator = unit.numerator.concat(other.unit.numerator).sort(); - unit.denominator = unit.denominator.concat(other.unit.denominator).sort(); - unit.cancel(); - } - else if (op === '/') { - unit.numerator = unit.numerator.concat(other.unit.denominator).sort(); - unit.denominator = unit.denominator.concat(other.unit.numerator).sort(); - unit.cancel(); - } - return new Dimension(value, unit); - }; - Dimension.prototype.compare = function (other) { - var a; - var b; - if (!(other instanceof Dimension)) { - return undefined; - } - if (this.unit.isEmpty() || other.unit.isEmpty()) { - a = this; - b = other; - } - else { - a = this.unify(); - b = other.unify(); - if (a.unit.compare(b.unit) !== 0) { - return undefined; - } - } - return Node.numericCompare(a.value, b.value); - }; - Dimension.prototype.unify = function () { - return this.convertTo({ length: 'px', duration: 's', angle: 'rad' }); - }; - Dimension.prototype.convertTo = function (conversions) { - var value = this.value; - var unit = this.unit.clone(); - var i; - var groupName; - var group; - var targetUnit; - var derivedConversions = {}; - var applyUnit; - if (typeof conversions === 'string') { - for (i in unitConversions) { - if (unitConversions[i].hasOwnProperty(conversions)) { - derivedConversions = {}; - derivedConversions[i] = conversions; - } - } - conversions = derivedConversions; - } - applyUnit = function (atomicUnit, denominator) { - /* jshint loopfunc:true */ - if (group.hasOwnProperty(atomicUnit)) { - if (denominator) { - value = value / (group[atomicUnit] / group[targetUnit]); - } - else { - value = value * (group[atomicUnit] / group[targetUnit]); - } - return targetUnit; - } - return atomicUnit; - }; - for (groupName in conversions) { - if (conversions.hasOwnProperty(groupName)) { - targetUnit = conversions[groupName]; - group = unitConversions[groupName]; - unit.map(applyUnit); - } - } - unit.cancel(); - return new Dimension(value, unit); - }; - return Dimension; - }(Node)); - Dimension.prototype.type = 'Dimension'; + var DetachedRuleset = /** @class */ (function (_super) { + __extends(DetachedRuleset, _super); + function DetachedRuleset(ruleset, frames) { + var _this = _super.call(this) || this; + _this.ruleset = ruleset; + _this.frames = frames; + _this.setParent(_this.ruleset, _this); + return _this; + } + DetachedRuleset.prototype.accept = function (visitor) { + this.ruleset = visitor.visit(this.ruleset); + }; + DetachedRuleset.prototype.eval = function (context) { + var frames = this.frames || copyArray(context.frames); + return new DetachedRuleset(this.ruleset, frames); + }; + DetachedRuleset.prototype.callEval = function (context) { + return this.ruleset.eval(this.frames ? new contexts.Eval(context, this.frames.concat(context.frames)) : context); + }; + return DetachedRuleset; + }(Node)); + DetachedRuleset.prototype.type = 'DetachedRuleset'; + DetachedRuleset.prototype.evalFirst = true; - var MATH$1 = Math$1; - var Operation = /** @class */ (function (_super) { - __extends(Operation, _super); - function Operation(op, operands, isSpaced) { - var _this = _super.call(this) || this; - _this.op = op.trim(); - _this.operands = operands; - _this.isSpaced = isSpaced; - return _this; - } - Operation.prototype.accept = function (visitor) { - this.operands = visitor.visitArray(this.operands); - }; - Operation.prototype.eval = function (context) { - var a = this.operands[0].eval(context); - var b = this.operands[1].eval(context); - var op; - if (context.isMathOn(this.op)) { - op = this.op === './' ? '/' : this.op; - if (a instanceof Dimension && b instanceof Color) { - a = a.toColor(); - } - if (b instanceof Dimension && a instanceof Color) { - b = b.toColor(); - } - if (!a.operate) { - if (a instanceof Operation && a.op === '/' && context.math === MATH$1.PARENS_DIVISION) { - return new Operation(this.op, [a, b], this.isSpaced); - } - throw { type: 'Operation', - message: 'Operation on an invalid type' }; - } - return a.operate(context, op, b); - } - else { - return new Operation(this.op, [a, b], this.isSpaced); - } - }; - Operation.prototype.genCSS = function (context, output) { - this.operands[0].genCSS(context, output); - if (this.isSpaced) { - output.add(' '); - } - output.add(this.op); - if (this.isSpaced) { - output.add(' '); - } - this.operands[1].genCSS(context, output); - }; - return Operation; - }(Node)); - Operation.prototype.type = 'Operation'; + var Unit = /** @class */ (function (_super) { + __extends(Unit, _super); + function Unit(numerator, denominator, backupUnit) { + var _this = _super.call(this) || this; + _this.numerator = numerator ? copyArray(numerator).sort() : []; + _this.denominator = denominator ? copyArray(denominator).sort() : []; + if (backupUnit) { + _this.backupUnit = backupUnit; + } + else if (numerator && numerator.length) { + _this.backupUnit = numerator[0]; + } + return _this; + } + Unit.prototype.clone = function () { + return new Unit(copyArray(this.numerator), copyArray(this.denominator), this.backupUnit); + }; + Unit.prototype.genCSS = function (context, output) { + // Dimension checks the unit is singular and throws an error if in strict math mode. + var strictUnits = context && context.strictUnits; + if (this.numerator.length === 1) { + output.add(this.numerator[0]); // the ideal situation + } + else if (!strictUnits && this.backupUnit) { + output.add(this.backupUnit); + } + else if (!strictUnits && this.denominator.length) { + output.add(this.denominator[0]); + } + }; + Unit.prototype.toString = function () { + var i, returnStr = this.numerator.join('*'); + for (i = 0; i < this.denominator.length; i++) { + returnStr += "/" + this.denominator[i]; + } + return returnStr; + }; + Unit.prototype.compare = function (other) { + return this.is(other.toString()) ? 0 : undefined; + }; + Unit.prototype.is = function (unitString) { + return this.toString().toUpperCase() === unitString.toUpperCase(); + }; + Unit.prototype.isLength = function () { + return RegExp('^(px|em|ex|ch|rem|in|cm|mm|pc|pt|ex|vw|vh|vmin|vmax)$', 'gi').test(this.toCSS()); + }; + Unit.prototype.isEmpty = function () { + return this.numerator.length === 0 && this.denominator.length === 0; + }; + Unit.prototype.isSingular = function () { + return this.numerator.length <= 1 && this.denominator.length === 0; + }; + Unit.prototype.map = function (callback) { + var i; + for (i = 0; i < this.numerator.length; i++) { + this.numerator[i] = callback(this.numerator[i], false); + } + for (i = 0; i < this.denominator.length; i++) { + this.denominator[i] = callback(this.denominator[i], true); + } + }; + Unit.prototype.usedUnits = function () { + var group; + var result = {}; + var mapUnit; + var groupName; + mapUnit = function (atomicUnit) { + /* jshint loopfunc:true */ + if (group.hasOwnProperty(atomicUnit) && !result[groupName]) { + result[groupName] = atomicUnit; + } + return atomicUnit; + }; + for (groupName in unitConversions) { + if (unitConversions.hasOwnProperty(groupName)) { + group = unitConversions[groupName]; + this.map(mapUnit); + } + } + return result; + }; + Unit.prototype.cancel = function () { + var counter = {}; + var atomicUnit; + var i; + for (i = 0; i < this.numerator.length; i++) { + atomicUnit = this.numerator[i]; + counter[atomicUnit] = (counter[atomicUnit] || 0) + 1; + } + for (i = 0; i < this.denominator.length; i++) { + atomicUnit = this.denominator[i]; + counter[atomicUnit] = (counter[atomicUnit] || 0) - 1; + } + this.numerator = []; + this.denominator = []; + for (atomicUnit in counter) { + if (counter.hasOwnProperty(atomicUnit)) { + var count = counter[atomicUnit]; + if (count > 0) { + for (i = 0; i < count; i++) { + this.numerator.push(atomicUnit); + } + } + else if (count < 0) { + for (i = 0; i < -count; i++) { + this.denominator.push(atomicUnit); + } + } + } + } + this.numerator.sort(); + this.denominator.sort(); + }; + return Unit; + }(Node)); + Unit.prototype.type = 'Unit'; - var MATH$2 = Math$1; - var Expression = /** @class */ (function (_super) { - __extends(Expression, _super); - function Expression(value, noSpacing) { - var _this = _super.call(this) || this; - _this.value = value; - _this.noSpacing = noSpacing; - if (!value) { - throw new Error('Expression requires an array parameter'); - } - return _this; - } - Expression.prototype.accept = function (visitor) { - this.value = visitor.visitArray(this.value); - }; - Expression.prototype.eval = function (context) { - var returnValue; - var mathOn = context.isMathOn(); - var inParenthesis = this.parens && - (context.math !== MATH$2.STRICT_LEGACY || !this.parensInOp); - var doubleParen = false; - if (inParenthesis) { - context.inParenthesis(); - } - if (this.value.length > 1) { - returnValue = new Expression(this.value.map(function (e) { - if (!e.eval) { - return e; - } - return e.eval(context); - }), this.noSpacing); - } - else if (this.value.length === 1) { - if (this.value[0].parens && !this.value[0].parensInOp && !context.inCalc) { - doubleParen = true; - } - returnValue = this.value[0].eval(context); - } - else { - returnValue = this; - } - if (inParenthesis) { - context.outOfParenthesis(); - } - if (this.parens && this.parensInOp && !mathOn && !doubleParen - && (!(returnValue instanceof Dimension))) { - returnValue = new Paren(returnValue); - } - return returnValue; - }; - Expression.prototype.genCSS = function (context, output) { - for (var i = 0; i < this.value.length; i++) { - this.value[i].genCSS(context, output); - if (!this.noSpacing && i + 1 < this.value.length) { - output.add(' '); - } - } - }; - Expression.prototype.throwAwayComments = function () { - this.value = this.value.filter(function (v) { return !(v instanceof Comment); }); - }; - return Expression; - }(Node)); - Expression.prototype.type = 'Expression'; + // + // A number with a unit + // + var Dimension = /** @class */ (function (_super) { + __extends(Dimension, _super); + function Dimension(value, unit) { + var _this = _super.call(this) || this; + _this.value = parseFloat(value); + if (isNaN(_this.value)) { + throw new Error('Dimension is not a number.'); + } + _this.unit = (unit && unit instanceof Unit) ? unit : + new Unit(unit ? [unit] : undefined); + _this.setParent(_this.unit, _this); + return _this; + } + Dimension.prototype.accept = function (visitor) { + this.unit = visitor.visit(this.unit); + }; + Dimension.prototype.eval = function (context) { + return this; + }; + Dimension.prototype.toColor = function () { + return new Color([this.value, this.value, this.value]); + }; + Dimension.prototype.genCSS = function (context, output) { + if ((context && context.strictUnits) && !this.unit.isSingular()) { + throw new Error("Multiple units in dimension. Correct the units or use the unit function. Bad unit: " + this.unit.toString()); + } + var value = this.fround(context, this.value); + var strValue = String(value); + if (value !== 0 && value < 0.000001 && value > -0.000001) { + // would be output 1e-6 etc. + strValue = value.toFixed(20).replace(/0+$/, ''); + } + if (context && context.compress) { + // Zero values doesn't need a unit + if (value === 0 && this.unit.isLength()) { + output.add(strValue); + return; + } + // Float values doesn't need a leading zero + if (value > 0 && value < 1) { + strValue = (strValue).substr(1); + } + } + output.add(strValue); + this.unit.genCSS(context, output); + }; + // In an operation between two Dimensions, + // we default to the first Dimension's unit, + // so `1px + 2` will yield `3px`. + Dimension.prototype.operate = function (context, op, other) { + /* jshint noempty:false */ + var value = this._operate(context, op, this.value, other.value), unit = this.unit.clone(); + if (op === '+' || op === '-') { + if (unit.numerator.length === 0 && unit.denominator.length === 0) { + unit = other.unit.clone(); + if (this.unit.backupUnit) { + unit.backupUnit = this.unit.backupUnit; + } + } + else if (other.unit.numerator.length === 0 && unit.denominator.length === 0) ; + else { + other = other.convertTo(this.unit.usedUnits()); + if (context.strictUnits && other.unit.toString() !== unit.toString()) { + throw new Error("Incompatible units. Change the units or use the unit function. Bad units: '" + unit.toString() + "' and '" + other.unit.toString() + "'."); + } + value = this._operate(context, op, this.value, other.value); + } + } + else if (op === '*') { + unit.numerator = unit.numerator.concat(other.unit.numerator).sort(); + unit.denominator = unit.denominator.concat(other.unit.denominator).sort(); + unit.cancel(); + } + else if (op === '/') { + unit.numerator = unit.numerator.concat(other.unit.denominator).sort(); + unit.denominator = unit.denominator.concat(other.unit.numerator).sort(); + unit.cancel(); + } + return new Dimension(value, unit); + }; + Dimension.prototype.compare = function (other) { + var a, b; + if (!(other instanceof Dimension)) { + return undefined; + } + if (this.unit.isEmpty() || other.unit.isEmpty()) { + a = this; + b = other; + } + else { + a = this.unify(); + b = other.unify(); + if (a.unit.compare(b.unit) !== 0) { + return undefined; + } + } + return Node.numericCompare(a.value, b.value); + }; + Dimension.prototype.unify = function () { + return this.convertTo({ length: 'px', duration: 's', angle: 'rad' }); + }; + Dimension.prototype.convertTo = function (conversions) { + var value = this.value; + var unit = this.unit.clone(); + var i; + var groupName; + var group; + var targetUnit; + var derivedConversions = {}; + var applyUnit; + if (typeof conversions === 'string') { + for (i in unitConversions) { + if (unitConversions[i].hasOwnProperty(conversions)) { + derivedConversions = {}; + derivedConversions[i] = conversions; + } + } + conversions = derivedConversions; + } + applyUnit = function (atomicUnit, denominator) { + /* jshint loopfunc:true */ + if (group.hasOwnProperty(atomicUnit)) { + if (denominator) { + value = value / (group[atomicUnit] / group[targetUnit]); + } + else { + value = value * (group[atomicUnit] / group[targetUnit]); + } + return targetUnit; + } + return atomicUnit; + }; + for (groupName in conversions) { + if (conversions.hasOwnProperty(groupName)) { + targetUnit = conversions[groupName]; + group = unitConversions[groupName]; + unit.map(applyUnit); + } + } + unit.cancel(); + return new Dimension(value, unit); + }; + return Dimension; + }(Node)); + Dimension.prototype.type = 'Dimension'; - var functionCaller = /** @class */ (function () { - function functionCaller(name, context, index, currentFileInfo) { - this.name = name.toLowerCase(); - this.index = index; - this.context = context; - this.currentFileInfo = currentFileInfo; - this.func = context.frames[0].functionRegistry.get(this.name); - } - functionCaller.prototype.isValid = function () { - return Boolean(this.func); - }; - functionCaller.prototype.call = function (args) { - var _this = this; - var evalArgs = this.func.evalArgs; - if (evalArgs !== false) { - args = args.map(function (a) { return a.eval(_this.context); }); - } - // This code is terrible and should be replaced as per this issue... - // https://github.com/less/less.js/issues/2477 - if (Array.isArray(args)) { - args = args.filter(function (item) { - if (item.type === 'Comment') { - return false; - } - return true; - }) - .map(function (item) { - if (item.type === 'Expression') { - var subNodes = item.value.filter(function (item) { - if (item.type === 'Comment') { - return false; - } - return true; - }); - if (subNodes.length === 1) { - return subNodes[0]; - } - else { - return new Expression(subNodes); - } - } - return item; - }); - } - if (evalArgs === false) { - return this.func.apply(this, __spreadArrays([this.context], args)); - } - return this.func.apply(this, args); - }; - return functionCaller; - }()); + var MATH$1 = Math$1; + var Operation = /** @class */ (function (_super) { + __extends(Operation, _super); + function Operation(op, operands, isSpaced) { + var _this = _super.call(this) || this; + _this.op = op.trim(); + _this.operands = operands; + _this.isSpaced = isSpaced; + return _this; + } + Operation.prototype.accept = function (visitor) { + this.operands = visitor.visitArray(this.operands); + }; + Operation.prototype.eval = function (context) { + var a = this.operands[0].eval(context), b = this.operands[1].eval(context), op; + if (context.isMathOn(this.op)) { + op = this.op === './' ? '/' : this.op; + if (a instanceof Dimension && b instanceof Color) { + a = a.toColor(); + } + if (b instanceof Dimension && a instanceof Color) { + b = b.toColor(); + } + if (!a.operate) { + if (a instanceof Operation && a.op === '/' && context.math === MATH$1.PARENS_DIVISION) { + return new Operation(this.op, [a, b], this.isSpaced); + } + throw { type: 'Operation', + message: 'Operation on an invalid type' }; + } + return a.operate(context, op, b); + } + else { + return new Operation(this.op, [a, b], this.isSpaced); + } + }; + Operation.prototype.genCSS = function (context, output) { + this.operands[0].genCSS(context, output); + if (this.isSpaced) { + output.add(' '); + } + output.add(this.op); + if (this.isSpaced) { + output.add(' '); + } + this.operands[1].genCSS(context, output); + }; + return Operation; + }(Node)); + Operation.prototype.type = 'Operation'; - // - // A function call node. - // - var Call = /** @class */ (function (_super) { - __extends(Call, _super); - function Call(name, args, index, currentFileInfo) { - var _this = _super.call(this) || this; - _this.name = name; - _this.args = args; - _this.calc = name === 'calc'; - _this._index = index; - _this._fileInfo = currentFileInfo; - return _this; - } - Call.prototype.accept = function (visitor) { - if (this.args) { - this.args = visitor.visitArray(this.args); - } - }; - // - // When evaluating a function call, - // we either find the function in the functionRegistry, - // in which case we call it, passing the evaluated arguments, - // if this returns null or we cannot find the function, we - // simply print it out as it appeared originally [2]. - // - // The reason why we evaluate the arguments, is in the case where - // we try to pass a variable to a function, like: `saturate(@color)`. - // The function should receive the value, not the variable. - // - Call.prototype.eval = function (context) { - var _this = this; - /** - * Turn off math for calc(), and switch back on for evaluating nested functions - */ - var currentMathContext = context.mathOn; - context.mathOn = !this.calc; - if (this.calc || context.inCalc) { - context.enterCalc(); - } - var exitCalc = function () { - if (_this.calc || context.inCalc) { - context.exitCalc(); - } - context.mathOn = currentMathContext; - }; - var result; - var funcCaller = new functionCaller(this.name, context, this.getIndex(), this.fileInfo()); - if (funcCaller.isValid()) { - try { - result = funcCaller.call(this.args); - exitCalc(); - } - catch (e) { - if (e.hasOwnProperty('line') && e.hasOwnProperty('column')) { - throw e; - } - throw { - type: e.type || 'Runtime', - message: "error evaluating function `" + this.name + "`" + (e.message ? ": " + e.message : ''), - index: this.getIndex(), - filename: this.fileInfo().filename, - line: e.lineNumber, - column: e.columnNumber - }; - } - if (result !== null && result !== undefined) { - // Results that that are not nodes are cast as Anonymous nodes - // Falsy values or booleans are returned as empty nodes - if (!(result instanceof Node)) { - if (!result || result === true) { - result = new Anonymous(null); - } - else { - result = new Anonymous(result.toString()); - } - } - result._index = this._index; - result._fileInfo = this._fileInfo; - return result; - } - } - var args = this.args.map(function (a) { return a.eval(context); }); - exitCalc(); - return new Call(this.name, args, this.getIndex(), this.fileInfo()); - }; - Call.prototype.genCSS = function (context, output) { - output.add(this.name + "(", this.fileInfo(), this.getIndex()); - for (var i = 0; i < this.args.length; i++) { - this.args[i].genCSS(context, output); - if (i + 1 < this.args.length) { - output.add(', '); - } - } - output.add(')'); - }; - return Call; - }(Node)); - Call.prototype.type = 'Call'; + var Expression = /** @class */ (function (_super) { + __extends(Expression, _super); + function Expression(value, noSpacing) { + var _this = _super.call(this) || this; + _this.value = value; + _this.noSpacing = noSpacing; + if (!value) { + throw new Error('Expression requires an array parameter'); + } + return _this; + } + Expression.prototype.accept = function (visitor) { + this.value = visitor.visitArray(this.value); + }; + Expression.prototype.eval = function (context) { + var returnValue; + var mathOn = context.isMathOn(); + var inParenthesis = this.parens; + var doubleParen = false; + if (inParenthesis) { + context.inParenthesis(); + } + if (this.value.length > 1) { + returnValue = new Expression(this.value.map(function (e) { + if (!e.eval) { + return e; + } + return e.eval(context); + }), this.noSpacing); + } + else if (this.value.length === 1) { + if (this.value[0].parens && !this.value[0].parensInOp && !context.inCalc) { + doubleParen = true; + } + returnValue = this.value[0].eval(context); + } + else { + returnValue = this; + } + if (inParenthesis) { + context.outOfParenthesis(); + } + if (this.parens && this.parensInOp && !mathOn && !doubleParen + && (!(returnValue instanceof Dimension))) { + returnValue = new Paren(returnValue); + } + return returnValue; + }; + Expression.prototype.genCSS = function (context, output) { + for (var i = 0; i < this.value.length; i++) { + this.value[i].genCSS(context, output); + if (!this.noSpacing && i + 1 < this.value.length) { + output.add(' '); + } + } + }; + Expression.prototype.throwAwayComments = function () { + this.value = this.value.filter(function (v) { + return !(v instanceof Comment); + }); + }; + return Expression; + }(Node)); + Expression.prototype.type = 'Expression'; - var Variable = /** @class */ (function (_super) { - __extends(Variable, _super); - function Variable(name, index, currentFileInfo) { - var _this = _super.call(this) || this; - _this.name = name; - _this._index = index; - _this._fileInfo = currentFileInfo; - return _this; - } - Variable.prototype.eval = function (context) { - var variable; - var name = this.name; - if (name.indexOf('@@') === 0) { - name = "@" + new Variable(name.slice(1), this.getIndex(), this.fileInfo()).eval(context).value; - } - if (this.evaluating) { - throw { type: 'Name', message: "Recursive variable definition for " + name, filename: this.fileInfo().filename, - index: this.getIndex() }; - } - this.evaluating = true; - variable = this.find(context.frames, function (frame) { - var v = frame.variable(name); - if (v) { - if (v.important) { - var importantScope = context.importantScope[context.importantScope.length - 1]; - importantScope.important = v.important; - } - // If in calc, wrap vars in a function call to cascade evaluate args first - if (context.inCalc) { - return (new Call('_SELF', [v.value])).eval(context); - } - else { - return v.value.eval(context); - } - } - }); - if (variable) { - this.evaluating = false; - return variable; - } - else { - throw { type: 'Name', message: "variable " + name + " is undefined", filename: this.fileInfo().filename, - index: this.getIndex() }; - } - }; - Variable.prototype.find = function (obj, fun) { - for (var i = 0, r = void 0; i < obj.length; i++) { - r = fun.call(obj, obj[i]); - if (r) { - return r; - } - } - return null; - }; - return Variable; - }(Node)); - Variable.prototype.type = 'Variable'; + var functionCaller = /** @class */ (function () { + function functionCaller(name, context, index, currentFileInfo) { + this.name = name.toLowerCase(); + this.index = index; + this.context = context; + this.currentFileInfo = currentFileInfo; + this.func = context.frames[0].functionRegistry.get(this.name); + } + functionCaller.prototype.isValid = function () { + return Boolean(this.func); + }; + functionCaller.prototype.call = function (args) { + var _this = this; + if (!(Array.isArray(args))) { + args = [args]; + } + var evalArgs = this.func.evalArgs; + if (evalArgs !== false) { + args = args.map(function (a) { return a.eval(_this.context); }); + } + var commentFilter = function (item) { return !(item.type === 'Comment'); }; + // This code is terrible and should be replaced as per this issue... + // https://github.com/less/less.js/issues/2477 + args = args + .filter(commentFilter) + .map(function (item) { + if (item.type === 'Expression') { + var subNodes = item.value.filter(commentFilter); + if (subNodes.length === 1) { + return subNodes[0]; + } + else { + return new Expression(subNodes); + } + } + return item; + }); + if (evalArgs === false) { + return this.func.apply(this, __spreadArrays([this.context], args)); + } + return this.func.apply(this, args); + }; + return functionCaller; + }()); - var Property = /** @class */ (function (_super) { - __extends(Property, _super); - function Property(name, index, currentFileInfo) { - var _this = _super.call(this) || this; - _this.name = name; - _this._index = index; - _this._fileInfo = currentFileInfo; - return _this; - } - Property.prototype.eval = function (context) { - var property; - var name = this.name; - // TODO: shorten this reference - var mergeRules = context.pluginManager.less.visitors.ToCSSVisitor.prototype._mergeRules; - if (this.evaluating) { - throw { type: 'Name', message: "Recursive property reference for " + name, filename: this.fileInfo().filename, - index: this.getIndex() }; - } - this.evaluating = true; - property = this.find(context.frames, function (frame) { - var v; - var vArr = frame.property(name); - if (vArr) { - for (var i = 0; i < vArr.length; i++) { - v = vArr[i]; - vArr[i] = new Declaration(v.name, v.value, v.important, v.merge, v.index, v.currentFileInfo, v.inline, v.variable); - } - mergeRules(vArr); - v = vArr[vArr.length - 1]; - if (v.important) { - var importantScope = context.importantScope[context.importantScope.length - 1]; - importantScope.important = v.important; - } - v = v.value.eval(context); - return v; - } - }); - if (property) { - this.evaluating = false; - return property; - } - else { - throw { type: 'Name', message: "Property '" + name + "' is undefined", filename: this.currentFileInfo.filename, - index: this.index }; - } - }; - Property.prototype.find = function (obj, fun) { - for (var i = 0, r = void 0; i < obj.length; i++) { - r = fun.call(obj, obj[i]); - if (r) { - return r; - } - } - return null; - }; - return Property; - }(Node)); - Property.prototype.type = 'Property'; + // + // A function call node. + // + var Call = /** @class */ (function (_super) { + __extends(Call, _super); + function Call(name, args, index, currentFileInfo) { + var _this = _super.call(this) || this; + _this.name = name; + _this.args = args; + _this.calc = name === 'calc'; + _this._index = index; + _this._fileInfo = currentFileInfo; + return _this; + } + Call.prototype.accept = function (visitor) { + if (this.args) { + this.args = visitor.visitArray(this.args); + } + }; + // + // When evaluating a function call, + // we either find the function in the functionRegistry, + // in which case we call it, passing the evaluated arguments, + // if this returns null or we cannot find the function, we + // simply print it out as it appeared originally [2]. + // + // The reason why we evaluate the arguments, is in the case where + // we try to pass a variable to a function, like: `saturate(@color)`. + // The function should receive the value, not the variable. + // + Call.prototype.eval = function (context) { + var _this = this; + /** + * Turn off math for calc(), and switch back on for evaluating nested functions + */ + var currentMathContext = context.mathOn; + context.mathOn = !this.calc; + if (this.calc || context.inCalc) { + context.enterCalc(); + } + var exitCalc = function () { + if (_this.calc || context.inCalc) { + context.exitCalc(); + } + context.mathOn = currentMathContext; + }; + var result; + var funcCaller = new functionCaller(this.name, context, this.getIndex(), this.fileInfo()); + if (funcCaller.isValid()) { + try { + result = funcCaller.call(this.args); + exitCalc(); + } + catch (e) { + if (e.hasOwnProperty('line') && e.hasOwnProperty('column')) { + throw e; + } + throw { + type: e.type || 'Runtime', + message: "Error evaluating function `" + this.name + "`" + (e.message ? ": " + e.message : ''), + index: this.getIndex(), + filename: this.fileInfo().filename, + line: e.lineNumber, + column: e.columnNumber + }; + } + } + if (result !== null && result !== undefined) { + // Results that that are not nodes are cast as Anonymous nodes + // Falsy values or booleans are returned as empty nodes + if (!(result instanceof Node)) { + if (!result || result === true) { + result = new Anonymous(null); + } + else { + result = new Anonymous(result.toString()); + } + } + result._index = this._index; + result._fileInfo = this._fileInfo; + return result; + } + var args = this.args.map(function (a) { return a.eval(context); }); + exitCalc(); + return new Call(this.name, args, this.getIndex(), this.fileInfo()); + }; + Call.prototype.genCSS = function (context, output) { + output.add(this.name + "(", this.fileInfo(), this.getIndex()); + for (var i = 0; i < this.args.length; i++) { + this.args[i].genCSS(context, output); + if (i + 1 < this.args.length) { + output.add(', '); + } + } + output.add(')'); + }; + return Call; + }(Node)); + Call.prototype.type = 'Call'; - var Attribute = /** @class */ (function (_super) { - __extends(Attribute, _super); - function Attribute(key, op, value) { - var _this = _super.call(this) || this; - _this.key = key; - _this.op = op; - _this.value = value; - return _this; - } - Attribute.prototype.eval = function (context) { - return new Attribute(this.key.eval ? this.key.eval(context) : this.key, this.op, (this.value && this.value.eval) ? this.value.eval(context) : this.value); - }; - Attribute.prototype.genCSS = function (context, output) { - output.add(this.toCSS(context)); - }; - Attribute.prototype.toCSS = function (context) { - var value = this.key.toCSS ? this.key.toCSS(context) : this.key; - if (this.op) { - value += this.op; - value += (this.value.toCSS ? this.value.toCSS(context) : this.value); - } - return "[" + value + "]"; - }; - return Attribute; - }(Node)); - Attribute.prototype.type = 'Attribute'; + var Variable = /** @class */ (function (_super) { + __extends(Variable, _super); + function Variable(name, index, currentFileInfo) { + var _this = _super.call(this) || this; + _this.name = name; + _this._index = index; + _this._fileInfo = currentFileInfo; + return _this; + } + Variable.prototype.eval = function (context) { + var variable, name = this.name; + if (name.indexOf('@@') === 0) { + name = "@" + new Variable(name.slice(1), this.getIndex(), this.fileInfo()).eval(context).value; + } + if (this.evaluating) { + throw { type: 'Name', message: "Recursive variable definition for " + name, filename: this.fileInfo().filename, + index: this.getIndex() }; + } + this.evaluating = true; + variable = this.find(context.frames, function (frame) { + var v = frame.variable(name); + if (v) { + if (v.important) { + var importantScope = context.importantScope[context.importantScope.length - 1]; + importantScope.important = v.important; + } + // If in calc, wrap vars in a function call to cascade evaluate args first + if (context.inCalc) { + return (new Call('_SELF', [v.value])).eval(context); + } + else { + return v.value.eval(context); + } + } + }); + if (variable) { + this.evaluating = false; + return variable; + } + else { + throw { type: 'Name', message: "variable " + name + " is undefined", filename: this.fileInfo().filename, + index: this.getIndex() }; + } + }; + Variable.prototype.find = function (obj, fun) { + for (var i = 0, r = void 0; i < obj.length; i++) { + r = fun.call(obj, obj[i]); + if (r) { + return r; + } + } + return null; + }; + return Variable; + }(Node)); + Variable.prototype.type = 'Variable'; - var Quoted = /** @class */ (function (_super) { - __extends(Quoted, _super); - function Quoted(str, content, escaped, index, currentFileInfo) { - var _this = _super.call(this) || this; - _this.escaped = (escaped == null) ? true : escaped; - _this.value = content || ''; - _this.quote = str.charAt(0); - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.variableRegex = /@\{([\w-]+)\}/g; - _this.propRegex = /\$\{([\w-]+)\}/g; - _this.allowRoot = escaped; - return _this; - } - Quoted.prototype.genCSS = function (context, output) { - if (!this.escaped) { - output.add(this.quote, this.fileInfo(), this.getIndex()); - } - output.add(this.value); - if (!this.escaped) { - output.add(this.quote); - } - }; - Quoted.prototype.containsVariables = function () { - return this.value.match(this.variableRegex); - }; - Quoted.prototype.eval = function (context) { - var that = this; - var value = this.value; - var variableReplacement = function (_, name) { - var v = new Variable("@" + name, that.getIndex(), that.fileInfo()).eval(context, true); - return (v instanceof Quoted) ? v.value : v.toCSS(); - }; - var propertyReplacement = function (_, name) { - var v = new Property("$" + name, that.getIndex(), that.fileInfo()).eval(context, true); - return (v instanceof Quoted) ? v.value : v.toCSS(); - }; - function iterativeReplace(value, regexp, replacementFnc) { - var evaluatedValue = value; - do { - value = evaluatedValue.toString(); - evaluatedValue = value.replace(regexp, replacementFnc); - } while (value !== evaluatedValue); - return evaluatedValue; - } - value = iterativeReplace(value, this.variableRegex, variableReplacement); - value = iterativeReplace(value, this.propRegex, propertyReplacement); - return new Quoted(this.quote + value + this.quote, value, this.escaped, this.getIndex(), this.fileInfo()); - }; - Quoted.prototype.compare = function (other) { - // when comparing quoted strings allow the quote to differ - if (other.type === 'Quoted' && !this.escaped && !other.escaped) { - return Node.numericCompare(this.value, other.value); - } - else { - return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined; - } - }; - return Quoted; - }(Node)); - Quoted.prototype.type = 'Quoted'; + var Property = /** @class */ (function (_super) { + __extends(Property, _super); + function Property(name, index, currentFileInfo) { + var _this = _super.call(this) || this; + _this.name = name; + _this._index = index; + _this._fileInfo = currentFileInfo; + return _this; + } + Property.prototype.eval = function (context) { + var property; + var name = this.name; + // TODO: shorten this reference + var mergeRules = context.pluginManager.less.visitors.ToCSSVisitor.prototype._mergeRules; + if (this.evaluating) { + throw { type: 'Name', message: "Recursive property reference for " + name, filename: this.fileInfo().filename, + index: this.getIndex() }; + } + this.evaluating = true; + property = this.find(context.frames, function (frame) { + var v; + var vArr = frame.property(name); + if (vArr) { + for (var i = 0; i < vArr.length; i++) { + v = vArr[i]; + vArr[i] = new Declaration(v.name, v.value, v.important, v.merge, v.index, v.currentFileInfo, v.inline, v.variable); + } + mergeRules(vArr); + v = vArr[vArr.length - 1]; + if (v.important) { + var importantScope = context.importantScope[context.importantScope.length - 1]; + importantScope.important = v.important; + } + v = v.value.eval(context); + return v; + } + }); + if (property) { + this.evaluating = false; + return property; + } + else { + throw { type: 'Name', message: "Property '" + name + "' is undefined", filename: this.currentFileInfo.filename, + index: this.index }; + } + }; + Property.prototype.find = function (obj, fun) { + for (var i = 0, r = void 0; i < obj.length; i++) { + r = fun.call(obj, obj[i]); + if (r) { + return r; + } + } + return null; + }; + return Property; + }(Node)); + Property.prototype.type = 'Property'; - var URL = /** @class */ (function (_super) { - __extends(URL, _super); - function URL(val, index, currentFileInfo, isEvald) { - var _this = _super.call(this) || this; - _this.value = val; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.isEvald = isEvald; - return _this; - } - URL.prototype.accept = function (visitor) { - this.value = visitor.visit(this.value); - }; - URL.prototype.genCSS = function (context, output) { - output.add('url('); - this.value.genCSS(context, output); - output.add(')'); - }; - URL.prototype.eval = function (context) { - var val = this.value.eval(context); - var rootpath; - if (!this.isEvald) { - // Add the rootpath if the URL requires a rewrite - rootpath = this.fileInfo() && this.fileInfo().rootpath; - if (typeof rootpath === 'string' && - typeof val.value === 'string' && - context.pathRequiresRewrite(val.value)) { - if (!val.quote) { - rootpath = escapePath(rootpath); - } - val.value = context.rewritePath(val.value, rootpath); - } - else { - val.value = context.normalizePath(val.value); - } - // Add url args if enabled - if (context.urlArgs) { - if (!val.value.match(/^\s*data:/)) { - var delimiter = val.value.indexOf('?') === -1 ? '?' : '&'; - var urlArgs = delimiter + context.urlArgs; - if (val.value.indexOf('#') !== -1) { - val.value = val.value.replace('#', urlArgs + "#"); - } - else { - val.value += urlArgs; - } - } - } - } - return new URL(val, this.getIndex(), this.fileInfo(), true); - }; - return URL; - }(Node)); - URL.prototype.type = 'Url'; - function escapePath(path) { - return path.replace(/[\(\)'"\s]/g, function (match) { return "\\" + match; }); - } + var Attribute = /** @class */ (function (_super) { + __extends(Attribute, _super); + function Attribute(key, op, value) { + var _this = _super.call(this) || this; + _this.key = key; + _this.op = op; + _this.value = value; + return _this; + } + Attribute.prototype.eval = function (context) { + return new Attribute(this.key.eval ? this.key.eval(context) : this.key, this.op, (this.value && this.value.eval) ? this.value.eval(context) : this.value); + }; + Attribute.prototype.genCSS = function (context, output) { + output.add(this.toCSS(context)); + }; + Attribute.prototype.toCSS = function (context) { + var value = this.key.toCSS ? this.key.toCSS(context) : this.key; + if (this.op) { + value += this.op; + value += (this.value.toCSS ? this.value.toCSS(context) : this.value); + } + return "[" + value + "]"; + }; + return Attribute; + }(Node)); + Attribute.prototype.type = 'Attribute'; - var Media = /** @class */ (function (_super) { - __extends(Media, _super); - function Media(value, features, index, currentFileInfo, visibilityInfo) { - var _this = _super.call(this) || this; - _this._index = index; - _this._fileInfo = currentFileInfo; - var selectors = (new Selector([], null, null, _this._index, _this._fileInfo)).createEmptySelectors(); - _this.features = new Value(features); - _this.rules = [new Ruleset(selectors, value)]; - _this.rules[0].allowImports = true; - _this.copyVisibilityInfo(visibilityInfo); - _this.allowRoot = true; - _this.setParent(selectors, _this); - _this.setParent(_this.features, _this); - _this.setParent(_this.rules, _this); - return _this; - } - Media.prototype.isRulesetLike = function () { - return true; - }; - Media.prototype.accept = function (visitor) { - if (this.features) { - this.features = visitor.visit(this.features); - } - if (this.rules) { - this.rules = visitor.visitArray(this.rules); - } - }; - Media.prototype.genCSS = function (context, output) { - output.add('@media ', this._fileInfo, this._index); - this.features.genCSS(context, output); - this.outputRuleset(context, output, this.rules); - }; - Media.prototype.eval = function (context) { - if (!context.mediaBlocks) { - context.mediaBlocks = []; - context.mediaPath = []; - } - var media = new Media(null, [], this._index, this._fileInfo, this.visibilityInfo()); - if (this.debugInfo) { - this.rules[0].debugInfo = this.debugInfo; - media.debugInfo = this.debugInfo; - } - media.features = this.features.eval(context); - context.mediaPath.push(media); - context.mediaBlocks.push(media); - this.rules[0].functionRegistry = context.frames[0].functionRegistry.inherit(); - context.frames.unshift(this.rules[0]); - media.rules = [this.rules[0].eval(context)]; - context.frames.shift(); - context.mediaPath.pop(); - return context.mediaPath.length === 0 ? media.evalTop(context) : - media.evalNested(context); - }; - Media.prototype.evalTop = function (context) { - var result = this; - // Render all dependent Media blocks. - if (context.mediaBlocks.length > 1) { - var selectors = (new Selector([], null, null, this.getIndex(), this.fileInfo())).createEmptySelectors(); - result = new Ruleset(selectors, context.mediaBlocks); - result.multiMedia = true; - result.copyVisibilityInfo(this.visibilityInfo()); - this.setParent(result, this); - } - delete context.mediaBlocks; - delete context.mediaPath; - return result; - }; - Media.prototype.evalNested = function (context) { - var i; - var value; - var path = context.mediaPath.concat([this]); - // Extract the media-query conditions separated with `,` (OR). - for (i = 0; i < path.length; i++) { - value = path[i].features instanceof Value ? - path[i].features.value : path[i].features; - path[i] = Array.isArray(value) ? value : [value]; - } - // Trace all permutations to generate the resulting media-query. - // - // (a, b and c) with nested (d, e) -> - // a and d - // a and e - // b and c and d - // b and c and e - this.features = new Value(this.permute(path).map(function (path) { - path = path.map(function (fragment) { return fragment.toCSS ? fragment : new Anonymous(fragment); }); - for (i = path.length - 1; i > 0; i--) { - path.splice(i, 0, new Anonymous('and')); - } - return new Expression(path); - })); - this.setParent(this.features, this); - // Fake a tree-node that doesn't output anything. - return new Ruleset([], []); - }; - Media.prototype.permute = function (arr) { - if (arr.length === 0) { - return []; - } - else if (arr.length === 1) { - return arr[0]; - } - else { - var result = []; - var rest = this.permute(arr.slice(1)); - for (var i = 0; i < rest.length; i++) { - for (var j = 0; j < arr[0].length; j++) { - result.push([arr[0][j]].concat(rest[i])); - } - } - return result; - } - }; - Media.prototype.bubbleSelectors = function (selectors) { - if (!selectors) { - return; - } - this.rules = [new Ruleset(copyArray(selectors), [this.rules[0]])]; - this.setParent(this.rules, this); - }; - return Media; - }(AtRule)); - Media.prototype.type = 'Media'; + var Quoted = /** @class */ (function (_super) { + __extends(Quoted, _super); + function Quoted(str, content, escaped, index, currentFileInfo) { + var _this = _super.call(this) || this; + _this.escaped = (escaped == null) ? true : escaped; + _this.value = content || ''; + _this.quote = str.charAt(0); + _this._index = index; + _this._fileInfo = currentFileInfo; + _this.variableRegex = /@\{([\w-]+)\}/g; + _this.propRegex = /\$\{([\w-]+)\}/g; + _this.allowRoot = escaped; + return _this; + } + Quoted.prototype.genCSS = function (context, output) { + if (!this.escaped) { + output.add(this.quote, this.fileInfo(), this.getIndex()); + } + output.add(this.value); + if (!this.escaped) { + output.add(this.quote); + } + }; + Quoted.prototype.containsVariables = function () { + return this.value.match(this.variableRegex); + }; + Quoted.prototype.eval = function (context) { + var that = this; + var value = this.value; + var variableReplacement = function (_, name) { + var v = new Variable("@" + name, that.getIndex(), that.fileInfo()).eval(context, true); + return (v instanceof Quoted) ? v.value : v.toCSS(); + }; + var propertyReplacement = function (_, name) { + var v = new Property("$" + name, that.getIndex(), that.fileInfo()).eval(context, true); + return (v instanceof Quoted) ? v.value : v.toCSS(); + }; + function iterativeReplace(value, regexp, replacementFnc) { + var evaluatedValue = value; + do { + value = evaluatedValue.toString(); + evaluatedValue = value.replace(regexp, replacementFnc); + } while (value !== evaluatedValue); + return evaluatedValue; + } + value = iterativeReplace(value, this.variableRegex, variableReplacement); + value = iterativeReplace(value, this.propRegex, propertyReplacement); + return new Quoted(this.quote + value + this.quote, value, this.escaped, this.getIndex(), this.fileInfo()); + }; + Quoted.prototype.compare = function (other) { + // when comparing quoted strings allow the quote to differ + if (other.type === 'Quoted' && !this.escaped && !other.escaped) { + return Node.numericCompare(this.value, other.value); + } + else { + return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined; + } + }; + return Quoted; + }(Node)); + Quoted.prototype.type = 'Quoted'; - // - // CSS @import node - // - // The general strategy here is that we don't want to wait - // for the parsing to be completed, before we start importing - // the file. That's because in the context of a browser, - // most of the time will be spent waiting for the server to respond. - // - // On creation, we push the import path to our import queue, though - // `import,push`, we also pass it a callback, which it'll call once - // the file has been fetched, and parsed. - // - var Import = /** @class */ (function (_super) { - __extends(Import, _super); - function Import(path, features, options, index, currentFileInfo, visibilityInfo) { - var _this = _super.call(this) || this; - _this.options = options; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.path = path; - _this.features = features; - _this.allowRoot = true; - if (_this.options.less !== undefined || _this.options.inline) { - _this.css = !_this.options.less || _this.options.inline; - } - else { - var pathValue = _this.getPath(); - if (pathValue && /[#\.\&\?]css([\?;].*)?$/.test(pathValue)) { - _this.css = true; - } - } - _this.copyVisibilityInfo(visibilityInfo); - _this.setParent(_this.features, _this); - _this.setParent(_this.path, _this); - return _this; - } - Import.prototype.accept = function (visitor) { - if (this.features) { - this.features = visitor.visit(this.features); - } - this.path = visitor.visit(this.path); - if (!this.options.isPlugin && !this.options.inline && this.root) { - this.root = visitor.visit(this.root); - } - }; - Import.prototype.genCSS = function (context, output) { - if (this.css && this.path._fileInfo.reference === undefined) { - output.add('@import ', this._fileInfo, this._index); - this.path.genCSS(context, output); - if (this.features) { - output.add(' '); - this.features.genCSS(context, output); - } - output.add(';'); - } - }; - Import.prototype.getPath = function () { - return (this.path instanceof URL) ? - this.path.value.value : this.path.value; - }; - Import.prototype.isVariableImport = function () { - var path = this.path; - if (path instanceof URL) { - path = path.value; - } - if (path instanceof Quoted) { - return path.containsVariables(); - } - return true; - }; - Import.prototype.evalForImport = function (context) { - var path = this.path; - if (path instanceof URL) { - path = path.value; - } - return new Import(path.eval(context), this.features, this.options, this._index, this._fileInfo, this.visibilityInfo()); - }; - Import.prototype.evalPath = function (context) { - var path = this.path.eval(context); - var fileInfo = this._fileInfo; - if (!(path instanceof URL)) { - // Add the rootpath if the URL requires a rewrite - var pathValue = path.value; - if (fileInfo && - pathValue && - context.pathRequiresRewrite(pathValue)) { - path.value = context.rewritePath(pathValue, fileInfo.rootpath); - } - else { - path.value = context.normalizePath(path.value); - } - } - return path; - }; - Import.prototype.eval = function (context) { - var result = this.doEval(context); - if (this.options.reference || this.blocksVisibility()) { - if (result.length || result.length === 0) { - result.forEach(function (node) { - node.addVisibilityBlock(); - }); - } - else { - result.addVisibilityBlock(); - } - } - return result; - }; - Import.prototype.doEval = function (context) { - var ruleset; - var registry; - var features = this.features && this.features.eval(context); - if (this.options.isPlugin) { - if (this.root && this.root.eval) { - try { - this.root.eval(context); - } - catch (e) { - e.message = 'Plugin error during evaluation'; - throw new LessError(e, this.root.imports, this.root.filename); - } - } - registry = context.frames[0] && context.frames[0].functionRegistry; - if (registry && this.root && this.root.functions) { - registry.addMultiple(this.root.functions); - } - return []; - } - if (this.skip) { - if (typeof this.skip === 'function') { - this.skip = this.skip(); - } - if (this.skip) { - return []; - } - } - if (this.options.inline) { - var contents = new Anonymous(this.root, 0, { - filename: this.importedFilename, - reference: this.path._fileInfo && this.path._fileInfo.reference - }, true, true); - return this.features ? new Media([contents], this.features.value) : [contents]; - } - else if (this.css) { - var newImport = new Import(this.evalPath(context), features, this.options, this._index); - if (!newImport.css && this.error) { - throw this.error; - } - return newImport; - } - else if (this.root) { - ruleset = new Ruleset(null, copyArray(this.root.rules)); - ruleset.evalImports(context); - return this.features ? new Media(ruleset.rules, this.features.value) : ruleset.rules; - } - else { - return []; - } - }; - return Import; - }(Node)); - Import.prototype.type = 'Import'; + var URL = /** @class */ (function (_super) { + __extends(URL, _super); + function URL(val, index, currentFileInfo, isEvald) { + var _this = _super.call(this) || this; + _this.value = val; + _this._index = index; + _this._fileInfo = currentFileInfo; + _this.isEvald = isEvald; + return _this; + } + URL.prototype.accept = function (visitor) { + this.value = visitor.visit(this.value); + }; + URL.prototype.genCSS = function (context, output) { + output.add('url('); + this.value.genCSS(context, output); + output.add(')'); + }; + URL.prototype.eval = function (context) { + var val = this.value.eval(context); + var rootpath; + if (!this.isEvald) { + // Add the rootpath if the URL requires a rewrite + rootpath = this.fileInfo() && this.fileInfo().rootpath; + if (typeof rootpath === 'string' && + typeof val.value === 'string' && + context.pathRequiresRewrite(val.value)) { + if (!val.quote) { + rootpath = escapePath(rootpath); + } + val.value = context.rewritePath(val.value, rootpath); + } + else { + val.value = context.normalizePath(val.value); + } + // Add url args if enabled + if (context.urlArgs) { + if (!val.value.match(/^\s*data:/)) { + var delimiter = val.value.indexOf('?') === -1 ? '?' : '&'; + var urlArgs = delimiter + context.urlArgs; + if (val.value.indexOf('#') !== -1) { + val.value = val.value.replace('#', urlArgs + "#"); + } + else { + val.value += urlArgs; + } + } + } + } + return new URL(val, this.getIndex(), this.fileInfo(), true); + }; + return URL; + }(Node)); + URL.prototype.type = 'Url'; + function escapePath(path) { + return path.replace(/[\(\)'"\s]/g, function (match) { return "\\" + match; }); + } - var JsEvalNode = /** @class */ (function (_super) { - __extends(JsEvalNode, _super); - function JsEvalNode() { - return _super !== null && _super.apply(this, arguments) || this; - } - JsEvalNode.prototype.evaluateJavaScript = function (expression, context) { - var result; - var that = this; - var evalContext = {}; - if (!context.javascriptEnabled) { - throw { message: 'Inline JavaScript is not enabled. Is it set in your options?', - filename: this.fileInfo().filename, - index: this.getIndex() }; - } - expression = expression.replace(/@\{([\w-]+)\}/g, function (_, name) { return that.jsify(new Variable("@" + name, that.getIndex(), that.fileInfo()).eval(context)); }); - try { - expression = new Function("return (" + expression + ")"); - } - catch (e) { - throw { message: "JavaScript evaluation error: " + e.message + " from `" + expression + "`", filename: this.fileInfo().filename, - index: this.getIndex() }; - } - var variables = context.frames[0].variables(); - for (var k in variables) { - if (variables.hasOwnProperty(k)) { - /* jshint loopfunc:true */ - evalContext[k.slice(1)] = { - value: variables[k].value, - toJS: function () { - return this.value.eval(context).toCSS(); - } - }; - } - } - try { - result = expression.call(evalContext); - } - catch (e) { - throw { message: "JavaScript evaluation error: '" + e.name + ": " + e.message.replace(/["]/g, '\'') + "'", filename: this.fileInfo().filename, - index: this.getIndex() }; - } - return result; - }; - JsEvalNode.prototype.jsify = function (obj) { - if (Array.isArray(obj.value) && (obj.value.length > 1)) { - return "[" + obj.value.map(function (v) { return v.toCSS(); }).join(', ') + "]"; - } - else { - return obj.toCSS(); - } - }; - return JsEvalNode; - }(Node)); + var Media = /** @class */ (function (_super) { + __extends(Media, _super); + function Media(value, features, index, currentFileInfo, visibilityInfo) { + var _this = _super.call(this) || this; + _this._index = index; + _this._fileInfo = currentFileInfo; + var selectors = (new Selector([], null, null, _this._index, _this._fileInfo)).createEmptySelectors(); + _this.features = new Value(features); + _this.rules = [new Ruleset(selectors, value)]; + _this.rules[0].allowImports = true; + _this.copyVisibilityInfo(visibilityInfo); + _this.allowRoot = true; + _this.setParent(selectors, _this); + _this.setParent(_this.features, _this); + _this.setParent(_this.rules, _this); + return _this; + } + Media.prototype.isRulesetLike = function () { + return true; + }; + Media.prototype.accept = function (visitor) { + if (this.features) { + this.features = visitor.visit(this.features); + } + if (this.rules) { + this.rules = visitor.visitArray(this.rules); + } + }; + Media.prototype.genCSS = function (context, output) { + output.add('@media ', this._fileInfo, this._index); + this.features.genCSS(context, output); + this.outputRuleset(context, output, this.rules); + }; + Media.prototype.eval = function (context) { + if (!context.mediaBlocks) { + context.mediaBlocks = []; + context.mediaPath = []; + } + var media = new Media(null, [], this._index, this._fileInfo, this.visibilityInfo()); + if (this.debugInfo) { + this.rules[0].debugInfo = this.debugInfo; + media.debugInfo = this.debugInfo; + } + media.features = this.features.eval(context); + context.mediaPath.push(media); + context.mediaBlocks.push(media); + this.rules[0].functionRegistry = context.frames[0].functionRegistry.inherit(); + context.frames.unshift(this.rules[0]); + media.rules = [this.rules[0].eval(context)]; + context.frames.shift(); + context.mediaPath.pop(); + return context.mediaPath.length === 0 ? media.evalTop(context) : + media.evalNested(context); + }; + Media.prototype.evalTop = function (context) { + var result = this; + // Render all dependent Media blocks. + if (context.mediaBlocks.length > 1) { + var selectors = (new Selector([], null, null, this.getIndex(), this.fileInfo())).createEmptySelectors(); + result = new Ruleset(selectors, context.mediaBlocks); + result.multiMedia = true; + result.copyVisibilityInfo(this.visibilityInfo()); + this.setParent(result, this); + } + delete context.mediaBlocks; + delete context.mediaPath; + return result; + }; + Media.prototype.evalNested = function (context) { + var i; + var value; + var path = context.mediaPath.concat([this]); + // Extract the media-query conditions separated with `,` (OR). + for (i = 0; i < path.length; i++) { + value = path[i].features instanceof Value ? + path[i].features.value : path[i].features; + path[i] = Array.isArray(value) ? value : [value]; + } + // Trace all permutations to generate the resulting media-query. + // + // (a, b and c) with nested (d, e) -> + // a and d + // a and e + // b and c and d + // b and c and e + this.features = new Value(this.permute(path).map(function (path) { + path = path.map(function (fragment) { return fragment.toCSS ? fragment : new Anonymous(fragment); }); + for (i = path.length - 1; i > 0; i--) { + path.splice(i, 0, new Anonymous('and')); + } + return new Expression(path); + })); + this.setParent(this.features, this); + // Fake a tree-node that doesn't output anything. + return new Ruleset([], []); + }; + Media.prototype.permute = function (arr) { + if (arr.length === 0) { + return []; + } + else if (arr.length === 1) { + return arr[0]; + } + else { + var result = []; + var rest = this.permute(arr.slice(1)); + for (var i = 0; i < rest.length; i++) { + for (var j = 0; j < arr[0].length; j++) { + result.push([arr[0][j]].concat(rest[i])); + } + } + return result; + } + }; + Media.prototype.bubbleSelectors = function (selectors) { + if (!selectors) { + return; + } + this.rules = [new Ruleset(copyArray(selectors), [this.rules[0]])]; + this.setParent(this.rules, this); + }; + return Media; + }(AtRule)); + Media.prototype.type = 'Media'; - var JavaScript = /** @class */ (function (_super) { - __extends(JavaScript, _super); - function JavaScript(string, escaped, index, currentFileInfo) { - var _this = _super.call(this) || this; - _this.escaped = escaped; - _this.expression = string; - _this._index = index; - _this._fileInfo = currentFileInfo; - return _this; - } - JavaScript.prototype.eval = function (context) { - var result = this.evaluateJavaScript(this.expression, context); - var type = typeof result; - if (type === 'number' && !isNaN(result)) { - return new Dimension(result); - } - else if (type === 'string') { - return new Quoted("\"" + result + "\"", result, this.escaped, this._index); - } - else if (Array.isArray(result)) { - return new Anonymous(result.join(', ')); - } - else { - return new Anonymous(result); - } - }; - return JavaScript; - }(JsEvalNode)); - JavaScript.prototype.type = 'JavaScript'; + // + // CSS @import node + // + // The general strategy here is that we don't want to wait + // for the parsing to be completed, before we start importing + // the file. That's because in the context of a browser, + // most of the time will be spent waiting for the server to respond. + // + // On creation, we push the import path to our import queue, though + // `import,push`, we also pass it a callback, which it'll call once + // the file has been fetched, and parsed. + // + var Import = /** @class */ (function (_super) { + __extends(Import, _super); + function Import(path, features, options, index, currentFileInfo, visibilityInfo) { + var _this = _super.call(this) || this; + _this.options = options; + _this._index = index; + _this._fileInfo = currentFileInfo; + _this.path = path; + _this.features = features; + _this.allowRoot = true; + if (_this.options.less !== undefined || _this.options.inline) { + _this.css = !_this.options.less || _this.options.inline; + } + else { + var pathValue = _this.getPath(); + if (pathValue && /[#\.\&\?]css([\?;].*)?$/.test(pathValue)) { + _this.css = true; + } + } + _this.copyVisibilityInfo(visibilityInfo); + _this.setParent(_this.features, _this); + _this.setParent(_this.path, _this); + return _this; + } + Import.prototype.accept = function (visitor) { + if (this.features) { + this.features = visitor.visit(this.features); + } + this.path = visitor.visit(this.path); + if (!this.options.isPlugin && !this.options.inline && this.root) { + this.root = visitor.visit(this.root); + } + }; + Import.prototype.genCSS = function (context, output) { + if (this.css && this.path._fileInfo.reference === undefined) { + output.add('@import ', this._fileInfo, this._index); + this.path.genCSS(context, output); + if (this.features) { + output.add(' '); + this.features.genCSS(context, output); + } + output.add(';'); + } + }; + Import.prototype.getPath = function () { + return (this.path instanceof URL) ? + this.path.value.value : this.path.value; + }; + Import.prototype.isVariableImport = function () { + var path = this.path; + if (path instanceof URL) { + path = path.value; + } + if (path instanceof Quoted) { + return path.containsVariables(); + } + return true; + }; + Import.prototype.evalForImport = function (context) { + var path = this.path; + if (path instanceof URL) { + path = path.value; + } + return new Import(path.eval(context), this.features, this.options, this._index, this._fileInfo, this.visibilityInfo()); + }; + Import.prototype.evalPath = function (context) { + var path = this.path.eval(context); + var fileInfo = this._fileInfo; + if (!(path instanceof URL)) { + // Add the rootpath if the URL requires a rewrite + var pathValue = path.value; + if (fileInfo && + pathValue && + context.pathRequiresRewrite(pathValue)) { + path.value = context.rewritePath(pathValue, fileInfo.rootpath); + } + else { + path.value = context.normalizePath(path.value); + } + } + return path; + }; + Import.prototype.eval = function (context) { + var result = this.doEval(context); + if (this.options.reference || this.blocksVisibility()) { + if (result.length || result.length === 0) { + result.forEach(function (node) { + node.addVisibilityBlock(); + }); + } + else { + result.addVisibilityBlock(); + } + } + return result; + }; + Import.prototype.doEval = function (context) { + var ruleset; + var registry; + var features = this.features && this.features.eval(context); + if (this.options.isPlugin) { + if (this.root && this.root.eval) { + try { + this.root.eval(context); + } + catch (e) { + e.message = 'Plugin error during evaluation'; + throw new LessError(e, this.root.imports, this.root.filename); + } + } + registry = context.frames[0] && context.frames[0].functionRegistry; + if (registry && this.root && this.root.functions) { + registry.addMultiple(this.root.functions); + } + return []; + } + if (this.skip) { + if (typeof this.skip === 'function') { + this.skip = this.skip(); + } + if (this.skip) { + return []; + } + } + if (this.options.inline) { + var contents = new Anonymous(this.root, 0, { + filename: this.importedFilename, + reference: this.path._fileInfo && this.path._fileInfo.reference + }, true, true); + return this.features ? new Media([contents], this.features.value) : [contents]; + } + else if (this.css) { + var newImport = new Import(this.evalPath(context), features, this.options, this._index); + if (!newImport.css && this.error) { + throw this.error; + } + return newImport; + } + else if (this.root) { + ruleset = new Ruleset(null, copyArray(this.root.rules)); + ruleset.evalImports(context); + return this.features ? new Media(ruleset.rules, this.features.value) : ruleset.rules; + } + else { + return []; + } + }; + return Import; + }(Node)); + Import.prototype.type = 'Import'; - var Assignment = /** @class */ (function (_super) { - __extends(Assignment, _super); - function Assignment(key, val) { - var _this = _super.call(this) || this; - _this.key = key; - _this.value = val; - return _this; - } - Assignment.prototype.accept = function (visitor) { - this.value = visitor.visit(this.value); - }; - Assignment.prototype.eval = function (context) { - if (this.value.eval) { - return new Assignment(this.key, this.value.eval(context)); - } - return this; - }; - Assignment.prototype.genCSS = function (context, output) { - output.add(this.key + "="); - if (this.value.genCSS) { - this.value.genCSS(context, output); - } - else { - output.add(this.value); - } - }; - return Assignment; - }(Node)); - Assignment.prototype.type = 'Assignment'; + var JsEvalNode = /** @class */ (function (_super) { + __extends(JsEvalNode, _super); + function JsEvalNode() { + return _super !== null && _super.apply(this, arguments) || this; + } + JsEvalNode.prototype.evaluateJavaScript = function (expression, context) { + var result; + var that = this; + var evalContext = {}; + if (!context.javascriptEnabled) { + throw { message: 'Inline JavaScript is not enabled. Is it set in your options?', + filename: this.fileInfo().filename, + index: this.getIndex() }; + } + expression = expression.replace(/@\{([\w-]+)\}/g, function (_, name) { + return that.jsify(new Variable("@" + name, that.getIndex(), that.fileInfo()).eval(context)); + }); + try { + expression = new Function("return (" + expression + ")"); + } + catch (e) { + throw { message: "JavaScript evaluation error: " + e.message + " from `" + expression + "`", filename: this.fileInfo().filename, + index: this.getIndex() }; + } + var variables = context.frames[0].variables(); + for (var k in variables) { + if (variables.hasOwnProperty(k)) { + /* jshint loopfunc:true */ + evalContext[k.slice(1)] = { + value: variables[k].value, + toJS: function () { + return this.value.eval(context).toCSS(); + } + }; + } + } + try { + result = expression.call(evalContext); + } + catch (e) { + throw { message: "JavaScript evaluation error: '" + e.name + ": " + e.message.replace(/["]/g, '\'') + "'", filename: this.fileInfo().filename, + index: this.getIndex() }; + } + return result; + }; + JsEvalNode.prototype.jsify = function (obj) { + if (Array.isArray(obj.value) && (obj.value.length > 1)) { + return "[" + obj.value.map(function (v) { return v.toCSS(); }).join(', ') + "]"; + } + else { + return obj.toCSS(); + } + }; + return JsEvalNode; + }(Node)); - var Condition = /** @class */ (function (_super) { - __extends(Condition, _super); - function Condition(op, l, r, i, negate) { - var _this = _super.call(this) || this; - _this.op = op.trim(); - _this.lvalue = l; - _this.rvalue = r; - _this._index = i; - _this.negate = negate; - return _this; - } - Condition.prototype.accept = function (visitor) { - this.lvalue = visitor.visit(this.lvalue); - this.rvalue = visitor.visit(this.rvalue); - }; - Condition.prototype.eval = function (context) { - var result = (function (op, a, b) { - switch (op) { - case 'and': return a && b; - case 'or': return a || b; - default: - switch (Node.compare(a, b)) { - case -1: - return op === '<' || op === '=<' || op === '<='; - case 0: - return op === '=' || op === '>=' || op === '=<' || op === '<='; - case 1: - return op === '>' || op === '>='; - default: - return false; - } - } - })(this.op, this.lvalue.eval(context), this.rvalue.eval(context)); - return this.negate ? !result : result; - }; - return Condition; - }(Node)); - Condition.prototype.type = 'Condition'; + var JavaScript = /** @class */ (function (_super) { + __extends(JavaScript, _super); + function JavaScript(string, escaped, index, currentFileInfo) { + var _this = _super.call(this) || this; + _this.escaped = escaped; + _this.expression = string; + _this._index = index; + _this._fileInfo = currentFileInfo; + return _this; + } + JavaScript.prototype.eval = function (context) { + var result = this.evaluateJavaScript(this.expression, context); + var type = typeof result; + if (type === 'number' && !isNaN(result)) { + return new Dimension(result); + } + else if (type === 'string') { + return new Quoted("\"" + result + "\"", result, this.escaped, this._index); + } + else if (Array.isArray(result)) { + return new Anonymous(result.join(', ')); + } + else { + return new Anonymous(result); + } + }; + return JavaScript; + }(JsEvalNode)); + JavaScript.prototype.type = 'JavaScript'; - var UnicodeDescriptor = /** @class */ (function (_super) { - __extends(UnicodeDescriptor, _super); - function UnicodeDescriptor(value) { - var _this = _super.call(this) || this; - _this.value = value; - return _this; - } - return UnicodeDescriptor; - }(Node)); - UnicodeDescriptor.prototype.type = 'UnicodeDescriptor'; + var Assignment = /** @class */ (function (_super) { + __extends(Assignment, _super); + function Assignment(key, val) { + var _this = _super.call(this) || this; + _this.key = key; + _this.value = val; + return _this; + } + Assignment.prototype.accept = function (visitor) { + this.value = visitor.visit(this.value); + }; + Assignment.prototype.eval = function (context) { + if (this.value.eval) { + return new Assignment(this.key, this.value.eval(context)); + } + return this; + }; + Assignment.prototype.genCSS = function (context, output) { + output.add(this.key + "="); + if (this.value.genCSS) { + this.value.genCSS(context, output); + } + else { + output.add(this.value); + } + }; + return Assignment; + }(Node)); + Assignment.prototype.type = 'Assignment'; - var Negative = /** @class */ (function (_super) { - __extends(Negative, _super); - function Negative(node) { - var _this = _super.call(this) || this; - _this.value = node; - return _this; - } - Negative.prototype.genCSS = function (context, output) { - output.add('-'); - this.value.genCSS(context, output); - }; - Negative.prototype.eval = function (context) { - if (context.isMathOn()) { - return (new Operation('*', [new Dimension(-1), this.value])).eval(context); - } - return new Negative(this.value.eval(context)); - }; - return Negative; - }(Node)); - Negative.prototype.type = 'Negative'; + var Condition = /** @class */ (function (_super) { + __extends(Condition, _super); + function Condition(op, l, r, i, negate) { + var _this = _super.call(this) || this; + _this.op = op.trim(); + _this.lvalue = l; + _this.rvalue = r; + _this._index = i; + _this.negate = negate; + return _this; + } + Condition.prototype.accept = function (visitor) { + this.lvalue = visitor.visit(this.lvalue); + this.rvalue = visitor.visit(this.rvalue); + }; + Condition.prototype.eval = function (context) { + var result = (function (op, a, b) { + switch (op) { + case 'and': return a && b; + case 'or': return a || b; + default: + switch (Node.compare(a, b)) { + case -1: + return op === '<' || op === '=<' || op === '<='; + case 0: + return op === '=' || op === '>=' || op === '=<' || op === '<='; + case 1: + return op === '>' || op === '>='; + default: + return false; + } + } + })(this.op, this.lvalue.eval(context), this.rvalue.eval(context)); + return this.negate ? !result : result; + }; + return Condition; + }(Node)); + Condition.prototype.type = 'Condition'; - var Extend = /** @class */ (function (_super) { - __extends(Extend, _super); - function Extend(selector, option, index, currentFileInfo, visibilityInfo) { - var _this = _super.call(this) || this; - _this.selector = selector; - _this.option = option; - _this.object_id = Extend.next_id++; - _this.parent_ids = [_this.object_id]; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.copyVisibilityInfo(visibilityInfo); - _this.allowRoot = true; - switch (option) { - case 'all': - _this.allowBefore = true; - _this.allowAfter = true; - break; - default: - _this.allowBefore = false; - _this.allowAfter = false; - break; - } - _this.setParent(_this.selector, _this); - return _this; - } - Extend.prototype.accept = function (visitor) { - this.selector = visitor.visit(this.selector); - }; - Extend.prototype.eval = function (context) { - return new Extend(this.selector.eval(context), this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo()); - }; - Extend.prototype.clone = function (context) { - return new Extend(this.selector, this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo()); - }; - // it concatenates (joins) all selectors in selector array - Extend.prototype.findSelfSelectors = function (selectors) { - var selfElements = []; - var i; - var selectorElements; - for (i = 0; i < selectors.length; i++) { - selectorElements = selectors[i].elements; - // duplicate the logic in genCSS function inside the selector node. - // future TODO - move both logics into the selector joiner visitor - if (i > 0 && selectorElements.length && selectorElements[0].combinator.value === '') { - selectorElements[0].combinator.value = ' '; - } - selfElements = selfElements.concat(selectors[i].elements); - } - this.selfSelectors = [new Selector(selfElements)]; - this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo()); - }; - return Extend; - }(Node)); - Extend.next_id = 0; - Extend.prototype.type = 'Extend'; + var UnicodeDescriptor = /** @class */ (function (_super) { + __extends(UnicodeDescriptor, _super); + function UnicodeDescriptor(value) { + var _this = _super.call(this) || this; + _this.value = value; + return _this; + } + return UnicodeDescriptor; + }(Node)); + UnicodeDescriptor.prototype.type = 'UnicodeDescriptor'; - var VariableCall = /** @class */ (function (_super) { - __extends(VariableCall, _super); - function VariableCall(variable, index, currentFileInfo) { - var _this = _super.call(this) || this; - _this.variable = variable; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.allowRoot = true; - return _this; - } - VariableCall.prototype.eval = function (context) { - var rules; - var detachedRuleset = new Variable(this.variable, this.getIndex(), this.fileInfo()).eval(context); - var error = new LessError({ message: "Could not evaluate variable call " + this.variable }); - if (!detachedRuleset.ruleset) { - if (detachedRuleset.rules) { - rules = detachedRuleset; - } - else if (Array.isArray(detachedRuleset)) { - rules = new Ruleset('', detachedRuleset); - } - else if (Array.isArray(detachedRuleset.value)) { - rules = new Ruleset('', detachedRuleset.value); - } - else { - throw error; - } - detachedRuleset = new DetachedRuleset(rules); - } - if (detachedRuleset.ruleset) { - return detachedRuleset.callEval(context); - } - throw error; - }; - return VariableCall; - }(Node)); - VariableCall.prototype.type = 'VariableCall'; + var Negative = /** @class */ (function (_super) { + __extends(Negative, _super); + function Negative(node) { + var _this = _super.call(this) || this; + _this.value = node; + return _this; + } + Negative.prototype.genCSS = function (context, output) { + output.add('-'); + this.value.genCSS(context, output); + }; + Negative.prototype.eval = function (context) { + if (context.isMathOn()) { + return (new Operation('*', [new Dimension(-1), this.value])).eval(context); + } + return new Negative(this.value.eval(context)); + }; + return Negative; + }(Node)); + Negative.prototype.type = 'Negative'; - var NamespaceValue = /** @class */ (function (_super) { - __extends(NamespaceValue, _super); - function NamespaceValue(ruleCall, lookups, index, fileInfo) { - var _this = _super.call(this) || this; - _this.value = ruleCall; - _this.lookups = lookups; - _this._index = index; - _this._fileInfo = fileInfo; - return _this; - } - NamespaceValue.prototype.eval = function (context) { - var i; - var name; - var rules = this.value.eval(context); - for (i = 0; i < this.lookups.length; i++) { - name = this.lookups[i]; - /** - * Eval'd DRs return rulesets. - * Eval'd mixins return rules, so let's make a ruleset if we need it. - * We need to do this because of late parsing of values - */ - if (Array.isArray(rules)) { - rules = new Ruleset([new Selector()], rules); - } - if (name === '') { - rules = rules.lastDeclaration(); - } - else if (name.charAt(0) === '@') { - if (name.charAt(1) === '@') { - name = "@" + new Variable(name.substr(1)).eval(context).value; - } - if (rules.variables) { - rules = rules.variable(name); - } - if (!rules) { - throw { type: 'Name', message: "variable " + name + " not found", filename: this.fileInfo().filename, - index: this.getIndex() }; - } - } - else { - if (name.substring(0, 2) === '$@') { - name = "$" + new Variable(name.substr(1)).eval(context).value; - } - else { - name = name.charAt(0) === '$' ? name : "$" + name; - } - if (rules.properties) { - rules = rules.property(name); - } - if (!rules) { - throw { type: 'Name', message: "property \"" + name.substr(1) + "\" not found", filename: this.fileInfo().filename, - index: this.getIndex() }; - } - // Properties are an array of values, since a ruleset can have multiple props. - // We pick the last one (the "cascaded" value) - rules = rules[rules.length - 1]; - } - if (rules.value) { - rules = rules.eval(context).value; - } - if (rules.ruleset) { - rules = rules.ruleset.eval(context); - } - } - return rules; - }; - return NamespaceValue; - }(Node)); - NamespaceValue.prototype.type = 'NamespaceValue'; + var Extend = /** @class */ (function (_super) { + __extends(Extend, _super); + function Extend(selector, option, index, currentFileInfo, visibilityInfo) { + var _this = _super.call(this) || this; + _this.selector = selector; + _this.option = option; + _this.object_id = Extend.next_id++; + _this.parent_ids = [_this.object_id]; + _this._index = index; + _this._fileInfo = currentFileInfo; + _this.copyVisibilityInfo(visibilityInfo); + _this.allowRoot = true; + switch (option) { + case 'all': + _this.allowBefore = true; + _this.allowAfter = true; + break; + default: + _this.allowBefore = false; + _this.allowAfter = false; + break; + } + _this.setParent(_this.selector, _this); + return _this; + } + Extend.prototype.accept = function (visitor) { + this.selector = visitor.visit(this.selector); + }; + Extend.prototype.eval = function (context) { + return new Extend(this.selector.eval(context), this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo()); + }; + Extend.prototype.clone = function (context) { + return new Extend(this.selector, this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo()); + }; + // it concatenates (joins) all selectors in selector array + Extend.prototype.findSelfSelectors = function (selectors) { + var selfElements = [], i, selectorElements; + for (i = 0; i < selectors.length; i++) { + selectorElements = selectors[i].elements; + // duplicate the logic in genCSS function inside the selector node. + // future TODO - move both logics into the selector joiner visitor + if (i > 0 && selectorElements.length && selectorElements[0].combinator.value === '') { + selectorElements[0].combinator.value = ' '; + } + selfElements = selfElements.concat(selectors[i].elements); + } + this.selfSelectors = [new Selector(selfElements)]; + this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo()); + }; + return Extend; + }(Node)); + Extend.next_id = 0; + Extend.prototype.type = 'Extend'; - var Definition = /** @class */ (function (_super) { - __extends(Definition, _super); - function Definition(name, params, rules, condition, variadic, frames, visibilityInfo) { - var _this = _super.call(this) || this; - _this.name = name || 'anonymous mixin'; - _this.selectors = [new Selector([new Element(null, name, false, _this._index, _this._fileInfo)])]; - _this.params = params; - _this.condition = condition; - _this.variadic = variadic; - _this.arity = params.length; - _this.rules = rules; - _this._lookups = {}; - var optionalParameters = []; - _this.required = params.reduce(function (count, p) { - if (!p.name || (p.name && !p.value)) { - return count + 1; - } - else { - optionalParameters.push(p.name); - return count; - } - }, 0); - _this.optionalParameters = optionalParameters; - _this.frames = frames; - _this.copyVisibilityInfo(visibilityInfo); - _this.allowRoot = true; - return _this; - } - Definition.prototype.accept = function (visitor) { - if (this.params && this.params.length) { - this.params = visitor.visitArray(this.params); - } - this.rules = visitor.visitArray(this.rules); - if (this.condition) { - this.condition = visitor.visit(this.condition); - } - }; - Definition.prototype.evalParams = function (context, mixinEnv, args, evaldArguments) { - /* jshint boss:true */ - var frame = new Ruleset(null, null); - var varargs; - var arg; - var params = copyArray(this.params); - var i; - var j; - var val; - var name; - var isNamedFound; - var argIndex; - var argsLength = 0; - if (mixinEnv.frames && mixinEnv.frames[0] && mixinEnv.frames[0].functionRegistry) { - frame.functionRegistry = mixinEnv.frames[0].functionRegistry.inherit(); - } - mixinEnv = new contexts.Eval(mixinEnv, [frame].concat(mixinEnv.frames)); - if (args) { - args = copyArray(args); - argsLength = args.length; - for (i = 0; i < argsLength; i++) { - arg = args[i]; - if (name = (arg && arg.name)) { - isNamedFound = false; - for (j = 0; j < params.length; j++) { - if (!evaldArguments[j] && name === params[j].name) { - evaldArguments[j] = arg.value.eval(context); - frame.prependRule(new Declaration(name, arg.value.eval(context))); - isNamedFound = true; - break; - } - } - if (isNamedFound) { - args.splice(i, 1); - i--; - continue; - } - else { - throw { type: 'Runtime', message: "Named argument for " + this.name + " " + args[i].name + " not found" }; - } - } - } - } - argIndex = 0; - for (i = 0; i < params.length; i++) { - if (evaldArguments[i]) { - continue; - } - arg = args && args[argIndex]; - if (name = params[i].name) { - if (params[i].variadic) { - varargs = []; - for (j = argIndex; j < argsLength; j++) { - varargs.push(args[j].value.eval(context)); - } - frame.prependRule(new Declaration(name, new Expression(varargs).eval(context))); - } - else { - val = arg && arg.value; - if (val) { - // This was a mixin call, pass in a detached ruleset of it's eval'd rules - if (Array.isArray(val)) { - val = new DetachedRuleset(new Ruleset('', val)); - } - else { - val = val.eval(context); - } - } - else if (params[i].value) { - val = params[i].value.eval(mixinEnv); - frame.resetCache(); - } - else { - throw { type: 'Runtime', message: "wrong number of arguments for " + this.name + " (" + argsLength + " for " + this.arity + ")" }; - } - frame.prependRule(new Declaration(name, val)); - evaldArguments[i] = val; - } - } - if (params[i].variadic && args) { - for (j = argIndex; j < argsLength; j++) { - evaldArguments[j] = args[j].value.eval(context); - } - } - argIndex++; - } - return frame; - }; - Definition.prototype.makeImportant = function () { - var rules = !this.rules ? this.rules : this.rules.map(function (r) { - if (r.makeImportant) { - return r.makeImportant(true); - } - else { - return r; - } - }); - var result = new Definition(this.name, this.params, rules, this.condition, this.variadic, this.frames); - return result; - }; - Definition.prototype.eval = function (context) { - return new Definition(this.name, this.params, this.rules, this.condition, this.variadic, this.frames || copyArray(context.frames)); - }; - Definition.prototype.evalCall = function (context, args, important) { - var _arguments = []; - var mixinFrames = this.frames ? this.frames.concat(context.frames) : context.frames; - var frame = this.evalParams(context, new contexts.Eval(context, mixinFrames), args, _arguments); - var rules; - var ruleset; - frame.prependRule(new Declaration('@arguments', new Expression(_arguments).eval(context))); - rules = copyArray(this.rules); - ruleset = new Ruleset(null, rules); - ruleset.originalRuleset = this; - ruleset = ruleset.eval(new contexts.Eval(context, [this, frame].concat(mixinFrames))); - if (important) { - ruleset = ruleset.makeImportant(); - } - return ruleset; - }; - Definition.prototype.matchCondition = function (args, context) { - if (this.condition && !this.condition.eval(new contexts.Eval(context, [this.evalParams(context, /* the parameter variables */ new contexts.Eval(context, this.frames ? this.frames.concat(context.frames) : context.frames), args, [])] - .concat(this.frames || []) // the parent namespace/mixin frames - .concat(context.frames)))) { // the current environment frames - return false; - } - return true; - }; - Definition.prototype.matchArgs = function (args, context) { - var allArgsCnt = (args && args.length) || 0; - var len; - var optionalParameters = this.optionalParameters; - var requiredArgsCnt = !args ? 0 : args.reduce(function (count, p) { - if (optionalParameters.indexOf(p.name) < 0) { - return count + 1; - } - else { - return count; - } - }, 0); - if (!this.variadic) { - if (requiredArgsCnt < this.required) { - return false; - } - if (allArgsCnt > this.params.length) { - return false; - } - } - else { - if (requiredArgsCnt < (this.required - 1)) { - return false; - } - } - // check patterns - len = Math.min(requiredArgsCnt, this.arity); - for (var i = 0; i < len; i++) { - if (!this.params[i].name && !this.params[i].variadic) { - if (args[i].value.eval(context).toCSS() != this.params[i].value.eval(context).toCSS()) { - return false; - } - } - } - return true; - }; - return Definition; - }(Ruleset)); - Definition.prototype.type = 'MixinDefinition'; - Definition.prototype.evalFirst = true; + var VariableCall = /** @class */ (function (_super) { + __extends(VariableCall, _super); + function VariableCall(variable, index, currentFileInfo) { + var _this = _super.call(this) || this; + _this.variable = variable; + _this._index = index; + _this._fileInfo = currentFileInfo; + _this.allowRoot = true; + return _this; + } + VariableCall.prototype.eval = function (context) { + var rules; + var detachedRuleset = new Variable(this.variable, this.getIndex(), this.fileInfo()).eval(context); + var error = new LessError({ message: "Could not evaluate variable call " + this.variable }); + if (!detachedRuleset.ruleset) { + if (detachedRuleset.rules) { + rules = detachedRuleset; + } + else if (Array.isArray(detachedRuleset)) { + rules = new Ruleset('', detachedRuleset); + } + else if (Array.isArray(detachedRuleset.value)) { + rules = new Ruleset('', detachedRuleset.value); + } + else { + throw error; + } + detachedRuleset = new DetachedRuleset(rules); + } + if (detachedRuleset.ruleset) { + return detachedRuleset.callEval(context); + } + throw error; + }; + return VariableCall; + }(Node)); + VariableCall.prototype.type = 'VariableCall'; - var MixinCall = /** @class */ (function (_super) { - __extends(MixinCall, _super); - function MixinCall(elements, args, index, currentFileInfo, important) { - var _this = _super.call(this) || this; - _this.selector = new Selector(elements); - _this.arguments = args || []; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.important = important; - _this.allowRoot = true; - _this.setParent(_this.selector, _this); - return _this; - } - MixinCall.prototype.accept = function (visitor) { - if (this.selector) { - this.selector = visitor.visit(this.selector); - } - if (this.arguments.length) { - this.arguments = visitor.visitArray(this.arguments); - } - }; - MixinCall.prototype.eval = function (context) { - var mixins; - var mixin; - var mixinPath; - var args = []; - var arg; - var argValue; - var rules = []; - var match = false; - var i; - var m; - var f; - var isRecursive; - var isOneFound; - var candidates = []; - var candidate; - var conditionResult = []; - var defaultResult; - var defFalseEitherCase = -1; - var defNone = 0; - var defTrue = 1; - var defFalse = 2; - var count; - var originalRuleset; - var noArgumentsFilter; - this.selector = this.selector.eval(context); - function calcDefGroup(mixin, mixinPath) { - var f; - var p; - var namespace; - for (f = 0; f < 2; f++) { - conditionResult[f] = true; - defaultFunc.value(f); - for (p = 0; p < mixinPath.length && conditionResult[f]; p++) { - namespace = mixinPath[p]; - if (namespace.matchCondition) { - conditionResult[f] = conditionResult[f] && namespace.matchCondition(null, context); - } - } - if (mixin.matchCondition) { - conditionResult[f] = conditionResult[f] && mixin.matchCondition(args, context); - } - } - if (conditionResult[0] || conditionResult[1]) { - if (conditionResult[0] != conditionResult[1]) { - return conditionResult[1] ? - defTrue : defFalse; - } - return defNone; - } - return defFalseEitherCase; - } - for (i = 0; i < this.arguments.length; i++) { - arg = this.arguments[i]; - argValue = arg.value.eval(context); - if (arg.expand && Array.isArray(argValue.value)) { - argValue = argValue.value; - for (m = 0; m < argValue.length; m++) { - args.push({ value: argValue[m] }); - } - } - else { - args.push({ name: arg.name, value: argValue }); - } - } - noArgumentsFilter = function (rule) { return rule.matchArgs(null, context); }; - for (i = 0; i < context.frames.length; i++) { - if ((mixins = context.frames[i].find(this.selector, null, noArgumentsFilter)).length > 0) { - isOneFound = true; - // To make `default()` function independent of definition order we have two "subpasses" here. - // At first we evaluate each guard *twice* (with `default() == true` and `default() == false`), - // and build candidate list with corresponding flags. Then, when we know all possible matches, - // we make a final decision. - for (m = 0; m < mixins.length; m++) { - mixin = mixins[m].rule; - mixinPath = mixins[m].path; - isRecursive = false; - for (f = 0; f < context.frames.length; f++) { - if ((!(mixin instanceof Definition)) && mixin === (context.frames[f].originalRuleset || context.frames[f])) { - isRecursive = true; - break; - } - } - if (isRecursive) { - continue; - } - if (mixin.matchArgs(args, context)) { - candidate = { mixin: mixin, group: calcDefGroup(mixin, mixinPath) }; - if (candidate.group !== defFalseEitherCase) { - candidates.push(candidate); - } - match = true; - } - } - defaultFunc.reset(); - count = [0, 0, 0]; - for (m = 0; m < candidates.length; m++) { - count[candidates[m].group]++; - } - if (count[defNone] > 0) { - defaultResult = defFalse; - } - else { - defaultResult = defTrue; - if ((count[defTrue] + count[defFalse]) > 1) { - throw { type: 'Runtime', message: "Ambiguous use of `default()` found when matching for `" + this.format(args) + "`", index: this.getIndex(), filename: this.fileInfo().filename }; - } - } - for (m = 0; m < candidates.length; m++) { - candidate = candidates[m].group; - if ((candidate === defNone) || (candidate === defaultResult)) { - try { - mixin = candidates[m].mixin; - if (!(mixin instanceof Definition)) { - originalRuleset = mixin.originalRuleset || mixin; - mixin = new Definition('', [], mixin.rules, null, false, null, originalRuleset.visibilityInfo()); - mixin.originalRuleset = originalRuleset; - } - var newRules = mixin.evalCall(context, args, this.important).rules; - this._setVisibilityToReplacement(newRules); - Array.prototype.push.apply(rules, newRules); - } - catch (e) { - throw { message: e.message, index: this.getIndex(), filename: this.fileInfo().filename, stack: e.stack }; - } - } - } - if (match) { - return rules; - } - } - } - if (isOneFound) { - throw { type: 'Runtime', message: "No matching definition was found for `" + this.format(args) + "`", index: this.getIndex(), filename: this.fileInfo().filename }; - } - else { - throw { type: 'Name', message: this.selector.toCSS().trim() + " is undefined", index: this.getIndex(), filename: this.fileInfo().filename }; - } - }; - MixinCall.prototype._setVisibilityToReplacement = function (replacement) { - var i; - var rule; - if (this.blocksVisibility()) { - for (i = 0; i < replacement.length; i++) { - rule = replacement[i]; - rule.addVisibilityBlock(); - } - } - }; - MixinCall.prototype.format = function (args) { - return this.selector.toCSS().trim() + "(" + (args ? args.map(function (a) { - var argValue = ''; - if (a.name) { - argValue += a.name + ":"; - } - if (a.value.toCSS) { - argValue += a.value.toCSS(); - } - else { - argValue += '???'; - } - return argValue; - }).join(', ') : '') + ")"; - }; - return MixinCall; - }(Node)); - MixinCall.prototype.type = 'MixinCall'; + var NamespaceValue = /** @class */ (function (_super) { + __extends(NamespaceValue, _super); + function NamespaceValue(ruleCall, lookups, index, fileInfo) { + var _this = _super.call(this) || this; + _this.value = ruleCall; + _this.lookups = lookups; + _this._index = index; + _this._fileInfo = fileInfo; + return _this; + } + NamespaceValue.prototype.eval = function (context) { + var i, name, rules = this.value.eval(context); + for (i = 0; i < this.lookups.length; i++) { + name = this.lookups[i]; + /** + * Eval'd DRs return rulesets. + * Eval'd mixins return rules, so let's make a ruleset if we need it. + * We need to do this because of late parsing of values + */ + if (Array.isArray(rules)) { + rules = new Ruleset([new Selector()], rules); + } + if (name === '') { + rules = rules.lastDeclaration(); + } + else if (name.charAt(0) === '@') { + if (name.charAt(1) === '@') { + name = "@" + new Variable(name.substr(1)).eval(context).value; + } + if (rules.variables) { + rules = rules.variable(name); + } + if (!rules) { + throw { type: 'Name', message: "variable " + name + " not found", filename: this.fileInfo().filename, + index: this.getIndex() }; + } + } + else { + if (name.substring(0, 2) === '$@') { + name = "$" + new Variable(name.substr(1)).eval(context).value; + } + else { + name = name.charAt(0) === '$' ? name : "$" + name; + } + if (rules.properties) { + rules = rules.property(name); + } + if (!rules) { + throw { type: 'Name', message: "property \"" + name.substr(1) + "\" not found", filename: this.fileInfo().filename, + index: this.getIndex() }; + } + // Properties are an array of values, since a ruleset can have multiple props. + // We pick the last one (the "cascaded" value) + rules = rules[rules.length - 1]; + } + if (rules.value) { + rules = rules.eval(context).value; + } + if (rules.ruleset) { + rules = rules.ruleset.eval(context); + } + } + return rules; + }; + return NamespaceValue; + }(Node)); + NamespaceValue.prototype.type = 'NamespaceValue'; - var tree = { - Node: Node, Color: Color, AtRule: AtRule, DetachedRuleset: DetachedRuleset, Operation: Operation, - Dimension: Dimension, Unit: Unit, Keyword: Keyword, Variable: Variable, Property: Property, - Ruleset: Ruleset, Element: Element, Attribute: Attribute, Combinator: Combinator, Selector: Selector, - Quoted: Quoted, Expression: Expression, Declaration: Declaration, Call: Call, URL: URL, Import: Import, - Comment: Comment, Anonymous: Anonymous, Value: Value, JavaScript: JavaScript, Assignment: Assignment, - Condition: Condition, Paren: Paren, Media: Media, UnicodeDescriptor: UnicodeDescriptor, Negative: Negative, - Extend: Extend, VariableCall: VariableCall, NamespaceValue: NamespaceValue, - mixin: { - Call: MixinCall, - Definition: Definition - } - }; + var Definition = /** @class */ (function (_super) { + __extends(Definition, _super); + function Definition(name, params, rules, condition, variadic, frames, visibilityInfo) { + var _this = _super.call(this) || this; + _this.name = name || 'anonymous mixin'; + _this.selectors = [new Selector([new Element(null, name, false, _this._index, _this._fileInfo)])]; + _this.params = params; + _this.condition = condition; + _this.variadic = variadic; + _this.arity = params.length; + _this.rules = rules; + _this._lookups = {}; + var optionalParameters = []; + _this.required = params.reduce(function (count, p) { + if (!p.name || (p.name && !p.value)) { + return count + 1; + } + else { + optionalParameters.push(p.name); + return count; + } + }, 0); + _this.optionalParameters = optionalParameters; + _this.frames = frames; + _this.copyVisibilityInfo(visibilityInfo); + _this.allowRoot = true; + return _this; + } + Definition.prototype.accept = function (visitor) { + if (this.params && this.params.length) { + this.params = visitor.visitArray(this.params); + } + this.rules = visitor.visitArray(this.rules); + if (this.condition) { + this.condition = visitor.visit(this.condition); + } + }; + Definition.prototype.evalParams = function (context, mixinEnv, args, evaldArguments) { + /* jshint boss:true */ + var frame = new Ruleset(null, null); + var varargs; + var arg; + var params = copyArray(this.params); + var i; + var j; + var val; + var name; + var isNamedFound; + var argIndex; + var argsLength = 0; + if (mixinEnv.frames && mixinEnv.frames[0] && mixinEnv.frames[0].functionRegistry) { + frame.functionRegistry = mixinEnv.frames[0].functionRegistry.inherit(); + } + mixinEnv = new contexts.Eval(mixinEnv, [frame].concat(mixinEnv.frames)); + if (args) { + args = copyArray(args); + argsLength = args.length; + for (i = 0; i < argsLength; i++) { + arg = args[i]; + if (name = (arg && arg.name)) { + isNamedFound = false; + for (j = 0; j < params.length; j++) { + if (!evaldArguments[j] && name === params[j].name) { + evaldArguments[j] = arg.value.eval(context); + frame.prependRule(new Declaration(name, arg.value.eval(context))); + isNamedFound = true; + break; + } + } + if (isNamedFound) { + args.splice(i, 1); + i--; + continue; + } + else { + throw { type: 'Runtime', message: "Named argument for " + this.name + " " + args[i].name + " not found" }; + } + } + } + } + argIndex = 0; + for (i = 0; i < params.length; i++) { + if (evaldArguments[i]) { + continue; + } + arg = args && args[argIndex]; + if (name = params[i].name) { + if (params[i].variadic) { + varargs = []; + for (j = argIndex; j < argsLength; j++) { + varargs.push(args[j].value.eval(context)); + } + frame.prependRule(new Declaration(name, new Expression(varargs).eval(context))); + } + else { + val = arg && arg.value; + if (val) { + // This was a mixin call, pass in a detached ruleset of it's eval'd rules + if (Array.isArray(val)) { + val = new DetachedRuleset(new Ruleset('', val)); + } + else { + val = val.eval(context); + } + } + else if (params[i].value) { + val = params[i].value.eval(mixinEnv); + frame.resetCache(); + } + else { + throw { type: 'Runtime', message: "wrong number of arguments for " + this.name + " (" + argsLength + " for " + this.arity + ")" }; + } + frame.prependRule(new Declaration(name, val)); + evaldArguments[i] = val; + } + } + if (params[i].variadic && args) { + for (j = argIndex; j < argsLength; j++) { + evaldArguments[j] = args[j].value.eval(context); + } + } + argIndex++; + } + return frame; + }; + Definition.prototype.makeImportant = function () { + var rules = !this.rules ? this.rules : this.rules.map(function (r) { + if (r.makeImportant) { + return r.makeImportant(true); + } + else { + return r; + } + }); + var result = new Definition(this.name, this.params, rules, this.condition, this.variadic, this.frames); + return result; + }; + Definition.prototype.eval = function (context) { + return new Definition(this.name, this.params, this.rules, this.condition, this.variadic, this.frames || copyArray(context.frames)); + }; + Definition.prototype.evalCall = function (context, args, important) { + var _arguments = []; + var mixinFrames = this.frames ? this.frames.concat(context.frames) : context.frames; + var frame = this.evalParams(context, new contexts.Eval(context, mixinFrames), args, _arguments); + var rules; + var ruleset; + frame.prependRule(new Declaration('@arguments', new Expression(_arguments).eval(context))); + rules = copyArray(this.rules); + ruleset = new Ruleset(null, rules); + ruleset.originalRuleset = this; + ruleset = ruleset.eval(new contexts.Eval(context, [this, frame].concat(mixinFrames))); + if (important) { + ruleset = ruleset.makeImportant(); + } + return ruleset; + }; + Definition.prototype.matchCondition = function (args, context) { + if (this.condition && !this.condition.eval(new contexts.Eval(context, [this.evalParams(context, /* the parameter variables */ new contexts.Eval(context, this.frames ? this.frames.concat(context.frames) : context.frames), args, [])] + .concat(this.frames || []) // the parent namespace/mixin frames + .concat(context.frames)))) { // the current environment frames + return false; + } + return true; + }; + Definition.prototype.matchArgs = function (args, context) { + var allArgsCnt = (args && args.length) || 0; + var len; + var optionalParameters = this.optionalParameters; + var requiredArgsCnt = !args ? 0 : args.reduce(function (count, p) { + if (optionalParameters.indexOf(p.name) < 0) { + return count + 1; + } + else { + return count; + } + }, 0); + if (!this.variadic) { + if (requiredArgsCnt < this.required) { + return false; + } + if (allArgsCnt > this.params.length) { + return false; + } + } + else { + if (requiredArgsCnt < (this.required - 1)) { + return false; + } + } + // check patterns + len = Math.min(requiredArgsCnt, this.arity); + for (var i = 0; i < len; i++) { + if (!this.params[i].name && !this.params[i].variadic) { + if (args[i].value.eval(context).toCSS() != this.params[i].value.eval(context).toCSS()) { + return false; + } + } + } + return true; + }; + return Definition; + }(Ruleset)); + Definition.prototype.type = 'MixinDefinition'; + Definition.prototype.evalFirst = true; - var logger = { - error: function (msg) { - this._fireEvent('error', msg); - }, - warn: function (msg) { - this._fireEvent('warn', msg); - }, - info: function (msg) { - this._fireEvent('info', msg); - }, - debug: function (msg) { - this._fireEvent('debug', msg); - }, - addListener: function (listener) { - this._listeners.push(listener); - }, - removeListener: function (listener) { - for (var i = 0; i < this._listeners.length; i++) { - if (this._listeners[i] === listener) { - this._listeners.splice(i, 1); - return; - } - } - }, - _fireEvent: function (type, msg) { - for (var i = 0; i < this._listeners.length; i++) { - var logFunction = this._listeners[i][type]; - if (logFunction) { - logFunction(msg); - } - } - }, - _listeners: [] - }; + var MixinCall = /** @class */ (function (_super) { + __extends(MixinCall, _super); + function MixinCall(elements, args, index, currentFileInfo, important) { + var _this = _super.call(this) || this; + _this.selector = new Selector(elements); + _this.arguments = args || []; + _this._index = index; + _this._fileInfo = currentFileInfo; + _this.important = important; + _this.allowRoot = true; + _this.setParent(_this.selector, _this); + return _this; + } + MixinCall.prototype.accept = function (visitor) { + if (this.selector) { + this.selector = visitor.visit(this.selector); + } + if (this.arguments.length) { + this.arguments = visitor.visitArray(this.arguments); + } + }; + MixinCall.prototype.eval = function (context) { + var mixins; + var mixin; + var mixinPath; + var args = []; + var arg; + var argValue; + var rules = []; + var match = false; + var i; + var m; + var f; + var isRecursive; + var isOneFound; + var candidates = []; + var candidate; + var conditionResult = []; + var defaultResult; + var defFalseEitherCase = -1; + var defNone = 0; + var defTrue = 1; + var defFalse = 2; + var count; + var originalRuleset; + var noArgumentsFilter; + this.selector = this.selector.eval(context); + function calcDefGroup(mixin, mixinPath) { + var f, p, namespace; + for (f = 0; f < 2; f++) { + conditionResult[f] = true; + defaultFunc.value(f); + for (p = 0; p < mixinPath.length && conditionResult[f]; p++) { + namespace = mixinPath[p]; + if (namespace.matchCondition) { + conditionResult[f] = conditionResult[f] && namespace.matchCondition(null, context); + } + } + if (mixin.matchCondition) { + conditionResult[f] = conditionResult[f] && mixin.matchCondition(args, context); + } + } + if (conditionResult[0] || conditionResult[1]) { + if (conditionResult[0] != conditionResult[1]) { + return conditionResult[1] ? + defTrue : defFalse; + } + return defNone; + } + return defFalseEitherCase; + } + for (i = 0; i < this.arguments.length; i++) { + arg = this.arguments[i]; + argValue = arg.value.eval(context); + if (arg.expand && Array.isArray(argValue.value)) { + argValue = argValue.value; + for (m = 0; m < argValue.length; m++) { + args.push({ value: argValue[m] }); + } + } + else { + args.push({ name: arg.name, value: argValue }); + } + } + noArgumentsFilter = function (rule) { return rule.matchArgs(null, context); }; + for (i = 0; i < context.frames.length; i++) { + if ((mixins = context.frames[i].find(this.selector, null, noArgumentsFilter)).length > 0) { + isOneFound = true; + // To make `default()` function independent of definition order we have two "subpasses" here. + // At first we evaluate each guard *twice* (with `default() == true` and `default() == false`), + // and build candidate list with corresponding flags. Then, when we know all possible matches, + // we make a final decision. + for (m = 0; m < mixins.length; m++) { + mixin = mixins[m].rule; + mixinPath = mixins[m].path; + isRecursive = false; + for (f = 0; f < context.frames.length; f++) { + if ((!(mixin instanceof Definition)) && mixin === (context.frames[f].originalRuleset || context.frames[f])) { + isRecursive = true; + break; + } + } + if (isRecursive) { + continue; + } + if (mixin.matchArgs(args, context)) { + candidate = { mixin: mixin, group: calcDefGroup(mixin, mixinPath) }; + if (candidate.group !== defFalseEitherCase) { + candidates.push(candidate); + } + match = true; + } + } + defaultFunc.reset(); + count = [0, 0, 0]; + for (m = 0; m < candidates.length; m++) { + count[candidates[m].group]++; + } + if (count[defNone] > 0) { + defaultResult = defFalse; + } + else { + defaultResult = defTrue; + if ((count[defTrue] + count[defFalse]) > 1) { + throw { type: 'Runtime', message: "Ambiguous use of `default()` found when matching for `" + this.format(args) + "`", index: this.getIndex(), filename: this.fileInfo().filename }; + } + } + for (m = 0; m < candidates.length; m++) { + candidate = candidates[m].group; + if ((candidate === defNone) || (candidate === defaultResult)) { + try { + mixin = candidates[m].mixin; + if (!(mixin instanceof Definition)) { + originalRuleset = mixin.originalRuleset || mixin; + mixin = new Definition('', [], mixin.rules, null, false, null, originalRuleset.visibilityInfo()); + mixin.originalRuleset = originalRuleset; + } + var newRules = mixin.evalCall(context, args, this.important).rules; + this._setVisibilityToReplacement(newRules); + Array.prototype.push.apply(rules, newRules); + } + catch (e) { + throw { message: e.message, index: this.getIndex(), filename: this.fileInfo().filename, stack: e.stack }; + } + } + } + if (match) { + return rules; + } + } + } + if (isOneFound) { + throw { type: 'Runtime', message: "No matching definition was found for `" + this.format(args) + "`", index: this.getIndex(), filename: this.fileInfo().filename }; + } + else { + throw { type: 'Name', message: this.selector.toCSS().trim() + " is undefined", index: this.getIndex(), filename: this.fileInfo().filename }; + } + }; + MixinCall.prototype._setVisibilityToReplacement = function (replacement) { + var i, rule; + if (this.blocksVisibility()) { + for (i = 0; i < replacement.length; i++) { + rule = replacement[i]; + rule.addVisibilityBlock(); + } + } + }; + MixinCall.prototype.format = function (args) { + return this.selector.toCSS().trim() + "(" + (args ? args.map(function (a) { + var argValue = ''; + if (a.name) { + argValue += a.name + ":"; + } + if (a.value.toCSS) { + argValue += a.value.toCSS(); + } + else { + argValue += '???'; + } + return argValue; + }).join(', ') : '') + ")"; + }; + return MixinCall; + }(Node)); + MixinCall.prototype.type = 'MixinCall'; - /** - * @todo Document why this abstraction exists, and the relationship between - * environment, file managers, and plugin manager - */ - var environment = /** @class */ (function () { - function environment(externalEnvironment, fileManagers) { - this.fileManagers = fileManagers || []; - externalEnvironment = externalEnvironment || {}; - var optionalFunctions = ['encodeBase64', 'mimeLookup', 'charsetLookup', 'getSourceMapGenerator']; - var requiredFunctions = []; - var functions = requiredFunctions.concat(optionalFunctions); - for (var i = 0; i < functions.length; i++) { - var propName = functions[i]; - var environmentFunc = externalEnvironment[propName]; - if (environmentFunc) { - this[propName] = environmentFunc.bind(externalEnvironment); - } - else if (i < requiredFunctions.length) { - this.warn("missing required function in environment - " + propName); - } - } - } - environment.prototype.getFileManager = function (filename, currentDirectory, options, environment, isSync) { - if (!filename) { - logger.warn('getFileManager called with no filename.. Please report this issue. continuing.'); - } - if (currentDirectory == null) { - logger.warn('getFileManager called with null directory.. Please report this issue. continuing.'); - } - var fileManagers = this.fileManagers; - if (options.pluginManager) { - fileManagers = [].concat(fileManagers).concat(options.pluginManager.getFileManagers()); - } - for (var i = fileManagers.length - 1; i >= 0; i--) { - var fileManager = fileManagers[i]; - if (fileManager[isSync ? 'supportsSync' : 'supports'](filename, currentDirectory, options, environment)) { - return fileManager; - } - } - return null; - }; - environment.prototype.addFileManager = function (fileManager) { - this.fileManagers.push(fileManager); - }; - environment.prototype.clearFileManagers = function () { - this.fileManagers = []; - }; - return environment; - }()); + var tree = { + Node: Node, Color: Color, AtRule: AtRule, DetachedRuleset: DetachedRuleset, Operation: Operation, + Dimension: Dimension, Unit: Unit, Keyword: Keyword, Variable: Variable, Property: Property, + Ruleset: Ruleset, Element: Element, Attribute: Attribute, Combinator: Combinator, Selector: Selector, + Quoted: Quoted, Expression: Expression, Declaration: Declaration, Call: Call, URL: URL, Import: Import, + Comment: Comment, Anonymous: Anonymous, Value: Value, JavaScript: JavaScript, Assignment: Assignment, + Condition: Condition, Paren: Paren, Media: Media, UnicodeDescriptor: UnicodeDescriptor, Negative: Negative, + Extend: Extend, VariableCall: VariableCall, NamespaceValue: NamespaceValue, + mixin: { + Call: MixinCall, + Definition: Definition + } + }; - var AbstractFileManager = /** @class */ (function () { - function AbstractFileManager() { - } - AbstractFileManager.prototype.getPath = function (filename) { - var j = filename.lastIndexOf('?'); - if (j > 0) { - filename = filename.slice(0, j); - } - j = filename.lastIndexOf('/'); - if (j < 0) { - j = filename.lastIndexOf('\\'); - } - if (j < 0) { - return ''; - } - return filename.slice(0, j + 1); - }; - AbstractFileManager.prototype.tryAppendExtension = function (path, ext) { - return /(\.[a-z]*$)|([\?;].*)$/.test(path) ? path : path + ext; - }; - AbstractFileManager.prototype.tryAppendLessExtension = function (path) { - return this.tryAppendExtension(path, '.less'); - }; - AbstractFileManager.prototype.supportsSync = function () { return false; }; - AbstractFileManager.prototype.alwaysMakePathsAbsolute = function () { return false; }; - AbstractFileManager.prototype.isPathAbsolute = function (filename) { - return (/^(?:[a-z-]+:|\/|\\|#)/i).test(filename); - }; - // TODO: pull out / replace? - AbstractFileManager.prototype.join = function (basePath, laterPath) { - if (!basePath) { - return laterPath; - } - return basePath + laterPath; - }; - AbstractFileManager.prototype.pathDiff = function (url, baseUrl) { - // diff between two paths to create a relative path - var urlParts = this.extractUrlParts(url); - var baseUrlParts = this.extractUrlParts(baseUrl); - var i; - var max; - var urlDirectories; - var baseUrlDirectories; - var diff = ''; - if (urlParts.hostPart !== baseUrlParts.hostPart) { - return ''; - } - max = Math.max(baseUrlParts.directories.length, urlParts.directories.length); - for (i = 0; i < max; i++) { - if (baseUrlParts.directories[i] !== urlParts.directories[i]) { - break; - } - } - baseUrlDirectories = baseUrlParts.directories.slice(i); - urlDirectories = urlParts.directories.slice(i); - for (i = 0; i < baseUrlDirectories.length - 1; i++) { - diff += '../'; - } - for (i = 0; i < urlDirectories.length - 1; i++) { - diff += urlDirectories[i] + "/"; - } - return diff; - }; - // helper function, not part of API - AbstractFileManager.prototype.extractUrlParts = function (url, baseUrl) { - // urlParts[1] = protocol://hostname/ OR / - // urlParts[2] = / if path relative to host base - // urlParts[3] = directories - // urlParts[4] = filename - // urlParts[5] = parameters - var urlPartsRegex = /^((?:[a-z-]+:)?\/{2}(?:[^\/\?#]*\/)|([\/\\]))?((?:[^\/\\\?#]*[\/\\])*)([^\/\\\?#]*)([#\?].*)?$/i; - var urlParts = url.match(urlPartsRegex); - var returner = {}; - var rawDirectories = []; - var directories = []; - var i; - var baseUrlParts; - if (!urlParts) { - throw new Error("Could not parse sheet href - '" + url + "'"); - } - // Stylesheets in IE don't always return the full path - if (baseUrl && (!urlParts[1] || urlParts[2])) { - baseUrlParts = baseUrl.match(urlPartsRegex); - if (!baseUrlParts) { - throw new Error("Could not parse page url - '" + baseUrl + "'"); - } - urlParts[1] = urlParts[1] || baseUrlParts[1] || ''; - if (!urlParts[2]) { - urlParts[3] = baseUrlParts[3] + urlParts[3]; - } - } - if (urlParts[3]) { - rawDirectories = urlParts[3].replace(/\\/g, '/').split('/'); - // collapse '..' and skip '.' - for (i = 0; i < rawDirectories.length; i++) { - if (rawDirectories[i] === '..') { - directories.pop(); - } - else if (rawDirectories[i] !== '.') { - directories.push(rawDirectories[i]); - } - } - } - returner.hostPart = urlParts[1]; - returner.directories = directories; - returner.rawPath = (urlParts[1] || '') + rawDirectories.join('/'); - returner.path = (urlParts[1] || '') + directories.join('/'); - returner.filename = urlParts[4]; - returner.fileUrl = returner.path + (urlParts[4] || ''); - returner.url = returner.fileUrl + (urlParts[5] || ''); - return returner; - }; - return AbstractFileManager; - }()); + var AbstractFileManager = /** @class */ (function () { + function AbstractFileManager() { + } + AbstractFileManager.prototype.getPath = function (filename) { + var j = filename.lastIndexOf('?'); + if (j > 0) { + filename = filename.slice(0, j); + } + j = filename.lastIndexOf('/'); + if (j < 0) { + j = filename.lastIndexOf('\\'); + } + if (j < 0) { + return ''; + } + return filename.slice(0, j + 1); + }; + AbstractFileManager.prototype.tryAppendExtension = function (path, ext) { + return /(\.[a-z]*$)|([\?;].*)$/.test(path) ? path : path + ext; + }; + AbstractFileManager.prototype.tryAppendLessExtension = function (path) { + return this.tryAppendExtension(path, '.less'); + }; + AbstractFileManager.prototype.supportsSync = function () { + return false; + }; + AbstractFileManager.prototype.alwaysMakePathsAbsolute = function () { + return false; + }; + AbstractFileManager.prototype.isPathAbsolute = function (filename) { + return (/^(?:[a-z-]+:|\/|\\|#)/i).test(filename); + }; + // TODO: pull out / replace? + AbstractFileManager.prototype.join = function (basePath, laterPath) { + if (!basePath) { + return laterPath; + } + return basePath + laterPath; + }; + AbstractFileManager.prototype.pathDiff = function (url, baseUrl) { + // diff between two paths to create a relative path + var urlParts = this.extractUrlParts(url); + var baseUrlParts = this.extractUrlParts(baseUrl); + var i; + var max; + var urlDirectories; + var baseUrlDirectories; + var diff = ''; + if (urlParts.hostPart !== baseUrlParts.hostPart) { + return ''; + } + max = Math.max(baseUrlParts.directories.length, urlParts.directories.length); + for (i = 0; i < max; i++) { + if (baseUrlParts.directories[i] !== urlParts.directories[i]) { + break; + } + } + baseUrlDirectories = baseUrlParts.directories.slice(i); + urlDirectories = urlParts.directories.slice(i); + for (i = 0; i < baseUrlDirectories.length - 1; i++) { + diff += '../'; + } + for (i = 0; i < urlDirectories.length - 1; i++) { + diff += urlDirectories[i] + "/"; + } + return diff; + }; + // helper function, not part of API + AbstractFileManager.prototype.extractUrlParts = function (url, baseUrl) { + // urlParts[1] = protocol://hostname/ OR / + // urlParts[2] = / if path relative to host base + // urlParts[3] = directories + // urlParts[4] = filename + // urlParts[5] = parameters + var urlPartsRegex = /^((?:[a-z-]+:)?\/{2}(?:[^\/\?#]*\/)|([\/\\]))?((?:[^\/\\\?#]*[\/\\])*)([^\/\\\?#]*)([#\?].*)?$/i; + var urlParts = url.match(urlPartsRegex); + var returner = {}; + var rawDirectories = []; + var directories = []; + var i; + var baseUrlParts; + if (!urlParts) { + throw new Error("Could not parse sheet href - '" + url + "'"); + } + // Stylesheets in IE don't always return the full path + if (baseUrl && (!urlParts[1] || urlParts[2])) { + baseUrlParts = baseUrl.match(urlPartsRegex); + if (!baseUrlParts) { + throw new Error("Could not parse page url - '" + baseUrl + "'"); + } + urlParts[1] = urlParts[1] || baseUrlParts[1] || ''; + if (!urlParts[2]) { + urlParts[3] = baseUrlParts[3] + urlParts[3]; + } + } + if (urlParts[3]) { + rawDirectories = urlParts[3].replace(/\\/g, '/').split('/'); + // collapse '..' and skip '.' + for (i = 0; i < rawDirectories.length; i++) { + if (rawDirectories[i] === '..') { + directories.pop(); + } + else if (rawDirectories[i] !== '.') { + directories.push(rawDirectories[i]); + } + } + } + returner.hostPart = urlParts[1]; + returner.directories = directories; + returner.rawPath = (urlParts[1] || '') + rawDirectories.join('/'); + returner.path = (urlParts[1] || '') + directories.join('/'); + returner.filename = urlParts[4]; + returner.fileUrl = returner.path + (urlParts[4] || ''); + returner.url = returner.fileUrl + (urlParts[5] || ''); + return returner; + }; + return AbstractFileManager; + }()); - var AbstractPluginLoader = /** @class */ (function () { - function AbstractPluginLoader() { - // Implemented by Node.js plugin loader - this.require = function () { return null; }; - } - AbstractPluginLoader.prototype.evalPlugin = function (contents, context, imports, pluginOptions, fileInfo) { - var loader; - var registry; - var pluginObj; - var localModule; - var pluginManager; - var filename; - var result; - pluginManager = context.pluginManager; - if (fileInfo) { - if (typeof fileInfo === 'string') { - filename = fileInfo; - } - else { - filename = fileInfo.filename; - } - } - var shortname = (new this.less.FileManager()).extractUrlParts(filename).filename; - if (filename) { - pluginObj = pluginManager.get(filename); - if (pluginObj) { - result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions); - if (result) { - return result; - } - try { - if (pluginObj.use) { - pluginObj.use.call(this.context, pluginObj); - } - } - catch (e) { - e.message = e.message || 'Error during @plugin call'; - return new LessError(e, imports, filename); - } - return pluginObj; - } - } - localModule = { - exports: {}, - pluginManager: pluginManager, - fileInfo: fileInfo - }; - registry = functionRegistry.create(); - var registerPlugin = function (obj) { - pluginObj = obj; - }; - try { - loader = new Function('module', 'require', 'registerPlugin', 'functions', 'tree', 'less', 'fileInfo', contents); - loader(localModule, this.require(filename), registerPlugin, registry, this.less.tree, this.less, fileInfo); - } - catch (e) { - return new LessError(e, imports, filename); - } - if (!pluginObj) { - pluginObj = localModule.exports; - } - pluginObj = this.validatePlugin(pluginObj, filename, shortname); - if (pluginObj instanceof LessError) { - return pluginObj; - } - if (pluginObj) { - pluginObj.imports = imports; - pluginObj.filename = filename; - // For < 3.x (or unspecified minVersion) - setOptions() before install() - if (!pluginObj.minVersion || this.compareVersion('3.0.0', pluginObj.minVersion) < 0) { - result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions); - if (result) { - return result; - } - } - // Run on first load - pluginManager.addPlugin(pluginObj, fileInfo.filename, registry); - pluginObj.functions = registry.getLocalFunctions(); - // Need to call setOptions again because the pluginObj might have functions - result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions); - if (result) { - return result; - } - // Run every @plugin call - try { - if (pluginObj.use) { - pluginObj.use.call(this.context, pluginObj); - } - } - catch (e) { - e.message = e.message || 'Error during @plugin call'; - return new LessError(e, imports, filename); - } - } - else { - return new LessError({ message: 'Not a valid plugin' }, imports, filename); - } - return pluginObj; - }; - AbstractPluginLoader.prototype.trySetOptions = function (plugin, filename, name, options) { - if (options && !plugin.setOptions) { - return new LessError({ - message: "Options have been provided but the plugin " + name + " does not support any options." - }); - } - try { - plugin.setOptions && plugin.setOptions(options); - } - catch (e) { - return new LessError(e); - } - }; - AbstractPluginLoader.prototype.validatePlugin = function (plugin, filename, name) { - if (plugin) { - // support plugins being a function - // so that the plugin can be more usable programmatically - if (typeof plugin === 'function') { - plugin = new plugin(); - } - if (plugin.minVersion) { - if (this.compareVersion(plugin.minVersion, this.less.version) < 0) { - return new LessError({ - message: "Plugin " + name + " requires version " + this.versionToString(plugin.minVersion) - }); - } - } - return plugin; - } - return null; - }; - AbstractPluginLoader.prototype.compareVersion = function (aVersion, bVersion) { - if (typeof aVersion === 'string') { - aVersion = aVersion.match(/^(\d+)\.?(\d+)?\.?(\d+)?/); - aVersion.shift(); - } - for (var i = 0; i < aVersion.length; i++) { - if (aVersion[i] !== bVersion[i]) { - return parseInt(aVersion[i]) > parseInt(bVersion[i]) ? -1 : 1; - } - } - return 0; - }; - AbstractPluginLoader.prototype.versionToString = function (version) { - var versionString = ''; - for (var i = 0; i < version.length; i++) { - versionString += (versionString ? '.' : '') + version[i]; - } - return versionString; - }; - AbstractPluginLoader.prototype.printUsage = function (plugins) { - for (var i = 0; i < plugins.length; i++) { - var plugin = plugins[i]; - if (plugin.printUsage) { - plugin.printUsage(); - } - } - }; - return AbstractPluginLoader; - }()); + var AbstractPluginLoader = /** @class */ (function () { + function AbstractPluginLoader() { + // Implemented by Node.js plugin loader + this.require = function () { + return null; + }; + } + AbstractPluginLoader.prototype.evalPlugin = function (contents, context, imports, pluginOptions, fileInfo) { + var loader, registry, pluginObj, localModule, pluginManager, filename, result; + pluginManager = context.pluginManager; + if (fileInfo) { + if (typeof fileInfo === 'string') { + filename = fileInfo; + } + else { + filename = fileInfo.filename; + } + } + var shortname = (new this.less.FileManager()).extractUrlParts(filename).filename; + if (filename) { + pluginObj = pluginManager.get(filename); + if (pluginObj) { + result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions); + if (result) { + return result; + } + try { + if (pluginObj.use) { + pluginObj.use.call(this.context, pluginObj); + } + } + catch (e) { + e.message = e.message || 'Error during @plugin call'; + return new LessError(e, imports, filename); + } + return pluginObj; + } + } + localModule = { + exports: {}, + pluginManager: pluginManager, + fileInfo: fileInfo + }; + registry = functionRegistry.create(); + var registerPlugin = function (obj) { + pluginObj = obj; + }; + try { + loader = new Function('module', 'require', 'registerPlugin', 'functions', 'tree', 'less', 'fileInfo', contents); + loader(localModule, this.require(filename), registerPlugin, registry, this.less.tree, this.less, fileInfo); + } + catch (e) { + return new LessError(e, imports, filename); + } + if (!pluginObj) { + pluginObj = localModule.exports; + } + pluginObj = this.validatePlugin(pluginObj, filename, shortname); + if (pluginObj instanceof LessError) { + return pluginObj; + } + if (pluginObj) { + pluginObj.imports = imports; + pluginObj.filename = filename; + // For < 3.x (or unspecified minVersion) - setOptions() before install() + if (!pluginObj.minVersion || this.compareVersion('3.0.0', pluginObj.minVersion) < 0) { + result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions); + if (result) { + return result; + } + } + // Run on first load + pluginManager.addPlugin(pluginObj, fileInfo.filename, registry); + pluginObj.functions = registry.getLocalFunctions(); + // Need to call setOptions again because the pluginObj might have functions + result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions); + if (result) { + return result; + } + // Run every @plugin call + try { + if (pluginObj.use) { + pluginObj.use.call(this.context, pluginObj); + } + } + catch (e) { + e.message = e.message || 'Error during @plugin call'; + return new LessError(e, imports, filename); + } + } + else { + return new LessError({ message: 'Not a valid plugin' }, imports, filename); + } + return pluginObj; + }; + AbstractPluginLoader.prototype.trySetOptions = function (plugin, filename, name, options) { + if (options && !plugin.setOptions) { + return new LessError({ + message: "Options have been provided but the plugin " + name + " does not support any options." + }); + } + try { + plugin.setOptions && plugin.setOptions(options); + } + catch (e) { + return new LessError(e); + } + }; + AbstractPluginLoader.prototype.validatePlugin = function (plugin, filename, name) { + if (plugin) { + // support plugins being a function + // so that the plugin can be more usable programmatically + if (typeof plugin === 'function') { + plugin = new plugin(); + } + if (plugin.minVersion) { + if (this.compareVersion(plugin.minVersion, this.less.version) < 0) { + return new LessError({ + message: "Plugin " + name + " requires version " + this.versionToString(plugin.minVersion) + }); + } + } + return plugin; + } + return null; + }; + AbstractPluginLoader.prototype.compareVersion = function (aVersion, bVersion) { + if (typeof aVersion === 'string') { + aVersion = aVersion.match(/^(\d+)\.?(\d+)?\.?(\d+)?/); + aVersion.shift(); + } + for (var i = 0; i < aVersion.length; i++) { + if (aVersion[i] !== bVersion[i]) { + return parseInt(aVersion[i]) > parseInt(bVersion[i]) ? -1 : 1; + } + } + return 0; + }; + AbstractPluginLoader.prototype.versionToString = function (version) { + var versionString = ''; + for (var i = 0; i < version.length; i++) { + versionString += (versionString ? '.' : '') + version[i]; + } + return versionString; + }; + AbstractPluginLoader.prototype.printUsage = function (plugins) { + for (var i = 0; i < plugins.length; i++) { + var plugin = plugins[i]; + if (plugin.printUsage) { + plugin.printUsage(); + } + } + }; + return AbstractPluginLoader; + }()); - var _visitArgs = { visitDeeper: true }; - var _hasIndexed = false; - function _noop(node) { - return node; - } - function indexNodeTypes(parent, ticker) { - // add .typeIndex to tree node types for lookup table - var key; - var child; - for (key in parent) { - /* eslint guard-for-in: 0 */ - child = parent[key]; - switch (typeof child) { - case 'function': - // ignore bound functions directly on tree which do not have a prototype - // or aren't nodes - if (child.prototype && child.prototype.type) { - child.prototype.typeIndex = ticker++; - } - break; - case 'object': - ticker = indexNodeTypes(child, ticker); - break; - } - } - return ticker; - } - var Visitor = /** @class */ (function () { - function Visitor(implementation) { - this._implementation = implementation; - this._visitInCache = {}; - this._visitOutCache = {}; - if (!_hasIndexed) { - indexNodeTypes(tree, 1); - _hasIndexed = true; - } - } - Visitor.prototype.visit = function (node) { - if (!node) { - return node; - } - var nodeTypeIndex = node.typeIndex; - if (!nodeTypeIndex) { - // MixinCall args aren't a node type? - if (node.value && node.value.typeIndex) { - this.visit(node.value); - } - return node; - } - var impl = this._implementation; - var func = this._visitInCache[nodeTypeIndex]; - var funcOut = this._visitOutCache[nodeTypeIndex]; - var visitArgs = _visitArgs; - var fnName; - visitArgs.visitDeeper = true; - if (!func) { - fnName = "visit" + node.type; - func = impl[fnName] || _noop; - funcOut = impl[fnName + "Out"] || _noop; - this._visitInCache[nodeTypeIndex] = func; - this._visitOutCache[nodeTypeIndex] = funcOut; - } - if (func !== _noop) { - var newNode = func.call(impl, node, visitArgs); - if (node && impl.isReplacing) { - node = newNode; - } - } - if (visitArgs.visitDeeper && node) { - if (node.length) { - for (var i = 0, cnt = node.length; i < cnt; i++) { - if (node[i].accept) { - node[i].accept(this); - } - } - } - else if (node.accept) { - node.accept(this); - } - } - if (funcOut != _noop) { - funcOut.call(impl, node); - } - return node; - }; - Visitor.prototype.visitArray = function (nodes, nonReplacing) { - if (!nodes) { - return nodes; - } - var cnt = nodes.length; - var i; - // Non-replacing - if (nonReplacing || !this._implementation.isReplacing) { - for (i = 0; i < cnt; i++) { - this.visit(nodes[i]); - } - return nodes; - } - // Replacing - var out = []; - for (i = 0; i < cnt; i++) { - var evald = this.visit(nodes[i]); - if (evald === undefined) { - continue; - } - if (!evald.splice) { - out.push(evald); - } - else if (evald.length) { - this.flatten(evald, out); - } - } - return out; - }; - Visitor.prototype.flatten = function (arr, out) { - if (!out) { - out = []; - } - var cnt; - var i; - var item; - var nestedCnt; - var j; - var nestedItem; - for (i = 0, cnt = arr.length; i < cnt; i++) { - item = arr[i]; - if (item === undefined) { - continue; - } - if (!item.splice) { - out.push(item); - continue; - } - for (j = 0, nestedCnt = item.length; j < nestedCnt; j++) { - nestedItem = item[j]; - if (nestedItem === undefined) { - continue; - } - if (!nestedItem.splice) { - out.push(nestedItem); - } - else if (nestedItem.length) { - this.flatten(nestedItem, out); - } - } - } - return out; - }; - return Visitor; - }()); + var _visitArgs = { visitDeeper: true }; + var _hasIndexed = false; + function _noop(node) { + return node; + } + function indexNodeTypes(parent, ticker) { + // add .typeIndex to tree node types for lookup table + var key, child; + for (key in parent) { + /* eslint guard-for-in: 0 */ + child = parent[key]; + switch (typeof child) { + case 'function': + // ignore bound functions directly on tree which do not have a prototype + // or aren't nodes + if (child.prototype && child.prototype.type) { + child.prototype.typeIndex = ticker++; + } + break; + case 'object': + ticker = indexNodeTypes(child, ticker); + break; + } + } + return ticker; + } + var Visitor = /** @class */ (function () { + function Visitor(implementation) { + this._implementation = implementation; + this._visitInCache = {}; + this._visitOutCache = {}; + if (!_hasIndexed) { + indexNodeTypes(tree, 1); + _hasIndexed = true; + } + } + Visitor.prototype.visit = function (node) { + if (!node) { + return node; + } + var nodeTypeIndex = node.typeIndex; + if (!nodeTypeIndex) { + // MixinCall args aren't a node type? + if (node.value && node.value.typeIndex) { + this.visit(node.value); + } + return node; + } + var impl = this._implementation; + var func = this._visitInCache[nodeTypeIndex]; + var funcOut = this._visitOutCache[nodeTypeIndex]; + var visitArgs = _visitArgs; + var fnName; + visitArgs.visitDeeper = true; + if (!func) { + fnName = "visit" + node.type; + func = impl[fnName] || _noop; + funcOut = impl[fnName + "Out"] || _noop; + this._visitInCache[nodeTypeIndex] = func; + this._visitOutCache[nodeTypeIndex] = funcOut; + } + if (func !== _noop) { + var newNode = func.call(impl, node, visitArgs); + if (node && impl.isReplacing) { + node = newNode; + } + } + if (visitArgs.visitDeeper && node) { + if (node.length) { + for (var i = 0, cnt = node.length; i < cnt; i++) { + if (node[i].accept) { + node[i].accept(this); + } + } + } + else if (node.accept) { + node.accept(this); + } + } + if (funcOut != _noop) { + funcOut.call(impl, node); + } + return node; + }; + Visitor.prototype.visitArray = function (nodes, nonReplacing) { + if (!nodes) { + return nodes; + } + var cnt = nodes.length; + var i; + // Non-replacing + if (nonReplacing || !this._implementation.isReplacing) { + for (i = 0; i < cnt; i++) { + this.visit(nodes[i]); + } + return nodes; + } + // Replacing + var out = []; + for (i = 0; i < cnt; i++) { + var evald = this.visit(nodes[i]); + if (evald === undefined) { + continue; + } + if (!evald.splice) { + out.push(evald); + } + else if (evald.length) { + this.flatten(evald, out); + } + } + return out; + }; + Visitor.prototype.flatten = function (arr, out) { + if (!out) { + out = []; + } + var cnt, i, item, nestedCnt, j, nestedItem; + for (i = 0, cnt = arr.length; i < cnt; i++) { + item = arr[i]; + if (item === undefined) { + continue; + } + if (!item.splice) { + out.push(item); + continue; + } + for (j = 0, nestedCnt = item.length; j < nestedCnt; j++) { + nestedItem = item[j]; + if (nestedItem === undefined) { + continue; + } + if (!nestedItem.splice) { + out.push(nestedItem); + } + else if (nestedItem.length) { + this.flatten(nestedItem, out); + } + } + } + return out; + }; + return Visitor; + }()); - var ImportSequencer = /** @class */ (function () { - function ImportSequencer(onSequencerEmpty) { - this.imports = []; - this.variableImports = []; - this._onSequencerEmpty = onSequencerEmpty; - this._currentDepth = 0; - } - ImportSequencer.prototype.addImport = function (callback) { - var importSequencer = this; - var importItem = { - callback: callback, - args: null, - isReady: false - }; - this.imports.push(importItem); - return function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } - importItem.args = Array.prototype.slice.call(args, 0); - importItem.isReady = true; - importSequencer.tryRun(); - }; - }; - ImportSequencer.prototype.addVariableImport = function (callback) { - this.variableImports.push(callback); - }; - ImportSequencer.prototype.tryRun = function () { - this._currentDepth++; - try { - while (true) { - while (this.imports.length > 0) { - var importItem = this.imports[0]; - if (!importItem.isReady) { - return; - } - this.imports = this.imports.slice(1); - importItem.callback.apply(null, importItem.args); - } - if (this.variableImports.length === 0) { - break; - } - var variableImport = this.variableImports[0]; - this.variableImports = this.variableImports.slice(1); - variableImport(); - } - } - finally { - this._currentDepth--; - } - if (this._currentDepth === 0 && this._onSequencerEmpty) { - this._onSequencerEmpty(); - } - }; - return ImportSequencer; - }()); + var ImportSequencer = /** @class */ (function () { + function ImportSequencer(onSequencerEmpty) { + this.imports = []; + this.variableImports = []; + this._onSequencerEmpty = onSequencerEmpty; + this._currentDepth = 0; + } + ImportSequencer.prototype.addImport = function (callback) { + var importSequencer = this, importItem = { + callback: callback, + args: null, + isReady: false + }; + this.imports.push(importItem); + return function () { + importItem.args = Array.prototype.slice.call(arguments, 0); + importItem.isReady = true; + importSequencer.tryRun(); + }; + }; + ImportSequencer.prototype.addVariableImport = function (callback) { + this.variableImports.push(callback); + }; + ImportSequencer.prototype.tryRun = function () { + this._currentDepth++; + try { + while (true) { + while (this.imports.length > 0) { + var importItem = this.imports[0]; + if (!importItem.isReady) { + return; + } + this.imports = this.imports.slice(1); + importItem.callback.apply(null, importItem.args); + } + if (this.variableImports.length === 0) { + break; + } + var variableImport = this.variableImports[0]; + this.variableImports = this.variableImports.slice(1); + variableImport(); + } + } + finally { + this._currentDepth--; + } + if (this._currentDepth === 0 && this._onSequencerEmpty) { + this._onSequencerEmpty(); + } + }; + return ImportSequencer; + }()); - var ImportVisitor = function (importer, finish) { - this._visitor = new Visitor(this); - this._importer = importer; - this._finish = finish; - this.context = new contexts.Eval(); - this.importCount = 0; - this.onceFileDetectionMap = {}; - this.recursionDetector = {}; - this._sequencer = new ImportSequencer(this._onSequencerEmpty.bind(this)); - }; - ImportVisitor.prototype = { - isReplacing: false, - run: function (root) { - try { - // process the contents - this._visitor.visit(root); - } - catch (e) { - this.error = e; - } - this.isFinished = true; - this._sequencer.tryRun(); - }, - _onSequencerEmpty: function () { - if (!this.isFinished) { - return; - } - this._finish(this.error); - }, - visitImport: function (importNode, visitArgs) { - var inlineCSS = importNode.options.inline; - if (!importNode.css || inlineCSS) { - var context = new contexts.Eval(this.context, copyArray(this.context.frames)); - var importParent = context.frames[0]; - this.importCount++; - if (importNode.isVariableImport()) { - this._sequencer.addVariableImport(this.processImportNode.bind(this, importNode, context, importParent)); - } - else { - this.processImportNode(importNode, context, importParent); - } - } - visitArgs.visitDeeper = false; - }, - processImportNode: function (importNode, context, importParent) { - var evaldImportNode; - var inlineCSS = importNode.options.inline; - try { - evaldImportNode = importNode.evalForImport(context); - } - catch (e) { - if (!e.filename) { - e.index = importNode.getIndex(); - e.filename = importNode.fileInfo().filename; - } - // attempt to eval properly and treat as css - importNode.css = true; - // if that fails, this error will be thrown - importNode.error = e; - } - if (evaldImportNode && (!evaldImportNode.css || inlineCSS)) { - if (evaldImportNode.options.multiple) { - context.importMultiple = true; - } - // try appending if we haven't determined if it is css or not - var tryAppendLessExtension = evaldImportNode.css === undefined; - for (var i = 0; i < importParent.rules.length; i++) { - if (importParent.rules[i] === importNode) { - importParent.rules[i] = evaldImportNode; - break; - } - } - var onImported = this.onImported.bind(this, evaldImportNode, context); - var sequencedOnImported = this._sequencer.addImport(onImported); - this._importer.push(evaldImportNode.getPath(), tryAppendLessExtension, evaldImportNode.fileInfo(), evaldImportNode.options, sequencedOnImported); - } - else { - this.importCount--; - if (this.isFinished) { - this._sequencer.tryRun(); - } - } - }, - onImported: function (importNode, context, e, root, importedAtRoot, fullPath) { - if (e) { - if (!e.filename) { - e.index = importNode.getIndex(); - e.filename = importNode.fileInfo().filename; - } - this.error = e; - } - var importVisitor = this; - var inlineCSS = importNode.options.inline; - var isPlugin = importNode.options.isPlugin; - var isOptional = importNode.options.optional; - var duplicateImport = importedAtRoot || fullPath in importVisitor.recursionDetector; - if (!context.importMultiple) { - if (duplicateImport) { - importNode.skip = true; - } - else { - importNode.skip = function () { - if (fullPath in importVisitor.onceFileDetectionMap) { - return true; - } - importVisitor.onceFileDetectionMap[fullPath] = true; - return false; - }; - } - } - if (!fullPath && isOptional) { - importNode.skip = true; - } - if (root) { - importNode.root = root; - importNode.importedFilename = fullPath; - if (!inlineCSS && !isPlugin && (context.importMultiple || !duplicateImport)) { - importVisitor.recursionDetector[fullPath] = true; - var oldContext = this.context; - this.context = context; - try { - this._visitor.visit(root); - } - catch (e) { - this.error = e; - } - this.context = oldContext; - } - } - importVisitor.importCount--; - if (importVisitor.isFinished) { - importVisitor._sequencer.tryRun(); - } - }, - visitDeclaration: function (declNode, visitArgs) { - if (declNode.value.type === 'DetachedRuleset') { - this.context.frames.unshift(declNode); - } - else { - visitArgs.visitDeeper = false; - } - }, - visitDeclarationOut: function (declNode) { - if (declNode.value.type === 'DetachedRuleset') { - this.context.frames.shift(); - } - }, - visitAtRule: function (atRuleNode, visitArgs) { - this.context.frames.unshift(atRuleNode); - }, - visitAtRuleOut: function (atRuleNode) { - this.context.frames.shift(); - }, - visitMixinDefinition: function (mixinDefinitionNode, visitArgs) { - this.context.frames.unshift(mixinDefinitionNode); - }, - visitMixinDefinitionOut: function (mixinDefinitionNode) { - this.context.frames.shift(); - }, - visitRuleset: function (rulesetNode, visitArgs) { - this.context.frames.unshift(rulesetNode); - }, - visitRulesetOut: function (rulesetNode) { - this.context.frames.shift(); - }, - visitMedia: function (mediaNode, visitArgs) { - this.context.frames.unshift(mediaNode.rules[0]); - }, - visitMediaOut: function (mediaNode) { - this.context.frames.shift(); - } - }; + var ImportVisitor = function (importer, finish) { + this._visitor = new Visitor(this); + this._importer = importer; + this._finish = finish; + this.context = new contexts.Eval(); + this.importCount = 0; + this.onceFileDetectionMap = {}; + this.recursionDetector = {}; + this._sequencer = new ImportSequencer(this._onSequencerEmpty.bind(this)); + }; + ImportVisitor.prototype = { + isReplacing: false, + run: function (root) { + try { + // process the contents + this._visitor.visit(root); + } + catch (e) { + this.error = e; + } + this.isFinished = true; + this._sequencer.tryRun(); + }, + _onSequencerEmpty: function () { + if (!this.isFinished) { + return; + } + this._finish(this.error); + }, + visitImport: function (importNode, visitArgs) { + var inlineCSS = importNode.options.inline; + if (!importNode.css || inlineCSS) { + var context = new contexts.Eval(this.context, copyArray(this.context.frames)); + var importParent = context.frames[0]; + this.importCount++; + if (importNode.isVariableImport()) { + this._sequencer.addVariableImport(this.processImportNode.bind(this, importNode, context, importParent)); + } + else { + this.processImportNode(importNode, context, importParent); + } + } + visitArgs.visitDeeper = false; + }, + processImportNode: function (importNode, context, importParent) { + var evaldImportNode; + var inlineCSS = importNode.options.inline; + try { + evaldImportNode = importNode.evalForImport(context); + } + catch (e) { + if (!e.filename) { + e.index = importNode.getIndex(); + e.filename = importNode.fileInfo().filename; + } + // attempt to eval properly and treat as css + importNode.css = true; + // if that fails, this error will be thrown + importNode.error = e; + } + if (evaldImportNode && (!evaldImportNode.css || inlineCSS)) { + if (evaldImportNode.options.multiple) { + context.importMultiple = true; + } + // try appending if we haven't determined if it is css or not + var tryAppendLessExtension = evaldImportNode.css === undefined; + for (var i = 0; i < importParent.rules.length; i++) { + if (importParent.rules[i] === importNode) { + importParent.rules[i] = evaldImportNode; + break; + } + } + var onImported = this.onImported.bind(this, evaldImportNode, context), sequencedOnImported = this._sequencer.addImport(onImported); + this._importer.push(evaldImportNode.getPath(), tryAppendLessExtension, evaldImportNode.fileInfo(), evaldImportNode.options, sequencedOnImported); + } + else { + this.importCount--; + if (this.isFinished) { + this._sequencer.tryRun(); + } + } + }, + onImported: function (importNode, context, e, root, importedAtRoot, fullPath) { + if (e) { + if (!e.filename) { + e.index = importNode.getIndex(); + e.filename = importNode.fileInfo().filename; + } + this.error = e; + } + var importVisitor = this, inlineCSS = importNode.options.inline, isPlugin = importNode.options.isPlugin, isOptional = importNode.options.optional, duplicateImport = importedAtRoot || fullPath in importVisitor.recursionDetector; + if (!context.importMultiple) { + if (duplicateImport) { + importNode.skip = true; + } + else { + importNode.skip = function () { + if (fullPath in importVisitor.onceFileDetectionMap) { + return true; + } + importVisitor.onceFileDetectionMap[fullPath] = true; + return false; + }; + } + } + if (!fullPath && isOptional) { + importNode.skip = true; + } + if (root) { + importNode.root = root; + importNode.importedFilename = fullPath; + if (!inlineCSS && !isPlugin && (context.importMultiple || !duplicateImport)) { + importVisitor.recursionDetector[fullPath] = true; + var oldContext = this.context; + this.context = context; + try { + this._visitor.visit(root); + } + catch (e) { + this.error = e; + } + this.context = oldContext; + } + } + importVisitor.importCount--; + if (importVisitor.isFinished) { + importVisitor._sequencer.tryRun(); + } + }, + visitDeclaration: function (declNode, visitArgs) { + if (declNode.value.type === 'DetachedRuleset') { + this.context.frames.unshift(declNode); + } + else { + visitArgs.visitDeeper = false; + } + }, + visitDeclarationOut: function (declNode) { + if (declNode.value.type === 'DetachedRuleset') { + this.context.frames.shift(); + } + }, + visitAtRule: function (atRuleNode, visitArgs) { + this.context.frames.unshift(atRuleNode); + }, + visitAtRuleOut: function (atRuleNode) { + this.context.frames.shift(); + }, + visitMixinDefinition: function (mixinDefinitionNode, visitArgs) { + this.context.frames.unshift(mixinDefinitionNode); + }, + visitMixinDefinitionOut: function (mixinDefinitionNode) { + this.context.frames.shift(); + }, + visitRuleset: function (rulesetNode, visitArgs) { + this.context.frames.unshift(rulesetNode); + }, + visitRulesetOut: function (rulesetNode) { + this.context.frames.shift(); + }, + visitMedia: function (mediaNode, visitArgs) { + this.context.frames.unshift(mediaNode.rules[0]); + }, + visitMediaOut: function (mediaNode) { + this.context.frames.shift(); + } + }; - var SetTreeVisibilityVisitor = /** @class */ (function () { - function SetTreeVisibilityVisitor(visible) { - this.visible = visible; - } - SetTreeVisibilityVisitor.prototype.run = function (root) { - this.visit(root); - }; - SetTreeVisibilityVisitor.prototype.visitArray = function (nodes) { - if (!nodes) { - return nodes; - } - var cnt = nodes.length; - var i; - for (i = 0; i < cnt; i++) { - this.visit(nodes[i]); - } - return nodes; - }; - SetTreeVisibilityVisitor.prototype.visit = function (node) { - if (!node) { - return node; - } - if (node.constructor === Array) { - return this.visitArray(node); - } - if (!node.blocksVisibility || node.blocksVisibility()) { - return node; - } - if (this.visible) { - node.ensureVisibility(); - } - else { - node.ensureInvisibility(); - } - node.accept(this); - return node; - }; - return SetTreeVisibilityVisitor; - }()); + var SetTreeVisibilityVisitor = /** @class */ (function () { + function SetTreeVisibilityVisitor(visible) { + this.visible = visible; + } + SetTreeVisibilityVisitor.prototype.run = function (root) { + this.visit(root); + }; + SetTreeVisibilityVisitor.prototype.visitArray = function (nodes) { + if (!nodes) { + return nodes; + } + var cnt = nodes.length; + var i; + for (i = 0; i < cnt; i++) { + this.visit(nodes[i]); + } + return nodes; + }; + SetTreeVisibilityVisitor.prototype.visit = function (node) { + if (!node) { + return node; + } + if (node.constructor === Array) { + return this.visitArray(node); + } + if (!node.blocksVisibility || node.blocksVisibility()) { + return node; + } + if (this.visible) { + node.ensureVisibility(); + } + else { + node.ensureInvisibility(); + } + node.accept(this); + return node; + }; + return SetTreeVisibilityVisitor; + }()); - /* jshint loopfunc:true */ - var ExtendFinderVisitor = /** @class */ (function () { - function ExtendFinderVisitor() { - this._visitor = new Visitor(this); - this.contexts = []; - this.allExtendsStack = [[]]; - } - ExtendFinderVisitor.prototype.run = function (root) { - root = this._visitor.visit(root); - root.allExtends = this.allExtendsStack[0]; - return root; - }; - ExtendFinderVisitor.prototype.visitDeclaration = function (declNode, visitArgs) { - visitArgs.visitDeeper = false; - }; - ExtendFinderVisitor.prototype.visitMixinDefinition = function (mixinDefinitionNode, visitArgs) { - visitArgs.visitDeeper = false; - }; - ExtendFinderVisitor.prototype.visitRuleset = function (rulesetNode, visitArgs) { - if (rulesetNode.root) { - return; - } - var i; - var j; - var extend; - var allSelectorsExtendList = []; - var extendList; - // get &:extend(.a); rules which apply to all selectors in this ruleset - var rules = rulesetNode.rules; - var ruleCnt = rules ? rules.length : 0; - for (i = 0; i < ruleCnt; i++) { - if (rulesetNode.rules[i] instanceof tree.Extend) { - allSelectorsExtendList.push(rules[i]); - rulesetNode.extendOnEveryPath = true; - } - } - // now find every selector and apply the extends that apply to all extends - // and the ones which apply to an individual extend - var paths = rulesetNode.paths; - for (i = 0; i < paths.length; i++) { - var selectorPath = paths[i]; - var selector = selectorPath[selectorPath.length - 1]; - var selExtendList = selector.extendList; - extendList = selExtendList ? copyArray(selExtendList).concat(allSelectorsExtendList) - : allSelectorsExtendList; - if (extendList) { - extendList = extendList.map(function (allSelectorsExtend) { return allSelectorsExtend.clone(); }); - } - for (j = 0; j < extendList.length; j++) { - this.foundExtends = true; - extend = extendList[j]; - extend.findSelfSelectors(selectorPath); - extend.ruleset = rulesetNode; - if (j === 0) { - extend.firstExtendOnThisSelectorPath = true; - } - this.allExtendsStack[this.allExtendsStack.length - 1].push(extend); - } - } - this.contexts.push(rulesetNode.selectors); - }; - ExtendFinderVisitor.prototype.visitRulesetOut = function (rulesetNode) { - if (!rulesetNode.root) { - this.contexts.length = this.contexts.length - 1; - } - }; - ExtendFinderVisitor.prototype.visitMedia = function (mediaNode, visitArgs) { - mediaNode.allExtends = []; - this.allExtendsStack.push(mediaNode.allExtends); - }; - ExtendFinderVisitor.prototype.visitMediaOut = function (mediaNode) { - this.allExtendsStack.length = this.allExtendsStack.length - 1; - }; - ExtendFinderVisitor.prototype.visitAtRule = function (atRuleNode, visitArgs) { - atRuleNode.allExtends = []; - this.allExtendsStack.push(atRuleNode.allExtends); - }; - ExtendFinderVisitor.prototype.visitAtRuleOut = function (atRuleNode) { - this.allExtendsStack.length = this.allExtendsStack.length - 1; - }; - return ExtendFinderVisitor; - }()); - var ProcessExtendsVisitor = /** @class */ (function () { - function ProcessExtendsVisitor() { - this._visitor = new Visitor(this); - } - ProcessExtendsVisitor.prototype.run = function (root) { - var extendFinder = new ExtendFinderVisitor(); - this.extendIndices = {}; - extendFinder.run(root); - if (!extendFinder.foundExtends) { - return root; - } - root.allExtends = root.allExtends.concat(this.doExtendChaining(root.allExtends, root.allExtends)); - this.allExtendsStack = [root.allExtends]; - var newRoot = this._visitor.visit(root); - this.checkExtendsForNonMatched(root.allExtends); - return newRoot; - }; - ProcessExtendsVisitor.prototype.checkExtendsForNonMatched = function (extendList) { - var indices = this.extendIndices; - extendList.filter(function (extend) { return !extend.hasFoundMatches && extend.parent_ids.length == 1; }).forEach(function (extend) { - var selector = '_unknown_'; - try { - selector = extend.selector.toCSS({}); - } - catch (_) { } - if (!indices[extend.index + " " + selector]) { - indices[extend.index + " " + selector] = true; - logger.warn("extend '" + selector + "' has no matches"); - } - }); - }; - ProcessExtendsVisitor.prototype.doExtendChaining = function (extendsList, extendsListTarget, iterationCount) { - // - // chaining is different from normal extension.. if we extend an extend then we are not just copying, altering - // and pasting the selector we would do normally, but we are also adding an extend with the same target selector - // this means this new extend can then go and alter other extends - // - // this method deals with all the chaining work - without it, extend is flat and doesn't work on other extend selectors - // this is also the most expensive.. and a match on one selector can cause an extension of a selector we had already - // processed if we look at each selector at a time, as is done in visitRuleset - var extendIndex; - var targetExtendIndex; - var matches; - var extendsToAdd = []; - var newSelector; - var extendVisitor = this; - var selectorPath; - var extend; - var targetExtend; - var newExtend; - iterationCount = iterationCount || 0; - // loop through comparing every extend with every target extend. - // a target extend is the one on the ruleset we are looking at copy/edit/pasting in place - // e.g. .a:extend(.b) {} and .b:extend(.c) {} then the first extend extends the second one - // and the second is the target. - // the separation into two lists allows us to process a subset of chains with a bigger set, as is the - // case when processing media queries - for (extendIndex = 0; extendIndex < extendsList.length; extendIndex++) { - for (targetExtendIndex = 0; targetExtendIndex < extendsListTarget.length; targetExtendIndex++) { - extend = extendsList[extendIndex]; - targetExtend = extendsListTarget[targetExtendIndex]; - // look for circular references - if (extend.parent_ids.indexOf(targetExtend.object_id) >= 0) { - continue; - } - // find a match in the target extends self selector (the bit before :extend) - selectorPath = [targetExtend.selfSelectors[0]]; - matches = extendVisitor.findMatch(extend, selectorPath); - if (matches.length) { - extend.hasFoundMatches = true; - // we found a match, so for each self selector.. - extend.selfSelectors.forEach(function (selfSelector) { - var info = targetExtend.visibilityInfo(); - // process the extend as usual - newSelector = extendVisitor.extendSelector(matches, selectorPath, selfSelector, extend.isVisible()); - // but now we create a new extend from it - newExtend = new (tree.Extend)(targetExtend.selector, targetExtend.option, 0, targetExtend.fileInfo(), info); - newExtend.selfSelectors = newSelector; - // add the extend onto the list of extends for that selector - newSelector[newSelector.length - 1].extendList = [newExtend]; - // record that we need to add it. - extendsToAdd.push(newExtend); - newExtend.ruleset = targetExtend.ruleset; - // remember its parents for circular references - newExtend.parent_ids = newExtend.parent_ids.concat(targetExtend.parent_ids, extend.parent_ids); - // only process the selector once.. if we have :extend(.a,.b) then multiple - // extends will look at the same selector path, so when extending - // we know that any others will be duplicates in terms of what is added to the css - if (targetExtend.firstExtendOnThisSelectorPath) { - newExtend.firstExtendOnThisSelectorPath = true; - targetExtend.ruleset.paths.push(newSelector); - } - }); - } - } - } - if (extendsToAdd.length) { - // try to detect circular references to stop a stack overflow. - // may no longer be needed. - this.extendChainCount++; - if (iterationCount > 100) { - var selectorOne = '{unable to calculate}'; - var selectorTwo = '{unable to calculate}'; - try { - selectorOne = extendsToAdd[0].selfSelectors[0].toCSS(); - selectorTwo = extendsToAdd[0].selector.toCSS(); - } - catch (e) { } - throw { message: "extend circular reference detected. One of the circular extends is currently:" + selectorOne + ":extend(" + selectorTwo + ")" }; - } - // now process the new extends on the existing rules so that we can handle a extending b extending c extending - // d extending e... - return extendsToAdd.concat(extendVisitor.doExtendChaining(extendsToAdd, extendsListTarget, iterationCount + 1)); - } - else { - return extendsToAdd; - } - }; - ProcessExtendsVisitor.prototype.visitDeclaration = function (ruleNode, visitArgs) { - visitArgs.visitDeeper = false; - }; - ProcessExtendsVisitor.prototype.visitMixinDefinition = function (mixinDefinitionNode, visitArgs) { - visitArgs.visitDeeper = false; - }; - ProcessExtendsVisitor.prototype.visitSelector = function (selectorNode, visitArgs) { - visitArgs.visitDeeper = false; - }; - ProcessExtendsVisitor.prototype.visitRuleset = function (rulesetNode, visitArgs) { - if (rulesetNode.root) { - return; - } - var matches; - var pathIndex; - var extendIndex; - var allExtends = this.allExtendsStack[this.allExtendsStack.length - 1]; - var selectorsToAdd = []; - var extendVisitor = this; - var selectorPath; - // look at each selector path in the ruleset, find any extend matches and then copy, find and replace - for (extendIndex = 0; extendIndex < allExtends.length; extendIndex++) { - for (pathIndex = 0; pathIndex < rulesetNode.paths.length; pathIndex++) { - selectorPath = rulesetNode.paths[pathIndex]; - // extending extends happens initially, before the main pass - if (rulesetNode.extendOnEveryPath) { - continue; - } - var extendList = selectorPath[selectorPath.length - 1].extendList; - if (extendList && extendList.length) { - continue; - } - matches = this.findMatch(allExtends[extendIndex], selectorPath); - if (matches.length) { - allExtends[extendIndex].hasFoundMatches = true; - allExtends[extendIndex].selfSelectors.forEach(function (selfSelector) { - var extendedSelectors; - extendedSelectors = extendVisitor.extendSelector(matches, selectorPath, selfSelector, allExtends[extendIndex].isVisible()); - selectorsToAdd.push(extendedSelectors); - }); - } - } - } - rulesetNode.paths = rulesetNode.paths.concat(selectorsToAdd); - }; - ProcessExtendsVisitor.prototype.findMatch = function (extend, haystackSelectorPath) { - // - // look through the haystack selector path to try and find the needle - extend.selector - // returns an array of selector matches that can then be replaced - // - var haystackSelectorIndex; - var hackstackSelector; - var hackstackElementIndex; - var haystackElement; - var targetCombinator; - var i; - var extendVisitor = this; - var needleElements = extend.selector.elements; - var potentialMatches = []; - var potentialMatch; - var matches = []; - // loop through the haystack elements - for (haystackSelectorIndex = 0; haystackSelectorIndex < haystackSelectorPath.length; haystackSelectorIndex++) { - hackstackSelector = haystackSelectorPath[haystackSelectorIndex]; - for (hackstackElementIndex = 0; hackstackElementIndex < hackstackSelector.elements.length; hackstackElementIndex++) { - haystackElement = hackstackSelector.elements[hackstackElementIndex]; - // if we allow elements before our match we can add a potential match every time. otherwise only at the first element. - if (extend.allowBefore || (haystackSelectorIndex === 0 && hackstackElementIndex === 0)) { - potentialMatches.push({ pathIndex: haystackSelectorIndex, index: hackstackElementIndex, matched: 0, - initialCombinator: haystackElement.combinator }); - } - for (i = 0; i < potentialMatches.length; i++) { - potentialMatch = potentialMatches[i]; - // selectors add " " onto the first element. When we use & it joins the selectors together, but if we don't - // then each selector in haystackSelectorPath has a space before it added in the toCSS phase. so we need to - // work out what the resulting combinator will be - targetCombinator = haystackElement.combinator.value; - if (targetCombinator === '' && hackstackElementIndex === 0) { - targetCombinator = ' '; - } - // if we don't match, null our match to indicate failure - if (!extendVisitor.isElementValuesEqual(needleElements[potentialMatch.matched].value, haystackElement.value) || - (potentialMatch.matched > 0 && needleElements[potentialMatch.matched].combinator.value !== targetCombinator)) { - potentialMatch = null; - } - else { - potentialMatch.matched++; - } - // if we are still valid and have finished, test whether we have elements after and whether these are allowed - if (potentialMatch) { - potentialMatch.finished = potentialMatch.matched === needleElements.length; - if (potentialMatch.finished && - (!extend.allowAfter && - (hackstackElementIndex + 1 < hackstackSelector.elements.length || haystackSelectorIndex + 1 < haystackSelectorPath.length))) { - potentialMatch = null; - } - } - // if null we remove, if not, we are still valid, so either push as a valid match or continue - if (potentialMatch) { - if (potentialMatch.finished) { - potentialMatch.length = needleElements.length; - potentialMatch.endPathIndex = haystackSelectorIndex; - potentialMatch.endPathElementIndex = hackstackElementIndex + 1; // index after end of match - potentialMatches.length = 0; // we don't allow matches to overlap, so start matching again - matches.push(potentialMatch); - } - } - else { - potentialMatches.splice(i, 1); - i--; - } - } - } - } - return matches; - }; - ProcessExtendsVisitor.prototype.isElementValuesEqual = function (elementValue1, elementValue2) { - if (typeof elementValue1 === 'string' || typeof elementValue2 === 'string') { - return elementValue1 === elementValue2; - } - if (elementValue1 instanceof tree.Attribute) { - if (elementValue1.op !== elementValue2.op || elementValue1.key !== elementValue2.key) { - return false; - } - if (!elementValue1.value || !elementValue2.value) { - if (elementValue1.value || elementValue2.value) { - return false; - } - return true; - } - elementValue1 = elementValue1.value.value || elementValue1.value; - elementValue2 = elementValue2.value.value || elementValue2.value; - return elementValue1 === elementValue2; - } - elementValue1 = elementValue1.value; - elementValue2 = elementValue2.value; - if (elementValue1 instanceof tree.Selector) { - if (!(elementValue2 instanceof tree.Selector) || elementValue1.elements.length !== elementValue2.elements.length) { - return false; - } - for (var i = 0; i < elementValue1.elements.length; i++) { - if (elementValue1.elements[i].combinator.value !== elementValue2.elements[i].combinator.value) { - if (i !== 0 || (elementValue1.elements[i].combinator.value || ' ') !== (elementValue2.elements[i].combinator.value || ' ')) { - return false; - } - } - if (!this.isElementValuesEqual(elementValue1.elements[i].value, elementValue2.elements[i].value)) { - return false; - } - } - return true; - } - return false; - }; - ProcessExtendsVisitor.prototype.extendSelector = function (matches, selectorPath, replacementSelector, isVisible) { - // for a set of matches, replace each match with the replacement selector - var currentSelectorPathIndex = 0; - var currentSelectorPathElementIndex = 0; - var path = []; - var matchIndex; - var selector; - var firstElement; - var match; - var newElements; - for (matchIndex = 0; matchIndex < matches.length; matchIndex++) { - match = matches[matchIndex]; - selector = selectorPath[match.pathIndex]; - firstElement = new tree.Element(match.initialCombinator, replacementSelector.elements[0].value, replacementSelector.elements[0].isVariable, replacementSelector.elements[0].getIndex(), replacementSelector.elements[0].fileInfo()); - if (match.pathIndex > currentSelectorPathIndex && currentSelectorPathElementIndex > 0) { - path[path.length - 1].elements = path[path.length - 1] - .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex)); - currentSelectorPathElementIndex = 0; - currentSelectorPathIndex++; - } - newElements = selector.elements - .slice(currentSelectorPathElementIndex, match.index) - .concat([firstElement]) - .concat(replacementSelector.elements.slice(1)); - if (currentSelectorPathIndex === match.pathIndex && matchIndex > 0) { - path[path.length - 1].elements = - path[path.length - 1].elements.concat(newElements); - } - else { - path = path.concat(selectorPath.slice(currentSelectorPathIndex, match.pathIndex)); - path.push(new tree.Selector(newElements)); - } - currentSelectorPathIndex = match.endPathIndex; - currentSelectorPathElementIndex = match.endPathElementIndex; - if (currentSelectorPathElementIndex >= selectorPath[currentSelectorPathIndex].elements.length) { - currentSelectorPathElementIndex = 0; - currentSelectorPathIndex++; - } - } - if (currentSelectorPathIndex < selectorPath.length && currentSelectorPathElementIndex > 0) { - path[path.length - 1].elements = path[path.length - 1] - .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex)); - currentSelectorPathIndex++; - } - path = path.concat(selectorPath.slice(currentSelectorPathIndex, selectorPath.length)); - path = path.map(function (currentValue) { - // we can re-use elements here, because the visibility property matters only for selectors - var derived = currentValue.createDerived(currentValue.elements); - if (isVisible) { - derived.ensureVisibility(); - } - else { - derived.ensureInvisibility(); - } - return derived; - }); - return path; - }; - ProcessExtendsVisitor.prototype.visitMedia = function (mediaNode, visitArgs) { - var newAllExtends = mediaNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]); - newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, mediaNode.allExtends)); - this.allExtendsStack.push(newAllExtends); - }; - ProcessExtendsVisitor.prototype.visitMediaOut = function (mediaNode) { - var lastIndex = this.allExtendsStack.length - 1; - this.allExtendsStack.length = lastIndex; - }; - ProcessExtendsVisitor.prototype.visitAtRule = function (atRuleNode, visitArgs) { - var newAllExtends = atRuleNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]); - newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, atRuleNode.allExtends)); - this.allExtendsStack.push(newAllExtends); - }; - ProcessExtendsVisitor.prototype.visitAtRuleOut = function (atRuleNode) { - var lastIndex = this.allExtendsStack.length - 1; - this.allExtendsStack.length = lastIndex; - }; - return ProcessExtendsVisitor; - }()); + /* jshint loopfunc:true */ + var ExtendFinderVisitor = /** @class */ (function () { + function ExtendFinderVisitor() { + this._visitor = new Visitor(this); + this.contexts = []; + this.allExtendsStack = [[]]; + } + ExtendFinderVisitor.prototype.run = function (root) { + root = this._visitor.visit(root); + root.allExtends = this.allExtendsStack[0]; + return root; + }; + ExtendFinderVisitor.prototype.visitDeclaration = function (declNode, visitArgs) { + visitArgs.visitDeeper = false; + }; + ExtendFinderVisitor.prototype.visitMixinDefinition = function (mixinDefinitionNode, visitArgs) { + visitArgs.visitDeeper = false; + }; + ExtendFinderVisitor.prototype.visitRuleset = function (rulesetNode, visitArgs) { + if (rulesetNode.root) { + return; + } + var i; + var j; + var extend; + var allSelectorsExtendList = []; + var extendList; + // get &:extend(.a); rules which apply to all selectors in this ruleset + var rules = rulesetNode.rules, ruleCnt = rules ? rules.length : 0; + for (i = 0; i < ruleCnt; i++) { + if (rulesetNode.rules[i] instanceof tree.Extend) { + allSelectorsExtendList.push(rules[i]); + rulesetNode.extendOnEveryPath = true; + } + } + // now find every selector and apply the extends that apply to all extends + // and the ones which apply to an individual extend + var paths = rulesetNode.paths; + for (i = 0; i < paths.length; i++) { + var selectorPath = paths[i], selector = selectorPath[selectorPath.length - 1], selExtendList = selector.extendList; + extendList = selExtendList ? copyArray(selExtendList).concat(allSelectorsExtendList) + : allSelectorsExtendList; + if (extendList) { + extendList = extendList.map(function (allSelectorsExtend) { + return allSelectorsExtend.clone(); + }); + } + for (j = 0; j < extendList.length; j++) { + this.foundExtends = true; + extend = extendList[j]; + extend.findSelfSelectors(selectorPath); + extend.ruleset = rulesetNode; + if (j === 0) { + extend.firstExtendOnThisSelectorPath = true; + } + this.allExtendsStack[this.allExtendsStack.length - 1].push(extend); + } + } + this.contexts.push(rulesetNode.selectors); + }; + ExtendFinderVisitor.prototype.visitRulesetOut = function (rulesetNode) { + if (!rulesetNode.root) { + this.contexts.length = this.contexts.length - 1; + } + }; + ExtendFinderVisitor.prototype.visitMedia = function (mediaNode, visitArgs) { + mediaNode.allExtends = []; + this.allExtendsStack.push(mediaNode.allExtends); + }; + ExtendFinderVisitor.prototype.visitMediaOut = function (mediaNode) { + this.allExtendsStack.length = this.allExtendsStack.length - 1; + }; + ExtendFinderVisitor.prototype.visitAtRule = function (atRuleNode, visitArgs) { + atRuleNode.allExtends = []; + this.allExtendsStack.push(atRuleNode.allExtends); + }; + ExtendFinderVisitor.prototype.visitAtRuleOut = function (atRuleNode) { + this.allExtendsStack.length = this.allExtendsStack.length - 1; + }; + return ExtendFinderVisitor; + }()); + var ProcessExtendsVisitor = /** @class */ (function () { + function ProcessExtendsVisitor() { + this._visitor = new Visitor(this); + } + ProcessExtendsVisitor.prototype.run = function (root) { + var extendFinder = new ExtendFinderVisitor(); + this.extendIndices = {}; + extendFinder.run(root); + if (!extendFinder.foundExtends) { + return root; + } + root.allExtends = root.allExtends.concat(this.doExtendChaining(root.allExtends, root.allExtends)); + this.allExtendsStack = [root.allExtends]; + var newRoot = this._visitor.visit(root); + this.checkExtendsForNonMatched(root.allExtends); + return newRoot; + }; + ProcessExtendsVisitor.prototype.checkExtendsForNonMatched = function (extendList) { + var indices = this.extendIndices; + extendList.filter(function (extend) { + return !extend.hasFoundMatches && extend.parent_ids.length == 1; + }).forEach(function (extend) { + var selector = '_unknown_'; + try { + selector = extend.selector.toCSS({}); + } + catch (_) { } + if (!indices[extend.index + " " + selector]) { + indices[extend.index + " " + selector] = true; + logger.warn("extend '" + selector + "' has no matches"); + } + }); + }; + ProcessExtendsVisitor.prototype.doExtendChaining = function (extendsList, extendsListTarget, iterationCount) { + // + // chaining is different from normal extension.. if we extend an extend then we are not just copying, altering + // and pasting the selector we would do normally, but we are also adding an extend with the same target selector + // this means this new extend can then go and alter other extends + // + // this method deals with all the chaining work - without it, extend is flat and doesn't work on other extend selectors + // this is also the most expensive.. and a match on one selector can cause an extension of a selector we had already + // processed if we look at each selector at a time, as is done in visitRuleset + var extendIndex; + var targetExtendIndex; + var matches; + var extendsToAdd = []; + var newSelector; + var extendVisitor = this; + var selectorPath; + var extend; + var targetExtend; + var newExtend; + iterationCount = iterationCount || 0; + // loop through comparing every extend with every target extend. + // a target extend is the one on the ruleset we are looking at copy/edit/pasting in place + // e.g. .a:extend(.b) {} and .b:extend(.c) {} then the first extend extends the second one + // and the second is the target. + // the separation into two lists allows us to process a subset of chains with a bigger set, as is the + // case when processing media queries + for (extendIndex = 0; extendIndex < extendsList.length; extendIndex++) { + for (targetExtendIndex = 0; targetExtendIndex < extendsListTarget.length; targetExtendIndex++) { + extend = extendsList[extendIndex]; + targetExtend = extendsListTarget[targetExtendIndex]; + // look for circular references + if (extend.parent_ids.indexOf(targetExtend.object_id) >= 0) { + continue; + } + // find a match in the target extends self selector (the bit before :extend) + selectorPath = [targetExtend.selfSelectors[0]]; + matches = extendVisitor.findMatch(extend, selectorPath); + if (matches.length) { + extend.hasFoundMatches = true; + // we found a match, so for each self selector.. + extend.selfSelectors.forEach(function (selfSelector) { + var info = targetExtend.visibilityInfo(); + // process the extend as usual + newSelector = extendVisitor.extendSelector(matches, selectorPath, selfSelector, extend.isVisible()); + // but now we create a new extend from it + newExtend = new (tree.Extend)(targetExtend.selector, targetExtend.option, 0, targetExtend.fileInfo(), info); + newExtend.selfSelectors = newSelector; + // add the extend onto the list of extends for that selector + newSelector[newSelector.length - 1].extendList = [newExtend]; + // record that we need to add it. + extendsToAdd.push(newExtend); + newExtend.ruleset = targetExtend.ruleset; + // remember its parents for circular references + newExtend.parent_ids = newExtend.parent_ids.concat(targetExtend.parent_ids, extend.parent_ids); + // only process the selector once.. if we have :extend(.a,.b) then multiple + // extends will look at the same selector path, so when extending + // we know that any others will be duplicates in terms of what is added to the css + if (targetExtend.firstExtendOnThisSelectorPath) { + newExtend.firstExtendOnThisSelectorPath = true; + targetExtend.ruleset.paths.push(newSelector); + } + }); + } + } + } + if (extendsToAdd.length) { + // try to detect circular references to stop a stack overflow. + // may no longer be needed. + this.extendChainCount++; + if (iterationCount > 100) { + var selectorOne = '{unable to calculate}'; + var selectorTwo = '{unable to calculate}'; + try { + selectorOne = extendsToAdd[0].selfSelectors[0].toCSS(); + selectorTwo = extendsToAdd[0].selector.toCSS(); + } + catch (e) { } + throw { message: "extend circular reference detected. One of the circular extends is currently:" + selectorOne + ":extend(" + selectorTwo + ")" }; + } + // now process the new extends on the existing rules so that we can handle a extending b extending c extending + // d extending e... + return extendsToAdd.concat(extendVisitor.doExtendChaining(extendsToAdd, extendsListTarget, iterationCount + 1)); + } + else { + return extendsToAdd; + } + }; + ProcessExtendsVisitor.prototype.visitDeclaration = function (ruleNode, visitArgs) { + visitArgs.visitDeeper = false; + }; + ProcessExtendsVisitor.prototype.visitMixinDefinition = function (mixinDefinitionNode, visitArgs) { + visitArgs.visitDeeper = false; + }; + ProcessExtendsVisitor.prototype.visitSelector = function (selectorNode, visitArgs) { + visitArgs.visitDeeper = false; + }; + ProcessExtendsVisitor.prototype.visitRuleset = function (rulesetNode, visitArgs) { + if (rulesetNode.root) { + return; + } + var matches; + var pathIndex; + var extendIndex; + var allExtends = this.allExtendsStack[this.allExtendsStack.length - 1]; + var selectorsToAdd = []; + var extendVisitor = this; + var selectorPath; + // look at each selector path in the ruleset, find any extend matches and then copy, find and replace + for (extendIndex = 0; extendIndex < allExtends.length; extendIndex++) { + for (pathIndex = 0; pathIndex < rulesetNode.paths.length; pathIndex++) { + selectorPath = rulesetNode.paths[pathIndex]; + // extending extends happens initially, before the main pass + if (rulesetNode.extendOnEveryPath) { + continue; + } + var extendList = selectorPath[selectorPath.length - 1].extendList; + if (extendList && extendList.length) { + continue; + } + matches = this.findMatch(allExtends[extendIndex], selectorPath); + if (matches.length) { + allExtends[extendIndex].hasFoundMatches = true; + allExtends[extendIndex].selfSelectors.forEach(function (selfSelector) { + var extendedSelectors; + extendedSelectors = extendVisitor.extendSelector(matches, selectorPath, selfSelector, allExtends[extendIndex].isVisible()); + selectorsToAdd.push(extendedSelectors); + }); + } + } + } + rulesetNode.paths = rulesetNode.paths.concat(selectorsToAdd); + }; + ProcessExtendsVisitor.prototype.findMatch = function (extend, haystackSelectorPath) { + // + // look through the haystack selector path to try and find the needle - extend.selector + // returns an array of selector matches that can then be replaced + // + var haystackSelectorIndex; + var hackstackSelector; + var hackstackElementIndex; + var haystackElement; + var targetCombinator; + var i; + var extendVisitor = this; + var needleElements = extend.selector.elements; + var potentialMatches = []; + var potentialMatch; + var matches = []; + // loop through the haystack elements + for (haystackSelectorIndex = 0; haystackSelectorIndex < haystackSelectorPath.length; haystackSelectorIndex++) { + hackstackSelector = haystackSelectorPath[haystackSelectorIndex]; + for (hackstackElementIndex = 0; hackstackElementIndex < hackstackSelector.elements.length; hackstackElementIndex++) { + haystackElement = hackstackSelector.elements[hackstackElementIndex]; + // if we allow elements before our match we can add a potential match every time. otherwise only at the first element. + if (extend.allowBefore || (haystackSelectorIndex === 0 && hackstackElementIndex === 0)) { + potentialMatches.push({ pathIndex: haystackSelectorIndex, index: hackstackElementIndex, matched: 0, + initialCombinator: haystackElement.combinator }); + } + for (i = 0; i < potentialMatches.length; i++) { + potentialMatch = potentialMatches[i]; + // selectors add " " onto the first element. When we use & it joins the selectors together, but if we don't + // then each selector in haystackSelectorPath has a space before it added in the toCSS phase. so we need to + // work out what the resulting combinator will be + targetCombinator = haystackElement.combinator.value; + if (targetCombinator === '' && hackstackElementIndex === 0) { + targetCombinator = ' '; + } + // if we don't match, null our match to indicate failure + if (!extendVisitor.isElementValuesEqual(needleElements[potentialMatch.matched].value, haystackElement.value) || + (potentialMatch.matched > 0 && needleElements[potentialMatch.matched].combinator.value !== targetCombinator)) { + potentialMatch = null; + } + else { + potentialMatch.matched++; + } + // if we are still valid and have finished, test whether we have elements after and whether these are allowed + if (potentialMatch) { + potentialMatch.finished = potentialMatch.matched === needleElements.length; + if (potentialMatch.finished && + (!extend.allowAfter && + (hackstackElementIndex + 1 < hackstackSelector.elements.length || haystackSelectorIndex + 1 < haystackSelectorPath.length))) { + potentialMatch = null; + } + } + // if null we remove, if not, we are still valid, so either push as a valid match or continue + if (potentialMatch) { + if (potentialMatch.finished) { + potentialMatch.length = needleElements.length; + potentialMatch.endPathIndex = haystackSelectorIndex; + potentialMatch.endPathElementIndex = hackstackElementIndex + 1; // index after end of match + potentialMatches.length = 0; // we don't allow matches to overlap, so start matching again + matches.push(potentialMatch); + } + } + else { + potentialMatches.splice(i, 1); + i--; + } + } + } + } + return matches; + }; + ProcessExtendsVisitor.prototype.isElementValuesEqual = function (elementValue1, elementValue2) { + if (typeof elementValue1 === 'string' || typeof elementValue2 === 'string') { + return elementValue1 === elementValue2; + } + if (elementValue1 instanceof tree.Attribute) { + if (elementValue1.op !== elementValue2.op || elementValue1.key !== elementValue2.key) { + return false; + } + if (!elementValue1.value || !elementValue2.value) { + if (elementValue1.value || elementValue2.value) { + return false; + } + return true; + } + elementValue1 = elementValue1.value.value || elementValue1.value; + elementValue2 = elementValue2.value.value || elementValue2.value; + return elementValue1 === elementValue2; + } + elementValue1 = elementValue1.value; + elementValue2 = elementValue2.value; + if (elementValue1 instanceof tree.Selector) { + if (!(elementValue2 instanceof tree.Selector) || elementValue1.elements.length !== elementValue2.elements.length) { + return false; + } + for (var i = 0; i < elementValue1.elements.length; i++) { + if (elementValue1.elements[i].combinator.value !== elementValue2.elements[i].combinator.value) { + if (i !== 0 || (elementValue1.elements[i].combinator.value || ' ') !== (elementValue2.elements[i].combinator.value || ' ')) { + return false; + } + } + if (!this.isElementValuesEqual(elementValue1.elements[i].value, elementValue2.elements[i].value)) { + return false; + } + } + return true; + } + return false; + }; + ProcessExtendsVisitor.prototype.extendSelector = function (matches, selectorPath, replacementSelector, isVisible) { + // for a set of matches, replace each match with the replacement selector + var currentSelectorPathIndex = 0, currentSelectorPathElementIndex = 0, path = [], matchIndex, selector, firstElement, match, newElements; + for (matchIndex = 0; matchIndex < matches.length; matchIndex++) { + match = matches[matchIndex]; + selector = selectorPath[match.pathIndex]; + firstElement = new tree.Element(match.initialCombinator, replacementSelector.elements[0].value, replacementSelector.elements[0].isVariable, replacementSelector.elements[0].getIndex(), replacementSelector.elements[0].fileInfo()); + if (match.pathIndex > currentSelectorPathIndex && currentSelectorPathElementIndex > 0) { + path[path.length - 1].elements = path[path.length - 1] + .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex)); + currentSelectorPathElementIndex = 0; + currentSelectorPathIndex++; + } + newElements = selector.elements + .slice(currentSelectorPathElementIndex, match.index) + .concat([firstElement]) + .concat(replacementSelector.elements.slice(1)); + if (currentSelectorPathIndex === match.pathIndex && matchIndex > 0) { + path[path.length - 1].elements = + path[path.length - 1].elements.concat(newElements); + } + else { + path = path.concat(selectorPath.slice(currentSelectorPathIndex, match.pathIndex)); + path.push(new tree.Selector(newElements)); + } + currentSelectorPathIndex = match.endPathIndex; + currentSelectorPathElementIndex = match.endPathElementIndex; + if (currentSelectorPathElementIndex >= selectorPath[currentSelectorPathIndex].elements.length) { + currentSelectorPathElementIndex = 0; + currentSelectorPathIndex++; + } + } + if (currentSelectorPathIndex < selectorPath.length && currentSelectorPathElementIndex > 0) { + path[path.length - 1].elements = path[path.length - 1] + .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex)); + currentSelectorPathIndex++; + } + path = path.concat(selectorPath.slice(currentSelectorPathIndex, selectorPath.length)); + path = path.map(function (currentValue) { + // we can re-use elements here, because the visibility property matters only for selectors + var derived = currentValue.createDerived(currentValue.elements); + if (isVisible) { + derived.ensureVisibility(); + } + else { + derived.ensureInvisibility(); + } + return derived; + }); + return path; + }; + ProcessExtendsVisitor.prototype.visitMedia = function (mediaNode, visitArgs) { + var newAllExtends = mediaNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]); + newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, mediaNode.allExtends)); + this.allExtendsStack.push(newAllExtends); + }; + ProcessExtendsVisitor.prototype.visitMediaOut = function (mediaNode) { + var lastIndex = this.allExtendsStack.length - 1; + this.allExtendsStack.length = lastIndex; + }; + ProcessExtendsVisitor.prototype.visitAtRule = function (atRuleNode, visitArgs) { + var newAllExtends = atRuleNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]); + newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, atRuleNode.allExtends)); + this.allExtendsStack.push(newAllExtends); + }; + ProcessExtendsVisitor.prototype.visitAtRuleOut = function (atRuleNode) { + var lastIndex = this.allExtendsStack.length - 1; + this.allExtendsStack.length = lastIndex; + }; + return ProcessExtendsVisitor; + }()); - var JoinSelectorVisitor = /** @class */ (function () { - function JoinSelectorVisitor() { - this.contexts = [[]]; - this._visitor = new Visitor(this); - } - JoinSelectorVisitor.prototype.run = function (root) { - return this._visitor.visit(root); - }; - JoinSelectorVisitor.prototype.visitDeclaration = function (declNode, visitArgs) { - visitArgs.visitDeeper = false; - }; - JoinSelectorVisitor.prototype.visitMixinDefinition = function (mixinDefinitionNode, visitArgs) { - visitArgs.visitDeeper = false; - }; - JoinSelectorVisitor.prototype.visitRuleset = function (rulesetNode, visitArgs) { - var context = this.contexts[this.contexts.length - 1]; - var paths = []; - var selectors; - this.contexts.push(paths); - if (!rulesetNode.root) { - selectors = rulesetNode.selectors; - if (selectors) { - selectors = selectors.filter(function (selector) { return selector.getIsOutput(); }); - rulesetNode.selectors = selectors.length ? selectors : (selectors = null); - if (selectors) { - rulesetNode.joinSelectors(paths, context, selectors); - } - } - if (!selectors) { - rulesetNode.rules = null; - } - rulesetNode.paths = paths; - } - }; - JoinSelectorVisitor.prototype.visitRulesetOut = function (rulesetNode) { - this.contexts.length = this.contexts.length - 1; - }; - JoinSelectorVisitor.prototype.visitMedia = function (mediaNode, visitArgs) { - var context = this.contexts[this.contexts.length - 1]; - mediaNode.rules[0].root = (context.length === 0 || context[0].multiMedia); - }; - JoinSelectorVisitor.prototype.visitAtRule = function (atRuleNode, visitArgs) { - var context = this.contexts[this.contexts.length - 1]; - if (atRuleNode.rules && atRuleNode.rules.length) { - atRuleNode.rules[0].root = (atRuleNode.isRooted || context.length === 0 || null); - } - }; - return JoinSelectorVisitor; - }()); + var JoinSelectorVisitor = /** @class */ (function () { + function JoinSelectorVisitor() { + this.contexts = [[]]; + this._visitor = new Visitor(this); + } + JoinSelectorVisitor.prototype.run = function (root) { + return this._visitor.visit(root); + }; + JoinSelectorVisitor.prototype.visitDeclaration = function (declNode, visitArgs) { + visitArgs.visitDeeper = false; + }; + JoinSelectorVisitor.prototype.visitMixinDefinition = function (mixinDefinitionNode, visitArgs) { + visitArgs.visitDeeper = false; + }; + JoinSelectorVisitor.prototype.visitRuleset = function (rulesetNode, visitArgs) { + var context = this.contexts[this.contexts.length - 1]; + var paths = []; + var selectors; + this.contexts.push(paths); + if (!rulesetNode.root) { + selectors = rulesetNode.selectors; + if (selectors) { + selectors = selectors.filter(function (selector) { return selector.getIsOutput(); }); + rulesetNode.selectors = selectors.length ? selectors : (selectors = null); + if (selectors) { + rulesetNode.joinSelectors(paths, context, selectors); + } + } + if (!selectors) { + rulesetNode.rules = null; + } + rulesetNode.paths = paths; + } + }; + JoinSelectorVisitor.prototype.visitRulesetOut = function (rulesetNode) { + this.contexts.length = this.contexts.length - 1; + }; + JoinSelectorVisitor.prototype.visitMedia = function (mediaNode, visitArgs) { + var context = this.contexts[this.contexts.length - 1]; + mediaNode.rules[0].root = (context.length === 0 || context[0].multiMedia); + }; + JoinSelectorVisitor.prototype.visitAtRule = function (atRuleNode, visitArgs) { + var context = this.contexts[this.contexts.length - 1]; + if (atRuleNode.rules && atRuleNode.rules.length) { + atRuleNode.rules[0].root = (atRuleNode.isRooted || context.length === 0 || null); + } + }; + return JoinSelectorVisitor; + }()); - var CSSVisitorUtils = /** @class */ (function () { - function CSSVisitorUtils(context) { - this._visitor = new Visitor(this); - this._context = context; - } - CSSVisitorUtils.prototype.containsSilentNonBlockedChild = function (bodyRules) { - var rule; - if (!bodyRules) { - return false; - } - for (var r = 0; r < bodyRules.length; r++) { - rule = bodyRules[r]; - if (rule.isSilent && rule.isSilent(this._context) && !rule.blocksVisibility()) { - // the atrule contains something that was referenced (likely by extend) - // therefore it needs to be shown in output too - return true; - } - } - return false; - }; - CSSVisitorUtils.prototype.keepOnlyVisibleChilds = function (owner) { - if (owner && owner.rules) { - owner.rules = owner.rules.filter(function (thing) { return thing.isVisible(); }); - } - }; - CSSVisitorUtils.prototype.isEmpty = function (owner) { - return (owner && owner.rules) - ? (owner.rules.length === 0) : true; - }; - CSSVisitorUtils.prototype.hasVisibleSelector = function (rulesetNode) { - return (rulesetNode && rulesetNode.paths) - ? (rulesetNode.paths.length > 0) : false; - }; - CSSVisitorUtils.prototype.resolveVisibility = function (node, originalRules) { - if (!node.blocksVisibility()) { - if (this.isEmpty(node) && !this.containsSilentNonBlockedChild(originalRules)) { - return; - } - return node; - } - var compiledRulesBody = node.rules[0]; - this.keepOnlyVisibleChilds(compiledRulesBody); - if (this.isEmpty(compiledRulesBody)) { - return; - } - node.ensureVisibility(); - node.removeVisibilityBlock(); - return node; - }; - CSSVisitorUtils.prototype.isVisibleRuleset = function (rulesetNode) { - if (rulesetNode.firstRoot) { - return true; - } - if (this.isEmpty(rulesetNode)) { - return false; - } - if (!rulesetNode.root && !this.hasVisibleSelector(rulesetNode)) { - return false; - } - return true; - }; - return CSSVisitorUtils; - }()); - var ToCSSVisitor = function (context) { - this._visitor = new Visitor(this); - this._context = context; - this.utils = new CSSVisitorUtils(context); - }; - ToCSSVisitor.prototype = { - isReplacing: true, - run: function (root) { - return this._visitor.visit(root); - }, - visitDeclaration: function (declNode, visitArgs) { - if (declNode.blocksVisibility() || declNode.variable) { - return; - } - return declNode; - }, - visitMixinDefinition: function (mixinNode, visitArgs) { - // mixin definitions do not get eval'd - this means they keep state - // so we have to clear that state here so it isn't used if toCSS is called twice - mixinNode.frames = []; - }, - visitExtend: function (extendNode, visitArgs) { - }, - visitComment: function (commentNode, visitArgs) { - if (commentNode.blocksVisibility() || commentNode.isSilent(this._context)) { - return; - } - return commentNode; - }, - visitMedia: function (mediaNode, visitArgs) { - var originalRules = mediaNode.rules[0].rules; - mediaNode.accept(this._visitor); - visitArgs.visitDeeper = false; - return this.utils.resolveVisibility(mediaNode, originalRules); - }, - visitImport: function (importNode, visitArgs) { - if (importNode.blocksVisibility()) { - return; - } - return importNode; - }, - visitAtRule: function (atRuleNode, visitArgs) { - if (atRuleNode.rules && atRuleNode.rules.length) { - return this.visitAtRuleWithBody(atRuleNode, visitArgs); - } - else { - return this.visitAtRuleWithoutBody(atRuleNode, visitArgs); - } - }, - visitAnonymous: function (anonymousNode, visitArgs) { - if (!anonymousNode.blocksVisibility()) { - anonymousNode.accept(this._visitor); - return anonymousNode; - } - }, - visitAtRuleWithBody: function (atRuleNode, visitArgs) { - // if there is only one nested ruleset and that one has no path, then it is - // just fake ruleset - function hasFakeRuleset(atRuleNode) { - var bodyRules = atRuleNode.rules; - return bodyRules.length === 1 && (!bodyRules[0].paths || bodyRules[0].paths.length === 0); - } - function getBodyRules(atRuleNode) { - var nodeRules = atRuleNode.rules; - if (hasFakeRuleset(atRuleNode)) { - return nodeRules[0].rules; - } - return nodeRules; - } - // it is still true that it is only one ruleset in array - // this is last such moment - // process childs - var originalRules = getBodyRules(atRuleNode); - atRuleNode.accept(this._visitor); - visitArgs.visitDeeper = false; - if (!this.utils.isEmpty(atRuleNode)) { - this._mergeRules(atRuleNode.rules[0].rules); - } - return this.utils.resolveVisibility(atRuleNode, originalRules); - }, - visitAtRuleWithoutBody: function (atRuleNode, visitArgs) { - if (atRuleNode.blocksVisibility()) { - return; - } - if (atRuleNode.name === '@charset') { - // Only output the debug info together with subsequent @charset definitions - // a comment (or @media statement) before the actual @charset atrule would - // be considered illegal css as it has to be on the first line - if (this.charset) { - if (atRuleNode.debugInfo) { - var comment = new tree.Comment("/* " + atRuleNode.toCSS(this._context).replace(/\n/g, '') + " */\n"); - comment.debugInfo = atRuleNode.debugInfo; - return this._visitor.visit(comment); - } - return; - } - this.charset = true; - } - return atRuleNode; - }, - checkValidNodes: function (rules, isRoot) { - if (!rules) { - return; - } - for (var i = 0; i < rules.length; i++) { - var ruleNode = rules[i]; - if (isRoot && ruleNode instanceof tree.Declaration && !ruleNode.variable) { - throw { message: 'Properties must be inside selector blocks. They cannot be in the root', - index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename }; - } - if (ruleNode instanceof tree.Call) { - throw { message: "Function '" + ruleNode.name + "' is undefined", index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename }; - } - if (ruleNode.type && !ruleNode.allowRoot) { - throw { message: ruleNode.type + " node returned by a function is not valid here", index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename }; - } - } - }, - visitRuleset: function (rulesetNode, visitArgs) { - // at this point rulesets are nested into each other - var rule; - var rulesets = []; - this.checkValidNodes(rulesetNode.rules, rulesetNode.firstRoot); - if (!rulesetNode.root) { - // remove invisible paths - this._compileRulesetPaths(rulesetNode); - // remove rulesets from this ruleset body and compile them separately - var nodeRules = rulesetNode.rules; - var nodeRuleCnt = nodeRules ? nodeRules.length : 0; - for (var i = 0; i < nodeRuleCnt;) { - rule = nodeRules[i]; - if (rule && rule.rules) { - // visit because we are moving them out from being a child - rulesets.push(this._visitor.visit(rule)); - nodeRules.splice(i, 1); - nodeRuleCnt--; - continue; - } - i++; - } - // accept the visitor to remove rules and refactor itself - // then we can decide nogw whether we want it or not - // compile body - if (nodeRuleCnt > 0) { - rulesetNode.accept(this._visitor); - } - else { - rulesetNode.rules = null; - } - visitArgs.visitDeeper = false; - } - else { // if (! rulesetNode.root) { - rulesetNode.accept(this._visitor); - visitArgs.visitDeeper = false; - } - if (rulesetNode.rules) { - this._mergeRules(rulesetNode.rules); - this._removeDuplicateRules(rulesetNode.rules); - } - // now decide whether we keep the ruleset - if (this.utils.isVisibleRuleset(rulesetNode)) { - rulesetNode.ensureVisibility(); - rulesets.splice(0, 0, rulesetNode); - } - if (rulesets.length === 1) { - return rulesets[0]; - } - return rulesets; - }, - _compileRulesetPaths: function (rulesetNode) { - if (rulesetNode.paths) { - rulesetNode.paths = rulesetNode.paths - .filter(function (p) { - var i; - if (p[0].elements[0].combinator.value === ' ') { - p[0].elements[0].combinator = new (tree.Combinator)(''); - } - for (i = 0; i < p.length; i++) { - if (p[i].isVisible() && p[i].getIsOutput()) { - return true; - } - } - return false; - }); - } - }, - _removeDuplicateRules: function (rules) { - if (!rules) { - return; - } - // remove duplicates - var ruleCache = {}; - var ruleList; - var rule; - var i; - for (i = rules.length - 1; i >= 0; i--) { - rule = rules[i]; - if (rule instanceof tree.Declaration) { - if (!ruleCache[rule.name]) { - ruleCache[rule.name] = rule; - } - else { - ruleList = ruleCache[rule.name]; - if (ruleList instanceof tree.Declaration) { - ruleList = ruleCache[rule.name] = [ruleCache[rule.name].toCSS(this._context)]; - } - var ruleCSS = rule.toCSS(this._context); - if (ruleList.indexOf(ruleCSS) !== -1) { - rules.splice(i, 1); - } - else { - ruleList.push(ruleCSS); - } - } - } - } - }, - _mergeRules: function (rules) { - if (!rules) { - return; - } - var groups = {}; - var groupsArr = []; - for (var i = 0; i < rules.length; i++) { - var rule = rules[i]; - if (rule.merge) { - var key = rule.name; - groups[key] ? rules.splice(i--, 1) : - groupsArr.push(groups[key] = []); - groups[key].push(rule); - } - } - groupsArr.forEach(function (group) { - if (group.length > 0) { - var result_1 = group[0]; - var space_1 = []; - var comma_1 = [new tree.Expression(space_1)]; - group.forEach(function (rule) { - if ((rule.merge === '+') && (space_1.length > 0)) { - comma_1.push(new tree.Expression(space_1 = [])); - } - space_1.push(rule.value); - result_1.important = result_1.important || rule.important; - }); - result_1.value = new tree.Value(comma_1); - } - }); - } - }; + var CSSVisitorUtils = /** @class */ (function () { + function CSSVisitorUtils(context) { + this._visitor = new Visitor(this); + this._context = context; + } + CSSVisitorUtils.prototype.containsSilentNonBlockedChild = function (bodyRules) { + var rule; + if (!bodyRules) { + return false; + } + for (var r = 0; r < bodyRules.length; r++) { + rule = bodyRules[r]; + if (rule.isSilent && rule.isSilent(this._context) && !rule.blocksVisibility()) { + // the atrule contains something that was referenced (likely by extend) + // therefore it needs to be shown in output too + return true; + } + } + return false; + }; + CSSVisitorUtils.prototype.keepOnlyVisibleChilds = function (owner) { + if (owner && owner.rules) { + owner.rules = owner.rules.filter(function (thing) { return thing.isVisible(); }); + } + }; + CSSVisitorUtils.prototype.isEmpty = function (owner) { + return (owner && owner.rules) + ? (owner.rules.length === 0) : true; + }; + CSSVisitorUtils.prototype.hasVisibleSelector = function (rulesetNode) { + return (rulesetNode && rulesetNode.paths) + ? (rulesetNode.paths.length > 0) : false; + }; + CSSVisitorUtils.prototype.resolveVisibility = function (node, originalRules) { + if (!node.blocksVisibility()) { + if (this.isEmpty(node) && !this.containsSilentNonBlockedChild(originalRules)) { + return; + } + return node; + } + var compiledRulesBody = node.rules[0]; + this.keepOnlyVisibleChilds(compiledRulesBody); + if (this.isEmpty(compiledRulesBody)) { + return; + } + node.ensureVisibility(); + node.removeVisibilityBlock(); + return node; + }; + CSSVisitorUtils.prototype.isVisibleRuleset = function (rulesetNode) { + if (rulesetNode.firstRoot) { + return true; + } + if (this.isEmpty(rulesetNode)) { + return false; + } + if (!rulesetNode.root && !this.hasVisibleSelector(rulesetNode)) { + return false; + } + return true; + }; + return CSSVisitorUtils; + }()); + var ToCSSVisitor = function (context) { + this._visitor = new Visitor(this); + this._context = context; + this.utils = new CSSVisitorUtils(context); + }; + ToCSSVisitor.prototype = { + isReplacing: true, + run: function (root) { + return this._visitor.visit(root); + }, + visitDeclaration: function (declNode, visitArgs) { + if (declNode.blocksVisibility() || declNode.variable) { + return; + } + return declNode; + }, + visitMixinDefinition: function (mixinNode, visitArgs) { + // mixin definitions do not get eval'd - this means they keep state + // so we have to clear that state here so it isn't used if toCSS is called twice + mixinNode.frames = []; + }, + visitExtend: function (extendNode, visitArgs) { + }, + visitComment: function (commentNode, visitArgs) { + if (commentNode.blocksVisibility() || commentNode.isSilent(this._context)) { + return; + } + return commentNode; + }, + visitMedia: function (mediaNode, visitArgs) { + var originalRules = mediaNode.rules[0].rules; + mediaNode.accept(this._visitor); + visitArgs.visitDeeper = false; + return this.utils.resolveVisibility(mediaNode, originalRules); + }, + visitImport: function (importNode, visitArgs) { + if (importNode.blocksVisibility()) { + return; + } + return importNode; + }, + visitAtRule: function (atRuleNode, visitArgs) { + if (atRuleNode.rules && atRuleNode.rules.length) { + return this.visitAtRuleWithBody(atRuleNode, visitArgs); + } + else { + return this.visitAtRuleWithoutBody(atRuleNode, visitArgs); + } + }, + visitAnonymous: function (anonymousNode, visitArgs) { + if (!anonymousNode.blocksVisibility()) { + anonymousNode.accept(this._visitor); + return anonymousNode; + } + }, + visitAtRuleWithBody: function (atRuleNode, visitArgs) { + // if there is only one nested ruleset and that one has no path, then it is + // just fake ruleset + function hasFakeRuleset(atRuleNode) { + var bodyRules = atRuleNode.rules; + return bodyRules.length === 1 && (!bodyRules[0].paths || bodyRules[0].paths.length === 0); + } + function getBodyRules(atRuleNode) { + var nodeRules = atRuleNode.rules; + if (hasFakeRuleset(atRuleNode)) { + return nodeRules[0].rules; + } + return nodeRules; + } + // it is still true that it is only one ruleset in array + // this is last such moment + // process childs + var originalRules = getBodyRules(atRuleNode); + atRuleNode.accept(this._visitor); + visitArgs.visitDeeper = false; + if (!this.utils.isEmpty(atRuleNode)) { + this._mergeRules(atRuleNode.rules[0].rules); + } + return this.utils.resolveVisibility(atRuleNode, originalRules); + }, + visitAtRuleWithoutBody: function (atRuleNode, visitArgs) { + if (atRuleNode.blocksVisibility()) { + return; + } + if (atRuleNode.name === '@charset') { + // Only output the debug info together with subsequent @charset definitions + // a comment (or @media statement) before the actual @charset atrule would + // be considered illegal css as it has to be on the first line + if (this.charset) { + if (atRuleNode.debugInfo) { + var comment = new tree.Comment("/* " + atRuleNode.toCSS(this._context).replace(/\n/g, '') + " */\n"); + comment.debugInfo = atRuleNode.debugInfo; + return this._visitor.visit(comment); + } + return; + } + this.charset = true; + } + return atRuleNode; + }, + checkValidNodes: function (rules, isRoot) { + if (!rules) { + return; + } + for (var i = 0; i < rules.length; i++) { + var ruleNode = rules[i]; + if (isRoot && ruleNode instanceof tree.Declaration && !ruleNode.variable) { + throw { message: 'Properties must be inside selector blocks. They cannot be in the root', + index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename }; + } + if (ruleNode instanceof tree.Call) { + throw { message: "Function '" + ruleNode.name + "' did not return a root node", index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename }; + } + if (ruleNode.type && !ruleNode.allowRoot) { + throw { message: ruleNode.type + " node returned by a function is not valid here", index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename }; + } + } + }, + visitRuleset: function (rulesetNode, visitArgs) { + // at this point rulesets are nested into each other + var rule; + var rulesets = []; + this.checkValidNodes(rulesetNode.rules, rulesetNode.firstRoot); + if (!rulesetNode.root) { + // remove invisible paths + this._compileRulesetPaths(rulesetNode); + // remove rulesets from this ruleset body and compile them separately + var nodeRules = rulesetNode.rules; + var nodeRuleCnt = nodeRules ? nodeRules.length : 0; + for (var i = 0; i < nodeRuleCnt;) { + rule = nodeRules[i]; + if (rule && rule.rules) { + // visit because we are moving them out from being a child + rulesets.push(this._visitor.visit(rule)); + nodeRules.splice(i, 1); + nodeRuleCnt--; + continue; + } + i++; + } + // accept the visitor to remove rules and refactor itself + // then we can decide nogw whether we want it or not + // compile body + if (nodeRuleCnt > 0) { + rulesetNode.accept(this._visitor); + } + else { + rulesetNode.rules = null; + } + visitArgs.visitDeeper = false; + } + else { // if (! rulesetNode.root) { + rulesetNode.accept(this._visitor); + visitArgs.visitDeeper = false; + } + if (rulesetNode.rules) { + this._mergeRules(rulesetNode.rules); + this._removeDuplicateRules(rulesetNode.rules); + } + // now decide whether we keep the ruleset + if (this.utils.isVisibleRuleset(rulesetNode)) { + rulesetNode.ensureVisibility(); + rulesets.splice(0, 0, rulesetNode); + } + if (rulesets.length === 1) { + return rulesets[0]; + } + return rulesets; + }, + _compileRulesetPaths: function (rulesetNode) { + if (rulesetNode.paths) { + rulesetNode.paths = rulesetNode.paths + .filter(function (p) { + var i; + if (p[0].elements[0].combinator.value === ' ') { + p[0].elements[0].combinator = new (tree.Combinator)(''); + } + for (i = 0; i < p.length; i++) { + if (p[i].isVisible() && p[i].getIsOutput()) { + return true; + } + } + return false; + }); + } + }, + _removeDuplicateRules: function (rules) { + if (!rules) { + return; + } + // remove duplicates + var ruleCache = {}; + var ruleList; + var rule; + var i; + for (i = rules.length - 1; i >= 0; i--) { + rule = rules[i]; + if (rule instanceof tree.Declaration) { + if (!ruleCache[rule.name]) { + ruleCache[rule.name] = rule; + } + else { + ruleList = ruleCache[rule.name]; + if (ruleList instanceof tree.Declaration) { + ruleList = ruleCache[rule.name] = [ruleCache[rule.name].toCSS(this._context)]; + } + var ruleCSS = rule.toCSS(this._context); + if (ruleList.indexOf(ruleCSS) !== -1) { + rules.splice(i, 1); + } + else { + ruleList.push(ruleCSS); + } + } + } + } + }, + _mergeRules: function (rules) { + if (!rules) { + return; + } + var groups = {}; + var groupsArr = []; + for (var i = 0; i < rules.length; i++) { + var rule = rules[i]; + if (rule.merge) { + var key = rule.name; + groups[key] ? rules.splice(i--, 1) : + groupsArr.push(groups[key] = []); + groups[key].push(rule); + } + } + groupsArr.forEach(function (group) { + if (group.length > 0) { + var result_1 = group[0]; + var space_1 = []; + var comma_1 = [new tree.Expression(space_1)]; + group.forEach(function (rule) { + if ((rule.merge === '+') && (space_1.length > 0)) { + comma_1.push(new tree.Expression(space_1 = [])); + } + space_1.push(rule.value); + result_1.important = result_1.important || rule.important; + }); + result_1.value = new tree.Value(comma_1); + } + }); + } + }; - var visitors = { - Visitor: Visitor, - ImportVisitor: ImportVisitor, - MarkVisibleSelectorsVisitor: SetTreeVisibilityVisitor, - ExtendVisitor: ProcessExtendsVisitor, - JoinSelectorVisitor: JoinSelectorVisitor, - ToCSSVisitor: ToCSSVisitor - }; + var visitors = { + Visitor: Visitor, + ImportVisitor: ImportVisitor, + MarkVisibleSelectorsVisitor: SetTreeVisibilityVisitor, + ExtendVisitor: ProcessExtendsVisitor, + JoinSelectorVisitor: JoinSelectorVisitor, + ToCSSVisitor: ToCSSVisitor + }; - // Split the input into chunks. - var chunker = (function (input, fail) { - var len = input.length; - var level = 0; - var parenLevel = 0; - var lastOpening; - var lastOpeningParen; - var lastMultiComment; - var lastMultiCommentEndBrace; - var chunks = []; - var emitFrom = 0; - var chunkerCurrentIndex; - var currentChunkStartIndex; - var cc; - var cc2; - var matched; - function emitChunk(force) { - var len = chunkerCurrentIndex - emitFrom; - if (((len < 512) && !force) || !len) { - return; - } - chunks.push(input.slice(emitFrom, chunkerCurrentIndex + 1)); - emitFrom = chunkerCurrentIndex + 1; - } - for (chunkerCurrentIndex = 0; chunkerCurrentIndex < len; chunkerCurrentIndex++) { - cc = input.charCodeAt(chunkerCurrentIndex); - if (((cc >= 97) && (cc <= 122)) || (cc < 34)) { - // a-z or whitespace - continue; - } - switch (cc) { - case 40: // ( - parenLevel++; - lastOpeningParen = chunkerCurrentIndex; - continue; - case 41: // ) - if (--parenLevel < 0) { - return fail('missing opening `(`', chunkerCurrentIndex); - } - continue; - case 59: // ; - if (!parenLevel) { - emitChunk(); - } - continue; - case 123: // { - level++; - lastOpening = chunkerCurrentIndex; - continue; - case 125: // } - if (--level < 0) { - return fail('missing opening `{`', chunkerCurrentIndex); - } - if (!level && !parenLevel) { - emitChunk(); - } - continue; - case 92: // \ - if (chunkerCurrentIndex < len - 1) { - chunkerCurrentIndex++; - continue; - } - return fail('unescaped `\\`', chunkerCurrentIndex); - case 34: - case 39: - case 96: // ", ' and ` - matched = 0; - currentChunkStartIndex = chunkerCurrentIndex; - for (chunkerCurrentIndex = chunkerCurrentIndex + 1; chunkerCurrentIndex < len; chunkerCurrentIndex++) { - cc2 = input.charCodeAt(chunkerCurrentIndex); - if (cc2 > 96) { - continue; - } - if (cc2 == cc) { - matched = 1; - break; - } - if (cc2 == 92) { // \ - if (chunkerCurrentIndex == len - 1) { - return fail('unescaped `\\`', chunkerCurrentIndex); - } - chunkerCurrentIndex++; - } - } - if (matched) { - continue; - } - return fail("unmatched `" + String.fromCharCode(cc) + "`", currentChunkStartIndex); - case 47: // /, check for comment - if (parenLevel || (chunkerCurrentIndex == len - 1)) { - continue; - } - cc2 = input.charCodeAt(chunkerCurrentIndex + 1); - if (cc2 == 47) { - // //, find lnfeed - for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len; chunkerCurrentIndex++) { - cc2 = input.charCodeAt(chunkerCurrentIndex); - if ((cc2 <= 13) && ((cc2 == 10) || (cc2 == 13))) { - break; - } - } - } - else if (cc2 == 42) { - // /*, find */ - lastMultiComment = currentChunkStartIndex = chunkerCurrentIndex; - for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len - 1; chunkerCurrentIndex++) { - cc2 = input.charCodeAt(chunkerCurrentIndex); - if (cc2 == 125) { - lastMultiCommentEndBrace = chunkerCurrentIndex; - } - if (cc2 != 42) { - continue; - } - if (input.charCodeAt(chunkerCurrentIndex + 1) == 47) { - break; - } - } - if (chunkerCurrentIndex == len - 1) { - return fail('missing closing `*/`', currentChunkStartIndex); - } - chunkerCurrentIndex++; - } - continue; - case 42: // *, check for unmatched */ - if ((chunkerCurrentIndex < len - 1) && (input.charCodeAt(chunkerCurrentIndex + 1) == 47)) { - return fail('unmatched `/*`', chunkerCurrentIndex); - } - continue; - } - } - if (level !== 0) { - if ((lastMultiComment > lastOpening) && (lastMultiCommentEndBrace > lastMultiComment)) { - return fail('missing closing `}` or `*/`', lastOpening); - } - else { - return fail('missing closing `}`', lastOpening); - } - } - else if (parenLevel !== 0) { - return fail('missing closing `)`', lastOpeningParen); - } - emitChunk(true); - return chunks; - }); + // Split the input into chunks. + function chunker (input, fail) { + var len = input.length; + var level = 0; + var parenLevel = 0; + var lastOpening; + var lastOpeningParen; + var lastMultiComment; + var lastMultiCommentEndBrace; + var chunks = []; + var emitFrom = 0; + var chunkerCurrentIndex; + var currentChunkStartIndex; + var cc; + var cc2; + var matched; + function emitChunk(force) { + var len = chunkerCurrentIndex - emitFrom; + if (((len < 512) && !force) || !len) { + return; + } + chunks.push(input.slice(emitFrom, chunkerCurrentIndex + 1)); + emitFrom = chunkerCurrentIndex + 1; + } + for (chunkerCurrentIndex = 0; chunkerCurrentIndex < len; chunkerCurrentIndex++) { + cc = input.charCodeAt(chunkerCurrentIndex); + if (((cc >= 97) && (cc <= 122)) || (cc < 34)) { + // a-z or whitespace + continue; + } + switch (cc) { + case 40: // ( + parenLevel++; + lastOpeningParen = chunkerCurrentIndex; + continue; + case 41: // ) + if (--parenLevel < 0) { + return fail('missing opening `(`', chunkerCurrentIndex); + } + continue; + case 59: // ; + if (!parenLevel) { + emitChunk(); + } + continue; + case 123: // { + level++; + lastOpening = chunkerCurrentIndex; + continue; + case 125: // } + if (--level < 0) { + return fail('missing opening `{`', chunkerCurrentIndex); + } + if (!level && !parenLevel) { + emitChunk(); + } + continue; + case 92: // \ + if (chunkerCurrentIndex < len - 1) { + chunkerCurrentIndex++; + continue; + } + return fail('unescaped `\\`', chunkerCurrentIndex); + case 34: + case 39: + case 96: // ", ' and ` + matched = 0; + currentChunkStartIndex = chunkerCurrentIndex; + for (chunkerCurrentIndex = chunkerCurrentIndex + 1; chunkerCurrentIndex < len; chunkerCurrentIndex++) { + cc2 = input.charCodeAt(chunkerCurrentIndex); + if (cc2 > 96) { + continue; + } + if (cc2 == cc) { + matched = 1; + break; + } + if (cc2 == 92) { // \ + if (chunkerCurrentIndex == len - 1) { + return fail('unescaped `\\`', chunkerCurrentIndex); + } + chunkerCurrentIndex++; + } + } + if (matched) { + continue; + } + return fail("unmatched `" + String.fromCharCode(cc) + "`", currentChunkStartIndex); + case 47: // /, check for comment + if (parenLevel || (chunkerCurrentIndex == len - 1)) { + continue; + } + cc2 = input.charCodeAt(chunkerCurrentIndex + 1); + if (cc2 == 47) { + // //, find lnfeed + for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len; chunkerCurrentIndex++) { + cc2 = input.charCodeAt(chunkerCurrentIndex); + if ((cc2 <= 13) && ((cc2 == 10) || (cc2 == 13))) { + break; + } + } + } + else if (cc2 == 42) { + // /*, find */ + lastMultiComment = currentChunkStartIndex = chunkerCurrentIndex; + for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len - 1; chunkerCurrentIndex++) { + cc2 = input.charCodeAt(chunkerCurrentIndex); + if (cc2 == 125) { + lastMultiCommentEndBrace = chunkerCurrentIndex; + } + if (cc2 != 42) { + continue; + } + if (input.charCodeAt(chunkerCurrentIndex + 1) == 47) { + break; + } + } + if (chunkerCurrentIndex == len - 1) { + return fail('missing closing `*/`', currentChunkStartIndex); + } + chunkerCurrentIndex++; + } + continue; + case 42: // *, check for unmatched */ + if ((chunkerCurrentIndex < len - 1) && (input.charCodeAt(chunkerCurrentIndex + 1) == 47)) { + return fail('unmatched `/*`', chunkerCurrentIndex); + } + continue; + } + } + if (level !== 0) { + if ((lastMultiComment > lastOpening) && (lastMultiCommentEndBrace > lastMultiComment)) { + return fail('missing closing `}` or `*/`', lastOpening); + } + else { + return fail('missing closing `}`', lastOpening); + } + } + else if (parenLevel !== 0) { + return fail('missing closing `)`', lastOpeningParen); + } + emitChunk(true); + return chunks; + } - var getParserInput = (function () { - var // Less input string - input; - var // current chunk - j; - var // holds state for backtracking - saveStack = []; - var // furthest index the parser has gone to - furthest; - var // if this is furthest we got to, this is the probably cause - furthestPossibleErrorMessage; - var // chunkified input - chunks; - var // current chunk - current; - var // index of current chunk, in `input` - currentPos; - var parserInput = {}; - var CHARCODE_SPACE = 32; - var CHARCODE_TAB = 9; - var CHARCODE_LF = 10; - var CHARCODE_CR = 13; - var CHARCODE_PLUS = 43; - var CHARCODE_COMMA = 44; - var CHARCODE_FORWARD_SLASH = 47; - var CHARCODE_9 = 57; - function skipWhitespace(length) { - var oldi = parserInput.i; - var oldj = j; - var curr = parserInput.i - currentPos; - var endIndex = parserInput.i + current.length - curr; - var mem = (parserInput.i += length); - var inp = input; - var c; - var nextChar; - var comment; - for (; parserInput.i < endIndex; parserInput.i++) { - c = inp.charCodeAt(parserInput.i); - if (parserInput.autoCommentAbsorb && c === CHARCODE_FORWARD_SLASH) { - nextChar = inp.charAt(parserInput.i + 1); - if (nextChar === '/') { - comment = { index: parserInput.i, isLineComment: true }; - var nextNewLine = inp.indexOf('\n', parserInput.i + 2); - if (nextNewLine < 0) { - nextNewLine = endIndex; - } - parserInput.i = nextNewLine; - comment.text = inp.substr(comment.index, parserInput.i - comment.index); - parserInput.commentStore.push(comment); - continue; - } - else if (nextChar === '*') { - var nextStarSlash = inp.indexOf('*/', parserInput.i + 2); - if (nextStarSlash >= 0) { - comment = { - index: parserInput.i, - text: inp.substr(parserInput.i, nextStarSlash + 2 - parserInput.i), - isLineComment: false - }; - parserInput.i += comment.text.length - 1; - parserInput.commentStore.push(comment); - continue; - } - } - break; - } - if ((c !== CHARCODE_SPACE) && (c !== CHARCODE_LF) && (c !== CHARCODE_TAB) && (c !== CHARCODE_CR)) { - break; - } - } - current = current.slice(length + parserInput.i - mem + curr); - currentPos = parserInput.i; - if (!current.length) { - if (j < chunks.length - 1) { - current = chunks[++j]; - skipWhitespace(0); // skip space at the beginning of a chunk - return true; // things changed - } - parserInput.finished = true; - } - return oldi !== parserInput.i || oldj !== j; - } - parserInput.save = function () { - currentPos = parserInput.i; - saveStack.push({ current: current, i: parserInput.i, j: j }); - }; - parserInput.restore = function (possibleErrorMessage) { - if (parserInput.i > furthest || (parserInput.i === furthest && possibleErrorMessage && !furthestPossibleErrorMessage)) { - furthest = parserInput.i; - furthestPossibleErrorMessage = possibleErrorMessage; - } - var state = saveStack.pop(); - current = state.current; - currentPos = parserInput.i = state.i; - j = state.j; - }; - parserInput.forget = function () { - saveStack.pop(); - }; - parserInput.isWhitespace = function (offset) { - var pos = parserInput.i + (offset || 0); - var code = input.charCodeAt(pos); - return (code === CHARCODE_SPACE || code === CHARCODE_CR || code === CHARCODE_TAB || code === CHARCODE_LF); - }; - // Specialization of $(tok) - parserInput.$re = function (tok) { - if (parserInput.i > currentPos) { - current = current.slice(parserInput.i - currentPos); - currentPos = parserInput.i; - } - var m = tok.exec(current); - if (!m) { - return null; - } - skipWhitespace(m[0].length); - if (typeof m === 'string') { - return m; - } - return m.length === 1 ? m[0] : m; - }; - parserInput.$char = function (tok) { - if (input.charAt(parserInput.i) !== tok) { - return null; - } - skipWhitespace(1); - return tok; - }; - parserInput.$str = function (tok) { - var tokLength = tok.length; - // https://jsperf.com/string-startswith/21 - for (var i = 0; i < tokLength; i++) { - if (input.charAt(parserInput.i + i) !== tok.charAt(i)) { - return null; - } - } - skipWhitespace(tokLength); - return tok; - }; - parserInput.$quoted = function (loc) { - var pos = loc || parserInput.i; - var startChar = input.charAt(pos); - if (startChar !== '\'' && startChar !== '"') { - return; - } - var length = input.length; - var currentPosition = pos; - for (var i = 1; i + currentPosition < length; i++) { - var nextChar = input.charAt(i + currentPosition); - switch (nextChar) { - case '\\': - i++; - continue; - case '\r': - case '\n': - break; - case startChar: - var str = input.substr(currentPosition, i + 1); - if (!loc && loc !== 0) { - skipWhitespace(i + 1); - return str; - } - return [startChar, str]; - } - } - return null; - }; - /** - * Permissive parsing. Ignores everything except matching {} [] () and quotes - * until matching token (outside of blocks) - */ - parserInput.$parseUntil = function (tok) { - var quote = ''; - var returnVal = null; - var inComment = false; - var blockDepth = 0; - var blockStack = []; - var parseGroups = []; - var length = input.length; - var startPos = parserInput.i; - var lastPos = parserInput.i; - var i = parserInput.i; - var loop = true; - var testChar; - if (typeof tok === 'string') { - testChar = function (char) { return char === tok; }; - } - else { - testChar = function (char) { return tok.test(char); }; - } - do { - var nextChar = input.charAt(i); - if (blockDepth === 0 && testChar(nextChar)) { - returnVal = input.substr(lastPos, i - lastPos); - if (returnVal) { - parseGroups.push(returnVal); - } - else { - parseGroups.push(' '); - } - returnVal = parseGroups; - skipWhitespace(i - startPos); - loop = false; - } - else { - if (inComment) { - if (nextChar === '*' && - input.charAt(i + 1) === '/') { - i++; - blockDepth--; - inComment = false; - } - i++; - continue; - } - switch (nextChar) { - case '\\': - i++; - nextChar = input.charAt(i); - parseGroups.push(input.substr(lastPos, i - lastPos + 1)); - lastPos = i + 1; - break; - case '/': - if (input.charAt(i + 1) === '*') { - i++; - inComment = true; - blockDepth++; - } - break; - case '\'': - case '"': - quote = parserInput.$quoted(i); - if (quote) { - parseGroups.push(input.substr(lastPos, i - lastPos), quote); - i += quote[1].length - 1; - lastPos = i + 1; - } - else { - skipWhitespace(i - startPos); - returnVal = nextChar; - loop = false; - } - break; - case '{': - blockStack.push('}'); - blockDepth++; - break; - case '(': - blockStack.push(')'); - blockDepth++; - break; - case '[': - blockStack.push(']'); - blockDepth++; - break; - case '}': - case ')': - case ']': - var expected = blockStack.pop(); - if (nextChar === expected) { - blockDepth--; - } - else { - // move the parser to the error and return expected - skipWhitespace(i - startPos); - returnVal = expected; - loop = false; - } - } - i++; - if (i > length) { - loop = false; - } - } - } while (loop); - return returnVal ? returnVal : null; - }; - parserInput.autoCommentAbsorb = true; - parserInput.commentStore = []; - parserInput.finished = false; - // Same as $(), but don't change the state of the parser, - // just return the match. - parserInput.peek = function (tok) { - if (typeof tok === 'string') { - // https://jsperf.com/string-startswith/21 - for (var i = 0; i < tok.length; i++) { - if (input.charAt(parserInput.i + i) !== tok.charAt(i)) { - return false; - } - } - return true; - } - else { - return tok.test(current); - } - }; - // Specialization of peek() - // TODO remove or change some currentChar calls to peekChar - parserInput.peekChar = function (tok) { return input.charAt(parserInput.i) === tok; }; - parserInput.currentChar = function () { return input.charAt(parserInput.i); }; - parserInput.prevChar = function () { return input.charAt(parserInput.i - 1); }; - parserInput.getInput = function () { return input; }; - parserInput.peekNotNumeric = function () { - var c = input.charCodeAt(parserInput.i); - // Is the first char of the dimension 0-9, '.', '+' or '-' - return (c > CHARCODE_9 || c < CHARCODE_PLUS) || c === CHARCODE_FORWARD_SLASH || c === CHARCODE_COMMA; - }; - parserInput.start = function (str, chunkInput, failFunction) { - input = str; - parserInput.i = j = currentPos = furthest = 0; - // chunking apparently makes things quicker (but my tests indicate - // it might actually make things slower in node at least) - // and it is a non-perfect parse - it can't recognise - // unquoted urls, meaning it can't distinguish comments - // meaning comments with quotes or {}() in them get 'counted' - // and then lead to parse errors. - // In addition if the chunking chunks in the wrong place we might - // not be able to parse a parser statement in one go - // this is officially deprecated but can be switched on via an option - // in the case it causes too much performance issues. - if (chunkInput) { - chunks = chunker(str, failFunction); - } - else { - chunks = [str]; - } - current = chunks[0]; - skipWhitespace(0); - }; - parserInput.end = function () { - var message; - var isFinished = parserInput.i >= input.length; - if (parserInput.i < furthest) { - message = furthestPossibleErrorMessage; - parserInput.i = furthest; - } - return { - isFinished: isFinished, - furthest: parserInput.i, - furthestPossibleErrorMessage: message, - furthestReachedEnd: parserInput.i >= input.length - 1, - furthestChar: input[parserInput.i] - }; - }; - return parserInput; - }); + var getParserInput = (function () { + var // Less input string + input; + var // current chunk + j; + var // holds state for backtracking + saveStack = []; + var // furthest index the parser has gone to + furthest; + var // if this is furthest we got to, this is the probably cause + furthestPossibleErrorMessage; + var // chunkified input + chunks; + var // current chunk + current; + var // index of current chunk, in `input` + currentPos; + var parserInput = {}; + var CHARCODE_SPACE = 32; + var CHARCODE_TAB = 9; + var CHARCODE_LF = 10; + var CHARCODE_CR = 13; + var CHARCODE_PLUS = 43; + var CHARCODE_COMMA = 44; + var CHARCODE_FORWARD_SLASH = 47; + var CHARCODE_9 = 57; + function skipWhitespace(length) { + var oldi = parserInput.i; + var oldj = j; + var curr = parserInput.i - currentPos; + var endIndex = parserInput.i + current.length - curr; + var mem = (parserInput.i += length); + var inp = input; + var c; + var nextChar; + var comment; + for (; parserInput.i < endIndex; parserInput.i++) { + c = inp.charCodeAt(parserInput.i); + if (parserInput.autoCommentAbsorb && c === CHARCODE_FORWARD_SLASH) { + nextChar = inp.charAt(parserInput.i + 1); + if (nextChar === '/') { + comment = { index: parserInput.i, isLineComment: true }; + var nextNewLine = inp.indexOf('\n', parserInput.i + 2); + if (nextNewLine < 0) { + nextNewLine = endIndex; + } + parserInput.i = nextNewLine; + comment.text = inp.substr(comment.index, parserInput.i - comment.index); + parserInput.commentStore.push(comment); + continue; + } + else if (nextChar === '*') { + var nextStarSlash = inp.indexOf('*/', parserInput.i + 2); + if (nextStarSlash >= 0) { + comment = { + index: parserInput.i, + text: inp.substr(parserInput.i, nextStarSlash + 2 - parserInput.i), + isLineComment: false + }; + parserInput.i += comment.text.length - 1; + parserInput.commentStore.push(comment); + continue; + } + } + break; + } + if ((c !== CHARCODE_SPACE) && (c !== CHARCODE_LF) && (c !== CHARCODE_TAB) && (c !== CHARCODE_CR)) { + break; + } + } + current = current.slice(length + parserInput.i - mem + curr); + currentPos = parserInput.i; + if (!current.length) { + if (j < chunks.length - 1) { + current = chunks[++j]; + skipWhitespace(0); // skip space at the beginning of a chunk + return true; // things changed + } + parserInput.finished = true; + } + return oldi !== parserInput.i || oldj !== j; + } + parserInput.save = function () { + currentPos = parserInput.i; + saveStack.push({ current: current, i: parserInput.i, j: j }); + }; + parserInput.restore = function (possibleErrorMessage) { + if (parserInput.i > furthest || (parserInput.i === furthest && possibleErrorMessage && !furthestPossibleErrorMessage)) { + furthest = parserInput.i; + furthestPossibleErrorMessage = possibleErrorMessage; + } + var state = saveStack.pop(); + current = state.current; + currentPos = parserInput.i = state.i; + j = state.j; + }; + parserInput.forget = function () { + saveStack.pop(); + }; + parserInput.isWhitespace = function (offset) { + var pos = parserInput.i + (offset || 0); + var code = input.charCodeAt(pos); + return (code === CHARCODE_SPACE || code === CHARCODE_CR || code === CHARCODE_TAB || code === CHARCODE_LF); + }; + // Specialization of $(tok) + parserInput.$re = function (tok) { + if (parserInput.i > currentPos) { + current = current.slice(parserInput.i - currentPos); + currentPos = parserInput.i; + } + var m = tok.exec(current); + if (!m) { + return null; + } + skipWhitespace(m[0].length); + if (typeof m === 'string') { + return m; + } + return m.length === 1 ? m[0] : m; + }; + parserInput.$char = function (tok) { + if (input.charAt(parserInput.i) !== tok) { + return null; + } + skipWhitespace(1); + return tok; + }; + parserInput.$str = function (tok) { + var tokLength = tok.length; + // https://jsperf.com/string-startswith/21 + for (var i = 0; i < tokLength; i++) { + if (input.charAt(parserInput.i + i) !== tok.charAt(i)) { + return null; + } + } + skipWhitespace(tokLength); + return tok; + }; + parserInput.$quoted = function (loc) { + var pos = loc || parserInput.i; + var startChar = input.charAt(pos); + if (startChar !== '\'' && startChar !== '"') { + return; + } + var length = input.length; + var currentPosition = pos; + for (var i = 1; i + currentPosition < length; i++) { + var nextChar = input.charAt(i + currentPosition); + switch (nextChar) { + case '\\': + i++; + continue; + case '\r': + case '\n': + break; + case startChar: + var str = input.substr(currentPosition, i + 1); + if (!loc && loc !== 0) { + skipWhitespace(i + 1); + return str; + } + return [startChar, str]; + } + } + return null; + }; + /** + * Permissive parsing. Ignores everything except matching {} [] () and quotes + * until matching token (outside of blocks) + */ + parserInput.$parseUntil = function (tok) { + var quote = ''; + var returnVal = null; + var inComment = false; + var blockDepth = 0; + var blockStack = []; + var parseGroups = []; + var length = input.length; + var startPos = parserInput.i; + var lastPos = parserInput.i; + var i = parserInput.i; + var loop = true; + var testChar; + if (typeof tok === 'string') { + testChar = function (char) { return char === tok; }; + } + else { + testChar = function (char) { return tok.test(char); }; + } + do { + var nextChar = input.charAt(i); + if (blockDepth === 0 && testChar(nextChar)) { + returnVal = input.substr(lastPos, i - lastPos); + if (returnVal) { + parseGroups.push(returnVal); + } + else { + parseGroups.push(' '); + } + returnVal = parseGroups; + skipWhitespace(i - startPos); + loop = false; + } + else { + if (inComment) { + if (nextChar === '*' && + input.charAt(i + 1) === '/') { + i++; + blockDepth--; + inComment = false; + } + i++; + continue; + } + switch (nextChar) { + case '\\': + i++; + nextChar = input.charAt(i); + parseGroups.push(input.substr(lastPos, i - lastPos + 1)); + lastPos = i + 1; + break; + case '/': + if (input.charAt(i + 1) === '*') { + i++; + inComment = true; + blockDepth++; + } + break; + case '\'': + case '"': + quote = parserInput.$quoted(i); + if (quote) { + parseGroups.push(input.substr(lastPos, i - lastPos), quote); + i += quote[1].length - 1; + lastPos = i + 1; + } + else { + skipWhitespace(i - startPos); + returnVal = nextChar; + loop = false; + } + break; + case '{': + blockStack.push('}'); + blockDepth++; + break; + case '(': + blockStack.push(')'); + blockDepth++; + break; + case '[': + blockStack.push(']'); + blockDepth++; + break; + case '}': + case ')': + case ']': + var expected = blockStack.pop(); + if (nextChar === expected) { + blockDepth--; + } + else { + // move the parser to the error and return expected + skipWhitespace(i - startPos); + returnVal = expected; + loop = false; + } + } + i++; + if (i > length) { + loop = false; + } + } + } while (loop); + return returnVal ? returnVal : null; + }; + parserInput.autoCommentAbsorb = true; + parserInput.commentStore = []; + parserInput.finished = false; + // Same as $(), but don't change the state of the parser, + // just return the match. + parserInput.peek = function (tok) { + if (typeof tok === 'string') { + // https://jsperf.com/string-startswith/21 + for (var i = 0; i < tok.length; i++) { + if (input.charAt(parserInput.i + i) !== tok.charAt(i)) { + return false; + } + } + return true; + } + else { + return tok.test(current); + } + }; + // Specialization of peek() + // TODO remove or change some currentChar calls to peekChar + parserInput.peekChar = function (tok) { return input.charAt(parserInput.i) === tok; }; + parserInput.currentChar = function () { return input.charAt(parserInput.i); }; + parserInput.prevChar = function () { return input.charAt(parserInput.i - 1); }; + parserInput.getInput = function () { return input; }; + parserInput.peekNotNumeric = function () { + var c = input.charCodeAt(parserInput.i); + // Is the first char of the dimension 0-9, '.', '+' or '-' + return (c > CHARCODE_9 || c < CHARCODE_PLUS) || c === CHARCODE_FORWARD_SLASH || c === CHARCODE_COMMA; + }; + parserInput.start = function (str, chunkInput, failFunction) { + input = str; + parserInput.i = j = currentPos = furthest = 0; + // chunking apparently makes things quicker (but my tests indicate + // it might actually make things slower in node at least) + // and it is a non-perfect parse - it can't recognise + // unquoted urls, meaning it can't distinguish comments + // meaning comments with quotes or {}() in them get 'counted' + // and then lead to parse errors. + // In addition if the chunking chunks in the wrong place we might + // not be able to parse a parser statement in one go + // this is officially deprecated but can be switched on via an option + // in the case it causes too much performance issues. + if (chunkInput) { + chunks = chunker(str, failFunction); + } + else { + chunks = [str]; + } + current = chunks[0]; + skipWhitespace(0); + }; + parserInput.end = function () { + var message; + var isFinished = parserInput.i >= input.length; + if (parserInput.i < furthest) { + message = furthestPossibleErrorMessage; + parserInput.i = furthest; + } + return { + isFinished: isFinished, + furthest: parserInput.i, + furthestPossibleErrorMessage: message, + furthestReachedEnd: parserInput.i >= input.length - 1, + furthestChar: input[parserInput.i] + }; + }; + return parserInput; + }); - // - // less.js - parser - // - // A relatively straight-forward predictive parser. - // There is no tokenization/lexing stage, the input is parsed - // in one sweep. - // - // To make the parser fast enough to run in the browser, several - // optimization had to be made: - // - // - Matching and slicing on a huge input is often cause of slowdowns. - // The solution is to chunkify the input into smaller strings. - // The chunks are stored in the `chunks` var, - // `j` holds the current chunk index, and `currentPos` holds - // the index of the current chunk in relation to `input`. - // This gives us an almost 4x speed-up. - // - // - In many cases, we don't need to match individual tokens; - // for example, if a value doesn't hold any variables, operations - // or dynamic references, the parser can effectively 'skip' it, - // treating it as a literal. - // An example would be '1px solid #000' - which evaluates to itself, - // we don't need to know what the individual components are. - // The drawback, of course is that you don't get the benefits of - // syntax-checking on the CSS. This gives us a 50% speed-up in the parser, - // and a smaller speed-up in the code-gen. - // - // - // Token matching is done with the `$` function, which either takes - // a terminal string or regexp, or a non-terminal function to call. - // It also takes care of moving all the indices forwards. - // - var Parser = function Parser(context, imports, fileInfo) { - var parsers; - var parserInput = getParserInput(); - function error(msg, type) { - throw new LessError({ - index: parserInput.i, - filename: fileInfo.filename, - type: type || 'Syntax', - message: msg - }, imports); - } - function expect(arg, msg) { - // some older browsers return typeof 'function' for RegExp - var result = (arg instanceof Function) ? arg.call(parsers) : parserInput.$re(arg); - if (result) { - return result; - } - error(msg || (typeof arg === 'string' - ? "expected '" + arg + "' got '" + parserInput.currentChar() + "'" - : 'unexpected token')); - } - // Specialization of expect() - function expectChar(arg, msg) { - if (parserInput.$char(arg)) { - return arg; - } - error(msg || "expected '" + arg + "' got '" + parserInput.currentChar() + "'"); - } - function getDebugInfo(index) { - var filename = fileInfo.filename; - return { - lineNumber: getLocation(index, parserInput.getInput()).line + 1, - fileName: filename - }; - } - /** - * Used after initial parsing to create nodes on the fly - * - * @param {String} str - string to parse - * @param {Array} parseList - array of parsers to run input through e.g. ["value", "important"] - * @param {Number} currentIndex - start number to begin indexing - * @param {Object} fileInfo - fileInfo to attach to created nodes - */ - function parseNode(str, parseList, currentIndex, fileInfo, callback) { - var result; - var returnNodes = []; - var parser = parserInput; - try { - parser.start(str, false, function fail(msg, index) { - callback({ - message: msg, - index: index + currentIndex - }); - }); - for (var x = 0, p = void 0, i = void 0; (p = parseList[x]); x++) { - i = parser.i; - result = parsers[p](); - if (result) { - try { - result._index = i + currentIndex; - result._fileInfo = fileInfo; - } - catch (e) { } - returnNodes.push(result); - } - else { - returnNodes.push(null); - } - } - var endInfo = parser.end(); - if (endInfo.isFinished) { - callback(null, returnNodes); - } - else { - callback(true, null); - } - } - catch (e) { - throw new LessError({ - index: e.index + currentIndex, - message: e.message - }, imports, fileInfo.filename); - } - } - // - // The Parser - // - return { - parserInput: parserInput, - imports: imports, - fileInfo: fileInfo, - parseNode: parseNode, - // - // Parse an input string into an abstract syntax tree, - // @param str A string containing 'less' markup - // @param callback call `callback` when done. - // @param [additionalData] An optional map which can contains vars - a map (key, value) of variables to apply - // - parse: function (str, callback, additionalData) { - var root; - var error = null; - var globalVars; - var modifyVars; - var ignored; - var preText = ''; - globalVars = (additionalData && additionalData.globalVars) ? Parser.serializeVars(additionalData.globalVars) + "\n" : ''; - modifyVars = (additionalData && additionalData.modifyVars) ? "\n" + Parser.serializeVars(additionalData.modifyVars) : ''; - if (context.pluginManager) { - var preProcessors = context.pluginManager.getPreProcessors(); - for (var i = 0; i < preProcessors.length; i++) { - str = preProcessors[i].process(str, { context: context, imports: imports, fileInfo: fileInfo }); - } - } - if (globalVars || (additionalData && additionalData.banner)) { - preText = ((additionalData && additionalData.banner) ? additionalData.banner : '') + globalVars; - ignored = imports.contentsIgnoredChars; - ignored[fileInfo.filename] = ignored[fileInfo.filename] || 0; - ignored[fileInfo.filename] += preText.length; - } - str = str.replace(/\r\n?/g, '\n'); - // Remove potential UTF Byte Order Mark - str = preText + str.replace(/^\uFEFF/, '') + modifyVars; - imports.contents[fileInfo.filename] = str; - // Start with the primary rule. - // The whole syntax tree is held under a Ruleset node, - // with the `root` property set to true, so no `{}` are - // output. The callback is called when the input is parsed. - try { - parserInput.start(str, context.chunkInput, function fail(msg, index) { - throw new LessError({ - index: index, - type: 'Parse', - message: msg, - filename: fileInfo.filename - }, imports); - }); - tree.Node.prototype.parse = this; - root = new tree.Ruleset(null, this.parsers.primary()); - tree.Node.prototype.rootNode = root; - root.root = true; - root.firstRoot = true; - root.functionRegistry = functionRegistry.inherit(); - } - catch (e) { - return callback(new LessError(e, imports, fileInfo.filename)); - } - // If `i` is smaller than the `input.length - 1`, - // it means the parser wasn't able to parse the whole - // string, so we've got a parsing error. - // - // We try to extract a \n delimited string, - // showing the line where the parse error occurred. - // We split it up into two parts (the part which parsed, - // and the part which didn't), so we can color them differently. - var endInfo = parserInput.end(); - if (!endInfo.isFinished) { - var message = endInfo.furthestPossibleErrorMessage; - if (!message) { - message = 'Unrecognised input'; - if (endInfo.furthestChar === '}') { - message += '. Possibly missing opening \'{\''; - } - else if (endInfo.furthestChar === ')') { - message += '. Possibly missing opening \'(\''; - } - else if (endInfo.furthestReachedEnd) { - message += '. Possibly missing something'; - } - } - error = new LessError({ - type: 'Parse', - message: message, - index: endInfo.furthest, - filename: fileInfo.filename - }, imports); - } - var finish = function (e) { - e = error || e || imports.error; - if (e) { - if (!(e instanceof LessError)) { - e = new LessError(e, imports, fileInfo.filename); - } - return callback(e); - } - else { - return callback(null, root); - } - }; - if (context.processImports !== false) { - new visitors.ImportVisitor(imports, finish) - .run(root); - } - else { - return finish(); - } - }, - // - // Here in, the parsing rules/functions - // - // The basic structure of the syntax tree generated is as follows: - // - // Ruleset -> Declaration -> Value -> Expression -> Entity - // - // Here's some Less code: - // - // .class { - // color: #fff; - // border: 1px solid #000; - // width: @w + 4px; - // > .child {...} - // } - // - // And here's what the parse tree might look like: - // - // Ruleset (Selector '.class', [ - // Declaration ("color", Value ([Expression [Color #fff]])) - // Declaration ("border", Value ([Expression [Dimension 1px][Keyword "solid"][Color #000]])) - // Declaration ("width", Value ([Expression [Operation " + " [Variable "@w"][Dimension 4px]]])) - // Ruleset (Selector [Element '>', '.child'], [...]) - // ]) - // - // In general, most rules will try to parse a token with the `$re()` function, and if the return - // value is truly, will return a new node, of the relevant type. Sometimes, we need to check - // first, before parsing, that's when we use `peek()`. - // - parsers: parsers = { - // - // The `primary` rule is the *entry* and *exit* point of the parser. - // The rules here can appear at any level of the parse tree. - // - // The recursive nature of the grammar is an interplay between the `block` - // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule, - // as represented by this simplified grammar: - // - // primary → (ruleset | declaration)+ - // ruleset → selector+ block - // block → '{' primary '}' - // - // Only at one point is the primary rule not called from the - // block rule: at the root level. - // - primary: function () { - var mixin = this.mixin; - var root = []; - var node; - while (true) { - while (true) { - node = this.comment(); - if (!node) { - break; - } - root.push(node); - } - // always process comments before deciding if finished - if (parserInput.finished) { - break; - } - if (parserInput.peek('}')) { - break; - } - node = this.extendRule(); - if (node) { - root = root.concat(node); - continue; - } - node = mixin.definition() || this.declaration() || mixin.call(false, false) || - this.ruleset() || this.variableCall() || this.entities.call() || this.atrule(); - if (node) { - root.push(node); - } - else { - var foundSemiColon = false; - while (parserInput.$char(';')) { - foundSemiColon = true; - } - if (!foundSemiColon) { - break; - } - } - } - return root; - }, - // comments are collected by the main parsing mechanism and then assigned to nodes - // where the current structure allows it - comment: function () { - if (parserInput.commentStore.length) { - var comment = parserInput.commentStore.shift(); - return new (tree.Comment)(comment.text, comment.isLineComment, comment.index, fileInfo); - } - }, - // - // Entities are tokens which can be found inside an Expression - // - entities: { - mixinLookup: function () { - return parsers.mixin.call(true, true); - }, - // - // A string, which supports escaping " and ' - // - // "milky way" 'he\'s the one!' - // - quoted: function (forceEscaped) { - var str; - var index = parserInput.i; - var isEscaped = false; - parserInput.save(); - if (parserInput.$char('~')) { - isEscaped = true; - } - else if (forceEscaped) { - parserInput.restore(); - return; - } - str = parserInput.$quoted(); - if (!str) { - parserInput.restore(); - return; - } - parserInput.forget(); - return new (tree.Quoted)(str.charAt(0), str.substr(1, str.length - 2), isEscaped, index, fileInfo); - }, - // - // A catch-all word, such as: - // - // black border-collapse - // - keyword: function () { - var k = parserInput.$char('%') || parserInput.$re(/^\[?(?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+\]?/); - if (k) { - return tree.Color.fromKeyword(k) || new (tree.Keyword)(k); - } - }, - // - // A function call - // - // rgb(255, 0, 255) - // - // The arguments are parsed with the `entities.arguments` parser. - // - call: function () { - var name; - var args; - var func; - var index = parserInput.i; - // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18 - if (parserInput.peek(/^url\(/i)) { - return; - } - parserInput.save(); - name = parserInput.$re(/^([\w-]+|%|progid:[\w\.]+)\(/); - if (!name) { - parserInput.forget(); - return; - } - name = name[1]; - func = this.customFuncCall(name); - if (func) { - args = func.parse(); - if (args && func.stop) { - parserInput.forget(); - return args; - } - } - args = this.arguments(args); - if (!parserInput.$char(')')) { - parserInput.restore('Could not parse call arguments or missing \')\''); - return; - } - parserInput.forget(); - return new (tree.Call)(name, args, index, fileInfo); - }, - // - // Parsing rules for functions with non-standard args, e.g.: - // - // boolean(not(2 > 1)) - // - // This is a quick prototype, to be modified/improved when - // more custom-parsed funcs come (e.g. `selector(...)`) - // - customFuncCall: function (name) { - /* Ideally the table is to be moved out of here for faster perf., - but it's quite tricky since it relies on all these `parsers` - and `expect` available only here */ - return { - alpha: f(parsers.ieAlpha, true), - boolean: f(condition), - 'if': f(condition) - }[name.toLowerCase()]; - function f(parse, stop) { - return { - parse: parse, - stop: stop // when true - stop after parse() and return its result, - // otherwise continue for plain args - }; - } - function condition() { - return [expect(parsers.condition, 'expected condition')]; - } - }, - arguments: function (prevArgs) { - var argsComma = prevArgs || []; - var argsSemiColon = []; - var isSemiColonSeparated; - var value; - parserInput.save(); - while (true) { - if (prevArgs) { - prevArgs = false; - } - else { - value = parsers.detachedRuleset() || this.assignment() || parsers.expression(); - if (!value) { - break; - } - if (value.value && value.value.length == 1) { - value = value.value[0]; - } - argsComma.push(value); - } - if (parserInput.$char(',')) { - continue; - } - if (parserInput.$char(';') || isSemiColonSeparated) { - isSemiColonSeparated = true; - value = (argsComma.length < 1) ? argsComma[0] - : new tree.Value(argsComma); - argsSemiColon.push(value); - argsComma = []; - } - } - parserInput.forget(); - return isSemiColonSeparated ? argsSemiColon : argsComma; - }, - literal: function () { - return this.dimension() || - this.color() || - this.quoted() || - this.unicodeDescriptor(); - }, - // Assignments are argument entities for calls. - // They are present in ie filter properties as shown below. - // - // filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* ) - // - assignment: function () { - var key; - var value; - parserInput.save(); - key = parserInput.$re(/^\w+(?=\s?=)/i); - if (!key) { - parserInput.restore(); - return; - } - if (!parserInput.$char('=')) { - parserInput.restore(); - return; - } - value = parsers.entity(); - if (value) { - parserInput.forget(); - return new (tree.Assignment)(key, value); - } - else { - parserInput.restore(); - } - }, - // - // Parse url() tokens - // - // We use a specific rule for urls, because they don't really behave like - // standard function calls. The difference is that the argument doesn't have - // to be enclosed within a string, so it can't be parsed as an Expression. - // - url: function () { - var value; - var index = parserInput.i; - parserInput.autoCommentAbsorb = false; - if (!parserInput.$str('url(')) { - parserInput.autoCommentAbsorb = true; - return; - } - value = this.quoted() || this.variable() || this.property() || - parserInput.$re(/^(?:(?:\\[\(\)'"])|[^\(\)'"])+/) || ''; - parserInput.autoCommentAbsorb = true; - expectChar(')'); - return new (tree.URL)((value.value != null || - value instanceof tree.Variable || - value instanceof tree.Property) ? - value : new (tree.Anonymous)(value, index), index, fileInfo); - }, - // - // A Variable entity, such as `@fink`, in - // - // width: @fink + 2px - // - // We use a different parser for variable definitions, - // see `parsers.variable`. - // - variable: function () { - var ch; - var name; - var index = parserInput.i; - parserInput.save(); - if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^@@?[\w-]+/))) { - ch = parserInput.currentChar(); - if (ch === '(' || ch === '[' && !parserInput.prevChar().match(/^\s/)) { - // this may be a VariableCall lookup - var result = parsers.variableCall(name); - if (result) { - parserInput.forget(); - return result; - } - } - parserInput.forget(); - return new (tree.Variable)(name, index, fileInfo); - } - parserInput.restore(); - }, - // A variable entity using the protective {} e.g. @{var} - variableCurly: function () { - var curly; - var index = parserInput.i; - if (parserInput.currentChar() === '@' && (curly = parserInput.$re(/^@\{([\w-]+)\}/))) { - return new (tree.Variable)("@" + curly[1], index, fileInfo); - } - }, - // - // A Property accessor, such as `$color`, in - // - // background-color: $color - // - property: function () { - var name; - var index = parserInput.i; - if (parserInput.currentChar() === '$' && (name = parserInput.$re(/^\$[\w-]+/))) { - return new (tree.Property)(name, index, fileInfo); - } - }, - // A property entity useing the protective {} e.g. ${prop} - propertyCurly: function () { - var curly; - var index = parserInput.i; - if (parserInput.currentChar() === '$' && (curly = parserInput.$re(/^\$\{([\w-]+)\}/))) { - return new (tree.Property)("$" + curly[1], index, fileInfo); - } - }, - // - // A Hexadecimal color - // - // #4F3C2F - // - // `rgb` and `hsl` colors are parsed through the `entities.call` parser. - // - color: function () { - var rgb; - parserInput.save(); - if (parserInput.currentChar() === '#' && (rgb = parserInput.$re(/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})([\w.#\[])?/))) { - if (!rgb[2]) { - parserInput.forget(); - return new (tree.Color)(rgb[1], undefined, rgb[0]); - } - } - parserInput.restore(); - }, - colorKeyword: function () { - parserInput.save(); - var autoCommentAbsorb = parserInput.autoCommentAbsorb; - parserInput.autoCommentAbsorb = false; - var k = parserInput.$re(/^[_A-Za-z-][_A-Za-z0-9-]+/); - parserInput.autoCommentAbsorb = autoCommentAbsorb; - if (!k) { - parserInput.forget(); - return; - } - parserInput.restore(); - var color = tree.Color.fromKeyword(k); - if (color) { - parserInput.$str(k); - return color; - } - }, - // - // A Dimension, that is, a number and a unit - // - // 0.5em 95% - // - dimension: function () { - if (parserInput.peekNotNumeric()) { - return; - } - var value = parserInput.$re(/^([+-]?\d*\.?\d+)(%|[a-z_]+)?/i); - if (value) { - return new (tree.Dimension)(value[1], value[2]); - } - }, - // - // A unicode descriptor, as is used in unicode-range - // - // U+0?? or U+00A1-00A9 - // - unicodeDescriptor: function () { - var ud; - ud = parserInput.$re(/^U\+[0-9a-fA-F?]+(\-[0-9a-fA-F?]+)?/); - if (ud) { - return new (tree.UnicodeDescriptor)(ud[0]); - } - }, - // - // JavaScript code to be evaluated - // - // `window.location.href` - // - javascript: function () { - var js; - var index = parserInput.i; - parserInput.save(); - var escape = parserInput.$char('~'); - var jsQuote = parserInput.$char('`'); - if (!jsQuote) { - parserInput.restore(); - return; - } - js = parserInput.$re(/^[^`]*`/); - if (js) { - parserInput.forget(); - return new (tree.JavaScript)(js.substr(0, js.length - 1), Boolean(escape), index, fileInfo); - } - parserInput.restore('invalid javascript definition'); - } - }, - // - // The variable part of a variable definition. Used in the `rule` parser - // - // @fink: - // - variable: function () { - var name; - if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^(@[\w-]+)\s*:/))) { - return name[1]; - } - }, - // - // Call a variable value to retrieve a detached ruleset - // or a value from a detached ruleset's rules. - // - // @fink(); - // @fink; - // color: @fink[@color]; - // - variableCall: function (parsedName) { - var lookups; - var i = parserInput.i; - var inValue = !!parsedName; - var name = parsedName; - parserInput.save(); - if (name || (parserInput.currentChar() === '@' - && (name = parserInput.$re(/^(@[\w-]+)(\(\s*\))?/)))) { - lookups = this.mixin.ruleLookups(); - if (!lookups && ((inValue && parserInput.$str('()') !== '()') || (name[2] !== '()'))) { - parserInput.restore('Missing \'[...]\' lookup in variable call'); - return; - } - if (!inValue) { - name = name[1]; - } - var call = new tree.VariableCall(name, i, fileInfo); - if (!inValue && parsers.end()) { - parserInput.forget(); - return call; - } - else { - parserInput.forget(); - return new tree.NamespaceValue(call, lookups, i, fileInfo); - } - } - parserInput.restore(); - }, - // - // extend syntax - used to extend selectors - // - extend: function (isRule) { - var elements; - var e; - var index = parserInput.i; - var option; - var extendList; - var extend; - if (!parserInput.$str(isRule ? '&:extend(' : ':extend(')) { - return; - } - do { - option = null; - elements = null; - while (!(option = parserInput.$re(/^(all)(?=\s*(\)|,))/))) { - e = this.element(); - if (!e) { - break; - } - if (elements) { - elements.push(e); - } - else { - elements = [e]; - } - } - option = option && option[1]; - if (!elements) { - error('Missing target selector for :extend().'); - } - extend = new (tree.Extend)(new (tree.Selector)(elements), option, index, fileInfo); - if (extendList) { - extendList.push(extend); - } - else { - extendList = [extend]; - } - } while (parserInput.$char(',')); - expect(/^\)/); - if (isRule) { - expect(/^;/); - } - return extendList; - }, - // - // extendRule - used in a rule to extend all the parent selectors - // - extendRule: function () { - return this.extend(true); - }, - // - // Mixins - // - mixin: { - // - // A Mixin call, with an optional argument list - // - // #mixins > .square(#fff); - // #mixins.square(#fff); - // .rounded(4px, black); - // .button; - // - // We can lookup / return a value using the lookup syntax: - // - // color: #mixin.square(#fff)[@color]; - // - // The `while` loop is there because mixins can be - // namespaced, but we only support the child and descendant - // selector for now. - // - call: function (inValue, getLookup) { - var s = parserInput.currentChar(); - var important = false; - var lookups; - var index = parserInput.i; - var elements; - var args; - var hasParens; - if (s !== '.' && s !== '#') { - return; - } - parserInput.save(); // stop us absorbing part of an invalid selector - elements = this.elements(); - if (elements) { - if (parserInput.$char('(')) { - args = this.args(true).args; - expectChar(')'); - hasParens = true; - } - if (getLookup !== false) { - lookups = this.ruleLookups(); - } - if (getLookup === true && !lookups) { - parserInput.restore(); - return; - } - if (inValue && !lookups && !hasParens) { - // This isn't a valid in-value mixin call - parserInput.restore(); - return; - } - if (!inValue && parsers.important()) { - important = true; - } - if (inValue || parsers.end()) { - parserInput.forget(); - var mixin = new (tree.mixin.Call)(elements, args, index, fileInfo, !lookups && important); - if (lookups) { - return new tree.NamespaceValue(mixin, lookups); - } - else { - return mixin; - } - } - } - parserInput.restore(); - }, - /** - * Matching elements for mixins - * (Start with . or # and can have > ) - */ - elements: function () { - var elements; - var e; - var c; - var elem; - var elemIndex; - var re = /^[#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/; - while (true) { - elemIndex = parserInput.i; - e = parserInput.$re(re); - if (!e) { - break; - } - elem = new (tree.Element)(c, e, false, elemIndex, fileInfo); - if (elements) { - elements.push(elem); - } - else { - elements = [elem]; - } - c = parserInput.$char('>'); - } - return elements; - }, - args: function (isCall) { - var entities = parsers.entities; - var returner = { args: null, variadic: false }; - var expressions = []; - var argsSemiColon = []; - var argsComma = []; - var isSemiColonSeparated; - var expressionContainsNamed; - var name; - var nameLoop; - var value; - var arg; - var expand; - var hasSep = true; - parserInput.save(); - while (true) { - if (isCall) { - arg = parsers.detachedRuleset() || parsers.expression(); - } - else { - parserInput.commentStore.length = 0; - if (parserInput.$str('...')) { - returner.variadic = true; - if (parserInput.$char(';') && !isSemiColonSeparated) { - isSemiColonSeparated = true; - } - (isSemiColonSeparated ? argsSemiColon : argsComma) - .push({ variadic: true }); - break; - } - arg = entities.variable() || entities.property() || entities.literal() || entities.keyword() || this.call(true); - } - if (!arg || !hasSep) { - break; - } - nameLoop = null; - if (arg.throwAwayComments) { - arg.throwAwayComments(); - } - value = arg; - var val = null; - if (isCall) { - // Variable - if (arg.value && arg.value.length == 1) { - val = arg.value[0]; - } - } - else { - val = arg; - } - if (val && (val instanceof tree.Variable || val instanceof tree.Property)) { - if (parserInput.$char(':')) { - if (expressions.length > 0) { - if (isSemiColonSeparated) { - error('Cannot mix ; and , as delimiter types'); - } - expressionContainsNamed = true; - } - value = parsers.detachedRuleset() || parsers.expression(); - if (!value) { - if (isCall) { - error('could not understand value for named argument'); - } - else { - parserInput.restore(); - returner.args = []; - return returner; - } - } - nameLoop = (name = val.name); - } - else if (parserInput.$str('...')) { - if (!isCall) { - returner.variadic = true; - if (parserInput.$char(';') && !isSemiColonSeparated) { - isSemiColonSeparated = true; - } - (isSemiColonSeparated ? argsSemiColon : argsComma) - .push({ name: arg.name, variadic: true }); - break; - } - else { - expand = true; - } - } - else if (!isCall) { - name = nameLoop = val.name; - value = null; - } - } - if (value) { - expressions.push(value); - } - argsComma.push({ name: nameLoop, value: value, expand: expand }); - if (parserInput.$char(',')) { - hasSep = true; - continue; - } - hasSep = parserInput.$char(';') === ';'; - if (hasSep || isSemiColonSeparated) { - if (expressionContainsNamed) { - error('Cannot mix ; and , as delimiter types'); - } - isSemiColonSeparated = true; - if (expressions.length > 1) { - value = new (tree.Value)(expressions); - } - argsSemiColon.push({ name: name, value: value, expand: expand }); - name = null; - expressions = []; - expressionContainsNamed = false; - } - } - parserInput.forget(); - returner.args = isSemiColonSeparated ? argsSemiColon : argsComma; - return returner; - }, - // - // A Mixin definition, with a list of parameters - // - // .rounded (@radius: 2px, @color) { - // ... - // } - // - // Until we have a finer grained state-machine, we have to - // do a look-ahead, to make sure we don't have a mixin call. - // See the `rule` function for more information. - // - // We start by matching `.rounded (`, and then proceed on to - // the argument list, which has optional default values. - // We store the parameters in `params`, with a `value` key, - // if there is a value, such as in the case of `@radius`. - // - // Once we've got our params list, and a closing `)`, we parse - // the `{...}` block. - // - definition: function () { - var name; - var params = []; - var match; - var ruleset; - var cond; - var variadic = false; - if ((parserInput.currentChar() !== '.' && parserInput.currentChar() !== '#') || - parserInput.peek(/^[^{]*\}/)) { - return; - } - parserInput.save(); - match = parserInput.$re(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/); - if (match) { - name = match[1]; - var argInfo = this.args(false); - params = argInfo.args; - variadic = argInfo.variadic; - // .mixincall("@{a}"); - // looks a bit like a mixin definition.. - // also - // .mixincall(@a: {rule: set;}); - // so we have to be nice and restore - if (!parserInput.$char(')')) { - parserInput.restore('Missing closing \')\''); - return; - } - parserInput.commentStore.length = 0; - if (parserInput.$str('when')) { // Guard - cond = expect(parsers.conditions, 'expected condition'); - } - ruleset = parsers.block(); - if (ruleset) { - parserInput.forget(); - return new (tree.mixin.Definition)(name, params, ruleset, cond, variadic); - } - else { - parserInput.restore(); - } - } - else { - parserInput.restore(); - } - }, - ruleLookups: function () { - var rule; - var lookups = []; - if (parserInput.currentChar() !== '[') { - return; - } - while (true) { - parserInput.save(); - rule = this.lookupValue(); - if (!rule && rule !== '') { - parserInput.restore(); - break; - } - lookups.push(rule); - parserInput.forget(); - } - if (lookups.length > 0) { - return lookups; - } - }, - lookupValue: function () { - parserInput.save(); - if (!parserInput.$char('[')) { - parserInput.restore(); - return; - } - var name = parserInput.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/); - if (!parserInput.$char(']')) { - parserInput.restore(); - return; - } - if (name || name === '') { - parserInput.forget(); - return name; - } - parserInput.restore(); - } - }, - // - // Entities are the smallest recognized token, - // and can be found inside a rule's value. - // - entity: function () { - var entities = this.entities; - return this.comment() || entities.literal() || entities.variable() || entities.url() || - entities.property() || entities.call() || entities.keyword() || this.mixin.call(true) || - entities.javascript(); - }, - // - // A Declaration terminator. Note that we use `peek()` to check for '}', - // because the `block` rule will be expecting it, but we still need to make sure - // it's there, if ';' was omitted. - // - end: function () { - return parserInput.$char(';') || parserInput.peek('}'); - }, - // - // IE's alpha function - // - // alpha(opacity=88) - // - ieAlpha: function () { - var value; - // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18 - if (!parserInput.$re(/^opacity=/i)) { - return; - } - value = parserInput.$re(/^\d+/); - if (!value) { - value = expect(parsers.entities.variable, 'Could not parse alpha'); - value = "@{" + value.name.slice(1) + "}"; - } - expectChar(')'); - return new tree.Quoted('', "alpha(opacity=" + value + ")"); - }, - // - // A Selector Element - // - // div - // + h1 - // #socks - // input[type="text"] - // - // Elements are the building blocks for Selectors, - // they are made out of a `Combinator` (see combinator rule), - // and an element name, such as a tag a class, or `*`. - // - element: function () { - var e; - var c; - var v; - var index = parserInput.i; - c = this.combinator(); - e = parserInput.$re(/^(?:\d+\.\d+|\d+)%/) || - parserInput.$re(/^(?:[.#]?|:*)(?:[\w-]|[^\x00-\x9f]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/) || - parserInput.$char('*') || parserInput.$char('&') || this.attribute() || - parserInput.$re(/^\([^&()@]+\)/) || parserInput.$re(/^[\.#:](?=@)/) || - this.entities.variableCurly(); - if (!e) { - parserInput.save(); - if (parserInput.$char('(')) { - if ((v = this.selector(false)) && parserInput.$char(')')) { - e = new (tree.Paren)(v); - parserInput.forget(); - } - else { - parserInput.restore('Missing closing \')\''); - } - } - else { - parserInput.forget(); - } - } - if (e) { - return new (tree.Element)(c, e, e instanceof tree.Variable, index, fileInfo); - } - }, - // - // Combinators combine elements together, in a Selector. - // - // Because our parser isn't white-space sensitive, special care - // has to be taken, when parsing the descendant combinator, ` `, - // as it's an empty space. We have to check the previous character - // in the input, to see if it's a ` ` character. More info on how - // we deal with this in *combinator.js*. - // - combinator: function () { - var c = parserInput.currentChar(); - if (c === '/') { - parserInput.save(); - var slashedCombinator = parserInput.$re(/^\/[a-z]+\//i); - if (slashedCombinator) { - parserInput.forget(); - return new (tree.Combinator)(slashedCombinator); - } - parserInput.restore(); - } - if (c === '>' || c === '+' || c === '~' || c === '|' || c === '^') { - parserInput.i++; - if (c === '^' && parserInput.currentChar() === '^') { - c = '^^'; - parserInput.i++; - } - while (parserInput.isWhitespace()) { - parserInput.i++; - } - return new (tree.Combinator)(c); - } - else if (parserInput.isWhitespace(-1)) { - return new (tree.Combinator)(' '); - } - else { - return new (tree.Combinator)(null); - } - }, - // - // A CSS Selector - // with less extensions e.g. the ability to extend and guard - // - // .class > div + h1 - // li a:hover - // - // Selectors are made out of one or more Elements, see above. - // - selector: function (isLess) { - var index = parserInput.i; - var elements; - var extendList; - var c; - var e; - var allExtends; - var when; - var condition; - isLess = isLess !== false; - while ((isLess && (extendList = this.extend())) || (isLess && (when = parserInput.$str('when'))) || (e = this.element())) { - if (when) { - condition = expect(this.conditions, 'expected condition'); - } - else if (condition) { - error('CSS guard can only be used at the end of selector'); - } - else if (extendList) { - if (allExtends) { - allExtends = allExtends.concat(extendList); - } - else { - allExtends = extendList; - } - } - else { - if (allExtends) { - error('Extend can only be used at the end of selector'); - } - c = parserInput.currentChar(); - if (elements) { - elements.push(e); - } - else { - elements = [e]; - } - e = null; - } - if (c === '{' || c === '}' || c === ';' || c === ',' || c === ')') { - break; - } - } - if (elements) { - return new (tree.Selector)(elements, allExtends, condition, index, fileInfo); - } - if (allExtends) { - error('Extend must be used to extend a selector, it cannot be used on its own'); - } - }, - selectors: function () { - var s; - var selectors; - while (true) { - s = this.selector(); - if (!s) { - break; - } - if (selectors) { - selectors.push(s); - } - else { - selectors = [s]; - } - parserInput.commentStore.length = 0; - if (s.condition && selectors.length > 1) { - error("Guards are only currently allowed on a single selector."); - } - if (!parserInput.$char(',')) { - break; - } - if (s.condition) { - error("Guards are only currently allowed on a single selector."); - } - parserInput.commentStore.length = 0; - } - return selectors; - }, - attribute: function () { - if (!parserInput.$char('[')) { - return; - } - var entities = this.entities; - var key; - var val; - var op; - if (!(key = entities.variableCurly())) { - key = expect(/^(?:[_A-Za-z0-9-\*]*\|)?(?:[_A-Za-z0-9-]|\\.)+/); - } - op = parserInput.$re(/^[|~*$^]?=/); - if (op) { - val = entities.quoted() || parserInput.$re(/^[0-9]+%/) || parserInput.$re(/^[\w-]+/) || entities.variableCurly(); - } - expectChar(']'); - return new (tree.Attribute)(key, op, val); - }, - // - // The `block` rule is used by `ruleset` and `mixin.definition`. - // It's a wrapper around the `primary` rule, with added `{}`. - // - block: function () { - var content; - if (parserInput.$char('{') && (content = this.primary()) && parserInput.$char('}')) { - return content; - } - }, - blockRuleset: function () { - var block = this.block(); - if (block) { - block = new tree.Ruleset(null, block); - } - return block; - }, - detachedRuleset: function () { - var argInfo; - var params; - var variadic; - parserInput.save(); - if (parserInput.$re(/^[.#]\(/)) { - /** - * DR args currently only implemented for each() function, and not - * yet settable as `@dr: #(@arg) {}` - * This should be done when DRs are merged with mixins. - * See: https://github.com/less/less-meta/issues/16 - */ - argInfo = this.mixin.args(false); - params = argInfo.args; - variadic = argInfo.variadic; - if (!parserInput.$char(')')) { - parserInput.restore(); - return; - } - } - var blockRuleset = this.blockRuleset(); - if (blockRuleset) { - parserInput.forget(); - if (params) { - return new tree.mixin.Definition(null, params, blockRuleset, null, variadic); - } - return new tree.DetachedRuleset(blockRuleset); - } - parserInput.restore(); - }, - // - // div, .class, body > p {...} - // - ruleset: function () { - var selectors; - var rules; - var debugInfo; - parserInput.save(); - if (context.dumpLineNumbers) { - debugInfo = getDebugInfo(parserInput.i); - } - selectors = this.selectors(); - if (selectors && (rules = this.block())) { - parserInput.forget(); - var ruleset = new (tree.Ruleset)(selectors, rules, context.strictImports); - if (context.dumpLineNumbers) { - ruleset.debugInfo = debugInfo; - } - return ruleset; - } - else { - parserInput.restore(); - } - }, - declaration: function () { - var name; - var value; - var index = parserInput.i; - var hasDR; - var c = parserInput.currentChar(); - var important; - var merge; - var isVariable; - if (c === '.' || c === '#' || c === '&' || c === ':') { - return; - } - parserInput.save(); - name = this.variable() || this.ruleProperty(); - if (name) { - isVariable = typeof name === 'string'; - if (isVariable) { - value = this.detachedRuleset(); - if (value) { - hasDR = true; - } - } - parserInput.commentStore.length = 0; - if (!value) { - // a name returned by this.ruleProperty() is always an array of the form: - // [string-1, ..., string-n, ""] or [string-1, ..., string-n, "+"] - // where each item is a tree.Keyword or tree.Variable - merge = !isVariable && name.length > 1 && name.pop().value; - // Custom property values get permissive parsing - if (name[0].value && name[0].value.slice(0, 2) === '--') { - value = this.permissiveValue(); - } - // Try to store values as anonymous - // If we need the value later we'll re-parse it in ruleset.parseValue - else { - value = this.anonymousValue(); - } - if (value) { - parserInput.forget(); - // anonymous values absorb the end ';' which is required for them to work - return new (tree.Declaration)(name, value, false, merge, index, fileInfo); - } - if (!value) { - value = this.value(); - } - if (value) { - important = this.important(); - } - else if (isVariable) { - // As a last resort, try permissiveValue - value = this.permissiveValue(); - } - } - if (value && (this.end() || hasDR)) { - parserInput.forget(); - return new (tree.Declaration)(name, value, important, merge, index, fileInfo); - } - else { - parserInput.restore(); - } - } - else { - parserInput.restore(); - } - }, - anonymousValue: function () { - var index = parserInput.i; - var match = parserInput.$re(/^([^.#@\$+\/'"*`(;{}-]*);/); - if (match) { - return new (tree.Anonymous)(match[1], index); - } - }, - /** - * Used for custom properties, at-rules, and variables (as fallback) - * Parses almost anything inside of {} [] () "" blocks - * until it reaches outer-most tokens. - * - * First, it will try to parse comments and entities to reach - * the end. This is mostly like the Expression parser except no - * math is allowed. - */ - permissiveValue: function (untilTokens) { - var i; - var e; - var done; - var value; - var tok = untilTokens || ';'; - var index = parserInput.i; - var result = []; - function testCurrentChar() { - var char = parserInput.currentChar(); - if (typeof tok === 'string') { - return char === tok; - } - else { - return tok.test(char); - } - } - if (testCurrentChar()) { - return; - } - value = []; - do { - e = this.comment(); - if (e) { - value.push(e); - continue; - } - e = this.entity(); - if (e) { - value.push(e); - } - } while (e); - done = testCurrentChar(); - if (value.length > 0) { - value = new (tree.Expression)(value); - if (done) { - return value; - } - else { - result.push(value); - } - // Preserve space before $parseUntil as it will not - if (parserInput.prevChar() === ' ') { - result.push(new tree.Anonymous(' ', index)); - } - } - parserInput.save(); - value = parserInput.$parseUntil(tok); - if (value) { - if (typeof value === 'string') { - error("Expected '" + value + "'", 'Parse'); - } - if (value.length === 1 && value[0] === ' ') { - parserInput.forget(); - return new tree.Anonymous('', index); - } - var item = void 0; - for (i = 0; i < value.length; i++) { - item = value[i]; - if (Array.isArray(item)) { - // Treat actual quotes as normal quoted values - result.push(new tree.Quoted(item[0], item[1], true, index, fileInfo)); - } - else { - if (i === value.length - 1) { - item = item.trim(); - } - // Treat like quoted values, but replace vars like unquoted expressions - var quote = new tree.Quoted('\'', item, true, index, fileInfo); - quote.variableRegex = /@([\w-]+)/g; - quote.propRegex = /\$([\w-]+)/g; - result.push(quote); - } - } - parserInput.forget(); - return new tree.Expression(result, true); - } - parserInput.restore(); - }, - // - // An @import atrule - // - // @import "lib"; - // - // Depending on our environment, importing is done differently: - // In the browser, it's an XHR request, in Node, it would be a - // file-system operation. The function used for importing is - // stored in `import`, which we pass to the Import constructor. - // - 'import': function () { - var path; - var features; - var index = parserInput.i; - var dir = parserInput.$re(/^@import?\s+/); - if (dir) { - var options = (dir ? this.importOptions() : null) || {}; - if ((path = this.entities.quoted() || this.entities.url())) { - features = this.mediaFeatures(); - if (!parserInput.$char(';')) { - parserInput.i = index; - error('missing semi-colon or unrecognised media features on import'); - } - features = features && new (tree.Value)(features); - return new (tree.Import)(path, features, options, index, fileInfo); - } - else { - parserInput.i = index; - error('malformed import statement'); - } - } - }, - importOptions: function () { - var o; - var options = {}; - var optionName; - var value; - // list of options, surrounded by parens - if (!parserInput.$char('(')) { - return null; - } - do { - o = this.importOption(); - if (o) { - optionName = o; - value = true; - switch (optionName) { - case 'css': - optionName = 'less'; - value = false; - break; - case 'once': - optionName = 'multiple'; - value = false; - break; - } - options[optionName] = value; - if (!parserInput.$char(',')) { - break; - } - } - } while (o); - expectChar(')'); - return options; - }, - importOption: function () { - var opt = parserInput.$re(/^(less|css|multiple|once|inline|reference|optional)/); - if (opt) { - return opt[1]; - } - }, - mediaFeature: function () { - var entities = this.entities; - var nodes = []; - var e; - var p; - parserInput.save(); - do { - e = entities.keyword() || entities.variable() || entities.mixinLookup(); - if (e) { - nodes.push(e); - } - else if (parserInput.$char('(')) { - p = this.property(); - e = this.value(); - if (parserInput.$char(')')) { - if (p && e) { - nodes.push(new (tree.Paren)(new (tree.Declaration)(p, e, null, null, parserInput.i, fileInfo, true))); - } - else if (e) { - nodes.push(new (tree.Paren)(e)); - } - else { - error('badly formed media feature definition'); - } - } - else { - error('Missing closing \')\'', 'Parse'); - } - } - } while (e); - parserInput.forget(); - if (nodes.length > 0) { - return new (tree.Expression)(nodes); - } - }, - mediaFeatures: function () { - var entities = this.entities; - var features = []; - var e; - do { - e = this.mediaFeature(); - if (e) { - features.push(e); - if (!parserInput.$char(',')) { - break; - } - } - else { - e = entities.variable() || entities.mixinLookup(); - if (e) { - features.push(e); - if (!parserInput.$char(',')) { - break; - } - } - } - } while (e); - return features.length > 0 ? features : null; - }, - media: function () { - var features; - var rules; - var media; - var debugInfo; - var index = parserInput.i; - if (context.dumpLineNumbers) { - debugInfo = getDebugInfo(index); - } - parserInput.save(); - if (parserInput.$str('@media')) { - features = this.mediaFeatures(); - rules = this.block(); - if (!rules) { - error('media definitions require block statements after any features'); - } - parserInput.forget(); - media = new (tree.Media)(rules, features, index, fileInfo); - if (context.dumpLineNumbers) { - media.debugInfo = debugInfo; - } - return media; - } - parserInput.restore(); - }, - // - // A @plugin directive, used to import plugins dynamically. - // - // @plugin (args) "lib"; - // - plugin: function () { - var path; - var args; - var options; - var index = parserInput.i; - var dir = parserInput.$re(/^@plugin?\s+/); - if (dir) { - args = this.pluginArgs(); - if (args) { - options = { - pluginArgs: args, - isPlugin: true - }; - } - else { - options = { isPlugin: true }; - } - if ((path = this.entities.quoted() || this.entities.url())) { - if (!parserInput.$char(';')) { - parserInput.i = index; - error('missing semi-colon on @plugin'); - } - return new (tree.Import)(path, null, options, index, fileInfo); - } - else { - parserInput.i = index; - error('malformed @plugin statement'); - } - } - }, - pluginArgs: function () { - // list of options, surrounded by parens - parserInput.save(); - if (!parserInput.$char('(')) { - parserInput.restore(); - return null; - } - var args = parserInput.$re(/^\s*([^\);]+)\)\s*/); - if (args[1]) { - parserInput.forget(); - return args[1].trim(); - } - else { - parserInput.restore(); - return null; - } - }, - // - // A CSS AtRule - // - // @charset "utf-8"; - // - atrule: function () { - var index = parserInput.i; - var name; - var value; - var rules; - var nonVendorSpecificName; - var hasIdentifier; - var hasExpression; - var hasUnknown; - var hasBlock = true; - var isRooted = true; - if (parserInput.currentChar() !== '@') { - return; - } - value = this['import']() || this.plugin() || this.media(); - if (value) { - return value; - } - parserInput.save(); - name = parserInput.$re(/^@[a-z-]+/); - if (!name) { - return; - } - nonVendorSpecificName = name; - if (name.charAt(1) == '-' && name.indexOf('-', 2) > 0) { - nonVendorSpecificName = "@" + name.slice(name.indexOf('-', 2) + 1); - } - switch (nonVendorSpecificName) { - case '@charset': - hasIdentifier = true; - hasBlock = false; - break; - case '@namespace': - hasExpression = true; - hasBlock = false; - break; - case '@keyframes': - case '@counter-style': - hasIdentifier = true; - break; - case '@document': - case '@supports': - hasUnknown = true; - isRooted = false; - break; - default: - hasUnknown = true; - break; - } - parserInput.commentStore.length = 0; - if (hasIdentifier) { - value = this.entity(); - if (!value) { - error("expected " + name + " identifier"); - } - } - else if (hasExpression) { - value = this.expression(); - if (!value) { - error("expected " + name + " expression"); - } - } - else if (hasUnknown) { - value = this.permissiveValue(/^[{;]/); - hasBlock = (parserInput.currentChar() === '{'); - if (!value) { - if (!hasBlock && parserInput.currentChar() !== ';') { - error(name + " rule is missing block or ending semi-colon"); - } - } - else if (!value.value) { - value = null; - } - } - if (hasBlock) { - rules = this.blockRuleset(); - } - if (rules || (!hasBlock && value && parserInput.$char(';'))) { - parserInput.forget(); - return new (tree.AtRule)(name, value, rules, index, fileInfo, context.dumpLineNumbers ? getDebugInfo(index) : null, isRooted); - } - parserInput.restore('at-rule options not recognised'); - }, - // - // A Value is a comma-delimited list of Expressions - // - // font-family: Baskerville, Georgia, serif; - // - // In a Rule, a Value represents everything after the `:`, - // and before the `;`. - // - value: function () { - var e; - var expressions = []; - var index = parserInput.i; - do { - e = this.expression(); - if (e) { - expressions.push(e); - if (!parserInput.$char(',')) { - break; - } - } - } while (e); - if (expressions.length > 0) { - return new (tree.Value)(expressions, index); - } - }, - important: function () { - if (parserInput.currentChar() === '!') { - return parserInput.$re(/^! *important/); - } - }, - sub: function () { - var a; - var e; - parserInput.save(); - if (parserInput.$char('(')) { - a = this.addition(); - if (a && parserInput.$char(')')) { - parserInput.forget(); - e = new (tree.Expression)([a]); - e.parens = true; - return e; - } - parserInput.restore('Expected \')\''); - return; - } - parserInput.restore(); - }, - multiplication: function () { - var m; - var a; - var op; - var operation; - var isSpaced; - m = this.operand(); - if (m) { - isSpaced = parserInput.isWhitespace(-1); - while (true) { - if (parserInput.peek(/^\/[*\/]/)) { - break; - } - parserInput.save(); - op = parserInput.$char('/') || parserInput.$char('*') || parserInput.$str('./'); - if (!op) { - parserInput.forget(); - break; - } - a = this.operand(); - if (!a) { - parserInput.restore(); - break; - } - parserInput.forget(); - m.parensInOp = true; - a.parensInOp = true; - operation = new (tree.Operation)(op, [operation || m, a], isSpaced); - isSpaced = parserInput.isWhitespace(-1); - } - return operation || m; - } - }, - addition: function () { - var m; - var a; - var op; - var operation; - var isSpaced; - m = this.multiplication(); - if (m) { - isSpaced = parserInput.isWhitespace(-1); - while (true) { - op = parserInput.$re(/^[-+]\s+/) || (!isSpaced && (parserInput.$char('+') || parserInput.$char('-'))); - if (!op) { - break; - } - a = this.multiplication(); - if (!a) { - break; - } - m.parensInOp = true; - a.parensInOp = true; - operation = new (tree.Operation)(op, [operation || m, a], isSpaced); - isSpaced = parserInput.isWhitespace(-1); - } - return operation || m; - } - }, - conditions: function () { - var a; - var b; - var index = parserInput.i; - var condition; - a = this.condition(true); - if (a) { - while (true) { - if (!parserInput.peek(/^,\s*(not\s*)?\(/) || !parserInput.$char(',')) { - break; - } - b = this.condition(true); - if (!b) { - break; - } - condition = new (tree.Condition)('or', condition || a, b, index); - } - return condition || a; - } - }, - condition: function (needsParens) { - var result; - var logical; - var next; - function or() { - return parserInput.$str('or'); - } - result = this.conditionAnd(needsParens); - if (!result) { - return; - } - logical = or(); - if (logical) { - next = this.condition(needsParens); - if (next) { - result = new (tree.Condition)(logical, result, next); - } - else { - return; - } - } - return result; - }, - conditionAnd: function (needsParens) { - var result; - var logical; - var next; - var self = this; - function insideCondition() { - var cond = self.negatedCondition(needsParens) || self.parenthesisCondition(needsParens); - if (!cond && !needsParens) { - return self.atomicCondition(needsParens); - } - return cond; - } - function and() { - return parserInput.$str('and'); - } - result = insideCondition(); - if (!result) { - return; - } - logical = and(); - if (logical) { - next = this.conditionAnd(needsParens); - if (next) { - result = new (tree.Condition)(logical, result, next); - } - else { - return; - } - } - return result; - }, - negatedCondition: function (needsParens) { - if (parserInput.$str('not')) { - var result = this.parenthesisCondition(needsParens); - if (result) { - result.negate = !result.negate; - } - return result; - } - }, - parenthesisCondition: function (needsParens) { - function tryConditionFollowedByParenthesis(me) { - var body; - parserInput.save(); - body = me.condition(needsParens); - if (!body) { - parserInput.restore(); - return; - } - if (!parserInput.$char(')')) { - parserInput.restore(); - return; - } - parserInput.forget(); - return body; - } - var body; - parserInput.save(); - if (!parserInput.$str('(')) { - parserInput.restore(); - return; - } - body = tryConditionFollowedByParenthesis(this); - if (body) { - parserInput.forget(); - return body; - } - body = this.atomicCondition(needsParens); - if (!body) { - parserInput.restore(); - return; - } - if (!parserInput.$char(')')) { - parserInput.restore("expected ')' got '" + parserInput.currentChar() + "'"); - return; - } - parserInput.forget(); - return body; - }, - atomicCondition: function (needsParens) { - var entities = this.entities; - var index = parserInput.i; - var a; - var b; - var c; - var op; - function cond() { - return this.addition() || entities.keyword() || entities.quoted() || entities.mixinLookup(); - } - cond = cond.bind(this); - a = cond(); - if (a) { - if (parserInput.$char('>')) { - if (parserInput.$char('=')) { - op = '>='; - } - else { - op = '>'; - } - } - else if (parserInput.$char('<')) { - if (parserInput.$char('=')) { - op = '<='; - } - else { - op = '<'; - } - } - else if (parserInput.$char('=')) { - if (parserInput.$char('>')) { - op = '=>'; - } - else if (parserInput.$char('<')) { - op = '=<'; - } - else { - op = '='; - } - } - if (op) { - b = cond(); - if (b) { - c = new (tree.Condition)(op, a, b, index, false); - } - else { - error('expected expression'); - } - } - else { - c = new (tree.Condition)('=', a, new (tree.Keyword)('true'), index, false); - } - return c; - } - }, - // - // An operand is anything that can be part of an operation, - // such as a Color, or a Variable - // - operand: function () { - var entities = this.entities; - var negate; - if (parserInput.peek(/^-[@\$\(]/)) { - negate = parserInput.$char('-'); - } - var o = this.sub() || entities.dimension() || - entities.color() || entities.variable() || - entities.property() || entities.call() || - entities.quoted(true) || entities.colorKeyword() || - entities.mixinLookup(); - if (negate) { - o.parensInOp = true; - o = new (tree.Negative)(o); - } - return o; - }, - // - // Expressions either represent mathematical operations, - // or white-space delimited Entities. - // - // 1px solid black - // @var * 2 - // - expression: function () { - var entities = []; - var e; - var delim; - var index = parserInput.i; - do { - e = this.comment(); - if (e) { - entities.push(e); - continue; - } - e = this.addition() || this.entity(); - if (e instanceof tree.Comment) { - e = null; - } - if (e) { - entities.push(e); - // operations do not allow keyword "/" dimension (e.g. small/20px) so we support that here - if (!parserInput.peek(/^\/[\/*]/)) { - delim = parserInput.$char('/'); - if (delim) { - entities.push(new (tree.Anonymous)(delim, index)); - } - } - } - } while (e); - if (entities.length > 0) { - return new (tree.Expression)(entities); - } - }, - property: function () { - var name = parserInput.$re(/^(\*?-?[_a-zA-Z0-9-]+)\s*:/); - if (name) { - return name[1]; - } - }, - ruleProperty: function () { - var name = []; - var index = []; - var s; - var k; - parserInput.save(); - var simpleProperty = parserInput.$re(/^([_a-zA-Z0-9-]+)\s*:/); - if (simpleProperty) { - name = [new (tree.Keyword)(simpleProperty[1])]; - parserInput.forget(); - return name; - } - function match(re) { - var i = parserInput.i; - var chunk = parserInput.$re(re); - if (chunk) { - index.push(i); - return name.push(chunk[1]); - } - } - match(/^(\*?)/); - while (true) { - if (!match(/^((?:[\w-]+)|(?:[@\$]\{[\w-]+\}))/)) { - break; - } - } - if ((name.length > 1) && match(/^((?:\+_|\+)?)\s*:/)) { - parserInput.forget(); - // at last, we have the complete match now. move forward, - // convert name particles to tree objects and return: - if (name[0] === '') { - name.shift(); - index.shift(); - } - for (k = 0; k < name.length; k++) { - s = name[k]; - name[k] = (s.charAt(0) !== '@' && s.charAt(0) !== '$') ? - new (tree.Keyword)(s) : - (s.charAt(0) === '@' ? - new (tree.Variable)("@" + s.slice(2, -1), index[k], fileInfo) : - new (tree.Property)("$" + s.slice(2, -1), index[k], fileInfo)); - } - return name; - } - parserInput.restore(); - } - } - }; - }; - Parser.serializeVars = function (vars) { - var s = ''; - for (var name_1 in vars) { - if (Object.hasOwnProperty.call(vars, name_1)) { - var value = vars[name_1]; - s += ((name_1[0] === '@') ? '' : '@') + name_1 + ": " + value + ((String(value).slice(-1) === ';') ? '' : ';'); - } - } - return s; - }; + // + // less.js - parser + // + // A relatively straight-forward predictive parser. + // There is no tokenization/lexing stage, the input is parsed + // in one sweep. + // + // To make the parser fast enough to run in the browser, several + // optimization had to be made: + // + // - Matching and slicing on a huge input is often cause of slowdowns. + // The solution is to chunkify the input into smaller strings. + // The chunks are stored in the `chunks` var, + // `j` holds the current chunk index, and `currentPos` holds + // the index of the current chunk in relation to `input`. + // This gives us an almost 4x speed-up. + // + // - In many cases, we don't need to match individual tokens; + // for example, if a value doesn't hold any variables, operations + // or dynamic references, the parser can effectively 'skip' it, + // treating it as a literal. + // An example would be '1px solid #000' - which evaluates to itself, + // we don't need to know what the individual components are. + // The drawback, of course is that you don't get the benefits of + // syntax-checking on the CSS. This gives us a 50% speed-up in the parser, + // and a smaller speed-up in the code-gen. + // + // + // Token matching is done with the `$` function, which either takes + // a terminal string or regexp, or a non-terminal function to call. + // It also takes care of moving all the indices forwards. + // + var Parser = function Parser(context, imports, fileInfo) { + var parsers; + var parserInput = getParserInput(); + function error(msg, type) { + throw new LessError({ + index: parserInput.i, + filename: fileInfo.filename, + type: type || 'Syntax', + message: msg + }, imports); + } + function expect(arg, msg) { + // some older browsers return typeof 'function' for RegExp + var result = (arg instanceof Function) ? arg.call(parsers) : parserInput.$re(arg); + if (result) { + return result; + } + error(msg || (typeof arg === 'string' + ? "expected '" + arg + "' got '" + parserInput.currentChar() + "'" + : 'unexpected token')); + } + // Specialization of expect() + function expectChar(arg, msg) { + if (parserInput.$char(arg)) { + return arg; + } + error(msg || "expected '" + arg + "' got '" + parserInput.currentChar() + "'"); + } + function getDebugInfo(index) { + var filename = fileInfo.filename; + return { + lineNumber: getLocation(index, parserInput.getInput()).line + 1, + fileName: filename + }; + } + /** + * Used after initial parsing to create nodes on the fly + * + * @param {String} str - string to parse + * @param {Array} parseList - array of parsers to run input through e.g. ["value", "important"] + * @param {Number} currentIndex - start number to begin indexing + * @param {Object} fileInfo - fileInfo to attach to created nodes + */ + function parseNode(str, parseList, currentIndex, fileInfo, callback) { + var result; + var returnNodes = []; + var parser = parserInput; + try { + parser.start(str, false, function fail(msg, index) { + callback({ + message: msg, + index: index + currentIndex + }); + }); + for (var x = 0, p = void 0, i = void 0; (p = parseList[x]); x++) { + i = parser.i; + result = parsers[p](); + if (result) { + try { + result._index = i + currentIndex; + result._fileInfo = fileInfo; + } + catch (e) { } + returnNodes.push(result); + } + else { + returnNodes.push(null); + } + } + var endInfo = parser.end(); + if (endInfo.isFinished) { + callback(null, returnNodes); + } + else { + callback(true, null); + } + } + catch (e) { + throw new LessError({ + index: e.index + currentIndex, + message: e.message + }, imports, fileInfo.filename); + } + } + // + // The Parser + // + return { + parserInput: parserInput, + imports: imports, + fileInfo: fileInfo, + parseNode: parseNode, + // + // Parse an input string into an abstract syntax tree, + // @param str A string containing 'less' markup + // @param callback call `callback` when done. + // @param [additionalData] An optional map which can contains vars - a map (key, value) of variables to apply + // + parse: function (str, callback, additionalData) { + var root; + var error = null; + var globalVars; + var modifyVars; + var ignored; + var preText = ''; + globalVars = (additionalData && additionalData.globalVars) ? Parser.serializeVars(additionalData.globalVars) + "\n" : ''; + modifyVars = (additionalData && additionalData.modifyVars) ? "\n" + Parser.serializeVars(additionalData.modifyVars) : ''; + if (context.pluginManager) { + var preProcessors = context.pluginManager.getPreProcessors(); + for (var i = 0; i < preProcessors.length; i++) { + str = preProcessors[i].process(str, { context: context, imports: imports, fileInfo: fileInfo }); + } + } + if (globalVars || (additionalData && additionalData.banner)) { + preText = ((additionalData && additionalData.banner) ? additionalData.banner : '') + globalVars; + ignored = imports.contentsIgnoredChars; + ignored[fileInfo.filename] = ignored[fileInfo.filename] || 0; + ignored[fileInfo.filename] += preText.length; + } + str = str.replace(/\r\n?/g, '\n'); + // Remove potential UTF Byte Order Mark + str = preText + str.replace(/^\uFEFF/, '') + modifyVars; + imports.contents[fileInfo.filename] = str; + // Start with the primary rule. + // The whole syntax tree is held under a Ruleset node, + // with the `root` property set to true, so no `{}` are + // output. The callback is called when the input is parsed. + try { + parserInput.start(str, context.chunkInput, function fail(msg, index) { + throw new LessError({ + index: index, + type: 'Parse', + message: msg, + filename: fileInfo.filename + }, imports); + }); + tree.Node.prototype.parse = this; + root = new tree.Ruleset(null, this.parsers.primary()); + tree.Node.prototype.rootNode = root; + root.root = true; + root.firstRoot = true; + root.functionRegistry = functionRegistry.inherit(); + } + catch (e) { + return callback(new LessError(e, imports, fileInfo.filename)); + } + // If `i` is smaller than the `input.length - 1`, + // it means the parser wasn't able to parse the whole + // string, so we've got a parsing error. + // + // We try to extract a \n delimited string, + // showing the line where the parse error occurred. + // We split it up into two parts (the part which parsed, + // and the part which didn't), so we can color them differently. + var endInfo = parserInput.end(); + if (!endInfo.isFinished) { + var message = endInfo.furthestPossibleErrorMessage; + if (!message) { + message = 'Unrecognised input'; + if (endInfo.furthestChar === '}') { + message += '. Possibly missing opening \'{\''; + } + else if (endInfo.furthestChar === ')') { + message += '. Possibly missing opening \'(\''; + } + else if (endInfo.furthestReachedEnd) { + message += '. Possibly missing something'; + } + } + error = new LessError({ + type: 'Parse', + message: message, + index: endInfo.furthest, + filename: fileInfo.filename + }, imports); + } + var finish = function (e) { + e = error || e || imports.error; + if (e) { + if (!(e instanceof LessError)) { + e = new LessError(e, imports, fileInfo.filename); + } + return callback(e); + } + else { + return callback(null, root); + } + }; + if (context.processImports !== false) { + new visitors.ImportVisitor(imports, finish) + .run(root); + } + else { + return finish(); + } + }, + // + // Here in, the parsing rules/functions + // + // The basic structure of the syntax tree generated is as follows: + // + // Ruleset -> Declaration -> Value -> Expression -> Entity + // + // Here's some Less code: + // + // .class { + // color: #fff; + // border: 1px solid #000; + // width: @w + 4px; + // > .child {...} + // } + // + // And here's what the parse tree might look like: + // + // Ruleset (Selector '.class', [ + // Declaration ("color", Value ([Expression [Color #fff]])) + // Declaration ("border", Value ([Expression [Dimension 1px][Keyword "solid"][Color #000]])) + // Declaration ("width", Value ([Expression [Operation " + " [Variable "@w"][Dimension 4px]]])) + // Ruleset (Selector [Element '>', '.child'], [...]) + // ]) + // + // In general, most rules will try to parse a token with the `$re()` function, and if the return + // value is truly, will return a new node, of the relevant type. Sometimes, we need to check + // first, before parsing, that's when we use `peek()`. + // + parsers: parsers = { + // + // The `primary` rule is the *entry* and *exit* point of the parser. + // The rules here can appear at any level of the parse tree. + // + // The recursive nature of the grammar is an interplay between the `block` + // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule, + // as represented by this simplified grammar: + // + // primary → (ruleset | declaration)+ + // ruleset → selector+ block + // block → '{' primary '}' + // + // Only at one point is the primary rule not called from the + // block rule: at the root level. + // + primary: function () { + var mixin = this.mixin; + var root = []; + var node; + while (true) { + while (true) { + node = this.comment(); + if (!node) { + break; + } + root.push(node); + } + // always process comments before deciding if finished + if (parserInput.finished) { + break; + } + if (parserInput.peek('}')) { + break; + } + node = this.extendRule(); + if (node) { + root = root.concat(node); + continue; + } + node = mixin.definition() || this.declaration() || mixin.call(false, false) || + this.ruleset() || this.variableCall() || this.entities.call() || this.atrule(); + if (node) { + root.push(node); + } + else { + var foundSemiColon = false; + while (parserInput.$char(';')) { + foundSemiColon = true; + } + if (!foundSemiColon) { + break; + } + } + } + return root; + }, + // comments are collected by the main parsing mechanism and then assigned to nodes + // where the current structure allows it + comment: function () { + if (parserInput.commentStore.length) { + var comment = parserInput.commentStore.shift(); + return new (tree.Comment)(comment.text, comment.isLineComment, comment.index, fileInfo); + } + }, + // + // Entities are tokens which can be found inside an Expression + // + entities: { + mixinLookup: function () { + return parsers.mixin.call(true, true); + }, + // + // A string, which supports escaping " and ' + // + // "milky way" 'he\'s the one!' + // + quoted: function (forceEscaped) { + var str; + var index = parserInput.i; + var isEscaped = false; + parserInput.save(); + if (parserInput.$char('~')) { + isEscaped = true; + } + else if (forceEscaped) { + parserInput.restore(); + return; + } + str = parserInput.$quoted(); + if (!str) { + parserInput.restore(); + return; + } + parserInput.forget(); + return new (tree.Quoted)(str.charAt(0), str.substr(1, str.length - 2), isEscaped, index, fileInfo); + }, + // + // A catch-all word, such as: + // + // black border-collapse + // + keyword: function () { + var k = parserInput.$char('%') || parserInput.$re(/^\[?(?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+\]?/); + if (k) { + return tree.Color.fromKeyword(k) || new (tree.Keyword)(k); + } + }, + // + // A function call + // + // rgb(255, 0, 255) + // + // The arguments are parsed with the `entities.arguments` parser. + // + call: function () { + var name; + var args; + var func; + var index = parserInput.i; + // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18 + if (parserInput.peek(/^url\(/i)) { + return; + } + parserInput.save(); + name = parserInput.$re(/^([\w-]+|%|~|progid:[\w\.]+)\(/); + if (!name) { + parserInput.forget(); + return; + } + name = name[1]; + func = this.customFuncCall(name); + if (func) { + args = func.parse(); + if (args && func.stop) { + parserInput.forget(); + return args; + } + } + args = this.arguments(args); + if (!parserInput.$char(')')) { + parserInput.restore('Could not parse call arguments or missing \')\''); + return; + } + parserInput.forget(); + return new (tree.Call)(name, args, index, fileInfo); + }, + // + // Parsing rules for functions with non-standard args, e.g.: + // + // boolean(not(2 > 1)) + // + // This is a quick prototype, to be modified/improved when + // more custom-parsed funcs come (e.g. `selector(...)`) + // + customFuncCall: function (name) { + /* Ideally the table is to be moved out of here for faster perf., + but it's quite tricky since it relies on all these `parsers` + and `expect` available only here */ + return { + alpha: f(parsers.ieAlpha, true), + boolean: f(condition), + 'if': f(condition) + }[name.toLowerCase()]; + function f(parse, stop) { + return { + parse: parse, + stop: stop // when true - stop after parse() and return its result, + // otherwise continue for plain args + }; + } + function condition() { + return [expect(parsers.condition, 'expected condition')]; + } + }, + arguments: function (prevArgs) { + var argsComma = prevArgs || []; + var argsSemiColon = []; + var isSemiColonSeparated; + var value; + parserInput.save(); + while (true) { + if (prevArgs) { + prevArgs = false; + } + else { + value = parsers.detachedRuleset() || this.assignment() || parsers.expression(); + if (!value) { + break; + } + if (value.value && value.value.length == 1) { + value = value.value[0]; + } + argsComma.push(value); + } + if (parserInput.$char(',')) { + continue; + } + if (parserInput.$char(';') || isSemiColonSeparated) { + isSemiColonSeparated = true; + value = (argsComma.length < 1) ? argsComma[0] + : new tree.Value(argsComma); + argsSemiColon.push(value); + argsComma = []; + } + } + parserInput.forget(); + return isSemiColonSeparated ? argsSemiColon : argsComma; + }, + literal: function () { + return this.dimension() || + this.color() || + this.quoted() || + this.unicodeDescriptor(); + }, + // Assignments are argument entities for calls. + // They are present in ie filter properties as shown below. + // + // filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* ) + // + assignment: function () { + var key; + var value; + parserInput.save(); + key = parserInput.$re(/^\w+(?=\s?=)/i); + if (!key) { + parserInput.restore(); + return; + } + if (!parserInput.$char('=')) { + parserInput.restore(); + return; + } + value = parsers.entity(); + if (value) { + parserInput.forget(); + return new (tree.Assignment)(key, value); + } + else { + parserInput.restore(); + } + }, + // + // Parse url() tokens + // + // We use a specific rule for urls, because they don't really behave like + // standard function calls. The difference is that the argument doesn't have + // to be enclosed within a string, so it can't be parsed as an Expression. + // + url: function () { + var value; + var index = parserInput.i; + parserInput.autoCommentAbsorb = false; + if (!parserInput.$str('url(')) { + parserInput.autoCommentAbsorb = true; + return; + } + value = this.quoted() || this.variable() || this.property() || + parserInput.$re(/^(?:(?:\\[\(\)'"])|[^\(\)'"])+/) || ''; + parserInput.autoCommentAbsorb = true; + expectChar(')'); + return new (tree.URL)((value.value != null || + value instanceof tree.Variable || + value instanceof tree.Property) ? + value : new (tree.Anonymous)(value, index), index, fileInfo); + }, + // + // A Variable entity, such as `@fink`, in + // + // width: @fink + 2px + // + // We use a different parser for variable definitions, + // see `parsers.variable`. + // + variable: function () { + var ch; + var name; + var index = parserInput.i; + parserInput.save(); + if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^@@?[\w-]+/))) { + ch = parserInput.currentChar(); + if (ch === '(' || ch === '[' && !parserInput.prevChar().match(/^\s/)) { + // this may be a VariableCall lookup + var result = parsers.variableCall(name); + if (result) { + parserInput.forget(); + return result; + } + } + parserInput.forget(); + return new (tree.Variable)(name, index, fileInfo); + } + parserInput.restore(); + }, + // A variable entity using the protective {} e.g. @{var} + variableCurly: function () { + var curly; + var index = parserInput.i; + if (parserInput.currentChar() === '@' && (curly = parserInput.$re(/^@\{([\w-]+)\}/))) { + return new (tree.Variable)("@" + curly[1], index, fileInfo); + } + }, + // + // A Property accessor, such as `$color`, in + // + // background-color: $color + // + property: function () { + var name; + var index = parserInput.i; + if (parserInput.currentChar() === '$' && (name = parserInput.$re(/^\$[\w-]+/))) { + return new (tree.Property)(name, index, fileInfo); + } + }, + // A property entity useing the protective {} e.g. ${prop} + propertyCurly: function () { + var curly; + var index = parserInput.i; + if (parserInput.currentChar() === '$' && (curly = parserInput.$re(/^\$\{([\w-]+)\}/))) { + return new (tree.Property)("$" + curly[1], index, fileInfo); + } + }, + // + // A Hexadecimal color + // + // #4F3C2F + // + // `rgb` and `hsl` colors are parsed through the `entities.call` parser. + // + color: function () { + var rgb; + parserInput.save(); + if (parserInput.currentChar() === '#' && (rgb = parserInput.$re(/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})([\w.#\[])?/))) { + if (!rgb[2]) { + parserInput.forget(); + return new (tree.Color)(rgb[1], undefined, rgb[0]); + } + } + parserInput.restore(); + }, + colorKeyword: function () { + parserInput.save(); + var autoCommentAbsorb = parserInput.autoCommentAbsorb; + parserInput.autoCommentAbsorb = false; + var k = parserInput.$re(/^[_A-Za-z-][_A-Za-z0-9-]+/); + parserInput.autoCommentAbsorb = autoCommentAbsorb; + if (!k) { + parserInput.forget(); + return; + } + parserInput.restore(); + var color = tree.Color.fromKeyword(k); + if (color) { + parserInput.$str(k); + return color; + } + }, + // + // A Dimension, that is, a number and a unit + // + // 0.5em 95% + // + dimension: function () { + if (parserInput.peekNotNumeric()) { + return; + } + var value = parserInput.$re(/^([+-]?\d*\.?\d+)(%|[a-z_]+)?/i); + if (value) { + return new (tree.Dimension)(value[1], value[2]); + } + }, + // + // A unicode descriptor, as is used in unicode-range + // + // U+0?? or U+00A1-00A9 + // + unicodeDescriptor: function () { + var ud; + ud = parserInput.$re(/^U\+[0-9a-fA-F?]+(\-[0-9a-fA-F?]+)?/); + if (ud) { + return new (tree.UnicodeDescriptor)(ud[0]); + } + }, + // + // JavaScript code to be evaluated + // + // `window.location.href` + // + javascript: function () { + var js; + var index = parserInput.i; + parserInput.save(); + var escape = parserInput.$char('~'); + var jsQuote = parserInput.$char('`'); + if (!jsQuote) { + parserInput.restore(); + return; + } + js = parserInput.$re(/^[^`]*`/); + if (js) { + parserInput.forget(); + return new (tree.JavaScript)(js.substr(0, js.length - 1), Boolean(escape), index, fileInfo); + } + parserInput.restore('invalid javascript definition'); + } + }, + // + // The variable part of a variable definition. Used in the `rule` parser + // + // @fink: + // + variable: function () { + var name; + if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^(@[\w-]+)\s*:/))) { + return name[1]; + } + }, + // + // Call a variable value to retrieve a detached ruleset + // or a value from a detached ruleset's rules. + // + // @fink(); + // @fink; + // color: @fink[@color]; + // + variableCall: function (parsedName) { + var lookups; + var i = parserInput.i; + var inValue = !!parsedName; + var name = parsedName; + parserInput.save(); + if (name || (parserInput.currentChar() === '@' + && (name = parserInput.$re(/^(@[\w-]+)(\(\s*\))?/)))) { + lookups = this.mixin.ruleLookups(); + if (!lookups && ((inValue && parserInput.$str('()') !== '()') || (name[2] !== '()'))) { + parserInput.restore('Missing \'[...]\' lookup in variable call'); + return; + } + if (!inValue) { + name = name[1]; + } + var call = new tree.VariableCall(name, i, fileInfo); + if (!inValue && parsers.end()) { + parserInput.forget(); + return call; + } + else { + parserInput.forget(); + return new tree.NamespaceValue(call, lookups, i, fileInfo); + } + } + parserInput.restore(); + }, + // + // extend syntax - used to extend selectors + // + extend: function (isRule) { + var elements; + var e; + var index = parserInput.i; + var option; + var extendList; + var extend; + if (!parserInput.$str(isRule ? '&:extend(' : ':extend(')) { + return; + } + do { + option = null; + elements = null; + while (!(option = parserInput.$re(/^(all)(?=\s*(\)|,))/))) { + e = this.element(); + if (!e) { + break; + } + if (elements) { + elements.push(e); + } + else { + elements = [e]; + } + } + option = option && option[1]; + if (!elements) { + error('Missing target selector for :extend().'); + } + extend = new (tree.Extend)(new (tree.Selector)(elements), option, index, fileInfo); + if (extendList) { + extendList.push(extend); + } + else { + extendList = [extend]; + } + } while (parserInput.$char(',')); + expect(/^\)/); + if (isRule) { + expect(/^;/); + } + return extendList; + }, + // + // extendRule - used in a rule to extend all the parent selectors + // + extendRule: function () { + return this.extend(true); + }, + // + // Mixins + // + mixin: { + // + // A Mixin call, with an optional argument list + // + // #mixins > .square(#fff); + // #mixins.square(#fff); + // .rounded(4px, black); + // .button; + // + // We can lookup / return a value using the lookup syntax: + // + // color: #mixin.square(#fff)[@color]; + // + // The `while` loop is there because mixins can be + // namespaced, but we only support the child and descendant + // selector for now. + // + call: function (inValue, getLookup) { + var s = parserInput.currentChar(); + var important = false; + var lookups; + var index = parserInput.i; + var elements; + var args; + var hasParens; + if (s !== '.' && s !== '#') { + return; + } + parserInput.save(); // stop us absorbing part of an invalid selector + elements = this.elements(); + if (elements) { + if (parserInput.$char('(')) { + args = this.args(true).args; + expectChar(')'); + hasParens = true; + } + if (getLookup !== false) { + lookups = this.ruleLookups(); + } + if (getLookup === true && !lookups) { + parserInput.restore(); + return; + } + if (!lookups && !hasParens) { + // This isn't a valid mixin call + parserInput.restore('Unrecognized input. Possibly missing \'(\' in mixin call.'); + return; + } + if (!inValue && parsers.important()) { + important = true; + } + if (inValue || parsers.end()) { + parserInput.forget(); + var mixin = new (tree.mixin.Call)(elements, args, index, fileInfo, !lookups && important); + if (lookups) { + return new tree.NamespaceValue(mixin, lookups); + } + else { + return mixin; + } + } + } + parserInput.restore(); + }, + /** + * Matching elements for mixins + * (Start with . or # and can have > ) + */ + elements: function () { + var elements; + var e; + var c; + var elem; + var elemIndex; + var re = /^[#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/; + while (true) { + elemIndex = parserInput.i; + e = parserInput.$re(re); + if (!e) { + break; + } + elem = new (tree.Element)(c, e, false, elemIndex, fileInfo); + if (elements) { + elements.push(elem); + } + else { + elements = [elem]; + } + c = parserInput.$char('>'); + } + return elements; + }, + args: function (isCall) { + var entities = parsers.entities; + var returner = { args: null, variadic: false }; + var expressions = []; + var argsSemiColon = []; + var argsComma = []; + var isSemiColonSeparated; + var expressionContainsNamed; + var name; + var nameLoop; + var value; + var arg; + var expand; + var hasSep = true; + parserInput.save(); + while (true) { + if (isCall) { + arg = parsers.detachedRuleset() || parsers.expression(); + } + else { + parserInput.commentStore.length = 0; + if (parserInput.$str('...')) { + returner.variadic = true; + if (parserInput.$char(';') && !isSemiColonSeparated) { + isSemiColonSeparated = true; + } + (isSemiColonSeparated ? argsSemiColon : argsComma) + .push({ variadic: true }); + break; + } + arg = entities.variable() || entities.property() || entities.literal() || entities.keyword() || this.call(true); + } + if (!arg || !hasSep) { + break; + } + nameLoop = null; + if (arg.throwAwayComments) { + arg.throwAwayComments(); + } + value = arg; + var val = null; + if (isCall) { + // Variable + if (arg.value && arg.value.length == 1) { + val = arg.value[0]; + } + } + else { + val = arg; + } + if (val && (val instanceof tree.Variable || val instanceof tree.Property)) { + if (parserInput.$char(':')) { + if (expressions.length > 0) { + if (isSemiColonSeparated) { + error('Cannot mix ; and , as delimiter types'); + } + expressionContainsNamed = true; + } + value = parsers.detachedRuleset() || parsers.expression(); + if (!value) { + if (isCall) { + error('could not understand value for named argument'); + } + else { + parserInput.restore(); + returner.args = []; + return returner; + } + } + nameLoop = (name = val.name); + } + else if (parserInput.$str('...')) { + if (!isCall) { + returner.variadic = true; + if (parserInput.$char(';') && !isSemiColonSeparated) { + isSemiColonSeparated = true; + } + (isSemiColonSeparated ? argsSemiColon : argsComma) + .push({ name: arg.name, variadic: true }); + break; + } + else { + expand = true; + } + } + else if (!isCall) { + name = nameLoop = val.name; + value = null; + } + } + if (value) { + expressions.push(value); + } + argsComma.push({ name: nameLoop, value: value, expand: expand }); + if (parserInput.$char(',')) { + hasSep = true; + continue; + } + hasSep = parserInput.$char(';') === ';'; + if (hasSep || isSemiColonSeparated) { + if (expressionContainsNamed) { + error('Cannot mix ; and , as delimiter types'); + } + isSemiColonSeparated = true; + if (expressions.length > 1) { + value = new (tree.Value)(expressions); + } + argsSemiColon.push({ name: name, value: value, expand: expand }); + name = null; + expressions = []; + expressionContainsNamed = false; + } + } + parserInput.forget(); + returner.args = isSemiColonSeparated ? argsSemiColon : argsComma; + return returner; + }, + // + // A Mixin definition, with a list of parameters + // + // .rounded (@radius: 2px, @color) { + // ... + // } + // + // Until we have a finer grained state-machine, we have to + // do a look-ahead, to make sure we don't have a mixin call. + // See the `rule` function for more information. + // + // We start by matching `.rounded (`, and then proceed on to + // the argument list, which has optional default values. + // We store the parameters in `params`, with a `value` key, + // if there is a value, such as in the case of `@radius`. + // + // Once we've got our params list, and a closing `)`, we parse + // the `{...}` block. + // + definition: function () { + var name; + var params = []; + var match; + var ruleset; + var cond; + var variadic = false; + if ((parserInput.currentChar() !== '.' && parserInput.currentChar() !== '#') || + parserInput.peek(/^[^{]*\}/)) { + return; + } + parserInput.save(); + match = parserInput.$re(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/); + if (match) { + name = match[1]; + var argInfo = this.args(false); + params = argInfo.args; + variadic = argInfo.variadic; + // .mixincall("@{a}"); + // looks a bit like a mixin definition.. + // also + // .mixincall(@a: {rule: set;}); + // so we have to be nice and restore + if (!parserInput.$char(')')) { + parserInput.restore('Missing closing \')\''); + return; + } + parserInput.commentStore.length = 0; + if (parserInput.$str('when')) { // Guard + cond = expect(parsers.conditions, 'expected condition'); + } + ruleset = parsers.block(); + if (ruleset) { + parserInput.forget(); + return new (tree.mixin.Definition)(name, params, ruleset, cond, variadic); + } + else { + parserInput.restore(); + } + } + else { + parserInput.restore(); + } + }, + ruleLookups: function () { + var rule; + var lookups = []; + if (parserInput.currentChar() !== '[') { + return; + } + while (true) { + parserInput.save(); + rule = this.lookupValue(); + if (!rule && rule !== '') { + parserInput.restore(); + break; + } + lookups.push(rule); + parserInput.forget(); + } + if (lookups.length > 0) { + return lookups; + } + }, + lookupValue: function () { + parserInput.save(); + if (!parserInput.$char('[')) { + parserInput.restore(); + return; + } + var name = parserInput.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/); + if (!parserInput.$char(']')) { + parserInput.restore(); + return; + } + if (name || name === '') { + parserInput.forget(); + return name; + } + parserInput.restore(); + } + }, + // + // Entities are the smallest recognized token, + // and can be found inside a rule's value. + // + entity: function () { + var entities = this.entities; + return this.comment() || entities.literal() || entities.variable() || entities.url() || + entities.property() || entities.call() || entities.keyword() || this.mixin.call(true) || + entities.javascript(); + }, + // + // A Declaration terminator. Note that we use `peek()` to check for '}', + // because the `block` rule will be expecting it, but we still need to make sure + // it's there, if ';' was omitted. + // + end: function () { + return parserInput.$char(';') || parserInput.peek('}'); + }, + // + // IE's alpha function + // + // alpha(opacity=88) + // + ieAlpha: function () { + var value; + // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18 + if (!parserInput.$re(/^opacity=/i)) { + return; + } + value = parserInput.$re(/^\d+/); + if (!value) { + value = expect(parsers.entities.variable, 'Could not parse alpha'); + value = "@{" + value.name.slice(1) + "}"; + } + expectChar(')'); + return new tree.Quoted('', "alpha(opacity=" + value + ")"); + }, + // + // A Selector Element + // + // div + // + h1 + // #socks + // input[type="text"] + // + // Elements are the building blocks for Selectors, + // they are made out of a `Combinator` (see combinator rule), + // and an element name, such as a tag a class, or `*`. + // + element: function () { + var e; + var c; + var v; + var index = parserInput.i; + c = this.combinator(); + e = parserInput.$re(/^(?:\d+\.\d+|\d+)%/) || + parserInput.$re(/^(?:[.#]?|:*)(?:[\w-]|[^\x00-\x9f]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/) || + parserInput.$char('*') || parserInput.$char('&') || this.attribute() || + parserInput.$re(/^\([^&()@]+\)/) || parserInput.$re(/^[\.#:](?=@)/) || + this.entities.variableCurly(); + if (!e) { + parserInput.save(); + if (parserInput.$char('(')) { + if ((v = this.selector(false)) && parserInput.$char(')')) { + e = new (tree.Paren)(v); + parserInput.forget(); + } + else { + parserInput.restore('Missing closing \')\''); + } + } + else { + parserInput.forget(); + } + } + if (e) { + return new (tree.Element)(c, e, e instanceof tree.Variable, index, fileInfo); + } + }, + // + // Combinators combine elements together, in a Selector. + // + // Because our parser isn't white-space sensitive, special care + // has to be taken, when parsing the descendant combinator, ` `, + // as it's an empty space. We have to check the previous character + // in the input, to see if it's a ` ` character. More info on how + // we deal with this in *combinator.js*. + // + combinator: function () { + var c = parserInput.currentChar(); + if (c === '/') { + parserInput.save(); + var slashedCombinator = parserInput.$re(/^\/[a-z]+\//i); + if (slashedCombinator) { + parserInput.forget(); + return new (tree.Combinator)(slashedCombinator); + } + parserInput.restore(); + } + if (c === '>' || c === '+' || c === '~' || c === '|' || c === '^') { + parserInput.i++; + if (c === '^' && parserInput.currentChar() === '^') { + c = '^^'; + parserInput.i++; + } + while (parserInput.isWhitespace()) { + parserInput.i++; + } + return new (tree.Combinator)(c); + } + else if (parserInput.isWhitespace(-1)) { + return new (tree.Combinator)(' '); + } + else { + return new (tree.Combinator)(null); + } + }, + // + // A CSS Selector + // with less extensions e.g. the ability to extend and guard + // + // .class > div + h1 + // li a:hover + // + // Selectors are made out of one or more Elements, see above. + // + selector: function (isLess) { + var index = parserInput.i; + var elements; + var extendList; + var c; + var e; + var allExtends; + var when; + var condition; + isLess = isLess !== false; + while ((isLess && (extendList = this.extend())) || (isLess && (when = parserInput.$str('when'))) || (e = this.element())) { + if (when) { + condition = expect(this.conditions, 'expected condition'); + } + else if (condition) { + error('CSS guard can only be used at the end of selector'); + } + else if (extendList) { + if (allExtends) { + allExtends = allExtends.concat(extendList); + } + else { + allExtends = extendList; + } + } + else { + if (allExtends) { + error('Extend can only be used at the end of selector'); + } + c = parserInput.currentChar(); + if (elements) { + elements.push(e); + } + else { + elements = [e]; + } + e = null; + } + if (c === '{' || c === '}' || c === ';' || c === ',' || c === ')') { + break; + } + } + if (elements) { + return new (tree.Selector)(elements, allExtends, condition, index, fileInfo); + } + if (allExtends) { + error('Extend must be used to extend a selector, it cannot be used on its own'); + } + }, + selectors: function () { + var s; + var selectors; + while (true) { + s = this.selector(); + if (!s) { + break; + } + if (selectors) { + selectors.push(s); + } + else { + selectors = [s]; + } + parserInput.commentStore.length = 0; + if (s.condition && selectors.length > 1) { + error("Guards are only currently allowed on a single selector."); + } + if (!parserInput.$char(',')) { + break; + } + if (s.condition) { + error("Guards are only currently allowed on a single selector."); + } + parserInput.commentStore.length = 0; + } + return selectors; + }, + attribute: function () { + if (!parserInput.$char('[')) { + return; + } + var entities = this.entities; + var key; + var val; + var op; + if (!(key = entities.variableCurly())) { + key = expect(/^(?:[_A-Za-z0-9-\*]*\|)?(?:[_A-Za-z0-9-]|\\.)+/); + } + op = parserInput.$re(/^[|~*$^]?=/); + if (op) { + val = entities.quoted() || parserInput.$re(/^[0-9]+%/) || parserInput.$re(/^[\w-]+/) || entities.variableCurly(); + } + expectChar(']'); + return new (tree.Attribute)(key, op, val); + }, + // + // The `block` rule is used by `ruleset` and `mixin.definition`. + // It's a wrapper around the `primary` rule, with added `{}`. + // + block: function () { + var content; + if (parserInput.$char('{') && (content = this.primary()) && parserInput.$char('}')) { + return content; + } + }, + blockRuleset: function () { + var block = this.block(); + if (block) { + block = new tree.Ruleset(null, block); + } + return block; + }, + detachedRuleset: function () { + var argInfo; + var params; + var variadic; + parserInput.save(); + if (parserInput.$re(/^[.#]\(/)) { + /** + * DR args currently only implemented for each() function, and not + * yet settable as `@dr: #(@arg) {}` + * This should be done when DRs are merged with mixins. + * See: https://github.com/less/less-meta/issues/16 + */ + argInfo = this.mixin.args(false); + params = argInfo.args; + variadic = argInfo.variadic; + if (!parserInput.$char(')')) { + parserInput.restore(); + return; + } + } + var blockRuleset = this.blockRuleset(); + if (blockRuleset) { + parserInput.forget(); + if (params) { + return new tree.mixin.Definition(null, params, blockRuleset, null, variadic); + } + return new tree.DetachedRuleset(blockRuleset); + } + parserInput.restore(); + }, + // + // div, .class, body > p {...} + // + ruleset: function () { + var selectors; + var rules; + var debugInfo; + parserInput.save(); + if (context.dumpLineNumbers) { + debugInfo = getDebugInfo(parserInput.i); + } + selectors = this.selectors(); + if (selectors && (rules = this.block())) { + parserInput.forget(); + var ruleset = new (tree.Ruleset)(selectors, rules, context.strictImports); + if (context.dumpLineNumbers) { + ruleset.debugInfo = debugInfo; + } + return ruleset; + } + else { + parserInput.restore(); + } + }, + declaration: function () { + var name; + var value; + var index = parserInput.i; + var hasDR; + var c = parserInput.currentChar(); + var important; + var merge; + var isVariable; + if (c === '.' || c === '#' || c === '&' || c === ':') { + return; + } + parserInput.save(); + name = this.variable() || this.ruleProperty(); + if (name) { + isVariable = typeof name === 'string'; + if (isVariable) { + value = this.detachedRuleset(); + if (value) { + hasDR = true; + } + } + parserInput.commentStore.length = 0; + if (!value) { + // a name returned by this.ruleProperty() is always an array of the form: + // [string-1, ..., string-n, ""] or [string-1, ..., string-n, "+"] + // where each item is a tree.Keyword or tree.Variable + merge = !isVariable && name.length > 1 && name.pop().value; + // Custom property values get permissive parsing + if (name[0].value && name[0].value.slice(0, 2) === '--') { + value = this.permissiveValue(); + } + // Try to store values as anonymous + // If we need the value later we'll re-parse it in ruleset.parseValue + else { + value = this.anonymousValue(); + } + if (value) { + parserInput.forget(); + // anonymous values absorb the end ';' which is required for them to work + return new (tree.Declaration)(name, value, false, merge, index, fileInfo); + } + if (!value) { + value = this.value(); + } + if (value) { + important = this.important(); + } + else if (isVariable) { + // As a last resort, try permissiveValue + value = this.permissiveValue(); + } + } + if (value && (this.end() || hasDR)) { + parserInput.forget(); + return new (tree.Declaration)(name, value, important, merge, index, fileInfo); + } + else { + parserInput.restore(); + } + } + else { + parserInput.restore(); + } + }, + anonymousValue: function () { + var index = parserInput.i; + var match = parserInput.$re(/^([^.#@\$+\/'"*`(;{}-]*);/); + if (match) { + return new (tree.Anonymous)(match[1], index); + } + }, + /** + * Used for custom properties, at-rules, and variables (as fallback) + * Parses almost anything inside of {} [] () "" blocks + * until it reaches outer-most tokens. + * + * First, it will try to parse comments and entities to reach + * the end. This is mostly like the Expression parser except no + * math is allowed. + */ + permissiveValue: function (untilTokens) { + var i; + var e; + var done; + var value; + var tok = untilTokens || ';'; + var index = parserInput.i; + var result = []; + function testCurrentChar() { + var char = parserInput.currentChar(); + if (typeof tok === 'string') { + return char === tok; + } + else { + return tok.test(char); + } + } + if (testCurrentChar()) { + return; + } + value = []; + do { + e = this.comment(); + if (e) { + value.push(e); + continue; + } + e = this.entity(); + if (e) { + value.push(e); + } + } while (e); + done = testCurrentChar(); + if (value.length > 0) { + value = new (tree.Expression)(value); + if (done) { + return value; + } + else { + result.push(value); + } + // Preserve space before $parseUntil as it will not + if (parserInput.prevChar() === ' ') { + result.push(new tree.Anonymous(' ', index)); + } + } + parserInput.save(); + value = parserInput.$parseUntil(tok); + if (value) { + if (typeof value === 'string') { + error("Expected '" + value + "'", 'Parse'); + } + if (value.length === 1 && value[0] === ' ') { + parserInput.forget(); + return new tree.Anonymous('', index); + } + var item = void 0; + for (i = 0; i < value.length; i++) { + item = value[i]; + if (Array.isArray(item)) { + // Treat actual quotes as normal quoted values + result.push(new tree.Quoted(item[0], item[1], true, index, fileInfo)); + } + else { + if (i === value.length - 1) { + item = item.trim(); + } + // Treat like quoted values, but replace vars like unquoted expressions + var quote = new tree.Quoted('\'', item, true, index, fileInfo); + quote.variableRegex = /@([\w-]+)/g; + quote.propRegex = /\$([\w-]+)/g; + result.push(quote); + } + } + parserInput.forget(); + return new tree.Expression(result, true); + } + parserInput.restore(); + }, + // + // An @import atrule + // + // @import "lib"; + // + // Depending on our environment, importing is done differently: + // In the browser, it's an XHR request, in Node, it would be a + // file-system operation. The function used for importing is + // stored in `import`, which we pass to the Import constructor. + // + 'import': function () { + var path; + var features; + var index = parserInput.i; + var dir = parserInput.$re(/^@import?\s+/); + if (dir) { + var options = (dir ? this.importOptions() : null) || {}; + if ((path = this.entities.quoted() || this.entities.url())) { + features = this.mediaFeatures(); + if (!parserInput.$char(';')) { + parserInput.i = index; + error('missing semi-colon or unrecognised media features on import'); + } + features = features && new (tree.Value)(features); + return new (tree.Import)(path, features, options, index, fileInfo); + } + else { + parserInput.i = index; + error('malformed import statement'); + } + } + }, + importOptions: function () { + var o; + var options = {}; + var optionName; + var value; + // list of options, surrounded by parens + if (!parserInput.$char('(')) { + return null; + } + do { + o = this.importOption(); + if (o) { + optionName = o; + value = true; + switch (optionName) { + case 'css': + optionName = 'less'; + value = false; + break; + case 'once': + optionName = 'multiple'; + value = false; + break; + } + options[optionName] = value; + if (!parserInput.$char(',')) { + break; + } + } + } while (o); + expectChar(')'); + return options; + }, + importOption: function () { + var opt = parserInput.$re(/^(less|css|multiple|once|inline|reference|optional)/); + if (opt) { + return opt[1]; + } + }, + mediaFeature: function () { + var entities = this.entities; + var nodes = []; + var e; + var p; + parserInput.save(); + do { + e = entities.keyword() || entities.variable() || entities.mixinLookup(); + if (e) { + nodes.push(e); + } + else if (parserInput.$char('(')) { + p = this.property(); + e = this.value(); + if (parserInput.$char(')')) { + if (p && e) { + nodes.push(new (tree.Paren)(new (tree.Declaration)(p, e, null, null, parserInput.i, fileInfo, true))); + } + else if (e) { + nodes.push(new (tree.Paren)(e)); + } + else { + error('badly formed media feature definition'); + } + } + else { + error('Missing closing \')\'', 'Parse'); + } + } + } while (e); + parserInput.forget(); + if (nodes.length > 0) { + return new (tree.Expression)(nodes); + } + }, + mediaFeatures: function () { + var entities = this.entities; + var features = []; + var e; + do { + e = this.mediaFeature(); + if (e) { + features.push(e); + if (!parserInput.$char(',')) { + break; + } + } + else { + e = entities.variable() || entities.mixinLookup(); + if (e) { + features.push(e); + if (!parserInput.$char(',')) { + break; + } + } + } + } while (e); + return features.length > 0 ? features : null; + }, + media: function () { + var features; + var rules; + var media; + var debugInfo; + var index = parserInput.i; + if (context.dumpLineNumbers) { + debugInfo = getDebugInfo(index); + } + parserInput.save(); + if (parserInput.$str('@media')) { + features = this.mediaFeatures(); + rules = this.block(); + if (!rules) { + error('media definitions require block statements after any features'); + } + parserInput.forget(); + media = new (tree.Media)(rules, features, index, fileInfo); + if (context.dumpLineNumbers) { + media.debugInfo = debugInfo; + } + return media; + } + parserInput.restore(); + }, + // + // A @plugin directive, used to import plugins dynamically. + // + // @plugin (args) "lib"; + // + plugin: function () { + var path; + var args; + var options; + var index = parserInput.i; + var dir = parserInput.$re(/^@plugin?\s+/); + if (dir) { + args = this.pluginArgs(); + if (args) { + options = { + pluginArgs: args, + isPlugin: true + }; + } + else { + options = { isPlugin: true }; + } + if ((path = this.entities.quoted() || this.entities.url())) { + if (!parserInput.$char(';')) { + parserInput.i = index; + error('missing semi-colon on @plugin'); + } + return new (tree.Import)(path, null, options, index, fileInfo); + } + else { + parserInput.i = index; + error('malformed @plugin statement'); + } + } + }, + pluginArgs: function () { + // list of options, surrounded by parens + parserInput.save(); + if (!parserInput.$char('(')) { + parserInput.restore(); + return null; + } + var args = parserInput.$re(/^\s*([^\);]+)\)\s*/); + if (args[1]) { + parserInput.forget(); + return args[1].trim(); + } + else { + parserInput.restore(); + return null; + } + }, + // + // A CSS AtRule + // + // @charset "utf-8"; + // + atrule: function () { + var index = parserInput.i; + var name; + var value; + var rules; + var nonVendorSpecificName; + var hasIdentifier; + var hasExpression; + var hasUnknown; + var hasBlock = true; + var isRooted = true; + if (parserInput.currentChar() !== '@') { + return; + } + value = this['import']() || this.plugin() || this.media(); + if (value) { + return value; + } + parserInput.save(); + name = parserInput.$re(/^@[a-z-]+/); + if (!name) { + return; + } + nonVendorSpecificName = name; + if (name.charAt(1) == '-' && name.indexOf('-', 2) > 0) { + nonVendorSpecificName = "@" + name.slice(name.indexOf('-', 2) + 1); + } + switch (nonVendorSpecificName) { + case '@charset': + hasIdentifier = true; + hasBlock = false; + break; + case '@namespace': + hasExpression = true; + hasBlock = false; + break; + case '@keyframes': + case '@counter-style': + hasIdentifier = true; + break; + case '@document': + case '@supports': + hasUnknown = true; + isRooted = false; + break; + default: + hasUnknown = true; + break; + } + parserInput.commentStore.length = 0; + if (hasIdentifier) { + value = this.entity(); + if (!value) { + error("expected " + name + " identifier"); + } + } + else if (hasExpression) { + value = this.expression(); + if (!value) { + error("expected " + name + " expression"); + } + } + else if (hasUnknown) { + value = this.permissiveValue(/^[{;]/); + hasBlock = (parserInput.currentChar() === '{'); + if (!value) { + if (!hasBlock && parserInput.currentChar() !== ';') { + error(name + " rule is missing block or ending semi-colon"); + } + } + else if (!value.value) { + value = null; + } + } + if (hasBlock) { + rules = this.blockRuleset(); + } + if (rules || (!hasBlock && value && parserInput.$char(';'))) { + parserInput.forget(); + return new (tree.AtRule)(name, value, rules, index, fileInfo, context.dumpLineNumbers ? getDebugInfo(index) : null, isRooted); + } + parserInput.restore('at-rule options not recognised'); + }, + // + // A Value is a comma-delimited list of Expressions + // + // font-family: Baskerville, Georgia, serif; + // + // In a Rule, a Value represents everything after the `:`, + // and before the `;`. + // + value: function () { + var e; + var expressions = []; + var index = parserInput.i; + do { + e = this.expression(); + if (e) { + expressions.push(e); + if (!parserInput.$char(',')) { + break; + } + } + } while (e); + if (expressions.length > 0) { + return new (tree.Value)(expressions, index); + } + }, + important: function () { + if (parserInput.currentChar() === '!') { + return parserInput.$re(/^! *important/); + } + }, + sub: function () { + var a; + var e; + parserInput.save(); + if (parserInput.$char('(')) { + a = this.addition(); + if (a && parserInput.$char(')')) { + parserInput.forget(); + e = new (tree.Expression)([a]); + e.parens = true; + return e; + } + parserInput.restore('Expected \')\''); + return; + } + parserInput.restore(); + }, + multiplication: function () { + var m; + var a; + var op; + var operation; + var isSpaced; + m = this.operand(); + if (m) { + isSpaced = parserInput.isWhitespace(-1); + while (true) { + if (parserInput.peek(/^\/[*\/]/)) { + break; + } + parserInput.save(); + op = parserInput.$char('/') || parserInput.$char('*') || parserInput.$str('./'); + if (!op) { + parserInput.forget(); + break; + } + a = this.operand(); + if (!a) { + parserInput.restore(); + break; + } + parserInput.forget(); + m.parensInOp = true; + a.parensInOp = true; + operation = new (tree.Operation)(op, [operation || m, a], isSpaced); + isSpaced = parserInput.isWhitespace(-1); + } + return operation || m; + } + }, + addition: function () { + var m; + var a; + var op; + var operation; + var isSpaced; + m = this.multiplication(); + if (m) { + isSpaced = parserInput.isWhitespace(-1); + while (true) { + op = parserInput.$re(/^[-+]\s+/) || (!isSpaced && (parserInput.$char('+') || parserInput.$char('-'))); + if (!op) { + break; + } + a = this.multiplication(); + if (!a) { + break; + } + m.parensInOp = true; + a.parensInOp = true; + operation = new (tree.Operation)(op, [operation || m, a], isSpaced); + isSpaced = parserInput.isWhitespace(-1); + } + return operation || m; + } + }, + conditions: function () { + var a; + var b; + var index = parserInput.i; + var condition; + a = this.condition(true); + if (a) { + while (true) { + if (!parserInput.peek(/^,\s*(not\s*)?\(/) || !parserInput.$char(',')) { + break; + } + b = this.condition(true); + if (!b) { + break; + } + condition = new (tree.Condition)('or', condition || a, b, index); + } + return condition || a; + } + }, + condition: function (needsParens) { + var result; + var logical; + var next; + function or() { + return parserInput.$str('or'); + } + result = this.conditionAnd(needsParens); + if (!result) { + return; + } + logical = or(); + if (logical) { + next = this.condition(needsParens); + if (next) { + result = new (tree.Condition)(logical, result, next); + } + else { + return; + } + } + return result; + }, + conditionAnd: function (needsParens) { + var result; + var logical; + var next; + var self = this; + function insideCondition() { + var cond = self.negatedCondition(needsParens) || self.parenthesisCondition(needsParens); + if (!cond && !needsParens) { + return self.atomicCondition(needsParens); + } + return cond; + } + function and() { + return parserInput.$str('and'); + } + result = insideCondition(); + if (!result) { + return; + } + logical = and(); + if (logical) { + next = this.conditionAnd(needsParens); + if (next) { + result = new (tree.Condition)(logical, result, next); + } + else { + return; + } + } + return result; + }, + negatedCondition: function (needsParens) { + if (parserInput.$str('not')) { + var result = this.parenthesisCondition(needsParens); + if (result) { + result.negate = !result.negate; + } + return result; + } + }, + parenthesisCondition: function (needsParens) { + function tryConditionFollowedByParenthesis(me) { + var body; + parserInput.save(); + body = me.condition(needsParens); + if (!body) { + parserInput.restore(); + return; + } + if (!parserInput.$char(')')) { + parserInput.restore(); + return; + } + parserInput.forget(); + return body; + } + var body; + parserInput.save(); + if (!parserInput.$str('(')) { + parserInput.restore(); + return; + } + body = tryConditionFollowedByParenthesis(this); + if (body) { + parserInput.forget(); + return body; + } + body = this.atomicCondition(needsParens); + if (!body) { + parserInput.restore(); + return; + } + if (!parserInput.$char(')')) { + parserInput.restore("expected ')' got '" + parserInput.currentChar() + "'"); + return; + } + parserInput.forget(); + return body; + }, + atomicCondition: function (needsParens) { + var entities = this.entities; + var index = parserInput.i; + var a; + var b; + var c; + var op; + function cond() { + return this.addition() || entities.keyword() || entities.quoted() || entities.mixinLookup(); + } + cond = cond.bind(this); + a = cond(); + if (a) { + if (parserInput.$char('>')) { + if (parserInput.$char('=')) { + op = '>='; + } + else { + op = '>'; + } + } + else if (parserInput.$char('<')) { + if (parserInput.$char('=')) { + op = '<='; + } + else { + op = '<'; + } + } + else if (parserInput.$char('=')) { + if (parserInput.$char('>')) { + op = '=>'; + } + else if (parserInput.$char('<')) { + op = '=<'; + } + else { + op = '='; + } + } + if (op) { + b = cond(); + if (b) { + c = new (tree.Condition)(op, a, b, index, false); + } + else { + error('expected expression'); + } + } + else { + c = new (tree.Condition)('=', a, new (tree.Keyword)('true'), index, false); + } + return c; + } + }, + // + // An operand is anything that can be part of an operation, + // such as a Color, or a Variable + // + operand: function () { + var entities = this.entities; + var negate; + if (parserInput.peek(/^-[@\$\(]/)) { + negate = parserInput.$char('-'); + } + var o = this.sub() || entities.dimension() || + entities.color() || entities.variable() || + entities.property() || entities.call() || + entities.quoted(true) || entities.colorKeyword() || + entities.mixinLookup(); + if (negate) { + o.parensInOp = true; + o = new (tree.Negative)(o); + } + return o; + }, + // + // Expressions either represent mathematical operations, + // or white-space delimited Entities. + // + // 1px solid black + // @var * 2 + // + expression: function () { + var entities = []; + var e; + var delim; + var index = parserInput.i; + do { + e = this.comment(); + if (e) { + entities.push(e); + continue; + } + e = this.addition() || this.entity(); + if (e instanceof tree.Comment) { + e = null; + } + if (e) { + entities.push(e); + // operations do not allow keyword "/" dimension (e.g. small/20px) so we support that here + if (!parserInput.peek(/^\/[\/*]/)) { + delim = parserInput.$char('/'); + if (delim) { + entities.push(new (tree.Anonymous)(delim, index)); + } + } + } + } while (e); + if (entities.length > 0) { + return new (tree.Expression)(entities); + } + }, + property: function () { + var name = parserInput.$re(/^(\*?-?[_a-zA-Z0-9-]+)\s*:/); + if (name) { + return name[1]; + } + }, + ruleProperty: function () { + var name = []; + var index = []; + var s; + var k; + parserInput.save(); + var simpleProperty = parserInput.$re(/^([_a-zA-Z0-9-]+)\s*:/); + if (simpleProperty) { + name = [new (tree.Keyword)(simpleProperty[1])]; + parserInput.forget(); + return name; + } + function match(re) { + var i = parserInput.i; + var chunk = parserInput.$re(re); + if (chunk) { + index.push(i); + return name.push(chunk[1]); + } + } + match(/^(\*?)/); + while (true) { + if (!match(/^((?:[\w-]+)|(?:[@\$]\{[\w-]+\}))/)) { + break; + } + } + if ((name.length > 1) && match(/^((?:\+_|\+)?)\s*:/)) { + parserInput.forget(); + // at last, we have the complete match now. move forward, + // convert name particles to tree objects and return: + if (name[0] === '') { + name.shift(); + index.shift(); + } + for (k = 0; k < name.length; k++) { + s = name[k]; + name[k] = (s.charAt(0) !== '@' && s.charAt(0) !== '$') ? + new (tree.Keyword)(s) : + (s.charAt(0) === '@' ? + new (tree.Variable)("@" + s.slice(2, -1), index[k], fileInfo) : + new (tree.Property)("$" + s.slice(2, -1), index[k], fileInfo)); + } + return name; + } + parserInput.restore(); + } + } + }; + }; + Parser.serializeVars = function (vars) { + var s = ''; + for (var name_1 in vars) { + if (Object.hasOwnProperty.call(vars, name_1)) { + var value = vars[name_1]; + s += ((name_1[0] === '@') ? '' : '@') + name_1 + ": " + value + ((String(value).slice(-1) === ';') ? '' : ';'); + } + } + return s; + }; - function boolean(condition) { - return condition ? Keyword.True : Keyword.False; - } - /** - * Functions with evalArgs set to false are sent context - * as the first argument. - */ - function If(context, condition, trueValue, falseValue) { - return condition.eval(context) ? trueValue.eval(context) - : (falseValue ? falseValue.eval(context) : new Anonymous); - } - If.evalArgs = false; - var boolean$1 = { boolean: boolean, 'if': If }; + function boolean(condition) { + return condition ? Keyword.True : Keyword.False; + } + /** + * Functions with evalArgs set to false are sent context + * as the first argument. + */ + function If(context, condition, trueValue, falseValue) { + return condition.eval(context) ? trueValue.eval(context) + : (falseValue ? falseValue.eval(context) : new Anonymous); + } + If.evalArgs = false; + var boolean$1 = { boolean: boolean, 'if': If }; - var colorFunctions; - function clamp$1(val) { - return Math.min(1, Math.max(0, val)); - } - function hsla(origColor, hsl) { - var color = colorFunctions.hsla(hsl.h, hsl.s, hsl.l, hsl.a); - if (color) { - if (origColor.value && - /^(rgb|hsl)/.test(origColor.value)) { - color.value = origColor.value; - } - else { - color.value = 'rgb'; - } - return color; - } - } - function toHSL(color) { - if (color.toHSL) { - return color.toHSL(); - } - else { - throw new Error('Argument cannot be evaluated to a color'); - } - } - function toHSV(color) { - if (color.toHSV) { - return color.toHSV(); - } - else { - throw new Error('Argument cannot be evaluated to a color'); - } - } - function number(n) { - if (n instanceof Dimension) { - return parseFloat(n.unit.is('%') ? n.value / 100 : n.value); - } - else if (typeof n === 'number') { - return n; - } - else { - throw { - type: 'Argument', - message: 'color functions take numbers as parameters' - }; - } - } - function scaled(n, size) { - if (n instanceof Dimension && n.unit.is('%')) { - return parseFloat(n.value * size / 100); - } - else { - return number(n); - } - } - colorFunctions = { - rgb: function (r, g, b) { - var color = colorFunctions.rgba(r, g, b, 1.0); - if (color) { - color.value = 'rgb'; - return color; - } - }, - rgba: function (r, g, b, a) { - try { - if (r instanceof Color) { - if (g) { - a = number(g); - } - else { - a = r.alpha; - } - return new Color(r.rgb, a, 'rgba'); - } - var rgb = [r, g, b].map(function (c) { return scaled(c, 255); }); - a = number(a); - return new Color(rgb, a, 'rgba'); - } - catch (e) { } - }, - hsl: function (h, s, l) { - var color = colorFunctions.hsla(h, s, l, 1.0); - if (color) { - color.value = 'hsl'; - return color; - } - }, - hsla: function (h, s, l, a) { - try { - if (h instanceof Color) { - if (s) { - a = number(s); - } - else { - a = h.alpha; - } - return new Color(h.rgb, a, 'hsla'); - } - var m1_1; - var m2_1; - function hue(h) { - h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h); - if (h * 6 < 1) { - return m1_1 + (m2_1 - m1_1) * h * 6; - } - else if (h * 2 < 1) { - return m2_1; - } - else if (h * 3 < 2) { - return m1_1 + (m2_1 - m1_1) * (2 / 3 - h) * 6; - } - else { - return m1_1; - } - } - h = (number(h) % 360) / 360; - s = clamp$1(number(s)); - l = clamp$1(number(l)); - a = clamp$1(number(a)); - m2_1 = l <= 0.5 ? l * (s + 1) : l + s - l * s; - m1_1 = l * 2 - m2_1; - var rgb = [ - hue(h + 1 / 3) * 255, - hue(h) * 255, - hue(h - 1 / 3) * 255 - ]; - a = number(a); - return new Color(rgb, a, 'hsla'); - } - catch (e) { } - }, - hsv: function (h, s, v) { - return colorFunctions.hsva(h, s, v, 1.0); - }, - hsva: function (h, s, v, a) { - h = ((number(h) % 360) / 360) * 360; - s = number(s); - v = number(v); - a = number(a); - var i; - var f; - i = Math.floor((h / 60) % 6); - f = (h / 60) - i; - var vs = [v, - v * (1 - s), - v * (1 - f * s), - v * (1 - (1 - f) * s)]; - var perm = [[0, 3, 1], - [2, 0, 1], - [1, 0, 3], - [1, 2, 0], - [3, 1, 0], - [0, 1, 2]]; - return colorFunctions.rgba(vs[perm[i][0]] * 255, vs[perm[i][1]] * 255, vs[perm[i][2]] * 255, a); - }, - hue: function (color) { - return new Dimension(toHSL(color).h); - }, - saturation: function (color) { - return new Dimension(toHSL(color).s * 100, '%'); - }, - lightness: function (color) { - return new Dimension(toHSL(color).l * 100, '%'); - }, - hsvhue: function (color) { - return new Dimension(toHSV(color).h); - }, - hsvsaturation: function (color) { - return new Dimension(toHSV(color).s * 100, '%'); - }, - hsvvalue: function (color) { - return new Dimension(toHSV(color).v * 100, '%'); - }, - red: function (color) { - return new Dimension(color.rgb[0]); - }, - green: function (color) { - return new Dimension(color.rgb[1]); - }, - blue: function (color) { - return new Dimension(color.rgb[2]); - }, - alpha: function (color) { - return new Dimension(toHSL(color).a); - }, - luma: function (color) { - return new Dimension(color.luma() * color.alpha * 100, '%'); - }, - luminance: function (color) { - var luminance = (0.2126 * color.rgb[0] / 255) + - (0.7152 * color.rgb[1] / 255) + - (0.0722 * color.rgb[2] / 255); - return new Dimension(luminance * color.alpha * 100, '%'); - }, - saturate: function (color, amount, method) { - // filter: saturate(3.2); - // should be kept as is, so check for color - if (!color.rgb) { - return null; - } - var hsl = toHSL(color); - if (typeof method !== 'undefined' && method.value === 'relative') { - hsl.s += hsl.s * amount.value / 100; - } - else { - hsl.s += amount.value / 100; - } - hsl.s = clamp$1(hsl.s); - return hsla(color, hsl); - }, - desaturate: function (color, amount, method) { - var hsl = toHSL(color); - if (typeof method !== 'undefined' && method.value === 'relative') { - hsl.s -= hsl.s * amount.value / 100; - } - else { - hsl.s -= amount.value / 100; - } - hsl.s = clamp$1(hsl.s); - return hsla(color, hsl); - }, - lighten: function (color, amount, method) { - var hsl = toHSL(color); - if (typeof method !== 'undefined' && method.value === 'relative') { - hsl.l += hsl.l * amount.value / 100; - } - else { - hsl.l += amount.value / 100; - } - hsl.l = clamp$1(hsl.l); - return hsla(color, hsl); - }, - darken: function (color, amount, method) { - var hsl = toHSL(color); - if (typeof method !== 'undefined' && method.value === 'relative') { - hsl.l -= hsl.l * amount.value / 100; - } - else { - hsl.l -= amount.value / 100; - } - hsl.l = clamp$1(hsl.l); - return hsla(color, hsl); - }, - fadein: function (color, amount, method) { - var hsl = toHSL(color); - if (typeof method !== 'undefined' && method.value === 'relative') { - hsl.a += hsl.a * amount.value / 100; - } - else { - hsl.a += amount.value / 100; - } - hsl.a = clamp$1(hsl.a); - return hsla(color, hsl); - }, - fadeout: function (color, amount, method) { - var hsl = toHSL(color); - if (typeof method !== 'undefined' && method.value === 'relative') { - hsl.a -= hsl.a * amount.value / 100; - } - else { - hsl.a -= amount.value / 100; - } - hsl.a = clamp$1(hsl.a); - return hsla(color, hsl); - }, - fade: function (color, amount) { - var hsl = toHSL(color); - hsl.a = amount.value / 100; - hsl.a = clamp$1(hsl.a); - return hsla(color, hsl); - }, - spin: function (color, amount) { - var hsl = toHSL(color); - var hue = (hsl.h + amount.value) % 360; - hsl.h = hue < 0 ? 360 + hue : hue; - return hsla(color, hsl); - }, - // - // Copyright (c) 2006-2009 Hampton Catlin, Natalie Weizenbaum, and Chris Eppstein - // http://sass-lang.com - // - mix: function (color1, color2, weight) { - if (!weight) { - weight = new Dimension(50); - } - var p = weight.value / 100.0; - var w = p * 2 - 1; - var a = toHSL(color1).a - toHSL(color2).a; - var w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; - var w2 = 1 - w1; - var rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2, - color1.rgb[1] * w1 + color2.rgb[1] * w2, - color1.rgb[2] * w1 + color2.rgb[2] * w2]; - var alpha = color1.alpha * p + color2.alpha * (1 - p); - return new Color(rgb, alpha); - }, - greyscale: function (color) { - return colorFunctions.desaturate(color, new Dimension(100)); - }, - contrast: function (color, dark, light, threshold) { - // filter: contrast(3.2); - // should be kept as is, so check for color - if (!color.rgb) { - return null; - } - if (typeof light === 'undefined') { - light = colorFunctions.rgba(255, 255, 255, 1.0); - } - if (typeof dark === 'undefined') { - dark = colorFunctions.rgba(0, 0, 0, 1.0); - } - // Figure out which is actually light and dark: - if (dark.luma() > light.luma()) { - var t = light; - light = dark; - dark = t; - } - if (typeof threshold === 'undefined') { - threshold = 0.43; - } - else { - threshold = number(threshold); - } - if (color.luma() < threshold) { - return light; - } - else { - return dark; - } - }, - // Changes made in 2.7.0 - Reverted in 3.0.0 - // contrast: function (color, color1, color2, threshold) { - // // Return which of `color1` and `color2` has the greatest contrast with `color` - // // according to the standard WCAG contrast ratio calculation. - // // http://www.w3.org/TR/WCAG20/#contrast-ratiodef - // // The threshold param is no longer used, in line with SASS. - // // filter: contrast(3.2); - // // should be kept as is, so check for color - // if (!color.rgb) { - // return null; - // } - // if (typeof color1 === 'undefined') { - // color1 = colorFunctions.rgba(0, 0, 0, 1.0); - // } - // if (typeof color2 === 'undefined') { - // color2 = colorFunctions.rgba(255, 255, 255, 1.0); - // } - // var contrast1, contrast2; - // var luma = color.luma(); - // var luma1 = color1.luma(); - // var luma2 = color2.luma(); - // // Calculate contrast ratios for each color - // if (luma > luma1) { - // contrast1 = (luma + 0.05) / (luma1 + 0.05); - // } else { - // contrast1 = (luma1 + 0.05) / (luma + 0.05); - // } - // if (luma > luma2) { - // contrast2 = (luma + 0.05) / (luma2 + 0.05); - // } else { - // contrast2 = (luma2 + 0.05) / (luma + 0.05); - // } - // if (contrast1 > contrast2) { - // return color1; - // } else { - // return color2; - // } - // }, - argb: function (color) { - return new Anonymous(color.toARGB()); - }, - color: function (c) { - if ((c instanceof Quoted) && - (/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})$/i.test(c.value))) { - var val = c.value.slice(1); - return new Color(val, undefined, "#" + val); - } - if ((c instanceof Color) || (c = Color.fromKeyword(c.value))) { - c.value = undefined; - return c; - } - throw { - type: 'Argument', - message: 'argument must be a color keyword or 3|4|6|8 digit hex e.g. #FFF' - }; - }, - tint: function (color, amount) { - return colorFunctions.mix(colorFunctions.rgb(255, 255, 255), color, amount); - }, - shade: function (color, amount) { - return colorFunctions.mix(colorFunctions.rgb(0, 0, 0), color, amount); - } - }; - var color = colorFunctions; + var colorFunctions; + function clamp$1(val) { + return Math.min(1, Math.max(0, val)); + } + function hsla(origColor, hsl) { + var color = colorFunctions.hsla(hsl.h, hsl.s, hsl.l, hsl.a); + if (color) { + if (origColor.value && + /^(rgb|hsl)/.test(origColor.value)) { + color.value = origColor.value; + } + else { + color.value = 'rgb'; + } + return color; + } + } + function toHSL(color) { + if (color.toHSL) { + return color.toHSL(); + } + else { + throw new Error('Argument cannot be evaluated to a color'); + } + } + function toHSV(color) { + if (color.toHSV) { + return color.toHSV(); + } + else { + throw new Error('Argument cannot be evaluated to a color'); + } + } + function number(n) { + if (n instanceof Dimension) { + return parseFloat(n.unit.is('%') ? n.value / 100 : n.value); + } + else if (typeof n === 'number') { + return n; + } + else { + throw { + type: 'Argument', + message: 'color functions take numbers as parameters' + }; + } + } + function scaled(n, size) { + if (n instanceof Dimension && n.unit.is('%')) { + return parseFloat(n.value * size / 100); + } + else { + return number(n); + } + } + colorFunctions = { + rgb: function (r, g, b) { + var a = 1; + /** + * Comma-less syntax + * e.g. rgb(0 128 255 / 50%) + */ + if (r instanceof Expression) { + var val = r.value; + r = val[0]; + g = val[1]; + b = val[2]; + /** + * @todo - should this be normalized in + * function caller? Or parsed differently? + */ + if (b instanceof Operation) { + var op = b; + b = op.operands[0]; + a = op.operands[1]; + } + } + var color = colorFunctions.rgba(r, g, b, a); + if (color) { + color.value = 'rgb'; + return color; + } + }, + rgba: function (r, g, b, a) { + try { + if (r instanceof Color) { + if (g) { + a = number(g); + } + else { + a = r.alpha; + } + return new Color(r.rgb, a, 'rgba'); + } + var rgb = [r, g, b].map(function (c) { return scaled(c, 255); }); + a = number(a); + return new Color(rgb, a, 'rgba'); + } + catch (e) { } + }, + hsl: function (h, s, l) { + var a = 1; + if (h instanceof Expression) { + var val = h.value; + h = val[0]; + s = val[1]; + l = val[2]; + if (l instanceof Operation) { + var op = l; + l = op.operands[0]; + a = op.operands[1]; + } + } + var color = colorFunctions.hsla(h, s, l, a); + if (color) { + color.value = 'hsl'; + return color; + } + }, + hsla: function (h, s, l, a) { + try { + if (h instanceof Color) { + if (s) { + a = number(s); + } + else { + a = h.alpha; + } + return new Color(h.rgb, a, 'hsla'); + } + var m1_1; + var m2_1; + function hue(h) { + h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h); + if (h * 6 < 1) { + return m1_1 + (m2_1 - m1_1) * h * 6; + } + else if (h * 2 < 1) { + return m2_1; + } + else if (h * 3 < 2) { + return m1_1 + (m2_1 - m1_1) * (2 / 3 - h) * 6; + } + else { + return m1_1; + } + } + h = (number(h) % 360) / 360; + s = clamp$1(number(s)); + l = clamp$1(number(l)); + a = clamp$1(number(a)); + m2_1 = l <= 0.5 ? l * (s + 1) : l + s - l * s; + m1_1 = l * 2 - m2_1; + var rgb = [ + hue(h + 1 / 3) * 255, + hue(h) * 255, + hue(h - 1 / 3) * 255 + ]; + a = number(a); + return new Color(rgb, a, 'hsla'); + } + catch (e) { } + }, + hsv: function (h, s, v) { + return colorFunctions.hsva(h, s, v, 1.0); + }, + hsva: function (h, s, v, a) { + h = ((number(h) % 360) / 360) * 360; + s = number(s); + v = number(v); + a = number(a); + var i; + var f; + i = Math.floor((h / 60) % 6); + f = (h / 60) - i; + var vs = [v, + v * (1 - s), + v * (1 - f * s), + v * (1 - (1 - f) * s)]; + var perm = [[0, 3, 1], + [2, 0, 1], + [1, 0, 3], + [1, 2, 0], + [3, 1, 0], + [0, 1, 2]]; + return colorFunctions.rgba(vs[perm[i][0]] * 255, vs[perm[i][1]] * 255, vs[perm[i][2]] * 255, a); + }, + hue: function (color) { + return new Dimension(toHSL(color).h); + }, + saturation: function (color) { + return new Dimension(toHSL(color).s * 100, '%'); + }, + lightness: function (color) { + return new Dimension(toHSL(color).l * 100, '%'); + }, + hsvhue: function (color) { + return new Dimension(toHSV(color).h); + }, + hsvsaturation: function (color) { + return new Dimension(toHSV(color).s * 100, '%'); + }, + hsvvalue: function (color) { + return new Dimension(toHSV(color).v * 100, '%'); + }, + red: function (color) { + return new Dimension(color.rgb[0]); + }, + green: function (color) { + return new Dimension(color.rgb[1]); + }, + blue: function (color) { + return new Dimension(color.rgb[2]); + }, + alpha: function (color) { + return new Dimension(toHSL(color).a); + }, + luma: function (color) { + return new Dimension(color.luma() * color.alpha * 100, '%'); + }, + luminance: function (color) { + var luminance = (0.2126 * color.rgb[0] / 255) + + (0.7152 * color.rgb[1] / 255) + + (0.0722 * color.rgb[2] / 255); + return new Dimension(luminance * color.alpha * 100, '%'); + }, + saturate: function (color, amount, method) { + // filter: saturate(3.2); + // should be kept as is, so check for color + if (!color.rgb) { + return null; + } + var hsl = toHSL(color); + if (typeof method !== 'undefined' && method.value === 'relative') { + hsl.s += hsl.s * amount.value / 100; + } + else { + hsl.s += amount.value / 100; + } + hsl.s = clamp$1(hsl.s); + return hsla(color, hsl); + }, + desaturate: function (color, amount, method) { + var hsl = toHSL(color); + if (typeof method !== 'undefined' && method.value === 'relative') { + hsl.s -= hsl.s * amount.value / 100; + } + else { + hsl.s -= amount.value / 100; + } + hsl.s = clamp$1(hsl.s); + return hsla(color, hsl); + }, + lighten: function (color, amount, method) { + var hsl = toHSL(color); + if (typeof method !== 'undefined' && method.value === 'relative') { + hsl.l += hsl.l * amount.value / 100; + } + else { + hsl.l += amount.value / 100; + } + hsl.l = clamp$1(hsl.l); + return hsla(color, hsl); + }, + darken: function (color, amount, method) { + var hsl = toHSL(color); + if (typeof method !== 'undefined' && method.value === 'relative') { + hsl.l -= hsl.l * amount.value / 100; + } + else { + hsl.l -= amount.value / 100; + } + hsl.l = clamp$1(hsl.l); + return hsla(color, hsl); + }, + fadein: function (color, amount, method) { + var hsl = toHSL(color); + if (typeof method !== 'undefined' && method.value === 'relative') { + hsl.a += hsl.a * amount.value / 100; + } + else { + hsl.a += amount.value / 100; + } + hsl.a = clamp$1(hsl.a); + return hsla(color, hsl); + }, + fadeout: function (color, amount, method) { + var hsl = toHSL(color); + if (typeof method !== 'undefined' && method.value === 'relative') { + hsl.a -= hsl.a * amount.value / 100; + } + else { + hsl.a -= amount.value / 100; + } + hsl.a = clamp$1(hsl.a); + return hsla(color, hsl); + }, + fade: function (color, amount) { + var hsl = toHSL(color); + hsl.a = amount.value / 100; + hsl.a = clamp$1(hsl.a); + return hsla(color, hsl); + }, + spin: function (color, amount) { + var hsl = toHSL(color); + var hue = (hsl.h + amount.value) % 360; + hsl.h = hue < 0 ? 360 + hue : hue; + return hsla(color, hsl); + }, + // + // Copyright (c) 2006-2009 Hampton Catlin, Natalie Weizenbaum, and Chris Eppstein + // http://sass-lang.com + // + mix: function (color1, color2, weight) { + if (!weight) { + weight = new Dimension(50); + } + var p = weight.value / 100.0; + var w = p * 2 - 1; + var a = toHSL(color1).a - toHSL(color2).a; + var w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; + var w2 = 1 - w1; + var rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2, + color1.rgb[1] * w1 + color2.rgb[1] * w2, + color1.rgb[2] * w1 + color2.rgb[2] * w2]; + var alpha = color1.alpha * p + color2.alpha * (1 - p); + return new Color(rgb, alpha); + }, + greyscale: function (color) { + return colorFunctions.desaturate(color, new Dimension(100)); + }, + contrast: function (color, dark, light, threshold) { + // filter: contrast(3.2); + // should be kept as is, so check for color + if (!color.rgb) { + return null; + } + if (typeof light === 'undefined') { + light = colorFunctions.rgba(255, 255, 255, 1.0); + } + if (typeof dark === 'undefined') { + dark = colorFunctions.rgba(0, 0, 0, 1.0); + } + // Figure out which is actually light and dark: + if (dark.luma() > light.luma()) { + var t = light; + light = dark; + dark = t; + } + if (typeof threshold === 'undefined') { + threshold = 0.43; + } + else { + threshold = number(threshold); + } + if (color.luma() < threshold) { + return light; + } + else { + return dark; + } + }, + // Changes made in 2.7.0 - Reverted in 3.0.0 + // contrast: function (color, color1, color2, threshold) { + // // Return which of `color1` and `color2` has the greatest contrast with `color` + // // according to the standard WCAG contrast ratio calculation. + // // http://www.w3.org/TR/WCAG20/#contrast-ratiodef + // // The threshold param is no longer used, in line with SASS. + // // filter: contrast(3.2); + // // should be kept as is, so check for color + // if (!color.rgb) { + // return null; + // } + // if (typeof color1 === 'undefined') { + // color1 = colorFunctions.rgba(0, 0, 0, 1.0); + // } + // if (typeof color2 === 'undefined') { + // color2 = colorFunctions.rgba(255, 255, 255, 1.0); + // } + // var contrast1, contrast2; + // var luma = color.luma(); + // var luma1 = color1.luma(); + // var luma2 = color2.luma(); + // // Calculate contrast ratios for each color + // if (luma > luma1) { + // contrast1 = (luma + 0.05) / (luma1 + 0.05); + // } else { + // contrast1 = (luma1 + 0.05) / (luma + 0.05); + // } + // if (luma > luma2) { + // contrast2 = (luma + 0.05) / (luma2 + 0.05); + // } else { + // contrast2 = (luma2 + 0.05) / (luma + 0.05); + // } + // if (contrast1 > contrast2) { + // return color1; + // } else { + // return color2; + // } + // }, + argb: function (color) { + return new Anonymous(color.toARGB()); + }, + color: function (c) { + if ((c instanceof Quoted) && + (/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})$/i.test(c.value))) { + var val = c.value.slice(1); + return new Color(val, undefined, "#" + val); + } + if ((c instanceof Color) || (c = Color.fromKeyword(c.value))) { + c.value = undefined; + return c; + } + throw { + type: 'Argument', + message: 'argument must be a color keyword or 3|4|6|8 digit hex e.g. #FFF' + }; + }, + tint: function (color, amount) { + return colorFunctions.mix(colorFunctions.rgb(255, 255, 255), color, amount); + }, + shade: function (color, amount) { + return colorFunctions.mix(colorFunctions.rgb(0, 0, 0), color, amount); + } + }; + var color = colorFunctions; - // Color Blending - // ref: http://www.w3.org/TR/compositing-1 - function colorBlend(mode, color1, color2) { - var ab = color1.alpha; // result - var // backdrop - cb; - var as = color2.alpha; - var // source - cs; - var ar; - var cr; - var r = []; - ar = as + ab * (1 - as); - for (var i = 0; i < 3; i++) { - cb = color1.rgb[i] / 255; - cs = color2.rgb[i] / 255; - cr = mode(cb, cs); - if (ar) { - cr = (as * cs + ab * (cb - - as * (cb + cs - cr))) / ar; - } - r[i] = cr * 255; - } - return new Color(r, ar); - } - var colorBlendModeFunctions = { - multiply: function (cb, cs) { - return cb * cs; - }, - screen: function (cb, cs) { - return cb + cs - cb * cs; - }, - overlay: function (cb, cs) { - cb *= 2; - return (cb <= 1) ? - colorBlendModeFunctions.multiply(cb, cs) : - colorBlendModeFunctions.screen(cb - 1, cs); - }, - softlight: function (cb, cs) { - var d = 1; - var e = cb; - if (cs > 0.5) { - e = 1; - d = (cb > 0.25) ? Math.sqrt(cb) - : ((16 * cb - 12) * cb + 4) * cb; - } - return cb - (1 - 2 * cs) * e * (d - cb); - }, - hardlight: function (cb, cs) { - return colorBlendModeFunctions.overlay(cs, cb); - }, - difference: function (cb, cs) { - return Math.abs(cb - cs); - }, - exclusion: function (cb, cs) { - return cb + cs - 2 * cb * cs; - }, - // non-w3c functions: - average: function (cb, cs) { - return (cb + cs) / 2; - }, - negation: function (cb, cs) { - return 1 - Math.abs(cb + cs - 1); - } - }; - for (var f in colorBlendModeFunctions) { - if (colorBlendModeFunctions.hasOwnProperty(f)) { - colorBlend[f] = colorBlend.bind(null, colorBlendModeFunctions[f]); - } - } + // Color Blending + // ref: http://www.w3.org/TR/compositing-1 + function colorBlend(mode, color1, color2) { + var ab = color1.alpha; // result + var // backdrop + cb; + var as = color2.alpha; + var // source + cs; + var ar; + var cr; + var r = []; + ar = as + ab * (1 - as); + for (var i = 0; i < 3; i++) { + cb = color1.rgb[i] / 255; + cs = color2.rgb[i] / 255; + cr = mode(cb, cs); + if (ar) { + cr = (as * cs + ab * (cb - + as * (cb + cs - cr))) / ar; + } + r[i] = cr * 255; + } + return new Color(r, ar); + } + var colorBlendModeFunctions = { + multiply: function (cb, cs) { + return cb * cs; + }, + screen: function (cb, cs) { + return cb + cs - cb * cs; + }, + overlay: function (cb, cs) { + cb *= 2; + return (cb <= 1) ? + colorBlendModeFunctions.multiply(cb, cs) : + colorBlendModeFunctions.screen(cb - 1, cs); + }, + softlight: function (cb, cs) { + var d = 1; + var e = cb; + if (cs > 0.5) { + e = 1; + d = (cb > 0.25) ? Math.sqrt(cb) + : ((16 * cb - 12) * cb + 4) * cb; + } + return cb - (1 - 2 * cs) * e * (d - cb); + }, + hardlight: function (cb, cs) { + return colorBlendModeFunctions.overlay(cs, cb); + }, + difference: function (cb, cs) { + return Math.abs(cb - cs); + }, + exclusion: function (cb, cs) { + return cb + cs - 2 * cb * cs; + }, + // non-w3c functions: + average: function (cb, cs) { + return (cb + cs) / 2; + }, + negation: function (cb, cs) { + return 1 - Math.abs(cb + cs - 1); + } + }; + for (var f in colorBlendModeFunctions) { + if (colorBlendModeFunctions.hasOwnProperty(f)) { + colorBlend[f] = colorBlend.bind(null, colorBlendModeFunctions[f]); + } + } - var dataUri = (function (environment) { - var fallback = function (functionThis, node) { return new URL(node, functionThis.index, functionThis.currentFileInfo).eval(functionThis.context); }; - return { 'data-uri': function (mimetypeNode, filePathNode) { - if (!filePathNode) { - filePathNode = mimetypeNode; - mimetypeNode = null; - } - var mimetype = mimetypeNode && mimetypeNode.value; - var filePath = filePathNode.value; - var currentFileInfo = this.currentFileInfo; - var currentDirectory = currentFileInfo.rewriteUrls ? - currentFileInfo.currentDirectory : currentFileInfo.entryPath; - var fragmentStart = filePath.indexOf('#'); - var fragment = ''; - if (fragmentStart !== -1) { - fragment = filePath.slice(fragmentStart); - filePath = filePath.slice(0, fragmentStart); - } - var context = clone(this.context); - context.rawBuffer = true; - var fileManager = environment.getFileManager(filePath, currentDirectory, context, environment, true); - if (!fileManager) { - return fallback(this, filePathNode); - } - var useBase64 = false; - // detect the mimetype if not given - if (!mimetypeNode) { - mimetype = environment.mimeLookup(filePath); - if (mimetype === 'image/svg+xml') { - useBase64 = false; - } - else { - // use base 64 unless it's an ASCII or UTF-8 format - var charset = environment.charsetLookup(mimetype); - useBase64 = ['US-ASCII', 'UTF-8'].indexOf(charset) < 0; - } - if (useBase64) { - mimetype += ';base64'; - } - } - else { - useBase64 = /;base64$/.test(mimetype); - } - var fileSync = fileManager.loadFileSync(filePath, currentDirectory, context, environment); - if (!fileSync.contents) { - logger.warn("Skipped data-uri embedding of " + filePath + " because file not found"); - return fallback(this, filePathNode || mimetypeNode); - } - var buf = fileSync.contents; - if (useBase64 && !environment.encodeBase64) { - return fallback(this, filePathNode); - } - buf = useBase64 ? environment.encodeBase64(buf) : encodeURIComponent(buf); - var uri = "data:" + mimetype + "," + buf + fragment; - return new URL(new Quoted("\"" + uri + "\"", uri, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo); - } }; - }); + var dataUri = (function (environment) { + var fallback = function (functionThis, node) { return new URL(node, functionThis.index, functionThis.currentFileInfo).eval(functionThis.context); }; + return { 'data-uri': function (mimetypeNode, filePathNode) { + if (!filePathNode) { + filePathNode = mimetypeNode; + mimetypeNode = null; + } + var mimetype = mimetypeNode && mimetypeNode.value; + var filePath = filePathNode.value; + var currentFileInfo = this.currentFileInfo; + var currentDirectory = currentFileInfo.rewriteUrls ? + currentFileInfo.currentDirectory : currentFileInfo.entryPath; + var fragmentStart = filePath.indexOf('#'); + var fragment = ''; + if (fragmentStart !== -1) { + fragment = filePath.slice(fragmentStart); + filePath = filePath.slice(0, fragmentStart); + } + var context = clone(this.context); + context.rawBuffer = true; + var fileManager = environment.getFileManager(filePath, currentDirectory, context, environment, true); + if (!fileManager) { + return fallback(this, filePathNode); + } + var useBase64 = false; + // detect the mimetype if not given + if (!mimetypeNode) { + mimetype = environment.mimeLookup(filePath); + if (mimetype === 'image/svg+xml') { + useBase64 = false; + } + else { + // use base 64 unless it's an ASCII or UTF-8 format + var charset = environment.charsetLookup(mimetype); + useBase64 = ['US-ASCII', 'UTF-8'].indexOf(charset) < 0; + } + if (useBase64) { + mimetype += ';base64'; + } + } + else { + useBase64 = /;base64$/.test(mimetype); + } + var fileSync = fileManager.loadFileSync(filePath, currentDirectory, context, environment); + if (!fileSync.contents) { + logger.warn("Skipped data-uri embedding of " + filePath + " because file not found"); + return fallback(this, filePathNode || mimetypeNode); + } + var buf = fileSync.contents; + if (useBase64 && !environment.encodeBase64) { + return fallback(this, filePathNode); + } + buf = useBase64 ? environment.encodeBase64(buf) : encodeURIComponent(buf); + var uri = "data:" + mimetype + "," + buf + fragment; + return new URL(new Quoted("\"" + uri + "\"", uri, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo); + } }; + }); - var getItemsFromNode = function (node) { - // handle non-array values as an array of length 1 - // return 'undefined' if index is invalid - var items = Array.isArray(node.value) ? - node.value : Array(node); - return items; - }; - var list = { - _SELF: function (n) { - return n; - }, - extract: function (values, index) { - // (1-based index) - index = index.value - 1; - return getItemsFromNode(values)[index]; - }, - length: function (values) { - return new Dimension(getItemsFromNode(values).length); - }, - /** - * Creates a Less list of incremental values. - * Modeled after Lodash's range function, also exists natively in PHP - * - * @param {Dimension} [start=1] - * @param {Dimension} end - e.g. 10 or 10px - unit is added to output - * @param {Dimension} [step=1] - */ - range: function (start, end, step) { - var from; - var to; - var stepValue = 1; - var list = []; - if (end) { - to = end; - from = start.value; - if (step) { - stepValue = step.value; - } - } - else { - from = 1; - to = start; - } - for (var i = from; i <= to.value; i += stepValue) { - list.push(new Dimension(i, to.unit)); - } - return new Expression(list); - }, - each: function (list, rs) { - var rules = []; - var newRules; - var iterator; - if (list.value && !(list instanceof Quoted)) { - if (Array.isArray(list.value)) { - iterator = list.value; - } - else { - iterator = [list.value]; - } - } - else if (list.ruleset) { - iterator = list.ruleset.rules; - } - else if (list.rules) { - iterator = list.rules; - } - else if (Array.isArray(list)) { - iterator = list; - } - else { - iterator = [list]; - } - var valueName = '@value'; - var keyName = '@key'; - var indexName = '@index'; - if (rs.params) { - valueName = rs.params[0] && rs.params[0].name; - keyName = rs.params[1] && rs.params[1].name; - indexName = rs.params[2] && rs.params[2].name; - rs = rs.rules; - } - else { - rs = rs.ruleset; - } - for (var i = 0; i < iterator.length; i++) { - var key = void 0; - var value = void 0; - var item = iterator[i]; - if (item instanceof Declaration) { - key = typeof item.name === 'string' ? item.name : item.name[0].value; - value = item.value; - } - else { - key = new Dimension(i + 1); - value = item; - } - if (item instanceof Comment) { - continue; - } - newRules = rs.rules.slice(0); - if (valueName) { - newRules.push(new Declaration(valueName, value, false, false, this.index, this.currentFileInfo)); - } - if (indexName) { - newRules.push(new Declaration(indexName, new Dimension(i + 1), false, false, this.index, this.currentFileInfo)); - } - if (keyName) { - newRules.push(new Declaration(keyName, key, false, false, this.index, this.currentFileInfo)); - } - rules.push(new Ruleset([new (Selector)([new Element("", '&')])], newRules, rs.strictImports, rs.visibilityInfo())); - } - return new Ruleset([new (Selector)([new Element("", '&')])], rules, rs.strictImports, rs.visibilityInfo()).eval(this.context); - } - }; + var getItemsFromNode = function (node) { + // handle non-array values as an array of length 1 + // return 'undefined' if index is invalid + var items = Array.isArray(node.value) ? + node.value : Array(node); + return items; + }; + var list = { + _SELF: function (n) { + return n; + }, + '~': function () { + var expr = []; + for (var _i = 0; _i < arguments.length; _i++) { + expr[_i] = arguments[_i]; + } + if (expr.length === 1) { + return expr[0]; + } + return new Value(expr); + }, + extract: function (values, index) { + // (1-based index) + index = index.value - 1; + return getItemsFromNode(values)[index]; + }, + length: function (values) { + return new Dimension(getItemsFromNode(values).length); + }, + /** + * Creates a Less list of incremental values. + * Modeled after Lodash's range function, also exists natively in PHP + * + * @param {Dimension} [start=1] + * @param {Dimension} end - e.g. 10 or 10px - unit is added to output + * @param {Dimension} [step=1] + */ + range: function (start, end, step) { + var from; + var to; + var stepValue = 1; + var list = []; + if (end) { + to = end; + from = start.value; + if (step) { + stepValue = step.value; + } + } + else { + from = 1; + to = start; + } + for (var i = from; i <= to.value; i += stepValue) { + list.push(new Dimension(i, to.unit)); + } + return new Expression(list); + }, + each: function (list, rs) { + var _this = this; + var rules = []; + var newRules; + var iterator; + var tryEval = function (val) { + if (val instanceof Node) { + return val.eval(_this.context); + } + return val; + }; + if (list.value && !(list instanceof Quoted)) { + if (Array.isArray(list.value)) { + iterator = list.value.map(tryEval); + } + else { + iterator = [tryEval(list.value)]; + } + } + else if (list.ruleset) { + iterator = tryEval(list.ruleset).rules; + } + else if (list.rules) { + iterator = list.rules.map(tryEval); + } + else if (Array.isArray(list)) { + iterator = list.map(tryEval); + } + else { + iterator = [tryEval(list)]; + } + var valueName = '@value'; + var keyName = '@key'; + var indexName = '@index'; + if (rs.params) { + valueName = rs.params[0] && rs.params[0].name; + keyName = rs.params[1] && rs.params[1].name; + indexName = rs.params[2] && rs.params[2].name; + rs = rs.rules; + } + else { + rs = rs.ruleset; + } + for (var i = 0; i < iterator.length; i++) { + var key = void 0; + var value = void 0; + var item = iterator[i]; + if (item instanceof Declaration) { + key = typeof item.name === 'string' ? item.name : item.name[0].value; + value = item.value; + } + else { + key = new Dimension(i + 1); + value = item; + } + if (item instanceof Comment) { + continue; + } + newRules = rs.rules.slice(0); + if (valueName) { + newRules.push(new Declaration(valueName, value, false, false, this.index, this.currentFileInfo)); + } + if (indexName) { + newRules.push(new Declaration(indexName, new Dimension(i + 1), false, false, this.index, this.currentFileInfo)); + } + if (keyName) { + newRules.push(new Declaration(keyName, key, false, false, this.index, this.currentFileInfo)); + } + rules.push(new Ruleset([new (Selector)([new Element("", '&')])], newRules, rs.strictImports, rs.visibilityInfo())); + } + return new Ruleset([new (Selector)([new Element("", '&')])], rules, rs.strictImports, rs.visibilityInfo()).eval(this.context); + } + }; - var MathHelper = function (fn, unit, n) { - if (!(n instanceof Dimension)) { - throw { type: 'Argument', message: 'argument must be a number' }; - } - if (unit == null) { - unit = n.unit; - } - else { - n = n.unify(); - } - return new Dimension(fn(parseFloat(n.value)), unit); - }; + var MathHelper = function (fn, unit, n) { + if (!(n instanceof Dimension)) { + throw { type: 'Argument', message: 'argument must be a number' }; + } + if (unit == null) { + unit = n.unit; + } + else { + n = n.unify(); + } + return new Dimension(fn(parseFloat(n.value)), unit); + }; - var mathFunctions = { - // name, unit - ceil: null, - floor: null, - sqrt: null, - abs: null, - tan: '', - sin: '', - cos: '', - atan: 'rad', - asin: 'rad', - acos: 'rad' - }; - for (var f$1 in mathFunctions) { - if (mathFunctions.hasOwnProperty(f$1)) { - mathFunctions[f$1] = MathHelper.bind(null, Math[f$1], mathFunctions[f$1]); - } - } - mathFunctions.round = function (n, f) { - var fraction = typeof f === 'undefined' ? 0 : f.value; - return MathHelper(function (num) { return num.toFixed(fraction); }, null, n); - }; + var mathFunctions = { + // name, unit + ceil: null, + floor: null, + sqrt: null, + abs: null, + tan: '', + sin: '', + cos: '', + atan: 'rad', + asin: 'rad', + acos: 'rad' + }; + for (var f$1 in mathFunctions) { + if (mathFunctions.hasOwnProperty(f$1)) { + mathFunctions[f$1] = MathHelper.bind(null, Math[f$1], mathFunctions[f$1]); + } + } + mathFunctions.round = function (n, f) { + var fraction = typeof f === 'undefined' ? 0 : f.value; + return MathHelper(function (num) { return num.toFixed(fraction); }, null, n); + }; - var minMax = function (isMin, args) { - args = Array.prototype.slice.call(args); - switch (args.length) { - case 0: throw { type: 'Argument', message: 'one or more arguments required' }; - } - var i; // key is the unit.toString() for unified Dimension values, - var j; - var current; - var currentUnified; - var referenceUnified; - var unit; - var unitStatic; - var unitClone; - var // elems only contains original argument values. - order = []; - var values = {}; - // value is the index into the order array. - for (i = 0; i < args.length; i++) { - current = args[i]; - if (!(current instanceof Dimension)) { - if (Array.isArray(args[i].value)) { - Array.prototype.push.apply(args, Array.prototype.slice.call(args[i].value)); - } - continue; - } - currentUnified = current.unit.toString() === '' && unitClone !== undefined ? new Dimension(current.value, unitClone).unify() : current.unify(); - unit = currentUnified.unit.toString() === '' && unitStatic !== undefined ? unitStatic : currentUnified.unit.toString(); - unitStatic = unit !== '' && unitStatic === undefined || unit !== '' && order[0].unify().unit.toString() === '' ? unit : unitStatic; - unitClone = unit !== '' && unitClone === undefined ? current.unit.toString() : unitClone; - j = values[''] !== undefined && unit !== '' && unit === unitStatic ? values[''] : values[unit]; - if (j === undefined) { - if (unitStatic !== undefined && unit !== unitStatic) { - throw { type: 'Argument', message: 'incompatible types' }; - } - values[unit] = order.length; - order.push(current); - continue; - } - referenceUnified = order[j].unit.toString() === '' && unitClone !== undefined ? new Dimension(order[j].value, unitClone).unify() : order[j].unify(); - if (isMin && currentUnified.value < referenceUnified.value || - !isMin && currentUnified.value > referenceUnified.value) { - order[j] = current; - } - } - if (order.length == 1) { - return order[0]; - } - args = order.map(function (a) { return a.toCSS(this.context); }).join(this.context.compress ? ',' : ', '); - return new Anonymous((isMin ? 'min' : 'max') + "(" + args + ")"); - }; - var number$1 = { - min: function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } - return minMax(true, args); - }, - max: function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } - return minMax(false, args); - }, - convert: function (val, unit) { - return val.convertTo(unit.value); - }, - pi: function () { - return new Dimension(Math.PI); - }, - mod: function (a, b) { - return new Dimension(a.value % b.value, a.unit); - }, - pow: function (x, y) { - if (typeof x === 'number' && typeof y === 'number') { - x = new Dimension(x); - y = new Dimension(y); - } - else if (!(x instanceof Dimension) || !(y instanceof Dimension)) { - throw { type: 'Argument', message: 'arguments must be numbers' }; - } - return new Dimension(Math.pow(x.value, y.value), x.unit); - }, - percentage: function (n) { - var result = MathHelper(function (num) { return num * 100; }, '%', n); - return result; - } - }; + var minMax = function (isMin, args) { + args = Array.prototype.slice.call(args); + switch (args.length) { + case 0: throw { type: 'Argument', message: 'one or more arguments required' }; + } + var i; // key is the unit.toString() for unified Dimension values, + var j; + var current; + var currentUnified; + var referenceUnified; + var unit; + var unitStatic; + var unitClone; + var // elems only contains original argument values. + order = []; + var values = {}; + // value is the index into the order array. + for (i = 0; i < args.length; i++) { + current = args[i]; + if (!(current instanceof Dimension)) { + if (Array.isArray(args[i].value)) { + Array.prototype.push.apply(args, Array.prototype.slice.call(args[i].value)); + } + continue; + } + currentUnified = current.unit.toString() === '' && unitClone !== undefined ? new Dimension(current.value, unitClone).unify() : current.unify(); + unit = currentUnified.unit.toString() === '' && unitStatic !== undefined ? unitStatic : currentUnified.unit.toString(); + unitStatic = unit !== '' && unitStatic === undefined || unit !== '' && order[0].unify().unit.toString() === '' ? unit : unitStatic; + unitClone = unit !== '' && unitClone === undefined ? current.unit.toString() : unitClone; + j = values[''] !== undefined && unit !== '' && unit === unitStatic ? values[''] : values[unit]; + if (j === undefined) { + if (unitStatic !== undefined && unit !== unitStatic) { + throw { type: 'Argument', message: 'incompatible types' }; + } + values[unit] = order.length; + order.push(current); + continue; + } + referenceUnified = order[j].unit.toString() === '' && unitClone !== undefined ? new Dimension(order[j].value, unitClone).unify() : order[j].unify(); + if (isMin && currentUnified.value < referenceUnified.value || + !isMin && currentUnified.value > referenceUnified.value) { + order[j] = current; + } + } + if (order.length == 1) { + return order[0]; + } + args = order.map(function (a) { return a.toCSS(this.context); }).join(this.context.compress ? ',' : ', '); + return new Anonymous((isMin ? 'min' : 'max') + "(" + args + ")"); + }; + var number$1 = { + min: function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + try { + return minMax(true, args); + } + catch (e) { } + }, + max: function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + try { + return minMax(false, args); + } + catch (e) { } + }, + convert: function (val, unit) { + return val.convertTo(unit.value); + }, + pi: function () { + return new Dimension(Math.PI); + }, + mod: function (a, b) { + return new Dimension(a.value % b.value, a.unit); + }, + pow: function (x, y) { + if (typeof x === 'number' && typeof y === 'number') { + x = new Dimension(x); + y = new Dimension(y); + } + else if (!(x instanceof Dimension) || !(y instanceof Dimension)) { + throw { type: 'Argument', message: 'arguments must be numbers' }; + } + return new Dimension(Math.pow(x.value, y.value), x.unit); + }, + percentage: function (n) { + var result = MathHelper(function (num) { return num * 100; }, '%', n); + return result; + } + }; - var string = { - e: function (str) { - return new Quoted('"', str instanceof JavaScript ? str.evaluated : str.value, true); - }, - escape: function (str) { - return new Anonymous(encodeURI(str.value).replace(/=/g, '%3D').replace(/:/g, '%3A').replace(/#/g, '%23').replace(/;/g, '%3B') - .replace(/\(/g, '%28').replace(/\)/g, '%29')); - }, - replace: function (string, pattern, replacement, flags) { - var result = string.value; - replacement = (replacement.type === 'Quoted') ? - replacement.value : replacement.toCSS(); - result = result.replace(new RegExp(pattern.value, flags ? flags.value : ''), replacement); - return new Quoted(string.quote || '', result, string.escaped); - }, - '%': function (string /* arg, arg, ... */) { - var args = Array.prototype.slice.call(arguments, 1); - var result = string.value; - var _loop_1 = function (i) { - /* jshint loopfunc:true */ - result = result.replace(/%[sda]/i, function (token) { - var value = ((args[i].type === 'Quoted') && - token.match(/s/i)) ? args[i].value : args[i].toCSS(); - return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value; - }); - }; - for (var i = 0; i < args.length; i++) { - _loop_1(i); - } - result = result.replace(/%%/g, '%'); - return new Quoted(string.quote || '', result, string.escaped); - } - }; + var string = { + e: function (str) { + return new Quoted('"', str instanceof JavaScript ? str.evaluated : str.value, true); + }, + escape: function (str) { + return new Anonymous(encodeURI(str.value).replace(/=/g, '%3D').replace(/:/g, '%3A').replace(/#/g, '%23').replace(/;/g, '%3B') + .replace(/\(/g, '%28').replace(/\)/g, '%29')); + }, + replace: function (string, pattern, replacement, flags) { + var result = string.value; + replacement = (replacement.type === 'Quoted') ? + replacement.value : replacement.toCSS(); + result = result.replace(new RegExp(pattern.value, flags ? flags.value : ''), replacement); + return new Quoted(string.quote || '', result, string.escaped); + }, + '%': function (string /* arg, arg, ... */) { + var args = Array.prototype.slice.call(arguments, 1); + var result = string.value; + var _loop_1 = function (i) { + /* jshint loopfunc:true */ + result = result.replace(/%[sda]/i, function (token) { + var value = ((args[i].type === 'Quoted') && + token.match(/s/i)) ? args[i].value : args[i].toCSS(); + return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value; + }); + }; + for (var i = 0; i < args.length; i++) { + _loop_1(i); + } + result = result.replace(/%%/g, '%'); + return new Quoted(string.quote || '', result, string.escaped); + } + }; - var svg = (function (environment) { - return { 'svg-gradient': function (direction) { - var stops; - var gradientDirectionSvg; - var gradientType = 'linear'; - var rectangleDimension = 'x="0" y="0" width="1" height="1"'; - var renderEnv = { compress: false }; - var returner; - var directionValue = direction.toCSS(renderEnv); - var i; - var color; - var position; - var positionValue; - var alpha; - function throwArgumentDescriptor() { - throw { type: 'Argument', - message: 'svg-gradient expects direction, start_color [start_position], [color position,]...,' + - ' end_color [end_position] or direction, color list' }; - } - if (arguments.length == 2) { - if (arguments[1].value.length < 2) { - throwArgumentDescriptor(); - } - stops = arguments[1].value; - } - else if (arguments.length < 3) { - throwArgumentDescriptor(); - } - else { - stops = Array.prototype.slice.call(arguments, 1); - } - switch (directionValue) { - case 'to bottom': - gradientDirectionSvg = 'x1="0%" y1="0%" x2="0%" y2="100%"'; - break; - case 'to right': - gradientDirectionSvg = 'x1="0%" y1="0%" x2="100%" y2="0%"'; - break; - case 'to bottom right': - gradientDirectionSvg = 'x1="0%" y1="0%" x2="100%" y2="100%"'; - break; - case 'to top right': - gradientDirectionSvg = 'x1="0%" y1="100%" x2="100%" y2="0%"'; - break; - case 'ellipse': - case 'ellipse at center': - gradientType = 'radial'; - gradientDirectionSvg = 'cx="50%" cy="50%" r="75%"'; - rectangleDimension = 'x="-50" y="-50" width="101" height="101"'; - break; - default: - throw { type: 'Argument', message: 'svg-gradient direction must be \'to bottom\', \'to right\',' + - ' \'to bottom right\', \'to top right\' or \'ellipse at center\'' }; - } - returner = "<" + gradientType + "Gradient id=\"g\" " + gradientDirectionSvg + ">"; - for (i = 0; i < stops.length; i += 1) { - if (stops[i] instanceof Expression) { - color = stops[i].value[0]; - position = stops[i].value[1]; - } - else { - color = stops[i]; - position = undefined; - } - if (!(color instanceof Color) || (!((i === 0 || i + 1 === stops.length) && position === undefined) && !(position instanceof Dimension))) { - throwArgumentDescriptor(); - } - positionValue = position ? position.toCSS(renderEnv) : i === 0 ? '0%' : '100%'; - alpha = color.alpha; - returner += ""; - } - returner += ""; - returner = encodeURIComponent(returner); - returner = "data:image/svg+xml," + returner; - return new URL(new Quoted("'" + returner + "'", returner, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo); - } }; - }); + var svg = (function (environment) { + return { 'svg-gradient': function (direction) { + var stops; + var gradientDirectionSvg; + var gradientType = 'linear'; + var rectangleDimension = 'x="0" y="0" width="1" height="1"'; + var renderEnv = { compress: false }; + var returner; + var directionValue = direction.toCSS(renderEnv); + var i; + var color; + var position; + var positionValue; + var alpha; + function throwArgumentDescriptor() { + throw { type: 'Argument', + message: 'svg-gradient expects direction, start_color [start_position], [color position,]...,' + + ' end_color [end_position] or direction, color list' }; + } + if (arguments.length == 2) { + if (arguments[1].value.length < 2) { + throwArgumentDescriptor(); + } + stops = arguments[1].value; + } + else if (arguments.length < 3) { + throwArgumentDescriptor(); + } + else { + stops = Array.prototype.slice.call(arguments, 1); + } + switch (directionValue) { + case 'to bottom': + gradientDirectionSvg = 'x1="0%" y1="0%" x2="0%" y2="100%"'; + break; + case 'to right': + gradientDirectionSvg = 'x1="0%" y1="0%" x2="100%" y2="0%"'; + break; + case 'to bottom right': + gradientDirectionSvg = 'x1="0%" y1="0%" x2="100%" y2="100%"'; + break; + case 'to top right': + gradientDirectionSvg = 'x1="0%" y1="100%" x2="100%" y2="0%"'; + break; + case 'ellipse': + case 'ellipse at center': + gradientType = 'radial'; + gradientDirectionSvg = 'cx="50%" cy="50%" r="75%"'; + rectangleDimension = 'x="-50" y="-50" width="101" height="101"'; + break; + default: + throw { type: 'Argument', message: 'svg-gradient direction must be \'to bottom\', \'to right\',' + + ' \'to bottom right\', \'to top right\' or \'ellipse at center\'' }; + } + returner = "<" + gradientType + "Gradient id=\"g\" " + gradientDirectionSvg + ">"; + for (i = 0; i < stops.length; i += 1) { + if (stops[i] instanceof Expression) { + color = stops[i].value[0]; + position = stops[i].value[1]; + } + else { + color = stops[i]; + position = undefined; + } + if (!(color instanceof Color) || (!((i === 0 || i + 1 === stops.length) && position === undefined) && !(position instanceof Dimension))) { + throwArgumentDescriptor(); + } + positionValue = position ? position.toCSS(renderEnv) : i === 0 ? '0%' : '100%'; + alpha = color.alpha; + returner += ""; + } + returner += ""; + returner = encodeURIComponent(returner); + returner = "data:image/svg+xml," + returner; + return new URL(new Quoted("'" + returner + "'", returner, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo); + } }; + }); - var isa = function (n, Type) { return (n instanceof Type) ? Keyword.True : Keyword.False; }; - var isunit = function (n, unit) { - if (unit === undefined) { - throw { type: 'Argument', message: 'missing the required second argument to isunit.' }; - } - unit = typeof unit.value === 'string' ? unit.value : unit; - if (typeof unit !== 'string') { - throw { type: 'Argument', message: 'Second argument to isunit should be a unit or a string.' }; - } - return (n instanceof Dimension) && n.unit.is(unit) ? Keyword.True : Keyword.False; - }; - var types = { - isruleset: function (n) { - return isa(n, DetachedRuleset); - }, - iscolor: function (n) { - return isa(n, Color); - }, - isnumber: function (n) { - return isa(n, Dimension); - }, - isstring: function (n) { - return isa(n, Quoted); - }, - iskeyword: function (n) { - return isa(n, Keyword); - }, - isurl: function (n) { - return isa(n, URL); - }, - ispixel: function (n) { - return isunit(n, 'px'); - }, - ispercentage: function (n) { - return isunit(n, '%'); - }, - isem: function (n) { - return isunit(n, 'em'); - }, - isunit: isunit, - unit: function (val, unit) { - if (!(val instanceof Dimension)) { - throw { type: 'Argument', message: "the first argument to unit must be a number" + (val instanceof Operation ? '. Have you forgotten parenthesis?' : '') }; - } - if (unit) { - if (unit instanceof Keyword) { - unit = unit.value; - } - else { - unit = unit.toCSS(); - } - } - else { - unit = ''; - } - return new Dimension(val.value, unit); - }, - 'get-unit': function (n) { - return new Anonymous(n.unit); - } - }; + var isa = function (n, Type) { return (n instanceof Type) ? Keyword.True : Keyword.False; }; + var isunit = function (n, unit) { + if (unit === undefined) { + throw { type: 'Argument', message: 'missing the required second argument to isunit.' }; + } + unit = typeof unit.value === 'string' ? unit.value : unit; + if (typeof unit !== 'string') { + throw { type: 'Argument', message: 'Second argument to isunit should be a unit or a string.' }; + } + return (n instanceof Dimension) && n.unit.is(unit) ? Keyword.True : Keyword.False; + }; + var types = { + isruleset: function (n) { + return isa(n, DetachedRuleset); + }, + iscolor: function (n) { + return isa(n, Color); + }, + isnumber: function (n) { + return isa(n, Dimension); + }, + isstring: function (n) { + return isa(n, Quoted); + }, + iskeyword: function (n) { + return isa(n, Keyword); + }, + isurl: function (n) { + return isa(n, URL); + }, + ispixel: function (n) { + return isunit(n, 'px'); + }, + ispercentage: function (n) { + return isunit(n, '%'); + }, + isem: function (n) { + return isunit(n, 'em'); + }, + isunit: isunit, + unit: function (val, unit) { + if (!(val instanceof Dimension)) { + throw { type: 'Argument', message: "the first argument to unit must be a number" + (val instanceof Operation ? '. Have you forgotten parenthesis?' : '') }; + } + if (unit) { + if (unit instanceof Keyword) { + unit = unit.value; + } + else { + unit = unit.toCSS(); + } + } + else { + unit = ''; + } + return new Dimension(val.value, unit); + }, + 'get-unit': function (n) { + return new Anonymous(n.unit); + } + }; - var Functions = (function (environment) { - var functions = { functionRegistry: functionRegistry, functionCaller: functionCaller }; - // register functions - functionRegistry.addMultiple(boolean$1); - functionRegistry.add('default', defaultFunc.eval.bind(defaultFunc)); - functionRegistry.addMultiple(color); - functionRegistry.addMultiple(colorBlend); - functionRegistry.addMultiple(dataUri(environment)); - functionRegistry.addMultiple(list); - functionRegistry.addMultiple(mathFunctions); - functionRegistry.addMultiple(number$1); - functionRegistry.addMultiple(string); - functionRegistry.addMultiple(svg()); - functionRegistry.addMultiple(types); - return functions; - }); + var functions = (function (environment) { + var functions = { functionRegistry: functionRegistry, functionCaller: functionCaller }; + // register functions + functionRegistry.addMultiple(boolean$1); + functionRegistry.add('default', defaultFunc.eval.bind(defaultFunc)); + functionRegistry.addMultiple(color); + functionRegistry.addMultiple(colorBlend); + functionRegistry.addMultiple(dataUri(environment)); + functionRegistry.addMultiple(list); + functionRegistry.addMultiple(mathFunctions); + functionRegistry.addMultiple(number$1); + functionRegistry.addMultiple(string); + functionRegistry.addMultiple(svg()); + functionRegistry.addMultiple(types); + return functions; + }); - var sourceMapOutput = (function (environment) { - var SourceMapOutput = /** @class */ (function () { - function SourceMapOutput(options) { - this._css = []; - this._rootNode = options.rootNode; - this._contentsMap = options.contentsMap; - this._contentsIgnoredCharsMap = options.contentsIgnoredCharsMap; - if (options.sourceMapFilename) { - this._sourceMapFilename = options.sourceMapFilename.replace(/\\/g, '/'); - } - this._outputFilename = options.outputFilename; - this.sourceMapURL = options.sourceMapURL; - if (options.sourceMapBasepath) { - this._sourceMapBasepath = options.sourceMapBasepath.replace(/\\/g, '/'); - } - if (options.sourceMapRootpath) { - this._sourceMapRootpath = options.sourceMapRootpath.replace(/\\/g, '/'); - if (this._sourceMapRootpath.charAt(this._sourceMapRootpath.length - 1) !== '/') { - this._sourceMapRootpath += '/'; - } - } - else { - this._sourceMapRootpath = ''; - } - this._outputSourceFiles = options.outputSourceFiles; - this._sourceMapGeneratorConstructor = environment.getSourceMapGenerator(); - this._lineNumber = 0; - this._column = 0; - } - SourceMapOutput.prototype.removeBasepath = function (path) { - if (this._sourceMapBasepath && path.indexOf(this._sourceMapBasepath) === 0) { - path = path.substring(this._sourceMapBasepath.length); - if (path.charAt(0) === '\\' || path.charAt(0) === '/') { - path = path.substring(1); - } - } - return path; - }; - SourceMapOutput.prototype.normalizeFilename = function (filename) { - filename = filename.replace(/\\/g, '/'); - filename = this.removeBasepath(filename); - return (this._sourceMapRootpath || '') + filename; - }; - SourceMapOutput.prototype.add = function (chunk, fileInfo, index, mapLines) { - // ignore adding empty strings - if (!chunk) { - return; - } - var lines; - var sourceLines; - var columns; - var sourceColumns; - var i; - if (fileInfo && fileInfo.filename) { - var inputSource = this._contentsMap[fileInfo.filename]; - // remove vars/banner added to the top of the file - if (this._contentsIgnoredCharsMap[fileInfo.filename]) { - // adjust the index - index -= this._contentsIgnoredCharsMap[fileInfo.filename]; - if (index < 0) { - index = 0; - } - // adjust the source - inputSource = inputSource.slice(this._contentsIgnoredCharsMap[fileInfo.filename]); - } - // ignore empty content - if (inputSource === undefined) { - return; - } - inputSource = inputSource.substring(0, index); - sourceLines = inputSource.split('\n'); - sourceColumns = sourceLines[sourceLines.length - 1]; - } - lines = chunk.split('\n'); - columns = lines[lines.length - 1]; - if (fileInfo && fileInfo.filename) { - if (!mapLines) { - this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + 1, column: this._column }, - original: { line: sourceLines.length, column: sourceColumns.length }, - source: this.normalizeFilename(fileInfo.filename) }); - } - else { - for (i = 0; i < lines.length; i++) { - this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + i + 1, column: i === 0 ? this._column : 0 }, - original: { line: sourceLines.length + i, column: i === 0 ? sourceColumns.length : 0 }, - source: this.normalizeFilename(fileInfo.filename) }); - } - } - } - if (lines.length === 1) { - this._column += columns.length; - } - else { - this._lineNumber += lines.length - 1; - this._column = columns.length; - } - this._css.push(chunk); - }; - SourceMapOutput.prototype.isEmpty = function () { - return this._css.length === 0; - }; - SourceMapOutput.prototype.toCSS = function (context) { - this._sourceMapGenerator = new this._sourceMapGeneratorConstructor({ file: this._outputFilename, sourceRoot: null }); - if (this._outputSourceFiles) { - for (var filename in this._contentsMap) { - if (this._contentsMap.hasOwnProperty(filename)) { - var source = this._contentsMap[filename]; - if (this._contentsIgnoredCharsMap[filename]) { - source = source.slice(this._contentsIgnoredCharsMap[filename]); - } - this._sourceMapGenerator.setSourceContent(this.normalizeFilename(filename), source); - } - } - } - this._rootNode.genCSS(context, this); - if (this._css.length > 0) { - var sourceMapURL = void 0; - var sourceMapContent = JSON.stringify(this._sourceMapGenerator.toJSON()); - if (this.sourceMapURL) { - sourceMapURL = this.sourceMapURL; - } - else if (this._sourceMapFilename) { - sourceMapURL = this._sourceMapFilename; - } - this.sourceMapURL = sourceMapURL; - this.sourceMap = sourceMapContent; - } - return this._css.join(''); - }; - return SourceMapOutput; - }()); - return SourceMapOutput; - }); + function transformTree (root, options) { + options = options || {}; + var evaldRoot; + var variables = options.variables; + var evalEnv = new contexts.Eval(options); + // + // Allows setting variables with a hash, so: + // + // `{ color: new tree.Color('#f01') }` will become: + // + // new tree.Declaration('@color', + // new tree.Value([ + // new tree.Expression([ + // new tree.Color('#f01') + // ]) + // ]) + // ) + // + if (typeof variables === 'object' && !Array.isArray(variables)) { + variables = Object.keys(variables).map(function (k) { + var value = variables[k]; + if (!(value instanceof tree.Value)) { + if (!(value instanceof tree.Expression)) { + value = new tree.Expression([value]); + } + value = new tree.Value([value]); + } + return new tree.Declaration("@" + k, value, false, null, 0); + }); + evalEnv.frames = [new tree.Ruleset(null, variables)]; + } + var visitors$1 = [ + new visitors.JoinSelectorVisitor(), + new visitors.MarkVisibleSelectorsVisitor(true), + new visitors.ExtendVisitor(), + new visitors.ToCSSVisitor({ compress: Boolean(options.compress) }) + ]; + var preEvalVisitors = []; + var v; + var visitorIterator; + /** + * first() / get() allows visitors to be added while visiting + * + * @todo Add scoping for visitors just like functions for @plugin; right now they're global + */ + if (options.pluginManager) { + visitorIterator = options.pluginManager.visitor(); + for (var i = 0; i < 2; i++) { + visitorIterator.first(); + while ((v = visitorIterator.get())) { + if (v.isPreEvalVisitor) { + if (i === 0 || preEvalVisitors.indexOf(v) === -1) { + preEvalVisitors.push(v); + v.run(root); + } + } + else { + if (i === 0 || visitors$1.indexOf(v) === -1) { + if (v.isPreVisitor) { + visitors$1.unshift(v); + } + else { + visitors$1.push(v); + } + } + } + } + } + } + evaldRoot = root.eval(evalEnv); + for (var i = 0; i < visitors$1.length; i++) { + visitors$1[i].run(evaldRoot); + } + // Run any remaining visitors added after eval pass + if (options.pluginManager) { + visitorIterator.first(); + while ((v = visitorIterator.get())) { + if (visitors$1.indexOf(v) === -1 && preEvalVisitors.indexOf(v) === -1) { + v.run(evaldRoot); + } + } + } + return evaldRoot; + } - var sourceMapBuilder = (function (SourceMapOutput, environment) { - var SourceMapBuilder = /** @class */ (function () { - function SourceMapBuilder(options) { - this.options = options; - } - SourceMapBuilder.prototype.toCSS = function (rootNode, options, imports) { - var sourceMapOutput = new SourceMapOutput({ - contentsIgnoredCharsMap: imports.contentsIgnoredChars, - rootNode: rootNode, - contentsMap: imports.contents, - sourceMapFilename: this.options.sourceMapFilename, - sourceMapURL: this.options.sourceMapURL, - outputFilename: this.options.sourceMapOutputFilename, - sourceMapBasepath: this.options.sourceMapBasepath, - sourceMapRootpath: this.options.sourceMapRootpath, - outputSourceFiles: this.options.outputSourceFiles, - sourceMapGenerator: this.options.sourceMapGenerator, - sourceMapFileInline: this.options.sourceMapFileInline, - disableSourcemapAnnotation: this.options.disableSourcemapAnnotation - }); - var css = sourceMapOutput.toCSS(options); - this.sourceMap = sourceMapOutput.sourceMap; - this.sourceMapURL = sourceMapOutput.sourceMapURL; - if (this.options.sourceMapInputFilename) { - this.sourceMapInputFilename = sourceMapOutput.normalizeFilename(this.options.sourceMapInputFilename); - } - if (this.options.sourceMapBasepath !== undefined && this.sourceMapURL !== undefined) { - this.sourceMapURL = sourceMapOutput.removeBasepath(this.sourceMapURL); - } - return css + this.getCSSAppendage(); - }; - SourceMapBuilder.prototype.getCSSAppendage = function () { - var sourceMapURL = this.sourceMapURL; - if (this.options.sourceMapFileInline) { - if (this.sourceMap === undefined) { - return ''; - } - sourceMapURL = "data:application/json;base64," + environment.encodeBase64(this.sourceMap); - } - if (this.options.disableSourcemapAnnotation) { - return ''; - } - if (sourceMapURL) { - return "/*# sourceMappingURL=" + sourceMapURL + " */"; - } - return ''; - }; - SourceMapBuilder.prototype.getExternalSourceMap = function () { - return this.sourceMap; - }; - SourceMapBuilder.prototype.setExternalSourceMap = function (sourceMap) { - this.sourceMap = sourceMap; - }; - SourceMapBuilder.prototype.isInline = function () { - return this.options.sourceMapFileInline; - }; - SourceMapBuilder.prototype.getSourceMapURL = function () { - return this.sourceMapURL; - }; - SourceMapBuilder.prototype.getOutputFilename = function () { - return this.options.sourceMapOutputFilename; - }; - SourceMapBuilder.prototype.getInputFilename = function () { - return this.sourceMapInputFilename; - }; - return SourceMapBuilder; - }()); - return SourceMapBuilder; - }); + /** + * Plugin Manager + */ + var PluginManager = /** @class */ (function () { + function PluginManager(less) { + this.less = less; + this.visitors = []; + this.preProcessors = []; + this.postProcessors = []; + this.installedPlugins = []; + this.fileManagers = []; + this.iterator = -1; + this.pluginCache = {}; + this.Loader = new less.PluginLoader(less); + } + /** + * Adds all the plugins in the array + * @param {Array} plugins + */ + PluginManager.prototype.addPlugins = function (plugins) { + if (plugins) { + for (var i = 0; i < plugins.length; i++) { + this.addPlugin(plugins[i]); + } + } + }; + /** + * + * @param plugin + * @param {String} filename + */ + PluginManager.prototype.addPlugin = function (plugin, filename, functionRegistry) { + this.installedPlugins.push(plugin); + if (filename) { + this.pluginCache[filename] = plugin; + } + if (plugin.install) { + plugin.install(this.less, this, functionRegistry || this.less.functions.functionRegistry); + } + }; + /** + * + * @param filename + */ + PluginManager.prototype.get = function (filename) { + return this.pluginCache[filename]; + }; + /** + * Adds a visitor. The visitor object has options on itself to determine + * when it should run. + * @param visitor + */ + PluginManager.prototype.addVisitor = function (visitor) { + this.visitors.push(visitor); + }; + /** + * Adds a pre processor object + * @param {object} preProcessor + * @param {number} priority - guidelines 1 = before import, 1000 = import, 2000 = after import + */ + PluginManager.prototype.addPreProcessor = function (preProcessor, priority) { + var indexToInsertAt; + for (indexToInsertAt = 0; indexToInsertAt < this.preProcessors.length; indexToInsertAt++) { + if (this.preProcessors[indexToInsertAt].priority >= priority) { + break; + } + } + this.preProcessors.splice(indexToInsertAt, 0, { preProcessor: preProcessor, priority: priority }); + }; + /** + * Adds a post processor object + * @param {object} postProcessor + * @param {number} priority - guidelines 1 = before compression, 1000 = compression, 2000 = after compression + */ + PluginManager.prototype.addPostProcessor = function (postProcessor, priority) { + var indexToInsertAt; + for (indexToInsertAt = 0; indexToInsertAt < this.postProcessors.length; indexToInsertAt++) { + if (this.postProcessors[indexToInsertAt].priority >= priority) { + break; + } + } + this.postProcessors.splice(indexToInsertAt, 0, { postProcessor: postProcessor, priority: priority }); + }; + /** + * + * @param manager + */ + PluginManager.prototype.addFileManager = function (manager) { + this.fileManagers.push(manager); + }; + /** + * + * @returns {Array} + * @private + */ + PluginManager.prototype.getPreProcessors = function () { + var preProcessors = []; + for (var i = 0; i < this.preProcessors.length; i++) { + preProcessors.push(this.preProcessors[i].preProcessor); + } + return preProcessors; + }; + /** + * + * @returns {Array} + * @private + */ + PluginManager.prototype.getPostProcessors = function () { + var postProcessors = []; + for (var i = 0; i < this.postProcessors.length; i++) { + postProcessors.push(this.postProcessors[i].postProcessor); + } + return postProcessors; + }; + /** + * + * @returns {Array} + * @private + */ + PluginManager.prototype.getVisitors = function () { + return this.visitors; + }; + PluginManager.prototype.visitor = function () { + var self = this; + return { + first: function () { + self.iterator = -1; + return self.visitors[self.iterator]; + }, + get: function () { + self.iterator += 1; + return self.visitors[self.iterator]; + } + }; + }; + /** + * + * @returns {Array} + * @private + */ + PluginManager.prototype.getFileManagers = function () { + return this.fileManagers; + }; + return PluginManager; + }()); + var pm; + var PluginManagerFactory = function (less, newFactory) { + if (newFactory || !pm) { + pm = new PluginManager(less); + } + return pm; + }; - var transformTree = (function (root, options) { - if (options === void 0) { options = {}; } - var evaldRoot; - var variables = options.variables; - var evalEnv = new contexts.Eval(options); - // - // Allows setting variables with a hash, so: - // - // `{ color: new tree.Color('#f01') }` will become: - // - // new tree.Declaration('@color', - // new tree.Value([ - // new tree.Expression([ - // new tree.Color('#f01') - // ]) - // ]) - // ) - // - if (typeof variables === 'object' && !Array.isArray(variables)) { - variables = Object.keys(variables).map(function (k) { - var value = variables[k]; - if (!(value instanceof tree.Value)) { - if (!(value instanceof tree.Expression)) { - value = new tree.Expression([value]); - } - value = new tree.Value([value]); - } - return new tree.Declaration("@" + k, value, false, null, 0); - }); - evalEnv.frames = [new tree.Ruleset(null, variables)]; - } - var visitors$1 = [ - new visitors.JoinSelectorVisitor(), - new visitors.MarkVisibleSelectorsVisitor(true), - new visitors.ExtendVisitor(), - new visitors.ToCSSVisitor({ compress: Boolean(options.compress) }) - ]; - var preEvalVisitors = []; - var v; - var visitorIterator; - /** - * first() / get() allows visitors to be added while visiting - * - * @todo Add scoping for visitors just like functions for @plugin; right now they're global - */ - if (options.pluginManager) { - visitorIterator = options.pluginManager.visitor(); - for (var i = 0; i < 2; i++) { - visitorIterator.first(); - while ((v = visitorIterator.get())) { - if (v.isPreEvalVisitor) { - if (i === 0 || preEvalVisitors.indexOf(v) === -1) { - preEvalVisitors.push(v); - v.run(root); - } - } - else { - if (i === 0 || visitors$1.indexOf(v) === -1) { - if (v.isPreVisitor) { - visitors$1.unshift(v); - } - else { - visitors$1.push(v); - } - } - } - } - } - } - evaldRoot = root.eval(evalEnv); - for (var i = 0; i < visitors$1.length; i++) { - visitors$1[i].run(evaldRoot); - } - // Run any remaining visitors added after eval pass - if (options.pluginManager) { - visitorIterator.first(); - while ((v = visitorIterator.get())) { - if (visitors$1.indexOf(v) === -1 && preEvalVisitors.indexOf(v) === -1) { - v.run(evaldRoot); - } - } - } - return evaldRoot; - }); + function SourceMapOutput (environment) { + var SourceMapOutput = /** @class */ (function () { + function SourceMapOutput(options) { + this._css = []; + this._rootNode = options.rootNode; + this._contentsMap = options.contentsMap; + this._contentsIgnoredCharsMap = options.contentsIgnoredCharsMap; + if (options.sourceMapFilename) { + this._sourceMapFilename = options.sourceMapFilename.replace(/\\/g, '/'); + } + this._outputFilename = options.outputFilename; + this.sourceMapURL = options.sourceMapURL; + if (options.sourceMapBasepath) { + this._sourceMapBasepath = options.sourceMapBasepath.replace(/\\/g, '/'); + } + if (options.sourceMapRootpath) { + this._sourceMapRootpath = options.sourceMapRootpath.replace(/\\/g, '/'); + if (this._sourceMapRootpath.charAt(this._sourceMapRootpath.length - 1) !== '/') { + this._sourceMapRootpath += '/'; + } + } + else { + this._sourceMapRootpath = ''; + } + this._outputSourceFiles = options.outputSourceFiles; + this._sourceMapGeneratorConstructor = environment.getSourceMapGenerator(); + this._lineNumber = 0; + this._column = 0; + } + SourceMapOutput.prototype.removeBasepath = function (path) { + if (this._sourceMapBasepath && path.indexOf(this._sourceMapBasepath) === 0) { + path = path.substring(this._sourceMapBasepath.length); + if (path.charAt(0) === '\\' || path.charAt(0) === '/') { + path = path.substring(1); + } + } + return path; + }; + SourceMapOutput.prototype.normalizeFilename = function (filename) { + filename = filename.replace(/\\/g, '/'); + filename = this.removeBasepath(filename); + return (this._sourceMapRootpath || '') + filename; + }; + SourceMapOutput.prototype.add = function (chunk, fileInfo, index, mapLines) { + // ignore adding empty strings + if (!chunk) { + return; + } + var lines, sourceLines, columns, sourceColumns, i; + if (fileInfo && fileInfo.filename) { + var inputSource = this._contentsMap[fileInfo.filename]; + // remove vars/banner added to the top of the file + if (this._contentsIgnoredCharsMap[fileInfo.filename]) { + // adjust the index + index -= this._contentsIgnoredCharsMap[fileInfo.filename]; + if (index < 0) { + index = 0; + } + // adjust the source + inputSource = inputSource.slice(this._contentsIgnoredCharsMap[fileInfo.filename]); + } + // ignore empty content + if (inputSource === undefined) { + return; + } + inputSource = inputSource.substring(0, index); + sourceLines = inputSource.split('\n'); + sourceColumns = sourceLines[sourceLines.length - 1]; + } + lines = chunk.split('\n'); + columns = lines[lines.length - 1]; + if (fileInfo && fileInfo.filename) { + if (!mapLines) { + this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + 1, column: this._column }, + original: { line: sourceLines.length, column: sourceColumns.length }, + source: this.normalizeFilename(fileInfo.filename) }); + } + else { + for (i = 0; i < lines.length; i++) { + this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + i + 1, column: i === 0 ? this._column : 0 }, + original: { line: sourceLines.length + i, column: i === 0 ? sourceColumns.length : 0 }, + source: this.normalizeFilename(fileInfo.filename) }); + } + } + } + if (lines.length === 1) { + this._column += columns.length; + } + else { + this._lineNumber += lines.length - 1; + this._column = columns.length; + } + this._css.push(chunk); + }; + SourceMapOutput.prototype.isEmpty = function () { + return this._css.length === 0; + }; + SourceMapOutput.prototype.toCSS = function (context) { + this._sourceMapGenerator = new this._sourceMapGeneratorConstructor({ file: this._outputFilename, sourceRoot: null }); + if (this._outputSourceFiles) { + for (var filename in this._contentsMap) { + if (this._contentsMap.hasOwnProperty(filename)) { + var source = this._contentsMap[filename]; + if (this._contentsIgnoredCharsMap[filename]) { + source = source.slice(this._contentsIgnoredCharsMap[filename]); + } + this._sourceMapGenerator.setSourceContent(this.normalizeFilename(filename), source); + } + } + } + this._rootNode.genCSS(context, this); + if (this._css.length > 0) { + var sourceMapURL = void 0; + var sourceMapContent = JSON.stringify(this._sourceMapGenerator.toJSON()); + if (this.sourceMapURL) { + sourceMapURL = this.sourceMapURL; + } + else if (this._sourceMapFilename) { + sourceMapURL = this._sourceMapFilename; + } + this.sourceMapURL = sourceMapURL; + this.sourceMap = sourceMapContent; + } + return this._css.join(''); + }; + return SourceMapOutput; + }()); + return SourceMapOutput; + } - var parseTree = (function (SourceMapBuilder) { - var ParseTree = /** @class */ (function () { - function ParseTree(root, imports) { - this.root = root; - this.imports = imports; - } - ParseTree.prototype.toCSS = function (options) { - var evaldRoot; - var result = {}; - var sourceMapBuilder; - try { - evaldRoot = transformTree(this.root, options); - } - catch (e) { - throw new LessError(e, this.imports); - } - try { - var compress = Boolean(options.compress); - if (compress) { - logger.warn('The compress option has been deprecated. ' + - 'We recommend you use a dedicated css minifier, for instance see less-plugin-clean-css.'); - } - var toCSSOptions = { - compress: compress, - dumpLineNumbers: options.dumpLineNumbers, - strictUnits: Boolean(options.strictUnits), - numPrecision: 8 - }; - if (options.sourceMap) { - sourceMapBuilder = new SourceMapBuilder(options.sourceMap); - result.css = sourceMapBuilder.toCSS(evaldRoot, toCSSOptions, this.imports); - } - else { - result.css = evaldRoot.toCSS(toCSSOptions); - } - } - catch (e) { - throw new LessError(e, this.imports); - } - if (options.pluginManager) { - var postProcessors = options.pluginManager.getPostProcessors(); - for (var i = 0; i < postProcessors.length; i++) { - result.css = postProcessors[i].process(result.css, { sourceMap: sourceMapBuilder, options: options, imports: this.imports }); - } - } - if (options.sourceMap) { - result.map = sourceMapBuilder.getExternalSourceMap(); - } - var rootFilename = this.imports.rootFilename; - result.imports = this.imports.files.filter(function (file) { return file !== rootFilename; }); - return result; - }; - return ParseTree; - }()); - return ParseTree; - }); + function SourceMapBuilder (SourceMapOutput, environment) { + var SourceMapBuilder = /** @class */ (function () { + function SourceMapBuilder(options) { + this.options = options; + } + SourceMapBuilder.prototype.toCSS = function (rootNode, options, imports) { + var sourceMapOutput = new SourceMapOutput({ + contentsIgnoredCharsMap: imports.contentsIgnoredChars, + rootNode: rootNode, + contentsMap: imports.contents, + sourceMapFilename: this.options.sourceMapFilename, + sourceMapURL: this.options.sourceMapURL, + outputFilename: this.options.sourceMapOutputFilename, + sourceMapBasepath: this.options.sourceMapBasepath, + sourceMapRootpath: this.options.sourceMapRootpath, + outputSourceFiles: this.options.outputSourceFiles, + sourceMapGenerator: this.options.sourceMapGenerator, + sourceMapFileInline: this.options.sourceMapFileInline, + disableSourcemapAnnotation: this.options.disableSourcemapAnnotation + }); + var css = sourceMapOutput.toCSS(options); + this.sourceMap = sourceMapOutput.sourceMap; + this.sourceMapURL = sourceMapOutput.sourceMapURL; + if (this.options.sourceMapInputFilename) { + this.sourceMapInputFilename = sourceMapOutput.normalizeFilename(this.options.sourceMapInputFilename); + } + if (this.options.sourceMapBasepath !== undefined && this.sourceMapURL !== undefined) { + this.sourceMapURL = sourceMapOutput.removeBasepath(this.sourceMapURL); + } + return css + this.getCSSAppendage(); + }; + SourceMapBuilder.prototype.getCSSAppendage = function () { + var sourceMapURL = this.sourceMapURL; + if (this.options.sourceMapFileInline) { + if (this.sourceMap === undefined) { + return ''; + } + sourceMapURL = "data:application/json;base64," + environment.encodeBase64(this.sourceMap); + } + if (this.options.disableSourcemapAnnotation) { + return ''; + } + if (sourceMapURL) { + return "/*# sourceMappingURL=" + sourceMapURL + " */"; + } + return ''; + }; + SourceMapBuilder.prototype.getExternalSourceMap = function () { + return this.sourceMap; + }; + SourceMapBuilder.prototype.setExternalSourceMap = function (sourceMap) { + this.sourceMap = sourceMap; + }; + SourceMapBuilder.prototype.isInline = function () { + return this.options.sourceMapFileInline; + }; + SourceMapBuilder.prototype.getSourceMapURL = function () { + return this.sourceMapURL; + }; + SourceMapBuilder.prototype.getOutputFilename = function () { + return this.options.sourceMapOutputFilename; + }; + SourceMapBuilder.prototype.getInputFilename = function () { + return this.sourceMapInputFilename; + }; + return SourceMapBuilder; + }()); + return SourceMapBuilder; + } - var importManager = (function (environment) { - // FileInfo = { - // 'rewriteUrls' - option - whether to adjust URL's to be relative - // 'filename' - full resolved filename of current file - // 'rootpath' - path to append to normal URLs for this node - // 'currentDirectory' - path to the current file, absolute - // 'rootFilename' - filename of the base file - // 'entryPath' - absolute path to the entry file - // 'reference' - whether the file should not be output and only output parts that are referenced - var ImportManager = /** @class */ (function () { - function ImportManager(less, context, rootFileInfo) { - this.less = less; - this.rootFilename = rootFileInfo.filename; - this.paths = context.paths || []; // Search paths, when importing - this.contents = {}; // map - filename to contents of all the files - this.contentsIgnoredChars = {}; // map - filename to lines at the beginning of each file to ignore - this.mime = context.mime; - this.error = null; - this.context = context; - // Deprecated? Unused outside of here, could be useful. - this.queue = []; // Files which haven't been imported yet - this.files = []; // List of files imported - } - /** - * Add an import to be imported - * @param path - the raw path - * @param tryAppendExtension - whether to try appending a file extension (.less or .js if the path has no extension) - * @param currentFileInfo - the current file info (used for instance to work out relative paths) - * @param importOptions - import options - * @param callback - callback for when it is imported - */ - ImportManager.prototype.push = function (path, tryAppendExtension, currentFileInfo, importOptions, callback) { - var importManager = this; - var pluginLoader = this.context.pluginManager.Loader; - this.queue.push(path); - var fileParsedFunc = function (e, root, fullPath) { - importManager.queue.splice(importManager.queue.indexOf(path), 1); // Remove the path from the queue - var importedEqualsRoot = fullPath === importManager.rootFilename; - if (importOptions.optional && e) { - callback(null, { rules: [] }, false, null); - logger.info("The file " + fullPath + " was skipped because it was not found and the import was marked optional."); - } - else { - var files = importManager.files; - if (files.indexOf(fullPath) === -1) { - files.push(fullPath); - } - if (e && !importManager.error) { - importManager.error = e; - } - callback(e, root, importedEqualsRoot, fullPath); - } - }; - var newFileInfo = { - rewriteUrls: this.context.rewriteUrls, - entryPath: currentFileInfo.entryPath, - rootpath: currentFileInfo.rootpath, - rootFilename: currentFileInfo.rootFilename - }; - var fileManager = environment.getFileManager(path, currentFileInfo.currentDirectory, this.context, environment); - if (!fileManager) { - fileParsedFunc({ message: "Could not find a file-manager for " + path }); - return; - } - var loadFileCallback = function (loadedFile) { - var plugin; - var resolvedFilename = loadedFile.filename; - var contents = loadedFile.contents.replace(/^\uFEFF/, ''); - // Pass on an updated rootpath if path of imported file is relative and file - // is in a (sub|sup) directory - // - // Examples: - // - If path of imported file is 'module/nav/nav.less' and rootpath is 'less/', - // then rootpath should become 'less/module/nav/' - // - If path of imported file is '../mixins.less' and rootpath is 'less/', - // then rootpath should become 'less/../' - newFileInfo.currentDirectory = fileManager.getPath(resolvedFilename); - if (newFileInfo.rewriteUrls) { - newFileInfo.rootpath = fileManager.join((importManager.context.rootpath || ''), fileManager.pathDiff(newFileInfo.currentDirectory, newFileInfo.entryPath)); - if (!fileManager.isPathAbsolute(newFileInfo.rootpath) && fileManager.alwaysMakePathsAbsolute()) { - newFileInfo.rootpath = fileManager.join(newFileInfo.entryPath, newFileInfo.rootpath); - } - } - newFileInfo.filename = resolvedFilename; - var newEnv = new contexts.Parse(importManager.context); - newEnv.processImports = false; - importManager.contents[resolvedFilename] = contents; - if (currentFileInfo.reference || importOptions.reference) { - newFileInfo.reference = true; - } - if (importOptions.isPlugin) { - plugin = pluginLoader.evalPlugin(contents, newEnv, importManager, importOptions.pluginArgs, newFileInfo); - if (plugin instanceof LessError) { - fileParsedFunc(plugin, null, resolvedFilename); - } - else { - fileParsedFunc(null, plugin, resolvedFilename); - } - } - else if (importOptions.inline) { - fileParsedFunc(null, contents, resolvedFilename); - } - else { - new Parser(newEnv, importManager, newFileInfo).parse(contents, function (e, root) { - fileParsedFunc(e, root, resolvedFilename); - }); - } - }; - var loadedFile; - var promise; - var context = clone(this.context); - if (tryAppendExtension) { - context.ext = importOptions.isPlugin ? '.js' : '.less'; - } - if (importOptions.isPlugin) { - context.mime = 'application/javascript'; - if (context.syncImport) { - loadedFile = pluginLoader.loadPluginSync(path, currentFileInfo.currentDirectory, context, environment, fileManager); - } - else { - promise = pluginLoader.loadPlugin(path, currentFileInfo.currentDirectory, context, environment, fileManager); - } - } - else { - if (context.syncImport) { - loadedFile = fileManager.loadFileSync(path, currentFileInfo.currentDirectory, context, environment); - } - else { - promise = fileManager.loadFile(path, currentFileInfo.currentDirectory, context, environment, function (err, loadedFile) { - if (err) { - fileParsedFunc(err); - } - else { - loadFileCallback(loadedFile); - } - }); - } - } - if (loadedFile) { - if (!loadedFile.filename) { - fileParsedFunc(loadedFile); - } - else { - loadFileCallback(loadedFile); - } - } - else if (promise) { - promise.then(loadFileCallback, fileParsedFunc); - } - }; - return ImportManager; - }()); - return ImportManager; - }); + function ParseTree (SourceMapBuilder) { + var ParseTree = /** @class */ (function () { + function ParseTree(root, imports) { + this.root = root; + this.imports = imports; + } + ParseTree.prototype.toCSS = function (options) { + var evaldRoot; + var result = {}; + var sourceMapBuilder; + try { + evaldRoot = transformTree(this.root, options); + } + catch (e) { + throw new LessError(e, this.imports); + } + try { + var compress = Boolean(options.compress); + if (compress) { + logger.warn('The compress option has been deprecated. ' + + 'We recommend you use a dedicated css minifier, for instance see less-plugin-clean-css.'); + } + var toCSSOptions = { + compress: compress, + dumpLineNumbers: options.dumpLineNumbers, + strictUnits: Boolean(options.strictUnits), + numPrecision: 8 + }; + if (options.sourceMap) { + sourceMapBuilder = new SourceMapBuilder(options.sourceMap); + result.css = sourceMapBuilder.toCSS(evaldRoot, toCSSOptions, this.imports); + } + else { + result.css = evaldRoot.toCSS(toCSSOptions); + } + } + catch (e) { + throw new LessError(e, this.imports); + } + if (options.pluginManager) { + var postProcessors = options.pluginManager.getPostProcessors(); + for (var i = 0; i < postProcessors.length; i++) { + result.css = postProcessors[i].process(result.css, { sourceMap: sourceMapBuilder, options: options, imports: this.imports }); + } + } + if (options.sourceMap) { + result.map = sourceMapBuilder.getExternalSourceMap(); + } + result.imports = []; + for (var file in this.imports.files) { + if (this.imports.files.hasOwnProperty(file) && file !== this.imports.rootFilename) { + result.imports.push(file); + } + } + return result; + }; + return ParseTree; + }()); + return ParseTree; + } - var Render = (function (environment, ParseTree, ImportManager) { - var render = function (input, options, callback) { - if (typeof options === 'function') { - callback = options; - options = copyOptions(this.options, {}); - } - else { - options = copyOptions(this.options, options || {}); - } - if (!callback) { - var self_1 = this; - return new Promise(function (resolve, reject) { - render.call(self_1, input, options, function (err, output) { - if (err) { - reject(err); - } - else { - resolve(output); - } - }); - }); - } - else { - this.parse(input, options, function (err, root, imports, options) { - if (err) { - return callback(err); - } - var result; - try { - var parseTree = new ParseTree(root, imports); - result = parseTree.toCSS(options); - } - catch (err) { - return callback(err); - } - callback(null, result); - }); - } - }; - return render; - }); + function ImportManager (environment) { + // FileInfo = { + // 'rewriteUrls' - option - whether to adjust URL's to be relative + // 'filename' - full resolved filename of current file + // 'rootpath' - path to append to normal URLs for this node + // 'currentDirectory' - path to the current file, absolute + // 'rootFilename' - filename of the base file + // 'entryPath' - absolute path to the entry file + // 'reference' - whether the file should not be output and only output parts that are referenced + var ImportManager = /** @class */ (function () { + function ImportManager(less, context, rootFileInfo) { + this.less = less; + this.rootFilename = rootFileInfo.filename; + this.paths = context.paths || []; // Search paths, when importing + this.contents = {}; // map - filename to contents of all the files + this.contentsIgnoredChars = {}; // map - filename to lines at the beginning of each file to ignore + this.mime = context.mime; + this.error = null; + this.context = context; + // Deprecated? Unused outside of here, could be useful. + this.queue = []; // Files which haven't been imported yet + this.files = {}; // Holds the imported parse trees. + } + /** + * Add an import to be imported + * @param path - the raw path + * @param tryAppendExtension - whether to try appending a file extension (.less or .js if the path has no extension) + * @param currentFileInfo - the current file info (used for instance to work out relative paths) + * @param importOptions - import options + * @param callback - callback for when it is imported + */ + ImportManager.prototype.push = function (path, tryAppendExtension, currentFileInfo, importOptions, callback) { + var importManager = this, pluginLoader = this.context.pluginManager.Loader; + this.queue.push(path); + var fileParsedFunc = function (e, root, fullPath) { + importManager.queue.splice(importManager.queue.indexOf(path), 1); // Remove the path from the queue + var importedEqualsRoot = fullPath === importManager.rootFilename; + if (importOptions.optional && e) { + callback(null, { rules: [] }, false, null); + logger.info("The file " + fullPath + " was skipped because it was not found and the import was marked optional."); + } + else { + // Inline imports aren't cached here. + // If we start to cache them, please make sure they won't conflict with non-inline imports of the + // same name as they used to do before this comment and the condition below have been added. + if (!importManager.files[fullPath] && !importOptions.inline) { + importManager.files[fullPath] = { root: root, options: importOptions }; + } + if (e && !importManager.error) { + importManager.error = e; + } + callback(e, root, importedEqualsRoot, fullPath); + } + }; + var newFileInfo = { + rewriteUrls: this.context.rewriteUrls, + entryPath: currentFileInfo.entryPath, + rootpath: currentFileInfo.rootpath, + rootFilename: currentFileInfo.rootFilename + }; + var fileManager = environment.getFileManager(path, currentFileInfo.currentDirectory, this.context, environment); + if (!fileManager) { + fileParsedFunc({ message: "Could not find a file-manager for " + path }); + return; + } + var loadFileCallback = function (loadedFile) { + var plugin; + var resolvedFilename = loadedFile.filename; + var contents = loadedFile.contents.replace(/^\uFEFF/, ''); + // Pass on an updated rootpath if path of imported file is relative and file + // is in a (sub|sup) directory + // + // Examples: + // - If path of imported file is 'module/nav/nav.less' and rootpath is 'less/', + // then rootpath should become 'less/module/nav/' + // - If path of imported file is '../mixins.less' and rootpath is 'less/', + // then rootpath should become 'less/../' + newFileInfo.currentDirectory = fileManager.getPath(resolvedFilename); + if (newFileInfo.rewriteUrls) { + newFileInfo.rootpath = fileManager.join((importManager.context.rootpath || ''), fileManager.pathDiff(newFileInfo.currentDirectory, newFileInfo.entryPath)); + if (!fileManager.isPathAbsolute(newFileInfo.rootpath) && fileManager.alwaysMakePathsAbsolute()) { + newFileInfo.rootpath = fileManager.join(newFileInfo.entryPath, newFileInfo.rootpath); + } + } + newFileInfo.filename = resolvedFilename; + var newEnv = new contexts.Parse(importManager.context); + newEnv.processImports = false; + importManager.contents[resolvedFilename] = contents; + if (currentFileInfo.reference || importOptions.reference) { + newFileInfo.reference = true; + } + if (importOptions.isPlugin) { + plugin = pluginLoader.evalPlugin(contents, newEnv, importManager, importOptions.pluginArgs, newFileInfo); + if (plugin instanceof LessError) { + fileParsedFunc(plugin, null, resolvedFilename); + } + else { + fileParsedFunc(null, plugin, resolvedFilename); + } + } + else if (importOptions.inline) { + fileParsedFunc(null, contents, resolvedFilename); + } + else { + // import (multiple) parse trees apparently get altered and can't be cached. + // TODO: investigate why this is + if (importManager.files[resolvedFilename] + && !importManager.files[resolvedFilename].options.multiple + && !importOptions.multiple) { + fileParsedFunc(null, importManager.files[resolvedFilename].root, resolvedFilename); + } + else { + new Parser(newEnv, importManager, newFileInfo).parse(contents, function (e, root) { + fileParsedFunc(e, root, resolvedFilename); + }); + } + } + }; + var loadedFile; + var promise; + var context = clone(this.context); + if (tryAppendExtension) { + context.ext = importOptions.isPlugin ? '.js' : '.less'; + } + if (importOptions.isPlugin) { + context.mime = 'application/javascript'; + if (context.syncImport) { + loadedFile = pluginLoader.loadPluginSync(path, currentFileInfo.currentDirectory, context, environment, fileManager); + } + else { + promise = pluginLoader.loadPlugin(path, currentFileInfo.currentDirectory, context, environment, fileManager); + } + } + else { + if (context.syncImport) { + loadedFile = fileManager.loadFileSync(path, currentFileInfo.currentDirectory, context, environment); + } + else { + promise = fileManager.loadFile(path, currentFileInfo.currentDirectory, context, environment, function (err, loadedFile) { + if (err) { + fileParsedFunc(err); + } + else { + loadFileCallback(loadedFile); + } + }); + } + } + if (loadedFile) { + if (!loadedFile.filename) { + fileParsedFunc(loadedFile); + } + else { + loadFileCallback(loadedFile); + } + } + else if (promise) { + promise.then(loadFileCallback, fileParsedFunc); + } + }; + return ImportManager; + }()); + return ImportManager; + } - /** - * Plugin Manager - */ - var PluginManager = /** @class */ (function () { - function PluginManager(less) { - this.less = less; - this.visitors = []; - this.preProcessors = []; - this.postProcessors = []; - this.installedPlugins = []; - this.fileManagers = []; - this.iterator = -1; - this.pluginCache = {}; - this.Loader = new less.PluginLoader(less); - } - /** - * Adds all the plugins in the array - * @param {Array} plugins - */ - PluginManager.prototype.addPlugins = function (plugins) { - if (plugins) { - for (var i = 0; i < plugins.length; i++) { - this.addPlugin(plugins[i]); - } - } - }; - /** - * - * @param plugin - * @param {String} filename - */ - PluginManager.prototype.addPlugin = function (plugin, filename, functionRegistry) { - this.installedPlugins.push(plugin); - if (filename) { - this.pluginCache[filename] = plugin; - } - if (plugin.install) { - plugin.install(this.less, this, functionRegistry || this.less.functions.functionRegistry); - } - }; - /** - * - * @param filename - */ - PluginManager.prototype.get = function (filename) { - return this.pluginCache[filename]; - }; - /** - * Adds a visitor. The visitor object has options on itself to determine - * when it should run. - * @param visitor - */ - PluginManager.prototype.addVisitor = function (visitor) { - this.visitors.push(visitor); - }; - /** - * Adds a pre processor object - * @param {object} preProcessor - * @param {number} priority - guidelines 1 = before import, 1000 = import, 2000 = after import - */ - PluginManager.prototype.addPreProcessor = function (preProcessor, priority) { - var indexToInsertAt; - for (indexToInsertAt = 0; indexToInsertAt < this.preProcessors.length; indexToInsertAt++) { - if (this.preProcessors[indexToInsertAt].priority >= priority) { - break; - } - } - this.preProcessors.splice(indexToInsertAt, 0, { preProcessor: preProcessor, priority: priority }); - }; - /** - * Adds a post processor object - * @param {object} postProcessor - * @param {number} priority - guidelines 1 = before compression, 1000 = compression, 2000 = after compression - */ - PluginManager.prototype.addPostProcessor = function (postProcessor, priority) { - var indexToInsertAt; - for (indexToInsertAt = 0; indexToInsertAt < this.postProcessors.length; indexToInsertAt++) { - if (this.postProcessors[indexToInsertAt].priority >= priority) { - break; - } - } - this.postProcessors.splice(indexToInsertAt, 0, { postProcessor: postProcessor, priority: priority }); - }; - /** - * - * @param manager - */ - PluginManager.prototype.addFileManager = function (manager) { - this.fileManagers.push(manager); - }; - /** - * - * @returns {Array} - * @private - */ - PluginManager.prototype.getPreProcessors = function () { - var preProcessors = []; - for (var i = 0; i < this.preProcessors.length; i++) { - preProcessors.push(this.preProcessors[i].preProcessor); - } - return preProcessors; - }; - /** - * - * @returns {Array} - * @private - */ - PluginManager.prototype.getPostProcessors = function () { - var postProcessors = []; - for (var i = 0; i < this.postProcessors.length; i++) { - postProcessors.push(this.postProcessors[i].postProcessor); - } - return postProcessors; - }; - /** - * - * @returns {Array} - * @private - */ - PluginManager.prototype.getVisitors = function () { - return this.visitors; - }; - PluginManager.prototype.visitor = function () { - var self = this; - return { - first: function () { - self.iterator = -1; - return self.visitors[self.iterator]; - }, - get: function () { - self.iterator += 1; - return self.visitors[self.iterator]; - } - }; - }; - /** - * - * @returns {Array} - * @private - */ - PluginManager.prototype.getFileManagers = function () { - return this.fileManagers; - }; - return PluginManager; - }()); - var pm; - function PluginManagerFactory(less, newFactory) { - if (newFactory || !pm) { - pm = new PluginManager(less); - } - return pm; - } + function Parse (environment, ParseTree, ImportManager) { + var parse = function (input, options, callback) { + if (typeof options === 'function') { + callback = options; + options = copyOptions(this.options, {}); + } + else { + options = copyOptions(this.options, options || {}); + } + if (!callback) { + var self_1 = this; + return new Promise(function (resolve, reject) { + parse.call(self_1, input, options, function (err, output) { + if (err) { + reject(err); + } + else { + resolve(output); + } + }); + }); + } + else { + var context_1; + var rootFileInfo = void 0; + var pluginManager_1 = new PluginManagerFactory(this, !options.reUsePluginManager); + options.pluginManager = pluginManager_1; + context_1 = new contexts.Parse(options); + if (options.rootFileInfo) { + rootFileInfo = options.rootFileInfo; + } + else { + var filename = options.filename || 'input'; + var entryPath = filename.replace(/[^\/\\]*$/, ''); + rootFileInfo = { + filename: filename, + rewriteUrls: context_1.rewriteUrls, + rootpath: context_1.rootpath || '', + currentDirectory: entryPath, + entryPath: entryPath, + rootFilename: filename + }; + // add in a missing trailing slash + if (rootFileInfo.rootpath && rootFileInfo.rootpath.slice(-1) !== '/') { + rootFileInfo.rootpath += '/'; + } + } + var imports_1 = new ImportManager(this, context_1, rootFileInfo); + this.importManager = imports_1; + // TODO: allow the plugins to be just a list of paths or names + // Do an async plugin queue like lessc + if (options.plugins) { + options.plugins.forEach(function (plugin) { + var evalResult, contents; + if (plugin.fileContent) { + contents = plugin.fileContent.replace(/^\uFEFF/, ''); + evalResult = pluginManager_1.Loader.evalPlugin(contents, context_1, imports_1, plugin.options, plugin.filename); + if (evalResult instanceof LessError) { + return callback(evalResult); + } + } + else { + pluginManager_1.addPlugin(plugin); + } + }); + } + new Parser(context_1, imports_1, rootFileInfo) + .parse(input, function (e, root) { + if (e) { + return callback(e); + } + callback(null, root, imports_1, options); + }, options); + } + }; + return parse; + } - var Parse = (function (environment, ParseTree, ImportManager) { - var parse = function (input, options, callback) { - if (typeof options === 'function') { - callback = options; - options = copyOptions(this.options, {}); - } - else { - options = copyOptions(this.options, options || {}); - } - if (!callback) { - var self_1 = this; - return new Promise(function (resolve, reject) { - parse.call(self_1, input, options, function (err, output) { - if (err) { - reject(err); - } - else { - resolve(output); - } - }); - }); - } - else { - var context_1; - var rootFileInfo = void 0; - var pluginManager_1 = new PluginManagerFactory(this, !options.reUsePluginManager); - options.pluginManager = pluginManager_1; - context_1 = new contexts.Parse(options); - if (options.rootFileInfo) { - rootFileInfo = options.rootFileInfo; - } - else { - var filename = options.filename || 'input'; - var entryPath = filename.replace(/[^\/\\]*$/, ''); - rootFileInfo = { - filename: filename, - rewriteUrls: context_1.rewriteUrls, - rootpath: context_1.rootpath || '', - currentDirectory: entryPath, - entryPath: entryPath, - rootFilename: filename - }; - // add in a missing trailing slash - if (rootFileInfo.rootpath && rootFileInfo.rootpath.slice(-1) !== '/') { - rootFileInfo.rootpath += '/'; - } - } - var imports_1 = new ImportManager(this, context_1, rootFileInfo); - this.importManager = imports_1; - // TODO: allow the plugins to be just a list of paths or names - // Do an async plugin queue like lessc - if (options.plugins) { - options.plugins.forEach(function (plugin) { - var evalResult; - var contents; - if (plugin.fileContent) { - contents = plugin.fileContent.replace(/^\uFEFF/, ''); - evalResult = pluginManager_1.Loader.evalPlugin(contents, context_1, imports_1, plugin.options, plugin.filename); - if (evalResult instanceof LessError) { - return callback(evalResult); - } - } - else { - pluginManager_1.addPlugin(plugin); - } - }); - } - new Parser(context_1, imports_1, rootFileInfo) - .parse(input, function (e, root) { - if (e) { - return callback(e); - } - callback(null, root, imports_1, options); - }, options); - } - }; - return parse; - }); + function Render (environment, ParseTree, ImportManager) { + var render = function (input, options, callback) { + if (typeof options === 'function') { + callback = options; + options = copyOptions(this.options, {}); + } + else { + options = copyOptions(this.options, options || {}); + } + if (!callback) { + var self_1 = this; + return new Promise(function (resolve, reject) { + render.call(self_1, input, options, function (err, output) { + if (err) { + reject(err); + } + else { + resolve(output); + } + }); + }); + } + else { + this.parse(input, options, function (err, root, imports, options) { + if (err) { + return callback(err); + } + var result; + try { + var parseTree = new ParseTree(root, imports); + result = parseTree.toCSS(options); + } + catch (err) { + return callback(err); + } + callback(null, result); + }); + } + }; + return render; + } - var lessRoot = (function (environment$1, fileManagers) { - /** - * @todo - * This original code could be improved quite a bit. - * Many classes / modules currently add side-effects / mutations to passed in objects, - * which makes it hard to refactor and reason about. - */ - environment$1 = new environment(environment$1, fileManagers); - var SourceMapOutput = sourceMapOutput(environment$1); - var SourceMapBuilder = sourceMapBuilder(SourceMapOutput, environment$1); - var ParseTree = parseTree(SourceMapBuilder); - var ImportManager = importManager(environment$1); - var render = Render(environment$1, ParseTree); - var parse = Parse(environment$1, ParseTree, ImportManager); - var functions = Functions(environment$1); - /** - * @todo - * This root properties / methods need to be organized. - * It's not clear what should / must be public and why. - */ - var initial = { - version: [3, 12, 2], - data: data, - tree: tree, - Environment: environment, - AbstractFileManager: AbstractFileManager, - AbstractPluginLoader: AbstractPluginLoader, - environment: environment$1, - visitors: visitors, - Parser: Parser, - functions: functions, - contexts: contexts, - SourceMapOutput: SourceMapOutput, - SourceMapBuilder: SourceMapBuilder, - ParseTree: ParseTree, - ImportManager: ImportManager, - render: render, - parse: parse, - LessError: LessError, - transformTree: transformTree, - utils: utils, - PluginManager: PluginManagerFactory, - logger: logger - }; - // Create a public API - var ctor = function (t) { return function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } - return new (t.bind.apply(t, __spreadArrays([void 0], args)))(); - }; }; - var t; - var api = Object.create(initial); - for (var n in initial.tree) { - /* eslint guard-for-in: 0 */ - t = initial.tree[n]; - if (typeof t === 'function') { - api[n.toLowerCase()] = ctor(t); - } - else { - api[n] = Object.create(null); - for (var o in t) { - /* eslint guard-for-in: 0 */ - api[n][o.toLowerCase()] = ctor(t[o]); - } - } - } - /** - * Some of the functions assume a `this` context of the API object, - * which causes it to fail when wrapped for ES6 imports. - * - * An assumed `this` should be removed in the future. - */ - initial.parse = initial.parse.bind(api); - initial.render = initial.render.bind(api); - return api; - }); + function lessRoot (environment, fileManagers) { + var sourceMapOutput, sourceMapBuilder, parseTree, importManager; + environment = new Environment(environment, fileManagers); + sourceMapOutput = SourceMapOutput(environment); + sourceMapBuilder = SourceMapBuilder(sourceMapOutput, environment); + parseTree = ParseTree(sourceMapBuilder); + importManager = ImportManager(environment); + var render = Render(environment, parseTree); + var parse = Parse(environment, parseTree, importManager); + var initial = { + version: [4, 0, 0], + data: data, + tree: tree, + Environment: Environment, + AbstractFileManager: AbstractFileManager, + AbstractPluginLoader: AbstractPluginLoader, + environment: environment, + visitors: visitors, + Parser: Parser, + functions: functions(environment), + contexts: contexts, + SourceMapOutput: sourceMapOutput, + SourceMapBuilder: sourceMapBuilder, + ParseTree: parseTree, + ImportManager: importManager, + render: render, + parse: parse, + LessError: LessError, + transformTree: transformTree, + utils: utils, + PluginManager: PluginManagerFactory, + logger: logger + }; + // Create a public API + var ctor = function (t) { + return function () { + var obj = Object.create(t.prototype); + t.apply(obj, Array.prototype.slice.call(arguments, 0)); + return obj; + }; + }; + var t; + var api = Object.create(initial); + for (var n in initial.tree) { + /* eslint guard-for-in: 0 */ + t = initial.tree[n]; + if (typeof t === 'function') { + api[n.toLowerCase()] = ctor(t); + } + else { + api[n] = Object.create(null); + for (var o in t) { + /* eslint guard-for-in: 0 */ + api[n][o.toLowerCase()] = ctor(t[o]); + } + } + } + /** + * Some of the functions assume a `this` context of the API object, + * which causes it to fail when wrapped for ES6 imports. + * + * An assumed `this` should be removed in the future. + */ + initial.parse = initial.parse.bind(api); + initial.render = initial.render.bind(api); + return api; + } - /* global window, XMLHttpRequest */ - var options; - var logger$1; - var fileCache = {}; - // TODOS - move log somewhere. pathDiff and doing something similar in node. use pathDiff in the other browser file for the initial load - var FileManager = /** @class */ (function (_super) { - __extends(FileManager, _super); - function FileManager() { - return _super !== null && _super.apply(this, arguments) || this; - } - FileManager.prototype.alwaysMakePathsAbsolute = function () { - return true; - }; - FileManager.prototype.join = function (basePath, laterPath) { - if (!basePath) { - return laterPath; - } - return this.extractUrlParts(laterPath, basePath).path; - }; - FileManager.prototype.doXHR = function (url, type, callback, errback) { - var xhr = new XMLHttpRequest(); - var async = options.isFileProtocol ? options.fileAsync : true; - if (typeof xhr.overrideMimeType === 'function') { - xhr.overrideMimeType('text/css'); - } - logger$1.debug("XHR: Getting '" + url + "'"); - xhr.open('GET', url, async); - xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5'); - xhr.send(null); - function handleResponse(xhr, callback, errback) { - if (xhr.status >= 200 && xhr.status < 300) { - callback(xhr.responseText, xhr.getResponseHeader('Last-Modified')); - } - else if (typeof errback === 'function') { - errback(xhr.status, url); - } - } - if (options.isFileProtocol && !options.fileAsync) { - if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) { - callback(xhr.responseText); - } - else { - errback(xhr.status, url); - } - } - else if (async) { - xhr.onreadystatechange = function () { - if (xhr.readyState == 4) { - handleResponse(xhr, callback, errback); - } - }; - } - else { - handleResponse(xhr, callback, errback); - } - }; - FileManager.prototype.supports = function () { - return true; - }; - FileManager.prototype.clearFileCache = function () { - fileCache = {}; - }; - FileManager.prototype.loadFile = function (filename, currentDirectory, options, environment) { - // TODO: Add prefix support like less-node? - // What about multiple paths? - if (currentDirectory && !this.isPathAbsolute(filename)) { - filename = currentDirectory + filename; - } - filename = options.ext ? this.tryAppendExtension(filename, options.ext) : filename; - options = options || {}; - // sheet may be set to the stylesheet for the initial load or a collection of properties including - // some context variables for imports - var hrefParts = this.extractUrlParts(filename, window.location.href); - var href = hrefParts.url; - var self = this; - return new Promise(function (resolve, reject) { - if (options.useFileCache && fileCache[href]) { - try { - var lessText = fileCache[href]; - return resolve({ contents: lessText, filename: href, webInfo: { lastModified: new Date() } }); - } - catch (e) { - return reject({ filename: href, message: "Error loading file " + href + " error was " + e.message }); - } - } - self.doXHR(href, options.mime, function doXHRCallback(data, lastModified) { - // per file cache - fileCache[href] = data; - // Use remote copy (re-parse) - resolve({ contents: data, filename: href, webInfo: { lastModified: lastModified } }); - }, function doXHRError(status, url) { - reject({ type: 'File', message: "'" + url + "' wasn't found (" + status + ")", href: href }); - }); - }); - }; - return FileManager; - }(AbstractFileManager)); - var FM = (function (opts, log) { - options = opts; - logger$1 = log; - return FileManager; - }); + /* global window, XMLHttpRequest */ + var options; + var logger$1; + var fileCache = {}; + // TODOS - move log somewhere. pathDiff and doing something similar in node. use pathDiff in the other browser file for the initial load + var FileManager = /** @class */ (function (_super) { + __extends(FileManager, _super); + function FileManager() { + return _super !== null && _super.apply(this, arguments) || this; + } + FileManager.prototype.alwaysMakePathsAbsolute = function () { + return true; + }; + FileManager.prototype.join = function (basePath, laterPath) { + if (!basePath) { + return laterPath; + } + return this.extractUrlParts(laterPath, basePath).path; + }; + FileManager.prototype.doXHR = function (url, type, callback, errback) { + var xhr = new XMLHttpRequest(); + var async = options.isFileProtocol ? options.fileAsync : true; + if (typeof xhr.overrideMimeType === 'function') { + xhr.overrideMimeType('text/css'); + } + logger$1.debug("XHR: Getting '" + url + "'"); + xhr.open('GET', url, async); + xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5'); + xhr.send(null); + function handleResponse(xhr, callback, errback) { + if (xhr.status >= 200 && xhr.status < 300) { + callback(xhr.responseText, xhr.getResponseHeader('Last-Modified')); + } + else if (typeof errback === 'function') { + errback(xhr.status, url); + } + } + if (options.isFileProtocol && !options.fileAsync) { + if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) { + callback(xhr.responseText); + } + else { + errback(xhr.status, url); + } + } + else if (async) { + xhr.onreadystatechange = function () { + if (xhr.readyState == 4) { + handleResponse(xhr, callback, errback); + } + }; + } + else { + handleResponse(xhr, callback, errback); + } + }; + FileManager.prototype.supports = function () { + return true; + }; + FileManager.prototype.clearFileCache = function () { + fileCache = {}; + }; + FileManager.prototype.loadFile = function (filename, currentDirectory, options, environment) { + // TODO: Add prefix support like less-node? + // What about multiple paths? + if (currentDirectory && !this.isPathAbsolute(filename)) { + filename = currentDirectory + filename; + } + filename = options.ext ? this.tryAppendExtension(filename, options.ext) : filename; + options = options || {}; + // sheet may be set to the stylesheet for the initial load or a collection of properties including + // some context variables for imports + var hrefParts = this.extractUrlParts(filename, window.location.href); + var href = hrefParts.url; + var self = this; + return new Promise(function (resolve, reject) { + if (options.useFileCache && fileCache[href]) { + try { + var lessText = fileCache[href]; + return resolve({ contents: lessText, filename: href, webInfo: { lastModified: new Date() } }); + } + catch (e) { + return reject({ filename: href, message: "Error loading file " + href + " error was " + e.message }); + } + } + self.doXHR(href, options.mime, function doXHRCallback(data, lastModified) { + // per file cache + fileCache[href] = data; + // Use remote copy (re-parse) + resolve({ contents: data, filename: href, webInfo: { lastModified: lastModified } }); + }, function doXHRError(status, url) { + reject({ type: 'File', message: "'" + url + "' wasn't found (" + status + ")", href: href }); + }); + }); + }; + return FileManager; + }(AbstractFileManager)); + var FM = (function (opts, log) { + options = opts; + logger$1 = log; + return FileManager; + }); - // TODO: Add tests for browser @plugin - /** - * Browser Plugin Loader - */ - var PluginLoader = /** @class */ (function (_super) { - __extends(PluginLoader, _super); - function PluginLoader(less) { - var _this = _super.call(this) || this; - _this.less = less; - return _this; - // Should we shim this.require for browser? Probably not? - } - PluginLoader.prototype.loadPlugin = function (filename, basePath, context, environment, fileManager) { - return new Promise(function (fulfill, reject) { - fileManager.loadFile(filename, basePath, context, environment) - .then(fulfill).catch(reject); - }); - }; - return PluginLoader; - }(AbstractPluginLoader)); + // TODO: Add tests for browser @plugin + /** + * Browser Plugin Loader + */ + var PluginLoader = /** @class */ (function (_super) { + __extends(PluginLoader, _super); + function PluginLoader(less) { + var _this = _super.call(this) || this; + _this.less = less; + return _this; + // Should we shim this.require for browser? Probably not? + } + PluginLoader.prototype.loadPlugin = function (filename, basePath, context, environment, fileManager) { + return new Promise(function (fulfill, reject) { + fileManager.loadFile(filename, basePath, context, environment) + .then(fulfill).catch(reject); + }); + }; + return PluginLoader; + }(AbstractPluginLoader)); - var LogListener = (function (less, options) { - var logLevel_debug = 4; - var logLevel_info = 3; - var logLevel_warn = 2; - var logLevel_error = 1; - // The amount of logging in the javascript console. - // 3 - Debug, information and errors - // 2 - Information and errors - // 1 - Errors - // 0 - None - // Defaults to 2 - options.logLevel = typeof options.logLevel !== 'undefined' ? options.logLevel : (options.env === 'development' ? logLevel_info : logLevel_error); - if (!options.loggers) { - options.loggers = [{ - debug: function (msg) { - if (options.logLevel >= logLevel_debug) { - console.log(msg); - } - }, - info: function (msg) { - if (options.logLevel >= logLevel_info) { - console.log(msg); - } - }, - warn: function (msg) { - if (options.logLevel >= logLevel_warn) { - console.warn(msg); - } - }, - error: function (msg) { - if (options.logLevel >= logLevel_error) { - console.error(msg); - } - } - }]; - } - for (var i = 0; i < options.loggers.length; i++) { - less.logger.addListener(options.loggers[i]); - } - }); + var LogListener = (function (less, options) { + var logLevel_debug = 4; + var logLevel_info = 3; + var logLevel_warn = 2; + var logLevel_error = 1; + // The amount of logging in the javascript console. + // 3 - Debug, information and errors + // 2 - Information and errors + // 1 - Errors + // 0 - None + // Defaults to 2 + options.logLevel = typeof options.logLevel !== 'undefined' ? options.logLevel : (options.env === 'development' ? logLevel_info : logLevel_error); + if (!options.loggers) { + options.loggers = [{ + debug: function (msg) { + if (options.logLevel >= logLevel_debug) { + console.log(msg); + } + }, + info: function (msg) { + if (options.logLevel >= logLevel_info) { + console.log(msg); + } + }, + warn: function (msg) { + if (options.logLevel >= logLevel_warn) { + console.warn(msg); + } + }, + error: function (msg) { + if (options.logLevel >= logLevel_error) { + console.error(msg); + } + } + }]; + } + for (var i = 0; i < options.loggers.length; i++) { + less.logger.addListener(options.loggers[i]); + } + }); - var ErrorReporting = (function (window, less, options) { - function errorHTML(e, rootHref) { - var id = "less-error-message:" + extractId(rootHref || ''); - var template = '
  • {content}
  • '; - var elem = window.document.createElement('div'); - var timer; - var content; - var errors = []; - var filename = e.filename || rootHref; - var filenameNoPath = filename.match(/([^\/]+(\?.*)?)$/)[1]; - elem.id = id; - elem.className = 'less-error-message'; - content = "

    " + (e.type || 'Syntax') + "Error: " + (e.message || 'There is an error in your .less file') + - ("

    in " + filenameNoPath + " "); - var errorline = function (e, i, classname) { - if (e.extract[i] !== undefined) { - errors.push(template.replace(/\{line\}/, (parseInt(e.line, 10) || 0) + (i - 1)) - .replace(/\{class\}/, classname) - .replace(/\{content\}/, e.extract[i])); - } - }; - if (e.line) { - errorline(e, 0, ''); - errorline(e, 1, 'line'); - errorline(e, 2, ''); - content += "on line " + e.line + ", column " + (e.column + 1) + ":

      " + errors.join('') + "
    "; - } - if (e.stack && (e.extract || options.logLevel >= 4)) { - content += "
    Stack Trace
    " + e.stack.split('\n').slice(1).join('
    '); - } - elem.innerHTML = content; - // CSS for error messages - browser.createCSS(window.document, [ - '.less-error-message ul, .less-error-message li {', - 'list-style-type: none;', - 'margin-right: 15px;', - 'padding: 4px 0;', - 'margin: 0;', - '}', - '.less-error-message label {', - 'font-size: 12px;', - 'margin-right: 15px;', - 'padding: 4px 0;', - 'color: #cc7777;', - '}', - '.less-error-message pre {', - 'color: #dd6666;', - 'padding: 4px 0;', - 'margin: 0;', - 'display: inline-block;', - '}', - '.less-error-message pre.line {', - 'color: #ff0000;', - '}', - '.less-error-message h3 {', - 'font-size: 20px;', - 'font-weight: bold;', - 'padding: 15px 0 5px 0;', - 'margin: 0;', - '}', - '.less-error-message a {', - 'color: #10a', - '}', - '.less-error-message .error {', - 'color: red;', - 'font-weight: bold;', - 'padding-bottom: 2px;', - 'border-bottom: 1px dashed red;', - '}' - ].join('\n'), { title: 'error-message' }); - elem.style.cssText = [ - 'font-family: Arial, sans-serif', - 'border: 1px solid #e00', - 'background-color: #eee', - 'border-radius: 5px', - '-webkit-border-radius: 5px', - '-moz-border-radius: 5px', - 'color: #e00', - 'padding: 15px', - 'margin-bottom: 15px' - ].join(';'); - if (options.env === 'development') { - timer = setInterval(function () { - var document = window.document; - var body = document.body; - if (body) { - if (document.getElementById(id)) { - body.replaceChild(elem, document.getElementById(id)); - } - else { - body.insertBefore(elem, body.firstChild); - } - clearInterval(timer); - } - }, 10); - } - } - function removeErrorHTML(path) { - var node = window.document.getElementById("less-error-message:" + extractId(path)); - if (node) { - node.parentNode.removeChild(node); - } - } - function removeError(path) { - if (!options.errorReporting || options.errorReporting === 'html') { - removeErrorHTML(path); - } - else if (options.errorReporting === 'console') ; - else if (typeof options.errorReporting === 'function') { - options.errorReporting('remove', path); - } - } - function errorConsole(e, rootHref) { - var template = '{line} {content}'; - var filename = e.filename || rootHref; - var errors = []; - var content = (e.type || 'Syntax') + "Error: " + (e.message || 'There is an error in your .less file') + " in " + filename; - var errorline = function (e, i, classname) { - if (e.extract[i] !== undefined) { - errors.push(template.replace(/\{line\}/, (parseInt(e.line, 10) || 0) + (i - 1)) - .replace(/\{class\}/, classname) - .replace(/\{content\}/, e.extract[i])); - } - }; - if (e.line) { - errorline(e, 0, ''); - errorline(e, 1, 'line'); - errorline(e, 2, ''); - content += " on line " + e.line + ", column " + (e.column + 1) + ":\n" + errors.join('\n'); - } - if (e.stack && (e.extract || options.logLevel >= 4)) { - content += "\nStack Trace\n" + e.stack; - } - less.logger.error(content); - } - function error(e, rootHref) { - if (!options.errorReporting || options.errorReporting === 'html') { - errorHTML(e, rootHref); - } - else if (options.errorReporting === 'console') { - errorConsole(e, rootHref); - } - else if (typeof options.errorReporting === 'function') { - options.errorReporting('add', e, rootHref); - } - } - return { - add: error, - remove: removeError - }; - }); + var ErrorReporting = (function (window, less, options) { + function errorHTML(e, rootHref) { + var id = "less-error-message:" + extractId(rootHref || ''); + var template = '
  • {content}
  • '; + var elem = window.document.createElement('div'); + var timer; + var content; + var errors = []; + var filename = e.filename || rootHref; + var filenameNoPath = filename.match(/([^\/]+(\?.*)?)$/)[1]; + elem.id = id; + elem.className = 'less-error-message'; + content = "

    " + (e.type || 'Syntax') + "Error: " + (e.message || 'There is an error in your .less file') + + ("

    in " + filenameNoPath + " "); + var errorline = function (e, i, classname) { + if (e.extract[i] !== undefined) { + errors.push(template.replace(/\{line\}/, (parseInt(e.line, 10) || 0) + (i - 1)) + .replace(/\{class\}/, classname) + .replace(/\{content\}/, e.extract[i])); + } + }; + if (e.line) { + errorline(e, 0, ''); + errorline(e, 1, 'line'); + errorline(e, 2, ''); + content += "on line " + e.line + ", column " + (e.column + 1) + ":

      " + errors.join('') + "
    "; + } + if (e.stack && (e.extract || options.logLevel >= 4)) { + content += "
    Stack Trace
    " + e.stack.split('\n').slice(1).join('
    '); + } + elem.innerHTML = content; + // CSS for error messages + browser.createCSS(window.document, [ + '.less-error-message ul, .less-error-message li {', + 'list-style-type: none;', + 'margin-right: 15px;', + 'padding: 4px 0;', + 'margin: 0;', + '}', + '.less-error-message label {', + 'font-size: 12px;', + 'margin-right: 15px;', + 'padding: 4px 0;', + 'color: #cc7777;', + '}', + '.less-error-message pre {', + 'color: #dd6666;', + 'padding: 4px 0;', + 'margin: 0;', + 'display: inline-block;', + '}', + '.less-error-message pre.line {', + 'color: #ff0000;', + '}', + '.less-error-message h3 {', + 'font-size: 20px;', + 'font-weight: bold;', + 'padding: 15px 0 5px 0;', + 'margin: 0;', + '}', + '.less-error-message a {', + 'color: #10a', + '}', + '.less-error-message .error {', + 'color: red;', + 'font-weight: bold;', + 'padding-bottom: 2px;', + 'border-bottom: 1px dashed red;', + '}' + ].join('\n'), { title: 'error-message' }); + elem.style.cssText = [ + 'font-family: Arial, sans-serif', + 'border: 1px solid #e00', + 'background-color: #eee', + 'border-radius: 5px', + '-webkit-border-radius: 5px', + '-moz-border-radius: 5px', + 'color: #e00', + 'padding: 15px', + 'margin-bottom: 15px' + ].join(';'); + if (options.env === 'development') { + timer = setInterval(function () { + var document = window.document; + var body = document.body; + if (body) { + if (document.getElementById(id)) { + body.replaceChild(elem, document.getElementById(id)); + } + else { + body.insertBefore(elem, body.firstChild); + } + clearInterval(timer); + } + }, 10); + } + } + function removeErrorHTML(path) { + var node = window.document.getElementById("less-error-message:" + extractId(path)); + if (node) { + node.parentNode.removeChild(node); + } + } + function removeError(path) { + if (!options.errorReporting || options.errorReporting === 'html') { + removeErrorHTML(path); + } + else if (options.errorReporting === 'console') ; + else if (typeof options.errorReporting === 'function') { + options.errorReporting('remove', path); + } + } + function errorConsole(e, rootHref) { + var template = '{line} {content}'; + var filename = e.filename || rootHref; + var errors = []; + var content = (e.type || 'Syntax') + "Error: " + (e.message || 'There is an error in your .less file') + " in " + filename; + var errorline = function (e, i, classname) { + if (e.extract[i] !== undefined) { + errors.push(template.replace(/\{line\}/, (parseInt(e.line, 10) || 0) + (i - 1)) + .replace(/\{class\}/, classname) + .replace(/\{content\}/, e.extract[i])); + } + }; + if (e.line) { + errorline(e, 0, ''); + errorline(e, 1, 'line'); + errorline(e, 2, ''); + content += " on line " + e.line + ", column " + (e.column + 1) + ":\n" + errors.join('\n'); + } + if (e.stack && (e.extract || options.logLevel >= 4)) { + content += "\nStack Trace\n" + e.stack; + } + less.logger.error(content); + } + function error(e, rootHref) { + if (!options.errorReporting || options.errorReporting === 'html') { + errorHTML(e, rootHref); + } + else if (options.errorReporting === 'console') { + errorConsole(e, rootHref); + } + else if (typeof options.errorReporting === 'function') { + options.errorReporting('add', e, rootHref); + } + } + return { + add: error, + remove: removeError + }; + }); - // Cache system is a bit outdated and could do with work - var Cache = (function (window, options, logger) { - var cache = null; - if (options.env !== 'development') { - try { - cache = (typeof window.localStorage === 'undefined') ? null : window.localStorage; - } - catch (_) { } - } - return { - setCSS: function (path, lastModified, modifyVars, styles) { - if (cache) { - logger.info("saving " + path + " to cache."); - try { - cache.setItem(path, styles); - cache.setItem(path + ":timestamp", lastModified); - if (modifyVars) { - cache.setItem(path + ":vars", JSON.stringify(modifyVars)); - } - } - catch (e) { - // TODO - could do with adding more robust error handling - logger.error("failed to save \"" + path + "\" to local storage for caching."); - } - } - }, - getCSS: function (path, webInfo, modifyVars) { - var css = cache && cache.getItem(path); - var timestamp = cache && cache.getItem(path + ":timestamp"); - var vars = cache && cache.getItem(path + ":vars"); - modifyVars = modifyVars || {}; - vars = vars || "{}"; // if not set, treat as the JSON representation of an empty object - if (timestamp && webInfo.lastModified && - (new Date(webInfo.lastModified).valueOf() === - new Date(timestamp).valueOf()) && - JSON.stringify(modifyVars) === vars) { - // Use local copy - return css; - } - } - }; - }); + // Cache system is a bit outdated and could do with work + var Cache = (function (window, options, logger) { + var cache = null; + if (options.env !== 'development') { + try { + cache = (typeof window.localStorage === 'undefined') ? null : window.localStorage; + } + catch (_) { } + } + return { + setCSS: function (path, lastModified, modifyVars, styles) { + if (cache) { + logger.info("saving " + path + " to cache."); + try { + cache.setItem(path, styles); + cache.setItem(path + ":timestamp", lastModified); + if (modifyVars) { + cache.setItem(path + ":vars", JSON.stringify(modifyVars)); + } + } + catch (e) { + // TODO - could do with adding more robust error handling + logger.error("failed to save \"" + path + "\" to local storage for caching."); + } + } + }, + getCSS: function (path, webInfo, modifyVars) { + var css = cache && cache.getItem(path); + var timestamp = cache && cache.getItem(path + ":timestamp"); + var vars = cache && cache.getItem(path + ":vars"); + modifyVars = modifyVars || {}; + vars = vars || "{}"; // if not set, treat as the JSON representation of an empty object + if (timestamp && webInfo.lastModified && + (new Date(webInfo.lastModified).valueOf() === + new Date(timestamp).valueOf()) && + JSON.stringify(modifyVars) === vars) { + // Use local copy + return css; + } + } + }; + }); - var ImageSize = (function () { - function imageSize() { - throw { - type: 'Runtime', - message: 'Image size functions are not supported in browser version of less' - }; - } - var imageFunctions = { - 'image-size': function (filePathNode) { - imageSize(); - return -1; - }, - 'image-width': function (filePathNode) { - imageSize(); - return -1; - }, - 'image-height': function (filePathNode) { - imageSize(); - return -1; - } - }; - functionRegistry.addMultiple(imageFunctions); - }); + var ImageSize = (function () { + function imageSize() { + throw { + type: 'Runtime', + message: 'Image size functions are not supported in browser version of less' + }; + } + var imageFunctions = { + 'image-size': function (filePathNode) { + imageSize(); + return -1; + }, + 'image-width': function (filePathNode) { + imageSize(); + return -1; + }, + 'image-height': function (filePathNode) { + imageSize(); + return -1; + } + }; + functionRegistry.addMultiple(imageFunctions); + }); - // - var root = (function (window, options) { - var document = window.document; - var less = lessRoot(); - less.options = options; - var environment = less.environment; - var FileManager = FM(options, less.logger); - var fileManager = new FileManager(); - environment.addFileManager(fileManager); - less.FileManager = FileManager; - less.PluginLoader = PluginLoader; - LogListener(less, options); - var errors = ErrorReporting(window, less, options); - var cache = less.cache = options.cache || Cache(window, options, less.logger); - ImageSize(less.environment); - // Setup user functions - Deprecate? - if (options.functions) { - less.functions.functionRegistry.addMultiple(options.functions); - } - var typePattern = /^text\/(x-)?less$/; - function clone(obj) { - var cloned = {}; - for (var prop in obj) { - if (obj.hasOwnProperty(prop)) { - cloned[prop] = obj[prop]; - } - } - return cloned; - } - // only really needed for phantom - function bind(func, thisArg) { - var curryArgs = Array.prototype.slice.call(arguments, 2); - return function () { - var args = curryArgs.concat(Array.prototype.slice.call(arguments, 0)); - return func.apply(thisArg, args); - }; - } - function loadStyles(modifyVars) { - var styles = document.getElementsByTagName('style'); - var style; - for (var i = 0; i < styles.length; i++) { - style = styles[i]; - if (style.type.match(typePattern)) { - var instanceOptions = clone(options); - instanceOptions.modifyVars = modifyVars; - var lessText = style.innerHTML || ''; - instanceOptions.filename = document.location.href.replace(/#.*$/, ''); - /* jshint loopfunc:true */ - // use closure to store current style - less.render(lessText, instanceOptions, bind(function (style, e, result) { - if (e) { - errors.add(e, 'inline'); - } - else { - style.type = 'text/css'; - if (style.styleSheet) { - style.styleSheet.cssText = result.css; - } - else { - style.innerHTML = result.css; - } - } - }, null, style)); - } - } - } - function loadStyleSheet(sheet, callback, reload, remaining, modifyVars) { - var instanceOptions = clone(options); - addDataAttr(instanceOptions, sheet); - instanceOptions.mime = sheet.type; - if (modifyVars) { - instanceOptions.modifyVars = modifyVars; - } - function loadInitialFileCallback(loadedFile) { - var data = loadedFile.contents; - var path = loadedFile.filename; - var webInfo = loadedFile.webInfo; - var newFileInfo = { - currentDirectory: fileManager.getPath(path), - filename: path, - rootFilename: path, - rewriteUrls: instanceOptions.rewriteUrls - }; - newFileInfo.entryPath = newFileInfo.currentDirectory; - newFileInfo.rootpath = instanceOptions.rootpath || newFileInfo.currentDirectory; - if (webInfo) { - webInfo.remaining = remaining; - var css = cache.getCSS(path, webInfo, instanceOptions.modifyVars); - if (!reload && css) { - webInfo.local = true; - callback(null, css, data, sheet, webInfo, path); - return; - } - } - // TODO add tests around how this behaves when reloading - errors.remove(path); - instanceOptions.rootFileInfo = newFileInfo; - less.render(data, instanceOptions, function (e, result) { - if (e) { - e.href = path; - callback(e); - } - else { - cache.setCSS(sheet.href, webInfo.lastModified, instanceOptions.modifyVars, result.css); - callback(null, result.css, data, sheet, webInfo, path); - } - }); - } - fileManager.loadFile(sheet.href, null, instanceOptions, environment) - .then(function (loadedFile) { - loadInitialFileCallback(loadedFile); - }).catch(function (err) { - console.log(err); - callback(err); - }); - } - function loadStyleSheets(callback, reload, modifyVars) { - for (var i = 0; i < less.sheets.length; i++) { - loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1), modifyVars); - } - } - function initRunningMode() { - if (less.env === 'development') { - less.watchTimer = setInterval(function () { - if (less.watchMode) { - fileManager.clearFileCache(); - loadStyleSheets(function (e, css, _, sheet, webInfo) { - if (e) { - errors.add(e, e.href || sheet.href); - } - else if (css) { - browser.createCSS(window.document, css, sheet); - } - }); - } - }, options.poll); - } - } - // - // Watch mode - // - less.watch = function () { - if (!less.watchMode) { - less.env = 'development'; - initRunningMode(); - } - this.watchMode = true; - return true; - }; - less.unwatch = function () { clearInterval(less.watchTimer); this.watchMode = false; return false; }; - // - // Synchronously get all tags with the 'rel' attribute set to - // "stylesheet/less". - // - less.registerStylesheetsImmediately = function () { - var links = document.getElementsByTagName('link'); - less.sheets = []; - for (var i = 0; i < links.length; i++) { - if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) && - (links[i].type.match(typePattern)))) { - less.sheets.push(links[i]); - } - } - }; - // - // Asynchronously get all tags with the 'rel' attribute set to - // "stylesheet/less", returning a Promise. - // - less.registerStylesheets = function () { return new Promise(function (resolve, reject) { - less.registerStylesheetsImmediately(); - resolve(); - }); }; - // - // With this function, it's possible to alter variables and re-render - // CSS without reloading less-files - // - less.modifyVars = function (record) { return less.refresh(true, record, false); }; - less.refresh = function (reload, modifyVars, clearFileCache) { - if ((reload || clearFileCache) && clearFileCache !== false) { - fileManager.clearFileCache(); - } - return new Promise(function (resolve, reject) { - var startTime; - var endTime; - var totalMilliseconds; - var remainingSheets; - startTime = endTime = new Date(); - // Set counter for remaining unprocessed sheets - remainingSheets = less.sheets.length; - if (remainingSheets === 0) { - endTime = new Date(); - totalMilliseconds = endTime - startTime; - less.logger.info('Less has finished and no sheets were loaded.'); - resolve({ - startTime: startTime, - endTime: endTime, - totalMilliseconds: totalMilliseconds, - sheets: less.sheets.length - }); - } - else { - // Relies on less.sheets array, callback seems to be guaranteed to be called for every element of the array - loadStyleSheets(function (e, css, _, sheet, webInfo) { - if (e) { - errors.add(e, e.href || sheet.href); - reject(e); - return; - } - if (webInfo.local) { - less.logger.info("Loading " + sheet.href + " from cache."); - } - else { - less.logger.info("Rendered " + sheet.href + " successfully."); - } - browser.createCSS(window.document, css, sheet); - less.logger.info("CSS for " + sheet.href + " generated in " + (new Date() - endTime) + "ms"); - // Count completed sheet - remainingSheets--; - // Check if the last remaining sheet was processed and then call the promise - if (remainingSheets === 0) { - totalMilliseconds = new Date() - startTime; - less.logger.info("Less has finished. CSS generated in " + totalMilliseconds + "ms"); - resolve({ - startTime: startTime, - endTime: endTime, - totalMilliseconds: totalMilliseconds, - sheets: less.sheets.length - }); - } - endTime = new Date(); - }, reload, modifyVars); - } - loadStyles(modifyVars); - }); - }; - less.refreshStyles = loadStyles; - return less; - }); + // + var root = (function (window, options) { + var document = window.document; + var less = lessRoot(); + less.options = options; + var environment = less.environment; + var FileManager = FM(options, less.logger); + var fileManager = new FileManager(); + environment.addFileManager(fileManager); + less.FileManager = FileManager; + less.PluginLoader = PluginLoader; + LogListener(less, options); + var errors = ErrorReporting(window, less, options); + var cache = less.cache = options.cache || Cache(window, options, less.logger); + ImageSize(less.environment); + // Setup user functions - Deprecate? + if (options.functions) { + less.functions.functionRegistry.addMultiple(options.functions); + } + var typePattern = /^text\/(x-)?less$/; + function clone(obj) { + var cloned = {}; + for (var prop in obj) { + if (obj.hasOwnProperty(prop)) { + cloned[prop] = obj[prop]; + } + } + return cloned; + } + // only really needed for phantom + function bind(func, thisArg) { + var curryArgs = Array.prototype.slice.call(arguments, 2); + return function () { + var args = curryArgs.concat(Array.prototype.slice.call(arguments, 0)); + return func.apply(thisArg, args); + }; + } + function loadStyles(modifyVars) { + var styles = document.getElementsByTagName('style'); + var style; + for (var i = 0; i < styles.length; i++) { + style = styles[i]; + if (style.type.match(typePattern)) { + var instanceOptions = clone(options); + instanceOptions.modifyVars = modifyVars; + var lessText = style.innerHTML || ''; + instanceOptions.filename = document.location.href.replace(/#.*$/, ''); + /* jshint loopfunc:true */ + // use closure to store current style + less.render(lessText, instanceOptions, bind(function (style, e, result) { + if (e) { + errors.add(e, 'inline'); + } + else { + style.type = 'text/css'; + if (style.styleSheet) { + style.styleSheet.cssText = result.css; + } + else { + style.innerHTML = result.css; + } + } + }, null, style)); + } + } + } + function loadStyleSheet(sheet, callback, reload, remaining, modifyVars) { + var instanceOptions = clone(options); + addDataAttr(instanceOptions, sheet); + instanceOptions.mime = sheet.type; + if (modifyVars) { + instanceOptions.modifyVars = modifyVars; + } + function loadInitialFileCallback(loadedFile) { + var data = loadedFile.contents; + var path = loadedFile.filename; + var webInfo = loadedFile.webInfo; + var newFileInfo = { + currentDirectory: fileManager.getPath(path), + filename: path, + rootFilename: path, + rewriteUrls: instanceOptions.rewriteUrls + }; + newFileInfo.entryPath = newFileInfo.currentDirectory; + newFileInfo.rootpath = instanceOptions.rootpath || newFileInfo.currentDirectory; + if (webInfo) { + webInfo.remaining = remaining; + var css = cache.getCSS(path, webInfo, instanceOptions.modifyVars); + if (!reload && css) { + webInfo.local = true; + callback(null, css, data, sheet, webInfo, path); + return; + } + } + // TODO add tests around how this behaves when reloading + errors.remove(path); + instanceOptions.rootFileInfo = newFileInfo; + less.render(data, instanceOptions, function (e, result) { + if (e) { + e.href = path; + callback(e); + } + else { + cache.setCSS(sheet.href, webInfo.lastModified, instanceOptions.modifyVars, result.css); + callback(null, result.css, data, sheet, webInfo, path); + } + }); + } + fileManager.loadFile(sheet.href, null, instanceOptions, environment) + .then(function (loadedFile) { + loadInitialFileCallback(loadedFile); + }).catch(function (err) { + console.log(err); + callback(err); + }); + } + function loadStyleSheets(callback, reload, modifyVars) { + for (var i = 0; i < less.sheets.length; i++) { + loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1), modifyVars); + } + } + function initRunningMode() { + if (less.env === 'development') { + less.watchTimer = setInterval(function () { + if (less.watchMode) { + fileManager.clearFileCache(); + loadStyleSheets(function (e, css, _, sheet, webInfo) { + if (e) { + errors.add(e, e.href || sheet.href); + } + else if (css) { + browser.createCSS(window.document, css, sheet); + } + }); + } + }, options.poll); + } + } + // + // Watch mode + // + less.watch = function () { + if (!less.watchMode) { + less.env = 'development'; + initRunningMode(); + } + this.watchMode = true; + return true; + }; + less.unwatch = function () { clearInterval(less.watchTimer); this.watchMode = false; return false; }; + // + // Synchronously get all tags with the 'rel' attribute set to + // "stylesheet/less". + // + less.registerStylesheetsImmediately = function () { + var links = document.getElementsByTagName('link'); + less.sheets = []; + for (var i = 0; i < links.length; i++) { + if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) && + (links[i].type.match(typePattern)))) { + less.sheets.push(links[i]); + } + } + }; + // + // Asynchronously get all tags with the 'rel' attribute set to + // "stylesheet/less", returning a Promise. + // + less.registerStylesheets = function () { return new Promise(function (resolve, reject) { + less.registerStylesheetsImmediately(); + resolve(); + }); }; + // + // With this function, it's possible to alter variables and re-render + // CSS without reloading less-files + // + less.modifyVars = function (record) { return less.refresh(true, record, false); }; + less.refresh = function (reload, modifyVars, clearFileCache) { + if ((reload || clearFileCache) && clearFileCache !== false) { + fileManager.clearFileCache(); + } + return new Promise(function (resolve, reject) { + var startTime; + var endTime; + var totalMilliseconds; + var remainingSheets; + startTime = endTime = new Date(); + // Set counter for remaining unprocessed sheets + remainingSheets = less.sheets.length; + if (remainingSheets === 0) { + endTime = new Date(); + totalMilliseconds = endTime - startTime; + less.logger.info('Less has finished and no sheets were loaded.'); + resolve({ + startTime: startTime, + endTime: endTime, + totalMilliseconds: totalMilliseconds, + sheets: less.sheets.length + }); + } + else { + // Relies on less.sheets array, callback seems to be guaranteed to be called for every element of the array + loadStyleSheets(function (e, css, _, sheet, webInfo) { + if (e) { + errors.add(e, e.href || sheet.href); + reject(e); + return; + } + if (webInfo.local) { + less.logger.info("Loading " + sheet.href + " from cache."); + } + else { + less.logger.info("Rendered " + sheet.href + " successfully."); + } + browser.createCSS(window.document, css, sheet); + less.logger.info("CSS for " + sheet.href + " generated in " + (new Date() - endTime) + "ms"); + // Count completed sheet + remainingSheets--; + // Check if the last remaining sheet was processed and then call the promise + if (remainingSheets === 0) { + totalMilliseconds = new Date() - startTime; + less.logger.info("Less has finished. CSS generated in " + totalMilliseconds + "ms"); + resolve({ + startTime: startTime, + endTime: endTime, + totalMilliseconds: totalMilliseconds, + sheets: less.sheets.length + }); + } + endTime = new Date(); + }, reload, modifyVars); + } + loadStyles(modifyVars); + }); + }; + less.refreshStyles = loadStyles; + return less; + }); - /** - * Kicks off less and compiles any stylesheets - * used in the browser distributed version of less - * to kick-start less using the browser api - */ - var options$1 = defaultOptions(); - if (window.less) { - for (var key in window.less) { - if (window.less.hasOwnProperty(key)) { - options$1[key] = window.less[key]; - } - } - } - addDefaultOptions(window, options$1); - options$1.plugins = options$1.plugins || []; - if (window.LESS_PLUGINS) { - options$1.plugins = options$1.plugins.concat(window.LESS_PLUGINS); - } - var less = root(window, options$1); - window.less = less; - var css; - var head; - var style; - // Always restore page visibility - function resolveOrReject(data) { - if (data.filename) { - console.warn(data); - } - if (!options$1.async) { - head.removeChild(style); - } - } - if (options$1.onReady) { - if (/!watch/.test(window.location.hash)) { - less.watch(); - } - // Simulate synchronous stylesheet loading by hiding page rendering - if (!options$1.async) { - css = 'body { display: none !important }'; - head = document.head || document.getElementsByTagName('head')[0]; - style = document.createElement('style'); - style.type = 'text/css'; - if (style.styleSheet) { - style.styleSheet.cssText = css; - } - else { - style.appendChild(document.createTextNode(css)); - } - head.appendChild(style); - } - less.registerStylesheetsImmediately(); - less.pageLoadFinished = less.refresh(less.env === 'development').then(resolveOrReject, resolveOrReject); - } + /** + * Kicks off less and compiles any stylesheets + * used in the browser distributed version of less + * to kick-start less using the browser api + */ + var options$1 = defaultOptions(); + if (window.less) { + for (var key in window.less) { + if (window.less.hasOwnProperty(key)) { + options$1[key] = window.less[key]; + } + } + } + addDefaultOptions(window, options$1); + options$1.plugins = options$1.plugins || []; + if (window.LESS_PLUGINS) { + options$1.plugins = options$1.plugins.concat(window.LESS_PLUGINS); + } + var less = root(window, options$1); + window.less = less; + var css; + var head; + var style; + // Always restore page visibility + function resolveOrReject(data) { + if (data.filename) { + console.warn(data); + } + if (!options$1.async) { + head.removeChild(style); + } + } + if (options$1.onReady) { + if (/!watch/.test(window.location.hash)) { + less.watch(); + } + // Simulate synchronous stylesheet loading by hiding page rendering + if (!options$1.async) { + css = 'body { display: none !important }'; + head = document.head || document.getElementsByTagName('head')[0]; + style = document.createElement('style'); + style.type = 'text/css'; + if (style.styleSheet) { + style.styleSheet.cssText = css; + } + else { + style.appendChild(document.createTextNode(css)); + } + head.appendChild(style); + } + less.registerStylesheetsImmediately(); + less.pageLoadFinished = less.refresh(less.env === 'development').then(resolveOrReject, resolveOrReject); + } - return less; + return less; }))); diff --git a/dist/less.min.js b/dist/less.min.js index 9f7e1a855..302041fa6 100644 --- a/dist/less.min.js +++ b/dist/less.min.js @@ -1,5 +1,5 @@ /** - * Less - Leaner CSS v3.12.2 + * Less - Leaner CSS v3.12.1-alpha.13+ed734098 * http://lesscss.org * * Copyright (c) 2009-2020, Alexis Sellier @@ -7,5 +7,5 @@ * * @license Apache-2.0 */ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).less=t()}(this,(function(){"use strict";function e(e){return e.replace(/^[a-z-]+:\/+?[^\/]+/,"").replace(/[\?\&]livereload=\w+/,"").replace(/^\//,"").replace(/\.[a-zA-Z]+$/,"").replace(/[^\.\w-]+/g,"-").replace(/\./g,":")}function t(e,t){for(var n in t.dataset)if(t.dataset.hasOwnProperty(n))if("env"===n||"dumpLineNumbers"===n||"rootpath"===n||"errorReporting"===n)e[n]=t.dataset[n];else try{e[n]=JSON.parse(t.dataset[n])}catch(e){}}var n=function(t,n,i){var r=i.href||"",o="less:"+(i.title||e(r)),s=t.getElementById(o),a=!1,l=t.createElement("style");l.setAttribute("type","text/css"),i.media&&l.setAttribute("media",i.media),l.id=o,l.styleSheet||(l.appendChild(t.createTextNode(n)),a=null!==s&&s.childNodes.length>0&&l.childNodes.length>0&&s.firstChild.nodeValue===l.firstChild.nodeValue);var u=t.getElementsByTagName("head")[0];if(null===s||!1===a){var c=i&&i.nextSibling||null;c?c.parentNode.insertBefore(l,c):u.appendChild(l)}if(s&&!1===a&&s.parentNode.removeChild(s),l.styleSheet)try{l.styleSheet.cssText=n}catch(e){throw new Error("Couldn't reassign styleSheet.cssText.")}},i=function(e){var t,n=e.document;return n.currentScript||(t=n.getElementsByTagName("script"))[t.length-1]},r=function(e,t){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};function o(e,t){function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var s=function(){return(s=Object.assign||function(e){for(var t,n=1,i=arguments.length;nt?1:void 0};var f=function(e){function t(t,n,i){var r=e.call(this)||this,o=r;return Array.isArray(t)?r.rgb=t:t.length>=6?(r.rgb=[],t.match(/.{2}/g).map((function(e,t){t<3?o.rgb.push(parseInt(e,16)):o.alpha=parseInt(e,16)/255}))):(r.rgb=[],t.split("").map((function(e,t){t<3?o.rgb.push(parseInt(e+e,16)):o.alpha=parseInt(e+e,16)/255}))),r.alpha=r.alpha||("number"==typeof n?n:1),void 0!==i&&(r.value=i),r}return o(t,e),t.prototype.luma=function(){var e=this.rgb[0]/255,t=this.rgb[1]/255,n=this.rgb[2]/255;return.2126*(e=e<=.03928?e/12.92:Math.pow((e+.055)/1.055,2.4))+.7152*(t=t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4))+.0722*(n=n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4))},t.prototype.genCSS=function(e,t){t.add(this.toCSS(e))},t.prototype.toCSS=function(e,t){var n,i,r,o=e&&e.compress&&!t,s=[];if(i=this.fround(e,this.alpha),this.value)if(0===this.value.indexOf("rgb"))i<1&&(r="rgba");else{if(0!==this.value.indexOf("hsl"))return this.value;r=i<1?"hsla":"hsl"}else i<1&&(r="rgba");switch(r){case"rgba":s=this.rgb.map((function(e){return p(Math.round(e),255)})).concat(p(i,1));break;case"hsla":s.push(p(i,1));case"hsl":n=this.toHSL(),s=[this.fround(e,n.h),this.fround(e,100*n.s)+"%",this.fround(e,100*n.l)+"%"].concat(s)}if(r)return r+"("+s.join(","+(o?"":" "))+")";if(n=this.toRGB(),o){var a=n.split("");a[1]===a[2]&&a[3]===a[4]&&a[5]===a[6]&&(n="#"+a[1]+a[3]+a[5])}return n},t.prototype.operate=function(e,n,i){for(var r=new Array(3),o=this.alpha*(1-i.alpha)+i.alpha,s=0;s<3;s++)r[s]=this._operate(e,n,this.rgb[s],i.rgb[s]);return new t(r,o)},t.prototype.toRGB=function(){return v(this.rgb)},t.prototype.toHSL=function(){var e,t,n=this.rgb[0]/255,i=this.rgb[1]/255,r=this.rgb[2]/255,o=this.alpha,s=Math.max(n,i,r),a=Math.min(n,i,r),l=(s+a)/2,u=s-a;if(s===a)e=t=0;else{switch(t=l>.5?u/(2-s-a):u/(s+a),s){case n:e=(i-r)/u+(i=0&&"\n"!==t.charAt(n);)r++;return"number"==typeof e&&(i=(t.slice(0,e).match(/\n/g)||"").length),{line:i,column:r}}function C(e){var t,n=e.length,i=new Array(n);for(t=0;t|Function):(\d+):(\d+)/,R=function(e,t,n){Error.call(this);var i=e.filename||n;if(this.message=e.message,this.stack=e.stack,t&&i){var r=t.contents[i],o=I(e.index,r),s=o.line,a=o.column,l=e.call&&I(e.call,r).line,u=r?r.split("\n"):"";if(this.type=e.type||"Syntax",this.filename=i,this.index=e.index,this.line="number"==typeof s?s+1:null,this.column=a,!this.line&&this.stack){var c=this.stack.match(E),h=new Function("a","throw new Error()"),f=0;try{h()}catch(e){var p=e.stack.match(E);f=1-parseInt(p[2])}c&&(c[2]&&(this.line=parseInt(c[2])+f),c[3]&&(this.column=parseInt(c[3])))}this.callLine=l+1,this.callExtract=u[l],this.extract=[u[this.line-2],u[this.line-1],u[this.line]]}};if(void 0===Object.create){var V=function(){};V.prototype=Error.prototype,R.prototype=new V}else R.prototype=Object.create(Error.prototype);R.prototype.constructor=R,R.prototype.toString=function(e){void 0===e&&(e={});var t="",n=this.extract||[],i=[],r=function(e){return e};if(e.stylize){var o=typeof e.stylize;if("function"!==o)throw Error("options.stylize should be a function, got a "+o+"!");r=e.stylize}if(null!==this.line){if("string"==typeof n[0]&&i.push(r(this.line-1+" "+n[0],"grey")),"string"==typeof n[1]){var s=this.line+" ";n[1]&&(s+=n[1].slice(0,this.column)+r(r(r(n[1].substr(this.column,1),"bold")+n[1].slice(this.column+1),"red"),"inverse")),i.push(s)}"string"==typeof n[2]&&i.push(r(this.line+1+" "+n[2],"grey")),i=i.join("\n")+r("","reset")+"\n"}return t+=r(this.type+"Error: "+this.message,"red"),this.filename&&(t+=r(" in ","red")+this.filename),this.line&&(t+=r(" on line "+this.line+", column "+(this.column+1)+":","grey")),t+="\n"+i,this.callLine&&(t+=r("from ","red")+(this.filename||"")+"/n",t+=r(this.callLine,"grey")+" "+this.callExtract+"/n"),t};var F=function(e){function t(t,n,i,r,o,s){var a=e.call(this)||this;return a.extendList=n,a.condition=i,a.evaldCondition=!i,a._index=r,a._fileInfo=o,a.elements=a.getElements(t),a.mixinElements_=void 0,a.copyVisibilityInfo(s),a.setParent(a.elements,a),a}return o(t,e),t.prototype.accept=function(e){this.elements&&(this.elements=e.visitArray(this.elements)),this.extendList&&(this.extendList=e.visitArray(this.extendList)),this.condition&&(this.condition=e.visit(this.condition))},t.prototype.createDerived=function(e,n,i){var r=new t(e=this.getElements(e),n||this.extendList,null,this.getIndex(),this.fileInfo(),this.visibilityInfo());return r.evaldCondition=null!=i?i:this.evaldCondition,r.mediaEmpty=this.mediaEmpty,r},t.prototype.getElements=function(e){return e?("string"==typeof e&&this.parse.parseNode(e,["selector"],this._index,this._fileInfo,(function(t,n){if(t)throw new R({index:t.index,message:t.message},this.parse.imports,this._fileInfo.filename);e=n[0].elements})),e):[new y("","&",!1,this._index,this._fileInfo)]},t.prototype.createEmptySelectors=function(){var e=[new t([new y("","&",!1,this._index,this._fileInfo)],null,null,this._index,this._fileInfo)];return e[0].mediaEmpty=!0,e},t.prototype.match=function(e){var t,n,i=this.elements,r=i.length;if(0===(t=(e=e.mixinElements()).length)||rb.PARENS_DIVISION)||this.parensStack&&this.parensStack.length))},e.prototype.pathRequiresRewrite=function(e){return(this.rewriteUrls===x?W:G)(e)},e.prototype.rewritePath=function(e,t){var n;return t=t||"",n=this.normalizePath(t+e),W(e)&&G(t)&&!1===W(n)&&(n="./"+n),n},e.prototype.normalizePath=function(e){var t,n=e.split("/").reverse();for(e=[];0!==n.length;)switch(t=n.pop()){case".":break;case"..":0===e.length||".."===e[e.length-1]?e.push(t):e.pop();break;default:e.push(t)}return e.join("/")},e}();var J=function e(t){return{_data:{},add:function(e,t){e=e.toLowerCase(),this._data.hasOwnProperty(e),this._data[e]=t},addMultiple:function(e){var t=this;Object.keys(e).forEach((function(n){t.add(n,e[n])}))},get:function(e){return this._data[e]||t&&t.get(e)},getLocalFunctions:function(){return this._data},inherit:function(){return e(this)},create:function(t){return e(t)}}}(null),H={eval:function(){var e=this.value_,t=this.error_;if(t)throw t;if(null!=e)return e?O.True:O.False},value:function(e){this.value_=e},error:function(e){this.error_=e},reset:function(){this.value_=this.error_=null}},Q=function(e){function t(t,n,i,r){var o=e.call(this)||this;return o.selectors=t,o.rules=n,o._lookups={},o._variables=null,o._properties=null,o.strictImports=i,o.copyVisibilityInfo(r),o.allowRoot=!0,o.setParent(o.selectors,o),o.setParent(o.rules,o),o}return o(t,e),t.prototype.isRulesetLike=function(){return!0},t.prototype.accept=function(e){this.paths?this.paths=e.visitArray(this.paths,!0):this.selectors&&(this.selectors=e.visitArray(this.selectors)),this.rules&&this.rules.length&&(this.rules=e.visitArray(this.rules))},t.prototype.eval=function(e){var n,i,r,o,s,a=!1;if(this.selectors&&(i=this.selectors.length)){for(n=new Array(i),H.error({type:"Syntax",message:"it is currently only allowed in parametric mixin guards,"}),o=0;o0;e--){var t=this.rules[e-1];if(t instanceof N)return this.parseValue(t)}},t.prototype.parseValue=function(e){var t=this;function n(e){return e.value instanceof L&&!e.parsed?("string"==typeof e.value.value?this.parse.parseNode(e.value.value,["value","important"],e.value.getIndex(),e.fileInfo(),(function(t,n){t&&(e.parsed=!0),n&&(e.value=n[0],e.important=n[1]||"",e.parsed=!0)})):e.parsed=!0,e):e}if(Array.isArray(e)){var i=[];return e.forEach((function(e){i.push(n.call(t,e))})),i}return n.call(t,e)},t.prototype.rulesets=function(){if(!this.rules)return[];var e,t,n=[],i=this.rules;for(e=0;t=i[e];e++)t.isRuleset&&n.push(t);return n},t.prototype.prependRule=function(e){var t=this.rules;t?t.unshift(e):this.rules=[e],this.setParent(e,this)},t.prototype.find=function(e,t,n){void 0===t&&(t=this);var i,r,o=[],s=e.toCSS();return s in this._lookups?this._lookups[s]:(this.rulesets().forEach((function(s){if(s!==t)for(var a=0;ai){if(!n||n(s)){r=s.find(new F(e.elements.slice(i)),t,n);for(var l=0;l0&&t.add(l),e.firstSelector=!0,s[0].genCSS(e,t),e.firstSelector=!1,i=1;i0?(o=(r=C(e)).pop(),s=i.createDerived(C(o.elements))):s=i.createDerived([]),t.length>0){var a=n.combinator,l=t[0].elements[0];a.emptyOrWhitespace&&!l.combinator.emptyOrWhitespace&&(a=l.combinator),s.elements.push(new y(a,l.value,n.isVariable,n._index,n._fileInfo)),s.elements=s.elements.concat(t[0].elements.slice(1))}if(0!==s.elements.length&&r.push(s),t.length>1){var u=t.slice(1);u=u.map((function(e){return e.createDerived(e.elements,[])})),r=r.concat(u)}return r}function s(e,t,n,i,r){var s;for(s=0;s0?i[i.length-1]=i[i.length-1].createDerived(i[i.length-1].elements.concat(e)):i.push(new F(e));else t.push([new F(e)])}function l(e,t){var n=t.createDerived(t.elements,t.extendList,t.evaldCondition);return n.copyVisibilityInfo(e),n}var u,c;if(!function e(t,n,l){var u,c,h,f,p,v,m,g,b,w,x,S,I=!1;for(f=[],p=[[]],u=0;g=l.elements[u];u++)if("&"!==g.value){var C=(S=void 0,(x=g).value instanceof d&&(S=x.value.value)instanceof F?S:null);if(null!=C){a(f,p);var k,_=[],A=[];for(k=e(_,n,C),I=I||k,h=0;h<_.length;h++){s(p,[r(i(_[h],g),g)],g,l,A)}p=A,f=[]}else f.push(g)}else{for(I=!0,v=[],a(f,p),c=0;c0&&m[0].elements.push(new y(g.combinator,"",g.isVariable,g._index,g._fileInfo)),v.push(m);else for(h=0;h0&&(t.push(p[u]),w=p[u][b-1],p[u][b-1]=w.createDerived(w.elements,l.extendList));return I}(c=[],t,n))if(t.length>0)for(c=[],u=0;u0)for(t=0;t-1e-6&&(i=n.toFixed(20).replace(/0+$/,"")),e&&e.compress){if(0===n&&this.unit.isLength())return void t.add(i);n>0&&n<1&&(i=i.substr(1))}t.add(i),this.unit.genCSS(e,t)},t.prototype.operate=function(e,n,i){var r=this._operate(e,n,this.value,i.value),o=this.unit.clone();if("+"===n||"-"===n)if(0===o.numerator.length&&0===o.denominator.length)o=i.unit.clone(),this.unit.backupUnit&&(o.backupUnit=this.unit.backupUnit);else if(0===i.unit.numerator.length&&0===o.denominator.length);else{if(i=i.convertTo(this.unit.usedUnits()),e.strictUnits&&i.unit.toString()!==o.toString())throw new Error("Incompatible units. Change the units or use the unit function. Bad units: '"+o.toString()+"' and '"+i.unit.toString()+"'.");r=this._operate(e,n,this.value,i.value)}else"*"===n?(o.numerator=o.numerator.concat(i.unit.numerator).sort(),o.denominator=o.denominator.concat(i.unit.denominator).sort(),o.cancel()):"/"===n&&(o.numerator=o.numerator.concat(i.unit.denominator).sort(),o.denominator=o.denominator.concat(i.unit.numerator).sort(),o.cancel());return new t(r,o)},t.prototype.compare=function(e){var n,i;if(e instanceof t){if(this.unit.isEmpty()||e.unit.isEmpty())n=this,i=e;else if(n=this.unify(),i=e.unify(),0!==n.unit.compare(i.unit))return;return h.numericCompare(n.value,i.value)}},t.prototype.unify=function(){return this.convertTo({length:"px",duration:"s",angle:"rad"})},t.prototype.convertTo=function(e){var n,i,r,o,s,a=this.value,l=this.unit.clone(),c={};if("string"==typeof e){for(n in u)u[n].hasOwnProperty(e)&&((c={})[n]=e);e=c}for(i in s=function(e,t){return r.hasOwnProperty(e)?(t?a/=r[e]/r[o]:a*=r[e]/r[o],o):e},e)e.hasOwnProperty(i)&&(o=e[i],r=u[i],l.map(s));return l.cancel(),new t(a,l)},t}(h);X.prototype.type="Dimension";var ee=b,te=function(e){function t(t,n,i){var r=e.call(this)||this;return r.op=t.trim(),r.operands=n,r.isSpaced=i,r}return o(t,e),t.prototype.accept=function(e){this.operands=e.visitArray(this.operands)},t.prototype.eval=function(e){var n,i=this.operands[0].eval(e),r=this.operands[1].eval(e);if(e.isMathOn(this.op)){if(n="./"===this.op?"/":this.op,i instanceof X&&r instanceof f&&(i=i.toColor()),r instanceof X&&i instanceof f&&(r=r.toColor()),!i.operate){if(i instanceof t&&"/"===i.op&&e.math===ee.PARENS_DIVISION)return new t(this.op,[i,r],this.isSpaced);throw{type:"Operation",message:"Operation on an invalid type"}}return i.operate(e,n,r)}return new t(this.op,[i,r],this.isSpaced)},t.prototype.genCSS=function(e,t){this.operands[0].genCSS(e,t),this.isSpaced&&t.add(" "),t.add(this.op),this.isSpaced&&t.add(" "),this.operands[1].genCSS(e,t)},t}(h);te.prototype.type="Operation";var ne=b,ie=function(e){function t(t,n){var i=e.call(this)||this;if(i.value=t,i.noSpacing=n,!t)throw new Error("Expression requires an array parameter");return i}return o(t,e),t.prototype.accept=function(e){this.value=e.visitArray(this.value)},t.prototype.eval=function(e){var n,i=e.isMathOn(),r=this.parens&&(e.math!==ne.STRICT_LEGACY||!this.parensInOp),o=!1;return r&&e.inParenthesis(),this.value.length>1?n=new t(this.value.map((function(t){return t.eval?t.eval(e):t})),this.noSpacing):1===this.value.length?(!this.value[0].parens||this.value[0].parensInOp||e.inCalc||(o=!0),n=this.value[0].eval(e)):n=this,r&&e.outOfParenthesis(),!this.parens||!this.parensInOp||i||o||n instanceof X||(n=new d(n)),n},t.prototype.genCSS=function(e,t){for(var n=0;n1){var n=new F([],null,null,this.getIndex(),this.fileInfo()).createEmptySelectors();(t=new Q(n,e.mediaBlocks)).multiMedia=!0,t.copyVisibilityInfo(this.visibilityInfo()),this.setParent(t,this)}return delete e.mediaBlocks,delete e.mediaPath,t},t.prototype.evalNested=function(e){var t,n,i=e.mediaPath.concat([this]);for(t=0;t0;t--)e.splice(t,0,new L("and"));return new ie(e)}))),this.setParent(this.features,this),new Q([],[])},t.prototype.permute=function(e){if(0===e.length)return[];if(1===e.length)return e[0];for(var t=[],n=this.permute(e.slice(1)),i=0;i1?"["+e.value.map((function(e){return e.toCSS()})).join(", ")+"]":e.toCSS()},t}(h));pe.prototype.type="JavaScript";var ve=function(e){function t(t,n){var i=e.call(this)||this;return i.key=t,i.value=n,i}return o(t,e),t.prototype.accept=function(e){this.value=e.visit(this.value)},t.prototype.eval=function(e){return this.value.eval?new t(this.key,this.value.eval(e)):this},t.prototype.genCSS=function(e,t){t.add(this.key+"="),this.value.genCSS?this.value.genCSS(e,t):t.add(this.value)},t}(h);ve.prototype.type="Assignment";var de=function(e){function t(t,n,i,r,o){var s=e.call(this)||this;return s.op=t.trim(),s.lvalue=n,s.rvalue=i,s._index=r,s.negate=o,s}return o(t,e),t.prototype.accept=function(e){this.lvalue=e.visit(this.lvalue),this.rvalue=e.visit(this.rvalue)},t.prototype.eval=function(e){var t=function(e,t,n){switch(e){case"and":return t&&n;case"or":return t||n;default:switch(h.compare(t,n)){case-1:return"<"===e||"=<"===e||"<="===e;case 0:return"="===e||">="===e||"=<"===e||"<="===e;case 1:return">"===e||">="===e;default:return!1}}}(this.op,this.lvalue.eval(e),this.rvalue.eval(e));return this.negate?!t:t},t}(h);de.prototype.type="Condition";var me=function(e){function t(t){var n=e.call(this)||this;return n.value=t,n}return o(t,e),t}(h);me.prototype.type="UnicodeDescriptor";var ge=function(e){function t(t){var n=e.call(this)||this;return n.value=t,n}return o(t,e),t.prototype.genCSS=function(e,t){t.add("-"),this.value.genCSS(e,t)},t.prototype.eval=function(e){return e.isMathOn()?new te("*",[new X(-1),this.value]).eval(e):new t(this.value.eval(e))},t}(h);ge.prototype.type="Negative";var ye=function(e){function t(n,i,r,o,s){var a=e.call(this)||this;switch(a.selector=n,a.option=i,a.object_id=t.next_id++,a.parent_ids=[a.object_id],a._index=r,a._fileInfo=o,a.copyVisibilityInfo(s),a.allowRoot=!0,i){case"all":a.allowBefore=!0,a.allowAfter=!0;break;default:a.allowBefore=!1,a.allowAfter=!1}return a.setParent(a.selector,a),a}return o(t,e),t.prototype.accept=function(e){this.selector=e.visit(this.selector)},t.prototype.eval=function(e){return new t(this.selector.eval(e),this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},t.prototype.clone=function(e){return new t(this.selector,this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},t.prototype.findSelfSelectors=function(e){var t,n,i=[];for(t=0;t0&&n.length&&""===n[0].combinator.value&&(n[0].combinator.value=" "),i=i.concat(e[t].elements);this.selfSelectors=[new F(i)],this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo())},t}(h);ye.next_id=0,ye.prototype.type="Extend";var be=function(e){function t(t,n,i){var r=e.call(this)||this;return r.variable=t,r._index=n,r._fileInfo=i,r.allowRoot=!0,r}return o(t,e),t.prototype.eval=function(e){var t,n=new se(this.variable,this.getIndex(),this.fileInfo()).eval(e),i=new R({message:"Could not evaluate variable call "+this.variable});if(!n.ruleset){if(n.rules)t=n;else if(Array.isArray(n))t=new Q("",n);else{if(!Array.isArray(n.value))throw i;t=new Q("",n.value)}n=new Z(t)}if(n.ruleset)return n.callEval(e);throw i},t}(h);be.prototype.type="VariableCall";var we=function(e){function t(t,n,i,r){var o=e.call(this)||this;return o.value=t,o.lookups=n,o._index=i,o._fileInfo=r,o}return o(t,e),t.prototype.eval=function(e){var t,n,i=this.value.eval(e);for(t=0;tthis.params.length)return!1}n=Math.min(o,this.arity);for(var s=0;s0){for(c=!0,a=0;a0)f=2;else if(f=1,p[1]+p[2]>1)throw{type:"Runtime",message:"Ambiguous use of `default()` found when matching for `"+this.format(m)+"`",index:this.getIndex(),filename:this.fileInfo().filename};for(a=0;a=0;s--){var a=o[s];if(a[r?"supportsSync":"supports"](e,t,n,i))return a}return null},e.prototype.addFileManager=function(e){this.fileManagers.push(e)},e.prototype.clearFileManagers=function(){this.fileManagers=[]},e}(),_e=function(){function e(){}return e.prototype.getPath=function(e){var t=e.lastIndexOf("?");return t>0&&(e=e.slice(0,t)),(t=e.lastIndexOf("/"))<0&&(t=e.lastIndexOf("\\")),t<0?"":e.slice(0,t+1)},e.prototype.tryAppendExtension=function(e,t){return/(\.[a-z]*$)|([\?;].*)$/.test(e)?e:e+t},e.prototype.tryAppendLessExtension=function(e){return this.tryAppendExtension(e,".less")},e.prototype.supportsSync=function(){return!1},e.prototype.alwaysMakePathsAbsolute=function(){return!1},e.prototype.isPathAbsolute=function(e){return/^(?:[a-z-]+:|\/|\\|#)/i.test(e)},e.prototype.join=function(e,t){return e?e+t:t},e.prototype.pathDiff=function(e,t){var n,i,r,o,s=this.extractUrlParts(e),a=this.extractUrlParts(t),l="";if(s.hostPart!==a.hostPart)return"";for(i=Math.max(a.directories.length,s.directories.length),n=0;nparseInt(t[n])?-1:1;return 0},e.prototype.versionToString=function(e){for(var t="",n=0;n0;){var e=this.imports[0];if(!e.isReady)return;this.imports=this.imports.slice(1),e.callback.apply(null,e.args)}if(0===this.variableImports.length)break;var t=this.variableImports[0];this.variableImports=this.variableImports.slice(1),t()}}finally{this._currentDepth--}0===this._currentDepth&&this._onSequencerEmpty&&this._onSequencerEmpty()},e}(),Fe=function(e,t){this._visitor=new Re(this),this._importer=e,this._finish=t,this.context=new q.Eval,this.importCount=0,this.onceFileDetectionMap={},this.recursionDetector={},this._sequencer=new Ve(this._onSequencerEmpty.bind(this))};Fe.prototype={isReplacing:!1,run:function(e){try{this._visitor.visit(e)}catch(e){this.error=e}this.isFinished=!0,this._sequencer.tryRun()},_onSequencerEmpty:function(){this.isFinished&&this._finish(this.error)},visitImport:function(e,t){var n=e.options.inline;if(!e.css||n){var i=new q.Eval(this.context,C(this.context.frames)),r=i.frames[0];this.importCount++,e.isVariableImport()?this._sequencer.addVariableImport(this.processImportNode.bind(this,e,i,r)):this.processImportNode(e,i,r)}t.visitDeeper=!1},processImportNode:function(e,t,n){var i,r=e.options.inline;try{i=e.evalForImport(t)}catch(t){t.filename||(t.index=e.getIndex(),t.filename=e.fileInfo().filename),e.css=!0,e.error=t}if(!i||i.css&&!r)this.importCount--,this.isFinished&&this._sequencer.tryRun();else{i.options.multiple&&(t.importMultiple=!0);for(var o=void 0===i.css,s=0;s=0||(a=[u.selfSelectors[0]],(o=f.findMatch(l,a)).length&&(l.hasFoundMatches=!0,l.selfSelectors.forEach((function(e){var t=u.visibilityInfo();s=f.extendSelector(o,a,e,l.isVisible()),(c=new Ie.Extend(u.selector,u.option,0,u.fileInfo(),t)).selfSelectors=s,s[s.length-1].extendList=[c],h.push(c),c.ruleset=u.ruleset,c.parent_ids=c.parent_ids.concat(u.parent_ids,l.parent_ids),u.firstExtendOnThisSelectorPath&&(c.firstExtendOnThisSelectorPath=!0,u.ruleset.paths.push(s))}))));if(h.length){if(this.extendChainCount++,n>100){var p="{unable to calculate}",v="{unable to calculate}";try{p=h[0].selfSelectors[0].toCSS(),v=h[0].selector.toCSS()}catch(e){}throw{message:"extend circular reference detected. One of the circular extends is currently:"+p+":extend("+v+")"}}return h.concat(f.doExtendChaining(h,t,n+1))}return h},e.prototype.visitDeclaration=function(e,t){t.visitDeeper=!1},e.prototype.visitMixinDefinition=function(e,t){t.visitDeeper=!1},e.prototype.visitSelector=function(e,t){t.visitDeeper=!1},e.prototype.visitRuleset=function(e,t){if(!e.root){var n,i,r,o,s=this.allExtendsStack[this.allExtendsStack.length-1],a=[],l=this;for(r=0;r0&&u[l.matched].combinator.value!==s?l=null:l.matched++,l&&(l.finished=l.matched===u.length,l.finished&&!e.allowAfter&&(r+1u&&c>0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[u].elements.slice(c)),c=0,u++),l=o.elements.slice(c,a.index).concat([s]).concat(n.elements.slice(1)),u===a.pathIndex&&r>0?h[h.length-1].elements=h[h.length-1].elements.concat(l):(h=h.concat(t.slice(u,a.pathIndex))).push(new Ie.Selector(l)),u=a.endPathIndex,(c=a.endPathElementIndex)>=t[u].elements.length&&(c=0,u++);return u0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[u].elements.slice(c)),u++),h=(h=h.concat(t.slice(u,t.length))).map((function(e){var t=e.createDerived(e.elements);return i?t.ensureVisibility():t.ensureInvisibility(),t}))},e.prototype.visitMedia=function(e,t){var n=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);n=n.concat(this.doExtendChaining(n,e.allExtends)),this.allExtendsStack.push(n)},e.prototype.visitMediaOut=function(e){var t=this.allExtendsStack.length-1;this.allExtendsStack.length=t},e.prototype.visitAtRule=function(e,t){var n=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);n=n.concat(this.doExtendChaining(n,e.allExtends)),this.allExtendsStack.push(n)},e.prototype.visitAtRuleOut=function(e){var t=this.allExtendsStack.length-1;this.allExtendsStack.length=t},e}(),De=function(){function e(){this.contexts=[[]],this._visitor=new Re(this)}return e.prototype.run=function(e){return this._visitor.visit(e)},e.prototype.visitDeclaration=function(e,t){t.visitDeeper=!1},e.prototype.visitMixinDefinition=function(e,t){t.visitDeeper=!1},e.prototype.visitRuleset=function(e,t){var n,i=this.contexts[this.contexts.length-1],r=[];this.contexts.push(r),e.root||((n=e.selectors)&&(n=n.filter((function(e){return e.getIsOutput()})),e.selectors=n.length?n:n=null,n&&e.joinSelectors(r,i,n)),n||(e.rules=null),e.paths=r)},e.prototype.visitRulesetOut=function(e){this.contexts.length=this.contexts.length-1},e.prototype.visitMedia=function(e,t){var n=this.contexts[this.contexts.length-1];e.rules[0].root=0===n.length||n[0].multiMedia},e.prototype.visitAtRule=function(e,t){var n=this.contexts[this.contexts.length-1];e.rules&&e.rules.length&&(e.rules[0].root=e.isRooted||0===n.length||null)},e}(),Ne=function(){function e(e){this._visitor=new Re(this),this._context=e}return e.prototype.containsSilentNonBlockedChild=function(e){var t;if(!e)return!1;for(var n=0;n0},e.prototype.resolveVisibility=function(e,t){if(!e.blocksVisibility()){if(this.isEmpty(e)&&!this.containsSilentNonBlockedChild(t))return;return e}var n=e.rules[0];if(this.keepOnlyVisibleChilds(n),!this.isEmpty(n))return e.ensureVisibility(),e.removeVisibilityBlock(),e},e.prototype.isVisibleRuleset=function(e){return!!e.firstRoot||!this.isEmpty(e)&&!(!e.root&&!this.hasVisibleSelector(e))},e}(),Be=function(e){this._visitor=new Re(this),this._context=e,this.utils=new Ne(e)};Be.prototype={isReplacing:!0,run:function(e){return this._visitor.visit(e)},visitDeclaration:function(e,t){if(!e.blocksVisibility()&&!e.variable)return e},visitMixinDefinition:function(e,t){e.frames=[]},visitExtend:function(e,t){},visitComment:function(e,t){if(!e.blocksVisibility()&&!e.isSilent(this._context))return e},visitMedia:function(e,t){var n=e.rules[0].rules;return e.accept(this._visitor),t.visitDeeper=!1,this.utils.resolveVisibility(e,n)},visitImport:function(e,t){if(!e.blocksVisibility())return e},visitAtRule:function(e,t){return e.rules&&e.rules.length?this.visitAtRuleWithBody(e,t):this.visitAtRuleWithoutBody(e,t)},visitAnonymous:function(e,t){if(!e.blocksVisibility())return e.accept(this._visitor),e},visitAtRuleWithBody:function(e,t){var n=function(e){var t=e.rules;return function(e){var t=e.rules;return 1===t.length&&(!t[0].paths||0===t[0].paths.length)}(e)?t[0].rules:t}(e);return e.accept(this._visitor),t.visitDeeper=!1,this.utils.isEmpty(e)||this._mergeRules(e.rules[0].rules),this.utils.resolveVisibility(e,n)},visitAtRuleWithoutBody:function(e,t){if(!e.blocksVisibility()){if("@charset"===e.name){if(this.charset){if(e.debugInfo){var n=new Ie.Comment("/* "+e.toCSS(this._context).replace(/\n/g,"")+" */\n");return n.debugInfo=e.debugInfo,this._visitor.visit(n)}return}this.charset=!0}return e}},checkValidNodes:function(e,t){if(e)for(var n=0;n0?e.accept(this._visitor):e.rules=null,t.visitDeeper=!1}return e.rules&&(this._mergeRules(e.rules),this._removeDuplicateRules(e.rules)),this.utils.isVisibleRuleset(e)&&(e.ensureVisibility(),i.splice(0,0,e)),1===i.length?i[0]:i},_compileRulesetPaths:function(e){e.paths&&(e.paths=e.paths.filter((function(e){var t;for(" "===e[0].elements[0].combinator.value&&(e[0].elements[0].combinator=new Ie.Combinator("")),t=0;t=0;i--)if((n=e[i])instanceof Ie.Declaration)if(r[n.name]){(t=r[n.name])instanceof Ie.Declaration&&(t=r[n.name]=[r[n.name].toCSS(this._context)]);var o=n.toCSS(this._context);-1!==t.indexOf(o)?e.splice(i,1):t.push(o)}else r[n.name]=n}},_mergeRules:function(e){if(e){for(var t={},n=[],i=0;i0){var t=e[0],n=[],i=[new Ie.Expression(n)];e.forEach((function(e){"+"===e.merge&&n.length>0&&i.push(new Ie.Expression(n=[])),n.push(e.value),t.important=t.important||e.important})),t.value=new Ie.Value(i)}}))}}};var Ue={Visitor:Re,ImportVisitor:Fe,MarkVisibleSelectorsVisitor:$e,ExtendVisitor:Le,JoinSelectorVisitor:De,ToCSSVisitor:Be},qe=function(){var e,t,n,i,r,o,s,a=[],l={};function u(n){for(var i,a,c,h=l.i,f=t,p=l.i-s,v=l.i+o.length-p,d=l.i+=n,m=e;l.i=0){c={index:l.i,text:m.substr(l.i,y+2-l.i),isLineComment:!1},l.i+=c.text.length-1,l.commentStore.push(c);continue}}break}if(32!==i&&10!==i&&9!==i&&13!==i)break}if(o=o.slice(n+l.i-d+p),s=l.i,!o.length){if(tn||l.i===n&&e&&!i)&&(n=l.i,i=e);var r=a.pop();o=r.current,s=l.i=r.i,t=r.j},l.forget=function(){a.pop()},l.isWhitespace=function(t){var n=l.i+(t||0),i=e.charCodeAt(n);return 32===i||13===i||9===i||10===i},l.$re=function(e){l.i>s&&(o=o.slice(l.i-s),s=l.i);var t=e.exec(o);return t?(u(t[0].length),"string"==typeof t?t:1===t.length?t[0]:t):null},l.$char=function(t){return e.charAt(l.i)!==t?null:(u(1),t)},l.$str=function(t){for(var n=t.length,i=0;ih&&(d=!1)}}while(d);return r||null},l.autoCommentAbsorb=!0,l.commentStore=[],l.finished=!1,l.peek=function(t){if("string"==typeof t){for(var n=0;n57||t<43||47===t||44===t},l.start=function(i,a,c){e=i,l.i=t=s=n=0,r=a?function(e,t){var n,i,r,o,s,a,l,u,c,h=e.length,f=0,p=0,v=[],d=0;function m(t){var n=s-d;n<512&&!t||!n||(v.push(e.slice(d,s+1)),d=s+1)}for(s=0;s=97&&l<=122||l<34))switch(l){case 40:p++,i=s;continue;case 41:if(--p<0)return t("missing opening `(`",s);continue;case 59:p||m();continue;case 123:f++,n=s;continue;case 125:if(--f<0)return t("missing opening `{`",s);f||p||m();continue;case 92:if(s96)){if(u==l){c=1;break}if(92==u){if(s==h-1)return t("unescaped `\\`",s);s++}}if(c)continue;return t("unmatched `"+String.fromCharCode(l)+"`",a);case 47:if(p||s==h-1)continue;if(47==(u=e.charCodeAt(s+1)))for(s+=2;sn&&o>r?"missing closing `}` or `*/`":"missing closing `}`",n):0!==p?t("missing closing `)`",i):(m(!0),v)}(i,c):[i],o=r[0],u(0)},l.end=function(){var t,r=l.i>=e.length;return l.i=e.length-1,furthestChar:e[l.i]}},l},je=function e(t,n,i){var r,o=qe();function s(e,t){throw new R({index:o.i,filename:i.filename,type:t||"Syntax",message:e},n)}function a(e,t){var n=e instanceof Function?e.call(r):o.$re(e);if(n)return n;s(t||("string"==typeof e?"expected '"+e+"' got '"+o.currentChar()+"'":"unexpected token"))}function l(e,t){if(o.$char(e))return e;s(t||"expected '"+e+"' got '"+o.currentChar()+"'")}function u(e){var t=i.filename;return{lineNumber:I(e,o.getInput()).line+1,fileName:t}}return{parserInput:o,imports:n,fileInfo:i,parseNode:function(e,t,i,s,a){var l,u=[],c=o;try{c.start(e,!1,(function(e,t){a({message:e,index:t+i})}));for(var h=0,f=void 0,p=void 0;f=t[h];h++)if(p=c.i,l=r[f]()){try{l._index=p+i,l._fileInfo=s}catch(e){}u.push(l)}else u.push(null);c.end().isFinished?a(null,u):a(!0,null)}catch(e){throw new R({index:e.index+i,message:e.message},n,s.filename)}},parse:function(r,s,a){var l,u,c,h,f=null,p="";if(u=a&&a.globalVars?e.serializeVars(a.globalVars)+"\n":"",c=a&&a.modifyVars?"\n"+e.serializeVars(a.modifyVars):"",t.pluginManager)for(var v=t.pluginManager.getPreProcessors(),d=0;d");return e},args:function(e){var t,n,i,a,l,u,c,h=r.entities,f={args:null,variadic:!1},p=[],v=[],d=[],m=!0;for(o.save();;){if(e)u=r.detachedRuleset()||r.expression();else{if(o.commentStore.length=0,o.$str("...")){f.variadic=!0,o.$char(";")&&!t&&(t=!0),(t?v:d).push({variadic:!0});break}u=h.variable()||h.property()||h.literal()||h.keyword()||this.call(!0)}if(!u||!m)break;a=null,u.throwAwayComments&&u.throwAwayComments(),l=u;var g=null;if(e?u.value&&1==u.value.length&&(g=u.value[0]):g=u,g&&(g instanceof Ie.Variable||g instanceof Ie.Property))if(o.$char(":")){if(p.length>0&&(t&&s("Cannot mix ; and , as delimiter types"),n=!0),!(l=r.detachedRuleset()||r.expression())){if(!e)return o.restore(),f.args=[],f;s("could not understand value for named argument")}a=i=g.name}else if(o.$str("...")){if(!e){f.variadic=!0,o.$char(";")&&!t&&(t=!0),(t?v:d).push({name:u.name,variadic:!0});break}c=!0}else e||(i=a=g.name,l=null);l&&p.push(l),d.push({name:a,value:l,expand:c}),o.$char(",")?m=!0:((m=";"===o.$char(";"))||t)&&(n&&s("Cannot mix ; and , as delimiter types"),t=!0,p.length>1&&(l=new Ie.Value(p)),v.push({name:i,value:l,expand:c}),i=null,p=[],n=!1)}return o.forget(),f.args=t?v:d,f},definition:function(){var e,t,n,i,s=[],l=!1;if(!("."!==o.currentChar()&&"#"!==o.currentChar()||o.peek(/^[^{]*\}/)))if(o.save(),t=o.$re(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/)){e=t[1];var u=this.args(!1);if(s=u.args,l=u.variadic,!o.$char(")"))return void o.restore("Missing closing ')'");if(o.commentStore.length=0,o.$str("when")&&(i=a(r.conditions,"expected condition")),n=r.block())return o.forget(),new Ie.mixin.Definition(e,s,n,i,l);o.restore()}else o.restore()},ruleLookups:function(){var e,t=[];if("["===o.currentChar()){for(;;){if(o.save(),!(e=this.lookupValue())&&""!==e){o.restore();break}t.push(e),o.forget()}return t.length>0?t:void 0}},lookupValue:function(){if(o.save(),o.$char("[")){var e=o.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);if(o.$char("]"))return e||""===e?(o.forget(),e):void o.restore();o.restore()}else o.restore()}},entity:function(){var e=this.entities;return this.comment()||e.literal()||e.variable()||e.url()||e.property()||e.call()||e.keyword()||this.mixin.call(!0)||e.javascript()},end:function(){return o.$char(";")||o.peek("}")},ieAlpha:function(){var e;if(o.$re(/^opacity=/i))return(e=o.$re(/^\d+/))||(e="@{"+(e=a(r.entities.variable,"Could not parse alpha")).name.slice(1)+"}"),l(")"),new Ie.Quoted("","alpha(opacity="+e+")")},element:function(){var e,t,n,r=o.i;if(t=this.combinator(),(e=o.$re(/^(?:\d+\.\d+|\d+)%/)||o.$re(/^(?:[.#]?|:*)(?:[\w-]|[^\x00-\x9f]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/)||o.$char("*")||o.$char("&")||this.attribute()||o.$re(/^\([^&()@]+\)/)||o.$re(/^[\.#:](?=@)/)||this.entities.variableCurly())||(o.save(),o.$char("(")?(n=this.selector(!1))&&o.$char(")")?(e=new Ie.Paren(n),o.forget()):o.restore("Missing closing ')'"):o.forget()),e)return new Ie.Element(t,e,e instanceof Ie.Variable,r,i)},combinator:function(){var e=o.currentChar();if("/"===e){o.save();var t=o.$re(/^\/[a-z]+\//i);if(t)return o.forget(),new Ie.Combinator(t);o.restore()}if(">"===e||"+"===e||"~"===e||"|"===e||"^"===e){for(o.i++,"^"===e&&"^"===o.currentChar()&&(e="^^",o.i++);o.isWhitespace();)o.i++;return new Ie.Combinator(e)}return o.isWhitespace(-1)?new Ie.Combinator(" "):new Ie.Combinator(null)},selector:function(e){var t,n,r,l,u,c,h,f=o.i;for(e=!1!==e;(e&&(n=this.extend())||e&&(c=o.$str("when"))||(l=this.element()))&&(c?h=a(this.conditions,"expected condition"):h?s("CSS guard can only be used at the end of selector"):n?u=u?u.concat(n):n:(u&&s("Extend can only be used at the end of selector"),r=o.currentChar(),t?t.push(l):t=[l],l=null),"{"!==r&&"}"!==r&&";"!==r&&","!==r&&")"!==r););if(t)return new Ie.Selector(t,u,h,f,i);u&&s("Extend must be used to extend a selector, it cannot be used on its own")},selectors:function(){for(var e,t;(e=this.selector())&&(t?t.push(e):t=[e],o.commentStore.length=0,e.condition&&t.length>1&&s("Guards are only currently allowed on a single selector."),o.$char(","));)e.condition&&s("Guards are only currently allowed on a single selector."),o.commentStore.length=0;return t},attribute:function(){if(o.$char("[")){var e,t,n,i=this.entities;return(e=i.variableCurly())||(e=a(/^(?:[_A-Za-z0-9-\*]*\|)?(?:[_A-Za-z0-9-]|\\.)+/)),(n=o.$re(/^[|~*$^]?=/))&&(t=i.quoted()||o.$re(/^[0-9]+%/)||o.$re(/^[\w-]+/)||i.variableCurly()),l("]"),new Ie.Attribute(e,n,t)}},block:function(){var e;if(o.$char("{")&&(e=this.primary())&&o.$char("}"))return e},blockRuleset:function(){var e=this.block();return e&&(e=new Ie.Ruleset(null,e)),e},detachedRuleset:function(){var e,t,n;if(o.save(),!o.$re(/^[.#]\(/)||(t=(e=this.mixin.args(!1)).args,n=e.variadic,o.$char(")"))){var i=this.blockRuleset();if(i)return o.forget(),t?new Ie.mixin.Definition(null,t,i,null,n):new Ie.DetachedRuleset(i);o.restore()}else o.restore()},ruleset:function(){var e,n,i;if(o.save(),t.dumpLineNumbers&&(i=u(o.i)),(e=this.selectors())&&(n=this.block())){o.forget();var r=new Ie.Ruleset(e,n,t.strictImports);return t.dumpLineNumbers&&(r.debugInfo=i),r}o.restore()},declaration:function(){var e,t,n,r,s,a,l=o.i,u=o.currentChar();if("."!==u&&"#"!==u&&"&"!==u&&":"!==u)if(o.save(),e=this.variable()||this.ruleProperty()){if((a="string"==typeof e)&&(t=this.detachedRuleset())&&(n=!0),o.commentStore.length=0,!t){if(s=!a&&e.length>1&&e.pop().value,t=e[0].value&&"--"===e[0].value.slice(0,2)?this.permissiveValue():this.anonymousValue())return o.forget(),new Ie.Declaration(e,t,!1,s,l,i);t||(t=this.value()),t?r=this.important():a&&(t=this.permissiveValue())}if(t&&(this.end()||n))return o.forget(),new Ie.Declaration(e,t,r,s,l,i);o.restore()}else o.restore()},anonymousValue:function(){var e=o.i,t=o.$re(/^([^.#@\$+\/'"*`(;{}-]*);/);if(t)return new Ie.Anonymous(t[1],e)},permissiveValue:function(e){var t,n,r,a,l=e||";",u=o.i,c=[];function h(){var e=o.currentChar();return"string"==typeof l?e===l:l.test(e)}if(!h()){a=[];do{((n=this.comment())||(n=this.entity()))&&a.push(n)}while(n);if(r=h(),a.length>0){if(a=new Ie.Expression(a),r)return a;c.push(a)," "===o.prevChar()&&c.push(new Ie.Anonymous(" ",u))}if(o.save(),a=o.$parseUntil(l)){if("string"==typeof a&&s("Expected '"+a+"'","Parse"),1===a.length&&" "===a[0])return o.forget(),new Ie.Anonymous("",u);var f=void 0;for(t=0;t0)return new Ie.Expression(r)},mediaFeatures:function(){var e,t=this.entities,n=[];do{if(e=this.mediaFeature()){if(n.push(e),!o.$char(","))break}else if((e=t.variable()||t.mixinLookup())&&(n.push(e),!o.$char(",")))break}while(e);return n.length>0?n:null},media:function(){var e,n,r,a,l=o.i;if(t.dumpLineNumbers&&(a=u(l)),o.save(),o.$str("@media"))return e=this.mediaFeatures(),(n=this.block())||s("media definitions require block statements after any features"),o.forget(),r=new Ie.Media(n,e,l,i),t.dumpLineNumbers&&(r.debugInfo=a),r;o.restore()},plugin:function(){var e,t,n,r=o.i;if(o.$re(/^@plugin?\s+/)){if(n=(t=this.pluginArgs())?{pluginArgs:t,isPlugin:!0}:{isPlugin:!0},e=this.entities.quoted()||this.entities.url())return o.$char(";")||(o.i=r,s("missing semi-colon on @plugin")),new Ie.Import(e,null,n,r,i);o.i=r,s("malformed @plugin statement")}},pluginArgs:function(){if(o.save(),!o.$char("("))return o.restore(),null;var e=o.$re(/^\s*([^\);]+)\)\s*/);return e[1]?(o.forget(),e[1].trim()):(o.restore(),null)},atrule:function(){var e,n,r,a,l,c,h,f=o.i,p=!0,v=!0;if("@"===o.currentChar()){if(n=this.import()||this.plugin()||this.media())return n;if(o.save(),e=o.$re(/^@[a-z-]+/)){switch(a=e,"-"==e.charAt(1)&&e.indexOf("-",2)>0&&(a="@"+e.slice(e.indexOf("-",2)+1)),a){case"@charset":l=!0,p=!1;break;case"@namespace":c=!0,p=!1;break;case"@keyframes":case"@counter-style":l=!0;break;case"@document":case"@supports":h=!0,v=!1;break;default:h=!0}if(o.commentStore.length=0,l?(n=this.entity())||s("expected "+e+" identifier"):c?(n=this.expression())||s("expected "+e+" expression"):h&&(n=this.permissiveValue(/^[{;]/),p="{"===o.currentChar(),n?n.value||(n=null):p||";"===o.currentChar()||s(e+" rule is missing block or ending semi-colon")),p&&(r=this.blockRuleset()),r||!p&&n&&o.$char(";"))return o.forget(),new Ie.AtRule(e,n,r,f,i,t.dumpLineNumbers?u(f):null,v);o.restore("at-rule options not recognised")}}},value:function(){var e,t=[],n=o.i;do{if((e=this.expression())&&(t.push(e),!o.$char(",")))break}while(e);if(t.length>0)return new Ie.Value(t,n)},important:function(){if("!"===o.currentChar())return o.$re(/^! *important/)},sub:function(){var e,t;if(o.save(),o.$char("("))return(e=this.addition())&&o.$char(")")?(o.forget(),(t=new Ie.Expression([e])).parens=!0,t):void o.restore("Expected ')'");o.restore()},multiplication:function(){var e,t,n,i,r;if(e=this.operand()){for(r=o.isWhitespace(-1);!o.peek(/^\/[*\/]/);){if(o.save(),!(n=o.$char("/")||o.$char("*")||o.$str("./"))){o.forget();break}if(!(t=this.operand())){o.restore();break}o.forget(),e.parensInOp=!0,t.parensInOp=!0,i=new Ie.Operation(n,[i||e,t],r),r=o.isWhitespace(-1)}return i||e}},addition:function(){var e,t,n,i,r;if(e=this.multiplication()){for(r=o.isWhitespace(-1);(n=o.$re(/^[-+]\s+/)||!r&&(o.$char("+")||o.$char("-")))&&(t=this.multiplication());)e.parensInOp=!0,t.parensInOp=!0,i=new Ie.Operation(n,[i||e,t],r),r=o.isWhitespace(-1);return i||e}},conditions:function(){var e,t,n,i=o.i;if(e=this.condition(!0)){for(;o.peek(/^,\s*(not\s*)?\(/)&&o.$char(",")&&(t=this.condition(!0));)n=new Ie.Condition("or",n||e,t,i);return n||e}},condition:function(e){var t,n,i;if(t=this.conditionAnd(e)){if(n=o.$str("or")){if(!(i=this.condition(e)))return;t=new Ie.Condition(n,t,i)}return t}},conditionAnd:function(e){var t,n,i,r,s=this;if(t=(r=s.negatedCondition(e)||s.parenthesisCondition(e))||e?r:s.atomicCondition(e)){if(n=o.$str("and")){if(!(i=this.conditionAnd(e)))return;t=new Ie.Condition(n,t,i)}return t}},negatedCondition:function(e){if(o.$str("not")){var t=this.parenthesisCondition(e);return t&&(t.negate=!t.negate),t}},parenthesisCondition:function(e){var t;if(o.save(),o.$str("(")){if(t=function(t){var n;if(o.save(),n=t.condition(e)){if(o.$char(")"))return o.forget(),n;o.restore()}else o.restore()}(this))return o.forget(),t;if(t=this.atomicCondition(e)){if(o.$char(")"))return o.forget(),t;o.restore("expected ')' got '"+o.currentChar()+"'")}else o.restore()}else o.restore()},atomicCondition:function(e){var t,n,i,r,a=this.entities,l=o.i;function u(){return this.addition()||a.keyword()||a.quoted()||a.mixinLookup()}if(t=(u=u.bind(this))())return o.$char(">")?r=o.$char("=")?">=":">":o.$char("<")?r=o.$char("=")?"<=":"<":o.$char("=")&&(r=o.$char(">")?"=>":o.$char("<")?"=<":"="),r?(n=u())?i=new Ie.Condition(r,t,n,l,!1):s("expected expression"):i=new Ie.Condition("=",t,new Ie.Keyword("true"),l,!1),i},operand:function(){var e,t=this.entities;o.peek(/^-[@\$\(]/)&&(e=o.$char("-"));var n=this.sub()||t.dimension()||t.color()||t.variable()||t.property()||t.call()||t.quoted(!0)||t.colorKeyword()||t.mixinLookup();return e&&(n.parensInOp=!0,n=new Ie.Negative(n)),n},expression:function(){var e,t,n=[],i=o.i;do{(e=this.comment())?n.push(e):((e=this.addition()||this.entity())instanceof Ie.Comment&&(e=null),e&&(n.push(e),o.peek(/^\/[\/*]/)||(t=o.$char("/"))&&n.push(new Ie.Anonymous(t,i))))}while(e);if(n.length>0)return new Ie.Expression(n)},property:function(){var e=o.$re(/^(\*?-?[_a-zA-Z0-9-]+)\s*:/);if(e)return e[1]},ruleProperty:function(){var e,t,n=[],r=[];o.save();var s=o.$re(/^([_a-zA-Z0-9-]+)\s*:/);if(s)return n=[new Ie.Keyword(s[1])],o.forget(),n;function a(e){var t=o.i,i=o.$re(e);if(i)return r.push(t),n.push(i[1])}for(a(/^(\*?)/);a(/^((?:[\w-]+)|(?:[@\$]\{[\w-]+\}))/););if(n.length>1&&a(/^((?:\+_|\+)?)\s*:/)){for(o.forget(),""===n[0]&&(n.shift(),r.shift()),t=0;t1?e-1:e)<1?r+(o-r)*e*6:2*e<1?o:3*e<2?r+(o-r)*(2/3-e)*6:r}e=Ke(e)%360/360,t=We(Ke(t)),n=We(Ke(n)),i=We(Ke(i)),r=2*n-(o=n<=.5?n*(t+1):n+t-n*t);var a=[255*s(e+1/3),255*s(e),255*s(e-1/3)];return i=Ke(i),new f(a,i,"hsla")}catch(e){}},hsv:function(e,t,n){return ze.hsva(e,t,n,1)},hsva:function(e,t,n,i){var r,o;e=Ke(e)%360/360*360,t=Ke(t),n=Ke(n),i=Ke(i);var s=[n,n*(1-t),n*(1-(o=e/60-(r=Math.floor(e/60%6)))*t),n*(1-(1-o)*t)],a=[[0,3,1],[2,0,1],[1,0,3],[1,2,0],[3,1,0],[0,1,2]];return ze.rgba(255*s[a[r][0]],255*s[a[r][1]],255*s[a[r][2]],i)},hue:function(e){return new X(He(e).h)},saturation:function(e){return new X(100*He(e).s,"%")},lightness:function(e){return new X(100*He(e).l,"%")},hsvhue:function(e){return new X(Qe(e).h)},hsvsaturation:function(e){return new X(100*Qe(e).s,"%")},hsvvalue:function(e){return new X(100*Qe(e).v,"%")},red:function(e){return new X(e.rgb[0])},green:function(e){return new X(e.rgb[1])},blue:function(e){return new X(e.rgb[2])},alpha:function(e){return new X(He(e).a)},luma:function(e){return new X(e.luma()*e.alpha*100,"%")},luminance:function(e){var t=.2126*e.rgb[0]/255+.7152*e.rgb[1]/255+.0722*e.rgb[2]/255;return new X(t*e.alpha*100,"%")},saturate:function(e,t,n){if(!e.rgb)return null;var i=He(e);return void 0!==n&&"relative"===n.value?i.s+=i.s*t.value/100:i.s+=t.value/100,i.s=We(i.s),Je(e,i)},desaturate:function(e,t,n){var i=He(e);return void 0!==n&&"relative"===n.value?i.s-=i.s*t.value/100:i.s-=t.value/100,i.s=We(i.s),Je(e,i)},lighten:function(e,t,n){var i=He(e);return void 0!==n&&"relative"===n.value?i.l+=i.l*t.value/100:i.l+=t.value/100,i.l=We(i.l),Je(e,i)},darken:function(e,t,n){var i=He(e);return void 0!==n&&"relative"===n.value?i.l-=i.l*t.value/100:i.l-=t.value/100,i.l=We(i.l),Je(e,i)},fadein:function(e,t,n){var i=He(e);return void 0!==n&&"relative"===n.value?i.a+=i.a*t.value/100:i.a+=t.value/100,i.a=We(i.a),Je(e,i)},fadeout:function(e,t,n){var i=He(e);return void 0!==n&&"relative"===n.value?i.a-=i.a*t.value/100:i.a-=t.value/100,i.a=We(i.a),Je(e,i)},fade:function(e,t){var n=He(e);return n.a=t.value/100,n.a=We(n.a),Je(e,n)},spin:function(e,t){var n=He(e),i=(n.h+t.value)%360;return n.h=i<0?360+i:i,Je(e,n)},mix:function(e,t,n){n||(n=new X(50));var i=n.value/100,r=2*i-1,o=He(e).a-He(t).a,s=((r*o==-1?r:(r+o)/(1+r*o))+1)/2,a=1-s,l=[e.rgb[0]*s+t.rgb[0]*a,e.rgb[1]*s+t.rgb[1]*a,e.rgb[2]*s+t.rgb[2]*a],u=e.alpha*i+t.alpha*(1-i);return new f(l,u)},greyscale:function(e){return ze.desaturate(e,new X(100))},contrast:function(e,t,n,i){if(!e.rgb)return null;if(void 0===n&&(n=ze.rgba(255,255,255,1)),void 0===t&&(t=ze.rgba(0,0,0,1)),t.luma()>n.luma()){var r=n;n=t,t=r}return i=void 0===i?.43:Ke(i),e.luma().5&&(i=1,n=e>.25?Math.sqrt(e):((16*e-12)*e+4)*e),e-(1-2*t)*i*(n-e)},hardlight:function(e,t){return Xe.overlay(t,e)},difference:function(e,t){return Math.abs(e-t)},exclusion:function(e,t){return e+t-2*e*t},average:function(e,t){return(e+t)/2},negation:function(e,t){return 1-Math.abs(e+t-1)}};for(var et in Xe)Xe.hasOwnProperty(et)&&(Ye[et]=Ye.bind(null,Xe[et]));var tt=function(e){return Array.isArray(e.value)?e.value:Array(e)},nt={_SELF:function(e){return e},extract:function(e,t){return t=t.value-1,tt(e)[t]},length:function(e){return new X(tt(e).length)},range:function(e,t,n){var i,r,o=1,s=[];t?(r=t,i=e.value,n&&(o=n.value)):(i=1,r=e);for(var a=i;a<=r.value;a+=o)s.push(new X(a,r.unit));return new ie(s)},each:function(e,t){var n,i,r=[];i=!e.value||e instanceof ue?e.ruleset?e.ruleset.rules:e.rules?e.rules:Array.isArray(e)?e:[e]:Array.isArray(e.value)?e.value:[e.value];var o="@value",s="@key",a="@index";t.params?(o=t.params[0]&&t.params[0].name,s=t.params[1]&&t.params[1].name,a=t.params[2]&&t.params[2].name,t=t.rules):t=t.ruleset;for(var l=0;ls.value)&&(c[i]=r);else{if(void 0!==l&&a!==l)throw{type:"Argument",message:"incompatible types"};h[a]=c.length,c.push(r)}else Array.isArray(t[n].value)&&Array.prototype.push.apply(t,Array.prototype.slice.call(t[n].value));return 1==c.length?c[0]:(t=c.map((function(e){return e.toCSS(this.context)})).join(this.context.compress?",":", "),new L((e?"min":"max")+"("+t+")"))},lt={min:function(){for(var e=[],t=0;t",r=0;r";return i+="',i=encodeURIComponent(i),new ce(new ue("'"+(i="data:image/svg+xml,"+i)+"'",i,!1,this.index,this.currentFileInfo),this.index,this.currentFileInfo)}}),J.addMultiple(ft),t},vt=function(e,t){var n;void 0===t&&(t={});var i=t.variables,r=new q.Eval(t);"object"!=typeof i||Array.isArray(i)||(i=Object.keys(i).map((function(e){var t=i[e];return t instanceof Ie.Value||(t instanceof Ie.Expression||(t=new Ie.Expression([t])),t=new Ie.Value([t])),new Ie.Declaration("@"+e,t,!1,null,0)})),r.frames=[new Ie.Ruleset(null,i)]);var o,s,a=[new Ue.JoinSelectorVisitor,new Ue.MarkVisibleSelectorsVisitor(!0),new Ue.ExtendVisitor,new Ue.ToCSSVisitor({compress:Boolean(t.compress)})],l=[];if(t.pluginManager){s=t.pluginManager.visitor();for(var u=0;u<2;u++)for(s.first();o=s.get();)o.isPreEvalVisitor?0!==u&&-1!==l.indexOf(o)||(l.push(o),o.run(e)):0!==u&&-1!==a.indexOf(o)||(o.isPreVisitor?a.unshift(o):a.push(o))}n=e.eval(r);for(u=0;u=t);n++);this.preProcessors.splice(n,0,{preProcessor:e,priority:t})},e.prototype.addPostProcessor=function(e,t){var n;for(n=0;n=t);n++);this.postProcessors.splice(n,0,{postProcessor:e,priority:t})},e.prototype.addFileManager=function(e){this.fileManagers.push(e)},e.prototype.getPreProcessors=function(){for(var e=[],t=0;t0){var i=void 0,r=JSON.stringify(this._sourceMapGenerator.toJSON());this.sourceMapURL?i=this.sourceMapURL:this._sourceMapFilename&&(i=this._sourceMapFilename),this.sourceMapURL=i,this.sourceMap=r}return this._css.join("")},t}()}(e=new ke(e,t)),r=function(e,t){return function(){function n(e){this.options=e}return n.prototype.toCSS=function(t,n,i){var r=new e({contentsIgnoredCharsMap:i.contentsIgnoredChars,rootNode:t,contentsMap:i.contents,sourceMapFilename:this.options.sourceMapFilename,sourceMapURL:this.options.sourceMapURL,outputFilename:this.options.sourceMapOutputFilename,sourceMapBasepath:this.options.sourceMapBasepath,sourceMapRootpath:this.options.sourceMapRootpath,outputSourceFiles:this.options.outputSourceFiles,sourceMapGenerator:this.options.sourceMapGenerator,sourceMapFileInline:this.options.sourceMapFileInline,disableSourcemapAnnotation:this.options.disableSourcemapAnnotation}),o=r.toCSS(n);return this.sourceMap=r.sourceMap,this.sourceMapURL=r.sourceMapURL,this.options.sourceMapInputFilename&&(this.sourceMapInputFilename=r.normalizeFilename(this.options.sourceMapInputFilename)),void 0!==this.options.sourceMapBasepath&&void 0!==this.sourceMapURL&&(this.sourceMapURL=r.removeBasepath(this.sourceMapURL)),o+this.getCSSAppendage()},n.prototype.getCSSAppendage=function(){var e=this.sourceMapURL;if(this.options.sourceMapFileInline){if(void 0===this.sourceMap)return"";e="data:application/json;base64,"+t.encodeBase64(this.sourceMap)}return this.options.disableSourcemapAnnotation?"":e?"/*# sourceMappingURL="+e+" */":""},n.prototype.getExternalSourceMap=function(){return this.sourceMap},n.prototype.setExternalSourceMap=function(e){this.sourceMap=e},n.prototype.isInline=function(){return this.options.sourceMapFileInline},n.prototype.getSourceMapURL=function(){return this.sourceMapURL},n.prototype.getOutputFilename=function(){return this.options.sourceMapOutputFilename},n.prototype.getInputFilename=function(){return this.sourceMapInputFilename},n}()}(i,e),o=function(e){return function(){function t(e,t){this.root=e,this.imports=t}return t.prototype.toCSS=function(t){var n,i,r={};try{n=vt(this.root,t)}catch(e){throw new R(e,this.imports)}try{var o=Boolean(t.compress);o&&Ce.warn("The compress option has been deprecated. We recommend you use a dedicated css minifier, for instance see less-plugin-clean-css.");var s={compress:o,dumpLineNumbers:t.dumpLineNumbers,strictUnits:Boolean(t.strictUnits),numPrecision:8};t.sourceMap?(i=new e(t.sourceMap),r.css=i.toCSS(n,s,this.imports)):r.css=n.toCSS(s)}catch(e){throw new R(e,this.imports)}if(t.pluginManager)for(var a=t.pluginManager.getPostProcessors(),l=0;l=200&&t.status<300?n(t.responseText,t.getResponseHeader("Last-Modified")):"function"==typeof i&&i(t.status,e)}"function"==typeof r.overrideMimeType&&r.overrideMimeType("text/css"),yt.debug("XHR: Getting '"+e+"'"),r.open("GET",e,o),r.setRequestHeader("Accept",t||"text/x-less, text/css; q=0.9, */*; q=0.5"),r.send(null),gt.isFileProtocol&&!gt.fileAsync?0===r.status||r.status>=200&&r.status<300?n(r.responseText):i(r.status,e):o?r.onreadystatechange=function(){4==r.readyState&&s(r,n,i)}:s(r,n,i)},t.prototype.supports=function(){return!0},t.prototype.clearFileCache=function(){wt={}},t.prototype.loadFile=function(e,t,n,i){t&&!this.isPathAbsolute(e)&&(e=t+e),e=n.ext?this.tryAppendExtension(e,n.ext):e,n=n||{};var r=this.extractUrlParts(e,window.location.href).url,o=this;return new Promise((function(e,t){if(n.useFileCache&&wt[r])try{var i=wt[r];return e({contents:i,filename:r,webInfo:{lastModified:new Date}})}catch(e){return t({filename:r,message:"Error loading file "+r+" error was "+e.message})}o.doXHR(r,n.mime,(function(t,n){wt[r]=t,e({contents:t,filename:r,webInfo:{lastModified:n}})}),(function(e,n){t({type:"File",message:"'"+n+"' wasn't found ("+e+")",href:r})}))}))},t}(_e),St=function(e,t){return gt=e,yt=t,xt},It=function(e){function t(t){var n=e.call(this)||this;return n.less=t,n}return o(t,e),t.prototype.loadPlugin=function(e,t,n,i,r){return new Promise((function(o,s){r.loadFile(e,t,n,i).then(o).catch(s)}))},t}(Ae),Ct=function(t,i,r){return{add:function(o,s){r.errorReporting&&"html"!==r.errorReporting?"console"===r.errorReporting?function(e,t){var n=e.filename||t,o=[],s=(e.type||"Syntax")+"Error: "+(e.message||"There is an error in your .less file")+" in "+n,a=function(e,t,n){void 0!==e.extract[t]&&o.push("{line} {content}".replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,n).replace(/\{content\}/,e.extract[t]))};e.line&&(a(e,0,""),a(e,1,"line"),a(e,2,""),s+=" on line "+e.line+", column "+(e.column+1)+":\n"+o.join("\n")),e.stack&&(e.extract||r.logLevel>=4)&&(s+="\nStack Trace\n"+e.stack),i.logger.error(s)}(o,s):"function"==typeof r.errorReporting&&r.errorReporting("add",o,s):function(i,o){var s,a,l="less-error-message:"+e(o||""),u=t.document.createElement("div"),c=[],h=i.filename||o,f=h.match(/([^\/]+(\?.*)?)$/)[1];u.id=l,u.className="less-error-message",a="

    "+(i.type||"Syntax")+"Error: "+(i.message||"There is an error in your .less file")+'

    in '+f+" ";var p=function(e,t,n){void 0!==e.extract[t]&&c.push('

  • {content}
  • '.replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,n).replace(/\{content\}/,e.extract[t]))};i.line&&(p(i,0,""),p(i,1,"line"),p(i,2,""),a+="on line "+i.line+", column "+(i.column+1)+":

      "+c.join("")+"
    "),i.stack&&(i.extract||r.logLevel>=4)&&(a+="
    Stack Trace
    "+i.stack.split("\n").slice(1).join("
    ")),u.innerHTML=a,n(t.document,[".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #dd6666;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.line {","color: #ff0000;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),u.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),"development"===r.env&&(s=setInterval((function(){var e=t.document,n=e.body;n&&(e.getElementById(l)?n.replaceChild(u,e.getElementById(l)):n.insertBefore(u,n.firstChild),clearInterval(s))}),10))}(o,s)},remove:function(n){r.errorReporting&&"html"!==r.errorReporting?"console"===r.errorReporting||"function"==typeof r.errorReporting&&r.errorReporting("remove",n):function(n){var i=t.document.getElementById("less-error-message:"+e(n));i&&i.parentNode.removeChild(i)}(n)}}},kt={javascriptEnabled:!1,depends:!1,compress:!1,lint:!1,paths:[],color:!0,strictImports:!1,insecure:!1,rootpath:"",rewriteUrls:!1,math:0,strictUnits:!1,globalVars:null,modifyVars:null,urlArgs:""};if(window.less)for(var _t in window.less)window.less.hasOwnProperty(_t)&&(kt[_t]=window.less[_t]);!function(e,n){t(n,i(e)),void 0===n.isFileProtocol&&(n.isFileProtocol=/^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(e.location.protocol)),n.async=n.async||!1,n.fileAsync=n.fileAsync||!1,n.poll=n.poll||(n.isFileProtocol?1e3:1500),n.env=n.env||("127.0.0.1"==e.location.hostname||"0.0.0.0"==e.location.hostname||"localhost"==e.location.hostname||e.location.port&&e.location.port.length>0||n.isFileProtocol?"development":"production");var r=/!dumpLineNumbers:(comments|mediaquery|all)/.exec(e.location.hash);r&&(n.dumpLineNumbers=r[1]),void 0===n.useFileCache&&(n.useFileCache=!0),void 0===n.onReady&&(n.onReady=!0),n.relativeUrls&&(n.rewriteUrls="all")}(window,kt),kt.plugins=kt.plugins||[],window.LESS_PLUGINS&&(kt.plugins=kt.plugins.concat(window.LESS_PLUGINS));var At,Mt,Pt,Et=function(e,i){var r=e.document,o=bt();o.options=i;var s=o.environment,a=St(i,o.logger),l=new a;s.addFileManager(l),o.FileManager=a,o.PluginLoader=It,function(e,t){t.logLevel=void 0!==t.logLevel?t.logLevel:"development"===t.env?3:1,t.loggers||(t.loggers=[{debug:function(e){t.logLevel>=4&&console.log(e)},info:function(e){t.logLevel>=3&&console.log(e)},warn:function(e){t.logLevel>=2&&console.warn(e)},error:function(e){t.logLevel>=1&&console.error(e)}}]);for(var n=0;n0&&l.childNodes.length>0&&s.firstChild.nodeValue===l.firstChild.nodeValue);var u=t.getElementsByTagName("head")[0];if(null===s||!1===a){var c=i&&i.nextSibling||null;c?c.parentNode.insertBefore(l,c):u.appendChild(l)}if(s&&!1===a&&s.parentNode.removeChild(s),l.styleSheet)try{l.styleSheet.cssText=n}catch(e){throw new Error("Couldn't reassign styleSheet.cssText.")}},i=function(e){var t,n=e.document;return n.currentScript||(t=n.getElementsByTagName("script"))[t.length-1]},r={error:function(e){this._fireEvent("error",e)},warn:function(e){this._fireEvent("warn",e)},info:function(e){this._fireEvent("info",e)},debug:function(e){this._fireEvent("debug",e)},addListener:function(e){this._listeners.push(e)},removeListener:function(e){for(var t=0;t=0;a--){var l=s[a];if(l[o?"supportsSync":"supports"](e,t,n,i))return l}return null},e.prototype.addFileManager=function(e){this.fileManagers.push(e)},e.prototype.clearFileManagers=function(){this.fileManagers=[]},e}(),s={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",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:"#ff00ff",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:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",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:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",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:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},a={length:{m:1,cm:.01,mm:.001,in:.0254,px:.0254/96,pt:.0254/72,pc:.0254/72*12},duration:{s:1,ms:.001},angle:{rad:1/(2*Math.PI),deg:1/360,grad:1/400,turn:1}},l={colors:s,unitConversions:a},u=function(){function e(){this.parent=null,this.visibilityBlocks=void 0,this.nodeVisible=void 0,this.rootNode=null,this.parsed=null;var e=this;Object.defineProperty(this,"currentFileInfo",{get:function(){return e.fileInfo()}}),Object.defineProperty(this,"index",{get:function(){return e.getIndex()}})}return e.prototype.setParent=function(t,n){function i(t){t&&t instanceof e&&(t.parent=n)}Array.isArray(t)?t.forEach(i):i(t)},e.prototype.getIndex=function(){return this._index||this.parent&&this.parent.getIndex()||0},e.prototype.fileInfo=function(){return this._fileInfo||this.parent&&this.parent.fileInfo()||{}},e.prototype.isRulesetLike=function(){return!1},e.prototype.toCSS=function(e){var t=[];return this.genCSS(e,{add:function(e,n,i){t.push(e)},isEmpty:function(){return 0===t.length}}),t.join("")},e.prototype.genCSS=function(e,t){t.add(this.value)},e.prototype.accept=function(e){this.value=e.visit(this.value)},e.prototype.eval=function(){return this},e.prototype._operate=function(e,t,n,i){switch(t){case"+":return n+i;case"-":return n-i;case"*":return n*i;case"/":return n/i}},e.prototype.fround=function(e,t){var n=e&&e.numPrecision;return n?Number((t+2e-16).toFixed(n)):t},e.compare=function(t,n){if(t.compare&&"Quoted"!==n.type&&"Anonymous"!==n.type)return t.compare(n);if(n.compare)return-n.compare(t);if(t.type===n.type){if(t=t.value,n=n.value,!Array.isArray(t))return t===n?0:void 0;if(t.length===n.length){for(var i=0;it?1:void 0},e.prototype.blocksVisibility=function(){return null==this.visibilityBlocks&&(this.visibilityBlocks=0),0!==this.visibilityBlocks},e.prototype.addVisibilityBlock=function(){null==this.visibilityBlocks&&(this.visibilityBlocks=0),this.visibilityBlocks=this.visibilityBlocks+1},e.prototype.removeVisibilityBlock=function(){null==this.visibilityBlocks&&(this.visibilityBlocks=0),this.visibilityBlocks=this.visibilityBlocks-1},e.prototype.ensureVisibility=function(){this.nodeVisible=!0},e.prototype.ensureInvisibility=function(){this.nodeVisible=!1},e.prototype.isVisible=function(){return this.nodeVisible},e.prototype.visibilityInfo=function(){return{visibilityBlocks:this.visibilityBlocks,nodeVisible:this.nodeVisible}},e.prototype.copyVisibilityInfo=function(e){e&&(this.visibilityBlocks=e.visibilityBlocks,this.nodeVisible=e.nodeVisible)},e}(),c=function(e,t){return(c=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};function h(e,t){function n(){this.constructor=e}c(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var f=function(){return(f=Object.assign||function(e){for(var t,n=1,i=arguments.length;n=6?(r.rgb=[],t.match(/.{2}/g).map((function(e,t){t<3?o.rgb.push(parseInt(e,16)):o.alpha=parseInt(e,16)/255}))):(r.rgb=[],t.split("").map((function(e,t){t<3?o.rgb.push(parseInt(e+e,16)):o.alpha=parseInt(e+e,16)/255}))),r.alpha=r.alpha||("number"==typeof n?n:1),void 0!==i&&(r.value=i),r}return h(t,e),t.prototype.luma=function(){var e=this.rgb[0]/255,t=this.rgb[1]/255,n=this.rgb[2]/255;return.2126*(e=e<=.03928?e/12.92:Math.pow((e+.055)/1.055,2.4))+.7152*(t=t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4))+.0722*(n=n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4))},t.prototype.genCSS=function(e,t){t.add(this.toCSS(e))},t.prototype.toCSS=function(e,t){var n,i,r,o=e&&e.compress&&!t,s=[];if(i=this.fround(e,this.alpha),this.value)if(0===this.value.indexOf("rgb"))i<1&&(r="rgba");else{if(0!==this.value.indexOf("hsl"))return this.value;r=i<1?"hsla":"hsl"}else i<1&&(r="rgba");switch(r){case"rgba":s=this.rgb.map((function(e){return v(Math.round(e),255)})).concat(v(i,1));break;case"hsla":s.push(v(i,1));case"hsl":n=this.toHSL(),s=[this.fround(e,n.h),this.fround(e,100*n.s)+"%",this.fround(e,100*n.l)+"%"].concat(s)}if(r)return r+"("+s.join(","+(o?"":" "))+")";if(n=this.toRGB(),o){var a=n.split("");a[1]===a[2]&&a[3]===a[4]&&a[5]===a[6]&&(n="#"+a[1]+a[3]+a[5])}return n},t.prototype.operate=function(e,n,i){for(var r=new Array(3),o=this.alpha*(1-i.alpha)+i.alpha,s=0;s<3;s++)r[s]=this._operate(e,n,this.rgb[s],i.rgb[s]);return new t(r,o)},t.prototype.toRGB=function(){return d(this.rgb)},t.prototype.toHSL=function(){var e,t,n=this.rgb[0]/255,i=this.rgb[1]/255,r=this.rgb[2]/255,o=this.alpha,s=Math.max(n,i,r),a=Math.min(n,i,r),l=(s+a)/2,u=s-a;if(s===a)e=t=0;else{switch(t=l>.5?u/(2-s-a):u/(s+a),s){case n:e=(i-r)/u+(i=0&&"\n"!==t.charAt(n);)r++;return"number"==typeof e&&(i=(t.slice(0,e).match(/\n/g)||"").length),{line:i,column:r}}function k(e){var t,n=e.length,i=new Array(n);for(t=0;t|Function):(\d+):(\d+)/,V=function(e,t,n){Error.call(this);var i=e.filename||n;if(this.message=e.message,this.stack=e.stack,t&&i){var r=t.contents[i],o=C(e.index,r),s=o.line,a=o.column,l=e.call&&C(e.call,r).line,u=r?r.split("\n"):"";if(this.type=e.type||"Syntax",this.filename=i,this.index=e.index,this.line="number"==typeof s?s+1:null,this.column=a,!this.line&&this.stack){var c=this.stack.match(R),h=new Function("a","throw new Error()"),f=0;try{h()}catch(e){var p=e.stack.match(R);f=1-(s=parseInt(p[2]))}c&&(c[2]&&(this.line=parseInt(c[2])+f),c[3]&&(this.column=parseInt(c[3])))}this.callLine=l+1,this.callExtract=u[l],this.extract=[u[this.line-2],u[this.line-1],u[this.line]]}};if(void 0===Object.create){var F=function(){};F.prototype=Error.prototype,V.prototype=new F}else V.prototype=Object.create(Error.prototype);V.prototype.constructor=V,V.prototype.toString=function(e){e=e||{};var t="",n=this.extract||[],i=[],r=function(e){return e};if(e.stylize){var o=typeof e.stylize;if("function"!==o)throw Error("options.stylize should be a function, got a "+o+"!");r=e.stylize}if(null!==this.line){if("string"==typeof n[0]&&i.push(r(this.line-1+" "+n[0],"grey")),"string"==typeof n[1]){var s=this.line+" ";n[1]&&(s+=n[1].slice(0,this.column)+r(r(r(n[1].substr(this.column,1),"bold")+n[1].slice(this.column+1),"red"),"inverse")),i.push(s)}"string"==typeof n[2]&&i.push(r(this.line+1+" "+n[2],"grey")),i=i.join("\n")+r("","reset")+"\n"}return t+=r(this.type+"Error: "+this.message,"red"),this.filename&&(t+=r(" in ","red")+this.filename),this.line&&(t+=r(" on line "+this.line+", column "+(this.column+1)+":","grey")),t+="\n"+i,this.callLine&&(t+=r("from ","red")+(this.filename||"")+"/n",t+=r(this.callLine,"grey")+" "+this.callExtract+"/n"),t};var $=function(e){function t(t,n,i,r,o,s){var a=e.call(this)||this;return a.extendList=n,a.condition=i,a.evaldCondition=!i,a._index=r,a._fileInfo=o,a.elements=a.getElements(t),a.mixinElements_=void 0,a.copyVisibilityInfo(s),a.setParent(a.elements,a),a}return h(t,e),t.prototype.accept=function(e){this.elements&&(this.elements=e.visitArray(this.elements)),this.extendList&&(this.extendList=e.visitArray(this.extendList)),this.condition&&(this.condition=e.visit(this.condition))},t.prototype.createDerived=function(e,n,i){var r=new t(e=this.getElements(e),n||this.extendList,null,this.getIndex(),this.fileInfo(),this.visibilityInfo());return r.evaldCondition=null!=i?i:this.evaldCondition,r.mediaEmpty=this.mediaEmpty,r},t.prototype.getElements=function(e){return e?("string"==typeof e&&this.parse.parseNode(e,["selector"],this._index,this._fileInfo,(function(t,n){if(t)throw new V({index:t.index,message:t.message},this.parse.imports,this._fileInfo.filename);e=n[0].elements})),e):[new b("","&",!1,this._index,this._fileInfo)]},t.prototype.createEmptySelectors=function(){var e=[new t([new b("","&",!1,this._index,this._fileInfo)],null,null,this._index,this._fileInfo)];return e[0].mediaEmpty=!0,e},t.prototype.match=function(e){var t,n,i=this.elements,r=i.length;if(0===(t=(e=e.mixinElements()).length)||rw.PARENS_DIVISION)||this.parensStack&&this.parensStack.length))},j.Eval.prototype.pathRequiresRewrite=function(e){return(this.rewriteUrls===S?J:W)(e)},j.Eval.prototype.rewritePath=function(e,t){var n;return t=t||"",n=this.normalizePath(t+e),J(e)&&W(t)&&!1===J(n)&&(n="./"+n),n},j.Eval.prototype.normalizePath=function(e){var t,n=e.split("/").reverse();for(e=[];0!==n.length;)switch(t=n.pop()){case".":break;case"..":0===e.length||".."===e[e.length-1]?e.push(t):e.pop();break;default:e.push(t)}return e.join("/")};var H=function e(t){return{_data:{},add:function(e,t){e=e.toLowerCase(),this._data.hasOwnProperty(e),this._data[e]=t},addMultiple:function(e){var t=this;Object.keys(e).forEach((function(n){t.add(n,e[n])}))},get:function(e){return this._data[e]||t&&t.get(e)},getLocalFunctions:function(){return this._data},inherit:function(){return e(this)},create:function(t){return e(t)}}}(null),Q={eval:function(){var e=this.value_,t=this.error_;if(t)throw t;if(null!=e)return e?L.True:L.False},value:function(e){this.value_=e},error:function(e){this.error_=e},reset:function(){this.value_=this.error_=null}},K=function(e){function t(t,n,i,r){var o=e.call(this)||this;return o.selectors=t,o.rules=n,o._lookups={},o._variables=null,o._properties=null,o.strictImports=i,o.copyVisibilityInfo(r),o.allowRoot=!0,o.setParent(o.selectors,o),o.setParent(o.rules,o),o}return h(t,e),t.prototype.isRulesetLike=function(){return!0},t.prototype.accept=function(e){this.paths?this.paths=e.visitArray(this.paths,!0):this.selectors&&(this.selectors=e.visitArray(this.selectors)),this.rules&&this.rules.length&&(this.rules=e.visitArray(this.rules))},t.prototype.eval=function(e){var n,i,r,o,s,a=!1;if(this.selectors&&(i=this.selectors.length)){for(n=new Array(i),Q.error({type:"Syntax",message:"it is currently only allowed in parametric mixin guards,"}),o=0;o0;e--){var t=this.rules[e-1];if(t instanceof B)return this.parseValue(t)}},t.prototype.parseValue=function(e){var t=this;function n(e){return e.value instanceof N&&!e.parsed?("string"==typeof e.value.value?this.parse.parseNode(e.value.value,["value","important"],e.value.getIndex(),e.fileInfo(),(function(t,n){t&&(e.parsed=!0),n&&(e.value=n[0],e.important=n[1]||"",e.parsed=!0)})):e.parsed=!0,e):e}if(Array.isArray(e)){var i=[];return e.forEach((function(e){i.push(n.call(t,e))})),i}return n.call(t,e)},t.prototype.rulesets=function(){if(!this.rules)return[];var e,t,n=[],i=this.rules;for(e=0;t=i[e];e++)t.isRuleset&&n.push(t);return n},t.prototype.prependRule=function(e){var t=this.rules;t?t.unshift(e):this.rules=[e],this.setParent(e,this)},t.prototype.find=function(e,t,n){t=t||this;var i,r,o=[],s=e.toCSS();return s in this._lookups?this._lookups[s]:(this.rulesets().forEach((function(s){if(s!==t)for(var a=0;ai){if(!n||n(s)){r=s.find(new $(e.elements.slice(i)),t,n);for(var l=0;l0&&t.add(l),e.firstSelector=!0,s[0].genCSS(e,t),e.firstSelector=!1,i=1;i0?(o=(r=k(e)).pop(),s=i.createDerived(k(o.elements))):s=i.createDerived([]),t.length>0){var a=n.combinator,l=t[0].elements[0];a.emptyOrWhitespace&&!l.combinator.emptyOrWhitespace&&(a=l.combinator),s.elements.push(new b(a,l.value,n.isVariable,n._index,n._fileInfo)),s.elements=s.elements.concat(t[0].elements.slice(1))}if(0!==s.elements.length&&r.push(s),t.length>1){var u=t.slice(1);u=u.map((function(e){return e.createDerived(e.elements,[])})),r=r.concat(u)}return r}function s(e,t,n,i,r){var s;for(s=0;s0?i[i.length-1]=i[i.length-1].createDerived(i[i.length-1].elements.concat(e)):i.push(new $(e));else t.push([new $(e)])}function l(e,t){var n=t.createDerived(t.elements,t.extendList,t.evaldCondition);return n.copyVisibilityInfo(e),n}var u,c;if(!function e(t,n,l){var u,c,h,f,p,v,d,g,y,w,x,S,I=!1;for(f=[],p=[[]],u=0;g=l.elements[u];u++)if("&"!==g.value){var C=(S=void 0,(x=g).value instanceof m&&(S=x.value.value)instanceof $?S:null);if(null!=C){a(f,p);var k,_=[],A=[];for(k=e(_,n,C),I=I||k,h=0;h<_.length;h++){s(p,[r(i(_[h],g),g)],g,l,A)}p=A,f=[]}else f.push(g)}else{for(I=!0,v=[],a(f,p),c=0;c0&&d[0].elements.push(new b(g.combinator,"",g.isVariable,g._index,g._fileInfo)),v.push(d);else for(h=0;h0&&(t.push(p[u]),w=p[u][y-1],p[u][y-1]=w.createDerived(w.elements,l.extendList));return I}(c=[],t,n))if(t.length>0)for(c=[],u=0;u0)for(t=0;t-1e-6&&(i=n.toFixed(20).replace(/0+$/,"")),e&&e.compress){if(0===n&&this.unit.isLength())return void t.add(i);n>0&&n<1&&(i=i.substr(1))}t.add(i),this.unit.genCSS(e,t)},t.prototype.operate=function(e,n,i){var r=this._operate(e,n,this.value,i.value),o=this.unit.clone();if("+"===n||"-"===n)if(0===o.numerator.length&&0===o.denominator.length)o=i.unit.clone(),this.unit.backupUnit&&(o.backupUnit=this.unit.backupUnit);else if(0===i.unit.numerator.length&&0===o.denominator.length);else{if(i=i.convertTo(this.unit.usedUnits()),e.strictUnits&&i.unit.toString()!==o.toString())throw new Error("Incompatible units. Change the units or use the unit function. Bad units: '"+o.toString()+"' and '"+i.unit.toString()+"'.");r=this._operate(e,n,this.value,i.value)}else"*"===n?(o.numerator=o.numerator.concat(i.unit.numerator).sort(),o.denominator=o.denominator.concat(i.unit.denominator).sort(),o.cancel()):"/"===n&&(o.numerator=o.numerator.concat(i.unit.denominator).sort(),o.denominator=o.denominator.concat(i.unit.numerator).sort(),o.cancel());return new t(r,o)},t.prototype.compare=function(e){var n,i;if(e instanceof t){if(this.unit.isEmpty()||e.unit.isEmpty())n=this,i=e;else if(n=this.unify(),i=e.unify(),0!==n.unit.compare(i.unit))return;return u.numericCompare(n.value,i.value)}},t.prototype.unify=function(){return this.convertTo({length:"px",duration:"s",angle:"rad"})},t.prototype.convertTo=function(e){var n,i,r,o,s,l=this.value,u=this.unit.clone(),c={};if("string"==typeof e){for(n in a)a[n].hasOwnProperty(e)&&((c={})[n]=e);e=c}for(i in s=function(e,t){return r.hasOwnProperty(e)?(t?l/=r[e]/r[o]:l*=r[e]/r[o],o):e},e)e.hasOwnProperty(i)&&(o=e[i],r=a[i],u.map(s));return u.cancel(),new t(l,u)},t}(u);ee.prototype.type="Dimension";var te=w,ne=function(e){function t(t,n,i){var r=e.call(this)||this;return r.op=t.trim(),r.operands=n,r.isSpaced=i,r}return h(t,e),t.prototype.accept=function(e){this.operands=e.visitArray(this.operands)},t.prototype.eval=function(e){var n,i=this.operands[0].eval(e),r=this.operands[1].eval(e);if(e.isMathOn(this.op)){if(n="./"===this.op?"/":this.op,i instanceof ee&&r instanceof p&&(i=i.toColor()),r instanceof ee&&i instanceof p&&(r=r.toColor()),!i.operate){if(i instanceof t&&"/"===i.op&&e.math===te.PARENS_DIVISION)return new t(this.op,[i,r],this.isSpaced);throw{type:"Operation",message:"Operation on an invalid type"}}return i.operate(e,n,r)}return new t(this.op,[i,r],this.isSpaced)},t.prototype.genCSS=function(e,t){this.operands[0].genCSS(e,t),this.isSpaced&&t.add(" "),t.add(this.op),this.isSpaced&&t.add(" "),this.operands[1].genCSS(e,t)},t}(u);ne.prototype.type="Operation";var ie=function(e){function t(t,n){var i=e.call(this)||this;if(i.value=t,i.noSpacing=n,!t)throw new Error("Expression requires an array parameter");return i}return h(t,e),t.prototype.accept=function(e){this.value=e.visitArray(this.value)},t.prototype.eval=function(e){var n,i=e.isMathOn(),r=this.parens,o=!1;return r&&e.inParenthesis(),this.value.length>1?n=new t(this.value.map((function(t){return t.eval?t.eval(e):t})),this.noSpacing):1===this.value.length?(!this.value[0].parens||this.value[0].parensInOp||e.inCalc||(o=!0),n=this.value[0].eval(e)):n=this,r&&e.outOfParenthesis(),!this.parens||!this.parensInOp||i||o||n instanceof ee||(n=new m(n)),n},t.prototype.genCSS=function(e,t){for(var n=0;n1){var n=new $([],null,null,this.getIndex(),this.fileInfo()).createEmptySelectors();(t=new K(n,e.mediaBlocks)).multiMedia=!0,t.copyVisibilityInfo(this.visibilityInfo()),this.setParent(t,this)}return delete e.mediaBlocks,delete e.mediaPath,t},t.prototype.evalNested=function(e){var t,n,i=e.mediaPath.concat([this]);for(t=0;t0;t--)e.splice(t,0,new N("and"));return new ie(e)}))),this.setParent(this.features,this),new K([],[])},t.prototype.permute=function(e){if(0===e.length)return[];if(1===e.length)return e[0];for(var t=[],n=this.permute(e.slice(1)),i=0;i1?"["+e.value.map((function(e){return e.toCSS()})).join(", ")+"]":e.toCSS()},t}(u));pe.prototype.type="JavaScript";var ve=function(e){function t(t,n){var i=e.call(this)||this;return i.key=t,i.value=n,i}return h(t,e),t.prototype.accept=function(e){this.value=e.visit(this.value)},t.prototype.eval=function(e){return this.value.eval?new t(this.key,this.value.eval(e)):this},t.prototype.genCSS=function(e,t){t.add(this.key+"="),this.value.genCSS?this.value.genCSS(e,t):t.add(this.value)},t}(u);ve.prototype.type="Assignment";var de=function(e){function t(t,n,i,r,o){var s=e.call(this)||this;return s.op=t.trim(),s.lvalue=n,s.rvalue=i,s._index=r,s.negate=o,s}return h(t,e),t.prototype.accept=function(e){this.lvalue=e.visit(this.lvalue),this.rvalue=e.visit(this.rvalue)},t.prototype.eval=function(e){var t=function(e,t,n){switch(e){case"and":return t&&n;case"or":return t||n;default:switch(u.compare(t,n)){case-1:return"<"===e||"=<"===e||"<="===e;case 0:return"="===e||">="===e||"=<"===e||"<="===e;case 1:return">"===e||">="===e;default:return!1}}}(this.op,this.lvalue.eval(e),this.rvalue.eval(e));return this.negate?!t:t},t}(u);de.prototype.type="Condition";var me=function(e){function t(t){var n=e.call(this)||this;return n.value=t,n}return h(t,e),t}(u);me.prototype.type="UnicodeDescriptor";var ge=function(e){function t(t){var n=e.call(this)||this;return n.value=t,n}return h(t,e),t.prototype.genCSS=function(e,t){t.add("-"),this.value.genCSS(e,t)},t.prototype.eval=function(e){return e.isMathOn()?new ne("*",[new ee(-1),this.value]).eval(e):new t(this.value.eval(e))},t}(u);ge.prototype.type="Negative";var ye=function(e){function t(n,i,r,o,s){var a=e.call(this)||this;switch(a.selector=n,a.option=i,a.object_id=t.next_id++,a.parent_ids=[a.object_id],a._index=r,a._fileInfo=o,a.copyVisibilityInfo(s),a.allowRoot=!0,i){case"all":a.allowBefore=!0,a.allowAfter=!0;break;default:a.allowBefore=!1,a.allowAfter=!1}return a.setParent(a.selector,a),a}return h(t,e),t.prototype.accept=function(e){this.selector=e.visit(this.selector)},t.prototype.eval=function(e){return new t(this.selector.eval(e),this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},t.prototype.clone=function(e){return new t(this.selector,this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},t.prototype.findSelfSelectors=function(e){var t,n,i=[];for(t=0;t0&&n.length&&""===n[0].combinator.value&&(n[0].combinator.value=" "),i=i.concat(e[t].elements);this.selfSelectors=[new $(i)],this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo())},t}(u);ye.next_id=0,ye.prototype.type="Extend";var be=function(e){function t(t,n,i){var r=e.call(this)||this;return r.variable=t,r._index=n,r._fileInfo=i,r.allowRoot=!0,r}return h(t,e),t.prototype.eval=function(e){var t,n=new se(this.variable,this.getIndex(),this.fileInfo()).eval(e),i=new V({message:"Could not evaluate variable call "+this.variable});if(!n.ruleset){if(n.rules)t=n;else if(Array.isArray(n))t=new K("",n);else{if(!Array.isArray(n.value))throw i;t=new K("",n.value)}n=new X(t)}if(n.ruleset)return n.callEval(e);throw i},t}(u);be.prototype.type="VariableCall";var we=function(e){function t(t,n,i,r){var o=e.call(this)||this;return o.value=t,o.lookups=n,o._index=i,o._fileInfo=r,o}return h(t,e),t.prototype.eval=function(e){var t,n,i=this.value.eval(e);for(t=0;tthis.params.length)return!1}n=Math.min(o,this.arity);for(var s=0;s0){for(c=!0,a=0;a0)f=2;else if(f=1,p[1]+p[2]>1)throw{type:"Runtime",message:"Ambiguous use of `default()` found when matching for `"+this.format(m)+"`",index:this.getIndex(),filename:this.fileInfo().filename};for(a=0;a0&&(e=e.slice(0,t)),(t=e.lastIndexOf("/"))<0&&(t=e.lastIndexOf("\\")),t<0?"":e.slice(0,t+1)},e.prototype.tryAppendExtension=function(e,t){return/(\.[a-z]*$)|([\?;].*)$/.test(e)?e:e+t},e.prototype.tryAppendLessExtension=function(e){return this.tryAppendExtension(e,".less")},e.prototype.supportsSync=function(){return!1},e.prototype.alwaysMakePathsAbsolute=function(){return!1},e.prototype.isPathAbsolute=function(e){return/^(?:[a-z-]+:|\/|\\|#)/i.test(e)},e.prototype.join=function(e,t){return e?e+t:t},e.prototype.pathDiff=function(e,t){var n,i,r,o,s=this.extractUrlParts(e),a=this.extractUrlParts(t),l="";if(s.hostPart!==a.hostPart)return"";for(i=Math.max(a.directories.length,s.directories.length),n=0;nparseInt(t[n])?-1:1;return 0},e.prototype.versionToString=function(e){for(var t="",n=0;n0;){var e=this.imports[0];if(!e.isReady)return;this.imports=this.imports.slice(1),e.callback.apply(null,e.args)}if(0===this.variableImports.length)break;var t=this.variableImports[0];this.variableImports=this.variableImports.slice(1),t()}}finally{this._currentDepth--}0===this._currentDepth&&this._onSequencerEmpty&&this._onSequencerEmpty()},e}(),Re=function(e,t){this._visitor=new Ee(this),this._importer=e,this._finish=t,this.context=new j.Eval,this.importCount=0,this.onceFileDetectionMap={},this.recursionDetector={},this._sequencer=new Pe(this._onSequencerEmpty.bind(this))};Re.prototype={isReplacing:!1,run:function(e){try{this._visitor.visit(e)}catch(e){this.error=e}this.isFinished=!0,this._sequencer.tryRun()},_onSequencerEmpty:function(){this.isFinished&&this._finish(this.error)},visitImport:function(e,t){var n=e.options.inline;if(!e.css||n){var i=new j.Eval(this.context,k(this.context.frames)),r=i.frames[0];this.importCount++,e.isVariableImport()?this._sequencer.addVariableImport(this.processImportNode.bind(this,e,i,r)):this.processImportNode(e,i,r)}t.visitDeeper=!1},processImportNode:function(e,t,n){var i,r=e.options.inline;try{i=e.evalForImport(t)}catch(t){t.filename||(t.index=e.getIndex(),t.filename=e.fileInfo().filename),e.css=!0,e.error=t}if(!i||i.css&&!r)this.importCount--,this.isFinished&&this._sequencer.tryRun();else{i.options.multiple&&(t.importMultiple=!0);for(var o=void 0===i.css,s=0;s=0||(a=[u.selfSelectors[0]],(o=f.findMatch(l,a)).length&&(l.hasFoundMatches=!0,l.selfSelectors.forEach((function(e){var t=u.visibilityInfo();s=f.extendSelector(o,a,e,l.isVisible()),(c=new Ie.Extend(u.selector,u.option,0,u.fileInfo(),t)).selfSelectors=s,s[s.length-1].extendList=[c],h.push(c),c.ruleset=u.ruleset,c.parent_ids=c.parent_ids.concat(u.parent_ids,l.parent_ids),u.firstExtendOnThisSelectorPath&&(c.firstExtendOnThisSelectorPath=!0,u.ruleset.paths.push(s))}))));if(h.length){if(this.extendChainCount++,n>100){var p="{unable to calculate}",v="{unable to calculate}";try{p=h[0].selfSelectors[0].toCSS(),v=h[0].selector.toCSS()}catch(e){}throw{message:"extend circular reference detected. One of the circular extends is currently:"+p+":extend("+v+")"}}return h.concat(f.doExtendChaining(h,t,n+1))}return h},e.prototype.visitDeclaration=function(e,t){t.visitDeeper=!1},e.prototype.visitMixinDefinition=function(e,t){t.visitDeeper=!1},e.prototype.visitSelector=function(e,t){t.visitDeeper=!1},e.prototype.visitRuleset=function(e,t){if(!e.root){var n,i,r,o,s=this.allExtendsStack[this.allExtendsStack.length-1],a=[],l=this;for(r=0;r0&&u[l.matched].combinator.value!==s?l=null:l.matched++,l&&(l.finished=l.matched===u.length,l.finished&&!e.allowAfter&&(r+1u&&c>0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[u].elements.slice(c)),c=0,u++),l=o.elements.slice(c,a.index).concat([s]).concat(n.elements.slice(1)),u===a.pathIndex&&r>0?h[h.length-1].elements=h[h.length-1].elements.concat(l):(h=h.concat(t.slice(u,a.pathIndex))).push(new Ie.Selector(l)),u=a.endPathIndex,(c=a.endPathElementIndex)>=t[u].elements.length&&(c=0,u++);return u0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[u].elements.slice(c)),u++),h=(h=h.concat(t.slice(u,t.length))).map((function(e){var t=e.createDerived(e.elements);return i?t.ensureVisibility():t.ensureInvisibility(),t}))},e.prototype.visitMedia=function(e,t){var n=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);n=n.concat(this.doExtendChaining(n,e.allExtends)),this.allExtendsStack.push(n)},e.prototype.visitMediaOut=function(e){var t=this.allExtendsStack.length-1;this.allExtendsStack.length=t},e.prototype.visitAtRule=function(e,t){var n=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);n=n.concat(this.doExtendChaining(n,e.allExtends)),this.allExtendsStack.push(n)},e.prototype.visitAtRuleOut=function(e){var t=this.allExtendsStack.length-1;this.allExtendsStack.length=t},e}(),Oe=function(){function e(){this.contexts=[[]],this._visitor=new Ee(this)}return e.prototype.run=function(e){return this._visitor.visit(e)},e.prototype.visitDeclaration=function(e,t){t.visitDeeper=!1},e.prototype.visitMixinDefinition=function(e,t){t.visitDeeper=!1},e.prototype.visitRuleset=function(e,t){var n,i=this.contexts[this.contexts.length-1],r=[];this.contexts.push(r),e.root||((n=e.selectors)&&(n=n.filter((function(e){return e.getIsOutput()})),e.selectors=n.length?n:n=null,n&&e.joinSelectors(r,i,n)),n||(e.rules=null),e.paths=r)},e.prototype.visitRulesetOut=function(e){this.contexts.length=this.contexts.length-1},e.prototype.visitMedia=function(e,t){var n=this.contexts[this.contexts.length-1];e.rules[0].root=0===n.length||n[0].multiMedia},e.prototype.visitAtRule=function(e,t){var n=this.contexts[this.contexts.length-1];e.rules&&e.rules.length&&(e.rules[0].root=e.isRooted||0===n.length||null)},e}(),Le=function(){function e(e){this._visitor=new Ee(this),this._context=e}return e.prototype.containsSilentNonBlockedChild=function(e){var t;if(!e)return!1;for(var n=0;n0},e.prototype.resolveVisibility=function(e,t){if(!e.blocksVisibility()){if(this.isEmpty(e)&&!this.containsSilentNonBlockedChild(t))return;return e}var n=e.rules[0];if(this.keepOnlyVisibleChilds(n),!this.isEmpty(n))return e.ensureVisibility(),e.removeVisibilityBlock(),e},e.prototype.isVisibleRuleset=function(e){return!!e.firstRoot||!this.isEmpty(e)&&!(!e.root&&!this.hasVisibleSelector(e))},e}(),Ne=function(e){this._visitor=new Ee(this),this._context=e,this.utils=new Le(e)};Ne.prototype={isReplacing:!0,run:function(e){return this._visitor.visit(e)},visitDeclaration:function(e,t){if(!e.blocksVisibility()&&!e.variable)return e},visitMixinDefinition:function(e,t){e.frames=[]},visitExtend:function(e,t){},visitComment:function(e,t){if(!e.blocksVisibility()&&!e.isSilent(this._context))return e},visitMedia:function(e,t){var n=e.rules[0].rules;return e.accept(this._visitor),t.visitDeeper=!1,this.utils.resolveVisibility(e,n)},visitImport:function(e,t){if(!e.blocksVisibility())return e},visitAtRule:function(e,t){return e.rules&&e.rules.length?this.visitAtRuleWithBody(e,t):this.visitAtRuleWithoutBody(e,t)},visitAnonymous:function(e,t){if(!e.blocksVisibility())return e.accept(this._visitor),e},visitAtRuleWithBody:function(e,t){var n=function(e){var t=e.rules;return function(e){var t=e.rules;return 1===t.length&&(!t[0].paths||0===t[0].paths.length)}(e)?t[0].rules:t}(e);return e.accept(this._visitor),t.visitDeeper=!1,this.utils.isEmpty(e)||this._mergeRules(e.rules[0].rules),this.utils.resolveVisibility(e,n)},visitAtRuleWithoutBody:function(e,t){if(!e.blocksVisibility()){if("@charset"===e.name){if(this.charset){if(e.debugInfo){var n=new Ie.Comment("/* "+e.toCSS(this._context).replace(/\n/g,"")+" */\n");return n.debugInfo=e.debugInfo,this._visitor.visit(n)}return}this.charset=!0}return e}},checkValidNodes:function(e,t){if(e)for(var n=0;n0?e.accept(this._visitor):e.rules=null,t.visitDeeper=!1}return e.rules&&(this._mergeRules(e.rules),this._removeDuplicateRules(e.rules)),this.utils.isVisibleRuleset(e)&&(e.ensureVisibility(),i.splice(0,0,e)),1===i.length?i[0]:i},_compileRulesetPaths:function(e){e.paths&&(e.paths=e.paths.filter((function(e){var t;for(" "===e[0].elements[0].combinator.value&&(e[0].elements[0].combinator=new Ie.Combinator("")),t=0;t=0;i--)if((n=e[i])instanceof Ie.Declaration)if(r[n.name]){(t=r[n.name])instanceof Ie.Declaration&&(t=r[n.name]=[r[n.name].toCSS(this._context)]);var o=n.toCSS(this._context);-1!==t.indexOf(o)?e.splice(i,1):t.push(o)}else r[n.name]=n}},_mergeRules:function(e){if(e){for(var t={},n=[],i=0;i0){var t=e[0],n=[],i=[new Ie.Expression(n)];e.forEach((function(e){"+"===e.merge&&n.length>0&&i.push(new Ie.Expression(n=[])),n.push(e.value),t.important=t.important||e.important})),t.value=new Ie.Value(i)}}))}}};var De={Visitor:Ee,ImportVisitor:Re,MarkVisibleSelectorsVisitor:Ve,ExtendVisitor:$e,JoinSelectorVisitor:Oe,ToCSSVisitor:Ne};var Be=function(){var e,t,n,i,r,o,s,a=[],l={};function u(n){for(var i,a,c,h=l.i,f=t,p=l.i-s,v=l.i+o.length-p,d=l.i+=n,m=e;l.i=0){c={index:l.i,text:m.substr(l.i,y+2-l.i),isLineComment:!1},l.i+=c.text.length-1,l.commentStore.push(c);continue}}break}if(32!==i&&10!==i&&9!==i&&13!==i)break}if(o=o.slice(n+l.i-d+p),s=l.i,!o.length){if(tn||l.i===n&&e&&!i)&&(n=l.i,i=e);var r=a.pop();o=r.current,s=l.i=r.i,t=r.j},l.forget=function(){a.pop()},l.isWhitespace=function(t){var n=l.i+(t||0),i=e.charCodeAt(n);return 32===i||13===i||9===i||10===i},l.$re=function(e){l.i>s&&(o=o.slice(l.i-s),s=l.i);var t=e.exec(o);return t?(u(t[0].length),"string"==typeof t?t:1===t.length?t[0]:t):null},l.$char=function(t){return e.charAt(l.i)!==t?null:(u(1),t)},l.$str=function(t){for(var n=t.length,i=0;ih&&(d=!1)}}while(d);return r||null},l.autoCommentAbsorb=!0,l.commentStore=[],l.finished=!1,l.peek=function(t){if("string"==typeof t){for(var n=0;n57||t<43||47===t||44===t},l.start=function(i,a,c){e=i,l.i=t=s=n=0,r=a?function(e,t){var n,i,r,o,s,a,l,u,c,h=e.length,f=0,p=0,v=[],d=0;function m(t){var n=s-d;n<512&&!t||!n||(v.push(e.slice(d,s+1)),d=s+1)}for(s=0;s=97&&l<=122||l<34))switch(l){case 40:p++,i=s;continue;case 41:if(--p<0)return t("missing opening `(`",s);continue;case 59:p||m();continue;case 123:f++,n=s;continue;case 125:if(--f<0)return t("missing opening `{`",s);f||p||m();continue;case 92:if(s96)){if(u==l){c=1;break}if(92==u){if(s==h-1)return t("unescaped `\\`",s);s++}}if(c)continue;return t("unmatched `"+String.fromCharCode(l)+"`",a);case 47:if(p||s==h-1)continue;if(47==(u=e.charCodeAt(s+1)))for(s+=2;sn&&o>r?"missing closing `}` or `*/`":"missing closing `}`",n):0!==p?t("missing closing `)`",i):(m(!0),v)}(i,c):[i],o=r[0],u(0)},l.end=function(){var t,r=l.i>=e.length;return l.i=e.length-1,furthestChar:e[l.i]}},l},Ue=function e(t,n,i){var r,o=Be();function s(e,t){throw new V({index:o.i,filename:i.filename,type:t||"Syntax",message:e},n)}function a(e,t){var n=e instanceof Function?e.call(r):o.$re(e);if(n)return n;s(t||("string"==typeof e?"expected '"+e+"' got '"+o.currentChar()+"'":"unexpected token"))}function l(e,t){if(o.$char(e))return e;s(t||"expected '"+e+"' got '"+o.currentChar()+"'")}function u(e){var t=i.filename;return{lineNumber:C(e,o.getInput()).line+1,fileName:t}}return{parserInput:o,imports:n,fileInfo:i,parseNode:function(e,t,i,s,a){var l,u=[],c=o;try{c.start(e,!1,(function(e,t){a({message:e,index:t+i})}));for(var h=0,f=void 0,p=void 0;f=t[h];h++)if(p=c.i,l=r[f]()){try{l._index=p+i,l._fileInfo=s}catch(e){}u.push(l)}else u.push(null);c.end().isFinished?a(null,u):a(!0,null)}catch(e){throw new V({index:e.index+i,message:e.message},n,s.filename)}},parse:function(r,s,a){var l,u,c,h,f=null,p="";if(u=a&&a.globalVars?e.serializeVars(a.globalVars)+"\n":"",c=a&&a.modifyVars?"\n"+e.serializeVars(a.modifyVars):"",t.pluginManager)for(var v=t.pluginManager.getPreProcessors(),d=0;d");return e},args:function(e){var t,n,i,a,l,u,c,h=r.entities,f={args:null,variadic:!1},p=[],v=[],d=[],m=!0;for(o.save();;){if(e)u=r.detachedRuleset()||r.expression();else{if(o.commentStore.length=0,o.$str("...")){f.variadic=!0,o.$char(";")&&!t&&(t=!0),(t?v:d).push({variadic:!0});break}u=h.variable()||h.property()||h.literal()||h.keyword()||this.call(!0)}if(!u||!m)break;a=null,u.throwAwayComments&&u.throwAwayComments(),l=u;var g=null;if(e?u.value&&1==u.value.length&&(g=u.value[0]):g=u,g&&(g instanceof Ie.Variable||g instanceof Ie.Property))if(o.$char(":")){if(p.length>0&&(t&&s("Cannot mix ; and , as delimiter types"),n=!0),!(l=r.detachedRuleset()||r.expression())){if(!e)return o.restore(),f.args=[],f;s("could not understand value for named argument")}a=i=g.name}else if(o.$str("...")){if(!e){f.variadic=!0,o.$char(";")&&!t&&(t=!0),(t?v:d).push({name:u.name,variadic:!0});break}c=!0}else e||(i=a=g.name,l=null);l&&p.push(l),d.push({name:a,value:l,expand:c}),o.$char(",")?m=!0:((m=";"===o.$char(";"))||t)&&(n&&s("Cannot mix ; and , as delimiter types"),t=!0,p.length>1&&(l=new Ie.Value(p)),v.push({name:i,value:l,expand:c}),i=null,p=[],n=!1)}return o.forget(),f.args=t?v:d,f},definition:function(){var e,t,n,i,s=[],l=!1;if(!("."!==o.currentChar()&&"#"!==o.currentChar()||o.peek(/^[^{]*\}/)))if(o.save(),t=o.$re(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/)){e=t[1];var u=this.args(!1);if(s=u.args,l=u.variadic,!o.$char(")"))return void o.restore("Missing closing ')'");if(o.commentStore.length=0,o.$str("when")&&(i=a(r.conditions,"expected condition")),n=r.block())return o.forget(),new Ie.mixin.Definition(e,s,n,i,l);o.restore()}else o.restore()},ruleLookups:function(){var e,t=[];if("["===o.currentChar()){for(;;){if(o.save(),!(e=this.lookupValue())&&""!==e){o.restore();break}t.push(e),o.forget()}return t.length>0?t:void 0}},lookupValue:function(){if(o.save(),o.$char("[")){var e=o.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);if(o.$char("]"))return e||""===e?(o.forget(),e):void o.restore();o.restore()}else o.restore()}},entity:function(){var e=this.entities;return this.comment()||e.literal()||e.variable()||e.url()||e.property()||e.call()||e.keyword()||this.mixin.call(!0)||e.javascript()},end:function(){return o.$char(";")||o.peek("}")},ieAlpha:function(){var e;if(o.$re(/^opacity=/i))return(e=o.$re(/^\d+/))||(e="@{"+(e=a(r.entities.variable,"Could not parse alpha")).name.slice(1)+"}"),l(")"),new Ie.Quoted("","alpha(opacity="+e+")")},element:function(){var e,t,n,r=o.i;if(t=this.combinator(),(e=o.$re(/^(?:\d+\.\d+|\d+)%/)||o.$re(/^(?:[.#]?|:*)(?:[\w-]|[^\x00-\x9f]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/)||o.$char("*")||o.$char("&")||this.attribute()||o.$re(/^\([^&()@]+\)/)||o.$re(/^[\.#:](?=@)/)||this.entities.variableCurly())||(o.save(),o.$char("(")?(n=this.selector(!1))&&o.$char(")")?(e=new Ie.Paren(n),o.forget()):o.restore("Missing closing ')'"):o.forget()),e)return new Ie.Element(t,e,e instanceof Ie.Variable,r,i)},combinator:function(){var e=o.currentChar();if("/"===e){o.save();var t=o.$re(/^\/[a-z]+\//i);if(t)return o.forget(),new Ie.Combinator(t);o.restore()}if(">"===e||"+"===e||"~"===e||"|"===e||"^"===e){for(o.i++,"^"===e&&"^"===o.currentChar()&&(e="^^",o.i++);o.isWhitespace();)o.i++;return new Ie.Combinator(e)}return o.isWhitespace(-1)?new Ie.Combinator(" "):new Ie.Combinator(null)},selector:function(e){var t,n,r,l,u,c,h,f=o.i;for(e=!1!==e;(e&&(n=this.extend())||e&&(c=o.$str("when"))||(l=this.element()))&&(c?h=a(this.conditions,"expected condition"):h?s("CSS guard can only be used at the end of selector"):n?u=u?u.concat(n):n:(u&&s("Extend can only be used at the end of selector"),r=o.currentChar(),t?t.push(l):t=[l],l=null),"{"!==r&&"}"!==r&&";"!==r&&","!==r&&")"!==r););if(t)return new Ie.Selector(t,u,h,f,i);u&&s("Extend must be used to extend a selector, it cannot be used on its own")},selectors:function(){for(var e,t;(e=this.selector())&&(t?t.push(e):t=[e],o.commentStore.length=0,e.condition&&t.length>1&&s("Guards are only currently allowed on a single selector."),o.$char(","));)e.condition&&s("Guards are only currently allowed on a single selector."),o.commentStore.length=0;return t},attribute:function(){if(o.$char("[")){var e,t,n,i=this.entities;return(e=i.variableCurly())||(e=a(/^(?:[_A-Za-z0-9-\*]*\|)?(?:[_A-Za-z0-9-]|\\.)+/)),(n=o.$re(/^[|~*$^]?=/))&&(t=i.quoted()||o.$re(/^[0-9]+%/)||o.$re(/^[\w-]+/)||i.variableCurly()),l("]"),new Ie.Attribute(e,n,t)}},block:function(){var e;if(o.$char("{")&&(e=this.primary())&&o.$char("}"))return e},blockRuleset:function(){var e=this.block();return e&&(e=new Ie.Ruleset(null,e)),e},detachedRuleset:function(){var e,t,n;if(o.save(),!o.$re(/^[.#]\(/)||(t=(e=this.mixin.args(!1)).args,n=e.variadic,o.$char(")"))){var i=this.blockRuleset();if(i)return o.forget(),t?new Ie.mixin.Definition(null,t,i,null,n):new Ie.DetachedRuleset(i);o.restore()}else o.restore()},ruleset:function(){var e,n,i;if(o.save(),t.dumpLineNumbers&&(i=u(o.i)),(e=this.selectors())&&(n=this.block())){o.forget();var r=new Ie.Ruleset(e,n,t.strictImports);return t.dumpLineNumbers&&(r.debugInfo=i),r}o.restore()},declaration:function(){var e,t,n,r,s,a,l=o.i,u=o.currentChar();if("."!==u&&"#"!==u&&"&"!==u&&":"!==u)if(o.save(),e=this.variable()||this.ruleProperty()){if((a="string"==typeof e)&&(t=this.detachedRuleset())&&(n=!0),o.commentStore.length=0,!t){if(s=!a&&e.length>1&&e.pop().value,t=e[0].value&&"--"===e[0].value.slice(0,2)?this.permissiveValue():this.anonymousValue())return o.forget(),new Ie.Declaration(e,t,!1,s,l,i);t||(t=this.value()),t?r=this.important():a&&(t=this.permissiveValue())}if(t&&(this.end()||n))return o.forget(),new Ie.Declaration(e,t,r,s,l,i);o.restore()}else o.restore()},anonymousValue:function(){var e=o.i,t=o.$re(/^([^.#@\$+\/'"*`(;{}-]*);/);if(t)return new Ie.Anonymous(t[1],e)},permissiveValue:function(e){var t,n,r,a,l=e||";",u=o.i,c=[];function h(){var e=o.currentChar();return"string"==typeof l?e===l:l.test(e)}if(!h()){a=[];do{((n=this.comment())||(n=this.entity()))&&a.push(n)}while(n);if(r=h(),a.length>0){if(a=new Ie.Expression(a),r)return a;c.push(a)," "===o.prevChar()&&c.push(new Ie.Anonymous(" ",u))}if(o.save(),a=o.$parseUntil(l)){if("string"==typeof a&&s("Expected '"+a+"'","Parse"),1===a.length&&" "===a[0])return o.forget(),new Ie.Anonymous("",u);var f=void 0;for(t=0;t0)return new Ie.Expression(r)},mediaFeatures:function(){var e,t=this.entities,n=[];do{if(e=this.mediaFeature()){if(n.push(e),!o.$char(","))break}else if((e=t.variable()||t.mixinLookup())&&(n.push(e),!o.$char(",")))break}while(e);return n.length>0?n:null},media:function(){var e,n,r,a,l=o.i;if(t.dumpLineNumbers&&(a=u(l)),o.save(),o.$str("@media"))return e=this.mediaFeatures(),(n=this.block())||s("media definitions require block statements after any features"),o.forget(),r=new Ie.Media(n,e,l,i),t.dumpLineNumbers&&(r.debugInfo=a),r;o.restore()},plugin:function(){var e,t,n,r=o.i;if(o.$re(/^@plugin?\s+/)){if(n=(t=this.pluginArgs())?{pluginArgs:t,isPlugin:!0}:{isPlugin:!0},e=this.entities.quoted()||this.entities.url())return o.$char(";")||(o.i=r,s("missing semi-colon on @plugin")),new Ie.Import(e,null,n,r,i);o.i=r,s("malformed @plugin statement")}},pluginArgs:function(){if(o.save(),!o.$char("("))return o.restore(),null;var e=o.$re(/^\s*([^\);]+)\)\s*/);return e[1]?(o.forget(),e[1].trim()):(o.restore(),null)},atrule:function(){var e,n,r,a,l,c,h,f=o.i,p=!0,v=!0;if("@"===o.currentChar()){if(n=this.import()||this.plugin()||this.media())return n;if(o.save(),e=o.$re(/^@[a-z-]+/)){switch(a=e,"-"==e.charAt(1)&&e.indexOf("-",2)>0&&(a="@"+e.slice(e.indexOf("-",2)+1)),a){case"@charset":l=!0,p=!1;break;case"@namespace":c=!0,p=!1;break;case"@keyframes":case"@counter-style":l=!0;break;case"@document":case"@supports":h=!0,v=!1;break;default:h=!0}if(o.commentStore.length=0,l?(n=this.entity())||s("expected "+e+" identifier"):c?(n=this.expression())||s("expected "+e+" expression"):h&&(n=this.permissiveValue(/^[{;]/),p="{"===o.currentChar(),n?n.value||(n=null):p||";"===o.currentChar()||s(e+" rule is missing block or ending semi-colon")),p&&(r=this.blockRuleset()),r||!p&&n&&o.$char(";"))return o.forget(),new Ie.AtRule(e,n,r,f,i,t.dumpLineNumbers?u(f):null,v);o.restore("at-rule options not recognised")}}},value:function(){var e,t=[],n=o.i;do{if((e=this.expression())&&(t.push(e),!o.$char(",")))break}while(e);if(t.length>0)return new Ie.Value(t,n)},important:function(){if("!"===o.currentChar())return o.$re(/^! *important/)},sub:function(){var e,t;if(o.save(),o.$char("("))return(e=this.addition())&&o.$char(")")?(o.forget(),(t=new Ie.Expression([e])).parens=!0,t):void o.restore("Expected ')'");o.restore()},multiplication:function(){var e,t,n,i,r;if(e=this.operand()){for(r=o.isWhitespace(-1);!o.peek(/^\/[*\/]/);){if(o.save(),!(n=o.$char("/")||o.$char("*")||o.$str("./"))){o.forget();break}if(!(t=this.operand())){o.restore();break}o.forget(),e.parensInOp=!0,t.parensInOp=!0,i=new Ie.Operation(n,[i||e,t],r),r=o.isWhitespace(-1)}return i||e}},addition:function(){var e,t,n,i,r;if(e=this.multiplication()){for(r=o.isWhitespace(-1);(n=o.$re(/^[-+]\s+/)||!r&&(o.$char("+")||o.$char("-")))&&(t=this.multiplication());)e.parensInOp=!0,t.parensInOp=!0,i=new Ie.Operation(n,[i||e,t],r),r=o.isWhitespace(-1);return i||e}},conditions:function(){var e,t,n,i=o.i;if(e=this.condition(!0)){for(;o.peek(/^,\s*(not\s*)?\(/)&&o.$char(",")&&(t=this.condition(!0));)n=new Ie.Condition("or",n||e,t,i);return n||e}},condition:function(e){var t,n,i;if(t=this.conditionAnd(e)){if(n=o.$str("or")){if(!(i=this.condition(e)))return;t=new Ie.Condition(n,t,i)}return t}},conditionAnd:function(e){var t,n,i,r,s=this;if(t=(r=s.negatedCondition(e)||s.parenthesisCondition(e))||e?r:s.atomicCondition(e)){if(n=o.$str("and")){if(!(i=this.conditionAnd(e)))return;t=new Ie.Condition(n,t,i)}return t}},negatedCondition:function(e){if(o.$str("not")){var t=this.parenthesisCondition(e);return t&&(t.negate=!t.negate),t}},parenthesisCondition:function(e){var t;if(o.save(),o.$str("(")){if(t=function(t){var n;if(o.save(),n=t.condition(e)){if(o.$char(")"))return o.forget(),n;o.restore()}else o.restore()}(this))return o.forget(),t;if(t=this.atomicCondition(e)){if(o.$char(")"))return o.forget(),t;o.restore("expected ')' got '"+o.currentChar()+"'")}else o.restore()}else o.restore()},atomicCondition:function(e){var t,n,i,r,a=this.entities,l=o.i;function u(){return this.addition()||a.keyword()||a.quoted()||a.mixinLookup()}if(t=(u=u.bind(this))())return o.$char(">")?r=o.$char("=")?">=":">":o.$char("<")?r=o.$char("=")?"<=":"<":o.$char("=")&&(r=o.$char(">")?"=>":o.$char("<")?"=<":"="),r?(n=u())?i=new Ie.Condition(r,t,n,l,!1):s("expected expression"):i=new Ie.Condition("=",t,new Ie.Keyword("true"),l,!1),i},operand:function(){var e,t=this.entities;o.peek(/^-[@\$\(]/)&&(e=o.$char("-"));var n=this.sub()||t.dimension()||t.color()||t.variable()||t.property()||t.call()||t.quoted(!0)||t.colorKeyword()||t.mixinLookup();return e&&(n.parensInOp=!0,n=new Ie.Negative(n)),n},expression:function(){var e,t,n=[],i=o.i;do{(e=this.comment())?n.push(e):((e=this.addition()||this.entity())instanceof Ie.Comment&&(e=null),e&&(n.push(e),o.peek(/^\/[\/*]/)||(t=o.$char("/"))&&n.push(new Ie.Anonymous(t,i))))}while(e);if(n.length>0)return new Ie.Expression(n)},property:function(){var e=o.$re(/^(\*?-?[_a-zA-Z0-9-]+)\s*:/);if(e)return e[1]},ruleProperty:function(){var e,t,n=[],r=[];o.save();var s=o.$re(/^([_a-zA-Z0-9-]+)\s*:/);if(s)return n=[new Ie.Keyword(s[1])],o.forget(),n;function a(e){var t=o.i,i=o.$re(e);if(i)return r.push(t),n.push(i[1])}for(a(/^(\*?)/);a(/^((?:[\w-]+)|(?:[@\$]\{[\w-]+\}))/););if(n.length>1&&a(/^((?:\+_|\+)?)\s*:/)){for(o.forget(),""===n[0]&&(n.shift(),r.shift()),t=0;t1?e-1:e)<1?r+(o-r)*e*6:2*e<1?o:3*e<2?r+(o-r)*(2/3-e)*6:r}e=He(e)%360/360,t=ze(He(t)),n=ze(He(n)),i=ze(He(i)),r=2*n-(o=n<=.5?n*(t+1):n+t-n*t);var a=[255*s(e+1/3),255*s(e),255*s(e-1/3)];return i=He(i),new p(a,i,"hsla")}catch(e){}},hsv:function(e,t,n){return je.hsva(e,t,n,1)},hsva:function(e,t,n,i){var r,o;e=He(e)%360/360*360,t=He(t),n=He(n),i=He(i);var s=[n,n*(1-t),n*(1-(o=e/60-(r=Math.floor(e/60%6)))*t),n*(1-(1-o)*t)],a=[[0,3,1],[2,0,1],[1,0,3],[1,2,0],[3,1,0],[0,1,2]];return je.rgba(255*s[a[r][0]],255*s[a[r][1]],255*s[a[r][2]],i)},hue:function(e){return new ee(We(e).h)},saturation:function(e){return new ee(100*We(e).s,"%")},lightness:function(e){return new ee(100*We(e).l,"%")},hsvhue:function(e){return new ee(Je(e).h)},hsvsaturation:function(e){return new ee(100*Je(e).s,"%")},hsvvalue:function(e){return new ee(100*Je(e).v,"%")},red:function(e){return new ee(e.rgb[0])},green:function(e){return new ee(e.rgb[1])},blue:function(e){return new ee(e.rgb[2])},alpha:function(e){return new ee(We(e).a)},luma:function(e){return new ee(e.luma()*e.alpha*100,"%")},luminance:function(e){var t=.2126*e.rgb[0]/255+.7152*e.rgb[1]/255+.0722*e.rgb[2]/255;return new ee(t*e.alpha*100,"%")},saturate:function(e,t,n){if(!e.rgb)return null;var i=We(e);return void 0!==n&&"relative"===n.value?i.s+=i.s*t.value/100:i.s+=t.value/100,i.s=ze(i.s),Ge(e,i)},desaturate:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.s-=i.s*t.value/100:i.s-=t.value/100,i.s=ze(i.s),Ge(e,i)},lighten:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.l+=i.l*t.value/100:i.l+=t.value/100,i.l=ze(i.l),Ge(e,i)},darken:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.l-=i.l*t.value/100:i.l-=t.value/100,i.l=ze(i.l),Ge(e,i)},fadein:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.a+=i.a*t.value/100:i.a+=t.value/100,i.a=ze(i.a),Ge(e,i)},fadeout:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.a-=i.a*t.value/100:i.a-=t.value/100,i.a=ze(i.a),Ge(e,i)},fade:function(e,t){var n=We(e);return n.a=t.value/100,n.a=ze(n.a),Ge(e,n)},spin:function(e,t){var n=We(e),i=(n.h+t.value)%360;return n.h=i<0?360+i:i,Ge(e,n)},mix:function(e,t,n){n||(n=new ee(50));var i=n.value/100,r=2*i-1,o=We(e).a-We(t).a,s=((r*o==-1?r:(r+o)/(1+r*o))+1)/2,a=1-s,l=[e.rgb[0]*s+t.rgb[0]*a,e.rgb[1]*s+t.rgb[1]*a,e.rgb[2]*s+t.rgb[2]*a],u=e.alpha*i+t.alpha*(1-i);return new p(l,u)},greyscale:function(e){return je.desaturate(e,new ee(100))},contrast:function(e,t,n,i){if(!e.rgb)return null;if(void 0===n&&(n=je.rgba(255,255,255,1)),void 0===t&&(t=je.rgba(0,0,0,1)),t.luma()>n.luma()){var r=n;n=t,t=r}return i=void 0===i?.43:He(i),e.luma().5&&(i=1,n=e>.25?Math.sqrt(e):((16*e-12)*e+4)*e),e-(1-2*t)*i*(n-e)},hardlight:function(e,t){return Ze.overlay(t,e)},difference:function(e,t){return Math.abs(e-t)},exclusion:function(e,t){return e+t-2*e*t},average:function(e,t){return(e+t)/2},negation:function(e,t){return 1-Math.abs(e+t-1)}};for(var Xe in Ze)Ze.hasOwnProperty(Xe)&&(Ke[Xe]=Ke.bind(null,Ze[Xe]));var Ye=function(e){return Array.isArray(e.value)?e.value:Array(e)},et={_SELF:function(e){return e},"~":function(){for(var e=[],t=0;ts.value)&&(c[i]=r);else{if(void 0!==l&&a!==l)throw{type:"Argument",message:"incompatible types"};h[a]=c.length,c.push(r)}else Array.isArray(t[n].value)&&Array.prototype.push.apply(t,Array.prototype.slice.call(t[n].value));return 1==c.length?c[0]:(t=c.map((function(e){return e.toCSS(this.context)})).join(this.context.compress?",":", "),new N((e?"min":"max")+"("+t+")"))},ot={min:function(){for(var e=[],t=0;t",r=0;r";return i+="',i=encodeURIComponent(i),new ce(new ue("'"+(i="data:image/svg+xml,"+i)+"'",i,!1,this.index,this.currentFileInfo),this.index,this.currentFileInfo)}}),H.addMultiple(ut),t};function ht(e,t){var n,i=(t=t||{}).variables,r=new j.Eval(t);"object"!=typeof i||Array.isArray(i)||(i=Object.keys(i).map((function(e){var t=i[e];return t instanceof Ie.Value||(t instanceof Ie.Expression||(t=new Ie.Expression([t])),t=new Ie.Value([t])),new Ie.Declaration("@"+e,t,!1,null,0)})),r.frames=[new Ie.Ruleset(null,i)]);var o,s,a=[new De.JoinSelectorVisitor,new De.MarkVisibleSelectorsVisitor(!0),new De.ExtendVisitor,new De.ToCSSVisitor({compress:Boolean(t.compress)})],l=[];if(t.pluginManager){s=t.pluginManager.visitor();for(var u=0;u<2;u++)for(s.first();o=s.get();)o.isPreEvalVisitor?0!==u&&-1!==l.indexOf(o)||(l.push(o),o.run(e)):0!==u&&-1!==a.indexOf(o)||(o.isPreVisitor?a.unshift(o):a.push(o))}n=e.eval(r);for(u=0;u=t);n++);this.preProcessors.splice(n,0,{preProcessor:e,priority:t})},e.prototype.addPostProcessor=function(e,t){var n;for(n=0;n=t);n++);this.postProcessors.splice(n,0,{postProcessor:e,priority:t})},e.prototype.addFileManager=function(e){this.fileManagers.push(e)},e.prototype.getPreProcessors=function(){for(var e=[],t=0;t0){var i=void 0,r=JSON.stringify(this._sourceMapGenerator.toJSON());this.sourceMapURL?i=this.sourceMapURL:this._sourceMapFilename&&(i=this._sourceMapFilename),this.sourceMapURL=i,this.sourceMap=r}return this._css.join("")},t}()}(e=new o(e,t)),e)),a=function(e){return function(){function t(e,t,n){this.less=e,this.rootFilename=n.filename,this.paths=t.paths||[],this.contents={},this.contentsIgnoredChars={},this.mime=t.mime,this.error=null,this.context=t,this.queue=[],this.files={}}return t.prototype.push=function(t,n,i,o,s){var a=this,l=this.context.pluginManager.Loader;this.queue.push(t);var u=function(e,n,i){a.queue.splice(a.queue.indexOf(t),1);var l=i===a.rootFilename;o.optional&&e?(s(null,{rules:[]},!1,null),r.info("The file "+i+" was skipped because it was not found and the import was marked optional.")):(a.files[i]||o.inline||(a.files[i]={root:n,options:o}),e&&!a.error&&(a.error=e),s(e,n,l,i))},c={rewriteUrls:this.context.rewriteUrls,entryPath:i.entryPath,rootpath:i.rootpath,rootFilename:i.rootFilename},h=e.getFileManager(t,i.currentDirectory,this.context,e);if(h){var f,p,v=function(e){var t,n=e.filename,r=e.contents.replace(/^\uFEFF/,"");c.currentDirectory=h.getPath(n),c.rewriteUrls&&(c.rootpath=h.join(a.context.rootpath||"",h.pathDiff(c.currentDirectory,c.entryPath)),!h.isPathAbsolute(c.rootpath)&&h.alwaysMakePathsAbsolute()&&(c.rootpath=h.join(c.entryPath,c.rootpath))),c.filename=n;var s=new j.Parse(a.context);s.processImports=!1,a.contents[n]=r,(i.reference||o.reference)&&(c.reference=!0),o.isPlugin?(t=l.evalPlugin(r,s,a,o.pluginArgs,c))instanceof V?u(t,null,n):u(null,t,n):o.inline?u(null,r,n):!a.files[n]||a.files[n].options.multiple||o.multiple?new Ue(s,a,c).parse(r,(function(e,t){u(e,t,n)})):u(null,a.files[n].root,n)},d=_(this.context);n&&(d.ext=o.isPlugin?".js":".less"),o.isPlugin?(d.mime="application/javascript",d.syncImport?f=l.loadPluginSync(t,i.currentDirectory,d,e,h):p=l.loadPlugin(t,i.currentDirectory,d,e,h)):d.syncImport?f=h.loadFileSync(t,i.currentDirectory,d,e):p=h.loadFile(t,i.currentDirectory,d,e,(function(e,t){e?u(e):v(t)})),f?f.filename?v(f):u(f):p&&p.then(v,u)}else u({message:"Could not find a file-manager for "+t})},t}()}(e);var u,c=function(e,t,n){var i=function(e,n,r){if("function"==typeof n?(r=n,n=M(this.options,{})):n=M(this.options,n||{}),!r){var o=this;return new Promise((function(t,r){i.call(o,e,n,(function(e,n){e?r(e):t(n)}))}))}this.parse(e,n,(function(e,n,i,o){if(e)return r(e);var s;try{s=new t(n,i).toCSS(o)}catch(e){return r(e)}r(null,s)}))};return i}(0,s),h=function(e,t,n){var i=function(e,t,r){if("function"==typeof t?(r=t,t=M(this.options,{})):t=M(this.options,t||{}),!r){var o=this;return new Promise((function(n,r){i.call(o,e,t,(function(e,t){e?r(e):n(t)}))}))}var s,a=void 0,l=new mt(this,!t.reUsePluginManager);if(t.pluginManager=l,s=new j.Parse(t),t.rootFileInfo)a=t.rootFileInfo;else{var u=t.filename||"input",c=u.replace(/[^\/\\]*$/,"");(a={filename:u,rewriteUrls:s.rewriteUrls,rootpath:s.rootpath||"",currentDirectory:c,entryPath:c,rootFilename:u}).rootpath&&"/"!==a.rootpath.slice(-1)&&(a.rootpath+="/")}var h=new n(this,s,a);this.importManager=h,t.plugins&&t.plugins.forEach((function(e){var t,n;if(e.fileContent){if(n=e.fileContent.replace(/^\uFEFF/,""),(t=l.Loader.evalPlugin(n,s,h,e.options,e.filename))instanceof V)return r(t)}else l.addPlugin(e)})),new Ue(s,h,a).parse(e,(function(e,n){if(e)return r(e);r(null,n,h,t)}),t)};return i}(0,0,a),f={version:[4,0,0],data:l,tree:Ie,Environment:o,AbstractFileManager:Ce,AbstractPluginLoader:ke,environment:e,visitors:De,Parser:Ue,functions:ct(e),contexts:j,SourceMapOutput:n,SourceMapBuilder:i,ParseTree:s,ImportManager:a,render:c,parse:h,LessError:V,transformTree:ht,utils:P,PluginManager:mt,logger:r},p=function(e){return function(){var t=Object.create(e.prototype);return e.apply(t,Array.prototype.slice.call(arguments,0)),t}},v=Object.create(f);for(var d in f.tree)if("function"==typeof(u=f.tree[d]))v[d.toLowerCase()]=p(u);else for(var m in v[d]=Object.create(null),u)v[d][m.toLowerCase()]=p(u[m]);return f.parse=f.parse.bind(v),f.render=f.render.bind(v),v}var yt={},bt=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return h(t,e),t.prototype.alwaysMakePathsAbsolute=function(){return!0},t.prototype.join=function(e,t){return e?this.extractUrlParts(t,e).path:t},t.prototype.doXHR=function(e,t,n,i){var r=new XMLHttpRequest,o=!pt.isFileProtocol||pt.fileAsync;function s(t,n,i){t.status>=200&&t.status<300?n(t.responseText,t.getResponseHeader("Last-Modified")):"function"==typeof i&&i(t.status,e)}"function"==typeof r.overrideMimeType&&r.overrideMimeType("text/css"),vt.debug("XHR: Getting '"+e+"'"),r.open("GET",e,o),r.setRequestHeader("Accept",t||"text/x-less, text/css; q=0.9, */*; q=0.5"),r.send(null),pt.isFileProtocol&&!pt.fileAsync?0===r.status||r.status>=200&&r.status<300?n(r.responseText):i(r.status,e):o?r.onreadystatechange=function(){4==r.readyState&&s(r,n,i)}:s(r,n,i)},t.prototype.supports=function(){return!0},t.prototype.clearFileCache=function(){yt={}},t.prototype.loadFile=function(e,t,n,i){t&&!this.isPathAbsolute(e)&&(e=t+e),e=n.ext?this.tryAppendExtension(e,n.ext):e,n=n||{};var r=this.extractUrlParts(e,window.location.href).url,o=this;return new Promise((function(e,t){if(n.useFileCache&&yt[r])try{var i=yt[r];return e({contents:i,filename:r,webInfo:{lastModified:new Date}})}catch(e){return t({filename:r,message:"Error loading file "+r+" error was "+e.message})}o.doXHR(r,n.mime,(function(t,n){yt[r]=t,e({contents:t,filename:r,webInfo:{lastModified:n}})}),(function(e,n){t({type:"File",message:"'"+n+"' wasn't found ("+e+")",href:r})}))}))},t}(Ce),wt=function(e,t){return pt=e,vt=t,bt},xt=function(e){function t(t){var n=e.call(this)||this;return n.less=t,n}return h(t,e),t.prototype.loadPlugin=function(e,t,n,i,r){return new Promise((function(o,s){r.loadFile(e,t,n,i).then(o).catch(s)}))},t}(ke),St=function(t,i,r){return{add:function(o,s){r.errorReporting&&"html"!==r.errorReporting?"console"===r.errorReporting?function(e,t){var n=e.filename||t,o=[],s=(e.type||"Syntax")+"Error: "+(e.message||"There is an error in your .less file")+" in "+n,a=function(e,t,n){void 0!==e.extract[t]&&o.push("{line} {content}".replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,n).replace(/\{content\}/,e.extract[t]))};e.line&&(a(e,0,""),a(e,1,"line"),a(e,2,""),s+=" on line "+e.line+", column "+(e.column+1)+":\n"+o.join("\n")),e.stack&&(e.extract||r.logLevel>=4)&&(s+="\nStack Trace\n"+e.stack),i.logger.error(s)}(o,s):"function"==typeof r.errorReporting&&r.errorReporting("add",o,s):function(i,o){var s,a,l="less-error-message:"+e(o||""),u=t.document.createElement("div"),c=[],h=i.filename||o,f=h.match(/([^\/]+(\?.*)?)$/)[1];u.id=l,u.className="less-error-message",a="

    "+(i.type||"Syntax")+"Error: "+(i.message||"There is an error in your .less file")+'

    in '+f+" ";var p=function(e,t,n){void 0!==e.extract[t]&&c.push('

  • {content}
  • '.replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,n).replace(/\{content\}/,e.extract[t]))};i.line&&(p(i,0,""),p(i,1,"line"),p(i,2,""),a+="on line "+i.line+", column "+(i.column+1)+":

      "+c.join("")+"
    "),i.stack&&(i.extract||r.logLevel>=4)&&(a+="
    Stack Trace
    "+i.stack.split("\n").slice(1).join("
    ")),u.innerHTML=a,n(t.document,[".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #dd6666;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.line {","color: #ff0000;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),u.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),"development"===r.env&&(s=setInterval((function(){var e=t.document,n=e.body;n&&(e.getElementById(l)?n.replaceChild(u,e.getElementById(l)):n.insertBefore(u,n.firstChild),clearInterval(s))}),10))}(o,s)},remove:function(n){r.errorReporting&&"html"!==r.errorReporting?"console"===r.errorReporting||"function"==typeof r.errorReporting&&r.errorReporting("remove",n):function(n){var i=t.document.getElementById("less-error-message:"+e(n));i&&i.parentNode.removeChild(i)}(n)}}},It={javascriptEnabled:!1,depends:!1,compress:!1,lint:!1,paths:[],color:!0,strictImports:!1,insecure:!1,rootpath:"",rewriteUrls:!1,math:1,strictUnits:!1,globalVars:null,modifyVars:null,urlArgs:""};if(window.less)for(var Ct in window.less)window.less.hasOwnProperty(Ct)&&(It[Ct]=window.less[Ct]);!function(e,n){t(n,i(e)),void 0===n.isFileProtocol&&(n.isFileProtocol=/^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(e.location.protocol)),n.async=n.async||!1,n.fileAsync=n.fileAsync||!1,n.poll=n.poll||(n.isFileProtocol?1e3:1500),n.env=n.env||("127.0.0.1"==e.location.hostname||"0.0.0.0"==e.location.hostname||"localhost"==e.location.hostname||e.location.port&&e.location.port.length>0||n.isFileProtocol?"development":"production");var r=/!dumpLineNumbers:(comments|mediaquery|all)/.exec(e.location.hash);r&&(n.dumpLineNumbers=r[1]),void 0===n.useFileCache&&(n.useFileCache=!0),void 0===n.onReady&&(n.onReady=!0),n.relativeUrls&&(n.rewriteUrls="all")}(window,It),It.plugins=It.plugins||[],window.LESS_PLUGINS&&(It.plugins=It.plugins.concat(window.LESS_PLUGINS));var kt,_t,At,Mt=function(e,i){var r=e.document,o=gt();o.options=i;var s=o.environment,a=wt(i,o.logger),l=new a;s.addFileManager(l),o.FileManager=a,o.PluginLoader=xt,function(e,t){t.logLevel=void 0!==t.logLevel?t.logLevel:"development"===t.env?3:1,t.loggers||(t.loggers=[{debug:function(e){t.logLevel>=4&&console.log(e)},info:function(e){t.logLevel>=3&&console.log(e)},warn:function(e){t.logLevel>=2&&console.warn(e)},error:function(e){t.logLevel>=1&&console.error(e)}}]);for(var n=0;n 0 && styleNode.childNodes.length > 0 &&\n oldStyleNode.firstChild.nodeValue === styleNode.firstChild.nodeValue);\n }\n\n const head = document.getElementsByTagName('head')[0];\n\n // If there is no oldStyleNode, just append; otherwise, only append if we need\n // to replace oldStyleNode with an updated stylesheet\n if (oldStyleNode === null || keepOldStyleNode === false) {\n const nextEl = sheet && sheet.nextSibling || null;\n if (nextEl) {\n nextEl.parentNode.insertBefore(styleNode, nextEl);\n } else {\n head.appendChild(styleNode);\n }\n }\n if (oldStyleNode && keepOldStyleNode === false) {\n oldStyleNode.parentNode.removeChild(oldStyleNode);\n }\n\n // For IE.\n // This needs to happen *after* the style element is added to the DOM, otherwise IE 7 and 8 may crash.\n // See http://social.msdn.microsoft.com/Forums/en-US/7e081b65-878a-4c22-8e68-c10d39c2ed32/internet-explorer-crashes-appending-style-element-to-head\n if (styleNode.styleSheet) {\n try {\n styleNode.styleSheet.cssText = styles;\n } catch (e) {\n throw new Error('Couldn\\'t reassign styleSheet.cssText.');\n }\n }\n },\n currentScript: function(window) {\n const document = window.document;\n return document.currentScript || (() => {\n const scripts = document.getElementsByTagName('script');\n return scripts[scripts.length - 1];\n })();\n }\n};\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","export default {\n 'aliceblue':'#f0f8ff',\n 'antiquewhite':'#faebd7',\n 'aqua':'#00ffff',\n 'aquamarine':'#7fffd4',\n 'azure':'#f0ffff',\n 'beige':'#f5f5dc',\n 'bisque':'#ffe4c4',\n 'black':'#000000',\n 'blanchedalmond':'#ffebcd',\n 'blue':'#0000ff',\n 'blueviolet':'#8a2be2',\n 'brown':'#a52a2a',\n 'burlywood':'#deb887',\n 'cadetblue':'#5f9ea0',\n 'chartreuse':'#7fff00',\n 'chocolate':'#d2691e',\n 'coral':'#ff7f50',\n 'cornflowerblue':'#6495ed',\n 'cornsilk':'#fff8dc',\n 'crimson':'#dc143c',\n 'cyan':'#00ffff',\n 'darkblue':'#00008b',\n 'darkcyan':'#008b8b',\n 'darkgoldenrod':'#b8860b',\n 'darkgray':'#a9a9a9',\n 'darkgrey':'#a9a9a9',\n 'darkgreen':'#006400',\n 'darkkhaki':'#bdb76b',\n 'darkmagenta':'#8b008b',\n 'darkolivegreen':'#556b2f',\n 'darkorange':'#ff8c00',\n 'darkorchid':'#9932cc',\n 'darkred':'#8b0000',\n 'darksalmon':'#e9967a',\n 'darkseagreen':'#8fbc8f',\n 'darkslateblue':'#483d8b',\n 'darkslategray':'#2f4f4f',\n 'darkslategrey':'#2f4f4f',\n 'darkturquoise':'#00ced1',\n 'darkviolet':'#9400d3',\n 'deeppink':'#ff1493',\n 'deepskyblue':'#00bfff',\n 'dimgray':'#696969',\n 'dimgrey':'#696969',\n 'dodgerblue':'#1e90ff',\n 'firebrick':'#b22222',\n 'floralwhite':'#fffaf0',\n 'forestgreen':'#228b22',\n 'fuchsia':'#ff00ff',\n 'gainsboro':'#dcdcdc',\n 'ghostwhite':'#f8f8ff',\n 'gold':'#ffd700',\n 'goldenrod':'#daa520',\n 'gray':'#808080',\n 'grey':'#808080',\n 'green':'#008000',\n 'greenyellow':'#adff2f',\n 'honeydew':'#f0fff0',\n 'hotpink':'#ff69b4',\n 'indianred':'#cd5c5c',\n 'indigo':'#4b0082',\n 'ivory':'#fffff0',\n 'khaki':'#f0e68c',\n 'lavender':'#e6e6fa',\n 'lavenderblush':'#fff0f5',\n 'lawngreen':'#7cfc00',\n 'lemonchiffon':'#fffacd',\n 'lightblue':'#add8e6',\n 'lightcoral':'#f08080',\n 'lightcyan':'#e0ffff',\n 'lightgoldenrodyellow':'#fafad2',\n 'lightgray':'#d3d3d3',\n 'lightgrey':'#d3d3d3',\n 'lightgreen':'#90ee90',\n 'lightpink':'#ffb6c1',\n 'lightsalmon':'#ffa07a',\n 'lightseagreen':'#20b2aa',\n 'lightskyblue':'#87cefa',\n 'lightslategray':'#778899',\n 'lightslategrey':'#778899',\n 'lightsteelblue':'#b0c4de',\n 'lightyellow':'#ffffe0',\n 'lime':'#00ff00',\n 'limegreen':'#32cd32',\n 'linen':'#faf0e6',\n 'magenta':'#ff00ff',\n 'maroon':'#800000',\n 'mediumaquamarine':'#66cdaa',\n 'mediumblue':'#0000cd',\n 'mediumorchid':'#ba55d3',\n 'mediumpurple':'#9370d8',\n 'mediumseagreen':'#3cb371',\n 'mediumslateblue':'#7b68ee',\n 'mediumspringgreen':'#00fa9a',\n 'mediumturquoise':'#48d1cc',\n 'mediumvioletred':'#c71585',\n 'midnightblue':'#191970',\n 'mintcream':'#f5fffa',\n 'mistyrose':'#ffe4e1',\n 'moccasin':'#ffe4b5',\n 'navajowhite':'#ffdead',\n 'navy':'#000080',\n 'oldlace':'#fdf5e6',\n 'olive':'#808000',\n 'olivedrab':'#6b8e23',\n 'orange':'#ffa500',\n 'orangered':'#ff4500',\n 'orchid':'#da70d6',\n 'palegoldenrod':'#eee8aa',\n 'palegreen':'#98fb98',\n 'paleturquoise':'#afeeee',\n 'palevioletred':'#d87093',\n 'papayawhip':'#ffefd5',\n 'peachpuff':'#ffdab9',\n 'peru':'#cd853f',\n 'pink':'#ffc0cb',\n 'plum':'#dda0dd',\n 'powderblue':'#b0e0e6',\n 'purple':'#800080',\n 'rebeccapurple':'#663399',\n 'red':'#ff0000',\n 'rosybrown':'#bc8f8f',\n 'royalblue':'#4169e1',\n 'saddlebrown':'#8b4513',\n 'salmon':'#fa8072',\n 'sandybrown':'#f4a460',\n 'seagreen':'#2e8b57',\n 'seashell':'#fff5ee',\n 'sienna':'#a0522d',\n 'silver':'#c0c0c0',\n 'skyblue':'#87ceeb',\n 'slateblue':'#6a5acd',\n 'slategray':'#708090',\n 'slategrey':'#708090',\n 'snow':'#fffafa',\n 'springgreen':'#00ff7f',\n 'steelblue':'#4682b4',\n 'tan':'#d2b48c',\n 'teal':'#008080',\n 'thistle':'#d8bfd8',\n 'tomato':'#ff6347',\n 'turquoise':'#40e0d0',\n 'violet':'#ee82ee',\n 'wheat':'#f5deb3',\n 'white':'#ffffff',\n 'whitesmoke':'#f5f5f5',\n 'yellow':'#ffff00',\n 'yellowgreen':'#9acd32'\n};","export default {\n length: {\n 'm': 1,\n 'cm': 0.01,\n 'mm': 0.001,\n 'in': 0.0254,\n 'px': 0.0254 / 96,\n 'pt': 0.0254 / 72,\n 'pc': 0.0254 / 72 * 12\n },\n duration: {\n 's': 1,\n 'ms': 0.001\n },\n angle: {\n 'rad': 1 / (2 * Math.PI),\n 'deg': 1 / 360,\n 'grad': 1 / 400,\n 'turn': 1\n }\n};","import colors from './colors';\nimport unitConversions from './unit-conversions';\n\nexport default { colors, unitConversions };\n","class Node {\n constructor() {\n this.parent = null;\n this.visibilityBlocks = undefined;\n this.nodeVisible = undefined;\n this.rootNode = null;\n this.parsed = null;\n\n const self = this;\n Object.defineProperty(this, 'currentFileInfo', {\n get: function() { return self.fileInfo(); }\n });\n Object.defineProperty(this, 'index', {\n get: function() { return self.getIndex(); }\n });\n\n }\n\n setParent(nodes, parent) {\n function set(node) {\n if (node && node instanceof Node) {\n node.parent = parent;\n }\n }\n if (Array.isArray(nodes)) {\n nodes.forEach(set);\n }\n else {\n set(nodes);\n }\n }\n\n getIndex() {\n return this._index || (this.parent && this.parent.getIndex()) || 0;\n }\n\n fileInfo() {\n return this._fileInfo || (this.parent && this.parent.fileInfo()) || {};\n }\n\n isRulesetLike() {\n return false;\n }\n\n toCSS(context) {\n const strs = [];\n this.genCSS(context, {\n add: function(chunk, fileInfo, index) {\n strs.push(chunk);\n },\n isEmpty: function () {\n return strs.length === 0;\n }\n });\n return strs.join('');\n }\n\n genCSS(context, output) {\n output.add(this.value);\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n eval() { return this; }\n\n _operate(context, op, a, b) {\n switch (op) {\n case '+': return a + b;\n case '-': return a - b;\n case '*': return a * b;\n case '/': return a / b;\n }\n }\n\n fround(context, value) {\n const precision = context && context.numPrecision;\n // add \"epsilon\" to ensure numbers like 1.000000005 (represented as 1.000000004999...) are properly rounded:\n return (precision) ? Number((value + 2e-16).toFixed(precision)) : value;\n }\n\n // Returns true if this node represents root of ast imported by reference\n blocksVisibility() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n return this.visibilityBlocks !== 0;\n }\n\n addVisibilityBlock() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks + 1;\n }\n\n removeVisibilityBlock() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks - 1;\n }\n\n // Turns on node visibility - if called node will be shown in output regardless\n // of whether it comes from import by reference or not\n ensureVisibility() {\n this.nodeVisible = true;\n }\n\n // Turns off node visibility - if called node will NOT be shown in output regardless\n // of whether it comes from import by reference or not\n ensureInvisibility() {\n this.nodeVisible = false;\n }\n\n // return values:\n // false - the node must not be visible\n // true - the node must be visible\n // undefined or null - the node has the same visibility as its parent\n isVisible() {\n return this.nodeVisible;\n }\n\n visibilityInfo() {\n return {\n visibilityBlocks: this.visibilityBlocks,\n nodeVisible: this.nodeVisible\n };\n }\n\n copyVisibilityInfo(info) {\n if (!info) {\n return;\n }\n this.visibilityBlocks = info.visibilityBlocks;\n this.nodeVisible = info.nodeVisible;\n }\n}\n\nNode.compare = (a, b) => {\n /* returns:\n -1: a < b\n 0: a = b\n 1: a > b\n and *any* other value for a != b (e.g. undefined, NaN, -2 etc.) */\n\n if ((a.compare) &&\n // for \"symmetric results\" force toCSS-based comparison\n // of Quoted or Anonymous if either value is one of those\n !(b.type === 'Quoted' || b.type === 'Anonymous')) {\n return a.compare(b);\n } else if (b.compare) {\n return -b.compare(a);\n } else if (a.type !== b.type) {\n return undefined;\n }\n\n a = a.value;\n b = b.value;\n if (!Array.isArray(a)) {\n return a === b ? 0 : undefined;\n }\n if (a.length !== b.length) {\n return undefined;\n }\n for (let i = 0; i < a.length; i++) {\n if (Node.compare(a[i], b[i]) !== 0) {\n return undefined;\n }\n }\n return 0;\n};\n\nNode.numericCompare = (a, b) => a < b ? -1\n : a === b ? 0\n : a > b ? 1 : undefined;\nexport default Node;\n","import Node from './node';\nimport colors from '../data/colors';\n\n//\n// RGB Colors - #ff0014, #eee\n//\nclass Color extends Node {\n constructor(rgb, a, originalForm) {\n super();\n\n const self = this;\n //\n // The end goal here, is to parse the arguments\n // into an integer triplet, such as `128, 255, 0`\n //\n // This facilitates operations and conversions.\n //\n if (Array.isArray(rgb)) {\n this.rgb = rgb;\n } else if (rgb.length >= 6) {\n this.rgb = [];\n rgb.match(/.{2}/g).map((c, i) => {\n if (i < 3) {\n self.rgb.push(parseInt(c, 16));\n } else {\n self.alpha = (parseInt(c, 16)) / 255;\n }\n });\n } else {\n this.rgb = [];\n rgb.split('').map((c, i) => {\n if (i < 3) {\n self.rgb.push(parseInt(c + c, 16));\n } else {\n self.alpha = (parseInt(c + c, 16)) / 255;\n }\n });\n }\n this.alpha = this.alpha || (typeof a === 'number' ? a : 1);\n if (typeof originalForm !== 'undefined') {\n this.value = originalForm;\n }\n }\n\n luma() {\n let r = this.rgb[0] / 255;\n let g = this.rgb[1] / 255;\n let b = this.rgb[2] / 255;\n\n r = (r <= 0.03928) ? r / 12.92 : Math.pow(((r + 0.055) / 1.055), 2.4);\n g = (g <= 0.03928) ? g / 12.92 : Math.pow(((g + 0.055) / 1.055), 2.4);\n b = (b <= 0.03928) ? b / 12.92 : Math.pow(((b + 0.055) / 1.055), 2.4);\n\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n }\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n }\n\n toCSS(context, doNotCompress) {\n const compress = context && context.compress && !doNotCompress;\n let color;\n let alpha;\n let colorFunction;\n let args = [];\n\n // `value` is set if this color was originally\n // converted from a named color string so we need\n // to respect this and try to output named color too.\n alpha = this.fround(context, this.alpha);\n\n if (this.value) {\n if (this.value.indexOf('rgb') === 0) {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n } else if (this.value.indexOf('hsl') === 0) {\n if (alpha < 1) {\n colorFunction = 'hsla';\n } else {\n colorFunction = 'hsl';\n }\n } else {\n return this.value;\n }\n } else {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n }\n\n switch (colorFunction) {\n case 'rgba':\n args = this.rgb.map(c => clamp(Math.round(c), 255)).concat(clamp(alpha, 1));\n break;\n case 'hsla':\n args.push(clamp(alpha, 1));\n case 'hsl':\n color = this.toHSL();\n args = [\n this.fround(context, color.h),\n `${this.fround(context, color.s * 100)}%`,\n `${this.fround(context, color.l * 100)}%`\n ].concat(args);\n }\n\n if (colorFunction) {\n // Values are capped between `0` and `255`, rounded and zero-padded.\n return `${colorFunction}(${args.join(`,${compress ? '' : ' '}`)})`;\n }\n\n color = this.toRGB();\n\n if (compress) {\n const splitcolor = color.split('');\n\n // Convert color to short format\n if (splitcolor[1] === splitcolor[2] && splitcolor[3] === splitcolor[4] && splitcolor[5] === splitcolor[6]) {\n color = `#${splitcolor[1]}${splitcolor[3]}${splitcolor[5]}`;\n }\n }\n\n return color;\n }\n\n //\n // Operations have to be done per-channel, if not,\n // channels will spill onto each other. Once we have\n // our result, in the form of an integer triplet,\n // we create a new Color node to hold the result.\n //\n operate(context, op, other) {\n const rgb = new Array(3);\n const alpha = this.alpha * (1 - other.alpha) + other.alpha;\n for (let c = 0; c < 3; c++) {\n rgb[c] = this._operate(context, op, this.rgb[c], other.rgb[c]);\n }\n return new Color(rgb, alpha);\n }\n\n toRGB() {\n return toHex(this.rgb);\n }\n\n toHSL() {\n const r = this.rgb[0] / 255;\n const g = this.rgb[1] / 255;\n const b = this.rgb[2] / 255;\n const a = this.alpha;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n let h;\n let s;\n const l = (max + min) / 2;\n const d = max - min;\n\n if (max === min) {\n h = s = 0;\n } else {\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, l, a };\n }\n\n // Adapted from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript\n toHSV() {\n const r = this.rgb[0] / 255;\n const g = this.rgb[1] / 255;\n const b = this.rgb[2] / 255;\n const a = this.alpha;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n let h;\n let s;\n const v = max;\n\n const d = max - min;\n if (max === 0) {\n s = 0;\n } else {\n s = d / max;\n }\n\n if (max === min) {\n h = 0;\n } else {\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, v, a };\n }\n\n toARGB() {\n return toHex([this.alpha * 255].concat(this.rgb));\n }\n\n compare(x) {\n return (x.rgb &&\n x.rgb[0] === this.rgb[0] &&\n x.rgb[1] === this.rgb[1] &&\n x.rgb[2] === this.rgb[2] &&\n x.alpha === this.alpha) ? 0 : undefined;\n }\n}\n\nColor.prototype.type = 'Color';\n\nfunction clamp(v, max) {\n return Math.min(Math.max(v, 0), max);\n}\n\nfunction toHex(v) {\n return `#${v.map(c => {\n c = clamp(Math.round(c), 255);\n return (c < 16 ? '0' : '') + c.toString(16);\n }).join('')}`;\n}\n\nColor.fromKeyword = keyword => {\n let c;\n const key = keyword.toLowerCase();\n if (colors.hasOwnProperty(key)) {\n c = new Color(colors[key].slice(1));\n }\n else if (key === 'transparent') {\n c = new Color([0, 0, 0], 0);\n }\n\n if (c) {\n c.value = keyword;\n return c;\n }\n};\nexport default Color;\n","import Node from './node';\n\nclass Paren extends Node {\n constructor(node) {\n super();\n\n this.value = node;\n }\n\n genCSS(context, output) {\n output.add('(');\n this.value.genCSS(context, output);\n output.add(')');\n }\n\n eval(context) {\n return new Paren(this.value.eval(context));\n }\n}\n\nParen.prototype.type = 'Paren';\nexport default Paren;\n","import Node from './node';\nconst _noSpaceCombinators = {\n '': true,\n ' ': true,\n '|': true\n};\n\nclass Combinator extends Node {\n constructor(value) {\n super();\n\n if (value === ' ') {\n this.value = ' ';\n this.emptyOrWhitespace = true;\n } else {\n this.value = value ? value.trim() : '';\n this.emptyOrWhitespace = this.value === '';\n }\n }\n\n genCSS(context, output) {\n const spaceOrEmpty = (context.compress || _noSpaceCombinators[this.value]) ? '' : ' ';\n output.add(spaceOrEmpty + this.value + spaceOrEmpty);\n }\n}\n\nCombinator.prototype.type = 'Combinator';\n\nexport default Combinator;\n","import Node from './node';\nimport Paren from './paren';\nimport Combinator from './combinator';\n\nclass Element extends Node {\n constructor(combinator, value, isVariable, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.combinator = combinator instanceof Combinator ?\n combinator : new Combinator(combinator);\n\n if (typeof value === 'string') {\n this.value = value.trim();\n } else if (value) {\n this.value = value;\n } else {\n this.value = '';\n }\n this.isVariable = isVariable;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.combinator, this);\n }\n\n accept(visitor) {\n const value = this.value;\n this.combinator = visitor.visit(this.combinator);\n if (typeof value === 'object') {\n this.value = visitor.visit(value);\n }\n }\n\n eval(context) {\n return new Element(this.combinator,\n this.value.eval ? this.value.eval(context) : this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n }\n\n clone() {\n return new Element(this.combinator,\n this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n }\n\n genCSS(context, output) {\n output.add(this.toCSS(context), this.fileInfo(), this.getIndex());\n }\n\n toCSS(context = {}) {\n let value = this.value;\n const firstSelector = context.firstSelector;\n if (value instanceof Paren) {\n // selector in parens should not be affected by outer selector\n // flags (breaks only interpolated selectors - see #1973)\n context.firstSelector = true;\n }\n value = value.toCSS ? value.toCSS(context) : value;\n context.firstSelector = firstSelector;\n if (value === '' && this.combinator.value.charAt(0) === '&') {\n return '';\n } else {\n return this.combinator.toCSS(context) + value;\n }\n }\n}\n\nElement.prototype.type = 'Element';\nexport default Element;\n","\nexport const Math = {\n ALWAYS: 0,\n PARENS_DIVISION: 1,\n PARENS: 2,\n STRICT_LEGACY: 3\n};\n\nexport const RewriteUrls = {\n OFF: 0,\n LOCAL: 1,\n ALL: 2\n};","/* jshint proto: true */\nimport * as Constants from './constants';\n\nexport function getLocation(index, inputStream) {\n let n = index + 1;\n let line = null;\n let column = -1;\n\n while (--n >= 0 && inputStream.charAt(n) !== '\\n') {\n column++;\n }\n\n if (typeof index === 'number') {\n line = (inputStream.slice(0, index).match(/\\n/g) || '').length;\n }\n\n return {\n line,\n column\n };\n}\n\nexport function copyArray(arr) {\n let i;\n const length = arr.length;\n const copy = new Array(length);\n\n for (i = 0; i < length; i++) {\n copy[i] = arr[i];\n }\n return copy;\n}\n\nexport function clone(obj) {\n const cloned = {};\n for (const prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n cloned[prop] = obj[prop];\n }\n }\n return cloned;\n}\n\nexport function defaults(obj1, obj2) {\n let newObj = obj2 || {};\n if (!obj2._defaults) {\n newObj = {};\n const defaults = {...obj1};\n newObj._defaults = defaults;\n const cloned = obj2 ? {...obj2} : {};\n Object.assign(newObj, defaults, cloned);\n }\n return newObj;\n}\n\nexport function copyOptions(obj1, obj2) {\n if (obj2 && obj2._defaults) {\n return obj2;\n }\n const opts = defaults(obj1, obj2);\n if (opts.strictMath) {\n opts.math = Constants.Math.STRICT_LEGACY;\n }\n // Back compat with changed relativeUrls option\n if (opts.relativeUrls) {\n opts.rewriteUrls = Constants.RewriteUrls.ALL;\n }\n if (typeof opts.math === 'string') {\n switch (opts.math.toLowerCase()) {\n case 'always':\n opts.math = Constants.Math.ALWAYS;\n break;\n case 'parens-division':\n opts.math = Constants.Math.PARENS_DIVISION;\n break;\n case 'strict':\n case 'parens':\n opts.math = Constants.Math.PARENS;\n break;\n case 'strict-legacy':\n opts.math = Constants.Math.STRICT_LEGACY;\n }\n }\n if (typeof opts.rewriteUrls === 'string') {\n switch (opts.rewriteUrls.toLowerCase()) {\n case 'off':\n opts.rewriteUrls = Constants.RewriteUrls.OFF;\n break;\n case 'local':\n opts.rewriteUrls = Constants.RewriteUrls.LOCAL;\n break;\n case 'all':\n opts.rewriteUrls = Constants.RewriteUrls.ALL;\n break;\n }\n }\n return opts;\n}\n\nexport function merge(obj1, obj2) {\n for (const prop in obj2) {\n if (obj2.hasOwnProperty(prop)) {\n obj1[prop] = obj2[prop];\n }\n }\n return obj1;\n}\n\nexport function flattenArray(arr, result = []) {\n for (let i = 0, length = arr.length; i < length; i++) {\n const value = arr[i];\n if (Array.isArray(value)) {\n flattenArray(value, result);\n } else {\n if (value !== undefined) {\n result.push(value);\n }\n }\n }\n return result;\n}","import * as utils from './utils';\n\nconst anonymousFunc = /(|Function):(\\d+):(\\d+)/;\n\n/**\n * This is a centralized class of any error that could be thrown internally (mostly by the parser).\n * Besides standard .message it keeps some additional data like a path to the file where the error\n * occurred along with line and column numbers.\n *\n * @class\n * @extends Error\n * @type {module.LessError}\n *\n * @prop {string} type\n * @prop {string} filename\n * @prop {number} index\n * @prop {number} line\n * @prop {number} column\n * @prop {number} callLine\n * @prop {number} callExtract\n * @prop {string[]} extract\n *\n * @param {Object} e - An error object to wrap around or just a descriptive object\n * @param {Object} fileContentMap - An object with file contents in 'contents' property (like importManager) @todo - move to fileManager?\n * @param {string} [currentFilename]\n */\nconst LessError = function LessError(e, fileContentMap, currentFilename) {\n Error.call(this);\n\n const filename = e.filename || currentFilename;\n\n this.message = e.message;\n this.stack = e.stack;\n\n if (fileContentMap && filename) {\n const input = fileContentMap.contents[filename];\n const loc = utils.getLocation(e.index, input);\n const line = loc.line;\n const col = loc.column;\n const callLine = e.call && utils.getLocation(e.call, input).line;\n const lines = input ? input.split('\\n') : '';\n\n this.type = e.type || 'Syntax';\n this.filename = filename;\n this.index = e.index;\n this.line = typeof line === 'number' ? line + 1 : null;\n this.column = col;\n\n if (!this.line && this.stack) {\n const found = this.stack.match(anonymousFunc);\n\n /**\n * We have to figure out how this environment stringifies anonymous functions\n * so we can correctly map plugin errors.\n * \n * Note, in Node 8, the output of anonymous funcs varied based on parameters\n * being present or not, so we inject dummy params.\n */\n const func = new Function('a', 'throw new Error()');\n let lineAdjust = 0;\n try {\n func();\n } catch (e) {\n const match = e.stack.match(anonymousFunc);\n const line = parseInt(match[2]);\n lineAdjust = 1 - line;\n }\n\n if (found) {\n if (found[2]) {\n this.line = parseInt(found[2]) + lineAdjust;\n }\n if (found[3]) {\n this.column = parseInt(found[3]);\n }\n }\n }\n\n this.callLine = callLine + 1;\n this.callExtract = lines[callLine];\n\n this.extract = [\n lines[this.line - 2],\n lines[this.line - 1],\n lines[this.line]\n ];\n }\n\n};\n\nif (typeof Object.create === 'undefined') {\n const F = () => {};\n F.prototype = Error.prototype;\n LessError.prototype = new F();\n} else {\n LessError.prototype = Object.create(Error.prototype);\n}\n\nLessError.prototype.constructor = LessError;\n\n/**\n * An overridden version of the default Object.prototype.toString\n * which uses additional information to create a helpful message.\n *\n * @param {Object} options\n * @returns {string}\n */\nLessError.prototype.toString = function(options = {}) {\n let message = '';\n const extract = this.extract || [];\n let error = [];\n let stylize = str => str;\n if (options.stylize) {\n const type = typeof options.stylize;\n if (type !== 'function') {\n throw Error(`options.stylize should be a function, got a ${type}!`);\n }\n stylize = options.stylize;\n }\n\n if (this.line !== null) {\n if (typeof extract[0] === 'string') {\n error.push(stylize(`${this.line - 1} ${extract[0]}`, 'grey'));\n }\n\n if (typeof extract[1] === 'string') {\n let errorTxt = `${this.line} `;\n if (extract[1]) {\n errorTxt += extract[1].slice(0, this.column) +\n stylize(stylize(stylize(extract[1].substr(this.column, 1), 'bold') +\n extract[1].slice(this.column + 1), 'red'), 'inverse');\n }\n error.push(errorTxt);\n }\n\n if (typeof extract[2] === 'string') {\n error.push(stylize(`${this.line + 1} ${extract[2]}`, 'grey'));\n }\n error = `${error.join('\\n') + stylize('', 'reset')}\\n`;\n }\n\n message += stylize(`${this.type}Error: ${this.message}`, 'red');\n if (this.filename) {\n message += stylize(' in ', 'red') + this.filename;\n }\n if (this.line) {\n message += stylize(` on line ${this.line}, column ${this.column + 1}:`, 'grey');\n }\n\n message += `\\n${error}`;\n\n if (this.callLine) {\n message += `${stylize('from ', 'red') + (this.filename || '')}/n`;\n message += `${stylize(this.callLine, 'grey')} ${this.callExtract}/n`;\n }\n\n return message;\n};\n\nexport default LessError;","import Node from './node';\nimport Element from './element';\nimport LessError from '../less-error';\n\nclass Selector extends Node {\n constructor(elements, extendList, condition, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.extendList = extendList;\n this.condition = condition;\n this.evaldCondition = !condition;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.elements = this.getElements(elements);\n this.mixinElements_ = undefined;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.elements, this);\n }\n\n accept(visitor) {\n if (this.elements) {\n this.elements = visitor.visitArray(this.elements);\n }\n if (this.extendList) {\n this.extendList = visitor.visitArray(this.extendList);\n }\n if (this.condition) {\n this.condition = visitor.visit(this.condition);\n }\n }\n\n createDerived(elements, extendList, evaldCondition) {\n elements = this.getElements(elements);\n const newSelector = new Selector(elements, extendList || this.extendList,\n null, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n newSelector.evaldCondition = (evaldCondition != null) ? evaldCondition : this.evaldCondition;\n newSelector.mediaEmpty = this.mediaEmpty;\n return newSelector;\n }\n\n getElements(els) {\n if (!els) {\n return [new Element('', '&', false, this._index, this._fileInfo)];\n }\n if (typeof els === 'string') {\n this.parse.parseNode(\n els, \n ['selector'],\n this._index, \n this._fileInfo, \n function(err, result) {\n if (err) {\n throw new LessError({\n index: err.index,\n message: err.message\n }, this.parse.imports, this._fileInfo.filename);\n }\n els = result[0].elements;\n });\n }\n return els;\n }\n\n createEmptySelectors() {\n const el = new Element('', '&', false, this._index, this._fileInfo);\n const sels = [new Selector([el], null, null, this._index, this._fileInfo)];\n sels[0].mediaEmpty = true;\n return sels;\n }\n\n match(other) {\n const elements = this.elements;\n const len = elements.length;\n let olen;\n let i;\n\n other = other.mixinElements();\n olen = other.length;\n if (olen === 0 || len < olen) {\n return 0;\n } else {\n for (i = 0; i < olen; i++) {\n if (elements[i].value !== other[i]) {\n return 0;\n }\n }\n }\n\n return olen; // return number of matched elements\n }\n\n mixinElements() {\n if (this.mixinElements_) {\n return this.mixinElements_;\n }\n\n let elements = this.elements.map( v => v.combinator.value + (v.value.value || v.value)).join('').match(/[,&#\\*\\.\\w-]([\\w-]|(\\\\.))*/g);\n\n if (elements) {\n if (elements[0] === '&') {\n elements.shift();\n }\n } else {\n elements = [];\n }\n\n return (this.mixinElements_ = elements);\n }\n\n isJustParentSelector() {\n return !this.mediaEmpty &&\n this.elements.length === 1 &&\n this.elements[0].value === '&' &&\n (this.elements[0].combinator.value === ' ' || this.elements[0].combinator.value === '');\n }\n\n eval(context) {\n const evaldCondition = this.condition && this.condition.eval(context);\n let elements = this.elements;\n let extendList = this.extendList;\n\n elements = elements && elements.map(e => e.eval(context));\n extendList = extendList && extendList.map(extend => extend.eval(context));\n\n return this.createDerived(elements, extendList, evaldCondition);\n }\n\n genCSS(context, output) {\n let i;\n let element;\n if ((!context || !context.firstSelector) && this.elements[0].combinator.value === '') {\n output.add(' ', this.fileInfo(), this.getIndex());\n }\n for (i = 0; i < this.elements.length; i++) {\n element = this.elements[i];\n element.genCSS(context, output);\n }\n }\n\n getIsOutput() {\n return this.evaldCondition;\n }\n}\n\nSelector.prototype.type = 'Selector';\nexport default Selector;\n","import Node from './node';\n\nclass Value extends Node {\n constructor(value) {\n super();\n\n if (!value) {\n throw new Error('Value requires an array argument');\n }\n if (!Array.isArray(value)) {\n this.value = [ value ];\n }\n else {\n this.value = value;\n }\n }\n\n accept(visitor) {\n if (this.value) {\n this.value = visitor.visitArray(this.value);\n }\n }\n\n eval(context) {\n if (this.value.length === 1) {\n return this.value[0].eval(context);\n } else {\n return new Value(this.value.map(v => v.eval(context)));\n }\n }\n\n genCSS(context, output) {\n let i;\n for (i = 0; i < this.value.length; i++) {\n this.value[i].genCSS(context, output);\n if (i + 1 < this.value.length) {\n output.add((context && context.compress) ? ',' : ', ');\n }\n }\n }\n}\n\nValue.prototype.type = 'Value';\nexport default Value;\n","import Node from './node';\n\nclass Keyword extends Node {\n constructor(value) {\n super();\n\n this.value = value;\n }\n\n genCSS(context, output) {\n if (this.value === '%') { throw { type: 'Syntax', message: 'Invalid % without number' }; }\n output.add(this.value);\n }\n}\n\nKeyword.prototype.type = 'Keyword';\n\nKeyword.True = new Keyword('true');\nKeyword.False = new Keyword('false');\n\nexport default Keyword;\n","import Node from './node';\n\nclass Anonymous extends Node {\n constructor(value, index, currentFileInfo, mapLines, rulesetLike, visibilityInfo) {\n super();\n\n this.value = value;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.mapLines = mapLines;\n this.rulesetLike = (typeof rulesetLike === 'undefined') ? false : rulesetLike;\n this.allowRoot = true;\n this.copyVisibilityInfo(visibilityInfo);\n }\n\n eval() {\n return new Anonymous(this.value, this._index, this._fileInfo, this.mapLines, this.rulesetLike, this.visibilityInfo());\n }\n\n compare(other) {\n return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n }\n\n isRulesetLike() {\n return this.rulesetLike;\n }\n\n genCSS(context, output) {\n this.nodeVisible = Boolean(this.value);\n if (this.nodeVisible) {\n output.add(this.value, this._fileInfo, this._index, this.mapLines);\n }\n }\n}\n\nAnonymous.prototype.type = 'Anonymous';\nexport default Anonymous;\n","import Node from './node';\nimport Value from './value';\nimport Keyword from './keyword';\nimport Anonymous from './anonymous';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\n\nclass Declaration extends Node {\n constructor(name, value, important, merge, index, currentFileInfo, inline, variable) {\n super();\n\n this.name = name;\n this.value = (value instanceof Node) ? value : new Value([value ? new Anonymous(value) : null]);\n this.important = important ? ` ${important.trim()}` : '';\n this.merge = merge;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.inline = inline || false;\n this.variable = (variable !== undefined) ? variable\n : (name.charAt && (name.charAt(0) === '@'));\n this.allowRoot = true;\n this.setParent(this.value, this);\n }\n\n genCSS(context, output) {\n output.add(this.name + (context.compress ? ':' : ': '), this.fileInfo(), this.getIndex());\n try {\n this.value.genCSS(context, output);\n }\n catch (e) {\n e.index = this._index;\n e.filename = this._fileInfo.filename;\n throw e;\n }\n output.add(this.important + ((this.inline || (context.lastRule && context.compress)) ? '' : ';'), this._fileInfo, this._index);\n }\n\n eval(context) {\n let mathBypass = false;\n let prevMath;\n let name = this.name;\n let evaldValue;\n let variable = this.variable;\n if (typeof name !== 'string') {\n // expand 'primitive' name directly to get\n // things faster (~10% for benchmark.less):\n name = (name.length === 1) && (name[0] instanceof Keyword) ?\n name[0].value : evalName(context, name);\n variable = false; // never treat expanded interpolation as new variable name\n }\n\n // @todo remove when parens-division is default\n if (name === 'font' && context.math === MATH.ALWAYS) {\n mathBypass = true;\n prevMath = context.math;\n context.math = MATH.PARENS_DIVISION;\n }\n try {\n context.importantScope.push({});\n evaldValue = this.value.eval(context);\n\n if (!this.variable && evaldValue.type === 'DetachedRuleset') {\n throw { message: 'Rulesets cannot be evaluated on a property.',\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n let important = this.important;\n const importantResult = context.importantScope.pop();\n if (!important && importantResult.important) {\n important = importantResult.important;\n }\n\n return new Declaration(name,\n evaldValue,\n important,\n this.merge,\n this.getIndex(), this.fileInfo(), this.inline,\n variable);\n }\n catch (e) {\n if (typeof e.index !== 'number') {\n e.index = this.getIndex();\n e.filename = this.fileInfo().filename;\n }\n throw e;\n }\n finally {\n if (mathBypass) {\n context.math = prevMath;\n }\n }\n }\n\n makeImportant() {\n return new Declaration(this.name,\n this.value,\n '!important',\n this.merge,\n this.getIndex(), this.fileInfo(), this.inline);\n }\n}\n\nfunction evalName(context, name) {\n let value = '';\n let i;\n const n = name.length;\n const output = {add: function (s) {value += s;}};\n for (i = 0; i < n; i++) {\n name[i].eval(context).genCSS(context, output);\n }\n return value;\n}\n\nDeclaration.prototype.type = 'Declaration';\nexport default Declaration;","const debugInfo = (context, ctx, lineSeparator) => {\n let result = '';\n if (context.dumpLineNumbers && !context.compress) {\n switch (context.dumpLineNumbers) {\n case 'comments':\n result = debugInfo.asComment(ctx);\n break;\n case 'mediaquery':\n result = debugInfo.asMediaQuery(ctx);\n break;\n case 'all':\n result = debugInfo.asComment(ctx) + (lineSeparator || '') + debugInfo.asMediaQuery(ctx);\n break;\n }\n }\n return result;\n};\n\ndebugInfo.asComment = ctx => ctx.debugInfo ? `/* line ${ctx.debugInfo.lineNumber}, ${ctx.debugInfo.fileName} */\\n` : '';\n\ndebugInfo.asMediaQuery = ctx => {\n if (!ctx.debugInfo) { return ''; }\n let filenameWithProtocol = ctx.debugInfo.fileName;\n if (!/^[a-z]+:\\/\\//i.test(filenameWithProtocol)) {\n filenameWithProtocol = `file://${filenameWithProtocol}`;\n }\n return `@media -sass-debug-info{filename{font-family:${filenameWithProtocol.replace(/([.:\\/\\\\])/g, a => {\n if (a == '\\\\') {\n a = '\\/';\n }\n return `\\\\${a}`;\n })}}line{font-family:\\\\00003${ctx.debugInfo.lineNumber}}}\\n`;\n};\n\nexport default debugInfo;\n","import Node from './node';\nimport getDebugInfo from './debug-info';\n\nclass Comment extends Node {\n constructor(value, isLineComment, index, currentFileInfo) {\n super();\n\n this.value = value;\n this.isLineComment = isLineComment;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.allowRoot = true;\n }\n\n genCSS(context, output) {\n if (this.debugInfo) {\n output.add(getDebugInfo(context, this), this.fileInfo(), this.getIndex());\n }\n output.add(this.value);\n }\n\n isSilent(context) {\n const isCompressed = context.compress && this.value[2] !== '!';\n return this.isLineComment || isCompressed;\n }\n}\n\nComment.prototype.type = 'Comment';\nexport default Comment;\n","const contexts = {};\nexport default contexts;\nimport * as Constants from './constants';\n\nconst copyFromOriginal = function copyFromOriginal(original, destination, propertiesToCopy) {\n if (!original) { return; }\n\n for (let i = 0; i < propertiesToCopy.length; i++) {\n if (original.hasOwnProperty(propertiesToCopy[i])) {\n destination[propertiesToCopy[i]] = original[propertiesToCopy[i]];\n }\n }\n};\n\n/*\n parse is used whilst parsing\n */\nconst parseCopyProperties = [\n // options\n 'paths', // option - unmodified - paths to search for imports on\n 'rewriteUrls', // option - whether to adjust URL's to be relative\n 'rootpath', // option - rootpath to append to URL's\n 'strictImports', // option -\n 'insecure', // option - whether to allow imports from insecure ssl hosts\n 'dumpLineNumbers', // option - whether to dump line numbers\n 'compress', // option - whether to compress\n 'syncImport', // option - whether to import synchronously\n 'chunkInput', // option - whether to chunk input. more performant but causes parse issues.\n 'mime', // browser only - mime type for sheet import\n 'useFileCache', // browser only - whether to use the per file session cache\n // context\n 'processImports', // option & context - whether to process imports. if false then imports will not be imported.\n // Used by the import manager to stop multiple import visitors being created.\n 'pluginManager' // Used as the plugin manager for the session\n];\n\ncontexts.Parse = function(options) {\n copyFromOriginal(options, this, parseCopyProperties);\n\n if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n};\n\nconst evalCopyProperties = [\n 'paths', // additional include paths\n 'compress', // whether to compress\n 'math', // whether math has to be within parenthesis\n 'strictUnits', // whether units need to evaluate correctly\n 'sourceMap', // whether to output a source map\n 'importMultiple', // whether we are currently importing multiple copies\n 'urlArgs', // whether to add args into url tokens\n 'javascriptEnabled', // option - whether Inline JavaScript is enabled. if undefined, defaults to false\n 'pluginManager', // Used as the plugin manager for the session\n 'importantScope', // used to bubble up !important statements\n 'rewriteUrls' // option - whether to adjust URL's to be relative\n];\n\nfunction isPathRelative(path) {\n return !/^(?:[a-z-]+:|\\/|#)/i.test(path);\n}\n\nfunction isPathLocalRelative(path) {\n return path.charAt(0) === '.';\n}\n\ncontexts.Eval = class {\n constructor(options, frames) {\n copyFromOriginal(options, this, evalCopyProperties);\n\n if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n\n this.frames = frames || [];\n this.importantScope = this.importantScope || [];\n this.inCalc = false;\n this.mathOn = true;\n }\n\n enterCalc() {\n if (!this.calcStack) {\n this.calcStack = [];\n }\n this.calcStack.push(true);\n this.inCalc = true;\n }\n\n exitCalc() {\n this.calcStack.pop();\n if (!this.calcStack.length) {\n this.inCalc = false;\n }\n }\n\n inParenthesis() {\n if (!this.parensStack) {\n this.parensStack = [];\n }\n this.parensStack.push(true);\n };\n\n outOfParenthesis() {\n this.parensStack.pop();\n };\n\n isMathOn(op) {\n if (!this.mathOn) {\n return false;\n }\n if (op === '/' && this.math !== Constants.Math.ALWAYS && (!this.parensStack || !this.parensStack.length)) {\n return false;\n }\n if (this.math > Constants.Math.PARENS_DIVISION) {\n return this.parensStack && this.parensStack.length;\n }\n return true;\n }\n\n pathRequiresRewrite(path) {\n const isRelative = this.rewriteUrls === Constants.RewriteUrls.LOCAL ? isPathLocalRelative : isPathRelative;\n\n return isRelative(path);\n }\n\n rewritePath(path, rootpath) {\n let newPath;\n\n rootpath = rootpath || '';\n newPath = this.normalizePath(rootpath + path);\n\n // If a path was explicit relative and the rootpath was not an absolute path\n // we must ensure that the new path is also explicit relative.\n if (isPathLocalRelative(path) &&\n isPathRelative(rootpath) &&\n isPathLocalRelative(newPath) === false) {\n newPath = `./${newPath}`;\n }\n\n return newPath;\n }\n\n normalizePath(path) {\n const segments = path.split('/').reverse();\n let segment;\n\n path = [];\n while (segments.length !== 0) {\n segment = segments.pop();\n switch ( segment ) {\n case '.':\n break;\n case '..':\n if ((path.length === 0) || (path[path.length - 1] === '..')) {\n path.push( segment );\n } else {\n path.pop();\n }\n break;\n default:\n path.push(segment);\n break;\n }\n }\n\n return path.join('/');\n }\n}\n","function makeRegistry( base ) {\n return {\n _data: {},\n add: function(name, func) {\n // precautionary case conversion, as later querying of\n // the registry by function-caller uses lower case as well.\n name = name.toLowerCase();\n\n if (this._data.hasOwnProperty(name)) {\n // TODO warn\n }\n this._data[name] = func;\n },\n addMultiple: function(functions) {\n Object.keys(functions).forEach(\n name => {\n this.add(name, functions[name]);\n });\n },\n get: function(name) {\n return this._data[name] || ( base && base.get( name ));\n },\n getLocalFunctions: function() {\n return this._data;\n },\n inherit: function() {\n return makeRegistry( this );\n },\n create: function(base) {\n return makeRegistry(base);\n }\n };\n}\n\nexport default makeRegistry( null );","import Keyword from '../tree/keyword';\n\nconst defaultFunc = {\n eval: function () {\n const v = this.value_;\n const e = this.error_;\n if (e) {\n throw e;\n }\n if (v != null) {\n return v ? Keyword.True : Keyword.False;\n }\n },\n value: function (v) {\n this.value_ = v;\n },\n error: function (e) {\n this.error_ = e;\n },\n reset: function () {\n this.value_ = this.error_ = null;\n }\n};\n\nexport default defaultFunc;\n","import Node from './node';\nimport Declaration from './declaration';\nimport Keyword from './keyword';\nimport Comment from './comment';\nimport Paren from './paren';\nimport Selector from './selector';\nimport Element from './element';\nimport Anonymous from './anonymous';\nimport contexts from '../contexts';\nimport globalFunctionRegistry from '../functions/function-registry';\nimport defaultFunc from '../functions/default';\nimport getDebugInfo from './debug-info';\nimport * as utils from '../utils';\n\nclass Ruleset extends Node {\n constructor(selectors, rules, strictImports, visibilityInfo) {\n super();\n\n this.selectors = selectors;\n this.rules = rules;\n this._lookups = {};\n this._variables = null;\n this._properties = null;\n this.strictImports = strictImports;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n\n this.setParent(this.selectors, this);\n this.setParent(this.rules, this);\n\n }\n\n isRulesetLike() {\n return true;\n }\n\n accept(visitor) {\n if (this.paths) {\n this.paths = visitor.visitArray(this.paths, true);\n } else if (this.selectors) {\n this.selectors = visitor.visitArray(this.selectors);\n }\n if (this.rules && this.rules.length) {\n this.rules = visitor.visitArray(this.rules);\n }\n }\n\n eval(context) {\n const that = this;\n let selectors;\n let selCnt;\n let selector;\n let i;\n let hasVariable;\n let hasOnePassingSelector = false;\n\n if (this.selectors && (selCnt = this.selectors.length)) {\n selectors = new Array(selCnt);\n defaultFunc.error({\n type: 'Syntax',\n message: 'it is currently only allowed in parametric mixin guards,'\n });\n\n for (i = 0; i < selCnt; i++) {\n selector = this.selectors[i].eval(context);\n for (var j = 0; j < selector.elements.length; j++) {\n if (selector.elements[j].isVariable) {\n hasVariable = true;\n break;\n }\n }\n selectors[i] = selector;\n if (selector.evaldCondition) {\n hasOnePassingSelector = true;\n }\n }\n\n if (hasVariable) {\n const toParseSelectors = new Array(selCnt);\n for (i = 0; i < selCnt; i++) {\n selector = selectors[i];\n toParseSelectors[i] = selector.toCSS(context);\n }\n this.parse.parseNode(\n toParseSelectors.join(','),\n [\"selectors\"], \n selectors[0].getIndex(), \n selectors[0].fileInfo(), \n (err, result) => {\n if (result) {\n selectors = utils.flattenArray(result);\n }\n });\n }\n\n defaultFunc.reset();\n } else {\n hasOnePassingSelector = true;\n }\n\n let rules = this.rules ? utils.copyArray(this.rules) : null;\n const ruleset = new Ruleset(selectors, rules, this.strictImports, this.visibilityInfo());\n let rule;\n let subRule;\n\n ruleset.originalRuleset = this;\n ruleset.root = this.root;\n ruleset.firstRoot = this.firstRoot;\n ruleset.allowImports = this.allowImports;\n\n if (this.debugInfo) {\n ruleset.debugInfo = this.debugInfo;\n }\n\n if (!hasOnePassingSelector) {\n rules.length = 0;\n }\n\n // inherit a function registry from the frames stack when possible;\n // otherwise from the global registry\n ruleset.functionRegistry = (frames => {\n let i = 0;\n const n = frames.length;\n let found;\n for ( ; i !== n ; ++i ) {\n found = frames[ i ].functionRegistry;\n if ( found ) { return found; }\n }\n return globalFunctionRegistry;\n })(context.frames).inherit();\n\n // push the current ruleset to the frames stack\n const ctxFrames = context.frames;\n ctxFrames.unshift(ruleset);\n\n // currrent selectors\n let ctxSelectors = context.selectors;\n if (!ctxSelectors) {\n context.selectors = ctxSelectors = [];\n }\n ctxSelectors.unshift(this.selectors);\n\n // Evaluate imports\n if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) {\n ruleset.evalImports(context);\n }\n\n // Store the frames around mixin definitions,\n // so they can be evaluated like closures when the time comes.\n const rsRules = ruleset.rules;\n for (i = 0; (rule = rsRules[i]); i++) {\n if (rule.evalFirst) {\n rsRules[i] = rule.eval(context);\n }\n }\n\n const mediaBlockCount = (context.mediaBlocks && context.mediaBlocks.length) || 0;\n\n // Evaluate mixin calls.\n for (i = 0; (rule = rsRules[i]); i++) {\n if (rule.type === 'MixinCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).filter(r => {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope if the variable is\n // already there. consider returning false here\n // but we need a way to \"return\" variable from mixins\n return !(ruleset.variable(r.name));\n }\n return true;\n });\n rsRules.splice(...[i, 1].concat(rules));\n i += rules.length - 1;\n ruleset.resetCache();\n } else if (rule.type === 'VariableCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).rules.filter(r => {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope at all\n return false;\n }\n return true;\n });\n rsRules.splice(...[i, 1].concat(rules));\n i += rules.length - 1;\n ruleset.resetCache();\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n if (!rule.evalFirst) {\n rsRules[i] = rule = rule.eval ? rule.eval(context) : rule;\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n // for rulesets, check if it is a css guard and can be removed\n if (rule instanceof Ruleset && rule.selectors && rule.selectors.length === 1) {\n // check if it can be folded in (e.g. & where)\n if (rule.selectors[0] && rule.selectors[0].isJustParentSelector()) {\n rsRules.splice(i--, 1);\n\n for (var j = 0; (subRule = rule.rules[j]); j++) {\n if (subRule instanceof Node) {\n subRule.copyVisibilityInfo(rule.visibilityInfo());\n if (!(subRule instanceof Declaration) || !subRule.variable) {\n rsRules.splice(++i, 0, subRule);\n }\n }\n }\n }\n }\n }\n\n // Pop the stack\n ctxFrames.shift();\n ctxSelectors.shift();\n\n if (context.mediaBlocks) {\n for (i = mediaBlockCount; i < context.mediaBlocks.length; i++) {\n context.mediaBlocks[i].bubbleSelectors(selectors);\n }\n }\n\n return ruleset;\n }\n\n evalImports(context) {\n const rules = this.rules;\n let i;\n let importRules;\n if (!rules) { return; }\n\n for (i = 0; i < rules.length; i++) {\n if (rules[i].type === 'Import') {\n importRules = rules[i].eval(context);\n if (importRules && (importRules.length || importRules.length === 0)) {\n rules.splice(...[i, 1].concat(importRules));\n i += importRules.length - 1;\n } else {\n rules.splice(i, 1, importRules);\n }\n this.resetCache();\n }\n }\n }\n\n makeImportant() {\n const result = new Ruleset(this.selectors, this.rules.map(r => {\n if (r.makeImportant) {\n return r.makeImportant();\n } else {\n return r;\n }\n }), this.strictImports, this.visibilityInfo());\n\n return result;\n }\n\n matchArgs(args) {\n return !args || args.length === 0;\n }\n\n // lets you call a css selector with a guard\n matchCondition(args, context) {\n const lastSelector = this.selectors[this.selectors.length - 1];\n if (!lastSelector.evaldCondition) {\n return false;\n }\n if (lastSelector.condition &&\n !lastSelector.condition.eval(\n new contexts.Eval(context,\n context.frames))) {\n return false;\n }\n return true;\n }\n\n resetCache() {\n this._rulesets = null;\n this._variables = null;\n this._properties = null;\n this._lookups = {};\n }\n\n variables() {\n if (!this._variables) {\n this._variables = !this.rules ? {} : this.rules.reduce((hash, r) => {\n if (r instanceof Declaration && r.variable === true) {\n hash[r.name] = r;\n }\n // when evaluating variables in an import statement, imports have not been eval'd\n // so we need to go inside import statements.\n // guard against root being a string (in the case of inlined less)\n if (r.type === 'Import' && r.root && r.root.variables) {\n const vars = r.root.variables();\n for (const name in vars) {\n if (vars.hasOwnProperty(name)) {\n hash[name] = r.root.variable(name);\n }\n }\n }\n return hash;\n }, {});\n }\n return this._variables;\n }\n\n properties() {\n if (!this._properties) {\n this._properties = !this.rules ? {} : this.rules.reduce((hash, r) => {\n if (r instanceof Declaration && r.variable !== true) {\n const name = (r.name.length === 1) && (r.name[0] instanceof Keyword) ?\n r.name[0].value : r.name;\n // Properties don't overwrite as they can merge\n if (!hash[`$${name}`]) {\n hash[`$${name}`] = [ r ];\n }\n else {\n hash[`$${name}`].push(r);\n }\n }\n return hash;\n }, {});\n }\n return this._properties;\n }\n\n variable(name) {\n const decl = this.variables()[name];\n if (decl) {\n return this.parseValue(decl);\n }\n }\n\n property(name) {\n const decl = this.properties()[name];\n if (decl) {\n return this.parseValue(decl);\n }\n }\n\n lastDeclaration() {\n for (let i = this.rules.length; i > 0; i--) {\n const decl = this.rules[i - 1];\n if (decl instanceof Declaration) {\n return this.parseValue(decl);\n }\n }\n }\n\n parseValue(toParse) {\n const self = this;\n function transformDeclaration(decl) {\n if (decl.value instanceof Anonymous && !decl.parsed) {\n if (typeof decl.value.value === 'string') {\n this.parse.parseNode(\n decl.value.value,\n ['value', 'important'], \n decl.value.getIndex(), \n decl.fileInfo(), \n (err, result) => {\n if (err) {\n decl.parsed = true;\n }\n if (result) {\n decl.value = result[0];\n decl.important = result[1] || '';\n decl.parsed = true;\n }\n });\n } else {\n decl.parsed = true;\n }\n\n return decl;\n }\n else {\n return decl;\n }\n }\n if (!Array.isArray(toParse)) {\n return transformDeclaration.call(self, toParse);\n }\n else {\n const nodes = [];\n toParse.forEach(n => {\n nodes.push(transformDeclaration.call(self, n));\n });\n return nodes;\n }\n }\n\n rulesets() {\n if (!this.rules) { return []; }\n\n const filtRules = [];\n const rules = this.rules;\n let i;\n let rule;\n\n for (i = 0; (rule = rules[i]); i++) {\n if (rule.isRuleset) {\n filtRules.push(rule);\n }\n }\n\n return filtRules;\n }\n\n prependRule(rule) {\n const rules = this.rules;\n if (rules) {\n rules.unshift(rule);\n } else {\n this.rules = [ rule ];\n }\n this.setParent(rule, this);\n }\n\n find(selector, self = this, filter) {\n const rules = [];\n let match;\n let foundMixins;\n const key = selector.toCSS();\n\n if (key in this._lookups) { return this._lookups[key]; }\n\n this.rulesets().forEach(rule => {\n if (rule !== self) {\n for (let j = 0; j < rule.selectors.length; j++) {\n match = selector.match(rule.selectors[j]);\n if (match) {\n if (selector.elements.length > match) {\n if (!filter || filter(rule)) {\n foundMixins = rule.find(new Selector(selector.elements.slice(match)), self, filter);\n for (let i = 0; i < foundMixins.length; ++i) {\n foundMixins[i].path.push(rule);\n }\n Array.prototype.push.apply(rules, foundMixins);\n }\n } else {\n rules.push({ rule, path: []});\n }\n break;\n }\n }\n }\n });\n this._lookups[key] = rules;\n return rules;\n }\n\n genCSS(context, output) {\n let i;\n let j;\n const charsetRuleNodes = [];\n let ruleNodes = [];\n\n let // Line number debugging\n debugInfo;\n\n let rule;\n let path;\n\n context.tabLevel = (context.tabLevel || 0);\n\n if (!this.root) {\n context.tabLevel++;\n }\n\n const tabRuleStr = context.compress ? '' : Array(context.tabLevel + 1).join(' ');\n const tabSetStr = context.compress ? '' : Array(context.tabLevel).join(' ');\n let sep;\n\n let charsetNodeIndex = 0;\n let importNodeIndex = 0;\n for (i = 0; (rule = this.rules[i]); i++) {\n if (rule instanceof Comment) {\n if (importNodeIndex === i) {\n importNodeIndex++;\n }\n ruleNodes.push(rule);\n } else if (rule.isCharset && rule.isCharset()) {\n ruleNodes.splice(charsetNodeIndex, 0, rule);\n charsetNodeIndex++;\n importNodeIndex++;\n } else if (rule.type === 'Import') {\n ruleNodes.splice(importNodeIndex, 0, rule);\n importNodeIndex++;\n } else {\n ruleNodes.push(rule);\n }\n }\n ruleNodes = charsetRuleNodes.concat(ruleNodes);\n\n // If this is the root node, we don't render\n // a selector, or {}.\n if (!this.root) {\n debugInfo = getDebugInfo(context, this, tabSetStr);\n\n if (debugInfo) {\n output.add(debugInfo);\n output.add(tabSetStr);\n }\n\n const paths = this.paths;\n const pathCnt = paths.length;\n let pathSubCnt;\n\n sep = context.compress ? ',' : (`,\\n${tabSetStr}`);\n\n for (i = 0; i < pathCnt; i++) {\n path = paths[i];\n if (!(pathSubCnt = path.length)) { continue; }\n if (i > 0) { output.add(sep); }\n\n context.firstSelector = true;\n path[0].genCSS(context, output);\n\n context.firstSelector = false;\n for (j = 1; j < pathSubCnt; j++) {\n path[j].genCSS(context, output);\n }\n }\n\n output.add((context.compress ? '{' : ' {\\n') + tabRuleStr);\n }\n\n // Compile rules and rulesets\n for (i = 0; (rule = ruleNodes[i]); i++) {\n\n if (i + 1 === ruleNodes.length) {\n context.lastRule = true;\n }\n\n const currentLastRule = context.lastRule;\n if (rule.isRulesetLike(rule)) {\n context.lastRule = false;\n }\n\n if (rule.genCSS) {\n rule.genCSS(context, output);\n } else if (rule.value) {\n output.add(rule.value.toString());\n }\n\n context.lastRule = currentLastRule;\n\n if (!context.lastRule && rule.isVisible()) {\n output.add(context.compress ? '' : (`\\n${tabRuleStr}`));\n } else {\n context.lastRule = false;\n }\n }\n\n if (!this.root) {\n output.add((context.compress ? '}' : `\\n${tabSetStr}}`));\n context.tabLevel--;\n }\n\n if (!output.isEmpty() && !context.compress && this.firstRoot) {\n output.add('\\n');\n }\n }\n\n joinSelectors(paths, context, selectors) {\n for (let s = 0; s < selectors.length; s++) {\n this.joinSelector(paths, context, selectors[s]);\n }\n }\n\n joinSelector(paths, context, selector) {\n function createParenthesis(elementsToPak, originalElement) {\n let replacementParen;\n let j;\n if (elementsToPak.length === 0) {\n replacementParen = new Paren(elementsToPak[0]);\n } else {\n const insideParent = new Array(elementsToPak.length);\n for (j = 0; j < elementsToPak.length; j++) {\n insideParent[j] = new Element(\n null,\n elementsToPak[j],\n originalElement.isVariable,\n originalElement._index,\n originalElement._fileInfo\n );\n }\n replacementParen = new Paren(new Selector(insideParent));\n }\n return replacementParen;\n }\n\n function createSelector(containedElement, originalElement) {\n let element;\n let selector;\n element = new Element(null, containedElement, originalElement.isVariable, originalElement._index, originalElement._fileInfo);\n selector = new Selector([element]);\n return selector;\n }\n\n // joins selector path from `beginningPath` with selector path in `addPath`\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns concatenated path\n function addReplacementIntoPath(beginningPath, addPath, replacedElement, originalSelector) {\n let newSelectorPath;\n let lastSelector;\n let newJoinedSelector;\n // our new selector path\n newSelectorPath = [];\n\n // construct the joined selector - if & is the first thing this will be empty,\n // if not newJoinedSelector will be the last set of elements in the selector\n if (beginningPath.length > 0) {\n newSelectorPath = utils.copyArray(beginningPath);\n lastSelector = newSelectorPath.pop();\n newJoinedSelector = originalSelector.createDerived(utils.copyArray(lastSelector.elements));\n }\n else {\n newJoinedSelector = originalSelector.createDerived([]);\n }\n\n if (addPath.length > 0) {\n // /deep/ is a CSS4 selector - (removed, so should deprecate)\n // that is valid without anything in front of it\n // so if the & does not have a combinator that is \"\" or \" \" then\n // and there is a combinator on the parent, then grab that.\n // this also allows + a { & .b { .a & { ... though not sure why you would want to do that\n let combinator = replacedElement.combinator;\n\n const parentEl = addPath[0].elements[0];\n if (combinator.emptyOrWhitespace && !parentEl.combinator.emptyOrWhitespace) {\n combinator = parentEl.combinator;\n }\n // join the elements so far with the first part of the parent\n newJoinedSelector.elements.push(new Element(\n combinator,\n parentEl.value,\n replacedElement.isVariable,\n replacedElement._index,\n replacedElement._fileInfo\n ));\n newJoinedSelector.elements = newJoinedSelector.elements.concat(addPath[0].elements.slice(1));\n }\n\n // now add the joined selector - but only if it is not empty\n if (newJoinedSelector.elements.length !== 0) {\n newSelectorPath.push(newJoinedSelector);\n }\n\n // put together the parent selectors after the join (e.g. the rest of the parent)\n if (addPath.length > 1) {\n let restOfPath = addPath.slice(1);\n restOfPath = restOfPath.map(selector => selector.createDerived(selector.elements, []));\n newSelectorPath = newSelectorPath.concat(restOfPath);\n }\n return newSelectorPath;\n }\n\n // joins selector path from `beginningPath` with every selector path in `addPaths` array\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns array with all concatenated paths\n function addAllReplacementsIntoPath( beginningPath, addPaths, replacedElement, originalSelector, result) {\n let j;\n for (j = 0; j < beginningPath.length; j++) {\n const newSelectorPath = addReplacementIntoPath(beginningPath[j], addPaths, replacedElement, originalSelector);\n result.push(newSelectorPath);\n }\n return result;\n }\n\n function mergeElementsOnToSelectors(elements, selectors) {\n let i;\n let sel;\n\n if (elements.length === 0) {\n return ;\n }\n if (selectors.length === 0) {\n selectors.push([ new Selector(elements) ]);\n return;\n }\n\n for (i = 0; (sel = selectors[i]); i++) {\n // if the previous thing in sel is a parent this needs to join on to it\n if (sel.length > 0) {\n sel[sel.length - 1] = sel[sel.length - 1].createDerived(sel[sel.length - 1].elements.concat(elements));\n }\n else {\n sel.push(new Selector(elements));\n }\n }\n }\n\n // replace all parent selectors inside `inSelector` by content of `context` array\n // resulting selectors are returned inside `paths` array\n // returns true if `inSelector` contained at least one parent selector\n function replaceParentSelector(paths, context, inSelector) {\n // The paths are [[Selector]]\n // The first list is a list of comma separated selectors\n // The inner list is a list of inheritance separated selectors\n // e.g.\n // .a, .b {\n // .c {\n // }\n // }\n // == [[.a] [.c]] [[.b] [.c]]\n //\n let i;\n\n let j;\n let k;\n let currentElements;\n let newSelectors;\n let selectorsMultiplied;\n let sel;\n let el;\n let hadParentSelector = false;\n let length;\n let lastSelector;\n function findNestedSelector(element) {\n let maybeSelector;\n if (!(element.value instanceof Paren)) {\n return null;\n }\n\n maybeSelector = element.value.value;\n if (!(maybeSelector instanceof Selector)) {\n return null;\n }\n\n return maybeSelector;\n }\n\n // the elements from the current selector so far\n currentElements = [];\n // the current list of new selectors to add to the path.\n // We will build it up. We initiate it with one empty selector as we \"multiply\" the new selectors\n // by the parents\n newSelectors = [\n []\n ];\n\n for (i = 0; (el = inSelector.elements[i]); i++) {\n // non parent reference elements just get added\n if (el.value !== '&') {\n const nestedSelector = findNestedSelector(el);\n if (nestedSelector != null) {\n // merge the current list of non parent selector elements\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n const nestedPaths = [];\n let replaced;\n const replacedNewSelectors = [];\n replaced = replaceParentSelector(nestedPaths, context, nestedSelector);\n hadParentSelector = hadParentSelector || replaced;\n // the nestedPaths array should have only one member - replaceParentSelector does not multiply selectors\n for (k = 0; k < nestedPaths.length; k++) {\n const replacementSelector = createSelector(createParenthesis(nestedPaths[k], el), el);\n addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors);\n }\n newSelectors = replacedNewSelectors;\n currentElements = [];\n } else {\n currentElements.push(el);\n }\n\n } else {\n hadParentSelector = true;\n // the new list of selectors to add\n selectorsMultiplied = [];\n\n // merge the current list of non parent selector elements\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n // loop through our current selectors\n for (j = 0; j < newSelectors.length; j++) {\n sel = newSelectors[j];\n // if we don't have any parent paths, the & might be in a mixin so that it can be used\n // whether there are parents or not\n if (context.length === 0) {\n // the combinator used on el should now be applied to the next element instead so that\n // it is not lost\n if (sel.length > 0) {\n sel[0].elements.push(new Element(el.combinator, '', el.isVariable, el._index, el._fileInfo));\n }\n selectorsMultiplied.push(sel);\n }\n else {\n // and the parent selectors\n for (k = 0; k < context.length; k++) {\n // We need to put the current selectors\n // then join the last selector's elements on to the parents selectors\n const newSelectorPath = addReplacementIntoPath(sel, context[k], el, inSelector);\n // add that to our new set of selectors\n selectorsMultiplied.push(newSelectorPath);\n }\n }\n }\n\n // our new selectors has been multiplied, so reset the state\n newSelectors = selectorsMultiplied;\n currentElements = [];\n }\n }\n\n // if we have any elements left over (e.g. .a& .b == .b)\n // add them on to all the current selectors\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n for (i = 0; i < newSelectors.length; i++) {\n length = newSelectors[i].length;\n if (length > 0) {\n paths.push(newSelectors[i]);\n lastSelector = newSelectors[i][length - 1];\n newSelectors[i][length - 1] = lastSelector.createDerived(lastSelector.elements, inSelector.extendList);\n }\n }\n\n return hadParentSelector;\n }\n\n function deriveSelector(visibilityInfo, deriveFrom) {\n const newSelector = deriveFrom.createDerived(deriveFrom.elements, deriveFrom.extendList, deriveFrom.evaldCondition);\n newSelector.copyVisibilityInfo(visibilityInfo);\n return newSelector;\n }\n\n // joinSelector code follows\n let i;\n\n let newPaths;\n let hadParentSelector;\n\n newPaths = [];\n hadParentSelector = replaceParentSelector(newPaths, context, selector);\n\n if (!hadParentSelector) {\n if (context.length > 0) {\n newPaths = [];\n for (i = 0; i < context.length; i++) {\n\n const concatenated = context[i].map(deriveSelector.bind(this, selector.visibilityInfo()));\n\n concatenated.push(selector);\n newPaths.push(concatenated);\n }\n }\n else {\n newPaths = [[selector]];\n }\n }\n\n for (i = 0; i < newPaths.length; i++) {\n paths.push(newPaths[i]);\n }\n }\n}\n\nRuleset.prototype.type = 'Ruleset';\nRuleset.prototype.isRuleset = true;\nexport default Ruleset;\n","import Node from './node';\nimport Selector from './selector';\nimport Ruleset from './ruleset';\nimport Anonymous from './anonymous';\n\nclass AtRule extends Node {\n constructor(\n name,\n value,\n rules,\n index,\n currentFileInfo,\n debugInfo,\n isRooted,\n visibilityInfo\n ) {\n super();\n\n let i;\n\n this.name = name;\n this.value = (value instanceof Node) ? value : (value ? new Anonymous(value) : value);\n if (rules) {\n if (Array.isArray(rules)) {\n this.rules = rules;\n } else {\n this.rules = [rules];\n this.rules[0].selectors = (new Selector([], null, null, index, currentFileInfo)).createEmptySelectors();\n }\n for (i = 0; i < this.rules.length; i++) {\n this.rules[i].allowImports = true;\n }\n this.setParent(this.rules, this);\n }\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.debugInfo = debugInfo;\n this.isRooted = isRooted || false;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n }\n\n accept(visitor) {\n const value = this.value;\n const rules = this.rules;\n if (rules) {\n this.rules = visitor.visitArray(rules);\n }\n if (value) {\n this.value = visitor.visit(value);\n }\n }\n\n isRulesetLike() {\n return this.rules || !this.isCharset();\n }\n\n isCharset() {\n return '@charset' === this.name;\n }\n\n genCSS(context, output) {\n const value = this.value;\n const rules = this.rules;\n output.add(this.name, this.fileInfo(), this.getIndex());\n if (value) {\n output.add(' ');\n value.genCSS(context, output);\n }\n if (rules) {\n this.outputRuleset(context, output, rules);\n } else {\n output.add(';');\n }\n }\n\n eval(context) {\n let mediaPathBackup;\n let mediaBlocksBackup;\n let value = this.value;\n let rules = this.rules;\n\n // media stored inside other atrule should not bubble over it\n // backpup media bubbling information\n mediaPathBackup = context.mediaPath;\n mediaBlocksBackup = context.mediaBlocks;\n // deleted media bubbling information\n context.mediaPath = [];\n context.mediaBlocks = [];\n\n if (value) {\n value = value.eval(context);\n }\n if (rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n rules = [rules[0].eval(context)];\n rules[0].root = true;\n }\n // restore media bubbling information\n context.mediaPath = mediaPathBackup;\n context.mediaBlocks = mediaBlocksBackup;\n\n return new AtRule(this.name, value, rules,\n this.getIndex(), this.fileInfo(), this.debugInfo, this.isRooted, this.visibilityInfo());\n }\n\n variable(name) {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.variable.call(this.rules[0], name);\n }\n }\n\n find(...args) {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.find.apply(this.rules[0], args);\n }\n }\n\n rulesets() {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.rulesets.apply(this.rules[0]);\n }\n }\n\n outputRuleset(context, output, rules) {\n const ruleCnt = rules.length;\n let i;\n context.tabLevel = (context.tabLevel | 0) + 1;\n\n // Compressed\n if (context.compress) {\n output.add('{');\n for (i = 0; i < ruleCnt; i++) {\n rules[i].genCSS(context, output);\n }\n output.add('}');\n context.tabLevel--;\n return;\n }\n\n // Non-compressed\n const tabSetStr = `\\n${Array(context.tabLevel).join(' ')}`;\n\n const tabRuleStr = `${tabSetStr} `;\n if (!ruleCnt) {\n output.add(` {${tabSetStr}}`);\n } else {\n output.add(` {${tabRuleStr}`);\n rules[0].genCSS(context, output);\n for (i = 1; i < ruleCnt; i++) {\n output.add(tabRuleStr);\n rules[i].genCSS(context, output);\n }\n output.add(`${tabSetStr}}`);\n }\n\n context.tabLevel--;\n }\n}\n\nAtRule.prototype.type = 'AtRule';\nexport default AtRule;\n","import Node from './node';\nimport contexts from '../contexts';\nimport * as utils from '../utils';\n\nclass DetachedRuleset extends Node {\n constructor(ruleset, frames) {\n super();\n\n this.ruleset = ruleset;\n this.frames = frames;\n this.setParent(this.ruleset, this);\n }\n\n accept(visitor) {\n this.ruleset = visitor.visit(this.ruleset);\n }\n\n eval(context) {\n const frames = this.frames || utils.copyArray(context.frames);\n return new DetachedRuleset(this.ruleset, frames);\n }\n\n callEval(context) {\n return this.ruleset.eval(this.frames ? new contexts.Eval(context, this.frames.concat(context.frames)) : context);\n }\n}\n\nDetachedRuleset.prototype.type = 'DetachedRuleset';\nDetachedRuleset.prototype.evalFirst = true;\nexport default DetachedRuleset;\n","import Node from './node';\nimport unitConversions from '../data/unit-conversions';\nimport * as utils from '../utils';\n\nclass Unit extends Node {\n constructor(numerator, denominator, backupUnit) {\n super();\n\n this.numerator = numerator ? utils.copyArray(numerator).sort() : [];\n this.denominator = denominator ? utils.copyArray(denominator).sort() : [];\n if (backupUnit) {\n this.backupUnit = backupUnit;\n } else if (numerator && numerator.length) {\n this.backupUnit = numerator[0];\n }\n }\n\n clone() {\n return new Unit(utils.copyArray(this.numerator), utils.copyArray(this.denominator), this.backupUnit);\n }\n\n genCSS(context, output) {\n // Dimension checks the unit is singular and throws an error if in strict math mode.\n const strictUnits = context && context.strictUnits;\n if (this.numerator.length === 1) {\n output.add(this.numerator[0]); // the ideal situation\n } else if (!strictUnits && this.backupUnit) {\n output.add(this.backupUnit);\n } else if (!strictUnits && this.denominator.length) {\n output.add(this.denominator[0]);\n }\n }\n\n toString() {\n let i;\n let returnStr = this.numerator.join('*');\n for (i = 0; i < this.denominator.length; i++) {\n returnStr += `/${this.denominator[i]}`;\n }\n return returnStr;\n }\n\n compare(other) {\n return this.is(other.toString()) ? 0 : undefined;\n }\n\n is(unitString) {\n return this.toString().toUpperCase() === unitString.toUpperCase();\n }\n\n isLength() {\n return RegExp('^(px|em|ex|ch|rem|in|cm|mm|pc|pt|ex|vw|vh|vmin|vmax)$', 'gi').test(this.toCSS());\n }\n\n isEmpty() {\n return this.numerator.length === 0 && this.denominator.length === 0;\n }\n\n isSingular() {\n return this.numerator.length <= 1 && this.denominator.length === 0;\n }\n\n map(callback) {\n let i;\n\n for (i = 0; i < this.numerator.length; i++) {\n this.numerator[i] = callback(this.numerator[i], false);\n }\n\n for (i = 0; i < this.denominator.length; i++) {\n this.denominator[i] = callback(this.denominator[i], true);\n }\n }\n\n usedUnits() {\n let group;\n const result = {};\n let mapUnit;\n let groupName;\n\n mapUnit = atomicUnit => {\n /* jshint loopfunc:true */\n if (group.hasOwnProperty(atomicUnit) && !result[groupName]) {\n result[groupName] = atomicUnit;\n }\n\n return atomicUnit;\n };\n\n for (groupName in unitConversions) {\n if (unitConversions.hasOwnProperty(groupName)) {\n group = unitConversions[groupName];\n\n this.map(mapUnit);\n }\n }\n\n return result;\n }\n\n cancel() {\n const counter = {};\n let atomicUnit;\n let i;\n\n for (i = 0; i < this.numerator.length; i++) {\n atomicUnit = this.numerator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) + 1;\n }\n\n for (i = 0; i < this.denominator.length; i++) {\n atomicUnit = this.denominator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) - 1;\n }\n\n this.numerator = [];\n this.denominator = [];\n\n for (atomicUnit in counter) {\n if (counter.hasOwnProperty(atomicUnit)) {\n const count = counter[atomicUnit];\n\n if (count > 0) {\n for (i = 0; i < count; i++) {\n this.numerator.push(atomicUnit);\n }\n } else if (count < 0) {\n for (i = 0; i < -count; i++) {\n this.denominator.push(atomicUnit);\n }\n }\n }\n }\n\n this.numerator.sort();\n this.denominator.sort();\n }\n}\n\nUnit.prototype.type = 'Unit';\nexport default Unit;\n","import Node from './node';\nimport unitConversions from '../data/unit-conversions';\nimport Unit from './unit';\nimport Color from './color';\n\n//\n// A number with a unit\n//\nclass Dimension extends Node {\n constructor(value, unit) {\n super();\n\n this.value = parseFloat(value);\n if (isNaN(this.value)) {\n throw new Error('Dimension is not a number.');\n }\n this.unit = (unit && unit instanceof Unit) ? unit :\n new Unit(unit ? [unit] : undefined);\n this.setParent(this.unit, this);\n }\n\n accept(visitor) {\n this.unit = visitor.visit(this.unit);\n }\n\n eval(context) {\n return this;\n }\n\n toColor() {\n return new Color([this.value, this.value, this.value]);\n }\n\n genCSS(context, output) {\n if ((context && context.strictUnits) && !this.unit.isSingular()) {\n throw new Error(`Multiple units in dimension. Correct the units or use the unit function. Bad unit: ${this.unit.toString()}`);\n }\n\n const value = this.fround(context, this.value);\n let strValue = String(value);\n\n if (value !== 0 && value < 0.000001 && value > -0.000001) {\n // would be output 1e-6 etc.\n strValue = value.toFixed(20).replace(/0+$/, '');\n }\n\n if (context && context.compress) {\n // Zero values doesn't need a unit\n if (value === 0 && this.unit.isLength()) {\n output.add(strValue);\n return;\n }\n\n // Float values doesn't need a leading zero\n if (value > 0 && value < 1) {\n strValue = (strValue).substr(1);\n }\n }\n\n output.add(strValue);\n this.unit.genCSS(context, output);\n }\n\n // In an operation between two Dimensions,\n // we default to the first Dimension's unit,\n // so `1px + 2` will yield `3px`.\n operate(context, op, other) {\n /* jshint noempty:false */\n let value = this._operate(context, op, this.value, other.value);\n\n let unit = this.unit.clone();\n\n if (op === '+' || op === '-') {\n if (unit.numerator.length === 0 && unit.denominator.length === 0) {\n unit = other.unit.clone();\n if (this.unit.backupUnit) {\n unit.backupUnit = this.unit.backupUnit;\n }\n } else if (other.unit.numerator.length === 0 && unit.denominator.length === 0) {\n // do nothing\n } else {\n other = other.convertTo(this.unit.usedUnits());\n\n if (context.strictUnits && other.unit.toString() !== unit.toString()) {\n throw new Error(`Incompatible units. Change the units or use the unit function. ` + \n `Bad units: '${unit.toString()}' and '${other.unit.toString()}'.`);\n }\n\n value = this._operate(context, op, this.value, other.value);\n }\n } else if (op === '*') {\n unit.numerator = unit.numerator.concat(other.unit.numerator).sort();\n unit.denominator = unit.denominator.concat(other.unit.denominator).sort();\n unit.cancel();\n } else if (op === '/') {\n unit.numerator = unit.numerator.concat(other.unit.denominator).sort();\n unit.denominator = unit.denominator.concat(other.unit.numerator).sort();\n unit.cancel();\n }\n return new Dimension(value, unit);\n }\n\n compare(other) {\n let a;\n let b;\n\n if (!(other instanceof Dimension)) {\n return undefined;\n }\n\n if (this.unit.isEmpty() || other.unit.isEmpty()) {\n a = this;\n b = other;\n } else {\n a = this.unify();\n b = other.unify();\n if (a.unit.compare(b.unit) !== 0) {\n return undefined;\n }\n }\n\n return Node.numericCompare(a.value, b.value);\n }\n\n unify() {\n return this.convertTo({ length: 'px', duration: 's', angle: 'rad' });\n }\n\n convertTo(conversions) {\n let value = this.value;\n const unit = this.unit.clone();\n let i;\n let groupName;\n let group;\n let targetUnit;\n let derivedConversions = {};\n let applyUnit;\n\n if (typeof conversions === 'string') {\n for (i in unitConversions) {\n if (unitConversions[i].hasOwnProperty(conversions)) {\n derivedConversions = {};\n derivedConversions[i] = conversions;\n }\n }\n conversions = derivedConversions;\n }\n applyUnit = (atomicUnit, denominator) => {\n /* jshint loopfunc:true */\n if (group.hasOwnProperty(atomicUnit)) {\n if (denominator) {\n value = value / (group[atomicUnit] / group[targetUnit]);\n } else {\n value = value * (group[atomicUnit] / group[targetUnit]);\n }\n\n return targetUnit;\n }\n\n return atomicUnit;\n };\n\n for (groupName in conversions) {\n if (conversions.hasOwnProperty(groupName)) {\n targetUnit = conversions[groupName];\n group = unitConversions[groupName];\n\n unit.map(applyUnit);\n }\n }\n\n unit.cancel();\n\n return new Dimension(value, unit);\n }\n}\n\nDimension.prototype.type = 'Dimension';\nexport default Dimension;\n","import Node from './node';\nimport Color from './color';\nimport Dimension from './dimension';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\n\nclass Operation extends Node {\n constructor(op, operands, isSpaced) {\n super();\n\n this.op = op.trim();\n this.operands = operands;\n this.isSpaced = isSpaced;\n }\n\n accept(visitor) {\n this.operands = visitor.visitArray(this.operands);\n }\n\n eval(context) {\n let a = this.operands[0].eval(context);\n let b = this.operands[1].eval(context);\n let op;\n\n if (context.isMathOn(this.op)) {\n op = this.op === './' ? '/' : this.op;\n if (a instanceof Dimension && b instanceof Color) {\n a = a.toColor();\n }\n if (b instanceof Dimension && a instanceof Color) {\n b = b.toColor();\n }\n if (!a.operate) {\n if (a instanceof Operation && a.op === '/' && context.math === MATH.PARENS_DIVISION) {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n throw { type: 'Operation',\n message: 'Operation on an invalid type' };\n }\n\n return a.operate(context, op, b);\n } else {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n }\n\n genCSS(context, output) {\n this.operands[0].genCSS(context, output);\n if (this.isSpaced) {\n output.add(' ');\n }\n output.add(this.op);\n if (this.isSpaced) {\n output.add(' ');\n }\n this.operands[1].genCSS(context, output);\n }\n}\n\nOperation.prototype.type = 'Operation';\nexport default Operation;\n","import Node from './node';\nimport Paren from './paren';\nimport Comment from './comment';\nimport Dimension from './dimension';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\nclass Expression extends Node {\n constructor(value, noSpacing) {\n super();\n\n this.value = value;\n this.noSpacing = noSpacing;\n if (!value) {\n throw new Error('Expression requires an array parameter');\n }\n }\n\n accept(visitor) {\n this.value = visitor.visitArray(this.value);\n }\n\n eval(context) {\n let returnValue;\n const mathOn = context.isMathOn();\n\n const inParenthesis = this.parens && \n (context.math !== MATH.STRICT_LEGACY || !this.parensInOp);\n\n let doubleParen = false;\n if (inParenthesis) {\n context.inParenthesis();\n }\n if (this.value.length > 1) {\n returnValue = new Expression(this.value.map(e => {\n if (!e.eval) {\n return e;\n }\n return e.eval(context);\n }), this.noSpacing);\n } else if (this.value.length === 1) {\n if (this.value[0].parens && !this.value[0].parensInOp && !context.inCalc) {\n doubleParen = true;\n }\n returnValue = this.value[0].eval(context);\n } else {\n returnValue = this;\n }\n if (inParenthesis) {\n context.outOfParenthesis();\n }\n if (this.parens && this.parensInOp && !mathOn && !doubleParen \n && (!(returnValue instanceof Dimension))) {\n returnValue = new Paren(returnValue);\n }\n return returnValue;\n }\n\n genCSS(context, output) {\n for (let i = 0; i < this.value.length; i++) {\n this.value[i].genCSS(context, output);\n if (!this.noSpacing && i + 1 < this.value.length) {\n output.add(' ');\n }\n }\n }\n\n throwAwayComments() {\n this.value = this.value.filter(v => !(v instanceof Comment));\n }\n}\n\nExpression.prototype.type = 'Expression';\nexport default Expression;\n","import Expression from '../tree/expression';\n\nclass functionCaller {\n constructor(name, context, index, currentFileInfo) {\n this.name = name.toLowerCase();\n this.index = index;\n this.context = context;\n this.currentFileInfo = currentFileInfo;\n\n this.func = context.frames[0].functionRegistry.get(this.name);\n }\n\n isValid() {\n return Boolean(this.func);\n }\n\n call(args) {\n const evalArgs = this.func.evalArgs;\n if (evalArgs !== false) {\n args = args.map(a => a.eval(this.context));\n }\n // This code is terrible and should be replaced as per this issue...\n // https://github.com/less/less.js/issues/2477\n if (Array.isArray(args)) {\n args = args.filter(item => {\n if (item.type === 'Comment') {\n return false;\n }\n return true;\n })\n .map(item => {\n if (item.type === 'Expression') {\n const subNodes = item.value.filter(item => {\n if (item.type === 'Comment') {\n return false;\n }\n return true;\n });\n if (subNodes.length === 1) {\n return subNodes[0];\n } else {\n return new Expression(subNodes);\n }\n }\n return item;\n });\n }\n\n if (evalArgs === false) {\n return this.func(this.context, ...args);\n }\n\n return this.func(...args);\n }\n}\n\nexport default functionCaller;\n","import Node from './node';\nimport Anonymous from './anonymous';\nimport FunctionCaller from '../functions/function-caller';\n\n//\n// A function call node.\n//\nclass Call extends Node {\n constructor(name, args, index, currentFileInfo) {\n super();\n\n this.name = name;\n this.args = args;\n this.calc = name === 'calc';\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n accept(visitor) {\n if (this.args) {\n this.args = visitor.visitArray(this.args);\n }\n }\n\n //\n // When evaluating a function call,\n // we either find the function in the functionRegistry,\n // in which case we call it, passing the evaluated arguments,\n // if this returns null or we cannot find the function, we\n // simply print it out as it appeared originally [2].\n //\n // The reason why we evaluate the arguments, is in the case where\n // we try to pass a variable to a function, like: `saturate(@color)`.\n // The function should receive the value, not the variable.\n //\n eval(context) {\n /**\n * Turn off math for calc(), and switch back on for evaluating nested functions\n */\n const currentMathContext = context.mathOn;\n context.mathOn = !this.calc;\n if (this.calc || context.inCalc) {\n context.enterCalc();\n }\n\n const exitCalc = () => {\n if (this.calc || context.inCalc) {\n context.exitCalc();\n }\n context.mathOn = currentMathContext;\n };\n\n let result;\n const funcCaller = new FunctionCaller(this.name, context, this.getIndex(), this.fileInfo());\n\n if (funcCaller.isValid()) {\n try {\n result = funcCaller.call(this.args);\n exitCalc();\n } catch (e) {\n if (e.hasOwnProperty('line') && e.hasOwnProperty('column')) {\n throw e\n }\n throw { \n type: e.type || 'Runtime',\n message: `error evaluating function \\`${this.name}\\`${e.message ? `: ${e.message}` : ''}`,\n index: this.getIndex(), \n filename: this.fileInfo().filename,\n line: e.lineNumber,\n column: e.columnNumber\n };\n }\n\n if (result !== null && result !== undefined) {\n // Results that that are not nodes are cast as Anonymous nodes\n // Falsy values or booleans are returned as empty nodes\n if (!(result instanceof Node)) {\n if (!result || result === true) {\n result = new Anonymous(null); \n }\n else {\n result = new Anonymous(result.toString()); \n }\n \n }\n result._index = this._index;\n result._fileInfo = this._fileInfo;\n return result;\n }\n }\n\n const args = this.args.map(a => a.eval(context));\n exitCalc();\n\n return new Call(this.name, args, this.getIndex(), this.fileInfo());\n }\n\n genCSS(context, output) {\n output.add(`${this.name}(`, this.fileInfo(), this.getIndex());\n\n for (let i = 0; i < this.args.length; i++) {\n this.args[i].genCSS(context, output);\n if (i + 1 < this.args.length) {\n output.add(', ');\n }\n }\n\n output.add(')');\n }\n}\n\nCall.prototype.type = 'Call';\nexport default Call;\n","import Node from './node';\nimport Call from './call';\n\nclass Variable extends Node {\n constructor(name, index, currentFileInfo) {\n super();\n\n this.name = name;\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n eval(context) {\n let variable;\n let name = this.name;\n\n if (name.indexOf('@@') === 0) {\n name = `@${new Variable(name.slice(1), this.getIndex(), this.fileInfo()).eval(context).value}`;\n }\n\n if (this.evaluating) {\n throw { type: 'Name',\n message: `Recursive variable definition for ${name}`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n variable = this.find(context.frames, frame => {\n const v = frame.variable(name);\n if (v) {\n if (v.important) {\n const importantScope = context.importantScope[context.importantScope.length - 1];\n importantScope.important = v.important;\n }\n // If in calc, wrap vars in a function call to cascade evaluate args first\n if (context.inCalc) {\n return (new Call('_SELF', [v.value])).eval(context);\n }\n else {\n return v.value.eval(context);\n }\n }\n });\n if (variable) {\n this.evaluating = false;\n return variable;\n } else {\n throw { type: 'Name',\n message: `variable ${name} is undefined`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n }\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n}\n\nVariable.prototype.type = 'Variable';\nexport default Variable;\n","import Node from './node';\nimport Declaration from './declaration';\n\nclass Property extends Node {\n constructor(name, index, currentFileInfo) {\n super();\n\n this.name = name;\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n eval(context) {\n let property;\n const name = this.name;\n // TODO: shorten this reference\n const mergeRules = context.pluginManager.less.visitors.ToCSSVisitor.prototype._mergeRules;\n\n if (this.evaluating) {\n throw { type: 'Name',\n message: `Recursive property reference for ${name}`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n property = this.find(context.frames, frame => {\n let v;\n const vArr = frame.property(name);\n if (vArr) {\n for (let i = 0; i < vArr.length; i++) {\n v = vArr[i];\n\n vArr[i] = new Declaration(v.name,\n v.value,\n v.important,\n v.merge,\n v.index,\n v.currentFileInfo,\n v.inline,\n v.variable\n );\n }\n mergeRules(vArr);\n\n v = vArr[vArr.length - 1];\n if (v.important) {\n const importantScope = context.importantScope[context.importantScope.length - 1];\n importantScope.important = v.important;\n }\n v = v.value.eval(context);\n return v;\n }\n });\n if (property) {\n this.evaluating = false;\n return property;\n } else {\n throw { type: 'Name',\n message: `Property '${name}' is undefined`,\n filename: this.currentFileInfo.filename,\n index: this.index };\n }\n }\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n}\n\nProperty.prototype.type = 'Property';\nexport default Property;\n","import Node from './node';\n\nclass Attribute extends Node {\n constructor(key, op, value) {\n super();\n\n this.key = key;\n this.op = op;\n this.value = value;\n }\n\n eval(context) {\n return new Attribute(this.key.eval ? this.key.eval(context) : this.key,\n this.op, (this.value && this.value.eval) ? this.value.eval(context) : this.value);\n }\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n }\n\n toCSS(context) {\n let value = this.key.toCSS ? this.key.toCSS(context) : this.key;\n\n if (this.op) {\n value += this.op;\n value += (this.value.toCSS ? this.value.toCSS(context) : this.value);\n }\n\n return `[${value}]`;\n }\n}\n\nAttribute.prototype.type = 'Attribute';\nexport default Attribute;\n","import Node from './node';\nimport Variable from './variable';\nimport Property from './property';\n\n\nclass Quoted extends Node {\n constructor(str, content, escaped, index, currentFileInfo) {\n super();\n\n this.escaped = (escaped == null) ? true : escaped;\n this.value = content || '';\n this.quote = str.charAt(0);\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.variableRegex = /@\\{([\\w-]+)\\}/g;\n this.propRegex = /\\$\\{([\\w-]+)\\}/g;\n this.allowRoot = escaped;\n }\n\n genCSS(context, output) {\n if (!this.escaped) {\n output.add(this.quote, this.fileInfo(), this.getIndex());\n }\n output.add(this.value);\n if (!this.escaped) {\n output.add(this.quote);\n }\n }\n\n containsVariables() {\n return this.value.match(this.variableRegex);\n }\n\n eval(context) {\n const that = this;\n let value = this.value;\n const variableReplacement = (_, name) => {\n const v = new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v.value : v.toCSS();\n };\n const propertyReplacement = (_, name) => {\n const v = new Property(`$${name}`, that.getIndex(), that.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v.value : v.toCSS();\n };\n function iterativeReplace(value, regexp, replacementFnc) {\n let evaluatedValue = value;\n do {\n value = evaluatedValue.toString();\n evaluatedValue = value.replace(regexp, replacementFnc);\n } while (value !== evaluatedValue);\n return evaluatedValue;\n }\n value = iterativeReplace(value, this.variableRegex, variableReplacement);\n value = iterativeReplace(value, this.propRegex, propertyReplacement);\n\n return new Quoted(this.quote + value + this.quote, value, this.escaped, this.getIndex(), this.fileInfo());\n }\n\n compare(other) {\n // when comparing quoted strings allow the quote to differ\n if (other.type === 'Quoted' && !this.escaped && !other.escaped) {\n return Node.numericCompare(this.value, other.value);\n } else {\n return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n }\n }\n}\n\nQuoted.prototype.type = 'Quoted';\nexport default Quoted;\n","import Node from './node';\n\nclass URL extends Node {\n constructor(val, index, currentFileInfo, isEvald) {\n super();\n\n this.value = val;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.isEvald = isEvald;\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n genCSS(context, output) {\n output.add('url(');\n this.value.genCSS(context, output);\n output.add(')');\n }\n\n eval(context) {\n const val = this.value.eval(context);\n let rootpath;\n\n if (!this.isEvald) {\n // Add the rootpath if the URL requires a rewrite\n rootpath = this.fileInfo() && this.fileInfo().rootpath;\n if (typeof rootpath === 'string' &&\n typeof val.value === 'string' &&\n context.pathRequiresRewrite(val.value)) {\n if (!val.quote) {\n rootpath = escapePath(rootpath);\n }\n val.value = context.rewritePath(val.value, rootpath);\n } else {\n val.value = context.normalizePath(val.value);\n }\n\n // Add url args if enabled\n if (context.urlArgs) {\n if (!val.value.match(/^\\s*data:/)) {\n const delimiter = val.value.indexOf('?') === -1 ? '?' : '&';\n const urlArgs = delimiter + context.urlArgs;\n if (val.value.indexOf('#') !== -1) {\n val.value = val.value.replace('#', `${urlArgs}#`);\n } else {\n val.value += urlArgs;\n }\n }\n }\n }\n\n return new URL(val, this.getIndex(), this.fileInfo(), true);\n }\n}\n\nURL.prototype.type = 'Url';\n\nfunction escapePath(path) {\n return path.replace(/[\\(\\)'\"\\s]/g, match => `\\\\${match}`);\n}\n\nexport default URL;\n","import Ruleset from './ruleset';\nimport Value from './value';\nimport Selector from './selector';\nimport Anonymous from './anonymous';\nimport Expression from './expression';\nimport AtRule from './atrule';\nimport * as utils from '../utils';\n\nclass Media extends AtRule {\n constructor(value, features, index, currentFileInfo, visibilityInfo) {\n super();\n\n this._index = index;\n this._fileInfo = currentFileInfo;\n\n const selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors();\n\n this.features = new Value(features);\n this.rules = [new Ruleset(selectors, value)];\n this.rules[0].allowImports = true;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n this.setParent(selectors, this);\n this.setParent(this.features, this);\n this.setParent(this.rules, this);\n }\n\n isRulesetLike() {\n return true;\n }\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this.features);\n }\n if (this.rules) {\n this.rules = visitor.visitArray(this.rules);\n }\n }\n\n genCSS(context, output) {\n output.add('@media ', this._fileInfo, this._index);\n this.features.genCSS(context, output);\n this.outputRuleset(context, output, this.rules);\n }\n\n eval(context) {\n if (!context.mediaBlocks) {\n context.mediaBlocks = [];\n context.mediaPath = [];\n }\n\n const media = new Media(null, [], this._index, this._fileInfo, this.visibilityInfo());\n if (this.debugInfo) {\n this.rules[0].debugInfo = this.debugInfo;\n media.debugInfo = this.debugInfo;\n }\n \n media.features = this.features.eval(context);\n\n context.mediaPath.push(media);\n context.mediaBlocks.push(media);\n\n this.rules[0].functionRegistry = context.frames[0].functionRegistry.inherit();\n context.frames.unshift(this.rules[0]);\n media.rules = [this.rules[0].eval(context)];\n context.frames.shift();\n\n context.mediaPath.pop();\n\n return context.mediaPath.length === 0 ? media.evalTop(context) :\n media.evalNested(context);\n }\n\n evalTop(context) {\n let result = this;\n\n // Render all dependent Media blocks.\n if (context.mediaBlocks.length > 1) {\n const selectors = (new Selector([], null, null, this.getIndex(), this.fileInfo())).createEmptySelectors();\n result = new Ruleset(selectors, context.mediaBlocks);\n result.multiMedia = true;\n result.copyVisibilityInfo(this.visibilityInfo());\n this.setParent(result, this);\n }\n\n delete context.mediaBlocks;\n delete context.mediaPath;\n\n return result;\n }\n\n evalNested(context) {\n let i;\n let value;\n const path = context.mediaPath.concat([this]);\n\n // Extract the media-query conditions separated with `,` (OR).\n for (i = 0; i < path.length; i++) {\n value = path[i].features instanceof Value ?\n path[i].features.value : path[i].features;\n path[i] = Array.isArray(value) ? value : [value];\n }\n\n // Trace all permutations to generate the resulting media-query.\n //\n // (a, b and c) with nested (d, e) ->\n // a and d\n // a and e\n // b and c and d\n // b and c and e\n this.features = new Value(this.permute(path).map(path => {\n path = path.map(fragment => fragment.toCSS ? fragment : new Anonymous(fragment));\n\n for (i = path.length - 1; i > 0; i--) {\n path.splice(i, 0, new Anonymous('and'));\n }\n\n return new Expression(path);\n }));\n this.setParent(this.features, this);\n\n // Fake a tree-node that doesn't output anything.\n return new Ruleset([], []);\n }\n\n permute(arr) {\n if (arr.length === 0) {\n return [];\n } else if (arr.length === 1) {\n return arr[0];\n } else {\n const result = [];\n const rest = this.permute(arr.slice(1));\n for (let i = 0; i < rest.length; i++) {\n for (let j = 0; j < arr[0].length; j++) {\n result.push([arr[0][j]].concat(rest[i]));\n }\n }\n return result;\n }\n }\n\n bubbleSelectors(selectors) {\n if (!selectors) {\n return;\n }\n this.rules = [new Ruleset(utils.copyArray(selectors), [this.rules[0]])];\n this.setParent(this.rules, this);\n }\n}\n\nMedia.prototype.type = 'Media';\nexport default Media;\n","import Node from './node';\nimport Media from './media';\nimport URL from './url';\nimport Quoted from './quoted';\nimport Ruleset from './ruleset';\nimport Anonymous from './anonymous';\nimport * as utils from '../utils';\nimport LessError from '../less-error';\n\n//\n// CSS @import node\n//\n// The general strategy here is that we don't want to wait\n// for the parsing to be completed, before we start importing\n// the file. That's because in the context of a browser,\n// most of the time will be spent waiting for the server to respond.\n//\n// On creation, we push the import path to our import queue, though\n// `import,push`, we also pass it a callback, which it'll call once\n// the file has been fetched, and parsed.\n//\nclass Import extends Node {\n constructor(path, features, options, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.options = options;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.path = path;\n this.features = features;\n this.allowRoot = true;\n\n if (this.options.less !== undefined || this.options.inline) {\n this.css = !this.options.less || this.options.inline;\n } else {\n const pathValue = this.getPath();\n if (pathValue && /[#\\.\\&\\?]css([\\?;].*)?$/.test(pathValue)) {\n this.css = true;\n }\n }\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.features, this);\n this.setParent(this.path, this);\n }\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this.features);\n }\n this.path = visitor.visit(this.path);\n if (!this.options.isPlugin && !this.options.inline && this.root) {\n this.root = visitor.visit(this.root);\n }\n }\n\n genCSS(context, output) {\n if (this.css && this.path._fileInfo.reference === undefined) {\n output.add('@import ', this._fileInfo, this._index);\n this.path.genCSS(context, output);\n if (this.features) {\n output.add(' ');\n this.features.genCSS(context, output);\n }\n output.add(';');\n }\n }\n\n getPath() {\n return (this.path instanceof URL) ?\n this.path.value.value : this.path.value;\n }\n\n isVariableImport() {\n let path = this.path;\n if (path instanceof URL) {\n path = path.value;\n }\n if (path instanceof Quoted) {\n return path.containsVariables();\n }\n\n return true;\n }\n\n evalForImport(context) {\n let path = this.path;\n\n if (path instanceof URL) {\n path = path.value;\n }\n\n return new Import(path.eval(context), this.features, this.options, this._index, this._fileInfo, this.visibilityInfo());\n }\n\n evalPath(context) {\n const path = this.path.eval(context);\n const fileInfo = this._fileInfo;\n\n if (!(path instanceof URL)) {\n // Add the rootpath if the URL requires a rewrite\n const pathValue = path.value;\n if (fileInfo &&\n pathValue &&\n context.pathRequiresRewrite(pathValue)) {\n path.value = context.rewritePath(pathValue, fileInfo.rootpath);\n } else {\n path.value = context.normalizePath(path.value);\n }\n }\n\n return path;\n }\n\n eval(context) {\n const result = this.doEval(context);\n if (this.options.reference || this.blocksVisibility()) {\n if (result.length || result.length === 0) {\n result.forEach(node => {\n node.addVisibilityBlock();\n }\n );\n } else {\n result.addVisibilityBlock();\n }\n }\n return result;\n }\n\n doEval(context) {\n let ruleset;\n let registry;\n const features = this.features && this.features.eval(context);\n\n if (this.options.isPlugin) {\n if (this.root && this.root.eval) {\n try {\n this.root.eval(context);\n }\n catch (e) {\n e.message = 'Plugin error during evaluation';\n throw new LessError(e, this.root.imports, this.root.filename);\n }\n }\n registry = context.frames[0] && context.frames[0].functionRegistry;\n if ( registry && this.root && this.root.functions ) {\n registry.addMultiple( this.root.functions );\n }\n\n return [];\n }\n\n if (this.skip) {\n if (typeof this.skip === 'function') {\n this.skip = this.skip();\n }\n if (this.skip) {\n return [];\n }\n }\n if (this.options.inline) {\n const contents = new Anonymous(this.root, 0,\n {\n filename: this.importedFilename,\n reference: this.path._fileInfo && this.path._fileInfo.reference\n }, true, true);\n\n return this.features ? new Media([contents], this.features.value) : [contents];\n } else if (this.css) {\n const newImport = new Import(this.evalPath(context), features, this.options, this._index);\n if (!newImport.css && this.error) {\n throw this.error;\n }\n return newImport;\n } else if (this.root) {\n ruleset = new Ruleset(null, utils.copyArray(this.root.rules));\n ruleset.evalImports(context);\n\n return this.features ? new Media(ruleset.rules, this.features.value) : ruleset.rules;\n } else {\n return [];\n }\n }\n}\n\nImport.prototype.type = 'Import';\nexport default Import;\n","import Node from './node';\nimport Variable from './variable';\n\nclass JsEvalNode extends Node {\n evaluateJavaScript(expression, context) {\n let result;\n const that = this;\n const evalContext = {};\n\n if (!context.javascriptEnabled) {\n throw { message: 'Inline JavaScript is not enabled. Is it set in your options?',\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n expression = expression.replace(/@\\{([\\w-]+)\\}/g, (_, name) => that.jsify(new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context)));\n\n try {\n expression = new Function(`return (${expression})`);\n } catch (e) {\n throw { message: `JavaScript evaluation error: ${e.message} from \\`${expression}\\`` ,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n const variables = context.frames[0].variables();\n for (const k in variables) {\n if (variables.hasOwnProperty(k)) {\n /* jshint loopfunc:true */\n evalContext[k.slice(1)] = {\n value: variables[k].value,\n toJS: function () {\n return this.value.eval(context).toCSS();\n }\n };\n }\n }\n\n try {\n result = expression.call(evalContext);\n } catch (e) {\n throw { message: `JavaScript evaluation error: '${e.name}: ${e.message.replace(/[\"]/g, '\\'')}'` ,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n return result;\n }\n\n jsify(obj) {\n if (Array.isArray(obj.value) && (obj.value.length > 1)) {\n return `[${obj.value.map(v => v.toCSS()).join(', ')}]`;\n } else {\n return obj.toCSS();\n }\n }\n}\n\nexport default JsEvalNode;\n","import JsEvalNode from './js-eval-node';\nimport Dimension from './dimension';\nimport Quoted from './quoted';\nimport Anonymous from './anonymous';\n\nclass JavaScript extends JsEvalNode {\n constructor(string, escaped, index, currentFileInfo) {\n super();\n\n this.escaped = escaped;\n this.expression = string;\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n eval(context) {\n const result = this.evaluateJavaScript(this.expression, context);\n const type = typeof result;\n\n if (type === 'number' && !isNaN(result)) {\n return new Dimension(result);\n } else if (type === 'string') {\n return new Quoted(`\"${result}\"`, result, this.escaped, this._index);\n } else if (Array.isArray(result)) {\n return new Anonymous(result.join(', '));\n } else {\n return new Anonymous(result);\n }\n }\n}\n\nJavaScript.prototype.type = 'JavaScript';\nexport default JavaScript;\n","import Node from './node';\n\nclass Assignment extends Node {\n constructor(key, val) {\n super();\n\n this.key = key;\n this.value = val;\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n eval(context) {\n if (this.value.eval) {\n return new Assignment(this.key, this.value.eval(context));\n }\n return this;\n }\n\n genCSS(context, output) {\n output.add(`${this.key}=`);\n if (this.value.genCSS) {\n this.value.genCSS(context, output);\n } else {\n output.add(this.value);\n }\n }\n}\n\nAssignment.prototype.type = 'Assignment';\nexport default Assignment;\n","import Node from './node';\n\nclass Condition extends Node {\n constructor(op, l, r, i, negate) {\n super();\n\n this.op = op.trim();\n this.lvalue = l;\n this.rvalue = r;\n this._index = i;\n this.negate = negate;\n }\n\n accept(visitor) {\n this.lvalue = visitor.visit(this.lvalue);\n this.rvalue = visitor.visit(this.rvalue);\n }\n\n eval(context) {\n const result = ((op, a, b) => {\n switch (op) {\n case 'and': return a && b;\n case 'or': return a || b;\n default:\n switch (Node.compare(a, b)) {\n case -1:\n return op === '<' || op === '=<' || op === '<=';\n case 0:\n return op === '=' || op === '>=' || op === '=<' || op === '<=';\n case 1:\n return op === '>' || op === '>=';\n default:\n return false;\n }\n }\n })(this.op, this.lvalue.eval(context), this.rvalue.eval(context));\n\n return this.negate ? !result : result;\n }\n}\n\nCondition.prototype.type = 'Condition';\nexport default Condition;\n","import Node from './node';\n\nclass UnicodeDescriptor extends Node {\n constructor(value) {\n super();\n\n this.value = value;\n }\n}\n\nUnicodeDescriptor.prototype.type = 'UnicodeDescriptor';\n\nexport default UnicodeDescriptor;\n","import Node from './node';\nimport Operation from './operation';\nimport Dimension from './dimension';\n\nclass Negative extends Node {\n constructor(node) {\n super();\n\n this.value = node;\n }\n\n genCSS(context, output) {\n output.add('-');\n this.value.genCSS(context, output);\n }\n\n eval(context) {\n if (context.isMathOn()) {\n return (new Operation('*', [new Dimension(-1), this.value])).eval(context);\n }\n return new Negative(this.value.eval(context));\n }\n}\n\nNegative.prototype.type = 'Negative';\nexport default Negative;\n","import Node from './node';\nimport Selector from './selector';\n\nclass Extend extends Node {\n constructor(selector, option, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.selector = selector;\n this.option = option;\n this.object_id = Extend.next_id++;\n this.parent_ids = [this.object_id];\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n\n switch (option) {\n case 'all':\n this.allowBefore = true;\n this.allowAfter = true;\n break;\n default:\n this.allowBefore = false;\n this.allowAfter = false;\n break;\n }\n this.setParent(this.selector, this);\n }\n\n accept(visitor) {\n this.selector = visitor.visit(this.selector);\n }\n\n eval(context) {\n return new Extend(this.selector.eval(context), this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n }\n\n clone(context) {\n return new Extend(this.selector, this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n }\n\n // it concatenates (joins) all selectors in selector array\n findSelfSelectors(selectors) {\n let selfElements = [];\n let i;\n let selectorElements;\n\n for (i = 0; i < selectors.length; i++) {\n selectorElements = selectors[i].elements;\n // duplicate the logic in genCSS function inside the selector node.\n // future TODO - move both logics into the selector joiner visitor\n if (i > 0 && selectorElements.length && selectorElements[0].combinator.value === '') {\n selectorElements[0].combinator.value = ' ';\n }\n selfElements = selfElements.concat(selectors[i].elements);\n }\n\n this.selfSelectors = [new Selector(selfElements)];\n this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo());\n }\n}\n\nExtend.next_id = 0;\n\nExtend.prototype.type = 'Extend';\nexport default Extend;\n","import Node from './node';\nimport Variable from './variable';\nimport Ruleset from './ruleset';\nimport DetachedRuleset from './detached-ruleset';\nimport LessError from '../less-error';\n\nclass VariableCall extends Node {\n constructor(variable, index, currentFileInfo) {\n super();\n\n this.variable = variable;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.allowRoot = true;\n }\n\n eval(context) {\n let rules;\n let detachedRuleset = new Variable(this.variable, this.getIndex(), this.fileInfo()).eval(context);\n const error = new LessError({message: `Could not evaluate variable call ${this.variable}`});\n\n if (!detachedRuleset.ruleset) {\n if (detachedRuleset.rules) {\n rules = detachedRuleset;\n }\n else if (Array.isArray(detachedRuleset)) {\n rules = new Ruleset('', detachedRuleset);\n }\n else if (Array.isArray(detachedRuleset.value)) {\n rules = new Ruleset('', detachedRuleset.value);\n }\n else {\n throw error;\n }\n detachedRuleset = new DetachedRuleset(rules);\n }\n\n if (detachedRuleset.ruleset) {\n return detachedRuleset.callEval(context);\n }\n throw error;\n }\n}\n\nVariableCall.prototype.type = 'VariableCall';\nexport default VariableCall;\n","import Node from './node';\nimport Variable from './variable';\nimport Ruleset from './ruleset';\nimport Selector from './selector';\n\nclass NamespaceValue extends Node {\n constructor(ruleCall, lookups, index, fileInfo) {\n super();\n\n this.value = ruleCall;\n this.lookups = lookups;\n this._index = index;\n this._fileInfo = fileInfo;\n }\n\n eval(context) {\n let i;\n let j;\n let name;\n let rules = this.value.eval(context);\n\n for (i = 0; i < this.lookups.length; i++) {\n name = this.lookups[i];\n\n /**\n * Eval'd DRs return rulesets.\n * Eval'd mixins return rules, so let's make a ruleset if we need it.\n * We need to do this because of late parsing of values\n */\n if (Array.isArray(rules)) {\n rules = new Ruleset([new Selector()], rules);\n }\n\n if (name === '') {\n rules = rules.lastDeclaration();\n }\n else if (name.charAt(0) === '@') {\n if (name.charAt(1) === '@') {\n name = `@${new Variable(name.substr(1)).eval(context).value}`;\n }\n if (rules.variables) {\n rules = rules.variable(name);\n }\n \n if (!rules) {\n throw { type: 'Name',\n message: `variable ${name} not found`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n }\n else {\n if (name.substring(0, 2) === '$@') {\n name = `$${new Variable(name.substr(1)).eval(context).value}`;\n }\n else {\n name = name.charAt(0) === '$' ? name : `$${name}`;\n }\n if (rules.properties) {\n rules = rules.property(name);\n }\n \n if (!rules) {\n throw { type: 'Name',\n message: `property \"${name.substr(1)}\" not found`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n // Properties are an array of values, since a ruleset can have multiple props.\n // We pick the last one (the \"cascaded\" value)\n rules = rules[rules.length - 1];\n }\n\n if (rules.value) {\n rules = rules.eval(context).value;\n }\n if (rules.ruleset) {\n rules = rules.ruleset.eval(context);\n }\n }\n return rules;\n }\n}\n\nNamespaceValue.prototype.type = 'NamespaceValue';\nexport default NamespaceValue;\n","import Selector from './selector';\nimport Element from './element';\nimport Ruleset from './ruleset';\nimport Declaration from './declaration';\nimport DetachedRuleset from './detached-ruleset';\nimport Expression from './expression';\nimport contexts from '../contexts';\nimport * as utils from '../utils';\n\nclass Definition extends Ruleset {\n constructor(name, params, rules, condition, variadic, frames, visibilityInfo) {\n super();\n\n this.name = name || 'anonymous mixin';\n this.selectors = [new Selector([new Element(null, name, false, this._index, this._fileInfo)])];\n this.params = params;\n this.condition = condition;\n this.variadic = variadic;\n this.arity = params.length;\n this.rules = rules;\n this._lookups = {};\n const optionalParameters = [];\n this.required = params.reduce((count, p) => {\n if (!p.name || (p.name && !p.value)) {\n return count + 1;\n }\n else {\n optionalParameters.push(p.name);\n return count;\n }\n }, 0);\n this.optionalParameters = optionalParameters;\n this.frames = frames;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n }\n\n accept(visitor) {\n if (this.params && this.params.length) {\n this.params = visitor.visitArray(this.params);\n }\n this.rules = visitor.visitArray(this.rules);\n if (this.condition) {\n this.condition = visitor.visit(this.condition);\n }\n }\n\n evalParams(context, mixinEnv, args, evaldArguments) {\n /* jshint boss:true */\n const frame = new Ruleset(null, null);\n\n let varargs;\n let arg;\n const params = utils.copyArray(this.params);\n let i;\n let j;\n let val;\n let name;\n let isNamedFound;\n let argIndex;\n let argsLength = 0;\n\n if (mixinEnv.frames && mixinEnv.frames[0] && mixinEnv.frames[0].functionRegistry) {\n frame.functionRegistry = mixinEnv.frames[0].functionRegistry.inherit();\n }\n mixinEnv = new contexts.Eval(mixinEnv, [frame].concat(mixinEnv.frames));\n\n if (args) {\n args = utils.copyArray(args);\n argsLength = args.length;\n\n for (i = 0; i < argsLength; i++) {\n arg = args[i];\n if (name = (arg && arg.name)) {\n isNamedFound = false;\n for (j = 0; j < params.length; j++) {\n if (!evaldArguments[j] && name === params[j].name) {\n evaldArguments[j] = arg.value.eval(context);\n frame.prependRule(new Declaration(name, arg.value.eval(context)));\n isNamedFound = true;\n break;\n }\n }\n if (isNamedFound) {\n args.splice(i, 1);\n i--;\n continue;\n } else {\n throw { type: 'Runtime', message: `Named argument for ${this.name} ${args[i].name} not found` };\n }\n }\n }\n }\n argIndex = 0;\n for (i = 0; i < params.length; i++) {\n if (evaldArguments[i]) { continue; }\n\n arg = args && args[argIndex];\n\n if (name = params[i].name) {\n if (params[i].variadic) {\n varargs = [];\n for (j = argIndex; j < argsLength; j++) {\n varargs.push(args[j].value.eval(context));\n }\n frame.prependRule(new Declaration(name, new Expression(varargs).eval(context)));\n } else {\n val = arg && arg.value;\n if (val) {\n // This was a mixin call, pass in a detached ruleset of it's eval'd rules\n if (Array.isArray(val)) {\n val = new DetachedRuleset(new Ruleset('', val));\n }\n else {\n val = val.eval(context);\n }\n } else if (params[i].value) {\n val = params[i].value.eval(mixinEnv);\n frame.resetCache();\n } else {\n throw { type: 'Runtime', message: `wrong number of arguments for ${this.name} (${argsLength} for ${this.arity})` };\n }\n\n frame.prependRule(new Declaration(name, val));\n evaldArguments[i] = val;\n }\n }\n\n if (params[i].variadic && args) {\n for (j = argIndex; j < argsLength; j++) {\n evaldArguments[j] = args[j].value.eval(context);\n }\n }\n argIndex++;\n }\n\n return frame;\n }\n\n makeImportant() {\n const rules = !this.rules ? this.rules : this.rules.map(r => {\n if (r.makeImportant) {\n return r.makeImportant(true);\n } else {\n return r;\n }\n });\n const result = new Definition(this.name, this.params, rules, this.condition, this.variadic, this.frames);\n return result;\n }\n\n eval(context) {\n return new Definition(this.name, this.params, this.rules, this.condition, this.variadic, this.frames || utils.copyArray(context.frames));\n }\n\n evalCall(context, args, important) {\n const _arguments = [];\n const mixinFrames = this.frames ? this.frames.concat(context.frames) : context.frames;\n const frame = this.evalParams(context, new contexts.Eval(context, mixinFrames), args, _arguments);\n let rules;\n let ruleset;\n\n frame.prependRule(new Declaration('@arguments', new Expression(_arguments).eval(context)));\n\n rules = utils.copyArray(this.rules);\n\n ruleset = new Ruleset(null, rules);\n ruleset.originalRuleset = this;\n ruleset = ruleset.eval(new contexts.Eval(context, [this, frame].concat(mixinFrames)));\n if (important) {\n ruleset = ruleset.makeImportant();\n }\n return ruleset;\n }\n\n matchCondition(args, context) {\n if (this.condition && !this.condition.eval(\n new contexts.Eval(context,\n [this.evalParams(context, /* the parameter variables */\n new contexts.Eval(context, this.frames ? this.frames.concat(context.frames) : context.frames), args, [])]\n .concat(this.frames || []) // the parent namespace/mixin frames\n .concat(context.frames)))) { // the current environment frames\n return false;\n }\n return true;\n }\n\n matchArgs(args, context) {\n const allArgsCnt = (args && args.length) || 0;\n let len;\n const optionalParameters = this.optionalParameters;\n const requiredArgsCnt = !args ? 0 : args.reduce((count, p) => {\n if (optionalParameters.indexOf(p.name) < 0) {\n return count + 1;\n } else {\n return count;\n }\n }, 0);\n\n if (!this.variadic) {\n if (requiredArgsCnt < this.required) {\n return false;\n }\n if (allArgsCnt > this.params.length) {\n return false;\n }\n } else {\n if (requiredArgsCnt < (this.required - 1)) {\n return false;\n }\n }\n\n // check patterns\n len = Math.min(requiredArgsCnt, this.arity);\n\n for (let i = 0; i < len; i++) {\n if (!this.params[i].name && !this.params[i].variadic) {\n if (args[i].value.eval(context).toCSS() != this.params[i].value.eval(context).toCSS()) {\n return false;\n }\n }\n }\n return true;\n }\n}\n\nDefinition.prototype.type = 'MixinDefinition';\nDefinition.prototype.evalFirst = true;\nexport default Definition;\n","import Node from './node';\nimport Selector from './selector';\nimport MixinDefinition from './mixin-definition';\nimport defaultFunc from '../functions/default';\n\nclass MixinCall extends Node {\n constructor(elements, args, index, currentFileInfo, important) {\n super();\n\n this.selector = new Selector(elements);\n this.arguments = args || [];\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.important = important;\n this.allowRoot = true;\n this.setParent(this.selector, this);\n }\n\n accept(visitor) {\n if (this.selector) {\n this.selector = visitor.visit(this.selector);\n }\n if (this.arguments.length) {\n this.arguments = visitor.visitArray(this.arguments);\n }\n }\n\n eval(context) {\n let mixins;\n let mixin;\n let mixinPath;\n const args = [];\n let arg;\n let argValue;\n const rules = [];\n let match = false;\n let i;\n let m;\n let f;\n let isRecursive;\n let isOneFound;\n const candidates = [];\n let candidate;\n const conditionResult = [];\n let defaultResult;\n const defFalseEitherCase = -1;\n const defNone = 0;\n const defTrue = 1;\n const defFalse = 2;\n let count;\n let originalRuleset;\n let noArgumentsFilter;\n\n this.selector = this.selector.eval(context);\n\n function calcDefGroup(mixin, mixinPath) {\n let f;\n let p;\n let namespace;\n\n for (f = 0; f < 2; f++) {\n conditionResult[f] = true;\n defaultFunc.value(f);\n for (p = 0; p < mixinPath.length && conditionResult[f]; p++) {\n namespace = mixinPath[p];\n if (namespace.matchCondition) {\n conditionResult[f] = conditionResult[f] && namespace.matchCondition(null, context);\n }\n }\n if (mixin.matchCondition) {\n conditionResult[f] = conditionResult[f] && mixin.matchCondition(args, context);\n }\n }\n if (conditionResult[0] || conditionResult[1]) {\n if (conditionResult[0] != conditionResult[1]) {\n return conditionResult[1] ?\n defTrue : defFalse;\n }\n\n return defNone;\n }\n return defFalseEitherCase;\n }\n\n for (i = 0; i < this.arguments.length; i++) {\n arg = this.arguments[i];\n argValue = arg.value.eval(context);\n if (arg.expand && Array.isArray(argValue.value)) {\n argValue = argValue.value;\n for (m = 0; m < argValue.length; m++) {\n args.push({value: argValue[m]});\n }\n } else {\n args.push({name: arg.name, value: argValue});\n }\n }\n\n noArgumentsFilter = rule => rule.matchArgs(null, context);\n\n for (i = 0; i < context.frames.length; i++) {\n if ((mixins = context.frames[i].find(this.selector, null, noArgumentsFilter)).length > 0) {\n isOneFound = true;\n\n // To make `default()` function independent of definition order we have two \"subpasses\" here.\n // At first we evaluate each guard *twice* (with `default() == true` and `default() == false`),\n // and build candidate list with corresponding flags. Then, when we know all possible matches,\n // we make a final decision.\n\n for (m = 0; m < mixins.length; m++) {\n mixin = mixins[m].rule;\n mixinPath = mixins[m].path;\n isRecursive = false;\n for (f = 0; f < context.frames.length; f++) {\n if ((!(mixin instanceof MixinDefinition)) && mixin === (context.frames[f].originalRuleset || context.frames[f])) {\n isRecursive = true;\n break;\n }\n }\n if (isRecursive) {\n continue;\n }\n\n if (mixin.matchArgs(args, context)) {\n candidate = {mixin, group: calcDefGroup(mixin, mixinPath)};\n\n if (candidate.group !== defFalseEitherCase) {\n candidates.push(candidate);\n }\n\n match = true;\n }\n }\n\n defaultFunc.reset();\n\n count = [0, 0, 0];\n for (m = 0; m < candidates.length; m++) {\n count[candidates[m].group]++;\n }\n\n if (count[defNone] > 0) {\n defaultResult = defFalse;\n } else {\n defaultResult = defTrue;\n if ((count[defTrue] + count[defFalse]) > 1) {\n throw { type: 'Runtime',\n message: `Ambiguous use of \\`default()\\` found when matching for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n }\n\n for (m = 0; m < candidates.length; m++) {\n candidate = candidates[m].group;\n if ((candidate === defNone) || (candidate === defaultResult)) {\n try {\n mixin = candidates[m].mixin;\n if (!(mixin instanceof MixinDefinition)) {\n originalRuleset = mixin.originalRuleset || mixin;\n mixin = new MixinDefinition('', [], mixin.rules, null, false, null, originalRuleset.visibilityInfo());\n mixin.originalRuleset = originalRuleset;\n }\n const newRules = mixin.evalCall(context, args, this.important).rules;\n this._setVisibilityToReplacement(newRules);\n Array.prototype.push.apply(rules, newRules);\n } catch (e) {\n throw { message: e.message, index: this.getIndex(), filename: this.fileInfo().filename, stack: e.stack };\n }\n }\n }\n\n if (match) {\n return rules;\n }\n }\n }\n if (isOneFound) {\n throw { type: 'Runtime',\n message: `No matching definition was found for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n } else {\n throw { type: 'Name',\n message: `${this.selector.toCSS().trim()} is undefined`,\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n }\n\n _setVisibilityToReplacement(replacement) {\n let i;\n let rule;\n if (this.blocksVisibility()) {\n for (i = 0; i < replacement.length; i++) {\n rule = replacement[i];\n rule.addVisibilityBlock();\n }\n }\n }\n\n format(args) {\n return `${this.selector.toCSS().trim()}(${args ? args.map(a => {\n let argValue = '';\n if (a.name) {\n argValue += `${a.name}:`;\n }\n if (a.value.toCSS) {\n argValue += a.value.toCSS();\n } else {\n argValue += '???';\n }\n return argValue;\n }).join(', ') : ''})`;\n }\n}\n\nMixinCall.prototype.type = 'MixinCall';\nexport default MixinCall;\n","const tree = Object.create(null);\n\nimport Node from './node';\nimport Color from './color';\nimport AtRule from './atrule';\nimport DetachedRuleset from './detached-ruleset';\nimport Operation from './operation';\nimport Dimension from './dimension';\nimport Unit from './unit';\nimport Keyword from './keyword';\nimport Variable from './variable';\nimport Property from './property';\nimport Ruleset from './ruleset';\nimport Element from './element';\nimport Attribute from './attribute';\nimport Combinator from './combinator';\nimport Selector from './selector';\nimport Quoted from './quoted';\nimport Expression from './expression';\nimport Declaration from './declaration';\nimport Call from './call';\nimport URL from './url';\nimport Import from './import';\nimport Comment from './comment';\nimport Anonymous from './anonymous';\nimport Value from './value';\nimport JavaScript from './javascript';\nimport Assignment from './assignment';\nimport Condition from './condition';\nimport Paren from './paren';\nimport Media from './media';\nimport UnicodeDescriptor from './unicode-descriptor';\nimport Negative from './negative';\nimport Extend from './extend';\nimport VariableCall from './variable-call';\nimport NamespaceValue from './namespace-value';\n\n// mixins\nimport MixinCall from './mixin-call';\nimport MixinDefinition from './mixin-definition';\n\nexport default {\n Node, Color, AtRule, DetachedRuleset, Operation,\n Dimension, Unit, Keyword, Variable, Property,\n Ruleset, Element, Attribute, Combinator, Selector,\n Quoted, Expression, Declaration, Call, URL, Import,\n Comment, Anonymous, Value, JavaScript, Assignment,\n Condition, Paren, Media, UnicodeDescriptor, Negative,\n Extend, VariableCall, NamespaceValue,\n mixin: {\n Call: MixinCall,\n Definition: MixinDefinition\n }\n};","export default {\n error: function(msg) {\n this._fireEvent('error', msg);\n },\n warn: function(msg) {\n this._fireEvent('warn', msg);\n },\n info: function(msg) {\n this._fireEvent('info', msg);\n },\n debug: function(msg) {\n this._fireEvent('debug', msg);\n },\n addListener: function(listener) {\n this._listeners.push(listener);\n },\n removeListener: function(listener) {\n for (let i = 0; i < this._listeners.length; i++) {\n if (this._listeners[i] === listener) {\n this._listeners.splice(i, 1);\n return;\n }\n }\n },\n _fireEvent: function(type, msg) {\n for (let i = 0; i < this._listeners.length; i++) {\n const logFunction = this._listeners[i][type];\n if (logFunction) {\n logFunction(msg);\n }\n }\n },\n _listeners: []\n};\n","/**\n * @todo Document why this abstraction exists, and the relationship between\n * environment, file managers, and plugin manager\n */\n\nimport logger from '../logger';\n\nclass environment {\n constructor(externalEnvironment, fileManagers) {\n this.fileManagers = fileManagers || [];\n externalEnvironment = externalEnvironment || {};\n\n const optionalFunctions = ['encodeBase64', 'mimeLookup', 'charsetLookup', 'getSourceMapGenerator'];\n const requiredFunctions = [];\n const functions = requiredFunctions.concat(optionalFunctions);\n\n for (let i = 0; i < functions.length; i++) {\n const propName = functions[i];\n const environmentFunc = externalEnvironment[propName];\n if (environmentFunc) {\n this[propName] = environmentFunc.bind(externalEnvironment);\n } else if (i < requiredFunctions.length) {\n this.warn(`missing required function in environment - ${propName}`);\n }\n }\n }\n\n getFileManager(filename, currentDirectory, options, environment, isSync) {\n\n if (!filename) {\n logger.warn('getFileManager called with no filename.. Please report this issue. continuing.');\n }\n if (currentDirectory == null) {\n logger.warn('getFileManager called with null directory.. Please report this issue. continuing.');\n }\n\n let fileManagers = this.fileManagers;\n if (options.pluginManager) {\n fileManagers = [].concat(fileManagers).concat(options.pluginManager.getFileManagers());\n }\n for (let i = fileManagers.length - 1; i >= 0 ; i--) {\n const fileManager = fileManagers[i];\n if (fileManager[isSync ? 'supportsSync' : 'supports'](filename, currentDirectory, options, environment)) {\n return fileManager;\n }\n }\n return null;\n }\n\n addFileManager(fileManager) {\n this.fileManagers.push(fileManager);\n }\n\n clearFileManagers() {\n this.fileManagers = [];\n }\n}\n\nexport default environment;\n","class AbstractFileManager {\n getPath(filename) {\n let j = filename.lastIndexOf('?');\n if (j > 0) {\n filename = filename.slice(0, j);\n }\n j = filename.lastIndexOf('/');\n if (j < 0) {\n j = filename.lastIndexOf('\\\\');\n }\n if (j < 0) {\n return '';\n }\n return filename.slice(0, j + 1);\n }\n\n tryAppendExtension(path, ext) {\n return /(\\.[a-z]*$)|([\\?;].*)$/.test(path) ? path : path + ext;\n }\n\n tryAppendLessExtension(path) {\n return this.tryAppendExtension(path, '.less');\n };\n\n supportsSync() { return false; }\n\n alwaysMakePathsAbsolute() { return false; }\n\n isPathAbsolute(filename) {\n return (/^(?:[a-z-]+:|\\/|\\\\|#)/i).test(filename);\n }\n // TODO: pull out / replace?\n join(basePath, laterPath) {\n if (!basePath) {\n return laterPath;\n }\n return basePath + laterPath;\n };\n\n pathDiff(url, baseUrl) {\n // diff between two paths to create a relative path\n const urlParts = this.extractUrlParts(url);\n const baseUrlParts = this.extractUrlParts(baseUrl);\n\n let i;\n let max;\n let urlDirectories;\n let baseUrlDirectories;\n let diff = '';\n if (urlParts.hostPart !== baseUrlParts.hostPart) {\n return '';\n }\n max = Math.max(baseUrlParts.directories.length, urlParts.directories.length);\n for (i = 0; i < max; i++) {\n if (baseUrlParts.directories[i] !== urlParts.directories[i]) { break; }\n }\n baseUrlDirectories = baseUrlParts.directories.slice(i);\n urlDirectories = urlParts.directories.slice(i);\n for (i = 0; i < baseUrlDirectories.length - 1; i++) {\n diff += '../';\n }\n for (i = 0; i < urlDirectories.length - 1; i++) {\n diff += `${urlDirectories[i]}/`;\n }\n return diff;\n };\n // helper function, not part of API\n extractUrlParts(url, baseUrl) {\n // urlParts[1] = protocol://hostname/ OR /\n // urlParts[2] = / if path relative to host base\n // urlParts[3] = directories\n // urlParts[4] = filename\n // urlParts[5] = parameters\n\n const urlPartsRegex = /^((?:[a-z-]+:)?\\/{2}(?:[^\\/\\?#]*\\/)|([\\/\\\\]))?((?:[^\\/\\\\\\?#]*[\\/\\\\])*)([^\\/\\\\\\?#]*)([#\\?].*)?$/i;\n\n const urlParts = url.match(urlPartsRegex);\n const returner = {};\n let rawDirectories = [];\n const directories = [];\n let i;\n let baseUrlParts;\n\n if (!urlParts) {\n throw new Error(`Could not parse sheet href - '${url}'`);\n }\n\n // Stylesheets in IE don't always return the full path\n if (baseUrl && (!urlParts[1] || urlParts[2])) {\n baseUrlParts = baseUrl.match(urlPartsRegex);\n if (!baseUrlParts) {\n throw new Error(`Could not parse page url - '${baseUrl}'`);\n }\n urlParts[1] = urlParts[1] || baseUrlParts[1] || '';\n if (!urlParts[2]) {\n urlParts[3] = baseUrlParts[3] + urlParts[3];\n }\n }\n\n if (urlParts[3]) {\n rawDirectories = urlParts[3].replace(/\\\\/g, '/').split('/');\n\n // collapse '..' and skip '.'\n for (i = 0; i < rawDirectories.length; i++) {\n\n if (rawDirectories[i] === '..') {\n directories.pop();\n }\n else if (rawDirectories[i] !== '.') {\n directories.push(rawDirectories[i]);\n }\n \n }\n }\n\n returner.hostPart = urlParts[1];\n returner.directories = directories;\n returner.rawPath = (urlParts[1] || '') + rawDirectories.join('/');\n returner.path = (urlParts[1] || '') + directories.join('/');\n returner.filename = urlParts[4];\n returner.fileUrl = returner.path + (urlParts[4] || '');\n returner.url = returner.fileUrl + (urlParts[5] || '');\n return returner;\n };\n}\n\nexport default AbstractFileManager;","import functionRegistry from '../functions/function-registry';\nimport LessError from '../less-error';\n\nclass AbstractPluginLoader {\n constructor() {\n // Implemented by Node.js plugin loader\n this.require = () => null\n }\n\n evalPlugin(contents, context, imports, pluginOptions, fileInfo) {\n let loader;\n let registry;\n let pluginObj;\n let localModule;\n let pluginManager;\n let filename;\n let result;\n\n pluginManager = context.pluginManager;\n\n if (fileInfo) {\n if (typeof fileInfo === 'string') {\n filename = fileInfo;\n }\n else {\n filename = fileInfo.filename;\n }\n }\n const shortname = (new this.less.FileManager()).extractUrlParts(filename).filename;\n\n if (filename) {\n pluginObj = pluginManager.get(filename);\n\n if (pluginObj) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imports, filename);\n }\n return pluginObj;\n }\n }\n localModule = {\n exports: {},\n pluginManager,\n fileInfo\n };\n registry = functionRegistry.create();\n\n const registerPlugin = obj => {\n pluginObj = obj;\n };\n\n try {\n loader = new Function('module', 'require', 'registerPlugin', 'functions', 'tree', 'less', 'fileInfo', contents);\n loader(localModule, this.require(filename), registerPlugin, registry, this.less.tree, this.less, fileInfo);\n }\n catch (e) {\n return new LessError(e, imports, filename);\n }\n\n if (!pluginObj) {\n pluginObj = localModule.exports;\n }\n pluginObj = this.validatePlugin(pluginObj, filename, shortname);\n\n if (pluginObj instanceof LessError) {\n return pluginObj;\n }\n\n if (pluginObj) {\n pluginObj.imports = imports;\n pluginObj.filename = filename;\n\n // For < 3.x (or unspecified minVersion) - setOptions() before install()\n if (!pluginObj.minVersion || this.compareVersion('3.0.0', pluginObj.minVersion) < 0) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n\n if (result) {\n return result;\n }\n }\n\n // Run on first load\n pluginManager.addPlugin(pluginObj, fileInfo.filename, registry);\n pluginObj.functions = registry.getLocalFunctions();\n\n // Need to call setOptions again because the pluginObj might have functions\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n\n // Run every @plugin call\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imports, filename);\n }\n\n }\n else {\n return new LessError({ message: 'Not a valid plugin' }, imports, filename);\n }\n\n return pluginObj;\n }\n\n trySetOptions(plugin, filename, name, options) {\n if (options && !plugin.setOptions) {\n return new LessError({\n message: `Options have been provided but the plugin ${name} does not support any options.`\n });\n }\n try {\n plugin.setOptions && plugin.setOptions(options);\n }\n catch (e) {\n return new LessError(e);\n }\n }\n\n validatePlugin(plugin, filename, name) {\n if (plugin) {\n // support plugins being a function\n // so that the plugin can be more usable programmatically\n if (typeof plugin === 'function') {\n plugin = new plugin();\n }\n\n if (plugin.minVersion) {\n if (this.compareVersion(plugin.minVersion, this.less.version) < 0) {\n return new LessError({\n message: `Plugin ${name} requires version ${this.versionToString(plugin.minVersion)}`\n });\n }\n }\n return plugin;\n }\n return null;\n }\n\n compareVersion(aVersion, bVersion) {\n if (typeof aVersion === 'string') {\n aVersion = aVersion.match(/^(\\d+)\\.?(\\d+)?\\.?(\\d+)?/);\n aVersion.shift();\n }\n for (let i = 0; i < aVersion.length; i++) {\n if (aVersion[i] !== bVersion[i]) {\n return parseInt(aVersion[i]) > parseInt(bVersion[i]) ? -1 : 1;\n }\n }\n return 0;\n }\n\n versionToString(version) {\n let versionString = '';\n for (let i = 0; i < version.length; i++) {\n versionString += (versionString ? '.' : '') + version[i];\n }\n return versionString;\n }\n\n printUsage(plugins) {\n for (let i = 0; i < plugins.length; i++) {\n const plugin = plugins[i];\n if (plugin.printUsage) {\n plugin.printUsage();\n }\n }\n }\n}\n\nexport default AbstractPluginLoader;\n\n","import tree from '../tree';\nconst _visitArgs = { visitDeeper: true };\nlet _hasIndexed = false;\n\nfunction _noop(node) {\n return node;\n}\n\nfunction indexNodeTypes(parent, ticker) {\n // add .typeIndex to tree node types for lookup table\n let key;\n\n let child;\n for (key in parent) { \n /* eslint guard-for-in: 0 */\n child = parent[key];\n switch (typeof child) {\n case 'function':\n // ignore bound functions directly on tree which do not have a prototype\n // or aren't nodes\n if (child.prototype && child.prototype.type) {\n child.prototype.typeIndex = ticker++;\n }\n break;\n case 'object':\n ticker = indexNodeTypes(child, ticker);\n break;\n \n }\n }\n return ticker;\n}\n\nclass Visitor {\n constructor(implementation) {\n this._implementation = implementation;\n this._visitInCache = {};\n this._visitOutCache = {};\n\n if (!_hasIndexed) {\n indexNodeTypes(tree, 1);\n _hasIndexed = true;\n }\n }\n\n visit(node) {\n if (!node) {\n return node;\n }\n\n const nodeTypeIndex = node.typeIndex;\n if (!nodeTypeIndex) {\n // MixinCall args aren't a node type?\n if (node.value && node.value.typeIndex) {\n this.visit(node.value);\n }\n return node;\n }\n\n const impl = this._implementation;\n let func = this._visitInCache[nodeTypeIndex];\n let funcOut = this._visitOutCache[nodeTypeIndex];\n const visitArgs = _visitArgs;\n let fnName;\n\n visitArgs.visitDeeper = true;\n\n if (!func) {\n fnName = `visit${node.type}`;\n func = impl[fnName] || _noop;\n funcOut = impl[`${fnName}Out`] || _noop;\n this._visitInCache[nodeTypeIndex] = func;\n this._visitOutCache[nodeTypeIndex] = funcOut;\n }\n\n if (func !== _noop) {\n const newNode = func.call(impl, node, visitArgs);\n if (node && impl.isReplacing) {\n node = newNode;\n }\n }\n\n if (visitArgs.visitDeeper && node) {\n if (node.length) {\n for (var i = 0, cnt = node.length; i < cnt; i++) {\n if (node[i].accept) {\n node[i].accept(this);\n }\n }\n } else if (node.accept) {\n node.accept(this);\n }\n }\n\n if (funcOut != _noop) {\n funcOut.call(impl, node);\n }\n\n return node;\n }\n\n visitArray(nodes, nonReplacing) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.length;\n let i;\n\n // Non-replacing\n if (nonReplacing || !this._implementation.isReplacing) {\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n // Replacing\n const out = [];\n for (i = 0; i < cnt; i++) {\n const evald = this.visit(nodes[i]);\n if (evald === undefined) { continue; }\n if (!evald.splice) {\n out.push(evald);\n } else if (evald.length) {\n this.flatten(evald, out);\n }\n }\n return out;\n }\n\n flatten(arr, out) {\n if (!out) {\n out = [];\n }\n\n let cnt;\n let i;\n let item;\n let nestedCnt;\n let j;\n let nestedItem;\n\n for (i = 0, cnt = arr.length; i < cnt; i++) {\n item = arr[i];\n if (item === undefined) {\n continue;\n }\n if (!item.splice) {\n out.push(item);\n continue;\n }\n\n for (j = 0, nestedCnt = item.length; j < nestedCnt; j++) {\n nestedItem = item[j];\n if (nestedItem === undefined) {\n continue;\n }\n if (!nestedItem.splice) {\n out.push(nestedItem);\n } else if (nestedItem.length) {\n this.flatten(nestedItem, out);\n }\n }\n }\n\n return out;\n }\n}\n\nexport default Visitor;\n","class ImportSequencer {\n constructor(onSequencerEmpty) {\n this.imports = [];\n this.variableImports = [];\n this._onSequencerEmpty = onSequencerEmpty;\n this._currentDepth = 0;\n }\n\n addImport(callback) {\n const importSequencer = this;\n\n const importItem = {\n callback,\n args: null,\n isReady: false\n };\n\n this.imports.push(importItem);\n return function(...args) {\n importItem.args = Array.prototype.slice.call(args, 0);\n importItem.isReady = true;\n importSequencer.tryRun();\n };\n }\n\n addVariableImport(callback) {\n this.variableImports.push(callback);\n }\n\n tryRun() {\n this._currentDepth++;\n try {\n while (true) {\n while (this.imports.length > 0) {\n const importItem = this.imports[0];\n if (!importItem.isReady) {\n return;\n }\n this.imports = this.imports.slice(1);\n importItem.callback.apply(null, importItem.args);\n }\n if (this.variableImports.length === 0) {\n break;\n }\n const variableImport = this.variableImports[0];\n this.variableImports = this.variableImports.slice(1);\n variableImport();\n }\n } finally {\n this._currentDepth--;\n }\n if (this._currentDepth === 0 && this._onSequencerEmpty) {\n this._onSequencerEmpty();\n }\n }\n}\n\nexport default ImportSequencer;\n","import contexts from '../contexts';\nimport Visitor from './visitor';\nimport ImportSequencer from './import-sequencer';\nimport * as utils from '../utils';\n\nconst ImportVisitor = function(importer, finish) {\n\n this._visitor = new Visitor(this);\n this._importer = importer;\n this._finish = finish;\n this.context = new contexts.Eval();\n this.importCount = 0;\n this.onceFileDetectionMap = {};\n this.recursionDetector = {};\n this._sequencer = new ImportSequencer(this._onSequencerEmpty.bind(this));\n};\n\nImportVisitor.prototype = {\n isReplacing: false,\n run: function (root) {\n try {\n // process the contents\n this._visitor.visit(root);\n }\n catch (e) {\n this.error = e;\n }\n\n this.isFinished = true;\n this._sequencer.tryRun();\n },\n _onSequencerEmpty: function() {\n if (!this.isFinished) {\n return;\n }\n this._finish(this.error);\n },\n visitImport: function (importNode, visitArgs) {\n const inlineCSS = importNode.options.inline;\n\n if (!importNode.css || inlineCSS) {\n\n const context = new contexts.Eval(this.context, utils.copyArray(this.context.frames));\n const importParent = context.frames[0];\n\n this.importCount++;\n if (importNode.isVariableImport()) {\n this._sequencer.addVariableImport(this.processImportNode.bind(this, importNode, context, importParent));\n } else {\n this.processImportNode(importNode, context, importParent);\n }\n }\n visitArgs.visitDeeper = false;\n },\n processImportNode: function(importNode, context, importParent) {\n let evaldImportNode;\n const inlineCSS = importNode.options.inline;\n\n try {\n evaldImportNode = importNode.evalForImport(context);\n } catch (e) {\n if (!e.filename) { e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename; }\n // attempt to eval properly and treat as css\n importNode.css = true;\n // if that fails, this error will be thrown\n importNode.error = e;\n }\n\n if (evaldImportNode && (!evaldImportNode.css || inlineCSS)) {\n if (evaldImportNode.options.multiple) {\n context.importMultiple = true;\n }\n\n // try appending if we haven't determined if it is css or not\n const tryAppendLessExtension = evaldImportNode.css === undefined;\n\n for (let i = 0; i < importParent.rules.length; i++) {\n if (importParent.rules[i] === importNode) {\n importParent.rules[i] = evaldImportNode;\n break;\n }\n }\n\n const onImported = this.onImported.bind(this, evaldImportNode, context);\n const sequencedOnImported = this._sequencer.addImport(onImported);\n\n this._importer.push(evaldImportNode.getPath(), tryAppendLessExtension, evaldImportNode.fileInfo(),\n evaldImportNode.options, sequencedOnImported);\n } else {\n this.importCount--;\n if (this.isFinished) {\n this._sequencer.tryRun();\n }\n }\n },\n onImported: function (importNode, context, e, root, importedAtRoot, fullPath) {\n if (e) {\n if (!e.filename) {\n e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename;\n }\n this.error = e;\n }\n\n const importVisitor = this;\n const inlineCSS = importNode.options.inline;\n const isPlugin = importNode.options.isPlugin;\n const isOptional = importNode.options.optional;\n const duplicateImport = importedAtRoot || fullPath in importVisitor.recursionDetector;\n\n if (!context.importMultiple) {\n if (duplicateImport) {\n importNode.skip = true;\n } else {\n importNode.skip = () => {\n if (fullPath in importVisitor.onceFileDetectionMap) {\n return true;\n }\n importVisitor.onceFileDetectionMap[fullPath] = true;\n return false;\n };\n }\n }\n\n if (!fullPath && isOptional) {\n importNode.skip = true;\n }\n\n if (root) {\n importNode.root = root;\n importNode.importedFilename = fullPath;\n\n if (!inlineCSS && !isPlugin && (context.importMultiple || !duplicateImport)) {\n importVisitor.recursionDetector[fullPath] = true;\n\n const oldContext = this.context;\n this.context = context;\n try {\n this._visitor.visit(root);\n } catch (e) {\n this.error = e;\n }\n this.context = oldContext;\n }\n }\n\n importVisitor.importCount--;\n\n if (importVisitor.isFinished) {\n importVisitor._sequencer.tryRun();\n }\n },\n visitDeclaration: function (declNode, visitArgs) {\n if (declNode.value.type === 'DetachedRuleset') {\n this.context.frames.unshift(declNode);\n } else {\n visitArgs.visitDeeper = false;\n }\n },\n visitDeclarationOut: function(declNode) {\n if (declNode.value.type === 'DetachedRuleset') {\n this.context.frames.shift();\n }\n },\n visitAtRule: function (atRuleNode, visitArgs) {\n this.context.frames.unshift(atRuleNode);\n },\n visitAtRuleOut: function (atRuleNode) {\n this.context.frames.shift();\n },\n visitMixinDefinition: function (mixinDefinitionNode, visitArgs) {\n this.context.frames.unshift(mixinDefinitionNode);\n },\n visitMixinDefinitionOut: function (mixinDefinitionNode) {\n this.context.frames.shift();\n },\n visitRuleset: function (rulesetNode, visitArgs) {\n this.context.frames.unshift(rulesetNode);\n },\n visitRulesetOut: function (rulesetNode) {\n this.context.frames.shift();\n },\n visitMedia: function (mediaNode, visitArgs) {\n this.context.frames.unshift(mediaNode.rules[0]);\n },\n visitMediaOut: function (mediaNode) {\n this.context.frames.shift();\n }\n};\nexport default ImportVisitor;\n","class SetTreeVisibilityVisitor {\n constructor(visible) {\n this.visible = visible;\n }\n\n run(root) {\n this.visit(root);\n }\n\n visitArray(nodes) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.length;\n let i;\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n visit(node) {\n if (!node) {\n return node;\n }\n if (node.constructor === Array) {\n return this.visitArray(node);\n }\n\n if (!node.blocksVisibility || node.blocksVisibility()) {\n return node;\n }\n if (this.visible) {\n node.ensureVisibility();\n } else {\n node.ensureInvisibility();\n }\n\n node.accept(this);\n return node;\n }\n}\n\nexport default SetTreeVisibilityVisitor;","import tree from '../tree';\nimport Visitor from './visitor';\nimport logger from '../logger';\nimport * as utils from '../utils';\n\n/* jshint loopfunc:true */\n\nclass ExtendFinderVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n this.contexts = [];\n this.allExtendsStack = [[]];\n }\n\n run(root) {\n root = this._visitor.visit(root);\n root.allExtends = this.allExtendsStack[0];\n return root;\n }\n\n visitDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n\n let i;\n let j;\n let extend;\n const allSelectorsExtendList = [];\n let extendList;\n\n // get &:extend(.a); rules which apply to all selectors in this ruleset\n const rules = rulesetNode.rules;\n\n const ruleCnt = rules ? rules.length : 0;\n for (i = 0; i < ruleCnt; i++) {\n if (rulesetNode.rules[i] instanceof tree.Extend) {\n allSelectorsExtendList.push(rules[i]);\n rulesetNode.extendOnEveryPath = true;\n }\n }\n\n // now find every selector and apply the extends that apply to all extends\n // and the ones which apply to an individual extend\n const paths = rulesetNode.paths;\n for (i = 0; i < paths.length; i++) {\n const selectorPath = paths[i];\n const selector = selectorPath[selectorPath.length - 1];\n const selExtendList = selector.extendList;\n\n extendList = selExtendList ? utils.copyArray(selExtendList).concat(allSelectorsExtendList)\n : allSelectorsExtendList;\n\n if (extendList) {\n extendList = extendList.map(allSelectorsExtend => allSelectorsExtend.clone());\n }\n\n for (j = 0; j < extendList.length; j++) {\n this.foundExtends = true;\n extend = extendList[j];\n extend.findSelfSelectors(selectorPath);\n extend.ruleset = rulesetNode;\n if (j === 0) { extend.firstExtendOnThisSelectorPath = true; }\n this.allExtendsStack[this.allExtendsStack.length - 1].push(extend);\n }\n }\n\n this.contexts.push(rulesetNode.selectors);\n }\n\n visitRulesetOut(rulesetNode) {\n if (!rulesetNode.root) {\n this.contexts.length = this.contexts.length - 1;\n }\n }\n\n visitMedia(mediaNode, visitArgs) {\n mediaNode.allExtends = [];\n this.allExtendsStack.push(mediaNode.allExtends);\n }\n\n visitMediaOut(mediaNode) {\n this.allExtendsStack.length = this.allExtendsStack.length - 1;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n atRuleNode.allExtends = [];\n this.allExtendsStack.push(atRuleNode.allExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n this.allExtendsStack.length = this.allExtendsStack.length - 1;\n }\n}\n\nclass ProcessExtendsVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n }\n\n run(root) {\n const extendFinder = new ExtendFinderVisitor();\n this.extendIndices = {};\n extendFinder.run(root);\n if (!extendFinder.foundExtends) { return root; }\n root.allExtends = root.allExtends.concat(this.doExtendChaining(root.allExtends, root.allExtends));\n this.allExtendsStack = [root.allExtends];\n const newRoot = this._visitor.visit(root);\n this.checkExtendsForNonMatched(root.allExtends);\n return newRoot;\n }\n\n checkExtendsForNonMatched(extendList) {\n const indices = this.extendIndices;\n extendList.filter(extend => !extend.hasFoundMatches && extend.parent_ids.length == 1).forEach(extend => {\n let selector = '_unknown_';\n try {\n selector = extend.selector.toCSS({});\n }\n catch (_) {}\n\n if (!indices[`${extend.index} ${selector}`]) {\n indices[`${extend.index} ${selector}`] = true;\n logger.warn(`extend '${selector}' has no matches`);\n }\n });\n }\n\n doExtendChaining(extendsList, extendsListTarget, iterationCount) {\n //\n // chaining is different from normal extension.. if we extend an extend then we are not just copying, altering\n // and pasting the selector we would do normally, but we are also adding an extend with the same target selector\n // this means this new extend can then go and alter other extends\n //\n // this method deals with all the chaining work - without it, extend is flat and doesn't work on other extend selectors\n // this is also the most expensive.. and a match on one selector can cause an extension of a selector we had already\n // processed if we look at each selector at a time, as is done in visitRuleset\n\n let extendIndex;\n\n let targetExtendIndex;\n let matches;\n const extendsToAdd = [];\n let newSelector;\n const extendVisitor = this;\n let selectorPath;\n let extend;\n let targetExtend;\n let newExtend;\n\n iterationCount = iterationCount || 0;\n\n // loop through comparing every extend with every target extend.\n // a target extend is the one on the ruleset we are looking at copy/edit/pasting in place\n // e.g. .a:extend(.b) {} and .b:extend(.c) {} then the first extend extends the second one\n // and the second is the target.\n // the separation into two lists allows us to process a subset of chains with a bigger set, as is the\n // case when processing media queries\n for (extendIndex = 0; extendIndex < extendsList.length; extendIndex++) {\n for (targetExtendIndex = 0; targetExtendIndex < extendsListTarget.length; targetExtendIndex++) {\n\n extend = extendsList[extendIndex];\n targetExtend = extendsListTarget[targetExtendIndex];\n\n // look for circular references\n if ( extend.parent_ids.indexOf( targetExtend.object_id ) >= 0 ) { continue; }\n\n // find a match in the target extends self selector (the bit before :extend)\n selectorPath = [targetExtend.selfSelectors[0]];\n matches = extendVisitor.findMatch(extend, selectorPath);\n\n if (matches.length) {\n extend.hasFoundMatches = true;\n\n // we found a match, so for each self selector..\n extend.selfSelectors.forEach(selfSelector => {\n const info = targetExtend.visibilityInfo();\n\n // process the extend as usual\n newSelector = extendVisitor.extendSelector(matches, selectorPath, selfSelector, extend.isVisible());\n\n // but now we create a new extend from it\n newExtend = new(tree.Extend)(targetExtend.selector, targetExtend.option, 0, targetExtend.fileInfo(), info);\n newExtend.selfSelectors = newSelector;\n\n // add the extend onto the list of extends for that selector\n newSelector[newSelector.length - 1].extendList = [newExtend];\n\n // record that we need to add it.\n extendsToAdd.push(newExtend);\n newExtend.ruleset = targetExtend.ruleset;\n\n // remember its parents for circular references\n newExtend.parent_ids = newExtend.parent_ids.concat(targetExtend.parent_ids, extend.parent_ids);\n\n // only process the selector once.. if we have :extend(.a,.b) then multiple\n // extends will look at the same selector path, so when extending\n // we know that any others will be duplicates in terms of what is added to the css\n if (targetExtend.firstExtendOnThisSelectorPath) {\n newExtend.firstExtendOnThisSelectorPath = true;\n targetExtend.ruleset.paths.push(newSelector);\n }\n });\n }\n }\n }\n\n if (extendsToAdd.length) {\n // try to detect circular references to stop a stack overflow.\n // may no longer be needed.\n this.extendChainCount++;\n if (iterationCount > 100) {\n let selectorOne = '{unable to calculate}';\n let selectorTwo = '{unable to calculate}';\n try {\n selectorOne = extendsToAdd[0].selfSelectors[0].toCSS();\n selectorTwo = extendsToAdd[0].selector.toCSS();\n }\n catch (e) {}\n throw { message: `extend circular reference detected. One of the circular extends is currently:${selectorOne}:extend(${selectorTwo})`};\n }\n\n // now process the new extends on the existing rules so that we can handle a extending b extending c extending\n // d extending e...\n return extendsToAdd.concat(extendVisitor.doExtendChaining(extendsToAdd, extendsListTarget, iterationCount + 1));\n } else {\n return extendsToAdd;\n }\n }\n\n visitDeclaration(ruleNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitSelector(selectorNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n let matches;\n let pathIndex;\n let extendIndex;\n const allExtends = this.allExtendsStack[this.allExtendsStack.length - 1];\n const selectorsToAdd = [];\n const extendVisitor = this;\n let selectorPath;\n\n // look at each selector path in the ruleset, find any extend matches and then copy, find and replace\n\n for (extendIndex = 0; extendIndex < allExtends.length; extendIndex++) {\n for (pathIndex = 0; pathIndex < rulesetNode.paths.length; pathIndex++) {\n selectorPath = rulesetNode.paths[pathIndex];\n\n // extending extends happens initially, before the main pass\n if (rulesetNode.extendOnEveryPath) { continue; }\n const extendList = selectorPath[selectorPath.length - 1].extendList;\n if (extendList && extendList.length) { continue; }\n\n matches = this.findMatch(allExtends[extendIndex], selectorPath);\n\n if (matches.length) {\n allExtends[extendIndex].hasFoundMatches = true;\n\n allExtends[extendIndex].selfSelectors.forEach(selfSelector => {\n let extendedSelectors;\n extendedSelectors = extendVisitor.extendSelector(matches, selectorPath, selfSelector, allExtends[extendIndex].isVisible());\n selectorsToAdd.push(extendedSelectors);\n });\n }\n }\n }\n rulesetNode.paths = rulesetNode.paths.concat(selectorsToAdd);\n }\n\n findMatch(extend, haystackSelectorPath) {\n //\n // look through the haystack selector path to try and find the needle - extend.selector\n // returns an array of selector matches that can then be replaced\n //\n let haystackSelectorIndex;\n\n let hackstackSelector;\n let hackstackElementIndex;\n let haystackElement;\n let targetCombinator;\n let i;\n const extendVisitor = this;\n const needleElements = extend.selector.elements;\n const potentialMatches = [];\n let potentialMatch;\n const matches = [];\n\n // loop through the haystack elements\n for (haystackSelectorIndex = 0; haystackSelectorIndex < haystackSelectorPath.length; haystackSelectorIndex++) {\n hackstackSelector = haystackSelectorPath[haystackSelectorIndex];\n\n for (hackstackElementIndex = 0; hackstackElementIndex < hackstackSelector.elements.length; hackstackElementIndex++) {\n\n haystackElement = hackstackSelector.elements[hackstackElementIndex];\n\n // if we allow elements before our match we can add a potential match every time. otherwise only at the first element.\n if (extend.allowBefore || (haystackSelectorIndex === 0 && hackstackElementIndex === 0)) {\n potentialMatches.push({pathIndex: haystackSelectorIndex, index: hackstackElementIndex, matched: 0,\n initialCombinator: haystackElement.combinator});\n }\n\n for (i = 0; i < potentialMatches.length; i++) {\n potentialMatch = potentialMatches[i];\n\n // selectors add \" \" onto the first element. When we use & it joins the selectors together, but if we don't\n // then each selector in haystackSelectorPath has a space before it added in the toCSS phase. so we need to\n // work out what the resulting combinator will be\n targetCombinator = haystackElement.combinator.value;\n if (targetCombinator === '' && hackstackElementIndex === 0) {\n targetCombinator = ' ';\n }\n\n // if we don't match, null our match to indicate failure\n if (!extendVisitor.isElementValuesEqual(needleElements[potentialMatch.matched].value, haystackElement.value) ||\n (potentialMatch.matched > 0 && needleElements[potentialMatch.matched].combinator.value !== targetCombinator)) {\n potentialMatch = null;\n } else {\n potentialMatch.matched++;\n }\n\n // if we are still valid and have finished, test whether we have elements after and whether these are allowed\n if (potentialMatch) {\n potentialMatch.finished = potentialMatch.matched === needleElements.length;\n if (potentialMatch.finished &&\n (!extend.allowAfter &&\n (hackstackElementIndex + 1 < hackstackSelector.elements.length || haystackSelectorIndex + 1 < haystackSelectorPath.length))) {\n potentialMatch = null;\n }\n }\n // if null we remove, if not, we are still valid, so either push as a valid match or continue\n if (potentialMatch) {\n if (potentialMatch.finished) {\n potentialMatch.length = needleElements.length;\n potentialMatch.endPathIndex = haystackSelectorIndex;\n potentialMatch.endPathElementIndex = hackstackElementIndex + 1; // index after end of match\n potentialMatches.length = 0; // we don't allow matches to overlap, so start matching again\n matches.push(potentialMatch);\n }\n } else {\n potentialMatches.splice(i, 1);\n i--;\n }\n }\n }\n }\n return matches;\n }\n\n isElementValuesEqual(elementValue1, elementValue2) {\n if (typeof elementValue1 === 'string' || typeof elementValue2 === 'string') {\n return elementValue1 === elementValue2;\n }\n if (elementValue1 instanceof tree.Attribute) {\n if (elementValue1.op !== elementValue2.op || elementValue1.key !== elementValue2.key) {\n return false;\n }\n if (!elementValue1.value || !elementValue2.value) {\n if (elementValue1.value || elementValue2.value) {\n return false;\n }\n return true;\n }\n elementValue1 = elementValue1.value.value || elementValue1.value;\n elementValue2 = elementValue2.value.value || elementValue2.value;\n return elementValue1 === elementValue2;\n }\n elementValue1 = elementValue1.value;\n elementValue2 = elementValue2.value;\n if (elementValue1 instanceof tree.Selector) {\n if (!(elementValue2 instanceof tree.Selector) || elementValue1.elements.length !== elementValue2.elements.length) {\n return false;\n }\n for (let i = 0; i < elementValue1.elements.length; i++) {\n if (elementValue1.elements[i].combinator.value !== elementValue2.elements[i].combinator.value) {\n if (i !== 0 || (elementValue1.elements[i].combinator.value || ' ') !== (elementValue2.elements[i].combinator.value || ' ')) {\n return false;\n }\n }\n if (!this.isElementValuesEqual(elementValue1.elements[i].value, elementValue2.elements[i].value)) {\n return false;\n }\n }\n return true;\n }\n return false;\n }\n\n extendSelector(matches, selectorPath, replacementSelector, isVisible) {\n // for a set of matches, replace each match with the replacement selector\n\n let currentSelectorPathIndex = 0;\n\n let currentSelectorPathElementIndex = 0;\n let path = [];\n let matchIndex;\n let selector;\n let firstElement;\n let match;\n let newElements;\n\n for (matchIndex = 0; matchIndex < matches.length; matchIndex++) {\n match = matches[matchIndex];\n selector = selectorPath[match.pathIndex];\n firstElement = new tree.Element(\n match.initialCombinator,\n replacementSelector.elements[0].value,\n replacementSelector.elements[0].isVariable,\n replacementSelector.elements[0].getIndex(),\n replacementSelector.elements[0].fileInfo()\n );\n\n if (match.pathIndex > currentSelectorPathIndex && currentSelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n\n newElements = selector.elements\n .slice(currentSelectorPathElementIndex, match.index)\n .concat([firstElement])\n .concat(replacementSelector.elements.slice(1));\n\n if (currentSelectorPathIndex === match.pathIndex && matchIndex > 0) {\n path[path.length - 1].elements =\n path[path.length - 1].elements.concat(newElements);\n } else {\n path = path.concat(selectorPath.slice(currentSelectorPathIndex, match.pathIndex));\n\n path.push(new tree.Selector(\n newElements\n ));\n }\n currentSelectorPathIndex = match.endPathIndex;\n currentSelectorPathElementIndex = match.endPathElementIndex;\n if (currentSelectorPathElementIndex >= selectorPath[currentSelectorPathIndex].elements.length) {\n currentSelectorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n }\n\n if (currentSelectorPathIndex < selectorPath.length && currentSelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathIndex++;\n }\n\n path = path.concat(selectorPath.slice(currentSelectorPathIndex, selectorPath.length));\n path = path.map(currentValue => {\n // we can re-use elements here, because the visibility property matters only for selectors\n const derived = currentValue.createDerived(currentValue.elements);\n if (isVisible) {\n derived.ensureVisibility();\n } else {\n derived.ensureInvisibility();\n }\n return derived;\n });\n return path;\n }\n\n visitMedia(mediaNode, visitArgs) {\n let newAllExtends = mediaNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, mediaNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitMediaOut(mediaNode) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStack.length = lastIndex;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n let newAllExtends = atRuleNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, atRuleNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStack.length = lastIndex;\n }\n}\n\nexport default ProcessExtendsVisitor;\n","import Visitor from './visitor';\n\nclass JoinSelectorVisitor {\n constructor() {\n this.contexts = [[]];\n this._visitor = new Visitor(this);\n }\n\n run(root) {\n return this._visitor.visit(root);\n }\n\n visitDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n const paths = [];\n let selectors;\n\n this.contexts.push(paths);\n\n if (!rulesetNode.root) {\n selectors = rulesetNode.selectors;\n if (selectors) {\n selectors = selectors.filter(selector => selector.getIsOutput());\n rulesetNode.selectors = selectors.length ? selectors : (selectors = null);\n if (selectors) { rulesetNode.joinSelectors(paths, context, selectors); }\n }\n if (!selectors) { rulesetNode.rules = null; }\n rulesetNode.paths = paths;\n }\n }\n\n visitRulesetOut(rulesetNode) {\n this.contexts.length = this.contexts.length - 1;\n }\n\n visitMedia(mediaNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n mediaNode.rules[0].root = (context.length === 0 || context[0].multiMedia);\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n if (atRuleNode.rules && atRuleNode.rules.length) {\n atRuleNode.rules[0].root = (atRuleNode.isRooted || context.length === 0 || null);\n }\n }\n}\n\nexport default JoinSelectorVisitor;\n","import tree from '../tree';\nimport Visitor from './visitor';\n\nclass CSSVisitorUtils {\n constructor(context) {\n this._visitor = new Visitor(this);\n this._context = context;\n }\n\n containsSilentNonBlockedChild(bodyRules) {\n let rule;\n if (!bodyRules) {\n return false;\n }\n for (let r = 0; r < bodyRules.length; r++) {\n rule = bodyRules[r];\n if (rule.isSilent && rule.isSilent(this._context) && !rule.blocksVisibility()) {\n // the atrule contains something that was referenced (likely by extend)\n // therefore it needs to be shown in output too\n return true;\n }\n }\n return false;\n }\n\n keepOnlyVisibleChilds(owner) {\n if (owner && owner.rules) {\n owner.rules = owner.rules.filter(thing => thing.isVisible());\n }\n }\n\n isEmpty(owner) {\n return (owner && owner.rules) \n ? (owner.rules.length === 0) : true;\n }\n\n hasVisibleSelector(rulesetNode) {\n return (rulesetNode && rulesetNode.paths)\n ? (rulesetNode.paths.length > 0) : false;\n }\n\n resolveVisibility(node, originalRules) {\n if (!node.blocksVisibility()) {\n if (this.isEmpty(node) && !this.containsSilentNonBlockedChild(originalRules)) {\n return ;\n }\n\n return node;\n }\n\n const compiledRulesBody = node.rules[0];\n this.keepOnlyVisibleChilds(compiledRulesBody);\n\n if (this.isEmpty(compiledRulesBody)) {\n return ;\n }\n\n node.ensureVisibility();\n node.removeVisibilityBlock();\n\n return node;\n }\n\n isVisibleRuleset(rulesetNode) {\n if (rulesetNode.firstRoot) {\n return true;\n }\n\n if (this.isEmpty(rulesetNode)) {\n return false;\n }\n\n if (!rulesetNode.root && !this.hasVisibleSelector(rulesetNode)) {\n return false;\n }\n\n return true;\n }\n}\n\nconst ToCSSVisitor = function(context) {\n this._visitor = new Visitor(this);\n this._context = context;\n this.utils = new CSSVisitorUtils(context);\n};\n\nToCSSVisitor.prototype = {\n isReplacing: true,\n run: function (root) {\n return this._visitor.visit(root);\n },\n\n visitDeclaration: function (declNode, visitArgs) {\n if (declNode.blocksVisibility() || declNode.variable) {\n return;\n }\n return declNode;\n },\n\n visitMixinDefinition: function (mixinNode, visitArgs) {\n // mixin definitions do not get eval'd - this means they keep state\n // so we have to clear that state here so it isn't used if toCSS is called twice\n mixinNode.frames = [];\n },\n\n visitExtend: function (extendNode, visitArgs) {\n },\n\n visitComment: function (commentNode, visitArgs) {\n if (commentNode.blocksVisibility() || commentNode.isSilent(this._context)) {\n return;\n }\n return commentNode;\n },\n\n visitMedia: function(mediaNode, visitArgs) {\n const originalRules = mediaNode.rules[0].rules;\n mediaNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n\n return this.utils.resolveVisibility(mediaNode, originalRules);\n },\n\n visitImport: function (importNode, visitArgs) {\n if (importNode.blocksVisibility()) {\n return ;\n }\n return importNode;\n },\n\n visitAtRule: function(atRuleNode, visitArgs) {\n if (atRuleNode.rules && atRuleNode.rules.length) {\n return this.visitAtRuleWithBody(atRuleNode, visitArgs);\n } else {\n return this.visitAtRuleWithoutBody(atRuleNode, visitArgs);\n }\n },\n\n visitAnonymous: function(anonymousNode, visitArgs) {\n if (!anonymousNode.blocksVisibility()) {\n anonymousNode.accept(this._visitor);\n return anonymousNode;\n }\n },\n\n visitAtRuleWithBody: function(atRuleNode, visitArgs) {\n // if there is only one nested ruleset and that one has no path, then it is\n // just fake ruleset\n function hasFakeRuleset(atRuleNode) {\n const bodyRules = atRuleNode.rules;\n return bodyRules.length === 1 && (!bodyRules[0].paths || bodyRules[0].paths.length === 0);\n }\n function getBodyRules(atRuleNode) {\n const nodeRules = atRuleNode.rules;\n if (hasFakeRuleset(atRuleNode)) {\n return nodeRules[0].rules;\n }\n\n return nodeRules;\n }\n // it is still true that it is only one ruleset in array\n // this is last such moment\n // process childs\n const originalRules = getBodyRules(atRuleNode);\n atRuleNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n\n if (!this.utils.isEmpty(atRuleNode)) {\n this._mergeRules(atRuleNode.rules[0].rules);\n }\n\n return this.utils.resolveVisibility(atRuleNode, originalRules);\n },\n\n visitAtRuleWithoutBody: function(atRuleNode, visitArgs) {\n if (atRuleNode.blocksVisibility()) {\n return;\n }\n\n if (atRuleNode.name === '@charset') {\n // Only output the debug info together with subsequent @charset definitions\n // a comment (or @media statement) before the actual @charset atrule would\n // be considered illegal css as it has to be on the first line\n if (this.charset) {\n if (atRuleNode.debugInfo) {\n const comment = new tree.Comment(`/* ${atRuleNode.toCSS(this._context).replace(/\\n/g, '')} */\\n`);\n comment.debugInfo = atRuleNode.debugInfo;\n return this._visitor.visit(comment);\n }\n return;\n }\n this.charset = true;\n }\n\n return atRuleNode;\n },\n\n checkValidNodes: function(rules, isRoot) {\n if (!rules) {\n return;\n }\n\n for (let i = 0; i < rules.length; i++) {\n const ruleNode = rules[i];\n if (isRoot && ruleNode instanceof tree.Declaration && !ruleNode.variable) {\n throw { message: 'Properties must be inside selector blocks. They cannot be in the root',\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n if (ruleNode instanceof tree.Call) {\n throw { message: `Function '${ruleNode.name}' is undefined`,\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n if (ruleNode.type && !ruleNode.allowRoot) {\n throw { message: `${ruleNode.type} node returned by a function is not valid here`,\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n }\n },\n\n visitRuleset: function (rulesetNode, visitArgs) {\n // at this point rulesets are nested into each other\n let rule;\n\n const rulesets = [];\n\n this.checkValidNodes(rulesetNode.rules, rulesetNode.firstRoot);\n\n if (!rulesetNode.root) {\n // remove invisible paths\n this._compileRulesetPaths(rulesetNode);\n\n // remove rulesets from this ruleset body and compile them separately\n const nodeRules = rulesetNode.rules;\n\n let nodeRuleCnt = nodeRules ? nodeRules.length : 0;\n for (let i = 0; i < nodeRuleCnt; ) {\n rule = nodeRules[i];\n if (rule && rule.rules) {\n // visit because we are moving them out from being a child\n rulesets.push(this._visitor.visit(rule));\n nodeRules.splice(i, 1);\n nodeRuleCnt--;\n continue;\n }\n i++;\n }\n // accept the visitor to remove rules and refactor itself\n // then we can decide nogw whether we want it or not\n // compile body\n if (nodeRuleCnt > 0) {\n rulesetNode.accept(this._visitor);\n } else {\n rulesetNode.rules = null;\n }\n visitArgs.visitDeeper = false;\n } else { // if (! rulesetNode.root) {\n rulesetNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n }\n\n if (rulesetNode.rules) {\n this._mergeRules(rulesetNode.rules);\n this._removeDuplicateRules(rulesetNode.rules);\n }\n\n // now decide whether we keep the ruleset\n if (this.utils.isVisibleRuleset(rulesetNode)) {\n rulesetNode.ensureVisibility();\n rulesets.splice(0, 0, rulesetNode);\n }\n\n if (rulesets.length === 1) {\n return rulesets[0];\n }\n return rulesets;\n },\n\n _compileRulesetPaths: function(rulesetNode) {\n if (rulesetNode.paths) {\n rulesetNode.paths = rulesetNode.paths\n .filter(p => {\n let i;\n if (p[0].elements[0].combinator.value === ' ') {\n p[0].elements[0].combinator = new(tree.Combinator)('');\n }\n for (i = 0; i < p.length; i++) {\n if (p[i].isVisible() && p[i].getIsOutput()) {\n return true;\n }\n }\n return false;\n });\n }\n },\n\n _removeDuplicateRules: function(rules) {\n if (!rules) { return; }\n\n // remove duplicates\n const ruleCache = {};\n\n let ruleList;\n let rule;\n let i;\n\n for (i = rules.length - 1; i >= 0 ; i--) {\n rule = rules[i];\n if (rule instanceof tree.Declaration) {\n if (!ruleCache[rule.name]) {\n ruleCache[rule.name] = rule;\n } else {\n ruleList = ruleCache[rule.name];\n if (ruleList instanceof tree.Declaration) {\n ruleList = ruleCache[rule.name] = [ruleCache[rule.name].toCSS(this._context)];\n }\n const ruleCSS = rule.toCSS(this._context);\n if (ruleList.indexOf(ruleCSS) !== -1) {\n rules.splice(i, 1);\n } else {\n ruleList.push(ruleCSS);\n }\n }\n }\n }\n },\n\n _mergeRules: function(rules) {\n if (!rules) {\n return; \n }\n\n const groups = {};\n const groupsArr = [];\n\n for (let i = 0; i < rules.length; i++) {\n const rule = rules[i];\n if (rule.merge) {\n const key = rule.name;\n groups[key] ? rules.splice(i--, 1) : \n groupsArr.push(groups[key] = []);\n groups[key].push(rule);\n }\n }\n\n groupsArr.forEach(group => {\n if (group.length > 0) {\n const result = group[0];\n let space = [];\n const comma = [new tree.Expression(space)];\n group.forEach(rule => {\n if ((rule.merge === '+') && (space.length > 0)) {\n comma.push(new tree.Expression(space = []));\n }\n space.push(rule.value);\n result.important = result.important || rule.important;\n });\n result.value = new tree.Value(comma);\n }\n });\n }\n};\n\nexport default ToCSSVisitor;\n","import Visitor from './visitor';\nimport ImportVisitor from './import-visitor';\nimport MarkVisibleSelectorsVisitor from './set-tree-visibility-visitor';\nimport ExtendVisitor from './extend-visitor';\nimport JoinSelectorVisitor from './join-selector-visitor';\nimport ToCSSVisitor from './to-css-visitor';\n\nexport default {\n Visitor,\n ImportVisitor,\n MarkVisibleSelectorsVisitor,\n ExtendVisitor,\n JoinSelectorVisitor,\n ToCSSVisitor\n};\n","import chunker from './chunker';\n\nexport default () => {\n let // Less input string\n input;\n\n let // current chunk\n j;\n\n const // holds state for backtracking\n saveStack = [];\n\n let // furthest index the parser has gone to\n furthest;\n\n let // if this is furthest we got to, this is the probably cause\n furthestPossibleErrorMessage;\n\n let // chunkified input\n chunks;\n\n let // current chunk\n current;\n\n let // index of current chunk, in `input`\n currentPos;\n\n const parserInput = {};\n const CHARCODE_SPACE = 32;\n const CHARCODE_TAB = 9;\n const CHARCODE_LF = 10;\n const CHARCODE_CR = 13;\n const CHARCODE_PLUS = 43;\n const CHARCODE_COMMA = 44;\n const CHARCODE_FORWARD_SLASH = 47;\n const CHARCODE_9 = 57;\n\n function skipWhitespace(length) {\n const oldi = parserInput.i;\n const oldj = j;\n const curr = parserInput.i - currentPos;\n const endIndex = parserInput.i + current.length - curr;\n const mem = (parserInput.i += length);\n const inp = input;\n let c;\n let nextChar;\n let comment;\n\n for (; parserInput.i < endIndex; parserInput.i++) {\n c = inp.charCodeAt(parserInput.i);\n\n if (parserInput.autoCommentAbsorb && c === CHARCODE_FORWARD_SLASH) {\n nextChar = inp.charAt(parserInput.i + 1);\n if (nextChar === '/') {\n comment = {index: parserInput.i, isLineComment: true};\n let nextNewLine = inp.indexOf('\\n', parserInput.i + 2);\n if (nextNewLine < 0) {\n nextNewLine = endIndex;\n }\n parserInput.i = nextNewLine;\n comment.text = inp.substr(comment.index, parserInput.i - comment.index);\n parserInput.commentStore.push(comment);\n continue;\n } else if (nextChar === '*') {\n const nextStarSlash = inp.indexOf('*/', parserInput.i + 2);\n if (nextStarSlash >= 0) {\n comment = {\n index: parserInput.i,\n text: inp.substr(parserInput.i, nextStarSlash + 2 - parserInput.i),\n isLineComment: false\n };\n parserInput.i += comment.text.length - 1;\n parserInput.commentStore.push(comment);\n continue;\n }\n }\n break;\n }\n\n if ((c !== CHARCODE_SPACE) && (c !== CHARCODE_LF) && (c !== CHARCODE_TAB) && (c !== CHARCODE_CR)) {\n break;\n }\n }\n\n current = current.slice(length + parserInput.i - mem + curr);\n currentPos = parserInput.i;\n\n if (!current.length) {\n if (j < chunks.length - 1) {\n current = chunks[++j];\n skipWhitespace(0); // skip space at the beginning of a chunk\n return true; // things changed\n }\n parserInput.finished = true;\n }\n\n return oldi !== parserInput.i || oldj !== j;\n }\n\n parserInput.save = () => {\n currentPos = parserInput.i;\n saveStack.push( { current, i: parserInput.i, j });\n };\n parserInput.restore = possibleErrorMessage => {\n\n if (parserInput.i > furthest || (parserInput.i === furthest && possibleErrorMessage && !furthestPossibleErrorMessage)) {\n furthest = parserInput.i;\n furthestPossibleErrorMessage = possibleErrorMessage;\n }\n const state = saveStack.pop();\n current = state.current;\n currentPos = parserInput.i = state.i;\n j = state.j;\n };\n parserInput.forget = () => {\n saveStack.pop();\n };\n parserInput.isWhitespace = offset => {\n const pos = parserInput.i + (offset || 0);\n const code = input.charCodeAt(pos);\n return (code === CHARCODE_SPACE || code === CHARCODE_CR || code === CHARCODE_TAB || code === CHARCODE_LF);\n };\n\n // Specialization of $(tok)\n parserInput.$re = tok => {\n if (parserInput.i > currentPos) {\n current = current.slice(parserInput.i - currentPos);\n currentPos = parserInput.i;\n }\n\n const m = tok.exec(current);\n if (!m) {\n return null;\n }\n\n skipWhitespace(m[0].length);\n if (typeof m === 'string') {\n return m;\n }\n\n return m.length === 1 ? m[0] : m;\n };\n\n parserInput.$char = tok => {\n if (input.charAt(parserInput.i) !== tok) {\n return null;\n }\n skipWhitespace(1);\n return tok;\n };\n\n parserInput.$str = tok => {\n const tokLength = tok.length;\n\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tokLength; i++) {\n if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n return null;\n }\n }\n\n skipWhitespace(tokLength);\n return tok;\n };\n\n parserInput.$quoted = loc => {\n const pos = loc || parserInput.i;\n const startChar = input.charAt(pos);\n\n if (startChar !== '\\'' && startChar !== '\"') {\n return;\n }\n const length = input.length;\n const currentPosition = pos;\n\n for (let i = 1; i + currentPosition < length; i++) {\n const nextChar = input.charAt(i + currentPosition);\n switch (nextChar) {\n case '\\\\':\n i++;\n continue;\n case '\\r':\n case '\\n':\n break;\n case startChar:\n const str = input.substr(currentPosition, i + 1);\n if (!loc && loc !== 0) {\n skipWhitespace(i + 1);\n return str\n }\n return [startChar, str];\n default:\n }\n }\n return null;\n };\n\n /**\n * Permissive parsing. Ignores everything except matching {} [] () and quotes\n * until matching token (outside of blocks)\n */\n parserInput.$parseUntil = tok => {\n let quote = '';\n let returnVal = null;\n let inComment = false;\n let blockDepth = 0;\n const blockStack = [];\n const parseGroups = [];\n const length = input.length;\n const startPos = parserInput.i;\n let lastPos = parserInput.i;\n let i = parserInput.i;\n let loop = true;\n let testChar;\n\n if (typeof tok === 'string') {\n testChar = char => char === tok\n } else {\n testChar = char => tok.test(char)\n }\n\n do {\n let prevChar;\n let nextChar = input.charAt(i);\n if (blockDepth === 0 && testChar(nextChar)) {\n returnVal = input.substr(lastPos, i - lastPos);\n if (returnVal) {\n parseGroups.push(returnVal);\n }\n else {\n parseGroups.push(' ');\n }\n returnVal = parseGroups;\n skipWhitespace(i - startPos);\n loop = false\n } else {\n if (inComment) {\n if (nextChar === '*' && \n input.charAt(i + 1) === '/') {\n i++;\n blockDepth--;\n inComment = false;\n }\n i++;\n continue;\n }\n switch (nextChar) {\n case '\\\\':\n i++;\n nextChar = input.charAt(i);\n parseGroups.push(input.substr(lastPos, i - lastPos + 1));\n lastPos = i + 1;\n break;\n case '/':\n if (input.charAt(i + 1) === '*') {\n i++;\n inComment = true;\n blockDepth++;\n }\n break;\n case '\\'':\n case '\"':\n quote = parserInput.$quoted(i);\n if (quote) {\n parseGroups.push(input.substr(lastPos, i - lastPos), quote);\n i += quote[1].length - 1;\n lastPos = i + 1;\n }\n else {\n skipWhitespace(i - startPos);\n returnVal = nextChar;\n loop = false;\n }\n break;\n case '{':\n blockStack.push('}');\n blockDepth++;\n break;\n case '(':\n blockStack.push(')');\n blockDepth++;\n break;\n case '[':\n blockStack.push(']');\n blockDepth++;\n break;\n case '}':\n case ')':\n case ']':\n const expected = blockStack.pop();\n if (nextChar === expected) {\n blockDepth--;\n } else {\n // move the parser to the error and return expected\n skipWhitespace(i - startPos);\n returnVal = expected;\n loop = false;\n }\n }\n i++;\n if (i > length) {\n loop = false;\n }\n }\n prevChar = nextChar;\n } while (loop);\n\n return returnVal ? returnVal : null;\n }\n\n parserInput.autoCommentAbsorb = true;\n parserInput.commentStore = [];\n parserInput.finished = false;\n\n // Same as $(), but don't change the state of the parser,\n // just return the match.\n parserInput.peek = tok => {\n if (typeof tok === 'string') {\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tok.length; i++) {\n if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n return false;\n }\n }\n return true;\n } else {\n return tok.test(current);\n }\n };\n\n // Specialization of peek()\n // TODO remove or change some currentChar calls to peekChar\n parserInput.peekChar = tok => input.charAt(parserInput.i) === tok;\n\n parserInput.currentChar = () => input.charAt(parserInput.i);\n\n parserInput.prevChar = () => input.charAt(parserInput.i - 1);\n\n parserInput.getInput = () => input;\n\n parserInput.peekNotNumeric = () => {\n const c = input.charCodeAt(parserInput.i);\n // Is the first char of the dimension 0-9, '.', '+' or '-'\n return (c > CHARCODE_9 || c < CHARCODE_PLUS) || c === CHARCODE_FORWARD_SLASH || c === CHARCODE_COMMA;\n };\n\n parserInput.start = (str, chunkInput, failFunction) => {\n input = str;\n parserInput.i = j = currentPos = furthest = 0;\n\n // chunking apparently makes things quicker (but my tests indicate\n // it might actually make things slower in node at least)\n // and it is a non-perfect parse - it can't recognise\n // unquoted urls, meaning it can't distinguish comments\n // meaning comments with quotes or {}() in them get 'counted'\n // and then lead to parse errors.\n // In addition if the chunking chunks in the wrong place we might\n // not be able to parse a parser statement in one go\n // this is officially deprecated but can be switched on via an option\n // in the case it causes too much performance issues.\n if (chunkInput) {\n chunks = chunker(str, failFunction);\n } else {\n chunks = [str];\n }\n\n current = chunks[0];\n\n skipWhitespace(0);\n };\n\n parserInput.end = () => {\n let message;\n const isFinished = parserInput.i >= input.length;\n\n if (parserInput.i < furthest) {\n message = furthestPossibleErrorMessage;\n parserInput.i = furthest;\n }\n return {\n isFinished,\n furthest: parserInput.i,\n furthestPossibleErrorMessage: message,\n furthestReachedEnd: parserInput.i >= input.length - 1,\n furthestChar: input[parserInput.i]\n };\n };\n\n return parserInput;\n};\n","// Split the input into chunks.\nexport default (input, fail) => {\n const len = input.length;\n let level = 0;\n let parenLevel = 0;\n let lastOpening;\n let lastOpeningParen;\n let lastMultiComment;\n let lastMultiCommentEndBrace;\n const chunks = [];\n let emitFrom = 0;\n let chunkerCurrentIndex;\n let currentChunkStartIndex;\n let cc;\n let cc2;\n let matched;\n\n function emitChunk(force) {\n const len = chunkerCurrentIndex - emitFrom;\n if (((len < 512) && !force) || !len) {\n return;\n }\n chunks.push(input.slice(emitFrom, chunkerCurrentIndex + 1));\n emitFrom = chunkerCurrentIndex + 1;\n }\n\n for (chunkerCurrentIndex = 0; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc = input.charCodeAt(chunkerCurrentIndex);\n if (((cc >= 97) && (cc <= 122)) || (cc < 34)) {\n // a-z or whitespace\n continue;\n }\n\n switch (cc) {\n case 40: // (\n parenLevel++;\n lastOpeningParen = chunkerCurrentIndex;\n continue;\n case 41: // )\n if (--parenLevel < 0) {\n return fail('missing opening `(`', chunkerCurrentIndex);\n }\n continue;\n case 59: // ;\n if (!parenLevel) { emitChunk(); }\n continue;\n case 123: // {\n level++;\n lastOpening = chunkerCurrentIndex;\n continue;\n case 125: // }\n if (--level < 0) {\n return fail('missing opening `{`', chunkerCurrentIndex);\n }\n if (!level && !parenLevel) { emitChunk(); }\n continue;\n case 92: // \\\n if (chunkerCurrentIndex < len - 1) { chunkerCurrentIndex++; continue; }\n return fail('unescaped `\\\\`', chunkerCurrentIndex);\n case 34:\n case 39:\n case 96: // \", ' and `\n matched = 0;\n currentChunkStartIndex = chunkerCurrentIndex;\n for (chunkerCurrentIndex = chunkerCurrentIndex + 1; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if (cc2 > 96) { continue; }\n if (cc2 == cc) { matched = 1; break; }\n if (cc2 == 92) { // \\\n if (chunkerCurrentIndex == len - 1) {\n return fail('unescaped `\\\\`', chunkerCurrentIndex);\n }\n chunkerCurrentIndex++;\n }\n }\n if (matched) { continue; }\n return fail(`unmatched \\`${String.fromCharCode(cc)}\\``, currentChunkStartIndex);\n case 47: // /, check for comment\n if (parenLevel || (chunkerCurrentIndex == len - 1)) { continue; }\n cc2 = input.charCodeAt(chunkerCurrentIndex + 1);\n if (cc2 == 47) {\n // //, find lnfeed\n for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if ((cc2 <= 13) && ((cc2 == 10) || (cc2 == 13))) { break; }\n }\n } else if (cc2 == 42) {\n // /*, find */\n lastMultiComment = currentChunkStartIndex = chunkerCurrentIndex;\n for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len - 1; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if (cc2 == 125) { lastMultiCommentEndBrace = chunkerCurrentIndex; }\n if (cc2 != 42) { continue; }\n if (input.charCodeAt(chunkerCurrentIndex + 1) == 47) { break; }\n }\n if (chunkerCurrentIndex == len - 1) {\n return fail('missing closing `*/`', currentChunkStartIndex);\n }\n chunkerCurrentIndex++;\n }\n continue;\n case 42: // *, check for unmatched */\n if ((chunkerCurrentIndex < len - 1) && (input.charCodeAt(chunkerCurrentIndex + 1) == 47)) {\n return fail('unmatched `/*`', chunkerCurrentIndex);\n }\n continue;\n }\n }\n\n if (level !== 0) {\n if ((lastMultiComment > lastOpening) && (lastMultiCommentEndBrace > lastMultiComment)) {\n return fail('missing closing `}` or `*/`', lastOpening);\n } else {\n return fail('missing closing `}`', lastOpening);\n }\n } else if (parenLevel !== 0) {\n return fail('missing closing `)`', lastOpeningParen);\n }\n\n emitChunk(true);\n return chunks;\n};\n","import LessError from '../less-error';\nimport tree from '../tree';\nimport visitors from '../visitors';\nimport getParserInput from './parser-input';\nimport * as utils from '../utils';\nimport functionRegistry from '../functions/function-registry';\n\n//\n// less.js - parser\n//\n// A relatively straight-forward predictive parser.\n// There is no tokenization/lexing stage, the input is parsed\n// in one sweep.\n//\n// To make the parser fast enough to run in the browser, several\n// optimization had to be made:\n//\n// - Matching and slicing on a huge input is often cause of slowdowns.\n// The solution is to chunkify the input into smaller strings.\n// The chunks are stored in the `chunks` var,\n// `j` holds the current chunk index, and `currentPos` holds\n// the index of the current chunk in relation to `input`.\n// This gives us an almost 4x speed-up.\n//\n// - In many cases, we don't need to match individual tokens;\n// for example, if a value doesn't hold any variables, operations\n// or dynamic references, the parser can effectively 'skip' it,\n// treating it as a literal.\n// An example would be '1px solid #000' - which evaluates to itself,\n// we don't need to know what the individual components are.\n// The drawback, of course is that you don't get the benefits of\n// syntax-checking on the CSS. This gives us a 50% speed-up in the parser,\n// and a smaller speed-up in the code-gen.\n//\n//\n// Token matching is done with the `$` function, which either takes\n// a terminal string or regexp, or a non-terminal function to call.\n// It also takes care of moving all the indices forwards.\n//\n\nconst Parser = function Parser(context, imports, fileInfo) {\n let parsers;\n const parserInput = getParserInput();\n\n function error(msg, type) {\n throw new LessError(\n {\n index: parserInput.i,\n filename: fileInfo.filename,\n type: type || 'Syntax',\n message: msg\n },\n imports\n );\n }\n\n function expect(arg, msg) {\n // some older browsers return typeof 'function' for RegExp\n const result = (arg instanceof Function) ? arg.call(parsers) : parserInput.$re(arg);\n if (result) {\n return result;\n }\n \n error(msg || (typeof arg === 'string'\n ? `expected '${arg}' got '${parserInput.currentChar()}'`\n : 'unexpected token'));\n }\n\n // Specialization of expect()\n function expectChar(arg, msg) {\n if (parserInput.$char(arg)) {\n return arg;\n }\n error(msg || `expected '${arg}' got '${parserInput.currentChar()}'`);\n }\n\n function getDebugInfo(index) {\n const filename = fileInfo.filename;\n\n return {\n lineNumber: utils.getLocation(index, parserInput.getInput()).line + 1,\n fileName: filename\n };\n }\n\n /**\n * Used after initial parsing to create nodes on the fly\n * \n * @param {String} str - string to parse \n * @param {Array} parseList - array of parsers to run input through e.g. [\"value\", \"important\"]\n * @param {Number} currentIndex - start number to begin indexing\n * @param {Object} fileInfo - fileInfo to attach to created nodes\n */\n function parseNode(str, parseList, currentIndex, fileInfo, callback) {\n let result;\n const returnNodes = [];\n const parser = parserInput;\n\n try {\n parser.start(str, false, function fail(msg, index) {\n callback({\n message: msg,\n index: index + currentIndex\n });\n });\n for (let x = 0, p, i; (p = parseList[x]); x++) {\n i = parser.i;\n result = parsers[p]();\n if (result) {\n try {\n result._index = i + currentIndex;\n result._fileInfo = fileInfo;\n } catch (e) {}\n returnNodes.push(result);\n }\n else {\n returnNodes.push(null);\n }\n }\n\n const endInfo = parser.end();\n if (endInfo.isFinished) {\n callback(null, returnNodes);\n }\n else {\n callback(true, null);\n }\n } catch (e) {\n throw new LessError({\n index: e.index + currentIndex,\n message: e.message\n }, imports, fileInfo.filename);\n }\n }\n\n //\n // The Parser\n //\n return {\n parserInput,\n imports,\n fileInfo,\n parseNode,\n //\n // Parse an input string into an abstract syntax tree,\n // @param str A string containing 'less' markup\n // @param callback call `callback` when done.\n // @param [additionalData] An optional map which can contains vars - a map (key, value) of variables to apply\n //\n parse: function (str, callback, additionalData) {\n let root;\n let error = null;\n let globalVars;\n let modifyVars;\n let ignored;\n let preText = '';\n\n globalVars = (additionalData && additionalData.globalVars) ? `${Parser.serializeVars(additionalData.globalVars)}\\n` : '';\n modifyVars = (additionalData && additionalData.modifyVars) ? `\\n${Parser.serializeVars(additionalData.modifyVars)}` : '';\n\n if (context.pluginManager) {\n const preProcessors = context.pluginManager.getPreProcessors();\n for (let i = 0; i < preProcessors.length; i++) {\n str = preProcessors[i].process(str, { context, imports, fileInfo });\n }\n }\n\n if (globalVars || (additionalData && additionalData.banner)) {\n preText = ((additionalData && additionalData.banner) ? additionalData.banner : '') + globalVars;\n ignored = imports.contentsIgnoredChars;\n ignored[fileInfo.filename] = ignored[fileInfo.filename] || 0;\n ignored[fileInfo.filename] += preText.length;\n }\n\n str = str.replace(/\\r\\n?/g, '\\n');\n // Remove potential UTF Byte Order Mark\n str = preText + str.replace(/^\\uFEFF/, '') + modifyVars;\n imports.contents[fileInfo.filename] = str;\n\n // Start with the primary rule.\n // The whole syntax tree is held under a Ruleset node,\n // with the `root` property set to true, so no `{}` are\n // output. The callback is called when the input is parsed.\n try {\n parserInput.start(str, context.chunkInput, function fail(msg, index) {\n throw new LessError({\n index,\n type: 'Parse',\n message: msg,\n filename: fileInfo.filename\n }, imports);\n });\n\n tree.Node.prototype.parse = this;\n root = new tree.Ruleset(null, this.parsers.primary());\n tree.Node.prototype.rootNode = root;\n root.root = true;\n root.firstRoot = true;\n root.functionRegistry = functionRegistry.inherit();\n \n } catch (e) {\n return callback(new LessError(e, imports, fileInfo.filename));\n }\n\n // If `i` is smaller than the `input.length - 1`,\n // it means the parser wasn't able to parse the whole\n // string, so we've got a parsing error.\n //\n // We try to extract a \\n delimited string,\n // showing the line where the parse error occurred.\n // We split it up into two parts (the part which parsed,\n // and the part which didn't), so we can color them differently.\n const endInfo = parserInput.end();\n if (!endInfo.isFinished) {\n\n let message = endInfo.furthestPossibleErrorMessage;\n\n if (!message) {\n message = 'Unrecognised input';\n if (endInfo.furthestChar === '}') {\n message += '. Possibly missing opening \\'{\\'';\n } else if (endInfo.furthestChar === ')') {\n message += '. Possibly missing opening \\'(\\'';\n } else if (endInfo.furthestReachedEnd) {\n message += '. Possibly missing something';\n }\n }\n\n error = new LessError({\n type: 'Parse',\n message,\n index: endInfo.furthest,\n filename: fileInfo.filename\n }, imports);\n }\n\n const finish = e => {\n e = error || e || imports.error;\n\n if (e) {\n if (!(e instanceof LessError)) {\n e = new LessError(e, imports, fileInfo.filename);\n }\n\n return callback(e);\n }\n else {\n return callback(null, root);\n }\n };\n\n if (context.processImports !== false) {\n new visitors.ImportVisitor(imports, finish)\n .run(root);\n } else {\n return finish();\n }\n },\n\n //\n // Here in, the parsing rules/functions\n //\n // The basic structure of the syntax tree generated is as follows:\n //\n // Ruleset -> Declaration -> Value -> Expression -> Entity\n //\n // Here's some Less code:\n //\n // .class {\n // color: #fff;\n // border: 1px solid #000;\n // width: @w + 4px;\n // > .child {...}\n // }\n //\n // And here's what the parse tree might look like:\n //\n // Ruleset (Selector '.class', [\n // Declaration (\"color\", Value ([Expression [Color #fff]]))\n // Declaration (\"border\", Value ([Expression [Dimension 1px][Keyword \"solid\"][Color #000]]))\n // Declaration (\"width\", Value ([Expression [Operation \" + \" [Variable \"@w\"][Dimension 4px]]]))\n // Ruleset (Selector [Element '>', '.child'], [...])\n // ])\n //\n // In general, most rules will try to parse a token with the `$re()` function, and if the return\n // value is truly, will return a new node, of the relevant type. Sometimes, we need to check\n // first, before parsing, that's when we use `peek()`.\n //\n parsers: parsers = {\n //\n // The `primary` rule is the *entry* and *exit* point of the parser.\n // The rules here can appear at any level of the parse tree.\n //\n // The recursive nature of the grammar is an interplay between the `block`\n // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule,\n // as represented by this simplified grammar:\n //\n // primary → (ruleset | declaration)+\n // ruleset → selector+ block\n // block → '{' primary '}'\n //\n // Only at one point is the primary rule not called from the\n // block rule: at the root level.\n //\n primary: function () {\n const mixin = this.mixin;\n let root = [];\n let node;\n\n while (true) {\n while (true) {\n node = this.comment();\n if (!node) { break; }\n root.push(node);\n }\n // always process comments before deciding if finished\n if (parserInput.finished) {\n break;\n }\n if (parserInput.peek('}')) {\n break;\n }\n\n node = this.extendRule();\n if (node) {\n root = root.concat(node);\n continue;\n }\n\n node = mixin.definition() || this.declaration() || mixin.call(false, false) || \n this.ruleset() || this.variableCall() || this.entities.call() || this.atrule();\n if (node) {\n root.push(node);\n } else {\n let foundSemiColon = false;\n while (parserInput.$char(';')) {\n foundSemiColon = true;\n }\n if (!foundSemiColon) {\n break;\n }\n }\n }\n\n return root;\n },\n\n // comments are collected by the main parsing mechanism and then assigned to nodes\n // where the current structure allows it\n comment: function () {\n if (parserInput.commentStore.length) {\n const comment = parserInput.commentStore.shift();\n return new(tree.Comment)(comment.text, comment.isLineComment, comment.index, fileInfo);\n }\n },\n\n //\n // Entities are tokens which can be found inside an Expression\n //\n entities: {\n mixinLookup: function() {\n return parsers.mixin.call(true, true);\n },\n //\n // A string, which supports escaping \" and '\n //\n // \"milky way\" 'he\\'s the one!'\n //\n quoted: function (forceEscaped) {\n let str;\n const index = parserInput.i;\n let isEscaped = false;\n\n parserInput.save();\n if (parserInput.$char('~')) {\n isEscaped = true;\n } else if (forceEscaped) {\n parserInput.restore();\n return;\n }\n\n str = parserInput.$quoted();\n if (!str) {\n parserInput.restore();\n return;\n }\n parserInput.forget();\n\n return new(tree.Quoted)(str.charAt(0), str.substr(1, str.length - 2), isEscaped, index, fileInfo);\n },\n\n //\n // A catch-all word, such as:\n //\n // black border-collapse\n //\n keyword: function () {\n const k = parserInput.$char('%') || parserInput.$re(/^\\[?(?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+\\]?/);\n if (k) {\n return tree.Color.fromKeyword(k) || new(tree.Keyword)(k);\n }\n },\n\n //\n // A function call\n //\n // rgb(255, 0, 255)\n //\n // The arguments are parsed with the `entities.arguments` parser.\n //\n call: function () {\n let name;\n let args;\n let func;\n const index = parserInput.i;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (parserInput.peek(/^url\\(/i)) {\n return;\n }\n\n parserInput.save();\n\n name = parserInput.$re(/^([\\w-]+|%|progid:[\\w\\.]+)\\(/);\n if (!name) {\n parserInput.forget(); \n return;\n }\n\n name = name[1];\n func = this.customFuncCall(name);\n if (func) {\n args = func.parse();\n if (args && func.stop) {\n parserInput.forget();\n return args;\n }\n }\n\n args = this.arguments(args);\n\n if (!parserInput.$char(')')) {\n parserInput.restore('Could not parse call arguments or missing \\')\\'');\n return;\n }\n\n parserInput.forget();\n\n return new(tree.Call)(name, args, index, fileInfo);\n },\n \n //\n // Parsing rules for functions with non-standard args, e.g.:\n //\n // boolean(not(2 > 1))\n //\n // This is a quick prototype, to be modified/improved when\n // more custom-parsed funcs come (e.g. `selector(...)`)\n //\n\n customFuncCall: function (name) {\n /* Ideally the table is to be moved out of here for faster perf.,\n but it's quite tricky since it relies on all these `parsers`\n and `expect` available only here */\n return {\n alpha: f(parsers.ieAlpha, true),\n boolean: f(condition),\n 'if': f(condition)\n }[name.toLowerCase()];\n\n function f(parse, stop) {\n return {\n parse, // parsing function\n stop // when true - stop after parse() and return its result, \n // otherwise continue for plain args\n };\n }\n \n function condition() {\n return [expect(parsers.condition, 'expected condition')];\n }\n },\n\n arguments: function (prevArgs) {\n let argsComma = prevArgs || [];\n const argsSemiColon = [];\n let isSemiColonSeparated;\n let value;\n\n parserInput.save();\n\n while (true) {\n if (prevArgs) {\n prevArgs = false;\n } else {\n value = parsers.detachedRuleset() || this.assignment() || parsers.expression();\n if (!value) {\n break;\n }\n\n if (value.value && value.value.length == 1) {\n value = value.value[0];\n }\n\n argsComma.push(value);\n }\n\n if (parserInput.$char(',')) {\n continue;\n }\n\n if (parserInput.$char(';') || isSemiColonSeparated) {\n isSemiColonSeparated = true;\n value = (argsComma.length < 1) ? argsComma[0]\n : new tree.Value(argsComma);\n argsSemiColon.push(value);\n argsComma = [];\n }\n }\n\n parserInput.forget();\n return isSemiColonSeparated ? argsSemiColon : argsComma;\n },\n literal: function () {\n return this.dimension() ||\n this.color() ||\n this.quoted() ||\n this.unicodeDescriptor();\n },\n\n // Assignments are argument entities for calls.\n // They are present in ie filter properties as shown below.\n //\n // filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* )\n //\n\n assignment: function () {\n let key;\n let value;\n parserInput.save();\n key = parserInput.$re(/^\\w+(?=\\s?=)/i);\n if (!key) {\n parserInput.restore();\n return;\n }\n if (!parserInput.$char('=')) {\n parserInput.restore();\n return;\n }\n value = parsers.entity();\n if (value) {\n parserInput.forget();\n return new(tree.Assignment)(key, value);\n } else {\n parserInput.restore();\n }\n },\n\n //\n // Parse url() tokens\n //\n // We use a specific rule for urls, because they don't really behave like\n // standard function calls. The difference is that the argument doesn't have\n // to be enclosed within a string, so it can't be parsed as an Expression.\n //\n url: function () {\n let value;\n const index = parserInput.i;\n\n parserInput.autoCommentAbsorb = false;\n\n if (!parserInput.$str('url(')) {\n parserInput.autoCommentAbsorb = true;\n return;\n }\n\n value = this.quoted() || this.variable() || this.property() ||\n parserInput.$re(/^(?:(?:\\\\[\\(\\)'\"])|[^\\(\\)'\"])+/) || '';\n\n parserInput.autoCommentAbsorb = true;\n\n expectChar(')');\n\n return new(tree.URL)((value.value != null || \n value instanceof tree.Variable || \n value instanceof tree.Property) ?\n value : new(tree.Anonymous)(value, index), index, fileInfo);\n },\n\n //\n // A Variable entity, such as `@fink`, in\n //\n // width: @fink + 2px\n //\n // We use a different parser for variable definitions,\n // see `parsers.variable`.\n //\n variable: function () {\n let ch;\n let name;\n const index = parserInput.i;\n\n parserInput.save();\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^@@?[\\w-]+/))) {\n ch = parserInput.currentChar();\n if (ch === '(' || ch === '[' && !parserInput.prevChar().match(/^\\s/)) {\n // this may be a VariableCall lookup\n const result = parsers.variableCall(name);\n if (result) {\n parserInput.forget();\n return result;\n }\n }\n parserInput.forget();\n return new(tree.Variable)(name, index, fileInfo);\n }\n parserInput.restore();\n },\n\n // A variable entity using the protective {} e.g. @{var}\n variableCurly: function () {\n let curly;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '@' && (curly = parserInput.$re(/^@\\{([\\w-]+)\\}/))) {\n return new(tree.Variable)(`@${curly[1]}`, index, fileInfo);\n }\n },\n //\n // A Property accessor, such as `$color`, in\n //\n // background-color: $color\n //\n property: function () {\n let name;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' && (name = parserInput.$re(/^\\$[\\w-]+/))) {\n return new(tree.Property)(name, index, fileInfo);\n }\n },\n\n // A property entity useing the protective {} e.g. ${prop}\n propertyCurly: function () {\n let curly;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' && (curly = parserInput.$re(/^\\$\\{([\\w-]+)\\}/))) {\n return new(tree.Property)(`$${curly[1]}`, index, fileInfo);\n }\n },\n //\n // A Hexadecimal color\n //\n // #4F3C2F\n //\n // `rgb` and `hsl` colors are parsed through the `entities.call` parser.\n //\n color: function () {\n let rgb;\n parserInput.save();\n\n if (parserInput.currentChar() === '#' && (rgb = parserInput.$re(/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})([\\w.#\\[])?/))) {\n if (!rgb[2]) {\n parserInput.forget();\n return new(tree.Color)(rgb[1], undefined, rgb[0]);\n } \n }\n parserInput.restore();\n },\n\n colorKeyword: function () {\n parserInput.save();\n const autoCommentAbsorb = parserInput.autoCommentAbsorb;\n parserInput.autoCommentAbsorb = false;\n const k = parserInput.$re(/^[_A-Za-z-][_A-Za-z0-9-]+/);\n parserInput.autoCommentAbsorb = autoCommentAbsorb;\n if (!k) {\n parserInput.forget();\n return;\n }\n parserInput.restore();\n const color = tree.Color.fromKeyword(k);\n if (color) {\n parserInput.$str(k);\n return color;\n }\n },\n\n //\n // A Dimension, that is, a number and a unit\n //\n // 0.5em 95%\n //\n dimension: function () {\n if (parserInput.peekNotNumeric()) {\n return;\n }\n\n const value = parserInput.$re(/^([+-]?\\d*\\.?\\d+)(%|[a-z_]+)?/i);\n if (value) {\n return new(tree.Dimension)(value[1], value[2]);\n }\n },\n\n //\n // A unicode descriptor, as is used in unicode-range\n //\n // U+0?? or U+00A1-00A9\n //\n unicodeDescriptor: function () {\n let ud;\n\n ud = parserInput.$re(/^U\\+[0-9a-fA-F?]+(\\-[0-9a-fA-F?]+)?/);\n if (ud) {\n return new(tree.UnicodeDescriptor)(ud[0]);\n }\n },\n\n //\n // JavaScript code to be evaluated\n //\n // `window.location.href`\n //\n javascript: function () {\n let js;\n const index = parserInput.i;\n\n parserInput.save();\n\n const escape = parserInput.$char('~');\n const jsQuote = parserInput.$char('`');\n\n if (!jsQuote) {\n parserInput.restore();\n return;\n }\n\n js = parserInput.$re(/^[^`]*`/);\n if (js) {\n parserInput.forget();\n return new(tree.JavaScript)(js.substr(0, js.length - 1), Boolean(escape), index, fileInfo);\n }\n parserInput.restore('invalid javascript definition');\n }\n },\n\n //\n // The variable part of a variable definition. Used in the `rule` parser\n //\n // @fink:\n //\n variable: function () {\n let name;\n\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^(@[\\w-]+)\\s*:/))) { return name[1]; }\n },\n\n //\n // Call a variable value to retrieve a detached ruleset\n // or a value from a detached ruleset's rules.\n //\n // @fink();\n // @fink;\n // color: @fink[@color];\n //\n variableCall: function (parsedName) {\n let lookups;\n const i = parserInput.i;\n const inValue = !!parsedName;\n let name = parsedName;\n\n parserInput.save();\n\n if (name || (parserInput.currentChar() === '@'\n && (name = parserInput.$re(/^(@[\\w-]+)(\\(\\s*\\))?/)))) {\n\n lookups = this.mixin.ruleLookups();\n\n if (!lookups && ((inValue && parserInput.$str('()') !== '()') || (name[2] !== '()'))) {\n parserInput.restore('Missing \\'[...]\\' lookup in variable call');\n return;\n }\n\n if (!inValue) {\n name = name[1];\n }\n\n const call = new tree.VariableCall(name, i, fileInfo);\n if (!inValue && parsers.end()) {\n parserInput.forget();\n return call;\n }\n else {\n parserInput.forget();\n return new tree.NamespaceValue(call, lookups, i, fileInfo);\n }\n }\n\n parserInput.restore();\n },\n\n //\n // extend syntax - used to extend selectors\n //\n extend: function(isRule) {\n let elements;\n let e;\n const index = parserInput.i;\n let option;\n let extendList;\n let extend;\n\n if (!parserInput.$str(isRule ? '&:extend(' : ':extend(')) {\n return;\n }\n\n do {\n option = null;\n elements = null;\n while (!(option = parserInput.$re(/^(all)(?=\\s*(\\)|,))/))) {\n e = this.element();\n if (!e) {\n break;\n }\n if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n }\n\n option = option && option[1];\n if (!elements) {\n error('Missing target selector for :extend().');\n }\n extend = new(tree.Extend)(new(tree.Selector)(elements), option, index, fileInfo);\n if (extendList) {\n extendList.push(extend);\n } else {\n extendList = [ extend ];\n }\n } while (parserInput.$char(','));\n\n expect(/^\\)/);\n\n if (isRule) {\n expect(/^;/);\n }\n\n return extendList;\n },\n\n //\n // extendRule - used in a rule to extend all the parent selectors\n //\n extendRule: function() {\n return this.extend(true);\n },\n\n //\n // Mixins\n //\n mixin: {\n //\n // A Mixin call, with an optional argument list\n //\n // #mixins > .square(#fff);\n // #mixins.square(#fff);\n // .rounded(4px, black);\n // .button;\n //\n // We can lookup / return a value using the lookup syntax:\n //\n // color: #mixin.square(#fff)[@color];\n //\n // The `while` loop is there because mixins can be\n // namespaced, but we only support the child and descendant\n // selector for now.\n //\n call: function (inValue, getLookup) {\n const s = parserInput.currentChar();\n let important = false;\n let lookups;\n const index = parserInput.i;\n let elements;\n let args;\n let hasParens;\n\n if (s !== '.' && s !== '#') { return; }\n\n parserInput.save(); // stop us absorbing part of an invalid selector\n\n elements = this.elements();\n\n if (elements) {\n if (parserInput.$char('(')) {\n args = this.args(true).args;\n expectChar(')');\n hasParens = true;\n }\n\n if (getLookup !== false) {\n lookups = this.ruleLookups();\n }\n if (getLookup === true && !lookups) {\n parserInput.restore();\n return;\n }\n\n if (inValue && !lookups && !hasParens) {\n // This isn't a valid in-value mixin call\n parserInput.restore();\n return;\n }\n\n if (!inValue && parsers.important()) {\n important = true;\n }\n\n if (inValue || parsers.end()) {\n parserInput.forget();\n const mixin = new(tree.mixin.Call)(elements, args, index, fileInfo, !lookups && important);\n if (lookups) {\n return new tree.NamespaceValue(mixin, lookups);\n }\n else {\n return mixin;\n }\n }\n }\n\n parserInput.restore();\n },\n /**\n * Matching elements for mixins\n * (Start with . or # and can have > )\n */\n elements: function() {\n let elements;\n let e;\n let c;\n let elem;\n let elemIndex;\n const re = /^[#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/;\n while (true) {\n elemIndex = parserInput.i;\n e = parserInput.$re(re);\n \n if (!e) {\n break;\n }\n elem = new(tree.Element)(c, e, false, elemIndex, fileInfo);\n if (elements) {\n elements.push(elem);\n } else {\n elements = [ elem ];\n }\n c = parserInput.$char('>');\n }\n return elements;\n },\n args: function (isCall) {\n const entities = parsers.entities;\n const returner = { args:null, variadic: false };\n let expressions = [];\n const argsSemiColon = [];\n const argsComma = [];\n let isSemiColonSeparated;\n let expressionContainsNamed;\n let name;\n let nameLoop;\n let value;\n let arg;\n let expand;\n let hasSep = true;\n\n parserInput.save();\n\n while (true) {\n if (isCall) {\n arg = parsers.detachedRuleset() || parsers.expression();\n } else {\n parserInput.commentStore.length = 0;\n if (parserInput.$str('...')) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ variadic: true });\n break;\n }\n arg = entities.variable() || entities.property() || entities.literal() || entities.keyword() || this.call(true);\n }\n\n if (!arg || !hasSep) {\n break;\n }\n\n nameLoop = null;\n if (arg.throwAwayComments) {\n arg.throwAwayComments();\n }\n value = arg;\n let val = null;\n\n if (isCall) {\n // Variable\n if (arg.value && arg.value.length == 1) {\n val = arg.value[0];\n }\n } else {\n val = arg;\n }\n\n if (val && (val instanceof tree.Variable || val instanceof tree.Property)) {\n if (parserInput.$char(':')) {\n if (expressions.length > 0) {\n if (isSemiColonSeparated) {\n error('Cannot mix ; and , as delimiter types');\n }\n expressionContainsNamed = true;\n }\n\n value = parsers.detachedRuleset() || parsers.expression();\n\n if (!value) {\n if (isCall) {\n error('could not understand value for named argument');\n } else {\n parserInput.restore();\n returner.args = [];\n return returner;\n }\n }\n nameLoop = (name = val.name);\n } else if (parserInput.$str('...')) {\n if (!isCall) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ name: arg.name, variadic: true });\n break;\n } else {\n expand = true;\n }\n } else if (!isCall) {\n name = nameLoop = val.name;\n value = null;\n }\n }\n\n if (value) {\n expressions.push(value);\n }\n\n argsComma.push({ name:nameLoop, value, expand });\n\n if (parserInput.$char(',')) {\n hasSep = true;\n continue;\n }\n hasSep = parserInput.$char(';') === ';';\n\n if (hasSep || isSemiColonSeparated) {\n\n if (expressionContainsNamed) {\n error('Cannot mix ; and , as delimiter types');\n }\n\n isSemiColonSeparated = true;\n\n if (expressions.length > 1) {\n value = new(tree.Value)(expressions);\n }\n argsSemiColon.push({ name, value, expand });\n\n name = null;\n expressions = [];\n expressionContainsNamed = false;\n }\n }\n\n parserInput.forget();\n returner.args = isSemiColonSeparated ? argsSemiColon : argsComma;\n return returner;\n },\n //\n // A Mixin definition, with a list of parameters\n //\n // .rounded (@radius: 2px, @color) {\n // ...\n // }\n //\n // Until we have a finer grained state-machine, we have to\n // do a look-ahead, to make sure we don't have a mixin call.\n // See the `rule` function for more information.\n //\n // We start by matching `.rounded (`, and then proceed on to\n // the argument list, which has optional default values.\n // We store the parameters in `params`, with a `value` key,\n // if there is a value, such as in the case of `@radius`.\n //\n // Once we've got our params list, and a closing `)`, we parse\n // the `{...}` block.\n //\n definition: function () {\n let name;\n let params = [];\n let match;\n let ruleset;\n let cond;\n let variadic = false;\n if ((parserInput.currentChar() !== '.' && parserInput.currentChar() !== '#') ||\n parserInput.peek(/^[^{]*\\}/)) {\n return;\n }\n\n parserInput.save();\n\n match = parserInput.$re(/^([#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\\s*\\(/);\n if (match) {\n name = match[1];\n\n const argInfo = this.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n\n // .mixincall(\"@{a}\");\n // looks a bit like a mixin definition..\n // also\n // .mixincall(@a: {rule: set;});\n // so we have to be nice and restore\n if (!parserInput.$char(')')) {\n parserInput.restore('Missing closing \\')\\'');\n return;\n }\n\n parserInput.commentStore.length = 0;\n\n if (parserInput.$str('when')) { // Guard\n cond = expect(parsers.conditions, 'expected condition');\n }\n\n ruleset = parsers.block();\n\n if (ruleset) {\n parserInput.forget();\n return new(tree.mixin.Definition)(name, params, ruleset, cond, variadic);\n } else {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n }\n },\n \n ruleLookups: function() {\n let rule;\n let args;\n const lookups = [];\n\n if (parserInput.currentChar() !== '[') { \n return;\n }\n\n while (true) {\n parserInput.save();\n args = null;\n rule = this.lookupValue();\n if (!rule && rule !== '') {\n parserInput.restore();\n break;\n }\n lookups.push(rule);\n parserInput.forget();\n }\n if (lookups.length > 0) {\n return lookups;\n }\n },\n \n lookupValue: function() {\n parserInput.save();\n \n if (!parserInput.$char('[')) { \n parserInput.restore();\n return;\n }\n \n const name = parserInput.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);\n \n if (!parserInput.$char(']')) {\n parserInput.restore();\n return;\n } \n\n if (name || name === '') {\n parserInput.forget();\n return name;\n }\n \n parserInput.restore();\n }\n },\n //\n // Entities are the smallest recognized token,\n // and can be found inside a rule's value.\n //\n entity: function () {\n const entities = this.entities;\n\n return this.comment() || entities.literal() || entities.variable() || entities.url() ||\n entities.property() || entities.call() || entities.keyword() || this.mixin.call(true) ||\n entities.javascript();\n },\n\n //\n // A Declaration terminator. Note that we use `peek()` to check for '}',\n // because the `block` rule will be expecting it, but we still need to make sure\n // it's there, if ';' was omitted.\n //\n end: function () {\n return parserInput.$char(';') || parserInput.peek('}');\n },\n\n //\n // IE's alpha function\n //\n // alpha(opacity=88)\n //\n ieAlpha: function () {\n let value;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (!parserInput.$re(/^opacity=/i)) { return; }\n value = parserInput.$re(/^\\d+/);\n if (!value) {\n value = expect(parsers.entities.variable, 'Could not parse alpha');\n value = `@{${value.name.slice(1)}}`;\n }\n expectChar(')');\n return new tree.Quoted('', `alpha(opacity=${value})`);\n },\n\n //\n // A Selector Element\n //\n // div\n // + h1\n // #socks\n // input[type=\"text\"]\n //\n // Elements are the building blocks for Selectors,\n // they are made out of a `Combinator` (see combinator rule),\n // and an element name, such as a tag a class, or `*`.\n //\n element: function () {\n let e;\n let c;\n let v;\n const index = parserInput.i;\n\n c = this.combinator();\n\n e = parserInput.$re(/^(?:\\d+\\.\\d+|\\d+)%/) ||\n parserInput.$re(/^(?:[.#]?|:*)(?:[\\w-]|[^\\x00-\\x9f]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/) ||\n parserInput.$char('*') || parserInput.$char('&') || this.attribute() ||\n parserInput.$re(/^\\([^&()@]+\\)/) || parserInput.$re(/^[\\.#:](?=@)/) ||\n this.entities.variableCurly();\n\n if (!e) {\n parserInput.save();\n if (parserInput.$char('(')) {\n if ((v = this.selector(false)) && parserInput.$char(')')) {\n e = new(tree.Paren)(v);\n parserInput.forget();\n } else {\n parserInput.restore('Missing closing \\')\\'');\n }\n } else {\n parserInput.forget();\n }\n }\n\n if (e) { return new(tree.Element)(c, e, e instanceof tree.Variable, index, fileInfo); }\n },\n\n //\n // Combinators combine elements together, in a Selector.\n //\n // Because our parser isn't white-space sensitive, special care\n // has to be taken, when parsing the descendant combinator, ` `,\n // as it's an empty space. We have to check the previous character\n // in the input, to see if it's a ` ` character. More info on how\n // we deal with this in *combinator.js*.\n //\n combinator: function () {\n let c = parserInput.currentChar();\n\n if (c === '/') {\n parserInput.save();\n const slashedCombinator = parserInput.$re(/^\\/[a-z]+\\//i);\n if (slashedCombinator) {\n parserInput.forget();\n return new(tree.Combinator)(slashedCombinator);\n }\n parserInput.restore();\n }\n\n if (c === '>' || c === '+' || c === '~' || c === '|' || c === '^') {\n parserInput.i++;\n if (c === '^' && parserInput.currentChar() === '^') {\n c = '^^';\n parserInput.i++;\n }\n while (parserInput.isWhitespace()) { parserInput.i++; }\n return new(tree.Combinator)(c);\n } else if (parserInput.isWhitespace(-1)) {\n return new(tree.Combinator)(' ');\n } else {\n return new(tree.Combinator)(null);\n }\n },\n //\n // A CSS Selector\n // with less extensions e.g. the ability to extend and guard\n //\n // .class > div + h1\n // li a:hover\n //\n // Selectors are made out of one or more Elements, see above.\n //\n selector: function (isLess) {\n const index = parserInput.i;\n let elements;\n let extendList;\n let c;\n let e;\n let allExtends;\n let when;\n let condition;\n isLess = isLess !== false;\n while ((isLess && (extendList = this.extend())) || (isLess && (when = parserInput.$str('when'))) || (e = this.element())) {\n if (when) {\n condition = expect(this.conditions, 'expected condition');\n } else if (condition) {\n error('CSS guard can only be used at the end of selector');\n } else if (extendList) {\n if (allExtends) {\n allExtends = allExtends.concat(extendList);\n } else {\n allExtends = extendList;\n }\n } else {\n if (allExtends) { error('Extend can only be used at the end of selector'); }\n c = parserInput.currentChar();\n if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n e = null;\n }\n if (c === '{' || c === '}' || c === ';' || c === ',' || c === ')') {\n break;\n }\n }\n\n if (elements) { return new(tree.Selector)(elements, allExtends, condition, index, fileInfo); }\n if (allExtends) { error('Extend must be used to extend a selector, it cannot be used on its own'); }\n },\n selectors: function () {\n let s;\n let selectors;\n while (true) {\n s = this.selector();\n if (!s) {\n break;\n }\n if (selectors) {\n selectors.push(s);\n } else {\n selectors = [ s ];\n }\n parserInput.commentStore.length = 0;\n if (s.condition && selectors.length > 1) {\n error(\"Guards are only currently allowed on a single selector.\");\n }\n if (!parserInput.$char(',')) { break; }\n if (s.condition) {\n error(\"Guards are only currently allowed on a single selector.\");\n }\n parserInput.commentStore.length = 0;\n }\n return selectors;\n },\n attribute: function () {\n if (!parserInput.$char('[')) { return; }\n\n const entities = this.entities;\n let key;\n let val;\n let op;\n\n if (!(key = entities.variableCurly())) {\n key = expect(/^(?:[_A-Za-z0-9-\\*]*\\|)?(?:[_A-Za-z0-9-]|\\\\.)+/);\n }\n\n op = parserInput.$re(/^[|~*$^]?=/);\n if (op) {\n val = entities.quoted() || parserInput.$re(/^[0-9]+%/) || parserInput.$re(/^[\\w-]+/) || entities.variableCurly();\n }\n\n expectChar(']');\n\n return new(tree.Attribute)(key, op, val);\n },\n\n //\n // The `block` rule is used by `ruleset` and `mixin.definition`.\n // It's a wrapper around the `primary` rule, with added `{}`.\n //\n block: function () {\n let content;\n if (parserInput.$char('{') && (content = this.primary()) && parserInput.$char('}')) {\n return content;\n }\n },\n\n blockRuleset: function() {\n let block = this.block();\n\n if (block) {\n block = new tree.Ruleset(null, block);\n }\n return block;\n },\n\n detachedRuleset: function() {\n let argInfo;\n let params;\n let variadic;\n\n parserInput.save();\n if (parserInput.$re(/^[.#]\\(/)) {\n /**\n * DR args currently only implemented for each() function, and not \n * yet settable as `@dr: #(@arg) {}`\n * This should be done when DRs are merged with mixins.\n * See: https://github.com/less/less-meta/issues/16\n */\n argInfo = this.mixin.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n if (!parserInput.$char(')')) {\n parserInput.restore();\n return;\n }\n }\n const blockRuleset = this.blockRuleset();\n if (blockRuleset) {\n parserInput.forget();\n if (params) {\n return new tree.mixin.Definition(null, params, blockRuleset, null, variadic);\n }\n return new tree.DetachedRuleset(blockRuleset);\n }\n parserInput.restore();\n },\n\n //\n // div, .class, body > p {...}\n //\n ruleset: function () {\n let selectors;\n let rules;\n let debugInfo;\n\n parserInput.save();\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(parserInput.i);\n }\n\n selectors = this.selectors();\n\n if (selectors && (rules = this.block())) {\n parserInput.forget();\n const ruleset = new(tree.Ruleset)(selectors, rules, context.strictImports);\n if (context.dumpLineNumbers) {\n ruleset.debugInfo = debugInfo;\n }\n return ruleset;\n } else {\n parserInput.restore();\n }\n },\n declaration: function () {\n let name;\n let value;\n const index = parserInput.i;\n let hasDR;\n const c = parserInput.currentChar();\n let important;\n let merge;\n let isVariable;\n\n if (c === '.' || c === '#' || c === '&' || c === ':') { return; }\n\n parserInput.save();\n\n name = this.variable() || this.ruleProperty();\n if (name) {\n isVariable = typeof name === 'string';\n\n if (isVariable) {\n value = this.detachedRuleset();\n if (value) {\n hasDR = true;\n }\n }\n\n parserInput.commentStore.length = 0;\n if (!value) {\n // a name returned by this.ruleProperty() is always an array of the form:\n // [string-1, ..., string-n, \"\"] or [string-1, ..., string-n, \"+\"]\n // where each item is a tree.Keyword or tree.Variable\n merge = !isVariable && name.length > 1 && name.pop().value;\n\n // Custom property values get permissive parsing\n if (name[0].value && name[0].value.slice(0, 2) === '--') {\n value = this.permissiveValue();\n }\n // Try to store values as anonymous\n // If we need the value later we'll re-parse it in ruleset.parseValue\n else {\n value = this.anonymousValue();\n }\n if (value) {\n parserInput.forget();\n // anonymous values absorb the end ';' which is required for them to work\n return new(tree.Declaration)(name, value, false, merge, index, fileInfo);\n }\n\n if (!value) {\n value = this.value();\n }\n\n if (value) {\n important = this.important();\n } else if (isVariable) {\n // As a last resort, try permissiveValue\n value = this.permissiveValue();\n }\n }\n\n if (value && (this.end() || hasDR)) {\n parserInput.forget();\n return new(tree.Declaration)(name, value, important, merge, index, fileInfo);\n }\n else {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n }\n },\n anonymousValue: function () {\n const index = parserInput.i;\n const match = parserInput.$re(/^([^.#@\\$+\\/'\"*`(;{}-]*);/);\n if (match) {\n return new(tree.Anonymous)(match[1], index);\n }\n },\n /**\n * Used for custom properties, at-rules, and variables (as fallback)\n * Parses almost anything inside of {} [] () \"\" blocks\n * until it reaches outer-most tokens.\n * \n * First, it will try to parse comments and entities to reach\n * the end. This is mostly like the Expression parser except no\n * math is allowed.\n */\n permissiveValue: function (untilTokens) {\n let i;\n let e;\n let done;\n let value;\n const tok = untilTokens || ';';\n const index = parserInput.i;\n const result = [];\n\n function testCurrentChar() {\n const char = parserInput.currentChar();\n if (typeof tok === 'string') {\n return char === tok;\n } else {\n return tok.test(char);\n }\n }\n if (testCurrentChar()) {\n return;\n }\n value = [];\n do {\n e = this.comment();\n if (e) {\n value.push(e);\n continue;\n }\n e = this.entity();\n if (e) {\n value.push(e);\n }\n } while (e);\n\n done = testCurrentChar();\n\n if (value.length > 0) {\n value = new(tree.Expression)(value);\n if (done) {\n return value;\n }\n else {\n result.push(value);\n }\n // Preserve space before $parseUntil as it will not\n if (parserInput.prevChar() === ' ') {\n result.push(new tree.Anonymous(' ', index));\n }\n }\n parserInput.save();\n\n value = parserInput.$parseUntil(tok);\n\n if (value) {\n if (typeof value === 'string') {\n error(`Expected '${value}'`, 'Parse');\n }\n if (value.length === 1 && value[0] === ' ') {\n parserInput.forget();\n return new tree.Anonymous('', index);\n }\n let item;\n for (i = 0; i < value.length; i++) {\n item = value[i];\n if (Array.isArray(item)) {\n // Treat actual quotes as normal quoted values\n result.push(new tree.Quoted(item[0], item[1], true, index, fileInfo));\n }\n else {\n if (i === value.length - 1) {\n item = item.trim();\n }\n // Treat like quoted values, but replace vars like unquoted expressions\n const quote = new tree.Quoted('\\'', item, true, index, fileInfo);\n quote.variableRegex = /@([\\w-]+)/g;\n quote.propRegex = /\\$([\\w-]+)/g;\n result.push(quote);\n }\n }\n parserInput.forget();\n return new tree.Expression(result, true);\n }\n parserInput.restore();\n },\n\n //\n // An @import atrule\n //\n // @import \"lib\";\n //\n // Depending on our environment, importing is done differently:\n // In the browser, it's an XHR request, in Node, it would be a\n // file-system operation. The function used for importing is\n // stored in `import`, which we pass to the Import constructor.\n //\n 'import': function () {\n let path;\n let features;\n const index = parserInput.i;\n\n const dir = parserInput.$re(/^@import?\\s+/);\n\n if (dir) {\n const options = (dir ? this.importOptions() : null) || {};\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n features = this.mediaFeatures();\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon or unrecognised media features on import');\n }\n features = features && new(tree.Value)(features);\n return new(tree.Import)(path, features, options, index, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed import statement');\n }\n }\n },\n\n importOptions: function() {\n let o;\n const options = {};\n let optionName;\n let value;\n\n // list of options, surrounded by parens\n if (!parserInput.$char('(')) { return null; }\n do {\n o = this.importOption();\n if (o) {\n optionName = o;\n value = true;\n switch (optionName) {\n case 'css':\n optionName = 'less';\n value = false;\n break;\n case 'once':\n optionName = 'multiple';\n value = false;\n break;\n }\n options[optionName] = value;\n if (!parserInput.$char(',')) { break; }\n }\n } while (o);\n expectChar(')');\n return options;\n },\n\n importOption: function() {\n const opt = parserInput.$re(/^(less|css|multiple|once|inline|reference|optional)/);\n if (opt) {\n return opt[1];\n }\n },\n\n mediaFeature: function () {\n const entities = this.entities;\n const nodes = [];\n let e;\n let p;\n parserInput.save();\n do {\n e = entities.keyword() || entities.variable() || entities.mixinLookup();\n if (e) {\n nodes.push(e);\n } else if (parserInput.$char('(')) {\n p = this.property();\n e = this.value();\n if (parserInput.$char(')')) {\n if (p && e) {\n nodes.push(new(tree.Paren)(new(tree.Declaration)(p, e, null, null, parserInput.i, fileInfo, true)));\n } else if (e) {\n nodes.push(new(tree.Paren)(e));\n } else {\n error('badly formed media feature definition');\n }\n } else {\n error('Missing closing \\')\\'', 'Parse');\n }\n }\n } while (e);\n\n parserInput.forget();\n if (nodes.length > 0) {\n return new(tree.Expression)(nodes);\n }\n },\n\n mediaFeatures: function () {\n const entities = this.entities;\n const features = [];\n let e;\n do {\n e = this.mediaFeature();\n if (e) {\n features.push(e);\n if (!parserInput.$char(',')) { break; }\n } else {\n e = entities.variable() || entities.mixinLookup();\n if (e) {\n features.push(e);\n if (!parserInput.$char(',')) { break; }\n }\n }\n } while (e);\n\n return features.length > 0 ? features : null;\n },\n\n media: function () {\n let features;\n let rules;\n let media;\n let debugInfo;\n const index = parserInput.i;\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(index);\n }\n\n parserInput.save();\n\n if (parserInput.$str('@media')) {\n features = this.mediaFeatures();\n\n rules = this.block();\n\n if (!rules) {\n error('media definitions require block statements after any features');\n }\n\n parserInput.forget();\n\n media = new(tree.Media)(rules, features, index, fileInfo);\n if (context.dumpLineNumbers) {\n media.debugInfo = debugInfo;\n }\n\n return media;\n }\n\n parserInput.restore();\n },\n\n //\n\n // A @plugin directive, used to import plugins dynamically.\n //\n // @plugin (args) \"lib\";\n //\n plugin: function () {\n let path;\n let args;\n let options;\n const index = parserInput.i;\n const dir = parserInput.$re(/^@plugin?\\s+/);\n\n if (dir) {\n args = this.pluginArgs();\n\n if (args) {\n options = {\n pluginArgs: args,\n isPlugin: true\n };\n }\n else {\n options = { isPlugin: true };\n }\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon on @plugin');\n }\n return new(tree.Import)(path, null, options, index, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed @plugin statement');\n }\n }\n },\n\n pluginArgs: function() {\n // list of options, surrounded by parens\n parserInput.save();\n if (!parserInput.$char('(')) {\n parserInput.restore();\n return null;\n }\n const args = parserInput.$re(/^\\s*([^\\);]+)\\)\\s*/);\n if (args[1]) {\n parserInput.forget();\n return args[1].trim();\n }\n else { \n parserInput.restore();\n return null;\n }\n },\n\n //\n // A CSS AtRule\n //\n // @charset \"utf-8\";\n //\n atrule: function () {\n const index = parserInput.i;\n let name;\n let value;\n let rules;\n let nonVendorSpecificName;\n let hasIdentifier;\n let hasExpression;\n let hasUnknown;\n let hasBlock = true;\n let isRooted = true;\n\n if (parserInput.currentChar() !== '@') { return; }\n\n value = this['import']() || this.plugin() || this.media();\n if (value) {\n return value;\n }\n\n parserInput.save();\n\n name = parserInput.$re(/^@[a-z-]+/);\n\n if (!name) { return; }\n\n nonVendorSpecificName = name;\n if (name.charAt(1) == '-' && name.indexOf('-', 2) > 0) {\n nonVendorSpecificName = `@${name.slice(name.indexOf('-', 2) + 1)}`;\n }\n\n switch (nonVendorSpecificName) {\n case '@charset':\n hasIdentifier = true;\n hasBlock = false;\n break;\n case '@namespace':\n hasExpression = true;\n hasBlock = false;\n break;\n case '@keyframes':\n case '@counter-style':\n hasIdentifier = true;\n break;\n case '@document':\n case '@supports':\n hasUnknown = true;\n isRooted = false;\n break;\n default:\n hasUnknown = true;\n break;\n }\n\n parserInput.commentStore.length = 0;\n\n if (hasIdentifier) {\n value = this.entity();\n if (!value) {\n error(`expected ${name} identifier`);\n }\n } else if (hasExpression) {\n value = this.expression();\n if (!value) {\n error(`expected ${name} expression`);\n }\n } else if (hasUnknown) {\n value = this.permissiveValue(/^[{;]/);\n hasBlock = (parserInput.currentChar() === '{');\n if (!value) {\n if (!hasBlock && parserInput.currentChar() !== ';') {\n error(`${name} rule is missing block or ending semi-colon`);\n }\n }\n else if (!value.value) {\n value = null;\n }\n }\n\n if (hasBlock) {\n rules = this.blockRuleset();\n }\n\n if (rules || (!hasBlock && value && parserInput.$char(';'))) {\n parserInput.forget();\n return new(tree.AtRule)(name, value, rules, index, fileInfo,\n context.dumpLineNumbers ? getDebugInfo(index) : null,\n isRooted\n );\n }\n\n parserInput.restore('at-rule options not recognised');\n },\n\n //\n // A Value is a comma-delimited list of Expressions\n //\n // font-family: Baskerville, Georgia, serif;\n //\n // In a Rule, a Value represents everything after the `:`,\n // and before the `;`.\n //\n value: function () {\n let e;\n const expressions = [];\n const index = parserInput.i;\n\n do {\n e = this.expression();\n if (e) {\n expressions.push(e);\n if (!parserInput.$char(',')) { break; }\n }\n } while (e);\n\n if (expressions.length > 0) {\n return new(tree.Value)(expressions, index);\n }\n },\n important: function () {\n if (parserInput.currentChar() === '!') {\n return parserInput.$re(/^! *important/);\n }\n },\n sub: function () {\n let a;\n let e;\n\n parserInput.save();\n if (parserInput.$char('(')) {\n a = this.addition();\n if (a && parserInput.$char(')')) {\n parserInput.forget();\n e = new(tree.Expression)([a]);\n e.parens = true;\n return e;\n }\n parserInput.restore('Expected \\')\\'');\n return;\n }\n parserInput.restore();\n },\n multiplication: function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.operand();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1);\n while (true) {\n if (parserInput.peek(/^\\/[*\\/]/)) {\n break;\n }\n\n parserInput.save();\n\n op = parserInput.$char('/') || parserInput.$char('*') || parserInput.$str('./');\n\n if (!op) { parserInput.forget(); break; }\n\n a = this.operand();\n\n if (!a) { parserInput.restore(); break; }\n parserInput.forget();\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n isSpaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n addition: function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.multiplication();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1);\n while (true) {\n op = parserInput.$re(/^[-+]\\s+/) || (!isSpaced && (parserInput.$char('+') || parserInput.$char('-')));\n if (!op) {\n break;\n }\n a = this.multiplication();\n if (!a) {\n break;\n }\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n isSpaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n conditions: function () {\n let a;\n let b;\n const index = parserInput.i;\n let condition;\n\n a = this.condition(true);\n if (a) {\n while (true) {\n if (!parserInput.peek(/^,\\s*(not\\s*)?\\(/) || !parserInput.$char(',')) {\n break;\n }\n b = this.condition(true);\n if (!b) {\n break;\n }\n condition = new(tree.Condition)('or', condition || a, b, index);\n }\n return condition || a;\n }\n },\n condition: function (needsParens) {\n let result;\n let logical;\n let next;\n function or() {\n return parserInput.$str('or');\n }\n\n result = this.conditionAnd(needsParens);\n if (!result) {\n return ;\n }\n logical = or();\n if (logical) {\n next = this.condition(needsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n }\n }\n return result;\n },\n conditionAnd: function (needsParens) {\n let result;\n let logical;\n let next;\n const self = this;\n function insideCondition() {\n const cond = self.negatedCondition(needsParens) || self.parenthesisCondition(needsParens);\n if (!cond && !needsParens) {\n return self.atomicCondition(needsParens);\n }\n return cond;\n }\n function and() {\n return parserInput.$str('and');\n }\n\n result = insideCondition();\n if (!result) {\n return ;\n }\n logical = and();\n if (logical) {\n next = this.conditionAnd(needsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n }\n }\n return result;\n },\n negatedCondition: function (needsParens) {\n if (parserInput.$str('not')) {\n const result = this.parenthesisCondition(needsParens);\n if (result) {\n result.negate = !result.negate;\n }\n return result;\n }\n },\n parenthesisCondition: function (needsParens) {\n function tryConditionFollowedByParenthesis(me) {\n let body;\n parserInput.save();\n body = me.condition(needsParens);\n if (!body) {\n parserInput.restore();\n return ;\n }\n if (!parserInput.$char(')')) {\n parserInput.restore();\n return ;\n }\n parserInput.forget();\n return body;\n }\n\n let body;\n parserInput.save();\n if (!parserInput.$str('(')) {\n parserInput.restore();\n return ;\n }\n body = tryConditionFollowedByParenthesis(this);\n if (body) {\n parserInput.forget();\n return body;\n }\n\n body = this.atomicCondition(needsParens);\n if (!body) {\n parserInput.restore();\n return ;\n }\n if (!parserInput.$char(')')) {\n parserInput.restore(`expected ')' got '${parserInput.currentChar()}'`);\n return ;\n }\n parserInput.forget();\n return body;\n },\n atomicCondition: function (needsParens) {\n const entities = this.entities;\n const index = parserInput.i;\n let a;\n let b;\n let c;\n let op;\n\n function cond() {\n return this.addition() || entities.keyword() || entities.quoted() || entities.mixinLookup();\n }\n cond = cond.bind(this);\n\n a = cond();\n if (a) {\n if (parserInput.$char('>')) {\n if (parserInput.$char('=')) {\n op = '>=';\n } else {\n op = '>';\n }\n } else\n if (parserInput.$char('<')) {\n if (parserInput.$char('=')) {\n op = '<=';\n } else {\n op = '<';\n }\n } else\n if (parserInput.$char('=')) {\n if (parserInput.$char('>')) {\n op = '=>';\n } else if (parserInput.$char('<')) {\n op = '=<';\n } else {\n op = '=';\n }\n }\n if (op) {\n b = cond();\n if (b) {\n c = new(tree.Condition)(op, a, b, index, false);\n } else {\n error('expected expression');\n }\n } else {\n c = new(tree.Condition)('=', a, new(tree.Keyword)('true'), index, false);\n }\n return c;\n }\n },\n\n //\n // An operand is anything that can be part of an operation,\n // such as a Color, or a Variable\n //\n operand: function () {\n const entities = this.entities;\n let negate;\n\n if (parserInput.peek(/^-[@\\$\\(]/)) {\n negate = parserInput.$char('-');\n }\n\n let o = this.sub() || entities.dimension() ||\n entities.color() || entities.variable() ||\n entities.property() || entities.call() ||\n entities.quoted(true) || entities.colorKeyword() ||\n entities.mixinLookup();\n\n if (negate) {\n o.parensInOp = true;\n o = new(tree.Negative)(o);\n }\n\n return o;\n },\n\n //\n // Expressions either represent mathematical operations,\n // or white-space delimited Entities.\n //\n // 1px solid black\n // @var * 2\n //\n expression: function () {\n const entities = [];\n let e;\n let delim;\n const index = parserInput.i;\n\n do {\n e = this.comment();\n if (e) {\n entities.push(e);\n continue;\n }\n e = this.addition() || this.entity();\n\n if (e instanceof tree.Comment) {\n e = null;\n }\n\n if (e) {\n entities.push(e);\n // operations do not allow keyword \"/\" dimension (e.g. small/20px) so we support that here\n if (!parserInput.peek(/^\\/[\\/*]/)) {\n delim = parserInput.$char('/');\n if (delim) {\n entities.push(new(tree.Anonymous)(delim, index));\n }\n }\n }\n } while (e);\n if (entities.length > 0) {\n return new(tree.Expression)(entities);\n }\n },\n property: function () {\n const name = parserInput.$re(/^(\\*?-?[_a-zA-Z0-9-]+)\\s*:/);\n if (name) {\n return name[1];\n }\n },\n ruleProperty: function () {\n let name = [];\n const index = [];\n let s;\n let k;\n\n parserInput.save();\n\n const simpleProperty = parserInput.$re(/^([_a-zA-Z0-9-]+)\\s*:/);\n if (simpleProperty) {\n name = [new(tree.Keyword)(simpleProperty[1])];\n parserInput.forget();\n return name;\n }\n\n function match(re) {\n const i = parserInput.i;\n const chunk = parserInput.$re(re);\n if (chunk) {\n index.push(i);\n return name.push(chunk[1]);\n }\n }\n\n match(/^(\\*?)/);\n while (true) {\n if (!match(/^((?:[\\w-]+)|(?:[@\\$]\\{[\\w-]+\\}))/)) {\n break;\n }\n }\n\n if ((name.length > 1) && match(/^((?:\\+_|\\+)?)\\s*:/)) {\n parserInput.forget();\n\n // at last, we have the complete match now. move forward,\n // convert name particles to tree objects and return:\n if (name[0] === '') {\n name.shift();\n index.shift();\n }\n for (k = 0; k < name.length; k++) {\n s = name[k];\n name[k] = (s.charAt(0) !== '@' && s.charAt(0) !== '$') ?\n new(tree.Keyword)(s) :\n (s.charAt(0) === '@' ?\n new(tree.Variable)(`@${s.slice(2, -1)}`, index[k], fileInfo) :\n new(tree.Property)(`$${s.slice(2, -1)}`, index[k], fileInfo));\n }\n return name;\n }\n parserInput.restore();\n }\n }\n };\n};\nParser.serializeVars = vars => {\n let s = '';\n\n for (const name in vars) {\n if (Object.hasOwnProperty.call(vars, name)) {\n const value = vars[name];\n s += `${((name[0] === '@') ? '' : '@') + name}: ${value}${(String(value).slice(-1) === ';') ? '' : ';'}`;\n }\n }\n\n return s;\n};\n\nexport default Parser;\n","import Anonymous from '../tree/anonymous';\nimport Keyword from '../tree/keyword';\n\nfunction boolean(condition) {\n return condition ? Keyword.True : Keyword.False;\n}\n\n/**\n * Functions with evalArgs set to false are sent context\n * as the first argument.\n */\nfunction If(context, condition, trueValue, falseValue) {\n return condition.eval(context) ? trueValue.eval(context)\n : (falseValue ? falseValue.eval(context) : new Anonymous);\n}\nIf.evalArgs = false\n\nexport default { boolean, 'if': If };\n","import Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nlet colorFunctions;\n\nfunction clamp(val) {\n return Math.min(1, Math.max(0, val));\n}\nfunction hsla(origColor, hsl) {\n const color = colorFunctions.hsla(hsl.h, hsl.s, hsl.l, hsl.a);\n if (color) {\n if (origColor.value && \n /^(rgb|hsl)/.test(origColor.value)) {\n color.value = origColor.value;\n } else {\n color.value = 'rgb';\n }\n return color;\n }\n}\nfunction toHSL(color) {\n if (color.toHSL) {\n return color.toHSL();\n } else {\n throw new Error('Argument cannot be evaluated to a color');\n }\n}\n\nfunction toHSV(color) {\n if (color.toHSV) {\n return color.toHSV();\n } else {\n throw new Error('Argument cannot be evaluated to a color');\n }\n}\n\nfunction number(n) {\n if (n instanceof Dimension) {\n return parseFloat(n.unit.is('%') ? n.value / 100 : n.value);\n } else if (typeof n === 'number') {\n return n;\n } else {\n throw {\n type: 'Argument',\n message: 'color functions take numbers as parameters'\n };\n }\n}\nfunction scaled(n, size) {\n if (n instanceof Dimension && n.unit.is('%')) {\n return parseFloat(n.value * size / 100);\n } else {\n return number(n);\n }\n}\ncolorFunctions = {\n rgb: function (r, g, b) {\n const color = colorFunctions.rgba(r, g, b, 1.0);\n if (color) {\n color.value = 'rgb';\n return color;\n }\n },\n rgba: function (r, g, b, a) {\n try {\n if (r instanceof Color) {\n if (g) {\n a = number(g);\n } else {\n a = r.alpha;\n }\n return new Color(r.rgb, a, 'rgba');\n }\n const rgb = [r, g, b].map(c => scaled(c, 255));\n a = number(a);\n return new Color(rgb, a, 'rgba');\n }\n catch (e) {}\n },\n hsl: function (h, s, l) {\n const color = colorFunctions.hsla(h, s, l, 1.0);\n if (color) {\n color.value = 'hsl';\n return color;\n }\n },\n hsla: function (h, s, l, a) {\n try {\n if (h instanceof Color) {\n if (s) {\n a = number(s);\n } else {\n a = h.alpha;\n }\n return new Color(h.rgb, a, 'hsla');\n }\n\n let m1;\n let m2;\n\n function hue(h) {\n h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h);\n if (h * 6 < 1) {\n return m1 + (m2 - m1) * h * 6;\n }\n else if (h * 2 < 1) {\n return m2;\n }\n else if (h * 3 < 2) {\n return m1 + (m2 - m1) * (2 / 3 - h) * 6;\n }\n else {\n return m1;\n }\n }\n\n h = (number(h) % 360) / 360;\n s = clamp(number(s));l = clamp(number(l));a = clamp(number(a));\n\n m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n m1 = l * 2 - m2;\n\n const rgb = [\n hue(h + 1 / 3) * 255,\n hue(h) * 255,\n hue(h - 1 / 3) * 255\n ];\n a = number(a);\n return new Color(rgb, a, 'hsla');\n }\n catch (e) {}\n },\n\n hsv: function(h, s, v) {\n return colorFunctions.hsva(h, s, v, 1.0);\n },\n\n hsva: function(h, s, v, a) {\n h = ((number(h) % 360) / 360) * 360;\n s = number(s);v = number(v);a = number(a);\n\n let i;\n let f;\n i = Math.floor((h / 60) % 6);\n f = (h / 60) - i;\n\n const vs = [v,\n v * (1 - s),\n v * (1 - f * s),\n v * (1 - (1 - f) * s)];\n const perm = [[0, 3, 1],\n [2, 0, 1],\n [1, 0, 3],\n [1, 2, 0],\n [3, 1, 0],\n [0, 1, 2]];\n\n return colorFunctions.rgba(vs[perm[i][0]] * 255,\n vs[perm[i][1]] * 255,\n vs[perm[i][2]] * 255,\n a);\n },\n\n hue: function (color) {\n return new Dimension(toHSL(color).h);\n },\n saturation: function (color) {\n return new Dimension(toHSL(color).s * 100, '%');\n },\n lightness: function (color) {\n return new Dimension(toHSL(color).l * 100, '%');\n },\n hsvhue: function(color) {\n return new Dimension(toHSV(color).h);\n },\n hsvsaturation: function (color) {\n return new Dimension(toHSV(color).s * 100, '%');\n },\n hsvvalue: function (color) {\n return new Dimension(toHSV(color).v * 100, '%');\n },\n red: function (color) {\n return new Dimension(color.rgb[0]);\n },\n green: function (color) {\n return new Dimension(color.rgb[1]);\n },\n blue: function (color) {\n return new Dimension(color.rgb[2]);\n },\n alpha: function (color) {\n return new Dimension(toHSL(color).a);\n },\n luma: function (color) {\n return new Dimension(color.luma() * color.alpha * 100, '%');\n },\n luminance: function (color) {\n const luminance =\n (0.2126 * color.rgb[0] / 255) +\n (0.7152 * color.rgb[1] / 255) +\n (0.0722 * color.rgb[2] / 255);\n\n return new Dimension(luminance * color.alpha * 100, '%');\n },\n saturate: function (color, amount, method) {\n // filter: saturate(3.2);\n // should be kept as is, so check for color\n if (!color.rgb) {\n return null;\n }\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.s += hsl.s * amount.value / 100;\n }\n else {\n hsl.s += amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n return hsla(color, hsl);\n },\n desaturate: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.s -= hsl.s * amount.value / 100;\n }\n else {\n hsl.s -= amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n return hsla(color, hsl);\n },\n lighten: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.l += hsl.l * amount.value / 100;\n }\n else {\n hsl.l += amount.value / 100;\n }\n hsl.l = clamp(hsl.l);\n return hsla(color, hsl);\n },\n darken: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.l -= hsl.l * amount.value / 100;\n }\n else {\n hsl.l -= amount.value / 100;\n }\n hsl.l = clamp(hsl.l);\n return hsla(color, hsl);\n },\n fadein: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.a += hsl.a * amount.value / 100;\n }\n else {\n hsl.a += amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fadeout: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.a -= hsl.a * amount.value / 100;\n }\n else {\n hsl.a -= amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fade: function (color, amount) {\n const hsl = toHSL(color);\n\n hsl.a = amount.value / 100;\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n spin: function (color, amount) {\n const hsl = toHSL(color);\n const hue = (hsl.h + amount.value) % 360;\n\n hsl.h = hue < 0 ? 360 + hue : hue;\n\n return hsla(color, hsl);\n },\n //\n // Copyright (c) 2006-2009 Hampton Catlin, Natalie Weizenbaum, and Chris Eppstein\n // http://sass-lang.com\n //\n mix: function (color1, color2, weight) {\n if (!weight) {\n weight = new Dimension(50);\n }\n const p = weight.value / 100.0;\n const w = p * 2 - 1;\n const a = toHSL(color1).a - toHSL(color2).a;\n\n const w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n const w2 = 1 - w1;\n\n const rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2,\n color1.rgb[1] * w1 + color2.rgb[1] * w2,\n color1.rgb[2] * w1 + color2.rgb[2] * w2];\n\n const alpha = color1.alpha * p + color2.alpha * (1 - p);\n\n return new Color(rgb, alpha);\n },\n greyscale: function (color) {\n return colorFunctions.desaturate(color, new Dimension(100));\n },\n contrast: function (color, dark, light, threshold) {\n // filter: contrast(3.2);\n // should be kept as is, so check for color\n if (!color.rgb) {\n return null;\n }\n if (typeof light === 'undefined') {\n light = colorFunctions.rgba(255, 255, 255, 1.0);\n }\n if (typeof dark === 'undefined') {\n dark = colorFunctions.rgba(0, 0, 0, 1.0);\n }\n // Figure out which is actually light and dark:\n if (dark.luma() > light.luma()) {\n const t = light;\n light = dark;\n dark = t;\n }\n if (typeof threshold === 'undefined') {\n threshold = 0.43;\n } else {\n threshold = number(threshold);\n }\n if (color.luma() < threshold) {\n return light;\n } else {\n return dark;\n }\n },\n // Changes made in 2.7.0 - Reverted in 3.0.0\n // contrast: function (color, color1, color2, threshold) {\n // // Return which of `color1` and `color2` has the greatest contrast with `color`\n // // according to the standard WCAG contrast ratio calculation.\n // // http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n // // The threshold param is no longer used, in line with SASS.\n // // filter: contrast(3.2);\n // // should be kept as is, so check for color\n // if (!color.rgb) {\n // return null;\n // }\n // if (typeof color1 === 'undefined') {\n // color1 = colorFunctions.rgba(0, 0, 0, 1.0);\n // }\n // if (typeof color2 === 'undefined') {\n // color2 = colorFunctions.rgba(255, 255, 255, 1.0);\n // }\n // var contrast1, contrast2;\n // var luma = color.luma();\n // var luma1 = color1.luma();\n // var luma2 = color2.luma();\n // // Calculate contrast ratios for each color\n // if (luma > luma1) {\n // contrast1 = (luma + 0.05) / (luma1 + 0.05);\n // } else {\n // contrast1 = (luma1 + 0.05) / (luma + 0.05);\n // }\n // if (luma > luma2) {\n // contrast2 = (luma + 0.05) / (luma2 + 0.05);\n // } else {\n // contrast2 = (luma2 + 0.05) / (luma + 0.05);\n // }\n // if (contrast1 > contrast2) {\n // return color1;\n // } else {\n // return color2;\n // }\n // },\n argb: function (color) {\n return new Anonymous(color.toARGB());\n },\n color: function(c) {\n if ((c instanceof Quoted) &&\n (/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})$/i.test(c.value))) {\n const val = c.value.slice(1);\n return new Color(val, undefined, `#${val}`);\n }\n if ((c instanceof Color) || (c = Color.fromKeyword(c.value))) {\n c.value = undefined;\n return c;\n }\n throw {\n type: 'Argument',\n message: 'argument must be a color keyword or 3|4|6|8 digit hex e.g. #FFF'\n };\n },\n tint: function(color, amount) {\n return colorFunctions.mix(colorFunctions.rgb(255, 255, 255), color, amount);\n },\n shade: function(color, amount) {\n return colorFunctions.mix(colorFunctions.rgb(0, 0, 0), color, amount);\n }\n};\n\nexport default colorFunctions;\n","import Color from '../tree/color';\n\n// Color Blending\n// ref: http://www.w3.org/TR/compositing-1\n\nfunction colorBlend(mode, color1, color2) {\n const ab = color1.alpha; // result\n\n let // backdrop\n cb;\n\n const as = color2.alpha;\n\n let // source\n cs;\n\n let ar;\n let cr;\n const r = [];\n\n ar = as + ab * (1 - as);\n for (let i = 0; i < 3; i++) {\n cb = color1.rgb[i] / 255;\n cs = color2.rgb[i] / 255;\n cr = mode(cb, cs);\n if (ar) {\n cr = (as * cs + ab * (cb -\n as * (cb + cs - cr))) / ar;\n }\n r[i] = cr * 255;\n }\n\n return new Color(r, ar);\n}\n\nconst colorBlendModeFunctions = {\n multiply: function(cb, cs) {\n return cb * cs;\n },\n screen: function(cb, cs) {\n return cb + cs - cb * cs;\n },\n overlay: function(cb, cs) {\n cb *= 2;\n return (cb <= 1) ?\n colorBlendModeFunctions.multiply(cb, cs) :\n colorBlendModeFunctions.screen(cb - 1, cs);\n },\n softlight: function(cb, cs) {\n let d = 1;\n let e = cb;\n if (cs > 0.5) {\n e = 1;\n d = (cb > 0.25) ? Math.sqrt(cb)\n : ((16 * cb - 12) * cb + 4) * cb;\n }\n return cb - (1 - 2 * cs) * e * (d - cb);\n },\n hardlight: function(cb, cs) {\n return colorBlendModeFunctions.overlay(cs, cb);\n },\n difference: function(cb, cs) {\n return Math.abs(cb - cs);\n },\n exclusion: function(cb, cs) {\n return cb + cs - 2 * cb * cs;\n },\n\n // non-w3c functions:\n average: function(cb, cs) {\n return (cb + cs) / 2;\n },\n negation: function(cb, cs) {\n return 1 - Math.abs(cb + cs - 1);\n }\n};\n\nfor (const f in colorBlendModeFunctions) {\n if (colorBlendModeFunctions.hasOwnProperty(f)) {\n colorBlend[f] = colorBlend.bind(null, colorBlendModeFunctions[f]);\n }\n}\n\nexport default colorBlend;\n","import Comment from '../tree/comment';\nimport Dimension from '../tree/dimension';\nimport Declaration from '../tree/declaration';\nimport Expression from '../tree/expression';\nimport Ruleset from '../tree/ruleset';\nimport Selector from '../tree/selector';\nimport Element from '../tree/element';\nimport Quote from '../tree/quoted';\n\nconst getItemsFromNode = node => {\n // handle non-array values as an array of length 1\n // return 'undefined' if index is invalid\n const items = Array.isArray(node.value) ?\n node.value : Array(node);\n\n return items;\n};\n\nexport default {\n _SELF: function(n) {\n return n;\n },\n extract: function(values, index) {\n // (1-based index)\n index = index.value - 1;\n\n return getItemsFromNode(values)[index];\n },\n length: function(values) {\n return new Dimension(getItemsFromNode(values).length);\n },\n /**\n * Creates a Less list of incremental values.\n * Modeled after Lodash's range function, also exists natively in PHP\n * \n * @param {Dimension} [start=1]\n * @param {Dimension} end - e.g. 10 or 10px - unit is added to output\n * @param {Dimension} [step=1] \n */\n range: function(start, end, step) {\n let from;\n let to;\n let stepValue = 1;\n const list = [];\n if (end) {\n to = end;\n from = start.value;\n if (step) {\n stepValue = step.value;\n }\n }\n else {\n from = 1;\n to = start;\n }\n\n for (let i = from; i <= to.value; i += stepValue) {\n list.push(new Dimension(i, to.unit));\n }\n\n return new Expression(list);\n },\n each: function(list, rs) {\n const rules = [];\n let newRules;\n let iterator;\n\n if (list.value && !(list instanceof Quote)) {\n if (Array.isArray(list.value)) {\n iterator = list.value;\n } else {\n iterator = [list.value];\n }\n } else if (list.ruleset) {\n iterator = list.ruleset.rules;\n } else if (list.rules) {\n iterator = list.rules;\n } else if (Array.isArray(list)) {\n iterator = list;\n } else {\n iterator = [list];\n }\n\n let valueName = '@value';\n let keyName = '@key';\n let indexName = '@index';\n\n if (rs.params) {\n valueName = rs.params[0] && rs.params[0].name;\n keyName = rs.params[1] && rs.params[1].name;\n indexName = rs.params[2] && rs.params[2].name;\n rs = rs.rules;\n } else {\n rs = rs.ruleset;\n }\n\n for (let i = 0; i < iterator.length; i++) {\n let key;\n let value;\n const item = iterator[i];\n if (item instanceof Declaration) {\n key = typeof item.name === 'string' ? item.name : item.name[0].value;\n value = item.value;\n } else {\n key = new Dimension(i + 1);\n value = item;\n }\n\n if (item instanceof Comment) {\n continue;\n }\n\n newRules = rs.rules.slice(0);\n if (valueName) {\n newRules.push(new Declaration(valueName,\n value,\n false, false, this.index, this.currentFileInfo));\n }\n if (indexName) {\n newRules.push(new Declaration(indexName,\n new Dimension(i + 1),\n false, false, this.index, this.currentFileInfo));\n }\n if (keyName) {\n newRules.push(new Declaration(keyName,\n key,\n false, false, this.index, this.currentFileInfo));\n }\n\n rules.push(new Ruleset([ new(Selector)([ new Element(\"\", '&') ]) ],\n newRules,\n rs.strictImports,\n rs.visibilityInfo()\n ));\n }\n\n return new Ruleset([ new(Selector)([ new Element(\"\", '&') ]) ],\n rules,\n rs.strictImports,\n rs.visibilityInfo()\n ).eval(this.context);\n }\n};\n","import Dimension from '../tree/dimension';\n\nconst MathHelper = (fn, unit, n) => {\n if (!(n instanceof Dimension)) {\n throw { type: 'Argument', message: 'argument must be a number' };\n }\n if (unit == null) {\n unit = n.unit;\n } else {\n n = n.unify();\n }\n return new Dimension(fn(parseFloat(n.value)), unit);\n};\n\nexport default MathHelper;","import mathHelper from './math-helper.js';\n\nconst mathFunctions = {\n // name, unit\n ceil: null,\n floor: null,\n sqrt: null,\n abs: null,\n tan: '',\n sin: '',\n cos: '',\n atan: 'rad',\n asin: 'rad',\n acos: 'rad'\n};\n\nfor (const f in mathFunctions) {\n if (mathFunctions.hasOwnProperty(f)) {\n mathFunctions[f] = mathHelper.bind(null, Math[f], mathFunctions[f]);\n }\n}\n\nmathFunctions.round = (n, f) => {\n const fraction = typeof f === 'undefined' ? 0 : f.value;\n return mathHelper(num => num.toFixed(fraction), null, n);\n};\n\nexport default mathFunctions;\n","import Dimension from '../tree/dimension';\nimport Anonymous from '../tree/anonymous';\nimport mathHelper from './math-helper.js';\n\nconst minMax = function (isMin, args) {\n args = Array.prototype.slice.call(args);\n switch (args.length) {\n case 0: throw { type: 'Argument', message: 'one or more arguments required' };\n }\n let i; // key is the unit.toString() for unified Dimension values,\n let j;\n let current;\n let currentUnified;\n let referenceUnified;\n let unit;\n let unitStatic;\n let unitClone;\n\n const // elems only contains original argument values.\n order = [];\n\n const values = {};\n // value is the index into the order array.\n for (i = 0; i < args.length; i++) {\n current = args[i];\n if (!(current instanceof Dimension)) {\n if (Array.isArray(args[i].value)) {\n Array.prototype.push.apply(args, Array.prototype.slice.call(args[i].value));\n }\n continue;\n }\n currentUnified = current.unit.toString() === '' && unitClone !== undefined ? new Dimension(current.value, unitClone).unify() : current.unify();\n unit = currentUnified.unit.toString() === '' && unitStatic !== undefined ? unitStatic : currentUnified.unit.toString();\n unitStatic = unit !== '' && unitStatic === undefined || unit !== '' && order[0].unify().unit.toString() === '' ? unit : unitStatic;\n unitClone = unit !== '' && unitClone === undefined ? current.unit.toString() : unitClone;\n j = values[''] !== undefined && unit !== '' && unit === unitStatic ? values[''] : values[unit];\n if (j === undefined) {\n if (unitStatic !== undefined && unit !== unitStatic) {\n throw { type: 'Argument', message: 'incompatible types' };\n }\n values[unit] = order.length;\n order.push(current);\n continue;\n }\n referenceUnified = order[j].unit.toString() === '' && unitClone !== undefined ? new Dimension(order[j].value, unitClone).unify() : order[j].unify();\n if ( isMin && currentUnified.value < referenceUnified.value ||\n !isMin && currentUnified.value > referenceUnified.value) {\n order[j] = current;\n }\n }\n if (order.length == 1) {\n return order[0];\n }\n args = order.map(function (a) { return a.toCSS(this.context); }).join(this.context.compress ? ',' : ', ');\n return new Anonymous(`${isMin ? 'min' : 'max'}(${args})`);\n};\n\nexport default {\n min: function(...args) {\n return minMax(true, args);\n },\n max: function(...args) {\n return minMax(false, args);\n },\n convert: function (val, unit) {\n return val.convertTo(unit.value);\n },\n pi: function () {\n return new Dimension(Math.PI);\n },\n mod: function(a, b) {\n return new Dimension(a.value % b.value, a.unit);\n },\n pow: function(x, y) {\n if (typeof x === 'number' && typeof y === 'number') {\n x = new Dimension(x);\n y = new Dimension(y);\n } else if (!(x instanceof Dimension) || !(y instanceof Dimension)) {\n throw { type: 'Argument', message: 'arguments must be numbers' };\n }\n\n return new Dimension(Math.pow(x.value, y.value), x.unit);\n },\n percentage: function (n) {\n const result = mathHelper(num => num * 100, '%', n);\n\n return result;\n }\n};\n","/**\n * Plugin Manager\n */\nclass PluginManager {\n constructor(less) {\n this.less = less;\n this.visitors = [];\n this.preProcessors = [];\n this.postProcessors = [];\n this.installedPlugins = [];\n this.fileManagers = [];\n this.iterator = -1;\n this.pluginCache = {};\n this.Loader = new less.PluginLoader(less);\n }\n\n /**\n * Adds all the plugins in the array\n * @param {Array} plugins\n */\n addPlugins(plugins) {\n if (plugins) {\n for (let i = 0; i < plugins.length; i++) {\n this.addPlugin(plugins[i]);\n }\n }\n }\n\n /**\n *\n * @param plugin\n * @param {String} filename\n */\n addPlugin(plugin, filename, functionRegistry) {\n this.installedPlugins.push(plugin);\n if (filename) {\n this.pluginCache[filename] = plugin;\n }\n if (plugin.install) {\n plugin.install(this.less, this, functionRegistry || this.less.functions.functionRegistry);\n }\n }\n\n /**\n *\n * @param filename\n */\n get(filename) {\n return this.pluginCache[filename];\n }\n\n /**\n * Adds a visitor. The visitor object has options on itself to determine\n * when it should run.\n * @param visitor\n */\n addVisitor(visitor) {\n this.visitors.push(visitor);\n }\n\n /**\n * Adds a pre processor object\n * @param {object} preProcessor\n * @param {number} priority - guidelines 1 = before import, 1000 = import, 2000 = after import\n */\n addPreProcessor(preProcessor, priority) {\n let indexToInsertAt;\n for (indexToInsertAt = 0; indexToInsertAt < this.preProcessors.length; indexToInsertAt++) {\n if (this.preProcessors[indexToInsertAt].priority >= priority) {\n break;\n }\n }\n this.preProcessors.splice(indexToInsertAt, 0, {preProcessor, priority});\n }\n\n /**\n * Adds a post processor object\n * @param {object} postProcessor\n * @param {number} priority - guidelines 1 = before compression, 1000 = compression, 2000 = after compression\n */\n addPostProcessor(postProcessor, priority) {\n let indexToInsertAt;\n for (indexToInsertAt = 0; indexToInsertAt < this.postProcessors.length; indexToInsertAt++) {\n if (this.postProcessors[indexToInsertAt].priority >= priority) {\n break;\n }\n }\n this.postProcessors.splice(indexToInsertAt, 0, {postProcessor, priority});\n }\n\n /**\n *\n * @param manager\n */\n addFileManager(manager) {\n this.fileManagers.push(manager);\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getPreProcessors() {\n const preProcessors = [];\n for (let i = 0; i < this.preProcessors.length; i++) {\n preProcessors.push(this.preProcessors[i].preProcessor);\n }\n return preProcessors;\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getPostProcessors() {\n const postProcessors = [];\n for (let i = 0; i < this.postProcessors.length; i++) {\n postProcessors.push(this.postProcessors[i].postProcessor);\n }\n return postProcessors;\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getVisitors() {\n return this.visitors;\n }\n\n visitor() {\n const self = this;\n return {\n first: function() {\n self.iterator = -1;\n return self.visitors[self.iterator];\n },\n get: function() {\n self.iterator += 1;\n return self.visitors[self.iterator];\n }\n };\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getFileManagers() {\n return this.fileManagers;\n }\n}\n\nlet pm;\n\nfunction PluginManagerFactory(less, newFactory) {\n if (newFactory || !pm) {\n pm = new PluginManager(less);\n }\n return pm;\n};\n\n//\nexport default PluginManagerFactory;\n","import Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport JavaScript from '../tree/javascript';\n\nexport default {\n e: function (str) {\n return new Quoted('\"', str instanceof JavaScript ? str.evaluated : str.value, true);\n },\n escape: function (str) {\n return new Anonymous(\n encodeURI(str.value).replace(/=/g, '%3D').replace(/:/g, '%3A').replace(/#/g, '%23').replace(/;/g, '%3B')\n .replace(/\\(/g, '%28').replace(/\\)/g, '%29'));\n },\n replace: function (string, pattern, replacement, flags) {\n let result = string.value;\n replacement = (replacement.type === 'Quoted') ?\n replacement.value : replacement.toCSS();\n result = result.replace(new RegExp(pattern.value, flags ? flags.value : ''), replacement);\n return new Quoted(string.quote || '', result, string.escaped);\n },\n '%': function (string /* arg, arg, ... */) {\n const args = Array.prototype.slice.call(arguments, 1);\n let result = string.value;\n\n for (let i = 0; i < args.length; i++) {\n /* jshint loopfunc:true */\n result = result.replace(/%[sda]/i, token => {\n const value = ((args[i].type === 'Quoted') &&\n token.match(/s/i)) ? args[i].value : args[i].toCSS();\n return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value;\n });\n }\n result = result.replace(/%%/g, '%');\n return new Quoted(string.quote || '', result, string.escaped);\n }\n};\n","import Keyword from '../tree/keyword';\nimport DetachedRuleset from '../tree/detached-ruleset';\nimport Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport URL from '../tree/url';\nimport Operation from '../tree/operation';\n\nconst isa = (n, Type) => (n instanceof Type) ? Keyword.True : Keyword.False;\nconst isunit = (n, unit) => {\n if (unit === undefined) {\n throw { type: 'Argument', message: 'missing the required second argument to isunit.' };\n }\n unit = typeof unit.value === 'string' ? unit.value : unit;\n if (typeof unit !== 'string') {\n throw { type: 'Argument', message: 'Second argument to isunit should be a unit or a string.' };\n }\n return (n instanceof Dimension) && n.unit.is(unit) ? Keyword.True : Keyword.False;\n};\n\nexport default {\n isruleset: function (n) {\n return isa(n, DetachedRuleset);\n },\n iscolor: function (n) {\n return isa(n, Color);\n },\n isnumber: function (n) {\n return isa(n, Dimension);\n },\n isstring: function (n) {\n return isa(n, Quoted);\n },\n iskeyword: function (n) {\n return isa(n, Keyword);\n },\n isurl: function (n) {\n return isa(n, URL);\n },\n ispixel: function (n) {\n return isunit(n, 'px');\n },\n ispercentage: function (n) {\n return isunit(n, '%');\n },\n isem: function (n) {\n return isunit(n, 'em');\n },\n isunit,\n unit: function (val, unit) {\n if (!(val instanceof Dimension)) {\n throw { type: 'Argument',\n message: `the first argument to unit must be a number${val instanceof Operation ? '. Have you forgotten parenthesis?' : ''}` };\n }\n if (unit) {\n if (unit instanceof Keyword) {\n unit = unit.value;\n } else {\n unit = unit.toCSS();\n }\n } else {\n unit = '';\n }\n return new Dimension(val.value, unit);\n },\n 'get-unit': function (n) {\n return new Anonymous(n.unit);\n }\n};\n","import functionRegistry from './function-registry';\nimport functionCaller from './function-caller';\n\nimport boolean from './boolean';\nimport defaultFunc from './default';\nimport color from './color';\nimport colorBlending from './color-blending';\nimport dataUri from './data-uri';\nimport list from './list';\nimport math from './math';\nimport number from './number';\nimport string from './string';\nimport svg from './svg';\nimport types from './types';\n\nexport default environment => {\n const functions = { functionRegistry, functionCaller };\n\n // register functions\n functionRegistry.addMultiple(boolean);\n functionRegistry.add('default', defaultFunc.eval.bind(defaultFunc));\n functionRegistry.addMultiple(color);\n functionRegistry.addMultiple(colorBlending);\n functionRegistry.addMultiple(dataUri(environment));\n functionRegistry.addMultiple(list);\n functionRegistry.addMultiple(math);\n functionRegistry.addMultiple(number);\n functionRegistry.addMultiple(string);\n functionRegistry.addMultiple(svg(environment));\n functionRegistry.addMultiple(types);\n\n return functions;\n};\n","import Quoted from '../tree/quoted';\nimport URL from '../tree/url';\nimport * as utils from '../utils';\nimport logger from '../logger';\n\nexport default environment => {\n \n const fallback = (functionThis, node) => new URL(node, functionThis.index, functionThis.currentFileInfo).eval(functionThis.context); \n\n return { 'data-uri': function(mimetypeNode, filePathNode) {\n\n if (!filePathNode) {\n filePathNode = mimetypeNode;\n mimetypeNode = null;\n }\n\n let mimetype = mimetypeNode && mimetypeNode.value;\n let filePath = filePathNode.value;\n const currentFileInfo = this.currentFileInfo;\n const currentDirectory = currentFileInfo.rewriteUrls ?\n currentFileInfo.currentDirectory : currentFileInfo.entryPath;\n\n const fragmentStart = filePath.indexOf('#');\n let fragment = '';\n if (fragmentStart !== -1) {\n fragment = filePath.slice(fragmentStart);\n filePath = filePath.slice(0, fragmentStart);\n }\n const context = utils.clone(this.context);\n context.rawBuffer = true;\n\n const fileManager = environment.getFileManager(filePath, currentDirectory, context, environment, true);\n\n if (!fileManager) {\n return fallback(this, filePathNode);\n }\n\n let useBase64 = false;\n\n // detect the mimetype if not given\n if (!mimetypeNode) {\n\n mimetype = environment.mimeLookup(filePath);\n\n if (mimetype === 'image/svg+xml') {\n useBase64 = false;\n } else {\n // use base 64 unless it's an ASCII or UTF-8 format\n const charset = environment.charsetLookup(mimetype);\n useBase64 = ['US-ASCII', 'UTF-8'].indexOf(charset) < 0;\n }\n if (useBase64) { mimetype += ';base64'; }\n }\n else {\n useBase64 = /;base64$/.test(mimetype);\n }\n\n const fileSync = fileManager.loadFileSync(filePath, currentDirectory, context, environment);\n if (!fileSync.contents) {\n logger.warn(`Skipped data-uri embedding of ${filePath} because file not found`);\n return fallback(this, filePathNode || mimetypeNode);\n }\n let buf = fileSync.contents;\n if (useBase64 && !environment.encodeBase64) {\n return fallback(this, filePathNode);\n }\n\n buf = useBase64 ? environment.encodeBase64(buf) : encodeURIComponent(buf);\n\n const uri = `data:${mimetype},${buf}${fragment}`;\n\n return new URL(new Quoted(`\"${uri}\"`, uri, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n }};\n};\n","import Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Expression from '../tree/expression';\nimport Quoted from '../tree/quoted';\nimport URL from '../tree/url';\n\nexport default environment => {\n return { 'svg-gradient': function(direction) {\n let stops;\n let gradientDirectionSvg;\n let gradientType = 'linear';\n let rectangleDimension = 'x=\"0\" y=\"0\" width=\"1\" height=\"1\"';\n const renderEnv = {compress: false};\n let returner;\n const directionValue = direction.toCSS(renderEnv);\n let i;\n let color;\n let position;\n let positionValue;\n let alpha;\n\n function throwArgumentDescriptor() {\n throw { type: 'Argument',\n message: 'svg-gradient expects direction, start_color [start_position], [color position,]...,' +\n ' end_color [end_position] or direction, color list' };\n }\n\n if (arguments.length == 2) {\n if (arguments[1].value.length < 2) {\n throwArgumentDescriptor();\n }\n stops = arguments[1].value;\n } else if (arguments.length < 3) {\n throwArgumentDescriptor();\n } else {\n stops = Array.prototype.slice.call(arguments, 1);\n }\n\n switch (directionValue) {\n case 'to bottom':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\"';\n break;\n case 'to right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'to bottom right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\"';\n break;\n case 'to top right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"100%\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'ellipse':\n case 'ellipse at center':\n gradientType = 'radial';\n gradientDirectionSvg = 'cx=\"50%\" cy=\"50%\" r=\"75%\"';\n rectangleDimension = 'x=\"-50\" y=\"-50\" width=\"101\" height=\"101\"';\n break;\n default:\n throw { type: 'Argument', message: 'svg-gradient direction must be \\'to bottom\\', \\'to right\\',' +\n ' \\'to bottom right\\', \\'to top right\\' or \\'ellipse at center\\'' };\n }\n returner = `<${gradientType}Gradient id=\"g\" ${gradientDirectionSvg}>`;\n\n for (i = 0; i < stops.length; i += 1) {\n if (stops[i] instanceof Expression) {\n color = stops[i].value[0];\n position = stops[i].value[1];\n } else {\n color = stops[i];\n position = undefined;\n }\n\n if (!(color instanceof Color) || (!((i === 0 || i + 1 === stops.length) && position === undefined) && !(position instanceof Dimension))) {\n throwArgumentDescriptor();\n }\n positionValue = position ? position.toCSS(renderEnv) : i === 0 ? '0%' : '100%';\n alpha = color.alpha;\n returner += ``;\n }\n returner += ``;\n\n returner = encodeURIComponent(returner);\n\n returner = `data:image/svg+xml,${returner}`;\n return new URL(new Quoted(`'${returner}'`, returner, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n }};\n};\n","import contexts from './contexts';\nimport visitor from './visitors';\nimport tree from './tree';\n\nexport default (root, options = {}) => {\n let evaldRoot;\n let variables = options.variables;\n const evalEnv = new contexts.Eval(options);\n\n //\n // Allows setting variables with a hash, so:\n //\n // `{ color: new tree.Color('#f01') }` will become:\n //\n // new tree.Declaration('@color',\n // new tree.Value([\n // new tree.Expression([\n // new tree.Color('#f01')\n // ])\n // ])\n // )\n //\n if (typeof variables === 'object' && !Array.isArray(variables)) {\n variables = Object.keys(variables).map(k => {\n let value = variables[k];\n\n if (!(value instanceof tree.Value)) {\n if (!(value instanceof tree.Expression)) {\n value = new tree.Expression([value]);\n }\n value = new tree.Value([value]);\n }\n return new tree.Declaration(`@${k}`, value, false, null, 0);\n });\n evalEnv.frames = [new tree.Ruleset(null, variables)];\n }\n\n const visitors = [\n new visitor.JoinSelectorVisitor(),\n new visitor.MarkVisibleSelectorsVisitor(true),\n new visitor.ExtendVisitor(),\n new visitor.ToCSSVisitor({compress: Boolean(options.compress)})\n ];\n\n const preEvalVisitors = [];\n let v;\n let visitorIterator;\n\n /**\n * first() / get() allows visitors to be added while visiting\n * \n * @todo Add scoping for visitors just like functions for @plugin; right now they're global\n */\n if (options.pluginManager) {\n visitorIterator = options.pluginManager.visitor();\n for (var i = 0; i < 2; i++) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (v.isPreEvalVisitor) {\n if (i === 0 || preEvalVisitors.indexOf(v) === -1) {\n preEvalVisitors.push(v);\n v.run(root);\n }\n }\n else {\n if (i === 0 || visitors.indexOf(v) === -1) {\n if (v.isPreVisitor) {\n visitors.unshift(v);\n }\n else {\n visitors.push(v);\n }\n }\n }\n }\n }\n }\n\n evaldRoot = root.eval(evalEnv);\n\n for (var i = 0; i < visitors.length; i++) {\n visitors[i].run(evaldRoot);\n }\n\n // Run any remaining visitors added after eval pass\n if (options.pluginManager) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (visitors.indexOf(v) === -1 && preEvalVisitors.indexOf(v) === -1) {\n v.run(evaldRoot);\n }\n }\n }\n\n return evaldRoot;\n};\n","/* global window, XMLHttpRequest */\n\nimport AbstractFileManager from '../less/environment/abstract-file-manager.js';\n\nlet options;\nlet logger;\nlet fileCache = {};\n\n// TODOS - move log somewhere. pathDiff and doing something similar in node. use pathDiff in the other browser file for the initial load\nclass FileManager extends AbstractFileManager {\n alwaysMakePathsAbsolute() {\n return true;\n }\n\n join(basePath, laterPath) {\n if (!basePath) {\n return laterPath;\n }\n return this.extractUrlParts(laterPath, basePath).path;\n }\n\n doXHR(url, type, callback, errback) {\n const xhr = new XMLHttpRequest();\n const async = options.isFileProtocol ? options.fileAsync : true;\n\n if (typeof xhr.overrideMimeType === 'function') {\n xhr.overrideMimeType('text/css');\n }\n logger.debug(`XHR: Getting '${url}'`);\n xhr.open('GET', url, async);\n xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5');\n xhr.send(null);\n\n function handleResponse(xhr, callback, errback) {\n if (xhr.status >= 200 && xhr.status < 300) {\n callback(xhr.responseText,\n xhr.getResponseHeader('Last-Modified'));\n } else if (typeof errback === 'function') {\n errback(xhr.status, url);\n }\n }\n\n if (options.isFileProtocol && !options.fileAsync) {\n if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) {\n callback(xhr.responseText);\n } else {\n errback(xhr.status, url);\n }\n } else if (async) {\n xhr.onreadystatechange = () => {\n if (xhr.readyState == 4) {\n handleResponse(xhr, callback, errback);\n }\n };\n } else {\n handleResponse(xhr, callback, errback);\n }\n }\n\n supports() {\n return true;\n }\n\n clearFileCache() {\n fileCache = {};\n }\n\n loadFile(filename, currentDirectory, options, environment) {\n // TODO: Add prefix support like less-node?\n // What about multiple paths?\n\n if (currentDirectory && !this.isPathAbsolute(filename)) {\n filename = currentDirectory + filename;\n }\n\n filename = options.ext ? this.tryAppendExtension(filename, options.ext) : filename;\n\n options = options || {};\n\n // sheet may be set to the stylesheet for the initial load or a collection of properties including\n // some context variables for imports\n const hrefParts = this.extractUrlParts(filename, window.location.href);\n const href = hrefParts.url;\n const self = this;\n \n return new Promise((resolve, reject) => {\n if (options.useFileCache && fileCache[href]) {\n try {\n const lessText = fileCache[href];\n return resolve({ contents: lessText, filename: href, webInfo: { lastModified: new Date() }});\n } catch (e) {\n return reject({ filename: href, message: `Error loading file ${href} error was ${e.message}` });\n }\n }\n\n self.doXHR(href, options.mime, function doXHRCallback(data, lastModified) {\n // per file cache\n fileCache[href] = data;\n\n // Use remote copy (re-parse)\n resolve({ contents: data, filename: href, webInfo: { lastModified }});\n }, function doXHRError(status, url) {\n reject({ type: 'File', message: `'${url}' wasn't found (${status})`, href });\n });\n });\n }\n}\n\nexport default (opts, log) => {\n options = opts;\n logger = log;\n return FileManager;\n}\n","import data from './data';\nimport tree from './tree';\nimport Environment from './environment/environment';\nimport AbstractFileManager from './environment/abstract-file-manager';\nimport AbstractPluginLoader from './environment/abstract-plugin-loader';\nimport visitors from './visitors';\nimport Parser from './parser/parser';\nimport Functions from './functions';\nimport contexts from './contexts';\nimport sourceMapOutput from './source-map-output';\nimport sourceMapBuilder from './source-map-builder';\nimport parseTree from './parse-tree';\nimport importManager from './import-manager';\nimport Render from './render';\nimport Parse from './parse';\nimport LessError from './less-error';\nimport transformTree from './transform-tree';\nimport * as utils from './utils';\nimport PluginManager from './plugin-manager';\nimport logger from './logger';\n\nexport default (environment, fileManagers) => {\n /**\n * @todo\n * This original code could be improved quite a bit.\n * Many classes / modules currently add side-effects / mutations to passed in objects,\n * which makes it hard to refactor and reason about. \n */\n environment = new Environment(environment, fileManagers);\n\n const SourceMapOutput = sourceMapOutput(environment);\n const SourceMapBuilder = sourceMapBuilder(SourceMapOutput, environment);\n const ParseTree = parseTree(SourceMapBuilder);\n const ImportManager = importManager(environment);\n const render = Render(environment, ParseTree, ImportManager);\n const parse = Parse(environment, ParseTree, ImportManager);\n const functions = Functions(environment);\n\n /**\n * @todo\n * This root properties / methods need to be organized.\n * It's not clear what should / must be public and why.\n */\n const initial = {\n version: [3, 12, 2],\n data,\n tree,\n Environment,\n AbstractFileManager,\n AbstractPluginLoader,\n environment,\n visitors,\n Parser,\n functions,\n contexts,\n SourceMapOutput,\n SourceMapBuilder,\n ParseTree,\n ImportManager,\n render,\n parse,\n LessError,\n transformTree,\n utils,\n PluginManager,\n logger\n };\n\n // Create a public API\n const ctor = t => function (...args) {\n return new t(...args);\n };\n\n let t;\n const api = Object.create(initial);\n for (const n in initial.tree) {\n /* eslint guard-for-in: 0 */\n t = initial.tree[n];\n if (typeof t === 'function') {\n api[n.toLowerCase()] = ctor(t);\n }\n else {\n api[n] = Object.create(null);\n for (const o in t) {\n /* eslint guard-for-in: 0 */\n api[n][o.toLowerCase()] = ctor(t[o]);\n }\n }\n }\n\n /**\n * Some of the functions assume a `this` context of the API object,\n * which causes it to fail when wrapped for ES6 imports.\n * \n * An assumed `this` should be removed in the future.\n */\n initial.parse = initial.parse.bind(api);\n initial.render = initial.render.bind(api);\n\n return api;\n};\n","export default environment => {\n class SourceMapOutput {\n constructor(options) {\n this._css = [];\n this._rootNode = options.rootNode;\n this._contentsMap = options.contentsMap;\n this._contentsIgnoredCharsMap = options.contentsIgnoredCharsMap;\n if (options.sourceMapFilename) {\n this._sourceMapFilename = options.sourceMapFilename.replace(/\\\\/g, '/');\n }\n this._outputFilename = options.outputFilename;\n this.sourceMapURL = options.sourceMapURL;\n if (options.sourceMapBasepath) {\n this._sourceMapBasepath = options.sourceMapBasepath.replace(/\\\\/g, '/');\n }\n if (options.sourceMapRootpath) {\n this._sourceMapRootpath = options.sourceMapRootpath.replace(/\\\\/g, '/');\n if (this._sourceMapRootpath.charAt(this._sourceMapRootpath.length - 1) !== '/') {\n this._sourceMapRootpath += '/';\n }\n } else {\n this._sourceMapRootpath = '';\n }\n this._outputSourceFiles = options.outputSourceFiles;\n this._sourceMapGeneratorConstructor = environment.getSourceMapGenerator();\n\n this._lineNumber = 0;\n this._column = 0;\n }\n\n removeBasepath(path) {\n if (this._sourceMapBasepath && path.indexOf(this._sourceMapBasepath) === 0) {\n path = path.substring(this._sourceMapBasepath.length);\n if (path.charAt(0) === '\\\\' || path.charAt(0) === '/') {\n path = path.substring(1);\n }\n }\n\n return path;\n }\n\n normalizeFilename(filename) {\n filename = filename.replace(/\\\\/g, '/');\n filename = this.removeBasepath(filename);\n return (this._sourceMapRootpath || '') + filename;\n }\n\n add(chunk, fileInfo, index, mapLines) {\n // ignore adding empty strings\n if (!chunk) {\n return;\n }\n\n let lines;\n let sourceLines;\n let columns;\n let sourceColumns;\n let i;\n\n if (fileInfo && fileInfo.filename) {\n let inputSource = this._contentsMap[fileInfo.filename];\n\n // remove vars/banner added to the top of the file\n if (this._contentsIgnoredCharsMap[fileInfo.filename]) {\n // adjust the index\n index -= this._contentsIgnoredCharsMap[fileInfo.filename];\n if (index < 0) { index = 0; }\n // adjust the source\n inputSource = inputSource.slice(this._contentsIgnoredCharsMap[fileInfo.filename]);\n }\n\n // ignore empty content\n if (inputSource === undefined) {\n return;\n }\n\n inputSource = inputSource.substring(0, index);\n sourceLines = inputSource.split('\\n');\n sourceColumns = sourceLines[sourceLines.length - 1];\n }\n\n lines = chunk.split('\\n');\n columns = lines[lines.length - 1];\n\n if (fileInfo && fileInfo.filename) {\n if (!mapLines) {\n this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + 1, column: this._column},\n original: { line: sourceLines.length, column: sourceColumns.length},\n source: this.normalizeFilename(fileInfo.filename)});\n } else {\n for (i = 0; i < lines.length; i++) {\n this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + i + 1, column: i === 0 ? this._column : 0},\n original: { line: sourceLines.length + i, column: i === 0 ? sourceColumns.length : 0},\n source: this.normalizeFilename(fileInfo.filename)});\n }\n }\n }\n\n if (lines.length === 1) {\n this._column += columns.length;\n } else {\n this._lineNumber += lines.length - 1;\n this._column = columns.length;\n }\n\n this._css.push(chunk);\n }\n\n isEmpty() {\n return this._css.length === 0;\n }\n\n toCSS(context) {\n this._sourceMapGenerator = new this._sourceMapGeneratorConstructor({ file: this._outputFilename, sourceRoot: null });\n\n if (this._outputSourceFiles) {\n for (const filename in this._contentsMap) {\n if (this._contentsMap.hasOwnProperty(filename)) {\n let source = this._contentsMap[filename];\n if (this._contentsIgnoredCharsMap[filename]) {\n source = source.slice(this._contentsIgnoredCharsMap[filename]);\n }\n this._sourceMapGenerator.setSourceContent(this.normalizeFilename(filename), source);\n }\n }\n }\n\n this._rootNode.genCSS(context, this);\n\n if (this._css.length > 0) {\n let sourceMapURL;\n const sourceMapContent = JSON.stringify(this._sourceMapGenerator.toJSON());\n\n if (this.sourceMapURL) {\n sourceMapURL = this.sourceMapURL;\n } else if (this._sourceMapFilename) {\n sourceMapURL = this._sourceMapFilename;\n }\n this.sourceMapURL = sourceMapURL;\n\n this.sourceMap = sourceMapContent;\n }\n\n return this._css.join('');\n }\n }\n\n return SourceMapOutput;\n};\n","export default (SourceMapOutput, environment) => {\n class SourceMapBuilder {\n constructor(options) {\n this.options = options;\n }\n\n toCSS(rootNode, options, imports) {\n const sourceMapOutput = new SourceMapOutput(\n {\n contentsIgnoredCharsMap: imports.contentsIgnoredChars,\n rootNode,\n contentsMap: imports.contents,\n sourceMapFilename: this.options.sourceMapFilename,\n sourceMapURL: this.options.sourceMapURL,\n outputFilename: this.options.sourceMapOutputFilename,\n sourceMapBasepath: this.options.sourceMapBasepath,\n sourceMapRootpath: this.options.sourceMapRootpath,\n outputSourceFiles: this.options.outputSourceFiles,\n sourceMapGenerator: this.options.sourceMapGenerator,\n sourceMapFileInline: this.options.sourceMapFileInline, \n disableSourcemapAnnotation: this.options.disableSourcemapAnnotation\n });\n\n const css = sourceMapOutput.toCSS(options);\n this.sourceMap = sourceMapOutput.sourceMap;\n this.sourceMapURL = sourceMapOutput.sourceMapURL;\n if (this.options.sourceMapInputFilename) {\n this.sourceMapInputFilename = sourceMapOutput.normalizeFilename(this.options.sourceMapInputFilename);\n }\n if (this.options.sourceMapBasepath !== undefined && this.sourceMapURL !== undefined) {\n this.sourceMapURL = sourceMapOutput.removeBasepath(this.sourceMapURL);\n }\n return css + this.getCSSAppendage();\n }\n\n getCSSAppendage() {\n\n let sourceMapURL = this.sourceMapURL;\n if (this.options.sourceMapFileInline) {\n if (this.sourceMap === undefined) {\n return '';\n }\n sourceMapURL = `data:application/json;base64,${environment.encodeBase64(this.sourceMap)}`;\n }\n\n if (this.options.disableSourcemapAnnotation) {\n return '';\n }\n\n if (sourceMapURL) {\n return `/*# sourceMappingURL=${sourceMapURL} */`;\n }\n return '';\n }\n\n getExternalSourceMap() {\n return this.sourceMap;\n }\n\n setExternalSourceMap(sourceMap) {\n this.sourceMap = sourceMap;\n }\n\n isInline() {\n return this.options.sourceMapFileInline;\n }\n\n getSourceMapURL() {\n return this.sourceMapURL;\n }\n\n getOutputFilename() {\n return this.options.sourceMapOutputFilename;\n }\n\n getInputFilename() {\n return this.sourceMapInputFilename;\n }\n }\n\n return SourceMapBuilder;\n};\n","import LessError from './less-error';\nimport transformTree from './transform-tree';\nimport logger from './logger';\n\nexport default SourceMapBuilder => {\n class ParseTree {\n constructor(root, imports) {\n this.root = root;\n this.imports = imports;\n }\n\n toCSS(options) {\n let evaldRoot;\n const result = {};\n let sourceMapBuilder;\n try {\n evaldRoot = transformTree(this.root, options);\n } catch (e) {\n throw new LessError(e, this.imports);\n }\n\n try {\n const compress = Boolean(options.compress);\n if (compress) {\n logger.warn('The compress option has been deprecated. ' + \n 'We recommend you use a dedicated css minifier, for instance see less-plugin-clean-css.');\n }\n\n const toCSSOptions = {\n compress,\n dumpLineNumbers: options.dumpLineNumbers,\n strictUnits: Boolean(options.strictUnits),\n numPrecision: 8};\n\n if (options.sourceMap) {\n sourceMapBuilder = new SourceMapBuilder(options.sourceMap);\n result.css = sourceMapBuilder.toCSS(evaldRoot, toCSSOptions, this.imports);\n } else {\n result.css = evaldRoot.toCSS(toCSSOptions);\n }\n } catch (e) {\n throw new LessError(e, this.imports);\n }\n\n if (options.pluginManager) {\n const postProcessors = options.pluginManager.getPostProcessors();\n for (let i = 0; i < postProcessors.length; i++) {\n result.css = postProcessors[i].process(result.css, { sourceMap: sourceMapBuilder, options, imports: this.imports });\n }\n }\n if (options.sourceMap) {\n result.map = sourceMapBuilder.getExternalSourceMap();\n }\n\n const rootFilename = this.imports.rootFilename\n result.imports = this.imports.files.filter(file => file !== rootFilename);\n return result;\n }\n }\n\n return ParseTree;\n};\n","import contexts from './contexts';\nimport Parser from './parser/parser';\nimport LessError from './less-error';\nimport * as utils from './utils';\nimport logger from './logger';\n\nexport default environment => {\n // FileInfo = {\n // 'rewriteUrls' - option - whether to adjust URL's to be relative\n // 'filename' - full resolved filename of current file\n // 'rootpath' - path to append to normal URLs for this node\n // 'currentDirectory' - path to the current file, absolute\n // 'rootFilename' - filename of the base file\n // 'entryPath' - absolute path to the entry file\n // 'reference' - whether the file should not be output and only output parts that are referenced\n\n class ImportManager {\n constructor(less, context, rootFileInfo) {\n this.less = less;\n this.rootFilename = rootFileInfo.filename;\n this.paths = context.paths || []; // Search paths, when importing\n this.contents = {}; // map - filename to contents of all the files\n this.contentsIgnoredChars = {}; // map - filename to lines at the beginning of each file to ignore\n this.mime = context.mime;\n this.error = null;\n this.context = context;\n // Deprecated? Unused outside of here, could be useful.\n this.queue = []; // Files which haven't been imported yet\n this.files = []; // List of files imported\n }\n\n /**\n * Add an import to be imported\n * @param path - the raw path\n * @param tryAppendExtension - whether to try appending a file extension (.less or .js if the path has no extension)\n * @param currentFileInfo - the current file info (used for instance to work out relative paths)\n * @param importOptions - import options\n * @param callback - callback for when it is imported\n */\n push(path, tryAppendExtension, currentFileInfo, importOptions, callback) {\n const importManager = this;\n const pluginLoader = this.context.pluginManager.Loader;\n\n this.queue.push(path);\n\n const fileParsedFunc = (e, root, fullPath) => {\n importManager.queue.splice(importManager.queue.indexOf(path), 1); // Remove the path from the queue\n\n const importedEqualsRoot = fullPath === importManager.rootFilename;\n if (importOptions.optional && e) {\n callback(null, {rules:[]}, false, null);\n logger.info(`The file ${fullPath} was skipped because it was not found and the import was marked optional.`);\n }\n else {\n const files = importManager.files\n if (files.indexOf(fullPath) === -1) {\n files.push(fullPath)\n }\n if (e && !importManager.error) { importManager.error = e; }\n callback(e, root, importedEqualsRoot, fullPath);\n }\n };\n\n const newFileInfo = {\n rewriteUrls: this.context.rewriteUrls,\n entryPath: currentFileInfo.entryPath,\n rootpath: currentFileInfo.rootpath,\n rootFilename: currentFileInfo.rootFilename\n };\n\n const fileManager = environment.getFileManager(path, currentFileInfo.currentDirectory, this.context, environment);\n\n if (!fileManager) {\n fileParsedFunc({ message: `Could not find a file-manager for ${path}` });\n return;\n }\n\n const loadFileCallback = loadedFile => {\n let plugin;\n const resolvedFilename = loadedFile.filename;\n const contents = loadedFile.contents.replace(/^\\uFEFF/, '');\n\n // Pass on an updated rootpath if path of imported file is relative and file\n // is in a (sub|sup) directory\n //\n // Examples:\n // - If path of imported file is 'module/nav/nav.less' and rootpath is 'less/',\n // then rootpath should become 'less/module/nav/'\n // - If path of imported file is '../mixins.less' and rootpath is 'less/',\n // then rootpath should become 'less/../'\n newFileInfo.currentDirectory = fileManager.getPath(resolvedFilename);\n if (newFileInfo.rewriteUrls) {\n newFileInfo.rootpath = fileManager.join(\n (importManager.context.rootpath || ''),\n fileManager.pathDiff(newFileInfo.currentDirectory, newFileInfo.entryPath));\n\n if (!fileManager.isPathAbsolute(newFileInfo.rootpath) && fileManager.alwaysMakePathsAbsolute()) {\n newFileInfo.rootpath = fileManager.join(newFileInfo.entryPath, newFileInfo.rootpath);\n }\n }\n newFileInfo.filename = resolvedFilename;\n\n const newEnv = new contexts.Parse(importManager.context);\n\n newEnv.processImports = false;\n importManager.contents[resolvedFilename] = contents;\n\n if (currentFileInfo.reference || importOptions.reference) {\n newFileInfo.reference = true;\n }\n\n if (importOptions.isPlugin) {\n plugin = pluginLoader.evalPlugin(contents, newEnv, importManager, importOptions.pluginArgs, newFileInfo);\n if (plugin instanceof LessError) {\n fileParsedFunc(plugin, null, resolvedFilename);\n }\n else {\n fileParsedFunc(null, plugin, resolvedFilename);\n }\n } else if (importOptions.inline) {\n fileParsedFunc(null, contents, resolvedFilename);\n } else {\n new Parser(newEnv, importManager, newFileInfo).parse(contents, (e, root) => {\n fileParsedFunc(e, root, resolvedFilename);\n });\n }\n };\n let loadedFile;\n let promise;\n const context = utils.clone(this.context);\n\n if (tryAppendExtension) {\n context.ext = importOptions.isPlugin ? '.js' : '.less';\n }\n\n if (importOptions.isPlugin) {\n context.mime = 'application/javascript';\n\n if (context.syncImport) {\n loadedFile = pluginLoader.loadPluginSync(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n } else {\n promise = pluginLoader.loadPlugin(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n }\n }\n else {\n if (context.syncImport) {\n loadedFile = fileManager.loadFileSync(path, currentFileInfo.currentDirectory, context, environment);\n } else {\n promise = fileManager.loadFile(path, currentFileInfo.currentDirectory, context, environment,\n (err, loadedFile) => {\n if (err) {\n fileParsedFunc(err);\n } else {\n loadFileCallback(loadedFile);\n }\n });\n }\n }\n if (loadedFile) {\n if (!loadedFile.filename) {\n fileParsedFunc(loadedFile);\n } else {\n loadFileCallback(loadedFile);\n }\n } else if (promise) {\n promise.then(loadFileCallback, fileParsedFunc);\n }\n }\n }\n\n return ImportManager;\n};\n","let PromiseConstructor;\nimport * as utils from './utils';\n\nexport default (environment, ParseTree, ImportManager) => {\n const render = function (input, options, callback) {\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(this.options, {});\n }\n else {\n options = utils.copyOptions(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n return new Promise((resolve, reject) => {\n render.call(self, input, options, (err, output) => {\n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n this.parse(input, options, (err, root, imports, options) => {\n if (err) { return callback(err); }\n\n let result;\n try {\n const parseTree = new ParseTree(root, imports);\n result = parseTree.toCSS(options);\n }\n catch (err) { return callback(err); }\n\n callback(null, result);\n });\n }\n };\n\n return render;\n};\n","let PromiseConstructor;\nimport contexts from './contexts';\nimport Parser from './parser/parser';\nimport PluginManager from './plugin-manager';\nimport LessError from './less-error';\nimport * as utils from './utils';\n\nexport default (environment, ParseTree, ImportManager) => {\n const parse = function (input, options, callback) {\n\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(this.options, {});\n }\n else {\n options = utils.copyOptions(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n return new Promise((resolve, reject) => {\n parse.call(self, input, options, (err, output) => {\n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n let context;\n let rootFileInfo;\n const pluginManager = new PluginManager(this, !options.reUsePluginManager);\n\n options.pluginManager = pluginManager;\n\n context = new contexts.Parse(options);\n\n if (options.rootFileInfo) {\n rootFileInfo = options.rootFileInfo;\n } else {\n const filename = options.filename || 'input';\n const entryPath = filename.replace(/[^\\/\\\\]*$/, '');\n rootFileInfo = {\n filename,\n rewriteUrls: context.rewriteUrls,\n rootpath: context.rootpath || '',\n currentDirectory: entryPath,\n entryPath,\n rootFilename: filename\n };\n // add in a missing trailing slash\n if (rootFileInfo.rootpath && rootFileInfo.rootpath.slice(-1) !== '/') {\n rootFileInfo.rootpath += '/';\n }\n }\n\n const imports = new ImportManager(this, context, rootFileInfo);\n this.importManager = imports;\n\n // TODO: allow the plugins to be just a list of paths or names\n // Do an async plugin queue like lessc\n\n if (options.plugins) {\n options.plugins.forEach(plugin => {\n let evalResult;\n let contents;\n if (plugin.fileContent) {\n contents = plugin.fileContent.replace(/^\\uFEFF/, '');\n evalResult = pluginManager.Loader.evalPlugin(contents, context, imports, plugin.options, plugin.filename);\n if (evalResult instanceof LessError) {\n return callback(evalResult);\n }\n }\n else {\n pluginManager.addPlugin(plugin);\n }\n });\n }\n\n new Parser(context, imports, rootFileInfo)\n .parse(input, (e, root) => {\n if (e) { return callback(e); }\n callback(null, root, imports, options);\n }, options);\n }\n };\n return parse;\n};\n","// TODO: Add tests for browser @plugin\n/* global window */\n\nimport AbstractPluginLoader from '../less/environment/abstract-plugin-loader.js';\n\n/**\n * Browser Plugin Loader\n */\nclass PluginLoader extends AbstractPluginLoader {\n constructor(less) {\n super();\n\n this.less = less;\n // Should we shim this.require for browser? Probably not?\n }\n\n loadPlugin(filename, basePath, context, environment, fileManager) {\n return new Promise((fulfill, reject) => {\n fileManager.loadFile(filename, basePath, context, environment)\n .then(fulfill).catch(reject);\n });\n }\n}\n\nexport default PluginLoader;\n\n","import * as utils from './utils';\nimport browser from './browser';\n\nexport default (window, less, options) => {\n\n function errorHTML(e, rootHref) {\n const id = `less-error-message:${utils.extractId(rootHref || '')}`;\n const template = '
  • {content}
  • ';\n const elem = window.document.createElement('div');\n let timer;\n let content;\n const errors = [];\n const filename = e.filename || rootHref;\n const filenameNoPath = filename.match(/([^\\/]+(\\?.*)?)$/)[1];\n\n elem.id = id;\n elem.className = 'less-error-message';\n\n content = `

    ${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'}` + \n `

    in ${filenameNoPath} `;\n\n const errorline = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\{content\\}/, e.extract[i]));\n }\n };\n\n if (e.line) {\n errorline(e, 0, '');\n errorline(e, 1, 'line');\n errorline(e, 2, '');\n content += `on line ${e.line}, column ${e.column + 1}:

      ${errors.join('')}
    `;\n }\n if (e.stack && (e.extract || options.logLevel >= 4)) {\n content += `
    Stack Trace
    ${e.stack.split('\\n').slice(1).join('
    ')}`;\n }\n elem.innerHTML = content;\n\n // CSS for error messages\n browser.createCSS(window.document, [\n '.less-error-message ul, .less-error-message li {',\n 'list-style-type: none;',\n 'margin-right: 15px;',\n 'padding: 4px 0;',\n 'margin: 0;',\n '}',\n '.less-error-message label {',\n 'font-size: 12px;',\n 'margin-right: 15px;',\n 'padding: 4px 0;',\n 'color: #cc7777;',\n '}',\n '.less-error-message pre {',\n 'color: #dd6666;',\n 'padding: 4px 0;',\n 'margin: 0;',\n 'display: inline-block;',\n '}',\n '.less-error-message pre.line {',\n 'color: #ff0000;',\n '}',\n '.less-error-message h3 {',\n 'font-size: 20px;',\n 'font-weight: bold;',\n 'padding: 15px 0 5px 0;',\n 'margin: 0;',\n '}',\n '.less-error-message a {',\n 'color: #10a',\n '}',\n '.less-error-message .error {',\n 'color: red;',\n 'font-weight: bold;',\n 'padding-bottom: 2px;',\n 'border-bottom: 1px dashed red;',\n '}'\n ].join('\\n'), { title: 'error-message' });\n\n elem.style.cssText = [\n 'font-family: Arial, sans-serif',\n 'border: 1px solid #e00',\n 'background-color: #eee',\n 'border-radius: 5px',\n '-webkit-border-radius: 5px',\n '-moz-border-radius: 5px',\n 'color: #e00',\n 'padding: 15px',\n 'margin-bottom: 15px'\n ].join(';');\n\n if (options.env === 'development') {\n timer = setInterval(() => {\n const document = window.document;\n const body = document.body;\n if (body) {\n if (document.getElementById(id)) {\n body.replaceChild(elem, document.getElementById(id));\n } else {\n body.insertBefore(elem, body.firstChild);\n }\n clearInterval(timer);\n }\n }, 10);\n }\n }\n\n function removeErrorHTML(path) {\n const node = window.document.getElementById(`less-error-message:${utils.extractId(path)}`);\n if (node) {\n node.parentNode.removeChild(node);\n }\n }\n\n function removeErrorConsole(path) {\n // no action\n }\n\n function removeError(path) {\n if (!options.errorReporting || options.errorReporting === 'html') {\n removeErrorHTML(path);\n } else if (options.errorReporting === 'console') {\n removeErrorConsole(path);\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('remove', path);\n }\n }\n\n function errorConsole(e, rootHref) {\n const template = '{line} {content}';\n const filename = e.filename || rootHref;\n const errors = [];\n let content = `${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'} in ${filename}`;\n\n const errorline = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\{content\\}/, e.extract[i]));\n }\n };\n\n if (e.line) {\n errorline(e, 0, '');\n errorline(e, 1, 'line');\n errorline(e, 2, '');\n content += ` on line ${e.line}, column ${e.column + 1}:\\n${errors.join('\\n')}`;\n }\n if (e.stack && (e.extract || options.logLevel >= 4)) {\n content += `\\nStack Trace\\n${e.stack}`;\n }\n less.logger.error(content);\n }\n\n function error(e, rootHref) {\n if (!options.errorReporting || options.errorReporting === 'html') {\n errorHTML(e, rootHref);\n } else if (options.errorReporting === 'console') {\n errorConsole(e, rootHref);\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('add', e, rootHref);\n }\n }\n\n return {\n add: error,\n remove: removeError\n };\n};\n","/**\n * Kicks off less and compiles any stylesheets\n * used in the browser distributed version of less\n * to kick-start less using the browser api\n */\n/* global window, document */\n\nimport defaultOptions from '../less/default-options';\nimport addDefaultOptions from './add-default-options';\nimport root from './index';\n\nconst options = defaultOptions();\n\nif (window.less) {\n for (const key in window.less) {\n if (window.less.hasOwnProperty(key)) {\n options[key] = window.less[key];\n }\n }\n}\naddDefaultOptions(window, options);\n\noptions.plugins = options.plugins || [];\n\nif (window.LESS_PLUGINS) {\n options.plugins = options.plugins.concat(window.LESS_PLUGINS);\n}\n\nconst less = root(window, options);\nexport default less;\n\nwindow.less = less;\n\nlet css;\nlet head;\nlet style;\n\n// Always restore page visibility\nfunction resolveOrReject(data) {\n if (data.filename) {\n console.warn(data);\n }\n if (!options.async) {\n head.removeChild(style);\n }\n}\n\nif (options.onReady) {\n if (/!watch/.test(window.location.hash)) {\n less.watch();\n }\n // Simulate synchronous stylesheet loading by hiding page rendering\n if (!options.async) {\n css = 'body { display: none !important }';\n head = document.head || document.getElementsByTagName('head')[0];\n style = document.createElement('style');\n\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n\n head.appendChild(style);\n }\n less.registerStylesheetsImmediately();\n less.pageLoadFinished = less.refresh(less.env === 'development').then(resolveOrReject, resolveOrReject);\n}\n","// Export a new default each time\nexport default () => ({\n /* Inline Javascript - @plugin still allowed */\n javascriptEnabled: false,\n\n /* Outputs a makefile import dependency list to stdout. */\n depends: false,\n\n /* (DEPRECATED) Compress using less built-in compression. \n * This does an okay job but does not utilise all the tricks of \n * dedicated css compression. */\n compress: false,\n\n /* Runs the less parser and just reports errors without any output. */\n lint: false,\n\n /* Sets available include paths.\n * If the file in an @import rule does not exist at that exact location, \n * less will look for it at the location(s) passed to this option. \n * You might use this for instance to specify a path to a library which \n * you want to be referenced simply and relatively in the less files. */\n paths: [],\n\n /* color output in the terminal */\n color: true,\n\n /* The strictImports controls whether the compiler will allow an @import inside of either \n * @media blocks or (a later addition) other selector blocks.\n * See: https://github.com/less/less.js/issues/656 */\n strictImports: false,\n\n /* Allow Imports from Insecure HTTPS Hosts */\n insecure: false,\n\n /* Allows you to add a path to every generated import and url in your css. \n * This does not affect less import statements that are processed, just ones \n * that are left in the output css. */\n rootpath: '',\n\n /* By default URLs are kept as-is, so if you import a file in a sub-directory \n * that references an image, exactly the same URL will be output in the css. \n * This option allows you to re-write URL's in imported files so that the \n * URL is always relative to the base imported file */\n rewriteUrls: false,\n\n /* How to process math \n * 0 always - eagerly try to solve all operations\n * 1 parens-division - require parens for division \"/\"\n * 2 parens | strict - require parens for all operations\n * 3 strict-legacy - legacy strict behavior (super-strict)\n */\n math: 0,\n\n /* Without this option, less attempts to guess at the output unit when it does maths. */\n strictUnits: false,\n\n /* Effectively the declaration is put at the top of your base Less file, \n * meaning it can be used but it also can be overridden if this variable \n * is defined in the file. */\n globalVars: null,\n\n /* As opposed to the global variable option, this puts the declaration at the\n * end of your base file, meaning it will override anything defined in your Less file. */\n modifyVars: null,\n\n /* This option allows you to specify a argument to go on to every URL. */\n urlArgs: ''\n});","import {addDataAttr} from './utils';\nimport browser from './browser';\n\nexport default (window, options) => {\n\n // use options from the current script tag data attribues\n addDataAttr(options, browser.currentScript(window));\n\n if (options.isFileProtocol === undefined) {\n options.isFileProtocol = /^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(window.location.protocol);\n }\n\n // Load styles asynchronously (default: false)\n //\n // This is set to `false` by default, so that the body\n // doesn't start loading before the stylesheets are parsed.\n // Setting this to `true` can result in flickering.\n //\n options.async = options.async || false;\n options.fileAsync = options.fileAsync || false;\n\n // Interval between watch polls\n options.poll = options.poll || (options.isFileProtocol ? 1000 : 1500);\n\n options.env = options.env || (window.location.hostname == '127.0.0.1' ||\n window.location.hostname == '0.0.0.0' ||\n window.location.hostname == 'localhost' ||\n (window.location.port &&\n window.location.port.length > 0) ||\n options.isFileProtocol ? 'development'\n : 'production');\n\n const dumpLineNumbers = /!dumpLineNumbers:(comments|mediaquery|all)/.exec(window.location.hash);\n if (dumpLineNumbers) {\n options.dumpLineNumbers = dumpLineNumbers[1];\n }\n\n if (options.useFileCache === undefined) {\n options.useFileCache = true;\n }\n\n if (options.onReady === undefined) {\n options.onReady = true;\n }\n\n if (options.relativeUrls) {\n options.rewriteUrls = 'all';\n }\n};\n","//\n// index.js\n// Should expose the additional browser functions on to the less object\n//\nimport {addDataAttr} from './utils';\nimport lessRoot from '../less';\nimport browser from './browser';\nimport FM from './file-manager';\nimport PluginLoader from './plugin-loader';\nimport LogListener from './log-listener';\nimport ErrorReporting from './error-reporting';\nimport Cache from './cache';\nimport ImageSize from './image-size';\n\nexport default (window, options) => {\n const document = window.document;\n const less = lessRoot();\n\n less.options = options;\n const environment = less.environment;\n const FileManager = FM(options, less.logger);\n const fileManager = new FileManager();\n environment.addFileManager(fileManager);\n less.FileManager = FileManager;\n less.PluginLoader = PluginLoader;\n\n LogListener(less, options);\n const errors = ErrorReporting(window, less, options);\n const cache = less.cache = options.cache || Cache(window, options, less.logger);\n ImageSize(less.environment);\n\n // Setup user functions - Deprecate?\n if (options.functions) {\n less.functions.functionRegistry.addMultiple(options.functions);\n }\n\n const typePattern = /^text\\/(x-)?less$/;\n\n function clone(obj) {\n const cloned = {};\n for (const prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n cloned[prop] = obj[prop];\n }\n }\n return cloned;\n }\n\n // only really needed for phantom\n function bind(func, thisArg) {\n const curryArgs = Array.prototype.slice.call(arguments, 2);\n return function() {\n const args = curryArgs.concat(Array.prototype.slice.call(arguments, 0));\n return func.apply(thisArg, args);\n };\n }\n\n function loadStyles(modifyVars) {\n const styles = document.getElementsByTagName('style');\n let style;\n\n for (let i = 0; i < styles.length; i++) {\n style = styles[i];\n if (style.type.match(typePattern)) {\n const instanceOptions = clone(options);\n instanceOptions.modifyVars = modifyVars;\n const lessText = style.innerHTML || '';\n instanceOptions.filename = document.location.href.replace(/#.*$/, '');\n\n /* jshint loopfunc:true */\n // use closure to store current style\n less.render(lessText, instanceOptions,\n bind((style, e, result) => {\n if (e) {\n errors.add(e, 'inline');\n } else {\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = result.css;\n } else {\n style.innerHTML = result.css;\n }\n }\n }, null, style));\n }\n }\n }\n\n function loadStyleSheet(sheet, callback, reload, remaining, modifyVars) {\n\n const instanceOptions = clone(options);\n addDataAttr(instanceOptions, sheet);\n instanceOptions.mime = sheet.type;\n\n if (modifyVars) {\n instanceOptions.modifyVars = modifyVars;\n }\n\n function loadInitialFileCallback(loadedFile) {\n const data = loadedFile.contents;\n const path = loadedFile.filename;\n const webInfo = loadedFile.webInfo;\n\n const newFileInfo = {\n currentDirectory: fileManager.getPath(path),\n filename: path,\n rootFilename: path,\n rewriteUrls: instanceOptions.rewriteUrls\n };\n\n newFileInfo.entryPath = newFileInfo.currentDirectory;\n newFileInfo.rootpath = instanceOptions.rootpath || newFileInfo.currentDirectory;\n\n if (webInfo) {\n webInfo.remaining = remaining;\n\n const css = cache.getCSS(path, webInfo, instanceOptions.modifyVars);\n if (!reload && css) {\n webInfo.local = true;\n callback(null, css, data, sheet, webInfo, path);\n return;\n }\n\n }\n\n // TODO add tests around how this behaves when reloading\n errors.remove(path);\n\n instanceOptions.rootFileInfo = newFileInfo;\n less.render(data, instanceOptions, (e, result) => {\n if (e) {\n e.href = path;\n callback(e);\n } else {\n cache.setCSS(sheet.href, webInfo.lastModified, instanceOptions.modifyVars, result.css);\n callback(null, result.css, data, sheet, webInfo, path);\n }\n });\n }\n\n fileManager.loadFile(sheet.href, null, instanceOptions, environment)\n .then(loadedFile => {\n loadInitialFileCallback(loadedFile);\n }).catch(err => {\n console.log(err);\n callback(err);\n });\n\n }\n\n function loadStyleSheets(callback, reload, modifyVars) {\n for (let i = 0; i < less.sheets.length; i++) {\n loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1), modifyVars);\n }\n }\n\n function initRunningMode() {\n if (less.env === 'development') {\n less.watchTimer = setInterval(() => {\n if (less.watchMode) {\n fileManager.clearFileCache();\n loadStyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n } else if (css) {\n browser.createCSS(window.document, css, sheet);\n }\n });\n }\n }, options.poll);\n }\n }\n\n //\n // Watch mode\n //\n less.watch = function () {\n if (!less.watchMode ) {\n less.env = 'development';\n initRunningMode();\n }\n this.watchMode = true;\n return true;\n };\n\n less.unwatch = function () {clearInterval(less.watchTimer); this.watchMode = false; return false; };\n\n //\n // Synchronously get all tags with the 'rel' attribute set to\n // \"stylesheet/less\".\n //\n less.registerStylesheetsImmediately = () => {\n const links = document.getElementsByTagName('link');\n less.sheets = [];\n\n for (let i = 0; i < links.length; i++) {\n if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) &&\n (links[i].type.match(typePattern)))) {\n less.sheets.push(links[i]);\n }\n }\n };\n\n //\n // Asynchronously get all tags with the 'rel' attribute set to\n // \"stylesheet/less\", returning a Promise.\n //\n less.registerStylesheets = () => new Promise((resolve, reject) => {\n less.registerStylesheetsImmediately();\n resolve();\n });\n\n //\n // With this function, it's possible to alter variables and re-render\n // CSS without reloading less-files\n //\n less.modifyVars = record => less.refresh(true, record, false);\n\n less.refresh = (reload, modifyVars, clearFileCache) => {\n if ((reload || clearFileCache) && clearFileCache !== false) {\n fileManager.clearFileCache();\n }\n return new Promise((resolve, reject) => {\n let startTime;\n let endTime;\n let totalMilliseconds;\n let remainingSheets;\n startTime = endTime = new Date();\n\n // Set counter for remaining unprocessed sheets\n remainingSheets = less.sheets.length;\n\n if (remainingSheets === 0) {\n\n endTime = new Date();\n totalMilliseconds = endTime - startTime;\n less.logger.info('Less has finished and no sheets were loaded.');\n resolve({\n startTime,\n endTime,\n totalMilliseconds,\n sheets: less.sheets.length\n });\n\n } else {\n // Relies on less.sheets array, callback seems to be guaranteed to be called for every element of the array\n loadStyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n reject(e);\n return;\n }\n if (webInfo.local) {\n less.logger.info(`Loading ${sheet.href} from cache.`);\n } else {\n less.logger.info(`Rendered ${sheet.href} successfully.`);\n }\n browser.createCSS(window.document, css, sheet);\n less.logger.info(`CSS for ${sheet.href} generated in ${new Date() - endTime}ms`);\n\n // Count completed sheet\n remainingSheets--;\n\n // Check if the last remaining sheet was processed and then call the promise\n if (remainingSheets === 0) {\n totalMilliseconds = new Date() - startTime;\n less.logger.info(`Less has finished. CSS generated in ${totalMilliseconds}ms`);\n resolve({\n startTime,\n endTime,\n totalMilliseconds,\n sheets: less.sheets.length\n });\n }\n endTime = new Date();\n }, reload, modifyVars);\n }\n\n loadStyles(modifyVars);\n });\n };\n\n less.refreshStyles = loadStyles;\n return less;\n};\n","export default (less, options) => {\n const logLevel_debug = 4;\n const logLevel_info = 3;\n const logLevel_warn = 2;\n const logLevel_error = 1;\n\n // The amount of logging in the javascript console.\n // 3 - Debug, information and errors\n // 2 - Information and errors\n // 1 - Errors\n // 0 - None\n // Defaults to 2\n options.logLevel = typeof options.logLevel !== 'undefined' ? options.logLevel : (options.env === 'development' ? logLevel_info : logLevel_error);\n\n if (!options.loggers) {\n options.loggers = [{\n debug: function(msg) {\n if (options.logLevel >= logLevel_debug) {\n console.log(msg);\n }\n },\n info: function(msg) {\n if (options.logLevel >= logLevel_info) {\n console.log(msg);\n }\n },\n warn: function(msg) {\n if (options.logLevel >= logLevel_warn) {\n console.warn(msg);\n }\n },\n error: function(msg) {\n if (options.logLevel >= logLevel_error) {\n console.error(msg);\n }\n }\n }];\n }\n for (let i = 0; i < options.loggers.length; i++) {\n less.logger.addListener(options.loggers[i]);\n }\n};\n","// Cache system is a bit outdated and could do with work\n\nexport default (window, options, logger) => {\n let cache = null;\n if (options.env !== 'development') {\n try {\n cache = (typeof window.localStorage === 'undefined') ? null : window.localStorage;\n } catch (_) {}\n }\n return {\n setCSS: function(path, lastModified, modifyVars, styles) {\n if (cache) {\n logger.info(`saving ${path} to cache.`);\n try {\n cache.setItem(path, styles);\n cache.setItem(`${path}:timestamp`, lastModified);\n if (modifyVars) {\n cache.setItem(`${path}:vars`, JSON.stringify(modifyVars));\n }\n } catch (e) {\n // TODO - could do with adding more robust error handling\n logger.error(`failed to save \"${path}\" to local storage for caching.`);\n }\n }\n },\n getCSS: function(path, webInfo, modifyVars) {\n const css = cache && cache.getItem(path);\n const timestamp = cache && cache.getItem(`${path}:timestamp`);\n let vars = cache && cache.getItem(`${path}:vars`);\n\n modifyVars = modifyVars || {};\n vars = vars || \"{}\"; // if not set, treat as the JSON representation of an empty object\n\n if (timestamp && webInfo.lastModified &&\n (new Date(webInfo.lastModified).valueOf() ===\n new Date(timestamp).valueOf()) &&\n JSON.stringify(modifyVars) === vars) {\n // Use local copy\n return css;\n }\n }\n };\n};\n","\nimport functionRegistry from './../less/functions/function-registry';\n\nexport default () => {\n function imageSize() {\n throw {\n type: 'Runtime',\n message: 'Image size functions are not supported in browser version of less'\n };\n }\n\n const imageFunctions = {\n 'image-size': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n },\n 'image-width': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n },\n 'image-height': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n }\n };\n\n functionRegistry.addMultiple(imageFunctions);\n};\n"],"names":["extractId","href","replace","addDataAttr","options","tag","opt","dataset","hasOwnProperty","JSON","parse","_","document","styles","sheet","id","title","utils.extractId","oldStyleNode","getElementById","keepOldStyleNode","styleNode","createElement","setAttribute","media","styleSheet","appendChild","createTextNode","childNodes","length","firstChild","nodeValue","head","getElementsByTagName","nextEl","nextSibling","parentNode","insertBefore","removeChild","cssText","e","Error","window","scripts","currentScript","extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","__extends","__","this","constructor","prototype","create","__assign","assign","t","s","i","n","arguments","call","apply","__spreadArrays","il","r","k","a","j","jl","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","darkgrey","darkgreen","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","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","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","m","cm","mm","in","px","pt","pc","duration","ms","angle","rad","Math","PI","deg","grad","turn","colors","unitConversions","parent","visibilityBlocks","undefined","nodeVisible","rootNode","parsed","self","defineProperty","get","fileInfo","getIndex","Node","nodes","set","node","isArray","forEach","_index","_fileInfo","context","strs","genCSS","add","chunk","index","push","isEmpty","join","output","value","visitor","visit","op","precision","numPrecision","Number","toFixed","info","compare","type","numericCompare","rgb","originalForm","_super","_this","match","map","c","parseInt","alpha","split","Color","g","pow","toCSS","doNotCompress","color","colorFunction","compress","args","fround","indexOf","clamp","round","concat","toHSL","h","l","toRGB","splitcolor","other","_operate","toHex","max","min","v","x","toString","fromKeyword","keyword","key","toLowerCase","slice","Paren","eval","_noSpaceCombinators"," ","|","emptyOrWhitespace","trim","Combinator","spaceOrEmpty","combinator","isVariable","currentFileInfo","visibilityInfo","copyVisibilityInfo","setParent","Element","firstSelector","charAt","ALWAYS","PARENS_DIVISION","PARENS","STRICT_LEGACY","RewriteUrls","getLocation","inputStream","line","column","copyArray","arr","copy","clone","obj","cloned","prop","defaults","obj1","obj2","newObj","_defaults","defaults_1","copyOptions","opts","strictMath","math","Constants.Math","relativeUrls","rewriteUrls","Constants.RewriteUrls","flattenArray","result","length_1","anonymousFunc","LessError","fileContentMap","currentFilename","filename","message","stack","input","contents","loc","utils.getLocation","col","callLine","lines","found","func","Function","lineAdjust","callExtract","extract","F","error","stylize","str","errorTxt","substr","elements","extendList","condition","evaldCondition","getElements","mixinElements_","Selector","visitArray","newSelector","mediaEmpty","els","parseNode","err","imports","sels","olen","len","mixinElements","shift","extend","createDerived","Value","Keyword","True","False","mapLines","rulesetLike","allowRoot","Anonymous","Boolean","MATH","name","important","merge","inline","variable","Declaration","lastRule","prevMath","evaldValue","mathBypass","evalName","importantScope","importantResult","pop","debugInfo","ctx","lineSeparator","dumpLineNumbers","asComment","asMediaQuery","lineNumber","fileName","filenameWithProtocol","test","isLineComment","Comment","getDebugInfo","isCompressed","contexts","copyFromOriginal","original","destination","propertiesToCopy","parseCopyProperties","Parse","paths","evalCopyProperties","isPathRelative","path","isPathLocalRelative","Eval","frames","inCalc","mathOn","calcStack","parensStack","rootpath","newPath","normalizePath","segment","segments","reverse","makeRegistry","base","_data","addMultiple","functions","keys","getLocalFunctions","inherit","defaultFunc","value_","error_","reset","selectors","rules","strictImports","_lookups","_variables","_properties","Ruleset","selCnt","selector","hasVariable","hasOnePassingSelector","toParseSelectors","utils.flattenArray","rule","subRule","utils.copyArray","ruleset","originalRuleset","root","firstRoot","allowImports","functionRegistry","globalFunctionRegistry","ctxFrames","unshift","ctxSelectors","evalImports","rsRules","evalFirst","mediaBlockCount","mediaBlocks","filter","splice","resetCache","isJustParentSelector","bubbleSelectors","importRules","makeImportant","lastSelector","_rulesets","reduce","hash","variables","vars","name_1","name_2","decl","parseValue","properties","toParse","transformDeclaration","nodes_1","filtRules","isRuleset","foundMixins","rulesets","find","ruleNodes","tabLevel","sep","tabRuleStr","tabSetStr","charsetNodeIndex","importNodeIndex","isCharset","pathCnt","pathSubCnt","currentLastRule","isRulesetLike","isVisible","joinSelector","createParenthesis","elementsToPak","originalElement","replacementParen","insideParent","createSelector","containedElement","element","addReplacementIntoPath","beginningPath","addPath","replacedElement","originalSelector","newSelectorPath","newJoinedSelector","parentEl","restOfPath","addAllReplacementsIntoPath","addPaths","mergeElementsOnToSelectors","sel","deriveSelector","deriveFrom","newPaths","replaceParentSelector","inSelector","currentElements","newSelectors","selectorsMultiplied","el","maybeSelector","hadParentSelector","nestedSelector","replaced","nestedPaths","replacedNewSelectors","concatenated","bind","isRooted","createEmptySelectors","AtRule","outputRuleset","mediaPathBackup","mediaBlocksBackup","mediaPath","_i","ruleCnt","DetachedRuleset","numerator","denominator","backupUnit","sort","Unit","strictUnits","returnStr","is","unitString","toUpperCase","RegExp","callback","group","mapUnit","groupName","atomicUnit","counter","count","unit","parseFloat","isNaN","Dimension","isSingular","strValue","String","isLength","convertTo","usedUnits","cancel","unify","conversions","targetUnit","applyUnit","derivedConversions","operands","isSpaced","Operation","isMathOn","toColor","operate","noSpacing","Expression","returnValue","inParenthesis","parens","parensInOp","doubleParen","outOfParenthesis","functionCaller","evalArgs","item","subNodes","calc","Call","currentMathContext","enterCalc","exitCalc","funcCaller","FunctionCaller","isValid","columnNumber","Variable","evaluating","frame","fun","Property","property","mergeRules","pluginManager","less","visitors","ToCSSVisitor","_mergeRules","vArr","Attribute","content","escaped","quote","variableRegex","propRegex","Quoted","that","iterativeReplace","regexp","replacementFnc","evaluatedValue","val","isEvald","URL","pathRequiresRewrite","rewritePath","urlArgs","features","Media","evalTop","evalNested","multiMedia","permute","fragment","rest","css","pathValue","getPath","Import","isPlugin","reference","containsVariables","doEval","blocksVisibility","addVisibilityBlock","registry","skip","importedFilename","newImport","evalPath","string","expression","JavaScript","evaluateJavaScript","JsEvalNode","evalContext","javascriptEnabled","jsify","toJS","Assignment","negate","lvalue","rvalue","Condition","UnicodeDescriptor","Negative","option","object_id","Extend","next_id","parent_ids","allowBefore","allowAfter","selectorElements","selfElements","selfSelectors","VariableCall","detachedRuleset","callEval","ruleCall","lookups","NamespaceValue","lastDeclaration","substring","params","variadic","arity","optionalParameters","required","Definition","mixinEnv","evaldArguments","varargs","arg","isNamedFound","argIndex","argsLength","prependRule","_arguments","mixinFrames","evalParams","allArgsCnt","requiredArgsCnt","MixinCall","mixins","mixin","mixinPath","argValue","f","isRecursive","isOneFound","candidate","defaultResult","noArgumentsFilter","candidates","conditionResult","calcDefGroup","namespace","matchCondition","expand","matchArgs","MixinDefinition","format","newRules","evalCall","_setVisibilityToReplacement","replacement","msg","_fireEvent","warn","debug","addListener","listener","_listeners","removeListener","logFunction","externalEnvironment","fileManagers","requiredFunctions","propName","environmentFunc","environment","currentDirectory","isSync","logger","getFileManagers","fileManager","AbstractFileManager","lastIndexOf","ext","tryAppendExtension","basePath","laterPath","url","baseUrl","urlDirectories","baseUrlDirectories","urlParts","extractUrlParts","baseUrlParts","diff","hostPart","directories","urlPartsRegex","returner","rawDirectories","rawPath","fileUrl","require","AbstractPluginLoader","pluginOptions","pluginObj","localModule","shortname","FileManager","trySetOptions","use","exports","loader","tree","validatePlugin","minVersion","compareVersion","addPlugin","plugin","setOptions","version","versionToString","aVersion","bVersion","versionString","plugins","printUsage","_visitArgs","visitDeeper","_hasIndexed","_noop","implementation","_implementation","_visitInCache","_visitOutCache","indexNodeTypes","ticker","child","typeIndex","Visitor","nodeTypeIndex","fnName","impl","funcOut","visitArgs","newNode","isReplacing","cnt","accept","nonReplacing","out","evald","flatten","nestedCnt","nestedItem","onSequencerEmpty","variableImports","_onSequencerEmpty","_currentDepth","ImportSequencer","importSequencer","importItem","isReady","tryRun","variableImport","ImportVisitor","importer","finish","_visitor","_importer","_finish","importCount","onceFileDetectionMap","recursionDetector","_sequencer","run","isFinished","visitImport","importNode","inlineCSS","importParent","isVariableImport","addVariableImport","processImportNode","evaldImportNode","evalForImport","multiple","importMultiple","tryAppendLessExtension","onImported","sequencedOnImported","addImport","importedAtRoot","fullPath","importVisitor","isOptional","optional","duplicateImport","oldContext","visitDeclaration","declNode","visitDeclarationOut","visitAtRule","atRuleNode","visitAtRuleOut","visitMixinDefinition","mixinDefinitionNode","visitMixinDefinitionOut","visitRuleset","rulesetNode","visitRulesetOut","visitMedia","mediaNode","visitMediaOut","visible","SetTreeVisibilityVisitor","ensureVisibility","ensureInvisibility","allExtendsStack","ExtendFinderVisitor","allExtends","allSelectorsExtendList","extendOnEveryPath","selectorPath","selExtendList","allSelectorsExtend","foundExtends","findSelfSelectors","firstExtendOnThisSelectorPath","ProcessExtendsVisitor","extendFinder","extendIndices","doExtendChaining","newRoot","checkExtendsForNonMatched","indices","hasFoundMatches","extendsList","extendsListTarget","iterationCount","extendIndex","targetExtendIndex","matches","targetExtend","newExtend","extendsToAdd","extendVisitor","findMatch","selfSelector","extendSelector","extendChainCount","selectorOne","selectorTwo","ruleNode","selectorNode","pathIndex","selectorsToAdd","extendedSelectors","haystackSelectorPath","haystackSelectorIndex","hackstackSelector","hackstackElementIndex","haystackElement","targetCombinator","potentialMatch","needleElements","potentialMatches","matched","initialCombinator","isElementValuesEqual","finished","endPathIndex","endPathElementIndex","elementValue1","elementValue2","replacementSelector","matchIndex","firstElement","newElements","currentSelectorPathIndex","currentSelectorPathElementIndex","currentValue","derived","newAllExtends","lastIndex","JoinSelectorVisitor","getIsOutput","joinSelectors","_context","CSSVisitorUtils","bodyRules","isSilent","owner","thing","originalRules","containsSilentNonBlockedChild","compiledRulesBody","keepOnlyVisibleChilds","removeVisibilityBlock","hasVisibleSelector","utils","mixinNode","visitExtend","extendNode","visitComment","commentNode","resolveVisibility","visitAtRuleWithBody","visitAtRuleWithoutBody","visitAnonymous","anonymousNode","nodeRules","hasFakeRuleset","getBodyRules","charset","comment","checkValidNodes","isRoot","_compileRulesetPaths","nodeRuleCnt","_removeDuplicateRules","isVisibleRuleset","ruleList","ruleCache","ruleCSS","groups","groupsArr","result_1","space_1","comma_1","MarkVisibleSelectorsVisitor","ExtendVisitor","furthest","furthestPossibleErrorMessage","chunks","current","currentPos","saveStack","parserInput","skipWhitespace","nextChar","oldi","oldj","curr","endIndex","mem","inp","charCodeAt","autoCommentAbsorb","nextNewLine","text","commentStore","nextStarSlash","save","restore","possibleErrorMessage","state","forget","isWhitespace","offset","pos","code","$re","tok","exec","$char","$str","tokLength","$quoted","startChar","currentPosition","$parseUntil","testChar","returnVal","inComment","blockDepth","blockStack","parseGroups","startPos","lastPos","loop","char","expected","peek","peekChar","currentChar","prevChar","getInput","peekNotNumeric","start","chunkInput","failFunction","fail","lastOpening","lastOpeningParen","lastMultiComment","lastMultiCommentEndBrace","chunkerCurrentIndex","currentChunkStartIndex","cc","cc2","level","parenLevel","emitFrom","emitChunk","force","fromCharCode","chunker","end","furthestReachedEnd","furthestChar","Parser","parsers","getParserInput","expect","expectChar","parseList","currentIndex","returnNodes","parser","additionalData","globalVars","modifyVars","ignored","preText","serializeVars","preProcessors","getPreProcessors","process","banner","contentsIgnoredChars","primary","endInfo","processImports","extendRule","definition","declaration","variableCall","entities","atrule","foundSemiColon","mixinLookup","quoted","forceEscaped","isEscaped","customFuncCall","stop","ieAlpha","boolean","if","prevArgs","isSemiColonSeparated","argsComma","argsSemiColon","assignment","literal","dimension","unicodeDescriptor","entity","ch","variableCurly","curly","propertyCurly","colorKeyword","ud","javascript","js","escape","parsedName","inValue","ruleLookups","isRule","getLookup","hasParens","elem","elemIndex","re","isCall","expressionContainsNamed","nameLoop","expressions","hasSep","throwAwayComments","cond","argInfo","conditions","block","lookupValue","attribute","slashedCombinator","isLess","when","blockRuleset","hasDR","ruleProperty","permissiveValue","anonymousValue","untilTokens","done","testCurrentChar","import","dir","importOptions","mediaFeatures","o","optionName","importOption","mediaFeature","pluginArgs","nonVendorSpecificName","hasIdentifier","hasExpression","hasUnknown","hasBlock","sub","addition","multiplication","operation","operand","needsParens","logical","next","conditionAnd","negatedCondition","parenthesisCondition","atomicCondition","body","me","tryConditionFollowedByParenthesis","delim","simpleProperty","If","trueValue","falseValue","colorFunctions","hsla","origColor","hsl","toHSV","number","rgba","size","m1_1","m2_1","hue","hsv","hsva","vs","floor","perm","saturation","lightness","hsvhue","hsvsaturation","hsvvalue","luma","luminance","saturate","amount","method","desaturate","lighten","darken","fadein","fadeout","fade","spin","mix","color1","color2","weight","w","w1","w2","greyscale","contrast","dark","light","threshold","argb","toARGB","tint","shade","colorBlend","mode","cb","cs","ar","cr","ab","as","colorBlendModeFunctions","multiply","screen","overlay","softlight","sqrt","hardlight","difference","abs","exclusion","average","negation","getItemsFromNode","_SELF","values","range","step","from","to","stepValue","list","each","rs","iterator","Quote","valueName","keyName","indexName","MathHelper","fn","mathFunctions","ceil","sin","cos","atan","asin","acos","mathHelper","fraction","num","pm","minMax","isMin","currentUnified","referenceUnified","unitStatic","unitClone","order","convert","pi","mod","y","percentage","evaluated","encodeURI","pattern","flags","%","token","encodeURIComponent","isa","Type","isunit","isruleset","iscolor","isnumber","isstring","iskeyword","isurl","ispixel","ispercentage","isem","get-unit","colorBlending","fallback","functionThis","data-uri","mimetypeNode","filePathNode","mimetype","filePath","entryPath","fragmentStart","utils.clone","rawBuffer","getFileManager","useBase64","mimeLookup","charsetLookup","fileSync","loadFileSync","buf","encodeBase64","uri","dataUri","svg-gradient","direction","stops","gradientDirectionSvg","position","positionValue","gradientType","rectangleDimension","renderEnv","directionValue","throwArgumentDescriptor","types","evaldRoot","evalEnv","visitorIterator","preEvalVisitors","first","isPreEvalVisitor","isPreVisitor","postProcessors","installedPlugins","pluginCache","Loader","PluginLoader","PluginManager","install","preProcessor","priority","indexToInsertAt","postProcessor","manager","PluginManagerFactory","newFactory","SourceMapOutput","_css","_rootNode","_contentsMap","contentsMap","_contentsIgnoredCharsMap","contentsIgnoredCharsMap","sourceMapFilename","_sourceMapFilename","_outputFilename","outputFilename","sourceMapURL","sourceMapBasepath","_sourceMapBasepath","sourceMapRootpath","_sourceMapRootpath","_outputSourceFiles","outputSourceFiles","_sourceMapGeneratorConstructor","getSourceMapGenerator","_lineNumber","_column","removeBasepath","sourceLines","columns","sourceColumns","inputSource","_sourceMapGenerator","addMapping","generated","source","normalizeFilename","file","sourceRoot","setSourceContent","sourceMapContent","stringify","toJSON","sourceMap","sourceMapOutput","Environment","SourceMapBuilder","sourceMapOutputFilename","sourceMapGenerator","sourceMapFileInline","disableSourcemapAnnotation","sourceMapInputFilename","getCSSAppendage","sourceMapBuilder","ParseTree","transformTree","toCSSOptions","getPostProcessors","getExternalSourceMap","rootFilename","files","parseTree","ImportManager","rootFileInfo","mime","queue","importManager","pluginLoader","fileParsedFunc","importedEqualsRoot","newFileInfo","loadedFile","promise","loadFileCallback","resolvedFilename","pathDiff","isPathAbsolute","alwaysMakePathsAbsolute","newEnv","evalPlugin","syncImport","loadPluginSync","loadPlugin","loadFile","then","render","utils.copyOptions","self_1","Promise","resolve","reject","Render","context_1","pluginManager_1","reUsePluginManager","imports_1","evalResult","fileContent","Functions","initial","data","ctor","api","fileCache","errback","xhr","XMLHttpRequest","async","isFileProtocol","fileAsync","handleResponse","status","responseText","getResponseHeader","overrideMimeType","open","setRequestHeader","send","onreadystatechange","readyState","location","useFileCache","lessText","webInfo","lastModified","Date","doXHR","log","fulfill","catch","rootHref","errorReporting","errors","errorline","classname","logLevel","errorConsole","timer","filenameNoPath","className","innerHTML","browser","style","env","setInterval","replaceChild","clearInterval","errorHTML","remove","removeErrorHTML","depends","lint","insecure","protocol","poll","hostname","port","onReady","addDefaultOptions","LESS_PLUGINS","lessRoot","FM","addFileManager","loggers","console","LogListener","ErrorReporting","cache","localStorage","setCSS","setItem","getCSS","getItem","timestamp","valueOf","Cache","imageSize","imageFunctions","image-size","image-width","image-height","ImageSize","typePattern","thisArg","curryArgs","loadStyles","instanceOptions","loadStyleSheet","reload","remaining","local","loadInitialFileCallback","loadStyleSheets","sheets","watch","watchMode","watchTimer","clearFileCache","unwatch","registerStylesheetsImmediately","links","rel","registerStylesheets","record","refresh","startTime","endTime","totalMilliseconds","remainingSheets","refreshStyles","resolveOrReject","pageLoadFinished"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"less.min.js","sources":["../src/less-browser/utils.js","../src/less-browser/browser.js","../src/less/logger.js","../src/less/environment/environment.js","../src/less/data/colors.js","../src/less/data/unit-conversions.js","../src/less/data/index.js","../src/less/tree/node.js","../node_modules/tslib/tslib.es6.js","../src/less/tree/color.js","../src/less/tree/paren.js","../src/less/tree/combinator.js","../src/less/tree/element.js","../src/less/constants.js","../src/less/utils.js","../src/less/less-error.js","../src/less/tree/selector.js","../src/less/tree/value.js","../src/less/tree/keyword.js","../src/less/tree/anonymous.js","../src/less/tree/declaration.js","../src/less/tree/debug-info.js","../src/less/tree/comment.js","../src/less/contexts.js","../src/less/functions/function-registry.js","../src/less/functions/default.js","../src/less/tree/ruleset.js","../src/less/tree/atrule.js","../src/less/tree/detached-ruleset.js","../src/less/tree/unit.js","../src/less/tree/dimension.js","../src/less/tree/operation.js","../src/less/tree/expression.js","../src/less/functions/function-caller.js","../src/less/tree/call.js","../src/less/tree/variable.js","../src/less/tree/property.js","../src/less/tree/attribute.js","../src/less/tree/quoted.js","../src/less/tree/url.js","../src/less/tree/media.js","../src/less/tree/import.js","../src/less/tree/js-eval-node.js","../src/less/tree/javascript.js","../src/less/tree/assignment.js","../src/less/tree/condition.js","../src/less/tree/unicode-descriptor.js","../src/less/tree/negative.js","../src/less/tree/extend.js","../src/less/tree/variable-call.js","../src/less/tree/namespace-value.js","../src/less/tree/mixin-definition.js","../src/less/tree/mixin-call.js","../src/less/tree/index.js","../src/less/environment/abstract-file-manager.js","../src/less/environment/abstract-plugin-loader.js","../src/less/visitors/visitor.js","../src/less/visitors/import-sequencer.js","../src/less/visitors/import-visitor.js","../src/less/visitors/set-tree-visibility-visitor.js","../src/less/visitors/extend-visitor.js","../src/less/visitors/join-selector-visitor.js","../src/less/visitors/to-css-visitor.js","../src/less/visitors/index.js","../src/less/parser/parser-input.js","../src/less/parser/chunker.js","../src/less/parser/parser.js","../src/less/functions/boolean.js","../src/less/functions/color.js","../src/less/functions/color-blending.js","../src/less/functions/list.js","../src/less/functions/math-helper.js","../src/less/functions/math.js","../src/less/functions/number.js","../src/less/functions/string.js","../src/less/functions/types.js","../src/less/functions/index.js","../src/less/functions/data-uri.js","../src/less/functions/svg.js","../src/less/transform-tree.js","../src/less/plugin-manager.js","../src/less-browser/file-manager.js","../src/less/index.js","../src/less/parse-tree.js","../src/less/source-map-builder.js","../src/less/source-map-output.js","../src/less/import-manager.js","../src/less/render.js","../src/less/parse.js","../src/less-browser/plugin-loader.js","../src/less-browser/error-reporting.js","../src/less-browser/bootstrap.js","../src/less/default-options.js","../src/less-browser/add-default-options.js","../src/less-browser/index.js","../src/less-browser/log-listener.js","../src/less-browser/cache.js","../src/less-browser/image-size.js"],"sourcesContent":["\nexport function extractId(href) {\n return href.replace(/^[a-z-]+:\\/+?[^\\/]+/, '') // Remove protocol & domain\n .replace(/[\\?\\&]livereload=\\w+/, '') // Remove LiveReload cachebuster\n .replace(/^\\//, '') // Remove root /\n .replace(/\\.[a-zA-Z]+$/, '') // Remove simple extension\n .replace(/[^\\.\\w-]+/g, '-') // Replace illegal characters\n .replace(/\\./g, ':'); // Replace dots with colons(for valid id)\n}\n\nexport function addDataAttr(options, tag) {\n for (const opt in tag.dataset) {\n if (tag.dataset.hasOwnProperty(opt)) {\n if (opt === 'env' || opt === 'dumpLineNumbers' || opt === 'rootpath' || opt === 'errorReporting') {\n options[opt] = tag.dataset[opt];\n } else {\n try {\n options[opt] = JSON.parse(tag.dataset[opt]);\n }\n catch (_) {}\n }\n }\n }\n}\n","import * as utils from './utils';\n\nexport default {\n createCSS: function (document, styles, sheet) {\n // Strip the query-string\n const href = sheet.href || '';\n\n // If there is no title set, use the filename, minus the extension\n const id = `less:${sheet.title || utils.extractId(href)}`;\n\n // If this has already been inserted into the DOM, we may need to replace it\n const oldStyleNode = document.getElementById(id);\n let keepOldStyleNode = false;\n\n // Create a new stylesheet node for insertion or (if necessary) replacement\n const styleNode = document.createElement('style');\n styleNode.setAttribute('type', 'text/css');\n if (sheet.media) {\n styleNode.setAttribute('media', sheet.media);\n }\n styleNode.id = id;\n\n if (!styleNode.styleSheet) {\n styleNode.appendChild(document.createTextNode(styles));\n\n // If new contents match contents of oldStyleNode, don't replace oldStyleNode\n keepOldStyleNode = (oldStyleNode !== null && oldStyleNode.childNodes.length > 0 && styleNode.childNodes.length > 0 &&\n oldStyleNode.firstChild.nodeValue === styleNode.firstChild.nodeValue);\n }\n\n const head = document.getElementsByTagName('head')[0];\n\n // If there is no oldStyleNode, just append; otherwise, only append if we need\n // to replace oldStyleNode with an updated stylesheet\n if (oldStyleNode === null || keepOldStyleNode === false) {\n const nextEl = sheet && sheet.nextSibling || null;\n if (nextEl) {\n nextEl.parentNode.insertBefore(styleNode, nextEl);\n } else {\n head.appendChild(styleNode);\n }\n }\n if (oldStyleNode && keepOldStyleNode === false) {\n oldStyleNode.parentNode.removeChild(oldStyleNode);\n }\n\n // For IE.\n // This needs to happen *after* the style element is added to the DOM, otherwise IE 7 and 8 may crash.\n // See http://social.msdn.microsoft.com/Forums/en-US/7e081b65-878a-4c22-8e68-c10d39c2ed32/internet-explorer-crashes-appending-style-element-to-head\n if (styleNode.styleSheet) {\n try {\n styleNode.styleSheet.cssText = styles;\n } catch (e) {\n throw new Error('Couldn\\'t reassign styleSheet.cssText.');\n }\n }\n },\n currentScript: function(window) {\n const document = window.document;\n return document.currentScript || (() => {\n const scripts = document.getElementsByTagName('script');\n return scripts[scripts.length - 1];\n })();\n }\n};\n","export default {\n error: function(msg) {\n this._fireEvent('error', msg);\n },\n warn: function(msg) {\n this._fireEvent('warn', msg);\n },\n info: function(msg) {\n this._fireEvent('info', msg);\n },\n debug: function(msg) {\n this._fireEvent('debug', msg);\n },\n addListener: function(listener) {\n this._listeners.push(listener);\n },\n removeListener: function(listener) {\n for (let i = 0; i < this._listeners.length; i++) {\n if (this._listeners[i] === listener) {\n this._listeners.splice(i, 1);\n return;\n }\n }\n },\n _fireEvent: function(type, msg) {\n for (let i = 0; i < this._listeners.length; i++) {\n const logFunction = this._listeners[i][type];\n if (logFunction) {\n logFunction(msg);\n }\n }\n },\n _listeners: []\n};\n","/**\n * @todo Document why this abstraction exists, and the relationship between\n * environment, file managers, and plugin manager\n */\n\nimport logger from '../logger';\n\nclass Environment {\n constructor(externalEnvironment, fileManagers) {\n this.fileManagers = fileManagers || [];\n externalEnvironment = externalEnvironment || {};\n\n const optionalFunctions = ['encodeBase64', 'mimeLookup', 'charsetLookup', 'getSourceMapGenerator'];\n const requiredFunctions = [];\n const functions = requiredFunctions.concat(optionalFunctions);\n\n for (let i = 0; i < functions.length; i++) {\n const propName = functions[i];\n const environmentFunc = externalEnvironment[propName];\n if (environmentFunc) {\n this[propName] = environmentFunc.bind(externalEnvironment);\n } else if (i < requiredFunctions.length) {\n this.warn(`missing required function in environment - ${propName}`);\n }\n }\n }\n\n getFileManager(filename, currentDirectory, options, environment, isSync) {\n\n if (!filename) {\n logger.warn('getFileManager called with no filename.. Please report this issue. continuing.');\n }\n if (currentDirectory == null) {\n logger.warn('getFileManager called with null directory.. Please report this issue. continuing.');\n }\n\n let fileManagers = this.fileManagers;\n if (options.pluginManager) {\n fileManagers = [].concat(fileManagers).concat(options.pluginManager.getFileManagers());\n }\n for (let i = fileManagers.length - 1; i >= 0 ; i--) {\n const fileManager = fileManagers[i];\n if (fileManager[isSync ? 'supportsSync' : 'supports'](filename, currentDirectory, options, environment)) {\n return fileManager;\n }\n }\n return null;\n }\n\n addFileManager(fileManager) {\n this.fileManagers.push(fileManager);\n }\n\n clearFileManagers() {\n this.fileManagers = [];\n }\n}\n\nexport default Environment;\n","export default {\n 'aliceblue':'#f0f8ff',\n 'antiquewhite':'#faebd7',\n 'aqua':'#00ffff',\n 'aquamarine':'#7fffd4',\n 'azure':'#f0ffff',\n 'beige':'#f5f5dc',\n 'bisque':'#ffe4c4',\n 'black':'#000000',\n 'blanchedalmond':'#ffebcd',\n 'blue':'#0000ff',\n 'blueviolet':'#8a2be2',\n 'brown':'#a52a2a',\n 'burlywood':'#deb887',\n 'cadetblue':'#5f9ea0',\n 'chartreuse':'#7fff00',\n 'chocolate':'#d2691e',\n 'coral':'#ff7f50',\n 'cornflowerblue':'#6495ed',\n 'cornsilk':'#fff8dc',\n 'crimson':'#dc143c',\n 'cyan':'#00ffff',\n 'darkblue':'#00008b',\n 'darkcyan':'#008b8b',\n 'darkgoldenrod':'#b8860b',\n 'darkgray':'#a9a9a9',\n 'darkgrey':'#a9a9a9',\n 'darkgreen':'#006400',\n 'darkkhaki':'#bdb76b',\n 'darkmagenta':'#8b008b',\n 'darkolivegreen':'#556b2f',\n 'darkorange':'#ff8c00',\n 'darkorchid':'#9932cc',\n 'darkred':'#8b0000',\n 'darksalmon':'#e9967a',\n 'darkseagreen':'#8fbc8f',\n 'darkslateblue':'#483d8b',\n 'darkslategray':'#2f4f4f',\n 'darkslategrey':'#2f4f4f',\n 'darkturquoise':'#00ced1',\n 'darkviolet':'#9400d3',\n 'deeppink':'#ff1493',\n 'deepskyblue':'#00bfff',\n 'dimgray':'#696969',\n 'dimgrey':'#696969',\n 'dodgerblue':'#1e90ff',\n 'firebrick':'#b22222',\n 'floralwhite':'#fffaf0',\n 'forestgreen':'#228b22',\n 'fuchsia':'#ff00ff',\n 'gainsboro':'#dcdcdc',\n 'ghostwhite':'#f8f8ff',\n 'gold':'#ffd700',\n 'goldenrod':'#daa520',\n 'gray':'#808080',\n 'grey':'#808080',\n 'green':'#008000',\n 'greenyellow':'#adff2f',\n 'honeydew':'#f0fff0',\n 'hotpink':'#ff69b4',\n 'indianred':'#cd5c5c',\n 'indigo':'#4b0082',\n 'ivory':'#fffff0',\n 'khaki':'#f0e68c',\n 'lavender':'#e6e6fa',\n 'lavenderblush':'#fff0f5',\n 'lawngreen':'#7cfc00',\n 'lemonchiffon':'#fffacd',\n 'lightblue':'#add8e6',\n 'lightcoral':'#f08080',\n 'lightcyan':'#e0ffff',\n 'lightgoldenrodyellow':'#fafad2',\n 'lightgray':'#d3d3d3',\n 'lightgrey':'#d3d3d3',\n 'lightgreen':'#90ee90',\n 'lightpink':'#ffb6c1',\n 'lightsalmon':'#ffa07a',\n 'lightseagreen':'#20b2aa',\n 'lightskyblue':'#87cefa',\n 'lightslategray':'#778899',\n 'lightslategrey':'#778899',\n 'lightsteelblue':'#b0c4de',\n 'lightyellow':'#ffffe0',\n 'lime':'#00ff00',\n 'limegreen':'#32cd32',\n 'linen':'#faf0e6',\n 'magenta':'#ff00ff',\n 'maroon':'#800000',\n 'mediumaquamarine':'#66cdaa',\n 'mediumblue':'#0000cd',\n 'mediumorchid':'#ba55d3',\n 'mediumpurple':'#9370d8',\n 'mediumseagreen':'#3cb371',\n 'mediumslateblue':'#7b68ee',\n 'mediumspringgreen':'#00fa9a',\n 'mediumturquoise':'#48d1cc',\n 'mediumvioletred':'#c71585',\n 'midnightblue':'#191970',\n 'mintcream':'#f5fffa',\n 'mistyrose':'#ffe4e1',\n 'moccasin':'#ffe4b5',\n 'navajowhite':'#ffdead',\n 'navy':'#000080',\n 'oldlace':'#fdf5e6',\n 'olive':'#808000',\n 'olivedrab':'#6b8e23',\n 'orange':'#ffa500',\n 'orangered':'#ff4500',\n 'orchid':'#da70d6',\n 'palegoldenrod':'#eee8aa',\n 'palegreen':'#98fb98',\n 'paleturquoise':'#afeeee',\n 'palevioletred':'#d87093',\n 'papayawhip':'#ffefd5',\n 'peachpuff':'#ffdab9',\n 'peru':'#cd853f',\n 'pink':'#ffc0cb',\n 'plum':'#dda0dd',\n 'powderblue':'#b0e0e6',\n 'purple':'#800080',\n 'rebeccapurple':'#663399',\n 'red':'#ff0000',\n 'rosybrown':'#bc8f8f',\n 'royalblue':'#4169e1',\n 'saddlebrown':'#8b4513',\n 'salmon':'#fa8072',\n 'sandybrown':'#f4a460',\n 'seagreen':'#2e8b57',\n 'seashell':'#fff5ee',\n 'sienna':'#a0522d',\n 'silver':'#c0c0c0',\n 'skyblue':'#87ceeb',\n 'slateblue':'#6a5acd',\n 'slategray':'#708090',\n 'slategrey':'#708090',\n 'snow':'#fffafa',\n 'springgreen':'#00ff7f',\n 'steelblue':'#4682b4',\n 'tan':'#d2b48c',\n 'teal':'#008080',\n 'thistle':'#d8bfd8',\n 'tomato':'#ff6347',\n 'turquoise':'#40e0d0',\n 'violet':'#ee82ee',\n 'wheat':'#f5deb3',\n 'white':'#ffffff',\n 'whitesmoke':'#f5f5f5',\n 'yellow':'#ffff00',\n 'yellowgreen':'#9acd32'\n};","export default {\n length: {\n 'm': 1,\n 'cm': 0.01,\n 'mm': 0.001,\n 'in': 0.0254,\n 'px': 0.0254 / 96,\n 'pt': 0.0254 / 72,\n 'pc': 0.0254 / 72 * 12\n },\n duration: {\n 's': 1,\n 'ms': 0.001\n },\n angle: {\n 'rad': 1 / (2 * Math.PI),\n 'deg': 1 / 360,\n 'grad': 1 / 400,\n 'turn': 1\n }\n};","import colors from './colors';\nimport unitConversions from './unit-conversions';\n\nexport default { colors, unitConversions };\n","class Node {\n constructor() {\n this.parent = null;\n this.visibilityBlocks = undefined;\n this.nodeVisible = undefined;\n this.rootNode = null;\n this.parsed = null;\n\n const self = this;\n Object.defineProperty(this, 'currentFileInfo', {\n get: function() { return self.fileInfo(); }\n });\n Object.defineProperty(this, 'index', {\n get: function() { return self.getIndex(); }\n });\n\n }\n\n setParent(nodes, parent) {\n function set(node) {\n if (node && node instanceof Node) {\n node.parent = parent;\n }\n }\n if (Array.isArray(nodes)) {\n nodes.forEach(set);\n }\n else {\n set(nodes);\n }\n }\n\n getIndex() {\n return this._index || (this.parent && this.parent.getIndex()) || 0;\n }\n\n fileInfo() {\n return this._fileInfo || (this.parent && this.parent.fileInfo()) || {};\n }\n\n isRulesetLike() { return false; }\n\n toCSS(context) {\n const strs = [];\n this.genCSS(context, {\n add: function(chunk, fileInfo, index) {\n strs.push(chunk);\n },\n isEmpty: function () {\n return strs.length === 0;\n }\n });\n return strs.join('');\n }\n\n genCSS(context, output) {\n output.add(this.value);\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n eval() { return this; }\n\n _operate(context, op, a, b) {\n switch (op) {\n case '+': return a + b;\n case '-': return a - b;\n case '*': return a * b;\n case '/': return a / b;\n }\n }\n\n fround(context, value) {\n const precision = context && context.numPrecision;\n // add \"epsilon\" to ensure numbers like 1.000000005 (represented as 1.000000004999...) are properly rounded:\n return (precision) ? Number((value + 2e-16).toFixed(precision)) : value;\n }\n\n static compare(a, b) {\n /* returns:\n -1: a < b\n 0: a = b\n 1: a > b\n and *any* other value for a != b (e.g. undefined, NaN, -2 etc.) */\n\n if ((a.compare) &&\n // for \"symmetric results\" force toCSS-based comparison\n // of Quoted or Anonymous if either value is one of those\n !(b.type === 'Quoted' || b.type === 'Anonymous')) {\n return a.compare(b);\n } else if (b.compare) {\n return -b.compare(a);\n } else if (a.type !== b.type) {\n return undefined;\n }\n\n a = a.value;\n b = b.value;\n if (!Array.isArray(a)) {\n return a === b ? 0 : undefined;\n }\n if (a.length !== b.length) {\n return undefined;\n }\n for (let i = 0; i < a.length; i++) {\n if (Node.compare(a[i], b[i]) !== 0) {\n return undefined;\n }\n }\n return 0;\n }\n\n static numericCompare(a, b) {\n return a < b ? -1\n : a === b ? 0\n : a > b ? 1 : undefined;\n }\n\n // Returns true if this node represents root of ast imported by reference\n blocksVisibility() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n return this.visibilityBlocks !== 0;\n }\n\n addVisibilityBlock() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks + 1;\n }\n\n removeVisibilityBlock() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks - 1;\n }\n\n // Turns on node visibility - if called node will be shown in output regardless\n // of whether it comes from import by reference or not\n ensureVisibility() {\n this.nodeVisible = true;\n }\n\n // Turns off node visibility - if called node will NOT be shown in output regardless\n // of whether it comes from import by reference or not\n ensureInvisibility() {\n this.nodeVisible = false;\n }\n\n // return values:\n // false - the node must not be visible\n // true - the node must be visible\n // undefined or null - the node has the same visibility as its parent\n isVisible() {\n return this.nodeVisible;\n }\n\n visibilityInfo() {\n return {\n visibilityBlocks: this.visibilityBlocks,\n nodeVisible: this.nodeVisible\n };\n }\n\n copyVisibilityInfo(info) {\n if (!info) {\n return;\n }\n this.visibilityBlocks = info.visibilityBlocks;\n this.nodeVisible = info.nodeVisible;\n }\n}\n\nexport default Node;\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import Node from './node';\nimport colors from '../data/colors';\n\n//\n// RGB Colors - #ff0014, #eee\n//\nclass Color extends Node {\n constructor(rgb, a, originalForm) {\n super();\n\n const self = this;\n //\n // The end goal here, is to parse the arguments\n // into an integer triplet, such as `128, 255, 0`\n //\n // This facilitates operations and conversions.\n //\n if (Array.isArray(rgb)) {\n this.rgb = rgb;\n } else if (rgb.length >= 6) {\n this.rgb = [];\n rgb.match(/.{2}/g).map(function (c, i) {\n if (i < 3) {\n self.rgb.push(parseInt(c, 16));\n } else {\n self.alpha = (parseInt(c, 16)) / 255;\n }\n });\n } else {\n this.rgb = [];\n rgb.split('').map(function (c, i) {\n if (i < 3) {\n self.rgb.push(parseInt(c + c, 16));\n } else {\n self.alpha = (parseInt(c + c, 16)) / 255;\n }\n });\n }\n this.alpha = this.alpha || (typeof a === 'number' ? a : 1);\n if (typeof originalForm !== 'undefined') {\n this.value = originalForm;\n }\n }\n\n luma() {\n let r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255;\n\n r = (r <= 0.03928) ? r / 12.92 : Math.pow(((r + 0.055) / 1.055), 2.4);\n g = (g <= 0.03928) ? g / 12.92 : Math.pow(((g + 0.055) / 1.055), 2.4);\n b = (b <= 0.03928) ? b / 12.92 : Math.pow(((b + 0.055) / 1.055), 2.4);\n\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n }\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n }\n\n toCSS(context, doNotCompress) {\n const compress = context && context.compress && !doNotCompress;\n let color;\n let alpha;\n let colorFunction;\n let args = [];\n\n // `value` is set if this color was originally\n // converted from a named color string so we need\n // to respect this and try to output named color too.\n alpha = this.fround(context, this.alpha);\n\n if (this.value) {\n if (this.value.indexOf('rgb') === 0) {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n } else if (this.value.indexOf('hsl') === 0) {\n if (alpha < 1) {\n colorFunction = 'hsla';\n } else {\n colorFunction = 'hsl';\n }\n } else {\n return this.value;\n }\n } else {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n }\n\n switch (colorFunction) {\n case 'rgba':\n args = this.rgb.map(function (c) {\n return clamp(Math.round(c), 255);\n }).concat(clamp(alpha, 1));\n break;\n case 'hsla':\n args.push(clamp(alpha, 1));\n case 'hsl':\n color = this.toHSL();\n args = [\n this.fround(context, color.h),\n `${this.fround(context, color.s * 100)}%`,\n `${this.fround(context, color.l * 100)}%`\n ].concat(args);\n }\n\n if (colorFunction) {\n // Values are capped between `0` and `255`, rounded and zero-padded.\n return `${colorFunction}(${args.join(`,${compress ? '' : ' '}`)})`;\n }\n\n color = this.toRGB();\n\n if (compress) {\n const splitcolor = color.split('');\n\n // Convert color to short format\n if (splitcolor[1] === splitcolor[2] && splitcolor[3] === splitcolor[4] && splitcolor[5] === splitcolor[6]) {\n color = `#${splitcolor[1]}${splitcolor[3]}${splitcolor[5]}`;\n }\n }\n\n return color;\n }\n\n //\n // Operations have to be done per-channel, if not,\n // channels will spill onto each other. Once we have\n // our result, in the form of an integer triplet,\n // we create a new Color node to hold the result.\n //\n operate(context, op, other) {\n const rgb = new Array(3);\n const alpha = this.alpha * (1 - other.alpha) + other.alpha;\n for (let c = 0; c < 3; c++) {\n rgb[c] = this._operate(context, op, this.rgb[c], other.rgb[c]);\n }\n return new Color(rgb, alpha);\n }\n\n toRGB() {\n return toHex(this.rgb);\n }\n\n toHSL() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h;\n let s;\n const l = (max + min) / 2;\n const d = max - min;\n\n if (max === min) {\n h = s = 0;\n } else {\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, l, a };\n }\n\n // Adapted from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript\n toHSV() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h;\n let s;\n const v = max;\n\n const d = max - min;\n if (max === 0) {\n s = 0;\n } else {\n s = d / max;\n }\n\n if (max === min) {\n h = 0;\n } else {\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, v, a };\n }\n\n toARGB() {\n return toHex([this.alpha * 255].concat(this.rgb));\n }\n\n compare(x) {\n return (x.rgb &&\n x.rgb[0] === this.rgb[0] &&\n x.rgb[1] === this.rgb[1] &&\n x.rgb[2] === this.rgb[2] &&\n x.alpha === this.alpha) ? 0 : undefined;\n }\n\n static fromKeyword(keyword) {\n let c;\n const key = keyword.toLowerCase();\n if (colors.hasOwnProperty(key)) {\n c = new Color(colors[key].slice(1));\n }\n else if (key === 'transparent') {\n c = new Color([0, 0, 0], 0);\n }\n\n if (c) {\n c.value = keyword;\n return c;\n }\n }\n}\n\nColor.prototype.type = 'Color';\n\nfunction clamp(v, max) {\n return Math.min(Math.max(v, 0), max);\n}\n\nfunction toHex(v) {\n return `#${v.map(function (c) {\n c = clamp(Math.round(c), 255);\n return (c < 16 ? '0' : '') + c.toString(16);\n}).join('')}`;\n}\n\nexport default Color;\n","import Node from './node';\n\nclass Paren extends Node {\n constructor(node) {\n super();\n\n this.value = node;\n }\n\n genCSS(context, output) {\n output.add('(');\n this.value.genCSS(context, output);\n output.add(')');\n }\n\n eval(context) {\n return new Paren(this.value.eval(context));\n }\n}\n\nParen.prototype.type = 'Paren';\nexport default Paren;\n","import Node from './node';\nconst _noSpaceCombinators = {\n '': true,\n ' ': true,\n '|': true\n};\n\nclass Combinator extends Node {\n constructor(value) {\n super();\n\n if (value === ' ') {\n this.value = ' ';\n this.emptyOrWhitespace = true;\n } else {\n this.value = value ? value.trim() : '';\n this.emptyOrWhitespace = this.value === '';\n }\n }\n\n genCSS(context, output) {\n const spaceOrEmpty = (context.compress || _noSpaceCombinators[this.value]) ? '' : ' ';\n output.add(spaceOrEmpty + this.value + spaceOrEmpty);\n }\n}\n\nCombinator.prototype.type = 'Combinator';\n\nexport default Combinator;\n","import Node from './node';\nimport Paren from './paren';\nimport Combinator from './combinator';\n\nclass Element extends Node {\n constructor(combinator, value, isVariable, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.combinator = combinator instanceof Combinator ?\n combinator : new Combinator(combinator);\n\n if (typeof value === 'string') {\n this.value = value.trim();\n } else if (value) {\n this.value = value;\n } else {\n this.value = '';\n }\n this.isVariable = isVariable;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.combinator, this);\n }\n\n accept(visitor) {\n const value = this.value;\n this.combinator = visitor.visit(this.combinator);\n if (typeof value === 'object') {\n this.value = visitor.visit(value);\n }\n }\n\n eval(context) {\n return new Element(this.combinator,\n this.value.eval ? this.value.eval(context) : this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n }\n\n clone() {\n return new Element(this.combinator,\n this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n }\n\n genCSS(context, output) {\n output.add(this.toCSS(context), this.fileInfo(), this.getIndex());\n }\n\n toCSS(context) {\n context = context || {};\n let value = this.value;\n const firstSelector = context.firstSelector;\n if (value instanceof Paren) {\n // selector in parens should not be affected by outer selector\n // flags (breaks only interpolated selectors - see #1973)\n context.firstSelector = true;\n }\n value = value.toCSS ? value.toCSS(context) : value;\n context.firstSelector = firstSelector;\n if (value === '' && this.combinator.value.charAt(0) === '&') {\n return '';\n } else {\n return this.combinator.toCSS(context) + value;\n }\n }\n}\n\nElement.prototype.type = 'Element';\nexport default Element;\n","\nexport const Math = {\n ALWAYS: 0,\n PARENS_DIVISION: 1,\n PARENS: 2,\n // removed - STRICT_LEGACY: 3\n};\n\nexport const RewriteUrls = {\n OFF: 0,\n LOCAL: 1,\n ALL: 2\n};","/* jshint proto: true */\nimport * as Constants from './constants';\n\nexport function getLocation(index, inputStream) {\n let n = index + 1;\n let line = null;\n let column = -1;\n\n while (--n >= 0 && inputStream.charAt(n) !== '\\n') {\n column++;\n }\n\n if (typeof index === 'number') {\n line = (inputStream.slice(0, index).match(/\\n/g) || '').length;\n }\n\n return {\n line,\n column\n };\n}\n\nexport function copyArray(arr) {\n let i;\n const length = arr.length;\n const copy = new Array(length);\n\n for (i = 0; i < length; i++) {\n copy[i] = arr[i];\n }\n return copy;\n}\n\nexport function clone(obj) {\n const cloned = {};\n for (const prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n cloned[prop] = obj[prop];\n }\n }\n return cloned;\n}\n\nexport function defaults(obj1, obj2) {\n let newObj = obj2 || {};\n if (!obj2._defaults) {\n newObj = {};\n const defaults = {...obj1};\n newObj._defaults = defaults;\n const cloned = obj2 ? {...obj2} : {};\n Object.assign(newObj, defaults, cloned);\n }\n return newObj;\n}\n\nexport function copyOptions(obj1, obj2) {\n if (obj2 && obj2._defaults) {\n return obj2;\n }\n const opts = defaults(obj1, obj2);\n if (opts.strictMath) {\n opts.math = Constants.Math.PARENS;\n }\n // Back compat with changed relativeUrls option\n if (opts.relativeUrls) {\n opts.rewriteUrls = Constants.RewriteUrls.ALL;\n }\n if (typeof opts.math === 'string') {\n switch (opts.math.toLowerCase()) {\n case 'always':\n opts.math = Constants.Math.ALWAYS;\n break;\n case 'parens-division':\n opts.math = Constants.Math.PARENS_DIVISION;\n break;\n case 'strict':\n case 'parens':\n opts.math = Constants.Math.PARENS;\n break;\n default:\n opts.math = Constants.Math.PARENS;\n }\n }\n if (typeof opts.rewriteUrls === 'string') {\n switch (opts.rewriteUrls.toLowerCase()) {\n case 'off':\n opts.rewriteUrls = Constants.RewriteUrls.OFF;\n break;\n case 'local':\n opts.rewriteUrls = Constants.RewriteUrls.LOCAL;\n break;\n case 'all':\n opts.rewriteUrls = Constants.RewriteUrls.ALL;\n break;\n }\n }\n return opts;\n}\n\nexport function merge(obj1, obj2) {\n for (const prop in obj2) {\n if (obj2.hasOwnProperty(prop)) {\n obj1[prop] = obj2[prop];\n }\n }\n return obj1;\n}\n\nexport function flattenArray(arr, result = []) {\n for (let i = 0, length = arr.length; i < length; i++) {\n const value = arr[i];\n if (Array.isArray(value)) {\n flattenArray(value, result);\n } else {\n if (value !== undefined) {\n result.push(value);\n }\n }\n }\n return result;\n}","import * as utils from './utils';\n\nconst anonymousFunc = /(|Function):(\\d+):(\\d+)/;\n\n/**\n * This is a centralized class of any error that could be thrown internally (mostly by the parser).\n * Besides standard .message it keeps some additional data like a path to the file where the error\n * occurred along with line and column numbers.\n *\n * @class\n * @extends Error\n * @type {module.LessError}\n *\n * @prop {string} type\n * @prop {string} filename\n * @prop {number} index\n * @prop {number} line\n * @prop {number} column\n * @prop {number} callLine\n * @prop {number} callExtract\n * @prop {string[]} extract\n *\n * @param {Object} e - An error object to wrap around or just a descriptive object\n * @param {Object} fileContentMap - An object with file contents in 'contents' property (like importManager) @todo - move to fileManager?\n * @param {string} [currentFilename]\n */\nconst LessError = function(e, fileContentMap, currentFilename) {\n Error.call(this);\n\n const filename = e.filename || currentFilename;\n\n this.message = e.message;\n this.stack = e.stack;\n\n if (fileContentMap && filename) {\n const input = fileContentMap.contents[filename];\n const loc = utils.getLocation(e.index, input);\n var line = loc.line;\n const col = loc.column;\n const callLine = e.call && utils.getLocation(e.call, input).line;\n const lines = input ? input.split('\\n') : '';\n\n this.type = e.type || 'Syntax';\n this.filename = filename;\n this.index = e.index;\n this.line = typeof line === 'number' ? line + 1 : null;\n this.column = col;\n\n if (!this.line && this.stack) {\n const found = this.stack.match(anonymousFunc);\n\n /**\n * We have to figure out how this environment stringifies anonymous functions\n * so we can correctly map plugin errors.\n * \n * Note, in Node 8, the output of anonymous funcs varied based on parameters\n * being present or not, so we inject dummy params.\n */\n const func = new Function('a', 'throw new Error()');\n let lineAdjust = 0;\n try {\n func();\n } catch (e) {\n const match = e.stack.match(anonymousFunc);\n var line = parseInt(match[2]);\n lineAdjust = 1 - line;\n }\n\n if (found) {\n if (found[2]) {\n this.line = parseInt(found[2]) + lineAdjust;\n }\n if (found[3]) {\n this.column = parseInt(found[3]);\n }\n }\n }\n\n this.callLine = callLine + 1;\n this.callExtract = lines[callLine];\n\n this.extract = [\n lines[this.line - 2],\n lines[this.line - 1],\n lines[this.line]\n ];\n }\n\n};\n\nif (typeof Object.create === 'undefined') {\n const F = function () {};\n F.prototype = Error.prototype;\n LessError.prototype = new F();\n} else {\n LessError.prototype = Object.create(Error.prototype);\n}\n\nLessError.prototype.constructor = LessError;\n\n/**\n * An overridden version of the default Object.prototype.toString\n * which uses additional information to create a helpful message.\n *\n * @param {Object} options\n * @returns {string}\n */\nLessError.prototype.toString = function(options) {\n options = options || {};\n\n let message = '';\n const extract = this.extract || [];\n let error = [];\n let stylize = function (str) { return str; };\n if (options.stylize) {\n const type = typeof options.stylize;\n if (type !== 'function') {\n throw Error(`options.stylize should be a function, got a ${type}!`);\n }\n stylize = options.stylize;\n }\n\n if (this.line !== null) {\n if (typeof extract[0] === 'string') {\n error.push(stylize(`${this.line - 1} ${extract[0]}`, 'grey'));\n }\n\n if (typeof extract[1] === 'string') {\n let errorTxt = `${this.line} `;\n if (extract[1]) {\n errorTxt += extract[1].slice(0, this.column) +\n stylize(stylize(stylize(extract[1].substr(this.column, 1), 'bold') +\n extract[1].slice(this.column + 1), 'red'), 'inverse');\n }\n error.push(errorTxt);\n }\n\n if (typeof extract[2] === 'string') {\n error.push(stylize(`${this.line + 1} ${extract[2]}`, 'grey'));\n }\n error = `${error.join('\\n') + stylize('', 'reset')}\\n`;\n }\n\n message += stylize(`${this.type}Error: ${this.message}`, 'red');\n if (this.filename) {\n message += stylize(' in ', 'red') + this.filename;\n }\n if (this.line) {\n message += stylize(` on line ${this.line}, column ${this.column + 1}:`, 'grey');\n }\n\n message += `\\n${error}`;\n\n if (this.callLine) {\n message += `${stylize('from ', 'red') + (this.filename || '')}/n`;\n message += `${stylize(this.callLine, 'grey')} ${this.callExtract}/n`;\n }\n\n return message;\n};\n\nexport default LessError;","import Node from './node';\nimport Element from './element';\nimport LessError from '../less-error';\n\nclass Selector extends Node {\n constructor(elements, extendList, condition, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.extendList = extendList;\n this.condition = condition;\n this.evaldCondition = !condition;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.elements = this.getElements(elements);\n this.mixinElements_ = undefined;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.elements, this);\n }\n\n accept(visitor) {\n if (this.elements) {\n this.elements = visitor.visitArray(this.elements);\n }\n if (this.extendList) {\n this.extendList = visitor.visitArray(this.extendList);\n }\n if (this.condition) {\n this.condition = visitor.visit(this.condition);\n }\n }\n\n createDerived(elements, extendList, evaldCondition) {\n elements = this.getElements(elements);\n const newSelector = new Selector(elements, extendList || this.extendList,\n null, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n newSelector.evaldCondition = (evaldCondition != null) ? evaldCondition : this.evaldCondition;\n newSelector.mediaEmpty = this.mediaEmpty;\n return newSelector;\n }\n\n getElements(els) {\n if (!els) {\n return [new Element('', '&', false, this._index, this._fileInfo)];\n }\n if (typeof els === 'string') {\n this.parse.parseNode(\n els, \n ['selector'],\n this._index, \n this._fileInfo, \n function(err, result) {\n if (err) {\n throw new LessError({\n index: err.index,\n message: err.message\n }, this.parse.imports, this._fileInfo.filename);\n }\n els = result[0].elements;\n });\n }\n return els;\n }\n\n createEmptySelectors() {\n const el = new Element('', '&', false, this._index, this._fileInfo), sels = [new Selector([el], null, null, this._index, this._fileInfo)];\n sels[0].mediaEmpty = true;\n return sels;\n }\n\n match(other) {\n const elements = this.elements;\n const len = elements.length;\n let olen;\n let i;\n\n other = other.mixinElements();\n olen = other.length;\n if (olen === 0 || len < olen) {\n return 0;\n } else {\n for (i = 0; i < olen; i++) {\n if (elements[i].value !== other[i]) {\n return 0;\n }\n }\n }\n\n return olen; // return number of matched elements\n }\n\n mixinElements() {\n if (this.mixinElements_) {\n return this.mixinElements_;\n }\n\n let elements = this.elements.map( function(v) {\n return v.combinator.value + (v.value.value || v.value);\n }).join('').match(/[,&#\\*\\.\\w-]([\\w-]|(\\\\.))*/g);\n\n if (elements) {\n if (elements[0] === '&') {\n elements.shift();\n }\n } else {\n elements = [];\n }\n\n return (this.mixinElements_ = elements);\n }\n\n isJustParentSelector() {\n return !this.mediaEmpty &&\n this.elements.length === 1 &&\n this.elements[0].value === '&' &&\n (this.elements[0].combinator.value === ' ' || this.elements[0].combinator.value === '');\n }\n\n eval(context) {\n const evaldCondition = this.condition && this.condition.eval(context);\n let elements = this.elements;\n let extendList = this.extendList;\n\n elements = elements && elements.map(function (e) { return e.eval(context); });\n extendList = extendList && extendList.map(function(extend) { return extend.eval(context); });\n\n return this.createDerived(elements, extendList, evaldCondition);\n }\n\n genCSS(context, output) {\n let i, element;\n if ((!context || !context.firstSelector) && this.elements[0].combinator.value === '') {\n output.add(' ', this.fileInfo(), this.getIndex());\n }\n for (i = 0; i < this.elements.length; i++) {\n element = this.elements[i];\n element.genCSS(context, output);\n }\n }\n\n getIsOutput() {\n return this.evaldCondition;\n }\n}\n\nSelector.prototype.type = 'Selector';\nexport default Selector;\n","import Node from './node';\n\nclass Value extends Node {\n constructor(value) {\n super();\n\n if (!value) {\n throw new Error('Value requires an array argument');\n }\n if (!Array.isArray(value)) {\n this.value = [ value ];\n }\n else {\n this.value = value;\n }\n }\n\n accept(visitor) {\n if (this.value) {\n this.value = visitor.visitArray(this.value);\n }\n }\n\n eval(context) {\n if (this.value.length === 1) {\n return this.value[0].eval(context);\n } else {\n return new Value(this.value.map(function (v) {\n return v.eval(context);\n }));\n }\n }\n\n genCSS(context, output) {\n let i;\n for (i = 0; i < this.value.length; i++) {\n this.value[i].genCSS(context, output);\n if (i + 1 < this.value.length) {\n output.add((context && context.compress) ? ',' : ', ');\n }\n }\n }\n}\n\nValue.prototype.type = 'Value';\nexport default Value;\n","import Node from './node';\n\nclass Keyword extends Node {\n constructor(value) {\n super();\n\n this.value = value;\n }\n\n genCSS(context, output) {\n if (this.value === '%') { throw { type: 'Syntax', message: 'Invalid % without number' }; }\n output.add(this.value);\n }\n}\n\nKeyword.prototype.type = 'Keyword';\n\nKeyword.True = new Keyword('true');\nKeyword.False = new Keyword('false');\n\nexport default Keyword;\n","import Node from './node';\n\nclass Anonymous extends Node {\n constructor(value, index, currentFileInfo, mapLines, rulesetLike, visibilityInfo) {\n super();\n\n this.value = value;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.mapLines = mapLines;\n this.rulesetLike = (typeof rulesetLike === 'undefined') ? false : rulesetLike;\n this.allowRoot = true;\n this.copyVisibilityInfo(visibilityInfo);\n }\n\n eval() {\n return new Anonymous(this.value, this._index, this._fileInfo, this.mapLines, this.rulesetLike, this.visibilityInfo());\n }\n\n compare(other) {\n return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n }\n\n isRulesetLike() {\n return this.rulesetLike;\n }\n\n genCSS(context, output) {\n this.nodeVisible = Boolean(this.value);\n if (this.nodeVisible) {\n output.add(this.value, this._fileInfo, this._index, this.mapLines);\n }\n }\n}\n\nAnonymous.prototype.type = 'Anonymous';\nexport default Anonymous;\n","import Node from './node';\nimport Value from './value';\nimport Keyword from './keyword';\nimport Anonymous from './anonymous';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\nclass Declaration extends Node {\n constructor(name, value, important, merge, index, currentFileInfo, inline, variable) {\n super();\n\n this.name = name;\n this.value = (value instanceof Node) ? value : new Value([value ? new Anonymous(value) : null]);\n this.important = important ? ` ${important.trim()}` : '';\n this.merge = merge;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.inline = inline || false;\n this.variable = (variable !== undefined) ? variable\n : (name.charAt && (name.charAt(0) === '@'));\n this.allowRoot = true;\n this.setParent(this.value, this);\n }\n\n genCSS(context, output) {\n output.add(this.name + (context.compress ? ':' : ': '), this.fileInfo(), this.getIndex());\n try {\n this.value.genCSS(context, output);\n }\n catch (e) {\n e.index = this._index;\n e.filename = this._fileInfo.filename;\n throw e;\n }\n output.add(this.important + ((this.inline || (context.lastRule && context.compress)) ? '' : ';'), this._fileInfo, this._index);\n }\n\n eval(context) {\n let mathBypass = false, prevMath, name = this.name, evaldValue, variable = this.variable;\n if (typeof name !== 'string') {\n // expand 'primitive' name directly to get\n // things faster (~10% for benchmark.less):\n name = (name.length === 1) && (name[0] instanceof Keyword) ?\n name[0].value : evalName(context, name);\n variable = false; // never treat expanded interpolation as new variable name\n }\n\n // @todo remove when parens-division is default\n if (name === 'font' && context.math === MATH.ALWAYS) {\n mathBypass = true;\n prevMath = context.math;\n context.math = MATH.PARENS_DIVISION;\n }\n try {\n context.importantScope.push({});\n evaldValue = this.value.eval(context);\n\n if (!this.variable && evaldValue.type === 'DetachedRuleset') {\n throw { message: 'Rulesets cannot be evaluated on a property.',\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n let important = this.important;\n const importantResult = context.importantScope.pop();\n if (!important && importantResult.important) {\n important = importantResult.important;\n }\n\n return new Declaration(name,\n evaldValue,\n important,\n this.merge,\n this.getIndex(), this.fileInfo(), this.inline,\n variable);\n }\n catch (e) {\n if (typeof e.index !== 'number') {\n e.index = this.getIndex();\n e.filename = this.fileInfo().filename;\n }\n throw e;\n }\n finally {\n if (mathBypass) {\n context.math = prevMath;\n }\n }\n }\n\n makeImportant() {\n return new Declaration(this.name,\n this.value,\n '!important',\n this.merge,\n this.getIndex(), this.fileInfo(), this.inline);\n }\n}\n\nfunction evalName(context, name) {\n let value = '';\n let i;\n const n = name.length;\n const output = {add: function (s) {value += s;}};\n for (i = 0; i < n; i++) {\n name[i].eval(context).genCSS(context, output);\n }\n return value;\n}\n\nDeclaration.prototype.type = 'Declaration';\nexport default Declaration;","class debugInfo {\n constructor(context, ctx, lineSeparator) {\n let result = '';\n if (context.dumpLineNumbers && !context.compress) {\n switch (context.dumpLineNumbers) {\n case 'comments':\n result = debugInfo.asComment(ctx);\n break;\n case 'mediaquery':\n result = debugInfo.asMediaQuery(ctx);\n break;\n case 'all':\n result = debugInfo.asComment(ctx) + (lineSeparator || '') + debugInfo.asMediaQuery(ctx);\n break;\n }\n }\n return result;\n }\n\n static asComment(ctx) {\n return `/* line ${ctx.debugInfo.lineNumber}, ${ctx.debugInfo.fileName} */\\n`;\n }\n\n static asMediaQuery(ctx) {\n let filenameWithProtocol = ctx.debugInfo.fileName;\n if (!/^[a-z]+:\\/\\//i.test(filenameWithProtocol)) {\n filenameWithProtocol = `file://${filenameWithProtocol}`;\n }\n return `@media -sass-debug-info{filename{font-family:${filenameWithProtocol.replace(/([.:\\/\\\\])/g, function (a) {\n if (a == '\\\\') {\n a = '\\/';\n }\n return `\\\\${a}`;\n})}}line{font-family:\\\\00003${ctx.debugInfo.lineNumber}}}\\n`;\n }\n}\n\nexport default debugInfo;\n","import Node from './node';\nimport getDebugInfo from './debug-info';\n\nclass Comment extends Node {\n constructor(value, isLineComment, index, currentFileInfo) {\n super();\n\n this.value = value;\n this.isLineComment = isLineComment;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.allowRoot = true;\n }\n\n genCSS(context, output) {\n if (this.debugInfo) {\n output.add(getDebugInfo(context, this), this.fileInfo(), this.getIndex());\n }\n output.add(this.value);\n }\n\n isSilent(context) {\n const isCompressed = context.compress && this.value[2] !== '!';\n return this.isLineComment || isCompressed;\n }\n}\n\nComment.prototype.type = 'Comment';\nexport default Comment;\n","const contexts = {};\nexport default contexts;\nimport * as Constants from './constants';\n\nconst copyFromOriginal = function copyFromOriginal(original, destination, propertiesToCopy) {\n if (!original) { return; }\n\n for (let i = 0; i < propertiesToCopy.length; i++) {\n if (original.hasOwnProperty(propertiesToCopy[i])) {\n destination[propertiesToCopy[i]] = original[propertiesToCopy[i]];\n }\n }\n};\n\n/*\n parse is used whilst parsing\n */\nconst parseCopyProperties = [\n // options\n 'paths', // option - unmodified - paths to search for imports on\n 'rewriteUrls', // option - whether to adjust URL's to be relative\n 'rootpath', // option - rootpath to append to URL's\n 'strictImports', // option -\n 'insecure', // option - whether to allow imports from insecure ssl hosts\n 'dumpLineNumbers', // option - whether to dump line numbers\n 'compress', // option - whether to compress\n 'syncImport', // option - whether to import synchronously\n 'chunkInput', // option - whether to chunk input. more performant but causes parse issues.\n 'mime', // browser only - mime type for sheet import\n 'useFileCache', // browser only - whether to use the per file session cache\n // context\n 'processImports', // option & context - whether to process imports. if false then imports will not be imported.\n // Used by the import manager to stop multiple import visitors being created.\n 'pluginManager' // Used as the plugin manager for the session\n];\n\ncontexts.Parse = function(options) {\n copyFromOriginal(options, this, parseCopyProperties);\n\n if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n};\n\nconst evalCopyProperties = [\n 'paths', // additional include paths\n 'compress', // whether to compress\n 'ieCompat', // whether to enforce IE compatibility (IE8 data-uri)\n 'math', // whether math has to be within parenthesis\n 'strictUnits', // whether units need to evaluate correctly\n 'sourceMap', // whether to output a source map\n 'importMultiple', // whether we are currently importing multiple copies\n 'urlArgs', // whether to add args into url tokens\n 'javascriptEnabled', // option - whether Inline JavaScript is enabled. if undefined, defaults to false\n 'pluginManager', // Used as the plugin manager for the session\n 'importantScope', // used to bubble up !important statements\n 'rewriteUrls' // option - whether to adjust URL's to be relative\n];\n\ncontexts.Eval = function(options, frames) {\n copyFromOriginal(options, this, evalCopyProperties);\n\n if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n\n this.frames = frames || [];\n this.importantScope = this.importantScope || [];\n};\n\ncontexts.Eval.prototype.enterCalc = function () {\n if (!this.calcStack) {\n this.calcStack = [];\n }\n this.calcStack.push(true);\n this.inCalc = true;\n};\n\ncontexts.Eval.prototype.exitCalc = function () {\n this.calcStack.pop();\n if (!this.calcStack.length) {\n this.inCalc = false;\n }\n};\n\ncontexts.Eval.prototype.inParenthesis = function () {\n if (!this.parensStack) {\n this.parensStack = [];\n }\n this.parensStack.push(true);\n};\n\ncontexts.Eval.prototype.outOfParenthesis = function () {\n this.parensStack.pop();\n};\n\ncontexts.Eval.prototype.inCalc = false;\ncontexts.Eval.prototype.mathOn = true;\ncontexts.Eval.prototype.isMathOn = function (op) {\n if (!this.mathOn) {\n return false;\n }\n if (op === '/' && this.math !== Constants.Math.ALWAYS && (!this.parensStack || !this.parensStack.length)) {\n return false;\n }\n if (this.math > Constants.Math.PARENS_DIVISION) {\n return this.parensStack && this.parensStack.length;\n }\n return true;\n};\n\ncontexts.Eval.prototype.pathRequiresRewrite = function (path) {\n const isRelative = this.rewriteUrls === Constants.RewriteUrls.LOCAL ? isPathLocalRelative : isPathRelative;\n\n return isRelative(path);\n};\n\ncontexts.Eval.prototype.rewritePath = function (path, rootpath) {\n let newPath;\n\n rootpath = rootpath || '';\n newPath = this.normalizePath(rootpath + path);\n\n // If a path was explicit relative and the rootpath was not an absolute path\n // we must ensure that the new path is also explicit relative.\n if (isPathLocalRelative(path) &&\n isPathRelative(rootpath) &&\n isPathLocalRelative(newPath) === false) {\n newPath = `./${newPath}`;\n }\n\n return newPath;\n};\n\ncontexts.Eval.prototype.normalizePath = function (path) {\n const segments = path.split('/').reverse();\n let segment;\n\n path = [];\n while (segments.length !== 0) {\n segment = segments.pop();\n switch ( segment ) {\n case '.':\n break;\n case '..':\n if ((path.length === 0) || (path[path.length - 1] === '..')) {\n path.push( segment );\n } else {\n path.pop();\n }\n break;\n default:\n path.push(segment);\n break;\n }\n }\n\n return path.join('/');\n};\n\nfunction isPathRelative(path) {\n return !/^(?:[a-z-]+:|\\/|#)/i.test(path);\n}\n\nfunction isPathLocalRelative(path) {\n return path.charAt(0) === '.';\n}\n\n// todo - do the same for the toCSS ?\n","function makeRegistry( base ) {\n return {\n _data: {},\n add: function(name, func) {\n // precautionary case conversion, as later querying of\n // the registry by function-caller uses lower case as well.\n name = name.toLowerCase();\n\n if (this._data.hasOwnProperty(name)) {\n // TODO warn\n }\n this._data[name] = func;\n },\n addMultiple: function(functions) {\n Object.keys(functions).forEach(\n name => {\n this.add(name, functions[name]);\n });\n },\n get: function(name) {\n return this._data[name] || ( base && base.get( name ));\n },\n getLocalFunctions: function() {\n return this._data;\n },\n inherit: function() {\n return makeRegistry( this );\n },\n create: function(base) {\n return makeRegistry(base);\n }\n };\n}\n\nexport default makeRegistry( null );","import Keyword from '../tree/keyword';\n\nconst defaultFunc = {\n eval: function () {\n const v = this.value_;\n const e = this.error_;\n if (e) {\n throw e;\n }\n if (v != null) {\n return v ? Keyword.True : Keyword.False;\n }\n },\n value: function (v) {\n this.value_ = v;\n },\n error: function (e) {\n this.error_ = e;\n },\n reset: function () {\n this.value_ = this.error_ = null;\n }\n};\n\nexport default defaultFunc;\n","import Node from './node';\nimport Declaration from './declaration';\nimport Keyword from './keyword';\nimport Comment from './comment';\nimport Paren from './paren';\nimport Selector from './selector';\nimport Element from './element';\nimport Anonymous from './anonymous';\nimport contexts from '../contexts';\nimport globalFunctionRegistry from '../functions/function-registry';\nimport defaultFunc from '../functions/default';\nimport getDebugInfo from './debug-info';\nimport * as utils from '../utils';\n\nclass Ruleset extends Node {\n constructor(selectors, rules, strictImports, visibilityInfo) {\n super();\n\n this.selectors = selectors;\n this.rules = rules;\n this._lookups = {};\n this._variables = null;\n this._properties = null;\n this.strictImports = strictImports;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n\n this.setParent(this.selectors, this);\n this.setParent(this.rules, this);\n\n }\n\n isRulesetLike() { return true; }\n\n accept(visitor) {\n if (this.paths) {\n this.paths = visitor.visitArray(this.paths, true);\n } else if (this.selectors) {\n this.selectors = visitor.visitArray(this.selectors);\n }\n if (this.rules && this.rules.length) {\n this.rules = visitor.visitArray(this.rules);\n }\n }\n\n eval(context) {\n const that = this;\n let selectors;\n let selCnt;\n let selector;\n let i;\n let hasVariable;\n let hasOnePassingSelector = false;\n\n if (this.selectors && (selCnt = this.selectors.length)) {\n selectors = new Array(selCnt);\n defaultFunc.error({\n type: 'Syntax',\n message: 'it is currently only allowed in parametric mixin guards,'\n });\n\n for (i = 0; i < selCnt; i++) {\n selector = this.selectors[i].eval(context);\n for (var j = 0; j < selector.elements.length; j++) {\n if (selector.elements[j].isVariable) {\n hasVariable = true;\n break;\n }\n }\n selectors[i] = selector;\n if (selector.evaldCondition) {\n hasOnePassingSelector = true;\n }\n }\n\n if (hasVariable) {\n const toParseSelectors = new Array(selCnt);\n for (i = 0; i < selCnt; i++) {\n selector = selectors[i];\n toParseSelectors[i] = selector.toCSS(context);\n }\n this.parse.parseNode(\n toParseSelectors.join(','),\n [\"selectors\"], \n selectors[0].getIndex(), \n selectors[0].fileInfo(), \n function(err, result) {\n if (result) {\n selectors = utils.flattenArray(result);\n }\n });\n }\n\n defaultFunc.reset();\n } else {\n hasOnePassingSelector = true;\n }\n\n let rules = this.rules ? utils.copyArray(this.rules) : null;\n const ruleset = new Ruleset(selectors, rules, this.strictImports, this.visibilityInfo());\n let rule;\n let subRule;\n\n ruleset.originalRuleset = this;\n ruleset.root = this.root;\n ruleset.firstRoot = this.firstRoot;\n ruleset.allowImports = this.allowImports;\n\n if (this.debugInfo) {\n ruleset.debugInfo = this.debugInfo;\n }\n\n if (!hasOnePassingSelector) {\n rules.length = 0;\n }\n\n // inherit a function registry from the frames stack when possible;\n // otherwise from the global registry\n ruleset.functionRegistry = (function (frames) {\n let i = 0;\n const n = frames.length;\n let found;\n for ( ; i !== n ; ++i ) {\n found = frames[ i ].functionRegistry;\n if ( found ) { return found; }\n }\n return globalFunctionRegistry;\n }(context.frames)).inherit();\n\n // push the current ruleset to the frames stack\n const ctxFrames = context.frames;\n ctxFrames.unshift(ruleset);\n\n // currrent selectors\n let ctxSelectors = context.selectors;\n if (!ctxSelectors) {\n context.selectors = ctxSelectors = [];\n }\n ctxSelectors.unshift(this.selectors);\n\n // Evaluate imports\n if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) {\n ruleset.evalImports(context);\n }\n\n // Store the frames around mixin definitions,\n // so they can be evaluated like closures when the time comes.\n const rsRules = ruleset.rules;\n for (i = 0; (rule = rsRules[i]); i++) {\n if (rule.evalFirst) {\n rsRules[i] = rule.eval(context);\n }\n }\n\n const mediaBlockCount = (context.mediaBlocks && context.mediaBlocks.length) || 0;\n\n // Evaluate mixin calls.\n for (i = 0; (rule = rsRules[i]); i++) {\n if (rule.type === 'MixinCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).filter(function(r) {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope if the variable is\n // already there. consider returning false here\n // but we need a way to \"return\" variable from mixins\n return !(ruleset.variable(r.name));\n }\n return true;\n });\n rsRules.splice.apply(rsRules, [i, 1].concat(rules));\n i += rules.length - 1;\n ruleset.resetCache();\n } else if (rule.type === 'VariableCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).rules.filter(function(r) {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope at all\n return false;\n }\n return true;\n });\n rsRules.splice.apply(rsRules, [i, 1].concat(rules));\n i += rules.length - 1;\n ruleset.resetCache();\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n if (!rule.evalFirst) {\n rsRules[i] = rule = rule.eval ? rule.eval(context) : rule;\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n // for rulesets, check if it is a css guard and can be removed\n if (rule instanceof Ruleset && rule.selectors && rule.selectors.length === 1) {\n // check if it can be folded in (e.g. & where)\n if (rule.selectors[0] && rule.selectors[0].isJustParentSelector()) {\n rsRules.splice(i--, 1);\n\n for (var j = 0; (subRule = rule.rules[j]); j++) {\n if (subRule instanceof Node) {\n subRule.copyVisibilityInfo(rule.visibilityInfo());\n if (!(subRule instanceof Declaration) || !subRule.variable) {\n rsRules.splice(++i, 0, subRule);\n }\n }\n }\n }\n }\n }\n\n // Pop the stack\n ctxFrames.shift();\n ctxSelectors.shift();\n\n if (context.mediaBlocks) {\n for (i = mediaBlockCount; i < context.mediaBlocks.length; i++) {\n context.mediaBlocks[i].bubbleSelectors(selectors);\n }\n }\n\n return ruleset;\n }\n\n evalImports(context) {\n const rules = this.rules;\n let i;\n let importRules;\n if (!rules) { return; }\n\n for (i = 0; i < rules.length; i++) {\n if (rules[i].type === 'Import') {\n importRules = rules[i].eval(context);\n if (importRules && (importRules.length || importRules.length === 0)) {\n rules.splice.apply(rules, [i, 1].concat(importRules));\n i += importRules.length - 1;\n } else {\n rules.splice(i, 1, importRules);\n }\n this.resetCache();\n }\n }\n }\n\n makeImportant() {\n const result = new Ruleset(this.selectors, this.rules.map(function (r) {\n if (r.makeImportant) {\n return r.makeImportant();\n } else {\n return r;\n }\n }), this.strictImports, this.visibilityInfo());\n\n return result;\n }\n\n matchArgs(args) {\n return !args || args.length === 0;\n }\n\n // lets you call a css selector with a guard\n matchCondition(args, context) {\n const lastSelector = this.selectors[this.selectors.length - 1];\n if (!lastSelector.evaldCondition) {\n return false;\n }\n if (lastSelector.condition &&\n !lastSelector.condition.eval(\n new contexts.Eval(context,\n context.frames))) {\n return false;\n }\n return true;\n }\n\n resetCache() {\n this._rulesets = null;\n this._variables = null;\n this._properties = null;\n this._lookups = {};\n }\n\n variables() {\n if (!this._variables) {\n this._variables = !this.rules ? {} : this.rules.reduce(function (hash, r) {\n if (r instanceof Declaration && r.variable === true) {\n hash[r.name] = r;\n }\n // when evaluating variables in an import statement, imports have not been eval'd\n // so we need to go inside import statements.\n // guard against root being a string (in the case of inlined less)\n if (r.type === 'Import' && r.root && r.root.variables) {\n const vars = r.root.variables();\n for (const name in vars) {\n if (vars.hasOwnProperty(name)) {\n hash[name] = r.root.variable(name);\n }\n }\n }\n return hash;\n }, {});\n }\n return this._variables;\n }\n\n properties() {\n if (!this._properties) {\n this._properties = !this.rules ? {} : this.rules.reduce(function (hash, r) {\n if (r instanceof Declaration && r.variable !== true) {\n const name = (r.name.length === 1) && (r.name[0] instanceof Keyword) ?\n r.name[0].value : r.name;\n // Properties don't overwrite as they can merge\n if (!hash[`$${name}`]) {\n hash[`$${name}`] = [ r ];\n }\n else {\n hash[`$${name}`].push(r);\n }\n }\n return hash;\n }, {});\n }\n return this._properties;\n }\n\n variable(name) {\n const decl = this.variables()[name];\n if (decl) {\n return this.parseValue(decl);\n }\n }\n\n property(name) {\n const decl = this.properties()[name];\n if (decl) {\n return this.parseValue(decl);\n }\n }\n\n lastDeclaration() {\n for (let i = this.rules.length; i > 0; i--) {\n const decl = this.rules[i - 1];\n if (decl instanceof Declaration) {\n return this.parseValue(decl);\n }\n }\n }\n\n parseValue(toParse) {\n const self = this;\n function transformDeclaration(decl) {\n if (decl.value instanceof Anonymous && !decl.parsed) {\n if (typeof decl.value.value === 'string') {\n this.parse.parseNode(\n decl.value.value,\n ['value', 'important'], \n decl.value.getIndex(), \n decl.fileInfo(), \n function(err, result) {\n if (err) {\n decl.parsed = true;\n }\n if (result) {\n decl.value = result[0];\n decl.important = result[1] || '';\n decl.parsed = true;\n }\n });\n } else {\n decl.parsed = true;\n }\n\n return decl;\n }\n else {\n return decl;\n }\n }\n if (!Array.isArray(toParse)) {\n return transformDeclaration.call(self, toParse);\n }\n else {\n const nodes = [];\n toParse.forEach(function(n) {\n nodes.push(transformDeclaration.call(self, n));\n });\n return nodes;\n }\n }\n\n rulesets() {\n if (!this.rules) { return []; }\n\n const filtRules = [];\n const rules = this.rules;\n let i;\n let rule;\n\n for (i = 0; (rule = rules[i]); i++) {\n if (rule.isRuleset) {\n filtRules.push(rule);\n }\n }\n\n return filtRules;\n }\n\n prependRule(rule) {\n const rules = this.rules;\n if (rules) {\n rules.unshift(rule);\n } else {\n this.rules = [ rule ];\n }\n this.setParent(rule, this);\n }\n\n find(selector, self, filter) {\n self = self || this;\n const rules = [];\n let match;\n let foundMixins;\n const key = selector.toCSS();\n\n if (key in this._lookups) { return this._lookups[key]; }\n\n this.rulesets().forEach(function (rule) {\n if (rule !== self) {\n for (let j = 0; j < rule.selectors.length; j++) {\n match = selector.match(rule.selectors[j]);\n if (match) {\n if (selector.elements.length > match) {\n if (!filter || filter(rule)) {\n foundMixins = rule.find(new Selector(selector.elements.slice(match)), self, filter);\n for (let i = 0; i < foundMixins.length; ++i) {\n foundMixins[i].path.push(rule);\n }\n Array.prototype.push.apply(rules, foundMixins);\n }\n } else {\n rules.push({ rule, path: []});\n }\n break;\n }\n }\n }\n });\n this._lookups[key] = rules;\n return rules;\n }\n\n genCSS(context, output) {\n let i;\n let j;\n const charsetRuleNodes = [];\n let ruleNodes = [];\n\n let // Line number debugging\n debugInfo;\n\n let rule;\n let path;\n\n context.tabLevel = (context.tabLevel || 0);\n\n if (!this.root) {\n context.tabLevel++;\n }\n\n const tabRuleStr = context.compress ? '' : Array(context.tabLevel + 1).join(' ');\n const tabSetStr = context.compress ? '' : Array(context.tabLevel).join(' ');\n let sep;\n\n let charsetNodeIndex = 0;\n let importNodeIndex = 0;\n for (i = 0; (rule = this.rules[i]); i++) {\n if (rule instanceof Comment) {\n if (importNodeIndex === i) {\n importNodeIndex++;\n }\n ruleNodes.push(rule);\n } else if (rule.isCharset && rule.isCharset()) {\n ruleNodes.splice(charsetNodeIndex, 0, rule);\n charsetNodeIndex++;\n importNodeIndex++;\n } else if (rule.type === 'Import') {\n ruleNodes.splice(importNodeIndex, 0, rule);\n importNodeIndex++;\n } else {\n ruleNodes.push(rule);\n }\n }\n ruleNodes = charsetRuleNodes.concat(ruleNodes);\n\n // If this is the root node, we don't render\n // a selector, or {}.\n if (!this.root) {\n debugInfo = getDebugInfo(context, this, tabSetStr);\n\n if (debugInfo) {\n output.add(debugInfo);\n output.add(tabSetStr);\n }\n\n const paths = this.paths;\n const pathCnt = paths.length;\n let pathSubCnt;\n\n sep = context.compress ? ',' : (`,\\n${tabSetStr}`);\n\n for (i = 0; i < pathCnt; i++) {\n path = paths[i];\n if (!(pathSubCnt = path.length)) { continue; }\n if (i > 0) { output.add(sep); }\n\n context.firstSelector = true;\n path[0].genCSS(context, output);\n\n context.firstSelector = false;\n for (j = 1; j < pathSubCnt; j++) {\n path[j].genCSS(context, output);\n }\n }\n\n output.add((context.compress ? '{' : ' {\\n') + tabRuleStr);\n }\n\n // Compile rules and rulesets\n for (i = 0; (rule = ruleNodes[i]); i++) {\n\n if (i + 1 === ruleNodes.length) {\n context.lastRule = true;\n }\n\n const currentLastRule = context.lastRule;\n if (rule.isRulesetLike(rule)) {\n context.lastRule = false;\n }\n\n if (rule.genCSS) {\n rule.genCSS(context, output);\n } else if (rule.value) {\n output.add(rule.value.toString());\n }\n\n context.lastRule = currentLastRule;\n\n if (!context.lastRule && rule.isVisible()) {\n output.add(context.compress ? '' : (`\\n${tabRuleStr}`));\n } else {\n context.lastRule = false;\n }\n }\n\n if (!this.root) {\n output.add((context.compress ? '}' : `\\n${tabSetStr}}`));\n context.tabLevel--;\n }\n\n if (!output.isEmpty() && !context.compress && this.firstRoot) {\n output.add('\\n');\n }\n }\n\n joinSelectors(paths, context, selectors) {\n for (let s = 0; s < selectors.length; s++) {\n this.joinSelector(paths, context, selectors[s]);\n }\n }\n\n joinSelector(paths, context, selector) {\n\n function createParenthesis(elementsToPak, originalElement) {\n let replacementParen, j;\n if (elementsToPak.length === 0) {\n replacementParen = new Paren(elementsToPak[0]);\n } else {\n const insideParent = new Array(elementsToPak.length);\n for (j = 0; j < elementsToPak.length; j++) {\n insideParent[j] = new Element(\n null,\n elementsToPak[j],\n originalElement.isVariable,\n originalElement._index,\n originalElement._fileInfo\n );\n }\n replacementParen = new Paren(new Selector(insideParent));\n }\n return replacementParen;\n }\n\n function createSelector(containedElement, originalElement) {\n let element, selector;\n element = new Element(null, containedElement, originalElement.isVariable, originalElement._index, originalElement._fileInfo);\n selector = new Selector([element]);\n return selector;\n }\n\n // joins selector path from `beginningPath` with selector path in `addPath`\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns concatenated path\n function addReplacementIntoPath(beginningPath, addPath, replacedElement, originalSelector) {\n let newSelectorPath, lastSelector, newJoinedSelector;\n // our new selector path\n newSelectorPath = [];\n\n // construct the joined selector - if & is the first thing this will be empty,\n // if not newJoinedSelector will be the last set of elements in the selector\n if (beginningPath.length > 0) {\n newSelectorPath = utils.copyArray(beginningPath);\n lastSelector = newSelectorPath.pop();\n newJoinedSelector = originalSelector.createDerived(utils.copyArray(lastSelector.elements));\n }\n else {\n newJoinedSelector = originalSelector.createDerived([]);\n }\n\n if (addPath.length > 0) {\n // /deep/ is a CSS4 selector - (removed, so should deprecate)\n // that is valid without anything in front of it\n // so if the & does not have a combinator that is \"\" or \" \" then\n // and there is a combinator on the parent, then grab that.\n // this also allows + a { & .b { .a & { ... though not sure why you would want to do that\n let combinator = replacedElement.combinator;\n\n const parentEl = addPath[0].elements[0];\n if (combinator.emptyOrWhitespace && !parentEl.combinator.emptyOrWhitespace) {\n combinator = parentEl.combinator;\n }\n // join the elements so far with the first part of the parent\n newJoinedSelector.elements.push(new Element(\n combinator,\n parentEl.value,\n replacedElement.isVariable,\n replacedElement._index,\n replacedElement._fileInfo\n ));\n newJoinedSelector.elements = newJoinedSelector.elements.concat(addPath[0].elements.slice(1));\n }\n\n // now add the joined selector - but only if it is not empty\n if (newJoinedSelector.elements.length !== 0) {\n newSelectorPath.push(newJoinedSelector);\n }\n\n // put together the parent selectors after the join (e.g. the rest of the parent)\n if (addPath.length > 1) {\n let restOfPath = addPath.slice(1);\n restOfPath = restOfPath.map(function (selector) {\n return selector.createDerived(selector.elements, []);\n });\n newSelectorPath = newSelectorPath.concat(restOfPath);\n }\n return newSelectorPath;\n }\n\n // joins selector path from `beginningPath` with every selector path in `addPaths` array\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns array with all concatenated paths\n function addAllReplacementsIntoPath( beginningPath, addPaths, replacedElement, originalSelector, result) {\n let j;\n for (j = 0; j < beginningPath.length; j++) {\n const newSelectorPath = addReplacementIntoPath(beginningPath[j], addPaths, replacedElement, originalSelector);\n result.push(newSelectorPath);\n }\n return result;\n }\n\n function mergeElementsOnToSelectors(elements, selectors) {\n let i, sel;\n\n if (elements.length === 0) {\n return ;\n }\n if (selectors.length === 0) {\n selectors.push([ new Selector(elements) ]);\n return;\n }\n\n for (i = 0; (sel = selectors[i]); i++) {\n // if the previous thing in sel is a parent this needs to join on to it\n if (sel.length > 0) {\n sel[sel.length - 1] = sel[sel.length - 1].createDerived(sel[sel.length - 1].elements.concat(elements));\n }\n else {\n sel.push(new Selector(elements));\n }\n }\n }\n\n // replace all parent selectors inside `inSelector` by content of `context` array\n // resulting selectors are returned inside `paths` array\n // returns true if `inSelector` contained at least one parent selector\n function replaceParentSelector(paths, context, inSelector) {\n // The paths are [[Selector]]\n // The first list is a list of comma separated selectors\n // The inner list is a list of inheritance separated selectors\n // e.g.\n // .a, .b {\n // .c {\n // }\n // }\n // == [[.a] [.c]] [[.b] [.c]]\n //\n let i, j, k, currentElements, newSelectors, selectorsMultiplied, sel, el, hadParentSelector = false, length, lastSelector;\n function findNestedSelector(element) {\n let maybeSelector;\n if (!(element.value instanceof Paren)) {\n return null;\n }\n\n maybeSelector = element.value.value;\n if (!(maybeSelector instanceof Selector)) {\n return null;\n }\n\n return maybeSelector;\n }\n\n // the elements from the current selector so far\n currentElements = [];\n // the current list of new selectors to add to the path.\n // We will build it up. We initiate it with one empty selector as we \"multiply\" the new selectors\n // by the parents\n newSelectors = [\n []\n ];\n\n for (i = 0; (el = inSelector.elements[i]); i++) {\n // non parent reference elements just get added\n if (el.value !== '&') {\n const nestedSelector = findNestedSelector(el);\n if (nestedSelector != null) {\n // merge the current list of non parent selector elements\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n const nestedPaths = [];\n let replaced;\n const replacedNewSelectors = [];\n replaced = replaceParentSelector(nestedPaths, context, nestedSelector);\n hadParentSelector = hadParentSelector || replaced;\n // the nestedPaths array should have only one member - replaceParentSelector does not multiply selectors\n for (k = 0; k < nestedPaths.length; k++) {\n const replacementSelector = createSelector(createParenthesis(nestedPaths[k], el), el);\n addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors);\n }\n newSelectors = replacedNewSelectors;\n currentElements = [];\n } else {\n currentElements.push(el);\n }\n\n } else {\n hadParentSelector = true;\n // the new list of selectors to add\n selectorsMultiplied = [];\n\n // merge the current list of non parent selector elements\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n // loop through our current selectors\n for (j = 0; j < newSelectors.length; j++) {\n sel = newSelectors[j];\n // if we don't have any parent paths, the & might be in a mixin so that it can be used\n // whether there are parents or not\n if (context.length === 0) {\n // the combinator used on el should now be applied to the next element instead so that\n // it is not lost\n if (sel.length > 0) {\n sel[0].elements.push(new Element(el.combinator, '', el.isVariable, el._index, el._fileInfo));\n }\n selectorsMultiplied.push(sel);\n }\n else {\n // and the parent selectors\n for (k = 0; k < context.length; k++) {\n // We need to put the current selectors\n // then join the last selector's elements on to the parents selectors\n const newSelectorPath = addReplacementIntoPath(sel, context[k], el, inSelector);\n // add that to our new set of selectors\n selectorsMultiplied.push(newSelectorPath);\n }\n }\n }\n\n // our new selectors has been multiplied, so reset the state\n newSelectors = selectorsMultiplied;\n currentElements = [];\n }\n }\n\n // if we have any elements left over (e.g. .a& .b == .b)\n // add them on to all the current selectors\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n for (i = 0; i < newSelectors.length; i++) {\n length = newSelectors[i].length;\n if (length > 0) {\n paths.push(newSelectors[i]);\n lastSelector = newSelectors[i][length - 1];\n newSelectors[i][length - 1] = lastSelector.createDerived(lastSelector.elements, inSelector.extendList);\n }\n }\n\n return hadParentSelector;\n }\n\n function deriveSelector(visibilityInfo, deriveFrom) {\n const newSelector = deriveFrom.createDerived(deriveFrom.elements, deriveFrom.extendList, deriveFrom.evaldCondition);\n newSelector.copyVisibilityInfo(visibilityInfo);\n return newSelector;\n }\n\n // joinSelector code follows\n let i, newPaths, hadParentSelector;\n\n newPaths = [];\n hadParentSelector = replaceParentSelector(newPaths, context, selector);\n\n if (!hadParentSelector) {\n if (context.length > 0) {\n newPaths = [];\n for (i = 0; i < context.length; i++) {\n\n const concatenated = context[i].map(deriveSelector.bind(this, selector.visibilityInfo()));\n\n concatenated.push(selector);\n newPaths.push(concatenated);\n }\n }\n else {\n newPaths = [[selector]];\n }\n }\n\n for (i = 0; i < newPaths.length; i++) {\n paths.push(newPaths[i]);\n }\n\n }\n}\n\nRuleset.prototype.type = 'Ruleset';\nRuleset.prototype.isRuleset = true;\nexport default Ruleset;\n","import Node from './node';\nimport Selector from './selector';\nimport Ruleset from './ruleset';\nimport Anonymous from './anonymous';\n\nclass AtRule extends Node {\n constructor(\n name,\n value,\n rules,\n index,\n currentFileInfo,\n debugInfo,\n isRooted,\n visibilityInfo\n ) {\n super();\n\n let i;\n\n this.name = name;\n this.value = (value instanceof Node) ? value : (value ? new Anonymous(value) : value);\n if (rules) {\n if (Array.isArray(rules)) {\n this.rules = rules;\n } else {\n this.rules = [rules];\n this.rules[0].selectors = (new Selector([], null, null, index, currentFileInfo)).createEmptySelectors();\n }\n for (i = 0; i < this.rules.length; i++) {\n this.rules[i].allowImports = true;\n }\n this.setParent(this.rules, this);\n }\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.debugInfo = debugInfo;\n this.isRooted = isRooted || false;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n }\n\n accept(visitor) {\n const value = this.value, rules = this.rules;\n if (rules) {\n this.rules = visitor.visitArray(rules);\n }\n if (value) {\n this.value = visitor.visit(value);\n }\n }\n\n isRulesetLike() {\n return this.rules || !this.isCharset();\n }\n\n isCharset() {\n return '@charset' === this.name;\n }\n\n genCSS(context, output) {\n const value = this.value, rules = this.rules;\n output.add(this.name, this.fileInfo(), this.getIndex());\n if (value) {\n output.add(' ');\n value.genCSS(context, output);\n }\n if (rules) {\n this.outputRuleset(context, output, rules);\n } else {\n output.add(';');\n }\n }\n\n eval(context) {\n let mediaPathBackup, mediaBlocksBackup, value = this.value, rules = this.rules;\n\n // media stored inside other atrule should not bubble over it\n // backpup media bubbling information\n mediaPathBackup = context.mediaPath;\n mediaBlocksBackup = context.mediaBlocks;\n // deleted media bubbling information\n context.mediaPath = [];\n context.mediaBlocks = [];\n\n if (value) {\n value = value.eval(context);\n }\n if (rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n rules = [rules[0].eval(context)];\n rules[0].root = true;\n }\n // restore media bubbling information\n context.mediaPath = mediaPathBackup;\n context.mediaBlocks = mediaBlocksBackup;\n\n return new AtRule(this.name, value, rules,\n this.getIndex(), this.fileInfo(), this.debugInfo, this.isRooted, this.visibilityInfo());\n }\n\n variable(name) {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.variable.call(this.rules[0], name);\n }\n }\n\n find() {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.find.apply(this.rules[0], arguments);\n }\n }\n\n rulesets() {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.rulesets.apply(this.rules[0]);\n }\n }\n\n outputRuleset(context, output, rules) {\n const ruleCnt = rules.length;\n let i;\n context.tabLevel = (context.tabLevel | 0) + 1;\n\n // Compressed\n if (context.compress) {\n output.add('{');\n for (i = 0; i < ruleCnt; i++) {\n rules[i].genCSS(context, output);\n }\n output.add('}');\n context.tabLevel--;\n return;\n }\n\n // Non-compressed\n const tabSetStr = `\\n${Array(context.tabLevel).join(' ')}`, tabRuleStr = `${tabSetStr} `;\n if (!ruleCnt) {\n output.add(` {${tabSetStr}}`);\n } else {\n output.add(` {${tabRuleStr}`);\n rules[0].genCSS(context, output);\n for (i = 1; i < ruleCnt; i++) {\n output.add(tabRuleStr);\n rules[i].genCSS(context, output);\n }\n output.add(`${tabSetStr}}`);\n }\n\n context.tabLevel--;\n }\n}\n\nAtRule.prototype.type = 'AtRule';\nexport default AtRule;\n","import Node from './node';\nimport contexts from '../contexts';\nimport * as utils from '../utils';\n\nclass DetachedRuleset extends Node {\n constructor(ruleset, frames) {\n super();\n\n this.ruleset = ruleset;\n this.frames = frames;\n this.setParent(this.ruleset, this);\n }\n\n accept(visitor) {\n this.ruleset = visitor.visit(this.ruleset);\n }\n\n eval(context) {\n const frames = this.frames || utils.copyArray(context.frames);\n return new DetachedRuleset(this.ruleset, frames);\n }\n\n callEval(context) {\n return this.ruleset.eval(this.frames ? new contexts.Eval(context, this.frames.concat(context.frames)) : context);\n }\n}\n\nDetachedRuleset.prototype.type = 'DetachedRuleset';\nDetachedRuleset.prototype.evalFirst = true;\nexport default DetachedRuleset;\n","import Node from './node';\nimport unitConversions from '../data/unit-conversions';\nimport * as utils from '../utils';\n\nclass Unit extends Node {\n constructor(numerator, denominator, backupUnit) {\n super();\n\n this.numerator = numerator ? utils.copyArray(numerator).sort() : [];\n this.denominator = denominator ? utils.copyArray(denominator).sort() : [];\n if (backupUnit) {\n this.backupUnit = backupUnit;\n } else if (numerator && numerator.length) {\n this.backupUnit = numerator[0];\n }\n }\n\n clone() {\n return new Unit(utils.copyArray(this.numerator), utils.copyArray(this.denominator), this.backupUnit);\n }\n\n genCSS(context, output) {\n // Dimension checks the unit is singular and throws an error if in strict math mode.\n const strictUnits = context && context.strictUnits;\n if (this.numerator.length === 1) {\n output.add(this.numerator[0]); // the ideal situation\n } else if (!strictUnits && this.backupUnit) {\n output.add(this.backupUnit);\n } else if (!strictUnits && this.denominator.length) {\n output.add(this.denominator[0]);\n }\n }\n\n toString() {\n let i, returnStr = this.numerator.join('*');\n for (i = 0; i < this.denominator.length; i++) {\n returnStr += `/${this.denominator[i]}`;\n }\n return returnStr;\n }\n\n compare(other) {\n return this.is(other.toString()) ? 0 : undefined;\n }\n\n is(unitString) {\n return this.toString().toUpperCase() === unitString.toUpperCase();\n }\n\n isLength() {\n return RegExp('^(px|em|ex|ch|rem|in|cm|mm|pc|pt|ex|vw|vh|vmin|vmax)$', 'gi').test(this.toCSS());\n }\n\n isEmpty() {\n return this.numerator.length === 0 && this.denominator.length === 0;\n }\n\n isSingular() {\n return this.numerator.length <= 1 && this.denominator.length === 0;\n }\n\n map(callback) {\n let i;\n\n for (i = 0; i < this.numerator.length; i++) {\n this.numerator[i] = callback(this.numerator[i], false);\n }\n\n for (i = 0; i < this.denominator.length; i++) {\n this.denominator[i] = callback(this.denominator[i], true);\n }\n }\n\n usedUnits() {\n let group;\n const result = {};\n let mapUnit;\n let groupName;\n\n mapUnit = function (atomicUnit) {\n /* jshint loopfunc:true */\n if (group.hasOwnProperty(atomicUnit) && !result[groupName]) {\n result[groupName] = atomicUnit;\n }\n\n return atomicUnit;\n };\n\n for (groupName in unitConversions) {\n if (unitConversions.hasOwnProperty(groupName)) {\n group = unitConversions[groupName];\n\n this.map(mapUnit);\n }\n }\n\n return result;\n }\n\n cancel() {\n const counter = {};\n let atomicUnit;\n let i;\n\n for (i = 0; i < this.numerator.length; i++) {\n atomicUnit = this.numerator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) + 1;\n }\n\n for (i = 0; i < this.denominator.length; i++) {\n atomicUnit = this.denominator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) - 1;\n }\n\n this.numerator = [];\n this.denominator = [];\n\n for (atomicUnit in counter) {\n if (counter.hasOwnProperty(atomicUnit)) {\n const count = counter[atomicUnit];\n\n if (count > 0) {\n for (i = 0; i < count; i++) {\n this.numerator.push(atomicUnit);\n }\n } else if (count < 0) {\n for (i = 0; i < -count; i++) {\n this.denominator.push(atomicUnit);\n }\n }\n }\n }\n\n this.numerator.sort();\n this.denominator.sort();\n }\n}\n\nUnit.prototype.type = 'Unit';\nexport default Unit;\n","import Node from './node';\nimport unitConversions from '../data/unit-conversions';\nimport Unit from './unit';\nimport Color from './color';\n\n//\n// A number with a unit\n//\nclass Dimension extends Node {\n constructor(value, unit) {\n super();\n\n this.value = parseFloat(value);\n if (isNaN(this.value)) {\n throw new Error('Dimension is not a number.');\n }\n this.unit = (unit && unit instanceof Unit) ? unit :\n new Unit(unit ? [unit] : undefined);\n this.setParent(this.unit, this);\n }\n\n accept(visitor) {\n this.unit = visitor.visit(this.unit);\n }\n\n eval(context) {\n return this;\n }\n\n toColor() {\n return new Color([this.value, this.value, this.value]);\n }\n\n genCSS(context, output) {\n if ((context && context.strictUnits) && !this.unit.isSingular()) {\n throw new Error(`Multiple units in dimension. Correct the units or use the unit function. Bad unit: ${this.unit.toString()}`);\n }\n\n const value = this.fround(context, this.value);\n let strValue = String(value);\n\n if (value !== 0 && value < 0.000001 && value > -0.000001) {\n // would be output 1e-6 etc.\n strValue = value.toFixed(20).replace(/0+$/, '');\n }\n\n if (context && context.compress) {\n // Zero values doesn't need a unit\n if (value === 0 && this.unit.isLength()) {\n output.add(strValue);\n return;\n }\n\n // Float values doesn't need a leading zero\n if (value > 0 && value < 1) {\n strValue = (strValue).substr(1);\n }\n }\n\n output.add(strValue);\n this.unit.genCSS(context, output);\n }\n\n // In an operation between two Dimensions,\n // we default to the first Dimension's unit,\n // so `1px + 2` will yield `3px`.\n operate(context, op, other) {\n /* jshint noempty:false */\n let value = this._operate(context, op, this.value, other.value), unit = this.unit.clone();\n\n if (op === '+' || op === '-') {\n if (unit.numerator.length === 0 && unit.denominator.length === 0) {\n unit = other.unit.clone();\n if (this.unit.backupUnit) {\n unit.backupUnit = this.unit.backupUnit;\n }\n } else if (other.unit.numerator.length === 0 && unit.denominator.length === 0) {\n // do nothing\n } else {\n other = other.convertTo(this.unit.usedUnits());\n\n if (context.strictUnits && other.unit.toString() !== unit.toString()) {\n throw new Error(`Incompatible units. Change the units or use the unit function. Bad units: '${unit.toString()}' and '${other.unit.toString()}'.`);\n }\n\n value = this._operate(context, op, this.value, other.value);\n }\n } else if (op === '*') {\n unit.numerator = unit.numerator.concat(other.unit.numerator).sort();\n unit.denominator = unit.denominator.concat(other.unit.denominator).sort();\n unit.cancel();\n } else if (op === '/') {\n unit.numerator = unit.numerator.concat(other.unit.denominator).sort();\n unit.denominator = unit.denominator.concat(other.unit.numerator).sort();\n unit.cancel();\n }\n return new Dimension(value, unit);\n }\n\n compare(other) {\n let a, b;\n\n if (!(other instanceof Dimension)) {\n return undefined;\n }\n\n if (this.unit.isEmpty() || other.unit.isEmpty()) {\n a = this;\n b = other;\n } else {\n a = this.unify();\n b = other.unify();\n if (a.unit.compare(b.unit) !== 0) {\n return undefined;\n }\n }\n\n return Node.numericCompare(a.value, b.value);\n }\n\n unify() {\n return this.convertTo({ length: 'px', duration: 's', angle: 'rad' });\n }\n\n convertTo(conversions) {\n let value = this.value;\n const unit = this.unit.clone();\n let i;\n let groupName;\n let group;\n let targetUnit;\n let derivedConversions = {};\n let applyUnit;\n\n if (typeof conversions === 'string') {\n for (i in unitConversions) {\n if (unitConversions[i].hasOwnProperty(conversions)) {\n derivedConversions = {};\n derivedConversions[i] = conversions;\n }\n }\n conversions = derivedConversions;\n }\n applyUnit = function (atomicUnit, denominator) {\n /* jshint loopfunc:true */\n if (group.hasOwnProperty(atomicUnit)) {\n if (denominator) {\n value = value / (group[atomicUnit] / group[targetUnit]);\n } else {\n value = value * (group[atomicUnit] / group[targetUnit]);\n }\n\n return targetUnit;\n }\n\n return atomicUnit;\n };\n\n for (groupName in conversions) {\n if (conversions.hasOwnProperty(groupName)) {\n targetUnit = conversions[groupName];\n group = unitConversions[groupName];\n\n unit.map(applyUnit);\n }\n }\n\n unit.cancel();\n\n return new Dimension(value, unit);\n }\n}\n\nDimension.prototype.type = 'Dimension';\nexport default Dimension;\n","import Node from './node';\nimport Color from './color';\nimport Dimension from './dimension';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\n\nclass Operation extends Node {\n constructor(op, operands, isSpaced) {\n super();\n\n this.op = op.trim();\n this.operands = operands;\n this.isSpaced = isSpaced;\n }\n\n accept(visitor) {\n this.operands = visitor.visitArray(this.operands);\n }\n\n eval(context) {\n let a = this.operands[0].eval(context), b = this.operands[1].eval(context), op;\n\n if (context.isMathOn(this.op)) {\n op = this.op === './' ? '/' : this.op;\n if (a instanceof Dimension && b instanceof Color) {\n a = a.toColor();\n }\n if (b instanceof Dimension && a instanceof Color) {\n b = b.toColor();\n }\n if (!a.operate) {\n if (a instanceof Operation && a.op === '/' && context.math === MATH.PARENS_DIVISION) {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n throw { type: 'Operation',\n message: 'Operation on an invalid type' };\n }\n\n return a.operate(context, op, b);\n } else {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n }\n\n genCSS(context, output) {\n this.operands[0].genCSS(context, output);\n if (this.isSpaced) {\n output.add(' ');\n }\n output.add(this.op);\n if (this.isSpaced) {\n output.add(' ');\n }\n this.operands[1].genCSS(context, output);\n }\n}\n\nOperation.prototype.type = 'Operation';\nexport default Operation;\n","import Node from './node';\nimport Paren from './paren';\nimport Comment from './comment';\nimport Dimension from './dimension';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\nclass Expression extends Node {\n constructor(value, noSpacing) {\n super();\n\n this.value = value;\n this.noSpacing = noSpacing;\n if (!value) {\n throw new Error('Expression requires an array parameter');\n }\n }\n\n accept(visitor) {\n this.value = visitor.visitArray(this.value);\n }\n\n eval(context) {\n let returnValue;\n const mathOn = context.isMathOn();\n const inParenthesis = this.parens;\n\n let doubleParen = false;\n if (inParenthesis) {\n context.inParenthesis();\n }\n if (this.value.length > 1) {\n returnValue = new Expression(this.value.map(function (e) {\n if (!e.eval) {\n return e;\n }\n return e.eval(context);\n }), this.noSpacing);\n } else if (this.value.length === 1) {\n if (this.value[0].parens && !this.value[0].parensInOp && !context.inCalc) {\n doubleParen = true;\n }\n returnValue = this.value[0].eval(context);\n } else {\n returnValue = this;\n }\n if (inParenthesis) {\n context.outOfParenthesis();\n }\n if (this.parens && this.parensInOp && !mathOn && !doubleParen \n && (!(returnValue instanceof Dimension))) {\n returnValue = new Paren(returnValue);\n }\n return returnValue;\n }\n\n genCSS(context, output) {\n for (let i = 0; i < this.value.length; i++) {\n this.value[i].genCSS(context, output);\n if (!this.noSpacing && i + 1 < this.value.length) {\n output.add(' ');\n }\n }\n }\n\n throwAwayComments() {\n this.value = this.value.filter(function(v) {\n return !(v instanceof Comment);\n });\n }\n}\n\nExpression.prototype.type = 'Expression';\nexport default Expression;\n","import Expression from '../tree/expression';\n\nclass functionCaller {\n constructor(name, context, index, currentFileInfo) {\n this.name = name.toLowerCase();\n this.index = index;\n this.context = context;\n this.currentFileInfo = currentFileInfo;\n\n this.func = context.frames[0].functionRegistry.get(this.name);\n }\n\n isValid() {\n return Boolean(this.func);\n }\n\n call(args) {\n if (!(Array.isArray(args))) {\n args = [args];\n }\n const evalArgs = this.func.evalArgs;\n if (evalArgs !== false) {\n args = args.map(a => a.eval(this.context));\n }\n const commentFilter = item => !(item.type === 'Comment');\n\n // This code is terrible and should be replaced as per this issue...\n // https://github.com/less/less.js/issues/2477\n args = args\n .filter(commentFilter)\n .map(item => {\n if (item.type === 'Expression') {\n const subNodes = item.value.filter(commentFilter);\n if (subNodes.length === 1) {\n return subNodes[0];\n } else {\n return new Expression(subNodes);\n }\n }\n return item;\n });\n\n if (evalArgs === false) {\n return this.func(this.context, ...args);\n }\n\n return this.func(...args);\n }\n}\n\nexport default functionCaller;\n","import Node from './node';\nimport Anonymous from './anonymous';\nimport FunctionCaller from '../functions/function-caller';\nimport logger from '../logger';\n\n//\n// A function call node.\n//\nclass Call extends Node {\n constructor(name, args, index, currentFileInfo) {\n super();\n\n this.name = name;\n this.args = args;\n this.calc = name === 'calc';\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n accept(visitor) {\n if (this.args) {\n this.args = visitor.visitArray(this.args);\n }\n }\n\n //\n // When evaluating a function call,\n // we either find the function in the functionRegistry,\n // in which case we call it, passing the evaluated arguments,\n // if this returns null or we cannot find the function, we\n // simply print it out as it appeared originally [2].\n //\n // The reason why we evaluate the arguments, is in the case where\n // we try to pass a variable to a function, like: `saturate(@color)`.\n // The function should receive the value, not the variable.\n //\n eval(context) {\n /**\n * Turn off math for calc(), and switch back on for evaluating nested functions\n */\n const currentMathContext = context.mathOn;\n context.mathOn = !this.calc;\n if (this.calc || context.inCalc) {\n context.enterCalc();\n }\n\n const exitCalc = () => {\n if (this.calc || context.inCalc) {\n context.exitCalc();\n }\n context.mathOn = currentMathContext;\n };\n\n let result;\n const funcCaller = new FunctionCaller(this.name, context, this.getIndex(), this.fileInfo());\n\n if (funcCaller.isValid()) {\n try {\n result = funcCaller.call(this.args);\n exitCalc();\n } catch (e) {\n if (e.hasOwnProperty('line') && e.hasOwnProperty('column')) {\n throw e;\n }\n throw { \n type: e.type || 'Runtime',\n message: `Error evaluating function \\`${this.name}\\`${e.message ? `: ${e.message}` : ''}`,\n index: this.getIndex(), \n filename: this.fileInfo().filename,\n line: e.lineNumber,\n column: e.columnNumber\n };\n }\n }\n\n if (result !== null && result !== undefined) {\n // Results that that are not nodes are cast as Anonymous nodes\n // Falsy values or booleans are returned as empty nodes\n if (!(result instanceof Node)) {\n if (!result || result === true) {\n result = new Anonymous(null); \n }\n else {\n result = new Anonymous(result.toString()); \n }\n \n }\n result._index = this._index;\n result._fileInfo = this._fileInfo;\n return result;\n }\n\n const args = this.args.map(a => a.eval(context));\n exitCalc();\n\n return new Call(this.name, args, this.getIndex(), this.fileInfo());\n }\n\n genCSS(context, output) {\n output.add(`${this.name}(`, this.fileInfo(), this.getIndex());\n\n for (let i = 0; i < this.args.length; i++) {\n this.args[i].genCSS(context, output);\n if (i + 1 < this.args.length) {\n output.add(', ');\n }\n }\n\n output.add(')');\n }\n}\n\nCall.prototype.type = 'Call';\nexport default Call;\n","import Node from './node';\nimport Call from './call';\n\nclass Variable extends Node {\n constructor(name, index, currentFileInfo) {\n super();\n\n this.name = name;\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n eval(context) {\n let variable, name = this.name;\n\n if (name.indexOf('@@') === 0) {\n name = `@${new Variable(name.slice(1), this.getIndex(), this.fileInfo()).eval(context).value}`;\n }\n\n if (this.evaluating) {\n throw { type: 'Name',\n message: `Recursive variable definition for ${name}`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n variable = this.find(context.frames, function (frame) {\n const v = frame.variable(name);\n if (v) {\n if (v.important) {\n const importantScope = context.importantScope[context.importantScope.length - 1];\n importantScope.important = v.important;\n }\n // If in calc, wrap vars in a function call to cascade evaluate args first\n if (context.inCalc) {\n return (new Call('_SELF', [v.value])).eval(context);\n }\n else {\n return v.value.eval(context);\n }\n }\n });\n if (variable) {\n this.evaluating = false;\n return variable;\n } else {\n throw { type: 'Name',\n message: `variable ${name} is undefined`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n }\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n}\n\nVariable.prototype.type = 'Variable';\nexport default Variable;\n","import Node from './node';\nimport Declaration from './declaration';\n\nclass Property extends Node {\n constructor(name, index, currentFileInfo) {\n super();\n\n this.name = name;\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n eval(context) {\n let property;\n const name = this.name;\n // TODO: shorten this reference\n const mergeRules = context.pluginManager.less.visitors.ToCSSVisitor.prototype._mergeRules;\n\n if (this.evaluating) {\n throw { type: 'Name',\n message: `Recursive property reference for ${name}`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n property = this.find(context.frames, function (frame) {\n let v;\n const vArr = frame.property(name);\n if (vArr) {\n for (let i = 0; i < vArr.length; i++) {\n v = vArr[i];\n\n vArr[i] = new Declaration(v.name,\n v.value,\n v.important,\n v.merge,\n v.index,\n v.currentFileInfo,\n v.inline,\n v.variable\n );\n }\n mergeRules(vArr);\n\n v = vArr[vArr.length - 1];\n if (v.important) {\n const importantScope = context.importantScope[context.importantScope.length - 1];\n importantScope.important = v.important;\n }\n v = v.value.eval(context);\n return v;\n }\n });\n if (property) {\n this.evaluating = false;\n return property;\n } else {\n throw { type: 'Name',\n message: `Property '${name}' is undefined`,\n filename: this.currentFileInfo.filename,\n index: this.index };\n }\n }\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n}\n\nProperty.prototype.type = 'Property';\nexport default Property;\n","import Node from './node';\n\nclass Attribute extends Node {\n constructor(key, op, value) {\n super();\n\n this.key = key;\n this.op = op;\n this.value = value;\n }\n\n eval(context) {\n return new Attribute(this.key.eval ? this.key.eval(context) : this.key,\n this.op, (this.value && this.value.eval) ? this.value.eval(context) : this.value);\n }\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n }\n\n toCSS(context) {\n let value = this.key.toCSS ? this.key.toCSS(context) : this.key;\n\n if (this.op) {\n value += this.op;\n value += (this.value.toCSS ? this.value.toCSS(context) : this.value);\n }\n\n return `[${value}]`;\n }\n}\n\nAttribute.prototype.type = 'Attribute';\nexport default Attribute;\n","import Node from './node';\nimport Variable from './variable';\nimport Property from './property';\n\n\nclass Quoted extends Node {\n constructor(str, content, escaped, index, currentFileInfo) {\n super();\n\n this.escaped = (escaped == null) ? true : escaped;\n this.value = content || '';\n this.quote = str.charAt(0);\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.variableRegex = /@\\{([\\w-]+)\\}/g;\n this.propRegex = /\\$\\{([\\w-]+)\\}/g;\n this.allowRoot = escaped;\n }\n\n genCSS(context, output) {\n if (!this.escaped) {\n output.add(this.quote, this.fileInfo(), this.getIndex());\n }\n output.add(this.value);\n if (!this.escaped) {\n output.add(this.quote);\n }\n }\n\n containsVariables() {\n return this.value.match(this.variableRegex);\n }\n\n eval(context) {\n const that = this;\n let value = this.value;\n const variableReplacement = function (_, name) {\n const v = new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v.value : v.toCSS();\n };\n const propertyReplacement = function (_, name) {\n const v = new Property(`$${name}`, that.getIndex(), that.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v.value : v.toCSS();\n };\n function iterativeReplace(value, regexp, replacementFnc) {\n let evaluatedValue = value;\n do {\n value = evaluatedValue.toString();\n evaluatedValue = value.replace(regexp, replacementFnc);\n } while (value !== evaluatedValue);\n return evaluatedValue;\n }\n value = iterativeReplace(value, this.variableRegex, variableReplacement);\n value = iterativeReplace(value, this.propRegex, propertyReplacement);\n return new Quoted(this.quote + value + this.quote, value, this.escaped, this.getIndex(), this.fileInfo());\n }\n\n compare(other) {\n // when comparing quoted strings allow the quote to differ\n if (other.type === 'Quoted' && !this.escaped && !other.escaped) {\n return Node.numericCompare(this.value, other.value);\n } else {\n return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n }\n }\n}\n\nQuoted.prototype.type = 'Quoted';\nexport default Quoted;\n","import Node from './node';\n\nclass URL extends Node {\n constructor(val, index, currentFileInfo, isEvald) {\n super();\n\n this.value = val;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.isEvald = isEvald;\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n genCSS(context, output) {\n output.add('url(');\n this.value.genCSS(context, output);\n output.add(')');\n }\n\n eval(context) {\n const val = this.value.eval(context);\n let rootpath;\n\n if (!this.isEvald) {\n // Add the rootpath if the URL requires a rewrite\n rootpath = this.fileInfo() && this.fileInfo().rootpath;\n if (typeof rootpath === 'string' &&\n typeof val.value === 'string' &&\n context.pathRequiresRewrite(val.value)) {\n if (!val.quote) {\n rootpath = escapePath(rootpath);\n }\n val.value = context.rewritePath(val.value, rootpath);\n } else {\n val.value = context.normalizePath(val.value);\n }\n\n // Add url args if enabled\n if (context.urlArgs) {\n if (!val.value.match(/^\\s*data:/)) {\n const delimiter = val.value.indexOf('?') === -1 ? '?' : '&';\n const urlArgs = delimiter + context.urlArgs;\n if (val.value.indexOf('#') !== -1) {\n val.value = val.value.replace('#', `${urlArgs}#`);\n } else {\n val.value += urlArgs;\n }\n }\n }\n }\n\n return new URL(val, this.getIndex(), this.fileInfo(), true);\n }\n}\n\nURL.prototype.type = 'Url';\n\nfunction escapePath(path) {\n return path.replace(/[\\(\\)'\"\\s]/g, function(match) { return `\\\\${match}`; });\n}\n\nexport default URL;\n","import Ruleset from './ruleset';\nimport Value from './value';\nimport Selector from './selector';\nimport Anonymous from './anonymous';\nimport Expression from './expression';\nimport AtRule from './atrule';\nimport * as utils from '../utils';\n\nclass Media extends AtRule {\n constructor(value, features, index, currentFileInfo, visibilityInfo) {\n super();\n\n this._index = index;\n this._fileInfo = currentFileInfo;\n\n const selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors();\n\n this.features = new Value(features);\n this.rules = [new Ruleset(selectors, value)];\n this.rules[0].allowImports = true;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n this.setParent(selectors, this);\n this.setParent(this.features, this);\n this.setParent(this.rules, this);\n }\n\n isRulesetLike() {\n return true;\n }\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this.features);\n }\n if (this.rules) {\n this.rules = visitor.visitArray(this.rules);\n }\n }\n\n genCSS(context, output) {\n output.add('@media ', this._fileInfo, this._index);\n this.features.genCSS(context, output);\n this.outputRuleset(context, output, this.rules);\n }\n\n eval(context) {\n if (!context.mediaBlocks) {\n context.mediaBlocks = [];\n context.mediaPath = [];\n }\n\n const media = new Media(null, [], this._index, this._fileInfo, this.visibilityInfo());\n if (this.debugInfo) {\n this.rules[0].debugInfo = this.debugInfo;\n media.debugInfo = this.debugInfo;\n }\n \n media.features = this.features.eval(context);\n\n context.mediaPath.push(media);\n context.mediaBlocks.push(media);\n\n this.rules[0].functionRegistry = context.frames[0].functionRegistry.inherit();\n context.frames.unshift(this.rules[0]);\n media.rules = [this.rules[0].eval(context)];\n context.frames.shift();\n\n context.mediaPath.pop();\n\n return context.mediaPath.length === 0 ? media.evalTop(context) :\n media.evalNested(context);\n }\n\n evalTop(context) {\n let result = this;\n\n // Render all dependent Media blocks.\n if (context.mediaBlocks.length > 1) {\n const selectors = (new Selector([], null, null, this.getIndex(), this.fileInfo())).createEmptySelectors();\n result = new Ruleset(selectors, context.mediaBlocks);\n result.multiMedia = true;\n result.copyVisibilityInfo(this.visibilityInfo());\n this.setParent(result, this);\n }\n\n delete context.mediaBlocks;\n delete context.mediaPath;\n\n return result;\n }\n\n evalNested(context) {\n let i;\n let value;\n const path = context.mediaPath.concat([this]);\n\n // Extract the media-query conditions separated with `,` (OR).\n for (i = 0; i < path.length; i++) {\n value = path[i].features instanceof Value ?\n path[i].features.value : path[i].features;\n path[i] = Array.isArray(value) ? value : [value];\n }\n\n // Trace all permutations to generate the resulting media-query.\n //\n // (a, b and c) with nested (d, e) ->\n // a and d\n // a and e\n // b and c and d\n // b and c and e\n this.features = new Value(this.permute(path).map(path => {\n path = path.map(fragment => fragment.toCSS ? fragment : new Anonymous(fragment));\n\n for (i = path.length - 1; i > 0; i--) {\n path.splice(i, 0, new Anonymous('and'));\n }\n\n return new Expression(path);\n }));\n this.setParent(this.features, this);\n\n // Fake a tree-node that doesn't output anything.\n return new Ruleset([], []);\n }\n\n permute(arr) {\n if (arr.length === 0) {\n return [];\n } else if (arr.length === 1) {\n return arr[0];\n } else {\n const result = [];\n const rest = this.permute(arr.slice(1));\n for (let i = 0; i < rest.length; i++) {\n for (let j = 0; j < arr[0].length; j++) {\n result.push([arr[0][j]].concat(rest[i]));\n }\n }\n return result;\n }\n }\n\n bubbleSelectors(selectors) {\n if (!selectors) {\n return;\n }\n this.rules = [new Ruleset(utils.copyArray(selectors), [this.rules[0]])];\n this.setParent(this.rules, this);\n }\n}\n\nMedia.prototype.type = 'Media';\nexport default Media;\n","import Node from './node';\nimport Media from './media';\nimport URL from './url';\nimport Quoted from './quoted';\nimport Ruleset from './ruleset';\nimport Anonymous from './anonymous';\nimport * as utils from '../utils';\nimport LessError from '../less-error';\n\n//\n// CSS @import node\n//\n// The general strategy here is that we don't want to wait\n// for the parsing to be completed, before we start importing\n// the file. That's because in the context of a browser,\n// most of the time will be spent waiting for the server to respond.\n//\n// On creation, we push the import path to our import queue, though\n// `import,push`, we also pass it a callback, which it'll call once\n// the file has been fetched, and parsed.\n//\nclass Import extends Node {\n constructor(path, features, options, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.options = options;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.path = path;\n this.features = features;\n this.allowRoot = true;\n\n if (this.options.less !== undefined || this.options.inline) {\n this.css = !this.options.less || this.options.inline;\n } else {\n const pathValue = this.getPath();\n if (pathValue && /[#\\.\\&\\?]css([\\?;].*)?$/.test(pathValue)) {\n this.css = true;\n }\n }\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.features, this);\n this.setParent(this.path, this);\n }\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this.features);\n }\n this.path = visitor.visit(this.path);\n if (!this.options.isPlugin && !this.options.inline && this.root) {\n this.root = visitor.visit(this.root);\n }\n }\n\n genCSS(context, output) {\n if (this.css && this.path._fileInfo.reference === undefined) {\n output.add('@import ', this._fileInfo, this._index);\n this.path.genCSS(context, output);\n if (this.features) {\n output.add(' ');\n this.features.genCSS(context, output);\n }\n output.add(';');\n }\n }\n\n getPath() {\n return (this.path instanceof URL) ?\n this.path.value.value : this.path.value;\n }\n\n isVariableImport() {\n let path = this.path;\n if (path instanceof URL) {\n path = path.value;\n }\n if (path instanceof Quoted) {\n return path.containsVariables();\n }\n\n return true;\n }\n\n evalForImport(context) {\n let path = this.path;\n\n if (path instanceof URL) {\n path = path.value;\n }\n\n return new Import(path.eval(context), this.features, this.options, this._index, this._fileInfo, this.visibilityInfo());\n }\n\n evalPath(context) {\n const path = this.path.eval(context);\n const fileInfo = this._fileInfo;\n\n if (!(path instanceof URL)) {\n // Add the rootpath if the URL requires a rewrite\n const pathValue = path.value;\n if (fileInfo &&\n pathValue &&\n context.pathRequiresRewrite(pathValue)) {\n path.value = context.rewritePath(pathValue, fileInfo.rootpath);\n } else {\n path.value = context.normalizePath(path.value);\n }\n }\n\n return path;\n }\n\n eval(context) {\n const result = this.doEval(context);\n if (this.options.reference || this.blocksVisibility()) {\n if (result.length || result.length === 0) {\n result.forEach(function (node) {\n node.addVisibilityBlock();\n }\n );\n } else {\n result.addVisibilityBlock();\n }\n }\n return result;\n }\n\n doEval(context) {\n let ruleset;\n let registry;\n const features = this.features && this.features.eval(context);\n\n if (this.options.isPlugin) {\n if (this.root && this.root.eval) {\n try {\n this.root.eval(context);\n }\n catch (e) {\n e.message = 'Plugin error during evaluation';\n throw new LessError(e, this.root.imports, this.root.filename);\n }\n }\n registry = context.frames[0] && context.frames[0].functionRegistry;\n if ( registry && this.root && this.root.functions ) {\n registry.addMultiple( this.root.functions );\n }\n\n return [];\n }\n\n if (this.skip) {\n if (typeof this.skip === 'function') {\n this.skip = this.skip();\n }\n if (this.skip) {\n return [];\n }\n }\n if (this.options.inline) {\n const contents = new Anonymous(this.root, 0,\n {\n filename: this.importedFilename,\n reference: this.path._fileInfo && this.path._fileInfo.reference\n }, true, true);\n\n return this.features ? new Media([contents], this.features.value) : [contents];\n } else if (this.css) {\n const newImport = new Import(this.evalPath(context), features, this.options, this._index);\n if (!newImport.css && this.error) {\n throw this.error;\n }\n return newImport;\n } else if (this.root) {\n ruleset = new Ruleset(null, utils.copyArray(this.root.rules));\n ruleset.evalImports(context);\n\n return this.features ? new Media(ruleset.rules, this.features.value) : ruleset.rules;\n } else {\n return [];\n }\n }\n}\n\nImport.prototype.type = 'Import';\nexport default Import;\n","import Node from './node';\nimport Variable from './variable';\n\nclass JsEvalNode extends Node {\n evaluateJavaScript(expression, context) {\n let result;\n const that = this;\n const evalContext = {};\n\n if (!context.javascriptEnabled) {\n throw { message: 'Inline JavaScript is not enabled. Is it set in your options?',\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n expression = expression.replace(/@\\{([\\w-]+)\\}/g, function (_, name) {\n return that.jsify(new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context));\n });\n\n try {\n expression = new Function(`return (${expression})`);\n } catch (e) {\n throw { message: `JavaScript evaluation error: ${e.message} from \\`${expression}\\`` ,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n const variables = context.frames[0].variables();\n for (const k in variables) {\n if (variables.hasOwnProperty(k)) {\n /* jshint loopfunc:true */\n evalContext[k.slice(1)] = {\n value: variables[k].value,\n toJS: function () {\n return this.value.eval(context).toCSS();\n }\n };\n }\n }\n\n try {\n result = expression.call(evalContext);\n } catch (e) {\n throw { message: `JavaScript evaluation error: '${e.name}: ${e.message.replace(/[\"]/g, '\\'')}'` ,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n return result;\n }\n\n jsify(obj) {\n if (Array.isArray(obj.value) && (obj.value.length > 1)) {\n return `[${obj.value.map(function (v) { return v.toCSS(); }).join(', ')}]`;\n } else {\n return obj.toCSS();\n }\n }\n}\n\nexport default JsEvalNode;\n","import JsEvalNode from './js-eval-node';\nimport Dimension from './dimension';\nimport Quoted from './quoted';\nimport Anonymous from './anonymous';\n\nclass JavaScript extends JsEvalNode {\n constructor(string, escaped, index, currentFileInfo) {\n super();\n\n this.escaped = escaped;\n this.expression = string;\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n eval(context) {\n const result = this.evaluateJavaScript(this.expression, context);\n const type = typeof result;\n\n if (type === 'number' && !isNaN(result)) {\n return new Dimension(result);\n } else if (type === 'string') {\n return new Quoted(`\"${result}\"`, result, this.escaped, this._index);\n } else if (Array.isArray(result)) {\n return new Anonymous(result.join(', '));\n } else {\n return new Anonymous(result);\n }\n }\n}\n\nJavaScript.prototype.type = 'JavaScript';\nexport default JavaScript;\n","import Node from './node';\n\nclass Assignment extends Node {\n constructor(key, val) {\n super();\n\n this.key = key;\n this.value = val;\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n eval(context) {\n if (this.value.eval) {\n return new Assignment(this.key, this.value.eval(context));\n }\n return this;\n }\n\n genCSS(context, output) {\n output.add(`${this.key}=`);\n if (this.value.genCSS) {\n this.value.genCSS(context, output);\n } else {\n output.add(this.value);\n }\n }\n}\n\nAssignment.prototype.type = 'Assignment';\nexport default Assignment;\n","import Node from './node';\n\nclass Condition extends Node {\n constructor(op, l, r, i, negate) {\n super();\n\n this.op = op.trim();\n this.lvalue = l;\n this.rvalue = r;\n this._index = i;\n this.negate = negate;\n }\n\n accept(visitor) {\n this.lvalue = visitor.visit(this.lvalue);\n this.rvalue = visitor.visit(this.rvalue);\n }\n\n eval(context) {\n const result = (function (op, a, b) {\n switch (op) {\n case 'and': return a && b;\n case 'or': return a || b;\n default:\n switch (Node.compare(a, b)) {\n case -1:\n return op === '<' || op === '=<' || op === '<=';\n case 0:\n return op === '=' || op === '>=' || op === '=<' || op === '<=';\n case 1:\n return op === '>' || op === '>=';\n default:\n return false;\n }\n }\n })(this.op, this.lvalue.eval(context), this.rvalue.eval(context));\n\n return this.negate ? !result : result;\n }\n}\n\nCondition.prototype.type = 'Condition';\nexport default Condition;\n","import Node from './node';\n\nclass UnicodeDescriptor extends Node {\n constructor(value) {\n super();\n\n this.value = value;\n }\n}\n\nUnicodeDescriptor.prototype.type = 'UnicodeDescriptor';\n\nexport default UnicodeDescriptor;\n","import Node from './node';\nimport Operation from './operation';\nimport Dimension from './dimension';\n\nclass Negative extends Node {\n constructor(node) {\n super();\n\n this.value = node;\n }\n\n genCSS(context, output) {\n output.add('-');\n this.value.genCSS(context, output);\n }\n\n eval(context) {\n if (context.isMathOn()) {\n return (new Operation('*', [new Dimension(-1), this.value])).eval(context);\n }\n return new Negative(this.value.eval(context));\n }\n}\n\nNegative.prototype.type = 'Negative';\nexport default Negative;\n","import Node from './node';\nimport Selector from './selector';\n\nclass Extend extends Node {\n constructor(selector, option, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.selector = selector;\n this.option = option;\n this.object_id = Extend.next_id++;\n this.parent_ids = [this.object_id];\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n\n switch (option) {\n case 'all':\n this.allowBefore = true;\n this.allowAfter = true;\n break;\n default:\n this.allowBefore = false;\n this.allowAfter = false;\n break;\n }\n this.setParent(this.selector, this);\n }\n\n accept(visitor) {\n this.selector = visitor.visit(this.selector);\n }\n\n eval(context) {\n return new Extend(this.selector.eval(context), this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n }\n\n clone(context) {\n return new Extend(this.selector, this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n }\n\n // it concatenates (joins) all selectors in selector array\n findSelfSelectors(selectors) {\n let selfElements = [], i, selectorElements;\n\n for (i = 0; i < selectors.length; i++) {\n selectorElements = selectors[i].elements;\n // duplicate the logic in genCSS function inside the selector node.\n // future TODO - move both logics into the selector joiner visitor\n if (i > 0 && selectorElements.length && selectorElements[0].combinator.value === '') {\n selectorElements[0].combinator.value = ' ';\n }\n selfElements = selfElements.concat(selectors[i].elements);\n }\n\n this.selfSelectors = [new Selector(selfElements)];\n this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo());\n }\n}\n\nExtend.next_id = 0;\n\nExtend.prototype.type = 'Extend';\nexport default Extend;\n","import Node from './node';\nimport Variable from './variable';\nimport Ruleset from './ruleset';\nimport DetachedRuleset from './detached-ruleset';\nimport LessError from '../less-error';\n\nclass VariableCall extends Node {\n constructor(variable, index, currentFileInfo) {\n super();\n\n this.variable = variable;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.allowRoot = true;\n }\n\n eval(context) {\n let rules;\n let detachedRuleset = new Variable(this.variable, this.getIndex(), this.fileInfo()).eval(context);\n const error = new LessError({message: `Could not evaluate variable call ${this.variable}`});\n\n if (!detachedRuleset.ruleset) {\n if (detachedRuleset.rules) {\n rules = detachedRuleset;\n }\n else if (Array.isArray(detachedRuleset)) {\n rules = new Ruleset('', detachedRuleset);\n }\n else if (Array.isArray(detachedRuleset.value)) {\n rules = new Ruleset('', detachedRuleset.value);\n }\n else {\n throw error;\n }\n detachedRuleset = new DetachedRuleset(rules);\n }\n\n if (detachedRuleset.ruleset) {\n return detachedRuleset.callEval(context);\n }\n throw error;\n }\n}\n\nVariableCall.prototype.type = 'VariableCall';\nexport default VariableCall;\n","import Node from './node';\nimport Variable from './variable';\nimport Ruleset from './ruleset';\nimport Selector from './selector';\n\nclass NamespaceValue extends Node {\n constructor(ruleCall, lookups, index, fileInfo) {\n super();\n\n this.value = ruleCall;\n this.lookups = lookups;\n this._index = index;\n this._fileInfo = fileInfo;\n }\n\n eval(context) {\n let i, j, name, rules = this.value.eval(context);\n \n for (i = 0; i < this.lookups.length; i++) {\n name = this.lookups[i];\n\n /**\n * Eval'd DRs return rulesets.\n * Eval'd mixins return rules, so let's make a ruleset if we need it.\n * We need to do this because of late parsing of values\n */\n if (Array.isArray(rules)) {\n rules = new Ruleset([new Selector()], rules);\n }\n\n if (name === '') {\n rules = rules.lastDeclaration();\n }\n else if (name.charAt(0) === '@') {\n if (name.charAt(1) === '@') {\n name = `@${new Variable(name.substr(1)).eval(context).value}`;\n }\n if (rules.variables) {\n rules = rules.variable(name);\n }\n \n if (!rules) {\n throw { type: 'Name',\n message: `variable ${name} not found`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n }\n else {\n if (name.substring(0, 2) === '$@') {\n name = `$${new Variable(name.substr(1)).eval(context).value}`;\n }\n else {\n name = name.charAt(0) === '$' ? name : `$${name}`;\n }\n if (rules.properties) {\n rules = rules.property(name);\n }\n \n if (!rules) {\n throw { type: 'Name',\n message: `property \"${name.substr(1)}\" not found`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n // Properties are an array of values, since a ruleset can have multiple props.\n // We pick the last one (the \"cascaded\" value)\n rules = rules[rules.length - 1];\n }\n\n if (rules.value) {\n rules = rules.eval(context).value;\n }\n if (rules.ruleset) {\n rules = rules.ruleset.eval(context);\n }\n }\n return rules;\n }\n}\n\nNamespaceValue.prototype.type = 'NamespaceValue';\nexport default NamespaceValue;\n","import Selector from './selector';\nimport Element from './element';\nimport Ruleset from './ruleset';\nimport Declaration from './declaration';\nimport DetachedRuleset from './detached-ruleset';\nimport Expression from './expression';\nimport contexts from '../contexts';\nimport * as utils from '../utils';\n\nclass Definition extends Ruleset {\n constructor(name, params, rules, condition, variadic, frames, visibilityInfo) {\n super();\n\n this.name = name || 'anonymous mixin';\n this.selectors = [new Selector([new Element(null, name, false, this._index, this._fileInfo)])];\n this.params = params;\n this.condition = condition;\n this.variadic = variadic;\n this.arity = params.length;\n this.rules = rules;\n this._lookups = {};\n const optionalParameters = [];\n this.required = params.reduce(function (count, p) {\n if (!p.name || (p.name && !p.value)) {\n return count + 1;\n }\n else {\n optionalParameters.push(p.name);\n return count;\n }\n }, 0);\n this.optionalParameters = optionalParameters;\n this.frames = frames;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n }\n\n accept(visitor) {\n if (this.params && this.params.length) {\n this.params = visitor.visitArray(this.params);\n }\n this.rules = visitor.visitArray(this.rules);\n if (this.condition) {\n this.condition = visitor.visit(this.condition);\n }\n }\n\n evalParams(context, mixinEnv, args, evaldArguments) {\n /* jshint boss:true */\n const frame = new Ruleset(null, null);\n\n let varargs;\n let arg;\n const params = utils.copyArray(this.params);\n let i;\n let j;\n let val;\n let name;\n let isNamedFound;\n let argIndex;\n let argsLength = 0;\n\n if (mixinEnv.frames && mixinEnv.frames[0] && mixinEnv.frames[0].functionRegistry) {\n frame.functionRegistry = mixinEnv.frames[0].functionRegistry.inherit();\n }\n mixinEnv = new contexts.Eval(mixinEnv, [frame].concat(mixinEnv.frames));\n\n if (args) {\n args = utils.copyArray(args);\n argsLength = args.length;\n\n for (i = 0; i < argsLength; i++) {\n arg = args[i];\n if (name = (arg && arg.name)) {\n isNamedFound = false;\n for (j = 0; j < params.length; j++) {\n if (!evaldArguments[j] && name === params[j].name) {\n evaldArguments[j] = arg.value.eval(context);\n frame.prependRule(new Declaration(name, arg.value.eval(context)));\n isNamedFound = true;\n break;\n }\n }\n if (isNamedFound) {\n args.splice(i, 1);\n i--;\n continue;\n } else {\n throw { type: 'Runtime', message: `Named argument for ${this.name} ${args[i].name} not found` };\n }\n }\n }\n }\n argIndex = 0;\n for (i = 0; i < params.length; i++) {\n if (evaldArguments[i]) { continue; }\n\n arg = args && args[argIndex];\n\n if (name = params[i].name) {\n if (params[i].variadic) {\n varargs = [];\n for (j = argIndex; j < argsLength; j++) {\n varargs.push(args[j].value.eval(context));\n }\n frame.prependRule(new Declaration(name, new Expression(varargs).eval(context)));\n } else {\n val = arg && arg.value;\n if (val) {\n // This was a mixin call, pass in a detached ruleset of it's eval'd rules\n if (Array.isArray(val)) {\n val = new DetachedRuleset(new Ruleset('', val));\n }\n else {\n val = val.eval(context);\n }\n } else if (params[i].value) {\n val = params[i].value.eval(mixinEnv);\n frame.resetCache();\n } else {\n throw { type: 'Runtime', message: `wrong number of arguments for ${this.name} (${argsLength} for ${this.arity})` };\n }\n\n frame.prependRule(new Declaration(name, val));\n evaldArguments[i] = val;\n }\n }\n\n if (params[i].variadic && args) {\n for (j = argIndex; j < argsLength; j++) {\n evaldArguments[j] = args[j].value.eval(context);\n }\n }\n argIndex++;\n }\n\n return frame;\n }\n\n makeImportant() {\n const rules = !this.rules ? this.rules : this.rules.map(function (r) {\n if (r.makeImportant) {\n return r.makeImportant(true);\n } else {\n return r;\n }\n });\n const result = new Definition(this.name, this.params, rules, this.condition, this.variadic, this.frames);\n return result;\n }\n\n eval(context) {\n return new Definition(this.name, this.params, this.rules, this.condition, this.variadic, this.frames || utils.copyArray(context.frames));\n }\n\n evalCall(context, args, important) {\n const _arguments = [];\n const mixinFrames = this.frames ? this.frames.concat(context.frames) : context.frames;\n const frame = this.evalParams(context, new contexts.Eval(context, mixinFrames), args, _arguments);\n let rules;\n let ruleset;\n\n frame.prependRule(new Declaration('@arguments', new Expression(_arguments).eval(context)));\n\n rules = utils.copyArray(this.rules);\n\n ruleset = new Ruleset(null, rules);\n ruleset.originalRuleset = this;\n ruleset = ruleset.eval(new contexts.Eval(context, [this, frame].concat(mixinFrames)));\n if (important) {\n ruleset = ruleset.makeImportant();\n }\n return ruleset;\n }\n\n matchCondition(args, context) {\n if (this.condition && !this.condition.eval(\n new contexts.Eval(context,\n [this.evalParams(context, /* the parameter variables */\n new contexts.Eval(context, this.frames ? this.frames.concat(context.frames) : context.frames), args, [])]\n .concat(this.frames || []) // the parent namespace/mixin frames\n .concat(context.frames)))) { // the current environment frames\n return false;\n }\n return true;\n }\n\n matchArgs(args, context) {\n const allArgsCnt = (args && args.length) || 0;\n let len;\n const optionalParameters = this.optionalParameters;\n const requiredArgsCnt = !args ? 0 : args.reduce(function (count, p) {\n if (optionalParameters.indexOf(p.name) < 0) {\n return count + 1;\n } else {\n return count;\n }\n }, 0);\n\n if (!this.variadic) {\n if (requiredArgsCnt < this.required) {\n return false;\n }\n if (allArgsCnt > this.params.length) {\n return false;\n }\n } else {\n if (requiredArgsCnt < (this.required - 1)) {\n return false;\n }\n }\n\n // check patterns\n len = Math.min(requiredArgsCnt, this.arity);\n\n for (let i = 0; i < len; i++) {\n if (!this.params[i].name && !this.params[i].variadic) {\n if (args[i].value.eval(context).toCSS() != this.params[i].value.eval(context).toCSS()) {\n return false;\n }\n }\n }\n return true;\n }\n}\n\nDefinition.prototype.type = 'MixinDefinition';\nDefinition.prototype.evalFirst = true;\nexport default Definition;\n","import Node from './node';\nimport Selector from './selector';\nimport MixinDefinition from './mixin-definition';\nimport defaultFunc from '../functions/default';\n\nclass MixinCall extends Node {\n constructor(elements, args, index, currentFileInfo, important) {\n super();\n\n this.selector = new Selector(elements);\n this.arguments = args || [];\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.important = important;\n this.allowRoot = true;\n this.setParent(this.selector, this);\n }\n\n accept(visitor) {\n if (this.selector) {\n this.selector = visitor.visit(this.selector);\n }\n if (this.arguments.length) {\n this.arguments = visitor.visitArray(this.arguments);\n }\n }\n\n eval(context) {\n let mixins;\n let mixin;\n let mixinPath;\n const args = [];\n let arg;\n let argValue;\n const rules = [];\n let match = false;\n let i;\n let m;\n let f;\n let isRecursive;\n let isOneFound;\n const candidates = [];\n let candidate;\n const conditionResult = [];\n let defaultResult;\n const defFalseEitherCase = -1;\n const defNone = 0;\n const defTrue = 1;\n const defFalse = 2;\n let count;\n let originalRuleset;\n let noArgumentsFilter;\n\n this.selector = this.selector.eval(context);\n\n function calcDefGroup(mixin, mixinPath) {\n let f, p, namespace;\n\n for (f = 0; f < 2; f++) {\n conditionResult[f] = true;\n defaultFunc.value(f);\n for (p = 0; p < mixinPath.length && conditionResult[f]; p++) {\n namespace = mixinPath[p];\n if (namespace.matchCondition) {\n conditionResult[f] = conditionResult[f] && namespace.matchCondition(null, context);\n }\n }\n if (mixin.matchCondition) {\n conditionResult[f] = conditionResult[f] && mixin.matchCondition(args, context);\n }\n }\n if (conditionResult[0] || conditionResult[1]) {\n if (conditionResult[0] != conditionResult[1]) {\n return conditionResult[1] ?\n defTrue : defFalse;\n }\n\n return defNone;\n }\n return defFalseEitherCase;\n }\n\n for (i = 0; i < this.arguments.length; i++) {\n arg = this.arguments[i];\n argValue = arg.value.eval(context);\n if (arg.expand && Array.isArray(argValue.value)) {\n argValue = argValue.value;\n for (m = 0; m < argValue.length; m++) {\n args.push({value: argValue[m]});\n }\n } else {\n args.push({name: arg.name, value: argValue});\n }\n }\n\n noArgumentsFilter = function(rule) {return rule.matchArgs(null, context);};\n\n for (i = 0; i < context.frames.length; i++) {\n if ((mixins = context.frames[i].find(this.selector, null, noArgumentsFilter)).length > 0) {\n isOneFound = true;\n\n // To make `default()` function independent of definition order we have two \"subpasses\" here.\n // At first we evaluate each guard *twice* (with `default() == true` and `default() == false`),\n // and build candidate list with corresponding flags. Then, when we know all possible matches,\n // we make a final decision.\n\n for (m = 0; m < mixins.length; m++) {\n mixin = mixins[m].rule;\n mixinPath = mixins[m].path;\n isRecursive = false;\n for (f = 0; f < context.frames.length; f++) {\n if ((!(mixin instanceof MixinDefinition)) && mixin === (context.frames[f].originalRuleset || context.frames[f])) {\n isRecursive = true;\n break;\n }\n }\n if (isRecursive) {\n continue;\n }\n\n if (mixin.matchArgs(args, context)) {\n candidate = {mixin, group: calcDefGroup(mixin, mixinPath)};\n\n if (candidate.group !== defFalseEitherCase) {\n candidates.push(candidate);\n }\n\n match = true;\n }\n }\n\n defaultFunc.reset();\n\n count = [0, 0, 0];\n for (m = 0; m < candidates.length; m++) {\n count[candidates[m].group]++;\n }\n\n if (count[defNone] > 0) {\n defaultResult = defFalse;\n } else {\n defaultResult = defTrue;\n if ((count[defTrue] + count[defFalse]) > 1) {\n throw { type: 'Runtime',\n message: `Ambiguous use of \\`default()\\` found when matching for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n }\n\n for (m = 0; m < candidates.length; m++) {\n candidate = candidates[m].group;\n if ((candidate === defNone) || (candidate === defaultResult)) {\n try {\n mixin = candidates[m].mixin;\n if (!(mixin instanceof MixinDefinition)) {\n originalRuleset = mixin.originalRuleset || mixin;\n mixin = new MixinDefinition('', [], mixin.rules, null, false, null, originalRuleset.visibilityInfo());\n mixin.originalRuleset = originalRuleset;\n }\n const newRules = mixin.evalCall(context, args, this.important).rules;\n this._setVisibilityToReplacement(newRules);\n Array.prototype.push.apply(rules, newRules);\n } catch (e) {\n throw { message: e.message, index: this.getIndex(), filename: this.fileInfo().filename, stack: e.stack };\n }\n }\n }\n\n if (match) {\n return rules;\n }\n }\n }\n if (isOneFound) {\n throw { type: 'Runtime',\n message: `No matching definition was found for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n } else {\n throw { type: 'Name',\n message: `${this.selector.toCSS().trim()} is undefined`,\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n }\n\n _setVisibilityToReplacement(replacement) {\n let i, rule;\n if (this.blocksVisibility()) {\n for (i = 0; i < replacement.length; i++) {\n rule = replacement[i];\n rule.addVisibilityBlock();\n }\n }\n }\n\n format(args) {\n return `${this.selector.toCSS().trim()}(${args ? args.map(function (a) {\n let argValue = '';\n if (a.name) {\n argValue += `${a.name}:`;\n }\n if (a.value.toCSS) {\n argValue += a.value.toCSS();\n } else {\n argValue += '???';\n }\n return argValue;\n }).join(', ') : ''})`;\n }\n}\n\nMixinCall.prototype.type = 'MixinCall';\nexport default MixinCall;\n","import Node from './node';\nimport Color from './color';\nimport AtRule from './atrule';\nimport DetachedRuleset from './detached-ruleset';\nimport Operation from './operation';\nimport Dimension from './dimension';\nimport Unit from './unit';\nimport Keyword from './keyword';\nimport Variable from './variable';\nimport Property from './property';\nimport Ruleset from './ruleset';\nimport Element from './element';\nimport Attribute from './attribute';\nimport Combinator from './combinator';\nimport Selector from './selector';\nimport Quoted from './quoted';\nimport Expression from './expression';\nimport Declaration from './declaration';\nimport Call from './call';\nimport URL from './url';\nimport Import from './import';\nimport Comment from './comment';\nimport Anonymous from './anonymous';\nimport Value from './value';\nimport JavaScript from './javascript';\nimport Assignment from './assignment';\nimport Condition from './condition';\nimport Paren from './paren';\nimport Media from './media';\nimport UnicodeDescriptor from './unicode-descriptor';\nimport Negative from './negative';\nimport Extend from './extend';\nimport VariableCall from './variable-call';\nimport NamespaceValue from './namespace-value';\n\n// mixins\nimport MixinCall from './mixin-call';\nimport MixinDefinition from './mixin-definition';\n\nexport default {\n Node, Color, AtRule, DetachedRuleset, Operation,\n Dimension, Unit, Keyword, Variable, Property,\n Ruleset, Element, Attribute, Combinator, Selector,\n Quoted, Expression, Declaration, Call, URL, Import,\n Comment, Anonymous, Value, JavaScript, Assignment,\n Condition, Paren, Media, UnicodeDescriptor, Negative,\n Extend, VariableCall, NamespaceValue,\n mixin: {\n Call: MixinCall,\n Definition: MixinDefinition\n }\n};","class AbstractFileManager {\n getPath(filename) {\n let j = filename.lastIndexOf('?');\n if (j > 0) {\n filename = filename.slice(0, j);\n }\n j = filename.lastIndexOf('/');\n if (j < 0) {\n j = filename.lastIndexOf('\\\\');\n }\n if (j < 0) {\n return '';\n }\n return filename.slice(0, j + 1);\n }\n\n tryAppendExtension(path, ext) {\n return /(\\.[a-z]*$)|([\\?;].*)$/.test(path) ? path : path + ext;\n }\n\n tryAppendLessExtension(path) {\n return this.tryAppendExtension(path, '.less');\n }\n\n supportsSync() {\n return false;\n }\n\n alwaysMakePathsAbsolute() {\n return false;\n }\n\n isPathAbsolute(filename) {\n return (/^(?:[a-z-]+:|\\/|\\\\|#)/i).test(filename);\n }\n\n // TODO: pull out / replace?\n join(basePath, laterPath) {\n if (!basePath) {\n return laterPath;\n }\n return basePath + laterPath;\n }\n\n pathDiff(url, baseUrl) {\n // diff between two paths to create a relative path\n\n const urlParts = this.extractUrlParts(url);\n\n const baseUrlParts = this.extractUrlParts(baseUrl);\n let i;\n let max;\n let urlDirectories;\n let baseUrlDirectories;\n let diff = '';\n if (urlParts.hostPart !== baseUrlParts.hostPart) {\n return '';\n }\n max = Math.max(baseUrlParts.directories.length, urlParts.directories.length);\n for (i = 0; i < max; i++) {\n if (baseUrlParts.directories[i] !== urlParts.directories[i]) { break; }\n }\n baseUrlDirectories = baseUrlParts.directories.slice(i);\n urlDirectories = urlParts.directories.slice(i);\n for (i = 0; i < baseUrlDirectories.length - 1; i++) {\n diff += '../';\n }\n for (i = 0; i < urlDirectories.length - 1; i++) {\n diff += `${urlDirectories[i]}/`;\n }\n return diff;\n }\n\n // helper function, not part of API\n extractUrlParts(url, baseUrl) {\n // urlParts[1] = protocol://hostname/ OR /\n // urlParts[2] = / if path relative to host base\n // urlParts[3] = directories\n // urlParts[4] = filename\n // urlParts[5] = parameters\n\n const urlPartsRegex = /^((?:[a-z-]+:)?\\/{2}(?:[^\\/\\?#]*\\/)|([\\/\\\\]))?((?:[^\\/\\\\\\?#]*[\\/\\\\])*)([^\\/\\\\\\?#]*)([#\\?].*)?$/i;\n\n const urlParts = url.match(urlPartsRegex);\n const returner = {};\n let rawDirectories = [];\n const directories = [];\n let i;\n let baseUrlParts;\n\n if (!urlParts) {\n throw new Error(`Could not parse sheet href - '${url}'`);\n }\n\n // Stylesheets in IE don't always return the full path\n if (baseUrl && (!urlParts[1] || urlParts[2])) {\n baseUrlParts = baseUrl.match(urlPartsRegex);\n if (!baseUrlParts) {\n throw new Error(`Could not parse page url - '${baseUrl}'`);\n }\n urlParts[1] = urlParts[1] || baseUrlParts[1] || '';\n if (!urlParts[2]) {\n urlParts[3] = baseUrlParts[3] + urlParts[3];\n }\n }\n\n if (urlParts[3]) {\n rawDirectories = urlParts[3].replace(/\\\\/g, '/').split('/');\n\n // collapse '..' and skip '.'\n for (i = 0; i < rawDirectories.length; i++) {\n\n if (rawDirectories[i] === '..') {\n directories.pop();\n }\n else if (rawDirectories[i] !== '.') {\n directories.push(rawDirectories[i]);\n }\n \n }\n }\n\n returner.hostPart = urlParts[1];\n returner.directories = directories;\n returner.rawPath = (urlParts[1] || '') + rawDirectories.join('/');\n returner.path = (urlParts[1] || '') + directories.join('/');\n returner.filename = urlParts[4];\n returner.fileUrl = returner.path + (urlParts[4] || '');\n returner.url = returner.fileUrl + (urlParts[5] || '');\n return returner;\n }\n}\n\nexport default AbstractFileManager;\n","import functionRegistry from '../functions/function-registry';\nimport LessError from '../less-error';\n\nclass AbstractPluginLoader {\n constructor() {\n // Implemented by Node.js plugin loader\n this.require = function() {\n return null;\n }\n }\n\n evalPlugin(contents, context, imports, pluginOptions, fileInfo) {\n\n let loader, registry, pluginObj, localModule, pluginManager, filename, result;\n\n pluginManager = context.pluginManager;\n\n if (fileInfo) {\n if (typeof fileInfo === 'string') {\n filename = fileInfo;\n }\n else {\n filename = fileInfo.filename;\n }\n }\n const shortname = (new this.less.FileManager()).extractUrlParts(filename).filename;\n\n if (filename) {\n pluginObj = pluginManager.get(filename);\n\n if (pluginObj) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imports, filename);\n }\n return pluginObj;\n }\n }\n localModule = {\n exports: {},\n pluginManager,\n fileInfo\n };\n registry = functionRegistry.create();\n\n const registerPlugin = function(obj) {\n pluginObj = obj;\n };\n\n try {\n loader = new Function('module', 'require', 'registerPlugin', 'functions', 'tree', 'less', 'fileInfo', contents);\n loader(localModule, this.require(filename), registerPlugin, registry, this.less.tree, this.less, fileInfo);\n }\n catch (e) {\n return new LessError(e, imports, filename);\n }\n\n if (!pluginObj) {\n pluginObj = localModule.exports;\n }\n pluginObj = this.validatePlugin(pluginObj, filename, shortname);\n\n if (pluginObj instanceof LessError) {\n return pluginObj;\n }\n\n if (pluginObj) {\n pluginObj.imports = imports;\n pluginObj.filename = filename;\n\n // For < 3.x (or unspecified minVersion) - setOptions() before install()\n if (!pluginObj.minVersion || this.compareVersion('3.0.0', pluginObj.minVersion) < 0) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n\n if (result) {\n return result;\n }\n }\n\n // Run on first load\n pluginManager.addPlugin(pluginObj, fileInfo.filename, registry);\n pluginObj.functions = registry.getLocalFunctions();\n\n // Need to call setOptions again because the pluginObj might have functions\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n\n // Run every @plugin call\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imports, filename);\n }\n\n }\n else {\n return new LessError({ message: 'Not a valid plugin' }, imports, filename);\n }\n\n return pluginObj;\n\n }\n\n trySetOptions(plugin, filename, name, options) {\n if (options && !plugin.setOptions) {\n return new LessError({\n message: `Options have been provided but the plugin ${name} does not support any options.`\n });\n }\n try {\n plugin.setOptions && plugin.setOptions(options);\n }\n catch (e) {\n return new LessError(e);\n }\n }\n\n validatePlugin(plugin, filename, name) {\n if (plugin) {\n // support plugins being a function\n // so that the plugin can be more usable programmatically\n if (typeof plugin === 'function') {\n plugin = new plugin();\n }\n\n if (plugin.minVersion) {\n if (this.compareVersion(plugin.minVersion, this.less.version) < 0) {\n return new LessError({\n message: `Plugin ${name} requires version ${this.versionToString(plugin.minVersion)}`\n });\n }\n }\n return plugin;\n }\n return null;\n }\n\n compareVersion(aVersion, bVersion) {\n if (typeof aVersion === 'string') {\n aVersion = aVersion.match(/^(\\d+)\\.?(\\d+)?\\.?(\\d+)?/);\n aVersion.shift();\n }\n for (let i = 0; i < aVersion.length; i++) {\n if (aVersion[i] !== bVersion[i]) {\n return parseInt(aVersion[i]) > parseInt(bVersion[i]) ? -1 : 1;\n }\n }\n return 0;\n }\n\n versionToString(version) {\n let versionString = '';\n for (let i = 0; i < version.length; i++) {\n versionString += (versionString ? '.' : '') + version[i];\n }\n return versionString;\n }\n\n printUsage(plugins) {\n for (let i = 0; i < plugins.length; i++) {\n const plugin = plugins[i];\n if (plugin.printUsage) {\n plugin.printUsage();\n }\n }\n }\n}\n\nexport default AbstractPluginLoader;\n\n","import tree from '../tree';\n\nconst _visitArgs = { visitDeeper: true };\nlet _hasIndexed = false;\n\nfunction _noop(node) {\n return node;\n}\n\nfunction indexNodeTypes(parent, ticker) {\n // add .typeIndex to tree node types for lookup table\n let key, child;\n for (key in parent) { \n /* eslint guard-for-in: 0 */\n child = parent[key];\n switch (typeof child) {\n case 'function':\n // ignore bound functions directly on tree which do not have a prototype\n // or aren't nodes\n if (child.prototype && child.prototype.type) {\n child.prototype.typeIndex = ticker++;\n }\n break;\n case 'object':\n ticker = indexNodeTypes(child, ticker);\n break;\n \n }\n }\n return ticker;\n}\n\nclass Visitor {\n constructor(implementation) {\n this._implementation = implementation;\n this._visitInCache = {};\n this._visitOutCache = {};\n\n if (!_hasIndexed) {\n indexNodeTypes(tree, 1);\n _hasIndexed = true;\n }\n }\n\n visit(node) {\n if (!node) {\n return node;\n }\n\n const nodeTypeIndex = node.typeIndex;\n if (!nodeTypeIndex) {\n // MixinCall args aren't a node type?\n if (node.value && node.value.typeIndex) {\n this.visit(node.value);\n }\n return node;\n }\n\n const impl = this._implementation;\n let func = this._visitInCache[nodeTypeIndex];\n let funcOut = this._visitOutCache[nodeTypeIndex];\n const visitArgs = _visitArgs;\n let fnName;\n\n visitArgs.visitDeeper = true;\n\n if (!func) {\n fnName = `visit${node.type}`;\n func = impl[fnName] || _noop;\n funcOut = impl[`${fnName}Out`] || _noop;\n this._visitInCache[nodeTypeIndex] = func;\n this._visitOutCache[nodeTypeIndex] = funcOut;\n }\n\n if (func !== _noop) {\n const newNode = func.call(impl, node, visitArgs);\n if (node && impl.isReplacing) {\n node = newNode;\n }\n }\n\n if (visitArgs.visitDeeper && node) {\n if (node.length) {\n for (let i = 0, cnt = node.length; i < cnt; i++) {\n if (node[i].accept) {\n node[i].accept(this);\n }\n }\n } else if (node.accept) {\n node.accept(this);\n }\n }\n\n if (funcOut != _noop) {\n funcOut.call(impl, node);\n }\n\n return node;\n }\n\n visitArray(nodes, nonReplacing) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.length;\n let i;\n\n // Non-replacing\n if (nonReplacing || !this._implementation.isReplacing) {\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n // Replacing\n const out = [];\n for (i = 0; i < cnt; i++) {\n const evald = this.visit(nodes[i]);\n if (evald === undefined) { continue; }\n if (!evald.splice) {\n out.push(evald);\n } else if (evald.length) {\n this.flatten(evald, out);\n }\n }\n return out;\n }\n\n flatten(arr, out) {\n if (!out) {\n out = [];\n }\n\n let cnt, i, item, nestedCnt, j, nestedItem;\n\n for (i = 0, cnt = arr.length; i < cnt; i++) {\n item = arr[i];\n if (item === undefined) {\n continue;\n }\n if (!item.splice) {\n out.push(item);\n continue;\n }\n\n for (j = 0, nestedCnt = item.length; j < nestedCnt; j++) {\n nestedItem = item[j];\n if (nestedItem === undefined) {\n continue;\n }\n if (!nestedItem.splice) {\n out.push(nestedItem);\n } else if (nestedItem.length) {\n this.flatten(nestedItem, out);\n }\n }\n }\n\n return out;\n }\n}\n\nexport default Visitor;\n","class ImportSequencer {\n constructor(onSequencerEmpty) {\n this.imports = [];\n this.variableImports = [];\n this._onSequencerEmpty = onSequencerEmpty;\n this._currentDepth = 0;\n }\n\n addImport(callback) {\n const importSequencer = this,\n importItem = {\n callback,\n args: null,\n isReady: false\n };\n this.imports.push(importItem);\n return function() {\n importItem.args = Array.prototype.slice.call(arguments, 0);\n importItem.isReady = true;\n importSequencer.tryRun();\n };\n }\n\n addVariableImport(callback) {\n this.variableImports.push(callback);\n }\n\n tryRun() {\n this._currentDepth++;\n try {\n while (true) {\n while (this.imports.length > 0) {\n const importItem = this.imports[0];\n if (!importItem.isReady) {\n return;\n }\n this.imports = this.imports.slice(1);\n importItem.callback.apply(null, importItem.args);\n }\n if (this.variableImports.length === 0) {\n break;\n }\n const variableImport = this.variableImports[0];\n this.variableImports = this.variableImports.slice(1);\n variableImport();\n }\n } finally {\n this._currentDepth--;\n }\n if (this._currentDepth === 0 && this._onSequencerEmpty) {\n this._onSequencerEmpty();\n }\n }\n}\n\nexport default ImportSequencer;\n","import contexts from '../contexts';\nimport Visitor from './visitor';\nimport ImportSequencer from './import-sequencer';\nimport * as utils from '../utils';\n\nconst ImportVisitor = function(importer, finish) {\n\n this._visitor = new Visitor(this);\n this._importer = importer;\n this._finish = finish;\n this.context = new contexts.Eval();\n this.importCount = 0;\n this.onceFileDetectionMap = {};\n this.recursionDetector = {};\n this._sequencer = new ImportSequencer(this._onSequencerEmpty.bind(this));\n};\n\nImportVisitor.prototype = {\n isReplacing: false,\n run: function (root) {\n try {\n // process the contents\n this._visitor.visit(root);\n }\n catch (e) {\n this.error = e;\n }\n\n this.isFinished = true;\n this._sequencer.tryRun();\n },\n _onSequencerEmpty: function() {\n if (!this.isFinished) {\n return;\n }\n this._finish(this.error);\n },\n visitImport: function (importNode, visitArgs) {\n const inlineCSS = importNode.options.inline;\n\n if (!importNode.css || inlineCSS) {\n\n const context = new contexts.Eval(this.context, utils.copyArray(this.context.frames));\n const importParent = context.frames[0];\n\n this.importCount++;\n if (importNode.isVariableImport()) {\n this._sequencer.addVariableImport(this.processImportNode.bind(this, importNode, context, importParent));\n } else {\n this.processImportNode(importNode, context, importParent);\n }\n }\n visitArgs.visitDeeper = false;\n },\n processImportNode: function(importNode, context, importParent) {\n let evaldImportNode;\n const inlineCSS = importNode.options.inline;\n\n try {\n evaldImportNode = importNode.evalForImport(context);\n } catch (e) {\n if (!e.filename) { e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename; }\n // attempt to eval properly and treat as css\n importNode.css = true;\n // if that fails, this error will be thrown\n importNode.error = e;\n }\n\n if (evaldImportNode && (!evaldImportNode.css || inlineCSS)) {\n\n if (evaldImportNode.options.multiple) {\n context.importMultiple = true;\n }\n\n // try appending if we haven't determined if it is css or not\n const tryAppendLessExtension = evaldImportNode.css === undefined;\n\n for (let i = 0; i < importParent.rules.length; i++) {\n if (importParent.rules[i] === importNode) {\n importParent.rules[i] = evaldImportNode;\n break;\n }\n }\n\n const onImported = this.onImported.bind(this, evaldImportNode, context), sequencedOnImported = this._sequencer.addImport(onImported);\n\n this._importer.push(evaldImportNode.getPath(), tryAppendLessExtension, evaldImportNode.fileInfo(),\n evaldImportNode.options, sequencedOnImported);\n } else {\n this.importCount--;\n if (this.isFinished) {\n this._sequencer.tryRun();\n }\n }\n },\n onImported: function (importNode, context, e, root, importedAtRoot, fullPath) {\n if (e) {\n if (!e.filename) {\n e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename;\n }\n this.error = e;\n }\n\n const importVisitor = this, inlineCSS = importNode.options.inline, isPlugin = importNode.options.isPlugin, isOptional = importNode.options.optional, duplicateImport = importedAtRoot || fullPath in importVisitor.recursionDetector;\n\n if (!context.importMultiple) {\n if (duplicateImport) {\n importNode.skip = true;\n } else {\n importNode.skip = function() {\n if (fullPath in importVisitor.onceFileDetectionMap) {\n return true;\n }\n importVisitor.onceFileDetectionMap[fullPath] = true;\n return false;\n };\n }\n }\n\n if (!fullPath && isOptional) {\n importNode.skip = true;\n }\n\n if (root) {\n importNode.root = root;\n importNode.importedFilename = fullPath;\n\n if (!inlineCSS && !isPlugin && (context.importMultiple || !duplicateImport)) {\n importVisitor.recursionDetector[fullPath] = true;\n\n const oldContext = this.context;\n this.context = context;\n try {\n this._visitor.visit(root);\n } catch (e) {\n this.error = e;\n }\n this.context = oldContext;\n }\n }\n\n importVisitor.importCount--;\n\n if (importVisitor.isFinished) {\n importVisitor._sequencer.tryRun();\n }\n },\n visitDeclaration: function (declNode, visitArgs) {\n if (declNode.value.type === 'DetachedRuleset') {\n this.context.frames.unshift(declNode);\n } else {\n visitArgs.visitDeeper = false;\n }\n },\n visitDeclarationOut: function(declNode) {\n if (declNode.value.type === 'DetachedRuleset') {\n this.context.frames.shift();\n }\n },\n visitAtRule: function (atRuleNode, visitArgs) {\n this.context.frames.unshift(atRuleNode);\n },\n visitAtRuleOut: function (atRuleNode) {\n this.context.frames.shift();\n },\n visitMixinDefinition: function (mixinDefinitionNode, visitArgs) {\n this.context.frames.unshift(mixinDefinitionNode);\n },\n visitMixinDefinitionOut: function (mixinDefinitionNode) {\n this.context.frames.shift();\n },\n visitRuleset: function (rulesetNode, visitArgs) {\n this.context.frames.unshift(rulesetNode);\n },\n visitRulesetOut: function (rulesetNode) {\n this.context.frames.shift();\n },\n visitMedia: function (mediaNode, visitArgs) {\n this.context.frames.unshift(mediaNode.rules[0]);\n },\n visitMediaOut: function (mediaNode) {\n this.context.frames.shift();\n }\n};\nexport default ImportVisitor;\n","class SetTreeVisibilityVisitor {\n constructor(visible) {\n this.visible = visible;\n }\n\n run(root) {\n this.visit(root);\n }\n\n visitArray(nodes) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.length;\n let i;\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n visit(node) {\n if (!node) {\n return node;\n }\n if (node.constructor === Array) {\n return this.visitArray(node);\n }\n\n if (!node.blocksVisibility || node.blocksVisibility()) {\n return node;\n }\n if (this.visible) {\n node.ensureVisibility();\n } else {\n node.ensureInvisibility();\n }\n\n node.accept(this);\n return node;\n }\n}\n\nexport default SetTreeVisibilityVisitor;","import tree from '../tree';\nimport Visitor from './visitor';\nimport logger from '../logger';\nimport * as utils from '../utils';\n\n/* jshint loopfunc:true */\n\nclass ExtendFinderVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n this.contexts = [];\n this.allExtendsStack = [[]];\n }\n\n run(root) {\n root = this._visitor.visit(root);\n root.allExtends = this.allExtendsStack[0];\n return root;\n }\n\n visitDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n\n let i;\n let j;\n let extend;\n const allSelectorsExtendList = [];\n let extendList;\n\n // get &:extend(.a); rules which apply to all selectors in this ruleset\n const rules = rulesetNode.rules, ruleCnt = rules ? rules.length : 0;\n for (i = 0; i < ruleCnt; i++) {\n if (rulesetNode.rules[i] instanceof tree.Extend) {\n allSelectorsExtendList.push(rules[i]);\n rulesetNode.extendOnEveryPath = true;\n }\n }\n\n // now find every selector and apply the extends that apply to all extends\n // and the ones which apply to an individual extend\n const paths = rulesetNode.paths;\n for (i = 0; i < paths.length; i++) {\n const selectorPath = paths[i], selector = selectorPath[selectorPath.length - 1], selExtendList = selector.extendList;\n\n extendList = selExtendList ? utils.copyArray(selExtendList).concat(allSelectorsExtendList)\n : allSelectorsExtendList;\n\n if (extendList) {\n extendList = extendList.map(function(allSelectorsExtend) {\n return allSelectorsExtend.clone();\n });\n }\n\n for (j = 0; j < extendList.length; j++) {\n this.foundExtends = true;\n extend = extendList[j];\n extend.findSelfSelectors(selectorPath);\n extend.ruleset = rulesetNode;\n if (j === 0) { extend.firstExtendOnThisSelectorPath = true; }\n this.allExtendsStack[this.allExtendsStack.length - 1].push(extend);\n }\n }\n\n this.contexts.push(rulesetNode.selectors);\n }\n\n visitRulesetOut(rulesetNode) {\n if (!rulesetNode.root) {\n this.contexts.length = this.contexts.length - 1;\n }\n }\n\n visitMedia(mediaNode, visitArgs) {\n mediaNode.allExtends = [];\n this.allExtendsStack.push(mediaNode.allExtends);\n }\n\n visitMediaOut(mediaNode) {\n this.allExtendsStack.length = this.allExtendsStack.length - 1;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n atRuleNode.allExtends = [];\n this.allExtendsStack.push(atRuleNode.allExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n this.allExtendsStack.length = this.allExtendsStack.length - 1;\n }\n}\n\nclass ProcessExtendsVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n }\n\n run(root) {\n const extendFinder = new ExtendFinderVisitor();\n this.extendIndices = {};\n extendFinder.run(root);\n if (!extendFinder.foundExtends) { return root; }\n root.allExtends = root.allExtends.concat(this.doExtendChaining(root.allExtends, root.allExtends));\n this.allExtendsStack = [root.allExtends];\n const newRoot = this._visitor.visit(root);\n this.checkExtendsForNonMatched(root.allExtends);\n return newRoot;\n }\n\n checkExtendsForNonMatched(extendList) {\n const indices = this.extendIndices;\n extendList.filter(function(extend) {\n return !extend.hasFoundMatches && extend.parent_ids.length == 1;\n }).forEach(function(extend) {\n let selector = '_unknown_';\n try {\n selector = extend.selector.toCSS({});\n }\n catch (_) {}\n\n if (!indices[`${extend.index} ${selector}`]) {\n indices[`${extend.index} ${selector}`] = true;\n logger.warn(`extend '${selector}' has no matches`);\n }\n });\n }\n\n doExtendChaining(extendsList, extendsListTarget, iterationCount) {\n //\n // chaining is different from normal extension.. if we extend an extend then we are not just copying, altering\n // and pasting the selector we would do normally, but we are also adding an extend with the same target selector\n // this means this new extend can then go and alter other extends\n //\n // this method deals with all the chaining work - without it, extend is flat and doesn't work on other extend selectors\n // this is also the most expensive.. and a match on one selector can cause an extension of a selector we had already\n // processed if we look at each selector at a time, as is done in visitRuleset\n\n let extendIndex;\n\n let targetExtendIndex;\n let matches;\n const extendsToAdd = [];\n let newSelector;\n const extendVisitor = this;\n let selectorPath;\n let extend;\n let targetExtend;\n let newExtend;\n\n iterationCount = iterationCount || 0;\n\n // loop through comparing every extend with every target extend.\n // a target extend is the one on the ruleset we are looking at copy/edit/pasting in place\n // e.g. .a:extend(.b) {} and .b:extend(.c) {} then the first extend extends the second one\n // and the second is the target.\n // the separation into two lists allows us to process a subset of chains with a bigger set, as is the\n // case when processing media queries\n for (extendIndex = 0; extendIndex < extendsList.length; extendIndex++) {\n for (targetExtendIndex = 0; targetExtendIndex < extendsListTarget.length; targetExtendIndex++) {\n\n extend = extendsList[extendIndex];\n targetExtend = extendsListTarget[targetExtendIndex];\n\n // look for circular references\n if ( extend.parent_ids.indexOf( targetExtend.object_id ) >= 0 ) { continue; }\n\n // find a match in the target extends self selector (the bit before :extend)\n selectorPath = [targetExtend.selfSelectors[0]];\n matches = extendVisitor.findMatch(extend, selectorPath);\n\n if (matches.length) {\n extend.hasFoundMatches = true;\n\n // we found a match, so for each self selector..\n extend.selfSelectors.forEach(function(selfSelector) {\n const info = targetExtend.visibilityInfo();\n\n // process the extend as usual\n newSelector = extendVisitor.extendSelector(matches, selectorPath, selfSelector, extend.isVisible());\n\n // but now we create a new extend from it\n newExtend = new(tree.Extend)(targetExtend.selector, targetExtend.option, 0, targetExtend.fileInfo(), info);\n newExtend.selfSelectors = newSelector;\n\n // add the extend onto the list of extends for that selector\n newSelector[newSelector.length - 1].extendList = [newExtend];\n\n // record that we need to add it.\n extendsToAdd.push(newExtend);\n newExtend.ruleset = targetExtend.ruleset;\n\n // remember its parents for circular references\n newExtend.parent_ids = newExtend.parent_ids.concat(targetExtend.parent_ids, extend.parent_ids);\n\n // only process the selector once.. if we have :extend(.a,.b) then multiple\n // extends will look at the same selector path, so when extending\n // we know that any others will be duplicates in terms of what is added to the css\n if (targetExtend.firstExtendOnThisSelectorPath) {\n newExtend.firstExtendOnThisSelectorPath = true;\n targetExtend.ruleset.paths.push(newSelector);\n }\n });\n }\n }\n }\n\n if (extendsToAdd.length) {\n // try to detect circular references to stop a stack overflow.\n // may no longer be needed.\n this.extendChainCount++;\n if (iterationCount > 100) {\n let selectorOne = '{unable to calculate}';\n let selectorTwo = '{unable to calculate}';\n try {\n selectorOne = extendsToAdd[0].selfSelectors[0].toCSS();\n selectorTwo = extendsToAdd[0].selector.toCSS();\n }\n catch (e) {}\n throw { message: `extend circular reference detected. One of the circular extends is currently:${selectorOne}:extend(${selectorTwo})`};\n }\n\n // now process the new extends on the existing rules so that we can handle a extending b extending c extending\n // d extending e...\n return extendsToAdd.concat(extendVisitor.doExtendChaining(extendsToAdd, extendsListTarget, iterationCount + 1));\n } else {\n return extendsToAdd;\n }\n }\n\n visitDeclaration(ruleNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitSelector(selectorNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n let matches;\n let pathIndex;\n let extendIndex;\n const allExtends = this.allExtendsStack[this.allExtendsStack.length - 1];\n const selectorsToAdd = [];\n const extendVisitor = this;\n let selectorPath;\n\n // look at each selector path in the ruleset, find any extend matches and then copy, find and replace\n\n for (extendIndex = 0; extendIndex < allExtends.length; extendIndex++) {\n for (pathIndex = 0; pathIndex < rulesetNode.paths.length; pathIndex++) {\n selectorPath = rulesetNode.paths[pathIndex];\n\n // extending extends happens initially, before the main pass\n if (rulesetNode.extendOnEveryPath) { continue; }\n const extendList = selectorPath[selectorPath.length - 1].extendList;\n if (extendList && extendList.length) { continue; }\n\n matches = this.findMatch(allExtends[extendIndex], selectorPath);\n\n if (matches.length) {\n allExtends[extendIndex].hasFoundMatches = true;\n\n allExtends[extendIndex].selfSelectors.forEach(function(selfSelector) {\n let extendedSelectors;\n extendedSelectors = extendVisitor.extendSelector(matches, selectorPath, selfSelector, allExtends[extendIndex].isVisible());\n selectorsToAdd.push(extendedSelectors);\n });\n }\n }\n }\n rulesetNode.paths = rulesetNode.paths.concat(selectorsToAdd);\n }\n\n findMatch(extend, haystackSelectorPath) {\n //\n // look through the haystack selector path to try and find the needle - extend.selector\n // returns an array of selector matches that can then be replaced\n //\n let haystackSelectorIndex;\n\n let hackstackSelector;\n let hackstackElementIndex;\n let haystackElement;\n let targetCombinator;\n let i;\n const extendVisitor = this;\n const needleElements = extend.selector.elements;\n const potentialMatches = [];\n let potentialMatch;\n const matches = [];\n\n // loop through the haystack elements\n for (haystackSelectorIndex = 0; haystackSelectorIndex < haystackSelectorPath.length; haystackSelectorIndex++) {\n hackstackSelector = haystackSelectorPath[haystackSelectorIndex];\n\n for (hackstackElementIndex = 0; hackstackElementIndex < hackstackSelector.elements.length; hackstackElementIndex++) {\n\n haystackElement = hackstackSelector.elements[hackstackElementIndex];\n\n // if we allow elements before our match we can add a potential match every time. otherwise only at the first element.\n if (extend.allowBefore || (haystackSelectorIndex === 0 && hackstackElementIndex === 0)) {\n potentialMatches.push({pathIndex: haystackSelectorIndex, index: hackstackElementIndex, matched: 0,\n initialCombinator: haystackElement.combinator});\n }\n\n for (i = 0; i < potentialMatches.length; i++) {\n potentialMatch = potentialMatches[i];\n\n // selectors add \" \" onto the first element. When we use & it joins the selectors together, but if we don't\n // then each selector in haystackSelectorPath has a space before it added in the toCSS phase. so we need to\n // work out what the resulting combinator will be\n targetCombinator = haystackElement.combinator.value;\n if (targetCombinator === '' && hackstackElementIndex === 0) {\n targetCombinator = ' ';\n }\n\n // if we don't match, null our match to indicate failure\n if (!extendVisitor.isElementValuesEqual(needleElements[potentialMatch.matched].value, haystackElement.value) ||\n (potentialMatch.matched > 0 && needleElements[potentialMatch.matched].combinator.value !== targetCombinator)) {\n potentialMatch = null;\n } else {\n potentialMatch.matched++;\n }\n\n // if we are still valid and have finished, test whether we have elements after and whether these are allowed\n if (potentialMatch) {\n potentialMatch.finished = potentialMatch.matched === needleElements.length;\n if (potentialMatch.finished &&\n (!extend.allowAfter &&\n (hackstackElementIndex + 1 < hackstackSelector.elements.length || haystackSelectorIndex + 1 < haystackSelectorPath.length))) {\n potentialMatch = null;\n }\n }\n // if null we remove, if not, we are still valid, so either push as a valid match or continue\n if (potentialMatch) {\n if (potentialMatch.finished) {\n potentialMatch.length = needleElements.length;\n potentialMatch.endPathIndex = haystackSelectorIndex;\n potentialMatch.endPathElementIndex = hackstackElementIndex + 1; // index after end of match\n potentialMatches.length = 0; // we don't allow matches to overlap, so start matching again\n matches.push(potentialMatch);\n }\n } else {\n potentialMatches.splice(i, 1);\n i--;\n }\n }\n }\n }\n return matches;\n }\n\n isElementValuesEqual(elementValue1, elementValue2) {\n if (typeof elementValue1 === 'string' || typeof elementValue2 === 'string') {\n return elementValue1 === elementValue2;\n }\n if (elementValue1 instanceof tree.Attribute) {\n if (elementValue1.op !== elementValue2.op || elementValue1.key !== elementValue2.key) {\n return false;\n }\n if (!elementValue1.value || !elementValue2.value) {\n if (elementValue1.value || elementValue2.value) {\n return false;\n }\n return true;\n }\n elementValue1 = elementValue1.value.value || elementValue1.value;\n elementValue2 = elementValue2.value.value || elementValue2.value;\n return elementValue1 === elementValue2;\n }\n elementValue1 = elementValue1.value;\n elementValue2 = elementValue2.value;\n if (elementValue1 instanceof tree.Selector) {\n if (!(elementValue2 instanceof tree.Selector) || elementValue1.elements.length !== elementValue2.elements.length) {\n return false;\n }\n for (let i = 0; i < elementValue1.elements.length; i++) {\n if (elementValue1.elements[i].combinator.value !== elementValue2.elements[i].combinator.value) {\n if (i !== 0 || (elementValue1.elements[i].combinator.value || ' ') !== (elementValue2.elements[i].combinator.value || ' ')) {\n return false;\n }\n }\n if (!this.isElementValuesEqual(elementValue1.elements[i].value, elementValue2.elements[i].value)) {\n return false;\n }\n }\n return true;\n }\n return false;\n }\n\n extendSelector(matches, selectorPath, replacementSelector, isVisible) {\n\n // for a set of matches, replace each match with the replacement selector\n\n let currentSelectorPathIndex = 0, currentSelectorPathElementIndex = 0, path = [], matchIndex, selector, firstElement, match, newElements;\n\n for (matchIndex = 0; matchIndex < matches.length; matchIndex++) {\n match = matches[matchIndex];\n selector = selectorPath[match.pathIndex];\n firstElement = new tree.Element(\n match.initialCombinator,\n replacementSelector.elements[0].value,\n replacementSelector.elements[0].isVariable,\n replacementSelector.elements[0].getIndex(),\n replacementSelector.elements[0].fileInfo()\n );\n\n if (match.pathIndex > currentSelectorPathIndex && currentSelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n\n newElements = selector.elements\n .slice(currentSelectorPathElementIndex, match.index)\n .concat([firstElement])\n .concat(replacementSelector.elements.slice(1));\n\n if (currentSelectorPathIndex === match.pathIndex && matchIndex > 0) {\n path[path.length - 1].elements =\n path[path.length - 1].elements.concat(newElements);\n } else {\n path = path.concat(selectorPath.slice(currentSelectorPathIndex, match.pathIndex));\n\n path.push(new tree.Selector(\n newElements\n ));\n }\n currentSelectorPathIndex = match.endPathIndex;\n currentSelectorPathElementIndex = match.endPathElementIndex;\n if (currentSelectorPathElementIndex >= selectorPath[currentSelectorPathIndex].elements.length) {\n currentSelectorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n }\n\n if (currentSelectorPathIndex < selectorPath.length && currentSelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathIndex++;\n }\n\n path = path.concat(selectorPath.slice(currentSelectorPathIndex, selectorPath.length));\n path = path.map(function (currentValue) {\n // we can re-use elements here, because the visibility property matters only for selectors\n const derived = currentValue.createDerived(currentValue.elements);\n if (isVisible) {\n derived.ensureVisibility();\n } else {\n derived.ensureInvisibility();\n }\n return derived;\n });\n return path;\n }\n\n visitMedia(mediaNode, visitArgs) {\n let newAllExtends = mediaNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, mediaNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitMediaOut(mediaNode) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStack.length = lastIndex;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n let newAllExtends = atRuleNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, atRuleNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStack.length = lastIndex;\n }\n}\n\nexport default ProcessExtendsVisitor;\n","import Visitor from './visitor';\n\nclass JoinSelectorVisitor {\n constructor() {\n this.contexts = [[]];\n this._visitor = new Visitor(this);\n }\n\n run(root) {\n return this._visitor.visit(root);\n }\n\n visitDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n const paths = [];\n let selectors;\n\n this.contexts.push(paths);\n\n if (!rulesetNode.root) {\n selectors = rulesetNode.selectors;\n if (selectors) {\n selectors = selectors.filter(function(selector) { return selector.getIsOutput(); });\n rulesetNode.selectors = selectors.length ? selectors : (selectors = null);\n if (selectors) { rulesetNode.joinSelectors(paths, context, selectors); }\n }\n if (!selectors) { rulesetNode.rules = null; }\n rulesetNode.paths = paths;\n }\n }\n\n visitRulesetOut(rulesetNode) {\n this.contexts.length = this.contexts.length - 1;\n }\n\n visitMedia(mediaNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n mediaNode.rules[0].root = (context.length === 0 || context[0].multiMedia);\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n if (atRuleNode.rules && atRuleNode.rules.length) {\n atRuleNode.rules[0].root = (atRuleNode.isRooted || context.length === 0 || null);\n }\n }\n}\n\nexport default JoinSelectorVisitor;\n","import tree from '../tree';\nimport Visitor from './visitor';\n\nclass CSSVisitorUtils {\n constructor(context) {\n this._visitor = new Visitor(this);\n this._context = context;\n }\n\n containsSilentNonBlockedChild(bodyRules) {\n let rule;\n if (!bodyRules) {\n return false;\n }\n for (let r = 0; r < bodyRules.length; r++) {\n rule = bodyRules[r];\n if (rule.isSilent && rule.isSilent(this._context) && !rule.blocksVisibility()) {\n // the atrule contains something that was referenced (likely by extend)\n // therefore it needs to be shown in output too\n return true;\n }\n }\n return false;\n }\n\n keepOnlyVisibleChilds(owner) {\n if (owner && owner.rules) {\n owner.rules = owner.rules.filter(thing => thing.isVisible());\n }\n }\n\n isEmpty(owner) {\n return (owner && owner.rules) \n ? (owner.rules.length === 0) : true;\n }\n\n hasVisibleSelector(rulesetNode) {\n return (rulesetNode && rulesetNode.paths)\n ? (rulesetNode.paths.length > 0) : false;\n }\n\n resolveVisibility(node, originalRules) {\n if (!node.blocksVisibility()) {\n if (this.isEmpty(node) && !this.containsSilentNonBlockedChild(originalRules)) {\n return ;\n }\n\n return node;\n }\n\n const compiledRulesBody = node.rules[0];\n this.keepOnlyVisibleChilds(compiledRulesBody);\n\n if (this.isEmpty(compiledRulesBody)) {\n return ;\n }\n\n node.ensureVisibility();\n node.removeVisibilityBlock();\n\n return node;\n }\n\n isVisibleRuleset(rulesetNode) {\n if (rulesetNode.firstRoot) {\n return true;\n }\n\n if (this.isEmpty(rulesetNode)) {\n return false;\n }\n\n if (!rulesetNode.root && !this.hasVisibleSelector(rulesetNode)) {\n return false;\n }\n\n return true;\n }\n}\n\nconst ToCSSVisitor = function(context) {\n this._visitor = new Visitor(this);\n this._context = context;\n this.utils = new CSSVisitorUtils(context);\n};\n\nToCSSVisitor.prototype = {\n isReplacing: true,\n run: function (root) {\n return this._visitor.visit(root);\n },\n\n visitDeclaration: function (declNode, visitArgs) {\n if (declNode.blocksVisibility() || declNode.variable) {\n return;\n }\n return declNode;\n },\n\n visitMixinDefinition: function (mixinNode, visitArgs) {\n // mixin definitions do not get eval'd - this means they keep state\n // so we have to clear that state here so it isn't used if toCSS is called twice\n mixinNode.frames = [];\n },\n\n visitExtend: function (extendNode, visitArgs) {\n },\n\n visitComment: function (commentNode, visitArgs) {\n if (commentNode.blocksVisibility() || commentNode.isSilent(this._context)) {\n return;\n }\n return commentNode;\n },\n\n visitMedia: function(mediaNode, visitArgs) {\n const originalRules = mediaNode.rules[0].rules;\n mediaNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n\n return this.utils.resolveVisibility(mediaNode, originalRules);\n },\n\n visitImport: function (importNode, visitArgs) {\n if (importNode.blocksVisibility()) {\n return ;\n }\n return importNode;\n },\n\n visitAtRule: function(atRuleNode, visitArgs) {\n if (atRuleNode.rules && atRuleNode.rules.length) {\n return this.visitAtRuleWithBody(atRuleNode, visitArgs);\n } else {\n return this.visitAtRuleWithoutBody(atRuleNode, visitArgs);\n }\n },\n\n visitAnonymous: function(anonymousNode, visitArgs) {\n if (!anonymousNode.blocksVisibility()) {\n anonymousNode.accept(this._visitor);\n return anonymousNode;\n }\n },\n\n visitAtRuleWithBody: function(atRuleNode, visitArgs) {\n // if there is only one nested ruleset and that one has no path, then it is\n // just fake ruleset\n function hasFakeRuleset(atRuleNode) {\n const bodyRules = atRuleNode.rules;\n return bodyRules.length === 1 && (!bodyRules[0].paths || bodyRules[0].paths.length === 0);\n }\n function getBodyRules(atRuleNode) {\n const nodeRules = atRuleNode.rules;\n if (hasFakeRuleset(atRuleNode)) {\n return nodeRules[0].rules;\n }\n\n return nodeRules;\n }\n // it is still true that it is only one ruleset in array\n // this is last such moment\n // process childs\n const originalRules = getBodyRules(atRuleNode);\n atRuleNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n\n if (!this.utils.isEmpty(atRuleNode)) {\n this._mergeRules(atRuleNode.rules[0].rules);\n }\n\n return this.utils.resolveVisibility(atRuleNode, originalRules);\n },\n\n visitAtRuleWithoutBody: function(atRuleNode, visitArgs) {\n if (atRuleNode.blocksVisibility()) {\n return;\n }\n\n if (atRuleNode.name === '@charset') {\n // Only output the debug info together with subsequent @charset definitions\n // a comment (or @media statement) before the actual @charset atrule would\n // be considered illegal css as it has to be on the first line\n if (this.charset) {\n if (atRuleNode.debugInfo) {\n const comment = new tree.Comment(`/* ${atRuleNode.toCSS(this._context).replace(/\\n/g, '')} */\\n`);\n comment.debugInfo = atRuleNode.debugInfo;\n return this._visitor.visit(comment);\n }\n return;\n }\n this.charset = true;\n }\n\n return atRuleNode;\n },\n\n checkValidNodes: function(rules, isRoot) {\n if (!rules) {\n return;\n }\n\n for (let i = 0; i < rules.length; i++) {\n const ruleNode = rules[i];\n if (isRoot && ruleNode instanceof tree.Declaration && !ruleNode.variable) {\n throw { message: 'Properties must be inside selector blocks. They cannot be in the root',\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n if (ruleNode instanceof tree.Call) {\n throw { message: `Function '${ruleNode.name}' did not return a root node`,\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n if (ruleNode.type && !ruleNode.allowRoot) {\n throw { message: `${ruleNode.type} node returned by a function is not valid here`,\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n }\n },\n\n visitRuleset: function (rulesetNode, visitArgs) {\n // at this point rulesets are nested into each other\n let rule;\n\n const rulesets = [];\n\n this.checkValidNodes(rulesetNode.rules, rulesetNode.firstRoot);\n\n if (!rulesetNode.root) {\n // remove invisible paths\n this._compileRulesetPaths(rulesetNode);\n\n // remove rulesets from this ruleset body and compile them separately\n const nodeRules = rulesetNode.rules;\n\n let nodeRuleCnt = nodeRules ? nodeRules.length : 0;\n for (let i = 0; i < nodeRuleCnt; ) {\n rule = nodeRules[i];\n if (rule && rule.rules) {\n // visit because we are moving them out from being a child\n rulesets.push(this._visitor.visit(rule));\n nodeRules.splice(i, 1);\n nodeRuleCnt--;\n continue;\n }\n i++;\n }\n // accept the visitor to remove rules and refactor itself\n // then we can decide nogw whether we want it or not\n // compile body\n if (nodeRuleCnt > 0) {\n rulesetNode.accept(this._visitor);\n } else {\n rulesetNode.rules = null;\n }\n visitArgs.visitDeeper = false;\n } else { // if (! rulesetNode.root) {\n rulesetNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n }\n\n if (rulesetNode.rules) {\n this._mergeRules(rulesetNode.rules);\n this._removeDuplicateRules(rulesetNode.rules);\n }\n\n // now decide whether we keep the ruleset\n if (this.utils.isVisibleRuleset(rulesetNode)) {\n rulesetNode.ensureVisibility();\n rulesets.splice(0, 0, rulesetNode);\n }\n\n if (rulesets.length === 1) {\n return rulesets[0];\n }\n return rulesets;\n },\n\n _compileRulesetPaths: function(rulesetNode) {\n if (rulesetNode.paths) {\n rulesetNode.paths = rulesetNode.paths\n .filter(p => {\n let i;\n if (p[0].elements[0].combinator.value === ' ') {\n p[0].elements[0].combinator = new(tree.Combinator)('');\n }\n for (i = 0; i < p.length; i++) {\n if (p[i].isVisible() && p[i].getIsOutput()) {\n return true;\n }\n }\n return false;\n });\n }\n },\n\n _removeDuplicateRules: function(rules) {\n if (!rules) { return; }\n\n // remove duplicates\n const ruleCache = {};\n\n let ruleList;\n let rule;\n let i;\n\n for (i = rules.length - 1; i >= 0 ; i--) {\n rule = rules[i];\n if (rule instanceof tree.Declaration) {\n if (!ruleCache[rule.name]) {\n ruleCache[rule.name] = rule;\n } else {\n ruleList = ruleCache[rule.name];\n if (ruleList instanceof tree.Declaration) {\n ruleList = ruleCache[rule.name] = [ruleCache[rule.name].toCSS(this._context)];\n }\n const ruleCSS = rule.toCSS(this._context);\n if (ruleList.indexOf(ruleCSS) !== -1) {\n rules.splice(i, 1);\n } else {\n ruleList.push(ruleCSS);\n }\n }\n }\n }\n },\n\n _mergeRules: function(rules) {\n if (!rules) {\n return; \n }\n\n const groups = {};\n const groupsArr = [];\n\n for (let i = 0; i < rules.length; i++) {\n const rule = rules[i];\n if (rule.merge) {\n const key = rule.name;\n groups[key] ? rules.splice(i--, 1) : \n groupsArr.push(groups[key] = []);\n groups[key].push(rule);\n }\n }\n\n groupsArr.forEach(group => {\n if (group.length > 0) {\n const result = group[0];\n let space = [];\n const comma = [new tree.Expression(space)];\n group.forEach(rule => {\n if ((rule.merge === '+') && (space.length > 0)) {\n comma.push(new tree.Expression(space = []));\n }\n space.push(rule.value);\n result.important = result.important || rule.important;\n });\n result.value = new tree.Value(comma);\n }\n });\n }\n};\n\nexport default ToCSSVisitor;\n","import Visitor from './visitor';\nimport ImportVisitor from './import-visitor';\nimport MarkVisibleSelectorsVisitor from './set-tree-visibility-visitor';\nimport ExtendVisitor from './extend-visitor';\nimport JoinSelectorVisitor from './join-selector-visitor';\nimport ToCSSVisitor from './to-css-visitor';\n\nexport default {\n Visitor,\n ImportVisitor,\n MarkVisibleSelectorsVisitor,\n ExtendVisitor,\n JoinSelectorVisitor,\n ToCSSVisitor\n};\n","import chunker from './chunker';\n\nexport default () => {\n let // Less input string\n input;\n\n let // current chunk\n j;\n\n const // holds state for backtracking\n saveStack = [];\n\n let // furthest index the parser has gone to\n furthest;\n\n let // if this is furthest we got to, this is the probably cause\n furthestPossibleErrorMessage;\n\n let // chunkified input\n chunks;\n\n let // current chunk\n current;\n\n let // index of current chunk, in `input`\n currentPos;\n\n const parserInput = {};\n const CHARCODE_SPACE = 32;\n const CHARCODE_TAB = 9;\n const CHARCODE_LF = 10;\n const CHARCODE_CR = 13;\n const CHARCODE_PLUS = 43;\n const CHARCODE_COMMA = 44;\n const CHARCODE_FORWARD_SLASH = 47;\n const CHARCODE_9 = 57;\n\n function skipWhitespace(length) {\n const oldi = parserInput.i;\n const oldj = j;\n const curr = parserInput.i - currentPos;\n const endIndex = parserInput.i + current.length - curr;\n const mem = (parserInput.i += length);\n const inp = input;\n let c;\n let nextChar;\n let comment;\n\n for (; parserInput.i < endIndex; parserInput.i++) {\n c = inp.charCodeAt(parserInput.i);\n\n if (parserInput.autoCommentAbsorb && c === CHARCODE_FORWARD_SLASH) {\n nextChar = inp.charAt(parserInput.i + 1);\n if (nextChar === '/') {\n comment = {index: parserInput.i, isLineComment: true};\n let nextNewLine = inp.indexOf('\\n', parserInput.i + 2);\n if (nextNewLine < 0) {\n nextNewLine = endIndex;\n }\n parserInput.i = nextNewLine;\n comment.text = inp.substr(comment.index, parserInput.i - comment.index);\n parserInput.commentStore.push(comment);\n continue;\n } else if (nextChar === '*') {\n const nextStarSlash = inp.indexOf('*/', parserInput.i + 2);\n if (nextStarSlash >= 0) {\n comment = {\n index: parserInput.i,\n text: inp.substr(parserInput.i, nextStarSlash + 2 - parserInput.i),\n isLineComment: false\n };\n parserInput.i += comment.text.length - 1;\n parserInput.commentStore.push(comment);\n continue;\n }\n }\n break;\n }\n\n if ((c !== CHARCODE_SPACE) && (c !== CHARCODE_LF) && (c !== CHARCODE_TAB) && (c !== CHARCODE_CR)) {\n break;\n }\n }\n\n current = current.slice(length + parserInput.i - mem + curr);\n currentPos = parserInput.i;\n\n if (!current.length) {\n if (j < chunks.length - 1) {\n current = chunks[++j];\n skipWhitespace(0); // skip space at the beginning of a chunk\n return true; // things changed\n }\n parserInput.finished = true;\n }\n\n return oldi !== parserInput.i || oldj !== j;\n }\n\n parserInput.save = () => {\n currentPos = parserInput.i;\n saveStack.push( { current, i: parserInput.i, j });\n };\n parserInput.restore = possibleErrorMessage => {\n\n if (parserInput.i > furthest || (parserInput.i === furthest && possibleErrorMessage && !furthestPossibleErrorMessage)) {\n furthest = parserInput.i;\n furthestPossibleErrorMessage = possibleErrorMessage;\n }\n const state = saveStack.pop();\n current = state.current;\n currentPos = parserInput.i = state.i;\n j = state.j;\n };\n parserInput.forget = () => {\n saveStack.pop();\n };\n parserInput.isWhitespace = offset => {\n const pos = parserInput.i + (offset || 0);\n const code = input.charCodeAt(pos);\n return (code === CHARCODE_SPACE || code === CHARCODE_CR || code === CHARCODE_TAB || code === CHARCODE_LF);\n };\n\n // Specialization of $(tok)\n parserInput.$re = tok => {\n if (parserInput.i > currentPos) {\n current = current.slice(parserInput.i - currentPos);\n currentPos = parserInput.i;\n }\n\n const m = tok.exec(current);\n if (!m) {\n return null;\n }\n\n skipWhitespace(m[0].length);\n if (typeof m === 'string') {\n return m;\n }\n\n return m.length === 1 ? m[0] : m;\n };\n\n parserInput.$char = tok => {\n if (input.charAt(parserInput.i) !== tok) {\n return null;\n }\n skipWhitespace(1);\n return tok;\n };\n\n parserInput.$str = tok => {\n const tokLength = tok.length;\n\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tokLength; i++) {\n if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n return null;\n }\n }\n\n skipWhitespace(tokLength);\n return tok;\n };\n\n parserInput.$quoted = loc => {\n const pos = loc || parserInput.i;\n const startChar = input.charAt(pos);\n\n if (startChar !== '\\'' && startChar !== '\"') {\n return;\n }\n const length = input.length;\n const currentPosition = pos;\n\n for (let i = 1; i + currentPosition < length; i++) {\n const nextChar = input.charAt(i + currentPosition);\n switch (nextChar) {\n case '\\\\':\n i++;\n continue;\n case '\\r':\n case '\\n':\n break;\n case startChar:\n const str = input.substr(currentPosition, i + 1);\n if (!loc && loc !== 0) {\n skipWhitespace(i + 1);\n return str\n }\n return [startChar, str];\n default:\n }\n }\n return null;\n };\n\n /**\n * Permissive parsing. Ignores everything except matching {} [] () and quotes\n * until matching token (outside of blocks)\n */\n parserInput.$parseUntil = tok => {\n let quote = '';\n let returnVal = null;\n let inComment = false;\n let blockDepth = 0;\n const blockStack = [];\n const parseGroups = [];\n const length = input.length;\n const startPos = parserInput.i;\n let lastPos = parserInput.i;\n let i = parserInput.i;\n let loop = true;\n let testChar;\n\n if (typeof tok === 'string') {\n testChar = char => char === tok\n } else {\n testChar = char => tok.test(char)\n }\n\n do {\n let prevChar;\n let nextChar = input.charAt(i);\n if (blockDepth === 0 && testChar(nextChar)) {\n returnVal = input.substr(lastPos, i - lastPos);\n if (returnVal) {\n parseGroups.push(returnVal);\n }\n else {\n parseGroups.push(' ');\n }\n returnVal = parseGroups;\n skipWhitespace(i - startPos);\n loop = false\n } else {\n if (inComment) {\n if (nextChar === '*' && \n input.charAt(i + 1) === '/') {\n i++;\n blockDepth--;\n inComment = false;\n }\n i++;\n continue;\n }\n switch (nextChar) {\n case '\\\\':\n i++;\n nextChar = input.charAt(i);\n parseGroups.push(input.substr(lastPos, i - lastPos + 1));\n lastPos = i + 1;\n break;\n case '/':\n if (input.charAt(i + 1) === '*') {\n i++;\n inComment = true;\n blockDepth++;\n }\n break;\n case '\\'':\n case '\"':\n quote = parserInput.$quoted(i);\n if (quote) {\n parseGroups.push(input.substr(lastPos, i - lastPos), quote);\n i += quote[1].length - 1;\n lastPos = i + 1;\n }\n else {\n skipWhitespace(i - startPos);\n returnVal = nextChar;\n loop = false;\n }\n break;\n case '{':\n blockStack.push('}');\n blockDepth++;\n break;\n case '(':\n blockStack.push(')');\n blockDepth++;\n break;\n case '[':\n blockStack.push(']');\n blockDepth++;\n break;\n case '}':\n case ')':\n case ']':\n const expected = blockStack.pop();\n if (nextChar === expected) {\n blockDepth--;\n } else {\n // move the parser to the error and return expected\n skipWhitespace(i - startPos);\n returnVal = expected;\n loop = false;\n }\n }\n i++;\n if (i > length) {\n loop = false;\n }\n }\n prevChar = nextChar;\n } while (loop);\n\n return returnVal ? returnVal : null;\n }\n\n parserInput.autoCommentAbsorb = true;\n parserInput.commentStore = [];\n parserInput.finished = false;\n\n // Same as $(), but don't change the state of the parser,\n // just return the match.\n parserInput.peek = tok => {\n if (typeof tok === 'string') {\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tok.length; i++) {\n if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n return false;\n }\n }\n return true;\n } else {\n return tok.test(current);\n }\n };\n\n // Specialization of peek()\n // TODO remove or change some currentChar calls to peekChar\n parserInput.peekChar = tok => input.charAt(parserInput.i) === tok;\n\n parserInput.currentChar = () => input.charAt(parserInput.i);\n\n parserInput.prevChar = () => input.charAt(parserInput.i - 1);\n\n parserInput.getInput = () => input;\n\n parserInput.peekNotNumeric = () => {\n const c = input.charCodeAt(parserInput.i);\n // Is the first char of the dimension 0-9, '.', '+' or '-'\n return (c > CHARCODE_9 || c < CHARCODE_PLUS) || c === CHARCODE_FORWARD_SLASH || c === CHARCODE_COMMA;\n };\n\n parserInput.start = (str, chunkInput, failFunction) => {\n input = str;\n parserInput.i = j = currentPos = furthest = 0;\n\n // chunking apparently makes things quicker (but my tests indicate\n // it might actually make things slower in node at least)\n // and it is a non-perfect parse - it can't recognise\n // unquoted urls, meaning it can't distinguish comments\n // meaning comments with quotes or {}() in them get 'counted'\n // and then lead to parse errors.\n // In addition if the chunking chunks in the wrong place we might\n // not be able to parse a parser statement in one go\n // this is officially deprecated but can be switched on via an option\n // in the case it causes too much performance issues.\n if (chunkInput) {\n chunks = chunker(str, failFunction);\n } else {\n chunks = [str];\n }\n\n current = chunks[0];\n\n skipWhitespace(0);\n };\n\n parserInput.end = () => {\n let message;\n const isFinished = parserInput.i >= input.length;\n\n if (parserInput.i < furthest) {\n message = furthestPossibleErrorMessage;\n parserInput.i = furthest;\n }\n return {\n isFinished,\n furthest: parserInput.i,\n furthestPossibleErrorMessage: message,\n furthestReachedEnd: parserInput.i >= input.length - 1,\n furthestChar: input[parserInput.i]\n };\n };\n\n return parserInput;\n};\n","// Split the input into chunks.\nexport default function (input, fail) {\n const len = input.length;\n let level = 0;\n let parenLevel = 0;\n let lastOpening;\n let lastOpeningParen;\n let lastMultiComment;\n let lastMultiCommentEndBrace;\n const chunks = [];\n let emitFrom = 0;\n let chunkerCurrentIndex;\n let currentChunkStartIndex;\n let cc;\n let cc2;\n let matched;\n\n function emitChunk(force) {\n const len = chunkerCurrentIndex - emitFrom;\n if (((len < 512) && !force) || !len) {\n return;\n }\n chunks.push(input.slice(emitFrom, chunkerCurrentIndex + 1));\n emitFrom = chunkerCurrentIndex + 1;\n }\n\n for (chunkerCurrentIndex = 0; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc = input.charCodeAt(chunkerCurrentIndex);\n if (((cc >= 97) && (cc <= 122)) || (cc < 34)) {\n // a-z or whitespace\n continue;\n }\n\n switch (cc) {\n case 40: // (\n parenLevel++;\n lastOpeningParen = chunkerCurrentIndex;\n continue;\n case 41: // )\n if (--parenLevel < 0) {\n return fail('missing opening `(`', chunkerCurrentIndex);\n }\n continue;\n case 59: // ;\n if (!parenLevel) { emitChunk(); }\n continue;\n case 123: // {\n level++;\n lastOpening = chunkerCurrentIndex;\n continue;\n case 125: // }\n if (--level < 0) {\n return fail('missing opening `{`', chunkerCurrentIndex);\n }\n if (!level && !parenLevel) { emitChunk(); }\n continue;\n case 92: // \\\n if (chunkerCurrentIndex < len - 1) { chunkerCurrentIndex++; continue; }\n return fail('unescaped `\\\\`', chunkerCurrentIndex);\n case 34:\n case 39:\n case 96: // \", ' and `\n matched = 0;\n currentChunkStartIndex = chunkerCurrentIndex;\n for (chunkerCurrentIndex = chunkerCurrentIndex + 1; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if (cc2 > 96) { continue; }\n if (cc2 == cc) { matched = 1; break; }\n if (cc2 == 92) { // \\\n if (chunkerCurrentIndex == len - 1) {\n return fail('unescaped `\\\\`', chunkerCurrentIndex);\n }\n chunkerCurrentIndex++;\n }\n }\n if (matched) { continue; }\n return fail(`unmatched \\`${String.fromCharCode(cc)}\\``, currentChunkStartIndex);\n case 47: // /, check for comment\n if (parenLevel || (chunkerCurrentIndex == len - 1)) { continue; }\n cc2 = input.charCodeAt(chunkerCurrentIndex + 1);\n if (cc2 == 47) {\n // //, find lnfeed\n for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if ((cc2 <= 13) && ((cc2 == 10) || (cc2 == 13))) { break; }\n }\n } else if (cc2 == 42) {\n // /*, find */\n lastMultiComment = currentChunkStartIndex = chunkerCurrentIndex;\n for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len - 1; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if (cc2 == 125) { lastMultiCommentEndBrace = chunkerCurrentIndex; }\n if (cc2 != 42) { continue; }\n if (input.charCodeAt(chunkerCurrentIndex + 1) == 47) { break; }\n }\n if (chunkerCurrentIndex == len - 1) {\n return fail('missing closing `*/`', currentChunkStartIndex);\n }\n chunkerCurrentIndex++;\n }\n continue;\n case 42: // *, check for unmatched */\n if ((chunkerCurrentIndex < len - 1) && (input.charCodeAt(chunkerCurrentIndex + 1) == 47)) {\n return fail('unmatched `/*`', chunkerCurrentIndex);\n }\n continue;\n }\n }\n\n if (level !== 0) {\n if ((lastMultiComment > lastOpening) && (lastMultiCommentEndBrace > lastMultiComment)) {\n return fail('missing closing `}` or `*/`', lastOpening);\n } else {\n return fail('missing closing `}`', lastOpening);\n }\n } else if (parenLevel !== 0) {\n return fail('missing closing `)`', lastOpeningParen);\n }\n\n emitChunk(true);\n return chunks;\n};\n","import LessError from '../less-error';\nimport tree from '../tree';\nimport visitors from '../visitors';\nimport getParserInput from './parser-input';\nimport * as utils from '../utils';\nimport functionRegistry from '../functions/function-registry';\n\n//\n// less.js - parser\n//\n// A relatively straight-forward predictive parser.\n// There is no tokenization/lexing stage, the input is parsed\n// in one sweep.\n//\n// To make the parser fast enough to run in the browser, several\n// optimization had to be made:\n//\n// - Matching and slicing on a huge input is often cause of slowdowns.\n// The solution is to chunkify the input into smaller strings.\n// The chunks are stored in the `chunks` var,\n// `j` holds the current chunk index, and `currentPos` holds\n// the index of the current chunk in relation to `input`.\n// This gives us an almost 4x speed-up.\n//\n// - In many cases, we don't need to match individual tokens;\n// for example, if a value doesn't hold any variables, operations\n// or dynamic references, the parser can effectively 'skip' it,\n// treating it as a literal.\n// An example would be '1px solid #000' - which evaluates to itself,\n// we don't need to know what the individual components are.\n// The drawback, of course is that you don't get the benefits of\n// syntax-checking on the CSS. This gives us a 50% speed-up in the parser,\n// and a smaller speed-up in the code-gen.\n//\n//\n// Token matching is done with the `$` function, which either takes\n// a terminal string or regexp, or a non-terminal function to call.\n// It also takes care of moving all the indices forwards.\n//\n\nconst Parser = function Parser(context, imports, fileInfo) {\n let parsers;\n const parserInput = getParserInput();\n\n function error(msg, type) {\n throw new LessError(\n {\n index: parserInput.i,\n filename: fileInfo.filename,\n type: type || 'Syntax',\n message: msg\n },\n imports\n );\n }\n\n function expect(arg, msg) {\n // some older browsers return typeof 'function' for RegExp\n const result = (arg instanceof Function) ? arg.call(parsers) : parserInput.$re(arg);\n if (result) {\n return result;\n }\n \n error(msg || (typeof arg === 'string'\n ? `expected '${arg}' got '${parserInput.currentChar()}'`\n : 'unexpected token'));\n }\n\n // Specialization of expect()\n function expectChar(arg, msg) {\n if (parserInput.$char(arg)) {\n return arg;\n }\n error(msg || `expected '${arg}' got '${parserInput.currentChar()}'`);\n }\n\n function getDebugInfo(index) {\n const filename = fileInfo.filename;\n\n return {\n lineNumber: utils.getLocation(index, parserInput.getInput()).line + 1,\n fileName: filename\n };\n }\n\n /**\n * Used after initial parsing to create nodes on the fly\n * \n * @param {String} str - string to parse \n * @param {Array} parseList - array of parsers to run input through e.g. [\"value\", \"important\"]\n * @param {Number} currentIndex - start number to begin indexing\n * @param {Object} fileInfo - fileInfo to attach to created nodes\n */\n function parseNode(str, parseList, currentIndex, fileInfo, callback) {\n let result;\n const returnNodes = [];\n const parser = parserInput;\n\n try {\n parser.start(str, false, function fail(msg, index) {\n callback({\n message: msg,\n index: index + currentIndex\n });\n });\n for (let x = 0, p, i; (p = parseList[x]); x++) {\n i = parser.i;\n result = parsers[p]();\n if (result) {\n try {\n result._index = i + currentIndex;\n result._fileInfo = fileInfo;\n } catch (e) {}\n returnNodes.push(result);\n }\n else {\n returnNodes.push(null);\n }\n }\n\n const endInfo = parser.end();\n if (endInfo.isFinished) {\n callback(null, returnNodes);\n }\n else {\n callback(true, null);\n }\n } catch (e) {\n throw new LessError({\n index: e.index + currentIndex,\n message: e.message\n }, imports, fileInfo.filename);\n }\n }\n\n //\n // The Parser\n //\n return {\n parserInput,\n imports,\n fileInfo,\n parseNode,\n //\n // Parse an input string into an abstract syntax tree,\n // @param str A string containing 'less' markup\n // @param callback call `callback` when done.\n // @param [additionalData] An optional map which can contains vars - a map (key, value) of variables to apply\n //\n parse: function (str, callback, additionalData) {\n let root;\n let error = null;\n let globalVars;\n let modifyVars;\n let ignored;\n let preText = '';\n\n globalVars = (additionalData && additionalData.globalVars) ? `${Parser.serializeVars(additionalData.globalVars)}\\n` : '';\n modifyVars = (additionalData && additionalData.modifyVars) ? `\\n${Parser.serializeVars(additionalData.modifyVars)}` : '';\n\n if (context.pluginManager) {\n const preProcessors = context.pluginManager.getPreProcessors();\n for (let i = 0; i < preProcessors.length; i++) {\n str = preProcessors[i].process(str, { context, imports, fileInfo });\n }\n }\n\n if (globalVars || (additionalData && additionalData.banner)) {\n preText = ((additionalData && additionalData.banner) ? additionalData.banner : '') + globalVars;\n ignored = imports.contentsIgnoredChars;\n ignored[fileInfo.filename] = ignored[fileInfo.filename] || 0;\n ignored[fileInfo.filename] += preText.length;\n }\n\n str = str.replace(/\\r\\n?/g, '\\n');\n // Remove potential UTF Byte Order Mark\n str = preText + str.replace(/^\\uFEFF/, '') + modifyVars;\n imports.contents[fileInfo.filename] = str;\n\n // Start with the primary rule.\n // The whole syntax tree is held under a Ruleset node,\n // with the `root` property set to true, so no `{}` are\n // output. The callback is called when the input is parsed.\n try {\n parserInput.start(str, context.chunkInput, function fail(msg, index) {\n throw new LessError({\n index,\n type: 'Parse',\n message: msg,\n filename: fileInfo.filename\n }, imports);\n });\n\n tree.Node.prototype.parse = this;\n root = new tree.Ruleset(null, this.parsers.primary());\n tree.Node.prototype.rootNode = root;\n root.root = true;\n root.firstRoot = true;\n root.functionRegistry = functionRegistry.inherit();\n \n } catch (e) {\n return callback(new LessError(e, imports, fileInfo.filename));\n }\n\n // If `i` is smaller than the `input.length - 1`,\n // it means the parser wasn't able to parse the whole\n // string, so we've got a parsing error.\n //\n // We try to extract a \\n delimited string,\n // showing the line where the parse error occurred.\n // We split it up into two parts (the part which parsed,\n // and the part which didn't), so we can color them differently.\n const endInfo = parserInput.end();\n if (!endInfo.isFinished) {\n\n let message = endInfo.furthestPossibleErrorMessage;\n\n if (!message) {\n message = 'Unrecognised input';\n if (endInfo.furthestChar === '}') {\n message += '. Possibly missing opening \\'{\\'';\n } else if (endInfo.furthestChar === ')') {\n message += '. Possibly missing opening \\'(\\'';\n } else if (endInfo.furthestReachedEnd) {\n message += '. Possibly missing something';\n }\n }\n\n error = new LessError({\n type: 'Parse',\n message,\n index: endInfo.furthest,\n filename: fileInfo.filename\n }, imports);\n }\n\n const finish = e => {\n e = error || e || imports.error;\n\n if (e) {\n if (!(e instanceof LessError)) {\n e = new LessError(e, imports, fileInfo.filename);\n }\n\n return callback(e);\n }\n else {\n return callback(null, root);\n }\n };\n\n if (context.processImports !== false) {\n new visitors.ImportVisitor(imports, finish)\n .run(root);\n } else {\n return finish();\n }\n },\n\n //\n // Here in, the parsing rules/functions\n //\n // The basic structure of the syntax tree generated is as follows:\n //\n // Ruleset -> Declaration -> Value -> Expression -> Entity\n //\n // Here's some Less code:\n //\n // .class {\n // color: #fff;\n // border: 1px solid #000;\n // width: @w + 4px;\n // > .child {...}\n // }\n //\n // And here's what the parse tree might look like:\n //\n // Ruleset (Selector '.class', [\n // Declaration (\"color\", Value ([Expression [Color #fff]]))\n // Declaration (\"border\", Value ([Expression [Dimension 1px][Keyword \"solid\"][Color #000]]))\n // Declaration (\"width\", Value ([Expression [Operation \" + \" [Variable \"@w\"][Dimension 4px]]]))\n // Ruleset (Selector [Element '>', '.child'], [...])\n // ])\n //\n // In general, most rules will try to parse a token with the `$re()` function, and if the return\n // value is truly, will return a new node, of the relevant type. Sometimes, we need to check\n // first, before parsing, that's when we use `peek()`.\n //\n parsers: parsers = {\n //\n // The `primary` rule is the *entry* and *exit* point of the parser.\n // The rules here can appear at any level of the parse tree.\n //\n // The recursive nature of the grammar is an interplay between the `block`\n // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule,\n // as represented by this simplified grammar:\n //\n // primary → (ruleset | declaration)+\n // ruleset → selector+ block\n // block → '{' primary '}'\n //\n // Only at one point is the primary rule not called from the\n // block rule: at the root level.\n //\n primary: function () {\n const mixin = this.mixin;\n let root = [];\n let node;\n\n while (true) {\n while (true) {\n node = this.comment();\n if (!node) { break; }\n root.push(node);\n }\n // always process comments before deciding if finished\n if (parserInput.finished) {\n break;\n }\n if (parserInput.peek('}')) {\n break;\n }\n\n node = this.extendRule();\n if (node) {\n root = root.concat(node);\n continue;\n }\n\n node = mixin.definition() || this.declaration() || mixin.call(false, false) || \n this.ruleset() || this.variableCall() || this.entities.call() || this.atrule();\n if (node) {\n root.push(node);\n } else {\n let foundSemiColon = false;\n while (parserInput.$char(';')) {\n foundSemiColon = true;\n }\n if (!foundSemiColon) {\n break;\n }\n }\n }\n\n return root;\n },\n\n // comments are collected by the main parsing mechanism and then assigned to nodes\n // where the current structure allows it\n comment: function () {\n if (parserInput.commentStore.length) {\n const comment = parserInput.commentStore.shift();\n return new(tree.Comment)(comment.text, comment.isLineComment, comment.index, fileInfo);\n }\n },\n\n //\n // Entities are tokens which can be found inside an Expression\n //\n entities: {\n mixinLookup: function() {\n return parsers.mixin.call(true, true);\n },\n //\n // A string, which supports escaping \" and '\n //\n // \"milky way\" 'he\\'s the one!'\n //\n quoted: function (forceEscaped) {\n let str;\n const index = parserInput.i;\n let isEscaped = false;\n\n parserInput.save();\n if (parserInput.$char('~')) {\n isEscaped = true;\n } else if (forceEscaped) {\n parserInput.restore();\n return;\n }\n\n str = parserInput.$quoted();\n if (!str) {\n parserInput.restore();\n return;\n }\n parserInput.forget();\n\n return new(tree.Quoted)(str.charAt(0), str.substr(1, str.length - 2), isEscaped, index, fileInfo);\n },\n\n //\n // A catch-all word, such as:\n //\n // black border-collapse\n //\n keyword: function () {\n const k = parserInput.$char('%') || parserInput.$re(/^\\[?(?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+\\]?/);\n if (k) {\n return tree.Color.fromKeyword(k) || new(tree.Keyword)(k);\n }\n },\n\n //\n // A function call\n //\n // rgb(255, 0, 255)\n //\n // The arguments are parsed with the `entities.arguments` parser.\n //\n call: function () {\n let name;\n let args;\n let func;\n const index = parserInput.i;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (parserInput.peek(/^url\\(/i)) {\n return;\n }\n\n parserInput.save();\n\n name = parserInput.$re(/^([\\w-]+|%|~|progid:[\\w\\.]+)\\(/);\n if (!name) {\n parserInput.forget(); \n return;\n }\n\n name = name[1];\n func = this.customFuncCall(name);\n if (func) {\n args = func.parse();\n if (args && func.stop) {\n parserInput.forget();\n return args;\n }\n }\n\n args = this.arguments(args);\n\n if (!parserInput.$char(')')) {\n parserInput.restore('Could not parse call arguments or missing \\')\\'');\n return;\n }\n\n parserInput.forget();\n\n return new(tree.Call)(name, args, index, fileInfo);\n },\n \n //\n // Parsing rules for functions with non-standard args, e.g.:\n //\n // boolean(not(2 > 1))\n //\n // This is a quick prototype, to be modified/improved when\n // more custom-parsed funcs come (e.g. `selector(...)`)\n //\n\n customFuncCall: function (name) {\n /* Ideally the table is to be moved out of here for faster perf.,\n but it's quite tricky since it relies on all these `parsers`\n and `expect` available only here */\n return {\n alpha: f(parsers.ieAlpha, true),\n boolean: f(condition),\n 'if': f(condition)\n }[name.toLowerCase()];\n\n function f(parse, stop) {\n return {\n parse, // parsing function\n stop // when true - stop after parse() and return its result, \n // otherwise continue for plain args\n };\n }\n \n function condition() {\n return [expect(parsers.condition, 'expected condition')];\n }\n },\n\n arguments: function (prevArgs) {\n let argsComma = prevArgs || [];\n const argsSemiColon = [];\n let isSemiColonSeparated;\n let value;\n\n parserInput.save();\n\n while (true) {\n if (prevArgs) {\n prevArgs = false;\n } else {\n value = parsers.detachedRuleset() || this.assignment() || parsers.expression();\n if (!value) {\n break;\n }\n\n if (value.value && value.value.length == 1) {\n value = value.value[0];\n }\n\n argsComma.push(value);\n }\n\n if (parserInput.$char(',')) {\n continue;\n }\n\n if (parserInput.$char(';') || isSemiColonSeparated) {\n isSemiColonSeparated = true;\n value = (argsComma.length < 1) ? argsComma[0]\n : new tree.Value(argsComma);\n argsSemiColon.push(value);\n argsComma = [];\n }\n }\n\n parserInput.forget();\n return isSemiColonSeparated ? argsSemiColon : argsComma;\n },\n literal: function () {\n return this.dimension() ||\n this.color() ||\n this.quoted() ||\n this.unicodeDescriptor();\n },\n\n // Assignments are argument entities for calls.\n // They are present in ie filter properties as shown below.\n //\n // filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* )\n //\n\n assignment: function () {\n let key;\n let value;\n parserInput.save();\n key = parserInput.$re(/^\\w+(?=\\s?=)/i);\n if (!key) {\n parserInput.restore();\n return;\n }\n if (!parserInput.$char('=')) {\n parserInput.restore();\n return;\n }\n value = parsers.entity();\n if (value) {\n parserInput.forget();\n return new(tree.Assignment)(key, value);\n } else {\n parserInput.restore();\n }\n },\n\n //\n // Parse url() tokens\n //\n // We use a specific rule for urls, because they don't really behave like\n // standard function calls. The difference is that the argument doesn't have\n // to be enclosed within a string, so it can't be parsed as an Expression.\n //\n url: function () {\n let value;\n const index = parserInput.i;\n\n parserInput.autoCommentAbsorb = false;\n\n if (!parserInput.$str('url(')) {\n parserInput.autoCommentAbsorb = true;\n return;\n }\n\n value = this.quoted() || this.variable() || this.property() ||\n parserInput.$re(/^(?:(?:\\\\[\\(\\)'\"])|[^\\(\\)'\"])+/) || '';\n\n parserInput.autoCommentAbsorb = true;\n\n expectChar(')');\n\n return new(tree.URL)((value.value != null || \n value instanceof tree.Variable || \n value instanceof tree.Property) ?\n value : new(tree.Anonymous)(value, index), index, fileInfo);\n },\n\n //\n // A Variable entity, such as `@fink`, in\n //\n // width: @fink + 2px\n //\n // We use a different parser for variable definitions,\n // see `parsers.variable`.\n //\n variable: function () {\n let ch;\n let name;\n const index = parserInput.i;\n\n parserInput.save();\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^@@?[\\w-]+/))) {\n ch = parserInput.currentChar();\n if (ch === '(' || ch === '[' && !parserInput.prevChar().match(/^\\s/)) {\n // this may be a VariableCall lookup\n const result = parsers.variableCall(name);\n if (result) {\n parserInput.forget();\n return result;\n }\n }\n parserInput.forget();\n return new(tree.Variable)(name, index, fileInfo);\n }\n parserInput.restore();\n },\n\n // A variable entity using the protective {} e.g. @{var}\n variableCurly: function () {\n let curly;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '@' && (curly = parserInput.$re(/^@\\{([\\w-]+)\\}/))) {\n return new(tree.Variable)(`@${curly[1]}`, index, fileInfo);\n }\n },\n //\n // A Property accessor, such as `$color`, in\n //\n // background-color: $color\n //\n property: function () {\n let name;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' && (name = parserInput.$re(/^\\$[\\w-]+/))) {\n return new(tree.Property)(name, index, fileInfo);\n }\n },\n\n // A property entity useing the protective {} e.g. ${prop}\n propertyCurly: function () {\n let curly;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' && (curly = parserInput.$re(/^\\$\\{([\\w-]+)\\}/))) {\n return new(tree.Property)(`$${curly[1]}`, index, fileInfo);\n }\n },\n //\n // A Hexadecimal color\n //\n // #4F3C2F\n //\n // `rgb` and `hsl` colors are parsed through the `entities.call` parser.\n //\n color: function () {\n let rgb;\n parserInput.save();\n\n if (parserInput.currentChar() === '#' && (rgb = parserInput.$re(/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})([\\w.#\\[])?/))) {\n if (!rgb[2]) {\n parserInput.forget();\n return new(tree.Color)(rgb[1], undefined, rgb[0]);\n } \n }\n parserInput.restore();\n },\n\n colorKeyword: function () {\n parserInput.save();\n const autoCommentAbsorb = parserInput.autoCommentAbsorb;\n parserInput.autoCommentAbsorb = false;\n const k = parserInput.$re(/^[_A-Za-z-][_A-Za-z0-9-]+/);\n parserInput.autoCommentAbsorb = autoCommentAbsorb;\n if (!k) {\n parserInput.forget();\n return;\n }\n parserInput.restore();\n const color = tree.Color.fromKeyword(k);\n if (color) {\n parserInput.$str(k);\n return color;\n }\n },\n\n //\n // A Dimension, that is, a number and a unit\n //\n // 0.5em 95%\n //\n dimension: function () {\n if (parserInput.peekNotNumeric()) {\n return;\n }\n\n const value = parserInput.$re(/^([+-]?\\d*\\.?\\d+)(%|[a-z_]+)?/i);\n if (value) {\n return new(tree.Dimension)(value[1], value[2]);\n }\n },\n\n //\n // A unicode descriptor, as is used in unicode-range\n //\n // U+0?? or U+00A1-00A9\n //\n unicodeDescriptor: function () {\n let ud;\n\n ud = parserInput.$re(/^U\\+[0-9a-fA-F?]+(\\-[0-9a-fA-F?]+)?/);\n if (ud) {\n return new(tree.UnicodeDescriptor)(ud[0]);\n }\n },\n\n //\n // JavaScript code to be evaluated\n //\n // `window.location.href`\n //\n javascript: function () {\n let js;\n const index = parserInput.i;\n\n parserInput.save();\n\n const escape = parserInput.$char('~');\n const jsQuote = parserInput.$char('`');\n\n if (!jsQuote) {\n parserInput.restore();\n return;\n }\n\n js = parserInput.$re(/^[^`]*`/);\n if (js) {\n parserInput.forget();\n return new(tree.JavaScript)(js.substr(0, js.length - 1), Boolean(escape), index, fileInfo);\n }\n parserInput.restore('invalid javascript definition');\n }\n },\n\n //\n // The variable part of a variable definition. Used in the `rule` parser\n //\n // @fink:\n //\n variable: function () {\n let name;\n\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^(@[\\w-]+)\\s*:/))) { return name[1]; }\n },\n\n //\n // Call a variable value to retrieve a detached ruleset\n // or a value from a detached ruleset's rules.\n //\n // @fink();\n // @fink;\n // color: @fink[@color];\n //\n variableCall: function (parsedName) {\n let lookups;\n const i = parserInput.i;\n const inValue = !!parsedName;\n let name = parsedName;\n\n parserInput.save();\n\n if (name || (parserInput.currentChar() === '@'\n && (name = parserInput.$re(/^(@[\\w-]+)(\\(\\s*\\))?/)))) {\n\n lookups = this.mixin.ruleLookups();\n\n if (!lookups && ((inValue && parserInput.$str('()') !== '()') || (name[2] !== '()'))) {\n parserInput.restore('Missing \\'[...]\\' lookup in variable call');\n return;\n }\n\n if (!inValue) {\n name = name[1];\n }\n\n const call = new tree.VariableCall(name, i, fileInfo);\n if (!inValue && parsers.end()) {\n parserInput.forget();\n return call;\n }\n else {\n parserInput.forget();\n return new tree.NamespaceValue(call, lookups, i, fileInfo);\n }\n }\n\n parserInput.restore();\n },\n\n //\n // extend syntax - used to extend selectors\n //\n extend: function(isRule) {\n let elements;\n let e;\n const index = parserInput.i;\n let option;\n let extendList;\n let extend;\n\n if (!parserInput.$str(isRule ? '&:extend(' : ':extend(')) {\n return;\n }\n\n do {\n option = null;\n elements = null;\n while (!(option = parserInput.$re(/^(all)(?=\\s*(\\)|,))/))) {\n e = this.element();\n if (!e) {\n break;\n }\n if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n }\n\n option = option && option[1];\n if (!elements) {\n error('Missing target selector for :extend().');\n }\n extend = new(tree.Extend)(new(tree.Selector)(elements), option, index, fileInfo);\n if (extendList) {\n extendList.push(extend);\n } else {\n extendList = [ extend ];\n }\n } while (parserInput.$char(','));\n\n expect(/^\\)/);\n\n if (isRule) {\n expect(/^;/);\n }\n\n return extendList;\n },\n\n //\n // extendRule - used in a rule to extend all the parent selectors\n //\n extendRule: function() {\n return this.extend(true);\n },\n\n //\n // Mixins\n //\n mixin: {\n //\n // A Mixin call, with an optional argument list\n //\n // #mixins > .square(#fff);\n // #mixins.square(#fff);\n // .rounded(4px, black);\n // .button;\n //\n // We can lookup / return a value using the lookup syntax:\n //\n // color: #mixin.square(#fff)[@color];\n //\n // The `while` loop is there because mixins can be\n // namespaced, but we only support the child and descendant\n // selector for now.\n //\n call: function (inValue, getLookup) {\n const s = parserInput.currentChar();\n let important = false;\n let lookups;\n const index = parserInput.i;\n let elements;\n let args;\n let hasParens;\n\n if (s !== '.' && s !== '#') { return; }\n\n parserInput.save(); // stop us absorbing part of an invalid selector\n\n elements = this.elements();\n\n if (elements) {\n if (parserInput.$char('(')) {\n args = this.args(true).args;\n expectChar(')');\n hasParens = true;\n }\n\n if (getLookup !== false) {\n lookups = this.ruleLookups();\n }\n if (getLookup === true && !lookups) {\n parserInput.restore();\n return;\n }\n\n if (!lookups && !hasParens) {\n // This isn't a valid mixin call\n parserInput.restore('Unrecognized input. Possibly missing \\'(\\' in mixin call.');\n return;\n }\n\n if (!inValue && parsers.important()) {\n important = true;\n }\n\n if (inValue || parsers.end()) {\n parserInput.forget();\n const mixin = new(tree.mixin.Call)(elements, args, index, fileInfo, !lookups && important);\n if (lookups) {\n return new tree.NamespaceValue(mixin, lookups);\n }\n else {\n return mixin;\n }\n }\n }\n\n parserInput.restore();\n },\n /**\n * Matching elements for mixins\n * (Start with . or # and can have > )\n */\n elements: function() {\n let elements;\n let e;\n let c;\n let elem;\n let elemIndex;\n const re = /^[#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/;\n while (true) {\n elemIndex = parserInput.i;\n e = parserInput.$re(re);\n \n if (!e) {\n break;\n }\n elem = new(tree.Element)(c, e, false, elemIndex, fileInfo);\n if (elements) {\n elements.push(elem);\n } else {\n elements = [ elem ];\n }\n c = parserInput.$char('>');\n }\n return elements;\n },\n args: function (isCall) {\n const entities = parsers.entities;\n const returner = { args:null, variadic: false };\n let expressions = [];\n const argsSemiColon = [];\n const argsComma = [];\n let isSemiColonSeparated;\n let expressionContainsNamed;\n let name;\n let nameLoop;\n let value;\n let arg;\n let expand;\n let hasSep = true;\n\n parserInput.save();\n\n while (true) {\n if (isCall) {\n arg = parsers.detachedRuleset() || parsers.expression();\n } else {\n parserInput.commentStore.length = 0;\n if (parserInput.$str('...')) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ variadic: true });\n break;\n }\n arg = entities.variable() || entities.property() || entities.literal() || entities.keyword() || this.call(true);\n }\n\n if (!arg || !hasSep) {\n break;\n }\n\n nameLoop = null;\n if (arg.throwAwayComments) {\n arg.throwAwayComments();\n }\n value = arg;\n let val = null;\n\n if (isCall) {\n // Variable\n if (arg.value && arg.value.length == 1) {\n val = arg.value[0];\n }\n } else {\n val = arg;\n }\n\n if (val && (val instanceof tree.Variable || val instanceof tree.Property)) {\n if (parserInput.$char(':')) {\n if (expressions.length > 0) {\n if (isSemiColonSeparated) {\n error('Cannot mix ; and , as delimiter types');\n }\n expressionContainsNamed = true;\n }\n\n value = parsers.detachedRuleset() || parsers.expression();\n\n if (!value) {\n if (isCall) {\n error('could not understand value for named argument');\n } else {\n parserInput.restore();\n returner.args = [];\n return returner;\n }\n }\n nameLoop = (name = val.name);\n } else if (parserInput.$str('...')) {\n if (!isCall) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ name: arg.name, variadic: true });\n break;\n } else {\n expand = true;\n }\n } else if (!isCall) {\n name = nameLoop = val.name;\n value = null;\n }\n }\n\n if (value) {\n expressions.push(value);\n }\n\n argsComma.push({ name:nameLoop, value, expand });\n\n if (parserInput.$char(',')) {\n hasSep = true;\n continue;\n }\n hasSep = parserInput.$char(';') === ';';\n\n if (hasSep || isSemiColonSeparated) {\n\n if (expressionContainsNamed) {\n error('Cannot mix ; and , as delimiter types');\n }\n\n isSemiColonSeparated = true;\n\n if (expressions.length > 1) {\n value = new(tree.Value)(expressions);\n }\n argsSemiColon.push({ name, value, expand });\n\n name = null;\n expressions = [];\n expressionContainsNamed = false;\n }\n }\n\n parserInput.forget();\n returner.args = isSemiColonSeparated ? argsSemiColon : argsComma;\n return returner;\n },\n //\n // A Mixin definition, with a list of parameters\n //\n // .rounded (@radius: 2px, @color) {\n // ...\n // }\n //\n // Until we have a finer grained state-machine, we have to\n // do a look-ahead, to make sure we don't have a mixin call.\n // See the `rule` function for more information.\n //\n // We start by matching `.rounded (`, and then proceed on to\n // the argument list, which has optional default values.\n // We store the parameters in `params`, with a `value` key,\n // if there is a value, such as in the case of `@radius`.\n //\n // Once we've got our params list, and a closing `)`, we parse\n // the `{...}` block.\n //\n definition: function () {\n let name;\n let params = [];\n let match;\n let ruleset;\n let cond;\n let variadic = false;\n if ((parserInput.currentChar() !== '.' && parserInput.currentChar() !== '#') ||\n parserInput.peek(/^[^{]*\\}/)) {\n return;\n }\n\n parserInput.save();\n\n match = parserInput.$re(/^([#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\\s*\\(/);\n if (match) {\n name = match[1];\n\n const argInfo = this.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n\n // .mixincall(\"@{a}\");\n // looks a bit like a mixin definition..\n // also\n // .mixincall(@a: {rule: set;});\n // so we have to be nice and restore\n if (!parserInput.$char(')')) {\n parserInput.restore('Missing closing \\')\\'');\n return;\n }\n\n parserInput.commentStore.length = 0;\n\n if (parserInput.$str('when')) { // Guard\n cond = expect(parsers.conditions, 'expected condition');\n }\n\n ruleset = parsers.block();\n\n if (ruleset) {\n parserInput.forget();\n return new(tree.mixin.Definition)(name, params, ruleset, cond, variadic);\n } else {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n }\n },\n \n ruleLookups: function() {\n let rule;\n let args;\n const lookups = [];\n\n if (parserInput.currentChar() !== '[') { \n return;\n }\n\n while (true) {\n parserInput.save();\n args = null;\n rule = this.lookupValue();\n if (!rule && rule !== '') {\n parserInput.restore();\n break;\n }\n lookups.push(rule);\n parserInput.forget();\n }\n if (lookups.length > 0) {\n return lookups;\n }\n },\n \n lookupValue: function() {\n parserInput.save();\n \n if (!parserInput.$char('[')) { \n parserInput.restore();\n return;\n }\n \n const name = parserInput.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);\n \n if (!parserInput.$char(']')) {\n parserInput.restore();\n return;\n } \n\n if (name || name === '') {\n parserInput.forget();\n return name;\n }\n \n parserInput.restore();\n }\n },\n //\n // Entities are the smallest recognized token,\n // and can be found inside a rule's value.\n //\n entity: function () {\n const entities = this.entities;\n\n return this.comment() || entities.literal() || entities.variable() || entities.url() ||\n entities.property() || entities.call() || entities.keyword() || this.mixin.call(true) ||\n entities.javascript();\n },\n\n //\n // A Declaration terminator. Note that we use `peek()` to check for '}',\n // because the `block` rule will be expecting it, but we still need to make sure\n // it's there, if ';' was omitted.\n //\n end: function () {\n return parserInput.$char(';') || parserInput.peek('}');\n },\n\n //\n // IE's alpha function\n //\n // alpha(opacity=88)\n //\n ieAlpha: function () {\n let value;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (!parserInput.$re(/^opacity=/i)) { return; }\n value = parserInput.$re(/^\\d+/);\n if (!value) {\n value = expect(parsers.entities.variable, 'Could not parse alpha');\n value = `@{${value.name.slice(1)}}`;\n }\n expectChar(')');\n return new tree.Quoted('', `alpha(opacity=${value})`);\n },\n\n //\n // A Selector Element\n //\n // div\n // + h1\n // #socks\n // input[type=\"text\"]\n //\n // Elements are the building blocks for Selectors,\n // they are made out of a `Combinator` (see combinator rule),\n // and an element name, such as a tag a class, or `*`.\n //\n element: function () {\n let e;\n let c;\n let v;\n const index = parserInput.i;\n\n c = this.combinator();\n\n e = parserInput.$re(/^(?:\\d+\\.\\d+|\\d+)%/) ||\n parserInput.$re(/^(?:[.#]?|:*)(?:[\\w-]|[^\\x00-\\x9f]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/) ||\n parserInput.$char('*') || parserInput.$char('&') || this.attribute() ||\n parserInput.$re(/^\\([^&()@]+\\)/) || parserInput.$re(/^[\\.#:](?=@)/) ||\n this.entities.variableCurly();\n\n if (!e) {\n parserInput.save();\n if (parserInput.$char('(')) {\n if ((v = this.selector(false)) && parserInput.$char(')')) {\n e = new(tree.Paren)(v);\n parserInput.forget();\n } else {\n parserInput.restore('Missing closing \\')\\'');\n }\n } else {\n parserInput.forget();\n }\n }\n\n if (e) { return new(tree.Element)(c, e, e instanceof tree.Variable, index, fileInfo); }\n },\n\n //\n // Combinators combine elements together, in a Selector.\n //\n // Because our parser isn't white-space sensitive, special care\n // has to be taken, when parsing the descendant combinator, ` `,\n // as it's an empty space. We have to check the previous character\n // in the input, to see if it's a ` ` character. More info on how\n // we deal with this in *combinator.js*.\n //\n combinator: function () {\n let c = parserInput.currentChar();\n\n if (c === '/') {\n parserInput.save();\n const slashedCombinator = parserInput.$re(/^\\/[a-z]+\\//i);\n if (slashedCombinator) {\n parserInput.forget();\n return new(tree.Combinator)(slashedCombinator);\n }\n parserInput.restore();\n }\n\n if (c === '>' || c === '+' || c === '~' || c === '|' || c === '^') {\n parserInput.i++;\n if (c === '^' && parserInput.currentChar() === '^') {\n c = '^^';\n parserInput.i++;\n }\n while (parserInput.isWhitespace()) { parserInput.i++; }\n return new(tree.Combinator)(c);\n } else if (parserInput.isWhitespace(-1)) {\n return new(tree.Combinator)(' ');\n } else {\n return new(tree.Combinator)(null);\n }\n },\n //\n // A CSS Selector\n // with less extensions e.g. the ability to extend and guard\n //\n // .class > div + h1\n // li a:hover\n //\n // Selectors are made out of one or more Elements, see above.\n //\n selector: function (isLess) {\n const index = parserInput.i;\n let elements;\n let extendList;\n let c;\n let e;\n let allExtends;\n let when;\n let condition;\n isLess = isLess !== false;\n while ((isLess && (extendList = this.extend())) || (isLess && (when = parserInput.$str('when'))) || (e = this.element())) {\n if (when) {\n condition = expect(this.conditions, 'expected condition');\n } else if (condition) {\n error('CSS guard can only be used at the end of selector');\n } else if (extendList) {\n if (allExtends) {\n allExtends = allExtends.concat(extendList);\n } else {\n allExtends = extendList;\n }\n } else {\n if (allExtends) { error('Extend can only be used at the end of selector'); }\n c = parserInput.currentChar();\n if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n e = null;\n }\n if (c === '{' || c === '}' || c === ';' || c === ',' || c === ')') {\n break;\n }\n }\n\n if (elements) { return new(tree.Selector)(elements, allExtends, condition, index, fileInfo); }\n if (allExtends) { error('Extend must be used to extend a selector, it cannot be used on its own'); }\n },\n selectors: function () {\n let s;\n let selectors;\n while (true) {\n s = this.selector();\n if (!s) {\n break;\n }\n if (selectors) {\n selectors.push(s);\n } else {\n selectors = [ s ];\n }\n parserInput.commentStore.length = 0;\n if (s.condition && selectors.length > 1) {\n error(\"Guards are only currently allowed on a single selector.\");\n }\n if (!parserInput.$char(',')) { break; }\n if (s.condition) {\n error(\"Guards are only currently allowed on a single selector.\");\n }\n parserInput.commentStore.length = 0;\n }\n return selectors;\n },\n attribute: function () {\n if (!parserInput.$char('[')) { return; }\n\n const entities = this.entities;\n let key;\n let val;\n let op;\n\n if (!(key = entities.variableCurly())) {\n key = expect(/^(?:[_A-Za-z0-9-\\*]*\\|)?(?:[_A-Za-z0-9-]|\\\\.)+/);\n }\n\n op = parserInput.$re(/^[|~*$^]?=/);\n if (op) {\n val = entities.quoted() || parserInput.$re(/^[0-9]+%/) || parserInput.$re(/^[\\w-]+/) || entities.variableCurly();\n }\n\n expectChar(']');\n\n return new(tree.Attribute)(key, op, val);\n },\n\n //\n // The `block` rule is used by `ruleset` and `mixin.definition`.\n // It's a wrapper around the `primary` rule, with added `{}`.\n //\n block: function () {\n let content;\n if (parserInput.$char('{') && (content = this.primary()) && parserInput.$char('}')) {\n return content;\n }\n },\n\n blockRuleset: function() {\n let block = this.block();\n\n if (block) {\n block = new tree.Ruleset(null, block);\n }\n return block;\n },\n\n detachedRuleset: function() {\n let argInfo;\n let params;\n let variadic;\n\n parserInput.save();\n if (parserInput.$re(/^[.#]\\(/)) {\n /**\n * DR args currently only implemented for each() function, and not \n * yet settable as `@dr: #(@arg) {}`\n * This should be done when DRs are merged with mixins.\n * See: https://github.com/less/less-meta/issues/16\n */\n argInfo = this.mixin.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n if (!parserInput.$char(')')) {\n parserInput.restore();\n return;\n }\n }\n const blockRuleset = this.blockRuleset();\n if (blockRuleset) {\n parserInput.forget();\n if (params) {\n return new tree.mixin.Definition(null, params, blockRuleset, null, variadic);\n }\n return new tree.DetachedRuleset(blockRuleset);\n }\n parserInput.restore();\n },\n\n //\n // div, .class, body > p {...}\n //\n ruleset: function () {\n let selectors;\n let rules;\n let debugInfo;\n\n parserInput.save();\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(parserInput.i);\n }\n\n selectors = this.selectors();\n\n if (selectors && (rules = this.block())) {\n parserInput.forget();\n const ruleset = new(tree.Ruleset)(selectors, rules, context.strictImports);\n if (context.dumpLineNumbers) {\n ruleset.debugInfo = debugInfo;\n }\n return ruleset;\n } else {\n parserInput.restore();\n }\n },\n declaration: function () {\n let name;\n let value;\n const index = parserInput.i;\n let hasDR;\n const c = parserInput.currentChar();\n let important;\n let merge;\n let isVariable;\n\n if (c === '.' || c === '#' || c === '&' || c === ':') { return; }\n\n parserInput.save();\n\n name = this.variable() || this.ruleProperty();\n if (name) {\n isVariable = typeof name === 'string';\n\n if (isVariable) {\n value = this.detachedRuleset();\n if (value) {\n hasDR = true;\n }\n }\n\n parserInput.commentStore.length = 0;\n if (!value) {\n // a name returned by this.ruleProperty() is always an array of the form:\n // [string-1, ..., string-n, \"\"] or [string-1, ..., string-n, \"+\"]\n // where each item is a tree.Keyword or tree.Variable\n merge = !isVariable && name.length > 1 && name.pop().value;\n\n // Custom property values get permissive parsing\n if (name[0].value && name[0].value.slice(0, 2) === '--') {\n value = this.permissiveValue();\n }\n // Try to store values as anonymous\n // If we need the value later we'll re-parse it in ruleset.parseValue\n else {\n value = this.anonymousValue();\n }\n if (value) {\n parserInput.forget();\n // anonymous values absorb the end ';' which is required for them to work\n return new(tree.Declaration)(name, value, false, merge, index, fileInfo);\n }\n\n if (!value) {\n value = this.value();\n }\n\n if (value) {\n important = this.important();\n } else if (isVariable) {\n // As a last resort, try permissiveValue\n value = this.permissiveValue();\n }\n }\n\n if (value && (this.end() || hasDR)) {\n parserInput.forget();\n return new(tree.Declaration)(name, value, important, merge, index, fileInfo);\n }\n else {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n }\n },\n anonymousValue: function () {\n const index = parserInput.i;\n const match = parserInput.$re(/^([^.#@\\$+\\/'\"*`(;{}-]*);/);\n if (match) {\n return new(tree.Anonymous)(match[1], index);\n }\n },\n /**\n * Used for custom properties, at-rules, and variables (as fallback)\n * Parses almost anything inside of {} [] () \"\" blocks\n * until it reaches outer-most tokens.\n * \n * First, it will try to parse comments and entities to reach\n * the end. This is mostly like the Expression parser except no\n * math is allowed.\n */\n permissiveValue: function (untilTokens) {\n let i;\n let e;\n let done;\n let value;\n const tok = untilTokens || ';';\n const index = parserInput.i;\n const result = [];\n\n function testCurrentChar() {\n const char = parserInput.currentChar();\n if (typeof tok === 'string') {\n return char === tok;\n } else {\n return tok.test(char);\n }\n }\n if (testCurrentChar()) {\n return;\n }\n value = [];\n do {\n e = this.comment();\n if (e) {\n value.push(e);\n continue;\n }\n e = this.entity();\n if (e) {\n value.push(e);\n }\n } while (e);\n\n done = testCurrentChar();\n\n if (value.length > 0) {\n value = new(tree.Expression)(value);\n if (done) {\n return value;\n }\n else {\n result.push(value);\n }\n // Preserve space before $parseUntil as it will not\n if (parserInput.prevChar() === ' ') {\n result.push(new tree.Anonymous(' ', index));\n }\n }\n parserInput.save();\n\n value = parserInput.$parseUntil(tok);\n\n if (value) {\n if (typeof value === 'string') {\n error(`Expected '${value}'`, 'Parse');\n }\n if (value.length === 1 && value[0] === ' ') {\n parserInput.forget();\n return new tree.Anonymous('', index);\n }\n let item;\n for (i = 0; i < value.length; i++) {\n item = value[i];\n if (Array.isArray(item)) {\n // Treat actual quotes as normal quoted values\n result.push(new tree.Quoted(item[0], item[1], true, index, fileInfo));\n }\n else {\n if (i === value.length - 1) {\n item = item.trim();\n }\n // Treat like quoted values, but replace vars like unquoted expressions\n const quote = new tree.Quoted('\\'', item, true, index, fileInfo);\n quote.variableRegex = /@([\\w-]+)/g;\n quote.propRegex = /\\$([\\w-]+)/g;\n result.push(quote);\n }\n }\n parserInput.forget();\n return new tree.Expression(result, true);\n }\n parserInput.restore();\n },\n\n //\n // An @import atrule\n //\n // @import \"lib\";\n //\n // Depending on our environment, importing is done differently:\n // In the browser, it's an XHR request, in Node, it would be a\n // file-system operation. The function used for importing is\n // stored in `import`, which we pass to the Import constructor.\n //\n 'import': function () {\n let path;\n let features;\n const index = parserInput.i;\n\n const dir = parserInput.$re(/^@import?\\s+/);\n\n if (dir) {\n const options = (dir ? this.importOptions() : null) || {};\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n features = this.mediaFeatures();\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon or unrecognised media features on import');\n }\n features = features && new(tree.Value)(features);\n return new(tree.Import)(path, features, options, index, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed import statement');\n }\n }\n },\n\n importOptions: function() {\n let o;\n const options = {};\n let optionName;\n let value;\n\n // list of options, surrounded by parens\n if (!parserInput.$char('(')) { return null; }\n do {\n o = this.importOption();\n if (o) {\n optionName = o;\n value = true;\n switch (optionName) {\n case 'css':\n optionName = 'less';\n value = false;\n break;\n case 'once':\n optionName = 'multiple';\n value = false;\n break;\n }\n options[optionName] = value;\n if (!parserInput.$char(',')) { break; }\n }\n } while (o);\n expectChar(')');\n return options;\n },\n\n importOption: function() {\n const opt = parserInput.$re(/^(less|css|multiple|once|inline|reference|optional)/);\n if (opt) {\n return opt[1];\n }\n },\n\n mediaFeature: function () {\n const entities = this.entities;\n const nodes = [];\n let e;\n let p;\n parserInput.save();\n do {\n e = entities.keyword() || entities.variable() || entities.mixinLookup();\n if (e) {\n nodes.push(e);\n } else if (parserInput.$char('(')) {\n p = this.property();\n e = this.value();\n if (parserInput.$char(')')) {\n if (p && e) {\n nodes.push(new(tree.Paren)(new(tree.Declaration)(p, e, null, null, parserInput.i, fileInfo, true)));\n } else if (e) {\n nodes.push(new(tree.Paren)(e));\n } else {\n error('badly formed media feature definition');\n }\n } else {\n error('Missing closing \\')\\'', 'Parse');\n }\n }\n } while (e);\n\n parserInput.forget();\n if (nodes.length > 0) {\n return new(tree.Expression)(nodes);\n }\n },\n\n mediaFeatures: function () {\n const entities = this.entities;\n const features = [];\n let e;\n do {\n e = this.mediaFeature();\n if (e) {\n features.push(e);\n if (!parserInput.$char(',')) { break; }\n } else {\n e = entities.variable() || entities.mixinLookup();\n if (e) {\n features.push(e);\n if (!parserInput.$char(',')) { break; }\n }\n }\n } while (e);\n\n return features.length > 0 ? features : null;\n },\n\n media: function () {\n let features;\n let rules;\n let media;\n let debugInfo;\n const index = parserInput.i;\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(index);\n }\n\n parserInput.save();\n\n if (parserInput.$str('@media')) {\n features = this.mediaFeatures();\n\n rules = this.block();\n\n if (!rules) {\n error('media definitions require block statements after any features');\n }\n\n parserInput.forget();\n\n media = new(tree.Media)(rules, features, index, fileInfo);\n if (context.dumpLineNumbers) {\n media.debugInfo = debugInfo;\n }\n\n return media;\n }\n\n parserInput.restore();\n },\n\n //\n\n // A @plugin directive, used to import plugins dynamically.\n //\n // @plugin (args) \"lib\";\n //\n plugin: function () {\n let path;\n let args;\n let options;\n const index = parserInput.i;\n const dir = parserInput.$re(/^@plugin?\\s+/);\n\n if (dir) {\n args = this.pluginArgs();\n\n if (args) {\n options = {\n pluginArgs: args,\n isPlugin: true\n };\n }\n else {\n options = { isPlugin: true };\n }\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon on @plugin');\n }\n return new(tree.Import)(path, null, options, index, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed @plugin statement');\n }\n }\n },\n\n pluginArgs: function() {\n // list of options, surrounded by parens\n parserInput.save();\n if (!parserInput.$char('(')) {\n parserInput.restore();\n return null;\n }\n const args = parserInput.$re(/^\\s*([^\\);]+)\\)\\s*/);\n if (args[1]) {\n parserInput.forget();\n return args[1].trim();\n }\n else { \n parserInput.restore();\n return null;\n }\n },\n\n //\n // A CSS AtRule\n //\n // @charset \"utf-8\";\n //\n atrule: function () {\n const index = parserInput.i;\n let name;\n let value;\n let rules;\n let nonVendorSpecificName;\n let hasIdentifier;\n let hasExpression;\n let hasUnknown;\n let hasBlock = true;\n let isRooted = true;\n\n if (parserInput.currentChar() !== '@') { return; }\n\n value = this['import']() || this.plugin() || this.media();\n if (value) {\n return value;\n }\n\n parserInput.save();\n\n name = parserInput.$re(/^@[a-z-]+/);\n\n if (!name) { return; }\n\n nonVendorSpecificName = name;\n if (name.charAt(1) == '-' && name.indexOf('-', 2) > 0) {\n nonVendorSpecificName = `@${name.slice(name.indexOf('-', 2) + 1)}`;\n }\n\n switch (nonVendorSpecificName) {\n case '@charset':\n hasIdentifier = true;\n hasBlock = false;\n break;\n case '@namespace':\n hasExpression = true;\n hasBlock = false;\n break;\n case '@keyframes':\n case '@counter-style':\n hasIdentifier = true;\n break;\n case '@document':\n case '@supports':\n hasUnknown = true;\n isRooted = false;\n break;\n default:\n hasUnknown = true;\n break;\n }\n\n parserInput.commentStore.length = 0;\n\n if (hasIdentifier) {\n value = this.entity();\n if (!value) {\n error(`expected ${name} identifier`);\n }\n } else if (hasExpression) {\n value = this.expression();\n if (!value) {\n error(`expected ${name} expression`);\n }\n } else if (hasUnknown) {\n value = this.permissiveValue(/^[{;]/);\n hasBlock = (parserInput.currentChar() === '{');\n if (!value) {\n if (!hasBlock && parserInput.currentChar() !== ';') {\n error(`${name} rule is missing block or ending semi-colon`);\n }\n }\n else if (!value.value) {\n value = null;\n }\n }\n\n if (hasBlock) {\n rules = this.blockRuleset();\n }\n\n if (rules || (!hasBlock && value && parserInput.$char(';'))) {\n parserInput.forget();\n return new(tree.AtRule)(name, value, rules, index, fileInfo,\n context.dumpLineNumbers ? getDebugInfo(index) : null,\n isRooted\n );\n }\n\n parserInput.restore('at-rule options not recognised');\n },\n\n //\n // A Value is a comma-delimited list of Expressions\n //\n // font-family: Baskerville, Georgia, serif;\n //\n // In a Rule, a Value represents everything after the `:`,\n // and before the `;`.\n //\n value: function () {\n let e;\n const expressions = [];\n const index = parserInput.i;\n\n do {\n e = this.expression();\n if (e) {\n expressions.push(e);\n if (!parserInput.$char(',')) { break; }\n }\n } while (e);\n\n if (expressions.length > 0) {\n return new(tree.Value)(expressions, index);\n }\n },\n important: function () {\n if (parserInput.currentChar() === '!') {\n return parserInput.$re(/^! *important/);\n }\n },\n sub: function () {\n let a;\n let e;\n\n parserInput.save();\n if (parserInput.$char('(')) {\n a = this.addition();\n if (a && parserInput.$char(')')) {\n parserInput.forget();\n e = new(tree.Expression)([a]);\n e.parens = true;\n return e;\n }\n parserInput.restore('Expected \\')\\'');\n return;\n }\n parserInput.restore();\n },\n multiplication: function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.operand();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1);\n while (true) {\n if (parserInput.peek(/^\\/[*\\/]/)) {\n break;\n }\n\n parserInput.save();\n\n op = parserInput.$char('/') || parserInput.$char('*') || parserInput.$str('./');\n\n if (!op) { parserInput.forget(); break; }\n\n a = this.operand();\n\n if (!a) { parserInput.restore(); break; }\n parserInput.forget();\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n isSpaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n addition: function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.multiplication();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1);\n while (true) {\n op = parserInput.$re(/^[-+]\\s+/) || (!isSpaced && (parserInput.$char('+') || parserInput.$char('-')));\n if (!op) {\n break;\n }\n a = this.multiplication();\n if (!a) {\n break;\n }\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n isSpaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n conditions: function () {\n let a;\n let b;\n const index = parserInput.i;\n let condition;\n\n a = this.condition(true);\n if (a) {\n while (true) {\n if (!parserInput.peek(/^,\\s*(not\\s*)?\\(/) || !parserInput.$char(',')) {\n break;\n }\n b = this.condition(true);\n if (!b) {\n break;\n }\n condition = new(tree.Condition)('or', condition || a, b, index);\n }\n return condition || a;\n }\n },\n condition: function (needsParens) {\n let result;\n let logical;\n let next;\n function or() {\n return parserInput.$str('or');\n }\n\n result = this.conditionAnd(needsParens);\n if (!result) {\n return ;\n }\n logical = or();\n if (logical) {\n next = this.condition(needsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n }\n }\n return result;\n },\n conditionAnd: function (needsParens) {\n let result;\n let logical;\n let next;\n const self = this;\n function insideCondition() {\n const cond = self.negatedCondition(needsParens) || self.parenthesisCondition(needsParens);\n if (!cond && !needsParens) {\n return self.atomicCondition(needsParens);\n }\n return cond;\n }\n function and() {\n return parserInput.$str('and');\n }\n\n result = insideCondition();\n if (!result) {\n return ;\n }\n logical = and();\n if (logical) {\n next = this.conditionAnd(needsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n }\n }\n return result;\n },\n negatedCondition: function (needsParens) {\n if (parserInput.$str('not')) {\n const result = this.parenthesisCondition(needsParens);\n if (result) {\n result.negate = !result.negate;\n }\n return result;\n }\n },\n parenthesisCondition: function (needsParens) {\n function tryConditionFollowedByParenthesis(me) {\n let body;\n parserInput.save();\n body = me.condition(needsParens);\n if (!body) {\n parserInput.restore();\n return ;\n }\n if (!parserInput.$char(')')) {\n parserInput.restore();\n return ;\n }\n parserInput.forget();\n return body;\n }\n\n let body;\n parserInput.save();\n if (!parserInput.$str('(')) {\n parserInput.restore();\n return ;\n }\n body = tryConditionFollowedByParenthesis(this);\n if (body) {\n parserInput.forget();\n return body;\n }\n\n body = this.atomicCondition(needsParens);\n if (!body) {\n parserInput.restore();\n return ;\n }\n if (!parserInput.$char(')')) {\n parserInput.restore(`expected ')' got '${parserInput.currentChar()}'`);\n return ;\n }\n parserInput.forget();\n return body;\n },\n atomicCondition: function (needsParens) {\n const entities = this.entities;\n const index = parserInput.i;\n let a;\n let b;\n let c;\n let op;\n\n function cond() {\n return this.addition() || entities.keyword() || entities.quoted() || entities.mixinLookup();\n }\n cond = cond.bind(this);\n\n a = cond();\n if (a) {\n if (parserInput.$char('>')) {\n if (parserInput.$char('=')) {\n op = '>=';\n } else {\n op = '>';\n }\n } else\n if (parserInput.$char('<')) {\n if (parserInput.$char('=')) {\n op = '<=';\n } else {\n op = '<';\n }\n } else\n if (parserInput.$char('=')) {\n if (parserInput.$char('>')) {\n op = '=>';\n } else if (parserInput.$char('<')) {\n op = '=<';\n } else {\n op = '=';\n }\n }\n if (op) {\n b = cond();\n if (b) {\n c = new(tree.Condition)(op, a, b, index, false);\n } else {\n error('expected expression');\n }\n } else {\n c = new(tree.Condition)('=', a, new(tree.Keyword)('true'), index, false);\n }\n return c;\n }\n },\n\n //\n // An operand is anything that can be part of an operation,\n // such as a Color, or a Variable\n //\n operand: function () {\n const entities = this.entities;\n let negate;\n\n if (parserInput.peek(/^-[@\\$\\(]/)) {\n negate = parserInput.$char('-');\n }\n\n let o = this.sub() || entities.dimension() ||\n entities.color() || entities.variable() ||\n entities.property() || entities.call() ||\n entities.quoted(true) || entities.colorKeyword() ||\n entities.mixinLookup();\n\n if (negate) {\n o.parensInOp = true;\n o = new(tree.Negative)(o);\n }\n\n return o;\n },\n\n //\n // Expressions either represent mathematical operations,\n // or white-space delimited Entities.\n //\n // 1px solid black\n // @var * 2\n //\n expression: function () {\n const entities = [];\n let e;\n let delim;\n const index = parserInput.i;\n\n do {\n e = this.comment();\n if (e) {\n entities.push(e);\n continue;\n }\n e = this.addition() || this.entity();\n\n if (e instanceof tree.Comment) {\n e = null;\n }\n\n if (e) {\n entities.push(e);\n // operations do not allow keyword \"/\" dimension (e.g. small/20px) so we support that here\n if (!parserInput.peek(/^\\/[\\/*]/)) {\n delim = parserInput.$char('/');\n if (delim) {\n entities.push(new(tree.Anonymous)(delim, index));\n }\n }\n }\n } while (e);\n if (entities.length > 0) {\n return new(tree.Expression)(entities);\n }\n },\n property: function () {\n const name = parserInput.$re(/^(\\*?-?[_a-zA-Z0-9-]+)\\s*:/);\n if (name) {\n return name[1];\n }\n },\n ruleProperty: function () {\n let name = [];\n const index = [];\n let s;\n let k;\n\n parserInput.save();\n\n const simpleProperty = parserInput.$re(/^([_a-zA-Z0-9-]+)\\s*:/);\n if (simpleProperty) {\n name = [new(tree.Keyword)(simpleProperty[1])];\n parserInput.forget();\n return name;\n }\n\n function match(re) {\n const i = parserInput.i;\n const chunk = parserInput.$re(re);\n if (chunk) {\n index.push(i);\n return name.push(chunk[1]);\n }\n }\n\n match(/^(\\*?)/);\n while (true) {\n if (!match(/^((?:[\\w-]+)|(?:[@\\$]\\{[\\w-]+\\}))/)) {\n break;\n }\n }\n\n if ((name.length > 1) && match(/^((?:\\+_|\\+)?)\\s*:/)) {\n parserInput.forget();\n\n // at last, we have the complete match now. move forward,\n // convert name particles to tree objects and return:\n if (name[0] === '') {\n name.shift();\n index.shift();\n }\n for (k = 0; k < name.length; k++) {\n s = name[k];\n name[k] = (s.charAt(0) !== '@' && s.charAt(0) !== '$') ?\n new(tree.Keyword)(s) :\n (s.charAt(0) === '@' ?\n new(tree.Variable)(`@${s.slice(2, -1)}`, index[k], fileInfo) :\n new(tree.Property)(`$${s.slice(2, -1)}`, index[k], fileInfo));\n }\n return name;\n }\n parserInput.restore();\n }\n }\n };\n};\nParser.serializeVars = vars => {\n let s = '';\n\n for (const name in vars) {\n if (Object.hasOwnProperty.call(vars, name)) {\n const value = vars[name];\n s += `${((name[0] === '@') ? '' : '@') + name}: ${value}${(String(value).slice(-1) === ';') ? '' : ';'}`;\n }\n }\n\n return s;\n};\n\nexport default Parser;\n","import Anonymous from '../tree/anonymous';\nimport Keyword from '../tree/keyword';\n\nfunction boolean(condition) {\n return condition ? Keyword.True : Keyword.False;\n}\n\n/**\n * Functions with evalArgs set to false are sent context\n * as the first argument.\n */\nfunction If(context, condition, trueValue, falseValue) {\n return condition.eval(context) ? trueValue.eval(context)\n : (falseValue ? falseValue.eval(context) : new Anonymous);\n}\nIf.evalArgs = false\n\nexport default { boolean, 'if': If };\n","import Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport Expression from '../tree/expression';\nimport Operation from '../tree/operation';\nlet colorFunctions;\n\nfunction clamp(val) {\n return Math.min(1, Math.max(0, val));\n}\nfunction hsla(origColor, hsl) {\n const color = colorFunctions.hsla(hsl.h, hsl.s, hsl.l, hsl.a);\n if (color) {\n if (origColor.value && \n /^(rgb|hsl)/.test(origColor.value)) {\n color.value = origColor.value;\n } else {\n color.value = 'rgb';\n }\n return color;\n }\n}\nfunction toHSL(color) {\n if (color.toHSL) {\n return color.toHSL();\n } else {\n throw new Error('Argument cannot be evaluated to a color');\n }\n}\n\nfunction toHSV(color) {\n if (color.toHSV) {\n return color.toHSV();\n } else {\n throw new Error('Argument cannot be evaluated to a color');\n }\n}\n\nfunction number(n) {\n if (n instanceof Dimension) {\n return parseFloat(n.unit.is('%') ? n.value / 100 : n.value);\n } else if (typeof n === 'number') {\n return n;\n } else {\n throw {\n type: 'Argument',\n message: 'color functions take numbers as parameters'\n };\n }\n}\nfunction scaled(n, size) {\n if (n instanceof Dimension && n.unit.is('%')) {\n return parseFloat(n.value * size / 100);\n } else {\n return number(n);\n }\n}\ncolorFunctions = {\n rgb: function (r, g, b) {\n let a = 1\n /**\n * Comma-less syntax\n * e.g. rgb(0 128 255 / 50%)\n */\n if (r instanceof Expression) {\n const val = r.value\n r = val[0]\n g = val[1]\n b = val[2]\n /** \n * @todo - should this be normalized in\n * function caller? Or parsed differently?\n */\n if (b instanceof Operation) {\n const op = b\n b = op.operands[0]\n a = op.operands[1]\n }\n }\n const color = colorFunctions.rgba(r, g, b, a);\n if (color) {\n color.value = 'rgb';\n return color;\n }\n },\n rgba: function (r, g, b, a) {\n try {\n if (r instanceof Color) {\n if (g) {\n a = number(g);\n } else {\n a = r.alpha;\n }\n return new Color(r.rgb, a, 'rgba');\n }\n const rgb = [r, g, b].map(c => scaled(c, 255));\n a = number(a);\n return new Color(rgb, a, 'rgba');\n }\n catch (e) {}\n },\n hsl: function (h, s, l) {\n let a = 1\n if (h instanceof Expression) {\n const val = h.value\n h = val[0]\n s = val[1]\n l = val[2]\n\n if (l instanceof Operation) {\n const op = l\n l = op.operands[0]\n a = op.operands[1]\n }\n }\n const color = colorFunctions.hsla(h, s, l, a);\n if (color) {\n color.value = 'hsl';\n return color;\n }\n },\n hsla: function (h, s, l, a) {\n try {\n if (h instanceof Color) {\n if (s) {\n a = number(s);\n } else {\n a = h.alpha;\n }\n return new Color(h.rgb, a, 'hsla');\n }\n\n let m1;\n let m2;\n\n function hue(h) {\n h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h);\n if (h * 6 < 1) {\n return m1 + (m2 - m1) * h * 6;\n }\n else if (h * 2 < 1) {\n return m2;\n }\n else if (h * 3 < 2) {\n return m1 + (m2 - m1) * (2 / 3 - h) * 6;\n }\n else {\n return m1;\n }\n }\n\n h = (number(h) % 360) / 360;\n s = clamp(number(s));l = clamp(number(l));a = clamp(number(a));\n\n m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n m1 = l * 2 - m2;\n\n const rgb = [\n hue(h + 1 / 3) * 255,\n hue(h) * 255,\n hue(h - 1 / 3) * 255\n ];\n a = number(a);\n return new Color(rgb, a, 'hsla');\n }\n catch (e) {}\n },\n\n hsv: function(h, s, v) {\n return colorFunctions.hsva(h, s, v, 1.0);\n },\n\n hsva: function(h, s, v, a) {\n h = ((number(h) % 360) / 360) * 360;\n s = number(s);v = number(v);a = number(a);\n\n let i;\n let f;\n i = Math.floor((h / 60) % 6);\n f = (h / 60) - i;\n\n const vs = [v,\n v * (1 - s),\n v * (1 - f * s),\n v * (1 - (1 - f) * s)];\n const perm = [[0, 3, 1],\n [2, 0, 1],\n [1, 0, 3],\n [1, 2, 0],\n [3, 1, 0],\n [0, 1, 2]];\n\n return colorFunctions.rgba(vs[perm[i][0]] * 255,\n vs[perm[i][1]] * 255,\n vs[perm[i][2]] * 255,\n a);\n },\n\n hue: function (color) {\n return new Dimension(toHSL(color).h);\n },\n saturation: function (color) {\n return new Dimension(toHSL(color).s * 100, '%');\n },\n lightness: function (color) {\n return new Dimension(toHSL(color).l * 100, '%');\n },\n hsvhue: function(color) {\n return new Dimension(toHSV(color).h);\n },\n hsvsaturation: function (color) {\n return new Dimension(toHSV(color).s * 100, '%');\n },\n hsvvalue: function (color) {\n return new Dimension(toHSV(color).v * 100, '%');\n },\n red: function (color) {\n return new Dimension(color.rgb[0]);\n },\n green: function (color) {\n return new Dimension(color.rgb[1]);\n },\n blue: function (color) {\n return new Dimension(color.rgb[2]);\n },\n alpha: function (color) {\n return new Dimension(toHSL(color).a);\n },\n luma: function (color) {\n return new Dimension(color.luma() * color.alpha * 100, '%');\n },\n luminance: function (color) {\n const luminance =\n (0.2126 * color.rgb[0] / 255) +\n (0.7152 * color.rgb[1] / 255) +\n (0.0722 * color.rgb[2] / 255);\n\n return new Dimension(luminance * color.alpha * 100, '%');\n },\n saturate: function (color, amount, method) {\n // filter: saturate(3.2);\n // should be kept as is, so check for color\n if (!color.rgb) {\n return null;\n }\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.s += hsl.s * amount.value / 100;\n }\n else {\n hsl.s += amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n return hsla(color, hsl);\n },\n desaturate: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.s -= hsl.s * amount.value / 100;\n }\n else {\n hsl.s -= amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n return hsla(color, hsl);\n },\n lighten: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.l += hsl.l * amount.value / 100;\n }\n else {\n hsl.l += amount.value / 100;\n }\n hsl.l = clamp(hsl.l);\n return hsla(color, hsl);\n },\n darken: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.l -= hsl.l * amount.value / 100;\n }\n else {\n hsl.l -= amount.value / 100;\n }\n hsl.l = clamp(hsl.l);\n return hsla(color, hsl);\n },\n fadein: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.a += hsl.a * amount.value / 100;\n }\n else {\n hsl.a += amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fadeout: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.a -= hsl.a * amount.value / 100;\n }\n else {\n hsl.a -= amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fade: function (color, amount) {\n const hsl = toHSL(color);\n\n hsl.a = amount.value / 100;\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n spin: function (color, amount) {\n const hsl = toHSL(color);\n const hue = (hsl.h + amount.value) % 360;\n\n hsl.h = hue < 0 ? 360 + hue : hue;\n\n return hsla(color, hsl);\n },\n //\n // Copyright (c) 2006-2009 Hampton Catlin, Natalie Weizenbaum, and Chris Eppstein\n // http://sass-lang.com\n //\n mix: function (color1, color2, weight) {\n if (!weight) {\n weight = new Dimension(50);\n }\n const p = weight.value / 100.0;\n const w = p * 2 - 1;\n const a = toHSL(color1).a - toHSL(color2).a;\n\n const w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n const w2 = 1 - w1;\n\n const rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2,\n color1.rgb[1] * w1 + color2.rgb[1] * w2,\n color1.rgb[2] * w1 + color2.rgb[2] * w2];\n\n const alpha = color1.alpha * p + color2.alpha * (1 - p);\n\n return new Color(rgb, alpha);\n },\n greyscale: function (color) {\n return colorFunctions.desaturate(color, new Dimension(100));\n },\n contrast: function (color, dark, light, threshold) {\n // filter: contrast(3.2);\n // should be kept as is, so check for color\n if (!color.rgb) {\n return null;\n }\n if (typeof light === 'undefined') {\n light = colorFunctions.rgba(255, 255, 255, 1.0);\n }\n if (typeof dark === 'undefined') {\n dark = colorFunctions.rgba(0, 0, 0, 1.0);\n }\n // Figure out which is actually light and dark:\n if (dark.luma() > light.luma()) {\n const t = light;\n light = dark;\n dark = t;\n }\n if (typeof threshold === 'undefined') {\n threshold = 0.43;\n } else {\n threshold = number(threshold);\n }\n if (color.luma() < threshold) {\n return light;\n } else {\n return dark;\n }\n },\n // Changes made in 2.7.0 - Reverted in 3.0.0\n // contrast: function (color, color1, color2, threshold) {\n // // Return which of `color1` and `color2` has the greatest contrast with `color`\n // // according to the standard WCAG contrast ratio calculation.\n // // http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n // // The threshold param is no longer used, in line with SASS.\n // // filter: contrast(3.2);\n // // should be kept as is, so check for color\n // if (!color.rgb) {\n // return null;\n // }\n // if (typeof color1 === 'undefined') {\n // color1 = colorFunctions.rgba(0, 0, 0, 1.0);\n // }\n // if (typeof color2 === 'undefined') {\n // color2 = colorFunctions.rgba(255, 255, 255, 1.0);\n // }\n // var contrast1, contrast2;\n // var luma = color.luma();\n // var luma1 = color1.luma();\n // var luma2 = color2.luma();\n // // Calculate contrast ratios for each color\n // if (luma > luma1) {\n // contrast1 = (luma + 0.05) / (luma1 + 0.05);\n // } else {\n // contrast1 = (luma1 + 0.05) / (luma + 0.05);\n // }\n // if (luma > luma2) {\n // contrast2 = (luma + 0.05) / (luma2 + 0.05);\n // } else {\n // contrast2 = (luma2 + 0.05) / (luma + 0.05);\n // }\n // if (contrast1 > contrast2) {\n // return color1;\n // } else {\n // return color2;\n // }\n // },\n argb: function (color) {\n return new Anonymous(color.toARGB());\n },\n color: function(c) {\n if ((c instanceof Quoted) &&\n (/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})$/i.test(c.value))) {\n const val = c.value.slice(1);\n return new Color(val, undefined, `#${val}`);\n }\n if ((c instanceof Color) || (c = Color.fromKeyword(c.value))) {\n c.value = undefined;\n return c;\n }\n throw {\n type: 'Argument',\n message: 'argument must be a color keyword or 3|4|6|8 digit hex e.g. #FFF'\n };\n },\n tint: function(color, amount) {\n return colorFunctions.mix(colorFunctions.rgb(255, 255, 255), color, amount);\n },\n shade: function(color, amount) {\n return colorFunctions.mix(colorFunctions.rgb(0, 0, 0), color, amount);\n }\n};\n\nexport default colorFunctions;\n","import Color from '../tree/color';\n\n// Color Blending\n// ref: http://www.w3.org/TR/compositing-1\n\nfunction colorBlend(mode, color1, color2) {\n const ab = color1.alpha; // result\n\n let // backdrop\n cb;\n\n const as = color2.alpha;\n\n let // source\n cs;\n\n let ar;\n let cr;\n const r = [];\n\n ar = as + ab * (1 - as);\n for (let i = 0; i < 3; i++) {\n cb = color1.rgb[i] / 255;\n cs = color2.rgb[i] / 255;\n cr = mode(cb, cs);\n if (ar) {\n cr = (as * cs + ab * (cb -\n as * (cb + cs - cr))) / ar;\n }\n r[i] = cr * 255;\n }\n\n return new Color(r, ar);\n}\n\nconst colorBlendModeFunctions = {\n multiply: function(cb, cs) {\n return cb * cs;\n },\n screen: function(cb, cs) {\n return cb + cs - cb * cs;\n },\n overlay: function(cb, cs) {\n cb *= 2;\n return (cb <= 1) ?\n colorBlendModeFunctions.multiply(cb, cs) :\n colorBlendModeFunctions.screen(cb - 1, cs);\n },\n softlight: function(cb, cs) {\n let d = 1;\n let e = cb;\n if (cs > 0.5) {\n e = 1;\n d = (cb > 0.25) ? Math.sqrt(cb)\n : ((16 * cb - 12) * cb + 4) * cb;\n }\n return cb - (1 - 2 * cs) * e * (d - cb);\n },\n hardlight: function(cb, cs) {\n return colorBlendModeFunctions.overlay(cs, cb);\n },\n difference: function(cb, cs) {\n return Math.abs(cb - cs);\n },\n exclusion: function(cb, cs) {\n return cb + cs - 2 * cb * cs;\n },\n\n // non-w3c functions:\n average: function(cb, cs) {\n return (cb + cs) / 2;\n },\n negation: function(cb, cs) {\n return 1 - Math.abs(cb + cs - 1);\n }\n};\n\nfor (const f in colorBlendModeFunctions) {\n if (colorBlendModeFunctions.hasOwnProperty(f)) {\n colorBlend[f] = colorBlend.bind(null, colorBlendModeFunctions[f]);\n }\n}\n\nexport default colorBlend;\n","import Comment from '../tree/comment';\nimport Node from '../tree/node';\nimport Dimension from '../tree/dimension';\nimport Declaration from '../tree/declaration';\nimport Expression from '../tree/expression';\nimport Ruleset from '../tree/ruleset';\nimport Selector from '../tree/selector';\nimport Element from '../tree/element';\nimport Quote from '../tree/quoted';\nimport Value from '../tree/value';\n\nconst getItemsFromNode = node => {\n // handle non-array values as an array of length 1\n // return 'undefined' if index is invalid\n const items = Array.isArray(node.value) ?\n node.value : Array(node);\n\n return items;\n};\n\nexport default {\n _SELF: function(n) {\n return n;\n },\n '~': function(...expr) {\n if (expr.length === 1) {\n return expr[0];\n }\n return new Value(expr);\n },\n extract: function(values, index) {\n // (1-based index)\n index = index.value - 1;\n\n return getItemsFromNode(values)[index];\n },\n length: function(values) {\n return new Dimension(getItemsFromNode(values).length);\n },\n /**\n * Creates a Less list of incremental values.\n * Modeled after Lodash's range function, also exists natively in PHP\n * \n * @param {Dimension} [start=1]\n * @param {Dimension} end - e.g. 10 or 10px - unit is added to output\n * @param {Dimension} [step=1] \n */\n range: function(start, end, step) {\n let from;\n let to;\n let stepValue = 1;\n const list = [];\n if (end) {\n to = end;\n from = start.value;\n if (step) {\n stepValue = step.value;\n }\n }\n else {\n from = 1;\n to = start;\n }\n\n for (let i = from; i <= to.value; i += stepValue) {\n list.push(new Dimension(i, to.unit));\n }\n\n return new Expression(list);\n },\n each: function(list, rs) {\n const rules = [];\n let newRules;\n let iterator;\n\n const tryEval = val => {\n if (val instanceof Node) {\n return val.eval(this.context);\n }\n return val;\n };\n\n if (list.value && !(list instanceof Quote)) {\n if (Array.isArray(list.value)) {\n iterator = list.value.map(tryEval);\n } else {\n iterator = [tryEval(list.value)];\n }\n } else if (list.ruleset) {\n iterator = tryEval(list.ruleset).rules;\n } else if (list.rules) {\n iterator = list.rules.map(tryEval);\n } else if (Array.isArray(list)) {\n iterator = list.map(tryEval);\n } else {\n iterator = [tryEval(list)];\n }\n\n let valueName = '@value';\n let keyName = '@key';\n let indexName = '@index';\n\n if (rs.params) {\n valueName = rs.params[0] && rs.params[0].name;\n keyName = rs.params[1] && rs.params[1].name;\n indexName = rs.params[2] && rs.params[2].name;\n rs = rs.rules;\n } else {\n rs = rs.ruleset;\n }\n\n for (let i = 0; i < iterator.length; i++) {\n let key;\n let value;\n const item = iterator[i];\n if (item instanceof Declaration) {\n key = typeof item.name === 'string' ? item.name : item.name[0].value;\n value = item.value;\n } else {\n key = new Dimension(i + 1);\n value = item;\n }\n\n if (item instanceof Comment) {\n continue;\n }\n\n newRules = rs.rules.slice(0);\n if (valueName) {\n newRules.push(new Declaration(valueName,\n value,\n false, false, this.index, this.currentFileInfo));\n }\n if (indexName) {\n newRules.push(new Declaration(indexName,\n new Dimension(i + 1),\n false, false, this.index, this.currentFileInfo));\n }\n if (keyName) {\n newRules.push(new Declaration(keyName,\n key,\n false, false, this.index, this.currentFileInfo));\n }\n\n rules.push(new Ruleset([ new(Selector)([ new Element(\"\", '&') ]) ],\n newRules,\n rs.strictImports,\n rs.visibilityInfo()\n ));\n }\n\n return new Ruleset([ new(Selector)([ new Element(\"\", '&') ]) ],\n rules,\n rs.strictImports,\n rs.visibilityInfo()\n ).eval(this.context);\n }\n};\n","import Dimension from '../tree/dimension';\n\nconst MathHelper = (fn, unit, n) => {\n if (!(n instanceof Dimension)) {\n throw { type: 'Argument', message: 'argument must be a number' };\n }\n if (unit == null) {\n unit = n.unit;\n } else {\n n = n.unify();\n }\n return new Dimension(fn(parseFloat(n.value)), unit);\n};\n\nexport default MathHelper;","import mathHelper from './math-helper.js';\n\nconst mathFunctions = {\n // name, unit\n ceil: null,\n floor: null,\n sqrt: null,\n abs: null,\n tan: '',\n sin: '',\n cos: '',\n atan: 'rad',\n asin: 'rad',\n acos: 'rad'\n};\n\nfor (const f in mathFunctions) {\n if (mathFunctions.hasOwnProperty(f)) {\n mathFunctions[f] = mathHelper.bind(null, Math[f], mathFunctions[f]);\n }\n}\n\nmathFunctions.round = (n, f) => {\n const fraction = typeof f === 'undefined' ? 0 : f.value;\n return mathHelper(num => num.toFixed(fraction), null, n);\n};\n\nexport default mathFunctions;\n","import Dimension from '../tree/dimension';\nimport Anonymous from '../tree/anonymous';\nimport mathHelper from './math-helper.js';\n\nconst minMax = function (isMin, args) {\n args = Array.prototype.slice.call(args);\n switch (args.length) {\n case 0: throw { type: 'Argument', message: 'one or more arguments required' };\n }\n let i; // key is the unit.toString() for unified Dimension values,\n let j;\n let current;\n let currentUnified;\n let referenceUnified;\n let unit;\n let unitStatic;\n let unitClone;\n\n const // elems only contains original argument values.\n order = [];\n\n const values = {};\n // value is the index into the order array.\n for (i = 0; i < args.length; i++) {\n current = args[i];\n if (!(current instanceof Dimension)) {\n if (Array.isArray(args[i].value)) {\n Array.prototype.push.apply(args, Array.prototype.slice.call(args[i].value));\n }\n continue;\n }\n currentUnified = current.unit.toString() === '' && unitClone !== undefined ? new Dimension(current.value, unitClone).unify() : current.unify();\n unit = currentUnified.unit.toString() === '' && unitStatic !== undefined ? unitStatic : currentUnified.unit.toString();\n unitStatic = unit !== '' && unitStatic === undefined || unit !== '' && order[0].unify().unit.toString() === '' ? unit : unitStatic;\n unitClone = unit !== '' && unitClone === undefined ? current.unit.toString() : unitClone;\n j = values[''] !== undefined && unit !== '' && unit === unitStatic ? values[''] : values[unit];\n if (j === undefined) {\n if (unitStatic !== undefined && unit !== unitStatic) {\n throw { type: 'Argument', message: 'incompatible types' };\n }\n values[unit] = order.length;\n order.push(current);\n continue;\n }\n referenceUnified = order[j].unit.toString() === '' && unitClone !== undefined ? new Dimension(order[j].value, unitClone).unify() : order[j].unify();\n if ( isMin && currentUnified.value < referenceUnified.value ||\n !isMin && currentUnified.value > referenceUnified.value) {\n order[j] = current;\n }\n }\n if (order.length == 1) {\n return order[0];\n }\n args = order.map(function (a) { return a.toCSS(this.context); }).join(this.context.compress ? ',' : ', ');\n return new Anonymous(`${isMin ? 'min' : 'max'}(${args})`);\n};\n\nexport default {\n min: function(...args) {\n try {\n return minMax(true, args);\n } catch (e) {}\n },\n max: function(...args) {\n try {\n return minMax(false, args);\n } catch (e) {}\n },\n convert: function (val, unit) {\n return val.convertTo(unit.value);\n },\n pi: function () {\n return new Dimension(Math.PI);\n },\n mod: function(a, b) {\n return new Dimension(a.value % b.value, a.unit);\n },\n pow: function(x, y) {\n if (typeof x === 'number' && typeof y === 'number') {\n x = new Dimension(x);\n y = new Dimension(y);\n } else if (!(x instanceof Dimension) || !(y instanceof Dimension)) {\n throw { type: 'Argument', message: 'arguments must be numbers' };\n }\n\n return new Dimension(Math.pow(x.value, y.value), x.unit);\n },\n percentage: function (n) {\n const result = mathHelper(num => num * 100, '%', n);\n\n return result;\n }\n};\n","import Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport JavaScript from '../tree/javascript';\n\nexport default {\n e: function (str) {\n return new Quoted('\"', str instanceof JavaScript ? str.evaluated : str.value, true);\n },\n escape: function (str) {\n return new Anonymous(\n encodeURI(str.value).replace(/=/g, '%3D').replace(/:/g, '%3A').replace(/#/g, '%23').replace(/;/g, '%3B')\n .replace(/\\(/g, '%28').replace(/\\)/g, '%29'));\n },\n replace: function (string, pattern, replacement, flags) {\n let result = string.value;\n replacement = (replacement.type === 'Quoted') ?\n replacement.value : replacement.toCSS();\n result = result.replace(new RegExp(pattern.value, flags ? flags.value : ''), replacement);\n return new Quoted(string.quote || '', result, string.escaped);\n },\n '%': function (string /* arg, arg, ... */) {\n const args = Array.prototype.slice.call(arguments, 1);\n let result = string.value;\n\n for (let i = 0; i < args.length; i++) {\n /* jshint loopfunc:true */\n result = result.replace(/%[sda]/i, token => {\n const value = ((args[i].type === 'Quoted') &&\n token.match(/s/i)) ? args[i].value : args[i].toCSS();\n return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value;\n });\n }\n result = result.replace(/%%/g, '%');\n return new Quoted(string.quote || '', result, string.escaped);\n }\n};\n","import Keyword from '../tree/keyword';\nimport DetachedRuleset from '../tree/detached-ruleset';\nimport Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport URL from '../tree/url';\nimport Operation from '../tree/operation';\n\nconst isa = (n, Type) => (n instanceof Type) ? Keyword.True : Keyword.False;\nconst isunit = (n, unit) => {\n if (unit === undefined) {\n throw { type: 'Argument', message: 'missing the required second argument to isunit.' };\n }\n unit = typeof unit.value === 'string' ? unit.value : unit;\n if (typeof unit !== 'string') {\n throw { type: 'Argument', message: 'Second argument to isunit should be a unit or a string.' };\n }\n return (n instanceof Dimension) && n.unit.is(unit) ? Keyword.True : Keyword.False;\n};\n\nexport default {\n isruleset: function (n) {\n return isa(n, DetachedRuleset);\n },\n iscolor: function (n) {\n return isa(n, Color);\n },\n isnumber: function (n) {\n return isa(n, Dimension);\n },\n isstring: function (n) {\n return isa(n, Quoted);\n },\n iskeyword: function (n) {\n return isa(n, Keyword);\n },\n isurl: function (n) {\n return isa(n, URL);\n },\n ispixel: function (n) {\n return isunit(n, 'px');\n },\n ispercentage: function (n) {\n return isunit(n, '%');\n },\n isem: function (n) {\n return isunit(n, 'em');\n },\n isunit,\n unit: function (val, unit) {\n if (!(val instanceof Dimension)) {\n throw { type: 'Argument',\n message: `the first argument to unit must be a number${val instanceof Operation ? '. Have you forgotten parenthesis?' : ''}` };\n }\n if (unit) {\n if (unit instanceof Keyword) {\n unit = unit.value;\n } else {\n unit = unit.toCSS();\n }\n } else {\n unit = '';\n }\n return new Dimension(val.value, unit);\n },\n 'get-unit': function (n) {\n return new Anonymous(n.unit);\n }\n};\n","import functionRegistry from './function-registry';\nimport functionCaller from './function-caller';\n\nimport boolean from './boolean';\nimport defaultFunc from './default';\nimport color from './color';\nimport colorBlending from './color-blending';\nimport dataUri from './data-uri';\nimport list from './list';\nimport math from './math';\nimport number from './number';\nimport string from './string';\nimport svg from './svg';\nimport types from './types';\n\nexport default environment => {\n const functions = { functionRegistry, functionCaller };\n\n // register functions\n functionRegistry.addMultiple(boolean);\n functionRegistry.add('default', defaultFunc.eval.bind(defaultFunc));\n functionRegistry.addMultiple(color);\n functionRegistry.addMultiple(colorBlending);\n functionRegistry.addMultiple(dataUri(environment));\n functionRegistry.addMultiple(list);\n functionRegistry.addMultiple(math);\n functionRegistry.addMultiple(number);\n functionRegistry.addMultiple(string);\n functionRegistry.addMultiple(svg(environment));\n functionRegistry.addMultiple(types);\n\n return functions;\n};\n","import Quoted from '../tree/quoted';\nimport URL from '../tree/url';\nimport * as utils from '../utils';\nimport logger from '../logger';\n\nexport default environment => {\n \n const fallback = (functionThis, node) => new URL(node, functionThis.index, functionThis.currentFileInfo).eval(functionThis.context); \n\n return { 'data-uri': function(mimetypeNode, filePathNode) {\n\n if (!filePathNode) {\n filePathNode = mimetypeNode;\n mimetypeNode = null;\n }\n\n let mimetype = mimetypeNode && mimetypeNode.value;\n let filePath = filePathNode.value;\n const currentFileInfo = this.currentFileInfo;\n const currentDirectory = currentFileInfo.rewriteUrls ?\n currentFileInfo.currentDirectory : currentFileInfo.entryPath;\n\n const fragmentStart = filePath.indexOf('#');\n let fragment = '';\n if (fragmentStart !== -1) {\n fragment = filePath.slice(fragmentStart);\n filePath = filePath.slice(0, fragmentStart);\n }\n const context = utils.clone(this.context);\n context.rawBuffer = true;\n\n const fileManager = environment.getFileManager(filePath, currentDirectory, context, environment, true);\n\n if (!fileManager) {\n return fallback(this, filePathNode);\n }\n\n let useBase64 = false;\n\n // detect the mimetype if not given\n if (!mimetypeNode) {\n\n mimetype = environment.mimeLookup(filePath);\n\n if (mimetype === 'image/svg+xml') {\n useBase64 = false;\n } else {\n // use base 64 unless it's an ASCII or UTF-8 format\n const charset = environment.charsetLookup(mimetype);\n useBase64 = ['US-ASCII', 'UTF-8'].indexOf(charset) < 0;\n }\n if (useBase64) { mimetype += ';base64'; }\n }\n else {\n useBase64 = /;base64$/.test(mimetype);\n }\n\n const fileSync = fileManager.loadFileSync(filePath, currentDirectory, context, environment);\n if (!fileSync.contents) {\n logger.warn(`Skipped data-uri embedding of ${filePath} because file not found`);\n return fallback(this, filePathNode || mimetypeNode);\n }\n let buf = fileSync.contents;\n if (useBase64 && !environment.encodeBase64) {\n return fallback(this, filePathNode);\n }\n\n buf = useBase64 ? environment.encodeBase64(buf) : encodeURIComponent(buf);\n\n const uri = `data:${mimetype},${buf}${fragment}`;\n\n return new URL(new Quoted(`\"${uri}\"`, uri, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n }};\n};\n","import Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Expression from '../tree/expression';\nimport Quoted from '../tree/quoted';\nimport URL from '../tree/url';\n\nexport default environment => {\n return { 'svg-gradient': function(direction) {\n let stops;\n let gradientDirectionSvg;\n let gradientType = 'linear';\n let rectangleDimension = 'x=\"0\" y=\"0\" width=\"1\" height=\"1\"';\n const renderEnv = {compress: false};\n let returner;\n const directionValue = direction.toCSS(renderEnv);\n let i;\n let color;\n let position;\n let positionValue;\n let alpha;\n\n function throwArgumentDescriptor() {\n throw { type: 'Argument',\n message: 'svg-gradient expects direction, start_color [start_position], [color position,]...,' +\n ' end_color [end_position] or direction, color list' };\n }\n\n if (arguments.length == 2) {\n if (arguments[1].value.length < 2) {\n throwArgumentDescriptor();\n }\n stops = arguments[1].value;\n } else if (arguments.length < 3) {\n throwArgumentDescriptor();\n } else {\n stops = Array.prototype.slice.call(arguments, 1);\n }\n\n switch (directionValue) {\n case 'to bottom':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\"';\n break;\n case 'to right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'to bottom right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\"';\n break;\n case 'to top right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"100%\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'ellipse':\n case 'ellipse at center':\n gradientType = 'radial';\n gradientDirectionSvg = 'cx=\"50%\" cy=\"50%\" r=\"75%\"';\n rectangleDimension = 'x=\"-50\" y=\"-50\" width=\"101\" height=\"101\"';\n break;\n default:\n throw { type: 'Argument', message: 'svg-gradient direction must be \\'to bottom\\', \\'to right\\',' +\n ' \\'to bottom right\\', \\'to top right\\' or \\'ellipse at center\\'' };\n }\n returner = `<${gradientType}Gradient id=\"g\" ${gradientDirectionSvg}>`;\n\n for (i = 0; i < stops.length; i += 1) {\n if (stops[i] instanceof Expression) {\n color = stops[i].value[0];\n position = stops[i].value[1];\n } else {\n color = stops[i];\n position = undefined;\n }\n\n if (!(color instanceof Color) || (!((i === 0 || i + 1 === stops.length) && position === undefined) && !(position instanceof Dimension))) {\n throwArgumentDescriptor();\n }\n positionValue = position ? position.toCSS(renderEnv) : i === 0 ? '0%' : '100%';\n alpha = color.alpha;\n returner += ``;\n }\n returner += ``;\n\n returner = encodeURIComponent(returner);\n\n returner = `data:image/svg+xml,${returner}`;\n return new URL(new Quoted(`'${returner}'`, returner, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n }};\n};\n","import contexts from './contexts';\nimport visitor from './visitors';\nimport tree from './tree';\n\nexport default function(root, options) {\n options = options || {};\n let evaldRoot;\n let variables = options.variables;\n const evalEnv = new contexts.Eval(options);\n\n //\n // Allows setting variables with a hash, so:\n //\n // `{ color: new tree.Color('#f01') }` will become:\n //\n // new tree.Declaration('@color',\n // new tree.Value([\n // new tree.Expression([\n // new tree.Color('#f01')\n // ])\n // ])\n // )\n //\n if (typeof variables === 'object' && !Array.isArray(variables)) {\n variables = Object.keys(variables).map(function (k) {\n let value = variables[k];\n\n if (!(value instanceof tree.Value)) {\n if (!(value instanceof tree.Expression)) {\n value = new tree.Expression([value]);\n }\n value = new tree.Value([value]);\n }\n return new tree.Declaration(`@${k}`, value, false, null, 0);\n });\n evalEnv.frames = [new tree.Ruleset(null, variables)];\n }\n\n const visitors = [\n new visitor.JoinSelectorVisitor(),\n new visitor.MarkVisibleSelectorsVisitor(true),\n new visitor.ExtendVisitor(),\n new visitor.ToCSSVisitor({compress: Boolean(options.compress)})\n ];\n\n const preEvalVisitors = [];\n let v;\n let visitorIterator;\n\n /**\n * first() / get() allows visitors to be added while visiting\n * \n * @todo Add scoping for visitors just like functions for @plugin; right now they're global\n */\n if (options.pluginManager) {\n visitorIterator = options.pluginManager.visitor();\n for (var i = 0; i < 2; i++) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (v.isPreEvalVisitor) {\n if (i === 0 || preEvalVisitors.indexOf(v) === -1) {\n preEvalVisitors.push(v);\n v.run(root);\n }\n }\n else {\n if (i === 0 || visitors.indexOf(v) === -1) {\n if (v.isPreVisitor) {\n visitors.unshift(v);\n }\n else {\n visitors.push(v);\n }\n }\n }\n }\n }\n }\n\n evaldRoot = root.eval(evalEnv);\n\n for (var i = 0; i < visitors.length; i++) {\n visitors[i].run(evaldRoot);\n }\n\n // Run any remaining visitors added after eval pass\n if (options.pluginManager) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (visitors.indexOf(v) === -1 && preEvalVisitors.indexOf(v) === -1) {\n v.run(evaldRoot);\n }\n }\n }\n\n return evaldRoot;\n};\n","/**\n * Plugin Manager\n */\nclass PluginManager {\n constructor(less) {\n this.less = less;\n this.visitors = [];\n this.preProcessors = [];\n this.postProcessors = [];\n this.installedPlugins = [];\n this.fileManagers = [];\n this.iterator = -1;\n this.pluginCache = {};\n this.Loader = new less.PluginLoader(less);\n }\n\n /**\n * Adds all the plugins in the array\n * @param {Array} plugins\n */\n addPlugins(plugins) {\n if (plugins) {\n for (let i = 0; i < plugins.length; i++) {\n this.addPlugin(plugins[i]);\n }\n }\n }\n\n /**\n *\n * @param plugin\n * @param {String} filename\n */\n addPlugin(plugin, filename, functionRegistry) {\n this.installedPlugins.push(plugin);\n if (filename) {\n this.pluginCache[filename] = plugin;\n }\n if (plugin.install) {\n plugin.install(this.less, this, functionRegistry || this.less.functions.functionRegistry);\n }\n }\n\n /**\n *\n * @param filename\n */\n get(filename) {\n return this.pluginCache[filename];\n }\n\n /**\n * Adds a visitor. The visitor object has options on itself to determine\n * when it should run.\n * @param visitor\n */\n addVisitor(visitor) {\n this.visitors.push(visitor);\n }\n\n /**\n * Adds a pre processor object\n * @param {object} preProcessor\n * @param {number} priority - guidelines 1 = before import, 1000 = import, 2000 = after import\n */\n addPreProcessor(preProcessor, priority) {\n let indexToInsertAt;\n for (indexToInsertAt = 0; indexToInsertAt < this.preProcessors.length; indexToInsertAt++) {\n if (this.preProcessors[indexToInsertAt].priority >= priority) {\n break;\n }\n }\n this.preProcessors.splice(indexToInsertAt, 0, {preProcessor, priority});\n }\n\n /**\n * Adds a post processor object\n * @param {object} postProcessor\n * @param {number} priority - guidelines 1 = before compression, 1000 = compression, 2000 = after compression\n */\n addPostProcessor(postProcessor, priority) {\n let indexToInsertAt;\n for (indexToInsertAt = 0; indexToInsertAt < this.postProcessors.length; indexToInsertAt++) {\n if (this.postProcessors[indexToInsertAt].priority >= priority) {\n break;\n }\n }\n this.postProcessors.splice(indexToInsertAt, 0, {postProcessor, priority});\n }\n\n /**\n *\n * @param manager\n */\n addFileManager(manager) {\n this.fileManagers.push(manager);\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getPreProcessors() {\n const preProcessors = [];\n for (let i = 0; i < this.preProcessors.length; i++) {\n preProcessors.push(this.preProcessors[i].preProcessor);\n }\n return preProcessors;\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getPostProcessors() {\n const postProcessors = [];\n for (let i = 0; i < this.postProcessors.length; i++) {\n postProcessors.push(this.postProcessors[i].postProcessor);\n }\n return postProcessors;\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getVisitors() {\n return this.visitors;\n }\n\n visitor() {\n const self = this;\n return {\n first: function() {\n self.iterator = -1;\n return self.visitors[self.iterator];\n },\n get: function() {\n self.iterator += 1;\n return self.visitors[self.iterator];\n }\n };\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getFileManagers() {\n return this.fileManagers;\n }\n}\n\nlet pm;\n\nconst PluginManagerFactory = function(less, newFactory) {\n if (newFactory || !pm) {\n pm = new PluginManager(less);\n }\n return pm;\n};\n\n//\nexport default PluginManagerFactory;\n","/* global window, XMLHttpRequest */\n\nimport AbstractFileManager from '../less/environment/abstract-file-manager.js';\n\nlet options;\nlet logger;\nlet fileCache = {};\n\n// TODOS - move log somewhere. pathDiff and doing something similar in node. use pathDiff in the other browser file for the initial load\nclass FileManager extends AbstractFileManager {\n alwaysMakePathsAbsolute() {\n return true;\n }\n\n join(basePath, laterPath) {\n if (!basePath) {\n return laterPath;\n }\n return this.extractUrlParts(laterPath, basePath).path;\n }\n\n doXHR(url, type, callback, errback) {\n const xhr = new XMLHttpRequest();\n const async = options.isFileProtocol ? options.fileAsync : true;\n\n if (typeof xhr.overrideMimeType === 'function') {\n xhr.overrideMimeType('text/css');\n }\n logger.debug(`XHR: Getting '${url}'`);\n xhr.open('GET', url, async);\n xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5');\n xhr.send(null);\n\n function handleResponse(xhr, callback, errback) {\n if (xhr.status >= 200 && xhr.status < 300) {\n callback(xhr.responseText,\n xhr.getResponseHeader('Last-Modified'));\n } else if (typeof errback === 'function') {\n errback(xhr.status, url);\n }\n }\n\n if (options.isFileProtocol && !options.fileAsync) {\n if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) {\n callback(xhr.responseText);\n } else {\n errback(xhr.status, url);\n }\n } else if (async) {\n xhr.onreadystatechange = () => {\n if (xhr.readyState == 4) {\n handleResponse(xhr, callback, errback);\n }\n };\n } else {\n handleResponse(xhr, callback, errback);\n }\n }\n\n supports() {\n return true;\n }\n\n clearFileCache() {\n fileCache = {};\n }\n\n loadFile(filename, currentDirectory, options, environment) {\n // TODO: Add prefix support like less-node?\n // What about multiple paths?\n\n if (currentDirectory && !this.isPathAbsolute(filename)) {\n filename = currentDirectory + filename;\n }\n\n filename = options.ext ? this.tryAppendExtension(filename, options.ext) : filename;\n\n options = options || {};\n\n // sheet may be set to the stylesheet for the initial load or a collection of properties including\n // some context variables for imports\n const hrefParts = this.extractUrlParts(filename, window.location.href);\n const href = hrefParts.url;\n const self = this;\n \n return new Promise((resolve, reject) => {\n if (options.useFileCache && fileCache[href]) {\n try {\n const lessText = fileCache[href];\n return resolve({ contents: lessText, filename: href, webInfo: { lastModified: new Date() }});\n } catch (e) {\n return reject({ filename: href, message: `Error loading file ${href} error was ${e.message}` });\n }\n }\n\n self.doXHR(href, options.mime, function doXHRCallback(data, lastModified) {\n // per file cache\n fileCache[href] = data;\n\n // Use remote copy (re-parse)\n resolve({ contents: data, filename: href, webInfo: { lastModified }});\n }, function doXHRError(status, url) {\n reject({ type: 'File', message: `'${url}' wasn't found (${status})`, href });\n });\n });\n }\n}\n\nexport default (opts, log) => {\n options = opts;\n logger = log;\n return FileManager;\n}\n","import Environment from './environment/environment';\nimport data from './data';\nimport tree from './tree';\nimport AbstractFileManager from './environment/abstract-file-manager';\nimport AbstractPluginLoader from './environment/abstract-plugin-loader';\nimport visitors from './visitors';\nimport Parser from './parser/parser';\nimport functions from './functions';\nimport contexts from './contexts';\nimport LessError from './less-error';\nimport transformTree from './transform-tree';\nimport * as utils from './utils';\nimport PluginManager from './plugin-manager';\nimport logger from './logger';\nimport SourceMapOutput from './source-map-output';\nimport SourceMapBuilder from './source-map-builder';\nimport ParseTree from './parse-tree';\nimport ImportManager from './import-manager';\nimport Parse from './parse';\nimport Render from './render';\n\nexport default function(environment, fileManagers) {\n let sourceMapOutput, sourceMapBuilder, parseTree, importManager;\n\n environment = new Environment(environment, fileManagers);\n sourceMapOutput = SourceMapOutput(environment);\n sourceMapBuilder = SourceMapBuilder(sourceMapOutput, environment);\n parseTree = ParseTree(sourceMapBuilder);\n importManager = ImportManager(environment);\n\n const render = Render(environment, parseTree, importManager);\n const parse = Parse(environment, parseTree, importManager);\n\n const initial = {\n version: [4, 0, 0],\n data,\n tree,\n Environment,\n AbstractFileManager,\n AbstractPluginLoader,\n environment,\n visitors,\n Parser,\n functions: functions(environment),\n contexts,\n SourceMapOutput: sourceMapOutput,\n SourceMapBuilder: sourceMapBuilder,\n ParseTree: parseTree,\n ImportManager: importManager,\n render,\n parse,\n LessError,\n transformTree,\n utils,\n PluginManager,\n logger\n };\n\n // Create a public API\n\n const ctor = function(t) {\n return function() {\n const obj = Object.create(t.prototype);\n t.apply(obj, Array.prototype.slice.call(arguments, 0));\n return obj;\n };\n };\n let t;\n const api = Object.create(initial);\n for (const n in initial.tree) {\n /* eslint guard-for-in: 0 */\n t = initial.tree[n];\n if (typeof t === 'function') {\n api[n.toLowerCase()] = ctor(t);\n }\n else {\n api[n] = Object.create(null);\n for (const o in t) {\n /* eslint guard-for-in: 0 */\n api[n][o.toLowerCase()] = ctor(t[o]);\n }\n }\n }\n\n /**\n * Some of the functions assume a `this` context of the API object,\n * which causes it to fail when wrapped for ES6 imports.\n * \n * An assumed `this` should be removed in the future.\n */\n initial.parse = initial.parse.bind(api);\n initial.render = initial.render.bind(api);\n\n return api;\n};\n","import LessError from './less-error';\nimport transformTree from './transform-tree';\nimport logger from './logger';\n\nexport default function(SourceMapBuilder) {\n class ParseTree {\n constructor(root, imports) {\n this.root = root;\n this.imports = imports;\n }\n\n toCSS(options) {\n let evaldRoot;\n const result = {};\n let sourceMapBuilder;\n try {\n evaldRoot = transformTree(this.root, options);\n } catch (e) {\n throw new LessError(e, this.imports);\n }\n\n try {\n const compress = Boolean(options.compress);\n if (compress) {\n logger.warn('The compress option has been deprecated. ' + \n 'We recommend you use a dedicated css minifier, for instance see less-plugin-clean-css.');\n }\n\n const toCSSOptions = {\n compress,\n dumpLineNumbers: options.dumpLineNumbers,\n strictUnits: Boolean(options.strictUnits),\n numPrecision: 8};\n\n if (options.sourceMap) {\n sourceMapBuilder = new SourceMapBuilder(options.sourceMap);\n result.css = sourceMapBuilder.toCSS(evaldRoot, toCSSOptions, this.imports);\n } else {\n result.css = evaldRoot.toCSS(toCSSOptions);\n }\n } catch (e) {\n throw new LessError(e, this.imports);\n }\n\n if (options.pluginManager) {\n const postProcessors = options.pluginManager.getPostProcessors();\n for (let i = 0; i < postProcessors.length; i++) {\n result.css = postProcessors[i].process(result.css, { sourceMap: sourceMapBuilder, options, imports: this.imports });\n }\n }\n if (options.sourceMap) {\n result.map = sourceMapBuilder.getExternalSourceMap();\n }\n\n result.imports = [];\n for (const file in this.imports.files) {\n if (this.imports.files.hasOwnProperty(file) && file !== this.imports.rootFilename) {\n result.imports.push(file);\n }\n }\n return result;\n }\n }\n\n return ParseTree;\n};\n","export default function (SourceMapOutput, environment) {\n class SourceMapBuilder {\n constructor(options) {\n this.options = options;\n }\n\n toCSS(rootNode, options, imports) {\n const sourceMapOutput = new SourceMapOutput(\n {\n contentsIgnoredCharsMap: imports.contentsIgnoredChars,\n rootNode,\n contentsMap: imports.contents,\n sourceMapFilename: this.options.sourceMapFilename,\n sourceMapURL: this.options.sourceMapURL,\n outputFilename: this.options.sourceMapOutputFilename,\n sourceMapBasepath: this.options.sourceMapBasepath,\n sourceMapRootpath: this.options.sourceMapRootpath,\n outputSourceFiles: this.options.outputSourceFiles,\n sourceMapGenerator: this.options.sourceMapGenerator,\n sourceMapFileInline: this.options.sourceMapFileInline, \n disableSourcemapAnnotation: this.options.disableSourcemapAnnotation\n });\n\n const css = sourceMapOutput.toCSS(options);\n this.sourceMap = sourceMapOutput.sourceMap;\n this.sourceMapURL = sourceMapOutput.sourceMapURL;\n if (this.options.sourceMapInputFilename) {\n this.sourceMapInputFilename = sourceMapOutput.normalizeFilename(this.options.sourceMapInputFilename);\n }\n if (this.options.sourceMapBasepath !== undefined && this.sourceMapURL !== undefined) {\n this.sourceMapURL = sourceMapOutput.removeBasepath(this.sourceMapURL);\n }\n return css + this.getCSSAppendage();\n }\n\n getCSSAppendage() {\n\n let sourceMapURL = this.sourceMapURL;\n if (this.options.sourceMapFileInline) {\n if (this.sourceMap === undefined) {\n return '';\n }\n sourceMapURL = `data:application/json;base64,${environment.encodeBase64(this.sourceMap)}`;\n }\n\n if (this.options.disableSourcemapAnnotation) {\n return '';\n }\n\n if (sourceMapURL) {\n return `/*# sourceMappingURL=${sourceMapURL} */`;\n }\n return '';\n }\n\n getExternalSourceMap() {\n return this.sourceMap;\n }\n\n setExternalSourceMap(sourceMap) {\n this.sourceMap = sourceMap;\n }\n\n isInline() {\n return this.options.sourceMapFileInline;\n }\n\n getSourceMapURL() {\n return this.sourceMapURL;\n }\n\n getOutputFilename() {\n return this.options.sourceMapOutputFilename;\n }\n\n getInputFilename() {\n return this.sourceMapInputFilename;\n }\n }\n\n return SourceMapBuilder;\n};\n","export default function (environment) {\n class SourceMapOutput {\n constructor(options) {\n this._css = [];\n this._rootNode = options.rootNode;\n this._contentsMap = options.contentsMap;\n this._contentsIgnoredCharsMap = options.contentsIgnoredCharsMap;\n if (options.sourceMapFilename) {\n this._sourceMapFilename = options.sourceMapFilename.replace(/\\\\/g, '/');\n }\n this._outputFilename = options.outputFilename;\n this.sourceMapURL = options.sourceMapURL;\n if (options.sourceMapBasepath) {\n this._sourceMapBasepath = options.sourceMapBasepath.replace(/\\\\/g, '/');\n }\n if (options.sourceMapRootpath) {\n this._sourceMapRootpath = options.sourceMapRootpath.replace(/\\\\/g, '/');\n if (this._sourceMapRootpath.charAt(this._sourceMapRootpath.length - 1) !== '/') {\n this._sourceMapRootpath += '/';\n }\n } else {\n this._sourceMapRootpath = '';\n }\n this._outputSourceFiles = options.outputSourceFiles;\n this._sourceMapGeneratorConstructor = environment.getSourceMapGenerator();\n\n this._lineNumber = 0;\n this._column = 0;\n }\n\n removeBasepath(path) {\n if (this._sourceMapBasepath && path.indexOf(this._sourceMapBasepath) === 0) {\n path = path.substring(this._sourceMapBasepath.length);\n if (path.charAt(0) === '\\\\' || path.charAt(0) === '/') {\n path = path.substring(1);\n }\n }\n\n return path;\n }\n\n normalizeFilename(filename) {\n filename = filename.replace(/\\\\/g, '/');\n filename = this.removeBasepath(filename);\n return (this._sourceMapRootpath || '') + filename;\n }\n\n add(chunk, fileInfo, index, mapLines) {\n\n // ignore adding empty strings\n if (!chunk) {\n return;\n }\n\n let lines, sourceLines, columns, sourceColumns, i;\n\n if (fileInfo && fileInfo.filename) {\n let inputSource = this._contentsMap[fileInfo.filename];\n\n // remove vars/banner added to the top of the file\n if (this._contentsIgnoredCharsMap[fileInfo.filename]) {\n // adjust the index\n index -= this._contentsIgnoredCharsMap[fileInfo.filename];\n if (index < 0) { index = 0; }\n // adjust the source\n inputSource = inputSource.slice(this._contentsIgnoredCharsMap[fileInfo.filename]);\n }\n\n // ignore empty content\n if (inputSource === undefined) {\n return;\n }\n\n inputSource = inputSource.substring(0, index);\n sourceLines = inputSource.split('\\n');\n sourceColumns = sourceLines[sourceLines.length - 1];\n }\n\n lines = chunk.split('\\n');\n columns = lines[lines.length - 1];\n\n if (fileInfo && fileInfo.filename) {\n if (!mapLines) {\n this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + 1, column: this._column},\n original: { line: sourceLines.length, column: sourceColumns.length},\n source: this.normalizeFilename(fileInfo.filename)});\n } else {\n for (i = 0; i < lines.length; i++) {\n this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + i + 1, column: i === 0 ? this._column : 0},\n original: { line: sourceLines.length + i, column: i === 0 ? sourceColumns.length : 0},\n source: this.normalizeFilename(fileInfo.filename)});\n }\n }\n }\n\n if (lines.length === 1) {\n this._column += columns.length;\n } else {\n this._lineNumber += lines.length - 1;\n this._column = columns.length;\n }\n\n this._css.push(chunk);\n }\n\n isEmpty() {\n return this._css.length === 0;\n }\n\n toCSS(context) {\n this._sourceMapGenerator = new this._sourceMapGeneratorConstructor({ file: this._outputFilename, sourceRoot: null });\n\n if (this._outputSourceFiles) {\n for (const filename in this._contentsMap) {\n if (this._contentsMap.hasOwnProperty(filename)) {\n let source = this._contentsMap[filename];\n if (this._contentsIgnoredCharsMap[filename]) {\n source = source.slice(this._contentsIgnoredCharsMap[filename]);\n }\n this._sourceMapGenerator.setSourceContent(this.normalizeFilename(filename), source);\n }\n }\n }\n\n this._rootNode.genCSS(context, this);\n\n if (this._css.length > 0) {\n let sourceMapURL;\n const sourceMapContent = JSON.stringify(this._sourceMapGenerator.toJSON());\n\n if (this.sourceMapURL) {\n sourceMapURL = this.sourceMapURL;\n } else if (this._sourceMapFilename) {\n sourceMapURL = this._sourceMapFilename;\n }\n this.sourceMapURL = sourceMapURL;\n\n this.sourceMap = sourceMapContent;\n }\n\n return this._css.join('');\n }\n }\n\n return SourceMapOutput;\n};\n","import contexts from './contexts';\nimport Parser from './parser/parser';\nimport LessError from './less-error';\nimport * as utils from './utils';\nimport logger from './logger';\n\nexport default function(environment) {\n // FileInfo = {\n // 'rewriteUrls' - option - whether to adjust URL's to be relative\n // 'filename' - full resolved filename of current file\n // 'rootpath' - path to append to normal URLs for this node\n // 'currentDirectory' - path to the current file, absolute\n // 'rootFilename' - filename of the base file\n // 'entryPath' - absolute path to the entry file\n // 'reference' - whether the file should not be output and only output parts that are referenced\n\n class ImportManager {\n constructor(less, context, rootFileInfo) {\n this.less = less;\n this.rootFilename = rootFileInfo.filename;\n this.paths = context.paths || []; // Search paths, when importing\n this.contents = {}; // map - filename to contents of all the files\n this.contentsIgnoredChars = {}; // map - filename to lines at the beginning of each file to ignore\n this.mime = context.mime;\n this.error = null;\n this.context = context;\n // Deprecated? Unused outside of here, could be useful.\n this.queue = []; // Files which haven't been imported yet\n this.files = {}; // Holds the imported parse trees.\n }\n\n /**\n * Add an import to be imported\n * @param path - the raw path\n * @param tryAppendExtension - whether to try appending a file extension (.less or .js if the path has no extension)\n * @param currentFileInfo - the current file info (used for instance to work out relative paths)\n * @param importOptions - import options\n * @param callback - callback for when it is imported\n */\n push(path, tryAppendExtension, currentFileInfo, importOptions, callback) {\n const importManager = this, pluginLoader = this.context.pluginManager.Loader;\n\n this.queue.push(path);\n\n const fileParsedFunc = function (e, root, fullPath) {\n importManager.queue.splice(importManager.queue.indexOf(path), 1); // Remove the path from the queue\n\n const importedEqualsRoot = fullPath === importManager.rootFilename;\n if (importOptions.optional && e) {\n callback(null, {rules:[]}, false, null);\n logger.info(`The file ${fullPath} was skipped because it was not found and the import was marked optional.`);\n }\n else {\n // Inline imports aren't cached here.\n // If we start to cache them, please make sure they won't conflict with non-inline imports of the\n // same name as they used to do before this comment and the condition below have been added.\n if (!importManager.files[fullPath] && !importOptions.inline) {\n importManager.files[fullPath] = { root, options: importOptions };\n }\n if (e && !importManager.error) { importManager.error = e; }\n callback(e, root, importedEqualsRoot, fullPath);\n }\n };\n\n const newFileInfo = {\n rewriteUrls: this.context.rewriteUrls,\n entryPath: currentFileInfo.entryPath,\n rootpath: currentFileInfo.rootpath,\n rootFilename: currentFileInfo.rootFilename\n };\n\n const fileManager = environment.getFileManager(path, currentFileInfo.currentDirectory, this.context, environment);\n\n if (!fileManager) {\n fileParsedFunc({ message: `Could not find a file-manager for ${path}` });\n return;\n }\n\n const loadFileCallback = function(loadedFile) {\n let plugin;\n const resolvedFilename = loadedFile.filename;\n const contents = loadedFile.contents.replace(/^\\uFEFF/, '');\n\n // Pass on an updated rootpath if path of imported file is relative and file\n // is in a (sub|sup) directory\n //\n // Examples:\n // - If path of imported file is 'module/nav/nav.less' and rootpath is 'less/',\n // then rootpath should become 'less/module/nav/'\n // - If path of imported file is '../mixins.less' and rootpath is 'less/',\n // then rootpath should become 'less/../'\n newFileInfo.currentDirectory = fileManager.getPath(resolvedFilename);\n if (newFileInfo.rewriteUrls) {\n newFileInfo.rootpath = fileManager.join(\n (importManager.context.rootpath || ''),\n fileManager.pathDiff(newFileInfo.currentDirectory, newFileInfo.entryPath));\n\n if (!fileManager.isPathAbsolute(newFileInfo.rootpath) && fileManager.alwaysMakePathsAbsolute()) {\n newFileInfo.rootpath = fileManager.join(newFileInfo.entryPath, newFileInfo.rootpath);\n }\n }\n newFileInfo.filename = resolvedFilename;\n\n const newEnv = new contexts.Parse(importManager.context);\n\n newEnv.processImports = false;\n importManager.contents[resolvedFilename] = contents;\n\n if (currentFileInfo.reference || importOptions.reference) {\n newFileInfo.reference = true;\n }\n\n if (importOptions.isPlugin) {\n plugin = pluginLoader.evalPlugin(contents, newEnv, importManager, importOptions.pluginArgs, newFileInfo);\n if (plugin instanceof LessError) {\n fileParsedFunc(plugin, null, resolvedFilename);\n }\n else {\n fileParsedFunc(null, plugin, resolvedFilename);\n }\n } else if (importOptions.inline) {\n fileParsedFunc(null, contents, resolvedFilename);\n } else {\n\n // import (multiple) parse trees apparently get altered and can't be cached.\n // TODO: investigate why this is\n if (importManager.files[resolvedFilename]\n && !importManager.files[resolvedFilename].options.multiple\n && !importOptions.multiple) {\n\n fileParsedFunc(null, importManager.files[resolvedFilename].root, resolvedFilename);\n }\n else {\n new Parser(newEnv, importManager, newFileInfo).parse(contents, function (e, root) {\n fileParsedFunc(e, root, resolvedFilename);\n });\n }\n }\n };\n let loadedFile;\n let promise;\n const context = utils.clone(this.context);\n\n if (tryAppendExtension) {\n context.ext = importOptions.isPlugin ? '.js' : '.less';\n }\n\n if (importOptions.isPlugin) {\n context.mime = 'application/javascript';\n\n if (context.syncImport) {\n loadedFile = pluginLoader.loadPluginSync(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n } else {\n promise = pluginLoader.loadPlugin(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n }\n }\n else {\n if (context.syncImport) {\n loadedFile = fileManager.loadFileSync(path, currentFileInfo.currentDirectory, context, environment);\n } else {\n promise = fileManager.loadFile(path, currentFileInfo.currentDirectory, context, environment,\n (err, loadedFile) => {\n if (err) {\n fileParsedFunc(err);\n } else {\n loadFileCallback(loadedFile);\n }\n });\n }\n }\n if (loadedFile) {\n if (!loadedFile.filename) {\n fileParsedFunc(loadedFile);\n } else {\n loadFileCallback(loadedFile);\n }\n } else if (promise) {\n promise.then(loadFileCallback, fileParsedFunc);\n }\n }\n }\n\n return ImportManager;\n};\n","import * as utils from './utils';\n\nexport default function(environment, ParseTree, ImportManager) {\n const render = function (input, options, callback) {\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(this.options, {});\n }\n else {\n options = utils.copyOptions(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n return new Promise(function (resolve, reject) {\n render.call(self, input, options, function(err, output) {\n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n this.parse(input, options, function(err, root, imports, options) {\n if (err) { return callback(err); }\n\n let result;\n try {\n const parseTree = new ParseTree(root, imports);\n result = parseTree.toCSS(options);\n }\n catch (err) { return callback(err); }\n\n callback(null, result);\n });\n }\n };\n\n return render;\n};\n","import contexts from './contexts';\nimport Parser from './parser/parser';\nimport PluginManager from './plugin-manager';\nimport LessError from './less-error';\nimport * as utils from './utils';\n\nexport default function(environment, ParseTree, ImportManager) {\n const parse = function (input, options, callback) {\n\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(this.options, {});\n }\n else {\n options = utils.copyOptions(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n return new Promise(function (resolve, reject) {\n parse.call(self, input, options, function(err, output) {\n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n let context;\n let rootFileInfo;\n const pluginManager = new PluginManager(this, !options.reUsePluginManager);\n\n options.pluginManager = pluginManager;\n\n context = new contexts.Parse(options);\n\n if (options.rootFileInfo) {\n rootFileInfo = options.rootFileInfo;\n } else {\n const filename = options.filename || 'input';\n const entryPath = filename.replace(/[^\\/\\\\]*$/, '');\n rootFileInfo = {\n filename,\n rewriteUrls: context.rewriteUrls,\n rootpath: context.rootpath || '',\n currentDirectory: entryPath,\n entryPath,\n rootFilename: filename\n };\n // add in a missing trailing slash\n if (rootFileInfo.rootpath && rootFileInfo.rootpath.slice(-1) !== '/') {\n rootFileInfo.rootpath += '/';\n }\n }\n\n const imports = new ImportManager(this, context, rootFileInfo);\n this.importManager = imports;\n\n // TODO: allow the plugins to be just a list of paths or names\n // Do an async plugin queue like lessc\n\n if (options.plugins) {\n options.plugins.forEach(function(plugin) {\n let evalResult, contents;\n if (plugin.fileContent) {\n contents = plugin.fileContent.replace(/^\\uFEFF/, '');\n evalResult = pluginManager.Loader.evalPlugin(contents, context, imports, plugin.options, plugin.filename);\n if (evalResult instanceof LessError) {\n return callback(evalResult);\n }\n }\n else {\n pluginManager.addPlugin(plugin);\n }\n });\n }\n\n new Parser(context, imports, rootFileInfo)\n .parse(input, function (e, root) {\n if (e) { return callback(e); }\n callback(null, root, imports, options);\n }, options);\n }\n };\n return parse;\n};\n","// TODO: Add tests for browser @plugin\n/* global window */\n\nimport AbstractPluginLoader from '../less/environment/abstract-plugin-loader.js';\n\n/**\n * Browser Plugin Loader\n */\nclass PluginLoader extends AbstractPluginLoader {\n constructor(less) {\n super();\n\n this.less = less;\n // Should we shim this.require for browser? Probably not?\n }\n\n loadPlugin(filename, basePath, context, environment, fileManager) {\n return new Promise((fulfill, reject) => {\n fileManager.loadFile(filename, basePath, context, environment)\n .then(fulfill).catch(reject);\n });\n }\n}\n\nexport default PluginLoader;\n\n","import * as utils from './utils';\nimport browser from './browser';\n\nexport default (window, less, options) => {\n\n function errorHTML(e, rootHref) {\n const id = `less-error-message:${utils.extractId(rootHref || '')}`;\n const template = '
  • {content}
  • ';\n const elem = window.document.createElement('div');\n let timer;\n let content;\n const errors = [];\n const filename = e.filename || rootHref;\n const filenameNoPath = filename.match(/([^\\/]+(\\?.*)?)$/)[1];\n\n elem.id = id;\n elem.className = 'less-error-message';\n\n content = `

    ${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'}` + \n `

    in ${filenameNoPath} `;\n\n const errorline = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\{content\\}/, e.extract[i]));\n }\n };\n\n if (e.line) {\n errorline(e, 0, '');\n errorline(e, 1, 'line');\n errorline(e, 2, '');\n content += `on line ${e.line}, column ${e.column + 1}:

      ${errors.join('')}
    `;\n }\n if (e.stack && (e.extract || options.logLevel >= 4)) {\n content += `
    Stack Trace
    ${e.stack.split('\\n').slice(1).join('
    ')}`;\n }\n elem.innerHTML = content;\n\n // CSS for error messages\n browser.createCSS(window.document, [\n '.less-error-message ul, .less-error-message li {',\n 'list-style-type: none;',\n 'margin-right: 15px;',\n 'padding: 4px 0;',\n 'margin: 0;',\n '}',\n '.less-error-message label {',\n 'font-size: 12px;',\n 'margin-right: 15px;',\n 'padding: 4px 0;',\n 'color: #cc7777;',\n '}',\n '.less-error-message pre {',\n 'color: #dd6666;',\n 'padding: 4px 0;',\n 'margin: 0;',\n 'display: inline-block;',\n '}',\n '.less-error-message pre.line {',\n 'color: #ff0000;',\n '}',\n '.less-error-message h3 {',\n 'font-size: 20px;',\n 'font-weight: bold;',\n 'padding: 15px 0 5px 0;',\n 'margin: 0;',\n '}',\n '.less-error-message a {',\n 'color: #10a',\n '}',\n '.less-error-message .error {',\n 'color: red;',\n 'font-weight: bold;',\n 'padding-bottom: 2px;',\n 'border-bottom: 1px dashed red;',\n '}'\n ].join('\\n'), { title: 'error-message' });\n\n elem.style.cssText = [\n 'font-family: Arial, sans-serif',\n 'border: 1px solid #e00',\n 'background-color: #eee',\n 'border-radius: 5px',\n '-webkit-border-radius: 5px',\n '-moz-border-radius: 5px',\n 'color: #e00',\n 'padding: 15px',\n 'margin-bottom: 15px'\n ].join(';');\n\n if (options.env === 'development') {\n timer = setInterval(() => {\n const document = window.document;\n const body = document.body;\n if (body) {\n if (document.getElementById(id)) {\n body.replaceChild(elem, document.getElementById(id));\n } else {\n body.insertBefore(elem, body.firstChild);\n }\n clearInterval(timer);\n }\n }, 10);\n }\n }\n\n function removeErrorHTML(path) {\n const node = window.document.getElementById(`less-error-message:${utils.extractId(path)}`);\n if (node) {\n node.parentNode.removeChild(node);\n }\n }\n\n function removeErrorConsole(path) {\n // no action\n }\n\n function removeError(path) {\n if (!options.errorReporting || options.errorReporting === 'html') {\n removeErrorHTML(path);\n } else if (options.errorReporting === 'console') {\n removeErrorConsole(path);\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('remove', path);\n }\n }\n\n function errorConsole(e, rootHref) {\n const template = '{line} {content}';\n const filename = e.filename || rootHref;\n const errors = [];\n let content = `${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'} in ${filename}`;\n\n const errorline = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\{content\\}/, e.extract[i]));\n }\n };\n\n if (e.line) {\n errorline(e, 0, '');\n errorline(e, 1, 'line');\n errorline(e, 2, '');\n content += ` on line ${e.line}, column ${e.column + 1}:\\n${errors.join('\\n')}`;\n }\n if (e.stack && (e.extract || options.logLevel >= 4)) {\n content += `\\nStack Trace\\n${e.stack}`;\n }\n less.logger.error(content);\n }\n\n function error(e, rootHref) {\n if (!options.errorReporting || options.errorReporting === 'html') {\n errorHTML(e, rootHref);\n } else if (options.errorReporting === 'console') {\n errorConsole(e, rootHref);\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('add', e, rootHref);\n }\n }\n\n return {\n add: error,\n remove: removeError\n };\n};\n","/**\n * Kicks off less and compiles any stylesheets\n * used in the browser distributed version of less\n * to kick-start less using the browser api\n */\n/* global window, document */\n\nimport defaultOptions from '../less/default-options';\nimport addDefaultOptions from './add-default-options';\nimport root from './index';\n\nconst options = defaultOptions();\n\nif (window.less) {\n for (const key in window.less) {\n if (window.less.hasOwnProperty(key)) {\n options[key] = window.less[key];\n }\n }\n}\naddDefaultOptions(window, options);\n\noptions.plugins = options.plugins || [];\n\nif (window.LESS_PLUGINS) {\n options.plugins = options.plugins.concat(window.LESS_PLUGINS);\n}\n\nconst less = root(window, options);\nexport default less;\n\nwindow.less = less;\n\nlet css;\nlet head;\nlet style;\n\n// Always restore page visibility\nfunction resolveOrReject(data) {\n if (data.filename) {\n console.warn(data);\n }\n if (!options.async) {\n head.removeChild(style);\n }\n}\n\nif (options.onReady) {\n if (/!watch/.test(window.location.hash)) {\n less.watch();\n }\n // Simulate synchronous stylesheet loading by hiding page rendering\n if (!options.async) {\n css = 'body { display: none !important }';\n head = document.head || document.getElementsByTagName('head')[0];\n style = document.createElement('style');\n\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n\n head.appendChild(style);\n }\n less.registerStylesheetsImmediately();\n less.pageLoadFinished = less.refresh(less.env === 'development').then(resolveOrReject, resolveOrReject);\n}\n","// Export a new default each time\nexport default function() {\n return {\n /* Inline Javascript - @plugin still allowed */\n javascriptEnabled: false,\n\n /* Outputs a makefile import dependency list to stdout. */\n depends: false,\n\n /* (DEPRECATED) Compress using less built-in compression. \n * This does an okay job but does not utilise all the tricks of \n * dedicated css compression. */\n compress: false,\n\n /* Runs the less parser and just reports errors without any output. */\n lint: false,\n\n /* Sets available include paths.\n * If the file in an @import rule does not exist at that exact location, \n * less will look for it at the location(s) passed to this option. \n * You might use this for instance to specify a path to a library which \n * you want to be referenced simply and relatively in the less files. */\n paths: [],\n\n /* color output in the terminal */\n color: true,\n\n /* The strictImports controls whether the compiler will allow an @import inside of either \n * @media blocks or (a later addition) other selector blocks.\n * See: https://github.com/less/less.js/issues/656 */\n strictImports: false,\n\n /* Allow Imports from Insecure HTTPS Hosts */\n insecure: false,\n\n /* Allows you to add a path to every generated import and url in your css. \n * This does not affect less import statements that are processed, just ones \n * that are left in the output css. */\n rootpath: '',\n\n /* By default URLs are kept as-is, so if you import a file in a sub-directory \n * that references an image, exactly the same URL will be output in the css. \n * This option allows you to re-write URL's in imported files so that the \n * URL is always relative to the base imported file */\n rewriteUrls: false,\n\n /* How to process math \n * 0 always - eagerly try to solve all operations\n * 1 parens-division - require parens for division \"/\"\n * 2 parens | strict - require parens for all operations\n * 3 strict-legacy - legacy strict behavior (super-strict)\n */\n math: 1,\n\n /* Without this option, less attempts to guess at the output unit when it does maths. */\n strictUnits: false,\n\n /* Effectively the declaration is put at the top of your base Less file, \n * meaning it can be used but it also can be overridden if this variable \n * is defined in the file. */\n globalVars: null,\n\n /* As opposed to the global variable option, this puts the declaration at the\n * end of your base file, meaning it will override anything defined in your Less file. */\n modifyVars: null,\n\n /* This option allows you to specify a argument to go on to every URL. */\n urlArgs: ''\n }\n};","import {addDataAttr} from './utils';\nimport browser from './browser';\n\nexport default (window, options) => {\n\n // use options from the current script tag data attribues\n addDataAttr(options, browser.currentScript(window));\n\n if (options.isFileProtocol === undefined) {\n options.isFileProtocol = /^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(window.location.protocol);\n }\n\n // Load styles asynchronously (default: false)\n //\n // This is set to `false` by default, so that the body\n // doesn't start loading before the stylesheets are parsed.\n // Setting this to `true` can result in flickering.\n //\n options.async = options.async || false;\n options.fileAsync = options.fileAsync || false;\n\n // Interval between watch polls\n options.poll = options.poll || (options.isFileProtocol ? 1000 : 1500);\n\n options.env = options.env || (window.location.hostname == '127.0.0.1' ||\n window.location.hostname == '0.0.0.0' ||\n window.location.hostname == 'localhost' ||\n (window.location.port &&\n window.location.port.length > 0) ||\n options.isFileProtocol ? 'development'\n : 'production');\n\n const dumpLineNumbers = /!dumpLineNumbers:(comments|mediaquery|all)/.exec(window.location.hash);\n if (dumpLineNumbers) {\n options.dumpLineNumbers = dumpLineNumbers[1];\n }\n\n if (options.useFileCache === undefined) {\n options.useFileCache = true;\n }\n\n if (options.onReady === undefined) {\n options.onReady = true;\n }\n\n if (options.relativeUrls) {\n options.rewriteUrls = 'all';\n }\n};\n","//\n// index.js\n// Should expose the additional browser functions on to the less object\n//\nimport {addDataAttr} from './utils';\nimport lessRoot from '../less';\nimport browser from './browser';\nimport FM from './file-manager';\nimport PluginLoader from './plugin-loader';\nimport LogListener from './log-listener';\nimport ErrorReporting from './error-reporting';\nimport Cache from './cache';\nimport ImageSize from './image-size';\n\nexport default (window, options) => {\n const document = window.document;\n const less = lessRoot();\n\n less.options = options;\n const environment = less.environment;\n const FileManager = FM(options, less.logger);\n const fileManager = new FileManager();\n environment.addFileManager(fileManager);\n less.FileManager = FileManager;\n less.PluginLoader = PluginLoader;\n\n LogListener(less, options);\n const errors = ErrorReporting(window, less, options);\n const cache = less.cache = options.cache || Cache(window, options, less.logger);\n ImageSize(less.environment);\n\n // Setup user functions - Deprecate?\n if (options.functions) {\n less.functions.functionRegistry.addMultiple(options.functions);\n }\n\n const typePattern = /^text\\/(x-)?less$/;\n\n function clone(obj) {\n const cloned = {};\n for (const prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n cloned[prop] = obj[prop];\n }\n }\n return cloned;\n }\n\n // only really needed for phantom\n function bind(func, thisArg) {\n const curryArgs = Array.prototype.slice.call(arguments, 2);\n return function() {\n const args = curryArgs.concat(Array.prototype.slice.call(arguments, 0));\n return func.apply(thisArg, args);\n };\n }\n\n function loadStyles(modifyVars) {\n const styles = document.getElementsByTagName('style');\n let style;\n\n for (let i = 0; i < styles.length; i++) {\n style = styles[i];\n if (style.type.match(typePattern)) {\n const instanceOptions = clone(options);\n instanceOptions.modifyVars = modifyVars;\n const lessText = style.innerHTML || '';\n instanceOptions.filename = document.location.href.replace(/#.*$/, '');\n\n /* jshint loopfunc:true */\n // use closure to store current style\n less.render(lessText, instanceOptions,\n bind((style, e, result) => {\n if (e) {\n errors.add(e, 'inline');\n } else {\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = result.css;\n } else {\n style.innerHTML = result.css;\n }\n }\n }, null, style));\n }\n }\n }\n\n function loadStyleSheet(sheet, callback, reload, remaining, modifyVars) {\n\n const instanceOptions = clone(options);\n addDataAttr(instanceOptions, sheet);\n instanceOptions.mime = sheet.type;\n\n if (modifyVars) {\n instanceOptions.modifyVars = modifyVars;\n }\n\n function loadInitialFileCallback(loadedFile) {\n const data = loadedFile.contents;\n const path = loadedFile.filename;\n const webInfo = loadedFile.webInfo;\n\n const newFileInfo = {\n currentDirectory: fileManager.getPath(path),\n filename: path,\n rootFilename: path,\n rewriteUrls: instanceOptions.rewriteUrls\n };\n\n newFileInfo.entryPath = newFileInfo.currentDirectory;\n newFileInfo.rootpath = instanceOptions.rootpath || newFileInfo.currentDirectory;\n\n if (webInfo) {\n webInfo.remaining = remaining;\n\n const css = cache.getCSS(path, webInfo, instanceOptions.modifyVars);\n if (!reload && css) {\n webInfo.local = true;\n callback(null, css, data, sheet, webInfo, path);\n return;\n }\n\n }\n\n // TODO add tests around how this behaves when reloading\n errors.remove(path);\n\n instanceOptions.rootFileInfo = newFileInfo;\n less.render(data, instanceOptions, (e, result) => {\n if (e) {\n e.href = path;\n callback(e);\n } else {\n cache.setCSS(sheet.href, webInfo.lastModified, instanceOptions.modifyVars, result.css);\n callback(null, result.css, data, sheet, webInfo, path);\n }\n });\n }\n\n fileManager.loadFile(sheet.href, null, instanceOptions, environment)\n .then(loadedFile => {\n loadInitialFileCallback(loadedFile);\n }).catch(err => {\n console.log(err);\n callback(err);\n });\n\n }\n\n function loadStyleSheets(callback, reload, modifyVars) {\n for (let i = 0; i < less.sheets.length; i++) {\n loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1), modifyVars);\n }\n }\n\n function initRunningMode() {\n if (less.env === 'development') {\n less.watchTimer = setInterval(() => {\n if (less.watchMode) {\n fileManager.clearFileCache();\n loadStyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n } else if (css) {\n browser.createCSS(window.document, css, sheet);\n }\n });\n }\n }, options.poll);\n }\n }\n\n //\n // Watch mode\n //\n less.watch = function () {\n if (!less.watchMode ) {\n less.env = 'development';\n initRunningMode();\n }\n this.watchMode = true;\n return true;\n };\n\n less.unwatch = function () {clearInterval(less.watchTimer); this.watchMode = false; return false; };\n\n //\n // Synchronously get all tags with the 'rel' attribute set to\n // \"stylesheet/less\".\n //\n less.registerStylesheetsImmediately = () => {\n const links = document.getElementsByTagName('link');\n less.sheets = [];\n\n for (let i = 0; i < links.length; i++) {\n if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) &&\n (links[i].type.match(typePattern)))) {\n less.sheets.push(links[i]);\n }\n }\n };\n\n //\n // Asynchronously get all tags with the 'rel' attribute set to\n // \"stylesheet/less\", returning a Promise.\n //\n less.registerStylesheets = () => new Promise((resolve, reject) => {\n less.registerStylesheetsImmediately();\n resolve();\n });\n\n //\n // With this function, it's possible to alter variables and re-render\n // CSS without reloading less-files\n //\n less.modifyVars = record => less.refresh(true, record, false);\n\n less.refresh = (reload, modifyVars, clearFileCache) => {\n if ((reload || clearFileCache) && clearFileCache !== false) {\n fileManager.clearFileCache();\n }\n return new Promise((resolve, reject) => {\n let startTime;\n let endTime;\n let totalMilliseconds;\n let remainingSheets;\n startTime = endTime = new Date();\n\n // Set counter for remaining unprocessed sheets\n remainingSheets = less.sheets.length;\n\n if (remainingSheets === 0) {\n\n endTime = new Date();\n totalMilliseconds = endTime - startTime;\n less.logger.info('Less has finished and no sheets were loaded.');\n resolve({\n startTime,\n endTime,\n totalMilliseconds,\n sheets: less.sheets.length\n });\n\n } else {\n // Relies on less.sheets array, callback seems to be guaranteed to be called for every element of the array\n loadStyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n reject(e);\n return;\n }\n if (webInfo.local) {\n less.logger.info(`Loading ${sheet.href} from cache.`);\n } else {\n less.logger.info(`Rendered ${sheet.href} successfully.`);\n }\n browser.createCSS(window.document, css, sheet);\n less.logger.info(`CSS for ${sheet.href} generated in ${new Date() - endTime}ms`);\n\n // Count completed sheet\n remainingSheets--;\n\n // Check if the last remaining sheet was processed and then call the promise\n if (remainingSheets === 0) {\n totalMilliseconds = new Date() - startTime;\n less.logger.info(`Less has finished. CSS generated in ${totalMilliseconds}ms`);\n resolve({\n startTime,\n endTime,\n totalMilliseconds,\n sheets: less.sheets.length\n });\n }\n endTime = new Date();\n }, reload, modifyVars);\n }\n\n loadStyles(modifyVars);\n });\n };\n\n less.refreshStyles = loadStyles;\n return less;\n};\n","export default (less, options) => {\n const logLevel_debug = 4;\n const logLevel_info = 3;\n const logLevel_warn = 2;\n const logLevel_error = 1;\n\n // The amount of logging in the javascript console.\n // 3 - Debug, information and errors\n // 2 - Information and errors\n // 1 - Errors\n // 0 - None\n // Defaults to 2\n options.logLevel = typeof options.logLevel !== 'undefined' ? options.logLevel : (options.env === 'development' ? logLevel_info : logLevel_error);\n\n if (!options.loggers) {\n options.loggers = [{\n debug: function(msg) {\n if (options.logLevel >= logLevel_debug) {\n console.log(msg);\n }\n },\n info: function(msg) {\n if (options.logLevel >= logLevel_info) {\n console.log(msg);\n }\n },\n warn: function(msg) {\n if (options.logLevel >= logLevel_warn) {\n console.warn(msg);\n }\n },\n error: function(msg) {\n if (options.logLevel >= logLevel_error) {\n console.error(msg);\n }\n }\n }];\n }\n for (let i = 0; i < options.loggers.length; i++) {\n less.logger.addListener(options.loggers[i]);\n }\n};\n","// Cache system is a bit outdated and could do with work\n\nexport default (window, options, logger) => {\n let cache = null;\n if (options.env !== 'development') {\n try {\n cache = (typeof window.localStorage === 'undefined') ? null : window.localStorage;\n } catch (_) {}\n }\n return {\n setCSS: function(path, lastModified, modifyVars, styles) {\n if (cache) {\n logger.info(`saving ${path} to cache.`);\n try {\n cache.setItem(path, styles);\n cache.setItem(`${path}:timestamp`, lastModified);\n if (modifyVars) {\n cache.setItem(`${path}:vars`, JSON.stringify(modifyVars));\n }\n } catch (e) {\n // TODO - could do with adding more robust error handling\n logger.error(`failed to save \"${path}\" to local storage for caching.`);\n }\n }\n },\n getCSS: function(path, webInfo, modifyVars) {\n const css = cache && cache.getItem(path);\n const timestamp = cache && cache.getItem(`${path}:timestamp`);\n let vars = cache && cache.getItem(`${path}:vars`);\n\n modifyVars = modifyVars || {};\n vars = vars || \"{}\"; // if not set, treat as the JSON representation of an empty object\n\n if (timestamp && webInfo.lastModified &&\n (new Date(webInfo.lastModified).valueOf() ===\n new Date(timestamp).valueOf()) &&\n JSON.stringify(modifyVars) === vars) {\n // Use local copy\n return css;\n }\n }\n };\n};\n","\nimport functionRegistry from './../less/functions/function-registry';\n\nexport default () => {\n function imageSize() {\n throw {\n type: 'Runtime',\n message: 'Image size functions are not supported in browser version of less'\n };\n }\n\n const imageFunctions = {\n 'image-size': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n },\n 'image-width': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n },\n 'image-height': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n }\n };\n\n functionRegistry.addMultiple(imageFunctions);\n};\n"],"names":["extractId","href","replace","addDataAttr","options","tag","opt","dataset","hasOwnProperty","JSON","parse","_","document","styles","sheet","id","title","utils.extractId","oldStyleNode","getElementById","keepOldStyleNode","styleNode","createElement","setAttribute","media","styleSheet","appendChild","createTextNode","childNodes","length","firstChild","nodeValue","head","getElementsByTagName","nextEl","nextSibling","parentNode","insertBefore","removeChild","cssText","e","Error","window","scripts","currentScript","error","msg","this","_fireEvent","warn","info","debug","addListener","listener","_listeners","push","removeListener","i","splice","type","logFunction","externalEnvironment","fileManagers","requiredFunctions","functions","concat","propName","environmentFunc","bind","Environment","filename","currentDirectory","environment","isSync","logger","pluginManager","getFileManagers","fileManager","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","darkgrey","darkgreen","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","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","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","m","cm","mm","in","px","pt","pc","duration","s","ms","angle","rad","Math","PI","deg","grad","turn","colors","unitConversions","parent","visibilityBlocks","undefined","nodeVisible","rootNode","parsed","self","Object","defineProperty","get","fileInfo","getIndex","Node","nodes","set","node","Array","isArray","forEach","_index","_fileInfo","context","strs","genCSS","add","chunk","index","isEmpty","join","output","value","visitor","visit","op","a","b","precision","numPrecision","Number","toFixed","compare","extendStatics","d","setPrototypeOf","__proto__","p","__extends","__","constructor","prototype","create","__assign","assign","t","n","arguments","call","apply","rgb","originalForm","_super","_this","match","map","c","parseInt","alpha","split","Color","r","g","pow","toCSS","doNotCompress","color","colorFunction","compress","args","fround","indexOf","clamp","round","toHSL","h","l","toRGB","splitcolor","other","_operate","toHex","max","min","v","x","keyword","key","toLowerCase","slice","toString","Paren","eval","_noSpaceCombinators"," ","|","emptyOrWhitespace","trim","Combinator","spaceOrEmpty","combinator","isVariable","currentFileInfo","visibilityInfo","copyVisibilityInfo","setParent","Element","firstSelector","charAt","ALWAYS","PARENS_DIVISION","PARENS","RewriteUrls","getLocation","inputStream","line","column","copyArray","arr","copy","clone","obj","cloned","prop","defaults","obj1","obj2","newObj","_defaults","defaults_1","copyOptions","opts","strictMath","math","Constants.Math","relativeUrls","rewriteUrls","Constants.RewriteUrls","flattenArray","result","length_1","anonymousFunc","LessError","fileContentMap","currentFilename","message","stack","input","contents","loc","utils.getLocation","col","callLine","lines","found","func","Function","lineAdjust","callExtract","extract","F","stylize","str","errorTxt","substr","elements","extendList","condition","evaldCondition","getElements","mixinElements_","Selector","visitArray","newSelector","mediaEmpty","els","parseNode","err","imports","sels","olen","len","mixinElements","shift","extend","createDerived","Value","Keyword","True","False","mapLines","rulesetLike","allowRoot","Anonymous","Boolean","MATH","name","important","merge","inline","variable","Declaration","lastRule","prevMath","evaldValue","mathBypass","evalName","importantScope","importantResult","pop","ctx","lineSeparator","dumpLineNumbers","debugInfo","asComment","asMediaQuery","lineNumber","fileName","filenameWithProtocol","test","isLineComment","Comment","getDebugInfo","isCompressed","contexts","copyFromOriginal","original","destination","propertiesToCopy","parseCopyProperties","Parse","paths","evalCopyProperties","isPathRelative","path","isPathLocalRelative","Eval","frames","enterCalc","calcStack","inCalc","exitCalc","inParenthesis","parensStack","outOfParenthesis","mathOn","isMathOn","pathRequiresRewrite","rewritePath","rootpath","newPath","normalizePath","segment","segments","reverse","makeRegistry","base","_data","addMultiple","keys","getLocalFunctions","inherit","defaultFunc","value_","error_","reset","selectors","rules","strictImports","_lookups","_variables","_properties","Ruleset","selCnt","selector","hasVariable","hasOnePassingSelector","j","toParseSelectors","utils.flattenArray","rule","subRule","utils.copyArray","ruleset","originalRuleset","root","firstRoot","allowImports","functionRegistry","globalFunctionRegistry","ctxFrames","unshift","ctxSelectors","evalImports","rsRules","evalFirst","mediaBlockCount","mediaBlocks","filter","resetCache","isJustParentSelector","bubbleSelectors","importRules","makeImportant","lastSelector","_rulesets","reduce","hash","variables","vars","name_1","name_2","decl","parseValue","properties","toParse","transformDeclaration","nodes_1","filtRules","isRuleset","foundMixins","rulesets","find","ruleNodes","tabLevel","sep","tabRuleStr","tabSetStr","charsetNodeIndex","importNodeIndex","isCharset","pathCnt","pathSubCnt","currentLastRule","isRulesetLike","isVisible","joinSelector","createParenthesis","elementsToPak","originalElement","replacementParen","insideParent","createSelector","containedElement","element","addReplacementIntoPath","beginningPath","addPath","replacedElement","originalSelector","newSelectorPath","newJoinedSelector","parentEl","restOfPath","addAllReplacementsIntoPath","addPaths","mergeElementsOnToSelectors","sel","deriveSelector","deriveFrom","newPaths","replaceParentSelector","inSelector","k","currentElements","newSelectors","selectorsMultiplied","el","maybeSelector","hadParentSelector","nestedSelector","replaced","nestedPaths","replacedNewSelectors","concatenated","isRooted","createEmptySelectors","AtRule","outputRuleset","mediaPathBackup","mediaBlocksBackup","mediaPath","ruleCnt","DetachedRuleset","numerator","denominator","backupUnit","sort","Unit","strictUnits","returnStr","is","unitString","toUpperCase","RegExp","callback","group","mapUnit","groupName","atomicUnit","counter","count","unit","parseFloat","isNaN","Dimension","isSingular","strValue","String","isLength","convertTo","usedUnits","cancel","unify","numericCompare","conversions","targetUnit","applyUnit","derivedConversions","operands","isSpaced","Operation","toColor","operate","noSpacing","Expression","returnValue","parens","doubleParen","parensInOp","functionCaller","evalArgs","commentFilter","item","subNodes","il","jl","calc","Call","currentMathContext","funcCaller","FunctionCaller","isValid","columnNumber","Variable","evaluating","frame","fun","Property","property","mergeRules","less","visitors","ToCSSVisitor","_mergeRules","vArr","Attribute","content","escaped","quote","variableRegex","propRegex","Quoted","that","iterativeReplace","regexp","replacementFnc","evaluatedValue","val","isEvald","URL","urlArgs","features","Media","evalTop","evalNested","multiMedia","permute","fragment","rest","css","pathValue","getPath","Import","isPlugin","reference","containsVariables","doEval","blocksVisibility","addVisibilityBlock","registry","skip","importedFilename","newImport","evalPath","string","expression","JavaScript","evaluateJavaScript","JsEvalNode","evalContext","javascriptEnabled","jsify","toJS","Assignment","negate","lvalue","rvalue","Condition","UnicodeDescriptor","Negative","option","object_id","Extend","next_id","parent_ids","allowBefore","allowAfter","selectorElements","selfElements","selfSelectors","VariableCall","detachedRuleset","callEval","ruleCall","lookups","NamespaceValue","lastDeclaration","substring","params","variadic","arity","optionalParameters","required","Definition","mixinEnv","evaldArguments","varargs","arg","isNamedFound","argIndex","argsLength","prependRule","_arguments","mixinFrames","evalParams","allArgsCnt","requiredArgsCnt","MixinCall","mixins","mixin","mixinPath","argValue","f","isRecursive","isOneFound","candidate","defaultResult","noArgumentsFilter","candidates","conditionResult","calcDefGroup","namespace","matchCondition","expand","matchArgs","MixinDefinition","format","newRules","evalCall","_setVisibilityToReplacement","replacement","AbstractFileManager","lastIndexOf","ext","tryAppendExtension","basePath","laterPath","url","baseUrl","urlDirectories","baseUrlDirectories","urlParts","extractUrlParts","baseUrlParts","diff","hostPart","directories","urlPartsRegex","returner","rawDirectories","rawPath","fileUrl","require","AbstractPluginLoader","pluginOptions","pluginObj","localModule","shortname","FileManager","trySetOptions","use","exports","loader","tree","validatePlugin","minVersion","compareVersion","addPlugin","plugin","setOptions","version","versionToString","aVersion","bVersion","versionString","plugins","printUsage","_visitArgs","visitDeeper","_hasIndexed","_noop","implementation","_implementation","_visitInCache","_visitOutCache","indexNodeTypes","ticker","child","typeIndex","Visitor","nodeTypeIndex","fnName","impl","funcOut","visitArgs","newNode","isReplacing","cnt","accept","nonReplacing","out","evald","flatten","nestedCnt","nestedItem","onSequencerEmpty","variableImports","_onSequencerEmpty","_currentDepth","ImportSequencer","importSequencer","importItem","isReady","tryRun","variableImport","ImportVisitor","importer","finish","_visitor","_importer","_finish","importCount","onceFileDetectionMap","recursionDetector","_sequencer","run","isFinished","visitImport","importNode","inlineCSS","importParent","isVariableImport","addVariableImport","processImportNode","evaldImportNode","evalForImport","multiple","importMultiple","tryAppendLessExtension","onImported","sequencedOnImported","addImport","importedAtRoot","fullPath","importVisitor","isOptional","optional","duplicateImport","oldContext","visitDeclaration","declNode","visitDeclarationOut","visitAtRule","atRuleNode","visitAtRuleOut","visitMixinDefinition","mixinDefinitionNode","visitMixinDefinitionOut","visitRuleset","rulesetNode","visitRulesetOut","visitMedia","mediaNode","visitMediaOut","visible","SetTreeVisibilityVisitor","ensureVisibility","ensureInvisibility","allExtendsStack","ExtendFinderVisitor","allExtends","allSelectorsExtendList","extendOnEveryPath","selectorPath","selExtendList","allSelectorsExtend","foundExtends","findSelfSelectors","firstExtendOnThisSelectorPath","ProcessExtendsVisitor","extendFinder","extendIndices","doExtendChaining","newRoot","checkExtendsForNonMatched","indices","hasFoundMatches","extendsList","extendsListTarget","iterationCount","extendIndex","targetExtendIndex","matches","targetExtend","newExtend","extendsToAdd","extendVisitor","findMatch","selfSelector","extendSelector","extendChainCount","selectorOne","selectorTwo","ruleNode","selectorNode","pathIndex","selectorsToAdd","extendedSelectors","haystackSelectorPath","haystackSelectorIndex","hackstackSelector","hackstackElementIndex","haystackElement","targetCombinator","potentialMatch","needleElements","potentialMatches","matched","initialCombinator","isElementValuesEqual","finished","endPathIndex","endPathElementIndex","elementValue1","elementValue2","replacementSelector","matchIndex","firstElement","newElements","currentSelectorPathIndex","currentSelectorPathElementIndex","currentValue","derived","newAllExtends","lastIndex","JoinSelectorVisitor","getIsOutput","joinSelectors","_context","CSSVisitorUtils","bodyRules","isSilent","owner","thing","originalRules","containsSilentNonBlockedChild","compiledRulesBody","keepOnlyVisibleChilds","removeVisibilityBlock","hasVisibleSelector","utils","mixinNode","visitExtend","extendNode","visitComment","commentNode","resolveVisibility","visitAtRuleWithBody","visitAtRuleWithoutBody","visitAnonymous","anonymousNode","nodeRules","hasFakeRuleset","getBodyRules","charset","comment","checkValidNodes","isRoot","_compileRulesetPaths","nodeRuleCnt","_removeDuplicateRules","isVisibleRuleset","ruleList","ruleCache","ruleCSS","groups","groupsArr","result_1","space_1","comma_1","MarkVisibleSelectorsVisitor","ExtendVisitor","furthest","furthestPossibleErrorMessage","chunks","current","currentPos","saveStack","parserInput","skipWhitespace","nextChar","oldi","oldj","curr","endIndex","mem","inp","charCodeAt","autoCommentAbsorb","nextNewLine","text","commentStore","nextStarSlash","save","restore","possibleErrorMessage","state","forget","isWhitespace","offset","pos","code","$re","tok","exec","$char","$str","tokLength","$quoted","startChar","currentPosition","$parseUntil","testChar","returnVal","inComment","blockDepth","blockStack","parseGroups","startPos","lastPos","loop","char","expected","peek","peekChar","currentChar","prevChar","getInput","peekNotNumeric","start","chunkInput","failFunction","fail","lastOpening","lastOpeningParen","lastMultiComment","lastMultiCommentEndBrace","chunkerCurrentIndex","currentChunkStartIndex","cc","cc2","level","parenLevel","emitFrom","emitChunk","force","fromCharCode","chunker","end","furthestReachedEnd","furthestChar","Parser","parsers","getParserInput","expect","expectChar","parseList","currentIndex","returnNodes","parser","additionalData","globalVars","modifyVars","ignored","preText","serializeVars","preProcessors","getPreProcessors","process","banner","contentsIgnoredChars","primary","endInfo","processImports","extendRule","definition","declaration","variableCall","entities","atrule","foundSemiColon","mixinLookup","quoted","forceEscaped","isEscaped","fromKeyword","customFuncCall","stop","ieAlpha","boolean","if","prevArgs","isSemiColonSeparated","argsComma","argsSemiColon","assignment","literal","dimension","unicodeDescriptor","entity","ch","variableCurly","curly","propertyCurly","colorKeyword","ud","javascript","js","escape","parsedName","inValue","ruleLookups","isRule","getLookup","hasParens","elem","elemIndex","re","isCall","expressionContainsNamed","nameLoop","expressions","hasSep","throwAwayComments","cond","argInfo","conditions","block","lookupValue","attribute","slashedCombinator","isLess","when","blockRuleset","hasDR","ruleProperty","permissiveValue","anonymousValue","untilTokens","done","testCurrentChar","import","dir","importOptions","mediaFeatures","o","optionName","importOption","mediaFeature","pluginArgs","nonVendorSpecificName","hasIdentifier","hasExpression","hasUnknown","hasBlock","sub","addition","multiplication","operation","operand","needsParens","logical","next","conditionAnd","negatedCondition","parenthesisCondition","atomicCondition","body","me","tryConditionFollowedByParenthesis","delim","simpleProperty","If","trueValue","falseValue","colorFunctions","hsla","origColor","hsl","toHSV","number","rgba","size","m1_1","m2_1","hue","hsv","hsva","vs","floor","perm","saturation","lightness","hsvhue","hsvsaturation","hsvvalue","luma","luminance","saturate","amount","method","desaturate","lighten","darken","fadein","fadeout","fade","spin","mix","color1","color2","weight","w","w1","w2","greyscale","contrast","dark","light","threshold","argb","toARGB","tint","shade","colorBlend","mode","cb","cs","ar","cr","ab","as","colorBlendModeFunctions","multiply","screen","overlay","softlight","sqrt","hardlight","difference","abs","exclusion","average","negation","getItemsFromNode","_SELF","~","_i","expr","values","range","step","from","to","stepValue","list","each","rs","iterator","tryEval","Quote","valueName","keyName","indexName","MathHelper","fn","mathFunctions","ceil","sin","cos","atan","asin","acos","mathHelper","fraction","num","minMax","isMin","currentUnified","referenceUnified","unitStatic","unitClone","order","convert","pi","mod","y","percentage","evaluated","encodeURI","pattern","flags","%","token","encodeURIComponent","isa","Type","isunit","isruleset","iscolor","isnumber","isstring","iskeyword","isurl","ispixel","ispercentage","isem","get-unit","colorBlending","fallback","functionThis","data-uri","mimetypeNode","filePathNode","mimetype","filePath","entryPath","fragmentStart","utils.clone","rawBuffer","getFileManager","useBase64","mimeLookup","charsetLookup","fileSync","loadFileSync","buf","encodeBase64","uri","dataUri","svg-gradient","direction","stops","gradientDirectionSvg","position","positionValue","gradientType","rectangleDimension","renderEnv","directionValue","throwArgumentDescriptor","types","evaldRoot","evalEnv","visitorIterator","preEvalVisitors","first","isPreEvalVisitor","isPreVisitor","pm","postProcessors","installedPlugins","pluginCache","Loader","PluginLoader","PluginManager","install","preProcessor","priority","indexToInsertAt","postProcessor","manager","PluginManagerFactory","newFactory","sourceMapOutput","sourceMapBuilder","parseTree","importManager","SourceMapBuilder","ParseTree","transformTree","toCSSOptions","sourceMap","getPostProcessors","file","getExternalSourceMap","files","rootFilename","SourceMapOutput","contentsIgnoredCharsMap","contentsMap","sourceMapFilename","sourceMapURL","outputFilename","sourceMapOutputFilename","sourceMapBasepath","sourceMapRootpath","outputSourceFiles","sourceMapGenerator","sourceMapFileInline","disableSourcemapAnnotation","sourceMapInputFilename","normalizeFilename","removeBasepath","getCSSAppendage","_css","_rootNode","_contentsMap","_contentsIgnoredCharsMap","_sourceMapFilename","_outputFilename","_sourceMapBasepath","_sourceMapRootpath","_outputSourceFiles","_sourceMapGeneratorConstructor","getSourceMapGenerator","_lineNumber","_column","sourceLines","columns","sourceColumns","inputSource","_sourceMapGenerator","addMapping","generated","source","sourceRoot","setSourceContent","sourceMapContent","stringify","toJSON","rootFileInfo","mime","queue","ImportManager","pluginLoader","fileParsedFunc","importedEqualsRoot","newFileInfo","loadedFile","promise","loadFileCallback","resolvedFilename","pathDiff","isPathAbsolute","alwaysMakePathsAbsolute","newEnv","evalPlugin","syncImport","loadPluginSync","loadPlugin","loadFile","then","render","utils.copyOptions","self_1","Promise","resolve","reject","Render","context_1","pluginManager_1","reUsePluginManager","imports_1","evalResult","fileContent","initial","data","ctor","api","fileCache","errback","xhr","XMLHttpRequest","async","isFileProtocol","fileAsync","handleResponse","status","responseText","getResponseHeader","overrideMimeType","open","setRequestHeader","send","onreadystatechange","readyState","location","useFileCache","lessText","webInfo","lastModified","Date","doXHR","log","fulfill","catch","rootHref","errorReporting","errors","errorline","classname","logLevel","errorConsole","timer","filenameNoPath","className","innerHTML","browser","style","env","setInterval","replaceChild","clearInterval","errorHTML","remove","removeErrorHTML","depends","lint","insecure","protocol","poll","hostname","port","onReady","addDefaultOptions","LESS_PLUGINS","lessRoot","FM","addFileManager","loggers","console","LogListener","ErrorReporting","cache","localStorage","setCSS","setItem","getCSS","getItem","timestamp","valueOf","Cache","imageSize","imageFunctions","image-size","image-width","image-height","ImageSize","typePattern","thisArg","curryArgs","loadStyles","instanceOptions","loadStyleSheet","reload","remaining","local","loadInitialFileCallback","loadStyleSheets","sheets","watch","watchMode","watchTimer","clearFileCache","unwatch","registerStylesheetsImmediately","links","rel","registerStylesheets","record","refresh","startTime","endTime","totalMilliseconds","remainingSheets","refreshStyles","resolveOrReject","pageLoadFinished"],"mappings":";;;;;;;;;oMACgBA,EAAUC,GACtB,OAAOA,EAAKC,QAAQ,sBAAuB,IACtCA,QAAQ,uBAAwB,IAChCA,QAAQ,MAAO,IACfA,QAAQ,eAAgB,IACxBA,QAAQ,aAAc,KACtBA,QAAQ,MAAO,cAGRC,EAAYC,EAASC,GACjC,IAAK,IAAMC,KAAOD,EAAIE,QAClB,GAAIF,EAAIE,QAAQC,eAAeF,GAC3B,GAAY,QAARA,GAAyB,oBAARA,GAAqC,aAARA,GAA8B,mBAARA,EACpEF,EAAQE,GAAOD,EAAIE,QAAQD,QAE3B,IACIF,EAAQE,GAAOG,KAAKC,MAAML,EAAIE,QAAQD,IAE1C,MAAOK,WChBR,SAAUC,EAAUC,EAAQC,GAEnC,IAAMb,EAAOa,EAAMb,MAAQ,GAGrBc,EAAK,SAAQD,EAAME,OAASC,EAAgBhB,IAG5CiB,EAAeN,EAASO,eAAeJ,GACzCK,GAAmB,EAGjBC,EAAYT,EAASU,cAAc,SACzCD,EAAUE,aAAa,OAAQ,YAC3BT,EAAMU,OACNH,EAAUE,aAAa,QAAST,EAAMU,OAE1CH,EAAUN,GAAKA,EAEVM,EAAUI,aACXJ,EAAUK,YAAYd,EAASe,eAAed,IAG9CO,EAAqC,OAAjBF,GAAyBA,EAAaU,WAAWC,OAAS,GAAKR,EAAUO,WAAWC,OAAS,GAC7GX,EAAaY,WAAWC,YAAcV,EAAUS,WAAWC,WAGnE,IAAMC,EAAOpB,EAASqB,qBAAqB,QAAQ,GAInD,GAAqB,OAAjBf,IAA8C,IAArBE,EAA4B,CACrD,IAAMc,EAASpB,GAASA,EAAMqB,aAAe,KACzCD,EACAA,EAAOE,WAAWC,aAAahB,EAAWa,GAE1CF,EAAKN,YAAYL,GAUzB,GAPIH,IAAqC,IAArBE,GAChBF,EAAakB,WAAWE,YAAYpB,GAMpCG,EAAUI,WACV,IACIJ,EAAUI,WAAWc,QAAU1B,EACjC,MAAO2B,GACL,MAAM,IAAIC,MAAM,6CAIb,SAASC,GACpB,IAEUC,EAFJ/B,EAAW8B,EAAO9B,SACxB,OAAOA,EAASgC,gBACND,EAAU/B,EAASqB,qBAAqB,WAC/BU,EAAQd,OAAS,MC7D7B,CACXgB,MAAO,SAASC,GACZC,KAAKC,WAAW,QAASF,IAE7BG,KAAM,SAASH,GACXC,KAAKC,WAAW,OAAQF,IAE5BI,KAAM,SAASJ,GACXC,KAAKC,WAAW,OAAQF,IAE5BK,MAAO,SAASL,GACZC,KAAKC,WAAW,QAASF,IAE7BM,YAAa,SAASC,GAClBN,KAAKO,WAAWC,KAAKF,IAEzBG,eAAgB,SAASH,GACrB,IAAK,IAAII,EAAI,EAAGA,EAAIV,KAAKO,WAAWzB,OAAQ4B,IACxC,GAAIV,KAAKO,WAAWG,KAAOJ,EAEvB,YADAN,KAAKO,WAAWI,OAAOD,EAAG,IAKtCT,WAAY,SAASW,EAAMb,GACvB,IAAK,IAAIW,EAAI,EAAGA,EAAIV,KAAKO,WAAWzB,OAAQ4B,IAAK,CAC7C,IAAMG,EAAcb,KAAKO,WAAWG,GAAGE,GACnCC,GACAA,EAAYd,KAIxBQ,WAAY,iBCxBZ,WAAYO,EAAqBC,GAC7Bf,KAAKe,aAAeA,GAAgB,GACpCD,EAAsBA,GAAuB,GAM7C,IAJA,IACME,EAAoB,GACpBC,EAAYD,EAAkBE,OAFV,CAAC,eAAgB,aAAc,gBAAiB,0BAIjER,EAAI,EAAGA,EAAIO,EAAUnC,OAAQ4B,IAAK,CACvC,IAAMS,EAAWF,EAAUP,GACrBU,EAAkBN,EAAoBK,GACxCC,EACApB,KAAKmB,GAAYC,EAAgBC,KAAKP,GAC/BJ,EAAIM,EAAkBlC,QAC7BkB,KAAKE,KAAK,8CAA8CiB,IAkCxE,OA7BIG,2BAAA,SAAeC,EAAUC,EAAkBnE,EAASoE,EAAaC,GAExDH,GACDI,EAAOzB,KAAK,kFAEQ,MAApBsB,GACAG,EAAOzB,KAAK,qFAGhB,IAAIa,EAAef,KAAKe,aACpB1D,EAAQuE,gBACRb,EAAe,GAAGG,OAAOH,GAAcG,OAAO7D,EAAQuE,cAAcC,oBAExE,IAAK,IAAInB,EAAIK,EAAajC,OAAS,EAAG4B,GAAK,EAAIA,IAAK,CAChD,IAAMoB,EAAcf,EAAaL,GACjC,GAAIoB,EAAYJ,EAAS,eAAiB,YAAYH,EAAUC,EAAkBnE,EAASoE,GACvF,OAAOK,EAGf,OAAO,MAGXR,2BAAA,SAAeQ,GACX9B,KAAKe,aAAaP,KAAKsB,IAG3BR,8BAAA,WACItB,KAAKe,aAAe,WCtDb,CACXgB,UAAY,UACZC,aAAe,UACfC,KAAO,UACPC,WAAa,UACbC,MAAQ,UACRC,MAAQ,UACRC,OAAS,UACTC,MAAQ,UACRC,eAAiB,UACjBC,KAAO,UACPC,WAAa,UACbC,MAAQ,UACRC,UAAY,UACZC,UAAY,UACZC,WAAa,UACbC,UAAY,UACZC,MAAQ,UACRC,eAAiB,UACjBC,SAAW,UACXC,QAAU,UACVC,KAAO,UACPC,SAAW,UACXC,SAAW,UACXC,cAAgB,UAChBC,SAAW,UACXC,SAAW,UACXC,UAAY,UACZC,UAAY,UACZC,YAAc,UACdC,eAAiB,UACjBC,WAAa,UACbC,WAAa,UACbC,QAAU,UACVC,WAAa,UACbC,aAAe,UACfC,cAAgB,UAChBC,cAAgB,UAChBC,cAAgB,UAChBC,cAAgB,UAChBC,WAAa,UACbC,SAAW,UACXC,YAAc,UACdC,QAAU,UACVC,QAAU,UACVC,WAAa,UACbC,UAAY,UACZC,YAAc,UACdC,YAAc,UACdC,QAAU,UACVC,UAAY,UACZC,WAAa,UACbC,KAAO,UACPC,UAAY,UACZC,KAAO,UACPC,KAAO,UACPC,MAAQ,UACRC,YAAc,UACdC,SAAW,UACXC,QAAU,UACVC,UAAY,UACZC,OAAS,UACTC,MAAQ,UACRC,MAAQ,UACRC,SAAW,UACXC,cAAgB,UAChBC,UAAY,UACZC,aAAe,UACfC,UAAY,UACZC,WAAa,UACbC,UAAY,UACZC,qBAAuB,UACvBC,UAAY,UACZC,UAAY,UACZC,WAAa,UACbC,UAAY,UACZC,YAAc,UACdC,cAAgB,UAChBC,aAAe,UACfC,eAAiB,UACjBC,eAAiB,UACjBC,eAAiB,UACjBC,YAAc,UACdC,KAAO,UACPC,UAAY,UACZC,MAAQ,UACRC,QAAU,UACVC,OAAS,UACTC,iBAAmB,UACnBC,WAAa,UACbC,aAAe,UACfC,aAAe,UACfC,eAAiB,UACjBC,gBAAkB,UAClBC,kBAAoB,UACpBC,gBAAkB,UAClBC,gBAAkB,UAClBC,aAAe,UACfC,UAAY,UACZC,UAAY,UACZC,SAAW,UACXC,YAAc,UACdC,KAAO,UACPC,QAAU,UACVC,MAAQ,UACRC,UAAY,UACZC,OAAS,UACTC,UAAY,UACZC,OAAS,UACTC,cAAgB,UAChBC,UAAY,UACZC,cAAgB,UAChBC,cAAgB,UAChBC,WAAa,UACbC,UAAY,UACZC,KAAO,UACPC,KAAO,UACPC,KAAO,UACPC,WAAa,UACbC,OAAS,UACTC,cAAgB,UAChBC,IAAM,UACNC,UAAY,UACZC,UAAY,UACZC,YAAc,UACdC,OAAS,UACTC,WAAa,UACbC,SAAW,UACXC,SAAW,UACXC,OAAS,UACTC,OAAS,UACTC,QAAU,UACVC,UAAY,UACZC,UAAY,UACZC,UAAY,UACZC,KAAO,UACPC,YAAc,UACdC,UAAY,UACZC,IAAM,UACNC,KAAO,UACPC,QAAU,UACVC,OAAS,UACTC,UAAY,UACZC,OAAS,UACTC,MAAQ,UACRC,MAAQ,UACRC,WAAa,UACbC,OAAS,UACTC,YAAc,aCpJH,CACXpM,OAAQ,CACJqM,EAAK,EACLC,GAAM,IACNC,GAAM,KACNC,GAAM,MACNC,GAAM,MAAS,GACfC,GAAM,MAAS,GACfC,GAAM,MAAS,GAAK,IAExBC,SAAU,CACNC,EAAK,EACLC,GAAM,MAEVC,MAAO,CACHC,IAAO,GAAK,EAAIC,KAAKC,IACrBC,IAAO,EAAI,IACXC,KAAQ,EAAI,IACZC,KAAQ,MCfD,CAAEC,SAAQC,gCCFrB,aACIrM,KAAKsM,OAAS,KACdtM,KAAKuM,sBAAmBC,EACxBxM,KAAKyM,iBAAcD,EACnBxM,KAAK0M,SAAW,KAChB1M,KAAK2M,OAAS,KAEd,IAAMC,EAAO5M,KACb6M,OAAOC,eAAe9M,KAAM,kBAAmB,CAC3C+M,IAAK,WAAa,OAAOH,EAAKI,cAElCH,OAAOC,eAAe9M,KAAM,QAAS,CACjC+M,IAAK,WAAa,OAAOH,EAAKK,cAmK1C,OA9JIC,sBAAA,SAAUC,EAAOb,GACb,SAASc,EAAIC,GACLA,GAAQA,aAAgBH,IACxBG,EAAKf,OAASA,GAGlBgB,MAAMC,QAAQJ,GACdA,EAAMK,QAAQJ,GAGdA,EAAID,IAIZD,qBAAA,WACI,OAAOlN,KAAKyN,QAAWzN,KAAKsM,QAAUtM,KAAKsM,OAAOW,YAAe,GAGrEC,qBAAA,WACI,OAAOlN,KAAK0N,WAAc1N,KAAKsM,QAAUtM,KAAKsM,OAAOU,YAAe,IAGxEE,0BAAA,WAAkB,OAAO,GAEzBA,kBAAA,SAAMS,GACF,IAAMC,EAAO,GASb,OARA5N,KAAK6N,OAAOF,EAAS,CACjBG,IAAK,SAASC,EAAOf,EAAUgB,GAC3BJ,EAAKpN,KAAKuN,IAEdE,QAAS,WACL,OAAuB,IAAhBL,EAAK9O,UAGb8O,EAAKM,KAAK,KAGrBhB,mBAAA,SAAOS,EAASQ,GACZA,EAAOL,IAAI9N,KAAKoO,QAGpBlB,mBAAA,SAAOmB,GACHrO,KAAKoO,MAAQC,EAAQC,MAAMtO,KAAKoO,QAGpClB,iBAAA,WAAS,OAAOlN,MAEhBkN,qBAAA,SAASS,EAASY,EAAIC,EAAGC,GACrB,OAAQF,GACJ,IAAK,IAAK,OAAOC,EAAIC,EACrB,IAAK,IAAK,OAAOD,EAAIC,EACrB,IAAK,IAAK,OAAOD,EAAIC,EACrB,IAAK,IAAK,OAAOD,EAAIC,IAI7BvB,mBAAA,SAAOS,EAASS,GACZ,IAAMM,EAAYf,GAAWA,EAAQgB,aAErC,OAAO,EAAcC,QAAQR,EAAQ,OAAOS,QAAQH,IAAcN,GAG/DlB,UAAP,SAAesB,EAAGC,GAOd,GAAKD,EAAS,SAGG,WAAXC,EAAE7N,MAAgC,cAAX6N,EAAE7N,KAC3B,OAAO4N,EAAEM,QAAQL,GACd,GAAIA,EAAEK,QACT,OAAQL,EAAEK,QAAQN,GACf,GAAIA,EAAE5N,OAAS6N,EAAE7N,KAAjB,CAMP,GAFA4N,EAAIA,EAAEJ,MACNK,EAAIA,EAAEL,OACDd,MAAMC,QAAQiB,GACf,OAAOA,IAAMC,EAAI,OAAIjC,EAEzB,GAAIgC,EAAE1P,SAAW2P,EAAE3P,OAAnB,CAGA,IAAK,IAAI4B,EAAI,EAAGA,EAAI8N,EAAE1P,OAAQ4B,IAC1B,GAAiC,IAA7BwM,EAAK4B,QAAQN,EAAE9N,GAAI+N,EAAE/N,IACrB,OAGR,OAAO,KAGJwM,iBAAP,SAAsBsB,EAAGC,GACrB,OAAOD,EAAMC,GAAK,EACZD,IAAMC,EAAK,EACPD,EAAMC,EAAK,OAAIjC,GAI7BU,6BAAA,WAII,OAH6B,MAAzBlN,KAAKuM,mBACLvM,KAAKuM,iBAAmB,GAEK,IAA1BvM,KAAKuM,kBAGhBW,+BAAA,WACiC,MAAzBlN,KAAKuM,mBACLvM,KAAKuM,iBAAmB,GAE5BvM,KAAKuM,iBAAmBvM,KAAKuM,iBAAmB,GAGpDW,kCAAA,WACiC,MAAzBlN,KAAKuM,mBACLvM,KAAKuM,iBAAmB,GAE5BvM,KAAKuM,iBAAmBvM,KAAKuM,iBAAmB,GAKpDW,6BAAA,WACIlN,KAAKyM,aAAc,GAKvBS,+BAAA,WACIlN,KAAKyM,aAAc,GAOvBS,sBAAA,WACI,OAAOlN,KAAKyM,aAGhBS,2BAAA,WACI,MAAO,CACHX,iBAAkBvM,KAAKuM,iBACvBE,YAAazM,KAAKyM,cAI1BS,+BAAA,SAAmB/M,GACVA,IAGLH,KAAKuM,iBAAmBpM,EAAKoM,iBAC7BvM,KAAKyM,YAActM,EAAKsM,mBC9J5BsC,EAAgB,SAASC,EAAGP,GAI5B,OAHAM,EAAgBlC,OAAOoC,gBAClB,CAAEC,UAAW,cAAgB5B,OAAS,SAAU0B,EAAGP,GAAKO,EAAEE,UAAYT,IACvE,SAAUO,EAAGP,GAAK,IAAK,IAAIU,KAAKV,EAAOA,EAAEhR,eAAe0R,KAAIH,EAAEG,GAAKV,EAAEU,MACpDH,EAAGP,aAGZW,EAAUJ,EAAGP,GAEzB,SAASY,IAAOrP,KAAKsP,YAAcN,EADnCD,EAAcC,EAAGP,GAEjBO,EAAEO,UAAkB,OAANd,EAAa5B,OAAO2C,OAAOf,IAAMY,EAAGE,UAAYd,EAAEc,UAAW,IAAIF,GAG5E,IAAII,EAAW,WAQlB,OAPAA,EAAW5C,OAAO6C,QAAU,SAAkBC,GAC1C,IAAK,IAAIhE,EAAGjL,EAAI,EAAGkP,EAAIC,UAAU/Q,OAAQ4B,EAAIkP,EAAGlP,IAE5C,IAAK,IAAIyO,KADTxD,EAAIkE,UAAUnP,GACOmM,OAAO0C,UAAU9R,eAAeqS,KAAKnE,EAAGwD,KAAIQ,EAAER,GAAKxD,EAAEwD,IAE9E,OAAOQ,IAEKI,MAAM/P,KAAM6P,YC/BhC,kBACI,WAAYG,EAAKxB,EAAGyB,GAApB,MACIC,mBAEMtD,EAAOuD,SAOT7C,MAAMC,QAAQyC,GACdG,EAAKH,IAAMA,EACJA,EAAIlR,QAAU,GACrBqR,EAAKH,IAAM,GACXA,EAAII,MAAM,SAASC,KAAI,SAAUC,EAAG5P,GAC5BA,EAAI,EACJkM,EAAKoD,IAAIxP,KAAK+P,SAASD,EAAG,KAE1B1D,EAAK4D,MAASD,SAASD,EAAG,IAAO,SAIzCH,EAAKH,IAAM,GACXA,EAAIS,MAAM,IAAIJ,KAAI,SAAUC,EAAG5P,GACvBA,EAAI,EACJkM,EAAKoD,IAAIxP,KAAK+P,SAASD,EAAIA,EAAG,KAE9B1D,EAAK4D,MAASD,SAASD,EAAIA,EAAG,IAAO,QAIjDH,EAAKK,MAAQL,EAAKK,QAAuB,iBAANhC,EAAiBA,EAAI,QAC5B,IAAjByB,IACPE,EAAK/B,MAAQ6B,KAyLzB,OA3NoBb,OAsChBsB,iBAAA,WACI,IAAIC,EAAI3Q,KAAKgQ,IAAI,GAAK,IAAKY,EAAI5Q,KAAKgQ,IAAI,GAAK,IAAKvB,EAAIzO,KAAKgQ,IAAI,GAAK,IAMpE,MAAO,OAJPW,EAAKA,GAAK,OAAWA,EAAI,MAAQ5E,KAAK8E,KAAMF,EAAI,MAAS,MAAQ,MAI7C,OAHpBC,EAAKA,GAAK,OAAWA,EAAI,MAAQ7E,KAAK8E,KAAMD,EAAI,MAAS,MAAQ,MAGhC,OAFjCnC,EAAKA,GAAK,OAAWA,EAAI,MAAQ1C,KAAK8E,KAAMpC,EAAI,MAAS,MAAQ,OAKrEiC,mBAAA,SAAO/C,EAASQ,GACZA,EAAOL,IAAI9N,KAAK8Q,MAAMnD,KAG1B+C,kBAAA,SAAM/C,EAASoD,GACX,IACIC,EACAR,EACAS,EAHEC,EAAWvD,GAAWA,EAAQuD,WAAaH,EAI7CI,EAAO,GAOX,GAFAX,EAAQxQ,KAAKoR,OAAOzD,EAAS3N,KAAKwQ,OAE9BxQ,KAAKoO,MACL,GAAkC,IAA9BpO,KAAKoO,MAAMiD,QAAQ,OACfb,EAAQ,IACRS,EAAgB,YAEjB,CAAA,GAAkC,IAA9BjR,KAAKoO,MAAMiD,QAAQ,OAO1B,OAAOrR,KAAKoO,MALR6C,EADAT,EAAQ,EACQ,OAEA,WAMpBA,EAAQ,IACRS,EAAgB,QAIxB,OAAQA,GACJ,IAAK,OACDE,EAAOnR,KAAKgQ,IAAIK,KAAI,SAAUC,GAC1B,OAAOgB,EAAMvF,KAAKwF,MAAMjB,GAAI,QAC7BpP,OAAOoQ,EAAMd,EAAO,IACvB,MACJ,IAAK,OACDW,EAAK3Q,KAAK8Q,EAAMd,EAAO,IAC3B,IAAK,MACDQ,EAAQhR,KAAKwR,QACbL,EAAO,CACHnR,KAAKoR,OAAOzD,EAASqD,EAAMS,GACxBzR,KAAKoR,OAAOzD,EAAmB,IAAVqD,EAAMrF,OAC3B3L,KAAKoR,OAAOzD,EAAmB,IAAVqD,EAAMU,QAChCxQ,OAAOiQ,GAGjB,GAAIF,EAEA,OAAUA,MAAiBE,EAAKjD,KAAK,KAAIgD,EAAW,GAAK,UAK7D,GAFAF,EAAQhR,KAAK2R,QAETT,EAAU,CACV,IAAMU,EAAaZ,EAAMP,MAAM,IAG3BmB,EAAW,KAAOA,EAAW,IAAMA,EAAW,KAAOA,EAAW,IAAMA,EAAW,KAAOA,EAAW,KACnGZ,EAAQ,IAAIY,EAAW,GAAKA,EAAW,GAAKA,EAAW,IAI/D,OAAOZ,GASXN,oBAAA,SAAQ/C,EAASY,EAAIsD,GAGjB,IAFA,IAAM7B,EAAM,IAAI1C,MAAM,GAChBkD,EAAQxQ,KAAKwQ,OAAS,EAAIqB,EAAMrB,OAASqB,EAAMrB,MAC5CF,EAAI,EAAGA,EAAI,EAAGA,IACnBN,EAAIM,GAAKtQ,KAAK8R,SAASnE,EAASY,EAAIvO,KAAKgQ,IAAIM,GAAIuB,EAAM7B,IAAIM,IAE/D,OAAO,IAAII,EAAMV,EAAKQ,IAG1BE,kBAAA,WACI,OAAOqB,EAAM/R,KAAKgQ,MAGtBU,kBAAA,WACI,IAGIe,EACA9F,EAJEgF,EAAI3Q,KAAKgQ,IAAI,GAAK,IAAKY,EAAI5Q,KAAKgQ,IAAI,GAAK,IAAKvB,EAAIzO,KAAKgQ,IAAI,GAAK,IAAKxB,EAAIxO,KAAKwQ,MAE9EwB,EAAMjG,KAAKiG,IAAIrB,EAAGC,EAAGnC,GAAIwD,EAAMlG,KAAKkG,IAAItB,EAAGC,EAAGnC,GAG9CiD,GAAKM,EAAMC,GAAO,EAClBjD,EAAIgD,EAAMC,EAEhB,GAAID,IAAQC,EACRR,EAAI9F,EAAI,MACL,CAGH,OAFAA,EAAI+F,EAAI,GAAM1C,GAAK,EAAIgD,EAAMC,GAAOjD,GAAKgD,EAAMC,GAEvCD,GACJ,KAAKrB,EAAGc,GAAKb,EAAInC,GAAKO,GAAK4B,EAAInC,EAAI,EAAI,GAAI,MAC3C,KAAKmC,EAAGa,GAAKhD,EAAIkC,GAAK3B,EAAI,EAAiB,MAC3C,KAAKP,EAAGgD,GAAKd,EAAIC,GAAK5B,EAAI,EAE9ByC,GAAK,EAET,MAAO,CAAEA,EAAO,IAAJA,EAAS9F,IAAG+F,IAAGlD,MAI/BkC,kBAAA,WACI,IAGIe,EACA9F,EAJEgF,EAAI3Q,KAAKgQ,IAAI,GAAK,IAAKY,EAAI5Q,KAAKgQ,IAAI,GAAK,IAAKvB,EAAIzO,KAAKgQ,IAAI,GAAK,IAAKxB,EAAIxO,KAAKwQ,MAE9EwB,EAAMjG,KAAKiG,IAAIrB,EAAGC,EAAGnC,GAAIwD,EAAMlG,KAAKkG,IAAItB,EAAGC,EAAGnC,GAG9CyD,EAAIF,EAEJhD,EAAIgD,EAAMC,EAOhB,GALItG,EADQ,IAARqG,EACI,EAEAhD,EAAIgD,EAGRA,IAAQC,EACRR,EAAI,MACD,CACH,OAAQO,GACJ,KAAKrB,EAAGc,GAAKb,EAAInC,GAAKO,GAAK4B,EAAInC,EAAI,EAAI,GAAI,MAC3C,KAAKmC,EAAGa,GAAKhD,EAAIkC,GAAK3B,EAAI,EAAG,MAC7B,KAAKP,EAAGgD,GAAKd,EAAIC,GAAK5B,EAAI,EAE9ByC,GAAK,EAET,MAAO,CAAEA,EAAO,IAAJA,EAAS9F,IAAGuG,IAAG1D,MAG/BkC,mBAAA,WACI,OAAOqB,EAAM,CAAc,IAAb/R,KAAKwQ,OAAatP,OAAOlB,KAAKgQ,OAGhDU,oBAAA,SAAQyB,GACJ,OAAQA,EAAEnC,KACNmC,EAAEnC,IAAI,KAAOhQ,KAAKgQ,IAAI,IACtBmC,EAAEnC,IAAI,KAAOhQ,KAAKgQ,IAAI,IACtBmC,EAAEnC,IAAI,KAAOhQ,KAAKgQ,IAAI,IACtBmC,EAAE3B,QAAWxQ,KAAKwQ,MAAS,OAAIhE,GAGhCkE,cAAP,SAAmB0B,GACf,IAAI9B,EACE+B,EAAMD,EAAQE,cAQpB,GAPIlG,EAAO3O,eAAe4U,GACtB/B,EAAI,IAAII,EAAMtE,EAAOiG,GAAKE,MAAM,IAEnB,gBAARF,IACL/B,EAAI,IAAII,EAAM,CAAC,EAAG,EAAG,GAAI,IAGzBJ,EAEA,OADAA,EAAElC,MAAQgE,EACH9B,MAxNCpD,GA+NpB,SAASoE,EAAMY,EAAGF,GACd,OAAOjG,KAAKkG,IAAIlG,KAAKiG,IAAIE,EAAG,GAAIF,GAGpC,SAASD,EAAMG,GACX,MAAO,IAAIA,EAAE7B,KAAI,SAAUC,GAE3B,QADAA,EAAIgB,EAAMvF,KAAKwF,MAAMjB,GAAI,MACb,GAAK,IAAM,IAAMA,EAAEkC,SAAS,OACzCtE,KAAK,IAVRwC,EAAMnB,UAAU3O,KAAO,QCjOvB,kBACI,WAAYyM,GAAZ,MACI6C,0BAEAC,EAAK/B,MAAQf,IAYrB,OAhBoB+B,OAOhBqD,mBAAA,SAAO9E,EAASQ,GACZA,EAAOL,IAAI,KACX9N,KAAKoO,MAAMP,OAAOF,EAASQ,GAC3BA,EAAOL,IAAI,MAGf2E,iBAAA,SAAK9E,GACD,OAAO,IAAI8E,EAAMzS,KAAKoO,MAAMsE,KAAK/E,QAdrBT,GAkBpBuF,EAAMlD,UAAU3O,KAAO,QCnBvB,IAAM+R,EAAsB,CACxB,IAAI,EACJC,KAAK,EACLC,KAAK,iBAIL,WAAYzE,GAAZ,MACI8B,yBAEc,MAAV9B,GACA+B,EAAK/B,MAAQ,IACb+B,EAAK2C,mBAAoB,IAEzB3C,EAAK/B,MAAQA,EAAQA,EAAM2E,OAAS,GACpC5C,EAAK2C,kBAAmC,KAAf3C,EAAK/B,SAQ1C,OAjByBgB,OAarB4D,mBAAA,SAAOrF,EAASQ,GACZ,IAAM8E,EAAgBtF,EAAQuD,UAAYyB,EAAoB3S,KAAKoO,OAAU,GAAK,IAClFD,EAAOL,IAAImF,EAAejT,KAAKoO,MAAQ6E,OAftB/F,GAmBzB8F,EAAWzD,UAAU3O,KAAO,aCtB5B,kBACI,WAAYsS,EAAY9E,EAAO+E,EAAYnF,EAAOoF,EAAiBC,GAAnE,MACInD,0BAEAC,EAAK+C,WAAaA,aAAsBF,EACpCE,EAAa,IAAIF,EAAWE,GAG5B/C,EAAK/B,MADY,iBAAVA,EACMA,EAAM2E,OACZ3E,GAGM,GAEjB+B,EAAKgD,WAAaA,EAClBhD,EAAK1C,OAASO,EACdmC,EAAKzC,UAAY0F,EACjBjD,EAAKmD,mBAAmBD,GACxBlD,EAAKoD,UAAUpD,EAAK+C,WAAY/C,KAgDxC,OAlEsBf,OAqBlBoE,mBAAA,SAAOnF,GACH,IAAMD,EAAQpO,KAAKoO,MACnBpO,KAAKkT,WAAa7E,EAAQC,MAAMtO,KAAKkT,YAChB,iBAAV9E,IACPpO,KAAKoO,MAAQC,EAAQC,MAAMF,KAInCoF,iBAAA,SAAK7F,GACD,OAAO,IAAI6F,EAAQxT,KAAKkT,WACpBlT,KAAKoO,MAAMsE,KAAO1S,KAAKoO,MAAMsE,KAAK/E,GAAW3N,KAAKoO,MAClDpO,KAAKmT,WACLnT,KAAKiN,WACLjN,KAAKgN,WAAYhN,KAAKqT,mBAG9BG,kBAAA,WACI,OAAO,IAAIA,EAAQxT,KAAKkT,WACpBlT,KAAKoO,MACLpO,KAAKmT,WACLnT,KAAKiN,WACLjN,KAAKgN,WAAYhN,KAAKqT,mBAG9BG,mBAAA,SAAO7F,EAASQ,GACZA,EAAOL,IAAI9N,KAAK8Q,MAAMnD,GAAU3N,KAAKgN,WAAYhN,KAAKiN,aAG1DuG,kBAAA,SAAM7F,GACFA,EAAUA,GAAW,GACrB,IAAIS,EAAQpO,KAAKoO,MACXqF,EAAgB9F,EAAQ8F,cAQ9B,OAPIrF,aAAiBqE,IAGjB9E,EAAQ8F,eAAgB,GAE5BrF,EAAQA,EAAM0C,MAAQ1C,EAAM0C,MAAMnD,GAAWS,EAC7CT,EAAQ8F,cAAgBA,EACV,KAAVrF,GAAoD,MAApCpO,KAAKkT,WAAW9E,MAAMsF,OAAO,GACtC,GAEA1T,KAAKkT,WAAWpC,MAAMnD,GAAWS,MA/D9BlB,GAoEtBsG,EAAQjE,UAAU3O,KAAO,UCvElB,IAAMmL,EAAO,CAChB4H,OAAQ,EACRC,gBAAiB,EACjBC,OAAQ,GAICC,EACJ,EADIA,EAEF,EAFEA,EAGJ,WCROC,EAAY/F,EAAOgG,GAK/B,IAJA,IAAIpE,EAAI5B,EAAQ,EACZiG,EAAO,KACPC,GAAU,IAELtE,GAAK,GAA+B,OAA1BoE,EAAYN,OAAO9D,IAClCsE,IAOJ,MAJqB,iBAAVlG,IACPiG,GAAQD,EAAYzB,MAAM,EAAGvE,GAAOoC,MAAM,QAAU,IAAItR,QAGrD,CACHmV,OACAC,mBAIQC,EAAUC,GACtB,IAAI1T,EACE5B,EAASsV,EAAItV,OACbuV,EAAO,IAAI/G,MAAMxO,GAEvB,IAAK4B,EAAI,EAAGA,EAAI5B,EAAQ4B,IACpB2T,EAAK3T,GAAK0T,EAAI1T,GAElB,OAAO2T,WAGKC,EAAMC,GAClB,IAAMC,EAAS,GACf,IAAK,IAAMC,KAAQF,EACXA,EAAI9W,eAAegX,KACnBD,EAAOC,GAAQF,EAAIE,IAG3B,OAAOD,WAGKE,EAASC,EAAMC,GAC3B,IAAIC,EAASD,GAAQ,GACrB,IAAKA,EAAKE,UAAW,CACjBD,EAAS,GACT,IAAME,OAAeJ,GACrBE,EAAOC,UAAYC,EACnB,IAAMP,EAASI,OAAWA,GAAQ,GAClC/H,OAAO6C,OAAOmF,EAAQE,EAAUP,GAEpC,OAAOK,WAGKG,EAAYL,EAAMC,GAC9B,GAAIA,GAAQA,EAAKE,UACb,OAAOF,EAEX,IAAMK,EAAOP,EAASC,EAAMC,GAQ5B,GAPIK,EAAKC,aACLD,EAAKE,KAAOC,EAAevB,QAG3BoB,EAAKI,eACLJ,EAAKK,YAAcC,GAEE,iBAAdN,EAAKE,KACZ,OAAQF,EAAKE,KAAK7C,eACd,IAAK,SACD2C,EAAKE,KAAOC,EAAezB,OAC3B,MACJ,IAAK,kBACDsB,EAAKE,KAAOC,EAAexB,gBAC3B,MACJ,IAAK,SACL,IAAK,SACDqB,EAAKE,KAAOC,EAAevB,OAC3B,MACJ,QACIoB,EAAKE,KAAOC,EAAevB,OAGvC,GAAgC,iBAArBoB,EAAKK,YACZ,OAAQL,EAAKK,YAAYhD,eACrB,IAAK,MACD2C,EAAKK,YAAcC,EACnB,MACJ,IAAK,QACDN,EAAKK,YAAcC,EACnB,MACJ,IAAK,MACDN,EAAKK,YAAcC,EAI/B,OAAON,WAYKO,EAAapB,EAAKqB,gBAAAA,MAC9B,IAAK,IAAI/U,EAAI,EAAGgV,EAAStB,EAAItV,OAAQ4B,EAAIgV,EAAQhV,IAAK,CAClD,IAAM0N,EAAQgG,EAAI1T,GACd4M,MAAMC,QAAQa,GACdoH,EAAapH,EAAOqH,QAENjJ,IAAV4B,GACAqH,EAAOjV,KAAK4N,GAIxB,OAAOqH,gHApBWd,EAAMC,GACxB,IAAK,IAAMH,KAAQG,EACXA,EAAKnX,eAAegX,KACpBE,EAAKF,GAAQG,EAAKH,IAG1B,OAAOE,oBCvGLgB,EAAgB,qCAwBhBC,EAAY,SAASnW,EAAGoW,EAAgBC,GAC1CpW,MAAMoQ,KAAK9P,MAEX,IAAMuB,EAAW9B,EAAE8B,UAAYuU,EAK/B,GAHA9V,KAAK+V,QAAUtW,EAAEsW,QACjB/V,KAAKgW,MAAQvW,EAAEuW,MAEXH,GAAkBtU,EAAU,CAC5B,IAAM0U,EAAQJ,EAAeK,SAAS3U,GAChC4U,EAAMC,EAAkB3W,EAAEuO,MAAOiI,GACnChC,EAAOkC,EAAIlC,KACToC,EAAOF,EAAIjC,OACXoC,EAAW7W,EAAEqQ,MAAQsG,EAAkB3W,EAAEqQ,KAAMmG,GAAOhC,KACtDsC,EAAQN,EAAQA,EAAMxF,MAAM,MAAQ,GAQ1C,GANAzQ,KAAKY,KAAOnB,EAAEmB,MAAQ,SACtBZ,KAAKuB,SAAWA,EAChBvB,KAAKgO,MAAQvO,EAAEuO,MACfhO,KAAKiU,KAAuB,iBAATA,EAAoBA,EAAO,EAAI,KAClDjU,KAAKkU,OAASmC,GAETrW,KAAKiU,MAAQjU,KAAKgW,MAAO,CAC1B,IAAMQ,EAAQxW,KAAKgW,MAAM5F,MAAMuF,GASzBc,EAAO,IAAIC,SAAS,IAAK,qBAC3BC,EAAa,EACjB,IACIF,IACF,MAAOhX,GACL,IAAM2Q,EAAQ3Q,EAAEuW,MAAM5F,MAAMuF,GAE5BgB,EAAa,GADT1C,EAAO1D,SAASH,EAAM,KAI1BoG,IACIA,EAAM,KACNxW,KAAKiU,KAAO1D,SAASiG,EAAM,IAAMG,GAEjCH,EAAM,KACNxW,KAAKkU,OAAS3D,SAASiG,EAAM,MAKzCxW,KAAKsW,SAAWA,EAAW,EAC3BtW,KAAK4W,YAAcL,EAAMD,GAEzBtW,KAAK6W,QAAU,CACXN,EAAMvW,KAAKiU,KAAO,GAClBsC,EAAMvW,KAAKiU,KAAO,GAClBsC,EAAMvW,KAAKiU,SAMvB,QAA6B,IAAlBpH,OAAO2C,OAAwB,CACtC,IAAMsH,EAAI,aACVA,EAAEvH,UAAY7P,MAAM6P,UACpBqG,EAAUrG,UAAY,IAAIuH,OAE1BlB,EAAUrG,UAAY1C,OAAO2C,OAAO9P,MAAM6P,WAG9CqG,EAAUrG,UAAUD,YAAcsG,EASlCA,EAAUrG,UAAUiD,SAAW,SAASnV,GACpCA,EAAUA,GAAW,GAErB,IAAI0Y,EAAU,GACRc,EAAU7W,KAAK6W,SAAW,GAC5B/W,EAAQ,GACRiX,EAAU,SAAUC,GAAO,OAAOA,GACtC,GAAI3Z,EAAQ0Z,QAAS,CACjB,IAAMnW,SAAcvD,EAAQ0Z,QAC5B,GAAa,aAATnW,EACA,MAAMlB,MAAM,+CAA+CkB,OAE/DmW,EAAU1Z,EAAQ0Z,QAGtB,GAAkB,OAAd/W,KAAKiU,KAAe,CAKpB,GAJ0B,iBAAf4C,EAAQ,IACf/W,EAAMU,KAAKuW,EAAW/W,KAAKiU,KAAO,MAAK4C,EAAQ,GAAM,SAG/B,iBAAfA,EAAQ,GAAiB,CAChC,IAAII,EAAcjX,KAAKiU,SACnB4C,EAAQ,KACRI,GAAYJ,EAAQ,GAAGtE,MAAM,EAAGvS,KAAKkU,QACjC6C,EAAQA,EAAQA,EAAQF,EAAQ,GAAGK,OAAOlX,KAAKkU,OAAQ,GAAI,QACvD2C,EAAQ,GAAGtE,MAAMvS,KAAKkU,OAAS,GAAI,OAAQ,YAEvDpU,EAAMU,KAAKyW,GAGW,iBAAfJ,EAAQ,IACf/W,EAAMU,KAAKuW,EAAW/W,KAAKiU,KAAO,MAAK4C,EAAQ,GAAM,SAEzD/W,EAAWA,EAAMoO,KAAK,MAAQ6I,EAAQ,GAAI,cAkB9C,OAfAhB,GAAWgB,EAAW/W,KAAKY,eAAcZ,KAAK+V,QAAW,OACrD/V,KAAKuB,WACLwU,GAAWgB,EAAQ,OAAQ,OAAS/W,KAAKuB,UAEzCvB,KAAKiU,OACL8B,GAAWgB,EAAQ,YAAY/W,KAAKiU,kBAAgBjU,KAAKkU,OAAS,OAAM,SAG5E6B,GAAW,KAAKjW,EAEZE,KAAKsW,WACLP,GAAcgB,EAAQ,QAAS,QAAU/W,KAAKuB,UAAY,SAC1DwU,GAAcgB,EAAQ/W,KAAKsW,SAAU,YAAWtW,KAAK4W,kBAGlDb,GC1JX,kBACI,WAAYoB,EAAUC,EAAYC,EAAWrJ,EAAOoF,EAAiBC,GAArE,MACInD,0BAEAC,EAAKiH,WAAaA,EAClBjH,EAAKkH,UAAYA,EACjBlH,EAAKmH,gBAAkBD,EACvBlH,EAAK1C,OAASO,EACdmC,EAAKzC,UAAY0F,EACjBjD,EAAKgH,SAAWhH,EAAKoH,YAAYJ,GACjChH,EAAKqH,oBAAiBhL,EACtB2D,EAAKmD,mBAAmBD,GACxBlD,EAAKoD,UAAUpD,EAAKgH,SAAUhH,KA8HtC,OA1IuBf,OAenBqI,mBAAA,SAAOpJ,GACCrO,KAAKmX,WACLnX,KAAKmX,SAAW9I,EAAQqJ,WAAW1X,KAAKmX,WAExCnX,KAAKoX,aACLpX,KAAKoX,WAAa/I,EAAQqJ,WAAW1X,KAAKoX,aAE1CpX,KAAKqX,YACLrX,KAAKqX,UAAYhJ,EAAQC,MAAMtO,KAAKqX,aAI5CI,0BAAA,SAAcN,EAAUC,EAAYE,GAEhC,IAAMK,EAAc,IAAIF,EADxBN,EAAWnX,KAAKuX,YAAYJ,GACeC,GAAcpX,KAAKoX,WAC1D,KAAMpX,KAAKiN,WAAYjN,KAAKgN,WAAYhN,KAAKqT,kBAGjD,OAFAsE,EAAYL,eAAoC,MAAlBA,EAA0BA,EAAiBtX,KAAKsX,eAC9EK,EAAYC,WAAa5X,KAAK4X,WACvBD,GAGXF,wBAAA,SAAYI,GACR,OAAKA,GAGc,iBAARA,GACP7X,KAAKrC,MAAMma,UACPD,EACA,CAAC,YACD7X,KAAKyN,OACLzN,KAAK0N,WACL,SAASqK,EAAKtC,GACV,GAAIsC,EACA,MAAM,IAAInC,EAAU,CAChB5H,MAAO+J,EAAI/J,MACX+H,QAASgC,EAAIhC,SACd/V,KAAKrC,MAAMqa,QAAShY,KAAK0N,UAAUnM,UAE1CsW,EAAMpC,EAAO,GAAG0B,YAGrBU,GAlBI,CAAC,IAAIrE,EAAQ,GAAI,KAAK,EAAOxT,KAAKyN,OAAQzN,KAAK0N,aAqB9D+J,iCAAA,WACI,IAAqEQ,EAAO,CAAC,IAAIR,EAAS,CAA/E,IAAIjE,EAAQ,GAAI,KAAK,EAAOxT,KAAKyN,OAAQzN,KAAK0N,YAAuC,KAAM,KAAM1N,KAAKyN,OAAQzN,KAAK0N,YAE9H,OADAuK,EAAK,GAAGL,YAAa,EACdK,GAGXR,kBAAA,SAAM5F,GACF,IAEIqG,EACAxX,EAHEyW,EAAWnX,KAAKmX,SAChBgB,EAAMhB,EAASrY,OAMrB,GAAa,KADboZ,GADArG,EAAQA,EAAMuG,iBACDtZ,SACKqZ,EAAMD,EACpB,OAAO,EAEP,IAAKxX,EAAI,EAAGA,EAAIwX,EAAMxX,IAClB,GAAIyW,EAASzW,GAAG0N,QAAUyD,EAAMnR,GAC5B,OAAO,EAKnB,OAAOwX,GAGXT,0BAAA,WACI,GAAIzX,KAAKwX,eACL,OAAOxX,KAAKwX,eAGhB,IAAIL,EAAWnX,KAAKmX,SAAS9G,KAAK,SAAS6B,GACvC,OAAOA,EAAEgB,WAAW9E,OAAS8D,EAAE9D,MAAMA,OAAS8D,EAAE9D,UACjDF,KAAK,IAAIkC,MAAM,+BAUlB,OARI+G,EACoB,MAAhBA,EAAS,IACTA,EAASkB,QAGblB,EAAW,GAGPnX,KAAKwX,eAAiBL,GAGlCM,iCAAA,WACI,OAAQzX,KAAK4X,YACgB,IAAzB5X,KAAKmX,SAASrY,QACa,MAA3BkB,KAAKmX,SAAS,GAAG/I,QACsB,MAAtCpO,KAAKmX,SAAS,GAAGjE,WAAW9E,OAAuD,KAAtCpO,KAAKmX,SAAS,GAAGjE,WAAW9E,QAGlFqJ,iBAAA,SAAK9J,GACD,IAAM2J,EAAiBtX,KAAKqX,WAAarX,KAAKqX,UAAU3E,KAAK/E,GACzDwJ,EAAWnX,KAAKmX,SAChBC,EAAapX,KAAKoX,WAKtB,OAHAD,EAAWA,GAAYA,EAAS9G,KAAI,SAAU5Q,GAAK,OAAOA,EAAEiT,KAAK/E,MACjEyJ,EAAaA,GAAcA,EAAW/G,KAAI,SAASiI,GAAU,OAAOA,EAAO5F,KAAK/E,MAEzE3N,KAAKuY,cAAcpB,EAAUC,EAAYE,IAGpDG,mBAAA,SAAO9J,EAASQ,GACZ,IAAIzN,EAIJ,IAHMiN,GAAYA,EAAQ8F,eAAwD,KAAtCzT,KAAKmX,SAAS,GAAGjE,WAAW9E,OACpED,EAAOL,IAAI,IAAK9N,KAAKgN,WAAYhN,KAAKiN,YAErCvM,EAAI,EAAGA,EAAIV,KAAKmX,SAASrY,OAAQ4B,IACxBV,KAAKmX,SAASzW,GAChBmN,OAAOF,EAASQ,IAIhCsJ,wBAAA,WACI,OAAOzX,KAAKsX,mBAxIGpK,GA4IvBuK,EAASlI,UAAU3O,KAAO,WC9I1B,kBACI,WAAYwN,GAAZ,MACI8B,mBAEA,IAAK9B,EACD,MAAM,IAAI1O,MAAM,2CAEf4N,MAAMC,QAAQa,GAIf+B,EAAK/B,MAAQA,EAHb+B,EAAK/B,MAAQ,CAAEA,KAgC3B,OAxCoBgB,OAehBoJ,mBAAA,SAAOnK,GACCrO,KAAKoO,QACLpO,KAAKoO,MAAQC,EAAQqJ,WAAW1X,KAAKoO,SAI7CoK,iBAAA,SAAK7K,GACD,OAA0B,IAAtB3N,KAAKoO,MAAMtP,OACJkB,KAAKoO,MAAM,GAAGsE,KAAK/E,GAEnB,IAAI6K,EAAMxY,KAAKoO,MAAMiC,KAAI,SAAU6B,GACtC,OAAOA,EAAEQ,KAAK/E,QAK1B6K,mBAAA,SAAO7K,EAASQ,GACZ,IAAIzN,EACJ,IAAKA,EAAI,EAAGA,EAAIV,KAAKoO,MAAMtP,OAAQ4B,IAC/BV,KAAKoO,MAAM1N,GAAGmN,OAAOF,EAASQ,GAC1BzN,EAAI,EAAIV,KAAKoO,MAAMtP,QACnBqP,EAAOL,IAAKH,GAAWA,EAAQuD,SAAY,IAAM,UApC7ChE,GA0CpBsL,EAAMjJ,UAAU3O,KAAO,QC1CvB,kBACI,WAAYwN,GAAZ,MACI8B,0BAEAC,EAAK/B,MAAQA,IAOrB,OAXsBgB,OAOlBqJ,mBAAA,SAAO9K,EAASQ,GACZ,GAAmB,MAAfnO,KAAKoO,MAAiB,KAAM,CAAExN,KAAM,SAAUmV,QAAS,4BAC3D5H,EAAOL,IAAI9N,KAAKoO,WATFlB,GAatBuL,EAAQlJ,UAAU3O,KAAO,UAEzB6X,EAAQC,KAAO,IAAID,EAAQ,QAC3BA,EAAQE,MAAQ,IAAIF,EAAQ,SChB5B,kBACI,WAAYrK,EAAOJ,EAAOoF,EAAiBwF,EAAUC,EAAaxF,GAAlE,MACInD,0BAEAC,EAAK/B,MAAQA,EACb+B,EAAK1C,OAASO,EACdmC,EAAKzC,UAAY0F,EACjBjD,EAAKyI,SAAWA,EAChBzI,EAAK0I,iBAAsC,IAAhBA,GAAuCA,EAClE1I,EAAK2I,WAAY,EACjB3I,EAAKmD,mBAAmBD,KAqBhC,OA/BwBjE,OAapB2J,iBAAA,WACI,OAAO,IAAIA,EAAU/Y,KAAKoO,MAAOpO,KAAKyN,OAAQzN,KAAK0N,UAAW1N,KAAK4Y,SAAU5Y,KAAK6Y,YAAa7Y,KAAKqT,mBAGxG0F,oBAAA,SAAQlH,GACJ,OAAOA,EAAMf,OAAS9Q,KAAK8Q,UAAYe,EAAMf,QAAU,OAAItE,GAG/DuM,0BAAA,WACI,OAAO/Y,KAAK6Y,aAGhBE,mBAAA,SAAOpL,EAASQ,GACZnO,KAAKyM,YAAcuM,QAAQhZ,KAAKoO,OAC5BpO,KAAKyM,aACL0B,EAAOL,IAAI9N,KAAKoO,MAAOpO,KAAK0N,UAAW1N,KAAKyN,OAAQzN,KAAK4Y,cA5B7C1L,GAiCxB6L,EAAUxJ,UAAU3O,KAAO,YC9B3B,IAAMqY,EAAO7D,gBAGT,WAAY8D,EAAM9K,EAAO+K,EAAWC,EAAOpL,EAAOoF,EAAiBiG,EAAQC,GAA3E,MACIpJ,0BAEAC,EAAK+I,KAAOA,EACZ/I,EAAK/B,MAASA,aAAiBlB,EAAQkB,EAAQ,IAAIoK,EAAM,CAACpK,EAAQ,IAAI2K,EAAU3K,GAAS,OACzF+B,EAAKgJ,UAAYA,EAAY,IAAIA,EAAUpG,OAAW,GACtD5C,EAAKiJ,MAAQA,EACbjJ,EAAK1C,OAASO,EACdmC,EAAKzC,UAAY0F,EACjBjD,EAAKkJ,OAASA,IAAU,EACxBlJ,EAAKmJ,cAAyB9M,IAAb8M,EAA0BA,EACpCJ,EAAKxF,QAA8B,MAAnBwF,EAAKxF,OAAO,GACnCvD,EAAK2I,WAAY,EACjB3I,EAAKoD,UAAUpD,EAAK/B,MAAO+B,KA0EnC,OAxF0Bf,OAiBtBmK,mBAAA,SAAO5L,EAASQ,GACZA,EAAOL,IAAI9N,KAAKkZ,MAAQvL,EAAQuD,SAAW,IAAM,MAAOlR,KAAKgN,WAAYhN,KAAKiN,YAC9E,IACIjN,KAAKoO,MAAMP,OAAOF,EAASQ,GAE/B,MAAO1O,GAGH,MAFAA,EAAEuO,MAAQhO,KAAKyN,OACfhO,EAAE8B,SAAWvB,KAAK0N,UAAUnM,SACtB9B,EAEV0O,EAAOL,IAAI9N,KAAKmZ,WAAcnZ,KAAKqZ,QAAW1L,EAAQ6L,UAAY7L,EAAQuD,SAAa,GAAK,KAAMlR,KAAK0N,UAAW1N,KAAKyN,SAG3H8L,iBAAA,SAAK5L,GACD,IAAwB8L,EAA4BC,EAAhDC,GAAa,EAAiBT,EAAOlZ,KAAKkZ,KAAkBI,EAAWtZ,KAAKsZ,SAC5D,iBAATJ,IAGPA,EAAwB,IAAhBA,EAAKpa,QAAkBoa,EAAK,aAAcT,EAC9CS,EAAK,GAAG9K,MAsDxB,SAAkBT,EAASuL,GACvB,IACIxY,EADA0N,EAAQ,GAENwB,EAAIsJ,EAAKpa,OACTqP,EAAS,CAACL,IAAK,SAAUnC,GAAIyC,GAASzC,IAC5C,IAAKjL,EAAI,EAAGA,EAAIkP,EAAGlP,IACfwY,EAAKxY,GAAGgS,KAAK/E,GAASE,OAAOF,EAASQ,GAE1C,OAAOC,EA9DqBwL,CAASjM,EAASuL,GACtCI,GAAW,GAIF,SAATJ,GAAmBvL,EAAQwH,OAAS8D,EAAKtF,SACzCgG,GAAa,EACbF,EAAW9L,EAAQwH,KACnBxH,EAAQwH,KAAO8D,EAAKrF,iBAExB,IAII,GAHAjG,EAAQkM,eAAerZ,KAAK,IAC5BkZ,EAAa1Z,KAAKoO,MAAMsE,KAAK/E,IAExB3N,KAAKsZ,UAAgC,oBAApBI,EAAW9Y,KAC7B,KAAM,CAAEmV,QAAS,8CACb/H,MAAOhO,KAAKiN,WAAY1L,SAAUvB,KAAKgN,WAAWzL,UAE1D,IAAI4X,EAAYnZ,KAAKmZ,UACfW,EAAkBnM,EAAQkM,eAAeE,MAK/C,OAJKZ,GAAaW,EAAgBX,YAC9BA,EAAYW,EAAgBX,WAGzB,IAAII,EAAYL,EACnBQ,EACAP,EACAnZ,KAAKoZ,MACLpZ,KAAKiN,WAAYjN,KAAKgN,WAAYhN,KAAKqZ,OACvCC,GAER,MAAO7Z,GAKH,KAJuB,iBAAZA,EAAEuO,QACTvO,EAAEuO,MAAQhO,KAAKiN,WACfxN,EAAE8B,SAAWvB,KAAKgN,WAAWzL,UAE3B9B,UAGFka,IACAhM,EAAQwH,KAAOsE,KAK3BF,0BAAA,WACI,OAAO,IAAIA,EAAYvZ,KAAKkZ,KACxBlZ,KAAKoO,MACL,aACApO,KAAKoZ,MACLpZ,KAAKiN,WAAYjN,KAAKgN,WAAYhN,KAAKqZ,YAtFzBnM,GAqG1BqM,EAAYhK,UAAU3O,KAAO,cC5G7B,iBACI,WAAY+M,EAASqM,EAAKC,GACtB,IAAIxE,EAAS,GACb,GAAI9H,EAAQuM,kBAAoBvM,EAAQuD,SACpC,OAAQvD,EAAQuM,iBACZ,IAAK,WACDzE,EAAS0E,EAAUC,UAAUJ,GAC7B,MACJ,IAAK,aACDvE,EAAS0E,EAAUE,aAAaL,GAChC,MACJ,IAAK,MACDvE,EAAS0E,EAAUC,UAAUJ,IAAQC,GAAiB,IAAME,EAAUE,aAAaL,GAI/F,OAAOvE,EAmBf,OAhBW0E,YAAP,SAAiBH,GACb,MAAO,WAAWA,EAAIG,UAAUG,gBAAeN,EAAIG,UAAUI,kBAG1DJ,eAAP,SAAoBH,GAChB,IAAIQ,EAAuBR,EAAIG,UAAUI,SAIzC,MAHK,gBAAgBE,KAAKD,KACtBA,EAAuB,UAAUA,GAE9B,gDAAgDA,EAAqBrd,QAAQ,eAAe,SAAUqR,GAIjH,MAHS,MAALA,IACAA,EAAI,KAED,KAAKA,iCACcwL,EAAIG,UAAUG,sCC7BxC,WAAYlM,EAAOsM,EAAe1M,EAAOoF,GAAzC,MACIlD,0BAEAC,EAAK/B,MAAQA,EACb+B,EAAKuK,cAAgBA,EACrBvK,EAAK1C,OAASO,EACdmC,EAAKzC,UAAY0F,EACjBjD,EAAK2I,WAAY,IAczB,OAtBsB1J,OAWlBuL,mBAAA,SAAOhN,EAASQ,GACRnO,KAAKma,WACLhM,EAAOL,IAAI8M,EAAajN,EAAS3N,MAAOA,KAAKgN,WAAYhN,KAAKiN,YAElEkB,EAAOL,IAAI9N,KAAKoO,QAGpBuM,qBAAA,SAAShN,GACL,IAAMkN,EAAelN,EAAQuD,UAA8B,MAAlBlR,KAAKoO,MAAM,GACpD,OAAOpO,KAAK0a,eAAiBG,MApBf3N,GAwBtByN,EAAQpL,UAAU3O,KAAO,UC3BzB,IAAMka,EAAW,GAIXC,EAAmB,SAA0BC,EAAUC,EAAaC,GACtE,GAAKF,EAEL,IAAK,IAAIta,EAAI,EAAGA,EAAIwa,EAAiBpc,OAAQ4B,IACrCsa,EAASvd,eAAeyd,EAAiBxa,MACzCua,EAAYC,EAAiBxa,IAAMsa,EAASE,EAAiBxa,MAQnEya,EAAsB,CAExB,QACA,cACA,WACA,gBACA,WACA,kBACA,WACA,aACA,aACA,OACA,eAEA,iBAEA,iBAGJL,EAASM,MAAQ,SAAS/d,GACtB0d,EAAiB1d,EAAS2C,KAAMmb,GAEN,iBAAfnb,KAAKqb,QAAsBrb,KAAKqb,MAAQ,CAACrb,KAAKqb,SAG7D,IAAMC,EAAqB,CACvB,QACA,WACA,WACA,OACA,cACA,YACA,iBACA,UACA,oBACA,gBACA,iBACA,eAsGJ,SAASC,EAAeC,GACpB,OAAQ,sBAAsBf,KAAKe,GAGvC,SAASC,EAAoBD,GACzB,MAA0B,MAAnBA,EAAK9H,OAAO,GAxGvBoH,EAASY,KAAO,SAASre,EAASse,GAC9BZ,EAAiB1d,EAAS2C,KAAMsb,GAEN,iBAAftb,KAAKqb,QAAsBrb,KAAKqb,MAAQ,CAACrb,KAAKqb,QAEzDrb,KAAK2b,OAASA,GAAU,GACxB3b,KAAK6Z,eAAiB7Z,KAAK6Z,gBAAkB,IAGjDiB,EAASY,KAAKnM,UAAUqM,UAAY,WAC3B5b,KAAK6b,YACN7b,KAAK6b,UAAY,IAErB7b,KAAK6b,UAAUrb,MAAK,GACpBR,KAAK8b,QAAS,GAGlBhB,EAASY,KAAKnM,UAAUwM,SAAW,WAC/B/b,KAAK6b,UAAU9B,MACV/Z,KAAK6b,UAAU/c,SAChBkB,KAAK8b,QAAS,IAItBhB,EAASY,KAAKnM,UAAUyM,cAAgB,WAC/Bhc,KAAKic,cACNjc,KAAKic,YAAc,IAEvBjc,KAAKic,YAAYzb,MAAK,IAG1Bsa,EAASY,KAAKnM,UAAU2M,iBAAmB,WACvClc,KAAKic,YAAYlC,OAGrBe,EAASY,KAAKnM,UAAUuM,QAAS,EACjChB,EAASY,KAAKnM,UAAU4M,QAAS,EACjCrB,EAASY,KAAKnM,UAAU6M,SAAW,SAAU7N,GACzC,QAAKvO,KAAKmc,YAGC,MAAP5N,GAAcvO,KAAKmV,OAASC,EAAezB,QAAY3T,KAAKic,aAAgBjc,KAAKic,YAAYnd,YAG7FkB,KAAKmV,KAAOC,EAAexB,kBACpB5T,KAAKic,aAAejc,KAAKic,YAAYnd,UAKpDgc,EAASY,KAAKnM,UAAU8M,oBAAsB,SAAUb,GAGpD,OAFmBxb,KAAKsV,cAAgBC,EAA8BkG,EAAsBF,GAE1EC,IAGtBV,EAASY,KAAKnM,UAAU+M,YAAc,SAAUd,EAAMe,GAClD,IAAIC,EAaJ,OAXAD,EAAWA,GAAY,GACvBC,EAAUxc,KAAKyc,cAAcF,EAAWf,GAIpCC,EAAoBD,IACpBD,EAAegB,KACkB,IAAjCd,EAAoBe,KACpBA,EAAU,KAAKA,GAGZA,GAGX1B,EAASY,KAAKnM,UAAUkN,cAAgB,SAAUjB,GAC9C,IACIkB,EADEC,EAAWnB,EAAK/K,MAAM,KAAKmM,UAIjC,IADApB,EAAO,GACoB,IAApBmB,EAAS7d,QAEZ,OADA4d,EAAUC,EAAS5C,OAEf,IAAK,IACD,MACJ,IAAK,KACoB,IAAhByB,EAAK1c,QAA4C,OAA1B0c,EAAKA,EAAK1c,OAAS,GAC3C0c,EAAKhb,KAAMkc,GAEXlB,EAAKzB,MAET,MACJ,QACIyB,EAAKhb,KAAKkc,GAKtB,OAAOlB,EAAKtN,KAAK,YCzJrB,SAAS2O,EAAcC,GACnB,MAAO,CACHC,MAAO,GACPjP,IAAK,SAASoL,EAAMzC,GAGhByC,EAAOA,EAAK5G,cAERtS,KAAK+c,MAAMtf,eAAeyb,GAG9BlZ,KAAK+c,MAAM7D,GAAQzC,GAEvBuG,YAAa,SAAS/b,GAAT,WACT4L,OAAOoQ,KAAKhc,GAAWuM,SACnB,SAAA0L,GACI/I,EAAKrC,IAAIoL,EAAMjY,EAAUiY,QAGrCnM,IAAK,SAASmM,GACV,OAAOlZ,KAAK+c,MAAM7D,IAAW4D,GAAQA,EAAK/P,IAAKmM,IAEnDgE,kBAAmB,WACf,OAAOld,KAAK+c,OAEhBI,QAAS,WACL,OAAON,EAAc7c,OAEzBwP,OAAQ,SAASsN,GACb,OAAOD,EAAaC,KAKjBD,CAAc,MChCvBO,EAAc,CAChB1K,KAAM,WACF,IAAMR,EAAIlS,KAAKqd,OACT5d,EAAIO,KAAKsd,OACf,GAAI7d,EACA,MAAMA,EAEV,GAAS,MAALyS,EACA,OAAOA,EAAIuG,EAAQC,KAAOD,EAAQE,OAG1CvK,MAAO,SAAU8D,GACblS,KAAKqd,OAASnL,GAElBpS,MAAO,SAAUL,GACbO,KAAKsd,OAAS7d,GAElB8d,MAAO,WACHvd,KAAKqd,OAASrd,KAAKsd,OAAS,qBCLhC,WAAYE,EAAWC,EAAOC,EAAerK,GAA7C,MACInD,0BAEAC,EAAKqN,UAAYA,EACjBrN,EAAKsN,MAAQA,EACbtN,EAAKwN,SAAW,GAChBxN,EAAKyN,WAAa,KAClBzN,EAAK0N,YAAc,KACnB1N,EAAKuN,cAAgBA,EACrBvN,EAAKmD,mBAAmBD,GACxBlD,EAAK2I,WAAY,EAEjB3I,EAAKoD,UAAUpD,EAAKqN,UAAWrN,GAC/BA,EAAKoD,UAAUpD,EAAKsN,MAAOtN,KAkzBnC,OAh0BsBf,OAkBlB0O,0BAAA,WAAkB,OAAO,GAEzBA,mBAAA,SAAOzP,GACCrO,KAAKqb,MACLrb,KAAKqb,MAAQhN,EAAQqJ,WAAW1X,KAAKqb,OAAO,GACrCrb,KAAKwd,YACZxd,KAAKwd,UAAYnP,EAAQqJ,WAAW1X,KAAKwd,YAEzCxd,KAAKyd,OAASzd,KAAKyd,MAAM3e,SACzBkB,KAAKyd,MAAQpP,EAAQqJ,WAAW1X,KAAKyd,SAI7CK,iBAAA,SAAKnQ,GAED,IAAI6P,EACAO,EACAC,EACAtd,EACAud,EACAC,GAAwB,EAE5B,GAAIle,KAAKwd,YAAcO,EAAS/d,KAAKwd,UAAU1e,QAAS,CAOpD,IANA0e,EAAY,IAAIlQ,MAAMyQ,GACtBX,EAAYtd,MAAM,CACdc,KAAM,SACNmV,QAAS,6DAGRrV,EAAI,EAAGA,EAAIqd,EAAQrd,IAAK,CACzBsd,EAAWhe,KAAKwd,UAAU9c,GAAGgS,KAAK/E,GAClC,IAAK,IAAIwQ,EAAI,EAAGA,EAAIH,EAAS7G,SAASrY,OAAQqf,IAC1C,GAAIH,EAAS7G,SAASgH,GAAGhL,WAAY,CACjC8K,GAAc,EACd,MAGRT,EAAU9c,GAAKsd,EACXA,EAAS1G,iBACT4G,GAAwB,GAIhC,GAAID,EAAa,CACb,IAAMG,EAAmB,IAAI9Q,MAAMyQ,GACnC,IAAKrd,EAAI,EAAGA,EAAIqd,EAAQrd,IACpBsd,EAAWR,EAAU9c,GACrB0d,EAAiB1d,GAAKsd,EAASlN,MAAMnD,GAEzC3N,KAAKrC,MAAMma,UACPsG,EAAiBlQ,KAAK,KACtB,CAAC,aACDsP,EAAU,GAAGvQ,WACbuQ,EAAU,GAAGxQ,YACb,SAAS+K,EAAKtC,GACNA,IACA+H,EAAYa,EAAmB5I,OAK/C2H,EAAYG,aAEZW,GAAwB,EAG5B,IAEII,EACAC,EAHAd,EAAQzd,KAAKyd,MAAQe,EAAgBxe,KAAKyd,OAAS,KACjDgB,EAAU,IAAIX,EAAQN,EAAWC,EAAOzd,KAAK0d,cAAe1d,KAAKqT,kBAIvEoL,EAAQC,gBAAkB1e,KAC1Bye,EAAQE,KAAO3e,KAAK2e,KACpBF,EAAQG,UAAY5e,KAAK4e,UACzBH,EAAQI,aAAe7e,KAAK6e,aAExB7e,KAAKma,YACLsE,EAAQtE,UAAYna,KAAKma,WAGxB+D,IACDT,EAAM3e,OAAS,GAKnB2f,EAAQK,iBAAoB,SAAUnD,GAIlC,IAHA,IAEInF,EAFA9V,EAAI,EACFkP,EAAI+L,EAAO7c,OAET4B,IAAMkP,IAAMlP,EAEhB,GADA8V,EAAQmF,EAAQjb,GAAIoe,iBACL,OAAOtI,EAE1B,OAAOuI,EARgB,CASzBpR,EAAQgO,QAASwB,UAGnB,IAAM6B,EAAYrR,EAAQgO,OAC1BqD,EAAUC,QAAQR,GAGlB,IAAIS,EAAevR,EAAQ6P,UACtB0B,IACDvR,EAAQ6P,UAAY0B,EAAe,IAEvCA,EAAaD,QAAQjf,KAAKwd,YAGtBiB,EAAQE,MAAQF,EAAQI,eAAiBJ,EAAQf,gBACjDe,EAAQU,YAAYxR,GAKxB,IAAMyR,EAAUX,EAAQhB,MACxB,IAAK/c,EAAI,EAAI4d,EAAOc,EAAQ1e,GAAKA,IACzB4d,EAAKe,YACLD,EAAQ1e,GAAK4d,EAAK5L,KAAK/E,IAI/B,IAAM2R,EAAmB3R,EAAQ4R,aAAe5R,EAAQ4R,YAAYzgB,QAAW,EAG/E,IAAK4B,EAAI,EAAI4d,EAAOc,EAAQ1e,GAAKA,IACX,cAAd4d,EAAK1d,MAEL6c,EAAQa,EAAK5L,KAAK/E,GAAS6R,QAAO,SAAS7O,GACvC,QAAKA,aAAa4I,GAAgB5I,EAAE2I,YAIvBmF,EAAQnF,SAAS3I,EAAEuI,SAIpCkG,EAAQze,OAAOoP,MAAMqP,EAAS,CAAC1e,EAAG,GAAGQ,OAAOuc,IAC5C/c,GAAK+c,EAAM3e,OAAS,EACpB2f,EAAQgB,cACc,iBAAfnB,EAAK1d,OAEZ6c,EAAQa,EAAK5L,KAAK/E,GAAS8P,MAAM+B,QAAO,SAAS7O,GAC7C,QAAKA,aAAa4I,GAAgB5I,EAAE2I,aAMxC8F,EAAQze,OAAOoP,MAAMqP,EAAS,CAAC1e,EAAG,GAAGQ,OAAOuc,IAC5C/c,GAAK+c,EAAM3e,OAAS,EACpB2f,EAAQgB,cAKhB,IAAK/e,EAAI,EAAI4d,EAAOc,EAAQ1e,GAAKA,IACxB4d,EAAKe,YACND,EAAQ1e,GAAK4d,EAAOA,EAAK5L,KAAO4L,EAAK5L,KAAK/E,GAAW2Q,GAK7D,IAAK5d,EAAI,EAAI4d,EAAOc,EAAQ1e,GAAKA,IAE7B,GAAI4d,aAAgBR,GAAWQ,EAAKd,WAAuC,IAA1Bc,EAAKd,UAAU1e,QAExDwf,EAAKd,UAAU,IAAMc,EAAKd,UAAU,GAAGkC,uBAAwB,CAC/DN,EAAQze,OAAOD,IAAK,GAEpB,IAASyd,EAAI,EAAII,EAAUD,EAAKb,MAAMU,GAAKA,IACnCI,aAAmBrR,IACnBqR,EAAQjL,mBAAmBgL,EAAKjL,kBAC1BkL,aAAmBhF,GAAiBgF,EAAQjF,UAC9C8F,EAAQze,SAASD,EAAG,EAAG6d,IAY/C,GAHAS,EAAU3G,QACV6G,EAAa7G,QAET1K,EAAQ4R,YACR,IAAK7e,EAAI4e,EAAiB5e,EAAIiN,EAAQ4R,YAAYzgB,OAAQ4B,IACtDiN,EAAQ4R,YAAY7e,GAAGif,gBAAgBnC,GAI/C,OAAOiB,GAGXX,wBAAA,SAAYnQ,GACR,IACIjN,EACAkf,EAFEnC,EAAQzd,KAAKyd,MAGnB,GAAKA,EAEL,IAAK/c,EAAI,EAAGA,EAAI+c,EAAM3e,OAAQ4B,IACJ,WAAlB+c,EAAM/c,GAAGE,QACTgf,EAAcnC,EAAM/c,GAAGgS,KAAK/E,MACRiS,EAAY9gB,QAAiC,IAAvB8gB,EAAY9gB,SAClD2e,EAAM9c,OAAOoP,MAAM0N,EAAO,CAAC/c,EAAG,GAAGQ,OAAO0e,IACxClf,GAAKkf,EAAY9gB,OAAS,GAE1B2e,EAAM9c,OAAOD,EAAG,EAAGkf,GAEvB5f,KAAKyf,eAKjB3B,0BAAA,WASI,OARe,IAAIA,EAAQ9d,KAAKwd,UAAWxd,KAAKyd,MAAMpN,KAAI,SAAUM,GAChE,OAAIA,EAAEkP,cACKlP,EAAEkP,gBAEFlP,KAEX3Q,KAAK0d,cAAe1d,KAAKqT,mBAKjCyK,sBAAA,SAAU3M,GACN,OAAQA,GAAwB,IAAhBA,EAAKrS,QAIzBgf,2BAAA,SAAe3M,EAAMxD,GACjB,IAAMmS,EAAe9f,KAAKwd,UAAUxd,KAAKwd,UAAU1e,OAAS,GAC5D,QAAKghB,EAAaxI,kBAGdwI,EAAazI,YACZyI,EAAazI,UAAU3E,KACpB,IAAIoI,EAASY,KAAK/N,EACdA,EAAQgO,WAMxBmC,uBAAA,WACI9d,KAAK+f,UAAY,KACjB/f,KAAK4d,WAAa,KAClB5d,KAAK6d,YAAc,KACnB7d,KAAK2d,SAAW,IAGpBG,sBAAA,WAoBI,OAnBK9d,KAAK4d,aACN5d,KAAK4d,WAAc5d,KAAKyd,MAAazd,KAAKyd,MAAMuC,QAAO,SAAUC,EAAMtP,GAOnE,GANIA,aAAa4I,IAA8B,IAAf5I,EAAE2I,WAC9B2G,EAAKtP,EAAEuI,MAAQvI,GAKJ,WAAXA,EAAE/P,MAAqB+P,EAAEgO,MAAQhO,EAAEgO,KAAKuB,UAAW,CACnD,IAAMC,EAAOxP,EAAEgO,KAAKuB,YACpB,IAAK,IAAME,KAAQD,EACXA,EAAK1iB,eAAe2iB,KACpBH,EAAKG,GAAQzP,EAAEgO,KAAKrF,SAAS8G,IAIzC,OAAOH,IACR,IAhB6B,IAkB7BjgB,KAAK4d,YAGhBE,uBAAA,WAiBI,OAhBK9d,KAAK6d,cACN7d,KAAK6d,YAAe7d,KAAKyd,MAAazd,KAAKyd,MAAMuC,QAAO,SAAUC,EAAMtP,GACpE,GAAIA,aAAa4I,IAA8B,IAAf5I,EAAE2I,SAAmB,CACjD,IAAM+G,EAA0B,IAAlB1P,EAAEuI,KAAKpa,QAAkB6R,EAAEuI,KAAK,aAAcT,EACxD9H,EAAEuI,KAAK,GAAG9K,MAAQuC,EAAEuI,KAEnB+G,EAAK,IAAII,GAIVJ,EAAK,IAAII,GAAQ7f,KAAKmQ,GAHtBsP,EAAK,IAAII,GAAU,CAAE1P,GAM7B,OAAOsP,IACR,IAb8B,IAe9BjgB,KAAK6d,aAGhBC,qBAAA,SAAS5E,GACL,IAAMoH,EAAOtgB,KAAKkgB,YAAYhH,GAC9B,GAAIoH,EACA,OAAOtgB,KAAKugB,WAAWD,IAI/BxC,qBAAA,SAAS5E,GACL,IAAMoH,EAAOtgB,KAAKwgB,aAAatH,GAC/B,GAAIoH,EACA,OAAOtgB,KAAKugB,WAAWD,IAI/BxC,4BAAA,WACI,IAAK,IAAIpd,EAAIV,KAAKyd,MAAM3e,OAAQ4B,EAAI,EAAGA,IAAK,CACxC,IAAM4f,EAAOtgB,KAAKyd,MAAM/c,EAAI,GAC5B,GAAI4f,aAAgB/G,EAChB,OAAOvZ,KAAKugB,WAAWD,KAKnCxC,uBAAA,SAAW2C,GACP,IAAM7T,EAAO5M,KACb,SAAS0gB,EAAqBJ,GAC1B,OAAIA,EAAKlS,iBAAiB2K,IAAcuH,EAAK3T,QACT,iBAArB2T,EAAKlS,MAAMA,MAClBpO,KAAKrC,MAAMma,UACPwI,EAAKlS,MAAMA,MACX,CAAC,QAAS,aACVkS,EAAKlS,MAAMnB,WACXqT,EAAKtT,YACL,SAAS+K,EAAKtC,GACNsC,IACAuI,EAAK3T,QAAS,GAEd8I,IACA6K,EAAKlS,MAAQqH,EAAO,GACpB6K,EAAKnH,UAAY1D,EAAO,IAAM,GAC9B6K,EAAK3T,QAAS,MAI1B2T,EAAK3T,QAAS,EAGX2T,GAGAA,EAGf,GAAKhT,MAAMC,QAAQkT,GAGd,CACD,IAAME,EAAQ,GAId,OAHAF,EAAQjT,SAAQ,SAASoC,GACrB+Q,EAAMngB,KAAKkgB,EAAqB5Q,KAAKlD,EAAMgD,OAExC+Q,EAPP,OAAOD,EAAqB5Q,KAAKlD,EAAM6T,IAW/C3C,qBAAA,WACI,IAAK9d,KAAKyd,MAAS,MAAO,GAE1B,IAEI/c,EACA4d,EAHEsC,EAAY,GACZnD,EAAQzd,KAAKyd,MAInB,IAAK/c,EAAI,EAAI4d,EAAOb,EAAM/c,GAAKA,IACvB4d,EAAKuC,WACLD,EAAUpgB,KAAK8d,GAIvB,OAAOsC,GAGX9C,wBAAA,SAAYQ,GACR,IAAMb,EAAQzd,KAAKyd,MACfA,EACAA,EAAMwB,QAAQX,GAEdte,KAAKyd,MAAQ,CAAEa,GAEnBte,KAAKuT,UAAU+K,EAAMte,OAGzB8d,iBAAA,SAAKE,EAAUpR,EAAM4S,GACjB5S,EAAOA,GAAQ5M,KACf,IACIoQ,EACA0Q,EAFErD,EAAQ,GAGRpL,EAAM2L,EAASlN,QAErB,OAAIuB,KAAOrS,KAAK2d,SAAmB3d,KAAK2d,SAAStL,IAEjDrS,KAAK+gB,WAAWvT,SAAQ,SAAU8Q,GAC9B,GAAIA,IAAS1R,EACT,IAAK,IAAIuR,EAAI,EAAGA,EAAIG,EAAKd,UAAU1e,OAAQqf,IAEvC,GADA/N,EAAQ4N,EAAS5N,MAAMkO,EAAKd,UAAUW,IAC3B,CACP,GAAIH,EAAS7G,SAASrY,OAASsR,GAC3B,IAAKoP,GAAUA,EAAOlB,GAAO,CACzBwC,EAAcxC,EAAK0C,KAAK,IAAIvJ,EAASuG,EAAS7G,SAAS5E,MAAMnC,IAASxD,EAAM4S,GAC5E,IAAK,IAAI9e,EAAI,EAAGA,EAAIogB,EAAYhiB,SAAU4B,EACtCogB,EAAYpgB,GAAG8a,KAAKhb,KAAK8d,GAE7BhR,MAAMiC,UAAU/O,KAAKuP,MAAM0N,EAAOqD,SAGtCrD,EAAMjd,KAAK,CAAE8d,OAAM9C,KAAM,KAE7B,UAKhBxb,KAAK2d,SAAStL,GAAOoL,EACdA,IAGXK,mBAAA,SAAOnQ,EAASQ,GACZ,IAAIzN,EACAyd,EAKJhE,EAEImE,EACA9C,EANAyF,EAAY,GAQhBtT,EAAQuT,SAAYvT,EAAQuT,UAAY,EAEnClhB,KAAK2e,MACNhR,EAAQuT,WAGZ,IAEIC,EAFEC,EAAazT,EAAQuD,SAAW,GAAK5D,MAAMK,EAAQuT,SAAW,GAAGhT,KAAK,MACtEmT,EAAY1T,EAAQuD,SAAW,GAAK5D,MAAMK,EAAQuT,UAAUhT,KAAK,MAGnEoT,EAAmB,EACnBC,EAAkB,EACtB,IAAK7gB,EAAI,EAAI4d,EAAOte,KAAKyd,MAAM/c,GAAKA,IAC5B4d,aAAgB3D,GACZ4G,IAAoB7gB,GACpB6gB,IAEJN,EAAUzgB,KAAK8d,IACRA,EAAKkD,WAAalD,EAAKkD,aAC9BP,EAAUtgB,OAAO2gB,EAAkB,EAAGhD,GACtCgD,IACAC,KACqB,WAAdjD,EAAK1d,MACZqgB,EAAUtgB,OAAO4gB,EAAiB,EAAGjD,GACrCiD,KAEAN,EAAUzgB,KAAK8d,GAOvB,GAJA2C,EAtCyB,GAsCI/f,OAAO+f,IAI/BjhB,KAAK2e,KAAM,EACZxE,EAAYS,EAAajN,EAAS3N,KAAMqhB,MAGpClT,EAAOL,IAAIqM,GACXhM,EAAOL,IAAIuT,IAGf,IAAMhG,EAAQrb,KAAKqb,MACboG,EAAUpG,EAAMvc,OAClB4iB,SAIJ,IAFAP,EAAMxT,EAAQuD,SAAW,IAAO,MAAMmQ,EAEjC3gB,EAAI,EAAGA,EAAI+gB,EAAS/gB,IAErB,GAAMghB,GADNlG,EAAOH,EAAM3a,IACW5B,OAOxB,IANI4B,EAAI,GAAKyN,EAAOL,IAAIqT,GAExBxT,EAAQ8F,eAAgB,EACxB+H,EAAK,GAAG3N,OAAOF,EAASQ,GAExBR,EAAQ8F,eAAgB,EACnB0K,EAAI,EAAGA,EAAIuD,EAAYvD,IACxB3C,EAAK2C,GAAGtQ,OAAOF,EAASQ,GAIhCA,EAAOL,KAAKH,EAAQuD,SAAW,IAAM,QAAUkQ,GAInD,IAAK1gB,EAAI,EAAI4d,EAAO2C,EAAUvgB,GAAKA,IAAK,CAEhCA,EAAI,IAAMugB,EAAUniB,SACpB6O,EAAQ6L,UAAW,GAGvB,IAAMmI,EAAkBhU,EAAQ6L,SAC5B8E,EAAKsD,cAActD,KACnB3Q,EAAQ6L,UAAW,GAGnB8E,EAAKzQ,OACLyQ,EAAKzQ,OAAOF,EAASQ,GACdmQ,EAAKlQ,OACZD,EAAOL,IAAIwQ,EAAKlQ,MAAMoE,YAG1B7E,EAAQ6L,SAAWmI,GAEdhU,EAAQ6L,UAAY8E,EAAKuD,YAC1B1T,EAAOL,IAAIH,EAAQuD,SAAW,GAAM,KAAKkQ,GAEzCzT,EAAQ6L,UAAW,EAItBxZ,KAAK2e,OACNxQ,EAAOL,IAAKH,EAAQuD,SAAW,IAAM,KAAKmQ,OAC1C1T,EAAQuT,YAGP/S,EAAOF,WAAcN,EAAQuD,WAAYlR,KAAK4e,WAC/CzQ,EAAOL,IAAI,OAInBgQ,0BAAA,SAAczC,EAAO1N,EAAS6P,GAC1B,IAAK,IAAI7R,EAAI,EAAGA,EAAI6R,EAAU1e,OAAQ6M,IAClC3L,KAAK8hB,aAAazG,EAAO1N,EAAS6P,EAAU7R,KAIpDmS,yBAAA,SAAazC,EAAO1N,EAASqQ,GAEzB,SAAS+D,EAAkBC,EAAeC,GACtC,IAAIC,EAAkB/D,EACtB,GAA6B,IAAzB6D,EAAcljB,OACdojB,EAAmB,IAAIzP,EAAMuP,EAAc,QACxC,CACH,IAAMG,EAAe,IAAI7U,MAAM0U,EAAcljB,QAC7C,IAAKqf,EAAI,EAAGA,EAAI6D,EAAcljB,OAAQqf,IAClCgE,EAAahE,GAAK,IAAI3K,EAClB,KACAwO,EAAc7D,GACd8D,EAAgB9O,WAChB8O,EAAgBxU,OAChBwU,EAAgBvU,WAGxBwU,EAAmB,IAAIzP,EAAM,IAAIgF,EAAS0K,IAE9C,OAAOD,EAGX,SAASE,EAAeC,EAAkBJ,GACtC,IAAIK,EAGJ,OAFAA,EAAU,IAAI9O,EAAQ,KAAM6O,EAAkBJ,EAAgB9O,WAAY8O,EAAgBxU,OAAQwU,EAAgBvU,WACvG,IAAI+J,EAAS,CAAC6K,IAO7B,SAASC,EAAuBC,EAAeC,EAASC,EAAiBC,GACrE,IAAIC,EAAiB9C,EAAc+C,EAenC,GAbAD,EAAkB,GAIdJ,EAAc1jB,OAAS,GAEvBghB,GADA8C,EAAkBpE,EAAgBgE,IACHzI,MAC/B8I,EAAoBF,EAAiBpK,cAAciG,EAAgBsB,EAAa3I,YAGhF0L,EAAoBF,EAAiBpK,cAAc,IAGnDkK,EAAQ3jB,OAAS,EAAG,CAMpB,IAAIoU,EAAawP,EAAgBxP,WAE3B4P,EAAWL,EAAQ,GAAGtL,SAAS,GACjCjE,EAAWJ,oBAAsBgQ,EAAS5P,WAAWJ,oBACrDI,EAAa4P,EAAS5P,YAG1B2P,EAAkB1L,SAAS3W,KAAK,IAAIgT,EAChCN,EACA4P,EAAS1U,MACTsU,EAAgBvP,WAChBuP,EAAgBjV,OAChBiV,EAAgBhV,YAEpBmV,EAAkB1L,SAAW0L,EAAkB1L,SAASjW,OAAOuhB,EAAQ,GAAGtL,SAAS5E,MAAM,IAS7F,GAL0C,IAAtCsQ,EAAkB1L,SAASrY,QAC3B8jB,EAAgBpiB,KAAKqiB,GAIrBJ,EAAQ3jB,OAAS,EAAG,CACpB,IAAIikB,EAAaN,EAAQlQ,MAAM,GAC/BwQ,EAAaA,EAAW1S,KAAI,SAAU2N,GAClC,OAAOA,EAASzF,cAAcyF,EAAS7G,SAAU,OAErDyL,EAAkBA,EAAgB1hB,OAAO6hB,GAE7C,OAAOH,EAMX,SAASI,EAA4BR,EAAeS,EAAUP,EAAiBC,EAAkBlN,GAC7F,IAAI0I,EACJ,IAAKA,EAAI,EAAGA,EAAIqE,EAAc1jB,OAAQqf,IAAK,CACvC,IAAMyE,EAAkBL,EAAuBC,EAAcrE,GAAI8E,EAAUP,EAAiBC,GAC5FlN,EAAOjV,KAAKoiB,GAEhB,OAAOnN,EAGX,SAASyN,EAA2B/L,EAAUqG,GAC1C,IAAI9c,EAAGyiB,EAEP,GAAwB,IAApBhM,EAASrY,OAGb,GAAyB,IAArB0e,EAAU1e,OAKd,IAAK4B,EAAI,EAAIyiB,EAAM3F,EAAU9c,GAAKA,IAE1ByiB,EAAIrkB,OAAS,EACbqkB,EAAIA,EAAIrkB,OAAS,GAAKqkB,EAAIA,EAAIrkB,OAAS,GAAGyZ,cAAc4K,EAAIA,EAAIrkB,OAAS,GAAGqY,SAASjW,OAAOiW,IAG5FgM,EAAI3iB,KAAK,IAAIiX,EAASN,SAV1BqG,EAAUhd,KAAK,CAAE,IAAIiX,EAASN,KAsItC,SAASiM,EAAe/P,EAAgBgQ,GACpC,IAAM1L,EAAc0L,EAAW9K,cAAc8K,EAAWlM,SAAUkM,EAAWjM,WAAYiM,EAAW/L,gBAEpG,OADAK,EAAYrE,mBAAmBD,GACxBsE,EAIX,IAAIjX,EAAG4iB,EAKP,IAhIA,SAASC,EAAsBlI,EAAO1N,EAAS6V,GAW3C,IAAI9iB,EAAGyd,EAAGsF,EAAGC,EAAiBC,EAAcC,EAAqBT,EAAKU,EAA+B/kB,EAAQghB,EACjFwC,EACpBwB,EAFkEC,GAAoB,EAwB9F,IARAL,EAAkB,GAIlBC,EAAe,CACX,IAGCjjB,EAAI,EAAImjB,EAAKL,EAAWrM,SAASzW,GAAKA,IAEvC,GAAiB,MAAbmjB,EAAGzV,MAAe,CAClB,IAAM4V,GAzBNF,OAAAA,GADoBxB,EA0BsBuB,GAxBhCzV,iBAAiBqE,IAI/BqR,EAAgBxB,EAAQlU,MAAMA,iBACCqJ,EAIxBqM,EARI,MAwBP,GAAsB,MAAlBE,EAAwB,CAGxBd,EAA2BQ,EAAiBC,GAE5C,IACIM,EADEC,EAAc,GAEdC,EAAuB,GAI7B,IAHAF,EAAWV,EAAsBW,EAAavW,EAASqW,GACvDD,EAAoBA,GAAqBE,EAEpCR,EAAI,EAAGA,EAAIS,EAAYplB,OAAQ2kB,IAAK,CAErCT,EAA2BW,EAAc,CADbvB,EAAeL,EAAkBmC,EAAYT,GAAII,GAAKA,IAClBA,EAAIL,EAAYW,GAEpFR,EAAeQ,EACfT,EAAkB,QAElBA,EAAgBljB,KAAKqjB,OAGtB,CAUH,IATAE,GAAoB,EAEpBH,EAAsB,GAItBV,EAA2BQ,EAAiBC,GAGvCxF,EAAI,EAAGA,EAAIwF,EAAa7kB,OAAQqf,IAIjC,GAHAgF,EAAMQ,EAAaxF,GAGI,IAAnBxQ,EAAQ7O,OAGJqkB,EAAIrkB,OAAS,GACbqkB,EAAI,GAAGhM,SAAS3W,KAAK,IAAIgT,EAAQqQ,EAAG3Q,WAAY,GAAI2Q,EAAG1Q,WAAY0Q,EAAGpW,OAAQoW,EAAGnW,YAErFkW,EAAoBpjB,KAAK2iB,QAIzB,IAAKM,EAAI,EAAGA,EAAI9V,EAAQ7O,OAAQ2kB,IAAK,CAGjC,IAAMb,EAAkBL,EAAuBY,EAAKxV,EAAQ8V,GAAII,EAAIL,GAEpEI,EAAoBpjB,KAAKoiB,GAMrCe,EAAeC,EACfF,EAAkB,GAQ1B,IAFAR,EAA2BQ,EAAiBC,GAEvCjjB,EAAI,EAAGA,EAAIijB,EAAa7kB,OAAQ4B,KACjC5B,EAAS6kB,EAAajjB,GAAG5B,QACZ,IACTuc,EAAM7a,KAAKmjB,EAAajjB,IACxBof,EAAe6D,EAAajjB,GAAG5B,EAAS,GACxC6kB,EAAajjB,GAAG5B,EAAS,GAAKghB,EAAavH,cAAcuH,EAAa3I,SAAUqM,EAAWpM,aAInG,OAAO2M,EAaSR,CADpBD,EAAW,GACyC3V,EAASqQ,GAGzD,GAAIrQ,EAAQ7O,OAAS,EAEjB,IADAwkB,EAAW,GACN5iB,EAAI,EAAGA,EAAIiN,EAAQ7O,OAAQ4B,IAAK,CAEjC,IAAM0jB,EAAezW,EAAQjN,GAAG2P,IAAI+S,EAAe/hB,KAAKrB,KAAMge,EAAS3K,mBAEvE+Q,EAAa5jB,KAAKwd,GAClBsF,EAAS9iB,KAAK4jB,QAIlBd,EAAW,CAAC,CAACtF,IAIrB,IAAKtd,EAAI,EAAGA,EAAI4iB,EAASxkB,OAAQ4B,IAC7B2a,EAAM7a,KAAK8iB,EAAS5iB,QA5zBVwM,GAk0BtB4Q,EAAQvO,UAAU3O,KAAO,UACzBkd,EAAQvO,UAAUsR,WAAY,EC50B9B,kBACI,WACI3H,EACA9K,EACAqP,EACAzP,EACAoF,EACA+G,EACAkK,EACAhR,GARJ,IAYQ3S,IAFJwP,mBAMA,GAFAC,EAAK+I,KAAQA,EACb/I,EAAK/B,MAASA,aAAiBlB,EAAQkB,EAASA,EAAQ,IAAI2K,EAAU3K,GAASA,EAC3EqP,EAAO,CAOP,IANInQ,MAAMC,QAAQkQ,GACdtN,EAAKsN,MAAQA,GAEbtN,EAAKsN,MAAQ,CAACA,GACdtN,EAAKsN,MAAM,GAAGD,UAAY,IAAK/F,EAAS,GAAI,KAAM,KAAMzJ,EAAOoF,GAAkBkR,wBAEhF5jB,EAAI,EAAGA,EAAIyP,EAAKsN,MAAM3e,OAAQ4B,IAC/ByP,EAAKsN,MAAM/c,GAAGme,cAAe,EAEjC1O,EAAKoD,UAAUpD,EAAKsN,MAAOtN,UAE/BA,EAAK1C,OAASO,EACdmC,EAAKzC,UAAY0F,EACjBjD,EAAKgK,UAAYA,EACjBhK,EAAKkU,SAAWA,IAAY,EAC5BlU,EAAKmD,mBAAmBD,GACxBlD,EAAK2I,WAAY,IAmHzB,OArJqB1J,OAqCjBmV,mBAAA,SAAOlW,GACH,IAAMD,EAAQpO,KAAKoO,MAAOqP,EAAQzd,KAAKyd,MACnCA,IACAzd,KAAKyd,MAAQpP,EAAQqJ,WAAW+F,IAEhCrP,IACApO,KAAKoO,MAAQC,EAAQC,MAAMF,KAInCmW,0BAAA,WACI,OAAOvkB,KAAKyd,QAAUzd,KAAKwhB,aAG/B+C,sBAAA,WACI,MAAO,aAAevkB,KAAKkZ,MAG/BqL,mBAAA,SAAO5W,EAASQ,GACZ,IAAMC,EAAQpO,KAAKoO,MAAOqP,EAAQzd,KAAKyd,MACvCtP,EAAOL,IAAI9N,KAAKkZ,KAAMlZ,KAAKgN,WAAYhN,KAAKiN,YACxCmB,IACAD,EAAOL,IAAI,KACXM,EAAMP,OAAOF,EAASQ,IAEtBsP,EACAzd,KAAKwkB,cAAc7W,EAASQ,EAAQsP,GAEpCtP,EAAOL,IAAI,MAInByW,iBAAA,SAAK5W,GACD,IAAI8W,EAAiBC,EAAmBtW,EAAQpO,KAAKoO,MAAOqP,EAAQzd,KAAKyd,MAsBzE,OAlBAgH,EAAkB9W,EAAQgX,UAC1BD,EAAoB/W,EAAQ4R,YAE5B5R,EAAQgX,UAAY,GACpBhX,EAAQ4R,YAAc,GAElBnR,IACAA,EAAQA,EAAMsE,KAAK/E,IAEnB8P,KAEAA,EAAQ,CAACA,EAAM,GAAG/K,KAAK/E,KACjB,GAAGgR,MAAO,GAGpBhR,EAAQgX,UAAYF,EACpB9W,EAAQ4R,YAAcmF,EAEf,IAAIH,EAAOvkB,KAAKkZ,KAAM9K,EAAOqP,EAChCzd,KAAKiN,WAAYjN,KAAKgN,WAAYhN,KAAKma,UAAWna,KAAKqkB,SAAUrkB,KAAKqT,mBAG9EkR,qBAAA,SAASrL,GACL,GAAIlZ,KAAKyd,MAEL,OAAOK,EAAQvO,UAAU+J,SAASxJ,KAAK9P,KAAKyd,MAAM,GAAIvE,IAI9DqL,iBAAA,WACI,GAAIvkB,KAAKyd,MAEL,OAAOK,EAAQvO,UAAUyR,KAAKjR,MAAM/P,KAAKyd,MAAM,GAAI5N,YAI3D0U,qBAAA,WACI,GAAIvkB,KAAKyd,MAEL,OAAOK,EAAQvO,UAAUwR,SAAShR,MAAM/P,KAAKyd,MAAM,KAI3D8G,0BAAA,SAAc5W,EAASQ,EAAQsP,GAC3B,IACI/c,EADEkkB,EAAUnH,EAAM3e,OAKtB,GAHA6O,EAAQuT,SAAoC,GAAL,EAAnBvT,EAAQuT,UAGxBvT,EAAQuD,SAAU,CAElB,IADA/C,EAAOL,IAAI,KACNpN,EAAI,EAAGA,EAAIkkB,EAASlkB,IACrB+c,EAAM/c,GAAGmN,OAAOF,EAASQ,GAI7B,OAFAA,EAAOL,IAAI,UACXH,EAAQuT,WAKZ,IAAMG,EAAY,KAAK/T,MAAMK,EAAQuT,UAAUhT,KAAK,MAASkT,EAAgBC,OAC7E,GAAKuD,EAEE,CAGH,IAFAzW,EAAOL,IAAI,KAAKsT,GAChB3D,EAAM,GAAG5P,OAAOF,EAASQ,GACpBzN,EAAI,EAAGA,EAAIkkB,EAASlkB,IACrByN,EAAOL,IAAIsT,GACX3D,EAAM/c,GAAGmN,OAAOF,EAASQ,GAE7BA,EAAOL,IAAOuT,YARdlT,EAAOL,IAAI,KAAKuT,OAWpB1T,EAAQuT,eAnJKhU,GAuJrBqX,EAAOhV,UAAU3O,KAAO,SCxJxB,kBACI,WAAY6d,EAAS9C,GAArB,MACIzL,0BAEAC,EAAKsO,QAAUA,EACftO,EAAKwL,OAASA,EACdxL,EAAKoD,UAAUpD,EAAKsO,QAAStO,KAerC,OArB8Bf,OAS1ByV,mBAAA,SAAOxW,GACHrO,KAAKye,QAAUpQ,EAAQC,MAAMtO,KAAKye,UAGtCoG,iBAAA,SAAKlX,GACD,IAAMgO,EAAS3b,KAAK2b,QAAU6C,EAAgB7Q,EAAQgO,QACtD,OAAO,IAAIkJ,EAAgB7kB,KAAKye,QAAS9C,IAG7CkJ,qBAAA,SAASlX,GACL,OAAO3N,KAAKye,QAAQ/L,KAAK1S,KAAK2b,OAAS,IAAIb,EAASY,KAAK/N,EAAS3N,KAAK2b,OAAOza,OAAOyM,EAAQgO,SAAWhO,OAnBlFT,GAuB9B2X,EAAgBtV,UAAU3O,KAAO,kBACjCikB,EAAgBtV,UAAU8P,WAAY,ECxBtC,kBACI,WAAYyF,EAAWC,EAAaC,GAApC,MACI9U,0BAEAC,EAAK2U,UAAYA,EAAYtG,EAAgBsG,GAAWG,OAAS,GACjE9U,EAAK4U,YAAcA,EAAcvG,EAAgBuG,GAAaE,OAAS,GACnED,EACA7U,EAAK6U,WAAaA,EACXF,GAAaA,EAAUhmB,SAC9BqR,EAAK6U,WAAaF,EAAU,MA2HxC,OApImB1V,OAaf8V,kBAAA,WACI,OAAO,IAAIA,EAAK1G,EAAgBxe,KAAK8kB,WAAYtG,EAAgBxe,KAAK+kB,aAAc/kB,KAAKglB,aAG7FE,mBAAA,SAAOvX,EAASQ,GAEZ,IAAMgX,EAAcxX,GAAWA,EAAQwX,YACT,IAA1BnlB,KAAK8kB,UAAUhmB,OACfqP,EAAOL,IAAI9N,KAAK8kB,UAAU,KAClBK,GAAenlB,KAAKglB,WAC5B7W,EAAOL,IAAI9N,KAAKglB,aACRG,GAAenlB,KAAK+kB,YAAYjmB,QACxCqP,EAAOL,IAAI9N,KAAK+kB,YAAY,KAIpCG,qBAAA,WACI,IAAIxkB,EAAG0kB,EAAYplB,KAAK8kB,UAAU5W,KAAK,KACvC,IAAKxN,EAAI,EAAGA,EAAIV,KAAK+kB,YAAYjmB,OAAQ4B,IACrC0kB,GAAa,IAAIplB,KAAK+kB,YAAYrkB,GAEtC,OAAO0kB,GAGXF,oBAAA,SAAQrT,GACJ,OAAO7R,KAAKqlB,GAAGxT,EAAMW,YAAc,OAAIhG,GAG3C0Y,eAAA,SAAGI,GACC,OAAOtlB,KAAKwS,WAAW+S,gBAAkBD,EAAWC,eAGxDL,qBAAA,WACI,OAAOM,OAAO,wDAAyD,MAAM/K,KAAKza,KAAK8Q,UAG3FoU,oBAAA,WACI,OAAiC,IAA1BllB,KAAK8kB,UAAUhmB,QAA4C,IAA5BkB,KAAK+kB,YAAYjmB,QAG3DomB,uBAAA,WACI,OAAOllB,KAAK8kB,UAAUhmB,QAAU,GAAiC,IAA5BkB,KAAK+kB,YAAYjmB,QAG1DomB,gBAAA,SAAIO,GACA,IAAI/kB,EAEJ,IAAKA,EAAI,EAAGA,EAAIV,KAAK8kB,UAAUhmB,OAAQ4B,IACnCV,KAAK8kB,UAAUpkB,GAAK+kB,EAASzlB,KAAK8kB,UAAUpkB,IAAI,GAGpD,IAAKA,EAAI,EAAGA,EAAIV,KAAK+kB,YAAYjmB,OAAQ4B,IACrCV,KAAK+kB,YAAYrkB,GAAK+kB,EAASzlB,KAAK+kB,YAAYrkB,IAAI,IAI5DwkB,sBAAA,WACI,IAAIQ,EAEAC,EACAC,EAFEnQ,EAAS,GAaf,IAAKmQ,KATLD,EAAU,SAAUE,GAMhB,OAJIH,EAAMjoB,eAAeooB,KAAgBpQ,EAAOmQ,KAC5CnQ,EAAOmQ,GAAaC,GAGjBA,GAGOxZ,EACVA,EAAgB5O,eAAemoB,KAC/BF,EAAQrZ,EAAgBuZ,GAExB5lB,KAAKqQ,IAAIsV,IAIjB,OAAOlQ,GAGXyP,mBAAA,WACI,IACIW,EACAnlB,EAFEolB,EAAU,GAIhB,IAAKplB,EAAI,EAAGA,EAAIV,KAAK8kB,UAAUhmB,OAAQ4B,IAEnColB,EADAD,EAAa7lB,KAAK8kB,UAAUpkB,KACLolB,EAAQD,IAAe,GAAK,EAGvD,IAAKnlB,EAAI,EAAGA,EAAIV,KAAK+kB,YAAYjmB,OAAQ4B,IAErColB,EADAD,EAAa7lB,KAAK+kB,YAAYrkB,KACPolB,EAAQD,IAAe,GAAK,EAMvD,IAAKA,KAHL7lB,KAAK8kB,UAAY,GACjB9kB,KAAK+kB,YAAc,GAEAe,EACf,GAAIA,EAAQroB,eAAeooB,GAAa,CACpC,IAAME,EAAQD,EAAQD,GAEtB,GAAIE,EAAQ,EACR,IAAKrlB,EAAI,EAAGA,EAAIqlB,EAAOrlB,IACnBV,KAAK8kB,UAAUtkB,KAAKqlB,QAErB,GAAIE,EAAQ,EACf,IAAKrlB,EAAI,EAAGA,GAAKqlB,EAAOrlB,IACpBV,KAAK+kB,YAAYvkB,KAAKqlB,GAMtC7lB,KAAK8kB,UAAUG,OACfjlB,KAAK+kB,YAAYE,WAlIN/X,GAsInBgY,EAAK3V,UAAU3O,KAAO,OClItB,mBACI,WAAYwN,EAAO4X,GAAnB,MACI9V,mBAGA,GADAC,EAAK/B,MAAQ6X,WAAW7X,GACpB8X,MAAM/V,EAAK/B,OACX,MAAM,IAAI1O,MAAM,qCAEpByQ,EAAK6V,KAAQA,GAAQA,aAAgBd,EAAQc,EACzC,IAAId,EAAKc,EAAO,CAACA,QAAQxZ,GAC7B2D,EAAKoD,UAAUpD,EAAK6V,KAAM7V,KAyJlC,OAnKwBf,OAapB+W,mBAAA,SAAO9X,GACHrO,KAAKgmB,KAAO3X,EAAQC,MAAMtO,KAAKgmB,OAGnCG,iBAAA,SAAKxY,GACD,OAAO3N,MAGXmmB,oBAAA,WACI,OAAO,IAAIzV,EAAM,CAAC1Q,KAAKoO,MAAOpO,KAAKoO,MAAOpO,KAAKoO,SAGnD+X,mBAAA,SAAOxY,EAASQ,GACZ,GAAKR,GAAWA,EAAQwX,cAAiBnlB,KAAKgmB,KAAKI,aAC/C,MAAM,IAAI1mB,MAAM,sFAAsFM,KAAKgmB,KAAKxT,YAGpH,IAAMpE,EAAQpO,KAAKoR,OAAOzD,EAAS3N,KAAKoO,OACpCiY,EAAWC,OAAOlY,GAOtB,GALc,IAAVA,GAAeA,EAAQ,MAAYA,GAAS,OAE5CiY,EAAWjY,EAAMS,QAAQ,IAAI1R,QAAQ,MAAO,KAG5CwQ,GAAWA,EAAQuD,SAAU,CAE7B,GAAc,IAAV9C,GAAepO,KAAKgmB,KAAKO,WAEzB,YADApY,EAAOL,IAAIuY,GAKXjY,EAAQ,GAAKA,EAAQ,IACrBiY,EAAW,EAAWnP,OAAO,IAIrC/I,EAAOL,IAAIuY,GACXrmB,KAAKgmB,KAAKnY,OAAOF,EAASQ,IAM9BgY,oBAAA,SAAQxY,EAASY,EAAIsD,GAEjB,IAAIzD,EAAQpO,KAAK8R,SAASnE,EAASY,EAAIvO,KAAKoO,MAAOyD,EAAMzD,OAAQ4X,EAAOhmB,KAAKgmB,KAAK1R,QAElF,GAAW,MAAP/F,GAAqB,MAAPA,EACd,GAA8B,IAA1ByX,EAAKlB,UAAUhmB,QAA4C,IAA5BknB,EAAKjB,YAAYjmB,OAChDknB,EAAOnU,EAAMmU,KAAK1R,QACdtU,KAAKgmB,KAAKhB,aACVgB,EAAKhB,WAAahlB,KAAKgmB,KAAKhB,iBAE7B,GAAoC,IAAhCnT,EAAMmU,KAAKlB,UAAUhmB,QAA4C,IAA5BknB,EAAKjB,YAAYjmB,YAE1D,CAGH,GAFA+S,EAAQA,EAAM2U,UAAUxmB,KAAKgmB,KAAKS,aAE9B9Y,EAAQwX,aAAetT,EAAMmU,KAAKxT,aAAewT,EAAKxT,WACtD,MAAM,IAAI9S,MAAM,8EAA8EsmB,EAAKxT,qBAAoBX,EAAMmU,KAAKxT,iBAGtIpE,EAAQpO,KAAK8R,SAASnE,EAASY,EAAIvO,KAAKoO,MAAOyD,EAAMzD,WAE3C,MAAPG,GACPyX,EAAKlB,UAAYkB,EAAKlB,UAAU5jB,OAAO2Q,EAAMmU,KAAKlB,WAAWG,OAC7De,EAAKjB,YAAciB,EAAKjB,YAAY7jB,OAAO2Q,EAAMmU,KAAKjB,aAAaE,OACnEe,EAAKU,UACS,MAAPnY,IACPyX,EAAKlB,UAAYkB,EAAKlB,UAAU5jB,OAAO2Q,EAAMmU,KAAKjB,aAAaE,OAC/De,EAAKjB,YAAciB,EAAKjB,YAAY7jB,OAAO2Q,EAAMmU,KAAKlB,WAAWG,OACjEe,EAAKU,UAET,OAAO,IAAIP,EAAU/X,EAAO4X,IAGhCG,oBAAA,SAAQtU,GACJ,IAAIrD,EAAGC,EAEP,GAAMoD,aAAiBsU,EAAvB,CAIA,GAAInmB,KAAKgmB,KAAK/X,WAAa4D,EAAMmU,KAAK/X,UAClCO,EAAIxO,KACJyO,EAAIoD,OAIJ,GAFArD,EAAIxO,KAAK2mB,QACTlY,EAAIoD,EAAM8U,QACqB,IAA3BnY,EAAEwX,KAAKlX,QAAQL,EAAEuX,MACjB,OAIR,OAAO9Y,EAAK0Z,eAAepY,EAAEJ,MAAOK,EAAEL,SAG1C+X,kBAAA,WACI,OAAOnmB,KAAKwmB,UAAU,CAAE1nB,OAAQ,KAAM4M,SAAU,IAAKG,MAAO,SAGhEsa,sBAAA,SAAUU,GACN,IAEInmB,EACAklB,EACAF,EACAoB,EAEAC,EAPA3Y,EAAQpO,KAAKoO,MACX4X,EAAOhmB,KAAKgmB,KAAK1R,QAKnB0S,EAAqB,GAGzB,GAA2B,iBAAhBH,EAA0B,CACjC,IAAKnmB,KAAK2L,EACFA,EAAgB3L,GAAGjD,eAAeopB,MAClCG,EAAqB,IACFtmB,GAAKmmB,GAGhCA,EAAcG,EAiBlB,IAAKpB,KAfLmB,EAAY,SAAUlB,EAAYd,GAE9B,OAAIW,EAAMjoB,eAAeooB,IACjBd,EACA3W,GAAiBsX,EAAMG,GAAcH,EAAMoB,GAE3C1Y,GAAiBsX,EAAMG,GAAcH,EAAMoB,GAGxCA,GAGJjB,GAGOgB,EACVA,EAAYppB,eAAemoB,KAC3BkB,EAAaD,EAAYjB,GACzBF,EAAQrZ,EAAgBuZ,GAExBI,EAAK3V,IAAI0W,IAMjB,OAFAf,EAAKU,SAEE,IAAIP,EAAU/X,EAAO4X,OAjKZ9Y,GAqKxBiZ,GAAU5W,UAAU3O,KAAO,YCzK3B,IAAMqY,GAAO7D,iBAIT,WAAY7G,EAAI0Y,EAAUC,GAA1B,MACIhX,0BAEAC,EAAK5B,GAAKA,EAAGwE,OACb5C,EAAK8W,SAAWA,EAChB9W,EAAK+W,SAAWA,IA2CxB,OAjDwB9X,OASpB+X,mBAAA,SAAO9Y,GACHrO,KAAKinB,SAAW5Y,EAAQqJ,WAAW1X,KAAKinB,WAG5CE,iBAAA,SAAKxZ,GACD,IAA4EY,EAAxEC,EAAIxO,KAAKinB,SAAS,GAAGvU,KAAK/E,GAAUc,EAAIzO,KAAKinB,SAAS,GAAGvU,KAAK/E,GAElE,GAAIA,EAAQyO,SAASpc,KAAKuO,IAAK,CAQ3B,GAPAA,EAAiB,OAAZvO,KAAKuO,GAAc,IAAMvO,KAAKuO,GAC/BC,aAAa2X,IAAa1X,aAAaiC,IACvClC,EAAIA,EAAE4Y,WAEN3Y,aAAa0X,IAAa3X,aAAakC,IACvCjC,EAAIA,EAAE2Y,YAEL5Y,EAAE6Y,QAAS,CACZ,GAAI7Y,aAAa2Y,GAAsB,MAAT3Y,EAAED,IAAcZ,EAAQwH,OAAS8D,GAAKrF,gBAChE,OAAO,IAAIuT,EAAUnnB,KAAKuO,GAAI,CAACC,EAAGC,GAAIzO,KAAKknB,UAE/C,KAAM,CAAEtmB,KAAM,YACVmV,QAAS,gCAGjB,OAAOvH,EAAE6Y,QAAQ1Z,EAASY,EAAIE,GAE9B,OAAO,IAAI0Y,EAAUnnB,KAAKuO,GAAI,CAACC,EAAGC,GAAIzO,KAAKknB,WAInDC,mBAAA,SAAOxZ,EAASQ,GACZnO,KAAKinB,SAAS,GAAGpZ,OAAOF,EAASQ,GAC7BnO,KAAKknB,UACL/Y,EAAOL,IAAI,KAEfK,EAAOL,IAAI9N,KAAKuO,IACZvO,KAAKknB,UACL/Y,EAAOL,IAAI,KAEf9N,KAAKinB,SAAS,GAAGpZ,OAAOF,EAASQ,OA/CjBjB,GAmDxBia,GAAU5X,UAAU3O,KAAO,YCnD3B,mBACI,WAAYwN,EAAOkZ,GAAnB,MACIpX,mBAIA,GAFAC,EAAK/B,MAAQA,EACb+B,EAAKmX,UAAYA,GACZlZ,EACD,MAAM,IAAI1O,MAAM,mDAwD5B,OA/DyB0P,OAWrBmY,mBAAA,SAAOlZ,GACHrO,KAAKoO,MAAQC,EAAQqJ,WAAW1X,KAAKoO,QAGzCmZ,iBAAA,SAAK5Z,GACD,IAAI6Z,EACErL,EAASxO,EAAQyO,WACjBJ,EAAgBhc,KAAKynB,OAEvBC,GAAc,EA0BlB,OAzBI1L,GACArO,EAAQqO,gBAERhc,KAAKoO,MAAMtP,OAAS,EACpB0oB,EAAc,IAAID,EAAWvnB,KAAKoO,MAAMiC,KAAI,SAAU5Q,GAClD,OAAKA,EAAEiT,KAGAjT,EAAEiT,KAAK/E,GAFHlO,KAGXO,KAAKsnB,WACoB,IAAtBtnB,KAAKoO,MAAMtP,SACdkB,KAAKoO,MAAM,GAAGqZ,QAAWznB,KAAKoO,MAAM,GAAGuZ,YAAeha,EAAQmO,SAC9D4L,GAAc,GAElBF,EAAcxnB,KAAKoO,MAAM,GAAGsE,KAAK/E,IAEjC6Z,EAAcxnB,KAEdgc,GACArO,EAAQuO,oBAERlc,KAAKynB,SAAUznB,KAAK2nB,YAAexL,GAAWuL,GACxCF,aAAuBrB,KAC7BqB,EAAc,IAAI/U,EAAM+U,IAErBA,GAGXD,mBAAA,SAAO5Z,EAASQ,GACZ,IAAK,IAAIzN,EAAI,EAAGA,EAAIV,KAAKoO,MAAMtP,OAAQ4B,IACnCV,KAAKoO,MAAM1N,GAAGmN,OAAOF,EAASQ,IACzBnO,KAAKsnB,WAAa5mB,EAAI,EAAIV,KAAKoO,MAAMtP,QACtCqP,EAAOL,IAAI,MAKvByZ,8BAAA,WACIvnB,KAAKoO,MAAQpO,KAAKoO,MAAMoR,QAAO,SAAStN,GACpC,QAASA,aAAayI,UA5DTzN,GAiEzBqa,GAAWhY,UAAU3O,KAAO,aCtE5B,kBACI,WAAYsY,EAAMvL,EAASK,EAAOoF,GAC9BpT,KAAKkZ,KAAOA,EAAK5G,cACjBtS,KAAKgO,MAAQA,EACbhO,KAAK2N,QAAUA,EACf3N,KAAKoT,gBAAkBA,EAEvBpT,KAAKyW,KAAO9I,EAAQgO,OAAO,GAAGmD,iBAAiB/R,IAAI/M,KAAKkZ,MAuChE,OApCI0O,oBAAA,WACI,OAAO5O,QAAQhZ,KAAKyW,OAGxBmR,iBAAA,SAAKzW,GAAL,WACU7D,MAAMC,QAAQ4D,KAChBA,EAAO,CAACA,IAEZ,IAAM0W,EAAW7nB,KAAKyW,KAAKoR,UACV,IAAbA,IACA1W,EAAOA,EAAKd,KAAI,SAAA7B,GAAK,OAAAA,EAAEkE,KAAKvC,EAAKxC,aAErC,IAAMma,EAAgB,SAAAC,GAAQ,QAAgB,YAAdA,EAAKnnB,OAkBrC,OAdAuQ,EAAOA,EACFqO,OAAOsI,GACPzX,KAAI,SAAA0X,GACD,GAAkB,eAAdA,EAAKnnB,KAAuB,CAC5B,IAAMonB,EAAWD,EAAK3Z,MAAMoR,OAAOsI,GACnC,OAAwB,IAApBE,EAASlpB,OACFkpB,EAAS,GAET,IAAIT,GAAWS,GAG9B,OAAOD,MAGE,IAAbF,EACO7nB,KAAKyW,WAALzW,gBzB2Gf,IAAK,IAAI2L,EAAI,EAAGjL,EAAI,EAAGunB,EAAKpY,UAAU/Q,OAAQ4B,EAAIunB,EAAIvnB,IAAKiL,GAAKkE,UAAUnP,GAAG5B,OACxE,IAAI6R,EAAIrD,MAAM3B,GAAI8X,EAAI,EAA3B,IAA8B/iB,EAAI,EAAGA,EAAIunB,EAAIvnB,IACzC,IAAK,IAAI8N,EAAIqB,UAAUnP,GAAIyd,EAAI,EAAG+J,EAAK1Z,EAAE1P,OAAQqf,EAAI+J,EAAI/J,IAAKsF,IAC1D9S,EAAE8S,GAAKjV,EAAE2P,GACjB,OAAOxN,IyB/GkB3Q,KAAK2N,SAAYwD,IAG/BnR,KAAKyW,WAALzW,KAAamR,wBCrCxB,WAAY+H,EAAM/H,EAAMnD,EAAOoF,GAA/B,MACIlD,0BAEAC,EAAK+I,KAAOA,EACZ/I,EAAKgB,KAAOA,EACZhB,EAAKgY,KAAgB,SAATjP,EACZ/I,EAAK1C,OAASO,EACdmC,EAAKzC,UAAY0F,IA8FzB,OAtGmBhE,OAWfgZ,mBAAA,SAAO/Z,GACCrO,KAAKmR,OACLnR,KAAKmR,KAAO9C,EAAQqJ,WAAW1X,KAAKmR,QAe5CiX,iBAAA,SAAKza,GAAL,WAIU0a,EAAqB1a,EAAQwO,OACnCxO,EAAQwO,QAAUnc,KAAKmoB,MACnBnoB,KAAKmoB,MAAQxa,EAAQmO,SACrBnO,EAAQiO,YAGZ,IAOInG,EAPEsG,EAAW,YACT5L,EAAKgY,MAAQxa,EAAQmO,SACrBnO,EAAQoO,WAEZpO,EAAQwO,OAASkM,GAIfC,EAAa,IAAIC,GAAevoB,KAAKkZ,KAAMvL,EAAS3N,KAAKiN,WAAYjN,KAAKgN,YAEhF,GAAIsb,EAAWE,UACX,IACI/S,EAAS6S,EAAWxY,KAAK9P,KAAKmR,MAC9B4K,IACF,MAAOtc,GACL,GAAIA,EAAEhC,eAAe,SAAWgC,EAAEhC,eAAe,UAC7C,MAAMgC,EAEV,KAAM,CACFmB,KAAMnB,EAAEmB,MAAQ,UAChBmV,QAAS,8BAA+B/V,KAAKkZ,UAASzZ,EAAEsW,QAAU,KAAKtW,EAAEsW,QAAY,IACrF/H,MAAOhO,KAAKiN,WACZ1L,SAAUvB,KAAKgN,WAAWzL,SAC1B0S,KAAMxU,EAAE6a,WACRpG,OAAQzU,EAAEgpB,cAKtB,GAAIhT,MAAAA,EAcA,OAXMA,aAAkBvI,IAKhBuI,EAAS,IAAIsD,EAJZtD,IAAqB,IAAXA,EAIYA,EAAOjD,WAHP,OAO/BiD,EAAOhI,OAASzN,KAAKyN,OACrBgI,EAAO/H,UAAY1N,KAAK0N,UACjB+H,EAGX,IAAMtE,EAAOnR,KAAKmR,KAAKd,KAAI,SAAA7B,GAAK,OAAAA,EAAEkE,KAAK/E,MAGvC,OAFAoO,IAEO,IAAIqM,EAAKpoB,KAAKkZ,KAAM/H,EAAMnR,KAAKiN,WAAYjN,KAAKgN,aAG3Dob,mBAAA,SAAOza,EAASQ,GACZA,EAAOL,IAAO9N,KAAKkZ,SAASlZ,KAAKgN,WAAYhN,KAAKiN,YAElD,IAAK,IAAIvM,EAAI,EAAGA,EAAIV,KAAKmR,KAAKrS,OAAQ4B,IAClCV,KAAKmR,KAAKzQ,GAAGmN,OAAOF,EAASQ,GACzBzN,EAAI,EAAIV,KAAKmR,KAAKrS,QAClBqP,EAAOL,IAAI,MAInBK,EAAOL,IAAI,SApGAZ,GAwGnBkb,GAAK7Y,UAAU3O,KAAO,OC7GtB,mBACI,WAAYsY,EAAMlL,EAAOoF,GAAzB,MACIlD,0BAEAC,EAAK+I,KAAOA,EACZ/I,EAAK1C,OAASO,EACdmC,EAAKzC,UAAY0F,IAqDzB,OA3DuBhE,OASnBsZ,iBAAA,SAAK/a,GACD,IAAI2L,EAAUJ,EAAOlZ,KAAKkZ,KAM1B,GAJ2B,IAAvBA,EAAK7H,QAAQ,QACb6H,EAAO,IAAI,IAAIwP,EAASxP,EAAK3G,MAAM,GAAIvS,KAAKiN,WAAYjN,KAAKgN,YAAY0F,KAAK/E,GAASS,OAGvFpO,KAAK2oB,WACL,KAAM,CAAE/nB,KAAM,OACVmV,QAAS,qCAAqCmD,EAC9C3X,SAAUvB,KAAKgN,WAAWzL,SAC1ByM,MAAOhO,KAAKiN,YAqBpB,GAlBAjN,KAAK2oB,YAAa,EAElBrP,EAAWtZ,KAAKghB,KAAKrT,EAAQgO,QAAQ,SAAUiN,GAC3C,IAAM1W,EAAI0W,EAAMtP,SAASJ,GACzB,GAAIhH,EAAG,CACH,GAAIA,EAAEiH,UACqBxL,EAAQkM,eAAelM,EAAQkM,eAAe/a,OAAS,GAC/Dqa,UAAYjH,EAAEiH,UAGjC,OAAIxL,EAAQmO,OACD,IAAKsM,GAAK,QAAS,CAAClW,EAAE9D,QAASsE,KAAK/E,GAGpCuE,EAAE9D,MAAMsE,KAAK/E,OAM5B,OADA3N,KAAK2oB,YAAa,EACXrP,EAEP,KAAM,CAAE1Y,KAAM,OACVmV,QAAS,YAAYmD,kBACrB3X,SAAUvB,KAAKgN,WAAWzL,SAC1ByM,MAAOhO,KAAKiN,aAIxByb,iBAAA,SAAKnU,EAAKsU,GACN,IAAK,IAAInoB,EAAI,EAAGiQ,SAAGjQ,EAAI6T,EAAIzV,OAAQ4B,IAE/B,GADAiQ,EAAIkY,EAAI/Y,KAAKyE,EAAKA,EAAI7T,IACb,OAAOiQ,EAEpB,OAAO,SAzDQzD,GA6DvBwb,GAASnZ,UAAU3O,KAAO,WC7D1B,mBACI,WAAYsY,EAAMlL,EAAOoF,GAAzB,MACIlD,0BAEAC,EAAK+I,KAAOA,EACZ/I,EAAK1C,OAASO,EACdmC,EAAKzC,UAAY0F,IAgEzB,OAtEuBhE,OASnB0Z,iBAAA,SAAKnb,GACD,IAAIob,EACE7P,EAAOlZ,KAAKkZ,KAEZ8P,EAAarb,EAAQ/L,cAAcqnB,KAAKC,SAASC,aAAa5Z,UAAU6Z,YAE9E,GAAIppB,KAAK2oB,WACL,KAAM,CAAE/nB,KAAM,OACVmV,QAAS,oCAAoCmD,EAC7C3X,SAAUvB,KAAKgN,WAAWzL,SAC1ByM,MAAOhO,KAAKiN,YAiCpB,GA9BAjN,KAAK2oB,YAAa,EAElBI,EAAW/oB,KAAKghB,KAAKrT,EAAQgO,QAAQ,SAAUiN,GAC3C,IAAI1W,EACEmX,EAAOT,EAAMG,SAAS7P,GAC5B,GAAImQ,EAAM,CACN,IAAK,IAAI3oB,EAAI,EAAGA,EAAI2oB,EAAKvqB,OAAQ4B,IAC7BwR,EAAImX,EAAK3oB,GAET2oB,EAAK3oB,GAAK,IAAI6Y,EAAYrH,EAAEgH,KACxBhH,EAAE9D,MACF8D,EAAEiH,UACFjH,EAAEkH,MACFlH,EAAElE,MACFkE,EAAEkB,gBACFlB,EAAEmH,OACFnH,EAAEoH,UAMV,GAHA0P,EAAWK,IAEXnX,EAAImX,EAAKA,EAAKvqB,OAAS,IACjBqa,UACqBxL,EAAQkM,eAAelM,EAAQkM,eAAe/a,OAAS,GAC/Dqa,UAAYjH,EAAEiH,UAGjC,OADAjH,EAAIA,EAAE9D,MAAMsE,KAAK/E,OAMrB,OADA3N,KAAK2oB,YAAa,EACXI,EAEP,KAAM,CAAEnoB,KAAM,OACVmV,QAAS,aAAamD,mBACtB3X,SAAUvB,KAAKoT,gBAAgB7R,SAC/ByM,MAAOhO,KAAKgO,QAIxB8a,iBAAA,SAAKvU,EAAKsU,GACN,IAAK,IAAInoB,EAAI,EAAGiQ,SAAGjQ,EAAI6T,EAAIzV,OAAQ4B,IAE/B,GADAiQ,EAAIkY,EAAI/Y,KAAKyE,EAAKA,EAAI7T,IACb,OAAOiQ,EAEpB,OAAO,SApEQzD,GAwEvB4b,GAASvZ,UAAU3O,KAAO,WCzE1B,mBACI,WAAYyR,EAAK9D,EAAIH,GAArB,MACI8B,0BAEAC,EAAKkC,IAAMA,EACXlC,EAAK5B,GAAKA,EACV4B,EAAK/B,MAAQA,IAsBrB,OA5BwBgB,OASpBka,iBAAA,SAAK3b,GACD,OAAO,IAAI2b,EAAUtpB,KAAKqS,IAAIK,KAAO1S,KAAKqS,IAAIK,KAAK/E,GAAW3N,KAAKqS,IAC/DrS,KAAKuO,GAAKvO,KAAKoO,OAASpO,KAAKoO,MAAMsE,KAAQ1S,KAAKoO,MAAMsE,KAAK/E,GAAW3N,KAAKoO,QAGnFkb,mBAAA,SAAO3b,EAASQ,GACZA,EAAOL,IAAI9N,KAAK8Q,MAAMnD,KAG1B2b,kBAAA,SAAM3b,GACF,IAAIS,EAAQpO,KAAKqS,IAAIvB,MAAQ9Q,KAAKqS,IAAIvB,MAAMnD,GAAW3N,KAAKqS,IAO5D,OALIrS,KAAKuO,KACLH,GAASpO,KAAKuO,GACdH,GAAUpO,KAAKoO,MAAM0C,MAAQ9Q,KAAKoO,MAAM0C,MAAMnD,GAAW3N,KAAKoO,OAG3D,IAAIA,UA1BKlB,GA8BxBoc,GAAU/Z,UAAU3O,KAAO,YC3B3B,mBACI,WAAYoW,EAAKuS,EAASC,EAASxb,EAAOoF,GAA1C,MACIlD,0BAEAC,EAAKqZ,QAAsB,MAAXA,GAA0BA,EAC1CrZ,EAAK/B,MAAQmb,GAAW,GACxBpZ,EAAKsZ,MAAQzS,EAAItD,OAAO,GACxBvD,EAAK1C,OAASO,EACdmC,EAAKzC,UAAY0F,EACjBjD,EAAKuZ,cAAgB,iBACrBvZ,EAAKwZ,UAAY,kBACjBxZ,EAAK2I,UAAY0Q,IAiDzB,OA5DqBpa,OAcjBwa,mBAAA,SAAOjc,EAASQ,GACPnO,KAAKwpB,SACNrb,EAAOL,IAAI9N,KAAKypB,MAAOzpB,KAAKgN,WAAYhN,KAAKiN,YAEjDkB,EAAOL,IAAI9N,KAAKoO,OACXpO,KAAKwpB,SACNrb,EAAOL,IAAI9N,KAAKypB,QAIxBG,8BAAA,WACI,OAAO5pB,KAAKoO,MAAMgC,MAAMpQ,KAAK0pB,gBAGjCE,iBAAA,SAAKjc,GACD,IAAMkc,EAAO7pB,KACToO,EAAQpO,KAAKoO,MASjB,SAAS0b,EAAiB1b,EAAO2b,EAAQC,GACrC,IAAIC,EAAiB7b,EACrB,GACIA,EAAQ6b,EAAezX,WACvByX,EAAiB7b,EAAMjR,QAAQ4sB,EAAQC,SAClC5b,IAAU6b,GACnB,OAAOA,EAIX,OAFA7b,EAAQ0b,EAAiB1b,EAAOpO,KAAK0pB,eAhBT,SAAU9rB,EAAGsb,GACrC,IAAMhH,EAAI,IAAIwW,GAAS,IAAIxP,EAAQ2Q,EAAK5c,WAAY4c,EAAK7c,YAAY0F,KAAK/E,GAAS,GACnF,OAAQuE,aAAa0X,EAAU1X,EAAE9D,MAAQ8D,EAAEpB,WAe/C1C,EAAQ0b,EAAiB1b,EAAOpO,KAAK2pB,WAbT,SAAU/rB,EAAGsb,GACrC,IAAMhH,EAAI,IAAI4W,GAAS,IAAI5P,EAAQ2Q,EAAK5c,WAAY4c,EAAK7c,YAAY0F,KAAK/E,GAAS,GACnF,OAAQuE,aAAa0X,EAAU1X,EAAE9D,MAAQ8D,EAAEpB,WAYxC,IAAI8Y,EAAO5pB,KAAKypB,MAAQrb,EAAQpO,KAAKypB,MAAOrb,EAAOpO,KAAKwpB,QAASxpB,KAAKiN,WAAYjN,KAAKgN,aAGlG4c,oBAAA,SAAQ/X,GAEJ,MAAmB,WAAfA,EAAMjR,MAAsBZ,KAAKwpB,SAAY3X,EAAM2X,QAG5C3X,EAAMf,OAAS9Q,KAAK8Q,UAAYe,EAAMf,QAAU,OAAItE,EAFpDU,EAAK0Z,eAAe5mB,KAAKoO,MAAOyD,EAAMzD,WAvDpClB,GA8DrB0c,GAAOra,UAAU3O,KAAO,SCjExB,mBACI,WAAYspB,EAAKlc,EAAOoF,EAAiB+W,GAAzC,MACIja,0BAEAC,EAAK/B,MAAQ8b,EACb/Z,EAAK1C,OAASO,EACdmC,EAAKzC,UAAY0F,EACjBjD,EAAKga,QAAUA,IA+CvB,OAtDkB/a,OAUdgb,mBAAA,SAAO/b,GACHrO,KAAKoO,MAAQC,EAAQC,MAAMtO,KAAKoO,QAGpCgc,mBAAA,SAAOzc,EAASQ,GACZA,EAAOL,IAAI,QACX9N,KAAKoO,MAAMP,OAAOF,EAASQ,GAC3BA,EAAOL,IAAI,MAGfsc,iBAAA,SAAKzc,GACD,IACI4O,EADE2N,EAAMlqB,KAAKoO,MAAMsE,KAAK/E,GAG5B,IAAK3N,KAAKmqB,UAGkB,iBADxB5N,EAAWvc,KAAKgN,YAAchN,KAAKgN,WAAWuP,WAErB,iBAAd2N,EAAI9b,OACXT,EAAQ0O,oBAAoB6N,EAAI9b,QAC3B8b,EAAIT,QACLlN,EAAsBA,EA4B1Bpf,QAAQ,eAAe,SAASiT,GAAS,MAAO,KAAKA,MA1BrD8Z,EAAI9b,MAAQT,EAAQ2O,YAAY4N,EAAI9b,MAAOmO,IAE3C2N,EAAI9b,MAAQT,EAAQ8O,cAAcyN,EAAI9b,OAItCT,EAAQ0c,UACHH,EAAI9b,MAAMgC,MAAM,cAAc,CAC/B,IACMia,IADwC,IAA5BH,EAAI9b,MAAMiD,QAAQ,KAAc,IAAM,KAC5B1D,EAAQ0c,SACJ,IAA5BH,EAAI9b,MAAMiD,QAAQ,KAClB6Y,EAAI9b,MAAQ8b,EAAI9b,MAAMjR,QAAQ,IAAQktB,OAEtCH,EAAI9b,OAASic,EAM7B,OAAO,IAAID,EAAIF,EAAKlqB,KAAKiN,WAAYjN,KAAKgN,YAAY,OApD5CE,GAwDlBkd,GAAI7a,UAAU3O,KAAO,MClDrB,mBACI,WAAYwN,EAAOkc,EAAUtc,EAAOoF,EAAiBC,GAArD,MACInD,mBAEAC,EAAK1C,OAASO,EACdmC,EAAKzC,UAAY0F,EAEjB,IAAMoK,EAAY,IAAK/F,EAAS,GAAI,KAAM,KAAMtH,EAAK1C,OAAQ0C,EAAKzC,WAAY4W,8BAE9EnU,EAAKma,SAAW,IAAI9R,EAAM8R,GAC1Bna,EAAKsN,MAAQ,CAAC,IAAIK,EAAQN,EAAWpP,IACrC+B,EAAKsN,MAAM,GAAGoB,cAAe,EAC7B1O,EAAKmD,mBAAmBD,GACxBlD,EAAK2I,WAAY,EACjB3I,EAAKoD,UAAUiK,EAAWrN,GAC1BA,EAAKoD,UAAUpD,EAAKma,SAAUna,GAC9BA,EAAKoD,UAAUpD,EAAKsN,MAAOtN,KA8HnC,OA9IoBf,OAmBhBmb,0BAAA,WACI,OAAO,GAGXA,mBAAA,SAAOlc,GACCrO,KAAKsqB,WACLtqB,KAAKsqB,SAAWjc,EAAQC,MAAMtO,KAAKsqB,WAEnCtqB,KAAKyd,QACLzd,KAAKyd,MAAQpP,EAAQqJ,WAAW1X,KAAKyd,SAI7C8M,mBAAA,SAAO5c,EAASQ,GACZA,EAAOL,IAAI,UAAW9N,KAAK0N,UAAW1N,KAAKyN,QAC3CzN,KAAKsqB,SAASzc,OAAOF,EAASQ,GAC9BnO,KAAKwkB,cAAc7W,EAASQ,EAAQnO,KAAKyd,QAG7C8M,iBAAA,SAAK5c,GACIA,EAAQ4R,cACT5R,EAAQ4R,YAAc,GACtB5R,EAAQgX,UAAY,IAGxB,IAAMlmB,EAAQ,IAAI8rB,EAAM,KAAM,GAAIvqB,KAAKyN,OAAQzN,KAAK0N,UAAW1N,KAAKqT,kBAkBpE,OAjBIrT,KAAKma,YACLna,KAAKyd,MAAM,GAAGtD,UAAYna,KAAKma,UAC/B1b,EAAM0b,UAAYna,KAAKma,WAG3B1b,EAAM6rB,SAAWtqB,KAAKsqB,SAAS5X,KAAK/E,GAEpCA,EAAQgX,UAAUnkB,KAAK/B,GACvBkP,EAAQ4R,YAAY/e,KAAK/B,GAEzBuB,KAAKyd,MAAM,GAAGqB,iBAAmBnR,EAAQgO,OAAO,GAAGmD,iBAAiB3B,UACpExP,EAAQgO,OAAOsD,QAAQjf,KAAKyd,MAAM,IAClChf,EAAMgf,MAAQ,CAACzd,KAAKyd,MAAM,GAAG/K,KAAK/E,IAClCA,EAAQgO,OAAOtD,QAEf1K,EAAQgX,UAAU5K,MAEkB,IAA7BpM,EAAQgX,UAAU7lB,OAAeL,EAAM+rB,QAAQ7c,GAClDlP,EAAMgsB,WAAW9c,IAGzB4c,oBAAA,SAAQ5c,GACJ,IAAI8H,EAASzV,KAGb,GAAI2N,EAAQ4R,YAAYzgB,OAAS,EAAG,CAChC,IAAM0e,EAAY,IAAK/F,EAAS,GAAI,KAAM,KAAMzX,KAAKiN,WAAYjN,KAAKgN,YAAasX,wBACnF7O,EAAS,IAAIqI,EAAQN,EAAW7P,EAAQ4R,cACjCmL,YAAa,EACpBjV,EAAOnC,mBAAmBtT,KAAKqT,kBAC/BrT,KAAKuT,UAAUkC,EAAQzV,MAM3B,cAHO2N,EAAQ4R,mBACR5R,EAAQgX,UAERlP,GAGX8U,uBAAA,SAAW5c,GACP,IAAIjN,EACA0N,EACEoN,EAAO7N,EAAQgX,UAAUzjB,OAAO,CAAClB,OAGvC,IAAKU,EAAI,EAAGA,EAAI8a,EAAK1c,OAAQ4B,IACzB0N,EAAQoN,EAAK9a,GAAG4pB,oBAAoB9R,EAChCgD,EAAK9a,GAAG4pB,SAASlc,MAAQoN,EAAK9a,GAAG4pB,SACrC9O,EAAK9a,GAAK4M,MAAMC,QAAQa,GAASA,EAAQ,CAACA,GAsB9C,OAZApO,KAAKsqB,SAAW,IAAI9R,EAAMxY,KAAK2qB,QAAQnP,GAAMnL,KAAI,SAAAmL,GAG7C,IAFAA,EAAOA,EAAKnL,KAAI,SAAAua,GAAY,OAAAA,EAAS9Z,MAAQ8Z,EAAW,IAAI7R,EAAU6R,MAEjElqB,EAAI8a,EAAK1c,OAAS,EAAG4B,EAAI,EAAGA,IAC7B8a,EAAK7a,OAAOD,EAAG,EAAG,IAAIqY,EAAU,QAGpC,OAAO,IAAIwO,GAAW/L,OAE1Bxb,KAAKuT,UAAUvT,KAAKsqB,SAAUtqB,MAGvB,IAAI8d,EAAQ,GAAI,KAG3ByM,oBAAA,SAAQnW,GACJ,GAAmB,IAAfA,EAAItV,OACJ,MAAO,GACJ,GAAmB,IAAfsV,EAAItV,OACX,OAAOsV,EAAI,GAIX,IAFA,IAAMqB,EAAS,GACToV,EAAO7qB,KAAK2qB,QAAQvW,EAAI7B,MAAM,IAC3B7R,EAAI,EAAGA,EAAImqB,EAAK/rB,OAAQ4B,IAC7B,IAAK,IAAIyd,EAAI,EAAGA,EAAI/J,EAAI,GAAGtV,OAAQqf,IAC/B1I,EAAOjV,KAAK,CAAC4T,EAAI,GAAG+J,IAAIjd,OAAO2pB,EAAKnqB,KAG5C,OAAO+U,GAIf8U,4BAAA,SAAgB/M,GACPA,IAGLxd,KAAKyd,MAAQ,CAAC,IAAIK,EAAQU,EAAgBhB,GAAY,CAACxd,KAAKyd,MAAM,MAClEzd,KAAKuT,UAAUvT,KAAKyd,MAAOzd,WA5IfukB,GAgJpBgG,GAAMhb,UAAU3O,KAAO,QCnIvB,mBACI,WAAY4a,EAAM8O,EAAUjtB,EAAS2Q,EAAOoF,EAAiBC,GAA7D,MACInD,mBASA,GAPAC,EAAK9S,QAAUA,EACf8S,EAAK1C,OAASO,EACdmC,EAAKzC,UAAY0F,EACjBjD,EAAKqL,KAAOA,EACZrL,EAAKma,SAAWA,EAChBna,EAAK2I,WAAY,OAEStM,IAAtB2D,EAAK9S,QAAQ4rB,MAAsB9Y,EAAK9S,QAAQgc,OAChDlJ,EAAK2a,KAAO3a,EAAK9S,QAAQ4rB,MAAQ9Y,EAAK9S,QAAQgc,WAC3C,CACH,IAAM0R,EAAY5a,EAAK6a,UACnBD,GAAa,0BAA0BtQ,KAAKsQ,KAC5C5a,EAAK2a,KAAM,UAGnB3a,EAAKmD,mBAAmBD,GACxBlD,EAAKoD,UAAUpD,EAAKma,SAAUna,GAC9BA,EAAKoD,UAAUpD,EAAKqL,KAAMrL,KA4IlC,OAjKqBf,OAwBjB6b,mBAAA,SAAO5c,GACCrO,KAAKsqB,WACLtqB,KAAKsqB,SAAWjc,EAAQC,MAAMtO,KAAKsqB,WAEvCtqB,KAAKwb,KAAOnN,EAAQC,MAAMtO,KAAKwb,MAC1Bxb,KAAK3C,QAAQ6tB,UAAalrB,KAAK3C,QAAQgc,SAAUrZ,KAAK2e,OACvD3e,KAAK2e,KAAOtQ,EAAQC,MAAMtO,KAAK2e,QAIvCsM,mBAAA,SAAOtd,EAASQ,GACRnO,KAAK8qB,UAAyCte,IAAlCxM,KAAKwb,KAAK9N,UAAUyd,YAChChd,EAAOL,IAAI,WAAY9N,KAAK0N,UAAW1N,KAAKyN,QAC5CzN,KAAKwb,KAAK3N,OAAOF,EAASQ,GACtBnO,KAAKsqB,WACLnc,EAAOL,IAAI,KACX9N,KAAKsqB,SAASzc,OAAOF,EAASQ,IAElCA,EAAOL,IAAI,OAInBmd,oBAAA,WACI,OAAQjrB,KAAKwb,gBAAgB4O,GACzBpqB,KAAKwb,KAAKpN,MAAMA,MAAQpO,KAAKwb,KAAKpN,OAG1C6c,6BAAA,WACI,IAAIzP,EAAOxb,KAAKwb,KAIhB,OAHIA,aAAgB4O,KAChB5O,EAAOA,EAAKpN,SAEZoN,aAAgBoO,KACTpO,EAAK4P,qBAMpBH,0BAAA,SAActd,GACV,IAAI6N,EAAOxb,KAAKwb,KAMhB,OAJIA,aAAgB4O,KAChB5O,EAAOA,EAAKpN,OAGT,IAAI6c,EAAOzP,EAAK9I,KAAK/E,GAAU3N,KAAKsqB,SAAUtqB,KAAK3C,QAAS2C,KAAKyN,OAAQzN,KAAK0N,UAAW1N,KAAKqT,mBAGzG4X,qBAAA,SAAStd,GACL,IAAM6N,EAAOxb,KAAKwb,KAAK9I,KAAK/E,GACtBX,EAAWhN,KAAK0N,UAEtB,KAAM8N,aAAgB4O,IAAM,CAExB,IAAMW,EAAYvP,EAAKpN,MACnBpB,GACA+d,GACApd,EAAQ0O,oBAAoB0O,GAC5BvP,EAAKpN,MAAQT,EAAQ2O,YAAYyO,EAAW/d,EAASuP,UAErDf,EAAKpN,MAAQT,EAAQ8O,cAAcjB,EAAKpN,OAIhD,OAAOoN,GAGXyP,iBAAA,SAAKtd,GACD,IAAM8H,EAASzV,KAAKqrB,OAAO1d,GAW3B,OAVI3N,KAAK3C,QAAQ8tB,WAAanrB,KAAKsrB,sBAC3B7V,EAAO3W,QAA4B,IAAlB2W,EAAO3W,OACxB2W,EAAOjI,SAAQ,SAAUH,GACrBA,EAAKke,wBAIT9V,EAAO8V,sBAGR9V,GAGXwV,mBAAA,SAAOtd,GACH,IAAI8Q,EACA+M,EACElB,EAAWtqB,KAAKsqB,UAAYtqB,KAAKsqB,SAAS5X,KAAK/E,GAErD,GAAI3N,KAAK3C,QAAQ6tB,SAAU,CACvB,GAAIlrB,KAAK2e,MAAQ3e,KAAK2e,KAAKjM,KACvB,IACI1S,KAAK2e,KAAKjM,KAAK/E,GAEnB,MAAOlO,GAEH,MADAA,EAAEsW,QAAU,iCACN,IAAIH,EAAUnW,EAAGO,KAAK2e,KAAK3G,QAAShY,KAAK2e,KAAKpd,UAQ5D,OALAiqB,EAAW7d,EAAQgO,OAAO,IAAMhO,EAAQgO,OAAO,GAAGmD,mBACjC9e,KAAK2e,MAAQ3e,KAAK2e,KAAK1d,WACpCuqB,EAASxO,YAAahd,KAAK2e,KAAK1d,WAG7B,GAGX,GAAIjB,KAAKyrB,OACoB,mBAAdzrB,KAAKyrB,OACZzrB,KAAKyrB,KAAOzrB,KAAKyrB,QAEjBzrB,KAAKyrB,MACL,MAAO,GAGf,GAAIzrB,KAAK3C,QAAQgc,OAAQ,CACrB,IAAMnD,EAAW,IAAI6C,EAAU/Y,KAAK2e,KAAM,EACtC,CACIpd,SAAUvB,KAAK0rB,iBACfP,UAAWnrB,KAAKwb,KAAK9N,WAAa1N,KAAKwb,KAAK9N,UAAUyd,YACvD,GAAM,GAEb,OAAOnrB,KAAKsqB,SAAW,IAAIC,GAAM,CAACrU,GAAWlW,KAAKsqB,SAASlc,OAAS,CAAC8H,GAClE,GAAIlW,KAAK8qB,IAAK,CACjB,IAAMa,EAAY,IAAIV,EAAOjrB,KAAK4rB,SAASje,GAAU2c,EAAUtqB,KAAK3C,QAAS2C,KAAKyN,QAClF,IAAKke,EAAUb,KAAO9qB,KAAKF,MACvB,MAAME,KAAKF,MAEf,OAAO6rB,EACJ,OAAI3rB,KAAK2e,OACZF,EAAU,IAAIX,EAAQ,KAAMU,EAAgBxe,KAAK2e,KAAKlB,SAC9C0B,YAAYxR,GAEb3N,KAAKsqB,SAAW,IAAIC,GAAM9L,EAAQhB,MAAOzd,KAAKsqB,SAASlc,OAASqQ,EAAQhB,OAExE,OA9JEvQ,GAmKrB+d,GAAO1b,UAAU3O,KAAO,SCrLxB,mBCGI,WAAYirB,EAAQrC,EAASxb,EAAOoF,GAApC,MACIlD,0BAEAC,EAAKqZ,QAAUA,EACfrZ,EAAK2b,WAAaD,EAClB1b,EAAK1C,OAASO,EACdmC,EAAKzC,UAAY0F,IAiBzB,OAxByBhE,OAUrB2c,iBAAA,SAAKpe,GACD,IAAM8H,EAASzV,KAAKgsB,mBAAmBhsB,KAAK8rB,WAAYne,GAClD/M,SAAc6U,EAEpB,MAAa,WAAT7U,GAAsBslB,MAAMzQ,GAEZ,WAAT7U,EACA,IAAIgpB,GAAO,IAAInU,MAAWA,EAAQzV,KAAKwpB,QAASxpB,KAAKyN,QACrDH,MAAMC,QAAQkI,GACd,IAAIsD,EAAUtD,EAAOvH,KAAK,OAE1B,IAAI6K,EAAUtD,GANd,IAAI0Q,GAAU1Q,mBDjBjC,4DAsDA,OAtDyBrG,OACrB6c,+BAAA,SAAmBH,EAAYne,GAC3B,IAAI8H,EACEoU,EAAO7pB,KACPksB,EAAc,GAEpB,IAAKve,EAAQwe,kBACT,KAAM,CAAEpW,QAAS,+DACbxU,SAAUvB,KAAKgN,WAAWzL,SAC1ByM,MAAOhO,KAAKiN,YAGpB6e,EAAaA,EAAW3uB,QAAQ,kBAAkB,SAAUS,EAAGsb,GAC3D,OAAO2Q,EAAKuC,MAAM,IAAI1D,GAAS,IAAIxP,EAAQ2Q,EAAK5c,WAAY4c,EAAK7c,YAAY0F,KAAK/E,OAGtF,IACIme,EAAa,IAAIpV,SAAS,WAAWoV,OACvC,MAAOrsB,GACL,KAAM,CAAEsW,QAAS,gCAAgCtW,EAAEsW,kBAAkB+V,MACjEvqB,SAAUvB,KAAKgN,WAAWzL,SAC1ByM,MAAOhO,KAAKiN,YAGpB,IAAMiT,EAAYvS,EAAQgO,OAAO,GAAGuE,YACpC,IAAK,IAAMuD,KAAKvD,EACRA,EAAUziB,eAAegmB,KAEzByI,EAAYzI,EAAElR,MAAM,IAAM,CACtBnE,MAAO8R,EAAUuD,GAAGrV,MACpBie,KAAM,WACF,OAAOrsB,KAAKoO,MAAMsE,KAAK/E,GAASmD,WAMhD,IACI2E,EAASqW,EAAWhc,KAAKoc,GAC3B,MAAOzsB,GACL,KAAM,CAAEsW,QAAS,iCAAiCtW,EAAEyZ,UAASzZ,EAAEsW,QAAQ5Y,QAAQ,OAAQ,SACnFoE,SAAUvB,KAAKgN,WAAWzL,SAC1ByM,MAAOhO,KAAKiN,YAEpB,OAAOwI,GAGXwW,kBAAA,SAAM1X,GACF,OAAIjH,MAAMC,QAAQgH,EAAInG,QAAWmG,EAAInG,MAAMtP,OAAS,EACzC,IAAIyV,EAAInG,MAAMiC,KAAI,SAAU6B,GAAK,OAAOA,EAAEpB,WAAY5C,KAAK,UAE3DqG,EAAIzD,YAnDE5D,IC4BzB6e,GAAWxc,UAAU3O,KAAO,aC7B5B,mBACI,WAAYyR,EAAK6X,GAAjB,MACIha,0BAEAC,EAAKkC,IAAMA,EACXlC,EAAK/B,MAAQ8b,IAsBrB,OA3ByB9a,OAQrBkd,mBAAA,SAAOje,GACHrO,KAAKoO,MAAQC,EAAQC,MAAMtO,KAAKoO,QAGpCke,iBAAA,SAAK3e,GACD,OAAI3N,KAAKoO,MAAMsE,KACJ,IAAI4Z,EAAWtsB,KAAKqS,IAAKrS,KAAKoO,MAAMsE,KAAK/E,IAE7C3N,MAGXssB,mBAAA,SAAO3e,EAASQ,GACZA,EAAOL,IAAO9N,KAAKqS,SACfrS,KAAKoO,MAAMP,OACX7N,KAAKoO,MAAMP,OAAOF,EAASQ,GAE3BA,EAAOL,IAAI9N,KAAKoO,WAxBHlB,GA6BzBof,GAAW/c,UAAU3O,KAAO,aC7B5B,mBACI,WAAY2N,EAAImD,EAAGf,EAAGjQ,EAAG6rB,GAAzB,MACIrc,0BAEAC,EAAK5B,GAAKA,EAAGwE,OACb5C,EAAKqc,OAAS9a,EACdvB,EAAKsc,OAAS9b,EACdR,EAAK1C,OAAS/M,EACdyP,EAAKoc,OAASA,IA6BtB,OArCwBnd,OAWpBsd,mBAAA,SAAOre,GACHrO,KAAKwsB,OAASne,EAAQC,MAAMtO,KAAKwsB,QACjCxsB,KAAKysB,OAASpe,EAAQC,MAAMtO,KAAKysB,SAGrCC,iBAAA,SAAK/e,GACD,IAAM8H,EAAS,SAAWlH,EAAIC,EAAGC,GAC7B,OAAQF,GACJ,IAAK,MAAO,OAAOC,GAAKC,EACxB,IAAK,KAAO,OAAOD,GAAKC,EACxB,QACI,OAAQvB,EAAK4B,QAAQN,EAAGC,IACpB,KAAM,EACF,MAAc,MAAPF,GAAqB,OAAPA,GAAsB,OAAPA,EACxC,KAAK,EACD,MAAc,MAAPA,GAAqB,OAAPA,GAAsB,OAAPA,GAAsB,OAAPA,EACvD,KAAK,EACD,MAAc,MAAPA,GAAqB,OAAPA,EACzB,QACI,OAAO,IAbZ,CAgBZvO,KAAKuO,GAAIvO,KAAKwsB,OAAO9Z,KAAK/E,GAAU3N,KAAKysB,OAAO/Z,KAAK/E,IAExD,OAAO3N,KAAKusB,QAAU9W,EAASA,MAnCfvI,GAuCxBwf,GAAUnd,UAAU3O,KAAO,YCvC3B,mBACI,WAAYwN,GAAZ,MACI8B,0BAEAC,EAAK/B,MAAQA,IAErB,OANgCgB,UAAAlC,GAQhCyf,GAAkBpd,UAAU3O,KAAO,oBCNnC,mBACI,WAAYyM,GAAZ,MACI6C,0BAEAC,EAAK/B,MAAQf,IAcrB,OAlBuB+B,OAOnBwd,mBAAA,SAAOjf,EAASQ,GACZA,EAAOL,IAAI,KACX9N,KAAKoO,MAAMP,OAAOF,EAASQ,IAG/Bye,iBAAA,SAAKjf,GACD,OAAIA,EAAQyO,WACD,IAAK+K,GAAU,IAAK,CAAC,IAAIhB,IAAW,GAAInmB,KAAKoO,QAASsE,KAAK/E,GAE/D,IAAIif,EAAS5sB,KAAKoO,MAAMsE,KAAK/E,QAhBrBT,GAoBvB0f,GAASrd,UAAU3O,KAAO,WCrB1B,mBACI,WAAYod,EAAU6O,EAAQ7e,EAAOoF,EAAiBC,GAAtD,MACInD,mBAWA,OATAC,EAAK6N,SAAWA,EAChB7N,EAAK0c,OAASA,EACd1c,EAAK2c,UAAYC,EAAOC,UACxB7c,EAAK8c,WAAa,CAAC9c,EAAK2c,WACxB3c,EAAK1C,OAASO,EACdmC,EAAKzC,UAAY0F,EACjBjD,EAAKmD,mBAAmBD,GACxBlD,EAAK2I,WAAY,EAET+T,GACJ,IAAK,MACD1c,EAAK+c,aAAc,EACnB/c,EAAKgd,YAAa,EAClB,MACJ,QACIhd,EAAK+c,aAAc,EACnB/c,EAAKgd,YAAa,SAG1Bhd,EAAKoD,UAAUpD,EAAK6N,SAAU7N,KAgCtC,OAvDqBf,OA0BjB2d,mBAAA,SAAO1e,GACHrO,KAAKge,SAAW3P,EAAQC,MAAMtO,KAAKge,WAGvC+O,iBAAA,SAAKpf,GACD,OAAO,IAAIof,EAAO/sB,KAAKge,SAAStL,KAAK/E,GAAU3N,KAAK6sB,OAAQ7sB,KAAKiN,WAAYjN,KAAKgN,WAAYhN,KAAKqT,mBAGvG0Z,kBAAA,SAAMpf,GACF,OAAO,IAAIof,EAAO/sB,KAAKge,SAAUhe,KAAK6sB,OAAQ7sB,KAAKiN,WAAYjN,KAAKgN,WAAYhN,KAAKqT,mBAIzF0Z,8BAAA,SAAkBvP,GACd,IAAuB9c,EAAG0sB,EAAtBC,EAAe,GAEnB,IAAK3sB,EAAI,EAAGA,EAAI8c,EAAU1e,OAAQ4B,IAC9B0sB,EAAmB5P,EAAU9c,GAAGyW,SAG5BzW,EAAI,GAAK0sB,EAAiBtuB,QAAmD,KAAzCsuB,EAAiB,GAAGla,WAAW9E,QACnEgf,EAAiB,GAAGla,WAAW9E,MAAQ,KAE3Cif,EAAeA,EAAansB,OAAOsc,EAAU9c,GAAGyW,UAGpDnX,KAAKstB,cAAgB,CAAC,IAAI7V,EAAS4V,IACnCrtB,KAAKstB,cAAc,GAAGha,mBAAmBtT,KAAKqT,sBArDjCnG,GAyDrB6f,GAAOC,QAAU,EAEjBD,GAAOxd,UAAU3O,KAAO,SCxDxB,mBACI,WAAY0Y,EAAUtL,EAAOoF,GAA7B,MACIlD,0BAEAC,EAAKmJ,SAAWA,EAChBnJ,EAAK1C,OAASO,EACdmC,EAAKzC,UAAY0F,EACjBjD,EAAK2I,WAAY,IA6BzB,OApC2B1J,OAUvBme,iBAAA,SAAK5f,GACD,IAAI8P,EACA+P,EAAkB,IAAI9E,GAAS1oB,KAAKsZ,SAAUtZ,KAAKiN,WAAYjN,KAAKgN,YAAY0F,KAAK/E,GACnF7N,EAAQ,IAAI8V,EAAU,CAACG,QAAS,oCAAoC/V,KAAKsZ,WAE/E,IAAKkU,EAAgB/O,QAAS,CAC1B,GAAI+O,EAAgB/P,MAChBA,EAAQ+P,OAEP,GAAIlgB,MAAMC,QAAQigB,GACnB/P,EAAQ,IAAIK,EAAQ,GAAI0P,OAEvB,CAAA,IAAIlgB,MAAMC,QAAQigB,EAAgBpf,OAInC,MAAMtO,EAHN2d,EAAQ,IAAIK,EAAQ,GAAI0P,EAAgBpf,OAK5Cof,EAAkB,IAAI3I,EAAgBpH,GAG1C,GAAI+P,EAAgB/O,QAChB,OAAO+O,EAAgBC,SAAS9f,GAEpC,MAAM7N,MAlCaoN,GAsC3BqgB,GAAahe,UAAU3O,KAAO,eCvC9B,mBACI,WAAY8sB,EAAUC,EAAS3f,EAAOhB,GAAtC,MACIkD,0BAEAC,EAAK/B,MAAQsf,EACbvd,EAAKwd,QAAUA,EACfxd,EAAK1C,OAASO,EACdmC,EAAKzC,UAAYV,IAmEzB,OA1E6BoC,OAUzBwe,iBAAA,SAAKjgB,GACD,IAAIjN,EAAMwY,EAAMuE,EAAQzd,KAAKoO,MAAMsE,KAAK/E,GAExC,IAAKjN,EAAI,EAAGA,EAAIV,KAAK2tB,QAAQ7uB,OAAQ4B,IAAK,CAYtC,GAXAwY,EAAOlZ,KAAK2tB,QAAQjtB,GAOhB4M,MAAMC,QAAQkQ,KACdA,EAAQ,IAAIK,EAAQ,CAAC,IAAIrG,GAAagG,IAG7B,KAATvE,EACAuE,EAAQA,EAAMoQ,uBAEb,GAAuB,MAAnB3U,EAAKxF,OAAO,IAQjB,GAPuB,MAAnBwF,EAAKxF,OAAO,KACZwF,EAAO,IAAI,IAAIwP,GAASxP,EAAKhC,OAAO,IAAIxE,KAAK/E,GAASS,OAEtDqP,EAAMyC,YACNzC,EAAQA,EAAMnE,SAASJ,KAGtBuE,EACD,KAAM,CAAE7c,KAAM,OACVmV,QAAS,YAAYmD,eACrB3X,SAAUvB,KAAKgN,WAAWzL,SAC1ByM,MAAOhO,KAAKiN,gBAGnB,CAWD,GATIiM,EADyB,OAAzBA,EAAK4U,UAAU,EAAG,GACX,IAAI,IAAIpF,GAASxP,EAAKhC,OAAO,IAAIxE,KAAK/E,GAASS,MAG5B,MAAnB8K,EAAKxF,OAAO,GAAawF,EAAO,IAAIA,EAE3CuE,EAAM+C,aACN/C,EAAQA,EAAMsL,SAAS7P,KAGtBuE,EACD,KAAM,CAAE7c,KAAM,OACVmV,QAAS,aAAamD,EAAKhC,OAAO,iBAClC3V,SAAUvB,KAAKgN,WAAWzL,SAC1ByM,MAAOhO,KAAKiN,YAIpBwQ,EAAQA,EAAMA,EAAM3e,OAAS,GAG7B2e,EAAMrP,QACNqP,EAAQA,EAAM/K,KAAK/E,GAASS,OAE5BqP,EAAMgB,UACNhB,EAAQA,EAAMgB,QAAQ/L,KAAK/E,IAGnC,OAAO8P,MAxEcvQ,GA4E7B0gB,GAAere,UAAU3O,KAAO,iBCxEhC,mBACI,WAAYsY,EAAM6U,EAAQtQ,EAAOpG,EAAW2W,EAAUrS,EAAQtI,GAA9D,MACInD,mBAEAC,EAAK+I,KAAOA,GAAQ,kBACpB/I,EAAKqN,UAAY,CAAC,IAAI/F,EAAS,CAAC,IAAIjE,EAAQ,KAAM0F,GAAM,EAAO/I,EAAK1C,OAAQ0C,EAAKzC,cACjFyC,EAAK4d,OAASA,EACd5d,EAAKkH,UAAYA,EACjBlH,EAAK6d,SAAWA,EAChB7d,EAAK8d,MAAQF,EAAOjvB,OACpBqR,EAAKsN,MAAQA,EACbtN,EAAKwN,SAAW,GAChB,IAAMuQ,EAAqB,UAC3B/d,EAAKge,SAAWJ,EAAO/N,QAAO,SAAU+F,EAAO5W,GAC3C,OAAKA,EAAE+J,MAAS/J,EAAE+J,OAAS/J,EAAEf,MAClB2X,EAAQ,GAGfmI,EAAmB1tB,KAAK2O,EAAE+J,MACnB6M,KAEZ,GACH5V,EAAK+d,mBAAqBA,EAC1B/d,EAAKwL,OAASA,EACdxL,EAAKmD,mBAAmBD,GACxBlD,EAAK2I,WAAY,IA8LzB,OAvNyB1J,OA4BrBgf,mBAAA,SAAO/f,GACCrO,KAAK+tB,QAAU/tB,KAAK+tB,OAAOjvB,SAC3BkB,KAAK+tB,OAAS1f,EAAQqJ,WAAW1X,KAAK+tB,SAE1C/tB,KAAKyd,MAAQpP,EAAQqJ,WAAW1X,KAAKyd,OACjCzd,KAAKqX,YACLrX,KAAKqX,UAAYhJ,EAAQC,MAAMtO,KAAKqX,aAI5C+W,uBAAA,SAAWzgB,EAAS0gB,EAAUld,EAAMmd,GAEhC,IAEIC,EACAC,EAEA9tB,EACAyd,EACA+L,EACAhR,EACAuV,EACAC,EAVE9F,EAAQ,IAAI9K,EAAQ,KAAM,MAI1BiQ,EAASvP,EAAgBxe,KAAK+tB,QAOhCY,EAAa,EAOjB,GALIN,EAAS1S,QAAU0S,EAAS1S,OAAO,IAAM0S,EAAS1S,OAAO,GAAGmD,mBAC5D8J,EAAM9J,iBAAmBuP,EAAS1S,OAAO,GAAGmD,iBAAiB3B,WAEjEkR,EAAW,IAAIvT,EAASY,KAAK2S,EAAU,CAACzF,GAAO1nB,OAAOmtB,EAAS1S,SAE3DxK,EAIA,IAFAwd,GADAxd,EAAOqN,EAAgBrN,IACLrS,OAEb4B,EAAI,EAAGA,EAAIiuB,EAAYjuB,IAExB,GAAIwY,GADJsV,EAAMrd,EAAKzQ,KACQ8tB,EAAItV,KAAO,CAE1B,IADAuV,GAAe,EACVtQ,EAAI,EAAGA,EAAI4P,EAAOjvB,OAAQqf,IAC3B,IAAKmQ,EAAenQ,IAAMjF,IAAS6U,EAAO5P,GAAGjF,KAAM,CAC/CoV,EAAenQ,GAAKqQ,EAAIpgB,MAAMsE,KAAK/E,GACnCib,EAAMgG,YAAY,IAAIrV,EAAYL,EAAMsV,EAAIpgB,MAAMsE,KAAK/E,KACvD8gB,GAAe,EACf,MAGR,GAAIA,EAAc,CACdtd,EAAKxQ,OAAOD,EAAG,GACfA,IACA,SAEA,KAAM,CAAEE,KAAM,UAAWmV,QAAS,sBAAsB/V,KAAKkZ,SAAQ/H,EAAKzQ,GAAGwY,mBAM7F,IADAwV,EAAW,EACNhuB,EAAI,EAAGA,EAAIqtB,EAAOjvB,OAAQ4B,IAC3B,IAAI4tB,EAAe5tB,GAAnB,CAIA,GAFA8tB,EAAMrd,GAAQA,EAAKud,GAEfxV,EAAO6U,EAAOrtB,GAAGwY,KACjB,GAAI6U,EAAOrtB,GAAGstB,SAAU,CAEpB,IADAO,EAAU,GACLpQ,EAAIuQ,EAAUvQ,EAAIwQ,EAAYxQ,IAC/BoQ,EAAQ/tB,KAAK2Q,EAAKgN,GAAG/P,MAAMsE,KAAK/E,IAEpCib,EAAMgG,YAAY,IAAIrV,EAAYL,EAAM,IAAIqO,GAAWgH,GAAS7b,KAAK/E,SAClE,CAEH,GADAuc,EAAMsE,GAAOA,EAAIpgB,MAIT8b,EADA5c,MAAMC,QAAQ2c,GACR,IAAIrF,EAAgB,IAAI/G,EAAQ,GAAIoM,IAGpCA,EAAIxX,KAAK/E,OAEhB,CAAA,IAAIogB,EAAOrtB,GAAG0N,MAIjB,KAAM,CAAExN,KAAM,UAAWmV,QAAS,iCAAiC/V,KAAKkZ,UAASyV,UAAkB3uB,KAAKiuB,WAHxG/D,EAAM6D,EAAOrtB,GAAG0N,MAAMsE,KAAK2b,GAC3BzF,EAAMnJ,aAKVmJ,EAAMgG,YAAY,IAAIrV,EAAYL,EAAMgR,IACxCoE,EAAe5tB,GAAKwpB,EAI5B,GAAI6D,EAAOrtB,GAAGstB,UAAY7c,EACtB,IAAKgN,EAAIuQ,EAAUvQ,EAAIwQ,EAAYxQ,IAC/BmQ,EAAenQ,GAAKhN,EAAKgN,GAAG/P,MAAMsE,KAAK/E,GAG/C+gB,IAGJ,OAAO9F,GAGXwF,0BAAA,WACI,IAAM3Q,EAASzd,KAAKyd,MAAqBzd,KAAKyd,MAAMpN,KAAI,SAAUM,GAC9D,OAAIA,EAAEkP,cACKlP,EAAEkP,eAAc,GAEhBlP,KAJa3Q,KAAKyd,MAQjC,OADe,IAAI2Q,EAAWpuB,KAAKkZ,KAAMlZ,KAAK+tB,OAAQtQ,EAAOzd,KAAKqX,UAAWrX,KAAKguB,SAAUhuB,KAAK2b,SAIrGyS,iBAAA,SAAKzgB,GACD,OAAO,IAAIygB,EAAWpuB,KAAKkZ,KAAMlZ,KAAK+tB,OAAQ/tB,KAAKyd,MAAOzd,KAAKqX,UAAWrX,KAAKguB,SAAUhuB,KAAK2b,QAAU6C,EAAgB7Q,EAAQgO,UAGpIyS,qBAAA,SAASzgB,EAASwD,EAAMgI,GACpB,IAGIsE,EACAgB,EAJEoQ,EAAa,GACbC,EAAc9uB,KAAK2b,OAAS3b,KAAK2b,OAAOza,OAAOyM,EAAQgO,QAAUhO,EAAQgO,OACzEiN,EAAQ5oB,KAAK+uB,WAAWphB,EAAS,IAAImN,EAASY,KAAK/N,EAASmhB,GAAc3d,EAAM0d,GActF,OAVAjG,EAAMgG,YAAY,IAAIrV,EAAY,aAAc,IAAIgO,GAAWsH,GAAYnc,KAAK/E,KAEhF8P,EAAQe,EAAgBxe,KAAKyd,QAE7BgB,EAAU,IAAIX,EAAQ,KAAML,IACpBiB,gBAAkB1e,KAC1Bye,EAAUA,EAAQ/L,KAAK,IAAIoI,EAASY,KAAK/N,EAAS,CAAC3N,KAAM4oB,GAAO1nB,OAAO4tB,KACnE3V,IACAsF,EAAUA,EAAQoB,iBAEfpB,GAGX2P,2BAAA,SAAejd,EAAMxD,GACjB,QAAI3N,KAAKqX,YAAcrX,KAAKqX,UAAU3E,KAClC,IAAIoI,EAASY,KAAK/N,EACd,CAAC3N,KAAK+uB,WAAWphB,EACb,IAAImN,EAASY,KAAK/N,EAAS3N,KAAK2b,OAAS3b,KAAK2b,OAAOza,OAAOyM,EAAQgO,QAAUhO,EAAQgO,QAASxK,EAAM,KACpGjQ,OAAOlB,KAAK2b,QAAU,IACtBza,OAAOyM,EAAQgO,YAMhCyS,sBAAA,SAAUjd,EAAMxD,GACZ,IACIwK,EADE6W,EAAc7d,GAAQA,EAAKrS,QAAW,EAEtCovB,EAAqBluB,KAAKkuB,mBAC1Be,EAAmB9d,EAAWA,EAAK6O,QAAO,SAAU+F,EAAO5W,GAC7D,OAAI+e,EAAmB7c,QAAQlC,EAAE+J,MAAQ,EAC9B6M,EAAQ,EAERA,IAEZ,GAN6B,EAQhC,GAAK/lB,KAAKguB,UAQN,GAAIiB,EAAmBjvB,KAAKmuB,SAAW,EACnC,OAAO,MATK,CAChB,GAAIc,EAAkBjvB,KAAKmuB,SACvB,OAAO,EAEX,GAAIa,EAAahvB,KAAK+tB,OAAOjvB,OACzB,OAAO,EASfqZ,EAAMpM,KAAKkG,IAAIgd,EAAiBjvB,KAAKiuB,OAErC,IAAK,IAAIvtB,EAAI,EAAGA,EAAIyX,EAAKzX,IACrB,IAAKV,KAAK+tB,OAAOrtB,GAAGwY,OAASlZ,KAAK+tB,OAAOrtB,GAAGstB,UACpC7c,EAAKzQ,GAAG0N,MAAMsE,KAAK/E,GAASmD,SAAW9Q,KAAK+tB,OAAOrtB,GAAG0N,MAAMsE,KAAK/E,GAASmD,QAC1E,OAAO,EAInB,OAAO,MArNUgN,GAyNzBsQ,GAAW7e,UAAU3O,KAAO,kBAC5BwtB,GAAW7e,UAAU8P,WAAY,EC9NjC,mBACI,WAAYlI,EAAUhG,EAAMnD,EAAOoF,EAAiB+F,GAApD,MACIjJ,0BAEAC,EAAK6N,SAAW,IAAIvG,EAASN,GAC7BhH,EAAKN,UAAYsB,GAAQ,GACzBhB,EAAK1C,OAASO,EACdmC,EAAKzC,UAAY0F,EACjBjD,EAAKgJ,UAAYA,EACjBhJ,EAAK2I,WAAY,EACjB3I,EAAKoD,UAAUpD,EAAK6N,SAAU7N,KAiMtC,OA3MwBf,OAapB8f,mBAAA,SAAO7gB,GACCrO,KAAKge,WACLhe,KAAKge,SAAW3P,EAAQC,MAAMtO,KAAKge,WAEnChe,KAAK6P,UAAU/Q,SACfkB,KAAK6P,UAAYxB,EAAQqJ,WAAW1X,KAAK6P,aAIjDqf,iBAAA,SAAKvhB,GACD,IAAIwhB,EACAC,EACAC,EAEAb,EACAc,EAGA5uB,EACAyK,EACAokB,EACAC,EACAC,EAEAC,EAEAC,EAKA5J,EACArH,EACAkR,EApBEze,EAAO,GAGPsM,EAAQ,GACVrN,GAAQ,EAMNyf,EAAa,GAEbC,EAAkB,GAYxB,SAASC,EAAaX,EAAOC,GACzB,IAAIE,EAAGpgB,EAAG6gB,EAEV,IAAKT,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAGpB,IAFAO,EAAgBP,IAAK,EACrBnS,EAAYhP,MAAMmhB,GACbpgB,EAAI,EAAGA,EAAIkgB,EAAUvwB,QAAUgxB,EAAgBP,GAAIpgB,KACpD6gB,EAAYX,EAAUlgB,IACR8gB,iBACVH,EAAgBP,GAAKO,EAAgBP,IAAMS,EAAUC,eAAe,KAAMtiB,IAG9EyhB,EAAMa,iBACNH,EAAgBP,GAAKO,EAAgBP,IAAMH,EAAMa,eAAe9e,EAAMxD,IAG9E,OAAImiB,EAAgB,IAAMA,EAAgB,GAClCA,EAAgB,IAAMA,EAAgB,GAC/BA,EAAgB,GA1BnB,EACC,EAFD,GADW,EAqC3B,IA7BA9vB,KAAKge,SAAWhe,KAAKge,SAAStL,KAAK/E,GA6B9BjN,EAAI,EAAGA,EAAIV,KAAK6P,UAAU/Q,OAAQ4B,IAGnC,GADA4uB,GADAd,EAAMxuB,KAAK6P,UAAUnP,IACN0N,MAAMsE,KAAK/E,GACtB6gB,EAAI0B,QAAU5iB,MAAMC,QAAQ+hB,EAASlhB,OAErC,IADAkhB,EAAWA,EAASlhB,MACfjD,EAAI,EAAGA,EAAImkB,EAASxwB,OAAQqM,IAC7BgG,EAAK3Q,KAAK,CAAC4N,MAAOkhB,EAASnkB,UAG/BgG,EAAK3Q,KAAK,CAAC0Y,KAAMsV,EAAItV,KAAM9K,MAAOkhB,IAM1C,IAFAM,EAAoB,SAAStR,GAAO,OAAOA,EAAK6R,UAAU,KAAMxiB,IAE3DjN,EAAI,EAAGA,EAAIiN,EAAQgO,OAAO7c,OAAQ4B,IACnC,IAAKyuB,EAASxhB,EAAQgO,OAAOjb,GAAGsgB,KAAKhhB,KAAKge,SAAU,KAAM4R,IAAoB9wB,OAAS,EAAG,CAQtF,IAPA2wB,GAAa,EAORtkB,EAAI,EAAGA,EAAIgkB,EAAOrwB,OAAQqM,IAAK,CAIhC,IAHAikB,EAAQD,EAAOhkB,GAAGmT,KAClB+Q,EAAYF,EAAOhkB,GAAGqQ,KACtBgU,GAAc,EACTD,EAAI,EAAGA,EAAI5hB,EAAQgO,OAAO7c,OAAQywB,IACnC,KAAOH,aAAiBgB,KAAqBhB,KAAWzhB,EAAQgO,OAAO4T,GAAG7Q,iBAAmB/Q,EAAQgO,OAAO4T,IAAK,CAC7GC,GAAc,EACd,MAGJA,GAIAJ,EAAMe,UAAUhf,EAAMxD,MA3EX,KA4EX+hB,EAAY,CAACN,QAAO1J,MAAOqK,EAAaX,EAAOC,KAEjC3J,OACVmK,EAAWrvB,KAAKkvB,GAGpBtf,GAAQ,GAOhB,IAHAgN,EAAYG,QAEZwI,EAAQ,CAAC,EAAG,EAAG,GACV5a,EAAI,EAAGA,EAAI0kB,EAAW/wB,OAAQqM,IAC/B4a,EAAM8J,EAAW1kB,GAAGua,SAGxB,GAAIK,EA5FI,GA4Fa,EACjB4J,EA3FK,OA8FL,GADAA,EA9FI,EA+FC5J,EA/FD,GA+FkBA,EA9FjB,GA8FoC,EACrC,KAAM,CAAEnlB,KAAM,UACVmV,QAAS,yDAA4D/V,KAAKqwB,OAAOlf,OACjFnD,MAAOhO,KAAKiN,WAAY1L,SAAUvB,KAAKgN,WAAWzL,UAI9D,IAAK4J,EAAI,EAAGA,EAAI0kB,EAAW/wB,OAAQqM,IAE/B,GAzGI,KAwGJukB,EAAYG,EAAW1kB,GAAGua,QACMgK,IAAcC,EAC1C,KACIP,EAAQS,EAAW1kB,GAAGikB,iBACCgB,KACnB1R,EAAkB0Q,EAAM1Q,iBAAmB0Q,GAC3CA,EAAQ,IAAIgB,GAAgB,GAAI,GAAIhB,EAAM3R,MAAO,MAAM,EAAO,KAAMiB,EAAgBrL,mBAC9EqL,gBAAkBA,GAE5B,IAAM4R,EAAWlB,EAAMmB,SAAS5iB,EAASwD,EAAMnR,KAAKmZ,WAAWsE,MAC/Dzd,KAAKwwB,4BAA4BF,GACjChjB,MAAMiC,UAAU/O,KAAKuP,MAAM0N,EAAO6S,GACpC,MAAO7wB,GACL,KAAM,CAAEsW,QAAStW,EAAEsW,QAAS/H,MAAOhO,KAAKiN,WAAY1L,SAAUvB,KAAKgN,WAAWzL,SAAUyU,MAAOvW,EAAEuW,OAK7G,GAAI5F,EACA,OAAOqN,EAInB,MAAIgS,EACM,CAAE7uB,KAAS,UACbmV,QAAS,yCAA0C/V,KAAKqwB,OAAOlf,OAC/DnD,MAAShO,KAAKiN,WAAY1L,SAAUvB,KAAKgN,WAAWzL,UAElD,CAAEX,KAAS,OACbmV,QAAY/V,KAAKge,SAASlN,QAAQiC,uBAClC/E,MAAShO,KAAKiN,WAAY1L,SAAUvB,KAAKgN,WAAWzL,WAIhE2tB,wCAAA,SAA4BuB,GACxB,IAAI/vB,EACJ,GAAIV,KAAKsrB,mBACL,IAAK5qB,EAAI,EAAGA,EAAI+vB,EAAY3xB,OAAQ4B,IACzB+vB,EAAY/vB,GACd6qB,sBAKjB2D,mBAAA,SAAO/d,GACH,OAAUnR,KAAKge,SAASlN,QAAQiC,YAAU5B,EAAOA,EAAKd,KAAI,SAAU7B,GACpE,IAAI8gB,EAAW,GASf,OARI9gB,EAAE0K,OACFoW,GAAe9gB,EAAE0K,UAEjB1K,EAAEJ,MAAM0C,MACRwe,GAAY9gB,EAAEJ,MAAM0C,QAEpBwe,GAAY,MAETA,KACRphB,KAAK,MAAQ,YAzMIhB,GA6MxBgiB,GAAU3f,UAAU3O,KAAO,mBC3KZ,CACXsM,OAAMwD,QAAO6T,SAAQM,kBAAiBsC,aACtChB,aAAWjB,OAAMzM,UAASiQ,YAAUI,YACpChL,UAAStK,UAAS8V,aAAWtW,aAAYyE,WACzCmS,UAAQrC,cAAYhO,cAAa6O,QAAMgC,OAAKa,UAC5CtQ,UAAS5B,YAAWP,QAAOuT,cAAYO,cACvCI,aAAWja,QAAO8X,SAAOoC,qBAAmBC,YAC5CG,UAAQQ,gBAAcK,kBACtBwB,MAAO,CACHhH,KAAM8G,GACNd,WAAYgC,mBCjDpB,cAmIA,OAlIIM,oBAAA,SAAQnvB,GACJ,IAAI4c,EAAI5c,EAASovB,YAAY,KAQ7B,OAPIxS,EAAI,IACJ5c,EAAWA,EAASgR,MAAM,EAAG4L,KAEjCA,EAAI5c,EAASovB,YAAY,MACjB,IACJxS,EAAI5c,EAASovB,YAAY,OAEzBxS,EAAI,EACG,GAEJ5c,EAASgR,MAAM,EAAG4L,EAAI,IAGjCuS,+BAAA,SAAmBlV,EAAMoV,GACrB,MAAO,yBAAyBnW,KAAKe,GAAQA,EAAOA,EAAOoV,GAG/DF,mCAAA,SAAuBlV,GACnB,OAAOxb,KAAK6wB,mBAAmBrV,EAAM,UAGzCkV,yBAAA,WACI,OAAO,GAGXA,oCAAA,WACI,OAAO,GAGXA,2BAAA,SAAenvB,GACX,MAAO,yBAA2BkZ,KAAKlZ,IAI3CmvB,iBAAA,SAAKI,EAAUC,GACX,OAAKD,EAGEA,EAAWC,EAFPA,GAKfL,qBAAA,SAASM,EAAKC,GAGV,IAGIvwB,EACAsR,EACAkf,EACAC,EANEC,EAAWpxB,KAAKqxB,gBAAgBL,GAEhCM,EAAetxB,KAAKqxB,gBAAgBJ,GAKtCM,EAAO,GACX,GAAIH,EAASI,WAAaF,EAAaE,SACnC,MAAO,GAGX,IADAxf,EAAMjG,KAAKiG,IAAIsf,EAAaG,YAAY3yB,OAAQsyB,EAASK,YAAY3yB,QAChE4B,EAAI,EAAGA,EAAIsR,GACRsf,EAAaG,YAAY/wB,KAAO0wB,EAASK,YAAY/wB,GADxCA,KAKrB,IAFAywB,EAAqBG,EAAaG,YAAYlf,MAAM7R,GACpDwwB,EAAiBE,EAASK,YAAYlf,MAAM7R,GACvCA,EAAI,EAAGA,EAAIywB,EAAmBryB,OAAS,EAAG4B,IAC3C6wB,GAAQ,MAEZ,IAAK7wB,EAAI,EAAGA,EAAIwwB,EAAepyB,OAAS,EAAG4B,IACvC6wB,GAAWL,EAAexwB,OAE9B,OAAO6wB,GAIXb,4BAAA,SAAgBM,EAAKC,GAOjB,IAMIvwB,EACA4wB,EAPEI,EAAgB,kGAEhBN,EAAWJ,EAAI5gB,MAAMshB,GACrBC,EAAW,GACbC,EAAiB,GACfH,EAAc,GAIpB,IAAKL,EACD,MAAM,IAAI1xB,MAAM,iCAAiCsxB,OAIrD,GAAIC,KAAaG,EAAS,IAAMA,EAAS,IAAK,CAE1C,KADAE,EAAeL,EAAQ7gB,MAAMshB,IAEzB,MAAM,IAAIhyB,MAAM,+BAA+BuxB,OAEnDG,EAAS,GAAKA,EAAS,IAAME,EAAa,IAAM,GAC3CF,EAAS,KACVA,EAAS,GAAKE,EAAa,GAAKF,EAAS,IAIjD,GAAIA,EAAS,GAIT,IAHAQ,EAAiBR,EAAS,GAAGj0B,QAAQ,MAAO,KAAKsT,MAAM,KAGlD/P,EAAI,EAAGA,EAAIkxB,EAAe9yB,OAAQ4B,IAET,OAAtBkxB,EAAelxB,GACf+wB,EAAY1X,MAEe,MAAtB6X,EAAelxB,IACpB+wB,EAAYjxB,KAAKoxB,EAAelxB,IAa5C,OAPAixB,EAASH,SAAWJ,EAAS,GAC7BO,EAASF,YAAcA,EACvBE,EAASE,SAAWT,EAAS,IAAM,IAAMQ,EAAe1jB,KAAK,KAC7DyjB,EAASnW,MAAQ4V,EAAS,IAAM,IAAMK,EAAYvjB,KAAK,KACvDyjB,EAASpwB,SAAW6vB,EAAS,GAC7BO,EAASG,QAAUH,EAASnW,MAAQ4V,EAAS,IAAM,IACnDO,EAASX,IAAMW,EAASG,SAAWV,EAAS,IAAM,IAC3CO,sBC7HX,aAEI3xB,KAAK+xB,QAAU,WACX,OAAO,MA8KnB,OA1KIC,uBAAA,SAAW9b,EAAUvI,EAASqK,EAASia,EAAejlB,GAElD,IAAYwe,EAAU0G,EAAWC,EAAavwB,EAAeL,EAAUkU,EAEvE7T,EAAgB+L,EAAQ/L,cAEpBoL,IAEIzL,EADoB,iBAAbyL,EACIA,EAGAA,EAASzL,UAG5B,IAAM6wB,GAAY,IAAKpyB,KAAKipB,KAAKoJ,aAAehB,gBAAgB9vB,GAAUA,SAE1E,GAAIA,IACA2wB,EAAYtwB,EAAcmL,IAAIxL,IAEf,CAEX,GADAkU,EAASzV,KAAKsyB,cAAcJ,EAAW3wB,EAAU6wB,EAAWH,GAExD,OAAOxc,EAEX,IACQyc,EAAUK,KACVL,EAAUK,IAAIziB,KAAK9P,KAAK2N,QAASukB,GAGzC,MAAOzyB,GAEH,OADAA,EAAEsW,QAAUtW,EAAEsW,SAAW,4BAClB,IAAIH,EAAUnW,EAAGuY,EAASzW,GAErC,OAAO2wB,EAGfC,EAAc,CACVK,QAAS,GACT5wB,gBACAoL,YAEJwe,EAAW1M,EAAiBtP,SAM5B,IACa,IAAIkH,SAAS,SAAU,UAAW,iBAAkB,YAAa,OAAQ,OAAQ,WAAYR,EACtGuc,CAAON,EAAanyB,KAAK+xB,QAAQxwB,IANd,SAASgT,GAC5B2d,EAAY3d,IAKgDiX,EAAUxrB,KAAKipB,KAAKyJ,KAAM1yB,KAAKipB,KAAMjc,GAErG,MAAOvN,GACH,OAAO,IAAImW,EAAUnW,EAAGuY,EAASzW,GAQrC,GALK2wB,IACDA,EAAYC,EAAYK,UAE5BN,EAAYlyB,KAAK2yB,eAAeT,EAAW3wB,EAAU6wB,cAE5Bxc,EACrB,OAAOsc,EAGX,IAAIA,EAoCA,OAAO,IAAItc,EAAU,CAAEG,QAAS,sBAAwBiC,EAASzW,GA/BjE,GAJA2wB,EAAUla,QAAUA,EACpBka,EAAU3wB,SAAWA,IAGhB2wB,EAAUU,YAAc5yB,KAAK6yB,eAAe,QAASX,EAAUU,YAAc,KAC9End,EAASzV,KAAKsyB,cAAcJ,EAAW3wB,EAAU6wB,EAAWH,IAGxD,OAAOxc,EAUf,GALA7T,EAAckxB,UAAUZ,EAAWllB,EAASzL,SAAUiqB,GACtD0G,EAAUjxB,UAAYuqB,EAAStO,oBAG/BzH,EAASzV,KAAKsyB,cAAcJ,EAAW3wB,EAAU6wB,EAAWH,GAExD,OAAOxc,EAIX,IACQyc,EAAUK,KACVL,EAAUK,IAAIziB,KAAK9P,KAAK2N,QAASukB,GAGzC,MAAOzyB,GAEH,OADAA,EAAEsW,QAAUtW,EAAEsW,SAAW,4BAClB,IAAIH,EAAUnW,EAAGuY,EAASzW,GAQzC,OAAO2wB,GAIXF,0BAAA,SAAce,EAAQxxB,EAAU2X,EAAM7b,GAClC,GAAIA,IAAY01B,EAAOC,WACnB,OAAO,IAAIpd,EAAU,CACjBG,QAAS,6CAA6CmD,qCAG9D,IACI6Z,EAAOC,YAAcD,EAAOC,WAAW31B,GAE3C,MAAOoC,GACH,OAAO,IAAImW,EAAUnW,KAI7BuyB,2BAAA,SAAee,EAAQxxB,EAAU2X,GAC7B,OAAI6Z,GAGsB,mBAAXA,IACPA,EAAS,IAAIA,GAGbA,EAAOH,YACH5yB,KAAK6yB,eAAeE,EAAOH,WAAY5yB,KAAKipB,KAAKgK,SAAW,EACrD,IAAIrd,EAAU,CACjBG,QAAS,UAAUmD,uBAAyBlZ,KAAKkzB,gBAAgBH,EAAOH,cAI7EG,GAEJ,MAGXf,2BAAA,SAAemB,EAAUC,GACG,iBAAbD,IACPA,EAAWA,EAAS/iB,MAAM,6BACjBiI,QAEb,IAAK,IAAI3X,EAAI,EAAGA,EAAIyyB,EAASr0B,OAAQ4B,IACjC,GAAIyyB,EAASzyB,KAAO0yB,EAAS1yB,GACzB,OAAO6P,SAAS4iB,EAASzyB,IAAM6P,SAAS6iB,EAAS1yB,KAAO,EAAI,EAGpE,OAAO,GAGXsxB,4BAAA,SAAgBiB,GAEZ,IADA,IAAII,EAAgB,GACX3yB,EAAI,EAAGA,EAAIuyB,EAAQn0B,OAAQ4B,IAChC2yB,IAAkBA,EAAgB,IAAM,IAAMJ,EAAQvyB,GAE1D,OAAO2yB,GAGXrB,uBAAA,SAAWsB,GACP,IAAK,IAAI5yB,EAAI,EAAGA,EAAI4yB,EAAQx0B,OAAQ4B,IAAK,CACrC,IAAMqyB,EAASO,EAAQ5yB,GACnBqyB,EAAOQ,YACPR,EAAOQ,oBC/KjBC,GAAa,CAAEC,aAAa,GAC9BC,IAAc,EAElB,SAASC,GAAMtmB,GACX,OAAOA,EA0BX,kBACI,WAAYumB,GACR5zB,KAAK6zB,gBAAkBD,EACvB5zB,KAAK8zB,cAAgB,GACrB9zB,KAAK+zB,eAAiB,GAEjBL,MA7Bb,SAASM,EAAe1nB,EAAQ2nB,GAE5B,IAAI5hB,EAAK6hB,EACT,IAAK7hB,KAAO/F,EAGR,cADA4nB,EAAQ5nB,EAAO+F,KAEX,IAAK,WAGG6hB,EAAM3kB,WAAa2kB,EAAM3kB,UAAU3O,OACnCszB,EAAM3kB,UAAU4kB,UAAYF,KAEhC,MACJ,IAAK,SACDA,EAASD,EAAeE,EAAOD,GAK3C,OAAOA,EAUCD,CAAetB,GAAM,GACrBgB,IAAc,GA0H1B,OAtHIU,kBAAA,SAAM/mB,GACF,IAAKA,EACD,OAAOA,EAGX,IAAMgnB,EAAgBhnB,EAAK8mB,UAC3B,IAAKE,EAKD,OAHIhnB,EAAKe,OAASf,EAAKe,MAAM+lB,WACzBn0B,KAAKsO,MAAMjB,EAAKe,OAEbf,EAGX,IAIIinB,EAJEC,EAAOv0B,KAAK6zB,gBACdpd,EAAOzW,KAAK8zB,cAAcO,GAC1BG,EAAUx0B,KAAK+zB,eAAeM,GAC5BI,EAAYjB,GAalB,GAVAiB,EAAUhB,aAAc,EAEnBhd,IAEDA,EAAO8d,EADPD,EAAS,QAAQjnB,EAAKzM,OACC+yB,GACvBa,EAAUD,EAAQD,UAAgBX,GAClC3zB,KAAK8zB,cAAcO,GAAiB5d,EACpCzW,KAAK+zB,eAAeM,GAAiBG,GAGrC/d,IAASkd,GAAO,CAChB,IAAMe,EAAUje,EAAK3G,KAAKykB,EAAMlnB,EAAMonB,GAClCpnB,GAAQknB,EAAKI,cACbtnB,EAAOqnB,GAIf,GAAID,EAAUhB,aAAepmB,EACzB,GAAIA,EAAKvO,OACL,IAAK,IAAI4B,EAAI,EAAGk0B,EAAMvnB,EAAKvO,OAAQ4B,EAAIk0B,EAAKl0B,IACpC2M,EAAK3M,GAAGm0B,QACRxnB,EAAK3M,GAAGm0B,OAAO70B,WAGhBqN,EAAKwnB,QACZxnB,EAAKwnB,OAAO70B,MAQpB,OAJIw0B,GAAWb,IACXa,EAAQ1kB,KAAKykB,EAAMlnB,GAGhBA,GAGX+mB,uBAAA,SAAWjnB,EAAO2nB,GACd,IAAK3nB,EACD,OAAOA,EAGX,IACIzM,EADEk0B,EAAMznB,EAAMrO,OAIlB,GAAIg2B,IAAiB90B,KAAK6zB,gBAAgBc,YAAa,CACnD,IAAKj0B,EAAI,EAAGA,EAAIk0B,EAAKl0B,IACjBV,KAAKsO,MAAMnB,EAAMzM,IAErB,OAAOyM,EAIX,IAAM4nB,EAAM,GACZ,IAAKr0B,EAAI,EAAGA,EAAIk0B,EAAKl0B,IAAK,CACtB,IAAMs0B,EAAQh1B,KAAKsO,MAAMnB,EAAMzM,SACjB8L,IAAVwoB,IACCA,EAAMr0B,OAEAq0B,EAAMl2B,QACbkB,KAAKi1B,QAAQD,EAAOD,GAFpBA,EAAIv0B,KAAKw0B,IAKjB,OAAOD,GAGXX,oBAAA,SAAQhgB,EAAK2gB,GAKT,IAAIH,EAAKl0B,EAAGqnB,EAAMmN,EAAW/W,EAAGgX,EAEhC,IANKJ,IACDA,EAAM,IAKLr0B,EAAI,EAAGk0B,EAAMxgB,EAAItV,OAAQ4B,EAAIk0B,EAAKl0B,IAEnC,QAAa8L,KADbub,EAAO3T,EAAI1T,IAIX,GAAKqnB,EAAKpnB,OAKV,IAAKwd,EAAI,EAAG+W,EAAYnN,EAAKjpB,OAAQqf,EAAI+W,EAAW/W,SAE7B3R,KADnB2oB,EAAapN,EAAK5J,MAIbgX,EAAWx0B,OAELw0B,EAAWr2B,QAClBkB,KAAKi1B,QAAQE,EAAYJ,GAFzBA,EAAIv0B,KAAK20B,SAVbJ,EAAIv0B,KAAKunB,GAiBjB,OAAOgN,sBC/JX,WAAYK,GACRp1B,KAAKgY,QAAU,GACfhY,KAAKq1B,gBAAkB,GACvBr1B,KAAKs1B,kBAAoBF,EACzBp1B,KAAKu1B,cAAgB,EAgD7B,OA7CIC,sBAAA,SAAU/P,GACN,IAAMgQ,EAAkBz1B,KAClB01B,EAAa,CACTjQ,WACAtU,KAAM,KACNwkB,SAAS,GAGnB,OADA31B,KAAKgY,QAAQxX,KAAKk1B,GACX,WACHA,EAAWvkB,KAAO7D,MAAMiC,UAAUgD,MAAMzC,KAAKD,UAAW,GACxD6lB,EAAWC,SAAU,EACrBF,EAAgBG,WAIxBJ,8BAAA,SAAkB/P,GACdzlB,KAAKq1B,gBAAgB70B,KAAKilB,IAG9B+P,mBAAA,WACIx1B,KAAKu1B,gBACL,IACI,OAAa,CACT,KAAOv1B,KAAKgY,QAAQlZ,OAAS,GAAG,CAC5B,IAAM42B,EAAa11B,KAAKgY,QAAQ,GAChC,IAAK0d,EAAWC,QACZ,OAEJ31B,KAAKgY,QAAUhY,KAAKgY,QAAQzF,MAAM,GAClCmjB,EAAWjQ,SAAS1V,MAAM,KAAM2lB,EAAWvkB,MAE/C,GAAoC,IAAhCnR,KAAKq1B,gBAAgBv2B,OACrB,MAEJ,IAAM+2B,EAAiB71B,KAAKq1B,gBAAgB,GAC5Cr1B,KAAKq1B,gBAAkBr1B,KAAKq1B,gBAAgB9iB,MAAM,GAClDsjB,aAGJ71B,KAAKu1B,gBAEkB,IAAvBv1B,KAAKu1B,eAAuBv1B,KAAKs1B,mBACjCt1B,KAAKs1B,0BC7CXQ,GAAgB,SAASC,EAAUC,GAErCh2B,KAAKi2B,SAAW,IAAI7B,GAAQp0B,MAC5BA,KAAKk2B,UAAYH,EACjB/1B,KAAKm2B,QAAUH,EACfh2B,KAAK2N,QAAU,IAAImN,EAASY,KAC5B1b,KAAKo2B,YAAc,EACnBp2B,KAAKq2B,qBAAuB,GAC5Br2B,KAAKs2B,kBAAoB,GACzBt2B,KAAKu2B,WAAa,IAAIf,GAAgBx1B,KAAKs1B,kBAAkBj0B,KAAKrB,QAGtE81B,GAAcvmB,UAAY,CACtBolB,aAAa,EACb6B,IAAK,SAAU7X,GACX,IAEI3e,KAAKi2B,SAAS3nB,MAAMqQ,GAExB,MAAOlf,GACHO,KAAKF,MAAQL,EAGjBO,KAAKy2B,YAAa,EAClBz2B,KAAKu2B,WAAWX,UAEpBN,kBAAmB,WACVt1B,KAAKy2B,YAGVz2B,KAAKm2B,QAAQn2B,KAAKF,QAEtB42B,YAAa,SAAUC,EAAYlC,GAC/B,IAAMmC,EAAYD,EAAWt5B,QAAQgc,OAErC,IAAKsd,EAAW7L,KAAO8L,EAAW,CAE9B,IAAMjpB,EAAU,IAAImN,EAASY,KAAK1b,KAAK2N,QAAS6Q,EAAgBxe,KAAK2N,QAAQgO,SACvEkb,EAAelpB,EAAQgO,OAAO,GAEpC3b,KAAKo2B,cACDO,EAAWG,mBACX92B,KAAKu2B,WAAWQ,kBAAkB/2B,KAAKg3B,kBAAkB31B,KAAKrB,KAAM22B,EAAYhpB,EAASkpB,IAEzF72B,KAAKg3B,kBAAkBL,EAAYhpB,EAASkpB,GAGpDpC,EAAUhB,aAAc,GAE5BuD,kBAAmB,SAASL,EAAYhpB,EAASkpB,GAC7C,IAAII,EACEL,EAAYD,EAAWt5B,QAAQgc,OAErC,IACI4d,EAAkBN,EAAWO,cAAcvpB,GAC7C,MAAOlO,GACAA,EAAE8B,WAAY9B,EAAEuO,MAAQ2oB,EAAW1pB,WAAYxN,EAAE8B,SAAWo1B,EAAW3pB,WAAWzL,UAEvFo1B,EAAW7L,KAAM,EAEjB6L,EAAW72B,MAAQL,EAGvB,IAAIw3B,GAAqBA,EAAgBnM,MAAO8L,EAqB5C52B,KAAKo2B,cACDp2B,KAAKy2B,YACLz2B,KAAKu2B,WAAWX,aAvBoC,CAEpDqB,EAAgB55B,QAAQ85B,WACxBxpB,EAAQypB,gBAAiB,GAM7B,IAFA,IAAMC,OAAiD7qB,IAAxByqB,EAAgBnM,IAEtCpqB,EAAI,EAAGA,EAAIm2B,EAAapZ,MAAM3e,OAAQ4B,IAC3C,GAAIm2B,EAAapZ,MAAM/c,KAAOi2B,EAAY,CACtCE,EAAapZ,MAAM/c,GAAKu2B,EACxB,MAIR,IAAMK,EAAat3B,KAAKs3B,WAAWj2B,KAAKrB,KAAMi3B,EAAiBtpB,GAAU4pB,EAAsBv3B,KAAKu2B,WAAWiB,UAAUF,GAEzHt3B,KAAKk2B,UAAU11B,KAAKy2B,EAAgBjM,UAAWqM,EAAwBJ,EAAgBjqB,WACnFiqB,EAAgB55B,QAASk6B,KAQrCD,WAAY,SAAUX,EAAYhpB,EAASlO,EAAGkf,EAAM8Y,EAAgBC,GAC5Dj4B,IACKA,EAAE8B,WACH9B,EAAEuO,MAAQ2oB,EAAW1pB,WAAYxN,EAAE8B,SAAWo1B,EAAW3pB,WAAWzL,UAExEvB,KAAKF,MAAQL,GAGjB,IAAMk4B,EAAgB33B,KAAM42B,EAAYD,EAAWt5B,QAAQgc,OAAQ6R,EAAWyL,EAAWt5B,QAAQ6tB,SAAU0M,EAAajB,EAAWt5B,QAAQw6B,SAAUC,EAAkBL,GAAkBC,KAAYC,EAAcrB,kBAoBnN,GAlBK3oB,EAAQypB,iBAELT,EAAWlL,OADXqM,GAGkB,WACd,OAAIJ,KAAYC,EAActB,uBAG9BsB,EAActB,qBAAqBqB,IAAY,GACxC,MAKdA,GAAYE,IACbjB,EAAWlL,MAAO,GAGlB9M,IACAgY,EAAWhY,KAAOA,EAClBgY,EAAWjL,iBAAmBgM,GAEzBd,IAAc1L,IAAavd,EAAQypB,iBAAmBU,IAAkB,CACzEH,EAAcrB,kBAAkBoB,IAAY,EAE5C,IAAMK,EAAa/3B,KAAK2N,QACxB3N,KAAK2N,QAAUA,EACf,IACI3N,KAAKi2B,SAAS3nB,MAAMqQ,GACtB,MAAOlf,GACLO,KAAKF,MAAQL,EAEjBO,KAAK2N,QAAUoqB,EAIvBJ,EAAcvB,cAEVuB,EAAclB,YACdkB,EAAcpB,WAAWX,UAGjCoC,iBAAkB,SAAUC,EAAUxD,GACN,oBAAxBwD,EAAS7pB,MAAMxN,KACfZ,KAAK2N,QAAQgO,OAAOsD,QAAQgZ,GAE5BxD,EAAUhB,aAAc,GAGhCyE,oBAAqB,SAASD,GACE,oBAAxBA,EAAS7pB,MAAMxN,MACfZ,KAAK2N,QAAQgO,OAAOtD,SAG5B8f,YAAa,SAAUC,EAAY3D,GAC/Bz0B,KAAK2N,QAAQgO,OAAOsD,QAAQmZ,IAEhCC,eAAgB,SAAUD,GACtBp4B,KAAK2N,QAAQgO,OAAOtD,SAExBigB,qBAAsB,SAAUC,EAAqB9D,GACjDz0B,KAAK2N,QAAQgO,OAAOsD,QAAQsZ,IAEhCC,wBAAyB,SAAUD,GAC/Bv4B,KAAK2N,QAAQgO,OAAOtD,SAExBogB,aAAc,SAAUC,EAAajE,GACjCz0B,KAAK2N,QAAQgO,OAAOsD,QAAQyZ,IAEhCC,gBAAiB,SAAUD,GACvB14B,KAAK2N,QAAQgO,OAAOtD,SAExBugB,WAAY,SAAUC,EAAWpE,GAC7Bz0B,KAAK2N,QAAQgO,OAAOsD,QAAQ4Z,EAAUpb,MAAM,KAEhDqb,cAAe,SAAUD,GACrB74B,KAAK2N,QAAQgO,OAAOtD,UCrL5B,kBACI,WAAY0gB,GACR/4B,KAAK+4B,QAAUA,EAwCvB,OArCIC,gBAAA,SAAIra,GACA3e,KAAKsO,MAAMqQ,IAGfqa,uBAAA,SAAW7rB,GACP,IAAKA,EACD,OAAOA,EAGX,IACIzM,EADEk0B,EAAMznB,EAAMrO,OAElB,IAAK4B,EAAI,EAAGA,EAAIk0B,EAAKl0B,IACjBV,KAAKsO,MAAMnB,EAAMzM,IAErB,OAAOyM,GAGX6rB,kBAAA,SAAM3rB,GACF,OAAKA,EAGDA,EAAKiC,cAAgBhC,MACdtN,KAAK0X,WAAWrK,KAGtBA,EAAKie,kBAAoBje,EAAKie,qBAG/BtrB,KAAK+4B,QACL1rB,EAAK4rB,mBAEL5rB,EAAK6rB,qBAGT7rB,EAAKwnB,OAAO70B,OARDqN,GAPAA,sBChBf,aACIrN,KAAKi2B,SAAW,IAAI7B,GAAQp0B,MAC5BA,KAAK8a,SAAW,GAChB9a,KAAKm5B,gBAAkB,CAAC,IAwFhC,OArFIC,gBAAA,SAAIza,GAGA,OAFAA,EAAO3e,KAAKi2B,SAAS3nB,MAAMqQ,IACtB0a,WAAar5B,KAAKm5B,gBAAgB,GAChCxa,GAGXya,6BAAA,SAAiBnB,EAAUxD,GACvBA,EAAUhB,aAAc,GAG5B2F,iCAAA,SAAqBb,EAAqB9D,GACtCA,EAAUhB,aAAc,GAG5B2F,yBAAA,SAAaV,EAAajE,GACtB,IAAIiE,EAAY/Z,KAAhB,CAIA,IAAIje,EACAyd,EACA7F,EAEAlB,EADEkiB,EAAyB,GAIzB7b,EAAQib,EAAYjb,MAAOmH,EAAUnH,EAAQA,EAAM3e,OAAS,EAClE,IAAK4B,EAAI,EAAGA,EAAIkkB,EAASlkB,IACjBg4B,EAAYjb,MAAM/c,aAAcgyB,GAAK3F,SACrCuM,EAAuB94B,KAAKid,EAAM/c,IAClCg4B,EAAYa,mBAAoB,GAMxC,IAAMle,EAAQqd,EAAYrd,MAC1B,IAAK3a,EAAI,EAAGA,EAAI2a,EAAMvc,OAAQ4B,IAAK,CAC/B,IAAM84B,EAAene,EAAM3a,GAAsD+4B,EAAvCD,EAAaA,EAAa16B,OAAS,GAA6BsY,WAW1G,KATAA,EAAaqiB,EAAgBjb,EAAgBib,GAAev4B,OAAOo4B,GAC7DA,KAGFliB,EAAaA,EAAW/G,KAAI,SAASqpB,GACjC,OAAOA,EAAmBplB,YAI7B6J,EAAI,EAAGA,EAAI/G,EAAWtY,OAAQqf,IAC/Bne,KAAK25B,cAAe,GACpBrhB,EAASlB,EAAW+G,IACbyb,kBAAkBJ,GACzBlhB,EAAOmG,QAAUia,EACP,IAANva,IAAW7F,EAAOuhB,+BAAgC,GACtD75B,KAAKm5B,gBAAgBn5B,KAAKm5B,gBAAgBr6B,OAAS,GAAG0B,KAAK8X,GAInEtY,KAAK8a,SAASta,KAAKk4B,EAAYlb,aAGnC4b,4BAAA,SAAgBV,GACPA,EAAY/Z,OACb3e,KAAK8a,SAAShc,OAASkB,KAAK8a,SAAShc,OAAS,IAItDs6B,uBAAA,SAAWP,EAAWpE,GAClBoE,EAAUQ,WAAa,GACvBr5B,KAAKm5B,gBAAgB34B,KAAKq4B,EAAUQ,aAGxCD,0BAAA,SAAcP,GACV74B,KAAKm5B,gBAAgBr6B,OAASkB,KAAKm5B,gBAAgBr6B,OAAS,GAGhEs6B,wBAAA,SAAYhB,EAAY3D,GACpB2D,EAAWiB,WAAa,GACxBr5B,KAAKm5B,gBAAgB34B,KAAK43B,EAAWiB,aAGzCD,2BAAA,SAAehB,GACXp4B,KAAKm5B,gBAAgBr6B,OAASkB,KAAKm5B,gBAAgBr6B,OAAS,sBAKhE,aACIkB,KAAKi2B,SAAW,IAAI7B,GAAQp0B,MAwYpC,OArYI85B,gBAAA,SAAInb,GACA,IAAMob,EAAe,IAAIX,GAGzB,GAFAp5B,KAAKg6B,cAAgB,GACrBD,EAAavD,IAAI7X,IACZob,EAAaJ,aAAgB,OAAOhb,EACzCA,EAAK0a,WAAa1a,EAAK0a,WAAWn4B,OAAOlB,KAAKi6B,iBAAiBtb,EAAK0a,WAAY1a,EAAK0a,aACrFr5B,KAAKm5B,gBAAkB,CAACxa,EAAK0a,YAC7B,IAAMa,EAAUl6B,KAAKi2B,SAAS3nB,MAAMqQ,GAEpC,OADA3e,KAAKm6B,0BAA0Bxb,EAAK0a,YAC7Ba,GAGXJ,sCAAA,SAA0B1iB,GACtB,IAAMgjB,EAAUp6B,KAAKg6B,cACrB5iB,EAAWoI,QAAO,SAASlH,GACvB,OAAQA,EAAO+hB,iBAA+C,GAA5B/hB,EAAO2U,WAAWnuB,UACrD0O,SAAQ,SAAS8K,GAChB,IAAI0F,EAAW,YACf,IACIA,EAAW1F,EAAO0F,SAASlN,MAAM,IAErC,MAAOlT,IAEFw8B,EAAW9hB,EAAOtK,UAASgQ,KAC5Boc,EAAW9hB,EAAOtK,UAASgQ,IAAc,EACzCrc,EAAOzB,KAAK,WAAW8d,2BAKnC8b,6BAAA,SAAiBQ,EAAaC,EAAmBC,GAU7C,IAAIC,EAEAC,EACAC,EAEAhjB,EAEA6hB,EACAlhB,EACAsiB,EACAC,EANEC,EAAe,GAEfC,EAAgB/6B,KActB,IARAw6B,EAAiBA,GAAkB,EAQ9BC,EAAc,EAAGA,EAAcH,EAAYx7B,OAAQ27B,IACpD,IAAKC,EAAoB,EAAGA,EAAoBH,EAAkBz7B,OAAQ47B,IAEtEpiB,EAASgiB,EAAYG,GACrBG,EAAeL,EAAkBG,GAG5BpiB,EAAO2U,WAAW5b,QAASupB,EAAa9N,YAAe,IAG5D0M,EAAe,CAACoB,EAAatN,cAAc,KAC3CqN,EAAUI,EAAcC,UAAU1iB,EAAQkhB,IAE9B16B,SACRwZ,EAAO+hB,iBAAkB,EAGzB/hB,EAAOgV,cAAc9f,SAAQ,SAASytB,GAClC,IAAM96B,EAAOy6B,EAAavnB,iBAG1BsE,EAAcojB,EAAcG,eAAeP,EAASnB,EAAcyB,EAAc3iB,EAAOuJ,cAGvFgZ,EAAY,IAAInI,GAAW,OAAEkI,EAAa5c,SAAU4c,EAAa/N,OAAQ,EAAG+N,EAAa5tB,WAAY7M,IAC3FmtB,cAAgB3V,EAG1BA,EAAYA,EAAY7Y,OAAS,GAAGsY,WAAa,CAACyjB,GAGlDC,EAAat6B,KAAKq6B,GAClBA,EAAUpc,QAAUmc,EAAanc,QAGjCoc,EAAU5N,WAAa4N,EAAU5N,WAAW/rB,OAAO05B,EAAa3N,WAAY3U,EAAO2U,YAK/E2N,EAAaf,gCACbgB,EAAUhB,+BAAgC,EAC1Ce,EAAanc,QAAQpD,MAAM7a,KAAKmX,SAOpD,GAAImjB,EAAah8B,OAAQ,CAIrB,GADAkB,KAAKm7B,mBACDX,EAAiB,IAAK,CACtB,IAAIY,EAAc,wBACdC,EAAc,wBAClB,IACID,EAAcN,EAAa,GAAGxN,cAAc,GAAGxc,QAC/CuqB,EAAcP,EAAa,GAAG9c,SAASlN,QAE3C,MAAOrR,IACP,KAAM,CAAEsW,QAAS,gFAAgFqlB,aAAsBC,OAK3H,OAAOP,EAAa55B,OAAO65B,EAAcd,iBAAiBa,EAAcP,EAAmBC,EAAiB,IAE5G,OAAOM,GAIfhB,6BAAA,SAAiBwB,EAAU7G,GACvBA,EAAUhB,aAAc,GAG5BqG,iCAAA,SAAqBvB,EAAqB9D,GACtCA,EAAUhB,aAAc,GAG5BqG,0BAAA,SAAcyB,EAAc9G,GACxBA,EAAUhB,aAAc,GAG5BqG,yBAAA,SAAapB,EAAajE,GACtB,IAAIiE,EAAY/Z,KAAhB,CAGA,IAAIgc,EACAa,EACAf,EAIAjB,EAHEH,EAAar5B,KAAKm5B,gBAAgBn5B,KAAKm5B,gBAAgBr6B,OAAS,GAChE28B,EAAiB,GACjBV,EAAgB/6B,KAKtB,IAAKy6B,EAAc,EAAGA,EAAcpB,EAAWv6B,OAAQ27B,IACnD,IAAKe,EAAY,EAAGA,EAAY9C,EAAYrd,MAAMvc,OAAQ08B,IAItD,GAHAhC,EAAed,EAAYrd,MAAMmgB,IAG7B9C,EAAYa,kBAAhB,CACA,IAAMniB,EAAaoiB,EAAaA,EAAa16B,OAAS,GAAGsY,WACrDA,GAAcA,EAAWtY,SAE7B67B,EAAU36B,KAAKg7B,UAAU3B,EAAWoB,GAAcjB,IAEtC16B,SACRu6B,EAAWoB,GAAaJ,iBAAkB,EAE1ChB,EAAWoB,GAAanN,cAAc9f,SAAQ,SAASytB,GACnD,IAAIS,EACJA,EAAoBX,EAAcG,eAAeP,EAASnB,EAAcyB,EAAc5B,EAAWoB,GAAa5Y,aAC9G4Z,EAAej7B,KAAKk7B,OAKpChD,EAAYrd,MAAQqd,EAAYrd,MAAMna,OAAOu6B,KAGjD3B,sBAAA,SAAUxhB,EAAQqjB,GAKd,IAAIC,EAEAC,EACAC,EACAC,EACAC,EACAt7B,EAIAu7B,EAFEC,EAAiB5jB,EAAO0F,SAAS7G,SACjCglB,EAAmB,GAEnBxB,EAAU,GAGhB,IAAKiB,EAAwB,EAAGA,EAAwBD,EAAqB78B,OAAQ88B,IAGjF,IAFAC,EAAoBF,EAAqBC,GAEpCE,EAAwB,EAAGA,EAAwBD,EAAkB1kB,SAASrY,OAAQg9B,IAUvF,IARAC,EAAkBF,EAAkB1kB,SAAS2kB,IAGzCxjB,EAAO4U,aAA0C,IAA1B0O,GAAyD,IAA1BE,IACtDK,EAAiB37B,KAAK,CAACg7B,UAAWI,EAAuB5tB,MAAO8tB,EAAuBM,QAAS,EAC5FC,kBAAmBN,EAAgB7oB,aAGtCxS,EAAI,EAAGA,EAAIy7B,EAAiBr9B,OAAQ4B,IACrCu7B,EAAiBE,EAAiBz7B,GAMT,MADzBs7B,EAAmBD,EAAgB7oB,WAAW9E,QACW,IAA1B0tB,IAC3BE,EAAmB,MA5Bbh8B,KAgCSs8B,qBAAqBJ,EAAeD,EAAeG,SAAShuB,MAAO2tB,EAAgB3tB,QACjG6tB,EAAeG,QAAU,GAAKF,EAAeD,EAAeG,SAASlpB,WAAW9E,QAAU4tB,EAC3FC,EAAiB,KAEjBA,EAAeG,UAIfH,IACAA,EAAeM,SAAWN,EAAeG,UAAYF,EAAep9B,OAChEm9B,EAAeM,WACbjkB,EAAO6U,aACJ2O,EAAwB,EAAID,EAAkB1kB,SAASrY,QAAU88B,EAAwB,EAAID,EAAqB78B,UACvHm9B,EAAiB,OAIrBA,EACIA,EAAeM,WACfN,EAAen9B,OAASo9B,EAAep9B,OACvCm9B,EAAeO,aAAeZ,EAC9BK,EAAeQ,oBAAsBX,EAAwB,EAC7DK,EAAiBr9B,OAAS,EAC1B67B,EAAQn6B,KAAKy7B,KAGjBE,EAAiBx7B,OAAOD,EAAG,GAC3BA,KAKhB,OAAOi6B,GAGXb,iCAAA,SAAqB4C,EAAeC,GAChC,GAA6B,iBAAlBD,GAAuD,iBAAlBC,EAC5C,OAAOD,IAAkBC,EAE7B,GAAID,aAAyBhK,GAAKpJ,UAC9B,OAAIoT,EAAcnuB,KAAOouB,EAAcpuB,IAAMmuB,EAAcrqB,MAAQsqB,EAActqB,MAG5EqqB,EAActuB,OAAUuuB,EAAcvuB,OAM3CsuB,EAAgBA,EAActuB,MAAMA,OAASsuB,EAActuB,UAC3DuuB,EAAgBA,EAAcvuB,MAAMA,OAASuuB,EAAcvuB,QANnDsuB,EAActuB,QAASuuB,EAAcvuB,OAWjD,GAFAsuB,EAAgBA,EAActuB,MAC9BuuB,EAAgBA,EAAcvuB,MAC1BsuB,aAAyBhK,GAAKjb,SAAU,CACxC,KAAMklB,aAAyBjK,GAAKjb,WAAailB,EAAcvlB,SAASrY,SAAW69B,EAAcxlB,SAASrY,OACtG,OAAO,EAEX,IAAK,IAAI4B,EAAI,EAAGA,EAAKg8B,EAAcvlB,SAASrY,OAAQ4B,IAAK,CACrD,GAAIg8B,EAAcvlB,SAASzW,GAAGwS,WAAW9E,QAAUuuB,EAAcxlB,SAASzW,GAAGwS,WAAW9E,QAC1E,IAAN1N,IAAYg8B,EAAcvlB,SAASzW,GAAGwS,WAAW9E,OAAS,QAAUuuB,EAAcxlB,SAASzW,GAAGwS,WAAW9E,OAAS,MAClH,OAAO,EAGf,IAAKpO,KAAKs8B,qBAAqBI,EAAcvlB,SAASzW,GAAG0N,MAAOuuB,EAAcxlB,SAASzW,GAAG0N,OACtF,OAAO,EAGf,OAAO,EAEX,OAAO,GAGX0rB,2BAAA,SAAea,EAASnB,EAAcoD,EAAqB/a,GAIvD,IAAkFgb,EAAY7e,EAAU8e,EAAc1sB,EAAO2sB,EAAzHC,EAA2B,EAAGC,EAAkC,EAAGzhB,EAAO,GAE9E,IAAKqhB,EAAa,EAAGA,EAAalC,EAAQ77B,OAAQ+9B,IAE9C7e,EAAWwb,GADXppB,EAAQuqB,EAAQkC,IACcrB,WAC9BsB,EAAe,IAAIpK,GAAKlf,QACpBpD,EAAMisB,kBACNO,EAAoBzlB,SAAS,GAAG/I,MAChCwuB,EAAoBzlB,SAAS,GAAGhE,WAChCypB,EAAoBzlB,SAAS,GAAGlK,WAChC2vB,EAAoBzlB,SAAS,GAAGnK,YAGhCoD,EAAMorB,UAAYwB,GAA4BC,EAAkC,IAChFzhB,EAAKA,EAAK1c,OAAS,GAAGqY,SAAWqE,EAAKA,EAAK1c,OAAS,GAC/CqY,SAASjW,OAAOs4B,EAAawD,GAA0B7lB,SAAS5E,MAAM0qB,IAC3EA,EAAkC,EAClCD,KAGJD,EAAc/e,EAAS7G,SAClB5E,MAAM0qB,EAAiC7sB,EAAMpC,OAC7C9M,OAAO,CAAC47B,IACR57B,OAAO07B,EAAoBzlB,SAAS5E,MAAM,IAE3CyqB,IAA6B5sB,EAAMorB,WAAaqB,EAAa,EAC7DrhB,EAAKA,EAAK1c,OAAS,GAAGqY,SAClBqE,EAAKA,EAAK1c,OAAS,GAAGqY,SAASjW,OAAO67B,IAE1CvhB,EAAOA,EAAKta,OAAOs4B,EAAajnB,MAAMyqB,EAA0B5sB,EAAMorB,aAEjEh7B,KAAK,IAAIkyB,GAAKjb,SACfslB,IAGRC,EAA2B5sB,EAAMosB,cACjCS,EAAkC7sB,EAAMqsB,sBACDjD,EAAawD,GAA0B7lB,SAASrY,SACnFm+B,EAAkC,EAClCD,KAqBR,OAjBIA,EAA2BxD,EAAa16B,QAAUm+B,EAAkC,IACpFzhB,EAAKA,EAAK1c,OAAS,GAAGqY,SAAWqE,EAAKA,EAAK1c,OAAS,GAC/CqY,SAASjW,OAAOs4B,EAAawD,GAA0B7lB,SAAS5E,MAAM0qB,IAC3ED,KAIJxhB,GADAA,EAAOA,EAAKta,OAAOs4B,EAAajnB,MAAMyqB,EAA0BxD,EAAa16B,UACjEuR,KAAI,SAAU6sB,GAEtB,IAAMC,EAAUD,EAAa3kB,cAAc2kB,EAAa/lB,UAMxD,OALI0K,EACAsb,EAAQlE,mBAERkE,EAAQjE,qBAELiE,MAKfrD,uBAAA,SAAWjB,EAAWpE,GAClB,IAAI2I,EAAgBvE,EAAUQ,WAAWn4B,OAAOlB,KAAKm5B,gBAAgBn5B,KAAKm5B,gBAAgBr6B,OAAS,IACnGs+B,EAAgBA,EAAcl8B,OAAOlB,KAAKi6B,iBAAiBmD,EAAevE,EAAUQ,aACpFr5B,KAAKm5B,gBAAgB34B,KAAK48B,IAG9BtD,0BAAA,SAAcjB,GACV,IAAMwE,EAAYr9B,KAAKm5B,gBAAgBr6B,OAAS,EAChDkB,KAAKm5B,gBAAgBr6B,OAASu+B,GAGlCvD,wBAAA,SAAY1B,EAAY3D,GACpB,IAAI2I,EAAgBhF,EAAWiB,WAAWn4B,OAAOlB,KAAKm5B,gBAAgBn5B,KAAKm5B,gBAAgBr6B,OAAS,IACpGs+B,EAAgBA,EAAcl8B,OAAOlB,KAAKi6B,iBAAiBmD,EAAehF,EAAWiB,aACrFr5B,KAAKm5B,gBAAgB34B,KAAK48B,IAG9BtD,2BAAA,SAAe1B,GACX,IAAMiF,EAAYr9B,KAAKm5B,gBAAgBr6B,OAAS,EAChDkB,KAAKm5B,gBAAgBr6B,OAASu+B,sBC1elC,aACIr9B,KAAK8a,SAAW,CAAC,IACjB9a,KAAKi2B,SAAW,IAAI7B,GAAQp0B,MAiDpC,OA9CIs9B,gBAAA,SAAI3e,GACA,OAAO3e,KAAKi2B,SAAS3nB,MAAMqQ,IAG/B2e,6BAAA,SAAiBrF,EAAUxD,GACvBA,EAAUhB,aAAc,GAG5B6J,iCAAA,SAAqB/E,EAAqB9D,GACtCA,EAAUhB,aAAc,GAG5B6J,yBAAA,SAAa5E,EAAajE,GACtB,IAEIjX,EAFE7P,EAAU3N,KAAK8a,SAAS9a,KAAK8a,SAAShc,OAAS,GAC/Cuc,EAAQ,GAGdrb,KAAK8a,SAASta,KAAK6a,GAEdqd,EAAY/Z,QACbnB,EAAYkb,EAAYlb,aAEpBA,EAAYA,EAAUgC,QAAO,SAASxB,GAAY,OAAOA,EAASuf,iBAClE7E,EAAYlb,UAAYA,EAAU1e,OAAS0e,EAAaA,EAAY,KAChEA,GAAakb,EAAY8E,cAAcniB,EAAO1N,EAAS6P,IAE1DA,IAAakb,EAAYjb,MAAQ,MACtCib,EAAYrd,MAAQA,IAI5BiiB,4BAAA,SAAgB5E,GACZ14B,KAAK8a,SAAShc,OAASkB,KAAK8a,SAAShc,OAAS,GAGlDw+B,uBAAA,SAAWzE,EAAWpE,GAClB,IAAM9mB,EAAU3N,KAAK8a,SAAS9a,KAAK8a,SAAShc,OAAS,GACrD+5B,EAAUpb,MAAM,GAAGkB,KAA2B,IAAnBhR,EAAQ7O,QAAgB6O,EAAQ,GAAG+c,YAGlE4S,wBAAA,SAAYlF,EAAY3D,GACpB,IAAM9mB,EAAU3N,KAAK8a,SAAS9a,KAAK8a,SAAShc,OAAS,GACjDs5B,EAAW3a,OAAS2a,EAAW3a,MAAM3e,SACrCs5B,EAAW3a,MAAM,GAAGkB,KAAQyZ,EAAW/T,UAA+B,IAAnB1W,EAAQ7O,QAAgB,0BC/CnF,WAAY6O,GACR3N,KAAKi2B,SAAW,IAAI7B,GAAQp0B,MAC5BA,KAAKy9B,SAAW9vB,EAwExB,OArEI+vB,0CAAA,SAA8BC,GAC1B,IAAIrf,EACJ,IAAKqf,EACD,OAAO,EAEX,IAAK,IAAIhtB,EAAI,EAAGA,EAAIgtB,EAAU7+B,OAAQ6R,IAElC,IADA2N,EAAOqf,EAAUhtB,IACRitB,UAAYtf,EAAKsf,SAAS59B,KAAKy9B,YAAcnf,EAAKgN,mBAGvD,OAAO,EAGf,OAAO,GAGXoS,kCAAA,SAAsBG,GACdA,GAASA,EAAMpgB,QACfogB,EAAMpgB,MAAQogB,EAAMpgB,MAAM+B,QAAO,SAAAse,GAAS,OAAAA,EAAMjc,iBAIxD6b,oBAAA,SAAQG,GACJ,OAAQA,IAASA,EAAMpgB,OACO,IAAvBogB,EAAMpgB,MAAM3e,QAGvB4+B,+BAAA,SAAmBhF,GACf,SAAQA,IAAeA,EAAYrd,QAC5Bqd,EAAYrd,MAAMvc,OAAS,GAGtC4+B,8BAAA,SAAkBrwB,EAAM0wB,GACpB,IAAK1wB,EAAKie,mBAAoB,CAC1B,GAAItrB,KAAKiO,QAAQZ,KAAUrN,KAAKg+B,8BAA8BD,GAC1D,OAGJ,OAAO1wB,EAGX,IAAM4wB,EAAoB5wB,EAAKoQ,MAAM,GAGrC,GAFAzd,KAAKk+B,sBAAsBD,IAEvBj+B,KAAKiO,QAAQgwB,GAOjB,OAHA5wB,EAAK4rB,mBACL5rB,EAAK8wB,wBAEE9wB,GAGXqwB,6BAAA,SAAiBhF,GACb,QAAIA,EAAY9Z,YAIZ5e,KAAKiO,QAAQyqB,OAIZA,EAAY/Z,OAAS3e,KAAKo+B,mBAAmB1F,UAQpDvP,GAAe,SAASxb,GAC1B3N,KAAKi2B,SAAW,IAAI7B,GAAQp0B,MAC5BA,KAAKy9B,SAAW9vB,EAChB3N,KAAKq+B,MAAQ,IAAIX,GAAgB/vB,IAGrCwb,GAAa5Z,UAAY,CACrBolB,aAAa,EACb6B,IAAK,SAAU7X,GACX,OAAO3e,KAAKi2B,SAAS3nB,MAAMqQ,IAG/BqZ,iBAAkB,SAAUC,EAAUxD,GAClC,IAAIwD,EAAS3M,qBAAsB2M,EAAS3e,SAG5C,OAAO2e,GAGXK,qBAAsB,SAAUgG,EAAW7J,GAGvC6J,EAAU3iB,OAAS,IAGvB4iB,YAAa,SAAUC,EAAY/J,KAGnCgK,aAAc,SAAUC,EAAajK,GACjC,IAAIiK,EAAYpT,qBAAsBoT,EAAYd,SAAS59B,KAAKy9B,UAGhE,OAAOiB,GAGX9F,WAAY,SAASC,EAAWpE,GAC5B,IAAMsJ,EAAgBlF,EAAUpb,MAAM,GAAGA,MAIzC,OAHAob,EAAUhE,OAAO70B,KAAKi2B,UACtBxB,EAAUhB,aAAc,EAEjBzzB,KAAKq+B,MAAMM,kBAAkB9F,EAAWkF,IAGnDrH,YAAa,SAAUC,EAAYlC,GAC/B,IAAIkC,EAAWrL,mBAGf,OAAOqL,GAGXwB,YAAa,SAASC,EAAY3D,GAC9B,OAAI2D,EAAW3a,OAAS2a,EAAW3a,MAAM3e,OAC9BkB,KAAK4+B,oBAAoBxG,EAAY3D,GAErCz0B,KAAK6+B,uBAAuBzG,EAAY3D,IAIvDqK,eAAgB,SAASC,EAAetK,GACpC,IAAKsK,EAAczT,mBAEf,OADAyT,EAAclK,OAAO70B,KAAKi2B,UACnB8I,GAIfH,oBAAqB,SAASxG,EAAY3D,GAkBtC,IAAMsJ,EAXN,SAAsB3F,GAClB,IAAM4G,EAAY5G,EAAW3a,MAC7B,OANJ,SAAwB2a,GACpB,IAAMuF,EAAYvF,EAAW3a,MAC7B,OAA4B,IAArBkgB,EAAU7+B,UAAkB6+B,EAAU,GAAGtiB,OAAuC,IAA9BsiB,EAAU,GAAGtiB,MAAMvc,QAIxEmgC,CAAe7G,GACR4G,EAAU,GAAGvhB,MAGjBuhB,EAKWE,CAAa9G,GAQnC,OAPAA,EAAWvD,OAAO70B,KAAKi2B,UACvBxB,EAAUhB,aAAc,EAEnBzzB,KAAKq+B,MAAMpwB,QAAQmqB,IACpBp4B,KAAKopB,YAAYgP,EAAW3a,MAAM,GAAGA,OAGlCzd,KAAKq+B,MAAMM,kBAAkBvG,EAAY2F,IAGpDc,uBAAwB,SAASzG,EAAY3D,GACzC,IAAI2D,EAAW9M,mBAAf,CAIA,GAAwB,aAApB8M,EAAWlf,KAAqB,CAIhC,GAAIlZ,KAAKm/B,QAAS,CACd,GAAI/G,EAAWje,UAAW,CACtB,IAAMilB,EAAU,IAAI1M,GAAK/X,QAAQ,MAAMyd,EAAWtnB,MAAM9Q,KAAKy9B,UAAUtgC,QAAQ,MAAO,aAEtF,OADAiiC,EAAQjlB,UAAYie,EAAWje,UACxBna,KAAKi2B,SAAS3nB,MAAM8wB,GAE/B,OAEJp/B,KAAKm/B,SAAU,EAGnB,OAAO/G,IAGXiH,gBAAiB,SAAS5hB,EAAO6hB,GAC7B,GAAK7hB,EAIL,IAAK,IAAI/c,EAAI,EAAGA,EAAI+c,EAAM3e,OAAQ4B,IAAK,CACnC,IAAM46B,EAAW7d,EAAM/c,GACvB,GAAI4+B,GAAUhE,aAAoB5I,GAAKnZ,cAAgB+hB,EAAShiB,SAC5D,KAAM,CAAEvD,QAAS,wEACb/H,MAAOstB,EAASruB,WAAY1L,SAAU+5B,EAAStuB,YAAcsuB,EAAStuB,WAAWzL,UAEzF,GAAI+5B,aAAoB5I,GAAKtK,KACzB,KAAM,CAAErS,QAAS,aAAaulB,EAASpiB,oCACnClL,MAAOstB,EAASruB,WAAY1L,SAAU+5B,EAAStuB,YAAcsuB,EAAStuB,WAAWzL,UAEzF,GAAI+5B,EAAS16B,OAAS06B,EAASxiB,UAC3B,KAAM,CAAE/C,QAAYulB,EAAS16B,sDACzBoN,MAAOstB,EAASruB,WAAY1L,SAAU+5B,EAAStuB,YAAcsuB,EAAStuB,WAAWzL,YAKjGk3B,aAAc,SAAUC,EAAajE,GAEjC,IAAInW,EAEEyC,EAAW,GAIjB,GAFA/gB,KAAKq/B,gBAAgB3G,EAAYjb,MAAOib,EAAY9Z,WAE/C8Z,EAAY/Z,KA6Bb+Z,EAAY7D,OAAO70B,KAAKi2B,UACxBxB,EAAUhB,aAAc,MA9BL,CAEnBzzB,KAAKu/B,qBAAqB7G,GAM1B,IAHA,IAAMsG,EAAYtG,EAAYjb,MAE1B+hB,EAAcR,EAAYA,EAAUlgC,OAAS,EACxC4B,EAAI,EAAGA,EAAI8+B,IAChBlhB,EAAO0gB,EAAUt+B,KACL4d,EAAKb,OAEbsD,EAASvgB,KAAKR,KAAKi2B,SAAS3nB,MAAMgQ,IAClC0gB,EAAUr+B,OAAOD,EAAG,GACpB8+B,KAGJ9+B,IAKA8+B,EAAc,EACd9G,EAAY7D,OAAO70B,KAAKi2B,UAExByC,EAAYjb,MAAQ,KAExBgX,EAAUhB,aAAc,EAiB5B,OAXIiF,EAAYjb,QACZzd,KAAKopB,YAAYsP,EAAYjb,OAC7Bzd,KAAKy/B,sBAAsB/G,EAAYjb,QAIvCzd,KAAKq+B,MAAMqB,iBAAiBhH,KAC5BA,EAAYO,mBACZlY,EAASpgB,OAAO,EAAG,EAAG+3B,IAGF,IAApB3X,EAASjiB,OACFiiB,EAAS,GAEbA,GAGXwe,qBAAsB,SAAS7G,GACvBA,EAAYrd,QACZqd,EAAYrd,MAAQqd,EAAYrd,MAC3BmE,QAAO,SAAArQ,GACJ,IAAIzO,EAIJ,IAH0C,MAAtCyO,EAAE,GAAGgI,SAAS,GAAGjE,WAAW9E,QAC5Be,EAAE,GAAGgI,SAAS,GAAGjE,WAAa,IAAIwf,GAAe,WAAE,KAElDhyB,EAAI,EAAGA,EAAIyO,EAAErQ,OAAQ4B,IACtB,GAAIyO,EAAEzO,GAAGmhB,aAAe1S,EAAEzO,GAAG68B,cACzB,OAAO,EAGf,OAAO,OAKvBkC,sBAAuB,SAAShiB,GAC5B,GAAKA,EAAL,CAGA,IAEIkiB,EACArhB,EACA5d,EAJEk/B,EAAY,GAMlB,IAAKl/B,EAAI+c,EAAM3e,OAAS,EAAG4B,GAAK,EAAIA,IAEhC,IADA4d,EAAOb,EAAM/c,cACOgyB,GAAKnZ,YACrB,GAAKqmB,EAAUthB,EAAKpF,MAEb,EACHymB,EAAWC,EAAUthB,EAAKpF,iBACFwZ,GAAKnZ,cACzBomB,EAAWC,EAAUthB,EAAKpF,MAAQ,CAAC0mB,EAAUthB,EAAKpF,MAAMpI,MAAM9Q,KAAKy9B,YAEvE,IAAMoC,EAAUvhB,EAAKxN,MAAM9Q,KAAKy9B,WACG,IAA/BkC,EAAStuB,QAAQwuB,GACjBpiB,EAAM9c,OAAOD,EAAG,GAEhBi/B,EAASn/B,KAAKq/B,QAVlBD,EAAUthB,EAAKpF,MAAQoF,IAiBvC8K,YAAa,SAAS3L,GAClB,GAAKA,EAAL,CAOA,IAHA,IAAMqiB,EAAY,GACZC,EAAY,GAETr/B,EAAI,EAAGA,EAAI+c,EAAM3e,OAAQ4B,IAAK,CACnC,IAAM4d,EAAOb,EAAM/c,GACnB,GAAI4d,EAAKlF,MAAO,CACZ,IAAM/G,EAAMiM,EAAKpF,KACjB4mB,EAAOztB,GAAOoL,EAAM9c,OAAOD,IAAK,GAC5Bq/B,EAAUv/B,KAAKs/B,EAAOztB,GAAO,IACjCytB,EAAOztB,GAAK7R,KAAK8d,IAIzByhB,EAAUvyB,SAAQ,SAAAkY,GACd,GAAIA,EAAM5mB,OAAS,EAAG,CAClB,IAAMkhC,EAASta,EAAM,GACjBua,EAAS,GACPC,EAAS,CAAC,IAAIxN,GAAKnL,WAAW0Y,IACpCva,EAAMlY,SAAQ,SAAA8Q,GACU,MAAfA,EAAKlF,OAAmB6mB,EAAMnhC,OAAS,GACxCohC,EAAM1/B,KAAK,IAAIkyB,GAAKnL,WAAW0Y,EAAQ,KAE3CA,EAAMz/B,KAAK8d,EAAKlQ,OAChB4xB,EAAO7mB,UAAY6mB,EAAO7mB,WAAamF,EAAKnF,aAEhD6mB,EAAO5xB,MAAQ,IAAIskB,GAAKla,MAAM0nB,iBC7V/B,CACX9L,WACA0B,iBACAqK,+BACAC,iBACA9C,uBACAnU,mCCVA,IACIlT,EAGAkI,EAMAkiB,EAGAC,EAGAC,EAGAC,EAGAC,EAfAC,EAAY,GAiBVC,EAAc,GAUpB,SAASC,EAAe9hC,GAWpB,IAVA,IAMIwR,EACAuwB,EACAzB,EARE0B,EAAOH,EAAYjgC,EACnBqgC,EAAO5iB,EACP6iB,EAAOL,EAAYjgC,EAAI+/B,EACvBQ,EAAWN,EAAYjgC,EAAI8/B,EAAQ1hC,OAASkiC,EAC5CE,EAAOP,EAAYjgC,GAAK5B,EACxBqiC,EAAMlrB,EAKL0qB,EAAYjgC,EAAIugC,EAAUN,EAAYjgC,IAAK,CAG9C,GAFA4P,EAAI6wB,EAAIC,WAAWT,EAAYjgC,GAE3BigC,EAAYU,mBAjBO,KAiBc/wB,EAA8B,CAE/D,GAAiB,OADjBuwB,EAAWM,EAAIztB,OAAOitB,EAAYjgC,EAAI,IAChB,CAClB0+B,EAAU,CAACpxB,MAAO2yB,EAAYjgC,EAAGga,eAAe,GAChD,IAAI4mB,EAAcH,EAAI9vB,QAAQ,KAAMsvB,EAAYjgC,EAAI,GAChD4gC,EAAc,IACdA,EAAcL,GAElBN,EAAYjgC,EAAI4gC,EAChBlC,EAAQmC,KAAOJ,EAAIjqB,OAAOkoB,EAAQpxB,MAAO2yB,EAAYjgC,EAAI0+B,EAAQpxB,OACjE2yB,EAAYa,aAAahhC,KAAK4+B,GAC9B,SACG,GAAiB,MAAbyB,EAAkB,CACzB,IAAMY,EAAgBN,EAAI9vB,QAAQ,KAAMsvB,EAAYjgC,EAAI,GACxD,GAAI+gC,GAAiB,EAAG,CACpBrC,EAAU,CACNpxB,MAAO2yB,EAAYjgC,EACnB6gC,KAAMJ,EAAIjqB,OAAOypB,EAAYjgC,EAAG+gC,EAAgB,EAAId,EAAYjgC,GAChEga,eAAe,GAEnBimB,EAAYjgC,GAAK0+B,EAAQmC,KAAKziC,OAAS,EACvC6hC,EAAYa,aAAahhC,KAAK4+B,GAC9B,UAGR,MAGJ,GAnDe,KAmDV9uB,GAjDO,KAiDmBA,GAlDlB,IAkDyCA,GAhD1C,KAgDkEA,EAC1E,MAOR,GAHAkwB,EAAUA,EAAQjuB,MAAMzT,EAAS6hC,EAAYjgC,EAAIwgC,EAAMF,GACvDP,EAAaE,EAAYjgC,GAEpB8/B,EAAQ1hC,OAAQ,CACjB,GAAIqf,EAAIoiB,EAAOzhC,OAAS,EAGpB,OAFA0hC,EAAUD,IAASpiB,GACnByiB,EAAe,IACR,EAEXD,EAAYpE,UAAW,EAG3B,OAAOuE,IAASH,EAAYjgC,GAAKqgC,IAAS5iB,EAoS9C,OAjSAwiB,EAAYe,KAAO,WACfjB,EAAaE,EAAYjgC,EACzBggC,EAAUlgC,KAAM,CAAEggC,UAAS9/B,EAAGigC,EAAYjgC,EAAGyd,OAEjDwiB,EAAYgB,QAAU,SAAAC,IAEdjB,EAAYjgC,EAAI2/B,GAAaM,EAAYjgC,IAAM2/B,GAAYuB,IAAyBtB,KACpFD,EAAWM,EAAYjgC,EACvB4/B,EAA+BsB,GAEnC,IAAMC,EAAQnB,EAAU3mB,MACxBymB,EAAUqB,EAAMrB,QAChBC,EAAaE,EAAYjgC,EAAImhC,EAAMnhC,EACnCyd,EAAI0jB,EAAM1jB,GAEdwiB,EAAYmB,OAAS,WACjBpB,EAAU3mB,OAEd4mB,EAAYoB,aAAe,SAAAC,GACvB,IAAMC,EAAMtB,EAAYjgC,GAAKshC,GAAU,GACjCE,EAAOjsB,EAAMmrB,WAAWa,GAC9B,OA5FmB,KA4FXC,GAzFQ,KAyFmBA,GA3FlB,IA2F0CA,GA1F3C,KA0FoEA,GAIxFvB,EAAYwB,IAAM,SAAAC,GACVzB,EAAYjgC,EAAI+/B,IAChBD,EAAUA,EAAQjuB,MAAMouB,EAAYjgC,EAAI+/B,GACxCA,EAAaE,EAAYjgC,GAG7B,IAAMyK,EAAIi3B,EAAIC,KAAK7B,GACnB,OAAKr1B,GAILy1B,EAAez1B,EAAE,GAAGrM,QACH,iBAANqM,EACAA,EAGS,IAAbA,EAAErM,OAAeqM,EAAE,GAAKA,GARpB,MAWfw1B,EAAY2B,MAAQ,SAAAF,GAChB,OAAInsB,EAAMvC,OAAOitB,EAAYjgC,KAAO0hC,EACzB,MAEXxB,EAAe,GACRwB,IAGXzB,EAAY4B,KAAO,SAAAH,GAIf,IAHA,IAAMI,EAAYJ,EAAItjC,OAGb4B,EAAI,EAAGA,EAAI8hC,EAAW9hC,IAC3B,GAAIuV,EAAMvC,OAAOitB,EAAYjgC,EAAIA,KAAO0hC,EAAI1uB,OAAOhT,GAC/C,OAAO,KAKf,OADAkgC,EAAe4B,GACRJ,GAGXzB,EAAY8B,QAAU,SAAAtsB,GAClB,IAAM8rB,EAAM9rB,GAAOwqB,EAAYjgC,EACzBgiC,EAAYzsB,EAAMvC,OAAOuuB,GAE/B,GAAkB,MAAdS,GAAoC,MAAdA,EAA1B,CAMA,IAHA,IAAM5jC,EAASmX,EAAMnX,OACf6jC,EAAkBV,EAEfvhC,EAAI,EAAGA,EAAIiiC,EAAkB7jC,EAAQ4B,IAAK,CAE/C,OADiBuV,EAAMvC,OAAOhT,EAAIiiC,IAE9B,IAAK,KACDjiC,IACA,SACJ,IAAK,KACL,IAAK,KACD,MACJ,KAAKgiC,EACD,IAAM1rB,EAAMf,EAAMiB,OAAOyrB,EAAiBjiC,EAAI,GAC9C,OAAKyV,GAAe,IAARA,EAIL,CAACusB,EAAW1rB,IAHf4pB,EAAelgC,EAAI,GACZsW,IAMvB,OAAO,OAOX2pB,EAAYiC,YAAc,SAAAR,GACtB,IAWIS,EAXApZ,EAAQ,GACRqZ,EAAY,KACZC,GAAY,EACZC,EAAa,EACXC,EAAa,GACbC,EAAc,GACdpkC,EAASmX,EAAMnX,OACfqkC,EAAWxC,EAAYjgC,EACzB0iC,EAAUzC,EAAYjgC,EACtBA,EAAIigC,EAAYjgC,EAChB2iC,GAAO,EAIPR,EADe,iBAART,EACI,SAAAkB,GAAQ,OAAAA,IAASlB,GAEjB,SAAAkB,GAAQ,OAAAlB,EAAI3nB,KAAK6oB,IAGhC,EAAG,CAEC,IAAIzC,EAAW5qB,EAAMvC,OAAOhT,GAC5B,GAAmB,IAAfsiC,GAAoBH,EAAShC,IAC7BiC,EAAY7sB,EAAMiB,OAAOksB,EAAS1iC,EAAI0iC,IAElCF,EAAY1iC,KAAKsiC,GAGjBI,EAAY1iC,KAAK,KAErBsiC,EAAYI,EACZtC,EAAelgC,EAAIyiC,GACnBE,GAAO,MACJ,CACH,GAAIN,EAAW,CACM,MAAblC,GACwB,MAAxB5qB,EAAMvC,OAAOhT,EAAI,KACjBA,IACAsiC,IACAD,GAAY,GAEhBriC,IACA,SAEJ,OAAQmgC,GACJ,IAAK,KACDngC,IACAmgC,EAAW5qB,EAAMvC,OAAOhT,GACxBwiC,EAAY1iC,KAAKyV,EAAMiB,OAAOksB,EAAS1iC,EAAI0iC,EAAU,IACrDA,EAAU1iC,EAAI,EACd,MACJ,IAAK,IAC2B,MAAxBuV,EAAMvC,OAAOhT,EAAI,KACjBA,IACAqiC,GAAY,EACZC,KAEJ,MACJ,IAAK,IACL,IAAK,KACDvZ,EAAQkX,EAAY8B,QAAQ/hC,KAExBwiC,EAAY1iC,KAAKyV,EAAMiB,OAAOksB,EAAS1iC,EAAI0iC,GAAU3Z,GAErD2Z,GADA1iC,GAAK+oB,EAAM,GAAG3qB,OAAS,GACT,IAGd8hC,EAAelgC,EAAIyiC,GACnBL,EAAYjC,EACZwC,GAAO,GAEX,MACJ,IAAK,IACDJ,EAAWziC,KAAK,KAChBwiC,IACA,MACJ,IAAK,IACDC,EAAWziC,KAAK,KAChBwiC,IACA,MACJ,IAAK,IACDC,EAAWziC,KAAK,KAChBwiC,IACA,MACJ,IAAK,IACL,IAAK,IACL,IAAK,IACD,IAAMO,EAAWN,EAAWlpB,MACxB8mB,IAAa0C,EACbP,KAGApC,EAAelgC,EAAIyiC,GACnBL,EAAYS,EACZF,GAAO,KAGnB3iC,EACQ5B,IACJukC,GAAO,UAIVA,GAET,OAAOP,GAAwB,MAGnCnC,EAAYU,mBAAoB,EAChCV,EAAYa,aAAe,GAC3Bb,EAAYpE,UAAW,EAIvBoE,EAAY6C,KAAO,SAAApB,GACf,GAAmB,iBAARA,EAAkB,CAEzB,IAAK,IAAI1hC,EAAI,EAAGA,EAAI0hC,EAAItjC,OAAQ4B,IAC5B,GAAIuV,EAAMvC,OAAOitB,EAAYjgC,EAAIA,KAAO0hC,EAAI1uB,OAAOhT,GAC/C,OAAO,EAGf,OAAO,EAEP,OAAO0hC,EAAI3nB,KAAK+lB,IAMxBG,EAAY8C,SAAW,SAAArB,GAAO,OAAAnsB,EAAMvC,OAAOitB,EAAYjgC,KAAO0hC,GAE9DzB,EAAY+C,YAAc,WAAM,OAAAztB,EAAMvC,OAAOitB,EAAYjgC,IAEzDigC,EAAYgD,SAAW,WAAM,OAAA1tB,EAAMvC,OAAOitB,EAAYjgC,EAAI,IAE1DigC,EAAYiD,SAAW,WAAM,OAAA3tB,GAE7B0qB,EAAYkD,eAAiB,WACzB,IAAMvzB,EAAI2F,EAAMmrB,WAAWT,EAAYjgC,GAEvC,OAAQ4P,EApTO,IAoTWA,EAvTR,IAES,KAqTqBA,GAtT7B,KAsT6DA,GAGpFqwB,EAAYmD,MAAQ,SAAC9sB,EAAK+sB,EAAYC,GAClC/tB,EAAQe,EACR2pB,EAAYjgC,EAAIyd,EAAIsiB,EAAaJ,EAAW,EAaxCE,EADAwD,WCvWa9tB,EAAOguB,GAC5B,IAGIC,EACAC,EACAC,EACAC,EAGAC,EACAC,EACAC,EACAC,EACArI,EAbEjkB,EAAMlC,EAAMnX,OACd4lC,EAAQ,EACRC,EAAa,EAKXpE,EAAS,GACXqE,EAAW,EAOf,SAASC,EAAUC,GACf,IAAM3sB,EAAMmsB,EAAsBM,EAC5BzsB,EAAM,MAAS2sB,IAAW3sB,IAGhCooB,EAAO//B,KAAKyV,EAAM1D,MAAMqyB,EAAUN,EAAsB,IACxDM,EAAWN,EAAsB,GAGrC,IAAKA,EAAsB,EAAGA,EAAsBnsB,EAAKmsB,IAErD,MADAE,EAAKvuB,EAAMmrB,WAAWkD,KACV,IAAQE,GAAM,KAAUA,EAAK,IAKzC,OAAQA,GACJ,KAAK,GACDG,IACAR,EAAmBG,EACnB,SACJ,KAAK,GACD,KAAMK,EAAa,EACf,OAAOV,EAAK,sBAAuBK,GAEvC,SACJ,KAAK,GACIK,GAAcE,IACnB,SACJ,KAAK,IACDH,IACAR,EAAcI,EACd,SACJ,KAAK,IACD,KAAMI,EAAQ,EACV,OAAOT,EAAK,sBAAuBK,GAElCI,GAAUC,GAAcE,IAC7B,SACJ,KAAK,GACD,GAAIP,EAAsBnsB,EAAM,EAAG,CAAEmsB,IAAuB,SAC5D,OAAOL,EAAK,iBAAkBK,GAClC,KAAK,GACL,KAAK,GACL,KAAK,GAGD,IAFAlI,EAAU,EACVmI,EAAyBD,EACpBA,GAA4C,EAAGA,EAAsBnsB,EAAKmsB,IAE3E,MADAG,EAAMxuB,EAAMmrB,WAAWkD,IACb,IAAV,CACA,GAAIG,GAAOD,EAAI,CAAEpI,EAAU,EAAG,MAC9B,GAAW,IAAPqI,EAAW,CACX,GAAIH,GAAuBnsB,EAAM,EAC7B,OAAO8rB,EAAK,iBAAkBK,GAElCA,KAGR,GAAIlI,EAAW,SACf,OAAO6H,EAAK,cAAe3d,OAAOye,aAAaP,OAASD,GAC5D,KAAK,GACD,GAAII,GAAeL,GAAuBnsB,EAAM,EAAM,SAEtD,GAAW,KADXssB,EAAMxuB,EAAMmrB,WAAWkD,EAAsB,IAGzC,IAAKA,GAA4C,EAAGA,EAAsBnsB,OACtEssB,EAAMxuB,EAAMmrB,WAAWkD,KACX,KAAgB,IAAPG,GAAsB,IAAPA,GAFuCH,UAI5E,GAAW,IAAPG,EAAW,CAGlB,IADAL,EAAmBG,EAAyBD,EACvCA,GAA4C,EAAGA,EAAsBnsB,EAAM,IAEjE,MADXssB,EAAMxuB,EAAMmrB,WAAWkD,MACLD,EAA2BC,GAClC,IAAPG,GAC6C,IAA7CxuB,EAAMmrB,WAAWkD,EAAsB,IAJoCA,KAMnF,GAAIA,GAAuBnsB,EAAM,EAC7B,OAAO8rB,EAAK,uBAAwBM,GAExCD,IAEJ,SACJ,KAAK,GACD,GAAKA,EAAsBnsB,EAAM,GAAoD,IAA7ClC,EAAMmrB,WAAWkD,EAAsB,GAC3E,OAAOL,EAAK,iBAAkBK,GAElC,SAIZ,OAAc,IAAVI,EAEWT,EADNG,EAAmBF,GAAiBG,EAA2BD,EACpD,8BAEA,sBAF+BF,GAIzB,IAAfS,EACAV,EAAK,sBAAuBE,IAGvCU,GAAU,GACHtE,GDiPUyE,CAAQhuB,EAAKgtB,GAEb,CAAChtB,GAGdwpB,EAAUD,EAAO,GAEjBK,EAAe,IAGnBD,EAAYsE,IAAM,WACd,IAAIlvB,EACE0gB,EAAakK,EAAYjgC,GAAKuV,EAAMnX,OAM1C,OAJI6hC,EAAYjgC,EAAI2/B,IAChBtqB,EAAUuqB,EACVK,EAAYjgC,EAAI2/B,GAEb,CACH5J,aACA4J,SAAUM,EAAYjgC,EACtB4/B,6BAA8BvqB,EAC9BmvB,mBAAoBvE,EAAYjgC,GAAKuV,EAAMnX,OAAS,EACpDqmC,aAAclvB,EAAM0qB,EAAYjgC,KAIjCigC,GE5VLyE,GAAS,SAASA,EAAOz3B,EAASqK,EAAShL,GAC7C,IAAIq4B,EACE1E,EAAc2E,KAEpB,SAASxlC,EAAMC,EAAKa,GAChB,MAAM,IAAIgV,EACN,CACI5H,MAAO2yB,EAAYjgC,EACnBa,SAAUyL,EAASzL,SACnBX,KAAMA,GAAQ,SACdmV,QAAShW,GAEbiY,GAIR,SAASutB,EAAO/W,EAAKzuB,GAEjB,IAAM0V,EAAU+Y,aAAe9X,SAAY8X,EAAI1e,KAAKu1B,GAAW1E,EAAYwB,IAAI3T,GAC/E,GAAI/Y,EACA,OAAOA,EAGX3V,EAAMC,IAAuB,iBAARyuB,EACf,aAAaA,YAAamS,EAAY+C,kBACtC,qBAIV,SAAS8B,EAAWhX,EAAKzuB,GACrB,GAAI4gC,EAAY2B,MAAM9T,GAClB,OAAOA,EAEX1uB,EAAMC,GAAO,aAAayuB,YAAamS,EAAY+C,mBAGvD,SAAS9oB,EAAa5M,GAClB,IAAMzM,EAAWyL,EAASzL,SAE1B,MAAO,CACH+Y,WAAYlE,EAAkBpI,EAAO2yB,EAAYiD,YAAY3vB,KAAO,EACpEsG,SAAUhZ,GAyDlB,MAAO,CACHo/B,cACA3oB,UACAhL,WACA8K,UAjDJ,SAAmBd,EAAKyuB,EAAWC,EAAc14B,EAAUyY,GACvD,IAAIhQ,EACEkwB,EAAc,GACdC,EAASjF,EAEf,IACIiF,EAAO9B,MAAM9sB,GAAK,GAAO,SAAcjX,EAAKiO,GACxCyX,EAAS,CACL1P,QAAShW,EACTiO,MAAOA,EAAQ03B,OAGvB,IAAK,IAAIvzB,EAAI,EAAGhD,SAAGzO,SAAIyO,EAAIs2B,EAAUtzB,GAAKA,IAGtC,GAFAzR,EAAIklC,EAAOllC,EACX+U,EAAS4vB,EAAQl2B,KACL,CACR,IACIsG,EAAOhI,OAAS/M,EAAIglC,EACpBjwB,EAAO/H,UAAYV,EACrB,MAAOvN,IACTkmC,EAAYnlC,KAAKiV,QAGjBkwB,EAAYnlC,KAAK,MAITolC,EAAOX,MACXxO,WACRhR,EAAS,KAAMkgB,GAGflgB,GAAS,EAAM,MAErB,MAAOhmB,GACL,MAAM,IAAImW,EAAU,CAChB5H,MAAOvO,EAAEuO,MAAQ03B,EACjB3vB,QAAStW,EAAEsW,SACZiC,EAAShL,EAASzL,YAkBzB5D,MAAO,SAAUqZ,EAAKyO,EAAUogB,GAC5B,IAAIlnB,EAEAmnB,EACAC,EACAC,EAHAlmC,EAAQ,KAIRmmC,EAAU,GAKd,GAHAH,EAAcD,GAAkBA,EAAeC,WAAiBV,EAAOc,cAAcL,EAAeC,iBAAkB,GACtHC,EAAcF,GAAkBA,EAAeE,WAAc,KAAKX,EAAOc,cAAcL,EAAeE,YAAgB,GAElHp4B,EAAQ/L,cAER,IADA,IAAMukC,EAAgBx4B,EAAQ/L,cAAcwkC,mBACnC1lC,EAAI,EAAGA,EAAIylC,EAAcrnC,OAAQ4B,IACtCsW,EAAMmvB,EAAczlC,GAAG2lC,QAAQrvB,EAAK,CAAErJ,UAASqK,UAAShL,cAI5D84B,GAAeD,GAAkBA,EAAeS,UAChDL,GAAYJ,GAAkBA,EAAeS,OAAUT,EAAeS,OAAS,IAAMR,GACrFE,EAAUhuB,EAAQuuB,sBACVv5B,EAASzL,UAAYykC,EAAQh5B,EAASzL,WAAa,EAC3DykC,EAAQh5B,EAASzL,WAAa0kC,EAAQnnC,QAK1CkY,EAAMivB,GAFNjvB,EAAMA,EAAI7Z,QAAQ,SAAU,OAERA,QAAQ,UAAW,IAAM4oC,EAC7C/tB,EAAQ9B,SAASlJ,EAASzL,UAAYyV,EAMtC,IACI2pB,EAAYmD,MAAM9sB,EAAKrJ,EAAQo2B,YAAY,SAAchkC,EAAKiO,GAC1D,MAAM,IAAI4H,EAAU,CAChB5H,QACApN,KAAM,QACNmV,QAAShW,EACTwB,SAAUyL,EAASzL,UACpByW,MAGP0a,GAAKxlB,KAAKqC,UAAU5R,MAAQqC,KAC5B2e,EAAO,IAAI+T,GAAK5U,QAAQ,KAAM9d,KAAKqlC,QAAQmB,WAC3C9T,GAAKxlB,KAAKqC,UAAU7C,SAAWiS,EAC/BA,EAAKA,MAAO,EACZA,EAAKC,WAAY,EACjBD,EAAKG,iBAAmBA,EAAiB3B,UAE3C,MAAO1d,GACL,OAAOgmB,EAAS,IAAI7P,EAAUnW,EAAGuY,EAAShL,EAASzL,WAWvD,IAAMklC,EAAU9F,EAAYsE,MAC5B,IAAKwB,EAAQhQ,WAAY,CAErB,IAAI1gB,EAAU0wB,EAAQnG,6BAEjBvqB,IACDA,EAAU,qBACmB,MAAzB0wB,EAAQtB,aACRpvB,GAAW,iCACqB,MAAzB0wB,EAAQtB,aACfpvB,GAAW,iCACJ0wB,EAAQvB,qBACfnvB,GAAW,iCAInBjW,EAAQ,IAAI8V,EAAU,CAClBhV,KAAM,QACNmV,UACA/H,MAAOy4B,EAAQpG,SACf9+B,SAAUyL,EAASzL,UACpByW,GAGP,IAAMge,EAAS,SAAAv2B,GAGX,OAFAA,EAAIK,GAASL,GAAKuY,EAAQlY,QAGhBL,aAAamW,IACfnW,EAAI,IAAImW,EAAUnW,EAAGuY,EAAShL,EAASzL,WAGpCkkB,EAAShmB,IAGTgmB,EAAS,KAAM9G,IAI9B,IAA+B,IAA3BhR,EAAQ+4B,eAIR,OAAO1Q,IAHP,IAAI9M,GAAS4M,cAAc9d,EAASge,GAC/BQ,IAAI7X,IAmCjB0mB,QAASA,EAAU,CAgBfmB,QAAS,WAKL,IAJA,IAEIn5B,EAFE+hB,EAAQpvB,KAAKovB,MACfzQ,EAAO,KAGE,CACT,KACItR,EAAOrN,KAAKo/B,WAEZzgB,EAAKne,KAAK6M,GAGd,GAAIszB,EAAYpE,SACZ,MAEJ,GAAIoE,EAAY6C,KAAK,KACjB,MAIJ,GADAn2B,EAAOrN,KAAK2mC,aAERhoB,EAAOA,EAAKzd,OAAOmM,QAMvB,GAFAA,EAAO+hB,EAAMwX,cAAgB5mC,KAAK6mC,eAAiBzX,EAAMtf,MAAK,GAAO,IACjE9P,KAAKye,WAAaze,KAAK8mC,gBAAkB9mC,KAAK+mC,SAASj3B,QAAU9P,KAAKgnC,SAEtEroB,EAAKne,KAAK6M,OACP,CAEH,IADA,IAAI45B,GAAiB,EACdtG,EAAY2B,MAAM,MACrB2E,GAAiB,EAErB,IAAKA,EACD,OAKZ,OAAOtoB,GAKXygB,QAAS,WACL,GAAIuB,EAAYa,aAAa1iC,OAAQ,CACjC,IAAMsgC,EAAUuB,EAAYa,aAAanpB,QACzC,OAAO,IAAIqa,GAAY,QAAE0M,EAAQmC,KAAMnC,EAAQ1kB,cAAe0kB,EAAQpxB,MAAOhB,KAOrF+5B,SAAU,CACNG,YAAa,WACT,OAAO7B,EAAQjW,MAAMtf,MAAK,GAAM,IAOpCq3B,OAAQ,SAAUC,GACd,IAAIpwB,EACEhJ,EAAQ2yB,EAAYjgC,EACtB2mC,GAAY,EAGhB,GADA1G,EAAYe,OACRf,EAAY2B,MAAM,KAClB+E,GAAY,OACT,GAAID,EAEP,YADAzG,EAAYgB,UAKhB,GADA3qB,EAAM2pB,EAAY8B,UAOlB,OAFA9B,EAAYmB,SAEL,IAAIpP,GAAW,OAAE1b,EAAItD,OAAO,GAAIsD,EAAIE,OAAO,EAAGF,EAAIlY,OAAS,GAAIuoC,EAAWr5B,EAAOhB,GALpF2zB,EAAYgB,WAapBvvB,QAAS,WACL,IAAMqR,EAAIkd,EAAY2B,MAAM,MAAQ3B,EAAYwB,IAAI,2DACpD,GAAI1e,EACA,OAAOiP,GAAKhiB,MAAM42B,YAAY7jB,IAAM,IAAIiP,GAAY,QAAEjP,IAW9D3T,KAAM,WACF,IAAIoJ,EACA/H,EACAsF,EACEzI,EAAQ2yB,EAAYjgC,EAG1B,IAAIigC,EAAY6C,KAAK,WAOrB,GAHA7C,EAAYe,OAEZxoB,EAAOynB,EAAYwB,IAAI,kCACvB,CAOA,GAFAjpB,EAAOA,EAAK,IACZzC,EAAOzW,KAAKunC,eAAeruB,MAEvB/H,EAAOsF,EAAK9Y,UACA8Y,EAAK+wB,KAEb,OADA7G,EAAYmB,SACL3wB,EAMf,GAFAA,EAAOnR,KAAK6P,UAAUsB,GAEjBwvB,EAAY2B,MAAM,KAOvB,OAFA3B,EAAYmB,SAEL,IAAIpP,GAAS,KAAExZ,EAAM/H,EAAMnD,EAAOhB,GANrC2zB,EAAYgB,QAAQ,sDAjBpBhB,EAAYmB,UAmCpByF,eAAgB,SAAUruB,GAItB,MAAO,CACH1I,MAAS+e,EAAE8V,EAAQoC,SAAS,GAC5BC,QAASnY,EAAElY,GACXswB,GAASpY,EAAElY,IACb6B,EAAK5G,eAEP,SAASid,EAAE5xB,EAAO6pC,GACd,MAAO,CACH7pC,QACA6pC,QAKR,SAASnwB,IACL,MAAO,CAACkuB,EAAOF,EAAQhuB,UAAW,yBAI1CxH,UAAW,SAAU+3B,GACjB,IAEIC,EACAz5B,EAHA05B,EAAYF,GAAY,GACtBG,EAAgB,GAMtB,IAFApH,EAAYe,SAEC,CACT,GAAIkG,EACAA,GAAW,MACR,CAEH,KADAx5B,EAAQi3B,EAAQ7X,mBAAqBxtB,KAAKgoC,cAAgB3C,EAAQvZ,cAE9D,MAGA1d,EAAMA,OAA+B,GAAtBA,EAAMA,MAAMtP,SAC3BsP,EAAQA,EAAMA,MAAM,IAGxB05B,EAAUtnC,KAAK4N,GAGfuyB,EAAY2B,MAAM,OAIlB3B,EAAY2B,MAAM,MAAQuF,KAC1BA,GAAuB,EACvBz5B,EAAS05B,EAAUhpC,OAAS,EAAKgpC,EAAU,GACrC,IAAIpV,GAAKla,MAAMsvB,GACrBC,EAAcvnC,KAAK4N,GACnB05B,EAAY,IAKpB,OADAnH,EAAYmB,SACL+F,EAAuBE,EAAgBD,GAElDG,QAAS,WACL,OAAOjoC,KAAKkoC,aACLloC,KAAKgR,SACLhR,KAAKmnC,UACLnnC,KAAKmoC,qBAShBH,WAAY,WACR,IAAI31B,EACAjE,EAGJ,GAFAuyB,EAAYe,OACZrvB,EAAMsuB,EAAYwB,IAAI,iBAKtB,GAAKxB,EAAY2B,MAAM,KAAvB,CAKA,GADAl0B,EAAQi3B,EAAQ+C,SAGZ,OADAzH,EAAYmB,SACL,IAAIpP,GAAe,WAAErgB,EAAKjE,GAEjCuyB,EAAYgB,eARZhB,EAAYgB,eAJZhB,EAAYgB,WAuBpB3Q,IAAK,WACD,IAAI5iB,EACEJ,EAAQ2yB,EAAYjgC,EAI1B,GAFAigC,EAAYU,mBAAoB,EAE3BV,EAAY4B,KAAK,QAYtB,OAPAn0B,EAAQpO,KAAKmnC,UAAYnnC,KAAKsZ,YAActZ,KAAK+oB,YACzC4X,EAAYwB,IAAI,mCAAqC,GAE7DxB,EAAYU,mBAAoB,EAEhCmE,EAAW,KAEJ,IAAI9S,GAAQ,IAAkB,MAAftkB,EAAMA,OACxBA,aAAiBskB,GAAKhK,UACtBta,aAAiBskB,GAAK5J,SACtB1a,EAAQ,IAAIskB,GAAc,UAAEtkB,EAAOJ,GAAQA,EAAOhB,GAdlD2zB,EAAYU,mBAAoB,GAyBxC/nB,SAAU,WACN,IAAI+uB,EACAnvB,EACElL,EAAQ2yB,EAAYjgC,EAG1B,GADAigC,EAAYe,OACsB,MAA9Bf,EAAY+C,gBAA0BxqB,EAAOynB,EAAYwB,IAAI,eAAgB,CAE7E,GAAW,OADXkG,EAAK1H,EAAY+C,gBACQ,MAAP2E,IAAe1H,EAAYgD,WAAWvzB,MAAM,OAAQ,CAElE,IAAMqF,EAAS4vB,EAAQyB,aAAa5tB,GACpC,GAAIzD,EAEA,OADAkrB,EAAYmB,SACLrsB,EAIf,OADAkrB,EAAYmB,SACL,IAAIpP,GAAa,SAAExZ,EAAMlL,EAAOhB,GAE3C2zB,EAAYgB,WAIhB2G,cAAe,WACX,IAAIC,EACEv6B,EAAQ2yB,EAAYjgC,EAE1B,GAAkC,MAA9BigC,EAAY+C,gBAA0B6E,EAAQ5H,EAAYwB,IAAI,mBAC9D,OAAO,IAAIzP,GAAa,SAAE,IAAI6V,EAAM,GAAMv6B,EAAOhB,IAQzD+b,SAAU,WACN,IAAI7P,EACElL,EAAQ2yB,EAAYjgC,EAE1B,GAAkC,MAA9BigC,EAAY+C,gBAA0BxqB,EAAOynB,EAAYwB,IAAI,cAC7D,OAAO,IAAIzP,GAAa,SAAExZ,EAAMlL,EAAOhB,IAK/Cw7B,cAAe,WACX,IAAID,EACEv6B,EAAQ2yB,EAAYjgC,EAE1B,GAAkC,MAA9BigC,EAAY+C,gBAA0B6E,EAAQ5H,EAAYwB,IAAI,oBAC9D,OAAO,IAAIzP,GAAa,SAAE,IAAI6V,EAAM,GAAMv6B,EAAOhB,IAUzDgE,MAAO,WACH,IAAIhB,EAGJ,GAFA2wB,EAAYe,OAEsB,MAA9Bf,EAAY+C,gBAA0B1zB,EAAM2wB,EAAYwB,IAAI,oEACvDnyB,EAAI,GAEL,OADA2wB,EAAYmB,SACL,IAAIpP,GAAU,MAAE1iB,EAAI,QAAIxD,EAAWwD,EAAI,IAGtD2wB,EAAYgB,WAGhB8G,aAAc,WACV9H,EAAYe,OACZ,IAAML,EAAoBV,EAAYU,kBACtCV,EAAYU,mBAAoB,EAChC,IAAM5d,EAAIkd,EAAYwB,IAAI,6BAE1B,GADAxB,EAAYU,kBAAoBA,EAC3B5d,EAAL,CAIAkd,EAAYgB,UACZ,IAAM3wB,EAAQ0hB,GAAKhiB,MAAM42B,YAAY7jB,GACrC,OAAIzS,GACA2vB,EAAY4B,KAAK9e,GACVzS,QAFX,EALI2vB,EAAYmB,UAgBpBoG,UAAW,WACP,IAAIvH,EAAYkD,iBAAhB,CAIA,IAAMz1B,EAAQuyB,EAAYwB,IAAI,kCAC9B,OAAI/zB,EACO,IAAIskB,GAAc,UAAEtkB,EAAM,GAAIA,EAAM,SAD/C,IAUJ+5B,kBAAmB,WACf,IAAIO,EAGJ,GADAA,EAAK/H,EAAYwB,IAAI,uCAEjB,OAAO,IAAIzP,GAAsB,kBAAEgW,EAAG,KAS9CC,WAAY,WACR,IAAIC,EACE56B,EAAQ2yB,EAAYjgC,EAE1BigC,EAAYe,OAEZ,IAAMmH,EAASlI,EAAY2B,MAAM,KAGjC,GAFgB3B,EAAY2B,MAAM,KAElC,CAMA,GADAsG,EAAKjI,EAAYwB,IAAI,WAGjB,OADAxB,EAAYmB,SACL,IAAIpP,GAAe,WAAEkW,EAAG1xB,OAAO,EAAG0xB,EAAG9pC,OAAS,GAAIka,QAAQ6vB,GAAS76B,EAAOhB,GAErF2zB,EAAYgB,QAAQ,sCAThBhB,EAAYgB,YAkBxBroB,SAAU,WACN,IAAIJ,EAEJ,GAAkC,MAA9BynB,EAAY+C,gBAA0BxqB,EAAOynB,EAAYwB,IAAI,mBAAsB,OAAOjpB,EAAK,IAWvG4tB,aAAc,SAAUgC,GACpB,IAAInb,EACEjtB,EAAIigC,EAAYjgC,EAChBqoC,IAAYD,EACd5vB,EAAO4vB,EAIX,GAFAnI,EAAYe,OAERxoB,GAAuC,MAA9BynB,EAAY+C,gBACjBxqB,EAAOynB,EAAYwB,IAAI,yBAA2B,CAItD,KAFAxU,EAAU3tB,KAAKovB,MAAM4Z,iBAEHD,GAAsC,OAA3BpI,EAAY4B,KAAK,OAAgC,OAAZrpB,EAAK,IAEnE,YADAynB,EAAYgB,QAAQ,2CAInBoH,IACD7vB,EAAOA,EAAK,IAGhB,IAAMpJ,EAAO,IAAI4iB,GAAKnF,aAAarU,EAAMxY,EAAGsM,GAC5C,OAAK+7B,GAAW1D,EAAQJ,OACpBtE,EAAYmB,SACLhyB,IAGP6wB,EAAYmB,SACL,IAAIpP,GAAK9E,eAAe9d,EAAM6d,EAASjtB,EAAGsM,IAIzD2zB,EAAYgB,WAMhBrpB,OAAQ,SAAS2wB,GACb,IAAI9xB,EACA1X,EAEAotB,EACAzV,EACAkB,EAHEtK,EAAQ2yB,EAAYjgC,EAK1B,GAAKigC,EAAY4B,KAAK0G,EAAS,YAAc,YAA7C,CAIA,EAAG,CAGC,IAFApc,EAAS,KACT1V,EAAW,OACF0V,EAAS8T,EAAYwB,IAAI,0BAC9B1iC,EAAIO,KAAKsiB,YAILnL,EACAA,EAAS3W,KAAKf,GAEd0X,EAAW,CAAE1X,GAIrBotB,EAASA,GAAUA,EAAO,GACrB1V,GACDrX,EAAM,0CAEVwY,EAAS,IAAIoa,GAAW,OAAE,IAAIA,GAAa,SAAEvb,GAAW0V,EAAQ7e,EAAOhB,GACnEoK,EACAA,EAAW5W,KAAK8X,GAEhBlB,EAAa,CAAEkB,SAEdqoB,EAAY2B,MAAM,MAQ3B,OANAiD,EAAO,OAEH0D,GACA1D,EAAO,MAGJnuB,IAMXuvB,WAAY,WACR,OAAO3mC,KAAKsY,QAAO,IAMvB8W,MAAO,CAiBHtf,KAAM,SAAUi5B,EAASG,GACrB,IAEIvb,EAEAxW,EACAhG,EACAg4B,EANEx9B,EAAIg1B,EAAY+C,cAClBvqB,GAAY,EAEVnL,EAAQ2yB,EAAYjgC,EAK1B,GAAU,MAANiL,GAAmB,MAANA,EAAjB,CAMA,GAJAg1B,EAAYe,OAEZvqB,EAAWnX,KAAKmX,WAEF,CAUV,GATIwpB,EAAY2B,MAAM,OAClBnxB,EAAOnR,KAAKmR,MAAK,GAAMA,KACvBq0B,EAAW,KACX2D,GAAY,IAGE,IAAdD,IACAvb,EAAU3tB,KAAKgpC,gBAED,IAAdE,IAAuBvb,EAEvB,YADAgT,EAAYgB,UAIhB,IAAKhU,IAAYwb,EAGb,YADAxI,EAAYgB,QAAQ,2DAQxB,IAJKoH,GAAW1D,EAAQlsB,cACpBA,GAAY,GAGZ4vB,GAAW1D,EAAQJ,MAAO,CAC1BtE,EAAYmB,SACZ,IAAM1S,EAAQ,IAAIsD,GAAKtD,MAAU,KAAEjY,EAAUhG,EAAMnD,EAAOhB,GAAW2gB,GAAWxU,GAChF,OAAIwU,EACO,IAAI+E,GAAK9E,eAAewB,EAAOzB,GAG/ByB,GAKnBuR,EAAYgB,YAMhBxqB,SAAU,WAON,IANA,IAAIA,EACA1X,EACA6Q,EACA84B,EACAC,EACEC,EAAK,wDAEPD,EAAY1I,EAAYjgC,EACxBjB,EAAIkhC,EAAYwB,IAAImH,IAKpBF,EAAO,IAAI1W,GAAY,QAAEpiB,EAAG7Q,GAAG,EAAO4pC,EAAWr8B,GAC7CmK,EACAA,EAAS3W,KAAK4oC,GAEdjyB,EAAW,CAAEiyB,GAEjB94B,EAAIqwB,EAAY2B,MAAM,KAE1B,OAAOnrB,GAEXhG,KAAM,SAAUo4B,GACZ,IAKI1B,EACA2B,EACAtwB,EACAuwB,EACAr7B,EACAogB,EACA0B,EAXE6W,EAAW1B,EAAQ0B,SACnBpV,EAAW,CAAExgB,KAAK,KAAM6c,UAAU,GACpC0b,EAAc,GACZ3B,EAAgB,GAChBD,EAAY,GAQd6B,GAAS,EAIb,IAFAhJ,EAAYe,SAEC,CACT,GAAI6H,EACA/a,EAAM6W,EAAQ7X,mBAAqB6X,EAAQvZ,iBACxC,CAEH,GADA6U,EAAYa,aAAa1iC,OAAS,EAC9B6hC,EAAY4B,KAAK,OAAQ,CACzB5Q,EAAS3D,UAAW,EAChB2S,EAAY2B,MAAM,OAASuF,IAC3BA,GAAuB,IAE1BA,EAAuBE,EAAgBD,GACnCtnC,KAAK,CAAEwtB,UAAU,IACtB,MAEJQ,EAAMuY,EAASztB,YAAcytB,EAAShe,YAAcge,EAASkB,WAAalB,EAAS30B,WAAapS,KAAK8P,MAAK,GAG9G,IAAK0e,IAAQmb,EACT,MAGJF,EAAW,KACPjb,EAAIob,mBACJpb,EAAIob,oBAERx7B,EAAQogB,EACR,IAAItE,EAAM,KAWV,GATIqf,EAEI/a,EAAIpgB,OAA6B,GAApBogB,EAAIpgB,MAAMtP,SACvBorB,EAAMsE,EAAIpgB,MAAM,IAGpB8b,EAAMsE,EAGNtE,IAAQA,aAAewI,GAAKhK,UAAYwB,aAAewI,GAAK5J,UAC5D,GAAI6X,EAAY2B,MAAM,KAAM,CAUxB,GATIoH,EAAY5qC,OAAS,IACjB+oC,GACA/nC,EAAM,yCAEV0pC,GAA0B,KAG9Bp7B,EAAQi3B,EAAQ7X,mBAAqB6X,EAAQvZ,cAEjC,CACR,IAAIyd,EAKA,OAFA5I,EAAYgB,UACZhQ,EAASxgB,KAAO,GACTwgB,EAJP7xB,EAAM,iDAOd2pC,EAAYvwB,EAAOgR,EAAIhR,UACpB,GAAIynB,EAAY4B,KAAK,OAAQ,CAChC,IAAKgH,EAAQ,CACT5X,EAAS3D,UAAW,EAChB2S,EAAY2B,MAAM,OAASuF,IAC3BA,GAAuB,IAE1BA,EAAuBE,EAAgBD,GACnCtnC,KAAK,CAAE0Y,KAAMsV,EAAItV,KAAM8U,UAAU,IACtC,MAEAkC,GAAS,OAELqZ,IACRrwB,EAAOuwB,EAAWvf,EAAIhR,KACtB9K,EAAQ,MAIZA,GACAs7B,EAAYlpC,KAAK4N,GAGrB05B,EAAUtnC,KAAK,CAAE0Y,KAAKuwB,EAAUr7B,QAAO8hB,WAEnCyQ,EAAY2B,MAAM,KAClBqH,GAAS,IAGbA,EAAoC,MAA3BhJ,EAAY2B,MAAM,OAEbuF,KAEN2B,GACA1pC,EAAM,yCAGV+nC,GAAuB,EAEnB6B,EAAY5qC,OAAS,IACrBsP,EAAQ,IAAIskB,GAAU,MAAEgX,IAE5B3B,EAAcvnC,KAAK,CAAE0Y,OAAM9K,QAAO8hB,WAElChX,EAAO,KACPwwB,EAAc,GACdF,GAA0B,GAMlC,OAFA7I,EAAYmB,SACZnQ,EAASxgB,KAAO02B,EAAuBE,EAAgBD,EAChDnW,GAqBXiV,WAAY,WACR,IAAI1tB,EAEA9I,EACAqO,EACAorB,EAHA9b,EAAS,GAITC,GAAW,EACf,KAAmC,MAA9B2S,EAAY+C,eAAuD,MAA9B/C,EAAY+C,eAClD/C,EAAY6C,KAAK,aAOrB,GAHA7C,EAAYe,OAEZtxB,EAAQuwB,EAAYwB,IAAI,gEACb,CACPjpB,EAAO9I,EAAM,GAEb,IAAM05B,EAAU9pC,KAAKmR,MAAK,GAS1B,GARA4c,EAAS+b,EAAQ34B,KACjB6c,EAAW8b,EAAQ9b,UAOd2S,EAAY2B,MAAM,KAEnB,YADA3B,EAAYgB,QAAQ,uBAYxB,GARAhB,EAAYa,aAAa1iC,OAAS,EAE9B6hC,EAAY4B,KAAK,UACjBsH,EAAOtE,EAAOF,EAAQ0E,WAAY,uBAGtCtrB,EAAU4mB,EAAQ2E,QAId,OADArJ,EAAYmB,SACL,IAAIpP,GAAKtD,MAAgB,WAAElW,EAAM6U,EAAQtP,EAASorB,EAAM7b,GAE/D2S,EAAYgB,eAGhBhB,EAAYgB,WAIpBqH,YAAa,WACT,IAAI1qB,EAEEqP,EAAU,GAEhB,GAAkC,MAA9BgT,EAAY+C,cAAhB,CAIA,OAAa,CAIT,GAHA/C,EAAYe,SAEZpjB,EAAOte,KAAKiqC,gBACU,KAAT3rB,EAAa,CACtBqiB,EAAYgB,UACZ,MAEJhU,EAAQntB,KAAK8d,GACbqiB,EAAYmB,SAEhB,OAAInU,EAAQ7uB,OAAS,EACV6uB,OADX,IAKJsc,YAAa,WAGT,GAFAtJ,EAAYe,OAEPf,EAAY2B,MAAM,KAAvB,CAKA,IAAMppB,EAAOynB,EAAYwB,IAAI,gCAE7B,GAAKxB,EAAY2B,MAAM,KAKvB,OAAIppB,GAAiB,KAATA,GACRynB,EAAYmB,SACL5oB,QAGXynB,EAAYgB,UATRhB,EAAYgB,eAPZhB,EAAYgB,YAuBxByG,OAAQ,WACJ,IAAMrB,EAAW/mC,KAAK+mC,SAEtB,OAAO/mC,KAAKo/B,WAAa2H,EAASkB,WAAalB,EAASztB,YAAcytB,EAAS/V,OAC3E+V,EAAShe,YAAcge,EAASj3B,QAAUi3B,EAAS30B,WAAapS,KAAKovB,MAAMtf,MAAK,IAChFi3B,EAAS4B,cAQjB1D,IAAK,WACD,OAAOtE,EAAY2B,MAAM,MAAQ3B,EAAY6C,KAAK,MAQtDiE,QAAS,WACL,IAAIr5B,EAGJ,GAAKuyB,EAAYwB,IAAI,cAOrB,OANA/zB,EAAQuyB,EAAYwB,IAAI,WAGpB/zB,EAAQ,MADRA,EAAQm3B,EAAOF,EAAQ0B,SAASztB,SAAU,0BACvBJ,KAAK3G,MAAM,QAElCizB,EAAW,KACJ,IAAI9S,GAAK9I,OAAO,GAAI,iBAAiBxb,QAehDkU,QAAS,WACL,IAAI7iB,EACA6Q,EACA4B,EACElE,EAAQ2yB,EAAYjgC,EAwB1B,GAtBA4P,EAAItQ,KAAKkT,cAETzT,EAAIkhC,EAAYwB,IAAI,uBAChBxB,EAAYwB,IAAI,+EAChBxB,EAAY2B,MAAM,MAAQ3B,EAAY2B,MAAM,MAAQtiC,KAAKkqC,aACzDvJ,EAAYwB,IAAI,kBAAqBxB,EAAYwB,IAAI,iBACrDniC,KAAK+mC,SAASuB,mBAGd3H,EAAYe,OACRf,EAAY2B,MAAM,MACbpwB,EAAIlS,KAAKge,UAAS,KAAW2iB,EAAY2B,MAAM,MAChD7iC,EAAI,IAAIizB,GAAU,MAAExgB,GACpByuB,EAAYmB,UAEZnB,EAAYgB,QAAQ,uBAGxBhB,EAAYmB,UAIhBriC,EAAK,OAAO,IAAIizB,GAAY,QAAEpiB,EAAG7Q,EAAGA,aAAaizB,GAAKhK,SAAU1a,EAAOhB,IAY/EkG,WAAY,WACR,IAAI5C,EAAIqwB,EAAY+C,cAEpB,GAAU,MAANpzB,EAAW,CACXqwB,EAAYe,OACZ,IAAMyI,EAAoBxJ,EAAYwB,IAAI,gBAC1C,GAAIgI,EAEA,OADAxJ,EAAYmB,SACL,IAAIpP,GAAe,WAAEyX,GAEhCxJ,EAAYgB,UAGhB,GAAU,MAANrxB,GAAmB,MAANA,GAAmB,MAANA,GAAmB,MAANA,GAAmB,MAANA,EAAW,CAM/D,IALAqwB,EAAYjgC,IACF,MAAN4P,GAA2C,MAA9BqwB,EAAY+C,gBACzBpzB,EAAI,KACJqwB,EAAYjgC,KAETigC,EAAYoB,gBAAkBpB,EAAYjgC,IACjD,OAAO,IAAIgyB,GAAe,WAAEpiB,GACzB,OAAIqwB,EAAYoB,cAAc,GAC1B,IAAIrP,GAAe,WAAE,KAErB,IAAIA,GAAe,WAAE,OAYpC1U,SAAU,SAAUosB,GAChB,IACIjzB,EACAC,EACA9G,EACA7Q,EACA45B,EACAgR,EACAhzB,EAPErJ,EAAQ2yB,EAAYjgC,EAS1B,IADA0pC,GAAoB,IAAXA,GACDA,IAAWhzB,EAAapX,KAAKsY,WAAe8xB,IAAWC,EAAO1J,EAAY4B,KAAK,WAAc9iC,EAAIO,KAAKsiB,cACtG+nB,EACAhzB,EAAYkuB,EAAOvlC,KAAK+pC,WAAY,sBAC7B1yB,EACPvX,EAAM,qDACCsX,EAEHiiB,EADAA,EACaA,EAAWn4B,OAAOkW,GAElBA,GAGbiiB,GAAcv5B,EAAM,kDACxBwQ,EAAIqwB,EAAY+C,cACZvsB,EACAA,EAAS3W,KAAKf,GAEd0X,EAAW,CAAE1X,GAEjBA,EAAI,MAEE,MAAN6Q,GAAmB,MAANA,GAAmB,MAANA,GAAmB,MAANA,GAAmB,MAANA,KAK5D,GAAI6G,EAAY,OAAO,IAAIub,GAAa,SAAEvb,EAAUkiB,EAAYhiB,EAAWrJ,EAAOhB,GAC9EqsB,GAAcv5B,EAAM,2EAE5B0d,UAAW,WAGP,IAFA,IAAI7R,EACA6R,GAEA7R,EAAI3L,KAAKge,cAILR,EACAA,EAAUhd,KAAKmL,GAEf6R,EAAY,CAAE7R,GAElBg1B,EAAYa,aAAa1iC,OAAS,EAC9B6M,EAAE0L,WAAamG,EAAU1e,OAAS,GAClCgB,EAAM,2DAEL6gC,EAAY2B,MAAM,OACnB32B,EAAE0L,WACFvX,EAAM,2DAEV6gC,EAAYa,aAAa1iC,OAAS,EAEtC,OAAO0e,GAEX0sB,UAAW,WACP,GAAKvJ,EAAY2B,MAAM,KAAvB,CAEA,IACIjwB,EACA6X,EACA3b,EAHEw4B,EAAW/mC,KAAK+mC,SAgBtB,OAXM10B,EAAM00B,EAASuB,mBACjBj2B,EAAMkzB,EAAO,oDAGjBh3B,EAAKoyB,EAAYwB,IAAI,iBAEjBjY,EAAM6c,EAASI,UAAYxG,EAAYwB,IAAI,aAAexB,EAAYwB,IAAI,YAAc4E,EAASuB,iBAGrG9C,EAAW,KAEJ,IAAI9S,GAAc,UAAErgB,EAAK9D,EAAI2b,KAOxC8f,MAAO,WACH,IAAIzgB,EACJ,GAAIoX,EAAY2B,MAAM,OAAS/Y,EAAUvpB,KAAKwmC,YAAc7F,EAAY2B,MAAM,KAC1E,OAAO/Y,GAIf+gB,aAAc,WACV,IAAIN,EAAQhqC,KAAKgqC,QAKjB,OAHIA,IACAA,EAAQ,IAAItX,GAAK5U,QAAQ,KAAMksB,IAE5BA,GAGXxc,gBAAiB,WACb,IAAIsc,EACA/b,EACAC,EAGJ,GADA2S,EAAYe,QACRf,EAAYwB,IAAI,aAQhBpU,GADA+b,EAAU9pC,KAAKovB,MAAMje,MAAK,IACTA,KACjB6c,EAAW8b,EAAQ9b,SACd2S,EAAY2B,MAAM,MAV3B,CAeA,IAAMgI,EAAetqC,KAAKsqC,eAC1B,GAAIA,EAEA,OADA3J,EAAYmB,SACR/T,EACO,IAAI2E,GAAKtD,MAAMhB,WAAW,KAAML,EAAQuc,EAAc,KAAMtc,GAEhE,IAAI0E,GAAK7N,gBAAgBylB,GAEpC3J,EAAYgB,eAZJhB,EAAYgB,WAkBxBljB,QAAS,WACL,IAAIjB,EACAC,EACAtD,EAUJ,GARAwmB,EAAYe,OAER/zB,EAAQuM,kBACRC,EAAYS,EAAa+lB,EAAYjgC,KAGzC8c,EAAYxd,KAAKwd,eAECC,EAAQzd,KAAKgqC,SAAU,CACrCrJ,EAAYmB,SACZ,IAAMrjB,EAAU,IAAIiU,GAAY,QAAElV,EAAWC,EAAO9P,EAAQ+P,eAI5D,OAHI/P,EAAQuM,kBACRuE,EAAQtE,UAAYA,GAEjBsE,EAEPkiB,EAAYgB,WAGpBkF,YAAa,WACT,IAAI3tB,EACA9K,EAEAm8B,EAEApxB,EACAC,EACAjG,EALEnF,EAAQ2yB,EAAYjgC,EAEpB4P,EAAIqwB,EAAY+C,cAKtB,GAAU,MAANpzB,GAAmB,MAANA,GAAmB,MAANA,GAAmB,MAANA,EAK3C,GAHAqwB,EAAYe,OAEZxoB,EAAOlZ,KAAKsZ,YAActZ,KAAKwqC,eACrB,CAWN,IAVAr3B,EAA6B,iBAAT+F,KAGhB9K,EAAQpO,KAAKwtB,qBAET+c,GAAQ,GAIhB5J,EAAYa,aAAa1iC,OAAS,GAC7BsP,EAAO,CAeR,GAXAgL,GAASjG,GAAc+F,EAAKpa,OAAS,GAAKoa,EAAKa,MAAM3L,MAIjDA,EADA8K,EAAK,GAAG9K,OAAuC,OAA9B8K,EAAK,GAAG9K,MAAMmE,MAAM,EAAG,GAChCvS,KAAKyqC,kBAKLzqC,KAAK0qC,iBAKb,OAFA/J,EAAYmB,SAEL,IAAIpP,GAAgB,YAAExZ,EAAM9K,GAAO,EAAOgL,EAAOpL,EAAOhB,GAG9DoB,IACDA,EAAQpO,KAAKoO,SAGbA,EACA+K,EAAYnZ,KAAKmZ,YACVhG,IAEP/E,EAAQpO,KAAKyqC,mBAIrB,GAAIr8B,IAAUpO,KAAKilC,OAASsF,GAExB,OADA5J,EAAYmB,SACL,IAAIpP,GAAgB,YAAExZ,EAAM9K,EAAO+K,EAAWC,EAAOpL,EAAOhB,GAGnE2zB,EAAYgB,eAGhBhB,EAAYgB,WAGpB+I,eAAgB,WACZ,IAAM18B,EAAQ2yB,EAAYjgC,EACpB0P,EAAQuwB,EAAYwB,IAAI,6BAC9B,GAAI/xB,EACA,OAAO,IAAIsiB,GAAc,UAAEtiB,EAAM,GAAIpC,IAY7Cy8B,gBAAiB,SAAUE,GACvB,IAAIjqC,EACAjB,EACAmrC,EACAx8B,EACEg0B,EAAMuI,GAAe,IACrB38B,EAAQ2yB,EAAYjgC,EACpB+U,EAAS,GAEf,SAASo1B,IACL,IAAMvH,EAAO3C,EAAY+C,cACzB,MAAmB,iBAARtB,EACAkB,IAASlB,EAETA,EAAI3nB,KAAK6oB,GAGxB,IAAIuH,IAAJ,CAGAz8B,EAAQ,GACR,KACI3O,EAAIO,KAAKo/B,aAKT3/B,EAAIO,KAAKooC,YAHLh6B,EAAM5N,KAAKf,SAOVA,GAIT,GAFAmrC,EAAOC,IAEHz8B,EAAMtP,OAAS,EAAG,CAElB,GADAsP,EAAQ,IAAIskB,GAAe,WAAEtkB,GACzBw8B,EACA,OAAOx8B,EAGPqH,EAAOjV,KAAK4N,GAGe,MAA3BuyB,EAAYgD,YACZluB,EAAOjV,KAAK,IAAIkyB,GAAK3Z,UAAU,IAAK/K,IAO5C,GAJA2yB,EAAYe,OAEZtzB,EAAQuyB,EAAYiC,YAAYR,GAErB,CAIP,GAHqB,iBAAVh0B,GACPtO,EAAM,aAAasO,MAAU,SAEZ,IAAjBA,EAAMtP,QAA6B,MAAbsP,EAAM,GAE5B,OADAuyB,EAAYmB,SACL,IAAIpP,GAAK3Z,UAAU,GAAI/K,GAElC,IAAI+Z,SACJ,IAAKrnB,EAAI,EAAGA,EAAI0N,EAAMtP,OAAQ4B,IAE1B,GADAqnB,EAAO3Z,EAAM1N,GACT4M,MAAMC,QAAQwa,GAEdtS,EAAOjV,KAAK,IAAIkyB,GAAK9I,OAAO7B,EAAK,GAAIA,EAAK,IAAI,EAAM/Z,EAAOhB,QAE1D,CACGtM,IAAM0N,EAAMtP,OAAS,IACrBipB,EAAOA,EAAKhV,QAGhB,IAAM0W,EAAQ,IAAIiJ,GAAK9I,OAAO,IAAM7B,GAAM,EAAM/Z,EAAOhB,GACvDyc,EAAMC,cAAgB,aACtBD,EAAME,UAAY,cAClBlU,EAAOjV,KAAKipB,GAIpB,OADAkX,EAAYmB,SACL,IAAIpP,GAAKnL,WAAW9R,GAAQ,GAEvCkrB,EAAYgB,YAahBmJ,OAAU,WACN,IAAItvB,EACA8O,EACEtc,EAAQ2yB,EAAYjgC,EAEpBqqC,EAAMpK,EAAYwB,IAAI,gBAE5B,GAAI4I,EAAK,CACL,IAAM1tC,GAAW0tC,EAAM/qC,KAAKgrC,gBAAkB,OAAS,GAEvD,GAAKxvB,EAAOxb,KAAK+mC,SAASI,UAAYnnC,KAAK+mC,SAAS/V,MAQhD,OAPA1G,EAAWtqB,KAAKirC,gBAEXtK,EAAY2B,MAAM,OACnB3B,EAAYjgC,EAAIsN,EAChBlO,EAAM,gEAEVwqB,EAAWA,GAAY,IAAIoI,GAAU,MAAEpI,GAChC,IAAIoI,GAAW,OAAElX,EAAM8O,EAAUjtB,EAAS2Q,EAAOhB,GAGxD2zB,EAAYjgC,EAAIsN,EAChBlO,EAAM,gCAKlBkrC,cAAe,WACX,IAAIE,EAEAC,EACA/8B,EAFE/Q,EAAU,GAKhB,IAAKsjC,EAAY2B,MAAM,KAAQ,OAAO,KACtC,GAEI,GADA4I,EAAIlrC,KAAKorC,eACF,CAGH,OADAh9B,GAAQ,EADR+8B,EAAaD,GAGT,IAAK,MACDC,EAAa,OACb/8B,GAAQ,EACR,MACJ,IAAK,OACD+8B,EAAa,WACb/8B,GAAQ,EAIhB,GADA/Q,EAAQ8tC,GAAc/8B,GACjBuyB,EAAY2B,MAAM,KAAQ,aAE9B4I,GAET,OADA1F,EAAW,KACJnoC,GAGX+tC,aAAc,WACV,IAAM7tC,EAAMojC,EAAYwB,IAAI,uDAC5B,GAAI5kC,EACA,OAAOA,EAAI,IAInB8tC,aAAc,WACV,IAEI5rC,EACA0P,EAHE43B,EAAW/mC,KAAK+mC,SAChB55B,EAAQ,GAGdwzB,EAAYe,OACZ,IACIjiC,EAAIsnC,EAAS30B,WAAa20B,EAASztB,YAAcytB,EAASG,eAEtD/5B,EAAM3M,KAAKf,GACJkhC,EAAY2B,MAAM,OACzBnzB,EAAInP,KAAK+oB,WACTtpB,EAAIO,KAAKoO,QACLuyB,EAAY2B,MAAM,KACdnzB,GAAK1P,EACL0N,EAAM3M,KAAK,IAAIkyB,GAAU,MAAE,IAAIA,GAAgB,YAAEvjB,EAAG1P,EAAG,KAAM,KAAMkhC,EAAYjgC,EAAGsM,GAAU,KACrFvN,EACP0N,EAAM3M,KAAK,IAAIkyB,GAAU,MAAEjzB,IAE3BK,EAAM,yCAGVA,EAAM,sBAAyB,gBAGlCL,GAGT,GADAkhC,EAAYmB,SACR30B,EAAMrO,OAAS,EACf,OAAO,IAAI4zB,GAAe,WAAEvlB,IAIpC89B,cAAe,WACX,IAEIxrC,EAFEsnC,EAAW/mC,KAAK+mC,SAChBzc,EAAW,GAEjB,GAEI,GADA7qB,EAAIO,KAAKqrC,gBAGL,GADA/gB,EAAS9pB,KAAKf,IACTkhC,EAAY2B,MAAM,KAAQ,WAG/B,IADA7iC,EAAIsnC,EAASztB,YAAcytB,EAASG,iBAEhC5c,EAAS9pB,KAAKf,IACTkhC,EAAY2B,MAAM,MAAQ,YAGlC7iC,GAET,OAAO6qB,EAASxrB,OAAS,EAAIwrB,EAAW,MAG5C7rB,MAAO,WACH,IAAI6rB,EACA7M,EACAhf,EACA0b,EACEnM,EAAQ2yB,EAAYjgC,EAQ1B,GANIiN,EAAQuM,kBACRC,EAAYS,EAAa5M,IAG7B2yB,EAAYe,OAERf,EAAY4B,KAAK,UAgBjB,OAfAjY,EAAWtqB,KAAKirC,iBAEhBxtB,EAAQzd,KAAKgqC,UAGTlqC,EAAM,iEAGV6gC,EAAYmB,SAEZrjC,EAAQ,IAAIi0B,GAAU,MAAEjV,EAAO6M,EAAUtc,EAAOhB,GAC5CW,EAAQuM,kBACRzb,EAAM0b,UAAYA,GAGf1b,EAGXkiC,EAAYgB,WAShB5O,OAAQ,WACJ,IAAIvX,EACArK,EACA9T,EACE2Q,EAAQ2yB,EAAYjgC,EAG1B,GAFcigC,EAAYwB,IAAI,gBAErB,CAaL,GATI9kC,GAHJ8T,EAAOnR,KAAKsrC,cAGE,CACNA,WAAYn6B,EACZ+Z,UAAU,GAIJ,CAAEA,UAAU,GAGrB1P,EAAOxb,KAAK+mC,SAASI,UAAYnnC,KAAK+mC,SAAS/V,MAMhD,OAJK2P,EAAY2B,MAAM,OACnB3B,EAAYjgC,EAAIsN,EAChBlO,EAAM,kCAEH,IAAI4yB,GAAW,OAAElX,EAAM,KAAMne,EAAS2Q,EAAOhB,GAGpD2zB,EAAYjgC,EAAIsN,EAChBlO,EAAM,iCAKlBwrC,WAAY,WAGR,GADA3K,EAAYe,QACPf,EAAY2B,MAAM,KAEnB,OADA3B,EAAYgB,UACL,KAEX,IAAMxwB,EAAOwvB,EAAYwB,IAAI,sBAC7B,OAAIhxB,EAAK,IACLwvB,EAAYmB,SACL3wB,EAAK,GAAG4B,SAGf4tB,EAAYgB,UACL,OASfqF,OAAQ,WACJ,IACI9tB,EACA9K,EACAqP,EACA8tB,EACAC,EACAC,EACAC,EAPE19B,EAAQ2yB,EAAYjgC,EAQtBirC,GAAW,EACXtnB,GAAW,EAEf,GAAkC,MAA9Bsc,EAAY+C,cAAhB,CAGA,GADAt1B,EAAQpO,KAAa,UAAOA,KAAK+yB,UAAY/yB,KAAKvB,QAE9C,OAAO2P,EAOX,GAJAuyB,EAAYe,OAEZxoB,EAAOynB,EAAYwB,IAAI,aAEvB,CAOA,OALAoJ,EAAwBryB,EACF,KAAlBA,EAAKxF,OAAO,IAAawF,EAAK7H,QAAQ,IAAK,GAAK,IAChDk6B,EAAwB,IAAIryB,EAAK3G,MAAM2G,EAAK7H,QAAQ,IAAK,GAAK,IAG1Dk6B,GACJ,IAAK,WACDC,GAAgB,EAChBG,GAAW,EACX,MACJ,IAAK,aACDF,GAAgB,EAChBE,GAAW,EACX,MACJ,IAAK,aACL,IAAK,iBACDH,GAAgB,EAChB,MACJ,IAAK,YACL,IAAK,YACDE,GAAa,EACbrnB,GAAW,EACX,MACJ,QACIqnB,GAAa,EAiCrB,GA7BA/K,EAAYa,aAAa1iC,OAAS,EAE9B0sC,GACAp9B,EAAQpO,KAAKooC,WAETtoC,EAAM,YAAYoZ,iBAEfuyB,GACPr9B,EAAQpO,KAAK8rB,eAEThsB,EAAM,YAAYoZ,iBAEfwyB,IACPt9B,EAAQpO,KAAKyqC,gBAAgB,SAC7BkB,EAA0C,MAA9BhL,EAAY+C,cACnBt1B,EAKKA,EAAMA,QACZA,EAAQ,MALHu9B,GAA0C,MAA9BhL,EAAY+C,eACzB5jC,EAASoZ,kDAQjByyB,IACAluB,EAAQzd,KAAKsqC,gBAGb7sB,IAAWkuB,GAAYv9B,GAASuyB,EAAY2B,MAAM,KAElD,OADA3B,EAAYmB,SACL,IAAIpP,GAAW,OAAExZ,EAAM9K,EAAOqP,EAAOzP,EAAOhB,EAC/CW,EAAQuM,gBAAkBU,EAAa5M,GAAS,KAChDqW,GAIRsc,EAAYgB,QAAQ,qCAWxBvzB,MAAO,WACH,IAAI3O,EACEiqC,EAAc,GACd17B,EAAQ2yB,EAAYjgC,EAE1B,GAEI,IADAjB,EAAIO,KAAK8rB,gBAEL4d,EAAYlpC,KAAKf,IACZkhC,EAAY2B,MAAM,MAAQ,YAE9B7iC,GAET,GAAIiqC,EAAY5qC,OAAS,EACrB,OAAO,IAAI4zB,GAAU,MAAEgX,EAAa17B,IAG5CmL,UAAW,WACP,GAAkC,MAA9BwnB,EAAY+C,cACZ,OAAO/C,EAAYwB,IAAI,kBAG/ByJ,IAAK,WACD,IAAIp9B,EACA/O,EAGJ,GADAkhC,EAAYe,OACRf,EAAY2B,MAAM,KAElB,OADA9zB,EAAIxO,KAAK6rC,aACAlL,EAAY2B,MAAM,MACvB3B,EAAYmB,UACZriC,EAAI,IAAIizB,GAAe,WAAE,CAAClkB,KACxBiZ,QAAS,EACJhoB,QAEXkhC,EAAYgB,QAAQ,gBAGxBhB,EAAYgB,WAEhBmK,eAAgB,WACZ,IAAI3gC,EACAqD,EACAD,EACAw9B,EACA7kB,EAEJ,GADA/b,EAAInL,KAAKgsC,UACF,CAEH,IADA9kB,EAAWyZ,EAAYoB,cAAc,IAE7BpB,EAAY6C,KAAK,aADZ,CAST,GAJA7C,EAAYe,SAEZnzB,EAAKoyB,EAAY2B,MAAM,MAAQ3B,EAAY2B,MAAM,MAAQ3B,EAAY4B,KAAK,OAEjE,CAAE5B,EAAYmB,SAAU,MAIjC,KAFAtzB,EAAIxO,KAAKgsC,WAED,CAAErL,EAAYgB,UAAW,MACjChB,EAAYmB,SAEZ32B,EAAEwc,YAAa,EACfnZ,EAAEmZ,YAAa,EACfokB,EAAY,IAAIrZ,GAAc,UAAEnkB,EAAI,CAACw9B,GAAa5gC,EAAGqD,GAAI0Y,GACzDA,EAAWyZ,EAAYoB,cAAc,GAEzC,OAAOgK,GAAa5gC,IAG5B0gC,SAAU,WACN,IAAI1gC,EACAqD,EACAD,EACAw9B,EACA7kB,EAEJ,GADA/b,EAAInL,KAAK8rC,iBACF,CAEH,IADA5kB,EAAWyZ,EAAYoB,cAAc,IAEjCxzB,EAAKoyB,EAAYwB,IAAI,cAAiBjb,IAAayZ,EAAY2B,MAAM,MAAQ3B,EAAY2B,MAAM,SAI/F9zB,EAAIxO,KAAK8rC,mBAKT3gC,EAAEwc,YAAa,EACfnZ,EAAEmZ,YAAa,EACfokB,EAAY,IAAIrZ,GAAc,UAAEnkB,EAAI,CAACw9B,GAAa5gC,EAAGqD,GAAI0Y,GACzDA,EAAWyZ,EAAYoB,cAAc,GAEzC,OAAOgK,GAAa5gC,IAG5B4+B,WAAY,WACR,IAAIv7B,EACAC,EAEA4I,EADErJ,EAAQ2yB,EAAYjgC,EAI1B,GADA8N,EAAIxO,KAAKqX,WAAU,GACZ,CACH,KACSspB,EAAY6C,KAAK,qBAAwB7C,EAAY2B,MAAM,OAGhE7zB,EAAIzO,KAAKqX,WAAU,KAInBA,EAAY,IAAIqb,GAAc,UAAE,KAAMrb,GAAa7I,EAAGC,EAAGT,GAE7D,OAAOqJ,GAAa7I,IAG5B6I,UAAW,SAAU40B,GACjB,IAAIx2B,EACAy2B,EACAC,EAMJ,GADA12B,EAASzV,KAAKosC,aAAaH,GAC3B,CAIA,GADAC,EAPWvL,EAAY4B,KAAK,MAQf,CAET,KADA4J,EAAOnsC,KAAKqX,UAAU40B,IAIlB,OAFAx2B,EAAS,IAAIid,GAAc,UAAEwZ,EAASz2B,EAAQ02B,GAKtD,OAAO12B,IAEX22B,aAAc,SAAUH,GACpB,IAAIx2B,EACAy2B,EACAC,EAGMtC,EAFJj9B,EAAO5M,KAab,GADAyV,GAVUo0B,EAAOj9B,EAAKy/B,iBAAiBJ,IAAgBr/B,EAAK0/B,qBAAqBL,KAC/DA,EAGPpC,EAFIj9B,EAAK2/B,gBAAgBN,GASpC,CAIA,GADAC,EAPWvL,EAAY4B,KAAK,OAQf,CAET,KADA4J,EAAOnsC,KAAKosC,aAAaH,IAIrB,OAFAx2B,EAAS,IAAIid,GAAc,UAAEwZ,EAASz2B,EAAQ02B,GAKtD,OAAO12B,IAEX42B,iBAAkB,SAAUJ,GACxB,GAAItL,EAAY4B,KAAK,OAAQ,CACzB,IAAM9sB,EAASzV,KAAKssC,qBAAqBL,GAIzC,OAHIx2B,IACAA,EAAO8W,QAAU9W,EAAO8W,QAErB9W,IAGf62B,qBAAsB,SAAUL,GAiB5B,IAAIO,EAEJ,GADA7L,EAAYe,OACPf,EAAY4B,KAAK,KAAtB,CAKA,GADAiK,EAtBA,SAA2CC,GACvC,IAAID,EAGJ,GAFA7L,EAAYe,OACZ8K,EAAOC,EAAGp1B,UAAU40B,GACpB,CAIA,GAAKtL,EAAY2B,MAAM,KAKvB,OADA3B,EAAYmB,SACL0K,EAJH7L,EAAYgB,eAJZhB,EAAYgB,UAiBb+K,CAAkC1sC,MAGrC,OADA2gC,EAAYmB,SACL0K,EAIX,GADAA,EAAOxsC,KAAKusC,gBAAgBN,GAC5B,CAIA,GAAKtL,EAAY2B,MAAM,KAKvB,OADA3B,EAAYmB,SACL0K,EAJH7L,EAAYgB,QAAQ,qBAAqBhB,EAAY+C,wBAJrD/C,EAAYgB,eAXZhB,EAAYgB,WAqBpB4K,gBAAiB,SAAUN,GACvB,IAEIz9B,EACAC,EACA6B,EACA/B,EALEw4B,EAAW/mC,KAAK+mC,SAChB/4B,EAAQ2yB,EAAYjgC,EAM1B,SAASmpC,IACL,OAAO7pC,KAAK6rC,YAAc9E,EAAS30B,WAAa20B,EAASI,UAAYJ,EAASG,cAKlF,GADA14B,GAFAq7B,EAAOA,EAAKxoC,KAAKrB,SAqCb,OAjCI2gC,EAAY2B,MAAM,KAEd/zB,EADAoyB,EAAY2B,MAAM,KACb,KAEA,IAGT3B,EAAY2B,MAAM,KAEd/zB,EADAoyB,EAAY2B,MAAM,KACb,KAEA,IAGT3B,EAAY2B,MAAM,OAEd/zB,EADAoyB,EAAY2B,MAAM,KACb,KACE3B,EAAY2B,MAAM,KACpB,KAEA,KAGT/zB,GACAE,EAAIo7B,KAEAv5B,EAAI,IAAIoiB,GAAc,UAAEnkB,EAAIC,EAAGC,EAAGT,GAAO,GAEzClO,EAAM,uBAGVwQ,EAAI,IAAIoiB,GAAc,UAAE,IAAKlkB,EAAG,IAAIkkB,GAAY,QAAE,QAAS1kB,GAAO,GAE/DsC,GAQf07B,QAAS,WACL,IACIzf,EADEwa,EAAW/mC,KAAK+mC,SAGlBpG,EAAY6C,KAAK,eACjBjX,EAASoU,EAAY2B,MAAM,MAG/B,IAAI4I,EAAIlrC,KAAK4rC,OAAS7E,EAASmB,aACvBnB,EAAS/1B,SAAW+1B,EAASztB,YAC7BytB,EAAShe,YAAcge,EAASj3B,QAChCi3B,EAASI,QAAO,IAASJ,EAAS0B,gBAClC1B,EAASG,cAOjB,OALI3a,IACA2e,EAAEvjB,YAAa,EACfujB,EAAI,IAAIxY,GAAa,SAAEwY,IAGpBA,GAUXpf,WAAY,WACR,IACIrsB,EACAktC,EAFE5F,EAAW,GAGX/4B,EAAQ2yB,EAAYjgC,EAE1B,IACIjB,EAAIO,KAAKo/B,WAEL2H,EAASvmC,KAAKf,KAGlBA,EAAIO,KAAK6rC,YAAc7rC,KAAKooC,oBAEX1V,GAAK/X,UAClBlb,EAAI,MAGJA,IACAsnC,EAASvmC,KAAKf,GAETkhC,EAAY6C,KAAK,cAClBmJ,EAAQhM,EAAY2B,MAAM,OAEtByE,EAASvmC,KAAK,IAAIkyB,GAAc,UAAEia,EAAO3+B,YAIhDvO,GACT,GAAIsnC,EAASjoC,OAAS,EAClB,OAAO,IAAI4zB,GAAe,WAAEqU,IAGpChe,SAAU,WACN,IAAM7P,EAAOynB,EAAYwB,IAAI,8BAC7B,GAAIjpB,EACA,OAAOA,EAAK,IAGpBsxB,aAAc,WACV,IAEI7+B,EACA8X,EAHAvK,EAAO,GACLlL,EAAQ,GAId2yB,EAAYe,OAEZ,IAAMkL,EAAiBjM,EAAYwB,IAAI,yBACvC,GAAIyK,EAGA,OAFA1zB,EAAO,CAAC,IAAIwZ,GAAY,QAAEka,EAAe,KACzCjM,EAAYmB,SACL5oB,EAGX,SAAS9I,EAAMk5B,GACX,IAAM5oC,EAAIigC,EAAYjgC,EAChBqN,EAAQ4yB,EAAYwB,IAAImH,GAC9B,GAAIv7B,EAEA,OADAC,EAAMxN,KAAKE,GACJwY,EAAK1Y,KAAKuN,EAAM,IAK/B,IADAqC,EAAM,UAEGA,EAAM,uCAKf,GAAK8I,EAAKpa,OAAS,GAAMsR,EAAM,sBAAuB,CASlD,IARAuwB,EAAYmB,SAII,KAAZ5oB,EAAK,KACLA,EAAKb,QACLrK,EAAMqK,SAELoL,EAAI,EAAGA,EAAIvK,EAAKpa,OAAQ2kB,IACzB9X,EAAIuN,EAAKuK,GACTvK,EAAKuK,GAAsB,MAAhB9X,EAAE+H,OAAO,IAA8B,MAAhB/H,EAAE+H,OAAO,GACvC,IAAIgf,GAAY,QAAE/mB,GACD,MAAhBA,EAAE+H,OAAO,GACN,IAAIgf,GAAa,SAAE,IAAI/mB,EAAE4G,MAAM,GAAI,GAAMvE,EAAMyV,GAAIzW,GACnD,IAAI0lB,GAAa,SAAE,IAAI/mB,EAAE4G,MAAM,GAAI,GAAMvE,EAAMyV,GAAIzW,GAE/D,OAAOkM,EAEXynB,EAAYgB,cCp1E5B,SAASkL,GAAGl/B,EAAS0J,EAAWy1B,EAAWC,GACvC,OAAO11B,EAAU3E,KAAK/E,GAAWm/B,EAAUp6B,KAAK/E,GACzCo/B,EAAaA,EAAWr6B,KAAK/E,GAAW,IAAIoL,EDu1EvDqsB,GAAOc,cAAgB,SAAA/lB,GACnB,IAAIxU,EAAI,GAER,IAAK,IAAMyU,KAAQD,EACf,GAAItT,OAAOpP,eAAeqS,KAAKqQ,EAAMC,GAAO,CACxC,IAAMhS,EAAQ+R,EAAKC,GACnBzU,IAAsB,MAAZyU,EAAK,GAAc,GAAK,KAAOA,OAAShS,GAAqC,MAA5BkY,OAAOlY,GAAOmE,OAAO,GAAc,GAAK,KAI3G,OAAO5G,GC/1EXkhC,GAAGhlB,UAAW,MCTVmlB,MDWW,CAAEtF,QAdjB,SAAiBrwB,GACb,OAAOA,EAAYoB,EAAQC,KAAOD,EAAQE,OAapBgvB,GAAMkF,ICThC,SAASv7B,GAAM4Y,GACX,OAAOne,KAAKkG,IAAI,EAAGlG,KAAKiG,IAAI,EAAGkY,IAEnC,SAAS+iB,GAAKC,EAAWC,GACrB,IAAMn8B,EAAQg8B,GAAeC,KAAKE,EAAI17B,EAAG07B,EAAIxhC,EAAGwhC,EAAIz7B,EAAGy7B,EAAI3+B,GAC3D,GAAIwC,EAOA,OANIk8B,EAAU9+B,OACV,aAAaqM,KAAKyyB,EAAU9+B,OAC5B4C,EAAM5C,MAAQ8+B,EAAU9+B,MAExB4C,EAAM5C,MAAQ,MAEX4C,EAGf,SAASQ,GAAMR,GACX,GAAIA,EAAMQ,MACN,OAAOR,EAAMQ,QAEb,MAAM,IAAI9R,MAAM,2CAIxB,SAAS0tC,GAAMp8B,GACX,GAAIA,EAAMo8B,MACN,OAAOp8B,EAAMo8B,QAEb,MAAM,IAAI1tC,MAAM,2CAIxB,SAAS2tC,GAAOz9B,GACZ,GAAIA,aAAauW,GACb,OAAOF,WAAWrW,EAAEoW,KAAKX,GAAG,KAAOzV,EAAExB,MAAQ,IAAMwB,EAAExB,OAClD,GAAiB,iBAANwB,EACd,OAAOA,EAEP,KAAM,CACFhP,KAAM,WACNmV,QAAS,qDAWrBi3B,GAAiB,CACbh9B,IAAK,SAAUW,EAAGC,EAAGnC,GACjB,IAAID,EAAI,EAKR,GAAImC,aAAa4W,GAAY,CACzB,IAAM2C,EAAMvZ,EAAEvC,MAQd,GAPAuC,EAAIuZ,EAAI,GACRtZ,EAAIsZ,EAAI,IACRzb,EAAIyb,EAAI,cAKS/C,GAAW,CACxB,IAAM5Y,EAAKE,EACXA,EAAIF,EAAG0Y,SAAS,GAChBzY,EAAID,EAAG0Y,SAAS,IAGxB,IAAMjW,EAAQg8B,GAAeM,KAAK38B,EAAGC,EAAGnC,EAAGD,GAC3C,GAAIwC,EAEA,OADAA,EAAM5C,MAAQ,MACP4C,GAGfs8B,KAAM,SAAU38B,EAAGC,EAAGnC,EAAGD,GACrB,IACI,GAAImC,aAAaD,EAMb,OAJIlC,EADAoC,EACIy8B,GAAOz8B,GAEPD,EAAEH,MAEH,IAAIE,EAAMC,EAAEX,IAAKxB,EAAG,QAE/B,IAAMwB,EAAM,CAACW,EAAGC,EAAGnC,GAAG4B,KAAI,SAAAC,GAAK,OA7CxBi9B,EA6CkC,KA7CrC39B,EA6CkCU,aA5C7B6V,IAAavW,EAAEoW,KAAKX,GAAG,KAC7BY,WAAWrW,EAAExB,MAAQm/B,EAAO,KAE5BF,GAAOz9B,GAJtB,IAAgBA,EAAG29B,KA+CP,OADA/+B,EAAI6+B,GAAO7+B,GACJ,IAAIkC,EAAMV,EAAKxB,EAAG,QAE7B,MAAO/O,MAEX0tC,IAAK,SAAU17B,EAAG9F,EAAG+F,GACjB,IAAIlD,EAAI,EACR,GAAIiD,aAAa8V,GAAY,CACzB,IAAM2C,EAAMzY,EAAErD,MAKd,GAJAqD,EAAIyY,EAAI,GACRve,EAAIue,EAAI,IACRxY,EAAIwY,EAAI,cAES/C,GAAW,CACxB,IAAM5Y,EAAKmD,EACXA,EAAInD,EAAG0Y,SAAS,GAChBzY,EAAID,EAAG0Y,SAAS,IAGxB,IAAMjW,EAAQg8B,GAAeC,KAAKx7B,EAAG9F,EAAG+F,EAAGlD,GAC3C,GAAIwC,EAEA,OADAA,EAAM5C,MAAQ,MACP4C,GAGfi8B,KAAM,SAAUx7B,EAAG9F,EAAG+F,EAAGlD,GACrB,IACI,GAAIiD,aAAaf,EAMb,OAJIlC,EADA7C,EACI0hC,GAAO1hC,GAEP8F,EAAEjB,MAEH,IAAIE,EAAMe,EAAEzB,IAAKxB,EAAG,QAG/B,IAAIg/B,EACAC,EAEJ,SAASC,EAAIj8B,GAET,OAAQ,GADRA,EAAIA,EAAI,EAAIA,EAAI,EAAKA,EAAI,EAAIA,EAAI,EAAIA,GACzB,EACD+7B,GAAMC,EAAKD,GAAM/7B,EAAI,EAEnB,EAAJA,EAAQ,EACNg8B,EAEE,EAAJh8B,EAAQ,EACN+7B,GAAMC,EAAKD,IAAO,EAAI,EAAI/7B,GAAK,EAG/B+7B,EAIf/7B,EAAK47B,GAAO57B,GAAK,IAAO,IACxB9F,EAAI2F,GAAM+7B,GAAO1hC,IAAI+F,EAAIJ,GAAM+7B,GAAO37B,IAAIlD,EAAI8C,GAAM+7B,GAAO7+B,IAG3Dg/B,EAAS,EAAJ97B,GADL+7B,EAAK/7B,GAAK,GAAMA,GAAK/F,EAAI,GAAK+F,EAAI/F,EAAI+F,EAAI/F,GAG1C,IAAMqE,EAAM,CACS,IAAjB09B,EAAIj8B,EAAI,EAAI,GACG,IAAfi8B,EAAIj8B,GACa,IAAjBi8B,EAAIj8B,EAAI,EAAI,IAGhB,OADAjD,EAAI6+B,GAAO7+B,GACJ,IAAIkC,EAAMV,EAAKxB,EAAG,QAE7B,MAAO/O,MAGXkuC,IAAK,SAASl8B,EAAG9F,EAAGuG,GAChB,OAAO86B,GAAeY,KAAKn8B,EAAG9F,EAAGuG,EAAG,IAGxC07B,KAAM,SAASn8B,EAAG9F,EAAGuG,EAAG1D,GAIpB,IAAI9N,EACA6uB,EAJJ9d,EAAM47B,GAAO57B,GAAK,IAAO,IAAO,IAChC9F,EAAI0hC,GAAO1hC,GAAGuG,EAAIm7B,GAAOn7B,GAAG1D,EAAI6+B,GAAO7+B,GAOvC,IAAMq/B,EAAK,CAAC37B,EACRA,GAAK,EAAIvG,GACTuG,GAAK,GAJTqd,EAAK9d,EAAI,IADT/Q,EAAIqL,KAAK+hC,MAAOr8B,EAAI,GAAM,KAKT9F,GACbuG,GAAK,GAAK,EAAIqd,GAAK5jB,IACjBoiC,EAAO,CAAC,CAAC,EAAG,EAAG,GACjB,CAAC,EAAG,EAAG,GACP,CAAC,EAAG,EAAG,GACP,CAAC,EAAG,EAAG,GACP,CAAC,EAAG,EAAG,GACP,CAAC,EAAG,EAAG,IAEX,OAAOf,GAAeM,KAAsB,IAAjBO,EAAGE,EAAKrtC,GAAG,IACjB,IAAjBmtC,EAAGE,EAAKrtC,GAAG,IACM,IAAjBmtC,EAAGE,EAAKrtC,GAAG,IACX8N,IAGRk/B,IAAK,SAAU18B,GACX,OAAO,IAAImV,GAAU3U,GAAMR,GAAOS,IAEtCu8B,WAAY,SAAUh9B,GAClB,OAAO,IAAImV,GAA2B,IAAjB3U,GAAMR,GAAOrF,EAAS,MAE/CsiC,UAAW,SAAUj9B,GACjB,OAAO,IAAImV,GAA2B,IAAjB3U,GAAMR,GAAOU,EAAS,MAE/Cw8B,OAAQ,SAASl9B,GACb,OAAO,IAAImV,GAAUinB,GAAMp8B,GAAOS,IAEtC08B,cAAe,SAAUn9B,GACrB,OAAO,IAAImV,GAA2B,IAAjBinB,GAAMp8B,GAAOrF,EAAS,MAE/CyiC,SAAU,SAAUp9B,GAChB,OAAO,IAAImV,GAA2B,IAAjBinB,GAAMp8B,GAAOkB,EAAS,MAE/C3I,IAAK,SAAUyH,GACX,OAAO,IAAImV,GAAUnV,EAAMhB,IAAI,KAEnC1K,MAAO,SAAU0L,GACb,OAAO,IAAImV,GAAUnV,EAAMhB,IAAI,KAEnCxN,KAAM,SAAUwO,GACZ,OAAO,IAAImV,GAAUnV,EAAMhB,IAAI,KAEnCQ,MAAO,SAAUQ,GACb,OAAO,IAAImV,GAAU3U,GAAMR,GAAOxC,IAEtC6/B,KAAM,SAAUr9B,GACZ,OAAO,IAAImV,GAAUnV,EAAMq9B,OAASr9B,EAAMR,MAAQ,IAAK,MAE3D89B,UAAW,SAAUt9B,GACjB,IAAMs9B,EACD,MAASt9B,EAAMhB,IAAI,GAAK,IACpB,MAASgB,EAAMhB,IAAI,GAAK,IACxB,MAASgB,EAAMhB,IAAI,GAAK,IAEjC,OAAO,IAAImW,GAAUmoB,EAAYt9B,EAAMR,MAAQ,IAAK,MAExD+9B,SAAU,SAAUv9B,EAAOw9B,EAAQC,GAG/B,IAAKz9B,EAAMhB,IACP,OAAO,KAEX,IAAMm9B,EAAM37B,GAAMR,GASlB,YAPsB,IAAXy9B,GAA2C,aAAjBA,EAAOrgC,MACxC++B,EAAIxhC,GAAMwhC,EAAIxhC,EAAI6iC,EAAOpgC,MAAQ,IAGjC++B,EAAIxhC,GAAK6iC,EAAOpgC,MAAQ,IAE5B++B,EAAIxhC,EAAI2F,GAAM67B,EAAIxhC,GACXshC,GAAKj8B,EAAOm8B,IAEvBuB,WAAY,SAAU19B,EAAOw9B,EAAQC,GACjC,IAAMtB,EAAM37B,GAAMR,GASlB,YAPsB,IAAXy9B,GAA2C,aAAjBA,EAAOrgC,MACxC++B,EAAIxhC,GAAMwhC,EAAIxhC,EAAI6iC,EAAOpgC,MAAQ,IAGjC++B,EAAIxhC,GAAK6iC,EAAOpgC,MAAQ,IAE5B++B,EAAIxhC,EAAI2F,GAAM67B,EAAIxhC,GACXshC,GAAKj8B,EAAOm8B,IAEvBwB,QAAS,SAAU39B,EAAOw9B,EAAQC,GAC9B,IAAMtB,EAAM37B,GAAMR,GASlB,YAPsB,IAAXy9B,GAA2C,aAAjBA,EAAOrgC,MACxC++B,EAAIz7B,GAAMy7B,EAAIz7B,EAAI88B,EAAOpgC,MAAQ,IAGjC++B,EAAIz7B,GAAK88B,EAAOpgC,MAAQ,IAE5B++B,EAAIz7B,EAAIJ,GAAM67B,EAAIz7B,GACXu7B,GAAKj8B,EAAOm8B,IAEvByB,OAAQ,SAAU59B,EAAOw9B,EAAQC,GAC7B,IAAMtB,EAAM37B,GAAMR,GASlB,YAPsB,IAAXy9B,GAA2C,aAAjBA,EAAOrgC,MACxC++B,EAAIz7B,GAAMy7B,EAAIz7B,EAAI88B,EAAOpgC,MAAQ,IAGjC++B,EAAIz7B,GAAK88B,EAAOpgC,MAAQ,IAE5B++B,EAAIz7B,EAAIJ,GAAM67B,EAAIz7B,GACXu7B,GAAKj8B,EAAOm8B,IAEvB0B,OAAQ,SAAU79B,EAAOw9B,EAAQC,GAC7B,IAAMtB,EAAM37B,GAAMR,GASlB,YAPsB,IAAXy9B,GAA2C,aAAjBA,EAAOrgC,MACxC++B,EAAI3+B,GAAM2+B,EAAI3+B,EAAIggC,EAAOpgC,MAAQ,IAGjC++B,EAAI3+B,GAAKggC,EAAOpgC,MAAQ,IAE5B++B,EAAI3+B,EAAI8C,GAAM67B,EAAI3+B,GACXy+B,GAAKj8B,EAAOm8B,IAEvB2B,QAAS,SAAU99B,EAAOw9B,EAAQC,GAC9B,IAAMtB,EAAM37B,GAAMR,GASlB,YAPsB,IAAXy9B,GAA2C,aAAjBA,EAAOrgC,MACxC++B,EAAI3+B,GAAM2+B,EAAI3+B,EAAIggC,EAAOpgC,MAAQ,IAGjC++B,EAAI3+B,GAAKggC,EAAOpgC,MAAQ,IAE5B++B,EAAI3+B,EAAI8C,GAAM67B,EAAI3+B,GACXy+B,GAAKj8B,EAAOm8B,IAEvB4B,KAAM,SAAU/9B,EAAOw9B,GACnB,IAAMrB,EAAM37B,GAAMR,GAIlB,OAFAm8B,EAAI3+B,EAAIggC,EAAOpgC,MAAQ,IACvB++B,EAAI3+B,EAAI8C,GAAM67B,EAAI3+B,GACXy+B,GAAKj8B,EAAOm8B,IAEvB6B,KAAM,SAAUh+B,EAAOw9B,GACnB,IAAMrB,EAAM37B,GAAMR,GACZ08B,GAAOP,EAAI17B,EAAI+8B,EAAOpgC,OAAS,IAIrC,OAFA++B,EAAI17B,EAAIi8B,EAAM,EAAI,IAAMA,EAAMA,EAEvBT,GAAKj8B,EAAOm8B,IAMvB8B,IAAK,SAAUC,EAAQC,EAAQC,GACtBA,IACDA,EAAS,IAAIjpB,GAAU,KAE3B,IAAMhX,EAAIigC,EAAOhhC,MAAQ,IACnBihC,EAAQ,EAAJlgC,EAAQ,EACZX,EAAIgD,GAAM09B,GAAQ1gC,EAAIgD,GAAM29B,GAAQ3gC,EAEpC8gC,IAAQD,EAAI7gC,IAAM,EAAK6gC,GAAKA,EAAI7gC,IAAM,EAAI6gC,EAAI7gC,IAAM,GAAK,EACzD+gC,EAAK,EAAID,EAETt/B,EAAM,CAACk/B,EAAOl/B,IAAI,GAAKs/B,EAAKH,EAAOn/B,IAAI,GAAKu/B,EAC9CL,EAAOl/B,IAAI,GAAKs/B,EAAKH,EAAOn/B,IAAI,GAAKu/B,EACrCL,EAAOl/B,IAAI,GAAKs/B,EAAKH,EAAOn/B,IAAI,GAAKu/B,GAEnC/+B,EAAQ0+B,EAAO1+B,MAAQrB,EAAIggC,EAAO3+B,OAAS,EAAIrB,GAErD,OAAO,IAAIuB,EAAMV,EAAKQ,IAE1Bg/B,UAAW,SAAUx+B,GACjB,OAAOg8B,GAAe0B,WAAW19B,EAAO,IAAImV,GAAU,OAE1DspB,SAAU,SAAUz+B,EAAO0+B,EAAMC,EAAOC,GAGpC,IAAK5+B,EAAMhB,IACP,OAAO,KASX,QAPqB,IAAV2/B,IACPA,EAAQ3C,GAAeM,KAAK,IAAK,IAAK,IAAK,SAE3B,IAAToC,IACPA,EAAO1C,GAAeM,KAAK,EAAG,EAAG,EAAG,IAGpCoC,EAAKrB,OAASsB,EAAMtB,OAAQ,CAC5B,IAAM1+B,EAAIggC,EACVA,EAAQD,EACRA,EAAO//B,EAOX,OAJIigC,OADqB,IAAdA,EACK,IAEAvC,GAAOuC,GAEnB5+B,EAAMq9B,OAASuB,EACRD,EAEAD,GAyCfG,KAAM,SAAU7+B,GACZ,OAAO,IAAI+H,EAAU/H,EAAM8+B,WAE/B9+B,MAAO,SAASV,GACZ,GAAKA,aAAasZ,IACb,uDAAuDnP,KAAKnK,EAAElC,OAAS,CACxE,IAAM8b,EAAM5Z,EAAElC,MAAMmE,MAAM,GAC1B,OAAO,IAAI7B,EAAMwZ,OAAK1d,EAAW,IAAI0d,GAEzC,GAAK5Z,aAAaI,IAAWJ,EAAII,EAAM42B,YAAYh3B,EAAElC,QAEjD,OADAkC,EAAElC,WAAQ5B,EACH8D,EAEX,KAAM,CACF1P,KAAS,WACTmV,QAAS,oEAGjBg6B,KAAM,SAAS/+B,EAAOw9B,GAClB,OAAOxB,GAAeiC,IAAIjC,GAAeh9B,IAAI,IAAK,IAAK,KAAMgB,EAAOw9B,IAExEwB,MAAO,SAASh/B,EAAOw9B,GACnB,OAAOxB,GAAeiC,IAAIjC,GAAeh9B,IAAI,EAAG,EAAG,GAAIgB,EAAOw9B,KC1btE,SAASyB,GAAWC,EAAMhB,EAAQC,GAC9B,IAGIgB,EAKAC,EAEAC,EACAC,EAXEC,EAAKrB,EAAO1+B,MAKZggC,EAAKrB,EAAO3+B,MAOZG,EAAI,GAEV0/B,EAAKG,EAAKD,GAAM,EAAIC,GACpB,IAAK,IAAI9vC,EAAI,EAAGA,EAAI,EAAGA,IAGnB4vC,EAAKJ,EAFLC,EAAKjB,EAAOl/B,IAAItP,GAAK,IACrB0vC,EAAKjB,EAAOn/B,IAAItP,GAAK,KAEjB2vC,IACAC,GAAME,EAAKJ,EAAKG,GAAMJ,EAChBK,GAAML,EAAKC,EAAKE,KAAQD,GAElC1/B,EAAEjQ,GAAU,IAAL4vC,EAGX,OAAO,IAAI5/B,EAAMC,EAAG0/B,GAGxB,IAAMI,GAA0B,CAC5BC,SAAU,SAASP,EAAIC,GACnB,OAAOD,EAAKC,GAEhBO,OAAQ,SAASR,EAAIC,GACjB,OAAOD,EAAKC,EAAKD,EAAKC,GAE1BQ,QAAS,SAAST,EAAIC,GAElB,OADAD,GAAM,IACQ,EACVM,GAAwBC,SAASP,EAAIC,GACrCK,GAAwBE,OAAOR,EAAK,EAAGC,IAE/CS,UAAW,SAASV,EAAIC,GACpB,IAAIphC,EAAI,EACJvP,EAAI0wC,EAMR,OALIC,EAAK,KACL3wC,EAAI,EACJuP,EAAKmhC,EAAK,IAAQpkC,KAAK+kC,KAAKX,KACpB,GAAKA,EAAK,IAAMA,EAAK,GAAKA,GAE/BA,GAAM,EAAI,EAAIC,GAAM3wC,GAAKuP,EAAImhC,IAExCY,UAAW,SAASZ,EAAIC,GACpB,OAAOK,GAAwBG,QAAQR,EAAID,IAE/Ca,WAAY,SAASb,EAAIC,GACrB,OAAOrkC,KAAKklC,IAAId,EAAKC,IAEzBc,UAAW,SAASf,EAAIC,GACpB,OAAOD,EAAKC,EAAK,EAAID,EAAKC,GAI9Be,QAAS,SAAShB,EAAIC,GAClB,OAAQD,EAAKC,GAAM,GAEvBgB,SAAU,SAASjB,EAAIC,GACnB,OAAO,EAAIrkC,KAAKklC,IAAId,EAAKC,EAAK,KAItC,IAAK,IAAM7gB,MAAKkhB,GACRA,GAAwBhzC,eAAe8xB,MACvC0gB,GAAW1gB,IAAK0gB,GAAW5uC,KAAK,KAAMovC,GAAwBlhB,UCpEhE8hB,GAAmB,SAAAhkC,GAMrB,OAHcC,MAAMC,QAAQF,EAAKe,OAC7Bf,EAAKe,MAAQd,MAAMD,OAKZ,CACXikC,MAAO,SAAS1hC,GACZ,OAAOA,GAEX2hC,IAAK,eAAS,aAAAC,mBAAAA,IAAAC,kBACV,OAAoB,IAAhBA,EAAK3yC,OACE2yC,EAAK,GAET,IAAIj5B,EAAMi5B,IAErB56B,QAAS,SAAS66B,EAAQ1jC,GAItB,OAFAA,EAAQA,EAAMI,MAAQ,EAEfijC,GAAiBK,GAAQ1jC,IAEpClP,OAAQ,SAAS4yC,GACb,OAAO,IAAIvrB,GAAUkrB,GAAiBK,GAAQ5yC,SAUlD6yC,MAAO,SAAS7N,EAAOmB,EAAK2M,GACxB,IAAIC,EACAC,EACAC,EAAY,EACVC,EAAO,GACT/M,GACA6M,EAAK7M,EACL4M,EAAO/N,EAAM11B,MACTwjC,IACAG,EAAYH,EAAKxjC,SAIrByjC,EAAO,EACPC,EAAKhO,GAGT,IAAK,IAAIpjC,EAAImxC,EAAMnxC,GAAKoxC,EAAG1jC,MAAO1N,GAAKqxC,EACnCC,EAAKxxC,KAAK,IAAI2lB,GAAUzlB,EAAGoxC,EAAG9rB,OAGlC,OAAO,IAAIuB,GAAWyqB,IAE1BC,KAAM,SAASD,EAAME,GAAf,IAEE5hB,EACA6hB,SAFE10B,EAAQ,GAIR20B,EAAU,SAAAloB,GACZ,OAAIA,aAAehd,EACRgd,EAAIxX,KAAKvC,EAAKxC,SAElBuc,GAUPioB,GAPAH,EAAK5jC,OAAW4jC,aAAgBK,GAMzBL,EAAKvzB,QACD2zB,EAAQJ,EAAKvzB,SAAShB,MAC1Bu0B,EAAKv0B,MACDu0B,EAAKv0B,MAAMpN,IAAI+hC,GACnB9kC,MAAMC,QAAQykC,GACVA,EAAK3hC,IAAI+hC,GAET,CAACA,EAAQJ,IAZhB1kC,MAAMC,QAAQykC,EAAK5jC,OACR4jC,EAAK5jC,MAAMiC,IAAI+hC,GAEf,CAACA,EAAQJ,EAAK5jC,QAYjC,IAAIkkC,EAAY,SACZC,EAAU,OACVC,EAAY,SAEZN,EAAGnkB,QACHukB,EAAYJ,EAAGnkB,OAAO,IAAMmkB,EAAGnkB,OAAO,GAAG7U,KACzCq5B,EAAUL,EAAGnkB,OAAO,IAAMmkB,EAAGnkB,OAAO,GAAG7U,KACvCs5B,EAAYN,EAAGnkB,OAAO,IAAMmkB,EAAGnkB,OAAO,GAAG7U,KACzCg5B,EAAKA,EAAGz0B,OAERy0B,EAAKA,EAAGzzB,QAGZ,IAAK,IAAI/d,EAAI,EAAGA,EAAIyxC,EAASrzC,OAAQ4B,IAAK,CACtC,IAAI2R,SACAjE,SACE2Z,EAAOoqB,EAASzxC,GAClBqnB,aAAgBxO,GAChBlH,EAA2B,iBAAd0V,EAAK7O,KAAoB6O,EAAK7O,KAAO6O,EAAK7O,KAAK,GAAG9K,MAC/DA,EAAQ2Z,EAAK3Z,QAEbiE,EAAM,IAAI8T,GAAUzlB,EAAI,GACxB0N,EAAQ2Z,GAGRA,aAAgBpN,IAIpB2V,EAAW4hB,EAAGz0B,MAAMlL,MAAM,GACtB+/B,GACAhiB,EAAS9vB,KAAK,IAAI+Y,EAAY+4B,EAC1BlkC,GACA,GAAO,EAAOpO,KAAKgO,MAAOhO,KAAKoT,kBAEnCo/B,GACAliB,EAAS9vB,KAAK,IAAI+Y,EAAYi5B,EAC1B,IAAIrsB,GAAUzlB,EAAI,IAClB,GAAO,EAAOV,KAAKgO,MAAOhO,KAAKoT,kBAEnCm/B,GACAjiB,EAAS9vB,KAAK,IAAI+Y,EAAYg5B,EAC1BlgC,GACA,GAAO,EAAOrS,KAAKgO,MAAOhO,KAAKoT,kBAGvCqK,EAAMjd,KAAK,IAAIsd,EAAQ,CAAE,MAAc,CAAE,IAAItK,EAAQ,GAAI,QACrD8c,EACA4hB,EAAGx0B,cACHw0B,EAAG7+B,oBAIX,OAAO,IAAIyK,EAAQ,CAAE,MAAc,CAAE,IAAItK,EAAQ,GAAI,QACjDiK,EACAy0B,EAAGx0B,cACHw0B,EAAG7+B,kBACLX,KAAK1S,KAAK2N,WCzJd8kC,GAAa,SAACC,EAAI1sB,EAAMpW,GAC1B,KAAMA,aAAauW,IACf,KAAM,CAAEvlB,KAAM,WAAYmV,QAAS,6BAOvC,OALY,MAARiQ,EACAA,EAAOpW,EAAEoW,KAETpW,EAAIA,EAAE+W,QAEH,IAAIR,GAAUusB,EAAGzsB,WAAWrW,EAAExB,QAAS4X,ICT5C2sB,GAAgB,CAElBC,KAAO,KACP9E,MAAO,KACPgD,KAAO,KACPG,IAAO,KACPzmC,IAAO,GACPqoC,IAAO,GACPC,IAAO,GACPC,KAAO,MACPC,KAAO,MACPC,KAAO,OAGX,IAAK,IAAM1jB,MAAKojB,GACRA,GAAcl1C,eAAe8xB,MAC7BojB,GAAcpjB,IAAK2jB,GAAW7xC,KAAK,KAAM0K,KAAKwjB,IAAIojB,GAAcpjB,MAIxEojB,GAAcphC,MAAQ,SAAC3B,EAAG2f,GACtB,IAAM4jB,OAAwB,IAAN5jB,EAAoB,EAAIA,EAAEnhB,MAClD,OAAO8kC,IAAW,SAAAE,GAAO,OAAAA,EAAIvkC,QAAQskC,KAAW,KAAMvjC,ICpB1D,IAAMyjC,GAAS,SAAUC,EAAOniC,GAE5B,QADAA,EAAO7D,MAAMiC,UAAUgD,MAAMzC,KAAKqB,IACrBrS,QACT,KAAK,EAAG,KAAM,CAAE8B,KAAM,WAAYmV,QAAS,kCAE/C,IAAIrV,EACAyd,EACAqiB,EACA+S,EACAC,EACAxtB,EACAytB,EACAC,EAGAC,EAAS,GAEPjC,EAAS,GAEf,IAAKhxC,EAAI,EAAGA,EAAIyQ,EAAKrS,OAAQ4B,IAEzB,IADA8/B,EAAUrvB,EAAKzQ,cACUylB,GAWzB,GAHAstB,EAAsB,MADtBztB,EAA0C,MAD1CutB,EAA6C,KAA5B/S,EAAQxa,KAAKxT,iBAAmChG,IAAdknC,EAA0B,IAAIvtB,GAAUqa,EAAQpyB,MAAOslC,GAAW/sB,QAAU6Z,EAAQ7Z,SACjHX,KAAKxT,iBAAoChG,IAAfinC,EAA2BA,EAAaF,EAAevtB,KAAKxT,kBACjEhG,IAAfinC,GAAqC,KAATztB,GAAoD,KAArC2tB,EAAM,GAAGhtB,QAAQX,KAAKxT,WAAoBwT,EAAOytB,EACxHC,EAAqB,KAAT1tB,QAA6BxZ,IAAdknC,EAA0BlT,EAAQxa,KAAKxT,WAAakhC,OAErElnC,KADV2R,OAAmB3R,IAAfklC,EAAO,KAA8B,KAAT1rB,GAAeA,IAASytB,EAAa/B,EAAO,IAAMA,EAAO1rB,IASzFwtB,EAAgD,KAA7BG,EAAMx1B,GAAG6H,KAAKxT,iBAAmChG,IAAdknC,EAA0B,IAAIvtB,GAAUwtB,EAAMx1B,GAAG/P,MAAOslC,GAAW/sB,QAAUgtB,EAAMx1B,GAAGwI,SACvI2sB,GAASC,EAAenlC,MAAQolC,EAAiBplC,QACjDklC,GAASC,EAAenlC,MAAQolC,EAAiBplC,SAClDulC,EAAMx1B,GAAKqiB,OAXf,CACI,QAAmBh0B,IAAfinC,GAA4BztB,IAASytB,EACrC,KAAM,CAAE7yC,KAAM,WAAYmV,QAAS,sBAEvC27B,EAAO1rB,GAAQ2tB,EAAM70C,OACrB60C,EAAMnzC,KAAKggC,QAfPlzB,MAAMC,QAAQ4D,EAAKzQ,GAAG0N,QACtBd,MAAMiC,UAAU/O,KAAKuP,MAAMoB,EAAM7D,MAAMiC,UAAUgD,MAAMzC,KAAKqB,EAAKzQ,GAAG0N,QAuBhF,OAAoB,GAAhBulC,EAAM70C,OACC60C,EAAM,IAEjBxiC,EAAOwiC,EAAMtjC,KAAI,SAAU7B,GAAK,OAAOA,EAAEsC,MAAM9Q,KAAK2N,YAAaO,KAAKlO,KAAK2N,QAAQuD,SAAW,IAAM,MAC7F,IAAI6H,GAAau6B,EAAQ,MAAQ,WAASniC,YAGtC,CACXc,IAAK,eAAS,aAAAu/B,mBAAAA,IAAArgC,kBACV,IACI,OAAOkiC,IAAO,EAAMliC,GACtB,MAAO1R,MAEbuS,IAAK,eAAS,aAAAw/B,mBAAAA,IAAArgC,kBACV,IACI,OAAOkiC,IAAO,EAAOliC,GACvB,MAAO1R,MAEbm0C,QAAS,SAAU1pB,EAAKlE,GACpB,OAAOkE,EAAI1D,UAAUR,EAAK5X,QAE9BylC,GAAI,WACA,OAAO,IAAI1tB,GAAUpa,KAAKC,KAE9B8nC,IAAK,SAAStlC,EAAGC,GACb,OAAO,IAAI0X,GAAU3X,EAAEJ,MAAQK,EAAEL,MAAOI,EAAEwX,OAE9CnV,IAAK,SAASsB,EAAG4hC,GACb,GAAiB,iBAAN5hC,GAA+B,iBAAN4hC,EAChC5hC,EAAI,IAAIgU,GAAUhU,GAClB4hC,EAAI,IAAI5tB,GAAU4tB,QACf,KAAM5hC,aAAagU,IAAgB4tB,aAAa5tB,IACnD,KAAM,CAAEvlB,KAAM,WAAYmV,QAAS,6BAGvC,OAAO,IAAIoQ,GAAUpa,KAAK8E,IAAIsB,EAAE/D,MAAO2lC,EAAE3lC,OAAQ+D,EAAE6T,OAEvDguB,WAAY,SAAUpkC,GAGlB,OAFesjC,IAAW,SAAAE,GAAO,OAAM,IAANA,IAAW,IAAKxjC,QCpF1C,CACXnQ,EAAG,SAAUuX,GACT,OAAO,IAAI4S,GAAO,IAAK5S,aAAe+U,GAAa/U,EAAIi9B,UAAYj9B,EAAI5I,OAAO,IAElFy6B,OAAQ,SAAU7xB,GACd,OAAO,IAAI+B,EACPm7B,UAAUl9B,EAAI5I,OAAOjR,QAAQ,KAAM,OAAOA,QAAQ,KAAM,OAAOA,QAAQ,KAAM,OAAOA,QAAQ,KAAM,OAC7FA,QAAQ,MAAO,OAAOA,QAAQ,MAAO,SAElDA,QAAS,SAAU0uB,EAAQsoB,EAAS1jB,EAAa2jB,GAC7C,IAAI3+B,EAASoW,EAAOzd,MAIpB,OAHAqiB,EAAoC,WAArBA,EAAY7vB,KACvB6vB,EAAYriB,MAAQqiB,EAAY3f,QACpC2E,EAASA,EAAOtY,QAAQ,IAAIqoB,OAAO2uB,EAAQ/lC,MAAOgmC,EAAQA,EAAMhmC,MAAQ,IAAKqiB,GACtE,IAAI7G,GAAOiC,EAAOpC,OAAS,GAAIhU,EAAQoW,EAAOrC,UAEzD6qB,IAAK,SAAUxoB,GAIX,IAHA,IAAM1a,EAAO7D,MAAMiC,UAAUgD,MAAMzC,KAAKD,UAAW,GAC/C4F,EAASoW,EAAOzd,iBAEX1N,GAEL+U,EAASA,EAAOtY,QAAQ,WAAW,SAAAm3C,GAC/B,IAAMlmC,EAA2B,WAAjB+C,EAAKzQ,GAAGE,MACpB0zC,EAAMlkC,MAAM,MAASe,EAAKzQ,GAAG0N,MAAQ+C,EAAKzQ,GAAGoQ,QACjD,OAAOwjC,EAAMlkC,MAAM,UAAYmkC,mBAAmBnmC,GAASA,MAL1D1N,EAAI,EAAGA,EAAIyQ,EAAKrS,OAAQ4B,MAAxBA,GAST,OADA+U,EAASA,EAAOtY,QAAQ,MAAO,KACxB,IAAIysB,GAAOiC,EAAOpC,OAAS,GAAIhU,EAAQoW,EAAOrC,WCxBvDgrB,GAAM,SAAC5kC,EAAG6kC,GAAS,OAAC7kC,aAAa6kC,EAAQh8B,EAAQC,KAAOD,EAAQE,OAChE+7B,GAAS,SAAC9kC,EAAGoW,GACf,QAAaxZ,IAATwZ,EACA,KAAM,CAAEplB,KAAM,WAAYmV,QAAS,mDAGvC,GAAoB,iBADpBiQ,EAA6B,iBAAfA,EAAK5X,MAAqB4X,EAAK5X,MAAQ4X,GAEjD,KAAM,CAAEplB,KAAM,WAAYmV,QAAS,2DAEvC,OAAQnG,aAAauW,IAAcvW,EAAEoW,KAAKX,GAAGW,GAAQvN,EAAQC,KAAOD,EAAQE,UAGjE,CACXg8B,UAAW,SAAU/kC,GACjB,OAAO4kC,GAAI5kC,EAAGiV,IAElB+vB,QAAS,SAAUhlC,GACf,OAAO4kC,GAAI5kC,EAAGc,IAElBmkC,SAAU,SAAUjlC,GAChB,OAAO4kC,GAAI5kC,EAAGuW,KAElB2uB,SAAU,SAAUllC,GAChB,OAAO4kC,GAAI5kC,EAAGga,KAElBmrB,UAAW,SAAUnlC,GACjB,OAAO4kC,GAAI5kC,EAAG6I,IAElBu8B,MAAO,SAAUplC,GACb,OAAO4kC,GAAI5kC,EAAGwa,KAElB6qB,QAAS,SAAUrlC,GACf,OAAO8kC,GAAO9kC,EAAG,OAErBslC,aAAc,SAAUtlC,GACpB,OAAO8kC,GAAO9kC,EAAG,MAErBulC,KAAM,SAAUvlC,GACZ,OAAO8kC,GAAO9kC,EAAG,OAErB8kC,UACA1uB,KAAM,SAAUkE,EAAKlE,GACjB,KAAMkE,aAAe/D,IACjB,KAAM,CAAEvlB,KAAM,WACVmV,QAAS,+CAA8CmU,aAAe/C,GAAY,oCAAsC,KAWhI,OAPQnB,EAFJA,EACIA,aAAgBvN,EACTuN,EAAK5X,MAEL4X,EAAKlV,QAGT,GAEJ,IAAIqV,GAAU+D,EAAI9b,MAAO4X,IAEpCovB,WAAY,SAAUxlC,GAClB,OAAO,IAAImJ,EAAUnJ,EAAEoW,oBCpDhBvkB,GACX,IAAMR,EAAY,CAAE6d,mBAAkB8I,mBAetC,OAZA9I,EAAiB9B,YAAY0qB,IAC7B5oB,EAAiBhR,IAAI,UAAWsP,EAAY1K,KAAKrR,KAAK+b,IACtD0B,EAAiB9B,YAAYhM,IAC7B8N,EAAiB9B,YAAYq4B,IAC7Bv2B,EAAiB9B,qBClBNvb,GAEX,IAAM6zC,EAAW,SAACC,EAAcloC,GAAS,OAAA,IAAI+c,GAAI/c,EAAMkoC,EAAavnC,MAAOunC,EAAaniC,iBAAiBV,KAAK6iC,EAAa5nC,UAE3H,MAAO,CAAE6nC,WAAY,SAASC,EAAcC,GAEnCA,IACDA,EAAeD,EACfA,EAAe,MAGnB,IAAIE,EAAWF,GAAgBA,EAAarnC,MACxCwnC,EAAWF,EAAatnC,MACtBgF,EAAkBpT,KAAKoT,gBACvB5R,EAAmB4R,EAAgBkC,YACrClC,EAAgB5R,iBAAmB4R,EAAgByiC,UAEjDC,EAAgBF,EAASvkC,QAAQ,KACnCuZ,EAAW,IACQ,IAAnBkrB,IACAlrB,EAAWgrB,EAASrjC,MAAMujC,GAC1BF,EAAWA,EAASrjC,MAAM,EAAGujC,IAEjC,IAAMnoC,EAAUooC,EAAY/1C,KAAK2N,SACjCA,EAAQqoC,WAAY,EAEpB,IAAMl0C,EAAcL,EAAYw0C,eAAeL,EAAUp0C,EAAkBmM,EAASlM,GAAa,GAEjG,IAAKK,EACD,OAAOwzC,EAASt1C,KAAM01C,GAG1B,IAAIQ,GAAY,EAGhB,GAAKT,EAcDS,EAAY,WAAWz7B,KAAKk7B,OAdb,CAIf,GAAiB,mBAFjBA,EAAWl0C,EAAY00C,WAAWP,IAG9BM,GAAY,MACT,CAEH,IAAM/W,EAAU19B,EAAY20C,cAAcT,GAC1CO,EAAY,CAAC,WAAY,SAAS7kC,QAAQ8tB,GAAW,EAErD+W,IAAaP,GAAY,WAMjC,IAAMU,EAAWv0C,EAAYw0C,aAAaV,EAAUp0C,EAAkBmM,EAASlM,GAC/E,IAAK40C,EAASngC,SAEV,OADAvU,EAAOzB,KAAK,iCAAiC01C,6BACtCN,EAASt1C,KAAM01C,GAAgBD,GAE1C,IAAIc,EAAMF,EAASngC,SACnB,GAAIggC,IAAcz0C,EAAY+0C,aAC1B,OAAOlB,EAASt1C,KAAM01C,GAK1B,IAAMe,EAAM,QAAQd,OAFpBY,EAAML,EAAYz0C,EAAY+0C,aAAaD,GAAOhC,mBAAmBgC,IAE/B3rB,EAEtC,OAAO,IAAIR,GAAI,IAAIR,GAAO,IAAI6sB,MAAQA,GAAK,EAAOz2C,KAAKgO,MAAOhO,KAAKoT,iBAAkBpT,KAAKgO,MAAOhO,KAAKoT,mBDhD7EsjC,CAAQj1C,IACrCqd,EAAiB9B,YAAYg1B,IAC7BlzB,EAAiB9B,YAAY7H,IAC7B2J,EAAiB9B,YAAYqwB,IAC7BvuB,EAAiB9B,YAAY6O,IAC7B/M,EAAiB9B,YErBV,CAAE25B,eAAgB,SAASC,GAC9B,IAAIC,EACAC,EAIAnlB,EAEAjxB,EACAsQ,EACA+lC,EACAC,EACAxmC,EATAymC,EAAe,SACfC,EAAqB,mCACnBC,EAAY,CAACjmC,UAAU,GAEvBkmC,EAAiBR,EAAU9lC,MAAMqmC,GAOvC,SAASE,IACL,KAAM,CAAEz2C,KAAM,WACVmV,QAAS,yIAejB,OAXwB,GAApBlG,UAAU/Q,QACN+Q,UAAU,GAAGzB,MAAMtP,OAAS,GAC5Bu4C,IAEJR,EAAQhnC,UAAU,GAAGzB,OACdyB,UAAU/Q,OAAS,EAC1Bu4C,IAEAR,EAAQvpC,MAAMiC,UAAUgD,MAAMzC,KAAKD,UAAW,GAG1CunC,GACJ,IAAK,YACDN,EAAuB,oCACvB,MACJ,IAAK,WACDA,EAAuB,oCACvB,MACJ,IAAK,kBACDA,EAAuB,sCACvB,MACJ,IAAK,eACDA,EAAuB,sCACvB,MACJ,IAAK,UACL,IAAK,oBACDG,EAAe,SACfH,EAAuB,4BACvBI,EAAqB,2CACrB,MACJ,QACI,KAAM,CAAEt2C,KAAM,WAAYmV,QAAS,oHAK3C,IAFA4b,EAAW,8DAA8DslB,qBAA+BH,MAEnGp2C,EAAI,EAAGA,EAAIm2C,EAAM/3C,OAAQ4B,GAAK,EAC3Bm2C,EAAMn2C,aAAc6mB,IACpBvW,EAAQ6lC,EAAMn2C,GAAG0N,MAAM,GACvB2oC,EAAWF,EAAMn2C,GAAG0N,MAAM,KAE1B4C,EAAQ6lC,EAAMn2C,GACdq2C,OAAWvqC,GAGTwE,aAAiBN,KAAoB,IAANhQ,GAAWA,EAAI,IAAMm2C,EAAM/3C,cAAwB0N,IAAbuqC,GAA6BA,aAAoB5wB,KACxHkxB,IAEJL,EAAgBD,EAAWA,EAASjmC,MAAMqmC,GAAmB,IAANz2C,EAAU,KAAO,OACxE8P,EAAQQ,EAAMR,MACdmhB,GAAY,iBAAiBqlB,mBAA8BhmC,EAAMW,aAAWnB,EAAQ,EAAI,kBAAkBA,MAAW,SAOzH,OALAmhB,GAAY,KAAKslB,oBAA8BC,6BAE/CvlB,EAAW4iB,mBAAmB5iB,GAGvB,IAAIvH,GAAI,IAAIR,GAAO,KAD1B+H,EAAW,sBAAsBA,OACUA,GAAU,EAAO3xB,KAAKgO,MAAOhO,KAAKoT,iBAAkBpT,KAAKgO,MAAOhO,KAAKoT,oBFvDpH0L,EAAiB9B,YAAYs6B,IAEtBr2C,eG3Ba0d,EAAMthB,GAE1B,IAAIk6C,EACAr3B,GAFJ7iB,EAAUA,GAAW,IAEG6iB,UAClBs3B,EAAU,IAAI18B,EAASY,KAAKre,GAeT,iBAAd6iB,GAA2B5S,MAAMC,QAAQ2S,KAChDA,EAAYrT,OAAOoQ,KAAKiD,GAAW7P,KAAI,SAAUoT,GAC7C,IAAIrV,EAAQ8R,EAAUuD,GAQtB,OANMrV,aAAiBskB,GAAKla,QAClBpK,aAAiBskB,GAAKnL,aACxBnZ,EAAQ,IAAIskB,GAAKnL,WAAW,CAACnZ,KAEjCA,EAAQ,IAAIskB,GAAKla,MAAM,CAACpK,KAErB,IAAIskB,GAAKnZ,YAAY,IAAIkK,EAAKrV,GAAO,EAAO,KAAM,MAE7DopC,EAAQ77B,OAAS,CAAC,IAAI+W,GAAK5U,QAAQ,KAAMoC,KAG7C,IAQIhO,EACAulC,EATEvuB,EAAW,CACT,IAAI7a,GAAQivB,oBACZ,IAAIjvB,GAAQ8xB,6BAA4B,GACxC,IAAI9xB,GAAQ+xB,cACZ,IAAI/xB,GAAQ8a,aAAa,CAACjY,SAAU8H,QAAQ3b,EAAQ6T,aAGtDwmC,EAAkB,GASxB,GAAIr6C,EAAQuE,cAAe,CACvB61C,EAAkBp6C,EAAQuE,cAAcyM,UACxC,IAAK,IAAI3N,EAAI,EAAGA,EAAI,EAAGA,IAEnB,IADA+2C,EAAgBE,QACRzlC,EAAIulC,EAAgB1qC,OACpBmF,EAAE0lC,iBACQ,IAANl3C,IAA2C,IAAhCg3C,EAAgBrmC,QAAQa,KACnCwlC,EAAgBl3C,KAAK0R,GACrBA,EAAEskB,IAAI7X,IAIA,IAANje,IAAoC,IAAzBwoB,EAAS7X,QAAQa,KACxBA,EAAE2lC,aACF3uB,EAASjK,QAAQ/M,GAGjBgX,EAAS1oB,KAAK0R,IAQtCqlC,EAAY54B,EAAKjM,KAAK8kC,GAEtB,IAAS92C,EAAI,EAAGA,EAAIwoB,EAASpqB,OAAQ4B,IACjCwoB,EAASxoB,GAAG81B,IAAI+gB,GAIpB,GAAIl6C,EAAQuE,cAER,IADA61C,EAAgBE,QACRzlC,EAAIulC,EAAgB1qC,QACK,IAAzBmc,EAAS7X,QAAQa,KAA6C,IAAhCwlC,EAAgBrmC,QAAQa,IACtDA,EAAEskB,IAAI+gB,GAKlB,OAAOA,EC5FX,IA0JIO,GCzJAz6C,GACAsE,iBDDA,WAAYsnB,GACRjpB,KAAKipB,KAAOA,EACZjpB,KAAKkpB,SAAW,GAChBlpB,KAAKmmC,cAAgB,GACrBnmC,KAAK+3C,eAAiB,GACtB/3C,KAAKg4C,iBAAmB,GACxBh4C,KAAKe,aAAe,GACpBf,KAAKmyC,UAAY,EACjBnyC,KAAKi4C,YAAc,GACnBj4C,KAAKk4C,OAAS,IAAIjvB,EAAKkvB,aAAalvB,GA8I5C,OAvIImvB,uBAAA,SAAW9kB,GACP,GAAIA,EACA,IAAK,IAAI5yB,EAAI,EAAGA,EAAI4yB,EAAQx0B,OAAQ4B,IAChCV,KAAK8yB,UAAUQ,EAAQ5yB,KAUnC03C,sBAAA,SAAUrlB,EAAQxxB,EAAUud,GACxB9e,KAAKg4C,iBAAiBx3C,KAAKuyB,GACvBxxB,IACAvB,KAAKi4C,YAAY12C,GAAYwxB,GAE7BA,EAAOslB,SACPtlB,EAAOslB,QAAQr4C,KAAKipB,KAAMjpB,KAAM8e,GAAoB9e,KAAKipB,KAAKhoB,UAAU6d,mBAQhFs5B,gBAAA,SAAI72C,GACA,OAAOvB,KAAKi4C,YAAY12C,IAQ5B62C,uBAAA,SAAW/pC,GACPrO,KAAKkpB,SAAS1oB,KAAK6N,IAQvB+pC,4BAAA,SAAgBE,EAAcC,GAC1B,IAAIC,EACJ,IAAKA,EAAkB,EAAGA,EAAkBx4C,KAAKmmC,cAAcrnC,UACvDkB,KAAKmmC,cAAcqS,GAAiBD,UAAYA,GADeC,KAKvEx4C,KAAKmmC,cAAcxlC,OAAO63C,EAAiB,EAAG,CAACF,eAAcC,cAQjEH,6BAAA,SAAiBK,EAAeF,GAC5B,IAAIC,EACJ,IAAKA,EAAkB,EAAGA,EAAkBx4C,KAAK+3C,eAAej5C,UACxDkB,KAAK+3C,eAAeS,GAAiBD,UAAYA,GADeC,KAKxEx4C,KAAK+3C,eAAep3C,OAAO63C,EAAiB,EAAG,CAACC,gBAAeF,cAOnEH,2BAAA,SAAeM,GACX14C,KAAKe,aAAaP,KAAKk4C,IAQ3BN,6BAAA,WAEI,IADA,IAAMjS,EAAgB,GACbzlC,EAAI,EAAGA,EAAIV,KAAKmmC,cAAcrnC,OAAQ4B,IAC3CylC,EAAc3lC,KAAKR,KAAKmmC,cAAczlC,GAAG43C,cAE7C,OAAOnS,GAQXiS,8BAAA,WAEI,IADA,IAAML,EAAiB,GACdr3C,EAAI,EAAGA,EAAIV,KAAK+3C,eAAej5C,OAAQ4B,IAC5Cq3C,EAAev3C,KAAKR,KAAK+3C,eAAer3C,GAAG+3C,eAE/C,OAAOV,GAQXK,wBAAA,WACI,OAAOp4C,KAAKkpB,UAGhBkvB,oBAAA,WACI,IAAMxrC,EAAO5M,KACb,MAAO,CACH23C,MAAO,WAEH,OADA/qC,EAAKulC,UAAY,EACVvlC,EAAKsc,SAAStc,EAAKulC,WAE9BplC,IAAK,WAED,OADAH,EAAKulC,UAAY,EACVvlC,EAAKsc,SAAStc,EAAKulC,aAUtCiG,4BAAA,WACI,OAAOp4C,KAAKe,mBAMd43C,GAAuB,SAAS1vB,EAAM2vB,GAIxC,OAHIA,GAAed,KACfA,GAAK,IAAIM,GAAcnvB,IAEpB6uB,gBE9Iar2C,EAAaV,GACjC,IAAI83C,EAAiBC,EAAkBC,EAAWC,EAKlDD,WCvBoBE,GA4DpB,kBA1DI,WAAYt6B,EAAM3G,GACdhY,KAAK2e,KAAOA,EACZ3e,KAAKgY,QAAUA,EAsDvB,OAnDIkhC,kBAAA,SAAM77C,GACF,IAAIk6C,EAEAuB,EADErjC,EAAS,GAEf,IACI8hC,EAAY4B,GAAcn5C,KAAK2e,KAAMthB,GACvC,MAAOoC,GACL,MAAM,IAAImW,EAAUnW,EAAGO,KAAKgY,SAGhC,IACI,IAAM9G,EAAW8H,QAAQ3b,EAAQ6T,UAC7BA,GACAvP,EAAOzB,KAAK,mIAIhB,IAAMk5C,EAAe,CACjBloC,WACAgJ,gBAAiB7c,EAAQ6c,gBACzBiL,YAAanM,QAAQ3b,EAAQ8nB,aAC7BxW,aAAc,GAEdtR,EAAQg8C,WACRP,EAAmB,IAAIG,EAAiB57C,EAAQg8C,WAChD5jC,EAAOqV,IAAMguB,EAAiBhoC,MAAMymC,EAAW6B,EAAcp5C,KAAKgY,UAElEvC,EAAOqV,IAAMysB,EAAUzmC,MAAMsoC,GAEnC,MAAO35C,GACL,MAAM,IAAImW,EAAUnW,EAAGO,KAAKgY,SAGhC,GAAI3a,EAAQuE,cAER,IADA,IAAMm2C,EAAiB16C,EAAQuE,cAAc03C,oBACpC54C,EAAI,EAAGA,EAAIq3C,EAAej5C,OAAQ4B,IACvC+U,EAAOqV,IAAMitB,EAAer3C,GAAG2lC,QAAQ5wB,EAAOqV,IAAK,CAAEuuB,UAAWP,EAAkBz7C,UAAS2a,QAAShY,KAAKgY,UAQjH,IAAK,IAAMuhC,KALPl8C,EAAQg8C,YACR5jC,EAAOpF,IAAMyoC,EAAiBU,wBAGlC/jC,EAAOuC,QAAU,GACEhY,KAAKgY,QAAQyhC,MACxBz5C,KAAKgY,QAAQyhC,MAAMh8C,eAAe87C,IAASA,IAASv5C,KAAKgY,QAAQ0hC,cACjEjkC,EAAOuC,QAAQxX,KAAK+4C,GAG5B,OAAO9jC,QDjCHyjC,CADZJ,WE1BqBa,EAAiBl4C,GAgFtC,kBA9EI,WAAYpE,GACR2C,KAAK3C,QAAUA,EA2EvB,OAxEI47C,kBAAA,SAAMvsC,EAAUrP,EAAS2a,GACrB,IAAM6gC,EAAkB,IAAIc,EACxB,CACIC,wBAAyB5hC,EAAQuuB,qBACjC75B,WACAmtC,YAAa7hC,EAAQ9B,SACrB4jC,kBAAmB95C,KAAK3C,QAAQy8C,kBAChCC,aAAc/5C,KAAK3C,QAAQ08C,aAC3BC,eAAgBh6C,KAAK3C,QAAQ48C,wBAC7BC,kBAAmBl6C,KAAK3C,QAAQ68C,kBAChCC,kBAAmBn6C,KAAK3C,QAAQ88C,kBAChCC,kBAAmBp6C,KAAK3C,QAAQ+8C,kBAChCC,mBAAoBr6C,KAAK3C,QAAQg9C,mBACjCC,oBAAqBt6C,KAAK3C,QAAQi9C,oBAClCC,2BAA4Bv6C,KAAK3C,QAAQk9C,6BAG3CzvB,EAAM+tB,EAAgB/nC,MAAMzT,GASlC,OARA2C,KAAKq5C,UAAYR,EAAgBQ,UACjCr5C,KAAK+5C,aAAelB,EAAgBkB,aAChC/5C,KAAK3C,QAAQm9C,yBACbx6C,KAAKw6C,uBAAyB3B,EAAgB4B,kBAAkBz6C,KAAK3C,QAAQm9C,8BAE1ChuC,IAAnCxM,KAAK3C,QAAQ68C,wBAAyD1tC,IAAtBxM,KAAK+5C,eACrD/5C,KAAK+5C,aAAelB,EAAgB6B,eAAe16C,KAAK+5C,eAErDjvB,EAAM9qB,KAAK26C,mBAGtB1B,4BAAA,WAEI,IAAIc,EAAe/5C,KAAK+5C,aACxB,GAAI/5C,KAAK3C,QAAQi9C,oBAAqB,CAClC,QAAuB9tC,IAAnBxM,KAAKq5C,UACL,MAAO,GAEXU,EAAe,gCAAgCt4C,EAAY+0C,aAAax2C,KAAKq5C,WAGjF,OAAIr5C,KAAK3C,QAAQk9C,2BACN,GAGPR,EACO,wBAAwBA,QAE5B,IAGXd,iCAAA,WACI,OAAOj5C,KAAKq5C,WAGhBJ,iCAAA,SAAqBI,GACjBr5C,KAAKq5C,UAAYA,GAGrBJ,qBAAA,WACI,OAAOj5C,KAAK3C,QAAQi9C,qBAGxBrB,4BAAA,WACI,OAAOj5C,KAAK+5C,cAGhBd,8BAAA,WACI,OAAOj5C,KAAK3C,QAAQ48C,yBAGxBhB,6BAAA,WACI,OAAOj5C,KAAKw6C,6BFlDDvB,CADnBJ,WGzBqBp3C,GAgJrB,kBA9II,WAAYpE,GACR2C,KAAK46C,KAAO,GACZ56C,KAAK66C,UAAYx9C,EAAQqP,SACzB1M,KAAK86C,aAAez9C,EAAQw8C,YAC5B75C,KAAK+6C,yBAA2B19C,EAAQu8C,wBACpCv8C,EAAQy8C,oBACR95C,KAAKg7C,mBAAqB39C,EAAQy8C,kBAAkB38C,QAAQ,MAAO,MAEvE6C,KAAKi7C,gBAAkB59C,EAAQ28C,eAC/Bh6C,KAAK+5C,aAAe18C,EAAQ08C,aACxB18C,EAAQ68C,oBACRl6C,KAAKk7C,mBAAqB79C,EAAQ68C,kBAAkB/8C,QAAQ,MAAO,MAEnEE,EAAQ88C,mBACRn6C,KAAKm7C,mBAAqB99C,EAAQ88C,kBAAkBh9C,QAAQ,MAAO,KACQ,MAAvE6C,KAAKm7C,mBAAmBznC,OAAO1T,KAAKm7C,mBAAmBr8C,OAAS,KAChEkB,KAAKm7C,oBAAsB,MAG/Bn7C,KAAKm7C,mBAAqB,GAE9Bn7C,KAAKo7C,mBAAqB/9C,EAAQ+8C,kBAClCp6C,KAAKq7C,+BAAiC55C,EAAY65C,wBAElDt7C,KAAKu7C,YAAc,EACnBv7C,KAAKw7C,QAAU,EAmHvB,OAhHI7B,2BAAA,SAAen+B,GAQX,OAPIxb,KAAKk7C,oBAAgE,IAA1C1/B,EAAKnK,QAAQrR,KAAKk7C,sBAEtB,QADvB1/B,EAAOA,EAAKsS,UAAU9tB,KAAKk7C,mBAAmBp8C,SACrC4U,OAAO,IAAkC,MAAnB8H,EAAK9H,OAAO,KACvC8H,EAAOA,EAAKsS,UAAU,KAIvBtS,GAGXm+B,8BAAA,SAAkBp4C,GAGd,OAFAA,EAAWA,EAASpE,QAAQ,MAAO,KACnCoE,EAAWvB,KAAK06C,eAAen5C,IACvBvB,KAAKm7C,oBAAsB,IAAM55C,GAG7Co4C,gBAAA,SAAI5rC,EAAOf,EAAUgB,EAAO4K,GAGxB,GAAK7K,EAAL,CAIA,IAAIwI,EAAOklC,EAAaC,EAASC,EAAej7C,EAEhD,GAAIsM,GAAYA,EAASzL,SAAU,CAC/B,IAAIq6C,EAAc57C,KAAK86C,aAAa9tC,EAASzL,UAY7C,GATIvB,KAAK+6C,yBAAyB/tC,EAASzL,aAEvCyM,GAAShO,KAAK+6C,yBAAyB/tC,EAASzL,WACpC,IAAKyM,EAAQ,GAEzB4tC,EAAcA,EAAYrpC,MAAMvS,KAAK+6C,yBAAyB/tC,EAASzL,iBAIvDiL,IAAhBovC,EACA,OAKJD,GADAF,GADAG,EAAcA,EAAY9tB,UAAU,EAAG9f,IACbyC,MAAM,OACJgrC,EAAY38C,OAAS,GAMrD,GAFA48C,GADAnlC,EAAQxI,EAAM0C,MAAM,OACJ8F,EAAMzX,OAAS,GAE3BkO,GAAYA,EAASzL,SACrB,GAAKqX,EAKD,IAAKlY,EAAI,EAAGA,EAAI6V,EAAMzX,OAAQ4B,IAC1BV,KAAK67C,oBAAoBC,WAAW,CAAEC,UAAW,CAAE9nC,KAAMjU,KAAKu7C,YAAc76C,EAAI,EAAGwT,OAAc,IAANxT,EAAUV,KAAKw7C,QAAU,GAChHxgC,SAAU,CAAE/G,KAAMwnC,EAAY38C,OAAS4B,EAAGwT,OAAc,IAANxT,EAAUi7C,EAAc78C,OAAS,GACnFk9C,OAAQh8C,KAAKy6C,kBAAkBztC,EAASzL,iBAPhDvB,KAAK67C,oBAAoBC,WAAW,CAAEC,UAAW,CAAE9nC,KAAMjU,KAAKu7C,YAAc,EAAGrnC,OAAQlU,KAAKw7C,SACxFxgC,SAAU,CAAE/G,KAAMwnC,EAAY38C,OAAQoV,OAAQynC,EAAc78C,QAC5Dk9C,OAAQh8C,KAAKy6C,kBAAkBztC,EAASzL,YAU/B,IAAjBgV,EAAMzX,OACNkB,KAAKw7C,SAAWE,EAAQ58C,QAExBkB,KAAKu7C,aAAehlC,EAAMzX,OAAS,EACnCkB,KAAKw7C,QAAUE,EAAQ58C,QAG3BkB,KAAK46C,KAAKp6C,KAAKuN,KAGnB4rC,oBAAA,WACI,OAA4B,IAArB35C,KAAK46C,KAAK97C,QAGrB66C,kBAAA,SAAMhsC,GAGF,GAFA3N,KAAK67C,oBAAsB,IAAI77C,KAAKq7C,+BAA+B,CAAE9B,KAAMv5C,KAAKi7C,gBAAiBgB,WAAY,OAEzGj8C,KAAKo7C,mBACL,IAAK,IAAM75C,KAAYvB,KAAK86C,aACxB,GAAI96C,KAAK86C,aAAar9C,eAAe8D,GAAW,CAC5C,IAAIy6C,EAASh8C,KAAK86C,aAAav5C,GAC3BvB,KAAK+6C,yBAAyBx5C,KAC9By6C,EAASA,EAAOzpC,MAAMvS,KAAK+6C,yBAAyBx5C,KAExDvB,KAAK67C,oBAAoBK,iBAAiBl8C,KAAKy6C,kBAAkBl5C,GAAWy6C,GAOxF,GAFAh8C,KAAK66C,UAAUhtC,OAAOF,EAAS3N,MAE3BA,KAAK46C,KAAK97C,OAAS,EAAG,CACtB,IAAIi7C,SACEoC,EAAmBz+C,KAAK0+C,UAAUp8C,KAAK67C,oBAAoBQ,UAE7Dr8C,KAAK+5C,aACLA,EAAe/5C,KAAK+5C,aACb/5C,KAAKg7C,qBACZjB,EAAe/5C,KAAKg7C,oBAExBh7C,KAAK+5C,aAAeA,EAEpB/5C,KAAKq5C,UAAY8C,EAGrB,OAAOn8C,KAAK46C,KAAK1sC,KAAK,UHnHZyrC,CADlBl4C,EAAc,IAAIH,EAAYG,EAAaV,IAEUU,IAErDu3C,WItBoBv3C,GAgLpB,kBArKI,WAAYwnB,EAAMtb,EAAS2uC,GACvBt8C,KAAKipB,KAAOA,EACZjpB,KAAK05C,aAAe4C,EAAa/6C,SACjCvB,KAAKqb,MAAQ1N,EAAQ0N,OAAS,GAC9Brb,KAAKkW,SAAW,GAChBlW,KAAKumC,qBAAuB,GAC5BvmC,KAAKu8C,KAAO5uC,EAAQ4uC,KACpBv8C,KAAKF,MAAQ,KACbE,KAAK2N,QAAUA,EAEf3N,KAAKw8C,MAAQ,GACbx8C,KAAKy5C,MAAQ,GAwJrB,OA7IIgD,iBAAA,SAAKjhC,EAAMqV,EAAoBzd,EAAiB43B,EAAevlB,GAC3D,IAAMuzB,EAAgBh5C,KAAM08C,EAAe18C,KAAK2N,QAAQ/L,cAAcs2C,OAEtEl4C,KAAKw8C,MAAMh8C,KAAKgb,GAEhB,IAAMmhC,EAAiB,SAAUl9C,EAAGkf,EAAM+Y,GACtCshB,EAAcwD,MAAM77C,OAAOq4C,EAAcwD,MAAMnrC,QAAQmK,GAAO,GAE9D,IAAMohC,EAAqBllB,IAAashB,EAAcU,aAClD1O,EAAcnT,UAAYp4B,GAC1BgmB,EAAS,KAAM,CAAChI,MAAM,KAAK,EAAO,MAClC9b,EAAOxB,KAAK,YAAYu3B,iFAMnBshB,EAAcS,MAAM/hB,IAAcsT,EAAc3xB,SACjD2/B,EAAcS,MAAM/hB,GAAY,CAAE/Y,OAAMthB,QAAS2tC,IAEjDvrC,IAAMu5C,EAAcl5C,QAASk5C,EAAcl5C,MAAQL,GACvDgmB,EAAShmB,EAAGkf,EAAMi+B,EAAoBllB,KAIxCmlB,EAAc,CAChBvnC,YAAatV,KAAK2N,QAAQ2H,YAC1BugC,UAAWziC,EAAgByiC,UAC3Bt5B,SAAUnJ,EAAgBmJ,SAC1Bm9B,aAActmC,EAAgBsmC,cAG5B53C,EAAcL,EAAYw0C,eAAez6B,EAAMpI,EAAgB5R,iBAAkBxB,KAAK2N,QAASlM,GAErG,GAAKK,EAAL,CAKA,IA6DIg7C,EACAC,EA9DEC,EAAmB,SAASF,GAC9B,IAAI/pB,EACEkqB,EAAmBH,EAAWv7C,SAC9B2U,EAAW4mC,EAAW5mC,SAAS/Y,QAAQ,UAAW,IAUxD0/C,EAAYr7C,iBAAmBM,EAAYkpB,QAAQiyB,GAC/CJ,EAAYvnC,cACZunC,EAAYtgC,SAAWza,EAAYoM,KAC9B8qC,EAAcrrC,QAAQ4O,UAAY,GACnCza,EAAYo7C,SAASL,EAAYr7C,iBAAkBq7C,EAAYhH,aAE9D/zC,EAAYq7C,eAAeN,EAAYtgC,WAAaza,EAAYs7C,4BACjEP,EAAYtgC,SAAWza,EAAYoM,KAAK2uC,EAAYhH,UAAWgH,EAAYtgC,YAGnFsgC,EAAYt7C,SAAW07C,EAEvB,IAAMI,EAAS,IAAIviC,EAASM,MAAM49B,EAAcrrC,SAEhD0vC,EAAO3W,gBAAiB,EACxBsS,EAAc9iC,SAAS+mC,GAAoB/mC,GAEvC9C,EAAgB+X,WAAa6f,EAAc7f,aAC3C0xB,EAAY1xB,WAAY,GAGxB6f,EAAc9f,UACd6H,EAAS2pB,EAAaY,WAAWpnC,EAAUmnC,EAAQrE,EAAehO,EAAcM,WAAYuR,cACtEjnC,EAClB+mC,EAAe5pB,EAAQ,KAAMkqB,GAG7BN,EAAe,KAAM5pB,EAAQkqB,GAE1BjS,EAAc3xB,OACrBsjC,EAAe,KAAMzmC,EAAU+mC,IAK3BjE,EAAcS,MAAMwD,IAChBjE,EAAcS,MAAMwD,GAAkB5/C,QAAQ85B,UAC9C6T,EAAc7T,SAKlB,IAAIiO,GAAOiY,EAAQrE,EAAe6D,GAAal/C,MAAMuY,GAAU,SAAUzW,EAAGkf,GACxEg+B,EAAel9C,EAAGkf,EAAMs+B,MAJ5BN,EAAe,KAAM3D,EAAcS,MAAMwD,GAAkBt+B,KAAMs+B,IAWvEtvC,EAAUooC,EAAY/1C,KAAK2N,SAE7BkjB,IACAljB,EAAQijB,IAAMoa,EAAc9f,SAAW,MAAQ,SAG/C8f,EAAc9f,UACdvd,EAAQ4uC,KAAO,yBAEX5uC,EAAQ4vC,WACRT,EAAaJ,EAAac,eAAehiC,EAAMpI,EAAgB5R,iBAAkBmM,EAASlM,EAAaK,GAEvGi7C,EAAUL,EAAae,WAAWjiC,EAAMpI,EAAgB5R,iBAAkBmM,EAASlM,EAAaK,IAIhG6L,EAAQ4vC,WACRT,EAAah7C,EAAYw0C,aAAa96B,EAAMpI,EAAgB5R,iBAAkBmM,EAASlM,GAEvFs7C,EAAUj7C,EAAY47C,SAASliC,EAAMpI,EAAgB5R,iBAAkBmM,EAASlM,GAC5E,SAACsW,EAAK+kC,GACE/kC,EACA4kC,EAAe5kC,GAEfilC,EAAiBF,MAKjCA,EACKA,EAAWv7C,SAGZy7C,EAAiBF,GAFjBH,EAAeG,GAIZC,GACPA,EAAQY,KAAKX,EAAkBL,QAvG/BA,EAAe,CAAE5mC,QAAS,qCAAqCyF,UJ9C3DihC,CAAch7C,GAE9B,IAqCIkO,EArCEiuC,WK5Bcn8C,EAAay3C,EAAWuD,GAC5C,IAAMmB,EAAS,SAAU3nC,EAAO5Y,EAASooB,GASrC,GARuB,mBAAZpoB,GACPooB,EAAWpoB,EACXA,EAAUwgD,EAAkB79C,KAAK3C,QAAS,KAG1CA,EAAUwgD,EAAkB79C,KAAK3C,QAASA,GAAW,KAGpDooB,EAAU,CACX,IAAMq4B,EAAO99C,KACb,OAAO,IAAI+9C,SAAQ,SAAUC,EAASC,GAClCL,EAAO9tC,KAAKguC,EAAM7nC,EAAO5Y,GAAS,SAAS0a,EAAK5J,GACxC4J,EACAkmC,EAAOlmC,GAEPimC,EAAQ7vC,SAKpBnO,KAAKrC,MAAMsY,EAAO5Y,GAAS,SAAS0a,EAAK4G,EAAM3G,EAAS3a,GACpD,GAAI0a,EAAO,OAAO0N,EAAS1N,GAE3B,IAAItC,EACJ,IAEIA,EADkB,IAAIyjC,EAAUv6B,EAAM3G,GACnBlH,MAAMzT,GAE7B,MAAO0a,GAAO,OAAO0N,EAAS1N,GAE9B0N,EAAS,KAAMhQ,OAK3B,OAAOmoC,ELTQM,CAAOz8C,EAAas3C,GAC7Bp7C,WMzBc8D,EAAay3C,EAAWuD,GAC5C,IAAM9+C,EAAQ,SAAUsY,EAAO5Y,EAASooB,GAUpC,GARuB,mBAAZpoB,GACPooB,EAAWpoB,EACXA,EAAUwgD,EAAkB79C,KAAK3C,QAAS,KAG1CA,EAAUwgD,EAAkB79C,KAAK3C,QAASA,GAAW,KAGpDooB,EAAU,CACX,IAAMq4B,EAAO99C,KACb,OAAO,IAAI+9C,SAAQ,SAAUC,EAASC,GAClCtgD,EAAMmS,KAAKguC,EAAM7nC,EAAO5Y,GAAS,SAAS0a,EAAK5J,GACvC4J,EACAkmC,EAAOlmC,GAEPimC,EAAQ7vC,SAKpB,IAAIgwC,EACA7B,SACE8B,EAAgB,IAAIhG,GAAcp4C,MAAO3C,EAAQghD,oBAMvD,GAJAhhD,EAAQuE,cAAgBw8C,EAExBD,EAAU,IAAIrjC,EAASM,MAAM/d,GAEzBA,EAAQi/C,aACRA,EAAej/C,EAAQi/C,iBACpB,CACH,IAAM/6C,EAAWlE,EAAQkE,UAAY,QAC/Bs0C,EAAYt0C,EAASpE,QAAQ,YAAa,KAChDm/C,EAAe,CACX/6C,WACA+T,YAAa6oC,EAAQ7oC,YACrBiH,SAAU4hC,EAAQ5hC,UAAY,GAC9B/a,iBAAkBq0C,EAClBA,YACA6D,aAAcn4C,IAGDgb,UAAgD,MAApC+/B,EAAa//B,SAAShK,OAAO,KACtD+pC,EAAa//B,UAAY,KAIjC,IAAM+hC,EAAU,IAAI7B,EAAcz8C,KAAMm+C,EAAS7B,GACjDt8C,KAAKg5C,cAAgBsF,EAKjBjhD,EAAQi2B,SACRj2B,EAAQi2B,QAAQ9lB,SAAQ,SAASulB,GAC7B,IAAIwrB,EAAYroC,EAChB,GAAI6c,EAAOyrB,aAGP,GAFAtoC,EAAW6c,EAAOyrB,YAAYrhD,QAAQ,UAAW,KACjDohD,EAAaH,EAAclG,OAAOoF,WAAWpnC,EAAUioC,EAASG,EAASvrB,EAAO11B,QAAS01B,EAAOxxB,qBACtEqU,EACtB,OAAO6P,EAAS84B,QAIpBH,EAActrB,UAAUC,MAKpC,IAAIqS,GAAO+Y,EAASG,EAAShC,GACxB3+C,MAAMsY,GAAO,SAAUxW,EAAGkf,GACvB,GAAIlf,EAAK,OAAOgmB,EAAShmB,GACzBgmB,EAAS,KAAM9G,EAAM2/B,EAASjhD,KAC/BA,IAGf,OAAOM,ENtDOyd,CAAM3Z,EAAas3C,EAAWC,GAEtCyF,EAAU,CACZxrB,QAAS,CAAC,EAAG,EAAG,GAChByrB,OACAhsB,QACApxB,cACAovB,uBACAsB,wBACAvwB,cACAynB,YACAkc,UACAnkC,UAAWA,GAAUQ,GACrBqZ,WACA6+B,gBAAiBd,EACjBI,iBAAkBH,EAClBI,UAAWH,EACX0D,cAAezD,EACf4E,SACAjgD,QACAiY,YACAujC,iBACA9a,QACA+Z,iBACAz2C,UAKEg9C,EAAO,SAAShvC,GAClB,OAAO,WACH,IAAM4E,EAAM1H,OAAO2C,OAAOG,EAAEJ,WAE5B,OADAI,EAAEI,MAAMwE,EAAKjH,MAAMiC,UAAUgD,MAAMzC,KAAKD,UAAW,IAC5C0E,IAITqqC,EAAM/xC,OAAO2C,OAAOivC,GAC1B,IAAK,IAAM7uC,KAAK6uC,EAAQ/rB,KAGpB,GAAiB,mBADjB/iB,EAAI8uC,EAAQ/rB,KAAK9iB,IAEbgvC,EAAIhvC,EAAE0C,eAAiBqsC,EAAKhvC,QAI5B,IAAK,IAAMu7B,KADX0T,EAAIhvC,GAAK/C,OAAO2C,OAAO,MACPG,EAEZivC,EAAIhvC,GAAGs7B,EAAE54B,eAAiBqsC,EAAKhvC,EAAEu7B,IAc7C,OAHAuT,EAAQ9gD,MAAQ8gD,EAAQ9gD,MAAM0D,KAAKu9C,GACnCH,EAAQb,OAASa,EAAQb,OAAOv8C,KAAKu9C,GAE9BA,EDvFX,IAAIC,GAAY,kBAGhB,4DAiGA,OAjG0BzvC,OACtBijB,oCAAA,WACI,OAAO,GAGXA,iBAAA,SAAKvB,EAAUC,GACX,OAAKD,EAGE9wB,KAAKqxB,gBAAgBN,EAAWD,GAAUtV,KAFtCuV,GAKfsB,kBAAA,SAAMrB,EAAKpwB,EAAM6kB,EAAUq5B,GACvB,IAAMC,EAAM,IAAIC,eACVC,GAAQ5hD,GAAQ6hD,gBAAiB7hD,GAAQ8hD,UAU/C,SAASC,EAAeL,EAAKt5B,EAAUq5B,GAC/BC,EAAIM,QAAU,KAAON,EAAIM,OAAS,IAClC55B,EAASs5B,EAAIO,aACTP,EAAIQ,kBAAkB,kBACA,mBAAZT,GACdA,EAAQC,EAAIM,OAAQruB,GAbQ,mBAAzB+tB,EAAIS,kBACXT,EAAIS,iBAAiB,YAEzB79C,GAAOvB,MAAM,iBAAiB4wB,OAC9B+tB,EAAIU,KAAK,MAAOzuB,EAAKiuB,GACrBF,EAAIW,iBAAiB,SAAU9+C,GAAQ,4CACvCm+C,EAAIY,KAAK,MAWLtiD,GAAQ6hD,iBAAmB7hD,GAAQ8hD,UAChB,IAAfJ,EAAIM,QAAiBN,EAAIM,QAAU,KAAON,EAAIM,OAAS,IACvD55B,EAASs5B,EAAIO,cAEbR,EAAQC,EAAIM,OAAQruB,GAEjBiuB,EACPF,EAAIa,mBAAqB,WACC,GAAlBb,EAAIc,YACJT,EAAeL,EAAKt5B,EAAUq5B,IAItCM,EAAeL,EAAKt5B,EAAUq5B,IAItCzsB,qBAAA,WACI,OAAO,GAGXA,2BAAA,WACIwsB,GAAY,IAGhBxsB,qBAAA,SAAS9wB,EAAUC,EAAkBnE,EAASoE,GAItCD,IAAqBxB,KAAKm9C,eAAe57C,KACzCA,EAAWC,EAAmBD,GAGlCA,EAAWlE,EAAQuzB,IAAM5wB,KAAK6wB,mBAAmBtvB,EAAUlE,EAAQuzB,KAAOrvB,EAE1ElE,EAAUA,GAAW,GAIrB,IACMH,EADY8C,KAAKqxB,gBAAgB9vB,EAAU5B,OAAOmgD,SAAS5iD,MACrC8zB,IACtBpkB,EAAY5M,KAElB,OAAO,IAAI+9C,SAAQ,SAACC,EAASC,GACzB,GAAI5gD,EAAQ0iD,cAAgBlB,GAAU3hD,GAClC,IACI,IAAM8iD,EAAWnB,GAAU3hD,GAC3B,OAAO8gD,EAAQ,CAAE9nC,SAAU8pC,EAAUz+C,SAAUrE,EAAM+iD,QAAS,CAAEC,aAAc,IAAIC,QACpF,MAAO1gD,GACL,OAAOw+C,EAAO,CAAE18C,SAAUrE,EAAM6Y,QAAS,sBAAsB7Y,gBAAkBuC,EAAEsW,UAI3FnJ,EAAKwzC,MAAMljD,EAAMG,EAAQk/C,MAAM,SAAuBmC,EAAMwB,GAExDrB,GAAU3hD,GAAQwhD,EAGlBV,EAAQ,CAAE9nC,SAAUwoC,EAAMn9C,SAAUrE,EAAM+iD,QAAS,CAAEC,qBACtD,SAAoBb,EAAQruB,GAC3BitB,EAAO,CAAEr9C,KAAM,OAAQmV,QAAS,IAAIib,qBAAsBquB,MAAWniD,mBA7F3DwzB,gBAmGVzb,EAAMorC,GAGlB,OAFAhjD,GAAU4X,EACVtT,GAAS0+C,EACFhuB,mBQtGP,WAAYpJ,GAAZ,MACI/Y,0BAEAC,EAAK8Y,KAAOA,IAUpB,OAd2B7Z,OAQvB+oC,uBAAA,SAAW52C,EAAUuvB,EAAUnjB,EAASlM,EAAaK,GACjD,OAAO,IAAIi8C,SAAQ,SAACuC,EAASrC,GACzBn8C,EAAY47C,SAASn8C,EAAUuvB,EAAUnjB,EAASlM,GAC7Ck8C,KAAK2C,GAASC,MAAMtC,UAXVjsB,gBCLXryB,EAAQspB,EAAM5rB,GAkK1B,MAAO,CACHyQ,IAXJ,SAAerO,EAAG+gD,GACTnjD,EAAQojD,gBAA6C,SAA3BpjD,EAAQojD,eAED,YAA3BpjD,EAAQojD,eA7BvB,SAAsBhhD,EAAG+gD,GACrB,IACMj/C,EAAW9B,EAAE8B,UAAYi/C,EACzBE,EAAS,GACXn3B,GAAa9pB,EAAEmB,MAAQ,qBAAkBnB,EAAEsW,SAAW,+CAA6CxU,EAEjGo/C,EAAY,SAAClhD,EAAGiB,EAAGkgD,QACAp0C,IAAjB/M,EAAEoX,QAAQnW,IACVggD,EAAOlgD,KAPE,mBAOYrD,QAAQ,YAAaoT,SAAS9Q,EAAEwU,KAAM,KAAO,IAAMvT,EAAI,IACvEvD,QAAQ,YAAayjD,GACrBzjD,QAAQ,cAAesC,EAAEoX,QAAQnW,MAI1CjB,EAAEwU,OACF0sC,EAAUlhD,EAAG,EAAG,IAChBkhD,EAAUlhD,EAAG,EAAG,QAChBkhD,EAAUlhD,EAAG,EAAG,IAChB8pB,GAAW,YAAY9pB,EAAEwU,kBAAgBxU,EAAEyU,OAAS,SAAOwsC,EAAOxyC,KAAK,OAEvEzO,EAAEuW,QAAUvW,EAAEoX,SAAWxZ,EAAQwjD,UAAY,KAC7Ct3B,GAAW,kBAAkB9pB,EAAEuW,OAEnCiT,EAAKtnB,OAAO7B,MAAMypB,GAOdu3B,CAAarhD,EAAG+gD,GACyB,mBAA3BnjD,EAAQojD,gBACtBpjD,EAAQojD,eAAe,MAAOhhD,EAAG+gD,GA5JzC,SAAmB/gD,EAAG+gD,GAClB,IAGIO,EACAx3B,EAJEvrB,EAAK,sBAAsBE,EAAgBsiD,GAAY,IAEvDpX,EAAOzpC,EAAO9B,SAASU,cAAc,OAGrCmiD,EAAS,GACTn/C,EAAW9B,EAAE8B,UAAYi/C,EACzBQ,EAAiBz/C,EAAS6O,MAAM,oBAAoB,GAE1Dg5B,EAAKprC,GAAYA,EACjBorC,EAAK6X,UAAY,qBAEjB13B,EAAU,QAAO9pB,EAAEmB,MAAQ,qBAAkBnB,EAAEsW,SAAW,wCACtD,uBAAuBxU,OAAay/C,UAExC,IAAML,EAAY,SAAClhD,EAAGiB,EAAGkgD,QACAp0C,IAAjB/M,EAAEoX,QAAQnW,IACVggD,EAAOlgD,KAhBE,qEAgBYrD,QAAQ,YAAaoT,SAAS9Q,EAAEwU,KAAM,KAAO,IAAMvT,EAAI,IACvEvD,QAAQ,YAAayjD,GACrBzjD,QAAQ,cAAesC,EAAEoX,QAAQnW,MAI1CjB,EAAEwU,OACF0sC,EAAUlhD,EAAG,EAAG,IAChBkhD,EAAUlhD,EAAG,EAAG,QAChBkhD,EAAUlhD,EAAG,EAAG,IAChB8pB,GAAW,WAAW9pB,EAAEwU,kBAAgBxU,EAAEyU,OAAS,eAAawsC,EAAOxyC,KAAK,aAE5EzO,EAAEuW,QAAUvW,EAAEoX,SAAWxZ,EAAQwjD,UAAY,KAC7Ct3B,GAAW,0BAA0B9pB,EAAEuW,MAAMvF,MAAM,MAAM8B,MAAM,GAAGrE,KAAK,UAE3Ek7B,EAAK8X,UAAY33B,EAGjB43B,EAAkBxhD,EAAO9B,SAAU,CAC/B,mDACA,yBACA,sBACA,kBACA,aACA,IACA,8BACA,mBACA,sBACA,kBACA,kBACA,IACA,4BACA,kBACA,kBACA,aACA,yBACA,IACA,iCACA,kBACA,IACA,2BACA,mBACA,qBACA,yBACA,aACA,IACA,0BACA,cACA,IACA,+BACA,cACA,qBACA,uBACA,iCACA,KACFqQ,KAAK,MAAO,CAAEjQ,MAAO,kBAEvBmrC,EAAKgY,MAAM5hD,QAAU,CACjB,iCACA,yBACA,yBACA,qBACA,6BACA,0BACA,cACA,gBACA,uBACF0O,KAAK,KAEa,gBAAhB7Q,EAAQgkD,MACRN,EAAQO,aAAY,WAChB,IAAMzjD,EAAW8B,EAAO9B,SAClB2uC,EAAO3uC,EAAS2uC,KAClBA,IACI3uC,EAASO,eAAeJ,GACxBwuC,EAAK+U,aAAanY,EAAMvrC,EAASO,eAAeJ,IAEhDwuC,EAAKltC,aAAa8pC,EAAMoD,EAAKztC,YAEjCyiD,cAAcT,MAEnB,KAqDHU,CAAUhiD,EAAG+gD,IAUjBkB,OAhDJ,SAAqBlmC,GACZne,EAAQojD,gBAA6C,SAA3BpjD,EAAQojD,eAED,YAA3BpjD,EAAQojD,gBAE0B,mBAA3BpjD,EAAQojD,gBACtBpjD,EAAQojD,eAAe,SAAUjlC,GAjBzC,SAAyBA,GACrB,IAAMnO,EAAO1N,EAAO9B,SAASO,eAAe,sBAAsBF,EAAgBsd,IAC9EnO,GACAA,EAAKhO,WAAWE,YAAY8N,GAU5Bs0C,CAAgBnmC,MC9GtBne,GCTK,CAEH8uB,mBAAmB,EAGnBy1B,SAAS,EAKT1wC,UAAU,EAGV2wC,MAAM,EAONxmC,MAAO,GAGPrK,OAAO,EAKP0M,eAAe,EAGfokC,UAAU,EAKVvlC,SAAU,GAMVjH,aAAa,EAQbH,KAAM,EAGNgQ,aAAa,EAKb2gB,WAAY,KAIZC,WAAY,KAGZ1b,QAAS,IDtDjB,GAAI1qB,OAAOspB,KACP,IAAK,IAAM5W,MAAO1S,OAAOspB,KACjBtpB,OAAOspB,KAAKxrB,eAAe4U,MAC3BhV,GAAQgV,IAAO1S,OAAOspB,KAAK5W,eEbvB1S,EAAQtC,GAGpBD,EAAYC,EAAS8jD,EAAsBxhD,SAEZ6M,IAA3BnP,EAAQ6hD,iBACR7hD,EAAQ6hD,eAAiB,yDAAyDzkC,KAAK9a,EAAOmgD,SAASiC,WAS3G1kD,EAAQ4hD,MAAQ5hD,EAAQ4hD,QAAS,EACjC5hD,EAAQ8hD,UAAY9hD,EAAQ8hD,YAAa,EAGzC9hD,EAAQ2kD,KAAO3kD,EAAQ2kD,OAAS3kD,EAAQ6hD,eAAiB,IAAO,MAEhE7hD,EAAQgkD,IAAMhkD,EAAQgkD,MAAoC,aAA5B1hD,EAAOmgD,SAASmC,UACd,WAA5BtiD,EAAOmgD,SAASmC,UACY,aAA5BtiD,EAAOmgD,SAASmC,UACftiD,EAAOmgD,SAASoC,MACbviD,EAAOmgD,SAASoC,KAAKpjD,OAAS,GAClCzB,EAAQ6hD,eAAmC,cACzC,cAEN,IAAMhlC,EAAkB,6CAA6CmoB,KAAK1iC,EAAOmgD,SAAS7/B,MACtF/F,IACA7c,EAAQ6c,gBAAkBA,EAAgB,SAGjB1N,IAAzBnP,EAAQ0iD,eACR1iD,EAAQ0iD,cAAe,QAGHvzC,IAApBnP,EAAQ8kD,UACR9kD,EAAQ8kD,SAAU,GAGlB9kD,EAAQgY,eACRhY,EAAQiY,YAAc,OF1B9B8sC,CAAkBziD,OAAQtC,OAElBi2B,QAAUj2B,GAAQi2B,SAAW,GAEjC3zB,OAAO0iD,eACPhlD,GAAQi2B,QAAUj2B,GAAQi2B,QAAQpyB,OAAOvB,OAAO0iD,eAGpD,IAKIv3B,GACA7rB,GACAmiD,GAPEn4B,YGdUtpB,EAAQtC,GACpB,IAAMQ,EAAW8B,EAAO9B,SAClBorB,EAAOq5B,KAEbr5B,EAAK5rB,QAAUA,EACf,IAAMoE,EAAcwnB,EAAKxnB,YACnB4wB,EAAckwB,GAAGllD,EAAS4rB,EAAKtnB,QAC/BG,EAAc,IAAIuwB,EACxB5wB,EAAY+gD,eAAe1gD,GAC3BmnB,EAAKoJ,YAAcA,EACnBpJ,EAAKkvB,aAAeA,YCxBRlvB,EAAM5rB,GAYlBA,EAAQwjD,cAAuC,IAArBxjD,EAAQwjD,SAA2BxjD,EAAQwjD,SAA4B,gBAAhBxjD,EAAQgkD,IAVnE,EAEC,EAUlBhkD,EAAQolD,UACTplD,EAAQolD,QAAU,CAAC,CACfriD,MAAO,SAASL,GACR1C,EAAQwjD,UAhBD,GAiBP6B,QAAQrC,IAAItgD,IAGpBI,KAAM,SAASJ,GACP1C,EAAQwjD,UApBF,GAqBN6B,QAAQrC,IAAItgD,IAGpBG,KAAM,SAASH,GACP1C,EAAQwjD,UAxBF,GAyBN6B,QAAQxiD,KAAKH,IAGrBD,MAAO,SAASC,GACR1C,EAAQwjD,UA5BD,GA6BP6B,QAAQ5iD,MAAMC,OAK9B,IAAK,IAAIW,EAAI,EAAGA,EAAIrD,EAAQolD,QAAQ3jD,OAAQ4B,IACxCuoB,EAAKtnB,OAAOtB,YAAYhD,EAAQolD,QAAQ/hD,IDb5CiiD,CAAY15B,EAAM5rB,GAClB,IAAMqjD,EAASkC,GAAejjD,EAAQspB,EAAM5rB,GACtCwlD,EAAQ55B,EAAK45B,MAAQxlD,EAAQwlD,gBE1BvBljD,EAAQtC,EAASsE,GAC7B,IAAIkhD,EAAQ,KACZ,GAAoB,gBAAhBxlD,EAAQgkD,IACR,IACIwB,OAAwC,IAAxBljD,EAAOmjD,aAAgC,KAAOnjD,EAAOmjD,aACvE,MAAOllD,IAEb,MAAO,CACHmlD,OAAQ,SAASvnC,EAAM0kC,EAAcna,EAAYjoC,GAC7C,GAAI+kD,EAAO,CACPlhD,EAAOxB,KAAK,UAAUqb,gBACtB,IACIqnC,EAAMG,QAAQxnC,EAAM1d,GACpB+kD,EAAMG,QAAWxnC,eAAkB0kC,GAC/Bna,GACA8c,EAAMG,QAAWxnC,UAAa9d,KAAK0+C,UAAUrW,IAEnD,MAAOtmC,GAELkC,EAAO7B,MAAM,mBAAmB0b,wCAI5CynC,OAAQ,SAASznC,EAAMykC,EAASla,GAC5B,IAAMjb,EAAY+3B,GAASA,EAAMK,QAAQ1nC,GACnC2nC,EAAYN,GAASA,EAAMK,QAAW1nC,gBACxC2E,EAAY0iC,GAASA,EAAMK,QAAW1nC,WAK1C,GAHAuqB,EAAaA,GAAc,GAC3B5lB,EAAOA,GAAQ,KAEXgjC,GAAalD,EAAQC,cACpB,IAAIC,KAAKF,EAAQC,cAAckD,YAC5B,IAAIjD,KAAKgD,GAAWC,WACxB1lD,KAAK0+C,UAAUrW,KAAgB5lB,EAE/B,OAAO2K,IFVyBu4B,CAAM1jD,EAAQtC,EAAS4rB,EAAKtnB,oBGxBxE,SAAS2hD,IACL,KAAM,CACF1iD,KAAM,UACNmV,QAAS,qEAIjB,IAAMwtC,EAAiB,CACnBC,aAAc,SAAS9N,GAEnB,OADA4N,KACQ,GAEZG,cAAe,SAAS/N,GAEpB,OADA4N,KACQ,GAEZI,eAAgB,SAAShO,GAErB,OADA4N,KACQ,IAIhBxkC,EAAiB9B,YAAYumC,GHG7BI,CAAU16B,EAAKxnB,aAGXpE,EAAQ4D,WACRgoB,EAAKhoB,UAAU6d,iBAAiB9B,YAAY3f,EAAQ4D,WAGxD,IAAM2iD,EAAc,oBAEpB,SAAStvC,EAAMC,GACX,IAAMC,EAAS,GACf,IAAK,IAAMC,KAAQF,EACXA,EAAI9W,eAAegX,KACnBD,EAAOC,GAAQF,EAAIE,IAG3B,OAAOD,EAIX,SAASnT,EAAKoV,EAAMotC,GAChB,IAAMC,EAAYx2C,MAAMiC,UAAUgD,MAAMzC,KAAKD,UAAW,GACxD,OAAO,WACH,IAAMsB,EAAO2yC,EAAU5iD,OAAOoM,MAAMiC,UAAUgD,MAAMzC,KAAKD,UAAW,IACpE,OAAO4G,EAAK1G,MAAM8zC,EAAS1yC,IAInC,SAAS4yC,EAAWhe,GAIhB,IAHA,IACIqb,EADEtjD,EAASD,EAASqB,qBAAqB,SAGpCwB,EAAI,EAAGA,EAAI5C,EAAOgB,OAAQ4B,IAE/B,IADA0gD,EAAQtjD,EAAO4C,IACLE,KAAKwP,MAAMwzC,GAAc,CAC/B,IAAMI,EAAkB1vC,EAAMjX,GAC9B2mD,EAAgBje,WAAaA,EAC7B,IAAMia,EAAWoB,EAAMF,WAAa,GACpC8C,EAAgBziD,SAAW1D,EAASiiD,SAAS5iD,KAAKC,QAAQ,OAAQ,IAIlE8rB,EAAK20B,OAAOoC,EAAUgE,EAClB3iD,GAAK,SAAC+/C,EAAO3hD,EAAGgW,GACRhW,EACAihD,EAAO5yC,IAAIrO,EAAG,WAEd2hD,EAAMxgD,KAAO,WACTwgD,EAAM1iD,WACN0iD,EAAM1iD,WAAWc,QAAUiW,EAAOqV,IAElCs2B,EAAMF,UAAYzrC,EAAOqV,OAGlC,KAAMs2B,KAKzB,SAAS6C,EAAelmD,EAAO0nB,EAAUy+B,EAAQC,EAAWpe,GAExD,IAAMie,EAAkB1vC,EAAMjX,GAC9BD,EAAY4mD,EAAiBjmD,GAC7BimD,EAAgBzH,KAAOx+C,EAAM6C,KAEzBmlC,IACAie,EAAgBje,WAAaA,GA6CjCjkC,EAAY47C,SAAS3/C,EAAMb,KAAM,KAAM8mD,EAAiBviD,GACnDk8C,MAAK,SAAAb,IA3CV,SAAiCA,GAC7B,IAAM4B,EAAO5B,EAAW5mC,SAClBsF,EAAOshC,EAAWv7C,SAClB0+C,EAAUnD,EAAWmD,QAErBpD,EAAc,CAChBr7C,iBAAkBM,EAAYkpB,QAAQxP,GACtCja,SAAUia,EACVk+B,aAAcl+B,EACdlG,YAAa0uC,EAAgB1uC,aAMjC,GAHAunC,EAAYhH,UAAYgH,EAAYr7C,iBACpCq7C,EAAYtgC,SAAWynC,EAAgBznC,UAAYsgC,EAAYr7C,iBAE3Dy+C,EAAS,CACTA,EAAQkE,UAAYA,EAEpB,IAAMr5B,EAAM+3B,EAAMI,OAAOznC,EAAMykC,EAAS+D,EAAgBje,YACxD,IAAKme,GAAUp5B,EAGX,OAFAm1B,EAAQmE,OAAQ,OAChB3+B,EAAS,KAAMqF,EAAK4zB,EAAM3gD,EAAOkiD,EAASzkC,GAOlDklC,EAAOgB,OAAOlmC,GAEdwoC,EAAgB1H,aAAeO,EAC/B5zB,EAAK20B,OAAOc,EAAMsF,GAAiB,SAACvkD,EAAGgW,GAC/BhW,GACAA,EAAEvC,KAAOse,EACTiK,EAAShmB,KAETojD,EAAME,OAAOhlD,EAAMb,KAAM+iD,EAAQC,aAAc8D,EAAgBje,WAAYtwB,EAAOqV,KAClFrF,EAAS,KAAMhQ,EAAOqV,IAAK4zB,EAAM3gD,EAAOkiD,EAASzkC,OAOrD6oC,CAAwBvH,MACzByD,OAAM,SAAAxoC,GACL2qC,QAAQrC,IAAItoC,GACZ0N,EAAS1N,MAKrB,SAASusC,EAAgB7+B,EAAUy+B,EAAQne,GACvC,IAAK,IAAIrlC,EAAI,EAAGA,EAAIuoB,EAAKs7B,OAAOzlD,OAAQ4B,IACpCujD,EAAeh7B,EAAKs7B,OAAO7jD,GAAI+kB,EAAUy+B,EAAQj7B,EAAKs7B,OAAOzlD,QAAU4B,EAAI,GAAIqlC,GAmIvF,OA3GA9c,EAAKu7B,MAAU,WAMX,OALKv7B,EAAKw7B,YACNx7B,EAAKo4B,IAAM,cArBE,gBAAbp4B,EAAKo4B,MACLp4B,EAAKy7B,WAAapD,aAAY,WACtBr4B,EAAKw7B,YACL3iD,EAAY6iD,iBACZL,GAAgB,SAAC7kD,EAAGqrB,EAAKltB,EAAGG,EAAOkiD,GAC3BxgD,EACAihD,EAAO5yC,IAAIrO,EAAGA,EAAEvC,MAAQa,EAAMb,MACvB4tB,GACPq2B,EAAkBxhD,EAAO9B,SAAUitB,EAAK/sB,SAIrDV,EAAQ2kD,QAYfhiD,KAAKykD,WAAY,GACV,GAGXx7B,EAAK27B,QAAU,WAAqE,OAAxDpD,cAAcv4B,EAAKy7B,YAAa1kD,KAAKykD,WAAY,GAAc,GAM3Fx7B,EAAK47B,+BAAiC,WAClC,IAAMC,EAAQjnD,EAASqB,qBAAqB,QAC5C+pB,EAAKs7B,OAAS,GAEd,IAAK,IAAI7jD,EAAI,EAAGA,EAAIokD,EAAMhmD,OAAQ4B,KACT,oBAAjBokD,EAAMpkD,GAAGqkD,KAA8BD,EAAMpkD,GAAGqkD,IAAI30C,MAAM,eACzD00C,EAAMpkD,GAAGE,KAAKwP,MAAMwzC,KACrB36B,EAAKs7B,OAAO/jD,KAAKskD,EAAMpkD,KASnCuoB,EAAK+7B,oBAAsB,WAAM,OAAA,IAAIjH,SAAQ,SAACC,EAASC,GACnDh1B,EAAK47B,iCACL7G,QAOJ/0B,EAAK8c,WAAa,SAAAkf,GAAU,OAAAh8B,EAAKi8B,SAAQ,EAAMD,GAAQ,IAEvDh8B,EAAKi8B,QAAU,SAAChB,EAAQne,EAAY4e,GAIhC,OAHKT,GAAUS,KAAsC,IAAnBA,GAC9B7iD,EAAY6iD,iBAET,IAAI5G,SAAQ,SAACC,EAASC,GACzB,IAAIkH,EACAC,EACAC,EACAC,EACJH,EAAYC,EAAU,IAAIjF,KAKF,KAFxBmF,EAAkBr8B,EAAKs7B,OAAOzlD,SAI1BsmD,EAAU,IAAIjF,KACdkF,EAAoBD,EAAUD,EAC9Bl8B,EAAKtnB,OAAOxB,KAAK,gDACjB69C,EAAQ,CACJmH,YACAC,UACAC,oBACAd,OAAQt7B,EAAKs7B,OAAOzlD,UAKxBwlD,GAAgB,SAAC7kD,EAAGqrB,EAAKltB,EAAGG,EAAOkiD,GAC/B,GAAIxgD,EAGA,OAFAihD,EAAO5yC,IAAIrO,EAAGA,EAAEvC,MAAQa,EAAMb,WAC9B+gD,EAAOx+C,GAGPwgD,EAAQmE,MACRn7B,EAAKtnB,OAAOxB,KAAK,WAAWpC,EAAMb,qBAElC+rB,EAAKtnB,OAAOxB,KAAK,YAAYpC,EAAMb,uBAEvCikD,EAAkBxhD,EAAO9B,SAAUitB,EAAK/sB,GACxCkrB,EAAKtnB,OAAOxB,KAAK,WAAWpC,EAAMb,uBAAqB,IAAIijD,KAASiF,SAM5C,MAHxBE,IAIID,EAAoB,IAAIlF,KAASgF,EACjCl8B,EAAKtnB,OAAOxB,KAAK,uCAAuCklD,QACxDrH,EAAQ,CACJmH,YACAC,UACAC,oBACAd,OAAQt7B,EAAKs7B,OAAOzlD,UAG5BsmD,EAAU,IAAIjF,OACf+D,EAAQne,GAGfge,EAAWhe,OAInB9c,EAAKs8B,cAAgBxB,EACd96B,EH/PEtK,CAAKhf,OAAQtC,IAU1B,SAASmoD,GAAgB9G,GACjBA,EAAKn9C,UACLmhD,QAAQxiD,KAAKw+C,GAEZrhD,GAAQ4hD,OACThgD,GAAKM,YAAY6hD,WAZzBzhD,OAAOspB,KAAOA,GAgBV5rB,GAAQ8kD,UACJ,SAAS1nC,KAAK9a,OAAOmgD,SAAS7/B,OAC9BgJ,GAAKu7B,QAGJnnD,GAAQ4hD,QACTn0B,GAAM,oCACN7rB,GAAOpB,SAASoB,MAAQpB,SAASqB,qBAAqB,QAAQ,IAC9DkiD,GAAQvjD,SAASU,cAAc,UAEzBqC,KAAO,WACTwgD,GAAM1iD,WACN0iD,GAAM1iD,WAAWc,QAAUsrB,GAE3Bs2B,GAAMziD,YAAYd,SAASe,eAAeksB,KAG9C7rB,GAAKN,YAAYyiD,KAErBn4B,GAAK47B,iCACL57B,GAAKw8B,iBAAmBx8B,GAAKi8B,QAAqB,gBAAbj8B,GAAKo4B,KAAuB1D,KAAK6H,GAAiBA"} \ No newline at end of file diff --git a/packages/less/dist/less.js b/packages/less/dist/less.js index 8305c57f9..06749c853 100644 --- a/packages/less/dist/less.js +++ b/packages/less/dist/less.js @@ -1,5 +1,5 @@ /** - * Less - Leaner CSS v3.12.2 + * Less - Leaner CSS v3.12.1-alpha.13+ed734098 * http://lesscss.org * * Copyright (c) 2009-2020, Alexis Sellier @@ -9,11326 +9,11303 @@ */ (function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : - typeof define === 'function' && define.amd ? define(factory) : - (global = global || self, global.less = factory()); + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, global.less = factory()); }(this, (function () { 'use strict'; - // Export a new default each time - var defaultOptions = (function () { return ({ - /* Inline Javascript - @plugin still allowed */ - javascriptEnabled: false, - /* Outputs a makefile import dependency list to stdout. */ - depends: false, - /* (DEPRECATED) Compress using less built-in compression. - * This does an okay job but does not utilise all the tricks of - * dedicated css compression. */ - compress: false, - /* Runs the less parser and just reports errors without any output. */ - lint: false, - /* Sets available include paths. - * If the file in an @import rule does not exist at that exact location, - * less will look for it at the location(s) passed to this option. - * You might use this for instance to specify a path to a library which - * you want to be referenced simply and relatively in the less files. */ - paths: [], - /* color output in the terminal */ - color: true, - /* The strictImports controls whether the compiler will allow an @import inside of either - * @media blocks or (a later addition) other selector blocks. - * See: https://github.com/less/less.js/issues/656 */ - strictImports: false, - /* Allow Imports from Insecure HTTPS Hosts */ - insecure: false, - /* Allows you to add a path to every generated import and url in your css. - * This does not affect less import statements that are processed, just ones - * that are left in the output css. */ - rootpath: '', - /* By default URLs are kept as-is, so if you import a file in a sub-directory - * that references an image, exactly the same URL will be output in the css. - * This option allows you to re-write URL's in imported files so that the - * URL is always relative to the base imported file */ - rewriteUrls: false, - /* How to process math - * 0 always - eagerly try to solve all operations - * 1 parens-division - require parens for division "/" - * 2 parens | strict - require parens for all operations - * 3 strict-legacy - legacy strict behavior (super-strict) - */ - math: 0, - /* Without this option, less attempts to guess at the output unit when it does maths. */ - strictUnits: false, - /* Effectively the declaration is put at the top of your base Less file, - * meaning it can be used but it also can be overridden if this variable - * is defined in the file. */ - globalVars: null, - /* As opposed to the global variable option, this puts the declaration at the - * end of your base file, meaning it will override anything defined in your Less file. */ - modifyVars: null, - /* This option allows you to specify a argument to go on to every URL. */ - urlArgs: '' - }); }); + // Export a new default each time + function defaultOptions () { + return { + /* Inline Javascript - @plugin still allowed */ + javascriptEnabled: false, + /* Outputs a makefile import dependency list to stdout. */ + depends: false, + /* (DEPRECATED) Compress using less built-in compression. + * This does an okay job but does not utilise all the tricks of + * dedicated css compression. */ + compress: false, + /* Runs the less parser and just reports errors without any output. */ + lint: false, + /* Sets available include paths. + * If the file in an @import rule does not exist at that exact location, + * less will look for it at the location(s) passed to this option. + * You might use this for instance to specify a path to a library which + * you want to be referenced simply and relatively in the less files. */ + paths: [], + /* color output in the terminal */ + color: true, + /* The strictImports controls whether the compiler will allow an @import inside of either + * @media blocks or (a later addition) other selector blocks. + * See: https://github.com/less/less.js/issues/656 */ + strictImports: false, + /* Allow Imports from Insecure HTTPS Hosts */ + insecure: false, + /* Allows you to add a path to every generated import and url in your css. + * This does not affect less import statements that are processed, just ones + * that are left in the output css. */ + rootpath: '', + /* By default URLs are kept as-is, so if you import a file in a sub-directory + * that references an image, exactly the same URL will be output in the css. + * This option allows you to re-write URL's in imported files so that the + * URL is always relative to the base imported file */ + rewriteUrls: false, + /* How to process math + * 0 always - eagerly try to solve all operations + * 1 parens-division - require parens for division "/" + * 2 parens | strict - require parens for all operations + * 3 strict-legacy - legacy strict behavior (super-strict) + */ + math: 1, + /* Without this option, less attempts to guess at the output unit when it does maths. */ + strictUnits: false, + /* Effectively the declaration is put at the top of your base Less file, + * meaning it can be used but it also can be overridden if this variable + * is defined in the file. */ + globalVars: null, + /* As opposed to the global variable option, this puts the declaration at the + * end of your base file, meaning it will override anything defined in your Less file. */ + modifyVars: null, + /* This option allows you to specify a argument to go on to every URL. */ + urlArgs: '' + }; + } - function extractId(href) { - return href.replace(/^[a-z-]+:\/+?[^\/]+/, '') // Remove protocol & domain - .replace(/[\?\&]livereload=\w+/, '') // Remove LiveReload cachebuster - .replace(/^\//, '') // Remove root / - .replace(/\.[a-zA-Z]+$/, '') // Remove simple extension - .replace(/[^\.\w-]+/g, '-') // Replace illegal characters - .replace(/\./g, ':'); // Replace dots with colons(for valid id) - } - function addDataAttr(options, tag) { - for (var opt in tag.dataset) { - if (tag.dataset.hasOwnProperty(opt)) { - if (opt === 'env' || opt === 'dumpLineNumbers' || opt === 'rootpath' || opt === 'errorReporting') { - options[opt] = tag.dataset[opt]; - } - else { - try { - options[opt] = JSON.parse(tag.dataset[opt]); - } - catch (_) { } - } - } - } - } + function extractId(href) { + return href.replace(/^[a-z-]+:\/+?[^\/]+/, '') // Remove protocol & domain + .replace(/[\?\&]livereload=\w+/, '') // Remove LiveReload cachebuster + .replace(/^\//, '') // Remove root / + .replace(/\.[a-zA-Z]+$/, '') // Remove simple extension + .replace(/[^\.\w-]+/g, '-') // Replace illegal characters + .replace(/\./g, ':'); // Replace dots with colons(for valid id) + } + function addDataAttr(options, tag) { + for (var opt in tag.dataset) { + if (tag.dataset.hasOwnProperty(opt)) { + if (opt === 'env' || opt === 'dumpLineNumbers' || opt === 'rootpath' || opt === 'errorReporting') { + options[opt] = tag.dataset[opt]; + } + else { + try { + options[opt] = JSON.parse(tag.dataset[opt]); + } + catch (_) { } + } + } + } + } - var browser = { - createCSS: function (document, styles, sheet) { - // Strip the query-string - var href = sheet.href || ''; - // If there is no title set, use the filename, minus the extension - var id = "less:" + (sheet.title || extractId(href)); - // If this has already been inserted into the DOM, we may need to replace it - var oldStyleNode = document.getElementById(id); - var keepOldStyleNode = false; - // Create a new stylesheet node for insertion or (if necessary) replacement - var styleNode = document.createElement('style'); - styleNode.setAttribute('type', 'text/css'); - if (sheet.media) { - styleNode.setAttribute('media', sheet.media); - } - styleNode.id = id; - if (!styleNode.styleSheet) { - styleNode.appendChild(document.createTextNode(styles)); - // If new contents match contents of oldStyleNode, don't replace oldStyleNode - keepOldStyleNode = (oldStyleNode !== null && oldStyleNode.childNodes.length > 0 && styleNode.childNodes.length > 0 && - oldStyleNode.firstChild.nodeValue === styleNode.firstChild.nodeValue); - } - var head = document.getElementsByTagName('head')[0]; - // If there is no oldStyleNode, just append; otherwise, only append if we need - // to replace oldStyleNode with an updated stylesheet - if (oldStyleNode === null || keepOldStyleNode === false) { - var nextEl = sheet && sheet.nextSibling || null; - if (nextEl) { - nextEl.parentNode.insertBefore(styleNode, nextEl); - } - else { - head.appendChild(styleNode); - } - } - if (oldStyleNode && keepOldStyleNode === false) { - oldStyleNode.parentNode.removeChild(oldStyleNode); - } - // For IE. - // This needs to happen *after* the style element is added to the DOM, otherwise IE 7 and 8 may crash. - // See http://social.msdn.microsoft.com/Forums/en-US/7e081b65-878a-4c22-8e68-c10d39c2ed32/internet-explorer-crashes-appending-style-element-to-head - if (styleNode.styleSheet) { - try { - styleNode.styleSheet.cssText = styles; - } - catch (e) { - throw new Error('Couldn\'t reassign styleSheet.cssText.'); - } - } - }, - currentScript: function (window) { - var document = window.document; - return document.currentScript || (function () { - var scripts = document.getElementsByTagName('script'); - return scripts[scripts.length - 1]; - })(); - } - }; + var browser = { + createCSS: function (document, styles, sheet) { + // Strip the query-string + var href = sheet.href || ''; + // If there is no title set, use the filename, minus the extension + var id = "less:" + (sheet.title || extractId(href)); + // If this has already been inserted into the DOM, we may need to replace it + var oldStyleNode = document.getElementById(id); + var keepOldStyleNode = false; + // Create a new stylesheet node for insertion or (if necessary) replacement + var styleNode = document.createElement('style'); + styleNode.setAttribute('type', 'text/css'); + if (sheet.media) { + styleNode.setAttribute('media', sheet.media); + } + styleNode.id = id; + if (!styleNode.styleSheet) { + styleNode.appendChild(document.createTextNode(styles)); + // If new contents match contents of oldStyleNode, don't replace oldStyleNode + keepOldStyleNode = (oldStyleNode !== null && oldStyleNode.childNodes.length > 0 && styleNode.childNodes.length > 0 && + oldStyleNode.firstChild.nodeValue === styleNode.firstChild.nodeValue); + } + var head = document.getElementsByTagName('head')[0]; + // If there is no oldStyleNode, just append; otherwise, only append if we need + // to replace oldStyleNode with an updated stylesheet + if (oldStyleNode === null || keepOldStyleNode === false) { + var nextEl = sheet && sheet.nextSibling || null; + if (nextEl) { + nextEl.parentNode.insertBefore(styleNode, nextEl); + } + else { + head.appendChild(styleNode); + } + } + if (oldStyleNode && keepOldStyleNode === false) { + oldStyleNode.parentNode.removeChild(oldStyleNode); + } + // For IE. + // This needs to happen *after* the style element is added to the DOM, otherwise IE 7 and 8 may crash. + // See http://social.msdn.microsoft.com/Forums/en-US/7e081b65-878a-4c22-8e68-c10d39c2ed32/internet-explorer-crashes-appending-style-element-to-head + if (styleNode.styleSheet) { + try { + styleNode.styleSheet.cssText = styles; + } + catch (e) { + throw new Error('Couldn\'t reassign styleSheet.cssText.'); + } + } + }, + currentScript: function (window) { + var document = window.document; + return document.currentScript || (function () { + var scripts = document.getElementsByTagName('script'); + return scripts[scripts.length - 1]; + })(); + } + }; - var addDefaultOptions = (function (window, options) { - // use options from the current script tag data attribues - addDataAttr(options, browser.currentScript(window)); - if (options.isFileProtocol === undefined) { - options.isFileProtocol = /^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(window.location.protocol); - } - // Load styles asynchronously (default: false) - // - // This is set to `false` by default, so that the body - // doesn't start loading before the stylesheets are parsed. - // Setting this to `true` can result in flickering. - // - options.async = options.async || false; - options.fileAsync = options.fileAsync || false; - // Interval between watch polls - options.poll = options.poll || (options.isFileProtocol ? 1000 : 1500); - options.env = options.env || (window.location.hostname == '127.0.0.1' || - window.location.hostname == '0.0.0.0' || - window.location.hostname == 'localhost' || - (window.location.port && - window.location.port.length > 0) || - options.isFileProtocol ? 'development' - : 'production'); - var dumpLineNumbers = /!dumpLineNumbers:(comments|mediaquery|all)/.exec(window.location.hash); - if (dumpLineNumbers) { - options.dumpLineNumbers = dumpLineNumbers[1]; - } - if (options.useFileCache === undefined) { - options.useFileCache = true; - } - if (options.onReady === undefined) { - options.onReady = true; - } - if (options.relativeUrls) { - options.rewriteUrls = 'all'; - } - }); + var addDefaultOptions = (function (window, options) { + // use options from the current script tag data attribues + addDataAttr(options, browser.currentScript(window)); + if (options.isFileProtocol === undefined) { + options.isFileProtocol = /^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(window.location.protocol); + } + // Load styles asynchronously (default: false) + // + // This is set to `false` by default, so that the body + // doesn't start loading before the stylesheets are parsed. + // Setting this to `true` can result in flickering. + // + options.async = options.async || false; + options.fileAsync = options.fileAsync || false; + // Interval between watch polls + options.poll = options.poll || (options.isFileProtocol ? 1000 : 1500); + options.env = options.env || (window.location.hostname == '127.0.0.1' || + window.location.hostname == '0.0.0.0' || + window.location.hostname == 'localhost' || + (window.location.port && + window.location.port.length > 0) || + options.isFileProtocol ? 'development' + : 'production'); + var dumpLineNumbers = /!dumpLineNumbers:(comments|mediaquery|all)/.exec(window.location.hash); + if (dumpLineNumbers) { + options.dumpLineNumbers = dumpLineNumbers[1]; + } + if (options.useFileCache === undefined) { + options.useFileCache = true; + } + if (options.onReady === undefined) { + options.onReady = true; + } + if (options.relativeUrls) { + options.rewriteUrls = 'all'; + } + }); - /*! ***************************************************************************** - Copyright (c) Microsoft Corporation. + var logger = { + error: function (msg) { + this._fireEvent('error', msg); + }, + warn: function (msg) { + this._fireEvent('warn', msg); + }, + info: function (msg) { + this._fireEvent('info', msg); + }, + debug: function (msg) { + this._fireEvent('debug', msg); + }, + addListener: function (listener) { + this._listeners.push(listener); + }, + removeListener: function (listener) { + for (var i = 0; i < this._listeners.length; i++) { + if (this._listeners[i] === listener) { + this._listeners.splice(i, 1); + return; + } + } + }, + _fireEvent: function (type, msg) { + for (var i = 0; i < this._listeners.length; i++) { + var logFunction = this._listeners[i][type]; + if (logFunction) { + logFunction(msg); + } + } + }, + _listeners: [] + }; - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted. + /** + * @todo Document why this abstraction exists, and the relationship between + * environment, file managers, and plugin manager + */ + var Environment = /** @class */ (function () { + function Environment(externalEnvironment, fileManagers) { + this.fileManagers = fileManagers || []; + externalEnvironment = externalEnvironment || {}; + var optionalFunctions = ['encodeBase64', 'mimeLookup', 'charsetLookup', 'getSourceMapGenerator']; + var requiredFunctions = []; + var functions = requiredFunctions.concat(optionalFunctions); + for (var i = 0; i < functions.length; i++) { + var propName = functions[i]; + var environmentFunc = externalEnvironment[propName]; + if (environmentFunc) { + this[propName] = environmentFunc.bind(externalEnvironment); + } + else if (i < requiredFunctions.length) { + this.warn("missing required function in environment - " + propName); + } + } + } + Environment.prototype.getFileManager = function (filename, currentDirectory, options, environment, isSync) { + if (!filename) { + logger.warn('getFileManager called with no filename.. Please report this issue. continuing.'); + } + if (currentDirectory == null) { + logger.warn('getFileManager called with null directory.. Please report this issue. continuing.'); + } + var fileManagers = this.fileManagers; + if (options.pluginManager) { + fileManagers = [].concat(fileManagers).concat(options.pluginManager.getFileManagers()); + } + for (var i = fileManagers.length - 1; i >= 0; i--) { + var fileManager = fileManagers[i]; + if (fileManager[isSync ? 'supportsSync' : 'supports'](filename, currentDirectory, options, environment)) { + return fileManager; + } + } + return null; + }; + Environment.prototype.addFileManager = function (fileManager) { + this.fileManagers.push(fileManager); + }; + Environment.prototype.clearFileManagers = function () { + this.fileManagers = []; + }; + return Environment; + }()); - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, - INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR - OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. - ***************************************************************************** */ - /* global Reflect, Promise */ - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) - if (b.hasOwnProperty(p)) - d[p] = b[p]; }; - return extendStatics(d, b); - }; - function __extends(d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - } - var __assign = function () { - __assign = Object.assign || function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) - if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); - }; - function __spreadArrays() { - for (var s = 0, i = 0, il = arguments.length; i < il; i++) - s += arguments[i].length; - for (var r = Array(s), k = 0, i = 0; i < il; i++) - for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) - r[k] = a[j]; - return r; - } + var colors = { + 'aliceblue': '#f0f8ff', + 'antiquewhite': '#faebd7', + 'aqua': '#00ffff', + 'aquamarine': '#7fffd4', + 'azure': '#f0ffff', + 'beige': '#f5f5dc', + 'bisque': '#ffe4c4', + 'black': '#000000', + 'blanchedalmond': '#ffebcd', + 'blue': '#0000ff', + 'blueviolet': '#8a2be2', + 'brown': '#a52a2a', + 'burlywood': '#deb887', + 'cadetblue': '#5f9ea0', + 'chartreuse': '#7fff00', + 'chocolate': '#d2691e', + 'coral': '#ff7f50', + 'cornflowerblue': '#6495ed', + 'cornsilk': '#fff8dc', + 'crimson': '#dc143c', + 'cyan': '#00ffff', + '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': '#ff00ff', + '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': '#778899', + 'lightslategrey': '#778899', + 'lightsteelblue': '#b0c4de', + 'lightyellow': '#ffffe0', + 'lime': '#00ff00', + 'limegreen': '#32cd32', + 'linen': '#faf0e6', + 'magenta': '#ff00ff', + 'maroon': '#800000', + 'mediumaquamarine': '#66cdaa', + 'mediumblue': '#0000cd', + 'mediumorchid': '#ba55d3', + 'mediumpurple': '#9370d8', + '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': '#d87093', + 'papayawhip': '#ffefd5', + 'peachpuff': '#ffdab9', + 'peru': '#cd853f', + 'pink': '#ffc0cb', + 'plum': '#dda0dd', + 'powderblue': '#b0e0e6', + 'purple': '#800080', + 'rebeccapurple': '#663399', + 'red': '#ff0000', + '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': '#ffffff', + 'whitesmoke': '#f5f5f5', + 'yellow': '#ffff00', + 'yellowgreen': '#9acd32' + }; - var colors = { - 'aliceblue': '#f0f8ff', - 'antiquewhite': '#faebd7', - 'aqua': '#00ffff', - 'aquamarine': '#7fffd4', - 'azure': '#f0ffff', - 'beige': '#f5f5dc', - 'bisque': '#ffe4c4', - 'black': '#000000', - 'blanchedalmond': '#ffebcd', - 'blue': '#0000ff', - 'blueviolet': '#8a2be2', - 'brown': '#a52a2a', - 'burlywood': '#deb887', - 'cadetblue': '#5f9ea0', - 'chartreuse': '#7fff00', - 'chocolate': '#d2691e', - 'coral': '#ff7f50', - 'cornflowerblue': '#6495ed', - 'cornsilk': '#fff8dc', - 'crimson': '#dc143c', - 'cyan': '#00ffff', - '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': '#ff00ff', - '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': '#778899', - 'lightslategrey': '#778899', - 'lightsteelblue': '#b0c4de', - 'lightyellow': '#ffffe0', - 'lime': '#00ff00', - 'limegreen': '#32cd32', - 'linen': '#faf0e6', - 'magenta': '#ff00ff', - 'maroon': '#800000', - 'mediumaquamarine': '#66cdaa', - 'mediumblue': '#0000cd', - 'mediumorchid': '#ba55d3', - 'mediumpurple': '#9370d8', - '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': '#d87093', - 'papayawhip': '#ffefd5', - 'peachpuff': '#ffdab9', - 'peru': '#cd853f', - 'pink': '#ffc0cb', - 'plum': '#dda0dd', - 'powderblue': '#b0e0e6', - 'purple': '#800080', - 'rebeccapurple': '#663399', - 'red': '#ff0000', - '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': '#ffffff', - 'whitesmoke': '#f5f5f5', - 'yellow': '#ffff00', - 'yellowgreen': '#9acd32' - }; + var unitConversions = { + length: { + 'm': 1, + 'cm': 0.01, + 'mm': 0.001, + 'in': 0.0254, + 'px': 0.0254 / 96, + 'pt': 0.0254 / 72, + 'pc': 0.0254 / 72 * 12 + }, + duration: { + 's': 1, + 'ms': 0.001 + }, + angle: { + 'rad': 1 / (2 * Math.PI), + 'deg': 1 / 360, + 'grad': 1 / 400, + 'turn': 1 + } + }; - var unitConversions = { - length: { - 'm': 1, - 'cm': 0.01, - 'mm': 0.001, - 'in': 0.0254, - 'px': 0.0254 / 96, - 'pt': 0.0254 / 72, - 'pc': 0.0254 / 72 * 12 - }, - duration: { - 's': 1, - 'ms': 0.001 - }, - angle: { - 'rad': 1 / (2 * Math.PI), - 'deg': 1 / 360, - 'grad': 1 / 400, - 'turn': 1 - } - }; + var data = { colors: colors, unitConversions: unitConversions }; - var data = { colors: colors, unitConversions: unitConversions }; + var Node = /** @class */ (function () { + function Node() { + this.parent = null; + this.visibilityBlocks = undefined; + this.nodeVisible = undefined; + this.rootNode = null; + this.parsed = null; + var self = this; + Object.defineProperty(this, 'currentFileInfo', { + get: function () { return self.fileInfo(); } + }); + Object.defineProperty(this, 'index', { + get: function () { return self.getIndex(); } + }); + } + Node.prototype.setParent = function (nodes, parent) { + function set(node) { + if (node && node instanceof Node) { + node.parent = parent; + } + } + if (Array.isArray(nodes)) { + nodes.forEach(set); + } + else { + set(nodes); + } + }; + Node.prototype.getIndex = function () { + return this._index || (this.parent && this.parent.getIndex()) || 0; + }; + Node.prototype.fileInfo = function () { + return this._fileInfo || (this.parent && this.parent.fileInfo()) || {}; + }; + Node.prototype.isRulesetLike = function () { return false; }; + Node.prototype.toCSS = function (context) { + var strs = []; + this.genCSS(context, { + add: function (chunk, fileInfo, index) { + strs.push(chunk); + }, + isEmpty: function () { + return strs.length === 0; + } + }); + return strs.join(''); + }; + Node.prototype.genCSS = function (context, output) { + output.add(this.value); + }; + Node.prototype.accept = function (visitor) { + this.value = visitor.visit(this.value); + }; + Node.prototype.eval = function () { return this; }; + Node.prototype._operate = function (context, op, a, b) { + switch (op) { + case '+': return a + b; + case '-': return a - b; + case '*': return a * b; + case '/': return a / b; + } + }; + Node.prototype.fround = function (context, value) { + var precision = context && context.numPrecision; + // add "epsilon" to ensure numbers like 1.000000005 (represented as 1.000000004999...) are properly rounded: + return (precision) ? Number((value + 2e-16).toFixed(precision)) : value; + }; + Node.compare = function (a, b) { + /* returns: + -1: a < b + 0: a = b + 1: a > b + and *any* other value for a != b (e.g. undefined, NaN, -2 etc.) */ + if ((a.compare) && + // for "symmetric results" force toCSS-based comparison + // of Quoted or Anonymous if either value is one of those + !(b.type === 'Quoted' || b.type === 'Anonymous')) { + return a.compare(b); + } + else if (b.compare) { + return -b.compare(a); + } + else if (a.type !== b.type) { + return undefined; + } + a = a.value; + b = b.value; + if (!Array.isArray(a)) { + return a === b ? 0 : undefined; + } + if (a.length !== b.length) { + return undefined; + } + for (var i = 0; i < a.length; i++) { + if (Node.compare(a[i], b[i]) !== 0) { + return undefined; + } + } + return 0; + }; + Node.numericCompare = function (a, b) { + return a < b ? -1 + : a === b ? 0 + : a > b ? 1 : undefined; + }; + // Returns true if this node represents root of ast imported by reference + Node.prototype.blocksVisibility = function () { + if (this.visibilityBlocks == null) { + this.visibilityBlocks = 0; + } + return this.visibilityBlocks !== 0; + }; + Node.prototype.addVisibilityBlock = function () { + if (this.visibilityBlocks == null) { + this.visibilityBlocks = 0; + } + this.visibilityBlocks = this.visibilityBlocks + 1; + }; + Node.prototype.removeVisibilityBlock = function () { + if (this.visibilityBlocks == null) { + this.visibilityBlocks = 0; + } + this.visibilityBlocks = this.visibilityBlocks - 1; + }; + // Turns on node visibility - if called node will be shown in output regardless + // of whether it comes from import by reference or not + Node.prototype.ensureVisibility = function () { + this.nodeVisible = true; + }; + // Turns off node visibility - if called node will NOT be shown in output regardless + // of whether it comes from import by reference or not + Node.prototype.ensureInvisibility = function () { + this.nodeVisible = false; + }; + // return values: + // false - the node must not be visible + // true - the node must be visible + // undefined or null - the node has the same visibility as its parent + Node.prototype.isVisible = function () { + return this.nodeVisible; + }; + Node.prototype.visibilityInfo = function () { + return { + visibilityBlocks: this.visibilityBlocks, + nodeVisible: this.nodeVisible + }; + }; + Node.prototype.copyVisibilityInfo = function (info) { + if (!info) { + return; + } + this.visibilityBlocks = info.visibilityBlocks; + this.nodeVisible = info.nodeVisible; + }; + return Node; + }()); - var Node = /** @class */ (function () { - function Node() { - this.parent = null; - this.visibilityBlocks = undefined; - this.nodeVisible = undefined; - this.rootNode = null; - this.parsed = null; - var self = this; - Object.defineProperty(this, 'currentFileInfo', { - get: function () { return self.fileInfo(); } - }); - Object.defineProperty(this, 'index', { - get: function () { return self.getIndex(); } - }); - } - Node.prototype.setParent = function (nodes, parent) { - function set(node) { - if (node && node instanceof Node) { - node.parent = parent; - } - } - if (Array.isArray(nodes)) { - nodes.forEach(set); - } - else { - set(nodes); - } - }; - Node.prototype.getIndex = function () { - return this._index || (this.parent && this.parent.getIndex()) || 0; - }; - Node.prototype.fileInfo = function () { - return this._fileInfo || (this.parent && this.parent.fileInfo()) || {}; - }; - Node.prototype.isRulesetLike = function () { - return false; - }; - Node.prototype.toCSS = function (context) { - var strs = []; - this.genCSS(context, { - add: function (chunk, fileInfo, index) { - strs.push(chunk); - }, - isEmpty: function () { - return strs.length === 0; - } - }); - return strs.join(''); - }; - Node.prototype.genCSS = function (context, output) { - output.add(this.value); - }; - Node.prototype.accept = function (visitor) { - this.value = visitor.visit(this.value); - }; - Node.prototype.eval = function () { return this; }; - Node.prototype._operate = function (context, op, a, b) { - switch (op) { - case '+': return a + b; - case '-': return a - b; - case '*': return a * b; - case '/': return a / b; - } - }; - Node.prototype.fround = function (context, value) { - var precision = context && context.numPrecision; - // add "epsilon" to ensure numbers like 1.000000005 (represented as 1.000000004999...) are properly rounded: - return (precision) ? Number((value + 2e-16).toFixed(precision)) : value; - }; - // Returns true if this node represents root of ast imported by reference - Node.prototype.blocksVisibility = function () { - if (this.visibilityBlocks == null) { - this.visibilityBlocks = 0; - } - return this.visibilityBlocks !== 0; - }; - Node.prototype.addVisibilityBlock = function () { - if (this.visibilityBlocks == null) { - this.visibilityBlocks = 0; - } - this.visibilityBlocks = this.visibilityBlocks + 1; - }; - Node.prototype.removeVisibilityBlock = function () { - if (this.visibilityBlocks == null) { - this.visibilityBlocks = 0; - } - this.visibilityBlocks = this.visibilityBlocks - 1; - }; - // Turns on node visibility - if called node will be shown in output regardless - // of whether it comes from import by reference or not - Node.prototype.ensureVisibility = function () { - this.nodeVisible = true; - }; - // Turns off node visibility - if called node will NOT be shown in output regardless - // of whether it comes from import by reference or not - Node.prototype.ensureInvisibility = function () { - this.nodeVisible = false; - }; - // return values: - // false - the node must not be visible - // true - the node must be visible - // undefined or null - the node has the same visibility as its parent - Node.prototype.isVisible = function () { - return this.nodeVisible; - }; - Node.prototype.visibilityInfo = function () { - return { - visibilityBlocks: this.visibilityBlocks, - nodeVisible: this.nodeVisible - }; - }; - Node.prototype.copyVisibilityInfo = function (info) { - if (!info) { - return; - } - this.visibilityBlocks = info.visibilityBlocks; - this.nodeVisible = info.nodeVisible; - }; - return Node; - }()); - Node.compare = function (a, b) { - /* returns: - -1: a < b - 0: a = b - 1: a > b - and *any* other value for a != b (e.g. undefined, NaN, -2 etc.) */ - if ((a.compare) && - // for "symmetric results" force toCSS-based comparison - // of Quoted or Anonymous if either value is one of those - !(b.type === 'Quoted' || b.type === 'Anonymous')) { - return a.compare(b); - } - else if (b.compare) { - return -b.compare(a); - } - else if (a.type !== b.type) { - return undefined; - } - a = a.value; - b = b.value; - if (!Array.isArray(a)) { - return a === b ? 0 : undefined; - } - if (a.length !== b.length) { - return undefined; - } - for (var i = 0; i < a.length; i++) { - if (Node.compare(a[i], b[i]) !== 0) { - return undefined; - } - } - return 0; - }; - Node.numericCompare = function (a, b) { return a < b ? -1 - : a === b ? 0 - : a > b ? 1 : undefined; }; + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. - // - // RGB Colors - #ff0014, #eee - // - var Color = /** @class */ (function (_super) { - __extends(Color, _super); - function Color(rgb, a, originalForm) { - var _this = _super.call(this) || this; - var self = _this; - // - // The end goal here, is to parse the arguments - // into an integer triplet, such as `128, 255, 0` - // - // This facilitates operations and conversions. - // - if (Array.isArray(rgb)) { - _this.rgb = rgb; - } - else if (rgb.length >= 6) { - _this.rgb = []; - rgb.match(/.{2}/g).map(function (c, i) { - if (i < 3) { - self.rgb.push(parseInt(c, 16)); - } - else { - self.alpha = (parseInt(c, 16)) / 255; - } - }); - } - else { - _this.rgb = []; - rgb.split('').map(function (c, i) { - if (i < 3) { - self.rgb.push(parseInt(c + c, 16)); - } - else { - self.alpha = (parseInt(c + c, 16)) / 255; - } - }); - } - _this.alpha = _this.alpha || (typeof a === 'number' ? a : 1); - if (typeof originalForm !== 'undefined') { - _this.value = originalForm; - } - return _this; - } - Color.prototype.luma = function () { - var r = this.rgb[0] / 255; - var g = this.rgb[1] / 255; - var b = this.rgb[2] / 255; - r = (r <= 0.03928) ? r / 12.92 : Math.pow(((r + 0.055) / 1.055), 2.4); - g = (g <= 0.03928) ? g / 12.92 : Math.pow(((g + 0.055) / 1.055), 2.4); - b = (b <= 0.03928) ? b / 12.92 : Math.pow(((b + 0.055) / 1.055), 2.4); - return 0.2126 * r + 0.7152 * g + 0.0722 * b; - }; - Color.prototype.genCSS = function (context, output) { - output.add(this.toCSS(context)); - }; - Color.prototype.toCSS = function (context, doNotCompress) { - var compress = context && context.compress && !doNotCompress; - var color; - var alpha; - var colorFunction; - var args = []; - // `value` is set if this color was originally - // converted from a named color string so we need - // to respect this and try to output named color too. - alpha = this.fround(context, this.alpha); - if (this.value) { - if (this.value.indexOf('rgb') === 0) { - if (alpha < 1) { - colorFunction = 'rgba'; - } - } - else if (this.value.indexOf('hsl') === 0) { - if (alpha < 1) { - colorFunction = 'hsla'; - } - else { - colorFunction = 'hsl'; - } - } - else { - return this.value; - } - } - else { - if (alpha < 1) { - colorFunction = 'rgba'; - } - } - switch (colorFunction) { - case 'rgba': - args = this.rgb.map(function (c) { return clamp(Math.round(c), 255); }).concat(clamp(alpha, 1)); - break; - case 'hsla': - args.push(clamp(alpha, 1)); - case 'hsl': - color = this.toHSL(); - args = [ - this.fround(context, color.h), - this.fround(context, color.s * 100) + "%", - this.fround(context, color.l * 100) + "%" - ].concat(args); - } - if (colorFunction) { - // Values are capped between `0` and `255`, rounded and zero-padded. - return colorFunction + "(" + args.join("," + (compress ? '' : ' ')) + ")"; - } - color = this.toRGB(); - if (compress) { - var splitcolor = color.split(''); - // Convert color to short format - if (splitcolor[1] === splitcolor[2] && splitcolor[3] === splitcolor[4] && splitcolor[5] === splitcolor[6]) { - color = "#" + splitcolor[1] + splitcolor[3] + splitcolor[5]; - } - } - return color; - }; - // - // Operations have to be done per-channel, if not, - // channels will spill onto each other. Once we have - // our result, in the form of an integer triplet, - // we create a new Color node to hold the result. - // - Color.prototype.operate = function (context, op, other) { - var rgb = new Array(3); - var alpha = this.alpha * (1 - other.alpha) + other.alpha; - for (var c = 0; c < 3; c++) { - rgb[c] = this._operate(context, op, this.rgb[c], other.rgb[c]); - } - return new Color(rgb, alpha); - }; - Color.prototype.toRGB = function () { - return toHex(this.rgb); - }; - Color.prototype.toHSL = function () { - var r = this.rgb[0] / 255; - var g = this.rgb[1] / 255; - var b = this.rgb[2] / 255; - var a = this.alpha; - var max = Math.max(r, g, b); - var min = Math.min(r, g, b); - var h; - var s; - var l = (max + min) / 2; - var d = max - min; - if (max === min) { - h = s = 0; - } - else { - s = l > 0.5 ? d / (2 - max - min) : d / (max + min); - switch (max) { - case r: - h = (g - b) / d + (g < b ? 6 : 0); - break; - case g: - h = (b - r) / d + 2; - break; - case b: - h = (r - g) / d + 4; - break; - } - h /= 6; - } - return { h: h * 360, s: s, l: l, a: a }; - }; - // Adapted from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript - Color.prototype.toHSV = function () { - var r = this.rgb[0] / 255; - var g = this.rgb[1] / 255; - var b = this.rgb[2] / 255; - var a = this.alpha; - var max = Math.max(r, g, b); - var min = Math.min(r, g, b); - var h; - var s; - var v = max; - var d = max - min; - if (max === 0) { - s = 0; - } - else { - s = d / max; - } - if (max === min) { - h = 0; - } - else { - switch (max) { - case r: - h = (g - b) / d + (g < b ? 6 : 0); - break; - case g: - h = (b - r) / d + 2; - break; - case b: - h = (r - g) / d + 4; - break; - } - h /= 6; - } - return { h: h * 360, s: s, v: v, a: a }; - }; - Color.prototype.toARGB = function () { - return toHex([this.alpha * 255].concat(this.rgb)); - }; - Color.prototype.compare = function (x) { - return (x.rgb && - x.rgb[0] === this.rgb[0] && - x.rgb[1] === this.rgb[1] && - x.rgb[2] === this.rgb[2] && - x.alpha === this.alpha) ? 0 : undefined; - }; - return Color; - }(Node)); - Color.prototype.type = 'Color'; - function clamp(v, max) { - return Math.min(Math.max(v, 0), max); - } - function toHex(v) { - return "#" + v.map(function (c) { - c = clamp(Math.round(c), 255); - return (c < 16 ? '0' : '') + c.toString(16); - }).join(''); - } - Color.fromKeyword = function (keyword) { - var c; - var key = keyword.toLowerCase(); - if (colors.hasOwnProperty(key)) { - c = new Color(colors[key].slice(1)); - } - else if (key === 'transparent') { - c = new Color([0, 0, 0], 0); - } - if (c) { - c.value = keyword; - return c; - } - }; + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted. - var Paren = /** @class */ (function (_super) { - __extends(Paren, _super); - function Paren(node) { - var _this = _super.call(this) || this; - _this.value = node; - return _this; - } - Paren.prototype.genCSS = function (context, output) { - output.add('('); - this.value.genCSS(context, output); - output.add(')'); - }; - Paren.prototype.eval = function (context) { - return new Paren(this.value.eval(context)); - }; - return Paren; - }(Node)); - Paren.prototype.type = 'Paren'; + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + ***************************************************************************** */ + /* global Reflect, Promise */ + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) + if (b.hasOwnProperty(p)) + d[p] = b[p]; }; + return extendStatics(d, b); + }; + function __extends(d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + } + var __assign = function () { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + function __spreadArrays() { + for (var s = 0, i = 0, il = arguments.length; i < il; i++) + s += arguments[i].length; + for (var r = Array(s), k = 0, i = 0; i < il; i++) + for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) + r[k] = a[j]; + return r; + } - var _noSpaceCombinators = { - '': true, - ' ': true, - '|': true - }; - var Combinator = /** @class */ (function (_super) { - __extends(Combinator, _super); - function Combinator(value) { - var _this = _super.call(this) || this; - if (value === ' ') { - _this.value = ' '; - _this.emptyOrWhitespace = true; - } - else { - _this.value = value ? value.trim() : ''; - _this.emptyOrWhitespace = _this.value === ''; - } - return _this; - } - Combinator.prototype.genCSS = function (context, output) { - var spaceOrEmpty = (context.compress || _noSpaceCombinators[this.value]) ? '' : ' '; - output.add(spaceOrEmpty + this.value + spaceOrEmpty); - }; - return Combinator; - }(Node)); - Combinator.prototype.type = 'Combinator'; + // + // RGB Colors - #ff0014, #eee + // + var Color = /** @class */ (function (_super) { + __extends(Color, _super); + function Color(rgb, a, originalForm) { + var _this = _super.call(this) || this; + var self = _this; + // + // The end goal here, is to parse the arguments + // into an integer triplet, such as `128, 255, 0` + // + // This facilitates operations and conversions. + // + if (Array.isArray(rgb)) { + _this.rgb = rgb; + } + else if (rgb.length >= 6) { + _this.rgb = []; + rgb.match(/.{2}/g).map(function (c, i) { + if (i < 3) { + self.rgb.push(parseInt(c, 16)); + } + else { + self.alpha = (parseInt(c, 16)) / 255; + } + }); + } + else { + _this.rgb = []; + rgb.split('').map(function (c, i) { + if (i < 3) { + self.rgb.push(parseInt(c + c, 16)); + } + else { + self.alpha = (parseInt(c + c, 16)) / 255; + } + }); + } + _this.alpha = _this.alpha || (typeof a === 'number' ? a : 1); + if (typeof originalForm !== 'undefined') { + _this.value = originalForm; + } + return _this; + } + Color.prototype.luma = function () { + var r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255; + r = (r <= 0.03928) ? r / 12.92 : Math.pow(((r + 0.055) / 1.055), 2.4); + g = (g <= 0.03928) ? g / 12.92 : Math.pow(((g + 0.055) / 1.055), 2.4); + b = (b <= 0.03928) ? b / 12.92 : Math.pow(((b + 0.055) / 1.055), 2.4); + return 0.2126 * r + 0.7152 * g + 0.0722 * b; + }; + Color.prototype.genCSS = function (context, output) { + output.add(this.toCSS(context)); + }; + Color.prototype.toCSS = function (context, doNotCompress) { + var compress = context && context.compress && !doNotCompress; + var color; + var alpha; + var colorFunction; + var args = []; + // `value` is set if this color was originally + // converted from a named color string so we need + // to respect this and try to output named color too. + alpha = this.fround(context, this.alpha); + if (this.value) { + if (this.value.indexOf('rgb') === 0) { + if (alpha < 1) { + colorFunction = 'rgba'; + } + } + else if (this.value.indexOf('hsl') === 0) { + if (alpha < 1) { + colorFunction = 'hsla'; + } + else { + colorFunction = 'hsl'; + } + } + else { + return this.value; + } + } + else { + if (alpha < 1) { + colorFunction = 'rgba'; + } + } + switch (colorFunction) { + case 'rgba': + args = this.rgb.map(function (c) { + return clamp(Math.round(c), 255); + }).concat(clamp(alpha, 1)); + break; + case 'hsla': + args.push(clamp(alpha, 1)); + case 'hsl': + color = this.toHSL(); + args = [ + this.fround(context, color.h), + this.fround(context, color.s * 100) + "%", + this.fround(context, color.l * 100) + "%" + ].concat(args); + } + if (colorFunction) { + // Values are capped between `0` and `255`, rounded and zero-padded. + return colorFunction + "(" + args.join("," + (compress ? '' : ' ')) + ")"; + } + color = this.toRGB(); + if (compress) { + var splitcolor = color.split(''); + // Convert color to short format + if (splitcolor[1] === splitcolor[2] && splitcolor[3] === splitcolor[4] && splitcolor[5] === splitcolor[6]) { + color = "#" + splitcolor[1] + splitcolor[3] + splitcolor[5]; + } + } + return color; + }; + // + // Operations have to be done per-channel, if not, + // channels will spill onto each other. Once we have + // our result, in the form of an integer triplet, + // we create a new Color node to hold the result. + // + Color.prototype.operate = function (context, op, other) { + var rgb = new Array(3); + var alpha = this.alpha * (1 - other.alpha) + other.alpha; + for (var c = 0; c < 3; c++) { + rgb[c] = this._operate(context, op, this.rgb[c], other.rgb[c]); + } + return new Color(rgb, alpha); + }; + Color.prototype.toRGB = function () { + return toHex(this.rgb); + }; + Color.prototype.toHSL = function () { + var r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha; + var max = Math.max(r, g, b), min = Math.min(r, g, b); + var h; + var s; + var l = (max + min) / 2; + var d = max - min; + if (max === min) { + h = s = 0; + } + else { + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + switch (max) { + case r: + h = (g - b) / d + (g < b ? 6 : 0); + break; + case g: + h = (b - r) / d + 2; + break; + case b: + h = (r - g) / d + 4; + break; + } + h /= 6; + } + return { h: h * 360, s: s, l: l, a: a }; + }; + // Adapted from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript + Color.prototype.toHSV = function () { + var r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha; + var max = Math.max(r, g, b), min = Math.min(r, g, b); + var h; + var s; + var v = max; + var d = max - min; + if (max === 0) { + s = 0; + } + else { + s = d / max; + } + if (max === min) { + h = 0; + } + else { + switch (max) { + case r: + h = (g - b) / d + (g < b ? 6 : 0); + break; + case g: + h = (b - r) / d + 2; + break; + case b: + h = (r - g) / d + 4; + break; + } + h /= 6; + } + return { h: h * 360, s: s, v: v, a: a }; + }; + Color.prototype.toARGB = function () { + return toHex([this.alpha * 255].concat(this.rgb)); + }; + Color.prototype.compare = function (x) { + return (x.rgb && + x.rgb[0] === this.rgb[0] && + x.rgb[1] === this.rgb[1] && + x.rgb[2] === this.rgb[2] && + x.alpha === this.alpha) ? 0 : undefined; + }; + Color.fromKeyword = function (keyword) { + var c; + var key = keyword.toLowerCase(); + if (colors.hasOwnProperty(key)) { + c = new Color(colors[key].slice(1)); + } + else if (key === 'transparent') { + c = new Color([0, 0, 0], 0); + } + if (c) { + c.value = keyword; + return c; + } + }; + return Color; + }(Node)); + Color.prototype.type = 'Color'; + function clamp(v, max) { + return Math.min(Math.max(v, 0), max); + } + function toHex(v) { + return "#" + v.map(function (c) { + c = clamp(Math.round(c), 255); + return (c < 16 ? '0' : '') + c.toString(16); + }).join(''); + } - var Element = /** @class */ (function (_super) { - __extends(Element, _super); - function Element(combinator, value, isVariable, index, currentFileInfo, visibilityInfo) { - var _this = _super.call(this) || this; - _this.combinator = combinator instanceof Combinator ? - combinator : new Combinator(combinator); - if (typeof value === 'string') { - _this.value = value.trim(); - } - else if (value) { - _this.value = value; - } - else { - _this.value = ''; - } - _this.isVariable = isVariable; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.copyVisibilityInfo(visibilityInfo); - _this.setParent(_this.combinator, _this); - return _this; - } - Element.prototype.accept = function (visitor) { - var value = this.value; - this.combinator = visitor.visit(this.combinator); - if (typeof value === 'object') { - this.value = visitor.visit(value); - } - }; - Element.prototype.eval = function (context) { - return new Element(this.combinator, this.value.eval ? this.value.eval(context) : this.value, this.isVariable, this.getIndex(), this.fileInfo(), this.visibilityInfo()); - }; - Element.prototype.clone = function () { - return new Element(this.combinator, this.value, this.isVariable, this.getIndex(), this.fileInfo(), this.visibilityInfo()); - }; - Element.prototype.genCSS = function (context, output) { - output.add(this.toCSS(context), this.fileInfo(), this.getIndex()); - }; - Element.prototype.toCSS = function (context) { - if (context === void 0) { context = {}; } - var value = this.value; - var firstSelector = context.firstSelector; - if (value instanceof Paren) { - // selector in parens should not be affected by outer selector - // flags (breaks only interpolated selectors - see #1973) - context.firstSelector = true; - } - value = value.toCSS ? value.toCSS(context) : value; - context.firstSelector = firstSelector; - if (value === '' && this.combinator.value.charAt(0) === '&') { - return ''; - } - else { - return this.combinator.toCSS(context) + value; - } - }; - return Element; - }(Node)); - Element.prototype.type = 'Element'; + var Paren = /** @class */ (function (_super) { + __extends(Paren, _super); + function Paren(node) { + var _this = _super.call(this) || this; + _this.value = node; + return _this; + } + Paren.prototype.genCSS = function (context, output) { + output.add('('); + this.value.genCSS(context, output); + output.add(')'); + }; + Paren.prototype.eval = function (context) { + return new Paren(this.value.eval(context)); + }; + return Paren; + }(Node)); + Paren.prototype.type = 'Paren'; - var Math$1 = { - ALWAYS: 0, - PARENS_DIVISION: 1, - PARENS: 2, - STRICT_LEGACY: 3 - }; - var RewriteUrls = { - OFF: 0, - LOCAL: 1, - ALL: 2 - }; + var _noSpaceCombinators = { + '': true, + ' ': true, + '|': true + }; + var Combinator = /** @class */ (function (_super) { + __extends(Combinator, _super); + function Combinator(value) { + var _this = _super.call(this) || this; + if (value === ' ') { + _this.value = ' '; + _this.emptyOrWhitespace = true; + } + else { + _this.value = value ? value.trim() : ''; + _this.emptyOrWhitespace = _this.value === ''; + } + return _this; + } + Combinator.prototype.genCSS = function (context, output) { + var spaceOrEmpty = (context.compress || _noSpaceCombinators[this.value]) ? '' : ' '; + output.add(spaceOrEmpty + this.value + spaceOrEmpty); + }; + return Combinator; + }(Node)); + Combinator.prototype.type = 'Combinator'; - function getLocation(index, inputStream) { - var n = index + 1; - var line = null; - var column = -1; - while (--n >= 0 && inputStream.charAt(n) !== '\n') { - column++; - } - if (typeof index === 'number') { - line = (inputStream.slice(0, index).match(/\n/g) || '').length; - } - return { - line: line, - column: column - }; - } - function copyArray(arr) { - var i; - var length = arr.length; - var copy = new Array(length); - for (i = 0; i < length; i++) { - copy[i] = arr[i]; - } - return copy; - } - function clone(obj) { - var cloned = {}; - for (var prop in obj) { - if (obj.hasOwnProperty(prop)) { - cloned[prop] = obj[prop]; - } - } - return cloned; - } - function defaults(obj1, obj2) { - var newObj = obj2 || {}; - if (!obj2._defaults) { - newObj = {}; - var defaults_1 = __assign({}, obj1); - newObj._defaults = defaults_1; - var cloned = obj2 ? __assign({}, obj2) : {}; - Object.assign(newObj, defaults_1, cloned); - } - return newObj; - } - function copyOptions(obj1, obj2) { - if (obj2 && obj2._defaults) { - return obj2; - } - var opts = defaults(obj1, obj2); - if (opts.strictMath) { - opts.math = Math$1.STRICT_LEGACY; - } - // Back compat with changed relativeUrls option - if (opts.relativeUrls) { - opts.rewriteUrls = RewriteUrls.ALL; - } - if (typeof opts.math === 'string') { - switch (opts.math.toLowerCase()) { - case 'always': - opts.math = Math$1.ALWAYS; - break; - case 'parens-division': - opts.math = Math$1.PARENS_DIVISION; - break; - case 'strict': - case 'parens': - opts.math = Math$1.PARENS; - break; - case 'strict-legacy': - opts.math = Math$1.STRICT_LEGACY; - } - } - if (typeof opts.rewriteUrls === 'string') { - switch (opts.rewriteUrls.toLowerCase()) { - case 'off': - opts.rewriteUrls = RewriteUrls.OFF; - break; - case 'local': - opts.rewriteUrls = RewriteUrls.LOCAL; - break; - case 'all': - opts.rewriteUrls = RewriteUrls.ALL; - break; - } - } - return opts; - } - function merge(obj1, obj2) { - for (var prop in obj2) { - if (obj2.hasOwnProperty(prop)) { - obj1[prop] = obj2[prop]; - } - } - return obj1; - } - function flattenArray(arr, result) { - if (result === void 0) { result = []; } - for (var i = 0, length_1 = arr.length; i < length_1; i++) { - var value = arr[i]; - if (Array.isArray(value)) { - flattenArray(value, result); - } - else { - if (value !== undefined) { - result.push(value); - } - } - } - return result; - } + var Element = /** @class */ (function (_super) { + __extends(Element, _super); + function Element(combinator, value, isVariable, index, currentFileInfo, visibilityInfo) { + var _this = _super.call(this) || this; + _this.combinator = combinator instanceof Combinator ? + combinator : new Combinator(combinator); + if (typeof value === 'string') { + _this.value = value.trim(); + } + else if (value) { + _this.value = value; + } + else { + _this.value = ''; + } + _this.isVariable = isVariable; + _this._index = index; + _this._fileInfo = currentFileInfo; + _this.copyVisibilityInfo(visibilityInfo); + _this.setParent(_this.combinator, _this); + return _this; + } + Element.prototype.accept = function (visitor) { + var value = this.value; + this.combinator = visitor.visit(this.combinator); + if (typeof value === 'object') { + this.value = visitor.visit(value); + } + }; + Element.prototype.eval = function (context) { + return new Element(this.combinator, this.value.eval ? this.value.eval(context) : this.value, this.isVariable, this.getIndex(), this.fileInfo(), this.visibilityInfo()); + }; + Element.prototype.clone = function () { + return new Element(this.combinator, this.value, this.isVariable, this.getIndex(), this.fileInfo(), this.visibilityInfo()); + }; + Element.prototype.genCSS = function (context, output) { + output.add(this.toCSS(context), this.fileInfo(), this.getIndex()); + }; + Element.prototype.toCSS = function (context) { + context = context || {}; + var value = this.value; + var firstSelector = context.firstSelector; + if (value instanceof Paren) { + // selector in parens should not be affected by outer selector + // flags (breaks only interpolated selectors - see #1973) + context.firstSelector = true; + } + value = value.toCSS ? value.toCSS(context) : value; + context.firstSelector = firstSelector; + if (value === '' && this.combinator.value.charAt(0) === '&') { + return ''; + } + else { + return this.combinator.toCSS(context) + value; + } + }; + return Element; + }(Node)); + Element.prototype.type = 'Element'; - var utils = /*#__PURE__*/Object.freeze({ - __proto__: null, - getLocation: getLocation, - copyArray: copyArray, - clone: clone, - defaults: defaults, - copyOptions: copyOptions, - merge: merge, - flattenArray: flattenArray - }); + var Math$1 = { + ALWAYS: 0, + PARENS_DIVISION: 1, + PARENS: 2, + }; + var RewriteUrls = { + OFF: 0, + LOCAL: 1, + ALL: 2 + }; - var anonymousFunc = /(|Function):(\d+):(\d+)/; - /** - * This is a centralized class of any error that could be thrown internally (mostly by the parser). - * Besides standard .message it keeps some additional data like a path to the file where the error - * occurred along with line and column numbers. - * - * @class - * @extends Error - * @type {module.LessError} - * - * @prop {string} type - * @prop {string} filename - * @prop {number} index - * @prop {number} line - * @prop {number} column - * @prop {number} callLine - * @prop {number} callExtract - * @prop {string[]} extract - * - * @param {Object} e - An error object to wrap around or just a descriptive object - * @param {Object} fileContentMap - An object with file contents in 'contents' property (like importManager) @todo - move to fileManager? - * @param {string} [currentFilename] - */ - var LessError = function LessError(e, fileContentMap, currentFilename) { - Error.call(this); - var filename = e.filename || currentFilename; - this.message = e.message; - this.stack = e.stack; - if (fileContentMap && filename) { - var input = fileContentMap.contents[filename]; - var loc = getLocation(e.index, input); - var line = loc.line; - var col = loc.column; - var callLine = e.call && getLocation(e.call, input).line; - var lines = input ? input.split('\n') : ''; - this.type = e.type || 'Syntax'; - this.filename = filename; - this.index = e.index; - this.line = typeof line === 'number' ? line + 1 : null; - this.column = col; - if (!this.line && this.stack) { - var found = this.stack.match(anonymousFunc); - /** - * We have to figure out how this environment stringifies anonymous functions - * so we can correctly map plugin errors. - * - * Note, in Node 8, the output of anonymous funcs varied based on parameters - * being present or not, so we inject dummy params. - */ - var func = new Function('a', 'throw new Error()'); - var lineAdjust = 0; - try { - func(); - } - catch (e) { - var match = e.stack.match(anonymousFunc); - var line_1 = parseInt(match[2]); - lineAdjust = 1 - line_1; - } - if (found) { - if (found[2]) { - this.line = parseInt(found[2]) + lineAdjust; - } - if (found[3]) { - this.column = parseInt(found[3]); - } - } - } - this.callLine = callLine + 1; - this.callExtract = lines[callLine]; - this.extract = [ - lines[this.line - 2], - lines[this.line - 1], - lines[this.line] - ]; - } - }; - if (typeof Object.create === 'undefined') { - var F = function () { }; - F.prototype = Error.prototype; - LessError.prototype = new F(); - } - else { - LessError.prototype = Object.create(Error.prototype); - } - LessError.prototype.constructor = LessError; - /** - * An overridden version of the default Object.prototype.toString - * which uses additional information to create a helpful message. - * - * @param {Object} options - * @returns {string} - */ - LessError.prototype.toString = function (options) { - if (options === void 0) { options = {}; } - var message = ''; - var extract = this.extract || []; - var error = []; - var stylize = function (str) { return str; }; - if (options.stylize) { - var type = typeof options.stylize; - if (type !== 'function') { - throw Error("options.stylize should be a function, got a " + type + "!"); - } - stylize = options.stylize; - } - if (this.line !== null) { - if (typeof extract[0] === 'string') { - error.push(stylize(this.line - 1 + " " + extract[0], 'grey')); - } - if (typeof extract[1] === 'string') { - var errorTxt = this.line + " "; - if (extract[1]) { - errorTxt += extract[1].slice(0, this.column) + - stylize(stylize(stylize(extract[1].substr(this.column, 1), 'bold') + - extract[1].slice(this.column + 1), 'red'), 'inverse'); - } - error.push(errorTxt); - } - if (typeof extract[2] === 'string') { - error.push(stylize(this.line + 1 + " " + extract[2], 'grey')); - } - error = error.join('\n') + stylize('', 'reset') + "\n"; - } - message += stylize(this.type + "Error: " + this.message, 'red'); - if (this.filename) { - message += stylize(' in ', 'red') + this.filename; - } - if (this.line) { - message += stylize(" on line " + this.line + ", column " + (this.column + 1) + ":", 'grey'); - } - message += "\n" + error; - if (this.callLine) { - message += stylize('from ', 'red') + (this.filename || '') + "/n"; - message += stylize(this.callLine, 'grey') + " " + this.callExtract + "/n"; - } - return message; - }; + function getLocation(index, inputStream) { + var n = index + 1; + var line = null; + var column = -1; + while (--n >= 0 && inputStream.charAt(n) !== '\n') { + column++; + } + if (typeof index === 'number') { + line = (inputStream.slice(0, index).match(/\n/g) || '').length; + } + return { + line: line, + column: column + }; + } + function copyArray(arr) { + var i; + var length = arr.length; + var copy = new Array(length); + for (i = 0; i < length; i++) { + copy[i] = arr[i]; + } + return copy; + } + function clone(obj) { + var cloned = {}; + for (var prop in obj) { + if (obj.hasOwnProperty(prop)) { + cloned[prop] = obj[prop]; + } + } + return cloned; + } + function defaults(obj1, obj2) { + var newObj = obj2 || {}; + if (!obj2._defaults) { + newObj = {}; + var defaults_1 = __assign({}, obj1); + newObj._defaults = defaults_1; + var cloned = obj2 ? __assign({}, obj2) : {}; + Object.assign(newObj, defaults_1, cloned); + } + return newObj; + } + function copyOptions(obj1, obj2) { + if (obj2 && obj2._defaults) { + return obj2; + } + var opts = defaults(obj1, obj2); + if (opts.strictMath) { + opts.math = Math$1.PARENS; + } + // Back compat with changed relativeUrls option + if (opts.relativeUrls) { + opts.rewriteUrls = RewriteUrls.ALL; + } + if (typeof opts.math === 'string') { + switch (opts.math.toLowerCase()) { + case 'always': + opts.math = Math$1.ALWAYS; + break; + case 'parens-division': + opts.math = Math$1.PARENS_DIVISION; + break; + case 'strict': + case 'parens': + opts.math = Math$1.PARENS; + break; + default: + opts.math = Math$1.PARENS; + } + } + if (typeof opts.rewriteUrls === 'string') { + switch (opts.rewriteUrls.toLowerCase()) { + case 'off': + opts.rewriteUrls = RewriteUrls.OFF; + break; + case 'local': + opts.rewriteUrls = RewriteUrls.LOCAL; + break; + case 'all': + opts.rewriteUrls = RewriteUrls.ALL; + break; + } + } + return opts; + } + function merge(obj1, obj2) { + for (var prop in obj2) { + if (obj2.hasOwnProperty(prop)) { + obj1[prop] = obj2[prop]; + } + } + return obj1; + } + function flattenArray(arr, result) { + if (result === void 0) { result = []; } + for (var i = 0, length_1 = arr.length; i < length_1; i++) { + var value = arr[i]; + if (Array.isArray(value)) { + flattenArray(value, result); + } + else { + if (value !== undefined) { + result.push(value); + } + } + } + return result; + } - var Selector = /** @class */ (function (_super) { - __extends(Selector, _super); - function Selector(elements, extendList, condition, index, currentFileInfo, visibilityInfo) { - var _this = _super.call(this) || this; - _this.extendList = extendList; - _this.condition = condition; - _this.evaldCondition = !condition; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.elements = _this.getElements(elements); - _this.mixinElements_ = undefined; - _this.copyVisibilityInfo(visibilityInfo); - _this.setParent(_this.elements, _this); - return _this; - } - Selector.prototype.accept = function (visitor) { - if (this.elements) { - this.elements = visitor.visitArray(this.elements); - } - if (this.extendList) { - this.extendList = visitor.visitArray(this.extendList); - } - if (this.condition) { - this.condition = visitor.visit(this.condition); - } - }; - Selector.prototype.createDerived = function (elements, extendList, evaldCondition) { - elements = this.getElements(elements); - var newSelector = new Selector(elements, extendList || this.extendList, null, this.getIndex(), this.fileInfo(), this.visibilityInfo()); - newSelector.evaldCondition = (evaldCondition != null) ? evaldCondition : this.evaldCondition; - newSelector.mediaEmpty = this.mediaEmpty; - return newSelector; - }; - Selector.prototype.getElements = function (els) { - if (!els) { - return [new Element('', '&', false, this._index, this._fileInfo)]; - } - if (typeof els === 'string') { - this.parse.parseNode(els, ['selector'], this._index, this._fileInfo, function (err, result) { - if (err) { - throw new LessError({ - index: err.index, - message: err.message - }, this.parse.imports, this._fileInfo.filename); - } - els = result[0].elements; - }); - } - return els; - }; - Selector.prototype.createEmptySelectors = function () { - var el = new Element('', '&', false, this._index, this._fileInfo); - var sels = [new Selector([el], null, null, this._index, this._fileInfo)]; - sels[0].mediaEmpty = true; - return sels; - }; - Selector.prototype.match = function (other) { - var elements = this.elements; - var len = elements.length; - var olen; - var i; - other = other.mixinElements(); - olen = other.length; - if (olen === 0 || len < olen) { - return 0; - } - else { - for (i = 0; i < olen; i++) { - if (elements[i].value !== other[i]) { - return 0; - } - } - } - return olen; // return number of matched elements - }; - Selector.prototype.mixinElements = function () { - if (this.mixinElements_) { - return this.mixinElements_; - } - var elements = this.elements.map(function (v) { return v.combinator.value + (v.value.value || v.value); }).join('').match(/[,&#\*\.\w-]([\w-]|(\\.))*/g); - if (elements) { - if (elements[0] === '&') { - elements.shift(); - } - } - else { - elements = []; - } - return (this.mixinElements_ = elements); - }; - Selector.prototype.isJustParentSelector = function () { - return !this.mediaEmpty && - this.elements.length === 1 && - this.elements[0].value === '&' && - (this.elements[0].combinator.value === ' ' || this.elements[0].combinator.value === ''); - }; - Selector.prototype.eval = function (context) { - var evaldCondition = this.condition && this.condition.eval(context); - var elements = this.elements; - var extendList = this.extendList; - elements = elements && elements.map(function (e) { return e.eval(context); }); - extendList = extendList && extendList.map(function (extend) { return extend.eval(context); }); - return this.createDerived(elements, extendList, evaldCondition); - }; - Selector.prototype.genCSS = function (context, output) { - var i; - var element; - if ((!context || !context.firstSelector) && this.elements[0].combinator.value === '') { - output.add(' ', this.fileInfo(), this.getIndex()); - } - for (i = 0; i < this.elements.length; i++) { - element = this.elements[i]; - element.genCSS(context, output); - } - }; - Selector.prototype.getIsOutput = function () { - return this.evaldCondition; - }; - return Selector; - }(Node)); - Selector.prototype.type = 'Selector'; + var utils = /*#__PURE__*/Object.freeze({ + __proto__: null, + getLocation: getLocation, + copyArray: copyArray, + clone: clone, + defaults: defaults, + copyOptions: copyOptions, + merge: merge, + flattenArray: flattenArray + }); - var Value = /** @class */ (function (_super) { - __extends(Value, _super); - function Value(value) { - var _this = _super.call(this) || this; - if (!value) { - throw new Error('Value requires an array argument'); - } - if (!Array.isArray(value)) { - _this.value = [value]; - } - else { - _this.value = value; - } - return _this; - } - Value.prototype.accept = function (visitor) { - if (this.value) { - this.value = visitor.visitArray(this.value); - } - }; - Value.prototype.eval = function (context) { - if (this.value.length === 1) { - return this.value[0].eval(context); - } - else { - return new Value(this.value.map(function (v) { return v.eval(context); })); - } - }; - Value.prototype.genCSS = function (context, output) { - var i; - for (i = 0; i < this.value.length; i++) { - this.value[i].genCSS(context, output); - if (i + 1 < this.value.length) { - output.add((context && context.compress) ? ',' : ', '); - } - } - }; - return Value; - }(Node)); - Value.prototype.type = 'Value'; + var anonymousFunc = /(|Function):(\d+):(\d+)/; + /** + * This is a centralized class of any error that could be thrown internally (mostly by the parser). + * Besides standard .message it keeps some additional data like a path to the file where the error + * occurred along with line and column numbers. + * + * @class + * @extends Error + * @type {module.LessError} + * + * @prop {string} type + * @prop {string} filename + * @prop {number} index + * @prop {number} line + * @prop {number} column + * @prop {number} callLine + * @prop {number} callExtract + * @prop {string[]} extract + * + * @param {Object} e - An error object to wrap around or just a descriptive object + * @param {Object} fileContentMap - An object with file contents in 'contents' property (like importManager) @todo - move to fileManager? + * @param {string} [currentFilename] + */ + var LessError = function (e, fileContentMap, currentFilename) { + Error.call(this); + var filename = e.filename || currentFilename; + this.message = e.message; + this.stack = e.stack; + if (fileContentMap && filename) { + var input = fileContentMap.contents[filename]; + var loc = getLocation(e.index, input); + var line = loc.line; + var col = loc.column; + var callLine = e.call && getLocation(e.call, input).line; + var lines = input ? input.split('\n') : ''; + this.type = e.type || 'Syntax'; + this.filename = filename; + this.index = e.index; + this.line = typeof line === 'number' ? line + 1 : null; + this.column = col; + if (!this.line && this.stack) { + var found = this.stack.match(anonymousFunc); + /** + * We have to figure out how this environment stringifies anonymous functions + * so we can correctly map plugin errors. + * + * Note, in Node 8, the output of anonymous funcs varied based on parameters + * being present or not, so we inject dummy params. + */ + var func = new Function('a', 'throw new Error()'); + var lineAdjust = 0; + try { + func(); + } + catch (e) { + var match = e.stack.match(anonymousFunc); + var line = parseInt(match[2]); + lineAdjust = 1 - line; + } + if (found) { + if (found[2]) { + this.line = parseInt(found[2]) + lineAdjust; + } + if (found[3]) { + this.column = parseInt(found[3]); + } + } + } + this.callLine = callLine + 1; + this.callExtract = lines[callLine]; + this.extract = [ + lines[this.line - 2], + lines[this.line - 1], + lines[this.line] + ]; + } + }; + if (typeof Object.create === 'undefined') { + var F = function () { }; + F.prototype = Error.prototype; + LessError.prototype = new F(); + } + else { + LessError.prototype = Object.create(Error.prototype); + } + LessError.prototype.constructor = LessError; + /** + * An overridden version of the default Object.prototype.toString + * which uses additional information to create a helpful message. + * + * @param {Object} options + * @returns {string} + */ + LessError.prototype.toString = function (options) { + options = options || {}; + var message = ''; + var extract = this.extract || []; + var error = []; + var stylize = function (str) { return str; }; + if (options.stylize) { + var type = typeof options.stylize; + if (type !== 'function') { + throw Error("options.stylize should be a function, got a " + type + "!"); + } + stylize = options.stylize; + } + if (this.line !== null) { + if (typeof extract[0] === 'string') { + error.push(stylize(this.line - 1 + " " + extract[0], 'grey')); + } + if (typeof extract[1] === 'string') { + var errorTxt = this.line + " "; + if (extract[1]) { + errorTxt += extract[1].slice(0, this.column) + + stylize(stylize(stylize(extract[1].substr(this.column, 1), 'bold') + + extract[1].slice(this.column + 1), 'red'), 'inverse'); + } + error.push(errorTxt); + } + if (typeof extract[2] === 'string') { + error.push(stylize(this.line + 1 + " " + extract[2], 'grey')); + } + error = error.join('\n') + stylize('', 'reset') + "\n"; + } + message += stylize(this.type + "Error: " + this.message, 'red'); + if (this.filename) { + message += stylize(' in ', 'red') + this.filename; + } + if (this.line) { + message += stylize(" on line " + this.line + ", column " + (this.column + 1) + ":", 'grey'); + } + message += "\n" + error; + if (this.callLine) { + message += stylize('from ', 'red') + (this.filename || '') + "/n"; + message += stylize(this.callLine, 'grey') + " " + this.callExtract + "/n"; + } + return message; + }; - var Keyword = /** @class */ (function (_super) { - __extends(Keyword, _super); - function Keyword(value) { - var _this = _super.call(this) || this; - _this.value = value; - return _this; - } - Keyword.prototype.genCSS = function (context, output) { - if (this.value === '%') { - throw { type: 'Syntax', message: 'Invalid % without number' }; - } - output.add(this.value); - }; - return Keyword; - }(Node)); - Keyword.prototype.type = 'Keyword'; - Keyword.True = new Keyword('true'); - Keyword.False = new Keyword('false'); + var Selector = /** @class */ (function (_super) { + __extends(Selector, _super); + function Selector(elements, extendList, condition, index, currentFileInfo, visibilityInfo) { + var _this = _super.call(this) || this; + _this.extendList = extendList; + _this.condition = condition; + _this.evaldCondition = !condition; + _this._index = index; + _this._fileInfo = currentFileInfo; + _this.elements = _this.getElements(elements); + _this.mixinElements_ = undefined; + _this.copyVisibilityInfo(visibilityInfo); + _this.setParent(_this.elements, _this); + return _this; + } + Selector.prototype.accept = function (visitor) { + if (this.elements) { + this.elements = visitor.visitArray(this.elements); + } + if (this.extendList) { + this.extendList = visitor.visitArray(this.extendList); + } + if (this.condition) { + this.condition = visitor.visit(this.condition); + } + }; + Selector.prototype.createDerived = function (elements, extendList, evaldCondition) { + elements = this.getElements(elements); + var newSelector = new Selector(elements, extendList || this.extendList, null, this.getIndex(), this.fileInfo(), this.visibilityInfo()); + newSelector.evaldCondition = (evaldCondition != null) ? evaldCondition : this.evaldCondition; + newSelector.mediaEmpty = this.mediaEmpty; + return newSelector; + }; + Selector.prototype.getElements = function (els) { + if (!els) { + return [new Element('', '&', false, this._index, this._fileInfo)]; + } + if (typeof els === 'string') { + this.parse.parseNode(els, ['selector'], this._index, this._fileInfo, function (err, result) { + if (err) { + throw new LessError({ + index: err.index, + message: err.message + }, this.parse.imports, this._fileInfo.filename); + } + els = result[0].elements; + }); + } + return els; + }; + Selector.prototype.createEmptySelectors = function () { + var el = new Element('', '&', false, this._index, this._fileInfo), sels = [new Selector([el], null, null, this._index, this._fileInfo)]; + sels[0].mediaEmpty = true; + return sels; + }; + Selector.prototype.match = function (other) { + var elements = this.elements; + var len = elements.length; + var olen; + var i; + other = other.mixinElements(); + olen = other.length; + if (olen === 0 || len < olen) { + return 0; + } + else { + for (i = 0; i < olen; i++) { + if (elements[i].value !== other[i]) { + return 0; + } + } + } + return olen; // return number of matched elements + }; + Selector.prototype.mixinElements = function () { + if (this.mixinElements_) { + return this.mixinElements_; + } + var elements = this.elements.map(function (v) { + return v.combinator.value + (v.value.value || v.value); + }).join('').match(/[,&#\*\.\w-]([\w-]|(\\.))*/g); + if (elements) { + if (elements[0] === '&') { + elements.shift(); + } + } + else { + elements = []; + } + return (this.mixinElements_ = elements); + }; + Selector.prototype.isJustParentSelector = function () { + return !this.mediaEmpty && + this.elements.length === 1 && + this.elements[0].value === '&' && + (this.elements[0].combinator.value === ' ' || this.elements[0].combinator.value === ''); + }; + Selector.prototype.eval = function (context) { + var evaldCondition = this.condition && this.condition.eval(context); + var elements = this.elements; + var extendList = this.extendList; + elements = elements && elements.map(function (e) { return e.eval(context); }); + extendList = extendList && extendList.map(function (extend) { return extend.eval(context); }); + return this.createDerived(elements, extendList, evaldCondition); + }; + Selector.prototype.genCSS = function (context, output) { + var i, element; + if ((!context || !context.firstSelector) && this.elements[0].combinator.value === '') { + output.add(' ', this.fileInfo(), this.getIndex()); + } + for (i = 0; i < this.elements.length; i++) { + element = this.elements[i]; + element.genCSS(context, output); + } + }; + Selector.prototype.getIsOutput = function () { + return this.evaldCondition; + }; + return Selector; + }(Node)); + Selector.prototype.type = 'Selector'; - var Anonymous = /** @class */ (function (_super) { - __extends(Anonymous, _super); - function Anonymous(value, index, currentFileInfo, mapLines, rulesetLike, visibilityInfo) { - var _this = _super.call(this) || this; - _this.value = value; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.mapLines = mapLines; - _this.rulesetLike = (typeof rulesetLike === 'undefined') ? false : rulesetLike; - _this.allowRoot = true; - _this.copyVisibilityInfo(visibilityInfo); - return _this; - } - Anonymous.prototype.eval = function () { - return new Anonymous(this.value, this._index, this._fileInfo, this.mapLines, this.rulesetLike, this.visibilityInfo()); - }; - Anonymous.prototype.compare = function (other) { - return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined; - }; - Anonymous.prototype.isRulesetLike = function () { - return this.rulesetLike; - }; - Anonymous.prototype.genCSS = function (context, output) { - this.nodeVisible = Boolean(this.value); - if (this.nodeVisible) { - output.add(this.value, this._fileInfo, this._index, this.mapLines); - } - }; - return Anonymous; - }(Node)); - Anonymous.prototype.type = 'Anonymous'; + var Value = /** @class */ (function (_super) { + __extends(Value, _super); + function Value(value) { + var _this = _super.call(this) || this; + if (!value) { + throw new Error('Value requires an array argument'); + } + if (!Array.isArray(value)) { + _this.value = [value]; + } + else { + _this.value = value; + } + return _this; + } + Value.prototype.accept = function (visitor) { + if (this.value) { + this.value = visitor.visitArray(this.value); + } + }; + Value.prototype.eval = function (context) { + if (this.value.length === 1) { + return this.value[0].eval(context); + } + else { + return new Value(this.value.map(function (v) { + return v.eval(context); + })); + } + }; + Value.prototype.genCSS = function (context, output) { + var i; + for (i = 0; i < this.value.length; i++) { + this.value[i].genCSS(context, output); + if (i + 1 < this.value.length) { + output.add((context && context.compress) ? ',' : ', '); + } + } + }; + return Value; + }(Node)); + Value.prototype.type = 'Value'; - var MATH = Math$1; - var Declaration = /** @class */ (function (_super) { - __extends(Declaration, _super); - function Declaration(name, value, important, merge, index, currentFileInfo, inline, variable) { - var _this = _super.call(this) || this; - _this.name = name; - _this.value = (value instanceof Node) ? value : new Value([value ? new Anonymous(value) : null]); - _this.important = important ? " " + important.trim() : ''; - _this.merge = merge; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.inline = inline || false; - _this.variable = (variable !== undefined) ? variable - : (name.charAt && (name.charAt(0) === '@')); - _this.allowRoot = true; - _this.setParent(_this.value, _this); - return _this; - } - Declaration.prototype.genCSS = function (context, output) { - output.add(this.name + (context.compress ? ':' : ': '), this.fileInfo(), this.getIndex()); - try { - this.value.genCSS(context, output); - } - catch (e) { - e.index = this._index; - e.filename = this._fileInfo.filename; - throw e; - } - output.add(this.important + ((this.inline || (context.lastRule && context.compress)) ? '' : ';'), this._fileInfo, this._index); - }; - Declaration.prototype.eval = function (context) { - var mathBypass = false; - var prevMath; - var name = this.name; - var evaldValue; - var variable = this.variable; - if (typeof name !== 'string') { - // expand 'primitive' name directly to get - // things faster (~10% for benchmark.less): - name = (name.length === 1) && (name[0] instanceof Keyword) ? - name[0].value : evalName(context, name); - variable = false; // never treat expanded interpolation as new variable name - } - // @todo remove when parens-division is default - if (name === 'font' && context.math === MATH.ALWAYS) { - mathBypass = true; - prevMath = context.math; - context.math = MATH.PARENS_DIVISION; - } - try { - context.importantScope.push({}); - evaldValue = this.value.eval(context); - if (!this.variable && evaldValue.type === 'DetachedRuleset') { - throw { message: 'Rulesets cannot be evaluated on a property.', - index: this.getIndex(), filename: this.fileInfo().filename }; - } - var important = this.important; - var importantResult = context.importantScope.pop(); - if (!important && importantResult.important) { - important = importantResult.important; - } - return new Declaration(name, evaldValue, important, this.merge, this.getIndex(), this.fileInfo(), this.inline, variable); - } - catch (e) { - if (typeof e.index !== 'number') { - e.index = this.getIndex(); - e.filename = this.fileInfo().filename; - } - throw e; - } - finally { - if (mathBypass) { - context.math = prevMath; - } - } - }; - Declaration.prototype.makeImportant = function () { - return new Declaration(this.name, this.value, '!important', this.merge, this.getIndex(), this.fileInfo(), this.inline); - }; - return Declaration; - }(Node)); - function evalName(context, name) { - var value = ''; - var i; - var n = name.length; - var output = { add: function (s) { value += s; } }; - for (i = 0; i < n; i++) { - name[i].eval(context).genCSS(context, output); - } - return value; - } - Declaration.prototype.type = 'Declaration'; + var Keyword = /** @class */ (function (_super) { + __extends(Keyword, _super); + function Keyword(value) { + var _this = _super.call(this) || this; + _this.value = value; + return _this; + } + Keyword.prototype.genCSS = function (context, output) { + if (this.value === '%') { + throw { type: 'Syntax', message: 'Invalid % without number' }; + } + output.add(this.value); + }; + return Keyword; + }(Node)); + Keyword.prototype.type = 'Keyword'; + Keyword.True = new Keyword('true'); + Keyword.False = new Keyword('false'); - var debugInfo = function (context, ctx, lineSeparator) { - var result = ''; - if (context.dumpLineNumbers && !context.compress) { - switch (context.dumpLineNumbers) { - case 'comments': - result = debugInfo.asComment(ctx); - break; - case 'mediaquery': - result = debugInfo.asMediaQuery(ctx); - break; - case 'all': - result = debugInfo.asComment(ctx) + (lineSeparator || '') + debugInfo.asMediaQuery(ctx); - break; - } - } - return result; - }; - debugInfo.asComment = function (ctx) { return ctx.debugInfo ? "/* line " + ctx.debugInfo.lineNumber + ", " + ctx.debugInfo.fileName + " */\n" : ''; }; - debugInfo.asMediaQuery = function (ctx) { - if (!ctx.debugInfo) { - return ''; - } - var filenameWithProtocol = ctx.debugInfo.fileName; - if (!/^[a-z]+:\/\//i.test(filenameWithProtocol)) { - filenameWithProtocol = "file://" + filenameWithProtocol; - } - return "@media -sass-debug-info{filename{font-family:" + filenameWithProtocol.replace(/([.:\/\\])/g, function (a) { - if (a == '\\') { - a = '\/'; - } - return "\\" + a; - }) + "}line{font-family:\\00003" + ctx.debugInfo.lineNumber + "}}\n"; - }; + var Anonymous = /** @class */ (function (_super) { + __extends(Anonymous, _super); + function Anonymous(value, index, currentFileInfo, mapLines, rulesetLike, visibilityInfo) { + var _this = _super.call(this) || this; + _this.value = value; + _this._index = index; + _this._fileInfo = currentFileInfo; + _this.mapLines = mapLines; + _this.rulesetLike = (typeof rulesetLike === 'undefined') ? false : rulesetLike; + _this.allowRoot = true; + _this.copyVisibilityInfo(visibilityInfo); + return _this; + } + Anonymous.prototype.eval = function () { + return new Anonymous(this.value, this._index, this._fileInfo, this.mapLines, this.rulesetLike, this.visibilityInfo()); + }; + Anonymous.prototype.compare = function (other) { + return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined; + }; + Anonymous.prototype.isRulesetLike = function () { + return this.rulesetLike; + }; + Anonymous.prototype.genCSS = function (context, output) { + this.nodeVisible = Boolean(this.value); + if (this.nodeVisible) { + output.add(this.value, this._fileInfo, this._index, this.mapLines); + } + }; + return Anonymous; + }(Node)); + Anonymous.prototype.type = 'Anonymous'; - var Comment = /** @class */ (function (_super) { - __extends(Comment, _super); - function Comment(value, isLineComment, index, currentFileInfo) { - var _this = _super.call(this) || this; - _this.value = value; - _this.isLineComment = isLineComment; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.allowRoot = true; - return _this; - } - Comment.prototype.genCSS = function (context, output) { - if (this.debugInfo) { - output.add(debugInfo(context, this), this.fileInfo(), this.getIndex()); - } - output.add(this.value); - }; - Comment.prototype.isSilent = function (context) { - var isCompressed = context.compress && this.value[2] !== '!'; - return this.isLineComment || isCompressed; - }; - return Comment; - }(Node)); - Comment.prototype.type = 'Comment'; + var MATH = Math$1; + var Declaration = /** @class */ (function (_super) { + __extends(Declaration, _super); + function Declaration(name, value, important, merge, index, currentFileInfo, inline, variable) { + var _this = _super.call(this) || this; + _this.name = name; + _this.value = (value instanceof Node) ? value : new Value([value ? new Anonymous(value) : null]); + _this.important = important ? " " + important.trim() : ''; + _this.merge = merge; + _this._index = index; + _this._fileInfo = currentFileInfo; + _this.inline = inline || false; + _this.variable = (variable !== undefined) ? variable + : (name.charAt && (name.charAt(0) === '@')); + _this.allowRoot = true; + _this.setParent(_this.value, _this); + return _this; + } + Declaration.prototype.genCSS = function (context, output) { + output.add(this.name + (context.compress ? ':' : ': '), this.fileInfo(), this.getIndex()); + try { + this.value.genCSS(context, output); + } + catch (e) { + e.index = this._index; + e.filename = this._fileInfo.filename; + throw e; + } + output.add(this.important + ((this.inline || (context.lastRule && context.compress)) ? '' : ';'), this._fileInfo, this._index); + }; + Declaration.prototype.eval = function (context) { + var mathBypass = false, prevMath, name = this.name, evaldValue, variable = this.variable; + if (typeof name !== 'string') { + // expand 'primitive' name directly to get + // things faster (~10% for benchmark.less): + name = (name.length === 1) && (name[0] instanceof Keyword) ? + name[0].value : evalName(context, name); + variable = false; // never treat expanded interpolation as new variable name + } + // @todo remove when parens-division is default + if (name === 'font' && context.math === MATH.ALWAYS) { + mathBypass = true; + prevMath = context.math; + context.math = MATH.PARENS_DIVISION; + } + try { + context.importantScope.push({}); + evaldValue = this.value.eval(context); + if (!this.variable && evaldValue.type === 'DetachedRuleset') { + throw { message: 'Rulesets cannot be evaluated on a property.', + index: this.getIndex(), filename: this.fileInfo().filename }; + } + var important = this.important; + var importantResult = context.importantScope.pop(); + if (!important && importantResult.important) { + important = importantResult.important; + } + return new Declaration(name, evaldValue, important, this.merge, this.getIndex(), this.fileInfo(), this.inline, variable); + } + catch (e) { + if (typeof e.index !== 'number') { + e.index = this.getIndex(); + e.filename = this.fileInfo().filename; + } + throw e; + } + finally { + if (mathBypass) { + context.math = prevMath; + } + } + }; + Declaration.prototype.makeImportant = function () { + return new Declaration(this.name, this.value, '!important', this.merge, this.getIndex(), this.fileInfo(), this.inline); + }; + return Declaration; + }(Node)); + function evalName(context, name) { + var value = ''; + var i; + var n = name.length; + var output = { add: function (s) { value += s; } }; + for (i = 0; i < n; i++) { + name[i].eval(context).genCSS(context, output); + } + return value; + } + Declaration.prototype.type = 'Declaration'; - var contexts = {}; - var copyFromOriginal = function copyFromOriginal(original, destination, propertiesToCopy) { - if (!original) { - return; - } - for (var i = 0; i < propertiesToCopy.length; i++) { - if (original.hasOwnProperty(propertiesToCopy[i])) { - destination[propertiesToCopy[i]] = original[propertiesToCopy[i]]; - } - } - }; - /* - parse is used whilst parsing - */ - var parseCopyProperties = [ - // options - 'paths', - 'rewriteUrls', - 'rootpath', - 'strictImports', - 'insecure', - 'dumpLineNumbers', - 'compress', - 'syncImport', - 'chunkInput', - 'mime', - 'useFileCache', - // context - 'processImports', - // Used by the import manager to stop multiple import visitors being created. - 'pluginManager' // Used as the plugin manager for the session - ]; - contexts.Parse = function (options) { - copyFromOriginal(options, this, parseCopyProperties); - if (typeof this.paths === 'string') { - this.paths = [this.paths]; - } - }; - var evalCopyProperties = [ - 'paths', - 'compress', - 'math', - 'strictUnits', - 'sourceMap', - 'importMultiple', - 'urlArgs', - 'javascriptEnabled', - 'pluginManager', - 'importantScope', - 'rewriteUrls' // option - whether to adjust URL's to be relative - ]; - function isPathRelative(path) { - return !/^(?:[a-z-]+:|\/|#)/i.test(path); - } - function isPathLocalRelative(path) { - return path.charAt(0) === '.'; - } - contexts.Eval = /** @class */ (function () { - function Eval(options, frames) { - copyFromOriginal(options, this, evalCopyProperties); - if (typeof this.paths === 'string') { - this.paths = [this.paths]; - } - this.frames = frames || []; - this.importantScope = this.importantScope || []; - this.inCalc = false; - this.mathOn = true; - } - Eval.prototype.enterCalc = function () { - if (!this.calcStack) { - this.calcStack = []; - } - this.calcStack.push(true); - this.inCalc = true; - }; - Eval.prototype.exitCalc = function () { - this.calcStack.pop(); - if (!this.calcStack.length) { - this.inCalc = false; - } - }; - Eval.prototype.inParenthesis = function () { - if (!this.parensStack) { - this.parensStack = []; - } - this.parensStack.push(true); - }; - Eval.prototype.outOfParenthesis = function () { - this.parensStack.pop(); - }; - Eval.prototype.isMathOn = function (op) { - if (!this.mathOn) { - return false; - } - if (op === '/' && this.math !== Math$1.ALWAYS && (!this.parensStack || !this.parensStack.length)) { - return false; - } - if (this.math > Math$1.PARENS_DIVISION) { - return this.parensStack && this.parensStack.length; - } - return true; - }; - Eval.prototype.pathRequiresRewrite = function (path) { - var isRelative = this.rewriteUrls === RewriteUrls.LOCAL ? isPathLocalRelative : isPathRelative; - return isRelative(path); - }; - Eval.prototype.rewritePath = function (path, rootpath) { - var newPath; - rootpath = rootpath || ''; - newPath = this.normalizePath(rootpath + path); - // If a path was explicit relative and the rootpath was not an absolute path - // we must ensure that the new path is also explicit relative. - if (isPathLocalRelative(path) && - isPathRelative(rootpath) && - isPathLocalRelative(newPath) === false) { - newPath = "./" + newPath; - } - return newPath; - }; - Eval.prototype.normalizePath = function (path) { - var segments = path.split('/').reverse(); - var segment; - path = []; - while (segments.length !== 0) { - segment = segments.pop(); - switch (segment) { - case '.': - break; - case '..': - if ((path.length === 0) || (path[path.length - 1] === '..')) { - path.push(segment); - } - else { - path.pop(); - } - break; - default: - path.push(segment); - break; - } - } - return path.join('/'); - }; - return Eval; - }()); + var debugInfo = /** @class */ (function () { + function debugInfo(context, ctx, lineSeparator) { + var result = ''; + if (context.dumpLineNumbers && !context.compress) { + switch (context.dumpLineNumbers) { + case 'comments': + result = debugInfo.asComment(ctx); + break; + case 'mediaquery': + result = debugInfo.asMediaQuery(ctx); + break; + case 'all': + result = debugInfo.asComment(ctx) + (lineSeparator || '') + debugInfo.asMediaQuery(ctx); + break; + } + } + return result; + } + debugInfo.asComment = function (ctx) { + return "/* line " + ctx.debugInfo.lineNumber + ", " + ctx.debugInfo.fileName + " */\n"; + }; + debugInfo.asMediaQuery = function (ctx) { + var filenameWithProtocol = ctx.debugInfo.fileName; + if (!/^[a-z]+:\/\//i.test(filenameWithProtocol)) { + filenameWithProtocol = "file://" + filenameWithProtocol; + } + return "@media -sass-debug-info{filename{font-family:" + filenameWithProtocol.replace(/([.:\/\\])/g, function (a) { + if (a == '\\') { + a = '\/'; + } + return "\\" + a; + }) + "}line{font-family:\\00003" + ctx.debugInfo.lineNumber + "}}\n"; + }; + return debugInfo; + }()); - function makeRegistry(base) { - return { - _data: {}, - add: function (name, func) { - // precautionary case conversion, as later querying of - // the registry by function-caller uses lower case as well. - name = name.toLowerCase(); - if (this._data.hasOwnProperty(name)) ; - this._data[name] = func; - }, - addMultiple: function (functions) { - var _this = this; - Object.keys(functions).forEach(function (name) { - _this.add(name, functions[name]); - }); - }, - get: function (name) { - return this._data[name] || (base && base.get(name)); - }, - getLocalFunctions: function () { - return this._data; - }, - inherit: function () { - return makeRegistry(this); - }, - create: function (base) { - return makeRegistry(base); - } - }; - } - var functionRegistry = makeRegistry(null); + var Comment = /** @class */ (function (_super) { + __extends(Comment, _super); + function Comment(value, isLineComment, index, currentFileInfo) { + var _this = _super.call(this) || this; + _this.value = value; + _this.isLineComment = isLineComment; + _this._index = index; + _this._fileInfo = currentFileInfo; + _this.allowRoot = true; + return _this; + } + Comment.prototype.genCSS = function (context, output) { + if (this.debugInfo) { + output.add(debugInfo(context, this), this.fileInfo(), this.getIndex()); + } + output.add(this.value); + }; + Comment.prototype.isSilent = function (context) { + var isCompressed = context.compress && this.value[2] !== '!'; + return this.isLineComment || isCompressed; + }; + return Comment; + }(Node)); + Comment.prototype.type = 'Comment'; - var defaultFunc = { - eval: function () { - var v = this.value_; - var e = this.error_; - if (e) { - throw e; - } - if (v != null) { - return v ? Keyword.True : Keyword.False; - } - }, - value: function (v) { - this.value_ = v; - }, - error: function (e) { - this.error_ = e; - }, - reset: function () { - this.value_ = this.error_ = null; - } - }; + var contexts = {}; + var copyFromOriginal = function copyFromOriginal(original, destination, propertiesToCopy) { + if (!original) { + return; + } + for (var i = 0; i < propertiesToCopy.length; i++) { + if (original.hasOwnProperty(propertiesToCopy[i])) { + destination[propertiesToCopy[i]] = original[propertiesToCopy[i]]; + } + } + }; + /* + parse is used whilst parsing + */ + var parseCopyProperties = [ + // options + 'paths', + 'rewriteUrls', + 'rootpath', + 'strictImports', + 'insecure', + 'dumpLineNumbers', + 'compress', + 'syncImport', + 'chunkInput', + 'mime', + 'useFileCache', + // context + 'processImports', + // Used by the import manager to stop multiple import visitors being created. + 'pluginManager' // Used as the plugin manager for the session + ]; + contexts.Parse = function (options) { + copyFromOriginal(options, this, parseCopyProperties); + if (typeof this.paths === 'string') { + this.paths = [this.paths]; + } + }; + var evalCopyProperties = [ + 'paths', + 'compress', + 'ieCompat', + 'math', + 'strictUnits', + 'sourceMap', + 'importMultiple', + 'urlArgs', + 'javascriptEnabled', + 'pluginManager', + 'importantScope', + 'rewriteUrls' // option - whether to adjust URL's to be relative + ]; + contexts.Eval = function (options, frames) { + copyFromOriginal(options, this, evalCopyProperties); + if (typeof this.paths === 'string') { + this.paths = [this.paths]; + } + this.frames = frames || []; + this.importantScope = this.importantScope || []; + }; + contexts.Eval.prototype.enterCalc = function () { + if (!this.calcStack) { + this.calcStack = []; + } + this.calcStack.push(true); + this.inCalc = true; + }; + contexts.Eval.prototype.exitCalc = function () { + this.calcStack.pop(); + if (!this.calcStack.length) { + this.inCalc = false; + } + }; + contexts.Eval.prototype.inParenthesis = function () { + if (!this.parensStack) { + this.parensStack = []; + } + this.parensStack.push(true); + }; + contexts.Eval.prototype.outOfParenthesis = function () { + this.parensStack.pop(); + }; + contexts.Eval.prototype.inCalc = false; + contexts.Eval.prototype.mathOn = true; + contexts.Eval.prototype.isMathOn = function (op) { + if (!this.mathOn) { + return false; + } + if (op === '/' && this.math !== Math$1.ALWAYS && (!this.parensStack || !this.parensStack.length)) { + return false; + } + if (this.math > Math$1.PARENS_DIVISION) { + return this.parensStack && this.parensStack.length; + } + return true; + }; + contexts.Eval.prototype.pathRequiresRewrite = function (path) { + var isRelative = this.rewriteUrls === RewriteUrls.LOCAL ? isPathLocalRelative : isPathRelative; + return isRelative(path); + }; + contexts.Eval.prototype.rewritePath = function (path, rootpath) { + var newPath; + rootpath = rootpath || ''; + newPath = this.normalizePath(rootpath + path); + // If a path was explicit relative and the rootpath was not an absolute path + // we must ensure that the new path is also explicit relative. + if (isPathLocalRelative(path) && + isPathRelative(rootpath) && + isPathLocalRelative(newPath) === false) { + newPath = "./" + newPath; + } + return newPath; + }; + contexts.Eval.prototype.normalizePath = function (path) { + var segments = path.split('/').reverse(); + var segment; + path = []; + while (segments.length !== 0) { + segment = segments.pop(); + switch (segment) { + case '.': + break; + case '..': + if ((path.length === 0) || (path[path.length - 1] === '..')) { + path.push(segment); + } + else { + path.pop(); + } + break; + default: + path.push(segment); + break; + } + } + return path.join('/'); + }; + function isPathRelative(path) { + return !/^(?:[a-z-]+:|\/|#)/i.test(path); + } + function isPathLocalRelative(path) { + return path.charAt(0) === '.'; + } + // todo - do the same for the toCSS ? - var Ruleset = /** @class */ (function (_super) { - __extends(Ruleset, _super); - function Ruleset(selectors, rules, strictImports, visibilityInfo) { - var _this = _super.call(this) || this; - _this.selectors = selectors; - _this.rules = rules; - _this._lookups = {}; - _this._variables = null; - _this._properties = null; - _this.strictImports = strictImports; - _this.copyVisibilityInfo(visibilityInfo); - _this.allowRoot = true; - _this.setParent(_this.selectors, _this); - _this.setParent(_this.rules, _this); - return _this; - } - Ruleset.prototype.isRulesetLike = function () { - return true; - }; - Ruleset.prototype.accept = function (visitor) { - if (this.paths) { - this.paths = visitor.visitArray(this.paths, true); - } - else if (this.selectors) { - this.selectors = visitor.visitArray(this.selectors); - } - if (this.rules && this.rules.length) { - this.rules = visitor.visitArray(this.rules); - } - }; - Ruleset.prototype.eval = function (context) { - var selectors; - var selCnt; - var selector; - var i; - var hasVariable; - var hasOnePassingSelector = false; - if (this.selectors && (selCnt = this.selectors.length)) { - selectors = new Array(selCnt); - defaultFunc.error({ - type: 'Syntax', - message: 'it is currently only allowed in parametric mixin guards,' - }); - for (i = 0; i < selCnt; i++) { - selector = this.selectors[i].eval(context); - for (var j = 0; j < selector.elements.length; j++) { - if (selector.elements[j].isVariable) { - hasVariable = true; - break; - } - } - selectors[i] = selector; - if (selector.evaldCondition) { - hasOnePassingSelector = true; - } - } - if (hasVariable) { - var toParseSelectors = new Array(selCnt); - for (i = 0; i < selCnt; i++) { - selector = selectors[i]; - toParseSelectors[i] = selector.toCSS(context); - } - this.parse.parseNode(toParseSelectors.join(','), ["selectors"], selectors[0].getIndex(), selectors[0].fileInfo(), function (err, result) { - if (result) { - selectors = flattenArray(result); - } - }); - } - defaultFunc.reset(); - } - else { - hasOnePassingSelector = true; - } - var rules = this.rules ? copyArray(this.rules) : null; - var ruleset = new Ruleset(selectors, rules, this.strictImports, this.visibilityInfo()); - var rule; - var subRule; - ruleset.originalRuleset = this; - ruleset.root = this.root; - ruleset.firstRoot = this.firstRoot; - ruleset.allowImports = this.allowImports; - if (this.debugInfo) { - ruleset.debugInfo = this.debugInfo; - } - if (!hasOnePassingSelector) { - rules.length = 0; - } - // inherit a function registry from the frames stack when possible; - // otherwise from the global registry - ruleset.functionRegistry = (function (frames) { - var i = 0; - var n = frames.length; - var found; - for (; i !== n; ++i) { - found = frames[i].functionRegistry; - if (found) { - return found; - } - } - return functionRegistry; - })(context.frames).inherit(); - // push the current ruleset to the frames stack - var ctxFrames = context.frames; - ctxFrames.unshift(ruleset); - // currrent selectors - var ctxSelectors = context.selectors; - if (!ctxSelectors) { - context.selectors = ctxSelectors = []; - } - ctxSelectors.unshift(this.selectors); - // Evaluate imports - if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) { - ruleset.evalImports(context); - } - // Store the frames around mixin definitions, - // so they can be evaluated like closures when the time comes. - var rsRules = ruleset.rules; - for (i = 0; (rule = rsRules[i]); i++) { - if (rule.evalFirst) { - rsRules[i] = rule.eval(context); - } - } - var mediaBlockCount = (context.mediaBlocks && context.mediaBlocks.length) || 0; - // Evaluate mixin calls. - for (i = 0; (rule = rsRules[i]); i++) { - if (rule.type === 'MixinCall') { - /* jshint loopfunc:true */ - rules = rule.eval(context).filter(function (r) { - if ((r instanceof Declaration) && r.variable) { - // do not pollute the scope if the variable is - // already there. consider returning false here - // but we need a way to "return" variable from mixins - return !(ruleset.variable(r.name)); - } - return true; - }); - rsRules.splice.apply(rsRules, [i, 1].concat(rules)); - i += rules.length - 1; - ruleset.resetCache(); - } - else if (rule.type === 'VariableCall') { - /* jshint loopfunc:true */ - rules = rule.eval(context).rules.filter(function (r) { - if ((r instanceof Declaration) && r.variable) { - // do not pollute the scope at all - return false; - } - return true; - }); - rsRules.splice.apply(rsRules, [i, 1].concat(rules)); - i += rules.length - 1; - ruleset.resetCache(); - } - } - // Evaluate everything else - for (i = 0; (rule = rsRules[i]); i++) { - if (!rule.evalFirst) { - rsRules[i] = rule = rule.eval ? rule.eval(context) : rule; - } - } - // Evaluate everything else - for (i = 0; (rule = rsRules[i]); i++) { - // for rulesets, check if it is a css guard and can be removed - if (rule instanceof Ruleset && rule.selectors && rule.selectors.length === 1) { - // check if it can be folded in (e.g. & where) - if (rule.selectors[0] && rule.selectors[0].isJustParentSelector()) { - rsRules.splice(i--, 1); - for (var j = 0; (subRule = rule.rules[j]); j++) { - if (subRule instanceof Node) { - subRule.copyVisibilityInfo(rule.visibilityInfo()); - if (!(subRule instanceof Declaration) || !subRule.variable) { - rsRules.splice(++i, 0, subRule); - } - } - } - } - } - } - // Pop the stack - ctxFrames.shift(); - ctxSelectors.shift(); - if (context.mediaBlocks) { - for (i = mediaBlockCount; i < context.mediaBlocks.length; i++) { - context.mediaBlocks[i].bubbleSelectors(selectors); - } - } - return ruleset; - }; - Ruleset.prototype.evalImports = function (context) { - var rules = this.rules; - var i; - var importRules; - if (!rules) { - return; - } - for (i = 0; i < rules.length; i++) { - if (rules[i].type === 'Import') { - importRules = rules[i].eval(context); - if (importRules && (importRules.length || importRules.length === 0)) { - rules.splice.apply(rules, [i, 1].concat(importRules)); - i += importRules.length - 1; - } - else { - rules.splice(i, 1, importRules); - } - this.resetCache(); - } - } - }; - Ruleset.prototype.makeImportant = function () { - var result = new Ruleset(this.selectors, this.rules.map(function (r) { - if (r.makeImportant) { - return r.makeImportant(); - } - else { - return r; - } - }), this.strictImports, this.visibilityInfo()); - return result; - }; - Ruleset.prototype.matchArgs = function (args) { - return !args || args.length === 0; - }; - // lets you call a css selector with a guard - Ruleset.prototype.matchCondition = function (args, context) { - var lastSelector = this.selectors[this.selectors.length - 1]; - if (!lastSelector.evaldCondition) { - return false; - } - if (lastSelector.condition && - !lastSelector.condition.eval(new contexts.Eval(context, context.frames))) { - return false; - } - return true; - }; - Ruleset.prototype.resetCache = function () { - this._rulesets = null; - this._variables = null; - this._properties = null; - this._lookups = {}; - }; - Ruleset.prototype.variables = function () { - if (!this._variables) { - this._variables = !this.rules ? {} : this.rules.reduce(function (hash, r) { - if (r instanceof Declaration && r.variable === true) { - hash[r.name] = r; - } - // when evaluating variables in an import statement, imports have not been eval'd - // so we need to go inside import statements. - // guard against root being a string (in the case of inlined less) - if (r.type === 'Import' && r.root && r.root.variables) { - var vars = r.root.variables(); - for (var name_1 in vars) { - if (vars.hasOwnProperty(name_1)) { - hash[name_1] = r.root.variable(name_1); - } - } - } - return hash; - }, {}); - } - return this._variables; - }; - Ruleset.prototype.properties = function () { - if (!this._properties) { - this._properties = !this.rules ? {} : this.rules.reduce(function (hash, r) { - if (r instanceof Declaration && r.variable !== true) { - var name_2 = (r.name.length === 1) && (r.name[0] instanceof Keyword) ? - r.name[0].value : r.name; - // Properties don't overwrite as they can merge - if (!hash["$" + name_2]) { - hash["$" + name_2] = [r]; - } - else { - hash["$" + name_2].push(r); - } - } - return hash; - }, {}); - } - return this._properties; - }; - Ruleset.prototype.variable = function (name) { - var decl = this.variables()[name]; - if (decl) { - return this.parseValue(decl); - } - }; - Ruleset.prototype.property = function (name) { - var decl = this.properties()[name]; - if (decl) { - return this.parseValue(decl); - } - }; - Ruleset.prototype.lastDeclaration = function () { - for (var i = this.rules.length; i > 0; i--) { - var decl = this.rules[i - 1]; - if (decl instanceof Declaration) { - return this.parseValue(decl); - } - } - }; - Ruleset.prototype.parseValue = function (toParse) { - var self = this; - function transformDeclaration(decl) { - if (decl.value instanceof Anonymous && !decl.parsed) { - if (typeof decl.value.value === 'string') { - this.parse.parseNode(decl.value.value, ['value', 'important'], decl.value.getIndex(), decl.fileInfo(), function (err, result) { - if (err) { - decl.parsed = true; - } - if (result) { - decl.value = result[0]; - decl.important = result[1] || ''; - decl.parsed = true; - } - }); - } - else { - decl.parsed = true; - } - return decl; - } - else { - return decl; - } - } - if (!Array.isArray(toParse)) { - return transformDeclaration.call(self, toParse); - } - else { - var nodes_1 = []; - toParse.forEach(function (n) { - nodes_1.push(transformDeclaration.call(self, n)); - }); - return nodes_1; - } - }; - Ruleset.prototype.rulesets = function () { - if (!this.rules) { - return []; - } - var filtRules = []; - var rules = this.rules; - var i; - var rule; - for (i = 0; (rule = rules[i]); i++) { - if (rule.isRuleset) { - filtRules.push(rule); - } - } - return filtRules; - }; - Ruleset.prototype.prependRule = function (rule) { - var rules = this.rules; - if (rules) { - rules.unshift(rule); - } - else { - this.rules = [rule]; - } - this.setParent(rule, this); - }; - Ruleset.prototype.find = function (selector, self, filter) { - if (self === void 0) { self = this; } - var rules = []; - var match; - var foundMixins; - var key = selector.toCSS(); - if (key in this._lookups) { - return this._lookups[key]; - } - this.rulesets().forEach(function (rule) { - if (rule !== self) { - for (var j = 0; j < rule.selectors.length; j++) { - match = selector.match(rule.selectors[j]); - if (match) { - if (selector.elements.length > match) { - if (!filter || filter(rule)) { - foundMixins = rule.find(new Selector(selector.elements.slice(match)), self, filter); - for (var i = 0; i < foundMixins.length; ++i) { - foundMixins[i].path.push(rule); - } - Array.prototype.push.apply(rules, foundMixins); - } - } - else { - rules.push({ rule: rule, path: [] }); - } - break; - } - } - } - }); - this._lookups[key] = rules; - return rules; - }; - Ruleset.prototype.genCSS = function (context, output) { - var i; - var j; - var charsetRuleNodes = []; - var ruleNodes = []; - var // Line number debugging - debugInfo$1; - var rule; - var path; - context.tabLevel = (context.tabLevel || 0); - if (!this.root) { - context.tabLevel++; - } - var tabRuleStr = context.compress ? '' : Array(context.tabLevel + 1).join(' '); - var tabSetStr = context.compress ? '' : Array(context.tabLevel).join(' '); - var sep; - var charsetNodeIndex = 0; - var importNodeIndex = 0; - for (i = 0; (rule = this.rules[i]); i++) { - if (rule instanceof Comment) { - if (importNodeIndex === i) { - importNodeIndex++; - } - ruleNodes.push(rule); - } - else if (rule.isCharset && rule.isCharset()) { - ruleNodes.splice(charsetNodeIndex, 0, rule); - charsetNodeIndex++; - importNodeIndex++; - } - else if (rule.type === 'Import') { - ruleNodes.splice(importNodeIndex, 0, rule); - importNodeIndex++; - } - else { - ruleNodes.push(rule); - } - } - ruleNodes = charsetRuleNodes.concat(ruleNodes); - // If this is the root node, we don't render - // a selector, or {}. - if (!this.root) { - debugInfo$1 = debugInfo(context, this, tabSetStr); - if (debugInfo$1) { - output.add(debugInfo$1); - output.add(tabSetStr); - } - var paths = this.paths; - var pathCnt = paths.length; - var pathSubCnt = void 0; - sep = context.compress ? ',' : (",\n" + tabSetStr); - for (i = 0; i < pathCnt; i++) { - path = paths[i]; - if (!(pathSubCnt = path.length)) { - continue; - } - if (i > 0) { - output.add(sep); - } - context.firstSelector = true; - path[0].genCSS(context, output); - context.firstSelector = false; - for (j = 1; j < pathSubCnt; j++) { - path[j].genCSS(context, output); - } - } - output.add((context.compress ? '{' : ' {\n') + tabRuleStr); - } - // Compile rules and rulesets - for (i = 0; (rule = ruleNodes[i]); i++) { - if (i + 1 === ruleNodes.length) { - context.lastRule = true; - } - var currentLastRule = context.lastRule; - if (rule.isRulesetLike(rule)) { - context.lastRule = false; - } - if (rule.genCSS) { - rule.genCSS(context, output); - } - else if (rule.value) { - output.add(rule.value.toString()); - } - context.lastRule = currentLastRule; - if (!context.lastRule && rule.isVisible()) { - output.add(context.compress ? '' : ("\n" + tabRuleStr)); - } - else { - context.lastRule = false; - } - } - if (!this.root) { - output.add((context.compress ? '}' : "\n" + tabSetStr + "}")); - context.tabLevel--; - } - if (!output.isEmpty() && !context.compress && this.firstRoot) { - output.add('\n'); - } - }; - Ruleset.prototype.joinSelectors = function (paths, context, selectors) { - for (var s = 0; s < selectors.length; s++) { - this.joinSelector(paths, context, selectors[s]); - } - }; - Ruleset.prototype.joinSelector = function (paths, context, selector) { - function createParenthesis(elementsToPak, originalElement) { - var replacementParen; - var j; - if (elementsToPak.length === 0) { - replacementParen = new Paren(elementsToPak[0]); - } - else { - var insideParent = new Array(elementsToPak.length); - for (j = 0; j < elementsToPak.length; j++) { - insideParent[j] = new Element(null, elementsToPak[j], originalElement.isVariable, originalElement._index, originalElement._fileInfo); - } - replacementParen = new Paren(new Selector(insideParent)); - } - return replacementParen; - } - function createSelector(containedElement, originalElement) { - var element; - var selector; - element = new Element(null, containedElement, originalElement.isVariable, originalElement._index, originalElement._fileInfo); - selector = new Selector([element]); - return selector; - } - // joins selector path from `beginningPath` with selector path in `addPath` - // `replacedElement` contains element that is being replaced by `addPath` - // returns concatenated path - function addReplacementIntoPath(beginningPath, addPath, replacedElement, originalSelector) { - var newSelectorPath; - var lastSelector; - var newJoinedSelector; - // our new selector path - newSelectorPath = []; - // construct the joined selector - if & is the first thing this will be empty, - // if not newJoinedSelector will be the last set of elements in the selector - if (beginningPath.length > 0) { - newSelectorPath = copyArray(beginningPath); - lastSelector = newSelectorPath.pop(); - newJoinedSelector = originalSelector.createDerived(copyArray(lastSelector.elements)); - } - else { - newJoinedSelector = originalSelector.createDerived([]); - } - if (addPath.length > 0) { - // /deep/ is a CSS4 selector - (removed, so should deprecate) - // that is valid without anything in front of it - // so if the & does not have a combinator that is "" or " " then - // and there is a combinator on the parent, then grab that. - // this also allows + a { & .b { .a & { ... though not sure why you would want to do that - var combinator = replacedElement.combinator; - var parentEl = addPath[0].elements[0]; - if (combinator.emptyOrWhitespace && !parentEl.combinator.emptyOrWhitespace) { - combinator = parentEl.combinator; - } - // join the elements so far with the first part of the parent - newJoinedSelector.elements.push(new Element(combinator, parentEl.value, replacedElement.isVariable, replacedElement._index, replacedElement._fileInfo)); - newJoinedSelector.elements = newJoinedSelector.elements.concat(addPath[0].elements.slice(1)); - } - // now add the joined selector - but only if it is not empty - if (newJoinedSelector.elements.length !== 0) { - newSelectorPath.push(newJoinedSelector); - } - // put together the parent selectors after the join (e.g. the rest of the parent) - if (addPath.length > 1) { - var restOfPath = addPath.slice(1); - restOfPath = restOfPath.map(function (selector) { return selector.createDerived(selector.elements, []); }); - newSelectorPath = newSelectorPath.concat(restOfPath); - } - return newSelectorPath; - } - // joins selector path from `beginningPath` with every selector path in `addPaths` array - // `replacedElement` contains element that is being replaced by `addPath` - // returns array with all concatenated paths - function addAllReplacementsIntoPath(beginningPath, addPaths, replacedElement, originalSelector, result) { - var j; - for (j = 0; j < beginningPath.length; j++) { - var newSelectorPath = addReplacementIntoPath(beginningPath[j], addPaths, replacedElement, originalSelector); - result.push(newSelectorPath); - } - return result; - } - function mergeElementsOnToSelectors(elements, selectors) { - var i; - var sel; - if (elements.length === 0) { - return; - } - if (selectors.length === 0) { - selectors.push([new Selector(elements)]); - return; - } - for (i = 0; (sel = selectors[i]); i++) { - // if the previous thing in sel is a parent this needs to join on to it - if (sel.length > 0) { - sel[sel.length - 1] = sel[sel.length - 1].createDerived(sel[sel.length - 1].elements.concat(elements)); - } - else { - sel.push(new Selector(elements)); - } - } - } - // replace all parent selectors inside `inSelector` by content of `context` array - // resulting selectors are returned inside `paths` array - // returns true if `inSelector` contained at least one parent selector - function replaceParentSelector(paths, context, inSelector) { - // The paths are [[Selector]] - // The first list is a list of comma separated selectors - // The inner list is a list of inheritance separated selectors - // e.g. - // .a, .b { - // .c { - // } - // } - // == [[.a] [.c]] [[.b] [.c]] - // - var i; - var j; - var k; - var currentElements; - var newSelectors; - var selectorsMultiplied; - var sel; - var el; - var hadParentSelector = false; - var length; - var lastSelector; - function findNestedSelector(element) { - var maybeSelector; - if (!(element.value instanceof Paren)) { - return null; - } - maybeSelector = element.value.value; - if (!(maybeSelector instanceof Selector)) { - return null; - } - return maybeSelector; - } - // the elements from the current selector so far - currentElements = []; - // the current list of new selectors to add to the path. - // We will build it up. We initiate it with one empty selector as we "multiply" the new selectors - // by the parents - newSelectors = [ - [] - ]; - for (i = 0; (el = inSelector.elements[i]); i++) { - // non parent reference elements just get added - if (el.value !== '&') { - var nestedSelector = findNestedSelector(el); - if (nestedSelector != null) { - // merge the current list of non parent selector elements - // on to the current list of selectors to add - mergeElementsOnToSelectors(currentElements, newSelectors); - var nestedPaths = []; - var replaced = void 0; - var replacedNewSelectors = []; - replaced = replaceParentSelector(nestedPaths, context, nestedSelector); - hadParentSelector = hadParentSelector || replaced; - // the nestedPaths array should have only one member - replaceParentSelector does not multiply selectors - for (k = 0; k < nestedPaths.length; k++) { - var replacementSelector = createSelector(createParenthesis(nestedPaths[k], el), el); - addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors); - } - newSelectors = replacedNewSelectors; - currentElements = []; - } - else { - currentElements.push(el); - } - } - else { - hadParentSelector = true; - // the new list of selectors to add - selectorsMultiplied = []; - // merge the current list of non parent selector elements - // on to the current list of selectors to add - mergeElementsOnToSelectors(currentElements, newSelectors); - // loop through our current selectors - for (j = 0; j < newSelectors.length; j++) { - sel = newSelectors[j]; - // if we don't have any parent paths, the & might be in a mixin so that it can be used - // whether there are parents or not - if (context.length === 0) { - // the combinator used on el should now be applied to the next element instead so that - // it is not lost - if (sel.length > 0) { - sel[0].elements.push(new Element(el.combinator, '', el.isVariable, el._index, el._fileInfo)); - } - selectorsMultiplied.push(sel); - } - else { - // and the parent selectors - for (k = 0; k < context.length; k++) { - // We need to put the current selectors - // then join the last selector's elements on to the parents selectors - var newSelectorPath = addReplacementIntoPath(sel, context[k], el, inSelector); - // add that to our new set of selectors - selectorsMultiplied.push(newSelectorPath); - } - } - } - // our new selectors has been multiplied, so reset the state - newSelectors = selectorsMultiplied; - currentElements = []; - } - } - // if we have any elements left over (e.g. .a& .b == .b) - // add them on to all the current selectors - mergeElementsOnToSelectors(currentElements, newSelectors); - for (i = 0; i < newSelectors.length; i++) { - length = newSelectors[i].length; - if (length > 0) { - paths.push(newSelectors[i]); - lastSelector = newSelectors[i][length - 1]; - newSelectors[i][length - 1] = lastSelector.createDerived(lastSelector.elements, inSelector.extendList); - } - } - return hadParentSelector; - } - function deriveSelector(visibilityInfo, deriveFrom) { - var newSelector = deriveFrom.createDerived(deriveFrom.elements, deriveFrom.extendList, deriveFrom.evaldCondition); - newSelector.copyVisibilityInfo(visibilityInfo); - return newSelector; - } - // joinSelector code follows - var i; - var newPaths; - var hadParentSelector; - newPaths = []; - hadParentSelector = replaceParentSelector(newPaths, context, selector); - if (!hadParentSelector) { - if (context.length > 0) { - newPaths = []; - for (i = 0; i < context.length; i++) { - var concatenated = context[i].map(deriveSelector.bind(this, selector.visibilityInfo())); - concatenated.push(selector); - newPaths.push(concatenated); - } - } - else { - newPaths = [[selector]]; - } - } - for (i = 0; i < newPaths.length; i++) { - paths.push(newPaths[i]); - } - }; - return Ruleset; - }(Node)); - Ruleset.prototype.type = 'Ruleset'; - Ruleset.prototype.isRuleset = true; + function makeRegistry(base) { + return { + _data: {}, + add: function (name, func) { + // precautionary case conversion, as later querying of + // the registry by function-caller uses lower case as well. + name = name.toLowerCase(); + if (this._data.hasOwnProperty(name)) ; + this._data[name] = func; + }, + addMultiple: function (functions) { + var _this = this; + Object.keys(functions).forEach(function (name) { + _this.add(name, functions[name]); + }); + }, + get: function (name) { + return this._data[name] || (base && base.get(name)); + }, + getLocalFunctions: function () { + return this._data; + }, + inherit: function () { + return makeRegistry(this); + }, + create: function (base) { + return makeRegistry(base); + } + }; + } + var functionRegistry = makeRegistry(null); - var AtRule = /** @class */ (function (_super) { - __extends(AtRule, _super); - function AtRule(name, value, rules, index, currentFileInfo, debugInfo, isRooted, visibilityInfo) { - var _this = _super.call(this) || this; - var i; - _this.name = name; - _this.value = (value instanceof Node) ? value : (value ? new Anonymous(value) : value); - if (rules) { - if (Array.isArray(rules)) { - _this.rules = rules; - } - else { - _this.rules = [rules]; - _this.rules[0].selectors = (new Selector([], null, null, index, currentFileInfo)).createEmptySelectors(); - } - for (i = 0; i < _this.rules.length; i++) { - _this.rules[i].allowImports = true; - } - _this.setParent(_this.rules, _this); - } - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.debugInfo = debugInfo; - _this.isRooted = isRooted || false; - _this.copyVisibilityInfo(visibilityInfo); - _this.allowRoot = true; - return _this; - } - AtRule.prototype.accept = function (visitor) { - var value = this.value; - var rules = this.rules; - if (rules) { - this.rules = visitor.visitArray(rules); - } - if (value) { - this.value = visitor.visit(value); - } - }; - AtRule.prototype.isRulesetLike = function () { - return this.rules || !this.isCharset(); - }; - AtRule.prototype.isCharset = function () { - return '@charset' === this.name; - }; - AtRule.prototype.genCSS = function (context, output) { - var value = this.value; - var rules = this.rules; - output.add(this.name, this.fileInfo(), this.getIndex()); - if (value) { - output.add(' '); - value.genCSS(context, output); - } - if (rules) { - this.outputRuleset(context, output, rules); - } - else { - output.add(';'); - } - }; - AtRule.prototype.eval = function (context) { - var mediaPathBackup; - var mediaBlocksBackup; - var value = this.value; - var rules = this.rules; - // media stored inside other atrule should not bubble over it - // backpup media bubbling information - mediaPathBackup = context.mediaPath; - mediaBlocksBackup = context.mediaBlocks; - // deleted media bubbling information - context.mediaPath = []; - context.mediaBlocks = []; - if (value) { - value = value.eval(context); - } - if (rules) { - // assuming that there is only one rule at this point - that is how parser constructs the rule - rules = [rules[0].eval(context)]; - rules[0].root = true; - } - // restore media bubbling information - context.mediaPath = mediaPathBackup; - context.mediaBlocks = mediaBlocksBackup; - return new AtRule(this.name, value, rules, this.getIndex(), this.fileInfo(), this.debugInfo, this.isRooted, this.visibilityInfo()); - }; - AtRule.prototype.variable = function (name) { - if (this.rules) { - // assuming that there is only one rule at this point - that is how parser constructs the rule - return Ruleset.prototype.variable.call(this.rules[0], name); - } - }; - AtRule.prototype.find = function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } - if (this.rules) { - // assuming that there is only one rule at this point - that is how parser constructs the rule - return Ruleset.prototype.find.apply(this.rules[0], args); - } - }; - AtRule.prototype.rulesets = function () { - if (this.rules) { - // assuming that there is only one rule at this point - that is how parser constructs the rule - return Ruleset.prototype.rulesets.apply(this.rules[0]); - } - }; - AtRule.prototype.outputRuleset = function (context, output, rules) { - var ruleCnt = rules.length; - var i; - context.tabLevel = (context.tabLevel | 0) + 1; - // Compressed - if (context.compress) { - output.add('{'); - for (i = 0; i < ruleCnt; i++) { - rules[i].genCSS(context, output); - } - output.add('}'); - context.tabLevel--; - return; - } - // Non-compressed - var tabSetStr = "\n" + Array(context.tabLevel).join(' '); - var tabRuleStr = tabSetStr + " "; - if (!ruleCnt) { - output.add(" {" + tabSetStr + "}"); - } - else { - output.add(" {" + tabRuleStr); - rules[0].genCSS(context, output); - for (i = 1; i < ruleCnt; i++) { - output.add(tabRuleStr); - rules[i].genCSS(context, output); - } - output.add(tabSetStr + "}"); - } - context.tabLevel--; - }; - return AtRule; - }(Node)); - AtRule.prototype.type = 'AtRule'; + var defaultFunc = { + eval: function () { + var v = this.value_; + var e = this.error_; + if (e) { + throw e; + } + if (v != null) { + return v ? Keyword.True : Keyword.False; + } + }, + value: function (v) { + this.value_ = v; + }, + error: function (e) { + this.error_ = e; + }, + reset: function () { + this.value_ = this.error_ = null; + } + }; - var DetachedRuleset = /** @class */ (function (_super) { - __extends(DetachedRuleset, _super); - function DetachedRuleset(ruleset, frames) { - var _this = _super.call(this) || this; - _this.ruleset = ruleset; - _this.frames = frames; - _this.setParent(_this.ruleset, _this); - return _this; - } - DetachedRuleset.prototype.accept = function (visitor) { - this.ruleset = visitor.visit(this.ruleset); - }; - DetachedRuleset.prototype.eval = function (context) { - var frames = this.frames || copyArray(context.frames); - return new DetachedRuleset(this.ruleset, frames); - }; - DetachedRuleset.prototype.callEval = function (context) { - return this.ruleset.eval(this.frames ? new contexts.Eval(context, this.frames.concat(context.frames)) : context); - }; - return DetachedRuleset; - }(Node)); - DetachedRuleset.prototype.type = 'DetachedRuleset'; - DetachedRuleset.prototype.evalFirst = true; + var Ruleset = /** @class */ (function (_super) { + __extends(Ruleset, _super); + function Ruleset(selectors, rules, strictImports, visibilityInfo) { + var _this = _super.call(this) || this; + _this.selectors = selectors; + _this.rules = rules; + _this._lookups = {}; + _this._variables = null; + _this._properties = null; + _this.strictImports = strictImports; + _this.copyVisibilityInfo(visibilityInfo); + _this.allowRoot = true; + _this.setParent(_this.selectors, _this); + _this.setParent(_this.rules, _this); + return _this; + } + Ruleset.prototype.isRulesetLike = function () { return true; }; + Ruleset.prototype.accept = function (visitor) { + if (this.paths) { + this.paths = visitor.visitArray(this.paths, true); + } + else if (this.selectors) { + this.selectors = visitor.visitArray(this.selectors); + } + if (this.rules && this.rules.length) { + this.rules = visitor.visitArray(this.rules); + } + }; + Ruleset.prototype.eval = function (context) { + var selectors; + var selCnt; + var selector; + var i; + var hasVariable; + var hasOnePassingSelector = false; + if (this.selectors && (selCnt = this.selectors.length)) { + selectors = new Array(selCnt); + defaultFunc.error({ + type: 'Syntax', + message: 'it is currently only allowed in parametric mixin guards,' + }); + for (i = 0; i < selCnt; i++) { + selector = this.selectors[i].eval(context); + for (var j = 0; j < selector.elements.length; j++) { + if (selector.elements[j].isVariable) { + hasVariable = true; + break; + } + } + selectors[i] = selector; + if (selector.evaldCondition) { + hasOnePassingSelector = true; + } + } + if (hasVariable) { + var toParseSelectors = new Array(selCnt); + for (i = 0; i < selCnt; i++) { + selector = selectors[i]; + toParseSelectors[i] = selector.toCSS(context); + } + this.parse.parseNode(toParseSelectors.join(','), ["selectors"], selectors[0].getIndex(), selectors[0].fileInfo(), function (err, result) { + if (result) { + selectors = flattenArray(result); + } + }); + } + defaultFunc.reset(); + } + else { + hasOnePassingSelector = true; + } + var rules = this.rules ? copyArray(this.rules) : null; + var ruleset = new Ruleset(selectors, rules, this.strictImports, this.visibilityInfo()); + var rule; + var subRule; + ruleset.originalRuleset = this; + ruleset.root = this.root; + ruleset.firstRoot = this.firstRoot; + ruleset.allowImports = this.allowImports; + if (this.debugInfo) { + ruleset.debugInfo = this.debugInfo; + } + if (!hasOnePassingSelector) { + rules.length = 0; + } + // inherit a function registry from the frames stack when possible; + // otherwise from the global registry + ruleset.functionRegistry = (function (frames) { + var i = 0; + var n = frames.length; + var found; + for (; i !== n; ++i) { + found = frames[i].functionRegistry; + if (found) { + return found; + } + } + return functionRegistry; + }(context.frames)).inherit(); + // push the current ruleset to the frames stack + var ctxFrames = context.frames; + ctxFrames.unshift(ruleset); + // currrent selectors + var ctxSelectors = context.selectors; + if (!ctxSelectors) { + context.selectors = ctxSelectors = []; + } + ctxSelectors.unshift(this.selectors); + // Evaluate imports + if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) { + ruleset.evalImports(context); + } + // Store the frames around mixin definitions, + // so they can be evaluated like closures when the time comes. + var rsRules = ruleset.rules; + for (i = 0; (rule = rsRules[i]); i++) { + if (rule.evalFirst) { + rsRules[i] = rule.eval(context); + } + } + var mediaBlockCount = (context.mediaBlocks && context.mediaBlocks.length) || 0; + // Evaluate mixin calls. + for (i = 0; (rule = rsRules[i]); i++) { + if (rule.type === 'MixinCall') { + /* jshint loopfunc:true */ + rules = rule.eval(context).filter(function (r) { + if ((r instanceof Declaration) && r.variable) { + // do not pollute the scope if the variable is + // already there. consider returning false here + // but we need a way to "return" variable from mixins + return !(ruleset.variable(r.name)); + } + return true; + }); + rsRules.splice.apply(rsRules, [i, 1].concat(rules)); + i += rules.length - 1; + ruleset.resetCache(); + } + else if (rule.type === 'VariableCall') { + /* jshint loopfunc:true */ + rules = rule.eval(context).rules.filter(function (r) { + if ((r instanceof Declaration) && r.variable) { + // do not pollute the scope at all + return false; + } + return true; + }); + rsRules.splice.apply(rsRules, [i, 1].concat(rules)); + i += rules.length - 1; + ruleset.resetCache(); + } + } + // Evaluate everything else + for (i = 0; (rule = rsRules[i]); i++) { + if (!rule.evalFirst) { + rsRules[i] = rule = rule.eval ? rule.eval(context) : rule; + } + } + // Evaluate everything else + for (i = 0; (rule = rsRules[i]); i++) { + // for rulesets, check if it is a css guard and can be removed + if (rule instanceof Ruleset && rule.selectors && rule.selectors.length === 1) { + // check if it can be folded in (e.g. & where) + if (rule.selectors[0] && rule.selectors[0].isJustParentSelector()) { + rsRules.splice(i--, 1); + for (var j = 0; (subRule = rule.rules[j]); j++) { + if (subRule instanceof Node) { + subRule.copyVisibilityInfo(rule.visibilityInfo()); + if (!(subRule instanceof Declaration) || !subRule.variable) { + rsRules.splice(++i, 0, subRule); + } + } + } + } + } + } + // Pop the stack + ctxFrames.shift(); + ctxSelectors.shift(); + if (context.mediaBlocks) { + for (i = mediaBlockCount; i < context.mediaBlocks.length; i++) { + context.mediaBlocks[i].bubbleSelectors(selectors); + } + } + return ruleset; + }; + Ruleset.prototype.evalImports = function (context) { + var rules = this.rules; + var i; + var importRules; + if (!rules) { + return; + } + for (i = 0; i < rules.length; i++) { + if (rules[i].type === 'Import') { + importRules = rules[i].eval(context); + if (importRules && (importRules.length || importRules.length === 0)) { + rules.splice.apply(rules, [i, 1].concat(importRules)); + i += importRules.length - 1; + } + else { + rules.splice(i, 1, importRules); + } + this.resetCache(); + } + } + }; + Ruleset.prototype.makeImportant = function () { + var result = new Ruleset(this.selectors, this.rules.map(function (r) { + if (r.makeImportant) { + return r.makeImportant(); + } + else { + return r; + } + }), this.strictImports, this.visibilityInfo()); + return result; + }; + Ruleset.prototype.matchArgs = function (args) { + return !args || args.length === 0; + }; + // lets you call a css selector with a guard + Ruleset.prototype.matchCondition = function (args, context) { + var lastSelector = this.selectors[this.selectors.length - 1]; + if (!lastSelector.evaldCondition) { + return false; + } + if (lastSelector.condition && + !lastSelector.condition.eval(new contexts.Eval(context, context.frames))) { + return false; + } + return true; + }; + Ruleset.prototype.resetCache = function () { + this._rulesets = null; + this._variables = null; + this._properties = null; + this._lookups = {}; + }; + Ruleset.prototype.variables = function () { + if (!this._variables) { + this._variables = !this.rules ? {} : this.rules.reduce(function (hash, r) { + if (r instanceof Declaration && r.variable === true) { + hash[r.name] = r; + } + // when evaluating variables in an import statement, imports have not been eval'd + // so we need to go inside import statements. + // guard against root being a string (in the case of inlined less) + if (r.type === 'Import' && r.root && r.root.variables) { + var vars = r.root.variables(); + for (var name_1 in vars) { + if (vars.hasOwnProperty(name_1)) { + hash[name_1] = r.root.variable(name_1); + } + } + } + return hash; + }, {}); + } + return this._variables; + }; + Ruleset.prototype.properties = function () { + if (!this._properties) { + this._properties = !this.rules ? {} : this.rules.reduce(function (hash, r) { + if (r instanceof Declaration && r.variable !== true) { + var name_2 = (r.name.length === 1) && (r.name[0] instanceof Keyword) ? + r.name[0].value : r.name; + // Properties don't overwrite as they can merge + if (!hash["$" + name_2]) { + hash["$" + name_2] = [r]; + } + else { + hash["$" + name_2].push(r); + } + } + return hash; + }, {}); + } + return this._properties; + }; + Ruleset.prototype.variable = function (name) { + var decl = this.variables()[name]; + if (decl) { + return this.parseValue(decl); + } + }; + Ruleset.prototype.property = function (name) { + var decl = this.properties()[name]; + if (decl) { + return this.parseValue(decl); + } + }; + Ruleset.prototype.lastDeclaration = function () { + for (var i = this.rules.length; i > 0; i--) { + var decl = this.rules[i - 1]; + if (decl instanceof Declaration) { + return this.parseValue(decl); + } + } + }; + Ruleset.prototype.parseValue = function (toParse) { + var self = this; + function transformDeclaration(decl) { + if (decl.value instanceof Anonymous && !decl.parsed) { + if (typeof decl.value.value === 'string') { + this.parse.parseNode(decl.value.value, ['value', 'important'], decl.value.getIndex(), decl.fileInfo(), function (err, result) { + if (err) { + decl.parsed = true; + } + if (result) { + decl.value = result[0]; + decl.important = result[1] || ''; + decl.parsed = true; + } + }); + } + else { + decl.parsed = true; + } + return decl; + } + else { + return decl; + } + } + if (!Array.isArray(toParse)) { + return transformDeclaration.call(self, toParse); + } + else { + var nodes_1 = []; + toParse.forEach(function (n) { + nodes_1.push(transformDeclaration.call(self, n)); + }); + return nodes_1; + } + }; + Ruleset.prototype.rulesets = function () { + if (!this.rules) { + return []; + } + var filtRules = []; + var rules = this.rules; + var i; + var rule; + for (i = 0; (rule = rules[i]); i++) { + if (rule.isRuleset) { + filtRules.push(rule); + } + } + return filtRules; + }; + Ruleset.prototype.prependRule = function (rule) { + var rules = this.rules; + if (rules) { + rules.unshift(rule); + } + else { + this.rules = [rule]; + } + this.setParent(rule, this); + }; + Ruleset.prototype.find = function (selector, self, filter) { + self = self || this; + var rules = []; + var match; + var foundMixins; + var key = selector.toCSS(); + if (key in this._lookups) { + return this._lookups[key]; + } + this.rulesets().forEach(function (rule) { + if (rule !== self) { + for (var j = 0; j < rule.selectors.length; j++) { + match = selector.match(rule.selectors[j]); + if (match) { + if (selector.elements.length > match) { + if (!filter || filter(rule)) { + foundMixins = rule.find(new Selector(selector.elements.slice(match)), self, filter); + for (var i = 0; i < foundMixins.length; ++i) { + foundMixins[i].path.push(rule); + } + Array.prototype.push.apply(rules, foundMixins); + } + } + else { + rules.push({ rule: rule, path: [] }); + } + break; + } + } + } + }); + this._lookups[key] = rules; + return rules; + }; + Ruleset.prototype.genCSS = function (context, output) { + var i; + var j; + var charsetRuleNodes = []; + var ruleNodes = []; + var // Line number debugging + debugInfo$1; + var rule; + var path; + context.tabLevel = (context.tabLevel || 0); + if (!this.root) { + context.tabLevel++; + } + var tabRuleStr = context.compress ? '' : Array(context.tabLevel + 1).join(' '); + var tabSetStr = context.compress ? '' : Array(context.tabLevel).join(' '); + var sep; + var charsetNodeIndex = 0; + var importNodeIndex = 0; + for (i = 0; (rule = this.rules[i]); i++) { + if (rule instanceof Comment) { + if (importNodeIndex === i) { + importNodeIndex++; + } + ruleNodes.push(rule); + } + else if (rule.isCharset && rule.isCharset()) { + ruleNodes.splice(charsetNodeIndex, 0, rule); + charsetNodeIndex++; + importNodeIndex++; + } + else if (rule.type === 'Import') { + ruleNodes.splice(importNodeIndex, 0, rule); + importNodeIndex++; + } + else { + ruleNodes.push(rule); + } + } + ruleNodes = charsetRuleNodes.concat(ruleNodes); + // If this is the root node, we don't render + // a selector, or {}. + if (!this.root) { + debugInfo$1 = debugInfo(context, this, tabSetStr); + if (debugInfo$1) { + output.add(debugInfo$1); + output.add(tabSetStr); + } + var paths = this.paths; + var pathCnt = paths.length; + var pathSubCnt = void 0; + sep = context.compress ? ',' : (",\n" + tabSetStr); + for (i = 0; i < pathCnt; i++) { + path = paths[i]; + if (!(pathSubCnt = path.length)) { + continue; + } + if (i > 0) { + output.add(sep); + } + context.firstSelector = true; + path[0].genCSS(context, output); + context.firstSelector = false; + for (j = 1; j < pathSubCnt; j++) { + path[j].genCSS(context, output); + } + } + output.add((context.compress ? '{' : ' {\n') + tabRuleStr); + } + // Compile rules and rulesets + for (i = 0; (rule = ruleNodes[i]); i++) { + if (i + 1 === ruleNodes.length) { + context.lastRule = true; + } + var currentLastRule = context.lastRule; + if (rule.isRulesetLike(rule)) { + context.lastRule = false; + } + if (rule.genCSS) { + rule.genCSS(context, output); + } + else if (rule.value) { + output.add(rule.value.toString()); + } + context.lastRule = currentLastRule; + if (!context.lastRule && rule.isVisible()) { + output.add(context.compress ? '' : ("\n" + tabRuleStr)); + } + else { + context.lastRule = false; + } + } + if (!this.root) { + output.add((context.compress ? '}' : "\n" + tabSetStr + "}")); + context.tabLevel--; + } + if (!output.isEmpty() && !context.compress && this.firstRoot) { + output.add('\n'); + } + }; + Ruleset.prototype.joinSelectors = function (paths, context, selectors) { + for (var s = 0; s < selectors.length; s++) { + this.joinSelector(paths, context, selectors[s]); + } + }; + Ruleset.prototype.joinSelector = function (paths, context, selector) { + function createParenthesis(elementsToPak, originalElement) { + var replacementParen, j; + if (elementsToPak.length === 0) { + replacementParen = new Paren(elementsToPak[0]); + } + else { + var insideParent = new Array(elementsToPak.length); + for (j = 0; j < elementsToPak.length; j++) { + insideParent[j] = new Element(null, elementsToPak[j], originalElement.isVariable, originalElement._index, originalElement._fileInfo); + } + replacementParen = new Paren(new Selector(insideParent)); + } + return replacementParen; + } + function createSelector(containedElement, originalElement) { + var element, selector; + element = new Element(null, containedElement, originalElement.isVariable, originalElement._index, originalElement._fileInfo); + selector = new Selector([element]); + return selector; + } + // joins selector path from `beginningPath` with selector path in `addPath` + // `replacedElement` contains element that is being replaced by `addPath` + // returns concatenated path + function addReplacementIntoPath(beginningPath, addPath, replacedElement, originalSelector) { + var newSelectorPath, lastSelector, newJoinedSelector; + // our new selector path + newSelectorPath = []; + // construct the joined selector - if & is the first thing this will be empty, + // if not newJoinedSelector will be the last set of elements in the selector + if (beginningPath.length > 0) { + newSelectorPath = copyArray(beginningPath); + lastSelector = newSelectorPath.pop(); + newJoinedSelector = originalSelector.createDerived(copyArray(lastSelector.elements)); + } + else { + newJoinedSelector = originalSelector.createDerived([]); + } + if (addPath.length > 0) { + // /deep/ is a CSS4 selector - (removed, so should deprecate) + // that is valid without anything in front of it + // so if the & does not have a combinator that is "" or " " then + // and there is a combinator on the parent, then grab that. + // this also allows + a { & .b { .a & { ... though not sure why you would want to do that + var combinator = replacedElement.combinator; + var parentEl = addPath[0].elements[0]; + if (combinator.emptyOrWhitespace && !parentEl.combinator.emptyOrWhitespace) { + combinator = parentEl.combinator; + } + // join the elements so far with the first part of the parent + newJoinedSelector.elements.push(new Element(combinator, parentEl.value, replacedElement.isVariable, replacedElement._index, replacedElement._fileInfo)); + newJoinedSelector.elements = newJoinedSelector.elements.concat(addPath[0].elements.slice(1)); + } + // now add the joined selector - but only if it is not empty + if (newJoinedSelector.elements.length !== 0) { + newSelectorPath.push(newJoinedSelector); + } + // put together the parent selectors after the join (e.g. the rest of the parent) + if (addPath.length > 1) { + var restOfPath = addPath.slice(1); + restOfPath = restOfPath.map(function (selector) { + return selector.createDerived(selector.elements, []); + }); + newSelectorPath = newSelectorPath.concat(restOfPath); + } + return newSelectorPath; + } + // joins selector path from `beginningPath` with every selector path in `addPaths` array + // `replacedElement` contains element that is being replaced by `addPath` + // returns array with all concatenated paths + function addAllReplacementsIntoPath(beginningPath, addPaths, replacedElement, originalSelector, result) { + var j; + for (j = 0; j < beginningPath.length; j++) { + var newSelectorPath = addReplacementIntoPath(beginningPath[j], addPaths, replacedElement, originalSelector); + result.push(newSelectorPath); + } + return result; + } + function mergeElementsOnToSelectors(elements, selectors) { + var i, sel; + if (elements.length === 0) { + return; + } + if (selectors.length === 0) { + selectors.push([new Selector(elements)]); + return; + } + for (i = 0; (sel = selectors[i]); i++) { + // if the previous thing in sel is a parent this needs to join on to it + if (sel.length > 0) { + sel[sel.length - 1] = sel[sel.length - 1].createDerived(sel[sel.length - 1].elements.concat(elements)); + } + else { + sel.push(new Selector(elements)); + } + } + } + // replace all parent selectors inside `inSelector` by content of `context` array + // resulting selectors are returned inside `paths` array + // returns true if `inSelector` contained at least one parent selector + function replaceParentSelector(paths, context, inSelector) { + // The paths are [[Selector]] + // The first list is a list of comma separated selectors + // The inner list is a list of inheritance separated selectors + // e.g. + // .a, .b { + // .c { + // } + // } + // == [[.a] [.c]] [[.b] [.c]] + // + var i, j, k, currentElements, newSelectors, selectorsMultiplied, sel, el, hadParentSelector = false, length, lastSelector; + function findNestedSelector(element) { + var maybeSelector; + if (!(element.value instanceof Paren)) { + return null; + } + maybeSelector = element.value.value; + if (!(maybeSelector instanceof Selector)) { + return null; + } + return maybeSelector; + } + // the elements from the current selector so far + currentElements = []; + // the current list of new selectors to add to the path. + // We will build it up. We initiate it with one empty selector as we "multiply" the new selectors + // by the parents + newSelectors = [ + [] + ]; + for (i = 0; (el = inSelector.elements[i]); i++) { + // non parent reference elements just get added + if (el.value !== '&') { + var nestedSelector = findNestedSelector(el); + if (nestedSelector != null) { + // merge the current list of non parent selector elements + // on to the current list of selectors to add + mergeElementsOnToSelectors(currentElements, newSelectors); + var nestedPaths = []; + var replaced = void 0; + var replacedNewSelectors = []; + replaced = replaceParentSelector(nestedPaths, context, nestedSelector); + hadParentSelector = hadParentSelector || replaced; + // the nestedPaths array should have only one member - replaceParentSelector does not multiply selectors + for (k = 0; k < nestedPaths.length; k++) { + var replacementSelector = createSelector(createParenthesis(nestedPaths[k], el), el); + addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors); + } + newSelectors = replacedNewSelectors; + currentElements = []; + } + else { + currentElements.push(el); + } + } + else { + hadParentSelector = true; + // the new list of selectors to add + selectorsMultiplied = []; + // merge the current list of non parent selector elements + // on to the current list of selectors to add + mergeElementsOnToSelectors(currentElements, newSelectors); + // loop through our current selectors + for (j = 0; j < newSelectors.length; j++) { + sel = newSelectors[j]; + // if we don't have any parent paths, the & might be in a mixin so that it can be used + // whether there are parents or not + if (context.length === 0) { + // the combinator used on el should now be applied to the next element instead so that + // it is not lost + if (sel.length > 0) { + sel[0].elements.push(new Element(el.combinator, '', el.isVariable, el._index, el._fileInfo)); + } + selectorsMultiplied.push(sel); + } + else { + // and the parent selectors + for (k = 0; k < context.length; k++) { + // We need to put the current selectors + // then join the last selector's elements on to the parents selectors + var newSelectorPath = addReplacementIntoPath(sel, context[k], el, inSelector); + // add that to our new set of selectors + selectorsMultiplied.push(newSelectorPath); + } + } + } + // our new selectors has been multiplied, so reset the state + newSelectors = selectorsMultiplied; + currentElements = []; + } + } + // if we have any elements left over (e.g. .a& .b == .b) + // add them on to all the current selectors + mergeElementsOnToSelectors(currentElements, newSelectors); + for (i = 0; i < newSelectors.length; i++) { + length = newSelectors[i].length; + if (length > 0) { + paths.push(newSelectors[i]); + lastSelector = newSelectors[i][length - 1]; + newSelectors[i][length - 1] = lastSelector.createDerived(lastSelector.elements, inSelector.extendList); + } + } + return hadParentSelector; + } + function deriveSelector(visibilityInfo, deriveFrom) { + var newSelector = deriveFrom.createDerived(deriveFrom.elements, deriveFrom.extendList, deriveFrom.evaldCondition); + newSelector.copyVisibilityInfo(visibilityInfo); + return newSelector; + } + // joinSelector code follows + var i, newPaths, hadParentSelector; + newPaths = []; + hadParentSelector = replaceParentSelector(newPaths, context, selector); + if (!hadParentSelector) { + if (context.length > 0) { + newPaths = []; + for (i = 0; i < context.length; i++) { + var concatenated = context[i].map(deriveSelector.bind(this, selector.visibilityInfo())); + concatenated.push(selector); + newPaths.push(concatenated); + } + } + else { + newPaths = [[selector]]; + } + } + for (i = 0; i < newPaths.length; i++) { + paths.push(newPaths[i]); + } + }; + return Ruleset; + }(Node)); + Ruleset.prototype.type = 'Ruleset'; + Ruleset.prototype.isRuleset = true; - var Unit = /** @class */ (function (_super) { - __extends(Unit, _super); - function Unit(numerator, denominator, backupUnit) { - var _this = _super.call(this) || this; - _this.numerator = numerator ? copyArray(numerator).sort() : []; - _this.denominator = denominator ? copyArray(denominator).sort() : []; - if (backupUnit) { - _this.backupUnit = backupUnit; - } - else if (numerator && numerator.length) { - _this.backupUnit = numerator[0]; - } - return _this; - } - Unit.prototype.clone = function () { - return new Unit(copyArray(this.numerator), copyArray(this.denominator), this.backupUnit); - }; - Unit.prototype.genCSS = function (context, output) { - // Dimension checks the unit is singular and throws an error if in strict math mode. - var strictUnits = context && context.strictUnits; - if (this.numerator.length === 1) { - output.add(this.numerator[0]); // the ideal situation - } - else if (!strictUnits && this.backupUnit) { - output.add(this.backupUnit); - } - else if (!strictUnits && this.denominator.length) { - output.add(this.denominator[0]); - } - }; - Unit.prototype.toString = function () { - var i; - var returnStr = this.numerator.join('*'); - for (i = 0; i < this.denominator.length; i++) { - returnStr += "/" + this.denominator[i]; - } - return returnStr; - }; - Unit.prototype.compare = function (other) { - return this.is(other.toString()) ? 0 : undefined; - }; - Unit.prototype.is = function (unitString) { - return this.toString().toUpperCase() === unitString.toUpperCase(); - }; - Unit.prototype.isLength = function () { - return RegExp('^(px|em|ex|ch|rem|in|cm|mm|pc|pt|ex|vw|vh|vmin|vmax)$', 'gi').test(this.toCSS()); - }; - Unit.prototype.isEmpty = function () { - return this.numerator.length === 0 && this.denominator.length === 0; - }; - Unit.prototype.isSingular = function () { - return this.numerator.length <= 1 && this.denominator.length === 0; - }; - Unit.prototype.map = function (callback) { - var i; - for (i = 0; i < this.numerator.length; i++) { - this.numerator[i] = callback(this.numerator[i], false); - } - for (i = 0; i < this.denominator.length; i++) { - this.denominator[i] = callback(this.denominator[i], true); - } - }; - Unit.prototype.usedUnits = function () { - var group; - var result = {}; - var mapUnit; - var groupName; - mapUnit = function (atomicUnit) { - /* jshint loopfunc:true */ - if (group.hasOwnProperty(atomicUnit) && !result[groupName]) { - result[groupName] = atomicUnit; - } - return atomicUnit; - }; - for (groupName in unitConversions) { - if (unitConversions.hasOwnProperty(groupName)) { - group = unitConversions[groupName]; - this.map(mapUnit); - } - } - return result; - }; - Unit.prototype.cancel = function () { - var counter = {}; - var atomicUnit; - var i; - for (i = 0; i < this.numerator.length; i++) { - atomicUnit = this.numerator[i]; - counter[atomicUnit] = (counter[atomicUnit] || 0) + 1; - } - for (i = 0; i < this.denominator.length; i++) { - atomicUnit = this.denominator[i]; - counter[atomicUnit] = (counter[atomicUnit] || 0) - 1; - } - this.numerator = []; - this.denominator = []; - for (atomicUnit in counter) { - if (counter.hasOwnProperty(atomicUnit)) { - var count = counter[atomicUnit]; - if (count > 0) { - for (i = 0; i < count; i++) { - this.numerator.push(atomicUnit); - } - } - else if (count < 0) { - for (i = 0; i < -count; i++) { - this.denominator.push(atomicUnit); - } - } - } - } - this.numerator.sort(); - this.denominator.sort(); - }; - return Unit; - }(Node)); - Unit.prototype.type = 'Unit'; + var AtRule = /** @class */ (function (_super) { + __extends(AtRule, _super); + function AtRule(name, value, rules, index, currentFileInfo, debugInfo, isRooted, visibilityInfo) { + var _this = _super.call(this) || this; + var i; + _this.name = name; + _this.value = (value instanceof Node) ? value : (value ? new Anonymous(value) : value); + if (rules) { + if (Array.isArray(rules)) { + _this.rules = rules; + } + else { + _this.rules = [rules]; + _this.rules[0].selectors = (new Selector([], null, null, index, currentFileInfo)).createEmptySelectors(); + } + for (i = 0; i < _this.rules.length; i++) { + _this.rules[i].allowImports = true; + } + _this.setParent(_this.rules, _this); + } + _this._index = index; + _this._fileInfo = currentFileInfo; + _this.debugInfo = debugInfo; + _this.isRooted = isRooted || false; + _this.copyVisibilityInfo(visibilityInfo); + _this.allowRoot = true; + return _this; + } + AtRule.prototype.accept = function (visitor) { + var value = this.value, rules = this.rules; + if (rules) { + this.rules = visitor.visitArray(rules); + } + if (value) { + this.value = visitor.visit(value); + } + }; + AtRule.prototype.isRulesetLike = function () { + return this.rules || !this.isCharset(); + }; + AtRule.prototype.isCharset = function () { + return '@charset' === this.name; + }; + AtRule.prototype.genCSS = function (context, output) { + var value = this.value, rules = this.rules; + output.add(this.name, this.fileInfo(), this.getIndex()); + if (value) { + output.add(' '); + value.genCSS(context, output); + } + if (rules) { + this.outputRuleset(context, output, rules); + } + else { + output.add(';'); + } + }; + AtRule.prototype.eval = function (context) { + var mediaPathBackup, mediaBlocksBackup, value = this.value, rules = this.rules; + // media stored inside other atrule should not bubble over it + // backpup media bubbling information + mediaPathBackup = context.mediaPath; + mediaBlocksBackup = context.mediaBlocks; + // deleted media bubbling information + context.mediaPath = []; + context.mediaBlocks = []; + if (value) { + value = value.eval(context); + } + if (rules) { + // assuming that there is only one rule at this point - that is how parser constructs the rule + rules = [rules[0].eval(context)]; + rules[0].root = true; + } + // restore media bubbling information + context.mediaPath = mediaPathBackup; + context.mediaBlocks = mediaBlocksBackup; + return new AtRule(this.name, value, rules, this.getIndex(), this.fileInfo(), this.debugInfo, this.isRooted, this.visibilityInfo()); + }; + AtRule.prototype.variable = function (name) { + if (this.rules) { + // assuming that there is only one rule at this point - that is how parser constructs the rule + return Ruleset.prototype.variable.call(this.rules[0], name); + } + }; + AtRule.prototype.find = function () { + if (this.rules) { + // assuming that there is only one rule at this point - that is how parser constructs the rule + return Ruleset.prototype.find.apply(this.rules[0], arguments); + } + }; + AtRule.prototype.rulesets = function () { + if (this.rules) { + // assuming that there is only one rule at this point - that is how parser constructs the rule + return Ruleset.prototype.rulesets.apply(this.rules[0]); + } + }; + AtRule.prototype.outputRuleset = function (context, output, rules) { + var ruleCnt = rules.length; + var i; + context.tabLevel = (context.tabLevel | 0) + 1; + // Compressed + if (context.compress) { + output.add('{'); + for (i = 0; i < ruleCnt; i++) { + rules[i].genCSS(context, output); + } + output.add('}'); + context.tabLevel--; + return; + } + // Non-compressed + var tabSetStr = "\n" + Array(context.tabLevel).join(' '), tabRuleStr = tabSetStr + " "; + if (!ruleCnt) { + output.add(" {" + tabSetStr + "}"); + } + else { + output.add(" {" + tabRuleStr); + rules[0].genCSS(context, output); + for (i = 1; i < ruleCnt; i++) { + output.add(tabRuleStr); + rules[i].genCSS(context, output); + } + output.add(tabSetStr + "}"); + } + context.tabLevel--; + }; + return AtRule; + }(Node)); + AtRule.prototype.type = 'AtRule'; - // - // A number with a unit - // - var Dimension = /** @class */ (function (_super) { - __extends(Dimension, _super); - function Dimension(value, unit) { - var _this = _super.call(this) || this; - _this.value = parseFloat(value); - if (isNaN(_this.value)) { - throw new Error('Dimension is not a number.'); - } - _this.unit = (unit && unit instanceof Unit) ? unit : - new Unit(unit ? [unit] : undefined); - _this.setParent(_this.unit, _this); - return _this; - } - Dimension.prototype.accept = function (visitor) { - this.unit = visitor.visit(this.unit); - }; - Dimension.prototype.eval = function (context) { - return this; - }; - Dimension.prototype.toColor = function () { - return new Color([this.value, this.value, this.value]); - }; - Dimension.prototype.genCSS = function (context, output) { - if ((context && context.strictUnits) && !this.unit.isSingular()) { - throw new Error("Multiple units in dimension. Correct the units or use the unit function. Bad unit: " + this.unit.toString()); - } - var value = this.fround(context, this.value); - var strValue = String(value); - if (value !== 0 && value < 0.000001 && value > -0.000001) { - // would be output 1e-6 etc. - strValue = value.toFixed(20).replace(/0+$/, ''); - } - if (context && context.compress) { - // Zero values doesn't need a unit - if (value === 0 && this.unit.isLength()) { - output.add(strValue); - return; - } - // Float values doesn't need a leading zero - if (value > 0 && value < 1) { - strValue = (strValue).substr(1); - } - } - output.add(strValue); - this.unit.genCSS(context, output); - }; - // In an operation between two Dimensions, - // we default to the first Dimension's unit, - // so `1px + 2` will yield `3px`. - Dimension.prototype.operate = function (context, op, other) { - /* jshint noempty:false */ - var value = this._operate(context, op, this.value, other.value); - var unit = this.unit.clone(); - if (op === '+' || op === '-') { - if (unit.numerator.length === 0 && unit.denominator.length === 0) { - unit = other.unit.clone(); - if (this.unit.backupUnit) { - unit.backupUnit = this.unit.backupUnit; - } - } - else if (other.unit.numerator.length === 0 && unit.denominator.length === 0) ; - else { - other = other.convertTo(this.unit.usedUnits()); - if (context.strictUnits && other.unit.toString() !== unit.toString()) { - throw new Error("Incompatible units. Change the units or use the unit function. " + - ("Bad units: '" + unit.toString() + "' and '" + other.unit.toString() + "'.")); - } - value = this._operate(context, op, this.value, other.value); - } - } - else if (op === '*') { - unit.numerator = unit.numerator.concat(other.unit.numerator).sort(); - unit.denominator = unit.denominator.concat(other.unit.denominator).sort(); - unit.cancel(); - } - else if (op === '/') { - unit.numerator = unit.numerator.concat(other.unit.denominator).sort(); - unit.denominator = unit.denominator.concat(other.unit.numerator).sort(); - unit.cancel(); - } - return new Dimension(value, unit); - }; - Dimension.prototype.compare = function (other) { - var a; - var b; - if (!(other instanceof Dimension)) { - return undefined; - } - if (this.unit.isEmpty() || other.unit.isEmpty()) { - a = this; - b = other; - } - else { - a = this.unify(); - b = other.unify(); - if (a.unit.compare(b.unit) !== 0) { - return undefined; - } - } - return Node.numericCompare(a.value, b.value); - }; - Dimension.prototype.unify = function () { - return this.convertTo({ length: 'px', duration: 's', angle: 'rad' }); - }; - Dimension.prototype.convertTo = function (conversions) { - var value = this.value; - var unit = this.unit.clone(); - var i; - var groupName; - var group; - var targetUnit; - var derivedConversions = {}; - var applyUnit; - if (typeof conversions === 'string') { - for (i in unitConversions) { - if (unitConversions[i].hasOwnProperty(conversions)) { - derivedConversions = {}; - derivedConversions[i] = conversions; - } - } - conversions = derivedConversions; - } - applyUnit = function (atomicUnit, denominator) { - /* jshint loopfunc:true */ - if (group.hasOwnProperty(atomicUnit)) { - if (denominator) { - value = value / (group[atomicUnit] / group[targetUnit]); - } - else { - value = value * (group[atomicUnit] / group[targetUnit]); - } - return targetUnit; - } - return atomicUnit; - }; - for (groupName in conversions) { - if (conversions.hasOwnProperty(groupName)) { - targetUnit = conversions[groupName]; - group = unitConversions[groupName]; - unit.map(applyUnit); - } - } - unit.cancel(); - return new Dimension(value, unit); - }; - return Dimension; - }(Node)); - Dimension.prototype.type = 'Dimension'; + var DetachedRuleset = /** @class */ (function (_super) { + __extends(DetachedRuleset, _super); + function DetachedRuleset(ruleset, frames) { + var _this = _super.call(this) || this; + _this.ruleset = ruleset; + _this.frames = frames; + _this.setParent(_this.ruleset, _this); + return _this; + } + DetachedRuleset.prototype.accept = function (visitor) { + this.ruleset = visitor.visit(this.ruleset); + }; + DetachedRuleset.prototype.eval = function (context) { + var frames = this.frames || copyArray(context.frames); + return new DetachedRuleset(this.ruleset, frames); + }; + DetachedRuleset.prototype.callEval = function (context) { + return this.ruleset.eval(this.frames ? new contexts.Eval(context, this.frames.concat(context.frames)) : context); + }; + return DetachedRuleset; + }(Node)); + DetachedRuleset.prototype.type = 'DetachedRuleset'; + DetachedRuleset.prototype.evalFirst = true; - var MATH$1 = Math$1; - var Operation = /** @class */ (function (_super) { - __extends(Operation, _super); - function Operation(op, operands, isSpaced) { - var _this = _super.call(this) || this; - _this.op = op.trim(); - _this.operands = operands; - _this.isSpaced = isSpaced; - return _this; - } - Operation.prototype.accept = function (visitor) { - this.operands = visitor.visitArray(this.operands); - }; - Operation.prototype.eval = function (context) { - var a = this.operands[0].eval(context); - var b = this.operands[1].eval(context); - var op; - if (context.isMathOn(this.op)) { - op = this.op === './' ? '/' : this.op; - if (a instanceof Dimension && b instanceof Color) { - a = a.toColor(); - } - if (b instanceof Dimension && a instanceof Color) { - b = b.toColor(); - } - if (!a.operate) { - if (a instanceof Operation && a.op === '/' && context.math === MATH$1.PARENS_DIVISION) { - return new Operation(this.op, [a, b], this.isSpaced); - } - throw { type: 'Operation', - message: 'Operation on an invalid type' }; - } - return a.operate(context, op, b); - } - else { - return new Operation(this.op, [a, b], this.isSpaced); - } - }; - Operation.prototype.genCSS = function (context, output) { - this.operands[0].genCSS(context, output); - if (this.isSpaced) { - output.add(' '); - } - output.add(this.op); - if (this.isSpaced) { - output.add(' '); - } - this.operands[1].genCSS(context, output); - }; - return Operation; - }(Node)); - Operation.prototype.type = 'Operation'; + var Unit = /** @class */ (function (_super) { + __extends(Unit, _super); + function Unit(numerator, denominator, backupUnit) { + var _this = _super.call(this) || this; + _this.numerator = numerator ? copyArray(numerator).sort() : []; + _this.denominator = denominator ? copyArray(denominator).sort() : []; + if (backupUnit) { + _this.backupUnit = backupUnit; + } + else if (numerator && numerator.length) { + _this.backupUnit = numerator[0]; + } + return _this; + } + Unit.prototype.clone = function () { + return new Unit(copyArray(this.numerator), copyArray(this.denominator), this.backupUnit); + }; + Unit.prototype.genCSS = function (context, output) { + // Dimension checks the unit is singular and throws an error if in strict math mode. + var strictUnits = context && context.strictUnits; + if (this.numerator.length === 1) { + output.add(this.numerator[0]); // the ideal situation + } + else if (!strictUnits && this.backupUnit) { + output.add(this.backupUnit); + } + else if (!strictUnits && this.denominator.length) { + output.add(this.denominator[0]); + } + }; + Unit.prototype.toString = function () { + var i, returnStr = this.numerator.join('*'); + for (i = 0; i < this.denominator.length; i++) { + returnStr += "/" + this.denominator[i]; + } + return returnStr; + }; + Unit.prototype.compare = function (other) { + return this.is(other.toString()) ? 0 : undefined; + }; + Unit.prototype.is = function (unitString) { + return this.toString().toUpperCase() === unitString.toUpperCase(); + }; + Unit.prototype.isLength = function () { + return RegExp('^(px|em|ex|ch|rem|in|cm|mm|pc|pt|ex|vw|vh|vmin|vmax)$', 'gi').test(this.toCSS()); + }; + Unit.prototype.isEmpty = function () { + return this.numerator.length === 0 && this.denominator.length === 0; + }; + Unit.prototype.isSingular = function () { + return this.numerator.length <= 1 && this.denominator.length === 0; + }; + Unit.prototype.map = function (callback) { + var i; + for (i = 0; i < this.numerator.length; i++) { + this.numerator[i] = callback(this.numerator[i], false); + } + for (i = 0; i < this.denominator.length; i++) { + this.denominator[i] = callback(this.denominator[i], true); + } + }; + Unit.prototype.usedUnits = function () { + var group; + var result = {}; + var mapUnit; + var groupName; + mapUnit = function (atomicUnit) { + /* jshint loopfunc:true */ + if (group.hasOwnProperty(atomicUnit) && !result[groupName]) { + result[groupName] = atomicUnit; + } + return atomicUnit; + }; + for (groupName in unitConversions) { + if (unitConversions.hasOwnProperty(groupName)) { + group = unitConversions[groupName]; + this.map(mapUnit); + } + } + return result; + }; + Unit.prototype.cancel = function () { + var counter = {}; + var atomicUnit; + var i; + for (i = 0; i < this.numerator.length; i++) { + atomicUnit = this.numerator[i]; + counter[atomicUnit] = (counter[atomicUnit] || 0) + 1; + } + for (i = 0; i < this.denominator.length; i++) { + atomicUnit = this.denominator[i]; + counter[atomicUnit] = (counter[atomicUnit] || 0) - 1; + } + this.numerator = []; + this.denominator = []; + for (atomicUnit in counter) { + if (counter.hasOwnProperty(atomicUnit)) { + var count = counter[atomicUnit]; + if (count > 0) { + for (i = 0; i < count; i++) { + this.numerator.push(atomicUnit); + } + } + else if (count < 0) { + for (i = 0; i < -count; i++) { + this.denominator.push(atomicUnit); + } + } + } + } + this.numerator.sort(); + this.denominator.sort(); + }; + return Unit; + }(Node)); + Unit.prototype.type = 'Unit'; - var MATH$2 = Math$1; - var Expression = /** @class */ (function (_super) { - __extends(Expression, _super); - function Expression(value, noSpacing) { - var _this = _super.call(this) || this; - _this.value = value; - _this.noSpacing = noSpacing; - if (!value) { - throw new Error('Expression requires an array parameter'); - } - return _this; - } - Expression.prototype.accept = function (visitor) { - this.value = visitor.visitArray(this.value); - }; - Expression.prototype.eval = function (context) { - var returnValue; - var mathOn = context.isMathOn(); - var inParenthesis = this.parens && - (context.math !== MATH$2.STRICT_LEGACY || !this.parensInOp); - var doubleParen = false; - if (inParenthesis) { - context.inParenthesis(); - } - if (this.value.length > 1) { - returnValue = new Expression(this.value.map(function (e) { - if (!e.eval) { - return e; - } - return e.eval(context); - }), this.noSpacing); - } - else if (this.value.length === 1) { - if (this.value[0].parens && !this.value[0].parensInOp && !context.inCalc) { - doubleParen = true; - } - returnValue = this.value[0].eval(context); - } - else { - returnValue = this; - } - if (inParenthesis) { - context.outOfParenthesis(); - } - if (this.parens && this.parensInOp && !mathOn && !doubleParen - && (!(returnValue instanceof Dimension))) { - returnValue = new Paren(returnValue); - } - return returnValue; - }; - Expression.prototype.genCSS = function (context, output) { - for (var i = 0; i < this.value.length; i++) { - this.value[i].genCSS(context, output); - if (!this.noSpacing && i + 1 < this.value.length) { - output.add(' '); - } - } - }; - Expression.prototype.throwAwayComments = function () { - this.value = this.value.filter(function (v) { return !(v instanceof Comment); }); - }; - return Expression; - }(Node)); - Expression.prototype.type = 'Expression'; + // + // A number with a unit + // + var Dimension = /** @class */ (function (_super) { + __extends(Dimension, _super); + function Dimension(value, unit) { + var _this = _super.call(this) || this; + _this.value = parseFloat(value); + if (isNaN(_this.value)) { + throw new Error('Dimension is not a number.'); + } + _this.unit = (unit && unit instanceof Unit) ? unit : + new Unit(unit ? [unit] : undefined); + _this.setParent(_this.unit, _this); + return _this; + } + Dimension.prototype.accept = function (visitor) { + this.unit = visitor.visit(this.unit); + }; + Dimension.prototype.eval = function (context) { + return this; + }; + Dimension.prototype.toColor = function () { + return new Color([this.value, this.value, this.value]); + }; + Dimension.prototype.genCSS = function (context, output) { + if ((context && context.strictUnits) && !this.unit.isSingular()) { + throw new Error("Multiple units in dimension. Correct the units or use the unit function. Bad unit: " + this.unit.toString()); + } + var value = this.fround(context, this.value); + var strValue = String(value); + if (value !== 0 && value < 0.000001 && value > -0.000001) { + // would be output 1e-6 etc. + strValue = value.toFixed(20).replace(/0+$/, ''); + } + if (context && context.compress) { + // Zero values doesn't need a unit + if (value === 0 && this.unit.isLength()) { + output.add(strValue); + return; + } + // Float values doesn't need a leading zero + if (value > 0 && value < 1) { + strValue = (strValue).substr(1); + } + } + output.add(strValue); + this.unit.genCSS(context, output); + }; + // In an operation between two Dimensions, + // we default to the first Dimension's unit, + // so `1px + 2` will yield `3px`. + Dimension.prototype.operate = function (context, op, other) { + /* jshint noempty:false */ + var value = this._operate(context, op, this.value, other.value), unit = this.unit.clone(); + if (op === '+' || op === '-') { + if (unit.numerator.length === 0 && unit.denominator.length === 0) { + unit = other.unit.clone(); + if (this.unit.backupUnit) { + unit.backupUnit = this.unit.backupUnit; + } + } + else if (other.unit.numerator.length === 0 && unit.denominator.length === 0) ; + else { + other = other.convertTo(this.unit.usedUnits()); + if (context.strictUnits && other.unit.toString() !== unit.toString()) { + throw new Error("Incompatible units. Change the units or use the unit function. Bad units: '" + unit.toString() + "' and '" + other.unit.toString() + "'."); + } + value = this._operate(context, op, this.value, other.value); + } + } + else if (op === '*') { + unit.numerator = unit.numerator.concat(other.unit.numerator).sort(); + unit.denominator = unit.denominator.concat(other.unit.denominator).sort(); + unit.cancel(); + } + else if (op === '/') { + unit.numerator = unit.numerator.concat(other.unit.denominator).sort(); + unit.denominator = unit.denominator.concat(other.unit.numerator).sort(); + unit.cancel(); + } + return new Dimension(value, unit); + }; + Dimension.prototype.compare = function (other) { + var a, b; + if (!(other instanceof Dimension)) { + return undefined; + } + if (this.unit.isEmpty() || other.unit.isEmpty()) { + a = this; + b = other; + } + else { + a = this.unify(); + b = other.unify(); + if (a.unit.compare(b.unit) !== 0) { + return undefined; + } + } + return Node.numericCompare(a.value, b.value); + }; + Dimension.prototype.unify = function () { + return this.convertTo({ length: 'px', duration: 's', angle: 'rad' }); + }; + Dimension.prototype.convertTo = function (conversions) { + var value = this.value; + var unit = this.unit.clone(); + var i; + var groupName; + var group; + var targetUnit; + var derivedConversions = {}; + var applyUnit; + if (typeof conversions === 'string') { + for (i in unitConversions) { + if (unitConversions[i].hasOwnProperty(conversions)) { + derivedConversions = {}; + derivedConversions[i] = conversions; + } + } + conversions = derivedConversions; + } + applyUnit = function (atomicUnit, denominator) { + /* jshint loopfunc:true */ + if (group.hasOwnProperty(atomicUnit)) { + if (denominator) { + value = value / (group[atomicUnit] / group[targetUnit]); + } + else { + value = value * (group[atomicUnit] / group[targetUnit]); + } + return targetUnit; + } + return atomicUnit; + }; + for (groupName in conversions) { + if (conversions.hasOwnProperty(groupName)) { + targetUnit = conversions[groupName]; + group = unitConversions[groupName]; + unit.map(applyUnit); + } + } + unit.cancel(); + return new Dimension(value, unit); + }; + return Dimension; + }(Node)); + Dimension.prototype.type = 'Dimension'; - var functionCaller = /** @class */ (function () { - function functionCaller(name, context, index, currentFileInfo) { - this.name = name.toLowerCase(); - this.index = index; - this.context = context; - this.currentFileInfo = currentFileInfo; - this.func = context.frames[0].functionRegistry.get(this.name); - } - functionCaller.prototype.isValid = function () { - return Boolean(this.func); - }; - functionCaller.prototype.call = function (args) { - var _this = this; - var evalArgs = this.func.evalArgs; - if (evalArgs !== false) { - args = args.map(function (a) { return a.eval(_this.context); }); - } - // This code is terrible and should be replaced as per this issue... - // https://github.com/less/less.js/issues/2477 - if (Array.isArray(args)) { - args = args.filter(function (item) { - if (item.type === 'Comment') { - return false; - } - return true; - }) - .map(function (item) { - if (item.type === 'Expression') { - var subNodes = item.value.filter(function (item) { - if (item.type === 'Comment') { - return false; - } - return true; - }); - if (subNodes.length === 1) { - return subNodes[0]; - } - else { - return new Expression(subNodes); - } - } - return item; - }); - } - if (evalArgs === false) { - return this.func.apply(this, __spreadArrays([this.context], args)); - } - return this.func.apply(this, args); - }; - return functionCaller; - }()); + var MATH$1 = Math$1; + var Operation = /** @class */ (function (_super) { + __extends(Operation, _super); + function Operation(op, operands, isSpaced) { + var _this = _super.call(this) || this; + _this.op = op.trim(); + _this.operands = operands; + _this.isSpaced = isSpaced; + return _this; + } + Operation.prototype.accept = function (visitor) { + this.operands = visitor.visitArray(this.operands); + }; + Operation.prototype.eval = function (context) { + var a = this.operands[0].eval(context), b = this.operands[1].eval(context), op; + if (context.isMathOn(this.op)) { + op = this.op === './' ? '/' : this.op; + if (a instanceof Dimension && b instanceof Color) { + a = a.toColor(); + } + if (b instanceof Dimension && a instanceof Color) { + b = b.toColor(); + } + if (!a.operate) { + if (a instanceof Operation && a.op === '/' && context.math === MATH$1.PARENS_DIVISION) { + return new Operation(this.op, [a, b], this.isSpaced); + } + throw { type: 'Operation', + message: 'Operation on an invalid type' }; + } + return a.operate(context, op, b); + } + else { + return new Operation(this.op, [a, b], this.isSpaced); + } + }; + Operation.prototype.genCSS = function (context, output) { + this.operands[0].genCSS(context, output); + if (this.isSpaced) { + output.add(' '); + } + output.add(this.op); + if (this.isSpaced) { + output.add(' '); + } + this.operands[1].genCSS(context, output); + }; + return Operation; + }(Node)); + Operation.prototype.type = 'Operation'; - // - // A function call node. - // - var Call = /** @class */ (function (_super) { - __extends(Call, _super); - function Call(name, args, index, currentFileInfo) { - var _this = _super.call(this) || this; - _this.name = name; - _this.args = args; - _this.calc = name === 'calc'; - _this._index = index; - _this._fileInfo = currentFileInfo; - return _this; - } - Call.prototype.accept = function (visitor) { - if (this.args) { - this.args = visitor.visitArray(this.args); - } - }; - // - // When evaluating a function call, - // we either find the function in the functionRegistry, - // in which case we call it, passing the evaluated arguments, - // if this returns null or we cannot find the function, we - // simply print it out as it appeared originally [2]. - // - // The reason why we evaluate the arguments, is in the case where - // we try to pass a variable to a function, like: `saturate(@color)`. - // The function should receive the value, not the variable. - // - Call.prototype.eval = function (context) { - var _this = this; - /** - * Turn off math for calc(), and switch back on for evaluating nested functions - */ - var currentMathContext = context.mathOn; - context.mathOn = !this.calc; - if (this.calc || context.inCalc) { - context.enterCalc(); - } - var exitCalc = function () { - if (_this.calc || context.inCalc) { - context.exitCalc(); - } - context.mathOn = currentMathContext; - }; - var result; - var funcCaller = new functionCaller(this.name, context, this.getIndex(), this.fileInfo()); - if (funcCaller.isValid()) { - try { - result = funcCaller.call(this.args); - exitCalc(); - } - catch (e) { - if (e.hasOwnProperty('line') && e.hasOwnProperty('column')) { - throw e; - } - throw { - type: e.type || 'Runtime', - message: "error evaluating function `" + this.name + "`" + (e.message ? ": " + e.message : ''), - index: this.getIndex(), - filename: this.fileInfo().filename, - line: e.lineNumber, - column: e.columnNumber - }; - } - if (result !== null && result !== undefined) { - // Results that that are not nodes are cast as Anonymous nodes - // Falsy values or booleans are returned as empty nodes - if (!(result instanceof Node)) { - if (!result || result === true) { - result = new Anonymous(null); - } - else { - result = new Anonymous(result.toString()); - } - } - result._index = this._index; - result._fileInfo = this._fileInfo; - return result; - } - } - var args = this.args.map(function (a) { return a.eval(context); }); - exitCalc(); - return new Call(this.name, args, this.getIndex(), this.fileInfo()); - }; - Call.prototype.genCSS = function (context, output) { - output.add(this.name + "(", this.fileInfo(), this.getIndex()); - for (var i = 0; i < this.args.length; i++) { - this.args[i].genCSS(context, output); - if (i + 1 < this.args.length) { - output.add(', '); - } - } - output.add(')'); - }; - return Call; - }(Node)); - Call.prototype.type = 'Call'; + var Expression = /** @class */ (function (_super) { + __extends(Expression, _super); + function Expression(value, noSpacing) { + var _this = _super.call(this) || this; + _this.value = value; + _this.noSpacing = noSpacing; + if (!value) { + throw new Error('Expression requires an array parameter'); + } + return _this; + } + Expression.prototype.accept = function (visitor) { + this.value = visitor.visitArray(this.value); + }; + Expression.prototype.eval = function (context) { + var returnValue; + var mathOn = context.isMathOn(); + var inParenthesis = this.parens; + var doubleParen = false; + if (inParenthesis) { + context.inParenthesis(); + } + if (this.value.length > 1) { + returnValue = new Expression(this.value.map(function (e) { + if (!e.eval) { + return e; + } + return e.eval(context); + }), this.noSpacing); + } + else if (this.value.length === 1) { + if (this.value[0].parens && !this.value[0].parensInOp && !context.inCalc) { + doubleParen = true; + } + returnValue = this.value[0].eval(context); + } + else { + returnValue = this; + } + if (inParenthesis) { + context.outOfParenthesis(); + } + if (this.parens && this.parensInOp && !mathOn && !doubleParen + && (!(returnValue instanceof Dimension))) { + returnValue = new Paren(returnValue); + } + return returnValue; + }; + Expression.prototype.genCSS = function (context, output) { + for (var i = 0; i < this.value.length; i++) { + this.value[i].genCSS(context, output); + if (!this.noSpacing && i + 1 < this.value.length) { + output.add(' '); + } + } + }; + Expression.prototype.throwAwayComments = function () { + this.value = this.value.filter(function (v) { + return !(v instanceof Comment); + }); + }; + return Expression; + }(Node)); + Expression.prototype.type = 'Expression'; - var Variable = /** @class */ (function (_super) { - __extends(Variable, _super); - function Variable(name, index, currentFileInfo) { - var _this = _super.call(this) || this; - _this.name = name; - _this._index = index; - _this._fileInfo = currentFileInfo; - return _this; - } - Variable.prototype.eval = function (context) { - var variable; - var name = this.name; - if (name.indexOf('@@') === 0) { - name = "@" + new Variable(name.slice(1), this.getIndex(), this.fileInfo()).eval(context).value; - } - if (this.evaluating) { - throw { type: 'Name', message: "Recursive variable definition for " + name, filename: this.fileInfo().filename, - index: this.getIndex() }; - } - this.evaluating = true; - variable = this.find(context.frames, function (frame) { - var v = frame.variable(name); - if (v) { - if (v.important) { - var importantScope = context.importantScope[context.importantScope.length - 1]; - importantScope.important = v.important; - } - // If in calc, wrap vars in a function call to cascade evaluate args first - if (context.inCalc) { - return (new Call('_SELF', [v.value])).eval(context); - } - else { - return v.value.eval(context); - } - } - }); - if (variable) { - this.evaluating = false; - return variable; - } - else { - throw { type: 'Name', message: "variable " + name + " is undefined", filename: this.fileInfo().filename, - index: this.getIndex() }; - } - }; - Variable.prototype.find = function (obj, fun) { - for (var i = 0, r = void 0; i < obj.length; i++) { - r = fun.call(obj, obj[i]); - if (r) { - return r; - } - } - return null; - }; - return Variable; - }(Node)); - Variable.prototype.type = 'Variable'; + var functionCaller = /** @class */ (function () { + function functionCaller(name, context, index, currentFileInfo) { + this.name = name.toLowerCase(); + this.index = index; + this.context = context; + this.currentFileInfo = currentFileInfo; + this.func = context.frames[0].functionRegistry.get(this.name); + } + functionCaller.prototype.isValid = function () { + return Boolean(this.func); + }; + functionCaller.prototype.call = function (args) { + var _this = this; + if (!(Array.isArray(args))) { + args = [args]; + } + var evalArgs = this.func.evalArgs; + if (evalArgs !== false) { + args = args.map(function (a) { return a.eval(_this.context); }); + } + var commentFilter = function (item) { return !(item.type === 'Comment'); }; + // This code is terrible and should be replaced as per this issue... + // https://github.com/less/less.js/issues/2477 + args = args + .filter(commentFilter) + .map(function (item) { + if (item.type === 'Expression') { + var subNodes = item.value.filter(commentFilter); + if (subNodes.length === 1) { + return subNodes[0]; + } + else { + return new Expression(subNodes); + } + } + return item; + }); + if (evalArgs === false) { + return this.func.apply(this, __spreadArrays([this.context], args)); + } + return this.func.apply(this, args); + }; + return functionCaller; + }()); - var Property = /** @class */ (function (_super) { - __extends(Property, _super); - function Property(name, index, currentFileInfo) { - var _this = _super.call(this) || this; - _this.name = name; - _this._index = index; - _this._fileInfo = currentFileInfo; - return _this; - } - Property.prototype.eval = function (context) { - var property; - var name = this.name; - // TODO: shorten this reference - var mergeRules = context.pluginManager.less.visitors.ToCSSVisitor.prototype._mergeRules; - if (this.evaluating) { - throw { type: 'Name', message: "Recursive property reference for " + name, filename: this.fileInfo().filename, - index: this.getIndex() }; - } - this.evaluating = true; - property = this.find(context.frames, function (frame) { - var v; - var vArr = frame.property(name); - if (vArr) { - for (var i = 0; i < vArr.length; i++) { - v = vArr[i]; - vArr[i] = new Declaration(v.name, v.value, v.important, v.merge, v.index, v.currentFileInfo, v.inline, v.variable); - } - mergeRules(vArr); - v = vArr[vArr.length - 1]; - if (v.important) { - var importantScope = context.importantScope[context.importantScope.length - 1]; - importantScope.important = v.important; - } - v = v.value.eval(context); - return v; - } - }); - if (property) { - this.evaluating = false; - return property; - } - else { - throw { type: 'Name', message: "Property '" + name + "' is undefined", filename: this.currentFileInfo.filename, - index: this.index }; - } - }; - Property.prototype.find = function (obj, fun) { - for (var i = 0, r = void 0; i < obj.length; i++) { - r = fun.call(obj, obj[i]); - if (r) { - return r; - } - } - return null; - }; - return Property; - }(Node)); - Property.prototype.type = 'Property'; + // + // A function call node. + // + var Call = /** @class */ (function (_super) { + __extends(Call, _super); + function Call(name, args, index, currentFileInfo) { + var _this = _super.call(this) || this; + _this.name = name; + _this.args = args; + _this.calc = name === 'calc'; + _this._index = index; + _this._fileInfo = currentFileInfo; + return _this; + } + Call.prototype.accept = function (visitor) { + if (this.args) { + this.args = visitor.visitArray(this.args); + } + }; + // + // When evaluating a function call, + // we either find the function in the functionRegistry, + // in which case we call it, passing the evaluated arguments, + // if this returns null or we cannot find the function, we + // simply print it out as it appeared originally [2]. + // + // The reason why we evaluate the arguments, is in the case where + // we try to pass a variable to a function, like: `saturate(@color)`. + // The function should receive the value, not the variable. + // + Call.prototype.eval = function (context) { + var _this = this; + /** + * Turn off math for calc(), and switch back on for evaluating nested functions + */ + var currentMathContext = context.mathOn; + context.mathOn = !this.calc; + if (this.calc || context.inCalc) { + context.enterCalc(); + } + var exitCalc = function () { + if (_this.calc || context.inCalc) { + context.exitCalc(); + } + context.mathOn = currentMathContext; + }; + var result; + var funcCaller = new functionCaller(this.name, context, this.getIndex(), this.fileInfo()); + if (funcCaller.isValid()) { + try { + result = funcCaller.call(this.args); + exitCalc(); + } + catch (e) { + if (e.hasOwnProperty('line') && e.hasOwnProperty('column')) { + throw e; + } + throw { + type: e.type || 'Runtime', + message: "Error evaluating function `" + this.name + "`" + (e.message ? ": " + e.message : ''), + index: this.getIndex(), + filename: this.fileInfo().filename, + line: e.lineNumber, + column: e.columnNumber + }; + } + } + if (result !== null && result !== undefined) { + // Results that that are not nodes are cast as Anonymous nodes + // Falsy values or booleans are returned as empty nodes + if (!(result instanceof Node)) { + if (!result || result === true) { + result = new Anonymous(null); + } + else { + result = new Anonymous(result.toString()); + } + } + result._index = this._index; + result._fileInfo = this._fileInfo; + return result; + } + var args = this.args.map(function (a) { return a.eval(context); }); + exitCalc(); + return new Call(this.name, args, this.getIndex(), this.fileInfo()); + }; + Call.prototype.genCSS = function (context, output) { + output.add(this.name + "(", this.fileInfo(), this.getIndex()); + for (var i = 0; i < this.args.length; i++) { + this.args[i].genCSS(context, output); + if (i + 1 < this.args.length) { + output.add(', '); + } + } + output.add(')'); + }; + return Call; + }(Node)); + Call.prototype.type = 'Call'; - var Attribute = /** @class */ (function (_super) { - __extends(Attribute, _super); - function Attribute(key, op, value) { - var _this = _super.call(this) || this; - _this.key = key; - _this.op = op; - _this.value = value; - return _this; - } - Attribute.prototype.eval = function (context) { - return new Attribute(this.key.eval ? this.key.eval(context) : this.key, this.op, (this.value && this.value.eval) ? this.value.eval(context) : this.value); - }; - Attribute.prototype.genCSS = function (context, output) { - output.add(this.toCSS(context)); - }; - Attribute.prototype.toCSS = function (context) { - var value = this.key.toCSS ? this.key.toCSS(context) : this.key; - if (this.op) { - value += this.op; - value += (this.value.toCSS ? this.value.toCSS(context) : this.value); - } - return "[" + value + "]"; - }; - return Attribute; - }(Node)); - Attribute.prototype.type = 'Attribute'; + var Variable = /** @class */ (function (_super) { + __extends(Variable, _super); + function Variable(name, index, currentFileInfo) { + var _this = _super.call(this) || this; + _this.name = name; + _this._index = index; + _this._fileInfo = currentFileInfo; + return _this; + } + Variable.prototype.eval = function (context) { + var variable, name = this.name; + if (name.indexOf('@@') === 0) { + name = "@" + new Variable(name.slice(1), this.getIndex(), this.fileInfo()).eval(context).value; + } + if (this.evaluating) { + throw { type: 'Name', message: "Recursive variable definition for " + name, filename: this.fileInfo().filename, + index: this.getIndex() }; + } + this.evaluating = true; + variable = this.find(context.frames, function (frame) { + var v = frame.variable(name); + if (v) { + if (v.important) { + var importantScope = context.importantScope[context.importantScope.length - 1]; + importantScope.important = v.important; + } + // If in calc, wrap vars in a function call to cascade evaluate args first + if (context.inCalc) { + return (new Call('_SELF', [v.value])).eval(context); + } + else { + return v.value.eval(context); + } + } + }); + if (variable) { + this.evaluating = false; + return variable; + } + else { + throw { type: 'Name', message: "variable " + name + " is undefined", filename: this.fileInfo().filename, + index: this.getIndex() }; + } + }; + Variable.prototype.find = function (obj, fun) { + for (var i = 0, r = void 0; i < obj.length; i++) { + r = fun.call(obj, obj[i]); + if (r) { + return r; + } + } + return null; + }; + return Variable; + }(Node)); + Variable.prototype.type = 'Variable'; - var Quoted = /** @class */ (function (_super) { - __extends(Quoted, _super); - function Quoted(str, content, escaped, index, currentFileInfo) { - var _this = _super.call(this) || this; - _this.escaped = (escaped == null) ? true : escaped; - _this.value = content || ''; - _this.quote = str.charAt(0); - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.variableRegex = /@\{([\w-]+)\}/g; - _this.propRegex = /\$\{([\w-]+)\}/g; - _this.allowRoot = escaped; - return _this; - } - Quoted.prototype.genCSS = function (context, output) { - if (!this.escaped) { - output.add(this.quote, this.fileInfo(), this.getIndex()); - } - output.add(this.value); - if (!this.escaped) { - output.add(this.quote); - } - }; - Quoted.prototype.containsVariables = function () { - return this.value.match(this.variableRegex); - }; - Quoted.prototype.eval = function (context) { - var that = this; - var value = this.value; - var variableReplacement = function (_, name) { - var v = new Variable("@" + name, that.getIndex(), that.fileInfo()).eval(context, true); - return (v instanceof Quoted) ? v.value : v.toCSS(); - }; - var propertyReplacement = function (_, name) { - var v = new Property("$" + name, that.getIndex(), that.fileInfo()).eval(context, true); - return (v instanceof Quoted) ? v.value : v.toCSS(); - }; - function iterativeReplace(value, regexp, replacementFnc) { - var evaluatedValue = value; - do { - value = evaluatedValue.toString(); - evaluatedValue = value.replace(regexp, replacementFnc); - } while (value !== evaluatedValue); - return evaluatedValue; - } - value = iterativeReplace(value, this.variableRegex, variableReplacement); - value = iterativeReplace(value, this.propRegex, propertyReplacement); - return new Quoted(this.quote + value + this.quote, value, this.escaped, this.getIndex(), this.fileInfo()); - }; - Quoted.prototype.compare = function (other) { - // when comparing quoted strings allow the quote to differ - if (other.type === 'Quoted' && !this.escaped && !other.escaped) { - return Node.numericCompare(this.value, other.value); - } - else { - return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined; - } - }; - return Quoted; - }(Node)); - Quoted.prototype.type = 'Quoted'; + var Property = /** @class */ (function (_super) { + __extends(Property, _super); + function Property(name, index, currentFileInfo) { + var _this = _super.call(this) || this; + _this.name = name; + _this._index = index; + _this._fileInfo = currentFileInfo; + return _this; + } + Property.prototype.eval = function (context) { + var property; + var name = this.name; + // TODO: shorten this reference + var mergeRules = context.pluginManager.less.visitors.ToCSSVisitor.prototype._mergeRules; + if (this.evaluating) { + throw { type: 'Name', message: "Recursive property reference for " + name, filename: this.fileInfo().filename, + index: this.getIndex() }; + } + this.evaluating = true; + property = this.find(context.frames, function (frame) { + var v; + var vArr = frame.property(name); + if (vArr) { + for (var i = 0; i < vArr.length; i++) { + v = vArr[i]; + vArr[i] = new Declaration(v.name, v.value, v.important, v.merge, v.index, v.currentFileInfo, v.inline, v.variable); + } + mergeRules(vArr); + v = vArr[vArr.length - 1]; + if (v.important) { + var importantScope = context.importantScope[context.importantScope.length - 1]; + importantScope.important = v.important; + } + v = v.value.eval(context); + return v; + } + }); + if (property) { + this.evaluating = false; + return property; + } + else { + throw { type: 'Name', message: "Property '" + name + "' is undefined", filename: this.currentFileInfo.filename, + index: this.index }; + } + }; + Property.prototype.find = function (obj, fun) { + for (var i = 0, r = void 0; i < obj.length; i++) { + r = fun.call(obj, obj[i]); + if (r) { + return r; + } + } + return null; + }; + return Property; + }(Node)); + Property.prototype.type = 'Property'; - var URL = /** @class */ (function (_super) { - __extends(URL, _super); - function URL(val, index, currentFileInfo, isEvald) { - var _this = _super.call(this) || this; - _this.value = val; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.isEvald = isEvald; - return _this; - } - URL.prototype.accept = function (visitor) { - this.value = visitor.visit(this.value); - }; - URL.prototype.genCSS = function (context, output) { - output.add('url('); - this.value.genCSS(context, output); - output.add(')'); - }; - URL.prototype.eval = function (context) { - var val = this.value.eval(context); - var rootpath; - if (!this.isEvald) { - // Add the rootpath if the URL requires a rewrite - rootpath = this.fileInfo() && this.fileInfo().rootpath; - if (typeof rootpath === 'string' && - typeof val.value === 'string' && - context.pathRequiresRewrite(val.value)) { - if (!val.quote) { - rootpath = escapePath(rootpath); - } - val.value = context.rewritePath(val.value, rootpath); - } - else { - val.value = context.normalizePath(val.value); - } - // Add url args if enabled - if (context.urlArgs) { - if (!val.value.match(/^\s*data:/)) { - var delimiter = val.value.indexOf('?') === -1 ? '?' : '&'; - var urlArgs = delimiter + context.urlArgs; - if (val.value.indexOf('#') !== -1) { - val.value = val.value.replace('#', urlArgs + "#"); - } - else { - val.value += urlArgs; - } - } - } - } - return new URL(val, this.getIndex(), this.fileInfo(), true); - }; - return URL; - }(Node)); - URL.prototype.type = 'Url'; - function escapePath(path) { - return path.replace(/[\(\)'"\s]/g, function (match) { return "\\" + match; }); - } + var Attribute = /** @class */ (function (_super) { + __extends(Attribute, _super); + function Attribute(key, op, value) { + var _this = _super.call(this) || this; + _this.key = key; + _this.op = op; + _this.value = value; + return _this; + } + Attribute.prototype.eval = function (context) { + return new Attribute(this.key.eval ? this.key.eval(context) : this.key, this.op, (this.value && this.value.eval) ? this.value.eval(context) : this.value); + }; + Attribute.prototype.genCSS = function (context, output) { + output.add(this.toCSS(context)); + }; + Attribute.prototype.toCSS = function (context) { + var value = this.key.toCSS ? this.key.toCSS(context) : this.key; + if (this.op) { + value += this.op; + value += (this.value.toCSS ? this.value.toCSS(context) : this.value); + } + return "[" + value + "]"; + }; + return Attribute; + }(Node)); + Attribute.prototype.type = 'Attribute'; - var Media = /** @class */ (function (_super) { - __extends(Media, _super); - function Media(value, features, index, currentFileInfo, visibilityInfo) { - var _this = _super.call(this) || this; - _this._index = index; - _this._fileInfo = currentFileInfo; - var selectors = (new Selector([], null, null, _this._index, _this._fileInfo)).createEmptySelectors(); - _this.features = new Value(features); - _this.rules = [new Ruleset(selectors, value)]; - _this.rules[0].allowImports = true; - _this.copyVisibilityInfo(visibilityInfo); - _this.allowRoot = true; - _this.setParent(selectors, _this); - _this.setParent(_this.features, _this); - _this.setParent(_this.rules, _this); - return _this; - } - Media.prototype.isRulesetLike = function () { - return true; - }; - Media.prototype.accept = function (visitor) { - if (this.features) { - this.features = visitor.visit(this.features); - } - if (this.rules) { - this.rules = visitor.visitArray(this.rules); - } - }; - Media.prototype.genCSS = function (context, output) { - output.add('@media ', this._fileInfo, this._index); - this.features.genCSS(context, output); - this.outputRuleset(context, output, this.rules); - }; - Media.prototype.eval = function (context) { - if (!context.mediaBlocks) { - context.mediaBlocks = []; - context.mediaPath = []; - } - var media = new Media(null, [], this._index, this._fileInfo, this.visibilityInfo()); - if (this.debugInfo) { - this.rules[0].debugInfo = this.debugInfo; - media.debugInfo = this.debugInfo; - } - media.features = this.features.eval(context); - context.mediaPath.push(media); - context.mediaBlocks.push(media); - this.rules[0].functionRegistry = context.frames[0].functionRegistry.inherit(); - context.frames.unshift(this.rules[0]); - media.rules = [this.rules[0].eval(context)]; - context.frames.shift(); - context.mediaPath.pop(); - return context.mediaPath.length === 0 ? media.evalTop(context) : - media.evalNested(context); - }; - Media.prototype.evalTop = function (context) { - var result = this; - // Render all dependent Media blocks. - if (context.mediaBlocks.length > 1) { - var selectors = (new Selector([], null, null, this.getIndex(), this.fileInfo())).createEmptySelectors(); - result = new Ruleset(selectors, context.mediaBlocks); - result.multiMedia = true; - result.copyVisibilityInfo(this.visibilityInfo()); - this.setParent(result, this); - } - delete context.mediaBlocks; - delete context.mediaPath; - return result; - }; - Media.prototype.evalNested = function (context) { - var i; - var value; - var path = context.mediaPath.concat([this]); - // Extract the media-query conditions separated with `,` (OR). - for (i = 0; i < path.length; i++) { - value = path[i].features instanceof Value ? - path[i].features.value : path[i].features; - path[i] = Array.isArray(value) ? value : [value]; - } - // Trace all permutations to generate the resulting media-query. - // - // (a, b and c) with nested (d, e) -> - // a and d - // a and e - // b and c and d - // b and c and e - this.features = new Value(this.permute(path).map(function (path) { - path = path.map(function (fragment) { return fragment.toCSS ? fragment : new Anonymous(fragment); }); - for (i = path.length - 1; i > 0; i--) { - path.splice(i, 0, new Anonymous('and')); - } - return new Expression(path); - })); - this.setParent(this.features, this); - // Fake a tree-node that doesn't output anything. - return new Ruleset([], []); - }; - Media.prototype.permute = function (arr) { - if (arr.length === 0) { - return []; - } - else if (arr.length === 1) { - return arr[0]; - } - else { - var result = []; - var rest = this.permute(arr.slice(1)); - for (var i = 0; i < rest.length; i++) { - for (var j = 0; j < arr[0].length; j++) { - result.push([arr[0][j]].concat(rest[i])); - } - } - return result; - } - }; - Media.prototype.bubbleSelectors = function (selectors) { - if (!selectors) { - return; - } - this.rules = [new Ruleset(copyArray(selectors), [this.rules[0]])]; - this.setParent(this.rules, this); - }; - return Media; - }(AtRule)); - Media.prototype.type = 'Media'; + var Quoted = /** @class */ (function (_super) { + __extends(Quoted, _super); + function Quoted(str, content, escaped, index, currentFileInfo) { + var _this = _super.call(this) || this; + _this.escaped = (escaped == null) ? true : escaped; + _this.value = content || ''; + _this.quote = str.charAt(0); + _this._index = index; + _this._fileInfo = currentFileInfo; + _this.variableRegex = /@\{([\w-]+)\}/g; + _this.propRegex = /\$\{([\w-]+)\}/g; + _this.allowRoot = escaped; + return _this; + } + Quoted.prototype.genCSS = function (context, output) { + if (!this.escaped) { + output.add(this.quote, this.fileInfo(), this.getIndex()); + } + output.add(this.value); + if (!this.escaped) { + output.add(this.quote); + } + }; + Quoted.prototype.containsVariables = function () { + return this.value.match(this.variableRegex); + }; + Quoted.prototype.eval = function (context) { + var that = this; + var value = this.value; + var variableReplacement = function (_, name) { + var v = new Variable("@" + name, that.getIndex(), that.fileInfo()).eval(context, true); + return (v instanceof Quoted) ? v.value : v.toCSS(); + }; + var propertyReplacement = function (_, name) { + var v = new Property("$" + name, that.getIndex(), that.fileInfo()).eval(context, true); + return (v instanceof Quoted) ? v.value : v.toCSS(); + }; + function iterativeReplace(value, regexp, replacementFnc) { + var evaluatedValue = value; + do { + value = evaluatedValue.toString(); + evaluatedValue = value.replace(regexp, replacementFnc); + } while (value !== evaluatedValue); + return evaluatedValue; + } + value = iterativeReplace(value, this.variableRegex, variableReplacement); + value = iterativeReplace(value, this.propRegex, propertyReplacement); + return new Quoted(this.quote + value + this.quote, value, this.escaped, this.getIndex(), this.fileInfo()); + }; + Quoted.prototype.compare = function (other) { + // when comparing quoted strings allow the quote to differ + if (other.type === 'Quoted' && !this.escaped && !other.escaped) { + return Node.numericCompare(this.value, other.value); + } + else { + return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined; + } + }; + return Quoted; + }(Node)); + Quoted.prototype.type = 'Quoted'; - // - // CSS @import node - // - // The general strategy here is that we don't want to wait - // for the parsing to be completed, before we start importing - // the file. That's because in the context of a browser, - // most of the time will be spent waiting for the server to respond. - // - // On creation, we push the import path to our import queue, though - // `import,push`, we also pass it a callback, which it'll call once - // the file has been fetched, and parsed. - // - var Import = /** @class */ (function (_super) { - __extends(Import, _super); - function Import(path, features, options, index, currentFileInfo, visibilityInfo) { - var _this = _super.call(this) || this; - _this.options = options; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.path = path; - _this.features = features; - _this.allowRoot = true; - if (_this.options.less !== undefined || _this.options.inline) { - _this.css = !_this.options.less || _this.options.inline; - } - else { - var pathValue = _this.getPath(); - if (pathValue && /[#\.\&\?]css([\?;].*)?$/.test(pathValue)) { - _this.css = true; - } - } - _this.copyVisibilityInfo(visibilityInfo); - _this.setParent(_this.features, _this); - _this.setParent(_this.path, _this); - return _this; - } - Import.prototype.accept = function (visitor) { - if (this.features) { - this.features = visitor.visit(this.features); - } - this.path = visitor.visit(this.path); - if (!this.options.isPlugin && !this.options.inline && this.root) { - this.root = visitor.visit(this.root); - } - }; - Import.prototype.genCSS = function (context, output) { - if (this.css && this.path._fileInfo.reference === undefined) { - output.add('@import ', this._fileInfo, this._index); - this.path.genCSS(context, output); - if (this.features) { - output.add(' '); - this.features.genCSS(context, output); - } - output.add(';'); - } - }; - Import.prototype.getPath = function () { - return (this.path instanceof URL) ? - this.path.value.value : this.path.value; - }; - Import.prototype.isVariableImport = function () { - var path = this.path; - if (path instanceof URL) { - path = path.value; - } - if (path instanceof Quoted) { - return path.containsVariables(); - } - return true; - }; - Import.prototype.evalForImport = function (context) { - var path = this.path; - if (path instanceof URL) { - path = path.value; - } - return new Import(path.eval(context), this.features, this.options, this._index, this._fileInfo, this.visibilityInfo()); - }; - Import.prototype.evalPath = function (context) { - var path = this.path.eval(context); - var fileInfo = this._fileInfo; - if (!(path instanceof URL)) { - // Add the rootpath if the URL requires a rewrite - var pathValue = path.value; - if (fileInfo && - pathValue && - context.pathRequiresRewrite(pathValue)) { - path.value = context.rewritePath(pathValue, fileInfo.rootpath); - } - else { - path.value = context.normalizePath(path.value); - } - } - return path; - }; - Import.prototype.eval = function (context) { - var result = this.doEval(context); - if (this.options.reference || this.blocksVisibility()) { - if (result.length || result.length === 0) { - result.forEach(function (node) { - node.addVisibilityBlock(); - }); - } - else { - result.addVisibilityBlock(); - } - } - return result; - }; - Import.prototype.doEval = function (context) { - var ruleset; - var registry; - var features = this.features && this.features.eval(context); - if (this.options.isPlugin) { - if (this.root && this.root.eval) { - try { - this.root.eval(context); - } - catch (e) { - e.message = 'Plugin error during evaluation'; - throw new LessError(e, this.root.imports, this.root.filename); - } - } - registry = context.frames[0] && context.frames[0].functionRegistry; - if (registry && this.root && this.root.functions) { - registry.addMultiple(this.root.functions); - } - return []; - } - if (this.skip) { - if (typeof this.skip === 'function') { - this.skip = this.skip(); - } - if (this.skip) { - return []; - } - } - if (this.options.inline) { - var contents = new Anonymous(this.root, 0, { - filename: this.importedFilename, - reference: this.path._fileInfo && this.path._fileInfo.reference - }, true, true); - return this.features ? new Media([contents], this.features.value) : [contents]; - } - else if (this.css) { - var newImport = new Import(this.evalPath(context), features, this.options, this._index); - if (!newImport.css && this.error) { - throw this.error; - } - return newImport; - } - else if (this.root) { - ruleset = new Ruleset(null, copyArray(this.root.rules)); - ruleset.evalImports(context); - return this.features ? new Media(ruleset.rules, this.features.value) : ruleset.rules; - } - else { - return []; - } - }; - return Import; - }(Node)); - Import.prototype.type = 'Import'; + var URL = /** @class */ (function (_super) { + __extends(URL, _super); + function URL(val, index, currentFileInfo, isEvald) { + var _this = _super.call(this) || this; + _this.value = val; + _this._index = index; + _this._fileInfo = currentFileInfo; + _this.isEvald = isEvald; + return _this; + } + URL.prototype.accept = function (visitor) { + this.value = visitor.visit(this.value); + }; + URL.prototype.genCSS = function (context, output) { + output.add('url('); + this.value.genCSS(context, output); + output.add(')'); + }; + URL.prototype.eval = function (context) { + var val = this.value.eval(context); + var rootpath; + if (!this.isEvald) { + // Add the rootpath if the URL requires a rewrite + rootpath = this.fileInfo() && this.fileInfo().rootpath; + if (typeof rootpath === 'string' && + typeof val.value === 'string' && + context.pathRequiresRewrite(val.value)) { + if (!val.quote) { + rootpath = escapePath(rootpath); + } + val.value = context.rewritePath(val.value, rootpath); + } + else { + val.value = context.normalizePath(val.value); + } + // Add url args if enabled + if (context.urlArgs) { + if (!val.value.match(/^\s*data:/)) { + var delimiter = val.value.indexOf('?') === -1 ? '?' : '&'; + var urlArgs = delimiter + context.urlArgs; + if (val.value.indexOf('#') !== -1) { + val.value = val.value.replace('#', urlArgs + "#"); + } + else { + val.value += urlArgs; + } + } + } + } + return new URL(val, this.getIndex(), this.fileInfo(), true); + }; + return URL; + }(Node)); + URL.prototype.type = 'Url'; + function escapePath(path) { + return path.replace(/[\(\)'"\s]/g, function (match) { return "\\" + match; }); + } - var JsEvalNode = /** @class */ (function (_super) { - __extends(JsEvalNode, _super); - function JsEvalNode() { - return _super !== null && _super.apply(this, arguments) || this; - } - JsEvalNode.prototype.evaluateJavaScript = function (expression, context) { - var result; - var that = this; - var evalContext = {}; - if (!context.javascriptEnabled) { - throw { message: 'Inline JavaScript is not enabled. Is it set in your options?', - filename: this.fileInfo().filename, - index: this.getIndex() }; - } - expression = expression.replace(/@\{([\w-]+)\}/g, function (_, name) { return that.jsify(new Variable("@" + name, that.getIndex(), that.fileInfo()).eval(context)); }); - try { - expression = new Function("return (" + expression + ")"); - } - catch (e) { - throw { message: "JavaScript evaluation error: " + e.message + " from `" + expression + "`", filename: this.fileInfo().filename, - index: this.getIndex() }; - } - var variables = context.frames[0].variables(); - for (var k in variables) { - if (variables.hasOwnProperty(k)) { - /* jshint loopfunc:true */ - evalContext[k.slice(1)] = { - value: variables[k].value, - toJS: function () { - return this.value.eval(context).toCSS(); - } - }; - } - } - try { - result = expression.call(evalContext); - } - catch (e) { - throw { message: "JavaScript evaluation error: '" + e.name + ": " + e.message.replace(/["]/g, '\'') + "'", filename: this.fileInfo().filename, - index: this.getIndex() }; - } - return result; - }; - JsEvalNode.prototype.jsify = function (obj) { - if (Array.isArray(obj.value) && (obj.value.length > 1)) { - return "[" + obj.value.map(function (v) { return v.toCSS(); }).join(', ') + "]"; - } - else { - return obj.toCSS(); - } - }; - return JsEvalNode; - }(Node)); + var Media = /** @class */ (function (_super) { + __extends(Media, _super); + function Media(value, features, index, currentFileInfo, visibilityInfo) { + var _this = _super.call(this) || this; + _this._index = index; + _this._fileInfo = currentFileInfo; + var selectors = (new Selector([], null, null, _this._index, _this._fileInfo)).createEmptySelectors(); + _this.features = new Value(features); + _this.rules = [new Ruleset(selectors, value)]; + _this.rules[0].allowImports = true; + _this.copyVisibilityInfo(visibilityInfo); + _this.allowRoot = true; + _this.setParent(selectors, _this); + _this.setParent(_this.features, _this); + _this.setParent(_this.rules, _this); + return _this; + } + Media.prototype.isRulesetLike = function () { + return true; + }; + Media.prototype.accept = function (visitor) { + if (this.features) { + this.features = visitor.visit(this.features); + } + if (this.rules) { + this.rules = visitor.visitArray(this.rules); + } + }; + Media.prototype.genCSS = function (context, output) { + output.add('@media ', this._fileInfo, this._index); + this.features.genCSS(context, output); + this.outputRuleset(context, output, this.rules); + }; + Media.prototype.eval = function (context) { + if (!context.mediaBlocks) { + context.mediaBlocks = []; + context.mediaPath = []; + } + var media = new Media(null, [], this._index, this._fileInfo, this.visibilityInfo()); + if (this.debugInfo) { + this.rules[0].debugInfo = this.debugInfo; + media.debugInfo = this.debugInfo; + } + media.features = this.features.eval(context); + context.mediaPath.push(media); + context.mediaBlocks.push(media); + this.rules[0].functionRegistry = context.frames[0].functionRegistry.inherit(); + context.frames.unshift(this.rules[0]); + media.rules = [this.rules[0].eval(context)]; + context.frames.shift(); + context.mediaPath.pop(); + return context.mediaPath.length === 0 ? media.evalTop(context) : + media.evalNested(context); + }; + Media.prototype.evalTop = function (context) { + var result = this; + // Render all dependent Media blocks. + if (context.mediaBlocks.length > 1) { + var selectors = (new Selector([], null, null, this.getIndex(), this.fileInfo())).createEmptySelectors(); + result = new Ruleset(selectors, context.mediaBlocks); + result.multiMedia = true; + result.copyVisibilityInfo(this.visibilityInfo()); + this.setParent(result, this); + } + delete context.mediaBlocks; + delete context.mediaPath; + return result; + }; + Media.prototype.evalNested = function (context) { + var i; + var value; + var path = context.mediaPath.concat([this]); + // Extract the media-query conditions separated with `,` (OR). + for (i = 0; i < path.length; i++) { + value = path[i].features instanceof Value ? + path[i].features.value : path[i].features; + path[i] = Array.isArray(value) ? value : [value]; + } + // Trace all permutations to generate the resulting media-query. + // + // (a, b and c) with nested (d, e) -> + // a and d + // a and e + // b and c and d + // b and c and e + this.features = new Value(this.permute(path).map(function (path) { + path = path.map(function (fragment) { return fragment.toCSS ? fragment : new Anonymous(fragment); }); + for (i = path.length - 1; i > 0; i--) { + path.splice(i, 0, new Anonymous('and')); + } + return new Expression(path); + })); + this.setParent(this.features, this); + // Fake a tree-node that doesn't output anything. + return new Ruleset([], []); + }; + Media.prototype.permute = function (arr) { + if (arr.length === 0) { + return []; + } + else if (arr.length === 1) { + return arr[0]; + } + else { + var result = []; + var rest = this.permute(arr.slice(1)); + for (var i = 0; i < rest.length; i++) { + for (var j = 0; j < arr[0].length; j++) { + result.push([arr[0][j]].concat(rest[i])); + } + } + return result; + } + }; + Media.prototype.bubbleSelectors = function (selectors) { + if (!selectors) { + return; + } + this.rules = [new Ruleset(copyArray(selectors), [this.rules[0]])]; + this.setParent(this.rules, this); + }; + return Media; + }(AtRule)); + Media.prototype.type = 'Media'; - var JavaScript = /** @class */ (function (_super) { - __extends(JavaScript, _super); - function JavaScript(string, escaped, index, currentFileInfo) { - var _this = _super.call(this) || this; - _this.escaped = escaped; - _this.expression = string; - _this._index = index; - _this._fileInfo = currentFileInfo; - return _this; - } - JavaScript.prototype.eval = function (context) { - var result = this.evaluateJavaScript(this.expression, context); - var type = typeof result; - if (type === 'number' && !isNaN(result)) { - return new Dimension(result); - } - else if (type === 'string') { - return new Quoted("\"" + result + "\"", result, this.escaped, this._index); - } - else if (Array.isArray(result)) { - return new Anonymous(result.join(', ')); - } - else { - return new Anonymous(result); - } - }; - return JavaScript; - }(JsEvalNode)); - JavaScript.prototype.type = 'JavaScript'; + // + // CSS @import node + // + // The general strategy here is that we don't want to wait + // for the parsing to be completed, before we start importing + // the file. That's because in the context of a browser, + // most of the time will be spent waiting for the server to respond. + // + // On creation, we push the import path to our import queue, though + // `import,push`, we also pass it a callback, which it'll call once + // the file has been fetched, and parsed. + // + var Import = /** @class */ (function (_super) { + __extends(Import, _super); + function Import(path, features, options, index, currentFileInfo, visibilityInfo) { + var _this = _super.call(this) || this; + _this.options = options; + _this._index = index; + _this._fileInfo = currentFileInfo; + _this.path = path; + _this.features = features; + _this.allowRoot = true; + if (_this.options.less !== undefined || _this.options.inline) { + _this.css = !_this.options.less || _this.options.inline; + } + else { + var pathValue = _this.getPath(); + if (pathValue && /[#\.\&\?]css([\?;].*)?$/.test(pathValue)) { + _this.css = true; + } + } + _this.copyVisibilityInfo(visibilityInfo); + _this.setParent(_this.features, _this); + _this.setParent(_this.path, _this); + return _this; + } + Import.prototype.accept = function (visitor) { + if (this.features) { + this.features = visitor.visit(this.features); + } + this.path = visitor.visit(this.path); + if (!this.options.isPlugin && !this.options.inline && this.root) { + this.root = visitor.visit(this.root); + } + }; + Import.prototype.genCSS = function (context, output) { + if (this.css && this.path._fileInfo.reference === undefined) { + output.add('@import ', this._fileInfo, this._index); + this.path.genCSS(context, output); + if (this.features) { + output.add(' '); + this.features.genCSS(context, output); + } + output.add(';'); + } + }; + Import.prototype.getPath = function () { + return (this.path instanceof URL) ? + this.path.value.value : this.path.value; + }; + Import.prototype.isVariableImport = function () { + var path = this.path; + if (path instanceof URL) { + path = path.value; + } + if (path instanceof Quoted) { + return path.containsVariables(); + } + return true; + }; + Import.prototype.evalForImport = function (context) { + var path = this.path; + if (path instanceof URL) { + path = path.value; + } + return new Import(path.eval(context), this.features, this.options, this._index, this._fileInfo, this.visibilityInfo()); + }; + Import.prototype.evalPath = function (context) { + var path = this.path.eval(context); + var fileInfo = this._fileInfo; + if (!(path instanceof URL)) { + // Add the rootpath if the URL requires a rewrite + var pathValue = path.value; + if (fileInfo && + pathValue && + context.pathRequiresRewrite(pathValue)) { + path.value = context.rewritePath(pathValue, fileInfo.rootpath); + } + else { + path.value = context.normalizePath(path.value); + } + } + return path; + }; + Import.prototype.eval = function (context) { + var result = this.doEval(context); + if (this.options.reference || this.blocksVisibility()) { + if (result.length || result.length === 0) { + result.forEach(function (node) { + node.addVisibilityBlock(); + }); + } + else { + result.addVisibilityBlock(); + } + } + return result; + }; + Import.prototype.doEval = function (context) { + var ruleset; + var registry; + var features = this.features && this.features.eval(context); + if (this.options.isPlugin) { + if (this.root && this.root.eval) { + try { + this.root.eval(context); + } + catch (e) { + e.message = 'Plugin error during evaluation'; + throw new LessError(e, this.root.imports, this.root.filename); + } + } + registry = context.frames[0] && context.frames[0].functionRegistry; + if (registry && this.root && this.root.functions) { + registry.addMultiple(this.root.functions); + } + return []; + } + if (this.skip) { + if (typeof this.skip === 'function') { + this.skip = this.skip(); + } + if (this.skip) { + return []; + } + } + if (this.options.inline) { + var contents = new Anonymous(this.root, 0, { + filename: this.importedFilename, + reference: this.path._fileInfo && this.path._fileInfo.reference + }, true, true); + return this.features ? new Media([contents], this.features.value) : [contents]; + } + else if (this.css) { + var newImport = new Import(this.evalPath(context), features, this.options, this._index); + if (!newImport.css && this.error) { + throw this.error; + } + return newImport; + } + else if (this.root) { + ruleset = new Ruleset(null, copyArray(this.root.rules)); + ruleset.evalImports(context); + return this.features ? new Media(ruleset.rules, this.features.value) : ruleset.rules; + } + else { + return []; + } + }; + return Import; + }(Node)); + Import.prototype.type = 'Import'; - var Assignment = /** @class */ (function (_super) { - __extends(Assignment, _super); - function Assignment(key, val) { - var _this = _super.call(this) || this; - _this.key = key; - _this.value = val; - return _this; - } - Assignment.prototype.accept = function (visitor) { - this.value = visitor.visit(this.value); - }; - Assignment.prototype.eval = function (context) { - if (this.value.eval) { - return new Assignment(this.key, this.value.eval(context)); - } - return this; - }; - Assignment.prototype.genCSS = function (context, output) { - output.add(this.key + "="); - if (this.value.genCSS) { - this.value.genCSS(context, output); - } - else { - output.add(this.value); - } - }; - return Assignment; - }(Node)); - Assignment.prototype.type = 'Assignment'; + var JsEvalNode = /** @class */ (function (_super) { + __extends(JsEvalNode, _super); + function JsEvalNode() { + return _super !== null && _super.apply(this, arguments) || this; + } + JsEvalNode.prototype.evaluateJavaScript = function (expression, context) { + var result; + var that = this; + var evalContext = {}; + if (!context.javascriptEnabled) { + throw { message: 'Inline JavaScript is not enabled. Is it set in your options?', + filename: this.fileInfo().filename, + index: this.getIndex() }; + } + expression = expression.replace(/@\{([\w-]+)\}/g, function (_, name) { + return that.jsify(new Variable("@" + name, that.getIndex(), that.fileInfo()).eval(context)); + }); + try { + expression = new Function("return (" + expression + ")"); + } + catch (e) { + throw { message: "JavaScript evaluation error: " + e.message + " from `" + expression + "`", filename: this.fileInfo().filename, + index: this.getIndex() }; + } + var variables = context.frames[0].variables(); + for (var k in variables) { + if (variables.hasOwnProperty(k)) { + /* jshint loopfunc:true */ + evalContext[k.slice(1)] = { + value: variables[k].value, + toJS: function () { + return this.value.eval(context).toCSS(); + } + }; + } + } + try { + result = expression.call(evalContext); + } + catch (e) { + throw { message: "JavaScript evaluation error: '" + e.name + ": " + e.message.replace(/["]/g, '\'') + "'", filename: this.fileInfo().filename, + index: this.getIndex() }; + } + return result; + }; + JsEvalNode.prototype.jsify = function (obj) { + if (Array.isArray(obj.value) && (obj.value.length > 1)) { + return "[" + obj.value.map(function (v) { return v.toCSS(); }).join(', ') + "]"; + } + else { + return obj.toCSS(); + } + }; + return JsEvalNode; + }(Node)); - var Condition = /** @class */ (function (_super) { - __extends(Condition, _super); - function Condition(op, l, r, i, negate) { - var _this = _super.call(this) || this; - _this.op = op.trim(); - _this.lvalue = l; - _this.rvalue = r; - _this._index = i; - _this.negate = negate; - return _this; - } - Condition.prototype.accept = function (visitor) { - this.lvalue = visitor.visit(this.lvalue); - this.rvalue = visitor.visit(this.rvalue); - }; - Condition.prototype.eval = function (context) { - var result = (function (op, a, b) { - switch (op) { - case 'and': return a && b; - case 'or': return a || b; - default: - switch (Node.compare(a, b)) { - case -1: - return op === '<' || op === '=<' || op === '<='; - case 0: - return op === '=' || op === '>=' || op === '=<' || op === '<='; - case 1: - return op === '>' || op === '>='; - default: - return false; - } - } - })(this.op, this.lvalue.eval(context), this.rvalue.eval(context)); - return this.negate ? !result : result; - }; - return Condition; - }(Node)); - Condition.prototype.type = 'Condition'; + var JavaScript = /** @class */ (function (_super) { + __extends(JavaScript, _super); + function JavaScript(string, escaped, index, currentFileInfo) { + var _this = _super.call(this) || this; + _this.escaped = escaped; + _this.expression = string; + _this._index = index; + _this._fileInfo = currentFileInfo; + return _this; + } + JavaScript.prototype.eval = function (context) { + var result = this.evaluateJavaScript(this.expression, context); + var type = typeof result; + if (type === 'number' && !isNaN(result)) { + return new Dimension(result); + } + else if (type === 'string') { + return new Quoted("\"" + result + "\"", result, this.escaped, this._index); + } + else if (Array.isArray(result)) { + return new Anonymous(result.join(', ')); + } + else { + return new Anonymous(result); + } + }; + return JavaScript; + }(JsEvalNode)); + JavaScript.prototype.type = 'JavaScript'; - var UnicodeDescriptor = /** @class */ (function (_super) { - __extends(UnicodeDescriptor, _super); - function UnicodeDescriptor(value) { - var _this = _super.call(this) || this; - _this.value = value; - return _this; - } - return UnicodeDescriptor; - }(Node)); - UnicodeDescriptor.prototype.type = 'UnicodeDescriptor'; + var Assignment = /** @class */ (function (_super) { + __extends(Assignment, _super); + function Assignment(key, val) { + var _this = _super.call(this) || this; + _this.key = key; + _this.value = val; + return _this; + } + Assignment.prototype.accept = function (visitor) { + this.value = visitor.visit(this.value); + }; + Assignment.prototype.eval = function (context) { + if (this.value.eval) { + return new Assignment(this.key, this.value.eval(context)); + } + return this; + }; + Assignment.prototype.genCSS = function (context, output) { + output.add(this.key + "="); + if (this.value.genCSS) { + this.value.genCSS(context, output); + } + else { + output.add(this.value); + } + }; + return Assignment; + }(Node)); + Assignment.prototype.type = 'Assignment'; - var Negative = /** @class */ (function (_super) { - __extends(Negative, _super); - function Negative(node) { - var _this = _super.call(this) || this; - _this.value = node; - return _this; - } - Negative.prototype.genCSS = function (context, output) { - output.add('-'); - this.value.genCSS(context, output); - }; - Negative.prototype.eval = function (context) { - if (context.isMathOn()) { - return (new Operation('*', [new Dimension(-1), this.value])).eval(context); - } - return new Negative(this.value.eval(context)); - }; - return Negative; - }(Node)); - Negative.prototype.type = 'Negative'; + var Condition = /** @class */ (function (_super) { + __extends(Condition, _super); + function Condition(op, l, r, i, negate) { + var _this = _super.call(this) || this; + _this.op = op.trim(); + _this.lvalue = l; + _this.rvalue = r; + _this._index = i; + _this.negate = negate; + return _this; + } + Condition.prototype.accept = function (visitor) { + this.lvalue = visitor.visit(this.lvalue); + this.rvalue = visitor.visit(this.rvalue); + }; + Condition.prototype.eval = function (context) { + var result = (function (op, a, b) { + switch (op) { + case 'and': return a && b; + case 'or': return a || b; + default: + switch (Node.compare(a, b)) { + case -1: + return op === '<' || op === '=<' || op === '<='; + case 0: + return op === '=' || op === '>=' || op === '=<' || op === '<='; + case 1: + return op === '>' || op === '>='; + default: + return false; + } + } + })(this.op, this.lvalue.eval(context), this.rvalue.eval(context)); + return this.negate ? !result : result; + }; + return Condition; + }(Node)); + Condition.prototype.type = 'Condition'; - var Extend = /** @class */ (function (_super) { - __extends(Extend, _super); - function Extend(selector, option, index, currentFileInfo, visibilityInfo) { - var _this = _super.call(this) || this; - _this.selector = selector; - _this.option = option; - _this.object_id = Extend.next_id++; - _this.parent_ids = [_this.object_id]; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.copyVisibilityInfo(visibilityInfo); - _this.allowRoot = true; - switch (option) { - case 'all': - _this.allowBefore = true; - _this.allowAfter = true; - break; - default: - _this.allowBefore = false; - _this.allowAfter = false; - break; - } - _this.setParent(_this.selector, _this); - return _this; - } - Extend.prototype.accept = function (visitor) { - this.selector = visitor.visit(this.selector); - }; - Extend.prototype.eval = function (context) { - return new Extend(this.selector.eval(context), this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo()); - }; - Extend.prototype.clone = function (context) { - return new Extend(this.selector, this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo()); - }; - // it concatenates (joins) all selectors in selector array - Extend.prototype.findSelfSelectors = function (selectors) { - var selfElements = []; - var i; - var selectorElements; - for (i = 0; i < selectors.length; i++) { - selectorElements = selectors[i].elements; - // duplicate the logic in genCSS function inside the selector node. - // future TODO - move both logics into the selector joiner visitor - if (i > 0 && selectorElements.length && selectorElements[0].combinator.value === '') { - selectorElements[0].combinator.value = ' '; - } - selfElements = selfElements.concat(selectors[i].elements); - } - this.selfSelectors = [new Selector(selfElements)]; - this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo()); - }; - return Extend; - }(Node)); - Extend.next_id = 0; - Extend.prototype.type = 'Extend'; + var UnicodeDescriptor = /** @class */ (function (_super) { + __extends(UnicodeDescriptor, _super); + function UnicodeDescriptor(value) { + var _this = _super.call(this) || this; + _this.value = value; + return _this; + } + return UnicodeDescriptor; + }(Node)); + UnicodeDescriptor.prototype.type = 'UnicodeDescriptor'; - var VariableCall = /** @class */ (function (_super) { - __extends(VariableCall, _super); - function VariableCall(variable, index, currentFileInfo) { - var _this = _super.call(this) || this; - _this.variable = variable; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.allowRoot = true; - return _this; - } - VariableCall.prototype.eval = function (context) { - var rules; - var detachedRuleset = new Variable(this.variable, this.getIndex(), this.fileInfo()).eval(context); - var error = new LessError({ message: "Could not evaluate variable call " + this.variable }); - if (!detachedRuleset.ruleset) { - if (detachedRuleset.rules) { - rules = detachedRuleset; - } - else if (Array.isArray(detachedRuleset)) { - rules = new Ruleset('', detachedRuleset); - } - else if (Array.isArray(detachedRuleset.value)) { - rules = new Ruleset('', detachedRuleset.value); - } - else { - throw error; - } - detachedRuleset = new DetachedRuleset(rules); - } - if (detachedRuleset.ruleset) { - return detachedRuleset.callEval(context); - } - throw error; - }; - return VariableCall; - }(Node)); - VariableCall.prototype.type = 'VariableCall'; + var Negative = /** @class */ (function (_super) { + __extends(Negative, _super); + function Negative(node) { + var _this = _super.call(this) || this; + _this.value = node; + return _this; + } + Negative.prototype.genCSS = function (context, output) { + output.add('-'); + this.value.genCSS(context, output); + }; + Negative.prototype.eval = function (context) { + if (context.isMathOn()) { + return (new Operation('*', [new Dimension(-1), this.value])).eval(context); + } + return new Negative(this.value.eval(context)); + }; + return Negative; + }(Node)); + Negative.prototype.type = 'Negative'; - var NamespaceValue = /** @class */ (function (_super) { - __extends(NamespaceValue, _super); - function NamespaceValue(ruleCall, lookups, index, fileInfo) { - var _this = _super.call(this) || this; - _this.value = ruleCall; - _this.lookups = lookups; - _this._index = index; - _this._fileInfo = fileInfo; - return _this; - } - NamespaceValue.prototype.eval = function (context) { - var i; - var name; - var rules = this.value.eval(context); - for (i = 0; i < this.lookups.length; i++) { - name = this.lookups[i]; - /** - * Eval'd DRs return rulesets. - * Eval'd mixins return rules, so let's make a ruleset if we need it. - * We need to do this because of late parsing of values - */ - if (Array.isArray(rules)) { - rules = new Ruleset([new Selector()], rules); - } - if (name === '') { - rules = rules.lastDeclaration(); - } - else if (name.charAt(0) === '@') { - if (name.charAt(1) === '@') { - name = "@" + new Variable(name.substr(1)).eval(context).value; - } - if (rules.variables) { - rules = rules.variable(name); - } - if (!rules) { - throw { type: 'Name', message: "variable " + name + " not found", filename: this.fileInfo().filename, - index: this.getIndex() }; - } - } - else { - if (name.substring(0, 2) === '$@') { - name = "$" + new Variable(name.substr(1)).eval(context).value; - } - else { - name = name.charAt(0) === '$' ? name : "$" + name; - } - if (rules.properties) { - rules = rules.property(name); - } - if (!rules) { - throw { type: 'Name', message: "property \"" + name.substr(1) + "\" not found", filename: this.fileInfo().filename, - index: this.getIndex() }; - } - // Properties are an array of values, since a ruleset can have multiple props. - // We pick the last one (the "cascaded" value) - rules = rules[rules.length - 1]; - } - if (rules.value) { - rules = rules.eval(context).value; - } - if (rules.ruleset) { - rules = rules.ruleset.eval(context); - } - } - return rules; - }; - return NamespaceValue; - }(Node)); - NamespaceValue.prototype.type = 'NamespaceValue'; + var Extend = /** @class */ (function (_super) { + __extends(Extend, _super); + function Extend(selector, option, index, currentFileInfo, visibilityInfo) { + var _this = _super.call(this) || this; + _this.selector = selector; + _this.option = option; + _this.object_id = Extend.next_id++; + _this.parent_ids = [_this.object_id]; + _this._index = index; + _this._fileInfo = currentFileInfo; + _this.copyVisibilityInfo(visibilityInfo); + _this.allowRoot = true; + switch (option) { + case 'all': + _this.allowBefore = true; + _this.allowAfter = true; + break; + default: + _this.allowBefore = false; + _this.allowAfter = false; + break; + } + _this.setParent(_this.selector, _this); + return _this; + } + Extend.prototype.accept = function (visitor) { + this.selector = visitor.visit(this.selector); + }; + Extend.prototype.eval = function (context) { + return new Extend(this.selector.eval(context), this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo()); + }; + Extend.prototype.clone = function (context) { + return new Extend(this.selector, this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo()); + }; + // it concatenates (joins) all selectors in selector array + Extend.prototype.findSelfSelectors = function (selectors) { + var selfElements = [], i, selectorElements; + for (i = 0; i < selectors.length; i++) { + selectorElements = selectors[i].elements; + // duplicate the logic in genCSS function inside the selector node. + // future TODO - move both logics into the selector joiner visitor + if (i > 0 && selectorElements.length && selectorElements[0].combinator.value === '') { + selectorElements[0].combinator.value = ' '; + } + selfElements = selfElements.concat(selectors[i].elements); + } + this.selfSelectors = [new Selector(selfElements)]; + this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo()); + }; + return Extend; + }(Node)); + Extend.next_id = 0; + Extend.prototype.type = 'Extend'; - var Definition = /** @class */ (function (_super) { - __extends(Definition, _super); - function Definition(name, params, rules, condition, variadic, frames, visibilityInfo) { - var _this = _super.call(this) || this; - _this.name = name || 'anonymous mixin'; - _this.selectors = [new Selector([new Element(null, name, false, _this._index, _this._fileInfo)])]; - _this.params = params; - _this.condition = condition; - _this.variadic = variadic; - _this.arity = params.length; - _this.rules = rules; - _this._lookups = {}; - var optionalParameters = []; - _this.required = params.reduce(function (count, p) { - if (!p.name || (p.name && !p.value)) { - return count + 1; - } - else { - optionalParameters.push(p.name); - return count; - } - }, 0); - _this.optionalParameters = optionalParameters; - _this.frames = frames; - _this.copyVisibilityInfo(visibilityInfo); - _this.allowRoot = true; - return _this; - } - Definition.prototype.accept = function (visitor) { - if (this.params && this.params.length) { - this.params = visitor.visitArray(this.params); - } - this.rules = visitor.visitArray(this.rules); - if (this.condition) { - this.condition = visitor.visit(this.condition); - } - }; - Definition.prototype.evalParams = function (context, mixinEnv, args, evaldArguments) { - /* jshint boss:true */ - var frame = new Ruleset(null, null); - var varargs; - var arg; - var params = copyArray(this.params); - var i; - var j; - var val; - var name; - var isNamedFound; - var argIndex; - var argsLength = 0; - if (mixinEnv.frames && mixinEnv.frames[0] && mixinEnv.frames[0].functionRegistry) { - frame.functionRegistry = mixinEnv.frames[0].functionRegistry.inherit(); - } - mixinEnv = new contexts.Eval(mixinEnv, [frame].concat(mixinEnv.frames)); - if (args) { - args = copyArray(args); - argsLength = args.length; - for (i = 0; i < argsLength; i++) { - arg = args[i]; - if (name = (arg && arg.name)) { - isNamedFound = false; - for (j = 0; j < params.length; j++) { - if (!evaldArguments[j] && name === params[j].name) { - evaldArguments[j] = arg.value.eval(context); - frame.prependRule(new Declaration(name, arg.value.eval(context))); - isNamedFound = true; - break; - } - } - if (isNamedFound) { - args.splice(i, 1); - i--; - continue; - } - else { - throw { type: 'Runtime', message: "Named argument for " + this.name + " " + args[i].name + " not found" }; - } - } - } - } - argIndex = 0; - for (i = 0; i < params.length; i++) { - if (evaldArguments[i]) { - continue; - } - arg = args && args[argIndex]; - if (name = params[i].name) { - if (params[i].variadic) { - varargs = []; - for (j = argIndex; j < argsLength; j++) { - varargs.push(args[j].value.eval(context)); - } - frame.prependRule(new Declaration(name, new Expression(varargs).eval(context))); - } - else { - val = arg && arg.value; - if (val) { - // This was a mixin call, pass in a detached ruleset of it's eval'd rules - if (Array.isArray(val)) { - val = new DetachedRuleset(new Ruleset('', val)); - } - else { - val = val.eval(context); - } - } - else if (params[i].value) { - val = params[i].value.eval(mixinEnv); - frame.resetCache(); - } - else { - throw { type: 'Runtime', message: "wrong number of arguments for " + this.name + " (" + argsLength + " for " + this.arity + ")" }; - } - frame.prependRule(new Declaration(name, val)); - evaldArguments[i] = val; - } - } - if (params[i].variadic && args) { - for (j = argIndex; j < argsLength; j++) { - evaldArguments[j] = args[j].value.eval(context); - } - } - argIndex++; - } - return frame; - }; - Definition.prototype.makeImportant = function () { - var rules = !this.rules ? this.rules : this.rules.map(function (r) { - if (r.makeImportant) { - return r.makeImportant(true); - } - else { - return r; - } - }); - var result = new Definition(this.name, this.params, rules, this.condition, this.variadic, this.frames); - return result; - }; - Definition.prototype.eval = function (context) { - return new Definition(this.name, this.params, this.rules, this.condition, this.variadic, this.frames || copyArray(context.frames)); - }; - Definition.prototype.evalCall = function (context, args, important) { - var _arguments = []; - var mixinFrames = this.frames ? this.frames.concat(context.frames) : context.frames; - var frame = this.evalParams(context, new contexts.Eval(context, mixinFrames), args, _arguments); - var rules; - var ruleset; - frame.prependRule(new Declaration('@arguments', new Expression(_arguments).eval(context))); - rules = copyArray(this.rules); - ruleset = new Ruleset(null, rules); - ruleset.originalRuleset = this; - ruleset = ruleset.eval(new contexts.Eval(context, [this, frame].concat(mixinFrames))); - if (important) { - ruleset = ruleset.makeImportant(); - } - return ruleset; - }; - Definition.prototype.matchCondition = function (args, context) { - if (this.condition && !this.condition.eval(new contexts.Eval(context, [this.evalParams(context, /* the parameter variables */ new contexts.Eval(context, this.frames ? this.frames.concat(context.frames) : context.frames), args, [])] - .concat(this.frames || []) // the parent namespace/mixin frames - .concat(context.frames)))) { // the current environment frames - return false; - } - return true; - }; - Definition.prototype.matchArgs = function (args, context) { - var allArgsCnt = (args && args.length) || 0; - var len; - var optionalParameters = this.optionalParameters; - var requiredArgsCnt = !args ? 0 : args.reduce(function (count, p) { - if (optionalParameters.indexOf(p.name) < 0) { - return count + 1; - } - else { - return count; - } - }, 0); - if (!this.variadic) { - if (requiredArgsCnt < this.required) { - return false; - } - if (allArgsCnt > this.params.length) { - return false; - } - } - else { - if (requiredArgsCnt < (this.required - 1)) { - return false; - } - } - // check patterns - len = Math.min(requiredArgsCnt, this.arity); - for (var i = 0; i < len; i++) { - if (!this.params[i].name && !this.params[i].variadic) { - if (args[i].value.eval(context).toCSS() != this.params[i].value.eval(context).toCSS()) { - return false; - } - } - } - return true; - }; - return Definition; - }(Ruleset)); - Definition.prototype.type = 'MixinDefinition'; - Definition.prototype.evalFirst = true; + var VariableCall = /** @class */ (function (_super) { + __extends(VariableCall, _super); + function VariableCall(variable, index, currentFileInfo) { + var _this = _super.call(this) || this; + _this.variable = variable; + _this._index = index; + _this._fileInfo = currentFileInfo; + _this.allowRoot = true; + return _this; + } + VariableCall.prototype.eval = function (context) { + var rules; + var detachedRuleset = new Variable(this.variable, this.getIndex(), this.fileInfo()).eval(context); + var error = new LessError({ message: "Could not evaluate variable call " + this.variable }); + if (!detachedRuleset.ruleset) { + if (detachedRuleset.rules) { + rules = detachedRuleset; + } + else if (Array.isArray(detachedRuleset)) { + rules = new Ruleset('', detachedRuleset); + } + else if (Array.isArray(detachedRuleset.value)) { + rules = new Ruleset('', detachedRuleset.value); + } + else { + throw error; + } + detachedRuleset = new DetachedRuleset(rules); + } + if (detachedRuleset.ruleset) { + return detachedRuleset.callEval(context); + } + throw error; + }; + return VariableCall; + }(Node)); + VariableCall.prototype.type = 'VariableCall'; - var MixinCall = /** @class */ (function (_super) { - __extends(MixinCall, _super); - function MixinCall(elements, args, index, currentFileInfo, important) { - var _this = _super.call(this) || this; - _this.selector = new Selector(elements); - _this.arguments = args || []; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.important = important; - _this.allowRoot = true; - _this.setParent(_this.selector, _this); - return _this; - } - MixinCall.prototype.accept = function (visitor) { - if (this.selector) { - this.selector = visitor.visit(this.selector); - } - if (this.arguments.length) { - this.arguments = visitor.visitArray(this.arguments); - } - }; - MixinCall.prototype.eval = function (context) { - var mixins; - var mixin; - var mixinPath; - var args = []; - var arg; - var argValue; - var rules = []; - var match = false; - var i; - var m; - var f; - var isRecursive; - var isOneFound; - var candidates = []; - var candidate; - var conditionResult = []; - var defaultResult; - var defFalseEitherCase = -1; - var defNone = 0; - var defTrue = 1; - var defFalse = 2; - var count; - var originalRuleset; - var noArgumentsFilter; - this.selector = this.selector.eval(context); - function calcDefGroup(mixin, mixinPath) { - var f; - var p; - var namespace; - for (f = 0; f < 2; f++) { - conditionResult[f] = true; - defaultFunc.value(f); - for (p = 0; p < mixinPath.length && conditionResult[f]; p++) { - namespace = mixinPath[p]; - if (namespace.matchCondition) { - conditionResult[f] = conditionResult[f] && namespace.matchCondition(null, context); - } - } - if (mixin.matchCondition) { - conditionResult[f] = conditionResult[f] && mixin.matchCondition(args, context); - } - } - if (conditionResult[0] || conditionResult[1]) { - if (conditionResult[0] != conditionResult[1]) { - return conditionResult[1] ? - defTrue : defFalse; - } - return defNone; - } - return defFalseEitherCase; - } - for (i = 0; i < this.arguments.length; i++) { - arg = this.arguments[i]; - argValue = arg.value.eval(context); - if (arg.expand && Array.isArray(argValue.value)) { - argValue = argValue.value; - for (m = 0; m < argValue.length; m++) { - args.push({ value: argValue[m] }); - } - } - else { - args.push({ name: arg.name, value: argValue }); - } - } - noArgumentsFilter = function (rule) { return rule.matchArgs(null, context); }; - for (i = 0; i < context.frames.length; i++) { - if ((mixins = context.frames[i].find(this.selector, null, noArgumentsFilter)).length > 0) { - isOneFound = true; - // To make `default()` function independent of definition order we have two "subpasses" here. - // At first we evaluate each guard *twice* (with `default() == true` and `default() == false`), - // and build candidate list with corresponding flags. Then, when we know all possible matches, - // we make a final decision. - for (m = 0; m < mixins.length; m++) { - mixin = mixins[m].rule; - mixinPath = mixins[m].path; - isRecursive = false; - for (f = 0; f < context.frames.length; f++) { - if ((!(mixin instanceof Definition)) && mixin === (context.frames[f].originalRuleset || context.frames[f])) { - isRecursive = true; - break; - } - } - if (isRecursive) { - continue; - } - if (mixin.matchArgs(args, context)) { - candidate = { mixin: mixin, group: calcDefGroup(mixin, mixinPath) }; - if (candidate.group !== defFalseEitherCase) { - candidates.push(candidate); - } - match = true; - } - } - defaultFunc.reset(); - count = [0, 0, 0]; - for (m = 0; m < candidates.length; m++) { - count[candidates[m].group]++; - } - if (count[defNone] > 0) { - defaultResult = defFalse; - } - else { - defaultResult = defTrue; - if ((count[defTrue] + count[defFalse]) > 1) { - throw { type: 'Runtime', message: "Ambiguous use of `default()` found when matching for `" + this.format(args) + "`", index: this.getIndex(), filename: this.fileInfo().filename }; - } - } - for (m = 0; m < candidates.length; m++) { - candidate = candidates[m].group; - if ((candidate === defNone) || (candidate === defaultResult)) { - try { - mixin = candidates[m].mixin; - if (!(mixin instanceof Definition)) { - originalRuleset = mixin.originalRuleset || mixin; - mixin = new Definition('', [], mixin.rules, null, false, null, originalRuleset.visibilityInfo()); - mixin.originalRuleset = originalRuleset; - } - var newRules = mixin.evalCall(context, args, this.important).rules; - this._setVisibilityToReplacement(newRules); - Array.prototype.push.apply(rules, newRules); - } - catch (e) { - throw { message: e.message, index: this.getIndex(), filename: this.fileInfo().filename, stack: e.stack }; - } - } - } - if (match) { - return rules; - } - } - } - if (isOneFound) { - throw { type: 'Runtime', message: "No matching definition was found for `" + this.format(args) + "`", index: this.getIndex(), filename: this.fileInfo().filename }; - } - else { - throw { type: 'Name', message: this.selector.toCSS().trim() + " is undefined", index: this.getIndex(), filename: this.fileInfo().filename }; - } - }; - MixinCall.prototype._setVisibilityToReplacement = function (replacement) { - var i; - var rule; - if (this.blocksVisibility()) { - for (i = 0; i < replacement.length; i++) { - rule = replacement[i]; - rule.addVisibilityBlock(); - } - } - }; - MixinCall.prototype.format = function (args) { - return this.selector.toCSS().trim() + "(" + (args ? args.map(function (a) { - var argValue = ''; - if (a.name) { - argValue += a.name + ":"; - } - if (a.value.toCSS) { - argValue += a.value.toCSS(); - } - else { - argValue += '???'; - } - return argValue; - }).join(', ') : '') + ")"; - }; - return MixinCall; - }(Node)); - MixinCall.prototype.type = 'MixinCall'; + var NamespaceValue = /** @class */ (function (_super) { + __extends(NamespaceValue, _super); + function NamespaceValue(ruleCall, lookups, index, fileInfo) { + var _this = _super.call(this) || this; + _this.value = ruleCall; + _this.lookups = lookups; + _this._index = index; + _this._fileInfo = fileInfo; + return _this; + } + NamespaceValue.prototype.eval = function (context) { + var i, name, rules = this.value.eval(context); + for (i = 0; i < this.lookups.length; i++) { + name = this.lookups[i]; + /** + * Eval'd DRs return rulesets. + * Eval'd mixins return rules, so let's make a ruleset if we need it. + * We need to do this because of late parsing of values + */ + if (Array.isArray(rules)) { + rules = new Ruleset([new Selector()], rules); + } + if (name === '') { + rules = rules.lastDeclaration(); + } + else if (name.charAt(0) === '@') { + if (name.charAt(1) === '@') { + name = "@" + new Variable(name.substr(1)).eval(context).value; + } + if (rules.variables) { + rules = rules.variable(name); + } + if (!rules) { + throw { type: 'Name', message: "variable " + name + " not found", filename: this.fileInfo().filename, + index: this.getIndex() }; + } + } + else { + if (name.substring(0, 2) === '$@') { + name = "$" + new Variable(name.substr(1)).eval(context).value; + } + else { + name = name.charAt(0) === '$' ? name : "$" + name; + } + if (rules.properties) { + rules = rules.property(name); + } + if (!rules) { + throw { type: 'Name', message: "property \"" + name.substr(1) + "\" not found", filename: this.fileInfo().filename, + index: this.getIndex() }; + } + // Properties are an array of values, since a ruleset can have multiple props. + // We pick the last one (the "cascaded" value) + rules = rules[rules.length - 1]; + } + if (rules.value) { + rules = rules.eval(context).value; + } + if (rules.ruleset) { + rules = rules.ruleset.eval(context); + } + } + return rules; + }; + return NamespaceValue; + }(Node)); + NamespaceValue.prototype.type = 'NamespaceValue'; - var tree = { - Node: Node, Color: Color, AtRule: AtRule, DetachedRuleset: DetachedRuleset, Operation: Operation, - Dimension: Dimension, Unit: Unit, Keyword: Keyword, Variable: Variable, Property: Property, - Ruleset: Ruleset, Element: Element, Attribute: Attribute, Combinator: Combinator, Selector: Selector, - Quoted: Quoted, Expression: Expression, Declaration: Declaration, Call: Call, URL: URL, Import: Import, - Comment: Comment, Anonymous: Anonymous, Value: Value, JavaScript: JavaScript, Assignment: Assignment, - Condition: Condition, Paren: Paren, Media: Media, UnicodeDescriptor: UnicodeDescriptor, Negative: Negative, - Extend: Extend, VariableCall: VariableCall, NamespaceValue: NamespaceValue, - mixin: { - Call: MixinCall, - Definition: Definition - } - }; + var Definition = /** @class */ (function (_super) { + __extends(Definition, _super); + function Definition(name, params, rules, condition, variadic, frames, visibilityInfo) { + var _this = _super.call(this) || this; + _this.name = name || 'anonymous mixin'; + _this.selectors = [new Selector([new Element(null, name, false, _this._index, _this._fileInfo)])]; + _this.params = params; + _this.condition = condition; + _this.variadic = variadic; + _this.arity = params.length; + _this.rules = rules; + _this._lookups = {}; + var optionalParameters = []; + _this.required = params.reduce(function (count, p) { + if (!p.name || (p.name && !p.value)) { + return count + 1; + } + else { + optionalParameters.push(p.name); + return count; + } + }, 0); + _this.optionalParameters = optionalParameters; + _this.frames = frames; + _this.copyVisibilityInfo(visibilityInfo); + _this.allowRoot = true; + return _this; + } + Definition.prototype.accept = function (visitor) { + if (this.params && this.params.length) { + this.params = visitor.visitArray(this.params); + } + this.rules = visitor.visitArray(this.rules); + if (this.condition) { + this.condition = visitor.visit(this.condition); + } + }; + Definition.prototype.evalParams = function (context, mixinEnv, args, evaldArguments) { + /* jshint boss:true */ + var frame = new Ruleset(null, null); + var varargs; + var arg; + var params = copyArray(this.params); + var i; + var j; + var val; + var name; + var isNamedFound; + var argIndex; + var argsLength = 0; + if (mixinEnv.frames && mixinEnv.frames[0] && mixinEnv.frames[0].functionRegistry) { + frame.functionRegistry = mixinEnv.frames[0].functionRegistry.inherit(); + } + mixinEnv = new contexts.Eval(mixinEnv, [frame].concat(mixinEnv.frames)); + if (args) { + args = copyArray(args); + argsLength = args.length; + for (i = 0; i < argsLength; i++) { + arg = args[i]; + if (name = (arg && arg.name)) { + isNamedFound = false; + for (j = 0; j < params.length; j++) { + if (!evaldArguments[j] && name === params[j].name) { + evaldArguments[j] = arg.value.eval(context); + frame.prependRule(new Declaration(name, arg.value.eval(context))); + isNamedFound = true; + break; + } + } + if (isNamedFound) { + args.splice(i, 1); + i--; + continue; + } + else { + throw { type: 'Runtime', message: "Named argument for " + this.name + " " + args[i].name + " not found" }; + } + } + } + } + argIndex = 0; + for (i = 0; i < params.length; i++) { + if (evaldArguments[i]) { + continue; + } + arg = args && args[argIndex]; + if (name = params[i].name) { + if (params[i].variadic) { + varargs = []; + for (j = argIndex; j < argsLength; j++) { + varargs.push(args[j].value.eval(context)); + } + frame.prependRule(new Declaration(name, new Expression(varargs).eval(context))); + } + else { + val = arg && arg.value; + if (val) { + // This was a mixin call, pass in a detached ruleset of it's eval'd rules + if (Array.isArray(val)) { + val = new DetachedRuleset(new Ruleset('', val)); + } + else { + val = val.eval(context); + } + } + else if (params[i].value) { + val = params[i].value.eval(mixinEnv); + frame.resetCache(); + } + else { + throw { type: 'Runtime', message: "wrong number of arguments for " + this.name + " (" + argsLength + " for " + this.arity + ")" }; + } + frame.prependRule(new Declaration(name, val)); + evaldArguments[i] = val; + } + } + if (params[i].variadic && args) { + for (j = argIndex; j < argsLength; j++) { + evaldArguments[j] = args[j].value.eval(context); + } + } + argIndex++; + } + return frame; + }; + Definition.prototype.makeImportant = function () { + var rules = !this.rules ? this.rules : this.rules.map(function (r) { + if (r.makeImportant) { + return r.makeImportant(true); + } + else { + return r; + } + }); + var result = new Definition(this.name, this.params, rules, this.condition, this.variadic, this.frames); + return result; + }; + Definition.prototype.eval = function (context) { + return new Definition(this.name, this.params, this.rules, this.condition, this.variadic, this.frames || copyArray(context.frames)); + }; + Definition.prototype.evalCall = function (context, args, important) { + var _arguments = []; + var mixinFrames = this.frames ? this.frames.concat(context.frames) : context.frames; + var frame = this.evalParams(context, new contexts.Eval(context, mixinFrames), args, _arguments); + var rules; + var ruleset; + frame.prependRule(new Declaration('@arguments', new Expression(_arguments).eval(context))); + rules = copyArray(this.rules); + ruleset = new Ruleset(null, rules); + ruleset.originalRuleset = this; + ruleset = ruleset.eval(new contexts.Eval(context, [this, frame].concat(mixinFrames))); + if (important) { + ruleset = ruleset.makeImportant(); + } + return ruleset; + }; + Definition.prototype.matchCondition = function (args, context) { + if (this.condition && !this.condition.eval(new contexts.Eval(context, [this.evalParams(context, /* the parameter variables */ new contexts.Eval(context, this.frames ? this.frames.concat(context.frames) : context.frames), args, [])] + .concat(this.frames || []) // the parent namespace/mixin frames + .concat(context.frames)))) { // the current environment frames + return false; + } + return true; + }; + Definition.prototype.matchArgs = function (args, context) { + var allArgsCnt = (args && args.length) || 0; + var len; + var optionalParameters = this.optionalParameters; + var requiredArgsCnt = !args ? 0 : args.reduce(function (count, p) { + if (optionalParameters.indexOf(p.name) < 0) { + return count + 1; + } + else { + return count; + } + }, 0); + if (!this.variadic) { + if (requiredArgsCnt < this.required) { + return false; + } + if (allArgsCnt > this.params.length) { + return false; + } + } + else { + if (requiredArgsCnt < (this.required - 1)) { + return false; + } + } + // check patterns + len = Math.min(requiredArgsCnt, this.arity); + for (var i = 0; i < len; i++) { + if (!this.params[i].name && !this.params[i].variadic) { + if (args[i].value.eval(context).toCSS() != this.params[i].value.eval(context).toCSS()) { + return false; + } + } + } + return true; + }; + return Definition; + }(Ruleset)); + Definition.prototype.type = 'MixinDefinition'; + Definition.prototype.evalFirst = true; - var logger = { - error: function (msg) { - this._fireEvent('error', msg); - }, - warn: function (msg) { - this._fireEvent('warn', msg); - }, - info: function (msg) { - this._fireEvent('info', msg); - }, - debug: function (msg) { - this._fireEvent('debug', msg); - }, - addListener: function (listener) { - this._listeners.push(listener); - }, - removeListener: function (listener) { - for (var i = 0; i < this._listeners.length; i++) { - if (this._listeners[i] === listener) { - this._listeners.splice(i, 1); - return; - } - } - }, - _fireEvent: function (type, msg) { - for (var i = 0; i < this._listeners.length; i++) { - var logFunction = this._listeners[i][type]; - if (logFunction) { - logFunction(msg); - } - } - }, - _listeners: [] - }; + var MixinCall = /** @class */ (function (_super) { + __extends(MixinCall, _super); + function MixinCall(elements, args, index, currentFileInfo, important) { + var _this = _super.call(this) || this; + _this.selector = new Selector(elements); + _this.arguments = args || []; + _this._index = index; + _this._fileInfo = currentFileInfo; + _this.important = important; + _this.allowRoot = true; + _this.setParent(_this.selector, _this); + return _this; + } + MixinCall.prototype.accept = function (visitor) { + if (this.selector) { + this.selector = visitor.visit(this.selector); + } + if (this.arguments.length) { + this.arguments = visitor.visitArray(this.arguments); + } + }; + MixinCall.prototype.eval = function (context) { + var mixins; + var mixin; + var mixinPath; + var args = []; + var arg; + var argValue; + var rules = []; + var match = false; + var i; + var m; + var f; + var isRecursive; + var isOneFound; + var candidates = []; + var candidate; + var conditionResult = []; + var defaultResult; + var defFalseEitherCase = -1; + var defNone = 0; + var defTrue = 1; + var defFalse = 2; + var count; + var originalRuleset; + var noArgumentsFilter; + this.selector = this.selector.eval(context); + function calcDefGroup(mixin, mixinPath) { + var f, p, namespace; + for (f = 0; f < 2; f++) { + conditionResult[f] = true; + defaultFunc.value(f); + for (p = 0; p < mixinPath.length && conditionResult[f]; p++) { + namespace = mixinPath[p]; + if (namespace.matchCondition) { + conditionResult[f] = conditionResult[f] && namespace.matchCondition(null, context); + } + } + if (mixin.matchCondition) { + conditionResult[f] = conditionResult[f] && mixin.matchCondition(args, context); + } + } + if (conditionResult[0] || conditionResult[1]) { + if (conditionResult[0] != conditionResult[1]) { + return conditionResult[1] ? + defTrue : defFalse; + } + return defNone; + } + return defFalseEitherCase; + } + for (i = 0; i < this.arguments.length; i++) { + arg = this.arguments[i]; + argValue = arg.value.eval(context); + if (arg.expand && Array.isArray(argValue.value)) { + argValue = argValue.value; + for (m = 0; m < argValue.length; m++) { + args.push({ value: argValue[m] }); + } + } + else { + args.push({ name: arg.name, value: argValue }); + } + } + noArgumentsFilter = function (rule) { return rule.matchArgs(null, context); }; + for (i = 0; i < context.frames.length; i++) { + if ((mixins = context.frames[i].find(this.selector, null, noArgumentsFilter)).length > 0) { + isOneFound = true; + // To make `default()` function independent of definition order we have two "subpasses" here. + // At first we evaluate each guard *twice* (with `default() == true` and `default() == false`), + // and build candidate list with corresponding flags. Then, when we know all possible matches, + // we make a final decision. + for (m = 0; m < mixins.length; m++) { + mixin = mixins[m].rule; + mixinPath = mixins[m].path; + isRecursive = false; + for (f = 0; f < context.frames.length; f++) { + if ((!(mixin instanceof Definition)) && mixin === (context.frames[f].originalRuleset || context.frames[f])) { + isRecursive = true; + break; + } + } + if (isRecursive) { + continue; + } + if (mixin.matchArgs(args, context)) { + candidate = { mixin: mixin, group: calcDefGroup(mixin, mixinPath) }; + if (candidate.group !== defFalseEitherCase) { + candidates.push(candidate); + } + match = true; + } + } + defaultFunc.reset(); + count = [0, 0, 0]; + for (m = 0; m < candidates.length; m++) { + count[candidates[m].group]++; + } + if (count[defNone] > 0) { + defaultResult = defFalse; + } + else { + defaultResult = defTrue; + if ((count[defTrue] + count[defFalse]) > 1) { + throw { type: 'Runtime', message: "Ambiguous use of `default()` found when matching for `" + this.format(args) + "`", index: this.getIndex(), filename: this.fileInfo().filename }; + } + } + for (m = 0; m < candidates.length; m++) { + candidate = candidates[m].group; + if ((candidate === defNone) || (candidate === defaultResult)) { + try { + mixin = candidates[m].mixin; + if (!(mixin instanceof Definition)) { + originalRuleset = mixin.originalRuleset || mixin; + mixin = new Definition('', [], mixin.rules, null, false, null, originalRuleset.visibilityInfo()); + mixin.originalRuleset = originalRuleset; + } + var newRules = mixin.evalCall(context, args, this.important).rules; + this._setVisibilityToReplacement(newRules); + Array.prototype.push.apply(rules, newRules); + } + catch (e) { + throw { message: e.message, index: this.getIndex(), filename: this.fileInfo().filename, stack: e.stack }; + } + } + } + if (match) { + return rules; + } + } + } + if (isOneFound) { + throw { type: 'Runtime', message: "No matching definition was found for `" + this.format(args) + "`", index: this.getIndex(), filename: this.fileInfo().filename }; + } + else { + throw { type: 'Name', message: this.selector.toCSS().trim() + " is undefined", index: this.getIndex(), filename: this.fileInfo().filename }; + } + }; + MixinCall.prototype._setVisibilityToReplacement = function (replacement) { + var i, rule; + if (this.blocksVisibility()) { + for (i = 0; i < replacement.length; i++) { + rule = replacement[i]; + rule.addVisibilityBlock(); + } + } + }; + MixinCall.prototype.format = function (args) { + return this.selector.toCSS().trim() + "(" + (args ? args.map(function (a) { + var argValue = ''; + if (a.name) { + argValue += a.name + ":"; + } + if (a.value.toCSS) { + argValue += a.value.toCSS(); + } + else { + argValue += '???'; + } + return argValue; + }).join(', ') : '') + ")"; + }; + return MixinCall; + }(Node)); + MixinCall.prototype.type = 'MixinCall'; - /** - * @todo Document why this abstraction exists, and the relationship between - * environment, file managers, and plugin manager - */ - var environment = /** @class */ (function () { - function environment(externalEnvironment, fileManagers) { - this.fileManagers = fileManagers || []; - externalEnvironment = externalEnvironment || {}; - var optionalFunctions = ['encodeBase64', 'mimeLookup', 'charsetLookup', 'getSourceMapGenerator']; - var requiredFunctions = []; - var functions = requiredFunctions.concat(optionalFunctions); - for (var i = 0; i < functions.length; i++) { - var propName = functions[i]; - var environmentFunc = externalEnvironment[propName]; - if (environmentFunc) { - this[propName] = environmentFunc.bind(externalEnvironment); - } - else if (i < requiredFunctions.length) { - this.warn("missing required function in environment - " + propName); - } - } - } - environment.prototype.getFileManager = function (filename, currentDirectory, options, environment, isSync) { - if (!filename) { - logger.warn('getFileManager called with no filename.. Please report this issue. continuing.'); - } - if (currentDirectory == null) { - logger.warn('getFileManager called with null directory.. Please report this issue. continuing.'); - } - var fileManagers = this.fileManagers; - if (options.pluginManager) { - fileManagers = [].concat(fileManagers).concat(options.pluginManager.getFileManagers()); - } - for (var i = fileManagers.length - 1; i >= 0; i--) { - var fileManager = fileManagers[i]; - if (fileManager[isSync ? 'supportsSync' : 'supports'](filename, currentDirectory, options, environment)) { - return fileManager; - } - } - return null; - }; - environment.prototype.addFileManager = function (fileManager) { - this.fileManagers.push(fileManager); - }; - environment.prototype.clearFileManagers = function () { - this.fileManagers = []; - }; - return environment; - }()); + var tree = { + Node: Node, Color: Color, AtRule: AtRule, DetachedRuleset: DetachedRuleset, Operation: Operation, + Dimension: Dimension, Unit: Unit, Keyword: Keyword, Variable: Variable, Property: Property, + Ruleset: Ruleset, Element: Element, Attribute: Attribute, Combinator: Combinator, Selector: Selector, + Quoted: Quoted, Expression: Expression, Declaration: Declaration, Call: Call, URL: URL, Import: Import, + Comment: Comment, Anonymous: Anonymous, Value: Value, JavaScript: JavaScript, Assignment: Assignment, + Condition: Condition, Paren: Paren, Media: Media, UnicodeDescriptor: UnicodeDescriptor, Negative: Negative, + Extend: Extend, VariableCall: VariableCall, NamespaceValue: NamespaceValue, + mixin: { + Call: MixinCall, + Definition: Definition + } + }; - var AbstractFileManager = /** @class */ (function () { - function AbstractFileManager() { - } - AbstractFileManager.prototype.getPath = function (filename) { - var j = filename.lastIndexOf('?'); - if (j > 0) { - filename = filename.slice(0, j); - } - j = filename.lastIndexOf('/'); - if (j < 0) { - j = filename.lastIndexOf('\\'); - } - if (j < 0) { - return ''; - } - return filename.slice(0, j + 1); - }; - AbstractFileManager.prototype.tryAppendExtension = function (path, ext) { - return /(\.[a-z]*$)|([\?;].*)$/.test(path) ? path : path + ext; - }; - AbstractFileManager.prototype.tryAppendLessExtension = function (path) { - return this.tryAppendExtension(path, '.less'); - }; - AbstractFileManager.prototype.supportsSync = function () { return false; }; - AbstractFileManager.prototype.alwaysMakePathsAbsolute = function () { return false; }; - AbstractFileManager.prototype.isPathAbsolute = function (filename) { - return (/^(?:[a-z-]+:|\/|\\|#)/i).test(filename); - }; - // TODO: pull out / replace? - AbstractFileManager.prototype.join = function (basePath, laterPath) { - if (!basePath) { - return laterPath; - } - return basePath + laterPath; - }; - AbstractFileManager.prototype.pathDiff = function (url, baseUrl) { - // diff between two paths to create a relative path - var urlParts = this.extractUrlParts(url); - var baseUrlParts = this.extractUrlParts(baseUrl); - var i; - var max; - var urlDirectories; - var baseUrlDirectories; - var diff = ''; - if (urlParts.hostPart !== baseUrlParts.hostPart) { - return ''; - } - max = Math.max(baseUrlParts.directories.length, urlParts.directories.length); - for (i = 0; i < max; i++) { - if (baseUrlParts.directories[i] !== urlParts.directories[i]) { - break; - } - } - baseUrlDirectories = baseUrlParts.directories.slice(i); - urlDirectories = urlParts.directories.slice(i); - for (i = 0; i < baseUrlDirectories.length - 1; i++) { - diff += '../'; - } - for (i = 0; i < urlDirectories.length - 1; i++) { - diff += urlDirectories[i] + "/"; - } - return diff; - }; - // helper function, not part of API - AbstractFileManager.prototype.extractUrlParts = function (url, baseUrl) { - // urlParts[1] = protocol://hostname/ OR / - // urlParts[2] = / if path relative to host base - // urlParts[3] = directories - // urlParts[4] = filename - // urlParts[5] = parameters - var urlPartsRegex = /^((?:[a-z-]+:)?\/{2}(?:[^\/\?#]*\/)|([\/\\]))?((?:[^\/\\\?#]*[\/\\])*)([^\/\\\?#]*)([#\?].*)?$/i; - var urlParts = url.match(urlPartsRegex); - var returner = {}; - var rawDirectories = []; - var directories = []; - var i; - var baseUrlParts; - if (!urlParts) { - throw new Error("Could not parse sheet href - '" + url + "'"); - } - // Stylesheets in IE don't always return the full path - if (baseUrl && (!urlParts[1] || urlParts[2])) { - baseUrlParts = baseUrl.match(urlPartsRegex); - if (!baseUrlParts) { - throw new Error("Could not parse page url - '" + baseUrl + "'"); - } - urlParts[1] = urlParts[1] || baseUrlParts[1] || ''; - if (!urlParts[2]) { - urlParts[3] = baseUrlParts[3] + urlParts[3]; - } - } - if (urlParts[3]) { - rawDirectories = urlParts[3].replace(/\\/g, '/').split('/'); - // collapse '..' and skip '.' - for (i = 0; i < rawDirectories.length; i++) { - if (rawDirectories[i] === '..') { - directories.pop(); - } - else if (rawDirectories[i] !== '.') { - directories.push(rawDirectories[i]); - } - } - } - returner.hostPart = urlParts[1]; - returner.directories = directories; - returner.rawPath = (urlParts[1] || '') + rawDirectories.join('/'); - returner.path = (urlParts[1] || '') + directories.join('/'); - returner.filename = urlParts[4]; - returner.fileUrl = returner.path + (urlParts[4] || ''); - returner.url = returner.fileUrl + (urlParts[5] || ''); - return returner; - }; - return AbstractFileManager; - }()); + var AbstractFileManager = /** @class */ (function () { + function AbstractFileManager() { + } + AbstractFileManager.prototype.getPath = function (filename) { + var j = filename.lastIndexOf('?'); + if (j > 0) { + filename = filename.slice(0, j); + } + j = filename.lastIndexOf('/'); + if (j < 0) { + j = filename.lastIndexOf('\\'); + } + if (j < 0) { + return ''; + } + return filename.slice(0, j + 1); + }; + AbstractFileManager.prototype.tryAppendExtension = function (path, ext) { + return /(\.[a-z]*$)|([\?;].*)$/.test(path) ? path : path + ext; + }; + AbstractFileManager.prototype.tryAppendLessExtension = function (path) { + return this.tryAppendExtension(path, '.less'); + }; + AbstractFileManager.prototype.supportsSync = function () { + return false; + }; + AbstractFileManager.prototype.alwaysMakePathsAbsolute = function () { + return false; + }; + AbstractFileManager.prototype.isPathAbsolute = function (filename) { + return (/^(?:[a-z-]+:|\/|\\|#)/i).test(filename); + }; + // TODO: pull out / replace? + AbstractFileManager.prototype.join = function (basePath, laterPath) { + if (!basePath) { + return laterPath; + } + return basePath + laterPath; + }; + AbstractFileManager.prototype.pathDiff = function (url, baseUrl) { + // diff between two paths to create a relative path + var urlParts = this.extractUrlParts(url); + var baseUrlParts = this.extractUrlParts(baseUrl); + var i; + var max; + var urlDirectories; + var baseUrlDirectories; + var diff = ''; + if (urlParts.hostPart !== baseUrlParts.hostPart) { + return ''; + } + max = Math.max(baseUrlParts.directories.length, urlParts.directories.length); + for (i = 0; i < max; i++) { + if (baseUrlParts.directories[i] !== urlParts.directories[i]) { + break; + } + } + baseUrlDirectories = baseUrlParts.directories.slice(i); + urlDirectories = urlParts.directories.slice(i); + for (i = 0; i < baseUrlDirectories.length - 1; i++) { + diff += '../'; + } + for (i = 0; i < urlDirectories.length - 1; i++) { + diff += urlDirectories[i] + "/"; + } + return diff; + }; + // helper function, not part of API + AbstractFileManager.prototype.extractUrlParts = function (url, baseUrl) { + // urlParts[1] = protocol://hostname/ OR / + // urlParts[2] = / if path relative to host base + // urlParts[3] = directories + // urlParts[4] = filename + // urlParts[5] = parameters + var urlPartsRegex = /^((?:[a-z-]+:)?\/{2}(?:[^\/\?#]*\/)|([\/\\]))?((?:[^\/\\\?#]*[\/\\])*)([^\/\\\?#]*)([#\?].*)?$/i; + var urlParts = url.match(urlPartsRegex); + var returner = {}; + var rawDirectories = []; + var directories = []; + var i; + var baseUrlParts; + if (!urlParts) { + throw new Error("Could not parse sheet href - '" + url + "'"); + } + // Stylesheets in IE don't always return the full path + if (baseUrl && (!urlParts[1] || urlParts[2])) { + baseUrlParts = baseUrl.match(urlPartsRegex); + if (!baseUrlParts) { + throw new Error("Could not parse page url - '" + baseUrl + "'"); + } + urlParts[1] = urlParts[1] || baseUrlParts[1] || ''; + if (!urlParts[2]) { + urlParts[3] = baseUrlParts[3] + urlParts[3]; + } + } + if (urlParts[3]) { + rawDirectories = urlParts[3].replace(/\\/g, '/').split('/'); + // collapse '..' and skip '.' + for (i = 0; i < rawDirectories.length; i++) { + if (rawDirectories[i] === '..') { + directories.pop(); + } + else if (rawDirectories[i] !== '.') { + directories.push(rawDirectories[i]); + } + } + } + returner.hostPart = urlParts[1]; + returner.directories = directories; + returner.rawPath = (urlParts[1] || '') + rawDirectories.join('/'); + returner.path = (urlParts[1] || '') + directories.join('/'); + returner.filename = urlParts[4]; + returner.fileUrl = returner.path + (urlParts[4] || ''); + returner.url = returner.fileUrl + (urlParts[5] || ''); + return returner; + }; + return AbstractFileManager; + }()); - var AbstractPluginLoader = /** @class */ (function () { - function AbstractPluginLoader() { - // Implemented by Node.js plugin loader - this.require = function () { return null; }; - } - AbstractPluginLoader.prototype.evalPlugin = function (contents, context, imports, pluginOptions, fileInfo) { - var loader; - var registry; - var pluginObj; - var localModule; - var pluginManager; - var filename; - var result; - pluginManager = context.pluginManager; - if (fileInfo) { - if (typeof fileInfo === 'string') { - filename = fileInfo; - } - else { - filename = fileInfo.filename; - } - } - var shortname = (new this.less.FileManager()).extractUrlParts(filename).filename; - if (filename) { - pluginObj = pluginManager.get(filename); - if (pluginObj) { - result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions); - if (result) { - return result; - } - try { - if (pluginObj.use) { - pluginObj.use.call(this.context, pluginObj); - } - } - catch (e) { - e.message = e.message || 'Error during @plugin call'; - return new LessError(e, imports, filename); - } - return pluginObj; - } - } - localModule = { - exports: {}, - pluginManager: pluginManager, - fileInfo: fileInfo - }; - registry = functionRegistry.create(); - var registerPlugin = function (obj) { - pluginObj = obj; - }; - try { - loader = new Function('module', 'require', 'registerPlugin', 'functions', 'tree', 'less', 'fileInfo', contents); - loader(localModule, this.require(filename), registerPlugin, registry, this.less.tree, this.less, fileInfo); - } - catch (e) { - return new LessError(e, imports, filename); - } - if (!pluginObj) { - pluginObj = localModule.exports; - } - pluginObj = this.validatePlugin(pluginObj, filename, shortname); - if (pluginObj instanceof LessError) { - return pluginObj; - } - if (pluginObj) { - pluginObj.imports = imports; - pluginObj.filename = filename; - // For < 3.x (or unspecified minVersion) - setOptions() before install() - if (!pluginObj.minVersion || this.compareVersion('3.0.0', pluginObj.minVersion) < 0) { - result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions); - if (result) { - return result; - } - } - // Run on first load - pluginManager.addPlugin(pluginObj, fileInfo.filename, registry); - pluginObj.functions = registry.getLocalFunctions(); - // Need to call setOptions again because the pluginObj might have functions - result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions); - if (result) { - return result; - } - // Run every @plugin call - try { - if (pluginObj.use) { - pluginObj.use.call(this.context, pluginObj); - } - } - catch (e) { - e.message = e.message || 'Error during @plugin call'; - return new LessError(e, imports, filename); - } - } - else { - return new LessError({ message: 'Not a valid plugin' }, imports, filename); - } - return pluginObj; - }; - AbstractPluginLoader.prototype.trySetOptions = function (plugin, filename, name, options) { - if (options && !plugin.setOptions) { - return new LessError({ - message: "Options have been provided but the plugin " + name + " does not support any options." - }); - } - try { - plugin.setOptions && plugin.setOptions(options); - } - catch (e) { - return new LessError(e); - } - }; - AbstractPluginLoader.prototype.validatePlugin = function (plugin, filename, name) { - if (plugin) { - // support plugins being a function - // so that the plugin can be more usable programmatically - if (typeof plugin === 'function') { - plugin = new plugin(); - } - if (plugin.minVersion) { - if (this.compareVersion(plugin.minVersion, this.less.version) < 0) { - return new LessError({ - message: "Plugin " + name + " requires version " + this.versionToString(plugin.minVersion) - }); - } - } - return plugin; - } - return null; - }; - AbstractPluginLoader.prototype.compareVersion = function (aVersion, bVersion) { - if (typeof aVersion === 'string') { - aVersion = aVersion.match(/^(\d+)\.?(\d+)?\.?(\d+)?/); - aVersion.shift(); - } - for (var i = 0; i < aVersion.length; i++) { - if (aVersion[i] !== bVersion[i]) { - return parseInt(aVersion[i]) > parseInt(bVersion[i]) ? -1 : 1; - } - } - return 0; - }; - AbstractPluginLoader.prototype.versionToString = function (version) { - var versionString = ''; - for (var i = 0; i < version.length; i++) { - versionString += (versionString ? '.' : '') + version[i]; - } - return versionString; - }; - AbstractPluginLoader.prototype.printUsage = function (plugins) { - for (var i = 0; i < plugins.length; i++) { - var plugin = plugins[i]; - if (plugin.printUsage) { - plugin.printUsage(); - } - } - }; - return AbstractPluginLoader; - }()); + var AbstractPluginLoader = /** @class */ (function () { + function AbstractPluginLoader() { + // Implemented by Node.js plugin loader + this.require = function () { + return null; + }; + } + AbstractPluginLoader.prototype.evalPlugin = function (contents, context, imports, pluginOptions, fileInfo) { + var loader, registry, pluginObj, localModule, pluginManager, filename, result; + pluginManager = context.pluginManager; + if (fileInfo) { + if (typeof fileInfo === 'string') { + filename = fileInfo; + } + else { + filename = fileInfo.filename; + } + } + var shortname = (new this.less.FileManager()).extractUrlParts(filename).filename; + if (filename) { + pluginObj = pluginManager.get(filename); + if (pluginObj) { + result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions); + if (result) { + return result; + } + try { + if (pluginObj.use) { + pluginObj.use.call(this.context, pluginObj); + } + } + catch (e) { + e.message = e.message || 'Error during @plugin call'; + return new LessError(e, imports, filename); + } + return pluginObj; + } + } + localModule = { + exports: {}, + pluginManager: pluginManager, + fileInfo: fileInfo + }; + registry = functionRegistry.create(); + var registerPlugin = function (obj) { + pluginObj = obj; + }; + try { + loader = new Function('module', 'require', 'registerPlugin', 'functions', 'tree', 'less', 'fileInfo', contents); + loader(localModule, this.require(filename), registerPlugin, registry, this.less.tree, this.less, fileInfo); + } + catch (e) { + return new LessError(e, imports, filename); + } + if (!pluginObj) { + pluginObj = localModule.exports; + } + pluginObj = this.validatePlugin(pluginObj, filename, shortname); + if (pluginObj instanceof LessError) { + return pluginObj; + } + if (pluginObj) { + pluginObj.imports = imports; + pluginObj.filename = filename; + // For < 3.x (or unspecified minVersion) - setOptions() before install() + if (!pluginObj.minVersion || this.compareVersion('3.0.0', pluginObj.minVersion) < 0) { + result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions); + if (result) { + return result; + } + } + // Run on first load + pluginManager.addPlugin(pluginObj, fileInfo.filename, registry); + pluginObj.functions = registry.getLocalFunctions(); + // Need to call setOptions again because the pluginObj might have functions + result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions); + if (result) { + return result; + } + // Run every @plugin call + try { + if (pluginObj.use) { + pluginObj.use.call(this.context, pluginObj); + } + } + catch (e) { + e.message = e.message || 'Error during @plugin call'; + return new LessError(e, imports, filename); + } + } + else { + return new LessError({ message: 'Not a valid plugin' }, imports, filename); + } + return pluginObj; + }; + AbstractPluginLoader.prototype.trySetOptions = function (plugin, filename, name, options) { + if (options && !plugin.setOptions) { + return new LessError({ + message: "Options have been provided but the plugin " + name + " does not support any options." + }); + } + try { + plugin.setOptions && plugin.setOptions(options); + } + catch (e) { + return new LessError(e); + } + }; + AbstractPluginLoader.prototype.validatePlugin = function (plugin, filename, name) { + if (plugin) { + // support plugins being a function + // so that the plugin can be more usable programmatically + if (typeof plugin === 'function') { + plugin = new plugin(); + } + if (plugin.minVersion) { + if (this.compareVersion(plugin.minVersion, this.less.version) < 0) { + return new LessError({ + message: "Plugin " + name + " requires version " + this.versionToString(plugin.minVersion) + }); + } + } + return plugin; + } + return null; + }; + AbstractPluginLoader.prototype.compareVersion = function (aVersion, bVersion) { + if (typeof aVersion === 'string') { + aVersion = aVersion.match(/^(\d+)\.?(\d+)?\.?(\d+)?/); + aVersion.shift(); + } + for (var i = 0; i < aVersion.length; i++) { + if (aVersion[i] !== bVersion[i]) { + return parseInt(aVersion[i]) > parseInt(bVersion[i]) ? -1 : 1; + } + } + return 0; + }; + AbstractPluginLoader.prototype.versionToString = function (version) { + var versionString = ''; + for (var i = 0; i < version.length; i++) { + versionString += (versionString ? '.' : '') + version[i]; + } + return versionString; + }; + AbstractPluginLoader.prototype.printUsage = function (plugins) { + for (var i = 0; i < plugins.length; i++) { + var plugin = plugins[i]; + if (plugin.printUsage) { + plugin.printUsage(); + } + } + }; + return AbstractPluginLoader; + }()); - var _visitArgs = { visitDeeper: true }; - var _hasIndexed = false; - function _noop(node) { - return node; - } - function indexNodeTypes(parent, ticker) { - // add .typeIndex to tree node types for lookup table - var key; - var child; - for (key in parent) { - /* eslint guard-for-in: 0 */ - child = parent[key]; - switch (typeof child) { - case 'function': - // ignore bound functions directly on tree which do not have a prototype - // or aren't nodes - if (child.prototype && child.prototype.type) { - child.prototype.typeIndex = ticker++; - } - break; - case 'object': - ticker = indexNodeTypes(child, ticker); - break; - } - } - return ticker; - } - var Visitor = /** @class */ (function () { - function Visitor(implementation) { - this._implementation = implementation; - this._visitInCache = {}; - this._visitOutCache = {}; - if (!_hasIndexed) { - indexNodeTypes(tree, 1); - _hasIndexed = true; - } - } - Visitor.prototype.visit = function (node) { - if (!node) { - return node; - } - var nodeTypeIndex = node.typeIndex; - if (!nodeTypeIndex) { - // MixinCall args aren't a node type? - if (node.value && node.value.typeIndex) { - this.visit(node.value); - } - return node; - } - var impl = this._implementation; - var func = this._visitInCache[nodeTypeIndex]; - var funcOut = this._visitOutCache[nodeTypeIndex]; - var visitArgs = _visitArgs; - var fnName; - visitArgs.visitDeeper = true; - if (!func) { - fnName = "visit" + node.type; - func = impl[fnName] || _noop; - funcOut = impl[fnName + "Out"] || _noop; - this._visitInCache[nodeTypeIndex] = func; - this._visitOutCache[nodeTypeIndex] = funcOut; - } - if (func !== _noop) { - var newNode = func.call(impl, node, visitArgs); - if (node && impl.isReplacing) { - node = newNode; - } - } - if (visitArgs.visitDeeper && node) { - if (node.length) { - for (var i = 0, cnt = node.length; i < cnt; i++) { - if (node[i].accept) { - node[i].accept(this); - } - } - } - else if (node.accept) { - node.accept(this); - } - } - if (funcOut != _noop) { - funcOut.call(impl, node); - } - return node; - }; - Visitor.prototype.visitArray = function (nodes, nonReplacing) { - if (!nodes) { - return nodes; - } - var cnt = nodes.length; - var i; - // Non-replacing - if (nonReplacing || !this._implementation.isReplacing) { - for (i = 0; i < cnt; i++) { - this.visit(nodes[i]); - } - return nodes; - } - // Replacing - var out = []; - for (i = 0; i < cnt; i++) { - var evald = this.visit(nodes[i]); - if (evald === undefined) { - continue; - } - if (!evald.splice) { - out.push(evald); - } - else if (evald.length) { - this.flatten(evald, out); - } - } - return out; - }; - Visitor.prototype.flatten = function (arr, out) { - if (!out) { - out = []; - } - var cnt; - var i; - var item; - var nestedCnt; - var j; - var nestedItem; - for (i = 0, cnt = arr.length; i < cnt; i++) { - item = arr[i]; - if (item === undefined) { - continue; - } - if (!item.splice) { - out.push(item); - continue; - } - for (j = 0, nestedCnt = item.length; j < nestedCnt; j++) { - nestedItem = item[j]; - if (nestedItem === undefined) { - continue; - } - if (!nestedItem.splice) { - out.push(nestedItem); - } - else if (nestedItem.length) { - this.flatten(nestedItem, out); - } - } - } - return out; - }; - return Visitor; - }()); + var _visitArgs = { visitDeeper: true }; + var _hasIndexed = false; + function _noop(node) { + return node; + } + function indexNodeTypes(parent, ticker) { + // add .typeIndex to tree node types for lookup table + var key, child; + for (key in parent) { + /* eslint guard-for-in: 0 */ + child = parent[key]; + switch (typeof child) { + case 'function': + // ignore bound functions directly on tree which do not have a prototype + // or aren't nodes + if (child.prototype && child.prototype.type) { + child.prototype.typeIndex = ticker++; + } + break; + case 'object': + ticker = indexNodeTypes(child, ticker); + break; + } + } + return ticker; + } + var Visitor = /** @class */ (function () { + function Visitor(implementation) { + this._implementation = implementation; + this._visitInCache = {}; + this._visitOutCache = {}; + if (!_hasIndexed) { + indexNodeTypes(tree, 1); + _hasIndexed = true; + } + } + Visitor.prototype.visit = function (node) { + if (!node) { + return node; + } + var nodeTypeIndex = node.typeIndex; + if (!nodeTypeIndex) { + // MixinCall args aren't a node type? + if (node.value && node.value.typeIndex) { + this.visit(node.value); + } + return node; + } + var impl = this._implementation; + var func = this._visitInCache[nodeTypeIndex]; + var funcOut = this._visitOutCache[nodeTypeIndex]; + var visitArgs = _visitArgs; + var fnName; + visitArgs.visitDeeper = true; + if (!func) { + fnName = "visit" + node.type; + func = impl[fnName] || _noop; + funcOut = impl[fnName + "Out"] || _noop; + this._visitInCache[nodeTypeIndex] = func; + this._visitOutCache[nodeTypeIndex] = funcOut; + } + if (func !== _noop) { + var newNode = func.call(impl, node, visitArgs); + if (node && impl.isReplacing) { + node = newNode; + } + } + if (visitArgs.visitDeeper && node) { + if (node.length) { + for (var i = 0, cnt = node.length; i < cnt; i++) { + if (node[i].accept) { + node[i].accept(this); + } + } + } + else if (node.accept) { + node.accept(this); + } + } + if (funcOut != _noop) { + funcOut.call(impl, node); + } + return node; + }; + Visitor.prototype.visitArray = function (nodes, nonReplacing) { + if (!nodes) { + return nodes; + } + var cnt = nodes.length; + var i; + // Non-replacing + if (nonReplacing || !this._implementation.isReplacing) { + for (i = 0; i < cnt; i++) { + this.visit(nodes[i]); + } + return nodes; + } + // Replacing + var out = []; + for (i = 0; i < cnt; i++) { + var evald = this.visit(nodes[i]); + if (evald === undefined) { + continue; + } + if (!evald.splice) { + out.push(evald); + } + else if (evald.length) { + this.flatten(evald, out); + } + } + return out; + }; + Visitor.prototype.flatten = function (arr, out) { + if (!out) { + out = []; + } + var cnt, i, item, nestedCnt, j, nestedItem; + for (i = 0, cnt = arr.length; i < cnt; i++) { + item = arr[i]; + if (item === undefined) { + continue; + } + if (!item.splice) { + out.push(item); + continue; + } + for (j = 0, nestedCnt = item.length; j < nestedCnt; j++) { + nestedItem = item[j]; + if (nestedItem === undefined) { + continue; + } + if (!nestedItem.splice) { + out.push(nestedItem); + } + else if (nestedItem.length) { + this.flatten(nestedItem, out); + } + } + } + return out; + }; + return Visitor; + }()); - var ImportSequencer = /** @class */ (function () { - function ImportSequencer(onSequencerEmpty) { - this.imports = []; - this.variableImports = []; - this._onSequencerEmpty = onSequencerEmpty; - this._currentDepth = 0; - } - ImportSequencer.prototype.addImport = function (callback) { - var importSequencer = this; - var importItem = { - callback: callback, - args: null, - isReady: false - }; - this.imports.push(importItem); - return function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } - importItem.args = Array.prototype.slice.call(args, 0); - importItem.isReady = true; - importSequencer.tryRun(); - }; - }; - ImportSequencer.prototype.addVariableImport = function (callback) { - this.variableImports.push(callback); - }; - ImportSequencer.prototype.tryRun = function () { - this._currentDepth++; - try { - while (true) { - while (this.imports.length > 0) { - var importItem = this.imports[0]; - if (!importItem.isReady) { - return; - } - this.imports = this.imports.slice(1); - importItem.callback.apply(null, importItem.args); - } - if (this.variableImports.length === 0) { - break; - } - var variableImport = this.variableImports[0]; - this.variableImports = this.variableImports.slice(1); - variableImport(); - } - } - finally { - this._currentDepth--; - } - if (this._currentDepth === 0 && this._onSequencerEmpty) { - this._onSequencerEmpty(); - } - }; - return ImportSequencer; - }()); + var ImportSequencer = /** @class */ (function () { + function ImportSequencer(onSequencerEmpty) { + this.imports = []; + this.variableImports = []; + this._onSequencerEmpty = onSequencerEmpty; + this._currentDepth = 0; + } + ImportSequencer.prototype.addImport = function (callback) { + var importSequencer = this, importItem = { + callback: callback, + args: null, + isReady: false + }; + this.imports.push(importItem); + return function () { + importItem.args = Array.prototype.slice.call(arguments, 0); + importItem.isReady = true; + importSequencer.tryRun(); + }; + }; + ImportSequencer.prototype.addVariableImport = function (callback) { + this.variableImports.push(callback); + }; + ImportSequencer.prototype.tryRun = function () { + this._currentDepth++; + try { + while (true) { + while (this.imports.length > 0) { + var importItem = this.imports[0]; + if (!importItem.isReady) { + return; + } + this.imports = this.imports.slice(1); + importItem.callback.apply(null, importItem.args); + } + if (this.variableImports.length === 0) { + break; + } + var variableImport = this.variableImports[0]; + this.variableImports = this.variableImports.slice(1); + variableImport(); + } + } + finally { + this._currentDepth--; + } + if (this._currentDepth === 0 && this._onSequencerEmpty) { + this._onSequencerEmpty(); + } + }; + return ImportSequencer; + }()); - var ImportVisitor = function (importer, finish) { - this._visitor = new Visitor(this); - this._importer = importer; - this._finish = finish; - this.context = new contexts.Eval(); - this.importCount = 0; - this.onceFileDetectionMap = {}; - this.recursionDetector = {}; - this._sequencer = new ImportSequencer(this._onSequencerEmpty.bind(this)); - }; - ImportVisitor.prototype = { - isReplacing: false, - run: function (root) { - try { - // process the contents - this._visitor.visit(root); - } - catch (e) { - this.error = e; - } - this.isFinished = true; - this._sequencer.tryRun(); - }, - _onSequencerEmpty: function () { - if (!this.isFinished) { - return; - } - this._finish(this.error); - }, - visitImport: function (importNode, visitArgs) { - var inlineCSS = importNode.options.inline; - if (!importNode.css || inlineCSS) { - var context = new contexts.Eval(this.context, copyArray(this.context.frames)); - var importParent = context.frames[0]; - this.importCount++; - if (importNode.isVariableImport()) { - this._sequencer.addVariableImport(this.processImportNode.bind(this, importNode, context, importParent)); - } - else { - this.processImportNode(importNode, context, importParent); - } - } - visitArgs.visitDeeper = false; - }, - processImportNode: function (importNode, context, importParent) { - var evaldImportNode; - var inlineCSS = importNode.options.inline; - try { - evaldImportNode = importNode.evalForImport(context); - } - catch (e) { - if (!e.filename) { - e.index = importNode.getIndex(); - e.filename = importNode.fileInfo().filename; - } - // attempt to eval properly and treat as css - importNode.css = true; - // if that fails, this error will be thrown - importNode.error = e; - } - if (evaldImportNode && (!evaldImportNode.css || inlineCSS)) { - if (evaldImportNode.options.multiple) { - context.importMultiple = true; - } - // try appending if we haven't determined if it is css or not - var tryAppendLessExtension = evaldImportNode.css === undefined; - for (var i = 0; i < importParent.rules.length; i++) { - if (importParent.rules[i] === importNode) { - importParent.rules[i] = evaldImportNode; - break; - } - } - var onImported = this.onImported.bind(this, evaldImportNode, context); - var sequencedOnImported = this._sequencer.addImport(onImported); - this._importer.push(evaldImportNode.getPath(), tryAppendLessExtension, evaldImportNode.fileInfo(), evaldImportNode.options, sequencedOnImported); - } - else { - this.importCount--; - if (this.isFinished) { - this._sequencer.tryRun(); - } - } - }, - onImported: function (importNode, context, e, root, importedAtRoot, fullPath) { - if (e) { - if (!e.filename) { - e.index = importNode.getIndex(); - e.filename = importNode.fileInfo().filename; - } - this.error = e; - } - var importVisitor = this; - var inlineCSS = importNode.options.inline; - var isPlugin = importNode.options.isPlugin; - var isOptional = importNode.options.optional; - var duplicateImport = importedAtRoot || fullPath in importVisitor.recursionDetector; - if (!context.importMultiple) { - if (duplicateImport) { - importNode.skip = true; - } - else { - importNode.skip = function () { - if (fullPath in importVisitor.onceFileDetectionMap) { - return true; - } - importVisitor.onceFileDetectionMap[fullPath] = true; - return false; - }; - } - } - if (!fullPath && isOptional) { - importNode.skip = true; - } - if (root) { - importNode.root = root; - importNode.importedFilename = fullPath; - if (!inlineCSS && !isPlugin && (context.importMultiple || !duplicateImport)) { - importVisitor.recursionDetector[fullPath] = true; - var oldContext = this.context; - this.context = context; - try { - this._visitor.visit(root); - } - catch (e) { - this.error = e; - } - this.context = oldContext; - } - } - importVisitor.importCount--; - if (importVisitor.isFinished) { - importVisitor._sequencer.tryRun(); - } - }, - visitDeclaration: function (declNode, visitArgs) { - if (declNode.value.type === 'DetachedRuleset') { - this.context.frames.unshift(declNode); - } - else { - visitArgs.visitDeeper = false; - } - }, - visitDeclarationOut: function (declNode) { - if (declNode.value.type === 'DetachedRuleset') { - this.context.frames.shift(); - } - }, - visitAtRule: function (atRuleNode, visitArgs) { - this.context.frames.unshift(atRuleNode); - }, - visitAtRuleOut: function (atRuleNode) { - this.context.frames.shift(); - }, - visitMixinDefinition: function (mixinDefinitionNode, visitArgs) { - this.context.frames.unshift(mixinDefinitionNode); - }, - visitMixinDefinitionOut: function (mixinDefinitionNode) { - this.context.frames.shift(); - }, - visitRuleset: function (rulesetNode, visitArgs) { - this.context.frames.unshift(rulesetNode); - }, - visitRulesetOut: function (rulesetNode) { - this.context.frames.shift(); - }, - visitMedia: function (mediaNode, visitArgs) { - this.context.frames.unshift(mediaNode.rules[0]); - }, - visitMediaOut: function (mediaNode) { - this.context.frames.shift(); - } - }; + var ImportVisitor = function (importer, finish) { + this._visitor = new Visitor(this); + this._importer = importer; + this._finish = finish; + this.context = new contexts.Eval(); + this.importCount = 0; + this.onceFileDetectionMap = {}; + this.recursionDetector = {}; + this._sequencer = new ImportSequencer(this._onSequencerEmpty.bind(this)); + }; + ImportVisitor.prototype = { + isReplacing: false, + run: function (root) { + try { + // process the contents + this._visitor.visit(root); + } + catch (e) { + this.error = e; + } + this.isFinished = true; + this._sequencer.tryRun(); + }, + _onSequencerEmpty: function () { + if (!this.isFinished) { + return; + } + this._finish(this.error); + }, + visitImport: function (importNode, visitArgs) { + var inlineCSS = importNode.options.inline; + if (!importNode.css || inlineCSS) { + var context = new contexts.Eval(this.context, copyArray(this.context.frames)); + var importParent = context.frames[0]; + this.importCount++; + if (importNode.isVariableImport()) { + this._sequencer.addVariableImport(this.processImportNode.bind(this, importNode, context, importParent)); + } + else { + this.processImportNode(importNode, context, importParent); + } + } + visitArgs.visitDeeper = false; + }, + processImportNode: function (importNode, context, importParent) { + var evaldImportNode; + var inlineCSS = importNode.options.inline; + try { + evaldImportNode = importNode.evalForImport(context); + } + catch (e) { + if (!e.filename) { + e.index = importNode.getIndex(); + e.filename = importNode.fileInfo().filename; + } + // attempt to eval properly and treat as css + importNode.css = true; + // if that fails, this error will be thrown + importNode.error = e; + } + if (evaldImportNode && (!evaldImportNode.css || inlineCSS)) { + if (evaldImportNode.options.multiple) { + context.importMultiple = true; + } + // try appending if we haven't determined if it is css or not + var tryAppendLessExtension = evaldImportNode.css === undefined; + for (var i = 0; i < importParent.rules.length; i++) { + if (importParent.rules[i] === importNode) { + importParent.rules[i] = evaldImportNode; + break; + } + } + var onImported = this.onImported.bind(this, evaldImportNode, context), sequencedOnImported = this._sequencer.addImport(onImported); + this._importer.push(evaldImportNode.getPath(), tryAppendLessExtension, evaldImportNode.fileInfo(), evaldImportNode.options, sequencedOnImported); + } + else { + this.importCount--; + if (this.isFinished) { + this._sequencer.tryRun(); + } + } + }, + onImported: function (importNode, context, e, root, importedAtRoot, fullPath) { + if (e) { + if (!e.filename) { + e.index = importNode.getIndex(); + e.filename = importNode.fileInfo().filename; + } + this.error = e; + } + var importVisitor = this, inlineCSS = importNode.options.inline, isPlugin = importNode.options.isPlugin, isOptional = importNode.options.optional, duplicateImport = importedAtRoot || fullPath in importVisitor.recursionDetector; + if (!context.importMultiple) { + if (duplicateImport) { + importNode.skip = true; + } + else { + importNode.skip = function () { + if (fullPath in importVisitor.onceFileDetectionMap) { + return true; + } + importVisitor.onceFileDetectionMap[fullPath] = true; + return false; + }; + } + } + if (!fullPath && isOptional) { + importNode.skip = true; + } + if (root) { + importNode.root = root; + importNode.importedFilename = fullPath; + if (!inlineCSS && !isPlugin && (context.importMultiple || !duplicateImport)) { + importVisitor.recursionDetector[fullPath] = true; + var oldContext = this.context; + this.context = context; + try { + this._visitor.visit(root); + } + catch (e) { + this.error = e; + } + this.context = oldContext; + } + } + importVisitor.importCount--; + if (importVisitor.isFinished) { + importVisitor._sequencer.tryRun(); + } + }, + visitDeclaration: function (declNode, visitArgs) { + if (declNode.value.type === 'DetachedRuleset') { + this.context.frames.unshift(declNode); + } + else { + visitArgs.visitDeeper = false; + } + }, + visitDeclarationOut: function (declNode) { + if (declNode.value.type === 'DetachedRuleset') { + this.context.frames.shift(); + } + }, + visitAtRule: function (atRuleNode, visitArgs) { + this.context.frames.unshift(atRuleNode); + }, + visitAtRuleOut: function (atRuleNode) { + this.context.frames.shift(); + }, + visitMixinDefinition: function (mixinDefinitionNode, visitArgs) { + this.context.frames.unshift(mixinDefinitionNode); + }, + visitMixinDefinitionOut: function (mixinDefinitionNode) { + this.context.frames.shift(); + }, + visitRuleset: function (rulesetNode, visitArgs) { + this.context.frames.unshift(rulesetNode); + }, + visitRulesetOut: function (rulesetNode) { + this.context.frames.shift(); + }, + visitMedia: function (mediaNode, visitArgs) { + this.context.frames.unshift(mediaNode.rules[0]); + }, + visitMediaOut: function (mediaNode) { + this.context.frames.shift(); + } + }; - var SetTreeVisibilityVisitor = /** @class */ (function () { - function SetTreeVisibilityVisitor(visible) { - this.visible = visible; - } - SetTreeVisibilityVisitor.prototype.run = function (root) { - this.visit(root); - }; - SetTreeVisibilityVisitor.prototype.visitArray = function (nodes) { - if (!nodes) { - return nodes; - } - var cnt = nodes.length; - var i; - for (i = 0; i < cnt; i++) { - this.visit(nodes[i]); - } - return nodes; - }; - SetTreeVisibilityVisitor.prototype.visit = function (node) { - if (!node) { - return node; - } - if (node.constructor === Array) { - return this.visitArray(node); - } - if (!node.blocksVisibility || node.blocksVisibility()) { - return node; - } - if (this.visible) { - node.ensureVisibility(); - } - else { - node.ensureInvisibility(); - } - node.accept(this); - return node; - }; - return SetTreeVisibilityVisitor; - }()); + var SetTreeVisibilityVisitor = /** @class */ (function () { + function SetTreeVisibilityVisitor(visible) { + this.visible = visible; + } + SetTreeVisibilityVisitor.prototype.run = function (root) { + this.visit(root); + }; + SetTreeVisibilityVisitor.prototype.visitArray = function (nodes) { + if (!nodes) { + return nodes; + } + var cnt = nodes.length; + var i; + for (i = 0; i < cnt; i++) { + this.visit(nodes[i]); + } + return nodes; + }; + SetTreeVisibilityVisitor.prototype.visit = function (node) { + if (!node) { + return node; + } + if (node.constructor === Array) { + return this.visitArray(node); + } + if (!node.blocksVisibility || node.blocksVisibility()) { + return node; + } + if (this.visible) { + node.ensureVisibility(); + } + else { + node.ensureInvisibility(); + } + node.accept(this); + return node; + }; + return SetTreeVisibilityVisitor; + }()); - /* jshint loopfunc:true */ - var ExtendFinderVisitor = /** @class */ (function () { - function ExtendFinderVisitor() { - this._visitor = new Visitor(this); - this.contexts = []; - this.allExtendsStack = [[]]; - } - ExtendFinderVisitor.prototype.run = function (root) { - root = this._visitor.visit(root); - root.allExtends = this.allExtendsStack[0]; - return root; - }; - ExtendFinderVisitor.prototype.visitDeclaration = function (declNode, visitArgs) { - visitArgs.visitDeeper = false; - }; - ExtendFinderVisitor.prototype.visitMixinDefinition = function (mixinDefinitionNode, visitArgs) { - visitArgs.visitDeeper = false; - }; - ExtendFinderVisitor.prototype.visitRuleset = function (rulesetNode, visitArgs) { - if (rulesetNode.root) { - return; - } - var i; - var j; - var extend; - var allSelectorsExtendList = []; - var extendList; - // get &:extend(.a); rules which apply to all selectors in this ruleset - var rules = rulesetNode.rules; - var ruleCnt = rules ? rules.length : 0; - for (i = 0; i < ruleCnt; i++) { - if (rulesetNode.rules[i] instanceof tree.Extend) { - allSelectorsExtendList.push(rules[i]); - rulesetNode.extendOnEveryPath = true; - } - } - // now find every selector and apply the extends that apply to all extends - // and the ones which apply to an individual extend - var paths = rulesetNode.paths; - for (i = 0; i < paths.length; i++) { - var selectorPath = paths[i]; - var selector = selectorPath[selectorPath.length - 1]; - var selExtendList = selector.extendList; - extendList = selExtendList ? copyArray(selExtendList).concat(allSelectorsExtendList) - : allSelectorsExtendList; - if (extendList) { - extendList = extendList.map(function (allSelectorsExtend) { return allSelectorsExtend.clone(); }); - } - for (j = 0; j < extendList.length; j++) { - this.foundExtends = true; - extend = extendList[j]; - extend.findSelfSelectors(selectorPath); - extend.ruleset = rulesetNode; - if (j === 0) { - extend.firstExtendOnThisSelectorPath = true; - } - this.allExtendsStack[this.allExtendsStack.length - 1].push(extend); - } - } - this.contexts.push(rulesetNode.selectors); - }; - ExtendFinderVisitor.prototype.visitRulesetOut = function (rulesetNode) { - if (!rulesetNode.root) { - this.contexts.length = this.contexts.length - 1; - } - }; - ExtendFinderVisitor.prototype.visitMedia = function (mediaNode, visitArgs) { - mediaNode.allExtends = []; - this.allExtendsStack.push(mediaNode.allExtends); - }; - ExtendFinderVisitor.prototype.visitMediaOut = function (mediaNode) { - this.allExtendsStack.length = this.allExtendsStack.length - 1; - }; - ExtendFinderVisitor.prototype.visitAtRule = function (atRuleNode, visitArgs) { - atRuleNode.allExtends = []; - this.allExtendsStack.push(atRuleNode.allExtends); - }; - ExtendFinderVisitor.prototype.visitAtRuleOut = function (atRuleNode) { - this.allExtendsStack.length = this.allExtendsStack.length - 1; - }; - return ExtendFinderVisitor; - }()); - var ProcessExtendsVisitor = /** @class */ (function () { - function ProcessExtendsVisitor() { - this._visitor = new Visitor(this); - } - ProcessExtendsVisitor.prototype.run = function (root) { - var extendFinder = new ExtendFinderVisitor(); - this.extendIndices = {}; - extendFinder.run(root); - if (!extendFinder.foundExtends) { - return root; - } - root.allExtends = root.allExtends.concat(this.doExtendChaining(root.allExtends, root.allExtends)); - this.allExtendsStack = [root.allExtends]; - var newRoot = this._visitor.visit(root); - this.checkExtendsForNonMatched(root.allExtends); - return newRoot; - }; - ProcessExtendsVisitor.prototype.checkExtendsForNonMatched = function (extendList) { - var indices = this.extendIndices; - extendList.filter(function (extend) { return !extend.hasFoundMatches && extend.parent_ids.length == 1; }).forEach(function (extend) { - var selector = '_unknown_'; - try { - selector = extend.selector.toCSS({}); - } - catch (_) { } - if (!indices[extend.index + " " + selector]) { - indices[extend.index + " " + selector] = true; - logger.warn("extend '" + selector + "' has no matches"); - } - }); - }; - ProcessExtendsVisitor.prototype.doExtendChaining = function (extendsList, extendsListTarget, iterationCount) { - // - // chaining is different from normal extension.. if we extend an extend then we are not just copying, altering - // and pasting the selector we would do normally, but we are also adding an extend with the same target selector - // this means this new extend can then go and alter other extends - // - // this method deals with all the chaining work - without it, extend is flat and doesn't work on other extend selectors - // this is also the most expensive.. and a match on one selector can cause an extension of a selector we had already - // processed if we look at each selector at a time, as is done in visitRuleset - var extendIndex; - var targetExtendIndex; - var matches; - var extendsToAdd = []; - var newSelector; - var extendVisitor = this; - var selectorPath; - var extend; - var targetExtend; - var newExtend; - iterationCount = iterationCount || 0; - // loop through comparing every extend with every target extend. - // a target extend is the one on the ruleset we are looking at copy/edit/pasting in place - // e.g. .a:extend(.b) {} and .b:extend(.c) {} then the first extend extends the second one - // and the second is the target. - // the separation into two lists allows us to process a subset of chains with a bigger set, as is the - // case when processing media queries - for (extendIndex = 0; extendIndex < extendsList.length; extendIndex++) { - for (targetExtendIndex = 0; targetExtendIndex < extendsListTarget.length; targetExtendIndex++) { - extend = extendsList[extendIndex]; - targetExtend = extendsListTarget[targetExtendIndex]; - // look for circular references - if (extend.parent_ids.indexOf(targetExtend.object_id) >= 0) { - continue; - } - // find a match in the target extends self selector (the bit before :extend) - selectorPath = [targetExtend.selfSelectors[0]]; - matches = extendVisitor.findMatch(extend, selectorPath); - if (matches.length) { - extend.hasFoundMatches = true; - // we found a match, so for each self selector.. - extend.selfSelectors.forEach(function (selfSelector) { - var info = targetExtend.visibilityInfo(); - // process the extend as usual - newSelector = extendVisitor.extendSelector(matches, selectorPath, selfSelector, extend.isVisible()); - // but now we create a new extend from it - newExtend = new (tree.Extend)(targetExtend.selector, targetExtend.option, 0, targetExtend.fileInfo(), info); - newExtend.selfSelectors = newSelector; - // add the extend onto the list of extends for that selector - newSelector[newSelector.length - 1].extendList = [newExtend]; - // record that we need to add it. - extendsToAdd.push(newExtend); - newExtend.ruleset = targetExtend.ruleset; - // remember its parents for circular references - newExtend.parent_ids = newExtend.parent_ids.concat(targetExtend.parent_ids, extend.parent_ids); - // only process the selector once.. if we have :extend(.a,.b) then multiple - // extends will look at the same selector path, so when extending - // we know that any others will be duplicates in terms of what is added to the css - if (targetExtend.firstExtendOnThisSelectorPath) { - newExtend.firstExtendOnThisSelectorPath = true; - targetExtend.ruleset.paths.push(newSelector); - } - }); - } - } - } - if (extendsToAdd.length) { - // try to detect circular references to stop a stack overflow. - // may no longer be needed. - this.extendChainCount++; - if (iterationCount > 100) { - var selectorOne = '{unable to calculate}'; - var selectorTwo = '{unable to calculate}'; - try { - selectorOne = extendsToAdd[0].selfSelectors[0].toCSS(); - selectorTwo = extendsToAdd[0].selector.toCSS(); - } - catch (e) { } - throw { message: "extend circular reference detected. One of the circular extends is currently:" + selectorOne + ":extend(" + selectorTwo + ")" }; - } - // now process the new extends on the existing rules so that we can handle a extending b extending c extending - // d extending e... - return extendsToAdd.concat(extendVisitor.doExtendChaining(extendsToAdd, extendsListTarget, iterationCount + 1)); - } - else { - return extendsToAdd; - } - }; - ProcessExtendsVisitor.prototype.visitDeclaration = function (ruleNode, visitArgs) { - visitArgs.visitDeeper = false; - }; - ProcessExtendsVisitor.prototype.visitMixinDefinition = function (mixinDefinitionNode, visitArgs) { - visitArgs.visitDeeper = false; - }; - ProcessExtendsVisitor.prototype.visitSelector = function (selectorNode, visitArgs) { - visitArgs.visitDeeper = false; - }; - ProcessExtendsVisitor.prototype.visitRuleset = function (rulesetNode, visitArgs) { - if (rulesetNode.root) { - return; - } - var matches; - var pathIndex; - var extendIndex; - var allExtends = this.allExtendsStack[this.allExtendsStack.length - 1]; - var selectorsToAdd = []; - var extendVisitor = this; - var selectorPath; - // look at each selector path in the ruleset, find any extend matches and then copy, find and replace - for (extendIndex = 0; extendIndex < allExtends.length; extendIndex++) { - for (pathIndex = 0; pathIndex < rulesetNode.paths.length; pathIndex++) { - selectorPath = rulesetNode.paths[pathIndex]; - // extending extends happens initially, before the main pass - if (rulesetNode.extendOnEveryPath) { - continue; - } - var extendList = selectorPath[selectorPath.length - 1].extendList; - if (extendList && extendList.length) { - continue; - } - matches = this.findMatch(allExtends[extendIndex], selectorPath); - if (matches.length) { - allExtends[extendIndex].hasFoundMatches = true; - allExtends[extendIndex].selfSelectors.forEach(function (selfSelector) { - var extendedSelectors; - extendedSelectors = extendVisitor.extendSelector(matches, selectorPath, selfSelector, allExtends[extendIndex].isVisible()); - selectorsToAdd.push(extendedSelectors); - }); - } - } - } - rulesetNode.paths = rulesetNode.paths.concat(selectorsToAdd); - }; - ProcessExtendsVisitor.prototype.findMatch = function (extend, haystackSelectorPath) { - // - // look through the haystack selector path to try and find the needle - extend.selector - // returns an array of selector matches that can then be replaced - // - var haystackSelectorIndex; - var hackstackSelector; - var hackstackElementIndex; - var haystackElement; - var targetCombinator; - var i; - var extendVisitor = this; - var needleElements = extend.selector.elements; - var potentialMatches = []; - var potentialMatch; - var matches = []; - // loop through the haystack elements - for (haystackSelectorIndex = 0; haystackSelectorIndex < haystackSelectorPath.length; haystackSelectorIndex++) { - hackstackSelector = haystackSelectorPath[haystackSelectorIndex]; - for (hackstackElementIndex = 0; hackstackElementIndex < hackstackSelector.elements.length; hackstackElementIndex++) { - haystackElement = hackstackSelector.elements[hackstackElementIndex]; - // if we allow elements before our match we can add a potential match every time. otherwise only at the first element. - if (extend.allowBefore || (haystackSelectorIndex === 0 && hackstackElementIndex === 0)) { - potentialMatches.push({ pathIndex: haystackSelectorIndex, index: hackstackElementIndex, matched: 0, - initialCombinator: haystackElement.combinator }); - } - for (i = 0; i < potentialMatches.length; i++) { - potentialMatch = potentialMatches[i]; - // selectors add " " onto the first element. When we use & it joins the selectors together, but if we don't - // then each selector in haystackSelectorPath has a space before it added in the toCSS phase. so we need to - // work out what the resulting combinator will be - targetCombinator = haystackElement.combinator.value; - if (targetCombinator === '' && hackstackElementIndex === 0) { - targetCombinator = ' '; - } - // if we don't match, null our match to indicate failure - if (!extendVisitor.isElementValuesEqual(needleElements[potentialMatch.matched].value, haystackElement.value) || - (potentialMatch.matched > 0 && needleElements[potentialMatch.matched].combinator.value !== targetCombinator)) { - potentialMatch = null; - } - else { - potentialMatch.matched++; - } - // if we are still valid and have finished, test whether we have elements after and whether these are allowed - if (potentialMatch) { - potentialMatch.finished = potentialMatch.matched === needleElements.length; - if (potentialMatch.finished && - (!extend.allowAfter && - (hackstackElementIndex + 1 < hackstackSelector.elements.length || haystackSelectorIndex + 1 < haystackSelectorPath.length))) { - potentialMatch = null; - } - } - // if null we remove, if not, we are still valid, so either push as a valid match or continue - if (potentialMatch) { - if (potentialMatch.finished) { - potentialMatch.length = needleElements.length; - potentialMatch.endPathIndex = haystackSelectorIndex; - potentialMatch.endPathElementIndex = hackstackElementIndex + 1; // index after end of match - potentialMatches.length = 0; // we don't allow matches to overlap, so start matching again - matches.push(potentialMatch); - } - } - else { - potentialMatches.splice(i, 1); - i--; - } - } - } - } - return matches; - }; - ProcessExtendsVisitor.prototype.isElementValuesEqual = function (elementValue1, elementValue2) { - if (typeof elementValue1 === 'string' || typeof elementValue2 === 'string') { - return elementValue1 === elementValue2; - } - if (elementValue1 instanceof tree.Attribute) { - if (elementValue1.op !== elementValue2.op || elementValue1.key !== elementValue2.key) { - return false; - } - if (!elementValue1.value || !elementValue2.value) { - if (elementValue1.value || elementValue2.value) { - return false; - } - return true; - } - elementValue1 = elementValue1.value.value || elementValue1.value; - elementValue2 = elementValue2.value.value || elementValue2.value; - return elementValue1 === elementValue2; - } - elementValue1 = elementValue1.value; - elementValue2 = elementValue2.value; - if (elementValue1 instanceof tree.Selector) { - if (!(elementValue2 instanceof tree.Selector) || elementValue1.elements.length !== elementValue2.elements.length) { - return false; - } - for (var i = 0; i < elementValue1.elements.length; i++) { - if (elementValue1.elements[i].combinator.value !== elementValue2.elements[i].combinator.value) { - if (i !== 0 || (elementValue1.elements[i].combinator.value || ' ') !== (elementValue2.elements[i].combinator.value || ' ')) { - return false; - } - } - if (!this.isElementValuesEqual(elementValue1.elements[i].value, elementValue2.elements[i].value)) { - return false; - } - } - return true; - } - return false; - }; - ProcessExtendsVisitor.prototype.extendSelector = function (matches, selectorPath, replacementSelector, isVisible) { - // for a set of matches, replace each match with the replacement selector - var currentSelectorPathIndex = 0; - var currentSelectorPathElementIndex = 0; - var path = []; - var matchIndex; - var selector; - var firstElement; - var match; - var newElements; - for (matchIndex = 0; matchIndex < matches.length; matchIndex++) { - match = matches[matchIndex]; - selector = selectorPath[match.pathIndex]; - firstElement = new tree.Element(match.initialCombinator, replacementSelector.elements[0].value, replacementSelector.elements[0].isVariable, replacementSelector.elements[0].getIndex(), replacementSelector.elements[0].fileInfo()); - if (match.pathIndex > currentSelectorPathIndex && currentSelectorPathElementIndex > 0) { - path[path.length - 1].elements = path[path.length - 1] - .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex)); - currentSelectorPathElementIndex = 0; - currentSelectorPathIndex++; - } - newElements = selector.elements - .slice(currentSelectorPathElementIndex, match.index) - .concat([firstElement]) - .concat(replacementSelector.elements.slice(1)); - if (currentSelectorPathIndex === match.pathIndex && matchIndex > 0) { - path[path.length - 1].elements = - path[path.length - 1].elements.concat(newElements); - } - else { - path = path.concat(selectorPath.slice(currentSelectorPathIndex, match.pathIndex)); - path.push(new tree.Selector(newElements)); - } - currentSelectorPathIndex = match.endPathIndex; - currentSelectorPathElementIndex = match.endPathElementIndex; - if (currentSelectorPathElementIndex >= selectorPath[currentSelectorPathIndex].elements.length) { - currentSelectorPathElementIndex = 0; - currentSelectorPathIndex++; - } - } - if (currentSelectorPathIndex < selectorPath.length && currentSelectorPathElementIndex > 0) { - path[path.length - 1].elements = path[path.length - 1] - .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex)); - currentSelectorPathIndex++; - } - path = path.concat(selectorPath.slice(currentSelectorPathIndex, selectorPath.length)); - path = path.map(function (currentValue) { - // we can re-use elements here, because the visibility property matters only for selectors - var derived = currentValue.createDerived(currentValue.elements); - if (isVisible) { - derived.ensureVisibility(); - } - else { - derived.ensureInvisibility(); - } - return derived; - }); - return path; - }; - ProcessExtendsVisitor.prototype.visitMedia = function (mediaNode, visitArgs) { - var newAllExtends = mediaNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]); - newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, mediaNode.allExtends)); - this.allExtendsStack.push(newAllExtends); - }; - ProcessExtendsVisitor.prototype.visitMediaOut = function (mediaNode) { - var lastIndex = this.allExtendsStack.length - 1; - this.allExtendsStack.length = lastIndex; - }; - ProcessExtendsVisitor.prototype.visitAtRule = function (atRuleNode, visitArgs) { - var newAllExtends = atRuleNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]); - newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, atRuleNode.allExtends)); - this.allExtendsStack.push(newAllExtends); - }; - ProcessExtendsVisitor.prototype.visitAtRuleOut = function (atRuleNode) { - var lastIndex = this.allExtendsStack.length - 1; - this.allExtendsStack.length = lastIndex; - }; - return ProcessExtendsVisitor; - }()); + /* jshint loopfunc:true */ + var ExtendFinderVisitor = /** @class */ (function () { + function ExtendFinderVisitor() { + this._visitor = new Visitor(this); + this.contexts = []; + this.allExtendsStack = [[]]; + } + ExtendFinderVisitor.prototype.run = function (root) { + root = this._visitor.visit(root); + root.allExtends = this.allExtendsStack[0]; + return root; + }; + ExtendFinderVisitor.prototype.visitDeclaration = function (declNode, visitArgs) { + visitArgs.visitDeeper = false; + }; + ExtendFinderVisitor.prototype.visitMixinDefinition = function (mixinDefinitionNode, visitArgs) { + visitArgs.visitDeeper = false; + }; + ExtendFinderVisitor.prototype.visitRuleset = function (rulesetNode, visitArgs) { + if (rulesetNode.root) { + return; + } + var i; + var j; + var extend; + var allSelectorsExtendList = []; + var extendList; + // get &:extend(.a); rules which apply to all selectors in this ruleset + var rules = rulesetNode.rules, ruleCnt = rules ? rules.length : 0; + for (i = 0; i < ruleCnt; i++) { + if (rulesetNode.rules[i] instanceof tree.Extend) { + allSelectorsExtendList.push(rules[i]); + rulesetNode.extendOnEveryPath = true; + } + } + // now find every selector and apply the extends that apply to all extends + // and the ones which apply to an individual extend + var paths = rulesetNode.paths; + for (i = 0; i < paths.length; i++) { + var selectorPath = paths[i], selector = selectorPath[selectorPath.length - 1], selExtendList = selector.extendList; + extendList = selExtendList ? copyArray(selExtendList).concat(allSelectorsExtendList) + : allSelectorsExtendList; + if (extendList) { + extendList = extendList.map(function (allSelectorsExtend) { + return allSelectorsExtend.clone(); + }); + } + for (j = 0; j < extendList.length; j++) { + this.foundExtends = true; + extend = extendList[j]; + extend.findSelfSelectors(selectorPath); + extend.ruleset = rulesetNode; + if (j === 0) { + extend.firstExtendOnThisSelectorPath = true; + } + this.allExtendsStack[this.allExtendsStack.length - 1].push(extend); + } + } + this.contexts.push(rulesetNode.selectors); + }; + ExtendFinderVisitor.prototype.visitRulesetOut = function (rulesetNode) { + if (!rulesetNode.root) { + this.contexts.length = this.contexts.length - 1; + } + }; + ExtendFinderVisitor.prototype.visitMedia = function (mediaNode, visitArgs) { + mediaNode.allExtends = []; + this.allExtendsStack.push(mediaNode.allExtends); + }; + ExtendFinderVisitor.prototype.visitMediaOut = function (mediaNode) { + this.allExtendsStack.length = this.allExtendsStack.length - 1; + }; + ExtendFinderVisitor.prototype.visitAtRule = function (atRuleNode, visitArgs) { + atRuleNode.allExtends = []; + this.allExtendsStack.push(atRuleNode.allExtends); + }; + ExtendFinderVisitor.prototype.visitAtRuleOut = function (atRuleNode) { + this.allExtendsStack.length = this.allExtendsStack.length - 1; + }; + return ExtendFinderVisitor; + }()); + var ProcessExtendsVisitor = /** @class */ (function () { + function ProcessExtendsVisitor() { + this._visitor = new Visitor(this); + } + ProcessExtendsVisitor.prototype.run = function (root) { + var extendFinder = new ExtendFinderVisitor(); + this.extendIndices = {}; + extendFinder.run(root); + if (!extendFinder.foundExtends) { + return root; + } + root.allExtends = root.allExtends.concat(this.doExtendChaining(root.allExtends, root.allExtends)); + this.allExtendsStack = [root.allExtends]; + var newRoot = this._visitor.visit(root); + this.checkExtendsForNonMatched(root.allExtends); + return newRoot; + }; + ProcessExtendsVisitor.prototype.checkExtendsForNonMatched = function (extendList) { + var indices = this.extendIndices; + extendList.filter(function (extend) { + return !extend.hasFoundMatches && extend.parent_ids.length == 1; + }).forEach(function (extend) { + var selector = '_unknown_'; + try { + selector = extend.selector.toCSS({}); + } + catch (_) { } + if (!indices[extend.index + " " + selector]) { + indices[extend.index + " " + selector] = true; + logger.warn("extend '" + selector + "' has no matches"); + } + }); + }; + ProcessExtendsVisitor.prototype.doExtendChaining = function (extendsList, extendsListTarget, iterationCount) { + // + // chaining is different from normal extension.. if we extend an extend then we are not just copying, altering + // and pasting the selector we would do normally, but we are also adding an extend with the same target selector + // this means this new extend can then go and alter other extends + // + // this method deals with all the chaining work - without it, extend is flat and doesn't work on other extend selectors + // this is also the most expensive.. and a match on one selector can cause an extension of a selector we had already + // processed if we look at each selector at a time, as is done in visitRuleset + var extendIndex; + var targetExtendIndex; + var matches; + var extendsToAdd = []; + var newSelector; + var extendVisitor = this; + var selectorPath; + var extend; + var targetExtend; + var newExtend; + iterationCount = iterationCount || 0; + // loop through comparing every extend with every target extend. + // a target extend is the one on the ruleset we are looking at copy/edit/pasting in place + // e.g. .a:extend(.b) {} and .b:extend(.c) {} then the first extend extends the second one + // and the second is the target. + // the separation into two lists allows us to process a subset of chains with a bigger set, as is the + // case when processing media queries + for (extendIndex = 0; extendIndex < extendsList.length; extendIndex++) { + for (targetExtendIndex = 0; targetExtendIndex < extendsListTarget.length; targetExtendIndex++) { + extend = extendsList[extendIndex]; + targetExtend = extendsListTarget[targetExtendIndex]; + // look for circular references + if (extend.parent_ids.indexOf(targetExtend.object_id) >= 0) { + continue; + } + // find a match in the target extends self selector (the bit before :extend) + selectorPath = [targetExtend.selfSelectors[0]]; + matches = extendVisitor.findMatch(extend, selectorPath); + if (matches.length) { + extend.hasFoundMatches = true; + // we found a match, so for each self selector.. + extend.selfSelectors.forEach(function (selfSelector) { + var info = targetExtend.visibilityInfo(); + // process the extend as usual + newSelector = extendVisitor.extendSelector(matches, selectorPath, selfSelector, extend.isVisible()); + // but now we create a new extend from it + newExtend = new (tree.Extend)(targetExtend.selector, targetExtend.option, 0, targetExtend.fileInfo(), info); + newExtend.selfSelectors = newSelector; + // add the extend onto the list of extends for that selector + newSelector[newSelector.length - 1].extendList = [newExtend]; + // record that we need to add it. + extendsToAdd.push(newExtend); + newExtend.ruleset = targetExtend.ruleset; + // remember its parents for circular references + newExtend.parent_ids = newExtend.parent_ids.concat(targetExtend.parent_ids, extend.parent_ids); + // only process the selector once.. if we have :extend(.a,.b) then multiple + // extends will look at the same selector path, so when extending + // we know that any others will be duplicates in terms of what is added to the css + if (targetExtend.firstExtendOnThisSelectorPath) { + newExtend.firstExtendOnThisSelectorPath = true; + targetExtend.ruleset.paths.push(newSelector); + } + }); + } + } + } + if (extendsToAdd.length) { + // try to detect circular references to stop a stack overflow. + // may no longer be needed. + this.extendChainCount++; + if (iterationCount > 100) { + var selectorOne = '{unable to calculate}'; + var selectorTwo = '{unable to calculate}'; + try { + selectorOne = extendsToAdd[0].selfSelectors[0].toCSS(); + selectorTwo = extendsToAdd[0].selector.toCSS(); + } + catch (e) { } + throw { message: "extend circular reference detected. One of the circular extends is currently:" + selectorOne + ":extend(" + selectorTwo + ")" }; + } + // now process the new extends on the existing rules so that we can handle a extending b extending c extending + // d extending e... + return extendsToAdd.concat(extendVisitor.doExtendChaining(extendsToAdd, extendsListTarget, iterationCount + 1)); + } + else { + return extendsToAdd; + } + }; + ProcessExtendsVisitor.prototype.visitDeclaration = function (ruleNode, visitArgs) { + visitArgs.visitDeeper = false; + }; + ProcessExtendsVisitor.prototype.visitMixinDefinition = function (mixinDefinitionNode, visitArgs) { + visitArgs.visitDeeper = false; + }; + ProcessExtendsVisitor.prototype.visitSelector = function (selectorNode, visitArgs) { + visitArgs.visitDeeper = false; + }; + ProcessExtendsVisitor.prototype.visitRuleset = function (rulesetNode, visitArgs) { + if (rulesetNode.root) { + return; + } + var matches; + var pathIndex; + var extendIndex; + var allExtends = this.allExtendsStack[this.allExtendsStack.length - 1]; + var selectorsToAdd = []; + var extendVisitor = this; + var selectorPath; + // look at each selector path in the ruleset, find any extend matches and then copy, find and replace + for (extendIndex = 0; extendIndex < allExtends.length; extendIndex++) { + for (pathIndex = 0; pathIndex < rulesetNode.paths.length; pathIndex++) { + selectorPath = rulesetNode.paths[pathIndex]; + // extending extends happens initially, before the main pass + if (rulesetNode.extendOnEveryPath) { + continue; + } + var extendList = selectorPath[selectorPath.length - 1].extendList; + if (extendList && extendList.length) { + continue; + } + matches = this.findMatch(allExtends[extendIndex], selectorPath); + if (matches.length) { + allExtends[extendIndex].hasFoundMatches = true; + allExtends[extendIndex].selfSelectors.forEach(function (selfSelector) { + var extendedSelectors; + extendedSelectors = extendVisitor.extendSelector(matches, selectorPath, selfSelector, allExtends[extendIndex].isVisible()); + selectorsToAdd.push(extendedSelectors); + }); + } + } + } + rulesetNode.paths = rulesetNode.paths.concat(selectorsToAdd); + }; + ProcessExtendsVisitor.prototype.findMatch = function (extend, haystackSelectorPath) { + // + // look through the haystack selector path to try and find the needle - extend.selector + // returns an array of selector matches that can then be replaced + // + var haystackSelectorIndex; + var hackstackSelector; + var hackstackElementIndex; + var haystackElement; + var targetCombinator; + var i; + var extendVisitor = this; + var needleElements = extend.selector.elements; + var potentialMatches = []; + var potentialMatch; + var matches = []; + // loop through the haystack elements + for (haystackSelectorIndex = 0; haystackSelectorIndex < haystackSelectorPath.length; haystackSelectorIndex++) { + hackstackSelector = haystackSelectorPath[haystackSelectorIndex]; + for (hackstackElementIndex = 0; hackstackElementIndex < hackstackSelector.elements.length; hackstackElementIndex++) { + haystackElement = hackstackSelector.elements[hackstackElementIndex]; + // if we allow elements before our match we can add a potential match every time. otherwise only at the first element. + if (extend.allowBefore || (haystackSelectorIndex === 0 && hackstackElementIndex === 0)) { + potentialMatches.push({ pathIndex: haystackSelectorIndex, index: hackstackElementIndex, matched: 0, + initialCombinator: haystackElement.combinator }); + } + for (i = 0; i < potentialMatches.length; i++) { + potentialMatch = potentialMatches[i]; + // selectors add " " onto the first element. When we use & it joins the selectors together, but if we don't + // then each selector in haystackSelectorPath has a space before it added in the toCSS phase. so we need to + // work out what the resulting combinator will be + targetCombinator = haystackElement.combinator.value; + if (targetCombinator === '' && hackstackElementIndex === 0) { + targetCombinator = ' '; + } + // if we don't match, null our match to indicate failure + if (!extendVisitor.isElementValuesEqual(needleElements[potentialMatch.matched].value, haystackElement.value) || + (potentialMatch.matched > 0 && needleElements[potentialMatch.matched].combinator.value !== targetCombinator)) { + potentialMatch = null; + } + else { + potentialMatch.matched++; + } + // if we are still valid and have finished, test whether we have elements after and whether these are allowed + if (potentialMatch) { + potentialMatch.finished = potentialMatch.matched === needleElements.length; + if (potentialMatch.finished && + (!extend.allowAfter && + (hackstackElementIndex + 1 < hackstackSelector.elements.length || haystackSelectorIndex + 1 < haystackSelectorPath.length))) { + potentialMatch = null; + } + } + // if null we remove, if not, we are still valid, so either push as a valid match or continue + if (potentialMatch) { + if (potentialMatch.finished) { + potentialMatch.length = needleElements.length; + potentialMatch.endPathIndex = haystackSelectorIndex; + potentialMatch.endPathElementIndex = hackstackElementIndex + 1; // index after end of match + potentialMatches.length = 0; // we don't allow matches to overlap, so start matching again + matches.push(potentialMatch); + } + } + else { + potentialMatches.splice(i, 1); + i--; + } + } + } + } + return matches; + }; + ProcessExtendsVisitor.prototype.isElementValuesEqual = function (elementValue1, elementValue2) { + if (typeof elementValue1 === 'string' || typeof elementValue2 === 'string') { + return elementValue1 === elementValue2; + } + if (elementValue1 instanceof tree.Attribute) { + if (elementValue1.op !== elementValue2.op || elementValue1.key !== elementValue2.key) { + return false; + } + if (!elementValue1.value || !elementValue2.value) { + if (elementValue1.value || elementValue2.value) { + return false; + } + return true; + } + elementValue1 = elementValue1.value.value || elementValue1.value; + elementValue2 = elementValue2.value.value || elementValue2.value; + return elementValue1 === elementValue2; + } + elementValue1 = elementValue1.value; + elementValue2 = elementValue2.value; + if (elementValue1 instanceof tree.Selector) { + if (!(elementValue2 instanceof tree.Selector) || elementValue1.elements.length !== elementValue2.elements.length) { + return false; + } + for (var i = 0; i < elementValue1.elements.length; i++) { + if (elementValue1.elements[i].combinator.value !== elementValue2.elements[i].combinator.value) { + if (i !== 0 || (elementValue1.elements[i].combinator.value || ' ') !== (elementValue2.elements[i].combinator.value || ' ')) { + return false; + } + } + if (!this.isElementValuesEqual(elementValue1.elements[i].value, elementValue2.elements[i].value)) { + return false; + } + } + return true; + } + return false; + }; + ProcessExtendsVisitor.prototype.extendSelector = function (matches, selectorPath, replacementSelector, isVisible) { + // for a set of matches, replace each match with the replacement selector + var currentSelectorPathIndex = 0, currentSelectorPathElementIndex = 0, path = [], matchIndex, selector, firstElement, match, newElements; + for (matchIndex = 0; matchIndex < matches.length; matchIndex++) { + match = matches[matchIndex]; + selector = selectorPath[match.pathIndex]; + firstElement = new tree.Element(match.initialCombinator, replacementSelector.elements[0].value, replacementSelector.elements[0].isVariable, replacementSelector.elements[0].getIndex(), replacementSelector.elements[0].fileInfo()); + if (match.pathIndex > currentSelectorPathIndex && currentSelectorPathElementIndex > 0) { + path[path.length - 1].elements = path[path.length - 1] + .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex)); + currentSelectorPathElementIndex = 0; + currentSelectorPathIndex++; + } + newElements = selector.elements + .slice(currentSelectorPathElementIndex, match.index) + .concat([firstElement]) + .concat(replacementSelector.elements.slice(1)); + if (currentSelectorPathIndex === match.pathIndex && matchIndex > 0) { + path[path.length - 1].elements = + path[path.length - 1].elements.concat(newElements); + } + else { + path = path.concat(selectorPath.slice(currentSelectorPathIndex, match.pathIndex)); + path.push(new tree.Selector(newElements)); + } + currentSelectorPathIndex = match.endPathIndex; + currentSelectorPathElementIndex = match.endPathElementIndex; + if (currentSelectorPathElementIndex >= selectorPath[currentSelectorPathIndex].elements.length) { + currentSelectorPathElementIndex = 0; + currentSelectorPathIndex++; + } + } + if (currentSelectorPathIndex < selectorPath.length && currentSelectorPathElementIndex > 0) { + path[path.length - 1].elements = path[path.length - 1] + .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex)); + currentSelectorPathIndex++; + } + path = path.concat(selectorPath.slice(currentSelectorPathIndex, selectorPath.length)); + path = path.map(function (currentValue) { + // we can re-use elements here, because the visibility property matters only for selectors + var derived = currentValue.createDerived(currentValue.elements); + if (isVisible) { + derived.ensureVisibility(); + } + else { + derived.ensureInvisibility(); + } + return derived; + }); + return path; + }; + ProcessExtendsVisitor.prototype.visitMedia = function (mediaNode, visitArgs) { + var newAllExtends = mediaNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]); + newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, mediaNode.allExtends)); + this.allExtendsStack.push(newAllExtends); + }; + ProcessExtendsVisitor.prototype.visitMediaOut = function (mediaNode) { + var lastIndex = this.allExtendsStack.length - 1; + this.allExtendsStack.length = lastIndex; + }; + ProcessExtendsVisitor.prototype.visitAtRule = function (atRuleNode, visitArgs) { + var newAllExtends = atRuleNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]); + newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, atRuleNode.allExtends)); + this.allExtendsStack.push(newAllExtends); + }; + ProcessExtendsVisitor.prototype.visitAtRuleOut = function (atRuleNode) { + var lastIndex = this.allExtendsStack.length - 1; + this.allExtendsStack.length = lastIndex; + }; + return ProcessExtendsVisitor; + }()); - var JoinSelectorVisitor = /** @class */ (function () { - function JoinSelectorVisitor() { - this.contexts = [[]]; - this._visitor = new Visitor(this); - } - JoinSelectorVisitor.prototype.run = function (root) { - return this._visitor.visit(root); - }; - JoinSelectorVisitor.prototype.visitDeclaration = function (declNode, visitArgs) { - visitArgs.visitDeeper = false; - }; - JoinSelectorVisitor.prototype.visitMixinDefinition = function (mixinDefinitionNode, visitArgs) { - visitArgs.visitDeeper = false; - }; - JoinSelectorVisitor.prototype.visitRuleset = function (rulesetNode, visitArgs) { - var context = this.contexts[this.contexts.length - 1]; - var paths = []; - var selectors; - this.contexts.push(paths); - if (!rulesetNode.root) { - selectors = rulesetNode.selectors; - if (selectors) { - selectors = selectors.filter(function (selector) { return selector.getIsOutput(); }); - rulesetNode.selectors = selectors.length ? selectors : (selectors = null); - if (selectors) { - rulesetNode.joinSelectors(paths, context, selectors); - } - } - if (!selectors) { - rulesetNode.rules = null; - } - rulesetNode.paths = paths; - } - }; - JoinSelectorVisitor.prototype.visitRulesetOut = function (rulesetNode) { - this.contexts.length = this.contexts.length - 1; - }; - JoinSelectorVisitor.prototype.visitMedia = function (mediaNode, visitArgs) { - var context = this.contexts[this.contexts.length - 1]; - mediaNode.rules[0].root = (context.length === 0 || context[0].multiMedia); - }; - JoinSelectorVisitor.prototype.visitAtRule = function (atRuleNode, visitArgs) { - var context = this.contexts[this.contexts.length - 1]; - if (atRuleNode.rules && atRuleNode.rules.length) { - atRuleNode.rules[0].root = (atRuleNode.isRooted || context.length === 0 || null); - } - }; - return JoinSelectorVisitor; - }()); + var JoinSelectorVisitor = /** @class */ (function () { + function JoinSelectorVisitor() { + this.contexts = [[]]; + this._visitor = new Visitor(this); + } + JoinSelectorVisitor.prototype.run = function (root) { + return this._visitor.visit(root); + }; + JoinSelectorVisitor.prototype.visitDeclaration = function (declNode, visitArgs) { + visitArgs.visitDeeper = false; + }; + JoinSelectorVisitor.prototype.visitMixinDefinition = function (mixinDefinitionNode, visitArgs) { + visitArgs.visitDeeper = false; + }; + JoinSelectorVisitor.prototype.visitRuleset = function (rulesetNode, visitArgs) { + var context = this.contexts[this.contexts.length - 1]; + var paths = []; + var selectors; + this.contexts.push(paths); + if (!rulesetNode.root) { + selectors = rulesetNode.selectors; + if (selectors) { + selectors = selectors.filter(function (selector) { return selector.getIsOutput(); }); + rulesetNode.selectors = selectors.length ? selectors : (selectors = null); + if (selectors) { + rulesetNode.joinSelectors(paths, context, selectors); + } + } + if (!selectors) { + rulesetNode.rules = null; + } + rulesetNode.paths = paths; + } + }; + JoinSelectorVisitor.prototype.visitRulesetOut = function (rulesetNode) { + this.contexts.length = this.contexts.length - 1; + }; + JoinSelectorVisitor.prototype.visitMedia = function (mediaNode, visitArgs) { + var context = this.contexts[this.contexts.length - 1]; + mediaNode.rules[0].root = (context.length === 0 || context[0].multiMedia); + }; + JoinSelectorVisitor.prototype.visitAtRule = function (atRuleNode, visitArgs) { + var context = this.contexts[this.contexts.length - 1]; + if (atRuleNode.rules && atRuleNode.rules.length) { + atRuleNode.rules[0].root = (atRuleNode.isRooted || context.length === 0 || null); + } + }; + return JoinSelectorVisitor; + }()); - var CSSVisitorUtils = /** @class */ (function () { - function CSSVisitorUtils(context) { - this._visitor = new Visitor(this); - this._context = context; - } - CSSVisitorUtils.prototype.containsSilentNonBlockedChild = function (bodyRules) { - var rule; - if (!bodyRules) { - return false; - } - for (var r = 0; r < bodyRules.length; r++) { - rule = bodyRules[r]; - if (rule.isSilent && rule.isSilent(this._context) && !rule.blocksVisibility()) { - // the atrule contains something that was referenced (likely by extend) - // therefore it needs to be shown in output too - return true; - } - } - return false; - }; - CSSVisitorUtils.prototype.keepOnlyVisibleChilds = function (owner) { - if (owner && owner.rules) { - owner.rules = owner.rules.filter(function (thing) { return thing.isVisible(); }); - } - }; - CSSVisitorUtils.prototype.isEmpty = function (owner) { - return (owner && owner.rules) - ? (owner.rules.length === 0) : true; - }; - CSSVisitorUtils.prototype.hasVisibleSelector = function (rulesetNode) { - return (rulesetNode && rulesetNode.paths) - ? (rulesetNode.paths.length > 0) : false; - }; - CSSVisitorUtils.prototype.resolveVisibility = function (node, originalRules) { - if (!node.blocksVisibility()) { - if (this.isEmpty(node) && !this.containsSilentNonBlockedChild(originalRules)) { - return; - } - return node; - } - var compiledRulesBody = node.rules[0]; - this.keepOnlyVisibleChilds(compiledRulesBody); - if (this.isEmpty(compiledRulesBody)) { - return; - } - node.ensureVisibility(); - node.removeVisibilityBlock(); - return node; - }; - CSSVisitorUtils.prototype.isVisibleRuleset = function (rulesetNode) { - if (rulesetNode.firstRoot) { - return true; - } - if (this.isEmpty(rulesetNode)) { - return false; - } - if (!rulesetNode.root && !this.hasVisibleSelector(rulesetNode)) { - return false; - } - return true; - }; - return CSSVisitorUtils; - }()); - var ToCSSVisitor = function (context) { - this._visitor = new Visitor(this); - this._context = context; - this.utils = new CSSVisitorUtils(context); - }; - ToCSSVisitor.prototype = { - isReplacing: true, - run: function (root) { - return this._visitor.visit(root); - }, - visitDeclaration: function (declNode, visitArgs) { - if (declNode.blocksVisibility() || declNode.variable) { - return; - } - return declNode; - }, - visitMixinDefinition: function (mixinNode, visitArgs) { - // mixin definitions do not get eval'd - this means they keep state - // so we have to clear that state here so it isn't used if toCSS is called twice - mixinNode.frames = []; - }, - visitExtend: function (extendNode, visitArgs) { - }, - visitComment: function (commentNode, visitArgs) { - if (commentNode.blocksVisibility() || commentNode.isSilent(this._context)) { - return; - } - return commentNode; - }, - visitMedia: function (mediaNode, visitArgs) { - var originalRules = mediaNode.rules[0].rules; - mediaNode.accept(this._visitor); - visitArgs.visitDeeper = false; - return this.utils.resolveVisibility(mediaNode, originalRules); - }, - visitImport: function (importNode, visitArgs) { - if (importNode.blocksVisibility()) { - return; - } - return importNode; - }, - visitAtRule: function (atRuleNode, visitArgs) { - if (atRuleNode.rules && atRuleNode.rules.length) { - return this.visitAtRuleWithBody(atRuleNode, visitArgs); - } - else { - return this.visitAtRuleWithoutBody(atRuleNode, visitArgs); - } - }, - visitAnonymous: function (anonymousNode, visitArgs) { - if (!anonymousNode.blocksVisibility()) { - anonymousNode.accept(this._visitor); - return anonymousNode; - } - }, - visitAtRuleWithBody: function (atRuleNode, visitArgs) { - // if there is only one nested ruleset and that one has no path, then it is - // just fake ruleset - function hasFakeRuleset(atRuleNode) { - var bodyRules = atRuleNode.rules; - return bodyRules.length === 1 && (!bodyRules[0].paths || bodyRules[0].paths.length === 0); - } - function getBodyRules(atRuleNode) { - var nodeRules = atRuleNode.rules; - if (hasFakeRuleset(atRuleNode)) { - return nodeRules[0].rules; - } - return nodeRules; - } - // it is still true that it is only one ruleset in array - // this is last such moment - // process childs - var originalRules = getBodyRules(atRuleNode); - atRuleNode.accept(this._visitor); - visitArgs.visitDeeper = false; - if (!this.utils.isEmpty(atRuleNode)) { - this._mergeRules(atRuleNode.rules[0].rules); - } - return this.utils.resolveVisibility(atRuleNode, originalRules); - }, - visitAtRuleWithoutBody: function (atRuleNode, visitArgs) { - if (atRuleNode.blocksVisibility()) { - return; - } - if (atRuleNode.name === '@charset') { - // Only output the debug info together with subsequent @charset definitions - // a comment (or @media statement) before the actual @charset atrule would - // be considered illegal css as it has to be on the first line - if (this.charset) { - if (atRuleNode.debugInfo) { - var comment = new tree.Comment("/* " + atRuleNode.toCSS(this._context).replace(/\n/g, '') + " */\n"); - comment.debugInfo = atRuleNode.debugInfo; - return this._visitor.visit(comment); - } - return; - } - this.charset = true; - } - return atRuleNode; - }, - checkValidNodes: function (rules, isRoot) { - if (!rules) { - return; - } - for (var i = 0; i < rules.length; i++) { - var ruleNode = rules[i]; - if (isRoot && ruleNode instanceof tree.Declaration && !ruleNode.variable) { - throw { message: 'Properties must be inside selector blocks. They cannot be in the root', - index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename }; - } - if (ruleNode instanceof tree.Call) { - throw { message: "Function '" + ruleNode.name + "' is undefined", index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename }; - } - if (ruleNode.type && !ruleNode.allowRoot) { - throw { message: ruleNode.type + " node returned by a function is not valid here", index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename }; - } - } - }, - visitRuleset: function (rulesetNode, visitArgs) { - // at this point rulesets are nested into each other - var rule; - var rulesets = []; - this.checkValidNodes(rulesetNode.rules, rulesetNode.firstRoot); - if (!rulesetNode.root) { - // remove invisible paths - this._compileRulesetPaths(rulesetNode); - // remove rulesets from this ruleset body and compile them separately - var nodeRules = rulesetNode.rules; - var nodeRuleCnt = nodeRules ? nodeRules.length : 0; - for (var i = 0; i < nodeRuleCnt;) { - rule = nodeRules[i]; - if (rule && rule.rules) { - // visit because we are moving them out from being a child - rulesets.push(this._visitor.visit(rule)); - nodeRules.splice(i, 1); - nodeRuleCnt--; - continue; - } - i++; - } - // accept the visitor to remove rules and refactor itself - // then we can decide nogw whether we want it or not - // compile body - if (nodeRuleCnt > 0) { - rulesetNode.accept(this._visitor); - } - else { - rulesetNode.rules = null; - } - visitArgs.visitDeeper = false; - } - else { // if (! rulesetNode.root) { - rulesetNode.accept(this._visitor); - visitArgs.visitDeeper = false; - } - if (rulesetNode.rules) { - this._mergeRules(rulesetNode.rules); - this._removeDuplicateRules(rulesetNode.rules); - } - // now decide whether we keep the ruleset - if (this.utils.isVisibleRuleset(rulesetNode)) { - rulesetNode.ensureVisibility(); - rulesets.splice(0, 0, rulesetNode); - } - if (rulesets.length === 1) { - return rulesets[0]; - } - return rulesets; - }, - _compileRulesetPaths: function (rulesetNode) { - if (rulesetNode.paths) { - rulesetNode.paths = rulesetNode.paths - .filter(function (p) { - var i; - if (p[0].elements[0].combinator.value === ' ') { - p[0].elements[0].combinator = new (tree.Combinator)(''); - } - for (i = 0; i < p.length; i++) { - if (p[i].isVisible() && p[i].getIsOutput()) { - return true; - } - } - return false; - }); - } - }, - _removeDuplicateRules: function (rules) { - if (!rules) { - return; - } - // remove duplicates - var ruleCache = {}; - var ruleList; - var rule; - var i; - for (i = rules.length - 1; i >= 0; i--) { - rule = rules[i]; - if (rule instanceof tree.Declaration) { - if (!ruleCache[rule.name]) { - ruleCache[rule.name] = rule; - } - else { - ruleList = ruleCache[rule.name]; - if (ruleList instanceof tree.Declaration) { - ruleList = ruleCache[rule.name] = [ruleCache[rule.name].toCSS(this._context)]; - } - var ruleCSS = rule.toCSS(this._context); - if (ruleList.indexOf(ruleCSS) !== -1) { - rules.splice(i, 1); - } - else { - ruleList.push(ruleCSS); - } - } - } - } - }, - _mergeRules: function (rules) { - if (!rules) { - return; - } - var groups = {}; - var groupsArr = []; - for (var i = 0; i < rules.length; i++) { - var rule = rules[i]; - if (rule.merge) { - var key = rule.name; - groups[key] ? rules.splice(i--, 1) : - groupsArr.push(groups[key] = []); - groups[key].push(rule); - } - } - groupsArr.forEach(function (group) { - if (group.length > 0) { - var result_1 = group[0]; - var space_1 = []; - var comma_1 = [new tree.Expression(space_1)]; - group.forEach(function (rule) { - if ((rule.merge === '+') && (space_1.length > 0)) { - comma_1.push(new tree.Expression(space_1 = [])); - } - space_1.push(rule.value); - result_1.important = result_1.important || rule.important; - }); - result_1.value = new tree.Value(comma_1); - } - }); - } - }; + var CSSVisitorUtils = /** @class */ (function () { + function CSSVisitorUtils(context) { + this._visitor = new Visitor(this); + this._context = context; + } + CSSVisitorUtils.prototype.containsSilentNonBlockedChild = function (bodyRules) { + var rule; + if (!bodyRules) { + return false; + } + for (var r = 0; r < bodyRules.length; r++) { + rule = bodyRules[r]; + if (rule.isSilent && rule.isSilent(this._context) && !rule.blocksVisibility()) { + // the atrule contains something that was referenced (likely by extend) + // therefore it needs to be shown in output too + return true; + } + } + return false; + }; + CSSVisitorUtils.prototype.keepOnlyVisibleChilds = function (owner) { + if (owner && owner.rules) { + owner.rules = owner.rules.filter(function (thing) { return thing.isVisible(); }); + } + }; + CSSVisitorUtils.prototype.isEmpty = function (owner) { + return (owner && owner.rules) + ? (owner.rules.length === 0) : true; + }; + CSSVisitorUtils.prototype.hasVisibleSelector = function (rulesetNode) { + return (rulesetNode && rulesetNode.paths) + ? (rulesetNode.paths.length > 0) : false; + }; + CSSVisitorUtils.prototype.resolveVisibility = function (node, originalRules) { + if (!node.blocksVisibility()) { + if (this.isEmpty(node) && !this.containsSilentNonBlockedChild(originalRules)) { + return; + } + return node; + } + var compiledRulesBody = node.rules[0]; + this.keepOnlyVisibleChilds(compiledRulesBody); + if (this.isEmpty(compiledRulesBody)) { + return; + } + node.ensureVisibility(); + node.removeVisibilityBlock(); + return node; + }; + CSSVisitorUtils.prototype.isVisibleRuleset = function (rulesetNode) { + if (rulesetNode.firstRoot) { + return true; + } + if (this.isEmpty(rulesetNode)) { + return false; + } + if (!rulesetNode.root && !this.hasVisibleSelector(rulesetNode)) { + return false; + } + return true; + }; + return CSSVisitorUtils; + }()); + var ToCSSVisitor = function (context) { + this._visitor = new Visitor(this); + this._context = context; + this.utils = new CSSVisitorUtils(context); + }; + ToCSSVisitor.prototype = { + isReplacing: true, + run: function (root) { + return this._visitor.visit(root); + }, + visitDeclaration: function (declNode, visitArgs) { + if (declNode.blocksVisibility() || declNode.variable) { + return; + } + return declNode; + }, + visitMixinDefinition: function (mixinNode, visitArgs) { + // mixin definitions do not get eval'd - this means they keep state + // so we have to clear that state here so it isn't used if toCSS is called twice + mixinNode.frames = []; + }, + visitExtend: function (extendNode, visitArgs) { + }, + visitComment: function (commentNode, visitArgs) { + if (commentNode.blocksVisibility() || commentNode.isSilent(this._context)) { + return; + } + return commentNode; + }, + visitMedia: function (mediaNode, visitArgs) { + var originalRules = mediaNode.rules[0].rules; + mediaNode.accept(this._visitor); + visitArgs.visitDeeper = false; + return this.utils.resolveVisibility(mediaNode, originalRules); + }, + visitImport: function (importNode, visitArgs) { + if (importNode.blocksVisibility()) { + return; + } + return importNode; + }, + visitAtRule: function (atRuleNode, visitArgs) { + if (atRuleNode.rules && atRuleNode.rules.length) { + return this.visitAtRuleWithBody(atRuleNode, visitArgs); + } + else { + return this.visitAtRuleWithoutBody(atRuleNode, visitArgs); + } + }, + visitAnonymous: function (anonymousNode, visitArgs) { + if (!anonymousNode.blocksVisibility()) { + anonymousNode.accept(this._visitor); + return anonymousNode; + } + }, + visitAtRuleWithBody: function (atRuleNode, visitArgs) { + // if there is only one nested ruleset and that one has no path, then it is + // just fake ruleset + function hasFakeRuleset(atRuleNode) { + var bodyRules = atRuleNode.rules; + return bodyRules.length === 1 && (!bodyRules[0].paths || bodyRules[0].paths.length === 0); + } + function getBodyRules(atRuleNode) { + var nodeRules = atRuleNode.rules; + if (hasFakeRuleset(atRuleNode)) { + return nodeRules[0].rules; + } + return nodeRules; + } + // it is still true that it is only one ruleset in array + // this is last such moment + // process childs + var originalRules = getBodyRules(atRuleNode); + atRuleNode.accept(this._visitor); + visitArgs.visitDeeper = false; + if (!this.utils.isEmpty(atRuleNode)) { + this._mergeRules(atRuleNode.rules[0].rules); + } + return this.utils.resolveVisibility(atRuleNode, originalRules); + }, + visitAtRuleWithoutBody: function (atRuleNode, visitArgs) { + if (atRuleNode.blocksVisibility()) { + return; + } + if (atRuleNode.name === '@charset') { + // Only output the debug info together with subsequent @charset definitions + // a comment (or @media statement) before the actual @charset atrule would + // be considered illegal css as it has to be on the first line + if (this.charset) { + if (atRuleNode.debugInfo) { + var comment = new tree.Comment("/* " + atRuleNode.toCSS(this._context).replace(/\n/g, '') + " */\n"); + comment.debugInfo = atRuleNode.debugInfo; + return this._visitor.visit(comment); + } + return; + } + this.charset = true; + } + return atRuleNode; + }, + checkValidNodes: function (rules, isRoot) { + if (!rules) { + return; + } + for (var i = 0; i < rules.length; i++) { + var ruleNode = rules[i]; + if (isRoot && ruleNode instanceof tree.Declaration && !ruleNode.variable) { + throw { message: 'Properties must be inside selector blocks. They cannot be in the root', + index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename }; + } + if (ruleNode instanceof tree.Call) { + throw { message: "Function '" + ruleNode.name + "' did not return a root node", index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename }; + } + if (ruleNode.type && !ruleNode.allowRoot) { + throw { message: ruleNode.type + " node returned by a function is not valid here", index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename }; + } + } + }, + visitRuleset: function (rulesetNode, visitArgs) { + // at this point rulesets are nested into each other + var rule; + var rulesets = []; + this.checkValidNodes(rulesetNode.rules, rulesetNode.firstRoot); + if (!rulesetNode.root) { + // remove invisible paths + this._compileRulesetPaths(rulesetNode); + // remove rulesets from this ruleset body and compile them separately + var nodeRules = rulesetNode.rules; + var nodeRuleCnt = nodeRules ? nodeRules.length : 0; + for (var i = 0; i < nodeRuleCnt;) { + rule = nodeRules[i]; + if (rule && rule.rules) { + // visit because we are moving them out from being a child + rulesets.push(this._visitor.visit(rule)); + nodeRules.splice(i, 1); + nodeRuleCnt--; + continue; + } + i++; + } + // accept the visitor to remove rules and refactor itself + // then we can decide nogw whether we want it or not + // compile body + if (nodeRuleCnt > 0) { + rulesetNode.accept(this._visitor); + } + else { + rulesetNode.rules = null; + } + visitArgs.visitDeeper = false; + } + else { // if (! rulesetNode.root) { + rulesetNode.accept(this._visitor); + visitArgs.visitDeeper = false; + } + if (rulesetNode.rules) { + this._mergeRules(rulesetNode.rules); + this._removeDuplicateRules(rulesetNode.rules); + } + // now decide whether we keep the ruleset + if (this.utils.isVisibleRuleset(rulesetNode)) { + rulesetNode.ensureVisibility(); + rulesets.splice(0, 0, rulesetNode); + } + if (rulesets.length === 1) { + return rulesets[0]; + } + return rulesets; + }, + _compileRulesetPaths: function (rulesetNode) { + if (rulesetNode.paths) { + rulesetNode.paths = rulesetNode.paths + .filter(function (p) { + var i; + if (p[0].elements[0].combinator.value === ' ') { + p[0].elements[0].combinator = new (tree.Combinator)(''); + } + for (i = 0; i < p.length; i++) { + if (p[i].isVisible() && p[i].getIsOutput()) { + return true; + } + } + return false; + }); + } + }, + _removeDuplicateRules: function (rules) { + if (!rules) { + return; + } + // remove duplicates + var ruleCache = {}; + var ruleList; + var rule; + var i; + for (i = rules.length - 1; i >= 0; i--) { + rule = rules[i]; + if (rule instanceof tree.Declaration) { + if (!ruleCache[rule.name]) { + ruleCache[rule.name] = rule; + } + else { + ruleList = ruleCache[rule.name]; + if (ruleList instanceof tree.Declaration) { + ruleList = ruleCache[rule.name] = [ruleCache[rule.name].toCSS(this._context)]; + } + var ruleCSS = rule.toCSS(this._context); + if (ruleList.indexOf(ruleCSS) !== -1) { + rules.splice(i, 1); + } + else { + ruleList.push(ruleCSS); + } + } + } + } + }, + _mergeRules: function (rules) { + if (!rules) { + return; + } + var groups = {}; + var groupsArr = []; + for (var i = 0; i < rules.length; i++) { + var rule = rules[i]; + if (rule.merge) { + var key = rule.name; + groups[key] ? rules.splice(i--, 1) : + groupsArr.push(groups[key] = []); + groups[key].push(rule); + } + } + groupsArr.forEach(function (group) { + if (group.length > 0) { + var result_1 = group[0]; + var space_1 = []; + var comma_1 = [new tree.Expression(space_1)]; + group.forEach(function (rule) { + if ((rule.merge === '+') && (space_1.length > 0)) { + comma_1.push(new tree.Expression(space_1 = [])); + } + space_1.push(rule.value); + result_1.important = result_1.important || rule.important; + }); + result_1.value = new tree.Value(comma_1); + } + }); + } + }; - var visitors = { - Visitor: Visitor, - ImportVisitor: ImportVisitor, - MarkVisibleSelectorsVisitor: SetTreeVisibilityVisitor, - ExtendVisitor: ProcessExtendsVisitor, - JoinSelectorVisitor: JoinSelectorVisitor, - ToCSSVisitor: ToCSSVisitor - }; + var visitors = { + Visitor: Visitor, + ImportVisitor: ImportVisitor, + MarkVisibleSelectorsVisitor: SetTreeVisibilityVisitor, + ExtendVisitor: ProcessExtendsVisitor, + JoinSelectorVisitor: JoinSelectorVisitor, + ToCSSVisitor: ToCSSVisitor + }; - // Split the input into chunks. - var chunker = (function (input, fail) { - var len = input.length; - var level = 0; - var parenLevel = 0; - var lastOpening; - var lastOpeningParen; - var lastMultiComment; - var lastMultiCommentEndBrace; - var chunks = []; - var emitFrom = 0; - var chunkerCurrentIndex; - var currentChunkStartIndex; - var cc; - var cc2; - var matched; - function emitChunk(force) { - var len = chunkerCurrentIndex - emitFrom; - if (((len < 512) && !force) || !len) { - return; - } - chunks.push(input.slice(emitFrom, chunkerCurrentIndex + 1)); - emitFrom = chunkerCurrentIndex + 1; - } - for (chunkerCurrentIndex = 0; chunkerCurrentIndex < len; chunkerCurrentIndex++) { - cc = input.charCodeAt(chunkerCurrentIndex); - if (((cc >= 97) && (cc <= 122)) || (cc < 34)) { - // a-z or whitespace - continue; - } - switch (cc) { - case 40: // ( - parenLevel++; - lastOpeningParen = chunkerCurrentIndex; - continue; - case 41: // ) - if (--parenLevel < 0) { - return fail('missing opening `(`', chunkerCurrentIndex); - } - continue; - case 59: // ; - if (!parenLevel) { - emitChunk(); - } - continue; - case 123: // { - level++; - lastOpening = chunkerCurrentIndex; - continue; - case 125: // } - if (--level < 0) { - return fail('missing opening `{`', chunkerCurrentIndex); - } - if (!level && !parenLevel) { - emitChunk(); - } - continue; - case 92: // \ - if (chunkerCurrentIndex < len - 1) { - chunkerCurrentIndex++; - continue; - } - return fail('unescaped `\\`', chunkerCurrentIndex); - case 34: - case 39: - case 96: // ", ' and ` - matched = 0; - currentChunkStartIndex = chunkerCurrentIndex; - for (chunkerCurrentIndex = chunkerCurrentIndex + 1; chunkerCurrentIndex < len; chunkerCurrentIndex++) { - cc2 = input.charCodeAt(chunkerCurrentIndex); - if (cc2 > 96) { - continue; - } - if (cc2 == cc) { - matched = 1; - break; - } - if (cc2 == 92) { // \ - if (chunkerCurrentIndex == len - 1) { - return fail('unescaped `\\`', chunkerCurrentIndex); - } - chunkerCurrentIndex++; - } - } - if (matched) { - continue; - } - return fail("unmatched `" + String.fromCharCode(cc) + "`", currentChunkStartIndex); - case 47: // /, check for comment - if (parenLevel || (chunkerCurrentIndex == len - 1)) { - continue; - } - cc2 = input.charCodeAt(chunkerCurrentIndex + 1); - if (cc2 == 47) { - // //, find lnfeed - for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len; chunkerCurrentIndex++) { - cc2 = input.charCodeAt(chunkerCurrentIndex); - if ((cc2 <= 13) && ((cc2 == 10) || (cc2 == 13))) { - break; - } - } - } - else if (cc2 == 42) { - // /*, find */ - lastMultiComment = currentChunkStartIndex = chunkerCurrentIndex; - for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len - 1; chunkerCurrentIndex++) { - cc2 = input.charCodeAt(chunkerCurrentIndex); - if (cc2 == 125) { - lastMultiCommentEndBrace = chunkerCurrentIndex; - } - if (cc2 != 42) { - continue; - } - if (input.charCodeAt(chunkerCurrentIndex + 1) == 47) { - break; - } - } - if (chunkerCurrentIndex == len - 1) { - return fail('missing closing `*/`', currentChunkStartIndex); - } - chunkerCurrentIndex++; - } - continue; - case 42: // *, check for unmatched */ - if ((chunkerCurrentIndex < len - 1) && (input.charCodeAt(chunkerCurrentIndex + 1) == 47)) { - return fail('unmatched `/*`', chunkerCurrentIndex); - } - continue; - } - } - if (level !== 0) { - if ((lastMultiComment > lastOpening) && (lastMultiCommentEndBrace > lastMultiComment)) { - return fail('missing closing `}` or `*/`', lastOpening); - } - else { - return fail('missing closing `}`', lastOpening); - } - } - else if (parenLevel !== 0) { - return fail('missing closing `)`', lastOpeningParen); - } - emitChunk(true); - return chunks; - }); + // Split the input into chunks. + function chunker (input, fail) { + var len = input.length; + var level = 0; + var parenLevel = 0; + var lastOpening; + var lastOpeningParen; + var lastMultiComment; + var lastMultiCommentEndBrace; + var chunks = []; + var emitFrom = 0; + var chunkerCurrentIndex; + var currentChunkStartIndex; + var cc; + var cc2; + var matched; + function emitChunk(force) { + var len = chunkerCurrentIndex - emitFrom; + if (((len < 512) && !force) || !len) { + return; + } + chunks.push(input.slice(emitFrom, chunkerCurrentIndex + 1)); + emitFrom = chunkerCurrentIndex + 1; + } + for (chunkerCurrentIndex = 0; chunkerCurrentIndex < len; chunkerCurrentIndex++) { + cc = input.charCodeAt(chunkerCurrentIndex); + if (((cc >= 97) && (cc <= 122)) || (cc < 34)) { + // a-z or whitespace + continue; + } + switch (cc) { + case 40: // ( + parenLevel++; + lastOpeningParen = chunkerCurrentIndex; + continue; + case 41: // ) + if (--parenLevel < 0) { + return fail('missing opening `(`', chunkerCurrentIndex); + } + continue; + case 59: // ; + if (!parenLevel) { + emitChunk(); + } + continue; + case 123: // { + level++; + lastOpening = chunkerCurrentIndex; + continue; + case 125: // } + if (--level < 0) { + return fail('missing opening `{`', chunkerCurrentIndex); + } + if (!level && !parenLevel) { + emitChunk(); + } + continue; + case 92: // \ + if (chunkerCurrentIndex < len - 1) { + chunkerCurrentIndex++; + continue; + } + return fail('unescaped `\\`', chunkerCurrentIndex); + case 34: + case 39: + case 96: // ", ' and ` + matched = 0; + currentChunkStartIndex = chunkerCurrentIndex; + for (chunkerCurrentIndex = chunkerCurrentIndex + 1; chunkerCurrentIndex < len; chunkerCurrentIndex++) { + cc2 = input.charCodeAt(chunkerCurrentIndex); + if (cc2 > 96) { + continue; + } + if (cc2 == cc) { + matched = 1; + break; + } + if (cc2 == 92) { // \ + if (chunkerCurrentIndex == len - 1) { + return fail('unescaped `\\`', chunkerCurrentIndex); + } + chunkerCurrentIndex++; + } + } + if (matched) { + continue; + } + return fail("unmatched `" + String.fromCharCode(cc) + "`", currentChunkStartIndex); + case 47: // /, check for comment + if (parenLevel || (chunkerCurrentIndex == len - 1)) { + continue; + } + cc2 = input.charCodeAt(chunkerCurrentIndex + 1); + if (cc2 == 47) { + // //, find lnfeed + for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len; chunkerCurrentIndex++) { + cc2 = input.charCodeAt(chunkerCurrentIndex); + if ((cc2 <= 13) && ((cc2 == 10) || (cc2 == 13))) { + break; + } + } + } + else if (cc2 == 42) { + // /*, find */ + lastMultiComment = currentChunkStartIndex = chunkerCurrentIndex; + for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len - 1; chunkerCurrentIndex++) { + cc2 = input.charCodeAt(chunkerCurrentIndex); + if (cc2 == 125) { + lastMultiCommentEndBrace = chunkerCurrentIndex; + } + if (cc2 != 42) { + continue; + } + if (input.charCodeAt(chunkerCurrentIndex + 1) == 47) { + break; + } + } + if (chunkerCurrentIndex == len - 1) { + return fail('missing closing `*/`', currentChunkStartIndex); + } + chunkerCurrentIndex++; + } + continue; + case 42: // *, check for unmatched */ + if ((chunkerCurrentIndex < len - 1) && (input.charCodeAt(chunkerCurrentIndex + 1) == 47)) { + return fail('unmatched `/*`', chunkerCurrentIndex); + } + continue; + } + } + if (level !== 0) { + if ((lastMultiComment > lastOpening) && (lastMultiCommentEndBrace > lastMultiComment)) { + return fail('missing closing `}` or `*/`', lastOpening); + } + else { + return fail('missing closing `}`', lastOpening); + } + } + else if (parenLevel !== 0) { + return fail('missing closing `)`', lastOpeningParen); + } + emitChunk(true); + return chunks; + } - var getParserInput = (function () { - var // Less input string - input; - var // current chunk - j; - var // holds state for backtracking - saveStack = []; - var // furthest index the parser has gone to - furthest; - var // if this is furthest we got to, this is the probably cause - furthestPossibleErrorMessage; - var // chunkified input - chunks; - var // current chunk - current; - var // index of current chunk, in `input` - currentPos; - var parserInput = {}; - var CHARCODE_SPACE = 32; - var CHARCODE_TAB = 9; - var CHARCODE_LF = 10; - var CHARCODE_CR = 13; - var CHARCODE_PLUS = 43; - var CHARCODE_COMMA = 44; - var CHARCODE_FORWARD_SLASH = 47; - var CHARCODE_9 = 57; - function skipWhitespace(length) { - var oldi = parserInput.i; - var oldj = j; - var curr = parserInput.i - currentPos; - var endIndex = parserInput.i + current.length - curr; - var mem = (parserInput.i += length); - var inp = input; - var c; - var nextChar; - var comment; - for (; parserInput.i < endIndex; parserInput.i++) { - c = inp.charCodeAt(parserInput.i); - if (parserInput.autoCommentAbsorb && c === CHARCODE_FORWARD_SLASH) { - nextChar = inp.charAt(parserInput.i + 1); - if (nextChar === '/') { - comment = { index: parserInput.i, isLineComment: true }; - var nextNewLine = inp.indexOf('\n', parserInput.i + 2); - if (nextNewLine < 0) { - nextNewLine = endIndex; - } - parserInput.i = nextNewLine; - comment.text = inp.substr(comment.index, parserInput.i - comment.index); - parserInput.commentStore.push(comment); - continue; - } - else if (nextChar === '*') { - var nextStarSlash = inp.indexOf('*/', parserInput.i + 2); - if (nextStarSlash >= 0) { - comment = { - index: parserInput.i, - text: inp.substr(parserInput.i, nextStarSlash + 2 - parserInput.i), - isLineComment: false - }; - parserInput.i += comment.text.length - 1; - parserInput.commentStore.push(comment); - continue; - } - } - break; - } - if ((c !== CHARCODE_SPACE) && (c !== CHARCODE_LF) && (c !== CHARCODE_TAB) && (c !== CHARCODE_CR)) { - break; - } - } - current = current.slice(length + parserInput.i - mem + curr); - currentPos = parserInput.i; - if (!current.length) { - if (j < chunks.length - 1) { - current = chunks[++j]; - skipWhitespace(0); // skip space at the beginning of a chunk - return true; // things changed - } - parserInput.finished = true; - } - return oldi !== parserInput.i || oldj !== j; - } - parserInput.save = function () { - currentPos = parserInput.i; - saveStack.push({ current: current, i: parserInput.i, j: j }); - }; - parserInput.restore = function (possibleErrorMessage) { - if (parserInput.i > furthest || (parserInput.i === furthest && possibleErrorMessage && !furthestPossibleErrorMessage)) { - furthest = parserInput.i; - furthestPossibleErrorMessage = possibleErrorMessage; - } - var state = saveStack.pop(); - current = state.current; - currentPos = parserInput.i = state.i; - j = state.j; - }; - parserInput.forget = function () { - saveStack.pop(); - }; - parserInput.isWhitespace = function (offset) { - var pos = parserInput.i + (offset || 0); - var code = input.charCodeAt(pos); - return (code === CHARCODE_SPACE || code === CHARCODE_CR || code === CHARCODE_TAB || code === CHARCODE_LF); - }; - // Specialization of $(tok) - parserInput.$re = function (tok) { - if (parserInput.i > currentPos) { - current = current.slice(parserInput.i - currentPos); - currentPos = parserInput.i; - } - var m = tok.exec(current); - if (!m) { - return null; - } - skipWhitespace(m[0].length); - if (typeof m === 'string') { - return m; - } - return m.length === 1 ? m[0] : m; - }; - parserInput.$char = function (tok) { - if (input.charAt(parserInput.i) !== tok) { - return null; - } - skipWhitespace(1); - return tok; - }; - parserInput.$str = function (tok) { - var tokLength = tok.length; - // https://jsperf.com/string-startswith/21 - for (var i = 0; i < tokLength; i++) { - if (input.charAt(parserInput.i + i) !== tok.charAt(i)) { - return null; - } - } - skipWhitespace(tokLength); - return tok; - }; - parserInput.$quoted = function (loc) { - var pos = loc || parserInput.i; - var startChar = input.charAt(pos); - if (startChar !== '\'' && startChar !== '"') { - return; - } - var length = input.length; - var currentPosition = pos; - for (var i = 1; i + currentPosition < length; i++) { - var nextChar = input.charAt(i + currentPosition); - switch (nextChar) { - case '\\': - i++; - continue; - case '\r': - case '\n': - break; - case startChar: - var str = input.substr(currentPosition, i + 1); - if (!loc && loc !== 0) { - skipWhitespace(i + 1); - return str; - } - return [startChar, str]; - } - } - return null; - }; - /** - * Permissive parsing. Ignores everything except matching {} [] () and quotes - * until matching token (outside of blocks) - */ - parserInput.$parseUntil = function (tok) { - var quote = ''; - var returnVal = null; - var inComment = false; - var blockDepth = 0; - var blockStack = []; - var parseGroups = []; - var length = input.length; - var startPos = parserInput.i; - var lastPos = parserInput.i; - var i = parserInput.i; - var loop = true; - var testChar; - if (typeof tok === 'string') { - testChar = function (char) { return char === tok; }; - } - else { - testChar = function (char) { return tok.test(char); }; - } - do { - var nextChar = input.charAt(i); - if (blockDepth === 0 && testChar(nextChar)) { - returnVal = input.substr(lastPos, i - lastPos); - if (returnVal) { - parseGroups.push(returnVal); - } - else { - parseGroups.push(' '); - } - returnVal = parseGroups; - skipWhitespace(i - startPos); - loop = false; - } - else { - if (inComment) { - if (nextChar === '*' && - input.charAt(i + 1) === '/') { - i++; - blockDepth--; - inComment = false; - } - i++; - continue; - } - switch (nextChar) { - case '\\': - i++; - nextChar = input.charAt(i); - parseGroups.push(input.substr(lastPos, i - lastPos + 1)); - lastPos = i + 1; - break; - case '/': - if (input.charAt(i + 1) === '*') { - i++; - inComment = true; - blockDepth++; - } - break; - case '\'': - case '"': - quote = parserInput.$quoted(i); - if (quote) { - parseGroups.push(input.substr(lastPos, i - lastPos), quote); - i += quote[1].length - 1; - lastPos = i + 1; - } - else { - skipWhitespace(i - startPos); - returnVal = nextChar; - loop = false; - } - break; - case '{': - blockStack.push('}'); - blockDepth++; - break; - case '(': - blockStack.push(')'); - blockDepth++; - break; - case '[': - blockStack.push(']'); - blockDepth++; - break; - case '}': - case ')': - case ']': - var expected = blockStack.pop(); - if (nextChar === expected) { - blockDepth--; - } - else { - // move the parser to the error and return expected - skipWhitespace(i - startPos); - returnVal = expected; - loop = false; - } - } - i++; - if (i > length) { - loop = false; - } - } - } while (loop); - return returnVal ? returnVal : null; - }; - parserInput.autoCommentAbsorb = true; - parserInput.commentStore = []; - parserInput.finished = false; - // Same as $(), but don't change the state of the parser, - // just return the match. - parserInput.peek = function (tok) { - if (typeof tok === 'string') { - // https://jsperf.com/string-startswith/21 - for (var i = 0; i < tok.length; i++) { - if (input.charAt(parserInput.i + i) !== tok.charAt(i)) { - return false; - } - } - return true; - } - else { - return tok.test(current); - } - }; - // Specialization of peek() - // TODO remove or change some currentChar calls to peekChar - parserInput.peekChar = function (tok) { return input.charAt(parserInput.i) === tok; }; - parserInput.currentChar = function () { return input.charAt(parserInput.i); }; - parserInput.prevChar = function () { return input.charAt(parserInput.i - 1); }; - parserInput.getInput = function () { return input; }; - parserInput.peekNotNumeric = function () { - var c = input.charCodeAt(parserInput.i); - // Is the first char of the dimension 0-9, '.', '+' or '-' - return (c > CHARCODE_9 || c < CHARCODE_PLUS) || c === CHARCODE_FORWARD_SLASH || c === CHARCODE_COMMA; - }; - parserInput.start = function (str, chunkInput, failFunction) { - input = str; - parserInput.i = j = currentPos = furthest = 0; - // chunking apparently makes things quicker (but my tests indicate - // it might actually make things slower in node at least) - // and it is a non-perfect parse - it can't recognise - // unquoted urls, meaning it can't distinguish comments - // meaning comments with quotes or {}() in them get 'counted' - // and then lead to parse errors. - // In addition if the chunking chunks in the wrong place we might - // not be able to parse a parser statement in one go - // this is officially deprecated but can be switched on via an option - // in the case it causes too much performance issues. - if (chunkInput) { - chunks = chunker(str, failFunction); - } - else { - chunks = [str]; - } - current = chunks[0]; - skipWhitespace(0); - }; - parserInput.end = function () { - var message; - var isFinished = parserInput.i >= input.length; - if (parserInput.i < furthest) { - message = furthestPossibleErrorMessage; - parserInput.i = furthest; - } - return { - isFinished: isFinished, - furthest: parserInput.i, - furthestPossibleErrorMessage: message, - furthestReachedEnd: parserInput.i >= input.length - 1, - furthestChar: input[parserInput.i] - }; - }; - return parserInput; - }); + var getParserInput = (function () { + var // Less input string + input; + var // current chunk + j; + var // holds state for backtracking + saveStack = []; + var // furthest index the parser has gone to + furthest; + var // if this is furthest we got to, this is the probably cause + furthestPossibleErrorMessage; + var // chunkified input + chunks; + var // current chunk + current; + var // index of current chunk, in `input` + currentPos; + var parserInput = {}; + var CHARCODE_SPACE = 32; + var CHARCODE_TAB = 9; + var CHARCODE_LF = 10; + var CHARCODE_CR = 13; + var CHARCODE_PLUS = 43; + var CHARCODE_COMMA = 44; + var CHARCODE_FORWARD_SLASH = 47; + var CHARCODE_9 = 57; + function skipWhitespace(length) { + var oldi = parserInput.i; + var oldj = j; + var curr = parserInput.i - currentPos; + var endIndex = parserInput.i + current.length - curr; + var mem = (parserInput.i += length); + var inp = input; + var c; + var nextChar; + var comment; + for (; parserInput.i < endIndex; parserInput.i++) { + c = inp.charCodeAt(parserInput.i); + if (parserInput.autoCommentAbsorb && c === CHARCODE_FORWARD_SLASH) { + nextChar = inp.charAt(parserInput.i + 1); + if (nextChar === '/') { + comment = { index: parserInput.i, isLineComment: true }; + var nextNewLine = inp.indexOf('\n', parserInput.i + 2); + if (nextNewLine < 0) { + nextNewLine = endIndex; + } + parserInput.i = nextNewLine; + comment.text = inp.substr(comment.index, parserInput.i - comment.index); + parserInput.commentStore.push(comment); + continue; + } + else if (nextChar === '*') { + var nextStarSlash = inp.indexOf('*/', parserInput.i + 2); + if (nextStarSlash >= 0) { + comment = { + index: parserInput.i, + text: inp.substr(parserInput.i, nextStarSlash + 2 - parserInput.i), + isLineComment: false + }; + parserInput.i += comment.text.length - 1; + parserInput.commentStore.push(comment); + continue; + } + } + break; + } + if ((c !== CHARCODE_SPACE) && (c !== CHARCODE_LF) && (c !== CHARCODE_TAB) && (c !== CHARCODE_CR)) { + break; + } + } + current = current.slice(length + parserInput.i - mem + curr); + currentPos = parserInput.i; + if (!current.length) { + if (j < chunks.length - 1) { + current = chunks[++j]; + skipWhitespace(0); // skip space at the beginning of a chunk + return true; // things changed + } + parserInput.finished = true; + } + return oldi !== parserInput.i || oldj !== j; + } + parserInput.save = function () { + currentPos = parserInput.i; + saveStack.push({ current: current, i: parserInput.i, j: j }); + }; + parserInput.restore = function (possibleErrorMessage) { + if (parserInput.i > furthest || (parserInput.i === furthest && possibleErrorMessage && !furthestPossibleErrorMessage)) { + furthest = parserInput.i; + furthestPossibleErrorMessage = possibleErrorMessage; + } + var state = saveStack.pop(); + current = state.current; + currentPos = parserInput.i = state.i; + j = state.j; + }; + parserInput.forget = function () { + saveStack.pop(); + }; + parserInput.isWhitespace = function (offset) { + var pos = parserInput.i + (offset || 0); + var code = input.charCodeAt(pos); + return (code === CHARCODE_SPACE || code === CHARCODE_CR || code === CHARCODE_TAB || code === CHARCODE_LF); + }; + // Specialization of $(tok) + parserInput.$re = function (tok) { + if (parserInput.i > currentPos) { + current = current.slice(parserInput.i - currentPos); + currentPos = parserInput.i; + } + var m = tok.exec(current); + if (!m) { + return null; + } + skipWhitespace(m[0].length); + if (typeof m === 'string') { + return m; + } + return m.length === 1 ? m[0] : m; + }; + parserInput.$char = function (tok) { + if (input.charAt(parserInput.i) !== tok) { + return null; + } + skipWhitespace(1); + return tok; + }; + parserInput.$str = function (tok) { + var tokLength = tok.length; + // https://jsperf.com/string-startswith/21 + for (var i = 0; i < tokLength; i++) { + if (input.charAt(parserInput.i + i) !== tok.charAt(i)) { + return null; + } + } + skipWhitespace(tokLength); + return tok; + }; + parserInput.$quoted = function (loc) { + var pos = loc || parserInput.i; + var startChar = input.charAt(pos); + if (startChar !== '\'' && startChar !== '"') { + return; + } + var length = input.length; + var currentPosition = pos; + for (var i = 1; i + currentPosition < length; i++) { + var nextChar = input.charAt(i + currentPosition); + switch (nextChar) { + case '\\': + i++; + continue; + case '\r': + case '\n': + break; + case startChar: + var str = input.substr(currentPosition, i + 1); + if (!loc && loc !== 0) { + skipWhitespace(i + 1); + return str; + } + return [startChar, str]; + } + } + return null; + }; + /** + * Permissive parsing. Ignores everything except matching {} [] () and quotes + * until matching token (outside of blocks) + */ + parserInput.$parseUntil = function (tok) { + var quote = ''; + var returnVal = null; + var inComment = false; + var blockDepth = 0; + var blockStack = []; + var parseGroups = []; + var length = input.length; + var startPos = parserInput.i; + var lastPos = parserInput.i; + var i = parserInput.i; + var loop = true; + var testChar; + if (typeof tok === 'string') { + testChar = function (char) { return char === tok; }; + } + else { + testChar = function (char) { return tok.test(char); }; + } + do { + var nextChar = input.charAt(i); + if (blockDepth === 0 && testChar(nextChar)) { + returnVal = input.substr(lastPos, i - lastPos); + if (returnVal) { + parseGroups.push(returnVal); + } + else { + parseGroups.push(' '); + } + returnVal = parseGroups; + skipWhitespace(i - startPos); + loop = false; + } + else { + if (inComment) { + if (nextChar === '*' && + input.charAt(i + 1) === '/') { + i++; + blockDepth--; + inComment = false; + } + i++; + continue; + } + switch (nextChar) { + case '\\': + i++; + nextChar = input.charAt(i); + parseGroups.push(input.substr(lastPos, i - lastPos + 1)); + lastPos = i + 1; + break; + case '/': + if (input.charAt(i + 1) === '*') { + i++; + inComment = true; + blockDepth++; + } + break; + case '\'': + case '"': + quote = parserInput.$quoted(i); + if (quote) { + parseGroups.push(input.substr(lastPos, i - lastPos), quote); + i += quote[1].length - 1; + lastPos = i + 1; + } + else { + skipWhitespace(i - startPos); + returnVal = nextChar; + loop = false; + } + break; + case '{': + blockStack.push('}'); + blockDepth++; + break; + case '(': + blockStack.push(')'); + blockDepth++; + break; + case '[': + blockStack.push(']'); + blockDepth++; + break; + case '}': + case ')': + case ']': + var expected = blockStack.pop(); + if (nextChar === expected) { + blockDepth--; + } + else { + // move the parser to the error and return expected + skipWhitespace(i - startPos); + returnVal = expected; + loop = false; + } + } + i++; + if (i > length) { + loop = false; + } + } + } while (loop); + return returnVal ? returnVal : null; + }; + parserInput.autoCommentAbsorb = true; + parserInput.commentStore = []; + parserInput.finished = false; + // Same as $(), but don't change the state of the parser, + // just return the match. + parserInput.peek = function (tok) { + if (typeof tok === 'string') { + // https://jsperf.com/string-startswith/21 + for (var i = 0; i < tok.length; i++) { + if (input.charAt(parserInput.i + i) !== tok.charAt(i)) { + return false; + } + } + return true; + } + else { + return tok.test(current); + } + }; + // Specialization of peek() + // TODO remove or change some currentChar calls to peekChar + parserInput.peekChar = function (tok) { return input.charAt(parserInput.i) === tok; }; + parserInput.currentChar = function () { return input.charAt(parserInput.i); }; + parserInput.prevChar = function () { return input.charAt(parserInput.i - 1); }; + parserInput.getInput = function () { return input; }; + parserInput.peekNotNumeric = function () { + var c = input.charCodeAt(parserInput.i); + // Is the first char of the dimension 0-9, '.', '+' or '-' + return (c > CHARCODE_9 || c < CHARCODE_PLUS) || c === CHARCODE_FORWARD_SLASH || c === CHARCODE_COMMA; + }; + parserInput.start = function (str, chunkInput, failFunction) { + input = str; + parserInput.i = j = currentPos = furthest = 0; + // chunking apparently makes things quicker (but my tests indicate + // it might actually make things slower in node at least) + // and it is a non-perfect parse - it can't recognise + // unquoted urls, meaning it can't distinguish comments + // meaning comments with quotes or {}() in them get 'counted' + // and then lead to parse errors. + // In addition if the chunking chunks in the wrong place we might + // not be able to parse a parser statement in one go + // this is officially deprecated but can be switched on via an option + // in the case it causes too much performance issues. + if (chunkInput) { + chunks = chunker(str, failFunction); + } + else { + chunks = [str]; + } + current = chunks[0]; + skipWhitespace(0); + }; + parserInput.end = function () { + var message; + var isFinished = parserInput.i >= input.length; + if (parserInput.i < furthest) { + message = furthestPossibleErrorMessage; + parserInput.i = furthest; + } + return { + isFinished: isFinished, + furthest: parserInput.i, + furthestPossibleErrorMessage: message, + furthestReachedEnd: parserInput.i >= input.length - 1, + furthestChar: input[parserInput.i] + }; + }; + return parserInput; + }); - // - // less.js - parser - // - // A relatively straight-forward predictive parser. - // There is no tokenization/lexing stage, the input is parsed - // in one sweep. - // - // To make the parser fast enough to run in the browser, several - // optimization had to be made: - // - // - Matching and slicing on a huge input is often cause of slowdowns. - // The solution is to chunkify the input into smaller strings. - // The chunks are stored in the `chunks` var, - // `j` holds the current chunk index, and `currentPos` holds - // the index of the current chunk in relation to `input`. - // This gives us an almost 4x speed-up. - // - // - In many cases, we don't need to match individual tokens; - // for example, if a value doesn't hold any variables, operations - // or dynamic references, the parser can effectively 'skip' it, - // treating it as a literal. - // An example would be '1px solid #000' - which evaluates to itself, - // we don't need to know what the individual components are. - // The drawback, of course is that you don't get the benefits of - // syntax-checking on the CSS. This gives us a 50% speed-up in the parser, - // and a smaller speed-up in the code-gen. - // - // - // Token matching is done with the `$` function, which either takes - // a terminal string or regexp, or a non-terminal function to call. - // It also takes care of moving all the indices forwards. - // - var Parser = function Parser(context, imports, fileInfo) { - var parsers; - var parserInput = getParserInput(); - function error(msg, type) { - throw new LessError({ - index: parserInput.i, - filename: fileInfo.filename, - type: type || 'Syntax', - message: msg - }, imports); - } - function expect(arg, msg) { - // some older browsers return typeof 'function' for RegExp - var result = (arg instanceof Function) ? arg.call(parsers) : parserInput.$re(arg); - if (result) { - return result; - } - error(msg || (typeof arg === 'string' - ? "expected '" + arg + "' got '" + parserInput.currentChar() + "'" - : 'unexpected token')); - } - // Specialization of expect() - function expectChar(arg, msg) { - if (parserInput.$char(arg)) { - return arg; - } - error(msg || "expected '" + arg + "' got '" + parserInput.currentChar() + "'"); - } - function getDebugInfo(index) { - var filename = fileInfo.filename; - return { - lineNumber: getLocation(index, parserInput.getInput()).line + 1, - fileName: filename - }; - } - /** - * Used after initial parsing to create nodes on the fly - * - * @param {String} str - string to parse - * @param {Array} parseList - array of parsers to run input through e.g. ["value", "important"] - * @param {Number} currentIndex - start number to begin indexing - * @param {Object} fileInfo - fileInfo to attach to created nodes - */ - function parseNode(str, parseList, currentIndex, fileInfo, callback) { - var result; - var returnNodes = []; - var parser = parserInput; - try { - parser.start(str, false, function fail(msg, index) { - callback({ - message: msg, - index: index + currentIndex - }); - }); - for (var x = 0, p = void 0, i = void 0; (p = parseList[x]); x++) { - i = parser.i; - result = parsers[p](); - if (result) { - try { - result._index = i + currentIndex; - result._fileInfo = fileInfo; - } - catch (e) { } - returnNodes.push(result); - } - else { - returnNodes.push(null); - } - } - var endInfo = parser.end(); - if (endInfo.isFinished) { - callback(null, returnNodes); - } - else { - callback(true, null); - } - } - catch (e) { - throw new LessError({ - index: e.index + currentIndex, - message: e.message - }, imports, fileInfo.filename); - } - } - // - // The Parser - // - return { - parserInput: parserInput, - imports: imports, - fileInfo: fileInfo, - parseNode: parseNode, - // - // Parse an input string into an abstract syntax tree, - // @param str A string containing 'less' markup - // @param callback call `callback` when done. - // @param [additionalData] An optional map which can contains vars - a map (key, value) of variables to apply - // - parse: function (str, callback, additionalData) { - var root; - var error = null; - var globalVars; - var modifyVars; - var ignored; - var preText = ''; - globalVars = (additionalData && additionalData.globalVars) ? Parser.serializeVars(additionalData.globalVars) + "\n" : ''; - modifyVars = (additionalData && additionalData.modifyVars) ? "\n" + Parser.serializeVars(additionalData.modifyVars) : ''; - if (context.pluginManager) { - var preProcessors = context.pluginManager.getPreProcessors(); - for (var i = 0; i < preProcessors.length; i++) { - str = preProcessors[i].process(str, { context: context, imports: imports, fileInfo: fileInfo }); - } - } - if (globalVars || (additionalData && additionalData.banner)) { - preText = ((additionalData && additionalData.banner) ? additionalData.banner : '') + globalVars; - ignored = imports.contentsIgnoredChars; - ignored[fileInfo.filename] = ignored[fileInfo.filename] || 0; - ignored[fileInfo.filename] += preText.length; - } - str = str.replace(/\r\n?/g, '\n'); - // Remove potential UTF Byte Order Mark - str = preText + str.replace(/^\uFEFF/, '') + modifyVars; - imports.contents[fileInfo.filename] = str; - // Start with the primary rule. - // The whole syntax tree is held under a Ruleset node, - // with the `root` property set to true, so no `{}` are - // output. The callback is called when the input is parsed. - try { - parserInput.start(str, context.chunkInput, function fail(msg, index) { - throw new LessError({ - index: index, - type: 'Parse', - message: msg, - filename: fileInfo.filename - }, imports); - }); - tree.Node.prototype.parse = this; - root = new tree.Ruleset(null, this.parsers.primary()); - tree.Node.prototype.rootNode = root; - root.root = true; - root.firstRoot = true; - root.functionRegistry = functionRegistry.inherit(); - } - catch (e) { - return callback(new LessError(e, imports, fileInfo.filename)); - } - // If `i` is smaller than the `input.length - 1`, - // it means the parser wasn't able to parse the whole - // string, so we've got a parsing error. - // - // We try to extract a \n delimited string, - // showing the line where the parse error occurred. - // We split it up into two parts (the part which parsed, - // and the part which didn't), so we can color them differently. - var endInfo = parserInput.end(); - if (!endInfo.isFinished) { - var message = endInfo.furthestPossibleErrorMessage; - if (!message) { - message = 'Unrecognised input'; - if (endInfo.furthestChar === '}') { - message += '. Possibly missing opening \'{\''; - } - else if (endInfo.furthestChar === ')') { - message += '. Possibly missing opening \'(\''; - } - else if (endInfo.furthestReachedEnd) { - message += '. Possibly missing something'; - } - } - error = new LessError({ - type: 'Parse', - message: message, - index: endInfo.furthest, - filename: fileInfo.filename - }, imports); - } - var finish = function (e) { - e = error || e || imports.error; - if (e) { - if (!(e instanceof LessError)) { - e = new LessError(e, imports, fileInfo.filename); - } - return callback(e); - } - else { - return callback(null, root); - } - }; - if (context.processImports !== false) { - new visitors.ImportVisitor(imports, finish) - .run(root); - } - else { - return finish(); - } - }, - // - // Here in, the parsing rules/functions - // - // The basic structure of the syntax tree generated is as follows: - // - // Ruleset -> Declaration -> Value -> Expression -> Entity - // - // Here's some Less code: - // - // .class { - // color: #fff; - // border: 1px solid #000; - // width: @w + 4px; - // > .child {...} - // } - // - // And here's what the parse tree might look like: - // - // Ruleset (Selector '.class', [ - // Declaration ("color", Value ([Expression [Color #fff]])) - // Declaration ("border", Value ([Expression [Dimension 1px][Keyword "solid"][Color #000]])) - // Declaration ("width", Value ([Expression [Operation " + " [Variable "@w"][Dimension 4px]]])) - // Ruleset (Selector [Element '>', '.child'], [...]) - // ]) - // - // In general, most rules will try to parse a token with the `$re()` function, and if the return - // value is truly, will return a new node, of the relevant type. Sometimes, we need to check - // first, before parsing, that's when we use `peek()`. - // - parsers: parsers = { - // - // The `primary` rule is the *entry* and *exit* point of the parser. - // The rules here can appear at any level of the parse tree. - // - // The recursive nature of the grammar is an interplay between the `block` - // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule, - // as represented by this simplified grammar: - // - // primary → (ruleset | declaration)+ - // ruleset → selector+ block - // block → '{' primary '}' - // - // Only at one point is the primary rule not called from the - // block rule: at the root level. - // - primary: function () { - var mixin = this.mixin; - var root = []; - var node; - while (true) { - while (true) { - node = this.comment(); - if (!node) { - break; - } - root.push(node); - } - // always process comments before deciding if finished - if (parserInput.finished) { - break; - } - if (parserInput.peek('}')) { - break; - } - node = this.extendRule(); - if (node) { - root = root.concat(node); - continue; - } - node = mixin.definition() || this.declaration() || mixin.call(false, false) || - this.ruleset() || this.variableCall() || this.entities.call() || this.atrule(); - if (node) { - root.push(node); - } - else { - var foundSemiColon = false; - while (parserInput.$char(';')) { - foundSemiColon = true; - } - if (!foundSemiColon) { - break; - } - } - } - return root; - }, - // comments are collected by the main parsing mechanism and then assigned to nodes - // where the current structure allows it - comment: function () { - if (parserInput.commentStore.length) { - var comment = parserInput.commentStore.shift(); - return new (tree.Comment)(comment.text, comment.isLineComment, comment.index, fileInfo); - } - }, - // - // Entities are tokens which can be found inside an Expression - // - entities: { - mixinLookup: function () { - return parsers.mixin.call(true, true); - }, - // - // A string, which supports escaping " and ' - // - // "milky way" 'he\'s the one!' - // - quoted: function (forceEscaped) { - var str; - var index = parserInput.i; - var isEscaped = false; - parserInput.save(); - if (parserInput.$char('~')) { - isEscaped = true; - } - else if (forceEscaped) { - parserInput.restore(); - return; - } - str = parserInput.$quoted(); - if (!str) { - parserInput.restore(); - return; - } - parserInput.forget(); - return new (tree.Quoted)(str.charAt(0), str.substr(1, str.length - 2), isEscaped, index, fileInfo); - }, - // - // A catch-all word, such as: - // - // black border-collapse - // - keyword: function () { - var k = parserInput.$char('%') || parserInput.$re(/^\[?(?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+\]?/); - if (k) { - return tree.Color.fromKeyword(k) || new (tree.Keyword)(k); - } - }, - // - // A function call - // - // rgb(255, 0, 255) - // - // The arguments are parsed with the `entities.arguments` parser. - // - call: function () { - var name; - var args; - var func; - var index = parserInput.i; - // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18 - if (parserInput.peek(/^url\(/i)) { - return; - } - parserInput.save(); - name = parserInput.$re(/^([\w-]+|%|progid:[\w\.]+)\(/); - if (!name) { - parserInput.forget(); - return; - } - name = name[1]; - func = this.customFuncCall(name); - if (func) { - args = func.parse(); - if (args && func.stop) { - parserInput.forget(); - return args; - } - } - args = this.arguments(args); - if (!parserInput.$char(')')) { - parserInput.restore('Could not parse call arguments or missing \')\''); - return; - } - parserInput.forget(); - return new (tree.Call)(name, args, index, fileInfo); - }, - // - // Parsing rules for functions with non-standard args, e.g.: - // - // boolean(not(2 > 1)) - // - // This is a quick prototype, to be modified/improved when - // more custom-parsed funcs come (e.g. `selector(...)`) - // - customFuncCall: function (name) { - /* Ideally the table is to be moved out of here for faster perf., - but it's quite tricky since it relies on all these `parsers` - and `expect` available only here */ - return { - alpha: f(parsers.ieAlpha, true), - boolean: f(condition), - 'if': f(condition) - }[name.toLowerCase()]; - function f(parse, stop) { - return { - parse: parse, - stop: stop // when true - stop after parse() and return its result, - // otherwise continue for plain args - }; - } - function condition() { - return [expect(parsers.condition, 'expected condition')]; - } - }, - arguments: function (prevArgs) { - var argsComma = prevArgs || []; - var argsSemiColon = []; - var isSemiColonSeparated; - var value; - parserInput.save(); - while (true) { - if (prevArgs) { - prevArgs = false; - } - else { - value = parsers.detachedRuleset() || this.assignment() || parsers.expression(); - if (!value) { - break; - } - if (value.value && value.value.length == 1) { - value = value.value[0]; - } - argsComma.push(value); - } - if (parserInput.$char(',')) { - continue; - } - if (parserInput.$char(';') || isSemiColonSeparated) { - isSemiColonSeparated = true; - value = (argsComma.length < 1) ? argsComma[0] - : new tree.Value(argsComma); - argsSemiColon.push(value); - argsComma = []; - } - } - parserInput.forget(); - return isSemiColonSeparated ? argsSemiColon : argsComma; - }, - literal: function () { - return this.dimension() || - this.color() || - this.quoted() || - this.unicodeDescriptor(); - }, - // Assignments are argument entities for calls. - // They are present in ie filter properties as shown below. - // - // filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* ) - // - assignment: function () { - var key; - var value; - parserInput.save(); - key = parserInput.$re(/^\w+(?=\s?=)/i); - if (!key) { - parserInput.restore(); - return; - } - if (!parserInput.$char('=')) { - parserInput.restore(); - return; - } - value = parsers.entity(); - if (value) { - parserInput.forget(); - return new (tree.Assignment)(key, value); - } - else { - parserInput.restore(); - } - }, - // - // Parse url() tokens - // - // We use a specific rule for urls, because they don't really behave like - // standard function calls. The difference is that the argument doesn't have - // to be enclosed within a string, so it can't be parsed as an Expression. - // - url: function () { - var value; - var index = parserInput.i; - parserInput.autoCommentAbsorb = false; - if (!parserInput.$str('url(')) { - parserInput.autoCommentAbsorb = true; - return; - } - value = this.quoted() || this.variable() || this.property() || - parserInput.$re(/^(?:(?:\\[\(\)'"])|[^\(\)'"])+/) || ''; - parserInput.autoCommentAbsorb = true; - expectChar(')'); - return new (tree.URL)((value.value != null || - value instanceof tree.Variable || - value instanceof tree.Property) ? - value : new (tree.Anonymous)(value, index), index, fileInfo); - }, - // - // A Variable entity, such as `@fink`, in - // - // width: @fink + 2px - // - // We use a different parser for variable definitions, - // see `parsers.variable`. - // - variable: function () { - var ch; - var name; - var index = parserInput.i; - parserInput.save(); - if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^@@?[\w-]+/))) { - ch = parserInput.currentChar(); - if (ch === '(' || ch === '[' && !parserInput.prevChar().match(/^\s/)) { - // this may be a VariableCall lookup - var result = parsers.variableCall(name); - if (result) { - parserInput.forget(); - return result; - } - } - parserInput.forget(); - return new (tree.Variable)(name, index, fileInfo); - } - parserInput.restore(); - }, - // A variable entity using the protective {} e.g. @{var} - variableCurly: function () { - var curly; - var index = parserInput.i; - if (parserInput.currentChar() === '@' && (curly = parserInput.$re(/^@\{([\w-]+)\}/))) { - return new (tree.Variable)("@" + curly[1], index, fileInfo); - } - }, - // - // A Property accessor, such as `$color`, in - // - // background-color: $color - // - property: function () { - var name; - var index = parserInput.i; - if (parserInput.currentChar() === '$' && (name = parserInput.$re(/^\$[\w-]+/))) { - return new (tree.Property)(name, index, fileInfo); - } - }, - // A property entity useing the protective {} e.g. ${prop} - propertyCurly: function () { - var curly; - var index = parserInput.i; - if (parserInput.currentChar() === '$' && (curly = parserInput.$re(/^\$\{([\w-]+)\}/))) { - return new (tree.Property)("$" + curly[1], index, fileInfo); - } - }, - // - // A Hexadecimal color - // - // #4F3C2F - // - // `rgb` and `hsl` colors are parsed through the `entities.call` parser. - // - color: function () { - var rgb; - parserInput.save(); - if (parserInput.currentChar() === '#' && (rgb = parserInput.$re(/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})([\w.#\[])?/))) { - if (!rgb[2]) { - parserInput.forget(); - return new (tree.Color)(rgb[1], undefined, rgb[0]); - } - } - parserInput.restore(); - }, - colorKeyword: function () { - parserInput.save(); - var autoCommentAbsorb = parserInput.autoCommentAbsorb; - parserInput.autoCommentAbsorb = false; - var k = parserInput.$re(/^[_A-Za-z-][_A-Za-z0-9-]+/); - parserInput.autoCommentAbsorb = autoCommentAbsorb; - if (!k) { - parserInput.forget(); - return; - } - parserInput.restore(); - var color = tree.Color.fromKeyword(k); - if (color) { - parserInput.$str(k); - return color; - } - }, - // - // A Dimension, that is, a number and a unit - // - // 0.5em 95% - // - dimension: function () { - if (parserInput.peekNotNumeric()) { - return; - } - var value = parserInput.$re(/^([+-]?\d*\.?\d+)(%|[a-z_]+)?/i); - if (value) { - return new (tree.Dimension)(value[1], value[2]); - } - }, - // - // A unicode descriptor, as is used in unicode-range - // - // U+0?? or U+00A1-00A9 - // - unicodeDescriptor: function () { - var ud; - ud = parserInput.$re(/^U\+[0-9a-fA-F?]+(\-[0-9a-fA-F?]+)?/); - if (ud) { - return new (tree.UnicodeDescriptor)(ud[0]); - } - }, - // - // JavaScript code to be evaluated - // - // `window.location.href` - // - javascript: function () { - var js; - var index = parserInput.i; - parserInput.save(); - var escape = parserInput.$char('~'); - var jsQuote = parserInput.$char('`'); - if (!jsQuote) { - parserInput.restore(); - return; - } - js = parserInput.$re(/^[^`]*`/); - if (js) { - parserInput.forget(); - return new (tree.JavaScript)(js.substr(0, js.length - 1), Boolean(escape), index, fileInfo); - } - parserInput.restore('invalid javascript definition'); - } - }, - // - // The variable part of a variable definition. Used in the `rule` parser - // - // @fink: - // - variable: function () { - var name; - if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^(@[\w-]+)\s*:/))) { - return name[1]; - } - }, - // - // Call a variable value to retrieve a detached ruleset - // or a value from a detached ruleset's rules. - // - // @fink(); - // @fink; - // color: @fink[@color]; - // - variableCall: function (parsedName) { - var lookups; - var i = parserInput.i; - var inValue = !!parsedName; - var name = parsedName; - parserInput.save(); - if (name || (parserInput.currentChar() === '@' - && (name = parserInput.$re(/^(@[\w-]+)(\(\s*\))?/)))) { - lookups = this.mixin.ruleLookups(); - if (!lookups && ((inValue && parserInput.$str('()') !== '()') || (name[2] !== '()'))) { - parserInput.restore('Missing \'[...]\' lookup in variable call'); - return; - } - if (!inValue) { - name = name[1]; - } - var call = new tree.VariableCall(name, i, fileInfo); - if (!inValue && parsers.end()) { - parserInput.forget(); - return call; - } - else { - parserInput.forget(); - return new tree.NamespaceValue(call, lookups, i, fileInfo); - } - } - parserInput.restore(); - }, - // - // extend syntax - used to extend selectors - // - extend: function (isRule) { - var elements; - var e; - var index = parserInput.i; - var option; - var extendList; - var extend; - if (!parserInput.$str(isRule ? '&:extend(' : ':extend(')) { - return; - } - do { - option = null; - elements = null; - while (!(option = parserInput.$re(/^(all)(?=\s*(\)|,))/))) { - e = this.element(); - if (!e) { - break; - } - if (elements) { - elements.push(e); - } - else { - elements = [e]; - } - } - option = option && option[1]; - if (!elements) { - error('Missing target selector for :extend().'); - } - extend = new (tree.Extend)(new (tree.Selector)(elements), option, index, fileInfo); - if (extendList) { - extendList.push(extend); - } - else { - extendList = [extend]; - } - } while (parserInput.$char(',')); - expect(/^\)/); - if (isRule) { - expect(/^;/); - } - return extendList; - }, - // - // extendRule - used in a rule to extend all the parent selectors - // - extendRule: function () { - return this.extend(true); - }, - // - // Mixins - // - mixin: { - // - // A Mixin call, with an optional argument list - // - // #mixins > .square(#fff); - // #mixins.square(#fff); - // .rounded(4px, black); - // .button; - // - // We can lookup / return a value using the lookup syntax: - // - // color: #mixin.square(#fff)[@color]; - // - // The `while` loop is there because mixins can be - // namespaced, but we only support the child and descendant - // selector for now. - // - call: function (inValue, getLookup) { - var s = parserInput.currentChar(); - var important = false; - var lookups; - var index = parserInput.i; - var elements; - var args; - var hasParens; - if (s !== '.' && s !== '#') { - return; - } - parserInput.save(); // stop us absorbing part of an invalid selector - elements = this.elements(); - if (elements) { - if (parserInput.$char('(')) { - args = this.args(true).args; - expectChar(')'); - hasParens = true; - } - if (getLookup !== false) { - lookups = this.ruleLookups(); - } - if (getLookup === true && !lookups) { - parserInput.restore(); - return; - } - if (inValue && !lookups && !hasParens) { - // This isn't a valid in-value mixin call - parserInput.restore(); - return; - } - if (!inValue && parsers.important()) { - important = true; - } - if (inValue || parsers.end()) { - parserInput.forget(); - var mixin = new (tree.mixin.Call)(elements, args, index, fileInfo, !lookups && important); - if (lookups) { - return new tree.NamespaceValue(mixin, lookups); - } - else { - return mixin; - } - } - } - parserInput.restore(); - }, - /** - * Matching elements for mixins - * (Start with . or # and can have > ) - */ - elements: function () { - var elements; - var e; - var c; - var elem; - var elemIndex; - var re = /^[#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/; - while (true) { - elemIndex = parserInput.i; - e = parserInput.$re(re); - if (!e) { - break; - } - elem = new (tree.Element)(c, e, false, elemIndex, fileInfo); - if (elements) { - elements.push(elem); - } - else { - elements = [elem]; - } - c = parserInput.$char('>'); - } - return elements; - }, - args: function (isCall) { - var entities = parsers.entities; - var returner = { args: null, variadic: false }; - var expressions = []; - var argsSemiColon = []; - var argsComma = []; - var isSemiColonSeparated; - var expressionContainsNamed; - var name; - var nameLoop; - var value; - var arg; - var expand; - var hasSep = true; - parserInput.save(); - while (true) { - if (isCall) { - arg = parsers.detachedRuleset() || parsers.expression(); - } - else { - parserInput.commentStore.length = 0; - if (parserInput.$str('...')) { - returner.variadic = true; - if (parserInput.$char(';') && !isSemiColonSeparated) { - isSemiColonSeparated = true; - } - (isSemiColonSeparated ? argsSemiColon : argsComma) - .push({ variadic: true }); - break; - } - arg = entities.variable() || entities.property() || entities.literal() || entities.keyword() || this.call(true); - } - if (!arg || !hasSep) { - break; - } - nameLoop = null; - if (arg.throwAwayComments) { - arg.throwAwayComments(); - } - value = arg; - var val = null; - if (isCall) { - // Variable - if (arg.value && arg.value.length == 1) { - val = arg.value[0]; - } - } - else { - val = arg; - } - if (val && (val instanceof tree.Variable || val instanceof tree.Property)) { - if (parserInput.$char(':')) { - if (expressions.length > 0) { - if (isSemiColonSeparated) { - error('Cannot mix ; and , as delimiter types'); - } - expressionContainsNamed = true; - } - value = parsers.detachedRuleset() || parsers.expression(); - if (!value) { - if (isCall) { - error('could not understand value for named argument'); - } - else { - parserInput.restore(); - returner.args = []; - return returner; - } - } - nameLoop = (name = val.name); - } - else if (parserInput.$str('...')) { - if (!isCall) { - returner.variadic = true; - if (parserInput.$char(';') && !isSemiColonSeparated) { - isSemiColonSeparated = true; - } - (isSemiColonSeparated ? argsSemiColon : argsComma) - .push({ name: arg.name, variadic: true }); - break; - } - else { - expand = true; - } - } - else if (!isCall) { - name = nameLoop = val.name; - value = null; - } - } - if (value) { - expressions.push(value); - } - argsComma.push({ name: nameLoop, value: value, expand: expand }); - if (parserInput.$char(',')) { - hasSep = true; - continue; - } - hasSep = parserInput.$char(';') === ';'; - if (hasSep || isSemiColonSeparated) { - if (expressionContainsNamed) { - error('Cannot mix ; and , as delimiter types'); - } - isSemiColonSeparated = true; - if (expressions.length > 1) { - value = new (tree.Value)(expressions); - } - argsSemiColon.push({ name: name, value: value, expand: expand }); - name = null; - expressions = []; - expressionContainsNamed = false; - } - } - parserInput.forget(); - returner.args = isSemiColonSeparated ? argsSemiColon : argsComma; - return returner; - }, - // - // A Mixin definition, with a list of parameters - // - // .rounded (@radius: 2px, @color) { - // ... - // } - // - // Until we have a finer grained state-machine, we have to - // do a look-ahead, to make sure we don't have a mixin call. - // See the `rule` function for more information. - // - // We start by matching `.rounded (`, and then proceed on to - // the argument list, which has optional default values. - // We store the parameters in `params`, with a `value` key, - // if there is a value, such as in the case of `@radius`. - // - // Once we've got our params list, and a closing `)`, we parse - // the `{...}` block. - // - definition: function () { - var name; - var params = []; - var match; - var ruleset; - var cond; - var variadic = false; - if ((parserInput.currentChar() !== '.' && parserInput.currentChar() !== '#') || - parserInput.peek(/^[^{]*\}/)) { - return; - } - parserInput.save(); - match = parserInput.$re(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/); - if (match) { - name = match[1]; - var argInfo = this.args(false); - params = argInfo.args; - variadic = argInfo.variadic; - // .mixincall("@{a}"); - // looks a bit like a mixin definition.. - // also - // .mixincall(@a: {rule: set;}); - // so we have to be nice and restore - if (!parserInput.$char(')')) { - parserInput.restore('Missing closing \')\''); - return; - } - parserInput.commentStore.length = 0; - if (parserInput.$str('when')) { // Guard - cond = expect(parsers.conditions, 'expected condition'); - } - ruleset = parsers.block(); - if (ruleset) { - parserInput.forget(); - return new (tree.mixin.Definition)(name, params, ruleset, cond, variadic); - } - else { - parserInput.restore(); - } - } - else { - parserInput.restore(); - } - }, - ruleLookups: function () { - var rule; - var lookups = []; - if (parserInput.currentChar() !== '[') { - return; - } - while (true) { - parserInput.save(); - rule = this.lookupValue(); - if (!rule && rule !== '') { - parserInput.restore(); - break; - } - lookups.push(rule); - parserInput.forget(); - } - if (lookups.length > 0) { - return lookups; - } - }, - lookupValue: function () { - parserInput.save(); - if (!parserInput.$char('[')) { - parserInput.restore(); - return; - } - var name = parserInput.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/); - if (!parserInput.$char(']')) { - parserInput.restore(); - return; - } - if (name || name === '') { - parserInput.forget(); - return name; - } - parserInput.restore(); - } - }, - // - // Entities are the smallest recognized token, - // and can be found inside a rule's value. - // - entity: function () { - var entities = this.entities; - return this.comment() || entities.literal() || entities.variable() || entities.url() || - entities.property() || entities.call() || entities.keyword() || this.mixin.call(true) || - entities.javascript(); - }, - // - // A Declaration terminator. Note that we use `peek()` to check for '}', - // because the `block` rule will be expecting it, but we still need to make sure - // it's there, if ';' was omitted. - // - end: function () { - return parserInput.$char(';') || parserInput.peek('}'); - }, - // - // IE's alpha function - // - // alpha(opacity=88) - // - ieAlpha: function () { - var value; - // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18 - if (!parserInput.$re(/^opacity=/i)) { - return; - } - value = parserInput.$re(/^\d+/); - if (!value) { - value = expect(parsers.entities.variable, 'Could not parse alpha'); - value = "@{" + value.name.slice(1) + "}"; - } - expectChar(')'); - return new tree.Quoted('', "alpha(opacity=" + value + ")"); - }, - // - // A Selector Element - // - // div - // + h1 - // #socks - // input[type="text"] - // - // Elements are the building blocks for Selectors, - // they are made out of a `Combinator` (see combinator rule), - // and an element name, such as a tag a class, or `*`. - // - element: function () { - var e; - var c; - var v; - var index = parserInput.i; - c = this.combinator(); - e = parserInput.$re(/^(?:\d+\.\d+|\d+)%/) || - parserInput.$re(/^(?:[.#]?|:*)(?:[\w-]|[^\x00-\x9f]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/) || - parserInput.$char('*') || parserInput.$char('&') || this.attribute() || - parserInput.$re(/^\([^&()@]+\)/) || parserInput.$re(/^[\.#:](?=@)/) || - this.entities.variableCurly(); - if (!e) { - parserInput.save(); - if (parserInput.$char('(')) { - if ((v = this.selector(false)) && parserInput.$char(')')) { - e = new (tree.Paren)(v); - parserInput.forget(); - } - else { - parserInput.restore('Missing closing \')\''); - } - } - else { - parserInput.forget(); - } - } - if (e) { - return new (tree.Element)(c, e, e instanceof tree.Variable, index, fileInfo); - } - }, - // - // Combinators combine elements together, in a Selector. - // - // Because our parser isn't white-space sensitive, special care - // has to be taken, when parsing the descendant combinator, ` `, - // as it's an empty space. We have to check the previous character - // in the input, to see if it's a ` ` character. More info on how - // we deal with this in *combinator.js*. - // - combinator: function () { - var c = parserInput.currentChar(); - if (c === '/') { - parserInput.save(); - var slashedCombinator = parserInput.$re(/^\/[a-z]+\//i); - if (slashedCombinator) { - parserInput.forget(); - return new (tree.Combinator)(slashedCombinator); - } - parserInput.restore(); - } - if (c === '>' || c === '+' || c === '~' || c === '|' || c === '^') { - parserInput.i++; - if (c === '^' && parserInput.currentChar() === '^') { - c = '^^'; - parserInput.i++; - } - while (parserInput.isWhitespace()) { - parserInput.i++; - } - return new (tree.Combinator)(c); - } - else if (parserInput.isWhitespace(-1)) { - return new (tree.Combinator)(' '); - } - else { - return new (tree.Combinator)(null); - } - }, - // - // A CSS Selector - // with less extensions e.g. the ability to extend and guard - // - // .class > div + h1 - // li a:hover - // - // Selectors are made out of one or more Elements, see above. - // - selector: function (isLess) { - var index = parserInput.i; - var elements; - var extendList; - var c; - var e; - var allExtends; - var when; - var condition; - isLess = isLess !== false; - while ((isLess && (extendList = this.extend())) || (isLess && (when = parserInput.$str('when'))) || (e = this.element())) { - if (when) { - condition = expect(this.conditions, 'expected condition'); - } - else if (condition) { - error('CSS guard can only be used at the end of selector'); - } - else if (extendList) { - if (allExtends) { - allExtends = allExtends.concat(extendList); - } - else { - allExtends = extendList; - } - } - else { - if (allExtends) { - error('Extend can only be used at the end of selector'); - } - c = parserInput.currentChar(); - if (elements) { - elements.push(e); - } - else { - elements = [e]; - } - e = null; - } - if (c === '{' || c === '}' || c === ';' || c === ',' || c === ')') { - break; - } - } - if (elements) { - return new (tree.Selector)(elements, allExtends, condition, index, fileInfo); - } - if (allExtends) { - error('Extend must be used to extend a selector, it cannot be used on its own'); - } - }, - selectors: function () { - var s; - var selectors; - while (true) { - s = this.selector(); - if (!s) { - break; - } - if (selectors) { - selectors.push(s); - } - else { - selectors = [s]; - } - parserInput.commentStore.length = 0; - if (s.condition && selectors.length > 1) { - error("Guards are only currently allowed on a single selector."); - } - if (!parserInput.$char(',')) { - break; - } - if (s.condition) { - error("Guards are only currently allowed on a single selector."); - } - parserInput.commentStore.length = 0; - } - return selectors; - }, - attribute: function () { - if (!parserInput.$char('[')) { - return; - } - var entities = this.entities; - var key; - var val; - var op; - if (!(key = entities.variableCurly())) { - key = expect(/^(?:[_A-Za-z0-9-\*]*\|)?(?:[_A-Za-z0-9-]|\\.)+/); - } - op = parserInput.$re(/^[|~*$^]?=/); - if (op) { - val = entities.quoted() || parserInput.$re(/^[0-9]+%/) || parserInput.$re(/^[\w-]+/) || entities.variableCurly(); - } - expectChar(']'); - return new (tree.Attribute)(key, op, val); - }, - // - // The `block` rule is used by `ruleset` and `mixin.definition`. - // It's a wrapper around the `primary` rule, with added `{}`. - // - block: function () { - var content; - if (parserInput.$char('{') && (content = this.primary()) && parserInput.$char('}')) { - return content; - } - }, - blockRuleset: function () { - var block = this.block(); - if (block) { - block = new tree.Ruleset(null, block); - } - return block; - }, - detachedRuleset: function () { - var argInfo; - var params; - var variadic; - parserInput.save(); - if (parserInput.$re(/^[.#]\(/)) { - /** - * DR args currently only implemented for each() function, and not - * yet settable as `@dr: #(@arg) {}` - * This should be done when DRs are merged with mixins. - * See: https://github.com/less/less-meta/issues/16 - */ - argInfo = this.mixin.args(false); - params = argInfo.args; - variadic = argInfo.variadic; - if (!parserInput.$char(')')) { - parserInput.restore(); - return; - } - } - var blockRuleset = this.blockRuleset(); - if (blockRuleset) { - parserInput.forget(); - if (params) { - return new tree.mixin.Definition(null, params, blockRuleset, null, variadic); - } - return new tree.DetachedRuleset(blockRuleset); - } - parserInput.restore(); - }, - // - // div, .class, body > p {...} - // - ruleset: function () { - var selectors; - var rules; - var debugInfo; - parserInput.save(); - if (context.dumpLineNumbers) { - debugInfo = getDebugInfo(parserInput.i); - } - selectors = this.selectors(); - if (selectors && (rules = this.block())) { - parserInput.forget(); - var ruleset = new (tree.Ruleset)(selectors, rules, context.strictImports); - if (context.dumpLineNumbers) { - ruleset.debugInfo = debugInfo; - } - return ruleset; - } - else { - parserInput.restore(); - } - }, - declaration: function () { - var name; - var value; - var index = parserInput.i; - var hasDR; - var c = parserInput.currentChar(); - var important; - var merge; - var isVariable; - if (c === '.' || c === '#' || c === '&' || c === ':') { - return; - } - parserInput.save(); - name = this.variable() || this.ruleProperty(); - if (name) { - isVariable = typeof name === 'string'; - if (isVariable) { - value = this.detachedRuleset(); - if (value) { - hasDR = true; - } - } - parserInput.commentStore.length = 0; - if (!value) { - // a name returned by this.ruleProperty() is always an array of the form: - // [string-1, ..., string-n, ""] or [string-1, ..., string-n, "+"] - // where each item is a tree.Keyword or tree.Variable - merge = !isVariable && name.length > 1 && name.pop().value; - // Custom property values get permissive parsing - if (name[0].value && name[0].value.slice(0, 2) === '--') { - value = this.permissiveValue(); - } - // Try to store values as anonymous - // If we need the value later we'll re-parse it in ruleset.parseValue - else { - value = this.anonymousValue(); - } - if (value) { - parserInput.forget(); - // anonymous values absorb the end ';' which is required for them to work - return new (tree.Declaration)(name, value, false, merge, index, fileInfo); - } - if (!value) { - value = this.value(); - } - if (value) { - important = this.important(); - } - else if (isVariable) { - // As a last resort, try permissiveValue - value = this.permissiveValue(); - } - } - if (value && (this.end() || hasDR)) { - parserInput.forget(); - return new (tree.Declaration)(name, value, important, merge, index, fileInfo); - } - else { - parserInput.restore(); - } - } - else { - parserInput.restore(); - } - }, - anonymousValue: function () { - var index = parserInput.i; - var match = parserInput.$re(/^([^.#@\$+\/'"*`(;{}-]*);/); - if (match) { - return new (tree.Anonymous)(match[1], index); - } - }, - /** - * Used for custom properties, at-rules, and variables (as fallback) - * Parses almost anything inside of {} [] () "" blocks - * until it reaches outer-most tokens. - * - * First, it will try to parse comments and entities to reach - * the end. This is mostly like the Expression parser except no - * math is allowed. - */ - permissiveValue: function (untilTokens) { - var i; - var e; - var done; - var value; - var tok = untilTokens || ';'; - var index = parserInput.i; - var result = []; - function testCurrentChar() { - var char = parserInput.currentChar(); - if (typeof tok === 'string') { - return char === tok; - } - else { - return tok.test(char); - } - } - if (testCurrentChar()) { - return; - } - value = []; - do { - e = this.comment(); - if (e) { - value.push(e); - continue; - } - e = this.entity(); - if (e) { - value.push(e); - } - } while (e); - done = testCurrentChar(); - if (value.length > 0) { - value = new (tree.Expression)(value); - if (done) { - return value; - } - else { - result.push(value); - } - // Preserve space before $parseUntil as it will not - if (parserInput.prevChar() === ' ') { - result.push(new tree.Anonymous(' ', index)); - } - } - parserInput.save(); - value = parserInput.$parseUntil(tok); - if (value) { - if (typeof value === 'string') { - error("Expected '" + value + "'", 'Parse'); - } - if (value.length === 1 && value[0] === ' ') { - parserInput.forget(); - return new tree.Anonymous('', index); - } - var item = void 0; - for (i = 0; i < value.length; i++) { - item = value[i]; - if (Array.isArray(item)) { - // Treat actual quotes as normal quoted values - result.push(new tree.Quoted(item[0], item[1], true, index, fileInfo)); - } - else { - if (i === value.length - 1) { - item = item.trim(); - } - // Treat like quoted values, but replace vars like unquoted expressions - var quote = new tree.Quoted('\'', item, true, index, fileInfo); - quote.variableRegex = /@([\w-]+)/g; - quote.propRegex = /\$([\w-]+)/g; - result.push(quote); - } - } - parserInput.forget(); - return new tree.Expression(result, true); - } - parserInput.restore(); - }, - // - // An @import atrule - // - // @import "lib"; - // - // Depending on our environment, importing is done differently: - // In the browser, it's an XHR request, in Node, it would be a - // file-system operation. The function used for importing is - // stored in `import`, which we pass to the Import constructor. - // - 'import': function () { - var path; - var features; - var index = parserInput.i; - var dir = parserInput.$re(/^@import?\s+/); - if (dir) { - var options = (dir ? this.importOptions() : null) || {}; - if ((path = this.entities.quoted() || this.entities.url())) { - features = this.mediaFeatures(); - if (!parserInput.$char(';')) { - parserInput.i = index; - error('missing semi-colon or unrecognised media features on import'); - } - features = features && new (tree.Value)(features); - return new (tree.Import)(path, features, options, index, fileInfo); - } - else { - parserInput.i = index; - error('malformed import statement'); - } - } - }, - importOptions: function () { - var o; - var options = {}; - var optionName; - var value; - // list of options, surrounded by parens - if (!parserInput.$char('(')) { - return null; - } - do { - o = this.importOption(); - if (o) { - optionName = o; - value = true; - switch (optionName) { - case 'css': - optionName = 'less'; - value = false; - break; - case 'once': - optionName = 'multiple'; - value = false; - break; - } - options[optionName] = value; - if (!parserInput.$char(',')) { - break; - } - } - } while (o); - expectChar(')'); - return options; - }, - importOption: function () { - var opt = parserInput.$re(/^(less|css|multiple|once|inline|reference|optional)/); - if (opt) { - return opt[1]; - } - }, - mediaFeature: function () { - var entities = this.entities; - var nodes = []; - var e; - var p; - parserInput.save(); - do { - e = entities.keyword() || entities.variable() || entities.mixinLookup(); - if (e) { - nodes.push(e); - } - else if (parserInput.$char('(')) { - p = this.property(); - e = this.value(); - if (parserInput.$char(')')) { - if (p && e) { - nodes.push(new (tree.Paren)(new (tree.Declaration)(p, e, null, null, parserInput.i, fileInfo, true))); - } - else if (e) { - nodes.push(new (tree.Paren)(e)); - } - else { - error('badly formed media feature definition'); - } - } - else { - error('Missing closing \')\'', 'Parse'); - } - } - } while (e); - parserInput.forget(); - if (nodes.length > 0) { - return new (tree.Expression)(nodes); - } - }, - mediaFeatures: function () { - var entities = this.entities; - var features = []; - var e; - do { - e = this.mediaFeature(); - if (e) { - features.push(e); - if (!parserInput.$char(',')) { - break; - } - } - else { - e = entities.variable() || entities.mixinLookup(); - if (e) { - features.push(e); - if (!parserInput.$char(',')) { - break; - } - } - } - } while (e); - return features.length > 0 ? features : null; - }, - media: function () { - var features; - var rules; - var media; - var debugInfo; - var index = parserInput.i; - if (context.dumpLineNumbers) { - debugInfo = getDebugInfo(index); - } - parserInput.save(); - if (parserInput.$str('@media')) { - features = this.mediaFeatures(); - rules = this.block(); - if (!rules) { - error('media definitions require block statements after any features'); - } - parserInput.forget(); - media = new (tree.Media)(rules, features, index, fileInfo); - if (context.dumpLineNumbers) { - media.debugInfo = debugInfo; - } - return media; - } - parserInput.restore(); - }, - // - // A @plugin directive, used to import plugins dynamically. - // - // @plugin (args) "lib"; - // - plugin: function () { - var path; - var args; - var options; - var index = parserInput.i; - var dir = parserInput.$re(/^@plugin?\s+/); - if (dir) { - args = this.pluginArgs(); - if (args) { - options = { - pluginArgs: args, - isPlugin: true - }; - } - else { - options = { isPlugin: true }; - } - if ((path = this.entities.quoted() || this.entities.url())) { - if (!parserInput.$char(';')) { - parserInput.i = index; - error('missing semi-colon on @plugin'); - } - return new (tree.Import)(path, null, options, index, fileInfo); - } - else { - parserInput.i = index; - error('malformed @plugin statement'); - } - } - }, - pluginArgs: function () { - // list of options, surrounded by parens - parserInput.save(); - if (!parserInput.$char('(')) { - parserInput.restore(); - return null; - } - var args = parserInput.$re(/^\s*([^\);]+)\)\s*/); - if (args[1]) { - parserInput.forget(); - return args[1].trim(); - } - else { - parserInput.restore(); - return null; - } - }, - // - // A CSS AtRule - // - // @charset "utf-8"; - // - atrule: function () { - var index = parserInput.i; - var name; - var value; - var rules; - var nonVendorSpecificName; - var hasIdentifier; - var hasExpression; - var hasUnknown; - var hasBlock = true; - var isRooted = true; - if (parserInput.currentChar() !== '@') { - return; - } - value = this['import']() || this.plugin() || this.media(); - if (value) { - return value; - } - parserInput.save(); - name = parserInput.$re(/^@[a-z-]+/); - if (!name) { - return; - } - nonVendorSpecificName = name; - if (name.charAt(1) == '-' && name.indexOf('-', 2) > 0) { - nonVendorSpecificName = "@" + name.slice(name.indexOf('-', 2) + 1); - } - switch (nonVendorSpecificName) { - case '@charset': - hasIdentifier = true; - hasBlock = false; - break; - case '@namespace': - hasExpression = true; - hasBlock = false; - break; - case '@keyframes': - case '@counter-style': - hasIdentifier = true; - break; - case '@document': - case '@supports': - hasUnknown = true; - isRooted = false; - break; - default: - hasUnknown = true; - break; - } - parserInput.commentStore.length = 0; - if (hasIdentifier) { - value = this.entity(); - if (!value) { - error("expected " + name + " identifier"); - } - } - else if (hasExpression) { - value = this.expression(); - if (!value) { - error("expected " + name + " expression"); - } - } - else if (hasUnknown) { - value = this.permissiveValue(/^[{;]/); - hasBlock = (parserInput.currentChar() === '{'); - if (!value) { - if (!hasBlock && parserInput.currentChar() !== ';') { - error(name + " rule is missing block or ending semi-colon"); - } - } - else if (!value.value) { - value = null; - } - } - if (hasBlock) { - rules = this.blockRuleset(); - } - if (rules || (!hasBlock && value && parserInput.$char(';'))) { - parserInput.forget(); - return new (tree.AtRule)(name, value, rules, index, fileInfo, context.dumpLineNumbers ? getDebugInfo(index) : null, isRooted); - } - parserInput.restore('at-rule options not recognised'); - }, - // - // A Value is a comma-delimited list of Expressions - // - // font-family: Baskerville, Georgia, serif; - // - // In a Rule, a Value represents everything after the `:`, - // and before the `;`. - // - value: function () { - var e; - var expressions = []; - var index = parserInput.i; - do { - e = this.expression(); - if (e) { - expressions.push(e); - if (!parserInput.$char(',')) { - break; - } - } - } while (e); - if (expressions.length > 0) { - return new (tree.Value)(expressions, index); - } - }, - important: function () { - if (parserInput.currentChar() === '!') { - return parserInput.$re(/^! *important/); - } - }, - sub: function () { - var a; - var e; - parserInput.save(); - if (parserInput.$char('(')) { - a = this.addition(); - if (a && parserInput.$char(')')) { - parserInput.forget(); - e = new (tree.Expression)([a]); - e.parens = true; - return e; - } - parserInput.restore('Expected \')\''); - return; - } - parserInput.restore(); - }, - multiplication: function () { - var m; - var a; - var op; - var operation; - var isSpaced; - m = this.operand(); - if (m) { - isSpaced = parserInput.isWhitespace(-1); - while (true) { - if (parserInput.peek(/^\/[*\/]/)) { - break; - } - parserInput.save(); - op = parserInput.$char('/') || parserInput.$char('*') || parserInput.$str('./'); - if (!op) { - parserInput.forget(); - break; - } - a = this.operand(); - if (!a) { - parserInput.restore(); - break; - } - parserInput.forget(); - m.parensInOp = true; - a.parensInOp = true; - operation = new (tree.Operation)(op, [operation || m, a], isSpaced); - isSpaced = parserInput.isWhitespace(-1); - } - return operation || m; - } - }, - addition: function () { - var m; - var a; - var op; - var operation; - var isSpaced; - m = this.multiplication(); - if (m) { - isSpaced = parserInput.isWhitespace(-1); - while (true) { - op = parserInput.$re(/^[-+]\s+/) || (!isSpaced && (parserInput.$char('+') || parserInput.$char('-'))); - if (!op) { - break; - } - a = this.multiplication(); - if (!a) { - break; - } - m.parensInOp = true; - a.parensInOp = true; - operation = new (tree.Operation)(op, [operation || m, a], isSpaced); - isSpaced = parserInput.isWhitespace(-1); - } - return operation || m; - } - }, - conditions: function () { - var a; - var b; - var index = parserInput.i; - var condition; - a = this.condition(true); - if (a) { - while (true) { - if (!parserInput.peek(/^,\s*(not\s*)?\(/) || !parserInput.$char(',')) { - break; - } - b = this.condition(true); - if (!b) { - break; - } - condition = new (tree.Condition)('or', condition || a, b, index); - } - return condition || a; - } - }, - condition: function (needsParens) { - var result; - var logical; - var next; - function or() { - return parserInput.$str('or'); - } - result = this.conditionAnd(needsParens); - if (!result) { - return; - } - logical = or(); - if (logical) { - next = this.condition(needsParens); - if (next) { - result = new (tree.Condition)(logical, result, next); - } - else { - return; - } - } - return result; - }, - conditionAnd: function (needsParens) { - var result; - var logical; - var next; - var self = this; - function insideCondition() { - var cond = self.negatedCondition(needsParens) || self.parenthesisCondition(needsParens); - if (!cond && !needsParens) { - return self.atomicCondition(needsParens); - } - return cond; - } - function and() { - return parserInput.$str('and'); - } - result = insideCondition(); - if (!result) { - return; - } - logical = and(); - if (logical) { - next = this.conditionAnd(needsParens); - if (next) { - result = new (tree.Condition)(logical, result, next); - } - else { - return; - } - } - return result; - }, - negatedCondition: function (needsParens) { - if (parserInput.$str('not')) { - var result = this.parenthesisCondition(needsParens); - if (result) { - result.negate = !result.negate; - } - return result; - } - }, - parenthesisCondition: function (needsParens) { - function tryConditionFollowedByParenthesis(me) { - var body; - parserInput.save(); - body = me.condition(needsParens); - if (!body) { - parserInput.restore(); - return; - } - if (!parserInput.$char(')')) { - parserInput.restore(); - return; - } - parserInput.forget(); - return body; - } - var body; - parserInput.save(); - if (!parserInput.$str('(')) { - parserInput.restore(); - return; - } - body = tryConditionFollowedByParenthesis(this); - if (body) { - parserInput.forget(); - return body; - } - body = this.atomicCondition(needsParens); - if (!body) { - parserInput.restore(); - return; - } - if (!parserInput.$char(')')) { - parserInput.restore("expected ')' got '" + parserInput.currentChar() + "'"); - return; - } - parserInput.forget(); - return body; - }, - atomicCondition: function (needsParens) { - var entities = this.entities; - var index = parserInput.i; - var a; - var b; - var c; - var op; - function cond() { - return this.addition() || entities.keyword() || entities.quoted() || entities.mixinLookup(); - } - cond = cond.bind(this); - a = cond(); - if (a) { - if (parserInput.$char('>')) { - if (parserInput.$char('=')) { - op = '>='; - } - else { - op = '>'; - } - } - else if (parserInput.$char('<')) { - if (parserInput.$char('=')) { - op = '<='; - } - else { - op = '<'; - } - } - else if (parserInput.$char('=')) { - if (parserInput.$char('>')) { - op = '=>'; - } - else if (parserInput.$char('<')) { - op = '=<'; - } - else { - op = '='; - } - } - if (op) { - b = cond(); - if (b) { - c = new (tree.Condition)(op, a, b, index, false); - } - else { - error('expected expression'); - } - } - else { - c = new (tree.Condition)('=', a, new (tree.Keyword)('true'), index, false); - } - return c; - } - }, - // - // An operand is anything that can be part of an operation, - // such as a Color, or a Variable - // - operand: function () { - var entities = this.entities; - var negate; - if (parserInput.peek(/^-[@\$\(]/)) { - negate = parserInput.$char('-'); - } - var o = this.sub() || entities.dimension() || - entities.color() || entities.variable() || - entities.property() || entities.call() || - entities.quoted(true) || entities.colorKeyword() || - entities.mixinLookup(); - if (negate) { - o.parensInOp = true; - o = new (tree.Negative)(o); - } - return o; - }, - // - // Expressions either represent mathematical operations, - // or white-space delimited Entities. - // - // 1px solid black - // @var * 2 - // - expression: function () { - var entities = []; - var e; - var delim; - var index = parserInput.i; - do { - e = this.comment(); - if (e) { - entities.push(e); - continue; - } - e = this.addition() || this.entity(); - if (e instanceof tree.Comment) { - e = null; - } - if (e) { - entities.push(e); - // operations do not allow keyword "/" dimension (e.g. small/20px) so we support that here - if (!parserInput.peek(/^\/[\/*]/)) { - delim = parserInput.$char('/'); - if (delim) { - entities.push(new (tree.Anonymous)(delim, index)); - } - } - } - } while (e); - if (entities.length > 0) { - return new (tree.Expression)(entities); - } - }, - property: function () { - var name = parserInput.$re(/^(\*?-?[_a-zA-Z0-9-]+)\s*:/); - if (name) { - return name[1]; - } - }, - ruleProperty: function () { - var name = []; - var index = []; - var s; - var k; - parserInput.save(); - var simpleProperty = parserInput.$re(/^([_a-zA-Z0-9-]+)\s*:/); - if (simpleProperty) { - name = [new (tree.Keyword)(simpleProperty[1])]; - parserInput.forget(); - return name; - } - function match(re) { - var i = parserInput.i; - var chunk = parserInput.$re(re); - if (chunk) { - index.push(i); - return name.push(chunk[1]); - } - } - match(/^(\*?)/); - while (true) { - if (!match(/^((?:[\w-]+)|(?:[@\$]\{[\w-]+\}))/)) { - break; - } - } - if ((name.length > 1) && match(/^((?:\+_|\+)?)\s*:/)) { - parserInput.forget(); - // at last, we have the complete match now. move forward, - // convert name particles to tree objects and return: - if (name[0] === '') { - name.shift(); - index.shift(); - } - for (k = 0; k < name.length; k++) { - s = name[k]; - name[k] = (s.charAt(0) !== '@' && s.charAt(0) !== '$') ? - new (tree.Keyword)(s) : - (s.charAt(0) === '@' ? - new (tree.Variable)("@" + s.slice(2, -1), index[k], fileInfo) : - new (tree.Property)("$" + s.slice(2, -1), index[k], fileInfo)); - } - return name; - } - parserInput.restore(); - } - } - }; - }; - Parser.serializeVars = function (vars) { - var s = ''; - for (var name_1 in vars) { - if (Object.hasOwnProperty.call(vars, name_1)) { - var value = vars[name_1]; - s += ((name_1[0] === '@') ? '' : '@') + name_1 + ": " + value + ((String(value).slice(-1) === ';') ? '' : ';'); - } - } - return s; - }; + // + // less.js - parser + // + // A relatively straight-forward predictive parser. + // There is no tokenization/lexing stage, the input is parsed + // in one sweep. + // + // To make the parser fast enough to run in the browser, several + // optimization had to be made: + // + // - Matching and slicing on a huge input is often cause of slowdowns. + // The solution is to chunkify the input into smaller strings. + // The chunks are stored in the `chunks` var, + // `j` holds the current chunk index, and `currentPos` holds + // the index of the current chunk in relation to `input`. + // This gives us an almost 4x speed-up. + // + // - In many cases, we don't need to match individual tokens; + // for example, if a value doesn't hold any variables, operations + // or dynamic references, the parser can effectively 'skip' it, + // treating it as a literal. + // An example would be '1px solid #000' - which evaluates to itself, + // we don't need to know what the individual components are. + // The drawback, of course is that you don't get the benefits of + // syntax-checking on the CSS. This gives us a 50% speed-up in the parser, + // and a smaller speed-up in the code-gen. + // + // + // Token matching is done with the `$` function, which either takes + // a terminal string or regexp, or a non-terminal function to call. + // It also takes care of moving all the indices forwards. + // + var Parser = function Parser(context, imports, fileInfo) { + var parsers; + var parserInput = getParserInput(); + function error(msg, type) { + throw new LessError({ + index: parserInput.i, + filename: fileInfo.filename, + type: type || 'Syntax', + message: msg + }, imports); + } + function expect(arg, msg) { + // some older browsers return typeof 'function' for RegExp + var result = (arg instanceof Function) ? arg.call(parsers) : parserInput.$re(arg); + if (result) { + return result; + } + error(msg || (typeof arg === 'string' + ? "expected '" + arg + "' got '" + parserInput.currentChar() + "'" + : 'unexpected token')); + } + // Specialization of expect() + function expectChar(arg, msg) { + if (parserInput.$char(arg)) { + return arg; + } + error(msg || "expected '" + arg + "' got '" + parserInput.currentChar() + "'"); + } + function getDebugInfo(index) { + var filename = fileInfo.filename; + return { + lineNumber: getLocation(index, parserInput.getInput()).line + 1, + fileName: filename + }; + } + /** + * Used after initial parsing to create nodes on the fly + * + * @param {String} str - string to parse + * @param {Array} parseList - array of parsers to run input through e.g. ["value", "important"] + * @param {Number} currentIndex - start number to begin indexing + * @param {Object} fileInfo - fileInfo to attach to created nodes + */ + function parseNode(str, parseList, currentIndex, fileInfo, callback) { + var result; + var returnNodes = []; + var parser = parserInput; + try { + parser.start(str, false, function fail(msg, index) { + callback({ + message: msg, + index: index + currentIndex + }); + }); + for (var x = 0, p = void 0, i = void 0; (p = parseList[x]); x++) { + i = parser.i; + result = parsers[p](); + if (result) { + try { + result._index = i + currentIndex; + result._fileInfo = fileInfo; + } + catch (e) { } + returnNodes.push(result); + } + else { + returnNodes.push(null); + } + } + var endInfo = parser.end(); + if (endInfo.isFinished) { + callback(null, returnNodes); + } + else { + callback(true, null); + } + } + catch (e) { + throw new LessError({ + index: e.index + currentIndex, + message: e.message + }, imports, fileInfo.filename); + } + } + // + // The Parser + // + return { + parserInput: parserInput, + imports: imports, + fileInfo: fileInfo, + parseNode: parseNode, + // + // Parse an input string into an abstract syntax tree, + // @param str A string containing 'less' markup + // @param callback call `callback` when done. + // @param [additionalData] An optional map which can contains vars - a map (key, value) of variables to apply + // + parse: function (str, callback, additionalData) { + var root; + var error = null; + var globalVars; + var modifyVars; + var ignored; + var preText = ''; + globalVars = (additionalData && additionalData.globalVars) ? Parser.serializeVars(additionalData.globalVars) + "\n" : ''; + modifyVars = (additionalData && additionalData.modifyVars) ? "\n" + Parser.serializeVars(additionalData.modifyVars) : ''; + if (context.pluginManager) { + var preProcessors = context.pluginManager.getPreProcessors(); + for (var i = 0; i < preProcessors.length; i++) { + str = preProcessors[i].process(str, { context: context, imports: imports, fileInfo: fileInfo }); + } + } + if (globalVars || (additionalData && additionalData.banner)) { + preText = ((additionalData && additionalData.banner) ? additionalData.banner : '') + globalVars; + ignored = imports.contentsIgnoredChars; + ignored[fileInfo.filename] = ignored[fileInfo.filename] || 0; + ignored[fileInfo.filename] += preText.length; + } + str = str.replace(/\r\n?/g, '\n'); + // Remove potential UTF Byte Order Mark + str = preText + str.replace(/^\uFEFF/, '') + modifyVars; + imports.contents[fileInfo.filename] = str; + // Start with the primary rule. + // The whole syntax tree is held under a Ruleset node, + // with the `root` property set to true, so no `{}` are + // output. The callback is called when the input is parsed. + try { + parserInput.start(str, context.chunkInput, function fail(msg, index) { + throw new LessError({ + index: index, + type: 'Parse', + message: msg, + filename: fileInfo.filename + }, imports); + }); + tree.Node.prototype.parse = this; + root = new tree.Ruleset(null, this.parsers.primary()); + tree.Node.prototype.rootNode = root; + root.root = true; + root.firstRoot = true; + root.functionRegistry = functionRegistry.inherit(); + } + catch (e) { + return callback(new LessError(e, imports, fileInfo.filename)); + } + // If `i` is smaller than the `input.length - 1`, + // it means the parser wasn't able to parse the whole + // string, so we've got a parsing error. + // + // We try to extract a \n delimited string, + // showing the line where the parse error occurred. + // We split it up into two parts (the part which parsed, + // and the part which didn't), so we can color them differently. + var endInfo = parserInput.end(); + if (!endInfo.isFinished) { + var message = endInfo.furthestPossibleErrorMessage; + if (!message) { + message = 'Unrecognised input'; + if (endInfo.furthestChar === '}') { + message += '. Possibly missing opening \'{\''; + } + else if (endInfo.furthestChar === ')') { + message += '. Possibly missing opening \'(\''; + } + else if (endInfo.furthestReachedEnd) { + message += '. Possibly missing something'; + } + } + error = new LessError({ + type: 'Parse', + message: message, + index: endInfo.furthest, + filename: fileInfo.filename + }, imports); + } + var finish = function (e) { + e = error || e || imports.error; + if (e) { + if (!(e instanceof LessError)) { + e = new LessError(e, imports, fileInfo.filename); + } + return callback(e); + } + else { + return callback(null, root); + } + }; + if (context.processImports !== false) { + new visitors.ImportVisitor(imports, finish) + .run(root); + } + else { + return finish(); + } + }, + // + // Here in, the parsing rules/functions + // + // The basic structure of the syntax tree generated is as follows: + // + // Ruleset -> Declaration -> Value -> Expression -> Entity + // + // Here's some Less code: + // + // .class { + // color: #fff; + // border: 1px solid #000; + // width: @w + 4px; + // > .child {...} + // } + // + // And here's what the parse tree might look like: + // + // Ruleset (Selector '.class', [ + // Declaration ("color", Value ([Expression [Color #fff]])) + // Declaration ("border", Value ([Expression [Dimension 1px][Keyword "solid"][Color #000]])) + // Declaration ("width", Value ([Expression [Operation " + " [Variable "@w"][Dimension 4px]]])) + // Ruleset (Selector [Element '>', '.child'], [...]) + // ]) + // + // In general, most rules will try to parse a token with the `$re()` function, and if the return + // value is truly, will return a new node, of the relevant type. Sometimes, we need to check + // first, before parsing, that's when we use `peek()`. + // + parsers: parsers = { + // + // The `primary` rule is the *entry* and *exit* point of the parser. + // The rules here can appear at any level of the parse tree. + // + // The recursive nature of the grammar is an interplay between the `block` + // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule, + // as represented by this simplified grammar: + // + // primary → (ruleset | declaration)+ + // ruleset → selector+ block + // block → '{' primary '}' + // + // Only at one point is the primary rule not called from the + // block rule: at the root level. + // + primary: function () { + var mixin = this.mixin; + var root = []; + var node; + while (true) { + while (true) { + node = this.comment(); + if (!node) { + break; + } + root.push(node); + } + // always process comments before deciding if finished + if (parserInput.finished) { + break; + } + if (parserInput.peek('}')) { + break; + } + node = this.extendRule(); + if (node) { + root = root.concat(node); + continue; + } + node = mixin.definition() || this.declaration() || mixin.call(false, false) || + this.ruleset() || this.variableCall() || this.entities.call() || this.atrule(); + if (node) { + root.push(node); + } + else { + var foundSemiColon = false; + while (parserInput.$char(';')) { + foundSemiColon = true; + } + if (!foundSemiColon) { + break; + } + } + } + return root; + }, + // comments are collected by the main parsing mechanism and then assigned to nodes + // where the current structure allows it + comment: function () { + if (parserInput.commentStore.length) { + var comment = parserInput.commentStore.shift(); + return new (tree.Comment)(comment.text, comment.isLineComment, comment.index, fileInfo); + } + }, + // + // Entities are tokens which can be found inside an Expression + // + entities: { + mixinLookup: function () { + return parsers.mixin.call(true, true); + }, + // + // A string, which supports escaping " and ' + // + // "milky way" 'he\'s the one!' + // + quoted: function (forceEscaped) { + var str; + var index = parserInput.i; + var isEscaped = false; + parserInput.save(); + if (parserInput.$char('~')) { + isEscaped = true; + } + else if (forceEscaped) { + parserInput.restore(); + return; + } + str = parserInput.$quoted(); + if (!str) { + parserInput.restore(); + return; + } + parserInput.forget(); + return new (tree.Quoted)(str.charAt(0), str.substr(1, str.length - 2), isEscaped, index, fileInfo); + }, + // + // A catch-all word, such as: + // + // black border-collapse + // + keyword: function () { + var k = parserInput.$char('%') || parserInput.$re(/^\[?(?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+\]?/); + if (k) { + return tree.Color.fromKeyword(k) || new (tree.Keyword)(k); + } + }, + // + // A function call + // + // rgb(255, 0, 255) + // + // The arguments are parsed with the `entities.arguments` parser. + // + call: function () { + var name; + var args; + var func; + var index = parserInput.i; + // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18 + if (parserInput.peek(/^url\(/i)) { + return; + } + parserInput.save(); + name = parserInput.$re(/^([\w-]+|%|~|progid:[\w\.]+)\(/); + if (!name) { + parserInput.forget(); + return; + } + name = name[1]; + func = this.customFuncCall(name); + if (func) { + args = func.parse(); + if (args && func.stop) { + parserInput.forget(); + return args; + } + } + args = this.arguments(args); + if (!parserInput.$char(')')) { + parserInput.restore('Could not parse call arguments or missing \')\''); + return; + } + parserInput.forget(); + return new (tree.Call)(name, args, index, fileInfo); + }, + // + // Parsing rules for functions with non-standard args, e.g.: + // + // boolean(not(2 > 1)) + // + // This is a quick prototype, to be modified/improved when + // more custom-parsed funcs come (e.g. `selector(...)`) + // + customFuncCall: function (name) { + /* Ideally the table is to be moved out of here for faster perf., + but it's quite tricky since it relies on all these `parsers` + and `expect` available only here */ + return { + alpha: f(parsers.ieAlpha, true), + boolean: f(condition), + 'if': f(condition) + }[name.toLowerCase()]; + function f(parse, stop) { + return { + parse: parse, + stop: stop // when true - stop after parse() and return its result, + // otherwise continue for plain args + }; + } + function condition() { + return [expect(parsers.condition, 'expected condition')]; + } + }, + arguments: function (prevArgs) { + var argsComma = prevArgs || []; + var argsSemiColon = []; + var isSemiColonSeparated; + var value; + parserInput.save(); + while (true) { + if (prevArgs) { + prevArgs = false; + } + else { + value = parsers.detachedRuleset() || this.assignment() || parsers.expression(); + if (!value) { + break; + } + if (value.value && value.value.length == 1) { + value = value.value[0]; + } + argsComma.push(value); + } + if (parserInput.$char(',')) { + continue; + } + if (parserInput.$char(';') || isSemiColonSeparated) { + isSemiColonSeparated = true; + value = (argsComma.length < 1) ? argsComma[0] + : new tree.Value(argsComma); + argsSemiColon.push(value); + argsComma = []; + } + } + parserInput.forget(); + return isSemiColonSeparated ? argsSemiColon : argsComma; + }, + literal: function () { + return this.dimension() || + this.color() || + this.quoted() || + this.unicodeDescriptor(); + }, + // Assignments are argument entities for calls. + // They are present in ie filter properties as shown below. + // + // filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* ) + // + assignment: function () { + var key; + var value; + parserInput.save(); + key = parserInput.$re(/^\w+(?=\s?=)/i); + if (!key) { + parserInput.restore(); + return; + } + if (!parserInput.$char('=')) { + parserInput.restore(); + return; + } + value = parsers.entity(); + if (value) { + parserInput.forget(); + return new (tree.Assignment)(key, value); + } + else { + parserInput.restore(); + } + }, + // + // Parse url() tokens + // + // We use a specific rule for urls, because they don't really behave like + // standard function calls. The difference is that the argument doesn't have + // to be enclosed within a string, so it can't be parsed as an Expression. + // + url: function () { + var value; + var index = parserInput.i; + parserInput.autoCommentAbsorb = false; + if (!parserInput.$str('url(')) { + parserInput.autoCommentAbsorb = true; + return; + } + value = this.quoted() || this.variable() || this.property() || + parserInput.$re(/^(?:(?:\\[\(\)'"])|[^\(\)'"])+/) || ''; + parserInput.autoCommentAbsorb = true; + expectChar(')'); + return new (tree.URL)((value.value != null || + value instanceof tree.Variable || + value instanceof tree.Property) ? + value : new (tree.Anonymous)(value, index), index, fileInfo); + }, + // + // A Variable entity, such as `@fink`, in + // + // width: @fink + 2px + // + // We use a different parser for variable definitions, + // see `parsers.variable`. + // + variable: function () { + var ch; + var name; + var index = parserInput.i; + parserInput.save(); + if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^@@?[\w-]+/))) { + ch = parserInput.currentChar(); + if (ch === '(' || ch === '[' && !parserInput.prevChar().match(/^\s/)) { + // this may be a VariableCall lookup + var result = parsers.variableCall(name); + if (result) { + parserInput.forget(); + return result; + } + } + parserInput.forget(); + return new (tree.Variable)(name, index, fileInfo); + } + parserInput.restore(); + }, + // A variable entity using the protective {} e.g. @{var} + variableCurly: function () { + var curly; + var index = parserInput.i; + if (parserInput.currentChar() === '@' && (curly = parserInput.$re(/^@\{([\w-]+)\}/))) { + return new (tree.Variable)("@" + curly[1], index, fileInfo); + } + }, + // + // A Property accessor, such as `$color`, in + // + // background-color: $color + // + property: function () { + var name; + var index = parserInput.i; + if (parserInput.currentChar() === '$' && (name = parserInput.$re(/^\$[\w-]+/))) { + return new (tree.Property)(name, index, fileInfo); + } + }, + // A property entity useing the protective {} e.g. ${prop} + propertyCurly: function () { + var curly; + var index = parserInput.i; + if (parserInput.currentChar() === '$' && (curly = parserInput.$re(/^\$\{([\w-]+)\}/))) { + return new (tree.Property)("$" + curly[1], index, fileInfo); + } + }, + // + // A Hexadecimal color + // + // #4F3C2F + // + // `rgb` and `hsl` colors are parsed through the `entities.call` parser. + // + color: function () { + var rgb; + parserInput.save(); + if (parserInput.currentChar() === '#' && (rgb = parserInput.$re(/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})([\w.#\[])?/))) { + if (!rgb[2]) { + parserInput.forget(); + return new (tree.Color)(rgb[1], undefined, rgb[0]); + } + } + parserInput.restore(); + }, + colorKeyword: function () { + parserInput.save(); + var autoCommentAbsorb = parserInput.autoCommentAbsorb; + parserInput.autoCommentAbsorb = false; + var k = parserInput.$re(/^[_A-Za-z-][_A-Za-z0-9-]+/); + parserInput.autoCommentAbsorb = autoCommentAbsorb; + if (!k) { + parserInput.forget(); + return; + } + parserInput.restore(); + var color = tree.Color.fromKeyword(k); + if (color) { + parserInput.$str(k); + return color; + } + }, + // + // A Dimension, that is, a number and a unit + // + // 0.5em 95% + // + dimension: function () { + if (parserInput.peekNotNumeric()) { + return; + } + var value = parserInput.$re(/^([+-]?\d*\.?\d+)(%|[a-z_]+)?/i); + if (value) { + return new (tree.Dimension)(value[1], value[2]); + } + }, + // + // A unicode descriptor, as is used in unicode-range + // + // U+0?? or U+00A1-00A9 + // + unicodeDescriptor: function () { + var ud; + ud = parserInput.$re(/^U\+[0-9a-fA-F?]+(\-[0-9a-fA-F?]+)?/); + if (ud) { + return new (tree.UnicodeDescriptor)(ud[0]); + } + }, + // + // JavaScript code to be evaluated + // + // `window.location.href` + // + javascript: function () { + var js; + var index = parserInput.i; + parserInput.save(); + var escape = parserInput.$char('~'); + var jsQuote = parserInput.$char('`'); + if (!jsQuote) { + parserInput.restore(); + return; + } + js = parserInput.$re(/^[^`]*`/); + if (js) { + parserInput.forget(); + return new (tree.JavaScript)(js.substr(0, js.length - 1), Boolean(escape), index, fileInfo); + } + parserInput.restore('invalid javascript definition'); + } + }, + // + // The variable part of a variable definition. Used in the `rule` parser + // + // @fink: + // + variable: function () { + var name; + if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^(@[\w-]+)\s*:/))) { + return name[1]; + } + }, + // + // Call a variable value to retrieve a detached ruleset + // or a value from a detached ruleset's rules. + // + // @fink(); + // @fink; + // color: @fink[@color]; + // + variableCall: function (parsedName) { + var lookups; + var i = parserInput.i; + var inValue = !!parsedName; + var name = parsedName; + parserInput.save(); + if (name || (parserInput.currentChar() === '@' + && (name = parserInput.$re(/^(@[\w-]+)(\(\s*\))?/)))) { + lookups = this.mixin.ruleLookups(); + if (!lookups && ((inValue && parserInput.$str('()') !== '()') || (name[2] !== '()'))) { + parserInput.restore('Missing \'[...]\' lookup in variable call'); + return; + } + if (!inValue) { + name = name[1]; + } + var call = new tree.VariableCall(name, i, fileInfo); + if (!inValue && parsers.end()) { + parserInput.forget(); + return call; + } + else { + parserInput.forget(); + return new tree.NamespaceValue(call, lookups, i, fileInfo); + } + } + parserInput.restore(); + }, + // + // extend syntax - used to extend selectors + // + extend: function (isRule) { + var elements; + var e; + var index = parserInput.i; + var option; + var extendList; + var extend; + if (!parserInput.$str(isRule ? '&:extend(' : ':extend(')) { + return; + } + do { + option = null; + elements = null; + while (!(option = parserInput.$re(/^(all)(?=\s*(\)|,))/))) { + e = this.element(); + if (!e) { + break; + } + if (elements) { + elements.push(e); + } + else { + elements = [e]; + } + } + option = option && option[1]; + if (!elements) { + error('Missing target selector for :extend().'); + } + extend = new (tree.Extend)(new (tree.Selector)(elements), option, index, fileInfo); + if (extendList) { + extendList.push(extend); + } + else { + extendList = [extend]; + } + } while (parserInput.$char(',')); + expect(/^\)/); + if (isRule) { + expect(/^;/); + } + return extendList; + }, + // + // extendRule - used in a rule to extend all the parent selectors + // + extendRule: function () { + return this.extend(true); + }, + // + // Mixins + // + mixin: { + // + // A Mixin call, with an optional argument list + // + // #mixins > .square(#fff); + // #mixins.square(#fff); + // .rounded(4px, black); + // .button; + // + // We can lookup / return a value using the lookup syntax: + // + // color: #mixin.square(#fff)[@color]; + // + // The `while` loop is there because mixins can be + // namespaced, but we only support the child and descendant + // selector for now. + // + call: function (inValue, getLookup) { + var s = parserInput.currentChar(); + var important = false; + var lookups; + var index = parserInput.i; + var elements; + var args; + var hasParens; + if (s !== '.' && s !== '#') { + return; + } + parserInput.save(); // stop us absorbing part of an invalid selector + elements = this.elements(); + if (elements) { + if (parserInput.$char('(')) { + args = this.args(true).args; + expectChar(')'); + hasParens = true; + } + if (getLookup !== false) { + lookups = this.ruleLookups(); + } + if (getLookup === true && !lookups) { + parserInput.restore(); + return; + } + if (!lookups && !hasParens) { + // This isn't a valid mixin call + parserInput.restore('Unrecognized input. Possibly missing \'(\' in mixin call.'); + return; + } + if (!inValue && parsers.important()) { + important = true; + } + if (inValue || parsers.end()) { + parserInput.forget(); + var mixin = new (tree.mixin.Call)(elements, args, index, fileInfo, !lookups && important); + if (lookups) { + return new tree.NamespaceValue(mixin, lookups); + } + else { + return mixin; + } + } + } + parserInput.restore(); + }, + /** + * Matching elements for mixins + * (Start with . or # and can have > ) + */ + elements: function () { + var elements; + var e; + var c; + var elem; + var elemIndex; + var re = /^[#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/; + while (true) { + elemIndex = parserInput.i; + e = parserInput.$re(re); + if (!e) { + break; + } + elem = new (tree.Element)(c, e, false, elemIndex, fileInfo); + if (elements) { + elements.push(elem); + } + else { + elements = [elem]; + } + c = parserInput.$char('>'); + } + return elements; + }, + args: function (isCall) { + var entities = parsers.entities; + var returner = { args: null, variadic: false }; + var expressions = []; + var argsSemiColon = []; + var argsComma = []; + var isSemiColonSeparated; + var expressionContainsNamed; + var name; + var nameLoop; + var value; + var arg; + var expand; + var hasSep = true; + parserInput.save(); + while (true) { + if (isCall) { + arg = parsers.detachedRuleset() || parsers.expression(); + } + else { + parserInput.commentStore.length = 0; + if (parserInput.$str('...')) { + returner.variadic = true; + if (parserInput.$char(';') && !isSemiColonSeparated) { + isSemiColonSeparated = true; + } + (isSemiColonSeparated ? argsSemiColon : argsComma) + .push({ variadic: true }); + break; + } + arg = entities.variable() || entities.property() || entities.literal() || entities.keyword() || this.call(true); + } + if (!arg || !hasSep) { + break; + } + nameLoop = null; + if (arg.throwAwayComments) { + arg.throwAwayComments(); + } + value = arg; + var val = null; + if (isCall) { + // Variable + if (arg.value && arg.value.length == 1) { + val = arg.value[0]; + } + } + else { + val = arg; + } + if (val && (val instanceof tree.Variable || val instanceof tree.Property)) { + if (parserInput.$char(':')) { + if (expressions.length > 0) { + if (isSemiColonSeparated) { + error('Cannot mix ; and , as delimiter types'); + } + expressionContainsNamed = true; + } + value = parsers.detachedRuleset() || parsers.expression(); + if (!value) { + if (isCall) { + error('could not understand value for named argument'); + } + else { + parserInput.restore(); + returner.args = []; + return returner; + } + } + nameLoop = (name = val.name); + } + else if (parserInput.$str('...')) { + if (!isCall) { + returner.variadic = true; + if (parserInput.$char(';') && !isSemiColonSeparated) { + isSemiColonSeparated = true; + } + (isSemiColonSeparated ? argsSemiColon : argsComma) + .push({ name: arg.name, variadic: true }); + break; + } + else { + expand = true; + } + } + else if (!isCall) { + name = nameLoop = val.name; + value = null; + } + } + if (value) { + expressions.push(value); + } + argsComma.push({ name: nameLoop, value: value, expand: expand }); + if (parserInput.$char(',')) { + hasSep = true; + continue; + } + hasSep = parserInput.$char(';') === ';'; + if (hasSep || isSemiColonSeparated) { + if (expressionContainsNamed) { + error('Cannot mix ; and , as delimiter types'); + } + isSemiColonSeparated = true; + if (expressions.length > 1) { + value = new (tree.Value)(expressions); + } + argsSemiColon.push({ name: name, value: value, expand: expand }); + name = null; + expressions = []; + expressionContainsNamed = false; + } + } + parserInput.forget(); + returner.args = isSemiColonSeparated ? argsSemiColon : argsComma; + return returner; + }, + // + // A Mixin definition, with a list of parameters + // + // .rounded (@radius: 2px, @color) { + // ... + // } + // + // Until we have a finer grained state-machine, we have to + // do a look-ahead, to make sure we don't have a mixin call. + // See the `rule` function for more information. + // + // We start by matching `.rounded (`, and then proceed on to + // the argument list, which has optional default values. + // We store the parameters in `params`, with a `value` key, + // if there is a value, such as in the case of `@radius`. + // + // Once we've got our params list, and a closing `)`, we parse + // the `{...}` block. + // + definition: function () { + var name; + var params = []; + var match; + var ruleset; + var cond; + var variadic = false; + if ((parserInput.currentChar() !== '.' && parserInput.currentChar() !== '#') || + parserInput.peek(/^[^{]*\}/)) { + return; + } + parserInput.save(); + match = parserInput.$re(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/); + if (match) { + name = match[1]; + var argInfo = this.args(false); + params = argInfo.args; + variadic = argInfo.variadic; + // .mixincall("@{a}"); + // looks a bit like a mixin definition.. + // also + // .mixincall(@a: {rule: set;}); + // so we have to be nice and restore + if (!parserInput.$char(')')) { + parserInput.restore('Missing closing \')\''); + return; + } + parserInput.commentStore.length = 0; + if (parserInput.$str('when')) { // Guard + cond = expect(parsers.conditions, 'expected condition'); + } + ruleset = parsers.block(); + if (ruleset) { + parserInput.forget(); + return new (tree.mixin.Definition)(name, params, ruleset, cond, variadic); + } + else { + parserInput.restore(); + } + } + else { + parserInput.restore(); + } + }, + ruleLookups: function () { + var rule; + var lookups = []; + if (parserInput.currentChar() !== '[') { + return; + } + while (true) { + parserInput.save(); + rule = this.lookupValue(); + if (!rule && rule !== '') { + parserInput.restore(); + break; + } + lookups.push(rule); + parserInput.forget(); + } + if (lookups.length > 0) { + return lookups; + } + }, + lookupValue: function () { + parserInput.save(); + if (!parserInput.$char('[')) { + parserInput.restore(); + return; + } + var name = parserInput.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/); + if (!parserInput.$char(']')) { + parserInput.restore(); + return; + } + if (name || name === '') { + parserInput.forget(); + return name; + } + parserInput.restore(); + } + }, + // + // Entities are the smallest recognized token, + // and can be found inside a rule's value. + // + entity: function () { + var entities = this.entities; + return this.comment() || entities.literal() || entities.variable() || entities.url() || + entities.property() || entities.call() || entities.keyword() || this.mixin.call(true) || + entities.javascript(); + }, + // + // A Declaration terminator. Note that we use `peek()` to check for '}', + // because the `block` rule will be expecting it, but we still need to make sure + // it's there, if ';' was omitted. + // + end: function () { + return parserInput.$char(';') || parserInput.peek('}'); + }, + // + // IE's alpha function + // + // alpha(opacity=88) + // + ieAlpha: function () { + var value; + // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18 + if (!parserInput.$re(/^opacity=/i)) { + return; + } + value = parserInput.$re(/^\d+/); + if (!value) { + value = expect(parsers.entities.variable, 'Could not parse alpha'); + value = "@{" + value.name.slice(1) + "}"; + } + expectChar(')'); + return new tree.Quoted('', "alpha(opacity=" + value + ")"); + }, + // + // A Selector Element + // + // div + // + h1 + // #socks + // input[type="text"] + // + // Elements are the building blocks for Selectors, + // they are made out of a `Combinator` (see combinator rule), + // and an element name, such as a tag a class, or `*`. + // + element: function () { + var e; + var c; + var v; + var index = parserInput.i; + c = this.combinator(); + e = parserInput.$re(/^(?:\d+\.\d+|\d+)%/) || + parserInput.$re(/^(?:[.#]?|:*)(?:[\w-]|[^\x00-\x9f]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/) || + parserInput.$char('*') || parserInput.$char('&') || this.attribute() || + parserInput.$re(/^\([^&()@]+\)/) || parserInput.$re(/^[\.#:](?=@)/) || + this.entities.variableCurly(); + if (!e) { + parserInput.save(); + if (parserInput.$char('(')) { + if ((v = this.selector(false)) && parserInput.$char(')')) { + e = new (tree.Paren)(v); + parserInput.forget(); + } + else { + parserInput.restore('Missing closing \')\''); + } + } + else { + parserInput.forget(); + } + } + if (e) { + return new (tree.Element)(c, e, e instanceof tree.Variable, index, fileInfo); + } + }, + // + // Combinators combine elements together, in a Selector. + // + // Because our parser isn't white-space sensitive, special care + // has to be taken, when parsing the descendant combinator, ` `, + // as it's an empty space. We have to check the previous character + // in the input, to see if it's a ` ` character. More info on how + // we deal with this in *combinator.js*. + // + combinator: function () { + var c = parserInput.currentChar(); + if (c === '/') { + parserInput.save(); + var slashedCombinator = parserInput.$re(/^\/[a-z]+\//i); + if (slashedCombinator) { + parserInput.forget(); + return new (tree.Combinator)(slashedCombinator); + } + parserInput.restore(); + } + if (c === '>' || c === '+' || c === '~' || c === '|' || c === '^') { + parserInput.i++; + if (c === '^' && parserInput.currentChar() === '^') { + c = '^^'; + parserInput.i++; + } + while (parserInput.isWhitespace()) { + parserInput.i++; + } + return new (tree.Combinator)(c); + } + else if (parserInput.isWhitespace(-1)) { + return new (tree.Combinator)(' '); + } + else { + return new (tree.Combinator)(null); + } + }, + // + // A CSS Selector + // with less extensions e.g. the ability to extend and guard + // + // .class > div + h1 + // li a:hover + // + // Selectors are made out of one or more Elements, see above. + // + selector: function (isLess) { + var index = parserInput.i; + var elements; + var extendList; + var c; + var e; + var allExtends; + var when; + var condition; + isLess = isLess !== false; + while ((isLess && (extendList = this.extend())) || (isLess && (when = parserInput.$str('when'))) || (e = this.element())) { + if (when) { + condition = expect(this.conditions, 'expected condition'); + } + else if (condition) { + error('CSS guard can only be used at the end of selector'); + } + else if (extendList) { + if (allExtends) { + allExtends = allExtends.concat(extendList); + } + else { + allExtends = extendList; + } + } + else { + if (allExtends) { + error('Extend can only be used at the end of selector'); + } + c = parserInput.currentChar(); + if (elements) { + elements.push(e); + } + else { + elements = [e]; + } + e = null; + } + if (c === '{' || c === '}' || c === ';' || c === ',' || c === ')') { + break; + } + } + if (elements) { + return new (tree.Selector)(elements, allExtends, condition, index, fileInfo); + } + if (allExtends) { + error('Extend must be used to extend a selector, it cannot be used on its own'); + } + }, + selectors: function () { + var s; + var selectors; + while (true) { + s = this.selector(); + if (!s) { + break; + } + if (selectors) { + selectors.push(s); + } + else { + selectors = [s]; + } + parserInput.commentStore.length = 0; + if (s.condition && selectors.length > 1) { + error("Guards are only currently allowed on a single selector."); + } + if (!parserInput.$char(',')) { + break; + } + if (s.condition) { + error("Guards are only currently allowed on a single selector."); + } + parserInput.commentStore.length = 0; + } + return selectors; + }, + attribute: function () { + if (!parserInput.$char('[')) { + return; + } + var entities = this.entities; + var key; + var val; + var op; + if (!(key = entities.variableCurly())) { + key = expect(/^(?:[_A-Za-z0-9-\*]*\|)?(?:[_A-Za-z0-9-]|\\.)+/); + } + op = parserInput.$re(/^[|~*$^]?=/); + if (op) { + val = entities.quoted() || parserInput.$re(/^[0-9]+%/) || parserInput.$re(/^[\w-]+/) || entities.variableCurly(); + } + expectChar(']'); + return new (tree.Attribute)(key, op, val); + }, + // + // The `block` rule is used by `ruleset` and `mixin.definition`. + // It's a wrapper around the `primary` rule, with added `{}`. + // + block: function () { + var content; + if (parserInput.$char('{') && (content = this.primary()) && parserInput.$char('}')) { + return content; + } + }, + blockRuleset: function () { + var block = this.block(); + if (block) { + block = new tree.Ruleset(null, block); + } + return block; + }, + detachedRuleset: function () { + var argInfo; + var params; + var variadic; + parserInput.save(); + if (parserInput.$re(/^[.#]\(/)) { + /** + * DR args currently only implemented for each() function, and not + * yet settable as `@dr: #(@arg) {}` + * This should be done when DRs are merged with mixins. + * See: https://github.com/less/less-meta/issues/16 + */ + argInfo = this.mixin.args(false); + params = argInfo.args; + variadic = argInfo.variadic; + if (!parserInput.$char(')')) { + parserInput.restore(); + return; + } + } + var blockRuleset = this.blockRuleset(); + if (blockRuleset) { + parserInput.forget(); + if (params) { + return new tree.mixin.Definition(null, params, blockRuleset, null, variadic); + } + return new tree.DetachedRuleset(blockRuleset); + } + parserInput.restore(); + }, + // + // div, .class, body > p {...} + // + ruleset: function () { + var selectors; + var rules; + var debugInfo; + parserInput.save(); + if (context.dumpLineNumbers) { + debugInfo = getDebugInfo(parserInput.i); + } + selectors = this.selectors(); + if (selectors && (rules = this.block())) { + parserInput.forget(); + var ruleset = new (tree.Ruleset)(selectors, rules, context.strictImports); + if (context.dumpLineNumbers) { + ruleset.debugInfo = debugInfo; + } + return ruleset; + } + else { + parserInput.restore(); + } + }, + declaration: function () { + var name; + var value; + var index = parserInput.i; + var hasDR; + var c = parserInput.currentChar(); + var important; + var merge; + var isVariable; + if (c === '.' || c === '#' || c === '&' || c === ':') { + return; + } + parserInput.save(); + name = this.variable() || this.ruleProperty(); + if (name) { + isVariable = typeof name === 'string'; + if (isVariable) { + value = this.detachedRuleset(); + if (value) { + hasDR = true; + } + } + parserInput.commentStore.length = 0; + if (!value) { + // a name returned by this.ruleProperty() is always an array of the form: + // [string-1, ..., string-n, ""] or [string-1, ..., string-n, "+"] + // where each item is a tree.Keyword or tree.Variable + merge = !isVariable && name.length > 1 && name.pop().value; + // Custom property values get permissive parsing + if (name[0].value && name[0].value.slice(0, 2) === '--') { + value = this.permissiveValue(); + } + // Try to store values as anonymous + // If we need the value later we'll re-parse it in ruleset.parseValue + else { + value = this.anonymousValue(); + } + if (value) { + parserInput.forget(); + // anonymous values absorb the end ';' which is required for them to work + return new (tree.Declaration)(name, value, false, merge, index, fileInfo); + } + if (!value) { + value = this.value(); + } + if (value) { + important = this.important(); + } + else if (isVariable) { + // As a last resort, try permissiveValue + value = this.permissiveValue(); + } + } + if (value && (this.end() || hasDR)) { + parserInput.forget(); + return new (tree.Declaration)(name, value, important, merge, index, fileInfo); + } + else { + parserInput.restore(); + } + } + else { + parserInput.restore(); + } + }, + anonymousValue: function () { + var index = parserInput.i; + var match = parserInput.$re(/^([^.#@\$+\/'"*`(;{}-]*);/); + if (match) { + return new (tree.Anonymous)(match[1], index); + } + }, + /** + * Used for custom properties, at-rules, and variables (as fallback) + * Parses almost anything inside of {} [] () "" blocks + * until it reaches outer-most tokens. + * + * First, it will try to parse comments and entities to reach + * the end. This is mostly like the Expression parser except no + * math is allowed. + */ + permissiveValue: function (untilTokens) { + var i; + var e; + var done; + var value; + var tok = untilTokens || ';'; + var index = parserInput.i; + var result = []; + function testCurrentChar() { + var char = parserInput.currentChar(); + if (typeof tok === 'string') { + return char === tok; + } + else { + return tok.test(char); + } + } + if (testCurrentChar()) { + return; + } + value = []; + do { + e = this.comment(); + if (e) { + value.push(e); + continue; + } + e = this.entity(); + if (e) { + value.push(e); + } + } while (e); + done = testCurrentChar(); + if (value.length > 0) { + value = new (tree.Expression)(value); + if (done) { + return value; + } + else { + result.push(value); + } + // Preserve space before $parseUntil as it will not + if (parserInput.prevChar() === ' ') { + result.push(new tree.Anonymous(' ', index)); + } + } + parserInput.save(); + value = parserInput.$parseUntil(tok); + if (value) { + if (typeof value === 'string') { + error("Expected '" + value + "'", 'Parse'); + } + if (value.length === 1 && value[0] === ' ') { + parserInput.forget(); + return new tree.Anonymous('', index); + } + var item = void 0; + for (i = 0; i < value.length; i++) { + item = value[i]; + if (Array.isArray(item)) { + // Treat actual quotes as normal quoted values + result.push(new tree.Quoted(item[0], item[1], true, index, fileInfo)); + } + else { + if (i === value.length - 1) { + item = item.trim(); + } + // Treat like quoted values, but replace vars like unquoted expressions + var quote = new tree.Quoted('\'', item, true, index, fileInfo); + quote.variableRegex = /@([\w-]+)/g; + quote.propRegex = /\$([\w-]+)/g; + result.push(quote); + } + } + parserInput.forget(); + return new tree.Expression(result, true); + } + parserInput.restore(); + }, + // + // An @import atrule + // + // @import "lib"; + // + // Depending on our environment, importing is done differently: + // In the browser, it's an XHR request, in Node, it would be a + // file-system operation. The function used for importing is + // stored in `import`, which we pass to the Import constructor. + // + 'import': function () { + var path; + var features; + var index = parserInput.i; + var dir = parserInput.$re(/^@import?\s+/); + if (dir) { + var options = (dir ? this.importOptions() : null) || {}; + if ((path = this.entities.quoted() || this.entities.url())) { + features = this.mediaFeatures(); + if (!parserInput.$char(';')) { + parserInput.i = index; + error('missing semi-colon or unrecognised media features on import'); + } + features = features && new (tree.Value)(features); + return new (tree.Import)(path, features, options, index, fileInfo); + } + else { + parserInput.i = index; + error('malformed import statement'); + } + } + }, + importOptions: function () { + var o; + var options = {}; + var optionName; + var value; + // list of options, surrounded by parens + if (!parserInput.$char('(')) { + return null; + } + do { + o = this.importOption(); + if (o) { + optionName = o; + value = true; + switch (optionName) { + case 'css': + optionName = 'less'; + value = false; + break; + case 'once': + optionName = 'multiple'; + value = false; + break; + } + options[optionName] = value; + if (!parserInput.$char(',')) { + break; + } + } + } while (o); + expectChar(')'); + return options; + }, + importOption: function () { + var opt = parserInput.$re(/^(less|css|multiple|once|inline|reference|optional)/); + if (opt) { + return opt[1]; + } + }, + mediaFeature: function () { + var entities = this.entities; + var nodes = []; + var e; + var p; + parserInput.save(); + do { + e = entities.keyword() || entities.variable() || entities.mixinLookup(); + if (e) { + nodes.push(e); + } + else if (parserInput.$char('(')) { + p = this.property(); + e = this.value(); + if (parserInput.$char(')')) { + if (p && e) { + nodes.push(new (tree.Paren)(new (tree.Declaration)(p, e, null, null, parserInput.i, fileInfo, true))); + } + else if (e) { + nodes.push(new (tree.Paren)(e)); + } + else { + error('badly formed media feature definition'); + } + } + else { + error('Missing closing \')\'', 'Parse'); + } + } + } while (e); + parserInput.forget(); + if (nodes.length > 0) { + return new (tree.Expression)(nodes); + } + }, + mediaFeatures: function () { + var entities = this.entities; + var features = []; + var e; + do { + e = this.mediaFeature(); + if (e) { + features.push(e); + if (!parserInput.$char(',')) { + break; + } + } + else { + e = entities.variable() || entities.mixinLookup(); + if (e) { + features.push(e); + if (!parserInput.$char(',')) { + break; + } + } + } + } while (e); + return features.length > 0 ? features : null; + }, + media: function () { + var features; + var rules; + var media; + var debugInfo; + var index = parserInput.i; + if (context.dumpLineNumbers) { + debugInfo = getDebugInfo(index); + } + parserInput.save(); + if (parserInput.$str('@media')) { + features = this.mediaFeatures(); + rules = this.block(); + if (!rules) { + error('media definitions require block statements after any features'); + } + parserInput.forget(); + media = new (tree.Media)(rules, features, index, fileInfo); + if (context.dumpLineNumbers) { + media.debugInfo = debugInfo; + } + return media; + } + parserInput.restore(); + }, + // + // A @plugin directive, used to import plugins dynamically. + // + // @plugin (args) "lib"; + // + plugin: function () { + var path; + var args; + var options; + var index = parserInput.i; + var dir = parserInput.$re(/^@plugin?\s+/); + if (dir) { + args = this.pluginArgs(); + if (args) { + options = { + pluginArgs: args, + isPlugin: true + }; + } + else { + options = { isPlugin: true }; + } + if ((path = this.entities.quoted() || this.entities.url())) { + if (!parserInput.$char(';')) { + parserInput.i = index; + error('missing semi-colon on @plugin'); + } + return new (tree.Import)(path, null, options, index, fileInfo); + } + else { + parserInput.i = index; + error('malformed @plugin statement'); + } + } + }, + pluginArgs: function () { + // list of options, surrounded by parens + parserInput.save(); + if (!parserInput.$char('(')) { + parserInput.restore(); + return null; + } + var args = parserInput.$re(/^\s*([^\);]+)\)\s*/); + if (args[1]) { + parserInput.forget(); + return args[1].trim(); + } + else { + parserInput.restore(); + return null; + } + }, + // + // A CSS AtRule + // + // @charset "utf-8"; + // + atrule: function () { + var index = parserInput.i; + var name; + var value; + var rules; + var nonVendorSpecificName; + var hasIdentifier; + var hasExpression; + var hasUnknown; + var hasBlock = true; + var isRooted = true; + if (parserInput.currentChar() !== '@') { + return; + } + value = this['import']() || this.plugin() || this.media(); + if (value) { + return value; + } + parserInput.save(); + name = parserInput.$re(/^@[a-z-]+/); + if (!name) { + return; + } + nonVendorSpecificName = name; + if (name.charAt(1) == '-' && name.indexOf('-', 2) > 0) { + nonVendorSpecificName = "@" + name.slice(name.indexOf('-', 2) + 1); + } + switch (nonVendorSpecificName) { + case '@charset': + hasIdentifier = true; + hasBlock = false; + break; + case '@namespace': + hasExpression = true; + hasBlock = false; + break; + case '@keyframes': + case '@counter-style': + hasIdentifier = true; + break; + case '@document': + case '@supports': + hasUnknown = true; + isRooted = false; + break; + default: + hasUnknown = true; + break; + } + parserInput.commentStore.length = 0; + if (hasIdentifier) { + value = this.entity(); + if (!value) { + error("expected " + name + " identifier"); + } + } + else if (hasExpression) { + value = this.expression(); + if (!value) { + error("expected " + name + " expression"); + } + } + else if (hasUnknown) { + value = this.permissiveValue(/^[{;]/); + hasBlock = (parserInput.currentChar() === '{'); + if (!value) { + if (!hasBlock && parserInput.currentChar() !== ';') { + error(name + " rule is missing block or ending semi-colon"); + } + } + else if (!value.value) { + value = null; + } + } + if (hasBlock) { + rules = this.blockRuleset(); + } + if (rules || (!hasBlock && value && parserInput.$char(';'))) { + parserInput.forget(); + return new (tree.AtRule)(name, value, rules, index, fileInfo, context.dumpLineNumbers ? getDebugInfo(index) : null, isRooted); + } + parserInput.restore('at-rule options not recognised'); + }, + // + // A Value is a comma-delimited list of Expressions + // + // font-family: Baskerville, Georgia, serif; + // + // In a Rule, a Value represents everything after the `:`, + // and before the `;`. + // + value: function () { + var e; + var expressions = []; + var index = parserInput.i; + do { + e = this.expression(); + if (e) { + expressions.push(e); + if (!parserInput.$char(',')) { + break; + } + } + } while (e); + if (expressions.length > 0) { + return new (tree.Value)(expressions, index); + } + }, + important: function () { + if (parserInput.currentChar() === '!') { + return parserInput.$re(/^! *important/); + } + }, + sub: function () { + var a; + var e; + parserInput.save(); + if (parserInput.$char('(')) { + a = this.addition(); + if (a && parserInput.$char(')')) { + parserInput.forget(); + e = new (tree.Expression)([a]); + e.parens = true; + return e; + } + parserInput.restore('Expected \')\''); + return; + } + parserInput.restore(); + }, + multiplication: function () { + var m; + var a; + var op; + var operation; + var isSpaced; + m = this.operand(); + if (m) { + isSpaced = parserInput.isWhitespace(-1); + while (true) { + if (parserInput.peek(/^\/[*\/]/)) { + break; + } + parserInput.save(); + op = parserInput.$char('/') || parserInput.$char('*') || parserInput.$str('./'); + if (!op) { + parserInput.forget(); + break; + } + a = this.operand(); + if (!a) { + parserInput.restore(); + break; + } + parserInput.forget(); + m.parensInOp = true; + a.parensInOp = true; + operation = new (tree.Operation)(op, [operation || m, a], isSpaced); + isSpaced = parserInput.isWhitespace(-1); + } + return operation || m; + } + }, + addition: function () { + var m; + var a; + var op; + var operation; + var isSpaced; + m = this.multiplication(); + if (m) { + isSpaced = parserInput.isWhitespace(-1); + while (true) { + op = parserInput.$re(/^[-+]\s+/) || (!isSpaced && (parserInput.$char('+') || parserInput.$char('-'))); + if (!op) { + break; + } + a = this.multiplication(); + if (!a) { + break; + } + m.parensInOp = true; + a.parensInOp = true; + operation = new (tree.Operation)(op, [operation || m, a], isSpaced); + isSpaced = parserInput.isWhitespace(-1); + } + return operation || m; + } + }, + conditions: function () { + var a; + var b; + var index = parserInput.i; + var condition; + a = this.condition(true); + if (a) { + while (true) { + if (!parserInput.peek(/^,\s*(not\s*)?\(/) || !parserInput.$char(',')) { + break; + } + b = this.condition(true); + if (!b) { + break; + } + condition = new (tree.Condition)('or', condition || a, b, index); + } + return condition || a; + } + }, + condition: function (needsParens) { + var result; + var logical; + var next; + function or() { + return parserInput.$str('or'); + } + result = this.conditionAnd(needsParens); + if (!result) { + return; + } + logical = or(); + if (logical) { + next = this.condition(needsParens); + if (next) { + result = new (tree.Condition)(logical, result, next); + } + else { + return; + } + } + return result; + }, + conditionAnd: function (needsParens) { + var result; + var logical; + var next; + var self = this; + function insideCondition() { + var cond = self.negatedCondition(needsParens) || self.parenthesisCondition(needsParens); + if (!cond && !needsParens) { + return self.atomicCondition(needsParens); + } + return cond; + } + function and() { + return parserInput.$str('and'); + } + result = insideCondition(); + if (!result) { + return; + } + logical = and(); + if (logical) { + next = this.conditionAnd(needsParens); + if (next) { + result = new (tree.Condition)(logical, result, next); + } + else { + return; + } + } + return result; + }, + negatedCondition: function (needsParens) { + if (parserInput.$str('not')) { + var result = this.parenthesisCondition(needsParens); + if (result) { + result.negate = !result.negate; + } + return result; + } + }, + parenthesisCondition: function (needsParens) { + function tryConditionFollowedByParenthesis(me) { + var body; + parserInput.save(); + body = me.condition(needsParens); + if (!body) { + parserInput.restore(); + return; + } + if (!parserInput.$char(')')) { + parserInput.restore(); + return; + } + parserInput.forget(); + return body; + } + var body; + parserInput.save(); + if (!parserInput.$str('(')) { + parserInput.restore(); + return; + } + body = tryConditionFollowedByParenthesis(this); + if (body) { + parserInput.forget(); + return body; + } + body = this.atomicCondition(needsParens); + if (!body) { + parserInput.restore(); + return; + } + if (!parserInput.$char(')')) { + parserInput.restore("expected ')' got '" + parserInput.currentChar() + "'"); + return; + } + parserInput.forget(); + return body; + }, + atomicCondition: function (needsParens) { + var entities = this.entities; + var index = parserInput.i; + var a; + var b; + var c; + var op; + function cond() { + return this.addition() || entities.keyword() || entities.quoted() || entities.mixinLookup(); + } + cond = cond.bind(this); + a = cond(); + if (a) { + if (parserInput.$char('>')) { + if (parserInput.$char('=')) { + op = '>='; + } + else { + op = '>'; + } + } + else if (parserInput.$char('<')) { + if (parserInput.$char('=')) { + op = '<='; + } + else { + op = '<'; + } + } + else if (parserInput.$char('=')) { + if (parserInput.$char('>')) { + op = '=>'; + } + else if (parserInput.$char('<')) { + op = '=<'; + } + else { + op = '='; + } + } + if (op) { + b = cond(); + if (b) { + c = new (tree.Condition)(op, a, b, index, false); + } + else { + error('expected expression'); + } + } + else { + c = new (tree.Condition)('=', a, new (tree.Keyword)('true'), index, false); + } + return c; + } + }, + // + // An operand is anything that can be part of an operation, + // such as a Color, or a Variable + // + operand: function () { + var entities = this.entities; + var negate; + if (parserInput.peek(/^-[@\$\(]/)) { + negate = parserInput.$char('-'); + } + var o = this.sub() || entities.dimension() || + entities.color() || entities.variable() || + entities.property() || entities.call() || + entities.quoted(true) || entities.colorKeyword() || + entities.mixinLookup(); + if (negate) { + o.parensInOp = true; + o = new (tree.Negative)(o); + } + return o; + }, + // + // Expressions either represent mathematical operations, + // or white-space delimited Entities. + // + // 1px solid black + // @var * 2 + // + expression: function () { + var entities = []; + var e; + var delim; + var index = parserInput.i; + do { + e = this.comment(); + if (e) { + entities.push(e); + continue; + } + e = this.addition() || this.entity(); + if (e instanceof tree.Comment) { + e = null; + } + if (e) { + entities.push(e); + // operations do not allow keyword "/" dimension (e.g. small/20px) so we support that here + if (!parserInput.peek(/^\/[\/*]/)) { + delim = parserInput.$char('/'); + if (delim) { + entities.push(new (tree.Anonymous)(delim, index)); + } + } + } + } while (e); + if (entities.length > 0) { + return new (tree.Expression)(entities); + } + }, + property: function () { + var name = parserInput.$re(/^(\*?-?[_a-zA-Z0-9-]+)\s*:/); + if (name) { + return name[1]; + } + }, + ruleProperty: function () { + var name = []; + var index = []; + var s; + var k; + parserInput.save(); + var simpleProperty = parserInput.$re(/^([_a-zA-Z0-9-]+)\s*:/); + if (simpleProperty) { + name = [new (tree.Keyword)(simpleProperty[1])]; + parserInput.forget(); + return name; + } + function match(re) { + var i = parserInput.i; + var chunk = parserInput.$re(re); + if (chunk) { + index.push(i); + return name.push(chunk[1]); + } + } + match(/^(\*?)/); + while (true) { + if (!match(/^((?:[\w-]+)|(?:[@\$]\{[\w-]+\}))/)) { + break; + } + } + if ((name.length > 1) && match(/^((?:\+_|\+)?)\s*:/)) { + parserInput.forget(); + // at last, we have the complete match now. move forward, + // convert name particles to tree objects and return: + if (name[0] === '') { + name.shift(); + index.shift(); + } + for (k = 0; k < name.length; k++) { + s = name[k]; + name[k] = (s.charAt(0) !== '@' && s.charAt(0) !== '$') ? + new (tree.Keyword)(s) : + (s.charAt(0) === '@' ? + new (tree.Variable)("@" + s.slice(2, -1), index[k], fileInfo) : + new (tree.Property)("$" + s.slice(2, -1), index[k], fileInfo)); + } + return name; + } + parserInput.restore(); + } + } + }; + }; + Parser.serializeVars = function (vars) { + var s = ''; + for (var name_1 in vars) { + if (Object.hasOwnProperty.call(vars, name_1)) { + var value = vars[name_1]; + s += ((name_1[0] === '@') ? '' : '@') + name_1 + ": " + value + ((String(value).slice(-1) === ';') ? '' : ';'); + } + } + return s; + }; - function boolean(condition) { - return condition ? Keyword.True : Keyword.False; - } - /** - * Functions with evalArgs set to false are sent context - * as the first argument. - */ - function If(context, condition, trueValue, falseValue) { - return condition.eval(context) ? trueValue.eval(context) - : (falseValue ? falseValue.eval(context) : new Anonymous); - } - If.evalArgs = false; - var boolean$1 = { boolean: boolean, 'if': If }; + function boolean(condition) { + return condition ? Keyword.True : Keyword.False; + } + /** + * Functions with evalArgs set to false are sent context + * as the first argument. + */ + function If(context, condition, trueValue, falseValue) { + return condition.eval(context) ? trueValue.eval(context) + : (falseValue ? falseValue.eval(context) : new Anonymous); + } + If.evalArgs = false; + var boolean$1 = { boolean: boolean, 'if': If }; - var colorFunctions; - function clamp$1(val) { - return Math.min(1, Math.max(0, val)); - } - function hsla(origColor, hsl) { - var color = colorFunctions.hsla(hsl.h, hsl.s, hsl.l, hsl.a); - if (color) { - if (origColor.value && - /^(rgb|hsl)/.test(origColor.value)) { - color.value = origColor.value; - } - else { - color.value = 'rgb'; - } - return color; - } - } - function toHSL(color) { - if (color.toHSL) { - return color.toHSL(); - } - else { - throw new Error('Argument cannot be evaluated to a color'); - } - } - function toHSV(color) { - if (color.toHSV) { - return color.toHSV(); - } - else { - throw new Error('Argument cannot be evaluated to a color'); - } - } - function number(n) { - if (n instanceof Dimension) { - return parseFloat(n.unit.is('%') ? n.value / 100 : n.value); - } - else if (typeof n === 'number') { - return n; - } - else { - throw { - type: 'Argument', - message: 'color functions take numbers as parameters' - }; - } - } - function scaled(n, size) { - if (n instanceof Dimension && n.unit.is('%')) { - return parseFloat(n.value * size / 100); - } - else { - return number(n); - } - } - colorFunctions = { - rgb: function (r, g, b) { - var color = colorFunctions.rgba(r, g, b, 1.0); - if (color) { - color.value = 'rgb'; - return color; - } - }, - rgba: function (r, g, b, a) { - try { - if (r instanceof Color) { - if (g) { - a = number(g); - } - else { - a = r.alpha; - } - return new Color(r.rgb, a, 'rgba'); - } - var rgb = [r, g, b].map(function (c) { return scaled(c, 255); }); - a = number(a); - return new Color(rgb, a, 'rgba'); - } - catch (e) { } - }, - hsl: function (h, s, l) { - var color = colorFunctions.hsla(h, s, l, 1.0); - if (color) { - color.value = 'hsl'; - return color; - } - }, - hsla: function (h, s, l, a) { - try { - if (h instanceof Color) { - if (s) { - a = number(s); - } - else { - a = h.alpha; - } - return new Color(h.rgb, a, 'hsla'); - } - var m1_1; - var m2_1; - function hue(h) { - h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h); - if (h * 6 < 1) { - return m1_1 + (m2_1 - m1_1) * h * 6; - } - else if (h * 2 < 1) { - return m2_1; - } - else if (h * 3 < 2) { - return m1_1 + (m2_1 - m1_1) * (2 / 3 - h) * 6; - } - else { - return m1_1; - } - } - h = (number(h) % 360) / 360; - s = clamp$1(number(s)); - l = clamp$1(number(l)); - a = clamp$1(number(a)); - m2_1 = l <= 0.5 ? l * (s + 1) : l + s - l * s; - m1_1 = l * 2 - m2_1; - var rgb = [ - hue(h + 1 / 3) * 255, - hue(h) * 255, - hue(h - 1 / 3) * 255 - ]; - a = number(a); - return new Color(rgb, a, 'hsla'); - } - catch (e) { } - }, - hsv: function (h, s, v) { - return colorFunctions.hsva(h, s, v, 1.0); - }, - hsva: function (h, s, v, a) { - h = ((number(h) % 360) / 360) * 360; - s = number(s); - v = number(v); - a = number(a); - var i; - var f; - i = Math.floor((h / 60) % 6); - f = (h / 60) - i; - var vs = [v, - v * (1 - s), - v * (1 - f * s), - v * (1 - (1 - f) * s)]; - var perm = [[0, 3, 1], - [2, 0, 1], - [1, 0, 3], - [1, 2, 0], - [3, 1, 0], - [0, 1, 2]]; - return colorFunctions.rgba(vs[perm[i][0]] * 255, vs[perm[i][1]] * 255, vs[perm[i][2]] * 255, a); - }, - hue: function (color) { - return new Dimension(toHSL(color).h); - }, - saturation: function (color) { - return new Dimension(toHSL(color).s * 100, '%'); - }, - lightness: function (color) { - return new Dimension(toHSL(color).l * 100, '%'); - }, - hsvhue: function (color) { - return new Dimension(toHSV(color).h); - }, - hsvsaturation: function (color) { - return new Dimension(toHSV(color).s * 100, '%'); - }, - hsvvalue: function (color) { - return new Dimension(toHSV(color).v * 100, '%'); - }, - red: function (color) { - return new Dimension(color.rgb[0]); - }, - green: function (color) { - return new Dimension(color.rgb[1]); - }, - blue: function (color) { - return new Dimension(color.rgb[2]); - }, - alpha: function (color) { - return new Dimension(toHSL(color).a); - }, - luma: function (color) { - return new Dimension(color.luma() * color.alpha * 100, '%'); - }, - luminance: function (color) { - var luminance = (0.2126 * color.rgb[0] / 255) + - (0.7152 * color.rgb[1] / 255) + - (0.0722 * color.rgb[2] / 255); - return new Dimension(luminance * color.alpha * 100, '%'); - }, - saturate: function (color, amount, method) { - // filter: saturate(3.2); - // should be kept as is, so check for color - if (!color.rgb) { - return null; - } - var hsl = toHSL(color); - if (typeof method !== 'undefined' && method.value === 'relative') { - hsl.s += hsl.s * amount.value / 100; - } - else { - hsl.s += amount.value / 100; - } - hsl.s = clamp$1(hsl.s); - return hsla(color, hsl); - }, - desaturate: function (color, amount, method) { - var hsl = toHSL(color); - if (typeof method !== 'undefined' && method.value === 'relative') { - hsl.s -= hsl.s * amount.value / 100; - } - else { - hsl.s -= amount.value / 100; - } - hsl.s = clamp$1(hsl.s); - return hsla(color, hsl); - }, - lighten: function (color, amount, method) { - var hsl = toHSL(color); - if (typeof method !== 'undefined' && method.value === 'relative') { - hsl.l += hsl.l * amount.value / 100; - } - else { - hsl.l += amount.value / 100; - } - hsl.l = clamp$1(hsl.l); - return hsla(color, hsl); - }, - darken: function (color, amount, method) { - var hsl = toHSL(color); - if (typeof method !== 'undefined' && method.value === 'relative') { - hsl.l -= hsl.l * amount.value / 100; - } - else { - hsl.l -= amount.value / 100; - } - hsl.l = clamp$1(hsl.l); - return hsla(color, hsl); - }, - fadein: function (color, amount, method) { - var hsl = toHSL(color); - if (typeof method !== 'undefined' && method.value === 'relative') { - hsl.a += hsl.a * amount.value / 100; - } - else { - hsl.a += amount.value / 100; - } - hsl.a = clamp$1(hsl.a); - return hsla(color, hsl); - }, - fadeout: function (color, amount, method) { - var hsl = toHSL(color); - if (typeof method !== 'undefined' && method.value === 'relative') { - hsl.a -= hsl.a * amount.value / 100; - } - else { - hsl.a -= amount.value / 100; - } - hsl.a = clamp$1(hsl.a); - return hsla(color, hsl); - }, - fade: function (color, amount) { - var hsl = toHSL(color); - hsl.a = amount.value / 100; - hsl.a = clamp$1(hsl.a); - return hsla(color, hsl); - }, - spin: function (color, amount) { - var hsl = toHSL(color); - var hue = (hsl.h + amount.value) % 360; - hsl.h = hue < 0 ? 360 + hue : hue; - return hsla(color, hsl); - }, - // - // Copyright (c) 2006-2009 Hampton Catlin, Natalie Weizenbaum, and Chris Eppstein - // http://sass-lang.com - // - mix: function (color1, color2, weight) { - if (!weight) { - weight = new Dimension(50); - } - var p = weight.value / 100.0; - var w = p * 2 - 1; - var a = toHSL(color1).a - toHSL(color2).a; - var w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; - var w2 = 1 - w1; - var rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2, - color1.rgb[1] * w1 + color2.rgb[1] * w2, - color1.rgb[2] * w1 + color2.rgb[2] * w2]; - var alpha = color1.alpha * p + color2.alpha * (1 - p); - return new Color(rgb, alpha); - }, - greyscale: function (color) { - return colorFunctions.desaturate(color, new Dimension(100)); - }, - contrast: function (color, dark, light, threshold) { - // filter: contrast(3.2); - // should be kept as is, so check for color - if (!color.rgb) { - return null; - } - if (typeof light === 'undefined') { - light = colorFunctions.rgba(255, 255, 255, 1.0); - } - if (typeof dark === 'undefined') { - dark = colorFunctions.rgba(0, 0, 0, 1.0); - } - // Figure out which is actually light and dark: - if (dark.luma() > light.luma()) { - var t = light; - light = dark; - dark = t; - } - if (typeof threshold === 'undefined') { - threshold = 0.43; - } - else { - threshold = number(threshold); - } - if (color.luma() < threshold) { - return light; - } - else { - return dark; - } - }, - // Changes made in 2.7.0 - Reverted in 3.0.0 - // contrast: function (color, color1, color2, threshold) { - // // Return which of `color1` and `color2` has the greatest contrast with `color` - // // according to the standard WCAG contrast ratio calculation. - // // http://www.w3.org/TR/WCAG20/#contrast-ratiodef - // // The threshold param is no longer used, in line with SASS. - // // filter: contrast(3.2); - // // should be kept as is, so check for color - // if (!color.rgb) { - // return null; - // } - // if (typeof color1 === 'undefined') { - // color1 = colorFunctions.rgba(0, 0, 0, 1.0); - // } - // if (typeof color2 === 'undefined') { - // color2 = colorFunctions.rgba(255, 255, 255, 1.0); - // } - // var contrast1, contrast2; - // var luma = color.luma(); - // var luma1 = color1.luma(); - // var luma2 = color2.luma(); - // // Calculate contrast ratios for each color - // if (luma > luma1) { - // contrast1 = (luma + 0.05) / (luma1 + 0.05); - // } else { - // contrast1 = (luma1 + 0.05) / (luma + 0.05); - // } - // if (luma > luma2) { - // contrast2 = (luma + 0.05) / (luma2 + 0.05); - // } else { - // contrast2 = (luma2 + 0.05) / (luma + 0.05); - // } - // if (contrast1 > contrast2) { - // return color1; - // } else { - // return color2; - // } - // }, - argb: function (color) { - return new Anonymous(color.toARGB()); - }, - color: function (c) { - if ((c instanceof Quoted) && - (/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})$/i.test(c.value))) { - var val = c.value.slice(1); - return new Color(val, undefined, "#" + val); - } - if ((c instanceof Color) || (c = Color.fromKeyword(c.value))) { - c.value = undefined; - return c; - } - throw { - type: 'Argument', - message: 'argument must be a color keyword or 3|4|6|8 digit hex e.g. #FFF' - }; - }, - tint: function (color, amount) { - return colorFunctions.mix(colorFunctions.rgb(255, 255, 255), color, amount); - }, - shade: function (color, amount) { - return colorFunctions.mix(colorFunctions.rgb(0, 0, 0), color, amount); - } - }; - var color = colorFunctions; + var colorFunctions; + function clamp$1(val) { + return Math.min(1, Math.max(0, val)); + } + function hsla(origColor, hsl) { + var color = colorFunctions.hsla(hsl.h, hsl.s, hsl.l, hsl.a); + if (color) { + if (origColor.value && + /^(rgb|hsl)/.test(origColor.value)) { + color.value = origColor.value; + } + else { + color.value = 'rgb'; + } + return color; + } + } + function toHSL(color) { + if (color.toHSL) { + return color.toHSL(); + } + else { + throw new Error('Argument cannot be evaluated to a color'); + } + } + function toHSV(color) { + if (color.toHSV) { + return color.toHSV(); + } + else { + throw new Error('Argument cannot be evaluated to a color'); + } + } + function number(n) { + if (n instanceof Dimension) { + return parseFloat(n.unit.is('%') ? n.value / 100 : n.value); + } + else if (typeof n === 'number') { + return n; + } + else { + throw { + type: 'Argument', + message: 'color functions take numbers as parameters' + }; + } + } + function scaled(n, size) { + if (n instanceof Dimension && n.unit.is('%')) { + return parseFloat(n.value * size / 100); + } + else { + return number(n); + } + } + colorFunctions = { + rgb: function (r, g, b) { + var a = 1; + /** + * Comma-less syntax + * e.g. rgb(0 128 255 / 50%) + */ + if (r instanceof Expression) { + var val = r.value; + r = val[0]; + g = val[1]; + b = val[2]; + /** + * @todo - should this be normalized in + * function caller? Or parsed differently? + */ + if (b instanceof Operation) { + var op = b; + b = op.operands[0]; + a = op.operands[1]; + } + } + var color = colorFunctions.rgba(r, g, b, a); + if (color) { + color.value = 'rgb'; + return color; + } + }, + rgba: function (r, g, b, a) { + try { + if (r instanceof Color) { + if (g) { + a = number(g); + } + else { + a = r.alpha; + } + return new Color(r.rgb, a, 'rgba'); + } + var rgb = [r, g, b].map(function (c) { return scaled(c, 255); }); + a = number(a); + return new Color(rgb, a, 'rgba'); + } + catch (e) { } + }, + hsl: function (h, s, l) { + var a = 1; + if (h instanceof Expression) { + var val = h.value; + h = val[0]; + s = val[1]; + l = val[2]; + if (l instanceof Operation) { + var op = l; + l = op.operands[0]; + a = op.operands[1]; + } + } + var color = colorFunctions.hsla(h, s, l, a); + if (color) { + color.value = 'hsl'; + return color; + } + }, + hsla: function (h, s, l, a) { + try { + if (h instanceof Color) { + if (s) { + a = number(s); + } + else { + a = h.alpha; + } + return new Color(h.rgb, a, 'hsla'); + } + var m1_1; + var m2_1; + function hue(h) { + h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h); + if (h * 6 < 1) { + return m1_1 + (m2_1 - m1_1) * h * 6; + } + else if (h * 2 < 1) { + return m2_1; + } + else if (h * 3 < 2) { + return m1_1 + (m2_1 - m1_1) * (2 / 3 - h) * 6; + } + else { + return m1_1; + } + } + h = (number(h) % 360) / 360; + s = clamp$1(number(s)); + l = clamp$1(number(l)); + a = clamp$1(number(a)); + m2_1 = l <= 0.5 ? l * (s + 1) : l + s - l * s; + m1_1 = l * 2 - m2_1; + var rgb = [ + hue(h + 1 / 3) * 255, + hue(h) * 255, + hue(h - 1 / 3) * 255 + ]; + a = number(a); + return new Color(rgb, a, 'hsla'); + } + catch (e) { } + }, + hsv: function (h, s, v) { + return colorFunctions.hsva(h, s, v, 1.0); + }, + hsva: function (h, s, v, a) { + h = ((number(h) % 360) / 360) * 360; + s = number(s); + v = number(v); + a = number(a); + var i; + var f; + i = Math.floor((h / 60) % 6); + f = (h / 60) - i; + var vs = [v, + v * (1 - s), + v * (1 - f * s), + v * (1 - (1 - f) * s)]; + var perm = [[0, 3, 1], + [2, 0, 1], + [1, 0, 3], + [1, 2, 0], + [3, 1, 0], + [0, 1, 2]]; + return colorFunctions.rgba(vs[perm[i][0]] * 255, vs[perm[i][1]] * 255, vs[perm[i][2]] * 255, a); + }, + hue: function (color) { + return new Dimension(toHSL(color).h); + }, + saturation: function (color) { + return new Dimension(toHSL(color).s * 100, '%'); + }, + lightness: function (color) { + return new Dimension(toHSL(color).l * 100, '%'); + }, + hsvhue: function (color) { + return new Dimension(toHSV(color).h); + }, + hsvsaturation: function (color) { + return new Dimension(toHSV(color).s * 100, '%'); + }, + hsvvalue: function (color) { + return new Dimension(toHSV(color).v * 100, '%'); + }, + red: function (color) { + return new Dimension(color.rgb[0]); + }, + green: function (color) { + return new Dimension(color.rgb[1]); + }, + blue: function (color) { + return new Dimension(color.rgb[2]); + }, + alpha: function (color) { + return new Dimension(toHSL(color).a); + }, + luma: function (color) { + return new Dimension(color.luma() * color.alpha * 100, '%'); + }, + luminance: function (color) { + var luminance = (0.2126 * color.rgb[0] / 255) + + (0.7152 * color.rgb[1] / 255) + + (0.0722 * color.rgb[2] / 255); + return new Dimension(luminance * color.alpha * 100, '%'); + }, + saturate: function (color, amount, method) { + // filter: saturate(3.2); + // should be kept as is, so check for color + if (!color.rgb) { + return null; + } + var hsl = toHSL(color); + if (typeof method !== 'undefined' && method.value === 'relative') { + hsl.s += hsl.s * amount.value / 100; + } + else { + hsl.s += amount.value / 100; + } + hsl.s = clamp$1(hsl.s); + return hsla(color, hsl); + }, + desaturate: function (color, amount, method) { + var hsl = toHSL(color); + if (typeof method !== 'undefined' && method.value === 'relative') { + hsl.s -= hsl.s * amount.value / 100; + } + else { + hsl.s -= amount.value / 100; + } + hsl.s = clamp$1(hsl.s); + return hsla(color, hsl); + }, + lighten: function (color, amount, method) { + var hsl = toHSL(color); + if (typeof method !== 'undefined' && method.value === 'relative') { + hsl.l += hsl.l * amount.value / 100; + } + else { + hsl.l += amount.value / 100; + } + hsl.l = clamp$1(hsl.l); + return hsla(color, hsl); + }, + darken: function (color, amount, method) { + var hsl = toHSL(color); + if (typeof method !== 'undefined' && method.value === 'relative') { + hsl.l -= hsl.l * amount.value / 100; + } + else { + hsl.l -= amount.value / 100; + } + hsl.l = clamp$1(hsl.l); + return hsla(color, hsl); + }, + fadein: function (color, amount, method) { + var hsl = toHSL(color); + if (typeof method !== 'undefined' && method.value === 'relative') { + hsl.a += hsl.a * amount.value / 100; + } + else { + hsl.a += amount.value / 100; + } + hsl.a = clamp$1(hsl.a); + return hsla(color, hsl); + }, + fadeout: function (color, amount, method) { + var hsl = toHSL(color); + if (typeof method !== 'undefined' && method.value === 'relative') { + hsl.a -= hsl.a * amount.value / 100; + } + else { + hsl.a -= amount.value / 100; + } + hsl.a = clamp$1(hsl.a); + return hsla(color, hsl); + }, + fade: function (color, amount) { + var hsl = toHSL(color); + hsl.a = amount.value / 100; + hsl.a = clamp$1(hsl.a); + return hsla(color, hsl); + }, + spin: function (color, amount) { + var hsl = toHSL(color); + var hue = (hsl.h + amount.value) % 360; + hsl.h = hue < 0 ? 360 + hue : hue; + return hsla(color, hsl); + }, + // + // Copyright (c) 2006-2009 Hampton Catlin, Natalie Weizenbaum, and Chris Eppstein + // http://sass-lang.com + // + mix: function (color1, color2, weight) { + if (!weight) { + weight = new Dimension(50); + } + var p = weight.value / 100.0; + var w = p * 2 - 1; + var a = toHSL(color1).a - toHSL(color2).a; + var w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; + var w2 = 1 - w1; + var rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2, + color1.rgb[1] * w1 + color2.rgb[1] * w2, + color1.rgb[2] * w1 + color2.rgb[2] * w2]; + var alpha = color1.alpha * p + color2.alpha * (1 - p); + return new Color(rgb, alpha); + }, + greyscale: function (color) { + return colorFunctions.desaturate(color, new Dimension(100)); + }, + contrast: function (color, dark, light, threshold) { + // filter: contrast(3.2); + // should be kept as is, so check for color + if (!color.rgb) { + return null; + } + if (typeof light === 'undefined') { + light = colorFunctions.rgba(255, 255, 255, 1.0); + } + if (typeof dark === 'undefined') { + dark = colorFunctions.rgba(0, 0, 0, 1.0); + } + // Figure out which is actually light and dark: + if (dark.luma() > light.luma()) { + var t = light; + light = dark; + dark = t; + } + if (typeof threshold === 'undefined') { + threshold = 0.43; + } + else { + threshold = number(threshold); + } + if (color.luma() < threshold) { + return light; + } + else { + return dark; + } + }, + // Changes made in 2.7.0 - Reverted in 3.0.0 + // contrast: function (color, color1, color2, threshold) { + // // Return which of `color1` and `color2` has the greatest contrast with `color` + // // according to the standard WCAG contrast ratio calculation. + // // http://www.w3.org/TR/WCAG20/#contrast-ratiodef + // // The threshold param is no longer used, in line with SASS. + // // filter: contrast(3.2); + // // should be kept as is, so check for color + // if (!color.rgb) { + // return null; + // } + // if (typeof color1 === 'undefined') { + // color1 = colorFunctions.rgba(0, 0, 0, 1.0); + // } + // if (typeof color2 === 'undefined') { + // color2 = colorFunctions.rgba(255, 255, 255, 1.0); + // } + // var contrast1, contrast2; + // var luma = color.luma(); + // var luma1 = color1.luma(); + // var luma2 = color2.luma(); + // // Calculate contrast ratios for each color + // if (luma > luma1) { + // contrast1 = (luma + 0.05) / (luma1 + 0.05); + // } else { + // contrast1 = (luma1 + 0.05) / (luma + 0.05); + // } + // if (luma > luma2) { + // contrast2 = (luma + 0.05) / (luma2 + 0.05); + // } else { + // contrast2 = (luma2 + 0.05) / (luma + 0.05); + // } + // if (contrast1 > contrast2) { + // return color1; + // } else { + // return color2; + // } + // }, + argb: function (color) { + return new Anonymous(color.toARGB()); + }, + color: function (c) { + if ((c instanceof Quoted) && + (/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})$/i.test(c.value))) { + var val = c.value.slice(1); + return new Color(val, undefined, "#" + val); + } + if ((c instanceof Color) || (c = Color.fromKeyword(c.value))) { + c.value = undefined; + return c; + } + throw { + type: 'Argument', + message: 'argument must be a color keyword or 3|4|6|8 digit hex e.g. #FFF' + }; + }, + tint: function (color, amount) { + return colorFunctions.mix(colorFunctions.rgb(255, 255, 255), color, amount); + }, + shade: function (color, amount) { + return colorFunctions.mix(colorFunctions.rgb(0, 0, 0), color, amount); + } + }; + var color = colorFunctions; - // Color Blending - // ref: http://www.w3.org/TR/compositing-1 - function colorBlend(mode, color1, color2) { - var ab = color1.alpha; // result - var // backdrop - cb; - var as = color2.alpha; - var // source - cs; - var ar; - var cr; - var r = []; - ar = as + ab * (1 - as); - for (var i = 0; i < 3; i++) { - cb = color1.rgb[i] / 255; - cs = color2.rgb[i] / 255; - cr = mode(cb, cs); - if (ar) { - cr = (as * cs + ab * (cb - - as * (cb + cs - cr))) / ar; - } - r[i] = cr * 255; - } - return new Color(r, ar); - } - var colorBlendModeFunctions = { - multiply: function (cb, cs) { - return cb * cs; - }, - screen: function (cb, cs) { - return cb + cs - cb * cs; - }, - overlay: function (cb, cs) { - cb *= 2; - return (cb <= 1) ? - colorBlendModeFunctions.multiply(cb, cs) : - colorBlendModeFunctions.screen(cb - 1, cs); - }, - softlight: function (cb, cs) { - var d = 1; - var e = cb; - if (cs > 0.5) { - e = 1; - d = (cb > 0.25) ? Math.sqrt(cb) - : ((16 * cb - 12) * cb + 4) * cb; - } - return cb - (1 - 2 * cs) * e * (d - cb); - }, - hardlight: function (cb, cs) { - return colorBlendModeFunctions.overlay(cs, cb); - }, - difference: function (cb, cs) { - return Math.abs(cb - cs); - }, - exclusion: function (cb, cs) { - return cb + cs - 2 * cb * cs; - }, - // non-w3c functions: - average: function (cb, cs) { - return (cb + cs) / 2; - }, - negation: function (cb, cs) { - return 1 - Math.abs(cb + cs - 1); - } - }; - for (var f in colorBlendModeFunctions) { - if (colorBlendModeFunctions.hasOwnProperty(f)) { - colorBlend[f] = colorBlend.bind(null, colorBlendModeFunctions[f]); - } - } + // Color Blending + // ref: http://www.w3.org/TR/compositing-1 + function colorBlend(mode, color1, color2) { + var ab = color1.alpha; // result + var // backdrop + cb; + var as = color2.alpha; + var // source + cs; + var ar; + var cr; + var r = []; + ar = as + ab * (1 - as); + for (var i = 0; i < 3; i++) { + cb = color1.rgb[i] / 255; + cs = color2.rgb[i] / 255; + cr = mode(cb, cs); + if (ar) { + cr = (as * cs + ab * (cb - + as * (cb + cs - cr))) / ar; + } + r[i] = cr * 255; + } + return new Color(r, ar); + } + var colorBlendModeFunctions = { + multiply: function (cb, cs) { + return cb * cs; + }, + screen: function (cb, cs) { + return cb + cs - cb * cs; + }, + overlay: function (cb, cs) { + cb *= 2; + return (cb <= 1) ? + colorBlendModeFunctions.multiply(cb, cs) : + colorBlendModeFunctions.screen(cb - 1, cs); + }, + softlight: function (cb, cs) { + var d = 1; + var e = cb; + if (cs > 0.5) { + e = 1; + d = (cb > 0.25) ? Math.sqrt(cb) + : ((16 * cb - 12) * cb + 4) * cb; + } + return cb - (1 - 2 * cs) * e * (d - cb); + }, + hardlight: function (cb, cs) { + return colorBlendModeFunctions.overlay(cs, cb); + }, + difference: function (cb, cs) { + return Math.abs(cb - cs); + }, + exclusion: function (cb, cs) { + return cb + cs - 2 * cb * cs; + }, + // non-w3c functions: + average: function (cb, cs) { + return (cb + cs) / 2; + }, + negation: function (cb, cs) { + return 1 - Math.abs(cb + cs - 1); + } + }; + for (var f in colorBlendModeFunctions) { + if (colorBlendModeFunctions.hasOwnProperty(f)) { + colorBlend[f] = colorBlend.bind(null, colorBlendModeFunctions[f]); + } + } - var dataUri = (function (environment) { - var fallback = function (functionThis, node) { return new URL(node, functionThis.index, functionThis.currentFileInfo).eval(functionThis.context); }; - return { 'data-uri': function (mimetypeNode, filePathNode) { - if (!filePathNode) { - filePathNode = mimetypeNode; - mimetypeNode = null; - } - var mimetype = mimetypeNode && mimetypeNode.value; - var filePath = filePathNode.value; - var currentFileInfo = this.currentFileInfo; - var currentDirectory = currentFileInfo.rewriteUrls ? - currentFileInfo.currentDirectory : currentFileInfo.entryPath; - var fragmentStart = filePath.indexOf('#'); - var fragment = ''; - if (fragmentStart !== -1) { - fragment = filePath.slice(fragmentStart); - filePath = filePath.slice(0, fragmentStart); - } - var context = clone(this.context); - context.rawBuffer = true; - var fileManager = environment.getFileManager(filePath, currentDirectory, context, environment, true); - if (!fileManager) { - return fallback(this, filePathNode); - } - var useBase64 = false; - // detect the mimetype if not given - if (!mimetypeNode) { - mimetype = environment.mimeLookup(filePath); - if (mimetype === 'image/svg+xml') { - useBase64 = false; - } - else { - // use base 64 unless it's an ASCII or UTF-8 format - var charset = environment.charsetLookup(mimetype); - useBase64 = ['US-ASCII', 'UTF-8'].indexOf(charset) < 0; - } - if (useBase64) { - mimetype += ';base64'; - } - } - else { - useBase64 = /;base64$/.test(mimetype); - } - var fileSync = fileManager.loadFileSync(filePath, currentDirectory, context, environment); - if (!fileSync.contents) { - logger.warn("Skipped data-uri embedding of " + filePath + " because file not found"); - return fallback(this, filePathNode || mimetypeNode); - } - var buf = fileSync.contents; - if (useBase64 && !environment.encodeBase64) { - return fallback(this, filePathNode); - } - buf = useBase64 ? environment.encodeBase64(buf) : encodeURIComponent(buf); - var uri = "data:" + mimetype + "," + buf + fragment; - return new URL(new Quoted("\"" + uri + "\"", uri, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo); - } }; - }); + var dataUri = (function (environment) { + var fallback = function (functionThis, node) { return new URL(node, functionThis.index, functionThis.currentFileInfo).eval(functionThis.context); }; + return { 'data-uri': function (mimetypeNode, filePathNode) { + if (!filePathNode) { + filePathNode = mimetypeNode; + mimetypeNode = null; + } + var mimetype = mimetypeNode && mimetypeNode.value; + var filePath = filePathNode.value; + var currentFileInfo = this.currentFileInfo; + var currentDirectory = currentFileInfo.rewriteUrls ? + currentFileInfo.currentDirectory : currentFileInfo.entryPath; + var fragmentStart = filePath.indexOf('#'); + var fragment = ''; + if (fragmentStart !== -1) { + fragment = filePath.slice(fragmentStart); + filePath = filePath.slice(0, fragmentStart); + } + var context = clone(this.context); + context.rawBuffer = true; + var fileManager = environment.getFileManager(filePath, currentDirectory, context, environment, true); + if (!fileManager) { + return fallback(this, filePathNode); + } + var useBase64 = false; + // detect the mimetype if not given + if (!mimetypeNode) { + mimetype = environment.mimeLookup(filePath); + if (mimetype === 'image/svg+xml') { + useBase64 = false; + } + else { + // use base 64 unless it's an ASCII or UTF-8 format + var charset = environment.charsetLookup(mimetype); + useBase64 = ['US-ASCII', 'UTF-8'].indexOf(charset) < 0; + } + if (useBase64) { + mimetype += ';base64'; + } + } + else { + useBase64 = /;base64$/.test(mimetype); + } + var fileSync = fileManager.loadFileSync(filePath, currentDirectory, context, environment); + if (!fileSync.contents) { + logger.warn("Skipped data-uri embedding of " + filePath + " because file not found"); + return fallback(this, filePathNode || mimetypeNode); + } + var buf = fileSync.contents; + if (useBase64 && !environment.encodeBase64) { + return fallback(this, filePathNode); + } + buf = useBase64 ? environment.encodeBase64(buf) : encodeURIComponent(buf); + var uri = "data:" + mimetype + "," + buf + fragment; + return new URL(new Quoted("\"" + uri + "\"", uri, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo); + } }; + }); - var getItemsFromNode = function (node) { - // handle non-array values as an array of length 1 - // return 'undefined' if index is invalid - var items = Array.isArray(node.value) ? - node.value : Array(node); - return items; - }; - var list = { - _SELF: function (n) { - return n; - }, - extract: function (values, index) { - // (1-based index) - index = index.value - 1; - return getItemsFromNode(values)[index]; - }, - length: function (values) { - return new Dimension(getItemsFromNode(values).length); - }, - /** - * Creates a Less list of incremental values. - * Modeled after Lodash's range function, also exists natively in PHP - * - * @param {Dimension} [start=1] - * @param {Dimension} end - e.g. 10 or 10px - unit is added to output - * @param {Dimension} [step=1] - */ - range: function (start, end, step) { - var from; - var to; - var stepValue = 1; - var list = []; - if (end) { - to = end; - from = start.value; - if (step) { - stepValue = step.value; - } - } - else { - from = 1; - to = start; - } - for (var i = from; i <= to.value; i += stepValue) { - list.push(new Dimension(i, to.unit)); - } - return new Expression(list); - }, - each: function (list, rs) { - var rules = []; - var newRules; - var iterator; - if (list.value && !(list instanceof Quoted)) { - if (Array.isArray(list.value)) { - iterator = list.value; - } - else { - iterator = [list.value]; - } - } - else if (list.ruleset) { - iterator = list.ruleset.rules; - } - else if (list.rules) { - iterator = list.rules; - } - else if (Array.isArray(list)) { - iterator = list; - } - else { - iterator = [list]; - } - var valueName = '@value'; - var keyName = '@key'; - var indexName = '@index'; - if (rs.params) { - valueName = rs.params[0] && rs.params[0].name; - keyName = rs.params[1] && rs.params[1].name; - indexName = rs.params[2] && rs.params[2].name; - rs = rs.rules; - } - else { - rs = rs.ruleset; - } - for (var i = 0; i < iterator.length; i++) { - var key = void 0; - var value = void 0; - var item = iterator[i]; - if (item instanceof Declaration) { - key = typeof item.name === 'string' ? item.name : item.name[0].value; - value = item.value; - } - else { - key = new Dimension(i + 1); - value = item; - } - if (item instanceof Comment) { - continue; - } - newRules = rs.rules.slice(0); - if (valueName) { - newRules.push(new Declaration(valueName, value, false, false, this.index, this.currentFileInfo)); - } - if (indexName) { - newRules.push(new Declaration(indexName, new Dimension(i + 1), false, false, this.index, this.currentFileInfo)); - } - if (keyName) { - newRules.push(new Declaration(keyName, key, false, false, this.index, this.currentFileInfo)); - } - rules.push(new Ruleset([new (Selector)([new Element("", '&')])], newRules, rs.strictImports, rs.visibilityInfo())); - } - return new Ruleset([new (Selector)([new Element("", '&')])], rules, rs.strictImports, rs.visibilityInfo()).eval(this.context); - } - }; + var getItemsFromNode = function (node) { + // handle non-array values as an array of length 1 + // return 'undefined' if index is invalid + var items = Array.isArray(node.value) ? + node.value : Array(node); + return items; + }; + var list = { + _SELF: function (n) { + return n; + }, + '~': function () { + var expr = []; + for (var _i = 0; _i < arguments.length; _i++) { + expr[_i] = arguments[_i]; + } + if (expr.length === 1) { + return expr[0]; + } + return new Value(expr); + }, + extract: function (values, index) { + // (1-based index) + index = index.value - 1; + return getItemsFromNode(values)[index]; + }, + length: function (values) { + return new Dimension(getItemsFromNode(values).length); + }, + /** + * Creates a Less list of incremental values. + * Modeled after Lodash's range function, also exists natively in PHP + * + * @param {Dimension} [start=1] + * @param {Dimension} end - e.g. 10 or 10px - unit is added to output + * @param {Dimension} [step=1] + */ + range: function (start, end, step) { + var from; + var to; + var stepValue = 1; + var list = []; + if (end) { + to = end; + from = start.value; + if (step) { + stepValue = step.value; + } + } + else { + from = 1; + to = start; + } + for (var i = from; i <= to.value; i += stepValue) { + list.push(new Dimension(i, to.unit)); + } + return new Expression(list); + }, + each: function (list, rs) { + var _this = this; + var rules = []; + var newRules; + var iterator; + var tryEval = function (val) { + if (val instanceof Node) { + return val.eval(_this.context); + } + return val; + }; + if (list.value && !(list instanceof Quoted)) { + if (Array.isArray(list.value)) { + iterator = list.value.map(tryEval); + } + else { + iterator = [tryEval(list.value)]; + } + } + else if (list.ruleset) { + iterator = tryEval(list.ruleset).rules; + } + else if (list.rules) { + iterator = list.rules.map(tryEval); + } + else if (Array.isArray(list)) { + iterator = list.map(tryEval); + } + else { + iterator = [tryEval(list)]; + } + var valueName = '@value'; + var keyName = '@key'; + var indexName = '@index'; + if (rs.params) { + valueName = rs.params[0] && rs.params[0].name; + keyName = rs.params[1] && rs.params[1].name; + indexName = rs.params[2] && rs.params[2].name; + rs = rs.rules; + } + else { + rs = rs.ruleset; + } + for (var i = 0; i < iterator.length; i++) { + var key = void 0; + var value = void 0; + var item = iterator[i]; + if (item instanceof Declaration) { + key = typeof item.name === 'string' ? item.name : item.name[0].value; + value = item.value; + } + else { + key = new Dimension(i + 1); + value = item; + } + if (item instanceof Comment) { + continue; + } + newRules = rs.rules.slice(0); + if (valueName) { + newRules.push(new Declaration(valueName, value, false, false, this.index, this.currentFileInfo)); + } + if (indexName) { + newRules.push(new Declaration(indexName, new Dimension(i + 1), false, false, this.index, this.currentFileInfo)); + } + if (keyName) { + newRules.push(new Declaration(keyName, key, false, false, this.index, this.currentFileInfo)); + } + rules.push(new Ruleset([new (Selector)([new Element("", '&')])], newRules, rs.strictImports, rs.visibilityInfo())); + } + return new Ruleset([new (Selector)([new Element("", '&')])], rules, rs.strictImports, rs.visibilityInfo()).eval(this.context); + } + }; - var MathHelper = function (fn, unit, n) { - if (!(n instanceof Dimension)) { - throw { type: 'Argument', message: 'argument must be a number' }; - } - if (unit == null) { - unit = n.unit; - } - else { - n = n.unify(); - } - return new Dimension(fn(parseFloat(n.value)), unit); - }; + var MathHelper = function (fn, unit, n) { + if (!(n instanceof Dimension)) { + throw { type: 'Argument', message: 'argument must be a number' }; + } + if (unit == null) { + unit = n.unit; + } + else { + n = n.unify(); + } + return new Dimension(fn(parseFloat(n.value)), unit); + }; - var mathFunctions = { - // name, unit - ceil: null, - floor: null, - sqrt: null, - abs: null, - tan: '', - sin: '', - cos: '', - atan: 'rad', - asin: 'rad', - acos: 'rad' - }; - for (var f$1 in mathFunctions) { - if (mathFunctions.hasOwnProperty(f$1)) { - mathFunctions[f$1] = MathHelper.bind(null, Math[f$1], mathFunctions[f$1]); - } - } - mathFunctions.round = function (n, f) { - var fraction = typeof f === 'undefined' ? 0 : f.value; - return MathHelper(function (num) { return num.toFixed(fraction); }, null, n); - }; + var mathFunctions = { + // name, unit + ceil: null, + floor: null, + sqrt: null, + abs: null, + tan: '', + sin: '', + cos: '', + atan: 'rad', + asin: 'rad', + acos: 'rad' + }; + for (var f$1 in mathFunctions) { + if (mathFunctions.hasOwnProperty(f$1)) { + mathFunctions[f$1] = MathHelper.bind(null, Math[f$1], mathFunctions[f$1]); + } + } + mathFunctions.round = function (n, f) { + var fraction = typeof f === 'undefined' ? 0 : f.value; + return MathHelper(function (num) { return num.toFixed(fraction); }, null, n); + }; - var minMax = function (isMin, args) { - args = Array.prototype.slice.call(args); - switch (args.length) { - case 0: throw { type: 'Argument', message: 'one or more arguments required' }; - } - var i; // key is the unit.toString() for unified Dimension values, - var j; - var current; - var currentUnified; - var referenceUnified; - var unit; - var unitStatic; - var unitClone; - var // elems only contains original argument values. - order = []; - var values = {}; - // value is the index into the order array. - for (i = 0; i < args.length; i++) { - current = args[i]; - if (!(current instanceof Dimension)) { - if (Array.isArray(args[i].value)) { - Array.prototype.push.apply(args, Array.prototype.slice.call(args[i].value)); - } - continue; - } - currentUnified = current.unit.toString() === '' && unitClone !== undefined ? new Dimension(current.value, unitClone).unify() : current.unify(); - unit = currentUnified.unit.toString() === '' && unitStatic !== undefined ? unitStatic : currentUnified.unit.toString(); - unitStatic = unit !== '' && unitStatic === undefined || unit !== '' && order[0].unify().unit.toString() === '' ? unit : unitStatic; - unitClone = unit !== '' && unitClone === undefined ? current.unit.toString() : unitClone; - j = values[''] !== undefined && unit !== '' && unit === unitStatic ? values[''] : values[unit]; - if (j === undefined) { - if (unitStatic !== undefined && unit !== unitStatic) { - throw { type: 'Argument', message: 'incompatible types' }; - } - values[unit] = order.length; - order.push(current); - continue; - } - referenceUnified = order[j].unit.toString() === '' && unitClone !== undefined ? new Dimension(order[j].value, unitClone).unify() : order[j].unify(); - if (isMin && currentUnified.value < referenceUnified.value || - !isMin && currentUnified.value > referenceUnified.value) { - order[j] = current; - } - } - if (order.length == 1) { - return order[0]; - } - args = order.map(function (a) { return a.toCSS(this.context); }).join(this.context.compress ? ',' : ', '); - return new Anonymous((isMin ? 'min' : 'max') + "(" + args + ")"); - }; - var number$1 = { - min: function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } - return minMax(true, args); - }, - max: function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } - return minMax(false, args); - }, - convert: function (val, unit) { - return val.convertTo(unit.value); - }, - pi: function () { - return new Dimension(Math.PI); - }, - mod: function (a, b) { - return new Dimension(a.value % b.value, a.unit); - }, - pow: function (x, y) { - if (typeof x === 'number' && typeof y === 'number') { - x = new Dimension(x); - y = new Dimension(y); - } - else if (!(x instanceof Dimension) || !(y instanceof Dimension)) { - throw { type: 'Argument', message: 'arguments must be numbers' }; - } - return new Dimension(Math.pow(x.value, y.value), x.unit); - }, - percentage: function (n) { - var result = MathHelper(function (num) { return num * 100; }, '%', n); - return result; - } - }; + var minMax = function (isMin, args) { + args = Array.prototype.slice.call(args); + switch (args.length) { + case 0: throw { type: 'Argument', message: 'one or more arguments required' }; + } + var i; // key is the unit.toString() for unified Dimension values, + var j; + var current; + var currentUnified; + var referenceUnified; + var unit; + var unitStatic; + var unitClone; + var // elems only contains original argument values. + order = []; + var values = {}; + // value is the index into the order array. + for (i = 0; i < args.length; i++) { + current = args[i]; + if (!(current instanceof Dimension)) { + if (Array.isArray(args[i].value)) { + Array.prototype.push.apply(args, Array.prototype.slice.call(args[i].value)); + } + continue; + } + currentUnified = current.unit.toString() === '' && unitClone !== undefined ? new Dimension(current.value, unitClone).unify() : current.unify(); + unit = currentUnified.unit.toString() === '' && unitStatic !== undefined ? unitStatic : currentUnified.unit.toString(); + unitStatic = unit !== '' && unitStatic === undefined || unit !== '' && order[0].unify().unit.toString() === '' ? unit : unitStatic; + unitClone = unit !== '' && unitClone === undefined ? current.unit.toString() : unitClone; + j = values[''] !== undefined && unit !== '' && unit === unitStatic ? values[''] : values[unit]; + if (j === undefined) { + if (unitStatic !== undefined && unit !== unitStatic) { + throw { type: 'Argument', message: 'incompatible types' }; + } + values[unit] = order.length; + order.push(current); + continue; + } + referenceUnified = order[j].unit.toString() === '' && unitClone !== undefined ? new Dimension(order[j].value, unitClone).unify() : order[j].unify(); + if (isMin && currentUnified.value < referenceUnified.value || + !isMin && currentUnified.value > referenceUnified.value) { + order[j] = current; + } + } + if (order.length == 1) { + return order[0]; + } + args = order.map(function (a) { return a.toCSS(this.context); }).join(this.context.compress ? ',' : ', '); + return new Anonymous((isMin ? 'min' : 'max') + "(" + args + ")"); + }; + var number$1 = { + min: function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + try { + return minMax(true, args); + } + catch (e) { } + }, + max: function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + try { + return minMax(false, args); + } + catch (e) { } + }, + convert: function (val, unit) { + return val.convertTo(unit.value); + }, + pi: function () { + return new Dimension(Math.PI); + }, + mod: function (a, b) { + return new Dimension(a.value % b.value, a.unit); + }, + pow: function (x, y) { + if (typeof x === 'number' && typeof y === 'number') { + x = new Dimension(x); + y = new Dimension(y); + } + else if (!(x instanceof Dimension) || !(y instanceof Dimension)) { + throw { type: 'Argument', message: 'arguments must be numbers' }; + } + return new Dimension(Math.pow(x.value, y.value), x.unit); + }, + percentage: function (n) { + var result = MathHelper(function (num) { return num * 100; }, '%', n); + return result; + } + }; - var string = { - e: function (str) { - return new Quoted('"', str instanceof JavaScript ? str.evaluated : str.value, true); - }, - escape: function (str) { - return new Anonymous(encodeURI(str.value).replace(/=/g, '%3D').replace(/:/g, '%3A').replace(/#/g, '%23').replace(/;/g, '%3B') - .replace(/\(/g, '%28').replace(/\)/g, '%29')); - }, - replace: function (string, pattern, replacement, flags) { - var result = string.value; - replacement = (replacement.type === 'Quoted') ? - replacement.value : replacement.toCSS(); - result = result.replace(new RegExp(pattern.value, flags ? flags.value : ''), replacement); - return new Quoted(string.quote || '', result, string.escaped); - }, - '%': function (string /* arg, arg, ... */) { - var args = Array.prototype.slice.call(arguments, 1); - var result = string.value; - var _loop_1 = function (i) { - /* jshint loopfunc:true */ - result = result.replace(/%[sda]/i, function (token) { - var value = ((args[i].type === 'Quoted') && - token.match(/s/i)) ? args[i].value : args[i].toCSS(); - return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value; - }); - }; - for (var i = 0; i < args.length; i++) { - _loop_1(i); - } - result = result.replace(/%%/g, '%'); - return new Quoted(string.quote || '', result, string.escaped); - } - }; + var string = { + e: function (str) { + return new Quoted('"', str instanceof JavaScript ? str.evaluated : str.value, true); + }, + escape: function (str) { + return new Anonymous(encodeURI(str.value).replace(/=/g, '%3D').replace(/:/g, '%3A').replace(/#/g, '%23').replace(/;/g, '%3B') + .replace(/\(/g, '%28').replace(/\)/g, '%29')); + }, + replace: function (string, pattern, replacement, flags) { + var result = string.value; + replacement = (replacement.type === 'Quoted') ? + replacement.value : replacement.toCSS(); + result = result.replace(new RegExp(pattern.value, flags ? flags.value : ''), replacement); + return new Quoted(string.quote || '', result, string.escaped); + }, + '%': function (string /* arg, arg, ... */) { + var args = Array.prototype.slice.call(arguments, 1); + var result = string.value; + var _loop_1 = function (i) { + /* jshint loopfunc:true */ + result = result.replace(/%[sda]/i, function (token) { + var value = ((args[i].type === 'Quoted') && + token.match(/s/i)) ? args[i].value : args[i].toCSS(); + return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value; + }); + }; + for (var i = 0; i < args.length; i++) { + _loop_1(i); + } + result = result.replace(/%%/g, '%'); + return new Quoted(string.quote || '', result, string.escaped); + } + }; - var svg = (function (environment) { - return { 'svg-gradient': function (direction) { - var stops; - var gradientDirectionSvg; - var gradientType = 'linear'; - var rectangleDimension = 'x="0" y="0" width="1" height="1"'; - var renderEnv = { compress: false }; - var returner; - var directionValue = direction.toCSS(renderEnv); - var i; - var color; - var position; - var positionValue; - var alpha; - function throwArgumentDescriptor() { - throw { type: 'Argument', - message: 'svg-gradient expects direction, start_color [start_position], [color position,]...,' + - ' end_color [end_position] or direction, color list' }; - } - if (arguments.length == 2) { - if (arguments[1].value.length < 2) { - throwArgumentDescriptor(); - } - stops = arguments[1].value; - } - else if (arguments.length < 3) { - throwArgumentDescriptor(); - } - else { - stops = Array.prototype.slice.call(arguments, 1); - } - switch (directionValue) { - case 'to bottom': - gradientDirectionSvg = 'x1="0%" y1="0%" x2="0%" y2="100%"'; - break; - case 'to right': - gradientDirectionSvg = 'x1="0%" y1="0%" x2="100%" y2="0%"'; - break; - case 'to bottom right': - gradientDirectionSvg = 'x1="0%" y1="0%" x2="100%" y2="100%"'; - break; - case 'to top right': - gradientDirectionSvg = 'x1="0%" y1="100%" x2="100%" y2="0%"'; - break; - case 'ellipse': - case 'ellipse at center': - gradientType = 'radial'; - gradientDirectionSvg = 'cx="50%" cy="50%" r="75%"'; - rectangleDimension = 'x="-50" y="-50" width="101" height="101"'; - break; - default: - throw { type: 'Argument', message: 'svg-gradient direction must be \'to bottom\', \'to right\',' + - ' \'to bottom right\', \'to top right\' or \'ellipse at center\'' }; - } - returner = "<" + gradientType + "Gradient id=\"g\" " + gradientDirectionSvg + ">"; - for (i = 0; i < stops.length; i += 1) { - if (stops[i] instanceof Expression) { - color = stops[i].value[0]; - position = stops[i].value[1]; - } - else { - color = stops[i]; - position = undefined; - } - if (!(color instanceof Color) || (!((i === 0 || i + 1 === stops.length) && position === undefined) && !(position instanceof Dimension))) { - throwArgumentDescriptor(); - } - positionValue = position ? position.toCSS(renderEnv) : i === 0 ? '0%' : '100%'; - alpha = color.alpha; - returner += ""; - } - returner += ""; - returner = encodeURIComponent(returner); - returner = "data:image/svg+xml," + returner; - return new URL(new Quoted("'" + returner + "'", returner, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo); - } }; - }); + var svg = (function (environment) { + return { 'svg-gradient': function (direction) { + var stops; + var gradientDirectionSvg; + var gradientType = 'linear'; + var rectangleDimension = 'x="0" y="0" width="1" height="1"'; + var renderEnv = { compress: false }; + var returner; + var directionValue = direction.toCSS(renderEnv); + var i; + var color; + var position; + var positionValue; + var alpha; + function throwArgumentDescriptor() { + throw { type: 'Argument', + message: 'svg-gradient expects direction, start_color [start_position], [color position,]...,' + + ' end_color [end_position] or direction, color list' }; + } + if (arguments.length == 2) { + if (arguments[1].value.length < 2) { + throwArgumentDescriptor(); + } + stops = arguments[1].value; + } + else if (arguments.length < 3) { + throwArgumentDescriptor(); + } + else { + stops = Array.prototype.slice.call(arguments, 1); + } + switch (directionValue) { + case 'to bottom': + gradientDirectionSvg = 'x1="0%" y1="0%" x2="0%" y2="100%"'; + break; + case 'to right': + gradientDirectionSvg = 'x1="0%" y1="0%" x2="100%" y2="0%"'; + break; + case 'to bottom right': + gradientDirectionSvg = 'x1="0%" y1="0%" x2="100%" y2="100%"'; + break; + case 'to top right': + gradientDirectionSvg = 'x1="0%" y1="100%" x2="100%" y2="0%"'; + break; + case 'ellipse': + case 'ellipse at center': + gradientType = 'radial'; + gradientDirectionSvg = 'cx="50%" cy="50%" r="75%"'; + rectangleDimension = 'x="-50" y="-50" width="101" height="101"'; + break; + default: + throw { type: 'Argument', message: 'svg-gradient direction must be \'to bottom\', \'to right\',' + + ' \'to bottom right\', \'to top right\' or \'ellipse at center\'' }; + } + returner = "<" + gradientType + "Gradient id=\"g\" " + gradientDirectionSvg + ">"; + for (i = 0; i < stops.length; i += 1) { + if (stops[i] instanceof Expression) { + color = stops[i].value[0]; + position = stops[i].value[1]; + } + else { + color = stops[i]; + position = undefined; + } + if (!(color instanceof Color) || (!((i === 0 || i + 1 === stops.length) && position === undefined) && !(position instanceof Dimension))) { + throwArgumentDescriptor(); + } + positionValue = position ? position.toCSS(renderEnv) : i === 0 ? '0%' : '100%'; + alpha = color.alpha; + returner += ""; + } + returner += ""; + returner = encodeURIComponent(returner); + returner = "data:image/svg+xml," + returner; + return new URL(new Quoted("'" + returner + "'", returner, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo); + } }; + }); - var isa = function (n, Type) { return (n instanceof Type) ? Keyword.True : Keyword.False; }; - var isunit = function (n, unit) { - if (unit === undefined) { - throw { type: 'Argument', message: 'missing the required second argument to isunit.' }; - } - unit = typeof unit.value === 'string' ? unit.value : unit; - if (typeof unit !== 'string') { - throw { type: 'Argument', message: 'Second argument to isunit should be a unit or a string.' }; - } - return (n instanceof Dimension) && n.unit.is(unit) ? Keyword.True : Keyword.False; - }; - var types = { - isruleset: function (n) { - return isa(n, DetachedRuleset); - }, - iscolor: function (n) { - return isa(n, Color); - }, - isnumber: function (n) { - return isa(n, Dimension); - }, - isstring: function (n) { - return isa(n, Quoted); - }, - iskeyword: function (n) { - return isa(n, Keyword); - }, - isurl: function (n) { - return isa(n, URL); - }, - ispixel: function (n) { - return isunit(n, 'px'); - }, - ispercentage: function (n) { - return isunit(n, '%'); - }, - isem: function (n) { - return isunit(n, 'em'); - }, - isunit: isunit, - unit: function (val, unit) { - if (!(val instanceof Dimension)) { - throw { type: 'Argument', message: "the first argument to unit must be a number" + (val instanceof Operation ? '. Have you forgotten parenthesis?' : '') }; - } - if (unit) { - if (unit instanceof Keyword) { - unit = unit.value; - } - else { - unit = unit.toCSS(); - } - } - else { - unit = ''; - } - return new Dimension(val.value, unit); - }, - 'get-unit': function (n) { - return new Anonymous(n.unit); - } - }; + var isa = function (n, Type) { return (n instanceof Type) ? Keyword.True : Keyword.False; }; + var isunit = function (n, unit) { + if (unit === undefined) { + throw { type: 'Argument', message: 'missing the required second argument to isunit.' }; + } + unit = typeof unit.value === 'string' ? unit.value : unit; + if (typeof unit !== 'string') { + throw { type: 'Argument', message: 'Second argument to isunit should be a unit or a string.' }; + } + return (n instanceof Dimension) && n.unit.is(unit) ? Keyword.True : Keyword.False; + }; + var types = { + isruleset: function (n) { + return isa(n, DetachedRuleset); + }, + iscolor: function (n) { + return isa(n, Color); + }, + isnumber: function (n) { + return isa(n, Dimension); + }, + isstring: function (n) { + return isa(n, Quoted); + }, + iskeyword: function (n) { + return isa(n, Keyword); + }, + isurl: function (n) { + return isa(n, URL); + }, + ispixel: function (n) { + return isunit(n, 'px'); + }, + ispercentage: function (n) { + return isunit(n, '%'); + }, + isem: function (n) { + return isunit(n, 'em'); + }, + isunit: isunit, + unit: function (val, unit) { + if (!(val instanceof Dimension)) { + throw { type: 'Argument', message: "the first argument to unit must be a number" + (val instanceof Operation ? '. Have you forgotten parenthesis?' : '') }; + } + if (unit) { + if (unit instanceof Keyword) { + unit = unit.value; + } + else { + unit = unit.toCSS(); + } + } + else { + unit = ''; + } + return new Dimension(val.value, unit); + }, + 'get-unit': function (n) { + return new Anonymous(n.unit); + } + }; - var Functions = (function (environment) { - var functions = { functionRegistry: functionRegistry, functionCaller: functionCaller }; - // register functions - functionRegistry.addMultiple(boolean$1); - functionRegistry.add('default', defaultFunc.eval.bind(defaultFunc)); - functionRegistry.addMultiple(color); - functionRegistry.addMultiple(colorBlend); - functionRegistry.addMultiple(dataUri(environment)); - functionRegistry.addMultiple(list); - functionRegistry.addMultiple(mathFunctions); - functionRegistry.addMultiple(number$1); - functionRegistry.addMultiple(string); - functionRegistry.addMultiple(svg()); - functionRegistry.addMultiple(types); - return functions; - }); + var functions = (function (environment) { + var functions = { functionRegistry: functionRegistry, functionCaller: functionCaller }; + // register functions + functionRegistry.addMultiple(boolean$1); + functionRegistry.add('default', defaultFunc.eval.bind(defaultFunc)); + functionRegistry.addMultiple(color); + functionRegistry.addMultiple(colorBlend); + functionRegistry.addMultiple(dataUri(environment)); + functionRegistry.addMultiple(list); + functionRegistry.addMultiple(mathFunctions); + functionRegistry.addMultiple(number$1); + functionRegistry.addMultiple(string); + functionRegistry.addMultiple(svg()); + functionRegistry.addMultiple(types); + return functions; + }); - var sourceMapOutput = (function (environment) { - var SourceMapOutput = /** @class */ (function () { - function SourceMapOutput(options) { - this._css = []; - this._rootNode = options.rootNode; - this._contentsMap = options.contentsMap; - this._contentsIgnoredCharsMap = options.contentsIgnoredCharsMap; - if (options.sourceMapFilename) { - this._sourceMapFilename = options.sourceMapFilename.replace(/\\/g, '/'); - } - this._outputFilename = options.outputFilename; - this.sourceMapURL = options.sourceMapURL; - if (options.sourceMapBasepath) { - this._sourceMapBasepath = options.sourceMapBasepath.replace(/\\/g, '/'); - } - if (options.sourceMapRootpath) { - this._sourceMapRootpath = options.sourceMapRootpath.replace(/\\/g, '/'); - if (this._sourceMapRootpath.charAt(this._sourceMapRootpath.length - 1) !== '/') { - this._sourceMapRootpath += '/'; - } - } - else { - this._sourceMapRootpath = ''; - } - this._outputSourceFiles = options.outputSourceFiles; - this._sourceMapGeneratorConstructor = environment.getSourceMapGenerator(); - this._lineNumber = 0; - this._column = 0; - } - SourceMapOutput.prototype.removeBasepath = function (path) { - if (this._sourceMapBasepath && path.indexOf(this._sourceMapBasepath) === 0) { - path = path.substring(this._sourceMapBasepath.length); - if (path.charAt(0) === '\\' || path.charAt(0) === '/') { - path = path.substring(1); - } - } - return path; - }; - SourceMapOutput.prototype.normalizeFilename = function (filename) { - filename = filename.replace(/\\/g, '/'); - filename = this.removeBasepath(filename); - return (this._sourceMapRootpath || '') + filename; - }; - SourceMapOutput.prototype.add = function (chunk, fileInfo, index, mapLines) { - // ignore adding empty strings - if (!chunk) { - return; - } - var lines; - var sourceLines; - var columns; - var sourceColumns; - var i; - if (fileInfo && fileInfo.filename) { - var inputSource = this._contentsMap[fileInfo.filename]; - // remove vars/banner added to the top of the file - if (this._contentsIgnoredCharsMap[fileInfo.filename]) { - // adjust the index - index -= this._contentsIgnoredCharsMap[fileInfo.filename]; - if (index < 0) { - index = 0; - } - // adjust the source - inputSource = inputSource.slice(this._contentsIgnoredCharsMap[fileInfo.filename]); - } - // ignore empty content - if (inputSource === undefined) { - return; - } - inputSource = inputSource.substring(0, index); - sourceLines = inputSource.split('\n'); - sourceColumns = sourceLines[sourceLines.length - 1]; - } - lines = chunk.split('\n'); - columns = lines[lines.length - 1]; - if (fileInfo && fileInfo.filename) { - if (!mapLines) { - this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + 1, column: this._column }, - original: { line: sourceLines.length, column: sourceColumns.length }, - source: this.normalizeFilename(fileInfo.filename) }); - } - else { - for (i = 0; i < lines.length; i++) { - this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + i + 1, column: i === 0 ? this._column : 0 }, - original: { line: sourceLines.length + i, column: i === 0 ? sourceColumns.length : 0 }, - source: this.normalizeFilename(fileInfo.filename) }); - } - } - } - if (lines.length === 1) { - this._column += columns.length; - } - else { - this._lineNumber += lines.length - 1; - this._column = columns.length; - } - this._css.push(chunk); - }; - SourceMapOutput.prototype.isEmpty = function () { - return this._css.length === 0; - }; - SourceMapOutput.prototype.toCSS = function (context) { - this._sourceMapGenerator = new this._sourceMapGeneratorConstructor({ file: this._outputFilename, sourceRoot: null }); - if (this._outputSourceFiles) { - for (var filename in this._contentsMap) { - if (this._contentsMap.hasOwnProperty(filename)) { - var source = this._contentsMap[filename]; - if (this._contentsIgnoredCharsMap[filename]) { - source = source.slice(this._contentsIgnoredCharsMap[filename]); - } - this._sourceMapGenerator.setSourceContent(this.normalizeFilename(filename), source); - } - } - } - this._rootNode.genCSS(context, this); - if (this._css.length > 0) { - var sourceMapURL = void 0; - var sourceMapContent = JSON.stringify(this._sourceMapGenerator.toJSON()); - if (this.sourceMapURL) { - sourceMapURL = this.sourceMapURL; - } - else if (this._sourceMapFilename) { - sourceMapURL = this._sourceMapFilename; - } - this.sourceMapURL = sourceMapURL; - this.sourceMap = sourceMapContent; - } - return this._css.join(''); - }; - return SourceMapOutput; - }()); - return SourceMapOutput; - }); + function transformTree (root, options) { + options = options || {}; + var evaldRoot; + var variables = options.variables; + var evalEnv = new contexts.Eval(options); + // + // Allows setting variables with a hash, so: + // + // `{ color: new tree.Color('#f01') }` will become: + // + // new tree.Declaration('@color', + // new tree.Value([ + // new tree.Expression([ + // new tree.Color('#f01') + // ]) + // ]) + // ) + // + if (typeof variables === 'object' && !Array.isArray(variables)) { + variables = Object.keys(variables).map(function (k) { + var value = variables[k]; + if (!(value instanceof tree.Value)) { + if (!(value instanceof tree.Expression)) { + value = new tree.Expression([value]); + } + value = new tree.Value([value]); + } + return new tree.Declaration("@" + k, value, false, null, 0); + }); + evalEnv.frames = [new tree.Ruleset(null, variables)]; + } + var visitors$1 = [ + new visitors.JoinSelectorVisitor(), + new visitors.MarkVisibleSelectorsVisitor(true), + new visitors.ExtendVisitor(), + new visitors.ToCSSVisitor({ compress: Boolean(options.compress) }) + ]; + var preEvalVisitors = []; + var v; + var visitorIterator; + /** + * first() / get() allows visitors to be added while visiting + * + * @todo Add scoping for visitors just like functions for @plugin; right now they're global + */ + if (options.pluginManager) { + visitorIterator = options.pluginManager.visitor(); + for (var i = 0; i < 2; i++) { + visitorIterator.first(); + while ((v = visitorIterator.get())) { + if (v.isPreEvalVisitor) { + if (i === 0 || preEvalVisitors.indexOf(v) === -1) { + preEvalVisitors.push(v); + v.run(root); + } + } + else { + if (i === 0 || visitors$1.indexOf(v) === -1) { + if (v.isPreVisitor) { + visitors$1.unshift(v); + } + else { + visitors$1.push(v); + } + } + } + } + } + } + evaldRoot = root.eval(evalEnv); + for (var i = 0; i < visitors$1.length; i++) { + visitors$1[i].run(evaldRoot); + } + // Run any remaining visitors added after eval pass + if (options.pluginManager) { + visitorIterator.first(); + while ((v = visitorIterator.get())) { + if (visitors$1.indexOf(v) === -1 && preEvalVisitors.indexOf(v) === -1) { + v.run(evaldRoot); + } + } + } + return evaldRoot; + } - var sourceMapBuilder = (function (SourceMapOutput, environment) { - var SourceMapBuilder = /** @class */ (function () { - function SourceMapBuilder(options) { - this.options = options; - } - SourceMapBuilder.prototype.toCSS = function (rootNode, options, imports) { - var sourceMapOutput = new SourceMapOutput({ - contentsIgnoredCharsMap: imports.contentsIgnoredChars, - rootNode: rootNode, - contentsMap: imports.contents, - sourceMapFilename: this.options.sourceMapFilename, - sourceMapURL: this.options.sourceMapURL, - outputFilename: this.options.sourceMapOutputFilename, - sourceMapBasepath: this.options.sourceMapBasepath, - sourceMapRootpath: this.options.sourceMapRootpath, - outputSourceFiles: this.options.outputSourceFiles, - sourceMapGenerator: this.options.sourceMapGenerator, - sourceMapFileInline: this.options.sourceMapFileInline, - disableSourcemapAnnotation: this.options.disableSourcemapAnnotation - }); - var css = sourceMapOutput.toCSS(options); - this.sourceMap = sourceMapOutput.sourceMap; - this.sourceMapURL = sourceMapOutput.sourceMapURL; - if (this.options.sourceMapInputFilename) { - this.sourceMapInputFilename = sourceMapOutput.normalizeFilename(this.options.sourceMapInputFilename); - } - if (this.options.sourceMapBasepath !== undefined && this.sourceMapURL !== undefined) { - this.sourceMapURL = sourceMapOutput.removeBasepath(this.sourceMapURL); - } - return css + this.getCSSAppendage(); - }; - SourceMapBuilder.prototype.getCSSAppendage = function () { - var sourceMapURL = this.sourceMapURL; - if (this.options.sourceMapFileInline) { - if (this.sourceMap === undefined) { - return ''; - } - sourceMapURL = "data:application/json;base64," + environment.encodeBase64(this.sourceMap); - } - if (this.options.disableSourcemapAnnotation) { - return ''; - } - if (sourceMapURL) { - return "/*# sourceMappingURL=" + sourceMapURL + " */"; - } - return ''; - }; - SourceMapBuilder.prototype.getExternalSourceMap = function () { - return this.sourceMap; - }; - SourceMapBuilder.prototype.setExternalSourceMap = function (sourceMap) { - this.sourceMap = sourceMap; - }; - SourceMapBuilder.prototype.isInline = function () { - return this.options.sourceMapFileInline; - }; - SourceMapBuilder.prototype.getSourceMapURL = function () { - return this.sourceMapURL; - }; - SourceMapBuilder.prototype.getOutputFilename = function () { - return this.options.sourceMapOutputFilename; - }; - SourceMapBuilder.prototype.getInputFilename = function () { - return this.sourceMapInputFilename; - }; - return SourceMapBuilder; - }()); - return SourceMapBuilder; - }); + /** + * Plugin Manager + */ + var PluginManager = /** @class */ (function () { + function PluginManager(less) { + this.less = less; + this.visitors = []; + this.preProcessors = []; + this.postProcessors = []; + this.installedPlugins = []; + this.fileManagers = []; + this.iterator = -1; + this.pluginCache = {}; + this.Loader = new less.PluginLoader(less); + } + /** + * Adds all the plugins in the array + * @param {Array} plugins + */ + PluginManager.prototype.addPlugins = function (plugins) { + if (plugins) { + for (var i = 0; i < plugins.length; i++) { + this.addPlugin(plugins[i]); + } + } + }; + /** + * + * @param plugin + * @param {String} filename + */ + PluginManager.prototype.addPlugin = function (plugin, filename, functionRegistry) { + this.installedPlugins.push(plugin); + if (filename) { + this.pluginCache[filename] = plugin; + } + if (plugin.install) { + plugin.install(this.less, this, functionRegistry || this.less.functions.functionRegistry); + } + }; + /** + * + * @param filename + */ + PluginManager.prototype.get = function (filename) { + return this.pluginCache[filename]; + }; + /** + * Adds a visitor. The visitor object has options on itself to determine + * when it should run. + * @param visitor + */ + PluginManager.prototype.addVisitor = function (visitor) { + this.visitors.push(visitor); + }; + /** + * Adds a pre processor object + * @param {object} preProcessor + * @param {number} priority - guidelines 1 = before import, 1000 = import, 2000 = after import + */ + PluginManager.prototype.addPreProcessor = function (preProcessor, priority) { + var indexToInsertAt; + for (indexToInsertAt = 0; indexToInsertAt < this.preProcessors.length; indexToInsertAt++) { + if (this.preProcessors[indexToInsertAt].priority >= priority) { + break; + } + } + this.preProcessors.splice(indexToInsertAt, 0, { preProcessor: preProcessor, priority: priority }); + }; + /** + * Adds a post processor object + * @param {object} postProcessor + * @param {number} priority - guidelines 1 = before compression, 1000 = compression, 2000 = after compression + */ + PluginManager.prototype.addPostProcessor = function (postProcessor, priority) { + var indexToInsertAt; + for (indexToInsertAt = 0; indexToInsertAt < this.postProcessors.length; indexToInsertAt++) { + if (this.postProcessors[indexToInsertAt].priority >= priority) { + break; + } + } + this.postProcessors.splice(indexToInsertAt, 0, { postProcessor: postProcessor, priority: priority }); + }; + /** + * + * @param manager + */ + PluginManager.prototype.addFileManager = function (manager) { + this.fileManagers.push(manager); + }; + /** + * + * @returns {Array} + * @private + */ + PluginManager.prototype.getPreProcessors = function () { + var preProcessors = []; + for (var i = 0; i < this.preProcessors.length; i++) { + preProcessors.push(this.preProcessors[i].preProcessor); + } + return preProcessors; + }; + /** + * + * @returns {Array} + * @private + */ + PluginManager.prototype.getPostProcessors = function () { + var postProcessors = []; + for (var i = 0; i < this.postProcessors.length; i++) { + postProcessors.push(this.postProcessors[i].postProcessor); + } + return postProcessors; + }; + /** + * + * @returns {Array} + * @private + */ + PluginManager.prototype.getVisitors = function () { + return this.visitors; + }; + PluginManager.prototype.visitor = function () { + var self = this; + return { + first: function () { + self.iterator = -1; + return self.visitors[self.iterator]; + }, + get: function () { + self.iterator += 1; + return self.visitors[self.iterator]; + } + }; + }; + /** + * + * @returns {Array} + * @private + */ + PluginManager.prototype.getFileManagers = function () { + return this.fileManagers; + }; + return PluginManager; + }()); + var pm; + var PluginManagerFactory = function (less, newFactory) { + if (newFactory || !pm) { + pm = new PluginManager(less); + } + return pm; + }; - var transformTree = (function (root, options) { - if (options === void 0) { options = {}; } - var evaldRoot; - var variables = options.variables; - var evalEnv = new contexts.Eval(options); - // - // Allows setting variables with a hash, so: - // - // `{ color: new tree.Color('#f01') }` will become: - // - // new tree.Declaration('@color', - // new tree.Value([ - // new tree.Expression([ - // new tree.Color('#f01') - // ]) - // ]) - // ) - // - if (typeof variables === 'object' && !Array.isArray(variables)) { - variables = Object.keys(variables).map(function (k) { - var value = variables[k]; - if (!(value instanceof tree.Value)) { - if (!(value instanceof tree.Expression)) { - value = new tree.Expression([value]); - } - value = new tree.Value([value]); - } - return new tree.Declaration("@" + k, value, false, null, 0); - }); - evalEnv.frames = [new tree.Ruleset(null, variables)]; - } - var visitors$1 = [ - new visitors.JoinSelectorVisitor(), - new visitors.MarkVisibleSelectorsVisitor(true), - new visitors.ExtendVisitor(), - new visitors.ToCSSVisitor({ compress: Boolean(options.compress) }) - ]; - var preEvalVisitors = []; - var v; - var visitorIterator; - /** - * first() / get() allows visitors to be added while visiting - * - * @todo Add scoping for visitors just like functions for @plugin; right now they're global - */ - if (options.pluginManager) { - visitorIterator = options.pluginManager.visitor(); - for (var i = 0; i < 2; i++) { - visitorIterator.first(); - while ((v = visitorIterator.get())) { - if (v.isPreEvalVisitor) { - if (i === 0 || preEvalVisitors.indexOf(v) === -1) { - preEvalVisitors.push(v); - v.run(root); - } - } - else { - if (i === 0 || visitors$1.indexOf(v) === -1) { - if (v.isPreVisitor) { - visitors$1.unshift(v); - } - else { - visitors$1.push(v); - } - } - } - } - } - } - evaldRoot = root.eval(evalEnv); - for (var i = 0; i < visitors$1.length; i++) { - visitors$1[i].run(evaldRoot); - } - // Run any remaining visitors added after eval pass - if (options.pluginManager) { - visitorIterator.first(); - while ((v = visitorIterator.get())) { - if (visitors$1.indexOf(v) === -1 && preEvalVisitors.indexOf(v) === -1) { - v.run(evaldRoot); - } - } - } - return evaldRoot; - }); + function SourceMapOutput (environment) { + var SourceMapOutput = /** @class */ (function () { + function SourceMapOutput(options) { + this._css = []; + this._rootNode = options.rootNode; + this._contentsMap = options.contentsMap; + this._contentsIgnoredCharsMap = options.contentsIgnoredCharsMap; + if (options.sourceMapFilename) { + this._sourceMapFilename = options.sourceMapFilename.replace(/\\/g, '/'); + } + this._outputFilename = options.outputFilename; + this.sourceMapURL = options.sourceMapURL; + if (options.sourceMapBasepath) { + this._sourceMapBasepath = options.sourceMapBasepath.replace(/\\/g, '/'); + } + if (options.sourceMapRootpath) { + this._sourceMapRootpath = options.sourceMapRootpath.replace(/\\/g, '/'); + if (this._sourceMapRootpath.charAt(this._sourceMapRootpath.length - 1) !== '/') { + this._sourceMapRootpath += '/'; + } + } + else { + this._sourceMapRootpath = ''; + } + this._outputSourceFiles = options.outputSourceFiles; + this._sourceMapGeneratorConstructor = environment.getSourceMapGenerator(); + this._lineNumber = 0; + this._column = 0; + } + SourceMapOutput.prototype.removeBasepath = function (path) { + if (this._sourceMapBasepath && path.indexOf(this._sourceMapBasepath) === 0) { + path = path.substring(this._sourceMapBasepath.length); + if (path.charAt(0) === '\\' || path.charAt(0) === '/') { + path = path.substring(1); + } + } + return path; + }; + SourceMapOutput.prototype.normalizeFilename = function (filename) { + filename = filename.replace(/\\/g, '/'); + filename = this.removeBasepath(filename); + return (this._sourceMapRootpath || '') + filename; + }; + SourceMapOutput.prototype.add = function (chunk, fileInfo, index, mapLines) { + // ignore adding empty strings + if (!chunk) { + return; + } + var lines, sourceLines, columns, sourceColumns, i; + if (fileInfo && fileInfo.filename) { + var inputSource = this._contentsMap[fileInfo.filename]; + // remove vars/banner added to the top of the file + if (this._contentsIgnoredCharsMap[fileInfo.filename]) { + // adjust the index + index -= this._contentsIgnoredCharsMap[fileInfo.filename]; + if (index < 0) { + index = 0; + } + // adjust the source + inputSource = inputSource.slice(this._contentsIgnoredCharsMap[fileInfo.filename]); + } + // ignore empty content + if (inputSource === undefined) { + return; + } + inputSource = inputSource.substring(0, index); + sourceLines = inputSource.split('\n'); + sourceColumns = sourceLines[sourceLines.length - 1]; + } + lines = chunk.split('\n'); + columns = lines[lines.length - 1]; + if (fileInfo && fileInfo.filename) { + if (!mapLines) { + this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + 1, column: this._column }, + original: { line: sourceLines.length, column: sourceColumns.length }, + source: this.normalizeFilename(fileInfo.filename) }); + } + else { + for (i = 0; i < lines.length; i++) { + this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + i + 1, column: i === 0 ? this._column : 0 }, + original: { line: sourceLines.length + i, column: i === 0 ? sourceColumns.length : 0 }, + source: this.normalizeFilename(fileInfo.filename) }); + } + } + } + if (lines.length === 1) { + this._column += columns.length; + } + else { + this._lineNumber += lines.length - 1; + this._column = columns.length; + } + this._css.push(chunk); + }; + SourceMapOutput.prototype.isEmpty = function () { + return this._css.length === 0; + }; + SourceMapOutput.prototype.toCSS = function (context) { + this._sourceMapGenerator = new this._sourceMapGeneratorConstructor({ file: this._outputFilename, sourceRoot: null }); + if (this._outputSourceFiles) { + for (var filename in this._contentsMap) { + if (this._contentsMap.hasOwnProperty(filename)) { + var source = this._contentsMap[filename]; + if (this._contentsIgnoredCharsMap[filename]) { + source = source.slice(this._contentsIgnoredCharsMap[filename]); + } + this._sourceMapGenerator.setSourceContent(this.normalizeFilename(filename), source); + } + } + } + this._rootNode.genCSS(context, this); + if (this._css.length > 0) { + var sourceMapURL = void 0; + var sourceMapContent = JSON.stringify(this._sourceMapGenerator.toJSON()); + if (this.sourceMapURL) { + sourceMapURL = this.sourceMapURL; + } + else if (this._sourceMapFilename) { + sourceMapURL = this._sourceMapFilename; + } + this.sourceMapURL = sourceMapURL; + this.sourceMap = sourceMapContent; + } + return this._css.join(''); + }; + return SourceMapOutput; + }()); + return SourceMapOutput; + } - var parseTree = (function (SourceMapBuilder) { - var ParseTree = /** @class */ (function () { - function ParseTree(root, imports) { - this.root = root; - this.imports = imports; - } - ParseTree.prototype.toCSS = function (options) { - var evaldRoot; - var result = {}; - var sourceMapBuilder; - try { - evaldRoot = transformTree(this.root, options); - } - catch (e) { - throw new LessError(e, this.imports); - } - try { - var compress = Boolean(options.compress); - if (compress) { - logger.warn('The compress option has been deprecated. ' + - 'We recommend you use a dedicated css minifier, for instance see less-plugin-clean-css.'); - } - var toCSSOptions = { - compress: compress, - dumpLineNumbers: options.dumpLineNumbers, - strictUnits: Boolean(options.strictUnits), - numPrecision: 8 - }; - if (options.sourceMap) { - sourceMapBuilder = new SourceMapBuilder(options.sourceMap); - result.css = sourceMapBuilder.toCSS(evaldRoot, toCSSOptions, this.imports); - } - else { - result.css = evaldRoot.toCSS(toCSSOptions); - } - } - catch (e) { - throw new LessError(e, this.imports); - } - if (options.pluginManager) { - var postProcessors = options.pluginManager.getPostProcessors(); - for (var i = 0; i < postProcessors.length; i++) { - result.css = postProcessors[i].process(result.css, { sourceMap: sourceMapBuilder, options: options, imports: this.imports }); - } - } - if (options.sourceMap) { - result.map = sourceMapBuilder.getExternalSourceMap(); - } - var rootFilename = this.imports.rootFilename; - result.imports = this.imports.files.filter(function (file) { return file !== rootFilename; }); - return result; - }; - return ParseTree; - }()); - return ParseTree; - }); + function SourceMapBuilder (SourceMapOutput, environment) { + var SourceMapBuilder = /** @class */ (function () { + function SourceMapBuilder(options) { + this.options = options; + } + SourceMapBuilder.prototype.toCSS = function (rootNode, options, imports) { + var sourceMapOutput = new SourceMapOutput({ + contentsIgnoredCharsMap: imports.contentsIgnoredChars, + rootNode: rootNode, + contentsMap: imports.contents, + sourceMapFilename: this.options.sourceMapFilename, + sourceMapURL: this.options.sourceMapURL, + outputFilename: this.options.sourceMapOutputFilename, + sourceMapBasepath: this.options.sourceMapBasepath, + sourceMapRootpath: this.options.sourceMapRootpath, + outputSourceFiles: this.options.outputSourceFiles, + sourceMapGenerator: this.options.sourceMapGenerator, + sourceMapFileInline: this.options.sourceMapFileInline, + disableSourcemapAnnotation: this.options.disableSourcemapAnnotation + }); + var css = sourceMapOutput.toCSS(options); + this.sourceMap = sourceMapOutput.sourceMap; + this.sourceMapURL = sourceMapOutput.sourceMapURL; + if (this.options.sourceMapInputFilename) { + this.sourceMapInputFilename = sourceMapOutput.normalizeFilename(this.options.sourceMapInputFilename); + } + if (this.options.sourceMapBasepath !== undefined && this.sourceMapURL !== undefined) { + this.sourceMapURL = sourceMapOutput.removeBasepath(this.sourceMapURL); + } + return css + this.getCSSAppendage(); + }; + SourceMapBuilder.prototype.getCSSAppendage = function () { + var sourceMapURL = this.sourceMapURL; + if (this.options.sourceMapFileInline) { + if (this.sourceMap === undefined) { + return ''; + } + sourceMapURL = "data:application/json;base64," + environment.encodeBase64(this.sourceMap); + } + if (this.options.disableSourcemapAnnotation) { + return ''; + } + if (sourceMapURL) { + return "/*# sourceMappingURL=" + sourceMapURL + " */"; + } + return ''; + }; + SourceMapBuilder.prototype.getExternalSourceMap = function () { + return this.sourceMap; + }; + SourceMapBuilder.prototype.setExternalSourceMap = function (sourceMap) { + this.sourceMap = sourceMap; + }; + SourceMapBuilder.prototype.isInline = function () { + return this.options.sourceMapFileInline; + }; + SourceMapBuilder.prototype.getSourceMapURL = function () { + return this.sourceMapURL; + }; + SourceMapBuilder.prototype.getOutputFilename = function () { + return this.options.sourceMapOutputFilename; + }; + SourceMapBuilder.prototype.getInputFilename = function () { + return this.sourceMapInputFilename; + }; + return SourceMapBuilder; + }()); + return SourceMapBuilder; + } - var importManager = (function (environment) { - // FileInfo = { - // 'rewriteUrls' - option - whether to adjust URL's to be relative - // 'filename' - full resolved filename of current file - // 'rootpath' - path to append to normal URLs for this node - // 'currentDirectory' - path to the current file, absolute - // 'rootFilename' - filename of the base file - // 'entryPath' - absolute path to the entry file - // 'reference' - whether the file should not be output and only output parts that are referenced - var ImportManager = /** @class */ (function () { - function ImportManager(less, context, rootFileInfo) { - this.less = less; - this.rootFilename = rootFileInfo.filename; - this.paths = context.paths || []; // Search paths, when importing - this.contents = {}; // map - filename to contents of all the files - this.contentsIgnoredChars = {}; // map - filename to lines at the beginning of each file to ignore - this.mime = context.mime; - this.error = null; - this.context = context; - // Deprecated? Unused outside of here, could be useful. - this.queue = []; // Files which haven't been imported yet - this.files = []; // List of files imported - } - /** - * Add an import to be imported - * @param path - the raw path - * @param tryAppendExtension - whether to try appending a file extension (.less or .js if the path has no extension) - * @param currentFileInfo - the current file info (used for instance to work out relative paths) - * @param importOptions - import options - * @param callback - callback for when it is imported - */ - ImportManager.prototype.push = function (path, tryAppendExtension, currentFileInfo, importOptions, callback) { - var importManager = this; - var pluginLoader = this.context.pluginManager.Loader; - this.queue.push(path); - var fileParsedFunc = function (e, root, fullPath) { - importManager.queue.splice(importManager.queue.indexOf(path), 1); // Remove the path from the queue - var importedEqualsRoot = fullPath === importManager.rootFilename; - if (importOptions.optional && e) { - callback(null, { rules: [] }, false, null); - logger.info("The file " + fullPath + " was skipped because it was not found and the import was marked optional."); - } - else { - var files = importManager.files; - if (files.indexOf(fullPath) === -1) { - files.push(fullPath); - } - if (e && !importManager.error) { - importManager.error = e; - } - callback(e, root, importedEqualsRoot, fullPath); - } - }; - var newFileInfo = { - rewriteUrls: this.context.rewriteUrls, - entryPath: currentFileInfo.entryPath, - rootpath: currentFileInfo.rootpath, - rootFilename: currentFileInfo.rootFilename - }; - var fileManager = environment.getFileManager(path, currentFileInfo.currentDirectory, this.context, environment); - if (!fileManager) { - fileParsedFunc({ message: "Could not find a file-manager for " + path }); - return; - } - var loadFileCallback = function (loadedFile) { - var plugin; - var resolvedFilename = loadedFile.filename; - var contents = loadedFile.contents.replace(/^\uFEFF/, ''); - // Pass on an updated rootpath if path of imported file is relative and file - // is in a (sub|sup) directory - // - // Examples: - // - If path of imported file is 'module/nav/nav.less' and rootpath is 'less/', - // then rootpath should become 'less/module/nav/' - // - If path of imported file is '../mixins.less' and rootpath is 'less/', - // then rootpath should become 'less/../' - newFileInfo.currentDirectory = fileManager.getPath(resolvedFilename); - if (newFileInfo.rewriteUrls) { - newFileInfo.rootpath = fileManager.join((importManager.context.rootpath || ''), fileManager.pathDiff(newFileInfo.currentDirectory, newFileInfo.entryPath)); - if (!fileManager.isPathAbsolute(newFileInfo.rootpath) && fileManager.alwaysMakePathsAbsolute()) { - newFileInfo.rootpath = fileManager.join(newFileInfo.entryPath, newFileInfo.rootpath); - } - } - newFileInfo.filename = resolvedFilename; - var newEnv = new contexts.Parse(importManager.context); - newEnv.processImports = false; - importManager.contents[resolvedFilename] = contents; - if (currentFileInfo.reference || importOptions.reference) { - newFileInfo.reference = true; - } - if (importOptions.isPlugin) { - plugin = pluginLoader.evalPlugin(contents, newEnv, importManager, importOptions.pluginArgs, newFileInfo); - if (plugin instanceof LessError) { - fileParsedFunc(plugin, null, resolvedFilename); - } - else { - fileParsedFunc(null, plugin, resolvedFilename); - } - } - else if (importOptions.inline) { - fileParsedFunc(null, contents, resolvedFilename); - } - else { - new Parser(newEnv, importManager, newFileInfo).parse(contents, function (e, root) { - fileParsedFunc(e, root, resolvedFilename); - }); - } - }; - var loadedFile; - var promise; - var context = clone(this.context); - if (tryAppendExtension) { - context.ext = importOptions.isPlugin ? '.js' : '.less'; - } - if (importOptions.isPlugin) { - context.mime = 'application/javascript'; - if (context.syncImport) { - loadedFile = pluginLoader.loadPluginSync(path, currentFileInfo.currentDirectory, context, environment, fileManager); - } - else { - promise = pluginLoader.loadPlugin(path, currentFileInfo.currentDirectory, context, environment, fileManager); - } - } - else { - if (context.syncImport) { - loadedFile = fileManager.loadFileSync(path, currentFileInfo.currentDirectory, context, environment); - } - else { - promise = fileManager.loadFile(path, currentFileInfo.currentDirectory, context, environment, function (err, loadedFile) { - if (err) { - fileParsedFunc(err); - } - else { - loadFileCallback(loadedFile); - } - }); - } - } - if (loadedFile) { - if (!loadedFile.filename) { - fileParsedFunc(loadedFile); - } - else { - loadFileCallback(loadedFile); - } - } - else if (promise) { - promise.then(loadFileCallback, fileParsedFunc); - } - }; - return ImportManager; - }()); - return ImportManager; - }); + function ParseTree (SourceMapBuilder) { + var ParseTree = /** @class */ (function () { + function ParseTree(root, imports) { + this.root = root; + this.imports = imports; + } + ParseTree.prototype.toCSS = function (options) { + var evaldRoot; + var result = {}; + var sourceMapBuilder; + try { + evaldRoot = transformTree(this.root, options); + } + catch (e) { + throw new LessError(e, this.imports); + } + try { + var compress = Boolean(options.compress); + if (compress) { + logger.warn('The compress option has been deprecated. ' + + 'We recommend you use a dedicated css minifier, for instance see less-plugin-clean-css.'); + } + var toCSSOptions = { + compress: compress, + dumpLineNumbers: options.dumpLineNumbers, + strictUnits: Boolean(options.strictUnits), + numPrecision: 8 + }; + if (options.sourceMap) { + sourceMapBuilder = new SourceMapBuilder(options.sourceMap); + result.css = sourceMapBuilder.toCSS(evaldRoot, toCSSOptions, this.imports); + } + else { + result.css = evaldRoot.toCSS(toCSSOptions); + } + } + catch (e) { + throw new LessError(e, this.imports); + } + if (options.pluginManager) { + var postProcessors = options.pluginManager.getPostProcessors(); + for (var i = 0; i < postProcessors.length; i++) { + result.css = postProcessors[i].process(result.css, { sourceMap: sourceMapBuilder, options: options, imports: this.imports }); + } + } + if (options.sourceMap) { + result.map = sourceMapBuilder.getExternalSourceMap(); + } + result.imports = []; + for (var file in this.imports.files) { + if (this.imports.files.hasOwnProperty(file) && file !== this.imports.rootFilename) { + result.imports.push(file); + } + } + return result; + }; + return ParseTree; + }()); + return ParseTree; + } - var Render = (function (environment, ParseTree, ImportManager) { - var render = function (input, options, callback) { - if (typeof options === 'function') { - callback = options; - options = copyOptions(this.options, {}); - } - else { - options = copyOptions(this.options, options || {}); - } - if (!callback) { - var self_1 = this; - return new Promise(function (resolve, reject) { - render.call(self_1, input, options, function (err, output) { - if (err) { - reject(err); - } - else { - resolve(output); - } - }); - }); - } - else { - this.parse(input, options, function (err, root, imports, options) { - if (err) { - return callback(err); - } - var result; - try { - var parseTree = new ParseTree(root, imports); - result = parseTree.toCSS(options); - } - catch (err) { - return callback(err); - } - callback(null, result); - }); - } - }; - return render; - }); + function ImportManager (environment) { + // FileInfo = { + // 'rewriteUrls' - option - whether to adjust URL's to be relative + // 'filename' - full resolved filename of current file + // 'rootpath' - path to append to normal URLs for this node + // 'currentDirectory' - path to the current file, absolute + // 'rootFilename' - filename of the base file + // 'entryPath' - absolute path to the entry file + // 'reference' - whether the file should not be output and only output parts that are referenced + var ImportManager = /** @class */ (function () { + function ImportManager(less, context, rootFileInfo) { + this.less = less; + this.rootFilename = rootFileInfo.filename; + this.paths = context.paths || []; // Search paths, when importing + this.contents = {}; // map - filename to contents of all the files + this.contentsIgnoredChars = {}; // map - filename to lines at the beginning of each file to ignore + this.mime = context.mime; + this.error = null; + this.context = context; + // Deprecated? Unused outside of here, could be useful. + this.queue = []; // Files which haven't been imported yet + this.files = {}; // Holds the imported parse trees. + } + /** + * Add an import to be imported + * @param path - the raw path + * @param tryAppendExtension - whether to try appending a file extension (.less or .js if the path has no extension) + * @param currentFileInfo - the current file info (used for instance to work out relative paths) + * @param importOptions - import options + * @param callback - callback for when it is imported + */ + ImportManager.prototype.push = function (path, tryAppendExtension, currentFileInfo, importOptions, callback) { + var importManager = this, pluginLoader = this.context.pluginManager.Loader; + this.queue.push(path); + var fileParsedFunc = function (e, root, fullPath) { + importManager.queue.splice(importManager.queue.indexOf(path), 1); // Remove the path from the queue + var importedEqualsRoot = fullPath === importManager.rootFilename; + if (importOptions.optional && e) { + callback(null, { rules: [] }, false, null); + logger.info("The file " + fullPath + " was skipped because it was not found and the import was marked optional."); + } + else { + // Inline imports aren't cached here. + // If we start to cache them, please make sure they won't conflict with non-inline imports of the + // same name as they used to do before this comment and the condition below have been added. + if (!importManager.files[fullPath] && !importOptions.inline) { + importManager.files[fullPath] = { root: root, options: importOptions }; + } + if (e && !importManager.error) { + importManager.error = e; + } + callback(e, root, importedEqualsRoot, fullPath); + } + }; + var newFileInfo = { + rewriteUrls: this.context.rewriteUrls, + entryPath: currentFileInfo.entryPath, + rootpath: currentFileInfo.rootpath, + rootFilename: currentFileInfo.rootFilename + }; + var fileManager = environment.getFileManager(path, currentFileInfo.currentDirectory, this.context, environment); + if (!fileManager) { + fileParsedFunc({ message: "Could not find a file-manager for " + path }); + return; + } + var loadFileCallback = function (loadedFile) { + var plugin; + var resolvedFilename = loadedFile.filename; + var contents = loadedFile.contents.replace(/^\uFEFF/, ''); + // Pass on an updated rootpath if path of imported file is relative and file + // is in a (sub|sup) directory + // + // Examples: + // - If path of imported file is 'module/nav/nav.less' and rootpath is 'less/', + // then rootpath should become 'less/module/nav/' + // - If path of imported file is '../mixins.less' and rootpath is 'less/', + // then rootpath should become 'less/../' + newFileInfo.currentDirectory = fileManager.getPath(resolvedFilename); + if (newFileInfo.rewriteUrls) { + newFileInfo.rootpath = fileManager.join((importManager.context.rootpath || ''), fileManager.pathDiff(newFileInfo.currentDirectory, newFileInfo.entryPath)); + if (!fileManager.isPathAbsolute(newFileInfo.rootpath) && fileManager.alwaysMakePathsAbsolute()) { + newFileInfo.rootpath = fileManager.join(newFileInfo.entryPath, newFileInfo.rootpath); + } + } + newFileInfo.filename = resolvedFilename; + var newEnv = new contexts.Parse(importManager.context); + newEnv.processImports = false; + importManager.contents[resolvedFilename] = contents; + if (currentFileInfo.reference || importOptions.reference) { + newFileInfo.reference = true; + } + if (importOptions.isPlugin) { + plugin = pluginLoader.evalPlugin(contents, newEnv, importManager, importOptions.pluginArgs, newFileInfo); + if (plugin instanceof LessError) { + fileParsedFunc(plugin, null, resolvedFilename); + } + else { + fileParsedFunc(null, plugin, resolvedFilename); + } + } + else if (importOptions.inline) { + fileParsedFunc(null, contents, resolvedFilename); + } + else { + // import (multiple) parse trees apparently get altered and can't be cached. + // TODO: investigate why this is + if (importManager.files[resolvedFilename] + && !importManager.files[resolvedFilename].options.multiple + && !importOptions.multiple) { + fileParsedFunc(null, importManager.files[resolvedFilename].root, resolvedFilename); + } + else { + new Parser(newEnv, importManager, newFileInfo).parse(contents, function (e, root) { + fileParsedFunc(e, root, resolvedFilename); + }); + } + } + }; + var loadedFile; + var promise; + var context = clone(this.context); + if (tryAppendExtension) { + context.ext = importOptions.isPlugin ? '.js' : '.less'; + } + if (importOptions.isPlugin) { + context.mime = 'application/javascript'; + if (context.syncImport) { + loadedFile = pluginLoader.loadPluginSync(path, currentFileInfo.currentDirectory, context, environment, fileManager); + } + else { + promise = pluginLoader.loadPlugin(path, currentFileInfo.currentDirectory, context, environment, fileManager); + } + } + else { + if (context.syncImport) { + loadedFile = fileManager.loadFileSync(path, currentFileInfo.currentDirectory, context, environment); + } + else { + promise = fileManager.loadFile(path, currentFileInfo.currentDirectory, context, environment, function (err, loadedFile) { + if (err) { + fileParsedFunc(err); + } + else { + loadFileCallback(loadedFile); + } + }); + } + } + if (loadedFile) { + if (!loadedFile.filename) { + fileParsedFunc(loadedFile); + } + else { + loadFileCallback(loadedFile); + } + } + else if (promise) { + promise.then(loadFileCallback, fileParsedFunc); + } + }; + return ImportManager; + }()); + return ImportManager; + } - /** - * Plugin Manager - */ - var PluginManager = /** @class */ (function () { - function PluginManager(less) { - this.less = less; - this.visitors = []; - this.preProcessors = []; - this.postProcessors = []; - this.installedPlugins = []; - this.fileManagers = []; - this.iterator = -1; - this.pluginCache = {}; - this.Loader = new less.PluginLoader(less); - } - /** - * Adds all the plugins in the array - * @param {Array} plugins - */ - PluginManager.prototype.addPlugins = function (plugins) { - if (plugins) { - for (var i = 0; i < plugins.length; i++) { - this.addPlugin(plugins[i]); - } - } - }; - /** - * - * @param plugin - * @param {String} filename - */ - PluginManager.prototype.addPlugin = function (plugin, filename, functionRegistry) { - this.installedPlugins.push(plugin); - if (filename) { - this.pluginCache[filename] = plugin; - } - if (plugin.install) { - plugin.install(this.less, this, functionRegistry || this.less.functions.functionRegistry); - } - }; - /** - * - * @param filename - */ - PluginManager.prototype.get = function (filename) { - return this.pluginCache[filename]; - }; - /** - * Adds a visitor. The visitor object has options on itself to determine - * when it should run. - * @param visitor - */ - PluginManager.prototype.addVisitor = function (visitor) { - this.visitors.push(visitor); - }; - /** - * Adds a pre processor object - * @param {object} preProcessor - * @param {number} priority - guidelines 1 = before import, 1000 = import, 2000 = after import - */ - PluginManager.prototype.addPreProcessor = function (preProcessor, priority) { - var indexToInsertAt; - for (indexToInsertAt = 0; indexToInsertAt < this.preProcessors.length; indexToInsertAt++) { - if (this.preProcessors[indexToInsertAt].priority >= priority) { - break; - } - } - this.preProcessors.splice(indexToInsertAt, 0, { preProcessor: preProcessor, priority: priority }); - }; - /** - * Adds a post processor object - * @param {object} postProcessor - * @param {number} priority - guidelines 1 = before compression, 1000 = compression, 2000 = after compression - */ - PluginManager.prototype.addPostProcessor = function (postProcessor, priority) { - var indexToInsertAt; - for (indexToInsertAt = 0; indexToInsertAt < this.postProcessors.length; indexToInsertAt++) { - if (this.postProcessors[indexToInsertAt].priority >= priority) { - break; - } - } - this.postProcessors.splice(indexToInsertAt, 0, { postProcessor: postProcessor, priority: priority }); - }; - /** - * - * @param manager - */ - PluginManager.prototype.addFileManager = function (manager) { - this.fileManagers.push(manager); - }; - /** - * - * @returns {Array} - * @private - */ - PluginManager.prototype.getPreProcessors = function () { - var preProcessors = []; - for (var i = 0; i < this.preProcessors.length; i++) { - preProcessors.push(this.preProcessors[i].preProcessor); - } - return preProcessors; - }; - /** - * - * @returns {Array} - * @private - */ - PluginManager.prototype.getPostProcessors = function () { - var postProcessors = []; - for (var i = 0; i < this.postProcessors.length; i++) { - postProcessors.push(this.postProcessors[i].postProcessor); - } - return postProcessors; - }; - /** - * - * @returns {Array} - * @private - */ - PluginManager.prototype.getVisitors = function () { - return this.visitors; - }; - PluginManager.prototype.visitor = function () { - var self = this; - return { - first: function () { - self.iterator = -1; - return self.visitors[self.iterator]; - }, - get: function () { - self.iterator += 1; - return self.visitors[self.iterator]; - } - }; - }; - /** - * - * @returns {Array} - * @private - */ - PluginManager.prototype.getFileManagers = function () { - return this.fileManagers; - }; - return PluginManager; - }()); - var pm; - function PluginManagerFactory(less, newFactory) { - if (newFactory || !pm) { - pm = new PluginManager(less); - } - return pm; - } + function Parse (environment, ParseTree, ImportManager) { + var parse = function (input, options, callback) { + if (typeof options === 'function') { + callback = options; + options = copyOptions(this.options, {}); + } + else { + options = copyOptions(this.options, options || {}); + } + if (!callback) { + var self_1 = this; + return new Promise(function (resolve, reject) { + parse.call(self_1, input, options, function (err, output) { + if (err) { + reject(err); + } + else { + resolve(output); + } + }); + }); + } + else { + var context_1; + var rootFileInfo = void 0; + var pluginManager_1 = new PluginManagerFactory(this, !options.reUsePluginManager); + options.pluginManager = pluginManager_1; + context_1 = new contexts.Parse(options); + if (options.rootFileInfo) { + rootFileInfo = options.rootFileInfo; + } + else { + var filename = options.filename || 'input'; + var entryPath = filename.replace(/[^\/\\]*$/, ''); + rootFileInfo = { + filename: filename, + rewriteUrls: context_1.rewriteUrls, + rootpath: context_1.rootpath || '', + currentDirectory: entryPath, + entryPath: entryPath, + rootFilename: filename + }; + // add in a missing trailing slash + if (rootFileInfo.rootpath && rootFileInfo.rootpath.slice(-1) !== '/') { + rootFileInfo.rootpath += '/'; + } + } + var imports_1 = new ImportManager(this, context_1, rootFileInfo); + this.importManager = imports_1; + // TODO: allow the plugins to be just a list of paths or names + // Do an async plugin queue like lessc + if (options.plugins) { + options.plugins.forEach(function (plugin) { + var evalResult, contents; + if (plugin.fileContent) { + contents = plugin.fileContent.replace(/^\uFEFF/, ''); + evalResult = pluginManager_1.Loader.evalPlugin(contents, context_1, imports_1, plugin.options, plugin.filename); + if (evalResult instanceof LessError) { + return callback(evalResult); + } + } + else { + pluginManager_1.addPlugin(plugin); + } + }); + } + new Parser(context_1, imports_1, rootFileInfo) + .parse(input, function (e, root) { + if (e) { + return callback(e); + } + callback(null, root, imports_1, options); + }, options); + } + }; + return parse; + } - var Parse = (function (environment, ParseTree, ImportManager) { - var parse = function (input, options, callback) { - if (typeof options === 'function') { - callback = options; - options = copyOptions(this.options, {}); - } - else { - options = copyOptions(this.options, options || {}); - } - if (!callback) { - var self_1 = this; - return new Promise(function (resolve, reject) { - parse.call(self_1, input, options, function (err, output) { - if (err) { - reject(err); - } - else { - resolve(output); - } - }); - }); - } - else { - var context_1; - var rootFileInfo = void 0; - var pluginManager_1 = new PluginManagerFactory(this, !options.reUsePluginManager); - options.pluginManager = pluginManager_1; - context_1 = new contexts.Parse(options); - if (options.rootFileInfo) { - rootFileInfo = options.rootFileInfo; - } - else { - var filename = options.filename || 'input'; - var entryPath = filename.replace(/[^\/\\]*$/, ''); - rootFileInfo = { - filename: filename, - rewriteUrls: context_1.rewriteUrls, - rootpath: context_1.rootpath || '', - currentDirectory: entryPath, - entryPath: entryPath, - rootFilename: filename - }; - // add in a missing trailing slash - if (rootFileInfo.rootpath && rootFileInfo.rootpath.slice(-1) !== '/') { - rootFileInfo.rootpath += '/'; - } - } - var imports_1 = new ImportManager(this, context_1, rootFileInfo); - this.importManager = imports_1; - // TODO: allow the plugins to be just a list of paths or names - // Do an async plugin queue like lessc - if (options.plugins) { - options.plugins.forEach(function (plugin) { - var evalResult; - var contents; - if (plugin.fileContent) { - contents = plugin.fileContent.replace(/^\uFEFF/, ''); - evalResult = pluginManager_1.Loader.evalPlugin(contents, context_1, imports_1, plugin.options, plugin.filename); - if (evalResult instanceof LessError) { - return callback(evalResult); - } - } - else { - pluginManager_1.addPlugin(plugin); - } - }); - } - new Parser(context_1, imports_1, rootFileInfo) - .parse(input, function (e, root) { - if (e) { - return callback(e); - } - callback(null, root, imports_1, options); - }, options); - } - }; - return parse; - }); + function Render (environment, ParseTree, ImportManager) { + var render = function (input, options, callback) { + if (typeof options === 'function') { + callback = options; + options = copyOptions(this.options, {}); + } + else { + options = copyOptions(this.options, options || {}); + } + if (!callback) { + var self_1 = this; + return new Promise(function (resolve, reject) { + render.call(self_1, input, options, function (err, output) { + if (err) { + reject(err); + } + else { + resolve(output); + } + }); + }); + } + else { + this.parse(input, options, function (err, root, imports, options) { + if (err) { + return callback(err); + } + var result; + try { + var parseTree = new ParseTree(root, imports); + result = parseTree.toCSS(options); + } + catch (err) { + return callback(err); + } + callback(null, result); + }); + } + }; + return render; + } - var lessRoot = (function (environment$1, fileManagers) { - /** - * @todo - * This original code could be improved quite a bit. - * Many classes / modules currently add side-effects / mutations to passed in objects, - * which makes it hard to refactor and reason about. - */ - environment$1 = new environment(environment$1, fileManagers); - var SourceMapOutput = sourceMapOutput(environment$1); - var SourceMapBuilder = sourceMapBuilder(SourceMapOutput, environment$1); - var ParseTree = parseTree(SourceMapBuilder); - var ImportManager = importManager(environment$1); - var render = Render(environment$1, ParseTree); - var parse = Parse(environment$1, ParseTree, ImportManager); - var functions = Functions(environment$1); - /** - * @todo - * This root properties / methods need to be organized. - * It's not clear what should / must be public and why. - */ - var initial = { - version: [3, 12, 2], - data: data, - tree: tree, - Environment: environment, - AbstractFileManager: AbstractFileManager, - AbstractPluginLoader: AbstractPluginLoader, - environment: environment$1, - visitors: visitors, - Parser: Parser, - functions: functions, - contexts: contexts, - SourceMapOutput: SourceMapOutput, - SourceMapBuilder: SourceMapBuilder, - ParseTree: ParseTree, - ImportManager: ImportManager, - render: render, - parse: parse, - LessError: LessError, - transformTree: transformTree, - utils: utils, - PluginManager: PluginManagerFactory, - logger: logger - }; - // Create a public API - var ctor = function (t) { return function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } - return new (t.bind.apply(t, __spreadArrays([void 0], args)))(); - }; }; - var t; - var api = Object.create(initial); - for (var n in initial.tree) { - /* eslint guard-for-in: 0 */ - t = initial.tree[n]; - if (typeof t === 'function') { - api[n.toLowerCase()] = ctor(t); - } - else { - api[n] = Object.create(null); - for (var o in t) { - /* eslint guard-for-in: 0 */ - api[n][o.toLowerCase()] = ctor(t[o]); - } - } - } - /** - * Some of the functions assume a `this` context of the API object, - * which causes it to fail when wrapped for ES6 imports. - * - * An assumed `this` should be removed in the future. - */ - initial.parse = initial.parse.bind(api); - initial.render = initial.render.bind(api); - return api; - }); + function lessRoot (environment, fileManagers) { + var sourceMapOutput, sourceMapBuilder, parseTree, importManager; + environment = new Environment(environment, fileManagers); + sourceMapOutput = SourceMapOutput(environment); + sourceMapBuilder = SourceMapBuilder(sourceMapOutput, environment); + parseTree = ParseTree(sourceMapBuilder); + importManager = ImportManager(environment); + var render = Render(environment, parseTree); + var parse = Parse(environment, parseTree, importManager); + var initial = { + version: [4, 0, 0], + data: data, + tree: tree, + Environment: Environment, + AbstractFileManager: AbstractFileManager, + AbstractPluginLoader: AbstractPluginLoader, + environment: environment, + visitors: visitors, + Parser: Parser, + functions: functions(environment), + contexts: contexts, + SourceMapOutput: sourceMapOutput, + SourceMapBuilder: sourceMapBuilder, + ParseTree: parseTree, + ImportManager: importManager, + render: render, + parse: parse, + LessError: LessError, + transformTree: transformTree, + utils: utils, + PluginManager: PluginManagerFactory, + logger: logger + }; + // Create a public API + var ctor = function (t) { + return function () { + var obj = Object.create(t.prototype); + t.apply(obj, Array.prototype.slice.call(arguments, 0)); + return obj; + }; + }; + var t; + var api = Object.create(initial); + for (var n in initial.tree) { + /* eslint guard-for-in: 0 */ + t = initial.tree[n]; + if (typeof t === 'function') { + api[n.toLowerCase()] = ctor(t); + } + else { + api[n] = Object.create(null); + for (var o in t) { + /* eslint guard-for-in: 0 */ + api[n][o.toLowerCase()] = ctor(t[o]); + } + } + } + /** + * Some of the functions assume a `this` context of the API object, + * which causes it to fail when wrapped for ES6 imports. + * + * An assumed `this` should be removed in the future. + */ + initial.parse = initial.parse.bind(api); + initial.render = initial.render.bind(api); + return api; + } - /* global window, XMLHttpRequest */ - var options; - var logger$1; - var fileCache = {}; - // TODOS - move log somewhere. pathDiff and doing something similar in node. use pathDiff in the other browser file for the initial load - var FileManager = /** @class */ (function (_super) { - __extends(FileManager, _super); - function FileManager() { - return _super !== null && _super.apply(this, arguments) || this; - } - FileManager.prototype.alwaysMakePathsAbsolute = function () { - return true; - }; - FileManager.prototype.join = function (basePath, laterPath) { - if (!basePath) { - return laterPath; - } - return this.extractUrlParts(laterPath, basePath).path; - }; - FileManager.prototype.doXHR = function (url, type, callback, errback) { - var xhr = new XMLHttpRequest(); - var async = options.isFileProtocol ? options.fileAsync : true; - if (typeof xhr.overrideMimeType === 'function') { - xhr.overrideMimeType('text/css'); - } - logger$1.debug("XHR: Getting '" + url + "'"); - xhr.open('GET', url, async); - xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5'); - xhr.send(null); - function handleResponse(xhr, callback, errback) { - if (xhr.status >= 200 && xhr.status < 300) { - callback(xhr.responseText, xhr.getResponseHeader('Last-Modified')); - } - else if (typeof errback === 'function') { - errback(xhr.status, url); - } - } - if (options.isFileProtocol && !options.fileAsync) { - if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) { - callback(xhr.responseText); - } - else { - errback(xhr.status, url); - } - } - else if (async) { - xhr.onreadystatechange = function () { - if (xhr.readyState == 4) { - handleResponse(xhr, callback, errback); - } - }; - } - else { - handleResponse(xhr, callback, errback); - } - }; - FileManager.prototype.supports = function () { - return true; - }; - FileManager.prototype.clearFileCache = function () { - fileCache = {}; - }; - FileManager.prototype.loadFile = function (filename, currentDirectory, options, environment) { - // TODO: Add prefix support like less-node? - // What about multiple paths? - if (currentDirectory && !this.isPathAbsolute(filename)) { - filename = currentDirectory + filename; - } - filename = options.ext ? this.tryAppendExtension(filename, options.ext) : filename; - options = options || {}; - // sheet may be set to the stylesheet for the initial load or a collection of properties including - // some context variables for imports - var hrefParts = this.extractUrlParts(filename, window.location.href); - var href = hrefParts.url; - var self = this; - return new Promise(function (resolve, reject) { - if (options.useFileCache && fileCache[href]) { - try { - var lessText = fileCache[href]; - return resolve({ contents: lessText, filename: href, webInfo: { lastModified: new Date() } }); - } - catch (e) { - return reject({ filename: href, message: "Error loading file " + href + " error was " + e.message }); - } - } - self.doXHR(href, options.mime, function doXHRCallback(data, lastModified) { - // per file cache - fileCache[href] = data; - // Use remote copy (re-parse) - resolve({ contents: data, filename: href, webInfo: { lastModified: lastModified } }); - }, function doXHRError(status, url) { - reject({ type: 'File', message: "'" + url + "' wasn't found (" + status + ")", href: href }); - }); - }); - }; - return FileManager; - }(AbstractFileManager)); - var FM = (function (opts, log) { - options = opts; - logger$1 = log; - return FileManager; - }); + /* global window, XMLHttpRequest */ + var options; + var logger$1; + var fileCache = {}; + // TODOS - move log somewhere. pathDiff and doing something similar in node. use pathDiff in the other browser file for the initial load + var FileManager = /** @class */ (function (_super) { + __extends(FileManager, _super); + function FileManager() { + return _super !== null && _super.apply(this, arguments) || this; + } + FileManager.prototype.alwaysMakePathsAbsolute = function () { + return true; + }; + FileManager.prototype.join = function (basePath, laterPath) { + if (!basePath) { + return laterPath; + } + return this.extractUrlParts(laterPath, basePath).path; + }; + FileManager.prototype.doXHR = function (url, type, callback, errback) { + var xhr = new XMLHttpRequest(); + var async = options.isFileProtocol ? options.fileAsync : true; + if (typeof xhr.overrideMimeType === 'function') { + xhr.overrideMimeType('text/css'); + } + logger$1.debug("XHR: Getting '" + url + "'"); + xhr.open('GET', url, async); + xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5'); + xhr.send(null); + function handleResponse(xhr, callback, errback) { + if (xhr.status >= 200 && xhr.status < 300) { + callback(xhr.responseText, xhr.getResponseHeader('Last-Modified')); + } + else if (typeof errback === 'function') { + errback(xhr.status, url); + } + } + if (options.isFileProtocol && !options.fileAsync) { + if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) { + callback(xhr.responseText); + } + else { + errback(xhr.status, url); + } + } + else if (async) { + xhr.onreadystatechange = function () { + if (xhr.readyState == 4) { + handleResponse(xhr, callback, errback); + } + }; + } + else { + handleResponse(xhr, callback, errback); + } + }; + FileManager.prototype.supports = function () { + return true; + }; + FileManager.prototype.clearFileCache = function () { + fileCache = {}; + }; + FileManager.prototype.loadFile = function (filename, currentDirectory, options, environment) { + // TODO: Add prefix support like less-node? + // What about multiple paths? + if (currentDirectory && !this.isPathAbsolute(filename)) { + filename = currentDirectory + filename; + } + filename = options.ext ? this.tryAppendExtension(filename, options.ext) : filename; + options = options || {}; + // sheet may be set to the stylesheet for the initial load or a collection of properties including + // some context variables for imports + var hrefParts = this.extractUrlParts(filename, window.location.href); + var href = hrefParts.url; + var self = this; + return new Promise(function (resolve, reject) { + if (options.useFileCache && fileCache[href]) { + try { + var lessText = fileCache[href]; + return resolve({ contents: lessText, filename: href, webInfo: { lastModified: new Date() } }); + } + catch (e) { + return reject({ filename: href, message: "Error loading file " + href + " error was " + e.message }); + } + } + self.doXHR(href, options.mime, function doXHRCallback(data, lastModified) { + // per file cache + fileCache[href] = data; + // Use remote copy (re-parse) + resolve({ contents: data, filename: href, webInfo: { lastModified: lastModified } }); + }, function doXHRError(status, url) { + reject({ type: 'File', message: "'" + url + "' wasn't found (" + status + ")", href: href }); + }); + }); + }; + return FileManager; + }(AbstractFileManager)); + var FM = (function (opts, log) { + options = opts; + logger$1 = log; + return FileManager; + }); - // TODO: Add tests for browser @plugin - /** - * Browser Plugin Loader - */ - var PluginLoader = /** @class */ (function (_super) { - __extends(PluginLoader, _super); - function PluginLoader(less) { - var _this = _super.call(this) || this; - _this.less = less; - return _this; - // Should we shim this.require for browser? Probably not? - } - PluginLoader.prototype.loadPlugin = function (filename, basePath, context, environment, fileManager) { - return new Promise(function (fulfill, reject) { - fileManager.loadFile(filename, basePath, context, environment) - .then(fulfill).catch(reject); - }); - }; - return PluginLoader; - }(AbstractPluginLoader)); + // TODO: Add tests for browser @plugin + /** + * Browser Plugin Loader + */ + var PluginLoader = /** @class */ (function (_super) { + __extends(PluginLoader, _super); + function PluginLoader(less) { + var _this = _super.call(this) || this; + _this.less = less; + return _this; + // Should we shim this.require for browser? Probably not? + } + PluginLoader.prototype.loadPlugin = function (filename, basePath, context, environment, fileManager) { + return new Promise(function (fulfill, reject) { + fileManager.loadFile(filename, basePath, context, environment) + .then(fulfill).catch(reject); + }); + }; + return PluginLoader; + }(AbstractPluginLoader)); - var LogListener = (function (less, options) { - var logLevel_debug = 4; - var logLevel_info = 3; - var logLevel_warn = 2; - var logLevel_error = 1; - // The amount of logging in the javascript console. - // 3 - Debug, information and errors - // 2 - Information and errors - // 1 - Errors - // 0 - None - // Defaults to 2 - options.logLevel = typeof options.logLevel !== 'undefined' ? options.logLevel : (options.env === 'development' ? logLevel_info : logLevel_error); - if (!options.loggers) { - options.loggers = [{ - debug: function (msg) { - if (options.logLevel >= logLevel_debug) { - console.log(msg); - } - }, - info: function (msg) { - if (options.logLevel >= logLevel_info) { - console.log(msg); - } - }, - warn: function (msg) { - if (options.logLevel >= logLevel_warn) { - console.warn(msg); - } - }, - error: function (msg) { - if (options.logLevel >= logLevel_error) { - console.error(msg); - } - } - }]; - } - for (var i = 0; i < options.loggers.length; i++) { - less.logger.addListener(options.loggers[i]); - } - }); + var LogListener = (function (less, options) { + var logLevel_debug = 4; + var logLevel_info = 3; + var logLevel_warn = 2; + var logLevel_error = 1; + // The amount of logging in the javascript console. + // 3 - Debug, information and errors + // 2 - Information and errors + // 1 - Errors + // 0 - None + // Defaults to 2 + options.logLevel = typeof options.logLevel !== 'undefined' ? options.logLevel : (options.env === 'development' ? logLevel_info : logLevel_error); + if (!options.loggers) { + options.loggers = [{ + debug: function (msg) { + if (options.logLevel >= logLevel_debug) { + console.log(msg); + } + }, + info: function (msg) { + if (options.logLevel >= logLevel_info) { + console.log(msg); + } + }, + warn: function (msg) { + if (options.logLevel >= logLevel_warn) { + console.warn(msg); + } + }, + error: function (msg) { + if (options.logLevel >= logLevel_error) { + console.error(msg); + } + } + }]; + } + for (var i = 0; i < options.loggers.length; i++) { + less.logger.addListener(options.loggers[i]); + } + }); - var ErrorReporting = (function (window, less, options) { - function errorHTML(e, rootHref) { - var id = "less-error-message:" + extractId(rootHref || ''); - var template = '
  • {content}
  • '; - var elem = window.document.createElement('div'); - var timer; - var content; - var errors = []; - var filename = e.filename || rootHref; - var filenameNoPath = filename.match(/([^\/]+(\?.*)?)$/)[1]; - elem.id = id; - elem.className = 'less-error-message'; - content = "

    " + (e.type || 'Syntax') + "Error: " + (e.message || 'There is an error in your .less file') + - ("

    in " + filenameNoPath + " "); - var errorline = function (e, i, classname) { - if (e.extract[i] !== undefined) { - errors.push(template.replace(/\{line\}/, (parseInt(e.line, 10) || 0) + (i - 1)) - .replace(/\{class\}/, classname) - .replace(/\{content\}/, e.extract[i])); - } - }; - if (e.line) { - errorline(e, 0, ''); - errorline(e, 1, 'line'); - errorline(e, 2, ''); - content += "on line " + e.line + ", column " + (e.column + 1) + ":

      " + errors.join('') + "
    "; - } - if (e.stack && (e.extract || options.logLevel >= 4)) { - content += "
    Stack Trace
    " + e.stack.split('\n').slice(1).join('
    '); - } - elem.innerHTML = content; - // CSS for error messages - browser.createCSS(window.document, [ - '.less-error-message ul, .less-error-message li {', - 'list-style-type: none;', - 'margin-right: 15px;', - 'padding: 4px 0;', - 'margin: 0;', - '}', - '.less-error-message label {', - 'font-size: 12px;', - 'margin-right: 15px;', - 'padding: 4px 0;', - 'color: #cc7777;', - '}', - '.less-error-message pre {', - 'color: #dd6666;', - 'padding: 4px 0;', - 'margin: 0;', - 'display: inline-block;', - '}', - '.less-error-message pre.line {', - 'color: #ff0000;', - '}', - '.less-error-message h3 {', - 'font-size: 20px;', - 'font-weight: bold;', - 'padding: 15px 0 5px 0;', - 'margin: 0;', - '}', - '.less-error-message a {', - 'color: #10a', - '}', - '.less-error-message .error {', - 'color: red;', - 'font-weight: bold;', - 'padding-bottom: 2px;', - 'border-bottom: 1px dashed red;', - '}' - ].join('\n'), { title: 'error-message' }); - elem.style.cssText = [ - 'font-family: Arial, sans-serif', - 'border: 1px solid #e00', - 'background-color: #eee', - 'border-radius: 5px', - '-webkit-border-radius: 5px', - '-moz-border-radius: 5px', - 'color: #e00', - 'padding: 15px', - 'margin-bottom: 15px' - ].join(';'); - if (options.env === 'development') { - timer = setInterval(function () { - var document = window.document; - var body = document.body; - if (body) { - if (document.getElementById(id)) { - body.replaceChild(elem, document.getElementById(id)); - } - else { - body.insertBefore(elem, body.firstChild); - } - clearInterval(timer); - } - }, 10); - } - } - function removeErrorHTML(path) { - var node = window.document.getElementById("less-error-message:" + extractId(path)); - if (node) { - node.parentNode.removeChild(node); - } - } - function removeError(path) { - if (!options.errorReporting || options.errorReporting === 'html') { - removeErrorHTML(path); - } - else if (options.errorReporting === 'console') ; - else if (typeof options.errorReporting === 'function') { - options.errorReporting('remove', path); - } - } - function errorConsole(e, rootHref) { - var template = '{line} {content}'; - var filename = e.filename || rootHref; - var errors = []; - var content = (e.type || 'Syntax') + "Error: " + (e.message || 'There is an error in your .less file') + " in " + filename; - var errorline = function (e, i, classname) { - if (e.extract[i] !== undefined) { - errors.push(template.replace(/\{line\}/, (parseInt(e.line, 10) || 0) + (i - 1)) - .replace(/\{class\}/, classname) - .replace(/\{content\}/, e.extract[i])); - } - }; - if (e.line) { - errorline(e, 0, ''); - errorline(e, 1, 'line'); - errorline(e, 2, ''); - content += " on line " + e.line + ", column " + (e.column + 1) + ":\n" + errors.join('\n'); - } - if (e.stack && (e.extract || options.logLevel >= 4)) { - content += "\nStack Trace\n" + e.stack; - } - less.logger.error(content); - } - function error(e, rootHref) { - if (!options.errorReporting || options.errorReporting === 'html') { - errorHTML(e, rootHref); - } - else if (options.errorReporting === 'console') { - errorConsole(e, rootHref); - } - else if (typeof options.errorReporting === 'function') { - options.errorReporting('add', e, rootHref); - } - } - return { - add: error, - remove: removeError - }; - }); + var ErrorReporting = (function (window, less, options) { + function errorHTML(e, rootHref) { + var id = "less-error-message:" + extractId(rootHref || ''); + var template = '
  • {content}
  • '; + var elem = window.document.createElement('div'); + var timer; + var content; + var errors = []; + var filename = e.filename || rootHref; + var filenameNoPath = filename.match(/([^\/]+(\?.*)?)$/)[1]; + elem.id = id; + elem.className = 'less-error-message'; + content = "

    " + (e.type || 'Syntax') + "Error: " + (e.message || 'There is an error in your .less file') + + ("

    in " + filenameNoPath + " "); + var errorline = function (e, i, classname) { + if (e.extract[i] !== undefined) { + errors.push(template.replace(/\{line\}/, (parseInt(e.line, 10) || 0) + (i - 1)) + .replace(/\{class\}/, classname) + .replace(/\{content\}/, e.extract[i])); + } + }; + if (e.line) { + errorline(e, 0, ''); + errorline(e, 1, 'line'); + errorline(e, 2, ''); + content += "on line " + e.line + ", column " + (e.column + 1) + ":

      " + errors.join('') + "
    "; + } + if (e.stack && (e.extract || options.logLevel >= 4)) { + content += "
    Stack Trace
    " + e.stack.split('\n').slice(1).join('
    '); + } + elem.innerHTML = content; + // CSS for error messages + browser.createCSS(window.document, [ + '.less-error-message ul, .less-error-message li {', + 'list-style-type: none;', + 'margin-right: 15px;', + 'padding: 4px 0;', + 'margin: 0;', + '}', + '.less-error-message label {', + 'font-size: 12px;', + 'margin-right: 15px;', + 'padding: 4px 0;', + 'color: #cc7777;', + '}', + '.less-error-message pre {', + 'color: #dd6666;', + 'padding: 4px 0;', + 'margin: 0;', + 'display: inline-block;', + '}', + '.less-error-message pre.line {', + 'color: #ff0000;', + '}', + '.less-error-message h3 {', + 'font-size: 20px;', + 'font-weight: bold;', + 'padding: 15px 0 5px 0;', + 'margin: 0;', + '}', + '.less-error-message a {', + 'color: #10a', + '}', + '.less-error-message .error {', + 'color: red;', + 'font-weight: bold;', + 'padding-bottom: 2px;', + 'border-bottom: 1px dashed red;', + '}' + ].join('\n'), { title: 'error-message' }); + elem.style.cssText = [ + 'font-family: Arial, sans-serif', + 'border: 1px solid #e00', + 'background-color: #eee', + 'border-radius: 5px', + '-webkit-border-radius: 5px', + '-moz-border-radius: 5px', + 'color: #e00', + 'padding: 15px', + 'margin-bottom: 15px' + ].join(';'); + if (options.env === 'development') { + timer = setInterval(function () { + var document = window.document; + var body = document.body; + if (body) { + if (document.getElementById(id)) { + body.replaceChild(elem, document.getElementById(id)); + } + else { + body.insertBefore(elem, body.firstChild); + } + clearInterval(timer); + } + }, 10); + } + } + function removeErrorHTML(path) { + var node = window.document.getElementById("less-error-message:" + extractId(path)); + if (node) { + node.parentNode.removeChild(node); + } + } + function removeError(path) { + if (!options.errorReporting || options.errorReporting === 'html') { + removeErrorHTML(path); + } + else if (options.errorReporting === 'console') ; + else if (typeof options.errorReporting === 'function') { + options.errorReporting('remove', path); + } + } + function errorConsole(e, rootHref) { + var template = '{line} {content}'; + var filename = e.filename || rootHref; + var errors = []; + var content = (e.type || 'Syntax') + "Error: " + (e.message || 'There is an error in your .less file') + " in " + filename; + var errorline = function (e, i, classname) { + if (e.extract[i] !== undefined) { + errors.push(template.replace(/\{line\}/, (parseInt(e.line, 10) || 0) + (i - 1)) + .replace(/\{class\}/, classname) + .replace(/\{content\}/, e.extract[i])); + } + }; + if (e.line) { + errorline(e, 0, ''); + errorline(e, 1, 'line'); + errorline(e, 2, ''); + content += " on line " + e.line + ", column " + (e.column + 1) + ":\n" + errors.join('\n'); + } + if (e.stack && (e.extract || options.logLevel >= 4)) { + content += "\nStack Trace\n" + e.stack; + } + less.logger.error(content); + } + function error(e, rootHref) { + if (!options.errorReporting || options.errorReporting === 'html') { + errorHTML(e, rootHref); + } + else if (options.errorReporting === 'console') { + errorConsole(e, rootHref); + } + else if (typeof options.errorReporting === 'function') { + options.errorReporting('add', e, rootHref); + } + } + return { + add: error, + remove: removeError + }; + }); - // Cache system is a bit outdated and could do with work - var Cache = (function (window, options, logger) { - var cache = null; - if (options.env !== 'development') { - try { - cache = (typeof window.localStorage === 'undefined') ? null : window.localStorage; - } - catch (_) { } - } - return { - setCSS: function (path, lastModified, modifyVars, styles) { - if (cache) { - logger.info("saving " + path + " to cache."); - try { - cache.setItem(path, styles); - cache.setItem(path + ":timestamp", lastModified); - if (modifyVars) { - cache.setItem(path + ":vars", JSON.stringify(modifyVars)); - } - } - catch (e) { - // TODO - could do with adding more robust error handling - logger.error("failed to save \"" + path + "\" to local storage for caching."); - } - } - }, - getCSS: function (path, webInfo, modifyVars) { - var css = cache && cache.getItem(path); - var timestamp = cache && cache.getItem(path + ":timestamp"); - var vars = cache && cache.getItem(path + ":vars"); - modifyVars = modifyVars || {}; - vars = vars || "{}"; // if not set, treat as the JSON representation of an empty object - if (timestamp && webInfo.lastModified && - (new Date(webInfo.lastModified).valueOf() === - new Date(timestamp).valueOf()) && - JSON.stringify(modifyVars) === vars) { - // Use local copy - return css; - } - } - }; - }); + // Cache system is a bit outdated and could do with work + var Cache = (function (window, options, logger) { + var cache = null; + if (options.env !== 'development') { + try { + cache = (typeof window.localStorage === 'undefined') ? null : window.localStorage; + } + catch (_) { } + } + return { + setCSS: function (path, lastModified, modifyVars, styles) { + if (cache) { + logger.info("saving " + path + " to cache."); + try { + cache.setItem(path, styles); + cache.setItem(path + ":timestamp", lastModified); + if (modifyVars) { + cache.setItem(path + ":vars", JSON.stringify(modifyVars)); + } + } + catch (e) { + // TODO - could do with adding more robust error handling + logger.error("failed to save \"" + path + "\" to local storage for caching."); + } + } + }, + getCSS: function (path, webInfo, modifyVars) { + var css = cache && cache.getItem(path); + var timestamp = cache && cache.getItem(path + ":timestamp"); + var vars = cache && cache.getItem(path + ":vars"); + modifyVars = modifyVars || {}; + vars = vars || "{}"; // if not set, treat as the JSON representation of an empty object + if (timestamp && webInfo.lastModified && + (new Date(webInfo.lastModified).valueOf() === + new Date(timestamp).valueOf()) && + JSON.stringify(modifyVars) === vars) { + // Use local copy + return css; + } + } + }; + }); - var ImageSize = (function () { - function imageSize() { - throw { - type: 'Runtime', - message: 'Image size functions are not supported in browser version of less' - }; - } - var imageFunctions = { - 'image-size': function (filePathNode) { - imageSize(); - return -1; - }, - 'image-width': function (filePathNode) { - imageSize(); - return -1; - }, - 'image-height': function (filePathNode) { - imageSize(); - return -1; - } - }; - functionRegistry.addMultiple(imageFunctions); - }); + var ImageSize = (function () { + function imageSize() { + throw { + type: 'Runtime', + message: 'Image size functions are not supported in browser version of less' + }; + } + var imageFunctions = { + 'image-size': function (filePathNode) { + imageSize(); + return -1; + }, + 'image-width': function (filePathNode) { + imageSize(); + return -1; + }, + 'image-height': function (filePathNode) { + imageSize(); + return -1; + } + }; + functionRegistry.addMultiple(imageFunctions); + }); - // - var root = (function (window, options) { - var document = window.document; - var less = lessRoot(); - less.options = options; - var environment = less.environment; - var FileManager = FM(options, less.logger); - var fileManager = new FileManager(); - environment.addFileManager(fileManager); - less.FileManager = FileManager; - less.PluginLoader = PluginLoader; - LogListener(less, options); - var errors = ErrorReporting(window, less, options); - var cache = less.cache = options.cache || Cache(window, options, less.logger); - ImageSize(less.environment); - // Setup user functions - Deprecate? - if (options.functions) { - less.functions.functionRegistry.addMultiple(options.functions); - } - var typePattern = /^text\/(x-)?less$/; - function clone(obj) { - var cloned = {}; - for (var prop in obj) { - if (obj.hasOwnProperty(prop)) { - cloned[prop] = obj[prop]; - } - } - return cloned; - } - // only really needed for phantom - function bind(func, thisArg) { - var curryArgs = Array.prototype.slice.call(arguments, 2); - return function () { - var args = curryArgs.concat(Array.prototype.slice.call(arguments, 0)); - return func.apply(thisArg, args); - }; - } - function loadStyles(modifyVars) { - var styles = document.getElementsByTagName('style'); - var style; - for (var i = 0; i < styles.length; i++) { - style = styles[i]; - if (style.type.match(typePattern)) { - var instanceOptions = clone(options); - instanceOptions.modifyVars = modifyVars; - var lessText = style.innerHTML || ''; - instanceOptions.filename = document.location.href.replace(/#.*$/, ''); - /* jshint loopfunc:true */ - // use closure to store current style - less.render(lessText, instanceOptions, bind(function (style, e, result) { - if (e) { - errors.add(e, 'inline'); - } - else { - style.type = 'text/css'; - if (style.styleSheet) { - style.styleSheet.cssText = result.css; - } - else { - style.innerHTML = result.css; - } - } - }, null, style)); - } - } - } - function loadStyleSheet(sheet, callback, reload, remaining, modifyVars) { - var instanceOptions = clone(options); - addDataAttr(instanceOptions, sheet); - instanceOptions.mime = sheet.type; - if (modifyVars) { - instanceOptions.modifyVars = modifyVars; - } - function loadInitialFileCallback(loadedFile) { - var data = loadedFile.contents; - var path = loadedFile.filename; - var webInfo = loadedFile.webInfo; - var newFileInfo = { - currentDirectory: fileManager.getPath(path), - filename: path, - rootFilename: path, - rewriteUrls: instanceOptions.rewriteUrls - }; - newFileInfo.entryPath = newFileInfo.currentDirectory; - newFileInfo.rootpath = instanceOptions.rootpath || newFileInfo.currentDirectory; - if (webInfo) { - webInfo.remaining = remaining; - var css = cache.getCSS(path, webInfo, instanceOptions.modifyVars); - if (!reload && css) { - webInfo.local = true; - callback(null, css, data, sheet, webInfo, path); - return; - } - } - // TODO add tests around how this behaves when reloading - errors.remove(path); - instanceOptions.rootFileInfo = newFileInfo; - less.render(data, instanceOptions, function (e, result) { - if (e) { - e.href = path; - callback(e); - } - else { - cache.setCSS(sheet.href, webInfo.lastModified, instanceOptions.modifyVars, result.css); - callback(null, result.css, data, sheet, webInfo, path); - } - }); - } - fileManager.loadFile(sheet.href, null, instanceOptions, environment) - .then(function (loadedFile) { - loadInitialFileCallback(loadedFile); - }).catch(function (err) { - console.log(err); - callback(err); - }); - } - function loadStyleSheets(callback, reload, modifyVars) { - for (var i = 0; i < less.sheets.length; i++) { - loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1), modifyVars); - } - } - function initRunningMode() { - if (less.env === 'development') { - less.watchTimer = setInterval(function () { - if (less.watchMode) { - fileManager.clearFileCache(); - loadStyleSheets(function (e, css, _, sheet, webInfo) { - if (e) { - errors.add(e, e.href || sheet.href); - } - else if (css) { - browser.createCSS(window.document, css, sheet); - } - }); - } - }, options.poll); - } - } - // - // Watch mode - // - less.watch = function () { - if (!less.watchMode) { - less.env = 'development'; - initRunningMode(); - } - this.watchMode = true; - return true; - }; - less.unwatch = function () { clearInterval(less.watchTimer); this.watchMode = false; return false; }; - // - // Synchronously get all tags with the 'rel' attribute set to - // "stylesheet/less". - // - less.registerStylesheetsImmediately = function () { - var links = document.getElementsByTagName('link'); - less.sheets = []; - for (var i = 0; i < links.length; i++) { - if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) && - (links[i].type.match(typePattern)))) { - less.sheets.push(links[i]); - } - } - }; - // - // Asynchronously get all tags with the 'rel' attribute set to - // "stylesheet/less", returning a Promise. - // - less.registerStylesheets = function () { return new Promise(function (resolve, reject) { - less.registerStylesheetsImmediately(); - resolve(); - }); }; - // - // With this function, it's possible to alter variables and re-render - // CSS without reloading less-files - // - less.modifyVars = function (record) { return less.refresh(true, record, false); }; - less.refresh = function (reload, modifyVars, clearFileCache) { - if ((reload || clearFileCache) && clearFileCache !== false) { - fileManager.clearFileCache(); - } - return new Promise(function (resolve, reject) { - var startTime; - var endTime; - var totalMilliseconds; - var remainingSheets; - startTime = endTime = new Date(); - // Set counter for remaining unprocessed sheets - remainingSheets = less.sheets.length; - if (remainingSheets === 0) { - endTime = new Date(); - totalMilliseconds = endTime - startTime; - less.logger.info('Less has finished and no sheets were loaded.'); - resolve({ - startTime: startTime, - endTime: endTime, - totalMilliseconds: totalMilliseconds, - sheets: less.sheets.length - }); - } - else { - // Relies on less.sheets array, callback seems to be guaranteed to be called for every element of the array - loadStyleSheets(function (e, css, _, sheet, webInfo) { - if (e) { - errors.add(e, e.href || sheet.href); - reject(e); - return; - } - if (webInfo.local) { - less.logger.info("Loading " + sheet.href + " from cache."); - } - else { - less.logger.info("Rendered " + sheet.href + " successfully."); - } - browser.createCSS(window.document, css, sheet); - less.logger.info("CSS for " + sheet.href + " generated in " + (new Date() - endTime) + "ms"); - // Count completed sheet - remainingSheets--; - // Check if the last remaining sheet was processed and then call the promise - if (remainingSheets === 0) { - totalMilliseconds = new Date() - startTime; - less.logger.info("Less has finished. CSS generated in " + totalMilliseconds + "ms"); - resolve({ - startTime: startTime, - endTime: endTime, - totalMilliseconds: totalMilliseconds, - sheets: less.sheets.length - }); - } - endTime = new Date(); - }, reload, modifyVars); - } - loadStyles(modifyVars); - }); - }; - less.refreshStyles = loadStyles; - return less; - }); + // + var root = (function (window, options) { + var document = window.document; + var less = lessRoot(); + less.options = options; + var environment = less.environment; + var FileManager = FM(options, less.logger); + var fileManager = new FileManager(); + environment.addFileManager(fileManager); + less.FileManager = FileManager; + less.PluginLoader = PluginLoader; + LogListener(less, options); + var errors = ErrorReporting(window, less, options); + var cache = less.cache = options.cache || Cache(window, options, less.logger); + ImageSize(less.environment); + // Setup user functions - Deprecate? + if (options.functions) { + less.functions.functionRegistry.addMultiple(options.functions); + } + var typePattern = /^text\/(x-)?less$/; + function clone(obj) { + var cloned = {}; + for (var prop in obj) { + if (obj.hasOwnProperty(prop)) { + cloned[prop] = obj[prop]; + } + } + return cloned; + } + // only really needed for phantom + function bind(func, thisArg) { + var curryArgs = Array.prototype.slice.call(arguments, 2); + return function () { + var args = curryArgs.concat(Array.prototype.slice.call(arguments, 0)); + return func.apply(thisArg, args); + }; + } + function loadStyles(modifyVars) { + var styles = document.getElementsByTagName('style'); + var style; + for (var i = 0; i < styles.length; i++) { + style = styles[i]; + if (style.type.match(typePattern)) { + var instanceOptions = clone(options); + instanceOptions.modifyVars = modifyVars; + var lessText = style.innerHTML || ''; + instanceOptions.filename = document.location.href.replace(/#.*$/, ''); + /* jshint loopfunc:true */ + // use closure to store current style + less.render(lessText, instanceOptions, bind(function (style, e, result) { + if (e) { + errors.add(e, 'inline'); + } + else { + style.type = 'text/css'; + if (style.styleSheet) { + style.styleSheet.cssText = result.css; + } + else { + style.innerHTML = result.css; + } + } + }, null, style)); + } + } + } + function loadStyleSheet(sheet, callback, reload, remaining, modifyVars) { + var instanceOptions = clone(options); + addDataAttr(instanceOptions, sheet); + instanceOptions.mime = sheet.type; + if (modifyVars) { + instanceOptions.modifyVars = modifyVars; + } + function loadInitialFileCallback(loadedFile) { + var data = loadedFile.contents; + var path = loadedFile.filename; + var webInfo = loadedFile.webInfo; + var newFileInfo = { + currentDirectory: fileManager.getPath(path), + filename: path, + rootFilename: path, + rewriteUrls: instanceOptions.rewriteUrls + }; + newFileInfo.entryPath = newFileInfo.currentDirectory; + newFileInfo.rootpath = instanceOptions.rootpath || newFileInfo.currentDirectory; + if (webInfo) { + webInfo.remaining = remaining; + var css = cache.getCSS(path, webInfo, instanceOptions.modifyVars); + if (!reload && css) { + webInfo.local = true; + callback(null, css, data, sheet, webInfo, path); + return; + } + } + // TODO add tests around how this behaves when reloading + errors.remove(path); + instanceOptions.rootFileInfo = newFileInfo; + less.render(data, instanceOptions, function (e, result) { + if (e) { + e.href = path; + callback(e); + } + else { + cache.setCSS(sheet.href, webInfo.lastModified, instanceOptions.modifyVars, result.css); + callback(null, result.css, data, sheet, webInfo, path); + } + }); + } + fileManager.loadFile(sheet.href, null, instanceOptions, environment) + .then(function (loadedFile) { + loadInitialFileCallback(loadedFile); + }).catch(function (err) { + console.log(err); + callback(err); + }); + } + function loadStyleSheets(callback, reload, modifyVars) { + for (var i = 0; i < less.sheets.length; i++) { + loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1), modifyVars); + } + } + function initRunningMode() { + if (less.env === 'development') { + less.watchTimer = setInterval(function () { + if (less.watchMode) { + fileManager.clearFileCache(); + loadStyleSheets(function (e, css, _, sheet, webInfo) { + if (e) { + errors.add(e, e.href || sheet.href); + } + else if (css) { + browser.createCSS(window.document, css, sheet); + } + }); + } + }, options.poll); + } + } + // + // Watch mode + // + less.watch = function () { + if (!less.watchMode) { + less.env = 'development'; + initRunningMode(); + } + this.watchMode = true; + return true; + }; + less.unwatch = function () { clearInterval(less.watchTimer); this.watchMode = false; return false; }; + // + // Synchronously get all tags with the 'rel' attribute set to + // "stylesheet/less". + // + less.registerStylesheetsImmediately = function () { + var links = document.getElementsByTagName('link'); + less.sheets = []; + for (var i = 0; i < links.length; i++) { + if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) && + (links[i].type.match(typePattern)))) { + less.sheets.push(links[i]); + } + } + }; + // + // Asynchronously get all tags with the 'rel' attribute set to + // "stylesheet/less", returning a Promise. + // + less.registerStylesheets = function () { return new Promise(function (resolve, reject) { + less.registerStylesheetsImmediately(); + resolve(); + }); }; + // + // With this function, it's possible to alter variables and re-render + // CSS without reloading less-files + // + less.modifyVars = function (record) { return less.refresh(true, record, false); }; + less.refresh = function (reload, modifyVars, clearFileCache) { + if ((reload || clearFileCache) && clearFileCache !== false) { + fileManager.clearFileCache(); + } + return new Promise(function (resolve, reject) { + var startTime; + var endTime; + var totalMilliseconds; + var remainingSheets; + startTime = endTime = new Date(); + // Set counter for remaining unprocessed sheets + remainingSheets = less.sheets.length; + if (remainingSheets === 0) { + endTime = new Date(); + totalMilliseconds = endTime - startTime; + less.logger.info('Less has finished and no sheets were loaded.'); + resolve({ + startTime: startTime, + endTime: endTime, + totalMilliseconds: totalMilliseconds, + sheets: less.sheets.length + }); + } + else { + // Relies on less.sheets array, callback seems to be guaranteed to be called for every element of the array + loadStyleSheets(function (e, css, _, sheet, webInfo) { + if (e) { + errors.add(e, e.href || sheet.href); + reject(e); + return; + } + if (webInfo.local) { + less.logger.info("Loading " + sheet.href + " from cache."); + } + else { + less.logger.info("Rendered " + sheet.href + " successfully."); + } + browser.createCSS(window.document, css, sheet); + less.logger.info("CSS for " + sheet.href + " generated in " + (new Date() - endTime) + "ms"); + // Count completed sheet + remainingSheets--; + // Check if the last remaining sheet was processed and then call the promise + if (remainingSheets === 0) { + totalMilliseconds = new Date() - startTime; + less.logger.info("Less has finished. CSS generated in " + totalMilliseconds + "ms"); + resolve({ + startTime: startTime, + endTime: endTime, + totalMilliseconds: totalMilliseconds, + sheets: less.sheets.length + }); + } + endTime = new Date(); + }, reload, modifyVars); + } + loadStyles(modifyVars); + }); + }; + less.refreshStyles = loadStyles; + return less; + }); - /** - * Kicks off less and compiles any stylesheets - * used in the browser distributed version of less - * to kick-start less using the browser api - */ - var options$1 = defaultOptions(); - if (window.less) { - for (var key in window.less) { - if (window.less.hasOwnProperty(key)) { - options$1[key] = window.less[key]; - } - } - } - addDefaultOptions(window, options$1); - options$1.plugins = options$1.plugins || []; - if (window.LESS_PLUGINS) { - options$1.plugins = options$1.plugins.concat(window.LESS_PLUGINS); - } - var less = root(window, options$1); - window.less = less; - var css; - var head; - var style; - // Always restore page visibility - function resolveOrReject(data) { - if (data.filename) { - console.warn(data); - } - if (!options$1.async) { - head.removeChild(style); - } - } - if (options$1.onReady) { - if (/!watch/.test(window.location.hash)) { - less.watch(); - } - // Simulate synchronous stylesheet loading by hiding page rendering - if (!options$1.async) { - css = 'body { display: none !important }'; - head = document.head || document.getElementsByTagName('head')[0]; - style = document.createElement('style'); - style.type = 'text/css'; - if (style.styleSheet) { - style.styleSheet.cssText = css; - } - else { - style.appendChild(document.createTextNode(css)); - } - head.appendChild(style); - } - less.registerStylesheetsImmediately(); - less.pageLoadFinished = less.refresh(less.env === 'development').then(resolveOrReject, resolveOrReject); - } + /** + * Kicks off less and compiles any stylesheets + * used in the browser distributed version of less + * to kick-start less using the browser api + */ + var options$1 = defaultOptions(); + if (window.less) { + for (var key in window.less) { + if (window.less.hasOwnProperty(key)) { + options$1[key] = window.less[key]; + } + } + } + addDefaultOptions(window, options$1); + options$1.plugins = options$1.plugins || []; + if (window.LESS_PLUGINS) { + options$1.plugins = options$1.plugins.concat(window.LESS_PLUGINS); + } + var less = root(window, options$1); + window.less = less; + var css; + var head; + var style; + // Always restore page visibility + function resolveOrReject(data) { + if (data.filename) { + console.warn(data); + } + if (!options$1.async) { + head.removeChild(style); + } + } + if (options$1.onReady) { + if (/!watch/.test(window.location.hash)) { + less.watch(); + } + // Simulate synchronous stylesheet loading by hiding page rendering + if (!options$1.async) { + css = 'body { display: none !important }'; + head = document.head || document.getElementsByTagName('head')[0]; + style = document.createElement('style'); + style.type = 'text/css'; + if (style.styleSheet) { + style.styleSheet.cssText = css; + } + else { + style.appendChild(document.createTextNode(css)); + } + head.appendChild(style); + } + less.registerStylesheetsImmediately(); + less.pageLoadFinished = less.refresh(less.env === 'development').then(resolveOrReject, resolveOrReject); + } - return less; + return less; }))); diff --git a/packages/less/dist/less.min.js b/packages/less/dist/less.min.js index 9f7e1a855..302041fa6 100644 --- a/packages/less/dist/less.min.js +++ b/packages/less/dist/less.min.js @@ -1,5 +1,5 @@ /** - * Less - Leaner CSS v3.12.2 + * Less - Leaner CSS v3.12.1-alpha.13+ed734098 * http://lesscss.org * * Copyright (c) 2009-2020, Alexis Sellier @@ -7,5 +7,5 @@ * * @license Apache-2.0 */ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).less=t()}(this,(function(){"use strict";function e(e){return e.replace(/^[a-z-]+:\/+?[^\/]+/,"").replace(/[\?\&]livereload=\w+/,"").replace(/^\//,"").replace(/\.[a-zA-Z]+$/,"").replace(/[^\.\w-]+/g,"-").replace(/\./g,":")}function t(e,t){for(var n in t.dataset)if(t.dataset.hasOwnProperty(n))if("env"===n||"dumpLineNumbers"===n||"rootpath"===n||"errorReporting"===n)e[n]=t.dataset[n];else try{e[n]=JSON.parse(t.dataset[n])}catch(e){}}var n=function(t,n,i){var r=i.href||"",o="less:"+(i.title||e(r)),s=t.getElementById(o),a=!1,l=t.createElement("style");l.setAttribute("type","text/css"),i.media&&l.setAttribute("media",i.media),l.id=o,l.styleSheet||(l.appendChild(t.createTextNode(n)),a=null!==s&&s.childNodes.length>0&&l.childNodes.length>0&&s.firstChild.nodeValue===l.firstChild.nodeValue);var u=t.getElementsByTagName("head")[0];if(null===s||!1===a){var c=i&&i.nextSibling||null;c?c.parentNode.insertBefore(l,c):u.appendChild(l)}if(s&&!1===a&&s.parentNode.removeChild(s),l.styleSheet)try{l.styleSheet.cssText=n}catch(e){throw new Error("Couldn't reassign styleSheet.cssText.")}},i=function(e){var t,n=e.document;return n.currentScript||(t=n.getElementsByTagName("script"))[t.length-1]},r=function(e,t){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};function o(e,t){function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var s=function(){return(s=Object.assign||function(e){for(var t,n=1,i=arguments.length;nt?1:void 0};var f=function(e){function t(t,n,i){var r=e.call(this)||this,o=r;return Array.isArray(t)?r.rgb=t:t.length>=6?(r.rgb=[],t.match(/.{2}/g).map((function(e,t){t<3?o.rgb.push(parseInt(e,16)):o.alpha=parseInt(e,16)/255}))):(r.rgb=[],t.split("").map((function(e,t){t<3?o.rgb.push(parseInt(e+e,16)):o.alpha=parseInt(e+e,16)/255}))),r.alpha=r.alpha||("number"==typeof n?n:1),void 0!==i&&(r.value=i),r}return o(t,e),t.prototype.luma=function(){var e=this.rgb[0]/255,t=this.rgb[1]/255,n=this.rgb[2]/255;return.2126*(e=e<=.03928?e/12.92:Math.pow((e+.055)/1.055,2.4))+.7152*(t=t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4))+.0722*(n=n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4))},t.prototype.genCSS=function(e,t){t.add(this.toCSS(e))},t.prototype.toCSS=function(e,t){var n,i,r,o=e&&e.compress&&!t,s=[];if(i=this.fround(e,this.alpha),this.value)if(0===this.value.indexOf("rgb"))i<1&&(r="rgba");else{if(0!==this.value.indexOf("hsl"))return this.value;r=i<1?"hsla":"hsl"}else i<1&&(r="rgba");switch(r){case"rgba":s=this.rgb.map((function(e){return p(Math.round(e),255)})).concat(p(i,1));break;case"hsla":s.push(p(i,1));case"hsl":n=this.toHSL(),s=[this.fround(e,n.h),this.fround(e,100*n.s)+"%",this.fround(e,100*n.l)+"%"].concat(s)}if(r)return r+"("+s.join(","+(o?"":" "))+")";if(n=this.toRGB(),o){var a=n.split("");a[1]===a[2]&&a[3]===a[4]&&a[5]===a[6]&&(n="#"+a[1]+a[3]+a[5])}return n},t.prototype.operate=function(e,n,i){for(var r=new Array(3),o=this.alpha*(1-i.alpha)+i.alpha,s=0;s<3;s++)r[s]=this._operate(e,n,this.rgb[s],i.rgb[s]);return new t(r,o)},t.prototype.toRGB=function(){return v(this.rgb)},t.prototype.toHSL=function(){var e,t,n=this.rgb[0]/255,i=this.rgb[1]/255,r=this.rgb[2]/255,o=this.alpha,s=Math.max(n,i,r),a=Math.min(n,i,r),l=(s+a)/2,u=s-a;if(s===a)e=t=0;else{switch(t=l>.5?u/(2-s-a):u/(s+a),s){case n:e=(i-r)/u+(i=0&&"\n"!==t.charAt(n);)r++;return"number"==typeof e&&(i=(t.slice(0,e).match(/\n/g)||"").length),{line:i,column:r}}function C(e){var t,n=e.length,i=new Array(n);for(t=0;t|Function):(\d+):(\d+)/,R=function(e,t,n){Error.call(this);var i=e.filename||n;if(this.message=e.message,this.stack=e.stack,t&&i){var r=t.contents[i],o=I(e.index,r),s=o.line,a=o.column,l=e.call&&I(e.call,r).line,u=r?r.split("\n"):"";if(this.type=e.type||"Syntax",this.filename=i,this.index=e.index,this.line="number"==typeof s?s+1:null,this.column=a,!this.line&&this.stack){var c=this.stack.match(E),h=new Function("a","throw new Error()"),f=0;try{h()}catch(e){var p=e.stack.match(E);f=1-parseInt(p[2])}c&&(c[2]&&(this.line=parseInt(c[2])+f),c[3]&&(this.column=parseInt(c[3])))}this.callLine=l+1,this.callExtract=u[l],this.extract=[u[this.line-2],u[this.line-1],u[this.line]]}};if(void 0===Object.create){var V=function(){};V.prototype=Error.prototype,R.prototype=new V}else R.prototype=Object.create(Error.prototype);R.prototype.constructor=R,R.prototype.toString=function(e){void 0===e&&(e={});var t="",n=this.extract||[],i=[],r=function(e){return e};if(e.stylize){var o=typeof e.stylize;if("function"!==o)throw Error("options.stylize should be a function, got a "+o+"!");r=e.stylize}if(null!==this.line){if("string"==typeof n[0]&&i.push(r(this.line-1+" "+n[0],"grey")),"string"==typeof n[1]){var s=this.line+" ";n[1]&&(s+=n[1].slice(0,this.column)+r(r(r(n[1].substr(this.column,1),"bold")+n[1].slice(this.column+1),"red"),"inverse")),i.push(s)}"string"==typeof n[2]&&i.push(r(this.line+1+" "+n[2],"grey")),i=i.join("\n")+r("","reset")+"\n"}return t+=r(this.type+"Error: "+this.message,"red"),this.filename&&(t+=r(" in ","red")+this.filename),this.line&&(t+=r(" on line "+this.line+", column "+(this.column+1)+":","grey")),t+="\n"+i,this.callLine&&(t+=r("from ","red")+(this.filename||"")+"/n",t+=r(this.callLine,"grey")+" "+this.callExtract+"/n"),t};var F=function(e){function t(t,n,i,r,o,s){var a=e.call(this)||this;return a.extendList=n,a.condition=i,a.evaldCondition=!i,a._index=r,a._fileInfo=o,a.elements=a.getElements(t),a.mixinElements_=void 0,a.copyVisibilityInfo(s),a.setParent(a.elements,a),a}return o(t,e),t.prototype.accept=function(e){this.elements&&(this.elements=e.visitArray(this.elements)),this.extendList&&(this.extendList=e.visitArray(this.extendList)),this.condition&&(this.condition=e.visit(this.condition))},t.prototype.createDerived=function(e,n,i){var r=new t(e=this.getElements(e),n||this.extendList,null,this.getIndex(),this.fileInfo(),this.visibilityInfo());return r.evaldCondition=null!=i?i:this.evaldCondition,r.mediaEmpty=this.mediaEmpty,r},t.prototype.getElements=function(e){return e?("string"==typeof e&&this.parse.parseNode(e,["selector"],this._index,this._fileInfo,(function(t,n){if(t)throw new R({index:t.index,message:t.message},this.parse.imports,this._fileInfo.filename);e=n[0].elements})),e):[new y("","&",!1,this._index,this._fileInfo)]},t.prototype.createEmptySelectors=function(){var e=[new t([new y("","&",!1,this._index,this._fileInfo)],null,null,this._index,this._fileInfo)];return e[0].mediaEmpty=!0,e},t.prototype.match=function(e){var t,n,i=this.elements,r=i.length;if(0===(t=(e=e.mixinElements()).length)||rb.PARENS_DIVISION)||this.parensStack&&this.parensStack.length))},e.prototype.pathRequiresRewrite=function(e){return(this.rewriteUrls===x?W:G)(e)},e.prototype.rewritePath=function(e,t){var n;return t=t||"",n=this.normalizePath(t+e),W(e)&&G(t)&&!1===W(n)&&(n="./"+n),n},e.prototype.normalizePath=function(e){var t,n=e.split("/").reverse();for(e=[];0!==n.length;)switch(t=n.pop()){case".":break;case"..":0===e.length||".."===e[e.length-1]?e.push(t):e.pop();break;default:e.push(t)}return e.join("/")},e}();var J=function e(t){return{_data:{},add:function(e,t){e=e.toLowerCase(),this._data.hasOwnProperty(e),this._data[e]=t},addMultiple:function(e){var t=this;Object.keys(e).forEach((function(n){t.add(n,e[n])}))},get:function(e){return this._data[e]||t&&t.get(e)},getLocalFunctions:function(){return this._data},inherit:function(){return e(this)},create:function(t){return e(t)}}}(null),H={eval:function(){var e=this.value_,t=this.error_;if(t)throw t;if(null!=e)return e?O.True:O.False},value:function(e){this.value_=e},error:function(e){this.error_=e},reset:function(){this.value_=this.error_=null}},Q=function(e){function t(t,n,i,r){var o=e.call(this)||this;return o.selectors=t,o.rules=n,o._lookups={},o._variables=null,o._properties=null,o.strictImports=i,o.copyVisibilityInfo(r),o.allowRoot=!0,o.setParent(o.selectors,o),o.setParent(o.rules,o),o}return o(t,e),t.prototype.isRulesetLike=function(){return!0},t.prototype.accept=function(e){this.paths?this.paths=e.visitArray(this.paths,!0):this.selectors&&(this.selectors=e.visitArray(this.selectors)),this.rules&&this.rules.length&&(this.rules=e.visitArray(this.rules))},t.prototype.eval=function(e){var n,i,r,o,s,a=!1;if(this.selectors&&(i=this.selectors.length)){for(n=new Array(i),H.error({type:"Syntax",message:"it is currently only allowed in parametric mixin guards,"}),o=0;o0;e--){var t=this.rules[e-1];if(t instanceof N)return this.parseValue(t)}},t.prototype.parseValue=function(e){var t=this;function n(e){return e.value instanceof L&&!e.parsed?("string"==typeof e.value.value?this.parse.parseNode(e.value.value,["value","important"],e.value.getIndex(),e.fileInfo(),(function(t,n){t&&(e.parsed=!0),n&&(e.value=n[0],e.important=n[1]||"",e.parsed=!0)})):e.parsed=!0,e):e}if(Array.isArray(e)){var i=[];return e.forEach((function(e){i.push(n.call(t,e))})),i}return n.call(t,e)},t.prototype.rulesets=function(){if(!this.rules)return[];var e,t,n=[],i=this.rules;for(e=0;t=i[e];e++)t.isRuleset&&n.push(t);return n},t.prototype.prependRule=function(e){var t=this.rules;t?t.unshift(e):this.rules=[e],this.setParent(e,this)},t.prototype.find=function(e,t,n){void 0===t&&(t=this);var i,r,o=[],s=e.toCSS();return s in this._lookups?this._lookups[s]:(this.rulesets().forEach((function(s){if(s!==t)for(var a=0;ai){if(!n||n(s)){r=s.find(new F(e.elements.slice(i)),t,n);for(var l=0;l0&&t.add(l),e.firstSelector=!0,s[0].genCSS(e,t),e.firstSelector=!1,i=1;i0?(o=(r=C(e)).pop(),s=i.createDerived(C(o.elements))):s=i.createDerived([]),t.length>0){var a=n.combinator,l=t[0].elements[0];a.emptyOrWhitespace&&!l.combinator.emptyOrWhitespace&&(a=l.combinator),s.elements.push(new y(a,l.value,n.isVariable,n._index,n._fileInfo)),s.elements=s.elements.concat(t[0].elements.slice(1))}if(0!==s.elements.length&&r.push(s),t.length>1){var u=t.slice(1);u=u.map((function(e){return e.createDerived(e.elements,[])})),r=r.concat(u)}return r}function s(e,t,n,i,r){var s;for(s=0;s0?i[i.length-1]=i[i.length-1].createDerived(i[i.length-1].elements.concat(e)):i.push(new F(e));else t.push([new F(e)])}function l(e,t){var n=t.createDerived(t.elements,t.extendList,t.evaldCondition);return n.copyVisibilityInfo(e),n}var u,c;if(!function e(t,n,l){var u,c,h,f,p,v,m,g,b,w,x,S,I=!1;for(f=[],p=[[]],u=0;g=l.elements[u];u++)if("&"!==g.value){var C=(S=void 0,(x=g).value instanceof d&&(S=x.value.value)instanceof F?S:null);if(null!=C){a(f,p);var k,_=[],A=[];for(k=e(_,n,C),I=I||k,h=0;h<_.length;h++){s(p,[r(i(_[h],g),g)],g,l,A)}p=A,f=[]}else f.push(g)}else{for(I=!0,v=[],a(f,p),c=0;c0&&m[0].elements.push(new y(g.combinator,"",g.isVariable,g._index,g._fileInfo)),v.push(m);else for(h=0;h0&&(t.push(p[u]),w=p[u][b-1],p[u][b-1]=w.createDerived(w.elements,l.extendList));return I}(c=[],t,n))if(t.length>0)for(c=[],u=0;u0)for(t=0;t-1e-6&&(i=n.toFixed(20).replace(/0+$/,"")),e&&e.compress){if(0===n&&this.unit.isLength())return void t.add(i);n>0&&n<1&&(i=i.substr(1))}t.add(i),this.unit.genCSS(e,t)},t.prototype.operate=function(e,n,i){var r=this._operate(e,n,this.value,i.value),o=this.unit.clone();if("+"===n||"-"===n)if(0===o.numerator.length&&0===o.denominator.length)o=i.unit.clone(),this.unit.backupUnit&&(o.backupUnit=this.unit.backupUnit);else if(0===i.unit.numerator.length&&0===o.denominator.length);else{if(i=i.convertTo(this.unit.usedUnits()),e.strictUnits&&i.unit.toString()!==o.toString())throw new Error("Incompatible units. Change the units or use the unit function. Bad units: '"+o.toString()+"' and '"+i.unit.toString()+"'.");r=this._operate(e,n,this.value,i.value)}else"*"===n?(o.numerator=o.numerator.concat(i.unit.numerator).sort(),o.denominator=o.denominator.concat(i.unit.denominator).sort(),o.cancel()):"/"===n&&(o.numerator=o.numerator.concat(i.unit.denominator).sort(),o.denominator=o.denominator.concat(i.unit.numerator).sort(),o.cancel());return new t(r,o)},t.prototype.compare=function(e){var n,i;if(e instanceof t){if(this.unit.isEmpty()||e.unit.isEmpty())n=this,i=e;else if(n=this.unify(),i=e.unify(),0!==n.unit.compare(i.unit))return;return h.numericCompare(n.value,i.value)}},t.prototype.unify=function(){return this.convertTo({length:"px",duration:"s",angle:"rad"})},t.prototype.convertTo=function(e){var n,i,r,o,s,a=this.value,l=this.unit.clone(),c={};if("string"==typeof e){for(n in u)u[n].hasOwnProperty(e)&&((c={})[n]=e);e=c}for(i in s=function(e,t){return r.hasOwnProperty(e)?(t?a/=r[e]/r[o]:a*=r[e]/r[o],o):e},e)e.hasOwnProperty(i)&&(o=e[i],r=u[i],l.map(s));return l.cancel(),new t(a,l)},t}(h);X.prototype.type="Dimension";var ee=b,te=function(e){function t(t,n,i){var r=e.call(this)||this;return r.op=t.trim(),r.operands=n,r.isSpaced=i,r}return o(t,e),t.prototype.accept=function(e){this.operands=e.visitArray(this.operands)},t.prototype.eval=function(e){var n,i=this.operands[0].eval(e),r=this.operands[1].eval(e);if(e.isMathOn(this.op)){if(n="./"===this.op?"/":this.op,i instanceof X&&r instanceof f&&(i=i.toColor()),r instanceof X&&i instanceof f&&(r=r.toColor()),!i.operate){if(i instanceof t&&"/"===i.op&&e.math===ee.PARENS_DIVISION)return new t(this.op,[i,r],this.isSpaced);throw{type:"Operation",message:"Operation on an invalid type"}}return i.operate(e,n,r)}return new t(this.op,[i,r],this.isSpaced)},t.prototype.genCSS=function(e,t){this.operands[0].genCSS(e,t),this.isSpaced&&t.add(" "),t.add(this.op),this.isSpaced&&t.add(" "),this.operands[1].genCSS(e,t)},t}(h);te.prototype.type="Operation";var ne=b,ie=function(e){function t(t,n){var i=e.call(this)||this;if(i.value=t,i.noSpacing=n,!t)throw new Error("Expression requires an array parameter");return i}return o(t,e),t.prototype.accept=function(e){this.value=e.visitArray(this.value)},t.prototype.eval=function(e){var n,i=e.isMathOn(),r=this.parens&&(e.math!==ne.STRICT_LEGACY||!this.parensInOp),o=!1;return r&&e.inParenthesis(),this.value.length>1?n=new t(this.value.map((function(t){return t.eval?t.eval(e):t})),this.noSpacing):1===this.value.length?(!this.value[0].parens||this.value[0].parensInOp||e.inCalc||(o=!0),n=this.value[0].eval(e)):n=this,r&&e.outOfParenthesis(),!this.parens||!this.parensInOp||i||o||n instanceof X||(n=new d(n)),n},t.prototype.genCSS=function(e,t){for(var n=0;n1){var n=new F([],null,null,this.getIndex(),this.fileInfo()).createEmptySelectors();(t=new Q(n,e.mediaBlocks)).multiMedia=!0,t.copyVisibilityInfo(this.visibilityInfo()),this.setParent(t,this)}return delete e.mediaBlocks,delete e.mediaPath,t},t.prototype.evalNested=function(e){var t,n,i=e.mediaPath.concat([this]);for(t=0;t0;t--)e.splice(t,0,new L("and"));return new ie(e)}))),this.setParent(this.features,this),new Q([],[])},t.prototype.permute=function(e){if(0===e.length)return[];if(1===e.length)return e[0];for(var t=[],n=this.permute(e.slice(1)),i=0;i1?"["+e.value.map((function(e){return e.toCSS()})).join(", ")+"]":e.toCSS()},t}(h));pe.prototype.type="JavaScript";var ve=function(e){function t(t,n){var i=e.call(this)||this;return i.key=t,i.value=n,i}return o(t,e),t.prototype.accept=function(e){this.value=e.visit(this.value)},t.prototype.eval=function(e){return this.value.eval?new t(this.key,this.value.eval(e)):this},t.prototype.genCSS=function(e,t){t.add(this.key+"="),this.value.genCSS?this.value.genCSS(e,t):t.add(this.value)},t}(h);ve.prototype.type="Assignment";var de=function(e){function t(t,n,i,r,o){var s=e.call(this)||this;return s.op=t.trim(),s.lvalue=n,s.rvalue=i,s._index=r,s.negate=o,s}return o(t,e),t.prototype.accept=function(e){this.lvalue=e.visit(this.lvalue),this.rvalue=e.visit(this.rvalue)},t.prototype.eval=function(e){var t=function(e,t,n){switch(e){case"and":return t&&n;case"or":return t||n;default:switch(h.compare(t,n)){case-1:return"<"===e||"=<"===e||"<="===e;case 0:return"="===e||">="===e||"=<"===e||"<="===e;case 1:return">"===e||">="===e;default:return!1}}}(this.op,this.lvalue.eval(e),this.rvalue.eval(e));return this.negate?!t:t},t}(h);de.prototype.type="Condition";var me=function(e){function t(t){var n=e.call(this)||this;return n.value=t,n}return o(t,e),t}(h);me.prototype.type="UnicodeDescriptor";var ge=function(e){function t(t){var n=e.call(this)||this;return n.value=t,n}return o(t,e),t.prototype.genCSS=function(e,t){t.add("-"),this.value.genCSS(e,t)},t.prototype.eval=function(e){return e.isMathOn()?new te("*",[new X(-1),this.value]).eval(e):new t(this.value.eval(e))},t}(h);ge.prototype.type="Negative";var ye=function(e){function t(n,i,r,o,s){var a=e.call(this)||this;switch(a.selector=n,a.option=i,a.object_id=t.next_id++,a.parent_ids=[a.object_id],a._index=r,a._fileInfo=o,a.copyVisibilityInfo(s),a.allowRoot=!0,i){case"all":a.allowBefore=!0,a.allowAfter=!0;break;default:a.allowBefore=!1,a.allowAfter=!1}return a.setParent(a.selector,a),a}return o(t,e),t.prototype.accept=function(e){this.selector=e.visit(this.selector)},t.prototype.eval=function(e){return new t(this.selector.eval(e),this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},t.prototype.clone=function(e){return new t(this.selector,this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},t.prototype.findSelfSelectors=function(e){var t,n,i=[];for(t=0;t0&&n.length&&""===n[0].combinator.value&&(n[0].combinator.value=" "),i=i.concat(e[t].elements);this.selfSelectors=[new F(i)],this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo())},t}(h);ye.next_id=0,ye.prototype.type="Extend";var be=function(e){function t(t,n,i){var r=e.call(this)||this;return r.variable=t,r._index=n,r._fileInfo=i,r.allowRoot=!0,r}return o(t,e),t.prototype.eval=function(e){var t,n=new se(this.variable,this.getIndex(),this.fileInfo()).eval(e),i=new R({message:"Could not evaluate variable call "+this.variable});if(!n.ruleset){if(n.rules)t=n;else if(Array.isArray(n))t=new Q("",n);else{if(!Array.isArray(n.value))throw i;t=new Q("",n.value)}n=new Z(t)}if(n.ruleset)return n.callEval(e);throw i},t}(h);be.prototype.type="VariableCall";var we=function(e){function t(t,n,i,r){var o=e.call(this)||this;return o.value=t,o.lookups=n,o._index=i,o._fileInfo=r,o}return o(t,e),t.prototype.eval=function(e){var t,n,i=this.value.eval(e);for(t=0;tthis.params.length)return!1}n=Math.min(o,this.arity);for(var s=0;s0){for(c=!0,a=0;a0)f=2;else if(f=1,p[1]+p[2]>1)throw{type:"Runtime",message:"Ambiguous use of `default()` found when matching for `"+this.format(m)+"`",index:this.getIndex(),filename:this.fileInfo().filename};for(a=0;a=0;s--){var a=o[s];if(a[r?"supportsSync":"supports"](e,t,n,i))return a}return null},e.prototype.addFileManager=function(e){this.fileManagers.push(e)},e.prototype.clearFileManagers=function(){this.fileManagers=[]},e}(),_e=function(){function e(){}return e.prototype.getPath=function(e){var t=e.lastIndexOf("?");return t>0&&(e=e.slice(0,t)),(t=e.lastIndexOf("/"))<0&&(t=e.lastIndexOf("\\")),t<0?"":e.slice(0,t+1)},e.prototype.tryAppendExtension=function(e,t){return/(\.[a-z]*$)|([\?;].*)$/.test(e)?e:e+t},e.prototype.tryAppendLessExtension=function(e){return this.tryAppendExtension(e,".less")},e.prototype.supportsSync=function(){return!1},e.prototype.alwaysMakePathsAbsolute=function(){return!1},e.prototype.isPathAbsolute=function(e){return/^(?:[a-z-]+:|\/|\\|#)/i.test(e)},e.prototype.join=function(e,t){return e?e+t:t},e.prototype.pathDiff=function(e,t){var n,i,r,o,s=this.extractUrlParts(e),a=this.extractUrlParts(t),l="";if(s.hostPart!==a.hostPart)return"";for(i=Math.max(a.directories.length,s.directories.length),n=0;nparseInt(t[n])?-1:1;return 0},e.prototype.versionToString=function(e){for(var t="",n=0;n0;){var e=this.imports[0];if(!e.isReady)return;this.imports=this.imports.slice(1),e.callback.apply(null,e.args)}if(0===this.variableImports.length)break;var t=this.variableImports[0];this.variableImports=this.variableImports.slice(1),t()}}finally{this._currentDepth--}0===this._currentDepth&&this._onSequencerEmpty&&this._onSequencerEmpty()},e}(),Fe=function(e,t){this._visitor=new Re(this),this._importer=e,this._finish=t,this.context=new q.Eval,this.importCount=0,this.onceFileDetectionMap={},this.recursionDetector={},this._sequencer=new Ve(this._onSequencerEmpty.bind(this))};Fe.prototype={isReplacing:!1,run:function(e){try{this._visitor.visit(e)}catch(e){this.error=e}this.isFinished=!0,this._sequencer.tryRun()},_onSequencerEmpty:function(){this.isFinished&&this._finish(this.error)},visitImport:function(e,t){var n=e.options.inline;if(!e.css||n){var i=new q.Eval(this.context,C(this.context.frames)),r=i.frames[0];this.importCount++,e.isVariableImport()?this._sequencer.addVariableImport(this.processImportNode.bind(this,e,i,r)):this.processImportNode(e,i,r)}t.visitDeeper=!1},processImportNode:function(e,t,n){var i,r=e.options.inline;try{i=e.evalForImport(t)}catch(t){t.filename||(t.index=e.getIndex(),t.filename=e.fileInfo().filename),e.css=!0,e.error=t}if(!i||i.css&&!r)this.importCount--,this.isFinished&&this._sequencer.tryRun();else{i.options.multiple&&(t.importMultiple=!0);for(var o=void 0===i.css,s=0;s=0||(a=[u.selfSelectors[0]],(o=f.findMatch(l,a)).length&&(l.hasFoundMatches=!0,l.selfSelectors.forEach((function(e){var t=u.visibilityInfo();s=f.extendSelector(o,a,e,l.isVisible()),(c=new Ie.Extend(u.selector,u.option,0,u.fileInfo(),t)).selfSelectors=s,s[s.length-1].extendList=[c],h.push(c),c.ruleset=u.ruleset,c.parent_ids=c.parent_ids.concat(u.parent_ids,l.parent_ids),u.firstExtendOnThisSelectorPath&&(c.firstExtendOnThisSelectorPath=!0,u.ruleset.paths.push(s))}))));if(h.length){if(this.extendChainCount++,n>100){var p="{unable to calculate}",v="{unable to calculate}";try{p=h[0].selfSelectors[0].toCSS(),v=h[0].selector.toCSS()}catch(e){}throw{message:"extend circular reference detected. One of the circular extends is currently:"+p+":extend("+v+")"}}return h.concat(f.doExtendChaining(h,t,n+1))}return h},e.prototype.visitDeclaration=function(e,t){t.visitDeeper=!1},e.prototype.visitMixinDefinition=function(e,t){t.visitDeeper=!1},e.prototype.visitSelector=function(e,t){t.visitDeeper=!1},e.prototype.visitRuleset=function(e,t){if(!e.root){var n,i,r,o,s=this.allExtendsStack[this.allExtendsStack.length-1],a=[],l=this;for(r=0;r0&&u[l.matched].combinator.value!==s?l=null:l.matched++,l&&(l.finished=l.matched===u.length,l.finished&&!e.allowAfter&&(r+1u&&c>0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[u].elements.slice(c)),c=0,u++),l=o.elements.slice(c,a.index).concat([s]).concat(n.elements.slice(1)),u===a.pathIndex&&r>0?h[h.length-1].elements=h[h.length-1].elements.concat(l):(h=h.concat(t.slice(u,a.pathIndex))).push(new Ie.Selector(l)),u=a.endPathIndex,(c=a.endPathElementIndex)>=t[u].elements.length&&(c=0,u++);return u0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[u].elements.slice(c)),u++),h=(h=h.concat(t.slice(u,t.length))).map((function(e){var t=e.createDerived(e.elements);return i?t.ensureVisibility():t.ensureInvisibility(),t}))},e.prototype.visitMedia=function(e,t){var n=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);n=n.concat(this.doExtendChaining(n,e.allExtends)),this.allExtendsStack.push(n)},e.prototype.visitMediaOut=function(e){var t=this.allExtendsStack.length-1;this.allExtendsStack.length=t},e.prototype.visitAtRule=function(e,t){var n=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);n=n.concat(this.doExtendChaining(n,e.allExtends)),this.allExtendsStack.push(n)},e.prototype.visitAtRuleOut=function(e){var t=this.allExtendsStack.length-1;this.allExtendsStack.length=t},e}(),De=function(){function e(){this.contexts=[[]],this._visitor=new Re(this)}return e.prototype.run=function(e){return this._visitor.visit(e)},e.prototype.visitDeclaration=function(e,t){t.visitDeeper=!1},e.prototype.visitMixinDefinition=function(e,t){t.visitDeeper=!1},e.prototype.visitRuleset=function(e,t){var n,i=this.contexts[this.contexts.length-1],r=[];this.contexts.push(r),e.root||((n=e.selectors)&&(n=n.filter((function(e){return e.getIsOutput()})),e.selectors=n.length?n:n=null,n&&e.joinSelectors(r,i,n)),n||(e.rules=null),e.paths=r)},e.prototype.visitRulesetOut=function(e){this.contexts.length=this.contexts.length-1},e.prototype.visitMedia=function(e,t){var n=this.contexts[this.contexts.length-1];e.rules[0].root=0===n.length||n[0].multiMedia},e.prototype.visitAtRule=function(e,t){var n=this.contexts[this.contexts.length-1];e.rules&&e.rules.length&&(e.rules[0].root=e.isRooted||0===n.length||null)},e}(),Ne=function(){function e(e){this._visitor=new Re(this),this._context=e}return e.prototype.containsSilentNonBlockedChild=function(e){var t;if(!e)return!1;for(var n=0;n0},e.prototype.resolveVisibility=function(e,t){if(!e.blocksVisibility()){if(this.isEmpty(e)&&!this.containsSilentNonBlockedChild(t))return;return e}var n=e.rules[0];if(this.keepOnlyVisibleChilds(n),!this.isEmpty(n))return e.ensureVisibility(),e.removeVisibilityBlock(),e},e.prototype.isVisibleRuleset=function(e){return!!e.firstRoot||!this.isEmpty(e)&&!(!e.root&&!this.hasVisibleSelector(e))},e}(),Be=function(e){this._visitor=new Re(this),this._context=e,this.utils=new Ne(e)};Be.prototype={isReplacing:!0,run:function(e){return this._visitor.visit(e)},visitDeclaration:function(e,t){if(!e.blocksVisibility()&&!e.variable)return e},visitMixinDefinition:function(e,t){e.frames=[]},visitExtend:function(e,t){},visitComment:function(e,t){if(!e.blocksVisibility()&&!e.isSilent(this._context))return e},visitMedia:function(e,t){var n=e.rules[0].rules;return e.accept(this._visitor),t.visitDeeper=!1,this.utils.resolveVisibility(e,n)},visitImport:function(e,t){if(!e.blocksVisibility())return e},visitAtRule:function(e,t){return e.rules&&e.rules.length?this.visitAtRuleWithBody(e,t):this.visitAtRuleWithoutBody(e,t)},visitAnonymous:function(e,t){if(!e.blocksVisibility())return e.accept(this._visitor),e},visitAtRuleWithBody:function(e,t){var n=function(e){var t=e.rules;return function(e){var t=e.rules;return 1===t.length&&(!t[0].paths||0===t[0].paths.length)}(e)?t[0].rules:t}(e);return e.accept(this._visitor),t.visitDeeper=!1,this.utils.isEmpty(e)||this._mergeRules(e.rules[0].rules),this.utils.resolveVisibility(e,n)},visitAtRuleWithoutBody:function(e,t){if(!e.blocksVisibility()){if("@charset"===e.name){if(this.charset){if(e.debugInfo){var n=new Ie.Comment("/* "+e.toCSS(this._context).replace(/\n/g,"")+" */\n");return n.debugInfo=e.debugInfo,this._visitor.visit(n)}return}this.charset=!0}return e}},checkValidNodes:function(e,t){if(e)for(var n=0;n0?e.accept(this._visitor):e.rules=null,t.visitDeeper=!1}return e.rules&&(this._mergeRules(e.rules),this._removeDuplicateRules(e.rules)),this.utils.isVisibleRuleset(e)&&(e.ensureVisibility(),i.splice(0,0,e)),1===i.length?i[0]:i},_compileRulesetPaths:function(e){e.paths&&(e.paths=e.paths.filter((function(e){var t;for(" "===e[0].elements[0].combinator.value&&(e[0].elements[0].combinator=new Ie.Combinator("")),t=0;t=0;i--)if((n=e[i])instanceof Ie.Declaration)if(r[n.name]){(t=r[n.name])instanceof Ie.Declaration&&(t=r[n.name]=[r[n.name].toCSS(this._context)]);var o=n.toCSS(this._context);-1!==t.indexOf(o)?e.splice(i,1):t.push(o)}else r[n.name]=n}},_mergeRules:function(e){if(e){for(var t={},n=[],i=0;i0){var t=e[0],n=[],i=[new Ie.Expression(n)];e.forEach((function(e){"+"===e.merge&&n.length>0&&i.push(new Ie.Expression(n=[])),n.push(e.value),t.important=t.important||e.important})),t.value=new Ie.Value(i)}}))}}};var Ue={Visitor:Re,ImportVisitor:Fe,MarkVisibleSelectorsVisitor:$e,ExtendVisitor:Le,JoinSelectorVisitor:De,ToCSSVisitor:Be},qe=function(){var e,t,n,i,r,o,s,a=[],l={};function u(n){for(var i,a,c,h=l.i,f=t,p=l.i-s,v=l.i+o.length-p,d=l.i+=n,m=e;l.i=0){c={index:l.i,text:m.substr(l.i,y+2-l.i),isLineComment:!1},l.i+=c.text.length-1,l.commentStore.push(c);continue}}break}if(32!==i&&10!==i&&9!==i&&13!==i)break}if(o=o.slice(n+l.i-d+p),s=l.i,!o.length){if(tn||l.i===n&&e&&!i)&&(n=l.i,i=e);var r=a.pop();o=r.current,s=l.i=r.i,t=r.j},l.forget=function(){a.pop()},l.isWhitespace=function(t){var n=l.i+(t||0),i=e.charCodeAt(n);return 32===i||13===i||9===i||10===i},l.$re=function(e){l.i>s&&(o=o.slice(l.i-s),s=l.i);var t=e.exec(o);return t?(u(t[0].length),"string"==typeof t?t:1===t.length?t[0]:t):null},l.$char=function(t){return e.charAt(l.i)!==t?null:(u(1),t)},l.$str=function(t){for(var n=t.length,i=0;ih&&(d=!1)}}while(d);return r||null},l.autoCommentAbsorb=!0,l.commentStore=[],l.finished=!1,l.peek=function(t){if("string"==typeof t){for(var n=0;n57||t<43||47===t||44===t},l.start=function(i,a,c){e=i,l.i=t=s=n=0,r=a?function(e,t){var n,i,r,o,s,a,l,u,c,h=e.length,f=0,p=0,v=[],d=0;function m(t){var n=s-d;n<512&&!t||!n||(v.push(e.slice(d,s+1)),d=s+1)}for(s=0;s=97&&l<=122||l<34))switch(l){case 40:p++,i=s;continue;case 41:if(--p<0)return t("missing opening `(`",s);continue;case 59:p||m();continue;case 123:f++,n=s;continue;case 125:if(--f<0)return t("missing opening `{`",s);f||p||m();continue;case 92:if(s96)){if(u==l){c=1;break}if(92==u){if(s==h-1)return t("unescaped `\\`",s);s++}}if(c)continue;return t("unmatched `"+String.fromCharCode(l)+"`",a);case 47:if(p||s==h-1)continue;if(47==(u=e.charCodeAt(s+1)))for(s+=2;sn&&o>r?"missing closing `}` or `*/`":"missing closing `}`",n):0!==p?t("missing closing `)`",i):(m(!0),v)}(i,c):[i],o=r[0],u(0)},l.end=function(){var t,r=l.i>=e.length;return l.i=e.length-1,furthestChar:e[l.i]}},l},je=function e(t,n,i){var r,o=qe();function s(e,t){throw new R({index:o.i,filename:i.filename,type:t||"Syntax",message:e},n)}function a(e,t){var n=e instanceof Function?e.call(r):o.$re(e);if(n)return n;s(t||("string"==typeof e?"expected '"+e+"' got '"+o.currentChar()+"'":"unexpected token"))}function l(e,t){if(o.$char(e))return e;s(t||"expected '"+e+"' got '"+o.currentChar()+"'")}function u(e){var t=i.filename;return{lineNumber:I(e,o.getInput()).line+1,fileName:t}}return{parserInput:o,imports:n,fileInfo:i,parseNode:function(e,t,i,s,a){var l,u=[],c=o;try{c.start(e,!1,(function(e,t){a({message:e,index:t+i})}));for(var h=0,f=void 0,p=void 0;f=t[h];h++)if(p=c.i,l=r[f]()){try{l._index=p+i,l._fileInfo=s}catch(e){}u.push(l)}else u.push(null);c.end().isFinished?a(null,u):a(!0,null)}catch(e){throw new R({index:e.index+i,message:e.message},n,s.filename)}},parse:function(r,s,a){var l,u,c,h,f=null,p="";if(u=a&&a.globalVars?e.serializeVars(a.globalVars)+"\n":"",c=a&&a.modifyVars?"\n"+e.serializeVars(a.modifyVars):"",t.pluginManager)for(var v=t.pluginManager.getPreProcessors(),d=0;d");return e},args:function(e){var t,n,i,a,l,u,c,h=r.entities,f={args:null,variadic:!1},p=[],v=[],d=[],m=!0;for(o.save();;){if(e)u=r.detachedRuleset()||r.expression();else{if(o.commentStore.length=0,o.$str("...")){f.variadic=!0,o.$char(";")&&!t&&(t=!0),(t?v:d).push({variadic:!0});break}u=h.variable()||h.property()||h.literal()||h.keyword()||this.call(!0)}if(!u||!m)break;a=null,u.throwAwayComments&&u.throwAwayComments(),l=u;var g=null;if(e?u.value&&1==u.value.length&&(g=u.value[0]):g=u,g&&(g instanceof Ie.Variable||g instanceof Ie.Property))if(o.$char(":")){if(p.length>0&&(t&&s("Cannot mix ; and , as delimiter types"),n=!0),!(l=r.detachedRuleset()||r.expression())){if(!e)return o.restore(),f.args=[],f;s("could not understand value for named argument")}a=i=g.name}else if(o.$str("...")){if(!e){f.variadic=!0,o.$char(";")&&!t&&(t=!0),(t?v:d).push({name:u.name,variadic:!0});break}c=!0}else e||(i=a=g.name,l=null);l&&p.push(l),d.push({name:a,value:l,expand:c}),o.$char(",")?m=!0:((m=";"===o.$char(";"))||t)&&(n&&s("Cannot mix ; and , as delimiter types"),t=!0,p.length>1&&(l=new Ie.Value(p)),v.push({name:i,value:l,expand:c}),i=null,p=[],n=!1)}return o.forget(),f.args=t?v:d,f},definition:function(){var e,t,n,i,s=[],l=!1;if(!("."!==o.currentChar()&&"#"!==o.currentChar()||o.peek(/^[^{]*\}/)))if(o.save(),t=o.$re(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/)){e=t[1];var u=this.args(!1);if(s=u.args,l=u.variadic,!o.$char(")"))return void o.restore("Missing closing ')'");if(o.commentStore.length=0,o.$str("when")&&(i=a(r.conditions,"expected condition")),n=r.block())return o.forget(),new Ie.mixin.Definition(e,s,n,i,l);o.restore()}else o.restore()},ruleLookups:function(){var e,t=[];if("["===o.currentChar()){for(;;){if(o.save(),!(e=this.lookupValue())&&""!==e){o.restore();break}t.push(e),o.forget()}return t.length>0?t:void 0}},lookupValue:function(){if(o.save(),o.$char("[")){var e=o.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);if(o.$char("]"))return e||""===e?(o.forget(),e):void o.restore();o.restore()}else o.restore()}},entity:function(){var e=this.entities;return this.comment()||e.literal()||e.variable()||e.url()||e.property()||e.call()||e.keyword()||this.mixin.call(!0)||e.javascript()},end:function(){return o.$char(";")||o.peek("}")},ieAlpha:function(){var e;if(o.$re(/^opacity=/i))return(e=o.$re(/^\d+/))||(e="@{"+(e=a(r.entities.variable,"Could not parse alpha")).name.slice(1)+"}"),l(")"),new Ie.Quoted("","alpha(opacity="+e+")")},element:function(){var e,t,n,r=o.i;if(t=this.combinator(),(e=o.$re(/^(?:\d+\.\d+|\d+)%/)||o.$re(/^(?:[.#]?|:*)(?:[\w-]|[^\x00-\x9f]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/)||o.$char("*")||o.$char("&")||this.attribute()||o.$re(/^\([^&()@]+\)/)||o.$re(/^[\.#:](?=@)/)||this.entities.variableCurly())||(o.save(),o.$char("(")?(n=this.selector(!1))&&o.$char(")")?(e=new Ie.Paren(n),o.forget()):o.restore("Missing closing ')'"):o.forget()),e)return new Ie.Element(t,e,e instanceof Ie.Variable,r,i)},combinator:function(){var e=o.currentChar();if("/"===e){o.save();var t=o.$re(/^\/[a-z]+\//i);if(t)return o.forget(),new Ie.Combinator(t);o.restore()}if(">"===e||"+"===e||"~"===e||"|"===e||"^"===e){for(o.i++,"^"===e&&"^"===o.currentChar()&&(e="^^",o.i++);o.isWhitespace();)o.i++;return new Ie.Combinator(e)}return o.isWhitespace(-1)?new Ie.Combinator(" "):new Ie.Combinator(null)},selector:function(e){var t,n,r,l,u,c,h,f=o.i;for(e=!1!==e;(e&&(n=this.extend())||e&&(c=o.$str("when"))||(l=this.element()))&&(c?h=a(this.conditions,"expected condition"):h?s("CSS guard can only be used at the end of selector"):n?u=u?u.concat(n):n:(u&&s("Extend can only be used at the end of selector"),r=o.currentChar(),t?t.push(l):t=[l],l=null),"{"!==r&&"}"!==r&&";"!==r&&","!==r&&")"!==r););if(t)return new Ie.Selector(t,u,h,f,i);u&&s("Extend must be used to extend a selector, it cannot be used on its own")},selectors:function(){for(var e,t;(e=this.selector())&&(t?t.push(e):t=[e],o.commentStore.length=0,e.condition&&t.length>1&&s("Guards are only currently allowed on a single selector."),o.$char(","));)e.condition&&s("Guards are only currently allowed on a single selector."),o.commentStore.length=0;return t},attribute:function(){if(o.$char("[")){var e,t,n,i=this.entities;return(e=i.variableCurly())||(e=a(/^(?:[_A-Za-z0-9-\*]*\|)?(?:[_A-Za-z0-9-]|\\.)+/)),(n=o.$re(/^[|~*$^]?=/))&&(t=i.quoted()||o.$re(/^[0-9]+%/)||o.$re(/^[\w-]+/)||i.variableCurly()),l("]"),new Ie.Attribute(e,n,t)}},block:function(){var e;if(o.$char("{")&&(e=this.primary())&&o.$char("}"))return e},blockRuleset:function(){var e=this.block();return e&&(e=new Ie.Ruleset(null,e)),e},detachedRuleset:function(){var e,t,n;if(o.save(),!o.$re(/^[.#]\(/)||(t=(e=this.mixin.args(!1)).args,n=e.variadic,o.$char(")"))){var i=this.blockRuleset();if(i)return o.forget(),t?new Ie.mixin.Definition(null,t,i,null,n):new Ie.DetachedRuleset(i);o.restore()}else o.restore()},ruleset:function(){var e,n,i;if(o.save(),t.dumpLineNumbers&&(i=u(o.i)),(e=this.selectors())&&(n=this.block())){o.forget();var r=new Ie.Ruleset(e,n,t.strictImports);return t.dumpLineNumbers&&(r.debugInfo=i),r}o.restore()},declaration:function(){var e,t,n,r,s,a,l=o.i,u=o.currentChar();if("."!==u&&"#"!==u&&"&"!==u&&":"!==u)if(o.save(),e=this.variable()||this.ruleProperty()){if((a="string"==typeof e)&&(t=this.detachedRuleset())&&(n=!0),o.commentStore.length=0,!t){if(s=!a&&e.length>1&&e.pop().value,t=e[0].value&&"--"===e[0].value.slice(0,2)?this.permissiveValue():this.anonymousValue())return o.forget(),new Ie.Declaration(e,t,!1,s,l,i);t||(t=this.value()),t?r=this.important():a&&(t=this.permissiveValue())}if(t&&(this.end()||n))return o.forget(),new Ie.Declaration(e,t,r,s,l,i);o.restore()}else o.restore()},anonymousValue:function(){var e=o.i,t=o.$re(/^([^.#@\$+\/'"*`(;{}-]*);/);if(t)return new Ie.Anonymous(t[1],e)},permissiveValue:function(e){var t,n,r,a,l=e||";",u=o.i,c=[];function h(){var e=o.currentChar();return"string"==typeof l?e===l:l.test(e)}if(!h()){a=[];do{((n=this.comment())||(n=this.entity()))&&a.push(n)}while(n);if(r=h(),a.length>0){if(a=new Ie.Expression(a),r)return a;c.push(a)," "===o.prevChar()&&c.push(new Ie.Anonymous(" ",u))}if(o.save(),a=o.$parseUntil(l)){if("string"==typeof a&&s("Expected '"+a+"'","Parse"),1===a.length&&" "===a[0])return o.forget(),new Ie.Anonymous("",u);var f=void 0;for(t=0;t0)return new Ie.Expression(r)},mediaFeatures:function(){var e,t=this.entities,n=[];do{if(e=this.mediaFeature()){if(n.push(e),!o.$char(","))break}else if((e=t.variable()||t.mixinLookup())&&(n.push(e),!o.$char(",")))break}while(e);return n.length>0?n:null},media:function(){var e,n,r,a,l=o.i;if(t.dumpLineNumbers&&(a=u(l)),o.save(),o.$str("@media"))return e=this.mediaFeatures(),(n=this.block())||s("media definitions require block statements after any features"),o.forget(),r=new Ie.Media(n,e,l,i),t.dumpLineNumbers&&(r.debugInfo=a),r;o.restore()},plugin:function(){var e,t,n,r=o.i;if(o.$re(/^@plugin?\s+/)){if(n=(t=this.pluginArgs())?{pluginArgs:t,isPlugin:!0}:{isPlugin:!0},e=this.entities.quoted()||this.entities.url())return o.$char(";")||(o.i=r,s("missing semi-colon on @plugin")),new Ie.Import(e,null,n,r,i);o.i=r,s("malformed @plugin statement")}},pluginArgs:function(){if(o.save(),!o.$char("("))return o.restore(),null;var e=o.$re(/^\s*([^\);]+)\)\s*/);return e[1]?(o.forget(),e[1].trim()):(o.restore(),null)},atrule:function(){var e,n,r,a,l,c,h,f=o.i,p=!0,v=!0;if("@"===o.currentChar()){if(n=this.import()||this.plugin()||this.media())return n;if(o.save(),e=o.$re(/^@[a-z-]+/)){switch(a=e,"-"==e.charAt(1)&&e.indexOf("-",2)>0&&(a="@"+e.slice(e.indexOf("-",2)+1)),a){case"@charset":l=!0,p=!1;break;case"@namespace":c=!0,p=!1;break;case"@keyframes":case"@counter-style":l=!0;break;case"@document":case"@supports":h=!0,v=!1;break;default:h=!0}if(o.commentStore.length=0,l?(n=this.entity())||s("expected "+e+" identifier"):c?(n=this.expression())||s("expected "+e+" expression"):h&&(n=this.permissiveValue(/^[{;]/),p="{"===o.currentChar(),n?n.value||(n=null):p||";"===o.currentChar()||s(e+" rule is missing block or ending semi-colon")),p&&(r=this.blockRuleset()),r||!p&&n&&o.$char(";"))return o.forget(),new Ie.AtRule(e,n,r,f,i,t.dumpLineNumbers?u(f):null,v);o.restore("at-rule options not recognised")}}},value:function(){var e,t=[],n=o.i;do{if((e=this.expression())&&(t.push(e),!o.$char(",")))break}while(e);if(t.length>0)return new Ie.Value(t,n)},important:function(){if("!"===o.currentChar())return o.$re(/^! *important/)},sub:function(){var e,t;if(o.save(),o.$char("("))return(e=this.addition())&&o.$char(")")?(o.forget(),(t=new Ie.Expression([e])).parens=!0,t):void o.restore("Expected ')'");o.restore()},multiplication:function(){var e,t,n,i,r;if(e=this.operand()){for(r=o.isWhitespace(-1);!o.peek(/^\/[*\/]/);){if(o.save(),!(n=o.$char("/")||o.$char("*")||o.$str("./"))){o.forget();break}if(!(t=this.operand())){o.restore();break}o.forget(),e.parensInOp=!0,t.parensInOp=!0,i=new Ie.Operation(n,[i||e,t],r),r=o.isWhitespace(-1)}return i||e}},addition:function(){var e,t,n,i,r;if(e=this.multiplication()){for(r=o.isWhitespace(-1);(n=o.$re(/^[-+]\s+/)||!r&&(o.$char("+")||o.$char("-")))&&(t=this.multiplication());)e.parensInOp=!0,t.parensInOp=!0,i=new Ie.Operation(n,[i||e,t],r),r=o.isWhitespace(-1);return i||e}},conditions:function(){var e,t,n,i=o.i;if(e=this.condition(!0)){for(;o.peek(/^,\s*(not\s*)?\(/)&&o.$char(",")&&(t=this.condition(!0));)n=new Ie.Condition("or",n||e,t,i);return n||e}},condition:function(e){var t,n,i;if(t=this.conditionAnd(e)){if(n=o.$str("or")){if(!(i=this.condition(e)))return;t=new Ie.Condition(n,t,i)}return t}},conditionAnd:function(e){var t,n,i,r,s=this;if(t=(r=s.negatedCondition(e)||s.parenthesisCondition(e))||e?r:s.atomicCondition(e)){if(n=o.$str("and")){if(!(i=this.conditionAnd(e)))return;t=new Ie.Condition(n,t,i)}return t}},negatedCondition:function(e){if(o.$str("not")){var t=this.parenthesisCondition(e);return t&&(t.negate=!t.negate),t}},parenthesisCondition:function(e){var t;if(o.save(),o.$str("(")){if(t=function(t){var n;if(o.save(),n=t.condition(e)){if(o.$char(")"))return o.forget(),n;o.restore()}else o.restore()}(this))return o.forget(),t;if(t=this.atomicCondition(e)){if(o.$char(")"))return o.forget(),t;o.restore("expected ')' got '"+o.currentChar()+"'")}else o.restore()}else o.restore()},atomicCondition:function(e){var t,n,i,r,a=this.entities,l=o.i;function u(){return this.addition()||a.keyword()||a.quoted()||a.mixinLookup()}if(t=(u=u.bind(this))())return o.$char(">")?r=o.$char("=")?">=":">":o.$char("<")?r=o.$char("=")?"<=":"<":o.$char("=")&&(r=o.$char(">")?"=>":o.$char("<")?"=<":"="),r?(n=u())?i=new Ie.Condition(r,t,n,l,!1):s("expected expression"):i=new Ie.Condition("=",t,new Ie.Keyword("true"),l,!1),i},operand:function(){var e,t=this.entities;o.peek(/^-[@\$\(]/)&&(e=o.$char("-"));var n=this.sub()||t.dimension()||t.color()||t.variable()||t.property()||t.call()||t.quoted(!0)||t.colorKeyword()||t.mixinLookup();return e&&(n.parensInOp=!0,n=new Ie.Negative(n)),n},expression:function(){var e,t,n=[],i=o.i;do{(e=this.comment())?n.push(e):((e=this.addition()||this.entity())instanceof Ie.Comment&&(e=null),e&&(n.push(e),o.peek(/^\/[\/*]/)||(t=o.$char("/"))&&n.push(new Ie.Anonymous(t,i))))}while(e);if(n.length>0)return new Ie.Expression(n)},property:function(){var e=o.$re(/^(\*?-?[_a-zA-Z0-9-]+)\s*:/);if(e)return e[1]},ruleProperty:function(){var e,t,n=[],r=[];o.save();var s=o.$re(/^([_a-zA-Z0-9-]+)\s*:/);if(s)return n=[new Ie.Keyword(s[1])],o.forget(),n;function a(e){var t=o.i,i=o.$re(e);if(i)return r.push(t),n.push(i[1])}for(a(/^(\*?)/);a(/^((?:[\w-]+)|(?:[@\$]\{[\w-]+\}))/););if(n.length>1&&a(/^((?:\+_|\+)?)\s*:/)){for(o.forget(),""===n[0]&&(n.shift(),r.shift()),t=0;t1?e-1:e)<1?r+(o-r)*e*6:2*e<1?o:3*e<2?r+(o-r)*(2/3-e)*6:r}e=Ke(e)%360/360,t=We(Ke(t)),n=We(Ke(n)),i=We(Ke(i)),r=2*n-(o=n<=.5?n*(t+1):n+t-n*t);var a=[255*s(e+1/3),255*s(e),255*s(e-1/3)];return i=Ke(i),new f(a,i,"hsla")}catch(e){}},hsv:function(e,t,n){return ze.hsva(e,t,n,1)},hsva:function(e,t,n,i){var r,o;e=Ke(e)%360/360*360,t=Ke(t),n=Ke(n),i=Ke(i);var s=[n,n*(1-t),n*(1-(o=e/60-(r=Math.floor(e/60%6)))*t),n*(1-(1-o)*t)],a=[[0,3,1],[2,0,1],[1,0,3],[1,2,0],[3,1,0],[0,1,2]];return ze.rgba(255*s[a[r][0]],255*s[a[r][1]],255*s[a[r][2]],i)},hue:function(e){return new X(He(e).h)},saturation:function(e){return new X(100*He(e).s,"%")},lightness:function(e){return new X(100*He(e).l,"%")},hsvhue:function(e){return new X(Qe(e).h)},hsvsaturation:function(e){return new X(100*Qe(e).s,"%")},hsvvalue:function(e){return new X(100*Qe(e).v,"%")},red:function(e){return new X(e.rgb[0])},green:function(e){return new X(e.rgb[1])},blue:function(e){return new X(e.rgb[2])},alpha:function(e){return new X(He(e).a)},luma:function(e){return new X(e.luma()*e.alpha*100,"%")},luminance:function(e){var t=.2126*e.rgb[0]/255+.7152*e.rgb[1]/255+.0722*e.rgb[2]/255;return new X(t*e.alpha*100,"%")},saturate:function(e,t,n){if(!e.rgb)return null;var i=He(e);return void 0!==n&&"relative"===n.value?i.s+=i.s*t.value/100:i.s+=t.value/100,i.s=We(i.s),Je(e,i)},desaturate:function(e,t,n){var i=He(e);return void 0!==n&&"relative"===n.value?i.s-=i.s*t.value/100:i.s-=t.value/100,i.s=We(i.s),Je(e,i)},lighten:function(e,t,n){var i=He(e);return void 0!==n&&"relative"===n.value?i.l+=i.l*t.value/100:i.l+=t.value/100,i.l=We(i.l),Je(e,i)},darken:function(e,t,n){var i=He(e);return void 0!==n&&"relative"===n.value?i.l-=i.l*t.value/100:i.l-=t.value/100,i.l=We(i.l),Je(e,i)},fadein:function(e,t,n){var i=He(e);return void 0!==n&&"relative"===n.value?i.a+=i.a*t.value/100:i.a+=t.value/100,i.a=We(i.a),Je(e,i)},fadeout:function(e,t,n){var i=He(e);return void 0!==n&&"relative"===n.value?i.a-=i.a*t.value/100:i.a-=t.value/100,i.a=We(i.a),Je(e,i)},fade:function(e,t){var n=He(e);return n.a=t.value/100,n.a=We(n.a),Je(e,n)},spin:function(e,t){var n=He(e),i=(n.h+t.value)%360;return n.h=i<0?360+i:i,Je(e,n)},mix:function(e,t,n){n||(n=new X(50));var i=n.value/100,r=2*i-1,o=He(e).a-He(t).a,s=((r*o==-1?r:(r+o)/(1+r*o))+1)/2,a=1-s,l=[e.rgb[0]*s+t.rgb[0]*a,e.rgb[1]*s+t.rgb[1]*a,e.rgb[2]*s+t.rgb[2]*a],u=e.alpha*i+t.alpha*(1-i);return new f(l,u)},greyscale:function(e){return ze.desaturate(e,new X(100))},contrast:function(e,t,n,i){if(!e.rgb)return null;if(void 0===n&&(n=ze.rgba(255,255,255,1)),void 0===t&&(t=ze.rgba(0,0,0,1)),t.luma()>n.luma()){var r=n;n=t,t=r}return i=void 0===i?.43:Ke(i),e.luma().5&&(i=1,n=e>.25?Math.sqrt(e):((16*e-12)*e+4)*e),e-(1-2*t)*i*(n-e)},hardlight:function(e,t){return Xe.overlay(t,e)},difference:function(e,t){return Math.abs(e-t)},exclusion:function(e,t){return e+t-2*e*t},average:function(e,t){return(e+t)/2},negation:function(e,t){return 1-Math.abs(e+t-1)}};for(var et in Xe)Xe.hasOwnProperty(et)&&(Ye[et]=Ye.bind(null,Xe[et]));var tt=function(e){return Array.isArray(e.value)?e.value:Array(e)},nt={_SELF:function(e){return e},extract:function(e,t){return t=t.value-1,tt(e)[t]},length:function(e){return new X(tt(e).length)},range:function(e,t,n){var i,r,o=1,s=[];t?(r=t,i=e.value,n&&(o=n.value)):(i=1,r=e);for(var a=i;a<=r.value;a+=o)s.push(new X(a,r.unit));return new ie(s)},each:function(e,t){var n,i,r=[];i=!e.value||e instanceof ue?e.ruleset?e.ruleset.rules:e.rules?e.rules:Array.isArray(e)?e:[e]:Array.isArray(e.value)?e.value:[e.value];var o="@value",s="@key",a="@index";t.params?(o=t.params[0]&&t.params[0].name,s=t.params[1]&&t.params[1].name,a=t.params[2]&&t.params[2].name,t=t.rules):t=t.ruleset;for(var l=0;ls.value)&&(c[i]=r);else{if(void 0!==l&&a!==l)throw{type:"Argument",message:"incompatible types"};h[a]=c.length,c.push(r)}else Array.isArray(t[n].value)&&Array.prototype.push.apply(t,Array.prototype.slice.call(t[n].value));return 1==c.length?c[0]:(t=c.map((function(e){return e.toCSS(this.context)})).join(this.context.compress?",":", "),new L((e?"min":"max")+"("+t+")"))},lt={min:function(){for(var e=[],t=0;t",r=0;r";return i+="',i=encodeURIComponent(i),new ce(new ue("'"+(i="data:image/svg+xml,"+i)+"'",i,!1,this.index,this.currentFileInfo),this.index,this.currentFileInfo)}}),J.addMultiple(ft),t},vt=function(e,t){var n;void 0===t&&(t={});var i=t.variables,r=new q.Eval(t);"object"!=typeof i||Array.isArray(i)||(i=Object.keys(i).map((function(e){var t=i[e];return t instanceof Ie.Value||(t instanceof Ie.Expression||(t=new Ie.Expression([t])),t=new Ie.Value([t])),new Ie.Declaration("@"+e,t,!1,null,0)})),r.frames=[new Ie.Ruleset(null,i)]);var o,s,a=[new Ue.JoinSelectorVisitor,new Ue.MarkVisibleSelectorsVisitor(!0),new Ue.ExtendVisitor,new Ue.ToCSSVisitor({compress:Boolean(t.compress)})],l=[];if(t.pluginManager){s=t.pluginManager.visitor();for(var u=0;u<2;u++)for(s.first();o=s.get();)o.isPreEvalVisitor?0!==u&&-1!==l.indexOf(o)||(l.push(o),o.run(e)):0!==u&&-1!==a.indexOf(o)||(o.isPreVisitor?a.unshift(o):a.push(o))}n=e.eval(r);for(u=0;u=t);n++);this.preProcessors.splice(n,0,{preProcessor:e,priority:t})},e.prototype.addPostProcessor=function(e,t){var n;for(n=0;n=t);n++);this.postProcessors.splice(n,0,{postProcessor:e,priority:t})},e.prototype.addFileManager=function(e){this.fileManagers.push(e)},e.prototype.getPreProcessors=function(){for(var e=[],t=0;t0){var i=void 0,r=JSON.stringify(this._sourceMapGenerator.toJSON());this.sourceMapURL?i=this.sourceMapURL:this._sourceMapFilename&&(i=this._sourceMapFilename),this.sourceMapURL=i,this.sourceMap=r}return this._css.join("")},t}()}(e=new ke(e,t)),r=function(e,t){return function(){function n(e){this.options=e}return n.prototype.toCSS=function(t,n,i){var r=new e({contentsIgnoredCharsMap:i.contentsIgnoredChars,rootNode:t,contentsMap:i.contents,sourceMapFilename:this.options.sourceMapFilename,sourceMapURL:this.options.sourceMapURL,outputFilename:this.options.sourceMapOutputFilename,sourceMapBasepath:this.options.sourceMapBasepath,sourceMapRootpath:this.options.sourceMapRootpath,outputSourceFiles:this.options.outputSourceFiles,sourceMapGenerator:this.options.sourceMapGenerator,sourceMapFileInline:this.options.sourceMapFileInline,disableSourcemapAnnotation:this.options.disableSourcemapAnnotation}),o=r.toCSS(n);return this.sourceMap=r.sourceMap,this.sourceMapURL=r.sourceMapURL,this.options.sourceMapInputFilename&&(this.sourceMapInputFilename=r.normalizeFilename(this.options.sourceMapInputFilename)),void 0!==this.options.sourceMapBasepath&&void 0!==this.sourceMapURL&&(this.sourceMapURL=r.removeBasepath(this.sourceMapURL)),o+this.getCSSAppendage()},n.prototype.getCSSAppendage=function(){var e=this.sourceMapURL;if(this.options.sourceMapFileInline){if(void 0===this.sourceMap)return"";e="data:application/json;base64,"+t.encodeBase64(this.sourceMap)}return this.options.disableSourcemapAnnotation?"":e?"/*# sourceMappingURL="+e+" */":""},n.prototype.getExternalSourceMap=function(){return this.sourceMap},n.prototype.setExternalSourceMap=function(e){this.sourceMap=e},n.prototype.isInline=function(){return this.options.sourceMapFileInline},n.prototype.getSourceMapURL=function(){return this.sourceMapURL},n.prototype.getOutputFilename=function(){return this.options.sourceMapOutputFilename},n.prototype.getInputFilename=function(){return this.sourceMapInputFilename},n}()}(i,e),o=function(e){return function(){function t(e,t){this.root=e,this.imports=t}return t.prototype.toCSS=function(t){var n,i,r={};try{n=vt(this.root,t)}catch(e){throw new R(e,this.imports)}try{var o=Boolean(t.compress);o&&Ce.warn("The compress option has been deprecated. We recommend you use a dedicated css minifier, for instance see less-plugin-clean-css.");var s={compress:o,dumpLineNumbers:t.dumpLineNumbers,strictUnits:Boolean(t.strictUnits),numPrecision:8};t.sourceMap?(i=new e(t.sourceMap),r.css=i.toCSS(n,s,this.imports)):r.css=n.toCSS(s)}catch(e){throw new R(e,this.imports)}if(t.pluginManager)for(var a=t.pluginManager.getPostProcessors(),l=0;l=200&&t.status<300?n(t.responseText,t.getResponseHeader("Last-Modified")):"function"==typeof i&&i(t.status,e)}"function"==typeof r.overrideMimeType&&r.overrideMimeType("text/css"),yt.debug("XHR: Getting '"+e+"'"),r.open("GET",e,o),r.setRequestHeader("Accept",t||"text/x-less, text/css; q=0.9, */*; q=0.5"),r.send(null),gt.isFileProtocol&&!gt.fileAsync?0===r.status||r.status>=200&&r.status<300?n(r.responseText):i(r.status,e):o?r.onreadystatechange=function(){4==r.readyState&&s(r,n,i)}:s(r,n,i)},t.prototype.supports=function(){return!0},t.prototype.clearFileCache=function(){wt={}},t.prototype.loadFile=function(e,t,n,i){t&&!this.isPathAbsolute(e)&&(e=t+e),e=n.ext?this.tryAppendExtension(e,n.ext):e,n=n||{};var r=this.extractUrlParts(e,window.location.href).url,o=this;return new Promise((function(e,t){if(n.useFileCache&&wt[r])try{var i=wt[r];return e({contents:i,filename:r,webInfo:{lastModified:new Date}})}catch(e){return t({filename:r,message:"Error loading file "+r+" error was "+e.message})}o.doXHR(r,n.mime,(function(t,n){wt[r]=t,e({contents:t,filename:r,webInfo:{lastModified:n}})}),(function(e,n){t({type:"File",message:"'"+n+"' wasn't found ("+e+")",href:r})}))}))},t}(_e),St=function(e,t){return gt=e,yt=t,xt},It=function(e){function t(t){var n=e.call(this)||this;return n.less=t,n}return o(t,e),t.prototype.loadPlugin=function(e,t,n,i,r){return new Promise((function(o,s){r.loadFile(e,t,n,i).then(o).catch(s)}))},t}(Ae),Ct=function(t,i,r){return{add:function(o,s){r.errorReporting&&"html"!==r.errorReporting?"console"===r.errorReporting?function(e,t){var n=e.filename||t,o=[],s=(e.type||"Syntax")+"Error: "+(e.message||"There is an error in your .less file")+" in "+n,a=function(e,t,n){void 0!==e.extract[t]&&o.push("{line} {content}".replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,n).replace(/\{content\}/,e.extract[t]))};e.line&&(a(e,0,""),a(e,1,"line"),a(e,2,""),s+=" on line "+e.line+", column "+(e.column+1)+":\n"+o.join("\n")),e.stack&&(e.extract||r.logLevel>=4)&&(s+="\nStack Trace\n"+e.stack),i.logger.error(s)}(o,s):"function"==typeof r.errorReporting&&r.errorReporting("add",o,s):function(i,o){var s,a,l="less-error-message:"+e(o||""),u=t.document.createElement("div"),c=[],h=i.filename||o,f=h.match(/([^\/]+(\?.*)?)$/)[1];u.id=l,u.className="less-error-message",a="

    "+(i.type||"Syntax")+"Error: "+(i.message||"There is an error in your .less file")+'

    in '+f+" ";var p=function(e,t,n){void 0!==e.extract[t]&&c.push('

  • {content}
  • '.replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,n).replace(/\{content\}/,e.extract[t]))};i.line&&(p(i,0,""),p(i,1,"line"),p(i,2,""),a+="on line "+i.line+", column "+(i.column+1)+":

      "+c.join("")+"
    "),i.stack&&(i.extract||r.logLevel>=4)&&(a+="
    Stack Trace
    "+i.stack.split("\n").slice(1).join("
    ")),u.innerHTML=a,n(t.document,[".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #dd6666;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.line {","color: #ff0000;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),u.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),"development"===r.env&&(s=setInterval((function(){var e=t.document,n=e.body;n&&(e.getElementById(l)?n.replaceChild(u,e.getElementById(l)):n.insertBefore(u,n.firstChild),clearInterval(s))}),10))}(o,s)},remove:function(n){r.errorReporting&&"html"!==r.errorReporting?"console"===r.errorReporting||"function"==typeof r.errorReporting&&r.errorReporting("remove",n):function(n){var i=t.document.getElementById("less-error-message:"+e(n));i&&i.parentNode.removeChild(i)}(n)}}},kt={javascriptEnabled:!1,depends:!1,compress:!1,lint:!1,paths:[],color:!0,strictImports:!1,insecure:!1,rootpath:"",rewriteUrls:!1,math:0,strictUnits:!1,globalVars:null,modifyVars:null,urlArgs:""};if(window.less)for(var _t in window.less)window.less.hasOwnProperty(_t)&&(kt[_t]=window.less[_t]);!function(e,n){t(n,i(e)),void 0===n.isFileProtocol&&(n.isFileProtocol=/^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(e.location.protocol)),n.async=n.async||!1,n.fileAsync=n.fileAsync||!1,n.poll=n.poll||(n.isFileProtocol?1e3:1500),n.env=n.env||("127.0.0.1"==e.location.hostname||"0.0.0.0"==e.location.hostname||"localhost"==e.location.hostname||e.location.port&&e.location.port.length>0||n.isFileProtocol?"development":"production");var r=/!dumpLineNumbers:(comments|mediaquery|all)/.exec(e.location.hash);r&&(n.dumpLineNumbers=r[1]),void 0===n.useFileCache&&(n.useFileCache=!0),void 0===n.onReady&&(n.onReady=!0),n.relativeUrls&&(n.rewriteUrls="all")}(window,kt),kt.plugins=kt.plugins||[],window.LESS_PLUGINS&&(kt.plugins=kt.plugins.concat(window.LESS_PLUGINS));var At,Mt,Pt,Et=function(e,i){var r=e.document,o=bt();o.options=i;var s=o.environment,a=St(i,o.logger),l=new a;s.addFileManager(l),o.FileManager=a,o.PluginLoader=It,function(e,t){t.logLevel=void 0!==t.logLevel?t.logLevel:"development"===t.env?3:1,t.loggers||(t.loggers=[{debug:function(e){t.logLevel>=4&&console.log(e)},info:function(e){t.logLevel>=3&&console.log(e)},warn:function(e){t.logLevel>=2&&console.warn(e)},error:function(e){t.logLevel>=1&&console.error(e)}}]);for(var n=0;n0&&l.childNodes.length>0&&s.firstChild.nodeValue===l.firstChild.nodeValue);var u=t.getElementsByTagName("head")[0];if(null===s||!1===a){var c=i&&i.nextSibling||null;c?c.parentNode.insertBefore(l,c):u.appendChild(l)}if(s&&!1===a&&s.parentNode.removeChild(s),l.styleSheet)try{l.styleSheet.cssText=n}catch(e){throw new Error("Couldn't reassign styleSheet.cssText.")}},i=function(e){var t,n=e.document;return n.currentScript||(t=n.getElementsByTagName("script"))[t.length-1]},r={error:function(e){this._fireEvent("error",e)},warn:function(e){this._fireEvent("warn",e)},info:function(e){this._fireEvent("info",e)},debug:function(e){this._fireEvent("debug",e)},addListener:function(e){this._listeners.push(e)},removeListener:function(e){for(var t=0;t=0;a--){var l=s[a];if(l[o?"supportsSync":"supports"](e,t,n,i))return l}return null},e.prototype.addFileManager=function(e){this.fileManagers.push(e)},e.prototype.clearFileManagers=function(){this.fileManagers=[]},e}(),s={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",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:"#ff00ff",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:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",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:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",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:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},a={length:{m:1,cm:.01,mm:.001,in:.0254,px:.0254/96,pt:.0254/72,pc:.0254/72*12},duration:{s:1,ms:.001},angle:{rad:1/(2*Math.PI),deg:1/360,grad:1/400,turn:1}},l={colors:s,unitConversions:a},u=function(){function e(){this.parent=null,this.visibilityBlocks=void 0,this.nodeVisible=void 0,this.rootNode=null,this.parsed=null;var e=this;Object.defineProperty(this,"currentFileInfo",{get:function(){return e.fileInfo()}}),Object.defineProperty(this,"index",{get:function(){return e.getIndex()}})}return e.prototype.setParent=function(t,n){function i(t){t&&t instanceof e&&(t.parent=n)}Array.isArray(t)?t.forEach(i):i(t)},e.prototype.getIndex=function(){return this._index||this.parent&&this.parent.getIndex()||0},e.prototype.fileInfo=function(){return this._fileInfo||this.parent&&this.parent.fileInfo()||{}},e.prototype.isRulesetLike=function(){return!1},e.prototype.toCSS=function(e){var t=[];return this.genCSS(e,{add:function(e,n,i){t.push(e)},isEmpty:function(){return 0===t.length}}),t.join("")},e.prototype.genCSS=function(e,t){t.add(this.value)},e.prototype.accept=function(e){this.value=e.visit(this.value)},e.prototype.eval=function(){return this},e.prototype._operate=function(e,t,n,i){switch(t){case"+":return n+i;case"-":return n-i;case"*":return n*i;case"/":return n/i}},e.prototype.fround=function(e,t){var n=e&&e.numPrecision;return n?Number((t+2e-16).toFixed(n)):t},e.compare=function(t,n){if(t.compare&&"Quoted"!==n.type&&"Anonymous"!==n.type)return t.compare(n);if(n.compare)return-n.compare(t);if(t.type===n.type){if(t=t.value,n=n.value,!Array.isArray(t))return t===n?0:void 0;if(t.length===n.length){for(var i=0;it?1:void 0},e.prototype.blocksVisibility=function(){return null==this.visibilityBlocks&&(this.visibilityBlocks=0),0!==this.visibilityBlocks},e.prototype.addVisibilityBlock=function(){null==this.visibilityBlocks&&(this.visibilityBlocks=0),this.visibilityBlocks=this.visibilityBlocks+1},e.prototype.removeVisibilityBlock=function(){null==this.visibilityBlocks&&(this.visibilityBlocks=0),this.visibilityBlocks=this.visibilityBlocks-1},e.prototype.ensureVisibility=function(){this.nodeVisible=!0},e.prototype.ensureInvisibility=function(){this.nodeVisible=!1},e.prototype.isVisible=function(){return this.nodeVisible},e.prototype.visibilityInfo=function(){return{visibilityBlocks:this.visibilityBlocks,nodeVisible:this.nodeVisible}},e.prototype.copyVisibilityInfo=function(e){e&&(this.visibilityBlocks=e.visibilityBlocks,this.nodeVisible=e.nodeVisible)},e}(),c=function(e,t){return(c=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};function h(e,t){function n(){this.constructor=e}c(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var f=function(){return(f=Object.assign||function(e){for(var t,n=1,i=arguments.length;n=6?(r.rgb=[],t.match(/.{2}/g).map((function(e,t){t<3?o.rgb.push(parseInt(e,16)):o.alpha=parseInt(e,16)/255}))):(r.rgb=[],t.split("").map((function(e,t){t<3?o.rgb.push(parseInt(e+e,16)):o.alpha=parseInt(e+e,16)/255}))),r.alpha=r.alpha||("number"==typeof n?n:1),void 0!==i&&(r.value=i),r}return h(t,e),t.prototype.luma=function(){var e=this.rgb[0]/255,t=this.rgb[1]/255,n=this.rgb[2]/255;return.2126*(e=e<=.03928?e/12.92:Math.pow((e+.055)/1.055,2.4))+.7152*(t=t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4))+.0722*(n=n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4))},t.prototype.genCSS=function(e,t){t.add(this.toCSS(e))},t.prototype.toCSS=function(e,t){var n,i,r,o=e&&e.compress&&!t,s=[];if(i=this.fround(e,this.alpha),this.value)if(0===this.value.indexOf("rgb"))i<1&&(r="rgba");else{if(0!==this.value.indexOf("hsl"))return this.value;r=i<1?"hsla":"hsl"}else i<1&&(r="rgba");switch(r){case"rgba":s=this.rgb.map((function(e){return v(Math.round(e),255)})).concat(v(i,1));break;case"hsla":s.push(v(i,1));case"hsl":n=this.toHSL(),s=[this.fround(e,n.h),this.fround(e,100*n.s)+"%",this.fround(e,100*n.l)+"%"].concat(s)}if(r)return r+"("+s.join(","+(o?"":" "))+")";if(n=this.toRGB(),o){var a=n.split("");a[1]===a[2]&&a[3]===a[4]&&a[5]===a[6]&&(n="#"+a[1]+a[3]+a[5])}return n},t.prototype.operate=function(e,n,i){for(var r=new Array(3),o=this.alpha*(1-i.alpha)+i.alpha,s=0;s<3;s++)r[s]=this._operate(e,n,this.rgb[s],i.rgb[s]);return new t(r,o)},t.prototype.toRGB=function(){return d(this.rgb)},t.prototype.toHSL=function(){var e,t,n=this.rgb[0]/255,i=this.rgb[1]/255,r=this.rgb[2]/255,o=this.alpha,s=Math.max(n,i,r),a=Math.min(n,i,r),l=(s+a)/2,u=s-a;if(s===a)e=t=0;else{switch(t=l>.5?u/(2-s-a):u/(s+a),s){case n:e=(i-r)/u+(i=0&&"\n"!==t.charAt(n);)r++;return"number"==typeof e&&(i=(t.slice(0,e).match(/\n/g)||"").length),{line:i,column:r}}function k(e){var t,n=e.length,i=new Array(n);for(t=0;t|Function):(\d+):(\d+)/,V=function(e,t,n){Error.call(this);var i=e.filename||n;if(this.message=e.message,this.stack=e.stack,t&&i){var r=t.contents[i],o=C(e.index,r),s=o.line,a=o.column,l=e.call&&C(e.call,r).line,u=r?r.split("\n"):"";if(this.type=e.type||"Syntax",this.filename=i,this.index=e.index,this.line="number"==typeof s?s+1:null,this.column=a,!this.line&&this.stack){var c=this.stack.match(R),h=new Function("a","throw new Error()"),f=0;try{h()}catch(e){var p=e.stack.match(R);f=1-(s=parseInt(p[2]))}c&&(c[2]&&(this.line=parseInt(c[2])+f),c[3]&&(this.column=parseInt(c[3])))}this.callLine=l+1,this.callExtract=u[l],this.extract=[u[this.line-2],u[this.line-1],u[this.line]]}};if(void 0===Object.create){var F=function(){};F.prototype=Error.prototype,V.prototype=new F}else V.prototype=Object.create(Error.prototype);V.prototype.constructor=V,V.prototype.toString=function(e){e=e||{};var t="",n=this.extract||[],i=[],r=function(e){return e};if(e.stylize){var o=typeof e.stylize;if("function"!==o)throw Error("options.stylize should be a function, got a "+o+"!");r=e.stylize}if(null!==this.line){if("string"==typeof n[0]&&i.push(r(this.line-1+" "+n[0],"grey")),"string"==typeof n[1]){var s=this.line+" ";n[1]&&(s+=n[1].slice(0,this.column)+r(r(r(n[1].substr(this.column,1),"bold")+n[1].slice(this.column+1),"red"),"inverse")),i.push(s)}"string"==typeof n[2]&&i.push(r(this.line+1+" "+n[2],"grey")),i=i.join("\n")+r("","reset")+"\n"}return t+=r(this.type+"Error: "+this.message,"red"),this.filename&&(t+=r(" in ","red")+this.filename),this.line&&(t+=r(" on line "+this.line+", column "+(this.column+1)+":","grey")),t+="\n"+i,this.callLine&&(t+=r("from ","red")+(this.filename||"")+"/n",t+=r(this.callLine,"grey")+" "+this.callExtract+"/n"),t};var $=function(e){function t(t,n,i,r,o,s){var a=e.call(this)||this;return a.extendList=n,a.condition=i,a.evaldCondition=!i,a._index=r,a._fileInfo=o,a.elements=a.getElements(t),a.mixinElements_=void 0,a.copyVisibilityInfo(s),a.setParent(a.elements,a),a}return h(t,e),t.prototype.accept=function(e){this.elements&&(this.elements=e.visitArray(this.elements)),this.extendList&&(this.extendList=e.visitArray(this.extendList)),this.condition&&(this.condition=e.visit(this.condition))},t.prototype.createDerived=function(e,n,i){var r=new t(e=this.getElements(e),n||this.extendList,null,this.getIndex(),this.fileInfo(),this.visibilityInfo());return r.evaldCondition=null!=i?i:this.evaldCondition,r.mediaEmpty=this.mediaEmpty,r},t.prototype.getElements=function(e){return e?("string"==typeof e&&this.parse.parseNode(e,["selector"],this._index,this._fileInfo,(function(t,n){if(t)throw new V({index:t.index,message:t.message},this.parse.imports,this._fileInfo.filename);e=n[0].elements})),e):[new b("","&",!1,this._index,this._fileInfo)]},t.prototype.createEmptySelectors=function(){var e=[new t([new b("","&",!1,this._index,this._fileInfo)],null,null,this._index,this._fileInfo)];return e[0].mediaEmpty=!0,e},t.prototype.match=function(e){var t,n,i=this.elements,r=i.length;if(0===(t=(e=e.mixinElements()).length)||rw.PARENS_DIVISION)||this.parensStack&&this.parensStack.length))},j.Eval.prototype.pathRequiresRewrite=function(e){return(this.rewriteUrls===S?J:W)(e)},j.Eval.prototype.rewritePath=function(e,t){var n;return t=t||"",n=this.normalizePath(t+e),J(e)&&W(t)&&!1===J(n)&&(n="./"+n),n},j.Eval.prototype.normalizePath=function(e){var t,n=e.split("/").reverse();for(e=[];0!==n.length;)switch(t=n.pop()){case".":break;case"..":0===e.length||".."===e[e.length-1]?e.push(t):e.pop();break;default:e.push(t)}return e.join("/")};var H=function e(t){return{_data:{},add:function(e,t){e=e.toLowerCase(),this._data.hasOwnProperty(e),this._data[e]=t},addMultiple:function(e){var t=this;Object.keys(e).forEach((function(n){t.add(n,e[n])}))},get:function(e){return this._data[e]||t&&t.get(e)},getLocalFunctions:function(){return this._data},inherit:function(){return e(this)},create:function(t){return e(t)}}}(null),Q={eval:function(){var e=this.value_,t=this.error_;if(t)throw t;if(null!=e)return e?L.True:L.False},value:function(e){this.value_=e},error:function(e){this.error_=e},reset:function(){this.value_=this.error_=null}},K=function(e){function t(t,n,i,r){var o=e.call(this)||this;return o.selectors=t,o.rules=n,o._lookups={},o._variables=null,o._properties=null,o.strictImports=i,o.copyVisibilityInfo(r),o.allowRoot=!0,o.setParent(o.selectors,o),o.setParent(o.rules,o),o}return h(t,e),t.prototype.isRulesetLike=function(){return!0},t.prototype.accept=function(e){this.paths?this.paths=e.visitArray(this.paths,!0):this.selectors&&(this.selectors=e.visitArray(this.selectors)),this.rules&&this.rules.length&&(this.rules=e.visitArray(this.rules))},t.prototype.eval=function(e){var n,i,r,o,s,a=!1;if(this.selectors&&(i=this.selectors.length)){for(n=new Array(i),Q.error({type:"Syntax",message:"it is currently only allowed in parametric mixin guards,"}),o=0;o0;e--){var t=this.rules[e-1];if(t instanceof B)return this.parseValue(t)}},t.prototype.parseValue=function(e){var t=this;function n(e){return e.value instanceof N&&!e.parsed?("string"==typeof e.value.value?this.parse.parseNode(e.value.value,["value","important"],e.value.getIndex(),e.fileInfo(),(function(t,n){t&&(e.parsed=!0),n&&(e.value=n[0],e.important=n[1]||"",e.parsed=!0)})):e.parsed=!0,e):e}if(Array.isArray(e)){var i=[];return e.forEach((function(e){i.push(n.call(t,e))})),i}return n.call(t,e)},t.prototype.rulesets=function(){if(!this.rules)return[];var e,t,n=[],i=this.rules;for(e=0;t=i[e];e++)t.isRuleset&&n.push(t);return n},t.prototype.prependRule=function(e){var t=this.rules;t?t.unshift(e):this.rules=[e],this.setParent(e,this)},t.prototype.find=function(e,t,n){t=t||this;var i,r,o=[],s=e.toCSS();return s in this._lookups?this._lookups[s]:(this.rulesets().forEach((function(s){if(s!==t)for(var a=0;ai){if(!n||n(s)){r=s.find(new $(e.elements.slice(i)),t,n);for(var l=0;l0&&t.add(l),e.firstSelector=!0,s[0].genCSS(e,t),e.firstSelector=!1,i=1;i0?(o=(r=k(e)).pop(),s=i.createDerived(k(o.elements))):s=i.createDerived([]),t.length>0){var a=n.combinator,l=t[0].elements[0];a.emptyOrWhitespace&&!l.combinator.emptyOrWhitespace&&(a=l.combinator),s.elements.push(new b(a,l.value,n.isVariable,n._index,n._fileInfo)),s.elements=s.elements.concat(t[0].elements.slice(1))}if(0!==s.elements.length&&r.push(s),t.length>1){var u=t.slice(1);u=u.map((function(e){return e.createDerived(e.elements,[])})),r=r.concat(u)}return r}function s(e,t,n,i,r){var s;for(s=0;s0?i[i.length-1]=i[i.length-1].createDerived(i[i.length-1].elements.concat(e)):i.push(new $(e));else t.push([new $(e)])}function l(e,t){var n=t.createDerived(t.elements,t.extendList,t.evaldCondition);return n.copyVisibilityInfo(e),n}var u,c;if(!function e(t,n,l){var u,c,h,f,p,v,d,g,y,w,x,S,I=!1;for(f=[],p=[[]],u=0;g=l.elements[u];u++)if("&"!==g.value){var C=(S=void 0,(x=g).value instanceof m&&(S=x.value.value)instanceof $?S:null);if(null!=C){a(f,p);var k,_=[],A=[];for(k=e(_,n,C),I=I||k,h=0;h<_.length;h++){s(p,[r(i(_[h],g),g)],g,l,A)}p=A,f=[]}else f.push(g)}else{for(I=!0,v=[],a(f,p),c=0;c0&&d[0].elements.push(new b(g.combinator,"",g.isVariable,g._index,g._fileInfo)),v.push(d);else for(h=0;h0&&(t.push(p[u]),w=p[u][y-1],p[u][y-1]=w.createDerived(w.elements,l.extendList));return I}(c=[],t,n))if(t.length>0)for(c=[],u=0;u0)for(t=0;t-1e-6&&(i=n.toFixed(20).replace(/0+$/,"")),e&&e.compress){if(0===n&&this.unit.isLength())return void t.add(i);n>0&&n<1&&(i=i.substr(1))}t.add(i),this.unit.genCSS(e,t)},t.prototype.operate=function(e,n,i){var r=this._operate(e,n,this.value,i.value),o=this.unit.clone();if("+"===n||"-"===n)if(0===o.numerator.length&&0===o.denominator.length)o=i.unit.clone(),this.unit.backupUnit&&(o.backupUnit=this.unit.backupUnit);else if(0===i.unit.numerator.length&&0===o.denominator.length);else{if(i=i.convertTo(this.unit.usedUnits()),e.strictUnits&&i.unit.toString()!==o.toString())throw new Error("Incompatible units. Change the units or use the unit function. Bad units: '"+o.toString()+"' and '"+i.unit.toString()+"'.");r=this._operate(e,n,this.value,i.value)}else"*"===n?(o.numerator=o.numerator.concat(i.unit.numerator).sort(),o.denominator=o.denominator.concat(i.unit.denominator).sort(),o.cancel()):"/"===n&&(o.numerator=o.numerator.concat(i.unit.denominator).sort(),o.denominator=o.denominator.concat(i.unit.numerator).sort(),o.cancel());return new t(r,o)},t.prototype.compare=function(e){var n,i;if(e instanceof t){if(this.unit.isEmpty()||e.unit.isEmpty())n=this,i=e;else if(n=this.unify(),i=e.unify(),0!==n.unit.compare(i.unit))return;return u.numericCompare(n.value,i.value)}},t.prototype.unify=function(){return this.convertTo({length:"px",duration:"s",angle:"rad"})},t.prototype.convertTo=function(e){var n,i,r,o,s,l=this.value,u=this.unit.clone(),c={};if("string"==typeof e){for(n in a)a[n].hasOwnProperty(e)&&((c={})[n]=e);e=c}for(i in s=function(e,t){return r.hasOwnProperty(e)?(t?l/=r[e]/r[o]:l*=r[e]/r[o],o):e},e)e.hasOwnProperty(i)&&(o=e[i],r=a[i],u.map(s));return u.cancel(),new t(l,u)},t}(u);ee.prototype.type="Dimension";var te=w,ne=function(e){function t(t,n,i){var r=e.call(this)||this;return r.op=t.trim(),r.operands=n,r.isSpaced=i,r}return h(t,e),t.prototype.accept=function(e){this.operands=e.visitArray(this.operands)},t.prototype.eval=function(e){var n,i=this.operands[0].eval(e),r=this.operands[1].eval(e);if(e.isMathOn(this.op)){if(n="./"===this.op?"/":this.op,i instanceof ee&&r instanceof p&&(i=i.toColor()),r instanceof ee&&i instanceof p&&(r=r.toColor()),!i.operate){if(i instanceof t&&"/"===i.op&&e.math===te.PARENS_DIVISION)return new t(this.op,[i,r],this.isSpaced);throw{type:"Operation",message:"Operation on an invalid type"}}return i.operate(e,n,r)}return new t(this.op,[i,r],this.isSpaced)},t.prototype.genCSS=function(e,t){this.operands[0].genCSS(e,t),this.isSpaced&&t.add(" "),t.add(this.op),this.isSpaced&&t.add(" "),this.operands[1].genCSS(e,t)},t}(u);ne.prototype.type="Operation";var ie=function(e){function t(t,n){var i=e.call(this)||this;if(i.value=t,i.noSpacing=n,!t)throw new Error("Expression requires an array parameter");return i}return h(t,e),t.prototype.accept=function(e){this.value=e.visitArray(this.value)},t.prototype.eval=function(e){var n,i=e.isMathOn(),r=this.parens,o=!1;return r&&e.inParenthesis(),this.value.length>1?n=new t(this.value.map((function(t){return t.eval?t.eval(e):t})),this.noSpacing):1===this.value.length?(!this.value[0].parens||this.value[0].parensInOp||e.inCalc||(o=!0),n=this.value[0].eval(e)):n=this,r&&e.outOfParenthesis(),!this.parens||!this.parensInOp||i||o||n instanceof ee||(n=new m(n)),n},t.prototype.genCSS=function(e,t){for(var n=0;n1){var n=new $([],null,null,this.getIndex(),this.fileInfo()).createEmptySelectors();(t=new K(n,e.mediaBlocks)).multiMedia=!0,t.copyVisibilityInfo(this.visibilityInfo()),this.setParent(t,this)}return delete e.mediaBlocks,delete e.mediaPath,t},t.prototype.evalNested=function(e){var t,n,i=e.mediaPath.concat([this]);for(t=0;t0;t--)e.splice(t,0,new N("and"));return new ie(e)}))),this.setParent(this.features,this),new K([],[])},t.prototype.permute=function(e){if(0===e.length)return[];if(1===e.length)return e[0];for(var t=[],n=this.permute(e.slice(1)),i=0;i1?"["+e.value.map((function(e){return e.toCSS()})).join(", ")+"]":e.toCSS()},t}(u));pe.prototype.type="JavaScript";var ve=function(e){function t(t,n){var i=e.call(this)||this;return i.key=t,i.value=n,i}return h(t,e),t.prototype.accept=function(e){this.value=e.visit(this.value)},t.prototype.eval=function(e){return this.value.eval?new t(this.key,this.value.eval(e)):this},t.prototype.genCSS=function(e,t){t.add(this.key+"="),this.value.genCSS?this.value.genCSS(e,t):t.add(this.value)},t}(u);ve.prototype.type="Assignment";var de=function(e){function t(t,n,i,r,o){var s=e.call(this)||this;return s.op=t.trim(),s.lvalue=n,s.rvalue=i,s._index=r,s.negate=o,s}return h(t,e),t.prototype.accept=function(e){this.lvalue=e.visit(this.lvalue),this.rvalue=e.visit(this.rvalue)},t.prototype.eval=function(e){var t=function(e,t,n){switch(e){case"and":return t&&n;case"or":return t||n;default:switch(u.compare(t,n)){case-1:return"<"===e||"=<"===e||"<="===e;case 0:return"="===e||">="===e||"=<"===e||"<="===e;case 1:return">"===e||">="===e;default:return!1}}}(this.op,this.lvalue.eval(e),this.rvalue.eval(e));return this.negate?!t:t},t}(u);de.prototype.type="Condition";var me=function(e){function t(t){var n=e.call(this)||this;return n.value=t,n}return h(t,e),t}(u);me.prototype.type="UnicodeDescriptor";var ge=function(e){function t(t){var n=e.call(this)||this;return n.value=t,n}return h(t,e),t.prototype.genCSS=function(e,t){t.add("-"),this.value.genCSS(e,t)},t.prototype.eval=function(e){return e.isMathOn()?new ne("*",[new ee(-1),this.value]).eval(e):new t(this.value.eval(e))},t}(u);ge.prototype.type="Negative";var ye=function(e){function t(n,i,r,o,s){var a=e.call(this)||this;switch(a.selector=n,a.option=i,a.object_id=t.next_id++,a.parent_ids=[a.object_id],a._index=r,a._fileInfo=o,a.copyVisibilityInfo(s),a.allowRoot=!0,i){case"all":a.allowBefore=!0,a.allowAfter=!0;break;default:a.allowBefore=!1,a.allowAfter=!1}return a.setParent(a.selector,a),a}return h(t,e),t.prototype.accept=function(e){this.selector=e.visit(this.selector)},t.prototype.eval=function(e){return new t(this.selector.eval(e),this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},t.prototype.clone=function(e){return new t(this.selector,this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},t.prototype.findSelfSelectors=function(e){var t,n,i=[];for(t=0;t0&&n.length&&""===n[0].combinator.value&&(n[0].combinator.value=" "),i=i.concat(e[t].elements);this.selfSelectors=[new $(i)],this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo())},t}(u);ye.next_id=0,ye.prototype.type="Extend";var be=function(e){function t(t,n,i){var r=e.call(this)||this;return r.variable=t,r._index=n,r._fileInfo=i,r.allowRoot=!0,r}return h(t,e),t.prototype.eval=function(e){var t,n=new se(this.variable,this.getIndex(),this.fileInfo()).eval(e),i=new V({message:"Could not evaluate variable call "+this.variable});if(!n.ruleset){if(n.rules)t=n;else if(Array.isArray(n))t=new K("",n);else{if(!Array.isArray(n.value))throw i;t=new K("",n.value)}n=new X(t)}if(n.ruleset)return n.callEval(e);throw i},t}(u);be.prototype.type="VariableCall";var we=function(e){function t(t,n,i,r){var o=e.call(this)||this;return o.value=t,o.lookups=n,o._index=i,o._fileInfo=r,o}return h(t,e),t.prototype.eval=function(e){var t,n,i=this.value.eval(e);for(t=0;tthis.params.length)return!1}n=Math.min(o,this.arity);for(var s=0;s0){for(c=!0,a=0;a0)f=2;else if(f=1,p[1]+p[2]>1)throw{type:"Runtime",message:"Ambiguous use of `default()` found when matching for `"+this.format(m)+"`",index:this.getIndex(),filename:this.fileInfo().filename};for(a=0;a0&&(e=e.slice(0,t)),(t=e.lastIndexOf("/"))<0&&(t=e.lastIndexOf("\\")),t<0?"":e.slice(0,t+1)},e.prototype.tryAppendExtension=function(e,t){return/(\.[a-z]*$)|([\?;].*)$/.test(e)?e:e+t},e.prototype.tryAppendLessExtension=function(e){return this.tryAppendExtension(e,".less")},e.prototype.supportsSync=function(){return!1},e.prototype.alwaysMakePathsAbsolute=function(){return!1},e.prototype.isPathAbsolute=function(e){return/^(?:[a-z-]+:|\/|\\|#)/i.test(e)},e.prototype.join=function(e,t){return e?e+t:t},e.prototype.pathDiff=function(e,t){var n,i,r,o,s=this.extractUrlParts(e),a=this.extractUrlParts(t),l="";if(s.hostPart!==a.hostPart)return"";for(i=Math.max(a.directories.length,s.directories.length),n=0;nparseInt(t[n])?-1:1;return 0},e.prototype.versionToString=function(e){for(var t="",n=0;n0;){var e=this.imports[0];if(!e.isReady)return;this.imports=this.imports.slice(1),e.callback.apply(null,e.args)}if(0===this.variableImports.length)break;var t=this.variableImports[0];this.variableImports=this.variableImports.slice(1),t()}}finally{this._currentDepth--}0===this._currentDepth&&this._onSequencerEmpty&&this._onSequencerEmpty()},e}(),Re=function(e,t){this._visitor=new Ee(this),this._importer=e,this._finish=t,this.context=new j.Eval,this.importCount=0,this.onceFileDetectionMap={},this.recursionDetector={},this._sequencer=new Pe(this._onSequencerEmpty.bind(this))};Re.prototype={isReplacing:!1,run:function(e){try{this._visitor.visit(e)}catch(e){this.error=e}this.isFinished=!0,this._sequencer.tryRun()},_onSequencerEmpty:function(){this.isFinished&&this._finish(this.error)},visitImport:function(e,t){var n=e.options.inline;if(!e.css||n){var i=new j.Eval(this.context,k(this.context.frames)),r=i.frames[0];this.importCount++,e.isVariableImport()?this._sequencer.addVariableImport(this.processImportNode.bind(this,e,i,r)):this.processImportNode(e,i,r)}t.visitDeeper=!1},processImportNode:function(e,t,n){var i,r=e.options.inline;try{i=e.evalForImport(t)}catch(t){t.filename||(t.index=e.getIndex(),t.filename=e.fileInfo().filename),e.css=!0,e.error=t}if(!i||i.css&&!r)this.importCount--,this.isFinished&&this._sequencer.tryRun();else{i.options.multiple&&(t.importMultiple=!0);for(var o=void 0===i.css,s=0;s=0||(a=[u.selfSelectors[0]],(o=f.findMatch(l,a)).length&&(l.hasFoundMatches=!0,l.selfSelectors.forEach((function(e){var t=u.visibilityInfo();s=f.extendSelector(o,a,e,l.isVisible()),(c=new Ie.Extend(u.selector,u.option,0,u.fileInfo(),t)).selfSelectors=s,s[s.length-1].extendList=[c],h.push(c),c.ruleset=u.ruleset,c.parent_ids=c.parent_ids.concat(u.parent_ids,l.parent_ids),u.firstExtendOnThisSelectorPath&&(c.firstExtendOnThisSelectorPath=!0,u.ruleset.paths.push(s))}))));if(h.length){if(this.extendChainCount++,n>100){var p="{unable to calculate}",v="{unable to calculate}";try{p=h[0].selfSelectors[0].toCSS(),v=h[0].selector.toCSS()}catch(e){}throw{message:"extend circular reference detected. One of the circular extends is currently:"+p+":extend("+v+")"}}return h.concat(f.doExtendChaining(h,t,n+1))}return h},e.prototype.visitDeclaration=function(e,t){t.visitDeeper=!1},e.prototype.visitMixinDefinition=function(e,t){t.visitDeeper=!1},e.prototype.visitSelector=function(e,t){t.visitDeeper=!1},e.prototype.visitRuleset=function(e,t){if(!e.root){var n,i,r,o,s=this.allExtendsStack[this.allExtendsStack.length-1],a=[],l=this;for(r=0;r0&&u[l.matched].combinator.value!==s?l=null:l.matched++,l&&(l.finished=l.matched===u.length,l.finished&&!e.allowAfter&&(r+1u&&c>0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[u].elements.slice(c)),c=0,u++),l=o.elements.slice(c,a.index).concat([s]).concat(n.elements.slice(1)),u===a.pathIndex&&r>0?h[h.length-1].elements=h[h.length-1].elements.concat(l):(h=h.concat(t.slice(u,a.pathIndex))).push(new Ie.Selector(l)),u=a.endPathIndex,(c=a.endPathElementIndex)>=t[u].elements.length&&(c=0,u++);return u0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[u].elements.slice(c)),u++),h=(h=h.concat(t.slice(u,t.length))).map((function(e){var t=e.createDerived(e.elements);return i?t.ensureVisibility():t.ensureInvisibility(),t}))},e.prototype.visitMedia=function(e,t){var n=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);n=n.concat(this.doExtendChaining(n,e.allExtends)),this.allExtendsStack.push(n)},e.prototype.visitMediaOut=function(e){var t=this.allExtendsStack.length-1;this.allExtendsStack.length=t},e.prototype.visitAtRule=function(e,t){var n=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);n=n.concat(this.doExtendChaining(n,e.allExtends)),this.allExtendsStack.push(n)},e.prototype.visitAtRuleOut=function(e){var t=this.allExtendsStack.length-1;this.allExtendsStack.length=t},e}(),Oe=function(){function e(){this.contexts=[[]],this._visitor=new Ee(this)}return e.prototype.run=function(e){return this._visitor.visit(e)},e.prototype.visitDeclaration=function(e,t){t.visitDeeper=!1},e.prototype.visitMixinDefinition=function(e,t){t.visitDeeper=!1},e.prototype.visitRuleset=function(e,t){var n,i=this.contexts[this.contexts.length-1],r=[];this.contexts.push(r),e.root||((n=e.selectors)&&(n=n.filter((function(e){return e.getIsOutput()})),e.selectors=n.length?n:n=null,n&&e.joinSelectors(r,i,n)),n||(e.rules=null),e.paths=r)},e.prototype.visitRulesetOut=function(e){this.contexts.length=this.contexts.length-1},e.prototype.visitMedia=function(e,t){var n=this.contexts[this.contexts.length-1];e.rules[0].root=0===n.length||n[0].multiMedia},e.prototype.visitAtRule=function(e,t){var n=this.contexts[this.contexts.length-1];e.rules&&e.rules.length&&(e.rules[0].root=e.isRooted||0===n.length||null)},e}(),Le=function(){function e(e){this._visitor=new Ee(this),this._context=e}return e.prototype.containsSilentNonBlockedChild=function(e){var t;if(!e)return!1;for(var n=0;n0},e.prototype.resolveVisibility=function(e,t){if(!e.blocksVisibility()){if(this.isEmpty(e)&&!this.containsSilentNonBlockedChild(t))return;return e}var n=e.rules[0];if(this.keepOnlyVisibleChilds(n),!this.isEmpty(n))return e.ensureVisibility(),e.removeVisibilityBlock(),e},e.prototype.isVisibleRuleset=function(e){return!!e.firstRoot||!this.isEmpty(e)&&!(!e.root&&!this.hasVisibleSelector(e))},e}(),Ne=function(e){this._visitor=new Ee(this),this._context=e,this.utils=new Le(e)};Ne.prototype={isReplacing:!0,run:function(e){return this._visitor.visit(e)},visitDeclaration:function(e,t){if(!e.blocksVisibility()&&!e.variable)return e},visitMixinDefinition:function(e,t){e.frames=[]},visitExtend:function(e,t){},visitComment:function(e,t){if(!e.blocksVisibility()&&!e.isSilent(this._context))return e},visitMedia:function(e,t){var n=e.rules[0].rules;return e.accept(this._visitor),t.visitDeeper=!1,this.utils.resolveVisibility(e,n)},visitImport:function(e,t){if(!e.blocksVisibility())return e},visitAtRule:function(e,t){return e.rules&&e.rules.length?this.visitAtRuleWithBody(e,t):this.visitAtRuleWithoutBody(e,t)},visitAnonymous:function(e,t){if(!e.blocksVisibility())return e.accept(this._visitor),e},visitAtRuleWithBody:function(e,t){var n=function(e){var t=e.rules;return function(e){var t=e.rules;return 1===t.length&&(!t[0].paths||0===t[0].paths.length)}(e)?t[0].rules:t}(e);return e.accept(this._visitor),t.visitDeeper=!1,this.utils.isEmpty(e)||this._mergeRules(e.rules[0].rules),this.utils.resolveVisibility(e,n)},visitAtRuleWithoutBody:function(e,t){if(!e.blocksVisibility()){if("@charset"===e.name){if(this.charset){if(e.debugInfo){var n=new Ie.Comment("/* "+e.toCSS(this._context).replace(/\n/g,"")+" */\n");return n.debugInfo=e.debugInfo,this._visitor.visit(n)}return}this.charset=!0}return e}},checkValidNodes:function(e,t){if(e)for(var n=0;n0?e.accept(this._visitor):e.rules=null,t.visitDeeper=!1}return e.rules&&(this._mergeRules(e.rules),this._removeDuplicateRules(e.rules)),this.utils.isVisibleRuleset(e)&&(e.ensureVisibility(),i.splice(0,0,e)),1===i.length?i[0]:i},_compileRulesetPaths:function(e){e.paths&&(e.paths=e.paths.filter((function(e){var t;for(" "===e[0].elements[0].combinator.value&&(e[0].elements[0].combinator=new Ie.Combinator("")),t=0;t=0;i--)if((n=e[i])instanceof Ie.Declaration)if(r[n.name]){(t=r[n.name])instanceof Ie.Declaration&&(t=r[n.name]=[r[n.name].toCSS(this._context)]);var o=n.toCSS(this._context);-1!==t.indexOf(o)?e.splice(i,1):t.push(o)}else r[n.name]=n}},_mergeRules:function(e){if(e){for(var t={},n=[],i=0;i0){var t=e[0],n=[],i=[new Ie.Expression(n)];e.forEach((function(e){"+"===e.merge&&n.length>0&&i.push(new Ie.Expression(n=[])),n.push(e.value),t.important=t.important||e.important})),t.value=new Ie.Value(i)}}))}}};var De={Visitor:Ee,ImportVisitor:Re,MarkVisibleSelectorsVisitor:Ve,ExtendVisitor:$e,JoinSelectorVisitor:Oe,ToCSSVisitor:Ne};var Be=function(){var e,t,n,i,r,o,s,a=[],l={};function u(n){for(var i,a,c,h=l.i,f=t,p=l.i-s,v=l.i+o.length-p,d=l.i+=n,m=e;l.i=0){c={index:l.i,text:m.substr(l.i,y+2-l.i),isLineComment:!1},l.i+=c.text.length-1,l.commentStore.push(c);continue}}break}if(32!==i&&10!==i&&9!==i&&13!==i)break}if(o=o.slice(n+l.i-d+p),s=l.i,!o.length){if(tn||l.i===n&&e&&!i)&&(n=l.i,i=e);var r=a.pop();o=r.current,s=l.i=r.i,t=r.j},l.forget=function(){a.pop()},l.isWhitespace=function(t){var n=l.i+(t||0),i=e.charCodeAt(n);return 32===i||13===i||9===i||10===i},l.$re=function(e){l.i>s&&(o=o.slice(l.i-s),s=l.i);var t=e.exec(o);return t?(u(t[0].length),"string"==typeof t?t:1===t.length?t[0]:t):null},l.$char=function(t){return e.charAt(l.i)!==t?null:(u(1),t)},l.$str=function(t){for(var n=t.length,i=0;ih&&(d=!1)}}while(d);return r||null},l.autoCommentAbsorb=!0,l.commentStore=[],l.finished=!1,l.peek=function(t){if("string"==typeof t){for(var n=0;n57||t<43||47===t||44===t},l.start=function(i,a,c){e=i,l.i=t=s=n=0,r=a?function(e,t){var n,i,r,o,s,a,l,u,c,h=e.length,f=0,p=0,v=[],d=0;function m(t){var n=s-d;n<512&&!t||!n||(v.push(e.slice(d,s+1)),d=s+1)}for(s=0;s=97&&l<=122||l<34))switch(l){case 40:p++,i=s;continue;case 41:if(--p<0)return t("missing opening `(`",s);continue;case 59:p||m();continue;case 123:f++,n=s;continue;case 125:if(--f<0)return t("missing opening `{`",s);f||p||m();continue;case 92:if(s96)){if(u==l){c=1;break}if(92==u){if(s==h-1)return t("unescaped `\\`",s);s++}}if(c)continue;return t("unmatched `"+String.fromCharCode(l)+"`",a);case 47:if(p||s==h-1)continue;if(47==(u=e.charCodeAt(s+1)))for(s+=2;sn&&o>r?"missing closing `}` or `*/`":"missing closing `}`",n):0!==p?t("missing closing `)`",i):(m(!0),v)}(i,c):[i],o=r[0],u(0)},l.end=function(){var t,r=l.i>=e.length;return l.i=e.length-1,furthestChar:e[l.i]}},l},Ue=function e(t,n,i){var r,o=Be();function s(e,t){throw new V({index:o.i,filename:i.filename,type:t||"Syntax",message:e},n)}function a(e,t){var n=e instanceof Function?e.call(r):o.$re(e);if(n)return n;s(t||("string"==typeof e?"expected '"+e+"' got '"+o.currentChar()+"'":"unexpected token"))}function l(e,t){if(o.$char(e))return e;s(t||"expected '"+e+"' got '"+o.currentChar()+"'")}function u(e){var t=i.filename;return{lineNumber:C(e,o.getInput()).line+1,fileName:t}}return{parserInput:o,imports:n,fileInfo:i,parseNode:function(e,t,i,s,a){var l,u=[],c=o;try{c.start(e,!1,(function(e,t){a({message:e,index:t+i})}));for(var h=0,f=void 0,p=void 0;f=t[h];h++)if(p=c.i,l=r[f]()){try{l._index=p+i,l._fileInfo=s}catch(e){}u.push(l)}else u.push(null);c.end().isFinished?a(null,u):a(!0,null)}catch(e){throw new V({index:e.index+i,message:e.message},n,s.filename)}},parse:function(r,s,a){var l,u,c,h,f=null,p="";if(u=a&&a.globalVars?e.serializeVars(a.globalVars)+"\n":"",c=a&&a.modifyVars?"\n"+e.serializeVars(a.modifyVars):"",t.pluginManager)for(var v=t.pluginManager.getPreProcessors(),d=0;d");return e},args:function(e){var t,n,i,a,l,u,c,h=r.entities,f={args:null,variadic:!1},p=[],v=[],d=[],m=!0;for(o.save();;){if(e)u=r.detachedRuleset()||r.expression();else{if(o.commentStore.length=0,o.$str("...")){f.variadic=!0,o.$char(";")&&!t&&(t=!0),(t?v:d).push({variadic:!0});break}u=h.variable()||h.property()||h.literal()||h.keyword()||this.call(!0)}if(!u||!m)break;a=null,u.throwAwayComments&&u.throwAwayComments(),l=u;var g=null;if(e?u.value&&1==u.value.length&&(g=u.value[0]):g=u,g&&(g instanceof Ie.Variable||g instanceof Ie.Property))if(o.$char(":")){if(p.length>0&&(t&&s("Cannot mix ; and , as delimiter types"),n=!0),!(l=r.detachedRuleset()||r.expression())){if(!e)return o.restore(),f.args=[],f;s("could not understand value for named argument")}a=i=g.name}else if(o.$str("...")){if(!e){f.variadic=!0,o.$char(";")&&!t&&(t=!0),(t?v:d).push({name:u.name,variadic:!0});break}c=!0}else e||(i=a=g.name,l=null);l&&p.push(l),d.push({name:a,value:l,expand:c}),o.$char(",")?m=!0:((m=";"===o.$char(";"))||t)&&(n&&s("Cannot mix ; and , as delimiter types"),t=!0,p.length>1&&(l=new Ie.Value(p)),v.push({name:i,value:l,expand:c}),i=null,p=[],n=!1)}return o.forget(),f.args=t?v:d,f},definition:function(){var e,t,n,i,s=[],l=!1;if(!("."!==o.currentChar()&&"#"!==o.currentChar()||o.peek(/^[^{]*\}/)))if(o.save(),t=o.$re(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/)){e=t[1];var u=this.args(!1);if(s=u.args,l=u.variadic,!o.$char(")"))return void o.restore("Missing closing ')'");if(o.commentStore.length=0,o.$str("when")&&(i=a(r.conditions,"expected condition")),n=r.block())return o.forget(),new Ie.mixin.Definition(e,s,n,i,l);o.restore()}else o.restore()},ruleLookups:function(){var e,t=[];if("["===o.currentChar()){for(;;){if(o.save(),!(e=this.lookupValue())&&""!==e){o.restore();break}t.push(e),o.forget()}return t.length>0?t:void 0}},lookupValue:function(){if(o.save(),o.$char("[")){var e=o.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);if(o.$char("]"))return e||""===e?(o.forget(),e):void o.restore();o.restore()}else o.restore()}},entity:function(){var e=this.entities;return this.comment()||e.literal()||e.variable()||e.url()||e.property()||e.call()||e.keyword()||this.mixin.call(!0)||e.javascript()},end:function(){return o.$char(";")||o.peek("}")},ieAlpha:function(){var e;if(o.$re(/^opacity=/i))return(e=o.$re(/^\d+/))||(e="@{"+(e=a(r.entities.variable,"Could not parse alpha")).name.slice(1)+"}"),l(")"),new Ie.Quoted("","alpha(opacity="+e+")")},element:function(){var e,t,n,r=o.i;if(t=this.combinator(),(e=o.$re(/^(?:\d+\.\d+|\d+)%/)||o.$re(/^(?:[.#]?|:*)(?:[\w-]|[^\x00-\x9f]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/)||o.$char("*")||o.$char("&")||this.attribute()||o.$re(/^\([^&()@]+\)/)||o.$re(/^[\.#:](?=@)/)||this.entities.variableCurly())||(o.save(),o.$char("(")?(n=this.selector(!1))&&o.$char(")")?(e=new Ie.Paren(n),o.forget()):o.restore("Missing closing ')'"):o.forget()),e)return new Ie.Element(t,e,e instanceof Ie.Variable,r,i)},combinator:function(){var e=o.currentChar();if("/"===e){o.save();var t=o.$re(/^\/[a-z]+\//i);if(t)return o.forget(),new Ie.Combinator(t);o.restore()}if(">"===e||"+"===e||"~"===e||"|"===e||"^"===e){for(o.i++,"^"===e&&"^"===o.currentChar()&&(e="^^",o.i++);o.isWhitespace();)o.i++;return new Ie.Combinator(e)}return o.isWhitespace(-1)?new Ie.Combinator(" "):new Ie.Combinator(null)},selector:function(e){var t,n,r,l,u,c,h,f=o.i;for(e=!1!==e;(e&&(n=this.extend())||e&&(c=o.$str("when"))||(l=this.element()))&&(c?h=a(this.conditions,"expected condition"):h?s("CSS guard can only be used at the end of selector"):n?u=u?u.concat(n):n:(u&&s("Extend can only be used at the end of selector"),r=o.currentChar(),t?t.push(l):t=[l],l=null),"{"!==r&&"}"!==r&&";"!==r&&","!==r&&")"!==r););if(t)return new Ie.Selector(t,u,h,f,i);u&&s("Extend must be used to extend a selector, it cannot be used on its own")},selectors:function(){for(var e,t;(e=this.selector())&&(t?t.push(e):t=[e],o.commentStore.length=0,e.condition&&t.length>1&&s("Guards are only currently allowed on a single selector."),o.$char(","));)e.condition&&s("Guards are only currently allowed on a single selector."),o.commentStore.length=0;return t},attribute:function(){if(o.$char("[")){var e,t,n,i=this.entities;return(e=i.variableCurly())||(e=a(/^(?:[_A-Za-z0-9-\*]*\|)?(?:[_A-Za-z0-9-]|\\.)+/)),(n=o.$re(/^[|~*$^]?=/))&&(t=i.quoted()||o.$re(/^[0-9]+%/)||o.$re(/^[\w-]+/)||i.variableCurly()),l("]"),new Ie.Attribute(e,n,t)}},block:function(){var e;if(o.$char("{")&&(e=this.primary())&&o.$char("}"))return e},blockRuleset:function(){var e=this.block();return e&&(e=new Ie.Ruleset(null,e)),e},detachedRuleset:function(){var e,t,n;if(o.save(),!o.$re(/^[.#]\(/)||(t=(e=this.mixin.args(!1)).args,n=e.variadic,o.$char(")"))){var i=this.blockRuleset();if(i)return o.forget(),t?new Ie.mixin.Definition(null,t,i,null,n):new Ie.DetachedRuleset(i);o.restore()}else o.restore()},ruleset:function(){var e,n,i;if(o.save(),t.dumpLineNumbers&&(i=u(o.i)),(e=this.selectors())&&(n=this.block())){o.forget();var r=new Ie.Ruleset(e,n,t.strictImports);return t.dumpLineNumbers&&(r.debugInfo=i),r}o.restore()},declaration:function(){var e,t,n,r,s,a,l=o.i,u=o.currentChar();if("."!==u&&"#"!==u&&"&"!==u&&":"!==u)if(o.save(),e=this.variable()||this.ruleProperty()){if((a="string"==typeof e)&&(t=this.detachedRuleset())&&(n=!0),o.commentStore.length=0,!t){if(s=!a&&e.length>1&&e.pop().value,t=e[0].value&&"--"===e[0].value.slice(0,2)?this.permissiveValue():this.anonymousValue())return o.forget(),new Ie.Declaration(e,t,!1,s,l,i);t||(t=this.value()),t?r=this.important():a&&(t=this.permissiveValue())}if(t&&(this.end()||n))return o.forget(),new Ie.Declaration(e,t,r,s,l,i);o.restore()}else o.restore()},anonymousValue:function(){var e=o.i,t=o.$re(/^([^.#@\$+\/'"*`(;{}-]*);/);if(t)return new Ie.Anonymous(t[1],e)},permissiveValue:function(e){var t,n,r,a,l=e||";",u=o.i,c=[];function h(){var e=o.currentChar();return"string"==typeof l?e===l:l.test(e)}if(!h()){a=[];do{((n=this.comment())||(n=this.entity()))&&a.push(n)}while(n);if(r=h(),a.length>0){if(a=new Ie.Expression(a),r)return a;c.push(a)," "===o.prevChar()&&c.push(new Ie.Anonymous(" ",u))}if(o.save(),a=o.$parseUntil(l)){if("string"==typeof a&&s("Expected '"+a+"'","Parse"),1===a.length&&" "===a[0])return o.forget(),new Ie.Anonymous("",u);var f=void 0;for(t=0;t0)return new Ie.Expression(r)},mediaFeatures:function(){var e,t=this.entities,n=[];do{if(e=this.mediaFeature()){if(n.push(e),!o.$char(","))break}else if((e=t.variable()||t.mixinLookup())&&(n.push(e),!o.$char(",")))break}while(e);return n.length>0?n:null},media:function(){var e,n,r,a,l=o.i;if(t.dumpLineNumbers&&(a=u(l)),o.save(),o.$str("@media"))return e=this.mediaFeatures(),(n=this.block())||s("media definitions require block statements after any features"),o.forget(),r=new Ie.Media(n,e,l,i),t.dumpLineNumbers&&(r.debugInfo=a),r;o.restore()},plugin:function(){var e,t,n,r=o.i;if(o.$re(/^@plugin?\s+/)){if(n=(t=this.pluginArgs())?{pluginArgs:t,isPlugin:!0}:{isPlugin:!0},e=this.entities.quoted()||this.entities.url())return o.$char(";")||(o.i=r,s("missing semi-colon on @plugin")),new Ie.Import(e,null,n,r,i);o.i=r,s("malformed @plugin statement")}},pluginArgs:function(){if(o.save(),!o.$char("("))return o.restore(),null;var e=o.$re(/^\s*([^\);]+)\)\s*/);return e[1]?(o.forget(),e[1].trim()):(o.restore(),null)},atrule:function(){var e,n,r,a,l,c,h,f=o.i,p=!0,v=!0;if("@"===o.currentChar()){if(n=this.import()||this.plugin()||this.media())return n;if(o.save(),e=o.$re(/^@[a-z-]+/)){switch(a=e,"-"==e.charAt(1)&&e.indexOf("-",2)>0&&(a="@"+e.slice(e.indexOf("-",2)+1)),a){case"@charset":l=!0,p=!1;break;case"@namespace":c=!0,p=!1;break;case"@keyframes":case"@counter-style":l=!0;break;case"@document":case"@supports":h=!0,v=!1;break;default:h=!0}if(o.commentStore.length=0,l?(n=this.entity())||s("expected "+e+" identifier"):c?(n=this.expression())||s("expected "+e+" expression"):h&&(n=this.permissiveValue(/^[{;]/),p="{"===o.currentChar(),n?n.value||(n=null):p||";"===o.currentChar()||s(e+" rule is missing block or ending semi-colon")),p&&(r=this.blockRuleset()),r||!p&&n&&o.$char(";"))return o.forget(),new Ie.AtRule(e,n,r,f,i,t.dumpLineNumbers?u(f):null,v);o.restore("at-rule options not recognised")}}},value:function(){var e,t=[],n=o.i;do{if((e=this.expression())&&(t.push(e),!o.$char(",")))break}while(e);if(t.length>0)return new Ie.Value(t,n)},important:function(){if("!"===o.currentChar())return o.$re(/^! *important/)},sub:function(){var e,t;if(o.save(),o.$char("("))return(e=this.addition())&&o.$char(")")?(o.forget(),(t=new Ie.Expression([e])).parens=!0,t):void o.restore("Expected ')'");o.restore()},multiplication:function(){var e,t,n,i,r;if(e=this.operand()){for(r=o.isWhitespace(-1);!o.peek(/^\/[*\/]/);){if(o.save(),!(n=o.$char("/")||o.$char("*")||o.$str("./"))){o.forget();break}if(!(t=this.operand())){o.restore();break}o.forget(),e.parensInOp=!0,t.parensInOp=!0,i=new Ie.Operation(n,[i||e,t],r),r=o.isWhitespace(-1)}return i||e}},addition:function(){var e,t,n,i,r;if(e=this.multiplication()){for(r=o.isWhitespace(-1);(n=o.$re(/^[-+]\s+/)||!r&&(o.$char("+")||o.$char("-")))&&(t=this.multiplication());)e.parensInOp=!0,t.parensInOp=!0,i=new Ie.Operation(n,[i||e,t],r),r=o.isWhitespace(-1);return i||e}},conditions:function(){var e,t,n,i=o.i;if(e=this.condition(!0)){for(;o.peek(/^,\s*(not\s*)?\(/)&&o.$char(",")&&(t=this.condition(!0));)n=new Ie.Condition("or",n||e,t,i);return n||e}},condition:function(e){var t,n,i;if(t=this.conditionAnd(e)){if(n=o.$str("or")){if(!(i=this.condition(e)))return;t=new Ie.Condition(n,t,i)}return t}},conditionAnd:function(e){var t,n,i,r,s=this;if(t=(r=s.negatedCondition(e)||s.parenthesisCondition(e))||e?r:s.atomicCondition(e)){if(n=o.$str("and")){if(!(i=this.conditionAnd(e)))return;t=new Ie.Condition(n,t,i)}return t}},negatedCondition:function(e){if(o.$str("not")){var t=this.parenthesisCondition(e);return t&&(t.negate=!t.negate),t}},parenthesisCondition:function(e){var t;if(o.save(),o.$str("(")){if(t=function(t){var n;if(o.save(),n=t.condition(e)){if(o.$char(")"))return o.forget(),n;o.restore()}else o.restore()}(this))return o.forget(),t;if(t=this.atomicCondition(e)){if(o.$char(")"))return o.forget(),t;o.restore("expected ')' got '"+o.currentChar()+"'")}else o.restore()}else o.restore()},atomicCondition:function(e){var t,n,i,r,a=this.entities,l=o.i;function u(){return this.addition()||a.keyword()||a.quoted()||a.mixinLookup()}if(t=(u=u.bind(this))())return o.$char(">")?r=o.$char("=")?">=":">":o.$char("<")?r=o.$char("=")?"<=":"<":o.$char("=")&&(r=o.$char(">")?"=>":o.$char("<")?"=<":"="),r?(n=u())?i=new Ie.Condition(r,t,n,l,!1):s("expected expression"):i=new Ie.Condition("=",t,new Ie.Keyword("true"),l,!1),i},operand:function(){var e,t=this.entities;o.peek(/^-[@\$\(]/)&&(e=o.$char("-"));var n=this.sub()||t.dimension()||t.color()||t.variable()||t.property()||t.call()||t.quoted(!0)||t.colorKeyword()||t.mixinLookup();return e&&(n.parensInOp=!0,n=new Ie.Negative(n)),n},expression:function(){var e,t,n=[],i=o.i;do{(e=this.comment())?n.push(e):((e=this.addition()||this.entity())instanceof Ie.Comment&&(e=null),e&&(n.push(e),o.peek(/^\/[\/*]/)||(t=o.$char("/"))&&n.push(new Ie.Anonymous(t,i))))}while(e);if(n.length>0)return new Ie.Expression(n)},property:function(){var e=o.$re(/^(\*?-?[_a-zA-Z0-9-]+)\s*:/);if(e)return e[1]},ruleProperty:function(){var e,t,n=[],r=[];o.save();var s=o.$re(/^([_a-zA-Z0-9-]+)\s*:/);if(s)return n=[new Ie.Keyword(s[1])],o.forget(),n;function a(e){var t=o.i,i=o.$re(e);if(i)return r.push(t),n.push(i[1])}for(a(/^(\*?)/);a(/^((?:[\w-]+)|(?:[@\$]\{[\w-]+\}))/););if(n.length>1&&a(/^((?:\+_|\+)?)\s*:/)){for(o.forget(),""===n[0]&&(n.shift(),r.shift()),t=0;t1?e-1:e)<1?r+(o-r)*e*6:2*e<1?o:3*e<2?r+(o-r)*(2/3-e)*6:r}e=He(e)%360/360,t=ze(He(t)),n=ze(He(n)),i=ze(He(i)),r=2*n-(o=n<=.5?n*(t+1):n+t-n*t);var a=[255*s(e+1/3),255*s(e),255*s(e-1/3)];return i=He(i),new p(a,i,"hsla")}catch(e){}},hsv:function(e,t,n){return je.hsva(e,t,n,1)},hsva:function(e,t,n,i){var r,o;e=He(e)%360/360*360,t=He(t),n=He(n),i=He(i);var s=[n,n*(1-t),n*(1-(o=e/60-(r=Math.floor(e/60%6)))*t),n*(1-(1-o)*t)],a=[[0,3,1],[2,0,1],[1,0,3],[1,2,0],[3,1,0],[0,1,2]];return je.rgba(255*s[a[r][0]],255*s[a[r][1]],255*s[a[r][2]],i)},hue:function(e){return new ee(We(e).h)},saturation:function(e){return new ee(100*We(e).s,"%")},lightness:function(e){return new ee(100*We(e).l,"%")},hsvhue:function(e){return new ee(Je(e).h)},hsvsaturation:function(e){return new ee(100*Je(e).s,"%")},hsvvalue:function(e){return new ee(100*Je(e).v,"%")},red:function(e){return new ee(e.rgb[0])},green:function(e){return new ee(e.rgb[1])},blue:function(e){return new ee(e.rgb[2])},alpha:function(e){return new ee(We(e).a)},luma:function(e){return new ee(e.luma()*e.alpha*100,"%")},luminance:function(e){var t=.2126*e.rgb[0]/255+.7152*e.rgb[1]/255+.0722*e.rgb[2]/255;return new ee(t*e.alpha*100,"%")},saturate:function(e,t,n){if(!e.rgb)return null;var i=We(e);return void 0!==n&&"relative"===n.value?i.s+=i.s*t.value/100:i.s+=t.value/100,i.s=ze(i.s),Ge(e,i)},desaturate:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.s-=i.s*t.value/100:i.s-=t.value/100,i.s=ze(i.s),Ge(e,i)},lighten:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.l+=i.l*t.value/100:i.l+=t.value/100,i.l=ze(i.l),Ge(e,i)},darken:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.l-=i.l*t.value/100:i.l-=t.value/100,i.l=ze(i.l),Ge(e,i)},fadein:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.a+=i.a*t.value/100:i.a+=t.value/100,i.a=ze(i.a),Ge(e,i)},fadeout:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.a-=i.a*t.value/100:i.a-=t.value/100,i.a=ze(i.a),Ge(e,i)},fade:function(e,t){var n=We(e);return n.a=t.value/100,n.a=ze(n.a),Ge(e,n)},spin:function(e,t){var n=We(e),i=(n.h+t.value)%360;return n.h=i<0?360+i:i,Ge(e,n)},mix:function(e,t,n){n||(n=new ee(50));var i=n.value/100,r=2*i-1,o=We(e).a-We(t).a,s=((r*o==-1?r:(r+o)/(1+r*o))+1)/2,a=1-s,l=[e.rgb[0]*s+t.rgb[0]*a,e.rgb[1]*s+t.rgb[1]*a,e.rgb[2]*s+t.rgb[2]*a],u=e.alpha*i+t.alpha*(1-i);return new p(l,u)},greyscale:function(e){return je.desaturate(e,new ee(100))},contrast:function(e,t,n,i){if(!e.rgb)return null;if(void 0===n&&(n=je.rgba(255,255,255,1)),void 0===t&&(t=je.rgba(0,0,0,1)),t.luma()>n.luma()){var r=n;n=t,t=r}return i=void 0===i?.43:He(i),e.luma().5&&(i=1,n=e>.25?Math.sqrt(e):((16*e-12)*e+4)*e),e-(1-2*t)*i*(n-e)},hardlight:function(e,t){return Ze.overlay(t,e)},difference:function(e,t){return Math.abs(e-t)},exclusion:function(e,t){return e+t-2*e*t},average:function(e,t){return(e+t)/2},negation:function(e,t){return 1-Math.abs(e+t-1)}};for(var Xe in Ze)Ze.hasOwnProperty(Xe)&&(Ke[Xe]=Ke.bind(null,Ze[Xe]));var Ye=function(e){return Array.isArray(e.value)?e.value:Array(e)},et={_SELF:function(e){return e},"~":function(){for(var e=[],t=0;ts.value)&&(c[i]=r);else{if(void 0!==l&&a!==l)throw{type:"Argument",message:"incompatible types"};h[a]=c.length,c.push(r)}else Array.isArray(t[n].value)&&Array.prototype.push.apply(t,Array.prototype.slice.call(t[n].value));return 1==c.length?c[0]:(t=c.map((function(e){return e.toCSS(this.context)})).join(this.context.compress?",":", "),new N((e?"min":"max")+"("+t+")"))},ot={min:function(){for(var e=[],t=0;t",r=0;r";return i+="',i=encodeURIComponent(i),new ce(new ue("'"+(i="data:image/svg+xml,"+i)+"'",i,!1,this.index,this.currentFileInfo),this.index,this.currentFileInfo)}}),H.addMultiple(ut),t};function ht(e,t){var n,i=(t=t||{}).variables,r=new j.Eval(t);"object"!=typeof i||Array.isArray(i)||(i=Object.keys(i).map((function(e){var t=i[e];return t instanceof Ie.Value||(t instanceof Ie.Expression||(t=new Ie.Expression([t])),t=new Ie.Value([t])),new Ie.Declaration("@"+e,t,!1,null,0)})),r.frames=[new Ie.Ruleset(null,i)]);var o,s,a=[new De.JoinSelectorVisitor,new De.MarkVisibleSelectorsVisitor(!0),new De.ExtendVisitor,new De.ToCSSVisitor({compress:Boolean(t.compress)})],l=[];if(t.pluginManager){s=t.pluginManager.visitor();for(var u=0;u<2;u++)for(s.first();o=s.get();)o.isPreEvalVisitor?0!==u&&-1!==l.indexOf(o)||(l.push(o),o.run(e)):0!==u&&-1!==a.indexOf(o)||(o.isPreVisitor?a.unshift(o):a.push(o))}n=e.eval(r);for(u=0;u=t);n++);this.preProcessors.splice(n,0,{preProcessor:e,priority:t})},e.prototype.addPostProcessor=function(e,t){var n;for(n=0;n=t);n++);this.postProcessors.splice(n,0,{postProcessor:e,priority:t})},e.prototype.addFileManager=function(e){this.fileManagers.push(e)},e.prototype.getPreProcessors=function(){for(var e=[],t=0;t0){var i=void 0,r=JSON.stringify(this._sourceMapGenerator.toJSON());this.sourceMapURL?i=this.sourceMapURL:this._sourceMapFilename&&(i=this._sourceMapFilename),this.sourceMapURL=i,this.sourceMap=r}return this._css.join("")},t}()}(e=new o(e,t)),e)),a=function(e){return function(){function t(e,t,n){this.less=e,this.rootFilename=n.filename,this.paths=t.paths||[],this.contents={},this.contentsIgnoredChars={},this.mime=t.mime,this.error=null,this.context=t,this.queue=[],this.files={}}return t.prototype.push=function(t,n,i,o,s){var a=this,l=this.context.pluginManager.Loader;this.queue.push(t);var u=function(e,n,i){a.queue.splice(a.queue.indexOf(t),1);var l=i===a.rootFilename;o.optional&&e?(s(null,{rules:[]},!1,null),r.info("The file "+i+" was skipped because it was not found and the import was marked optional.")):(a.files[i]||o.inline||(a.files[i]={root:n,options:o}),e&&!a.error&&(a.error=e),s(e,n,l,i))},c={rewriteUrls:this.context.rewriteUrls,entryPath:i.entryPath,rootpath:i.rootpath,rootFilename:i.rootFilename},h=e.getFileManager(t,i.currentDirectory,this.context,e);if(h){var f,p,v=function(e){var t,n=e.filename,r=e.contents.replace(/^\uFEFF/,"");c.currentDirectory=h.getPath(n),c.rewriteUrls&&(c.rootpath=h.join(a.context.rootpath||"",h.pathDiff(c.currentDirectory,c.entryPath)),!h.isPathAbsolute(c.rootpath)&&h.alwaysMakePathsAbsolute()&&(c.rootpath=h.join(c.entryPath,c.rootpath))),c.filename=n;var s=new j.Parse(a.context);s.processImports=!1,a.contents[n]=r,(i.reference||o.reference)&&(c.reference=!0),o.isPlugin?(t=l.evalPlugin(r,s,a,o.pluginArgs,c))instanceof V?u(t,null,n):u(null,t,n):o.inline?u(null,r,n):!a.files[n]||a.files[n].options.multiple||o.multiple?new Ue(s,a,c).parse(r,(function(e,t){u(e,t,n)})):u(null,a.files[n].root,n)},d=_(this.context);n&&(d.ext=o.isPlugin?".js":".less"),o.isPlugin?(d.mime="application/javascript",d.syncImport?f=l.loadPluginSync(t,i.currentDirectory,d,e,h):p=l.loadPlugin(t,i.currentDirectory,d,e,h)):d.syncImport?f=h.loadFileSync(t,i.currentDirectory,d,e):p=h.loadFile(t,i.currentDirectory,d,e,(function(e,t){e?u(e):v(t)})),f?f.filename?v(f):u(f):p&&p.then(v,u)}else u({message:"Could not find a file-manager for "+t})},t}()}(e);var u,c=function(e,t,n){var i=function(e,n,r){if("function"==typeof n?(r=n,n=M(this.options,{})):n=M(this.options,n||{}),!r){var o=this;return new Promise((function(t,r){i.call(o,e,n,(function(e,n){e?r(e):t(n)}))}))}this.parse(e,n,(function(e,n,i,o){if(e)return r(e);var s;try{s=new t(n,i).toCSS(o)}catch(e){return r(e)}r(null,s)}))};return i}(0,s),h=function(e,t,n){var i=function(e,t,r){if("function"==typeof t?(r=t,t=M(this.options,{})):t=M(this.options,t||{}),!r){var o=this;return new Promise((function(n,r){i.call(o,e,t,(function(e,t){e?r(e):n(t)}))}))}var s,a=void 0,l=new mt(this,!t.reUsePluginManager);if(t.pluginManager=l,s=new j.Parse(t),t.rootFileInfo)a=t.rootFileInfo;else{var u=t.filename||"input",c=u.replace(/[^\/\\]*$/,"");(a={filename:u,rewriteUrls:s.rewriteUrls,rootpath:s.rootpath||"",currentDirectory:c,entryPath:c,rootFilename:u}).rootpath&&"/"!==a.rootpath.slice(-1)&&(a.rootpath+="/")}var h=new n(this,s,a);this.importManager=h,t.plugins&&t.plugins.forEach((function(e){var t,n;if(e.fileContent){if(n=e.fileContent.replace(/^\uFEFF/,""),(t=l.Loader.evalPlugin(n,s,h,e.options,e.filename))instanceof V)return r(t)}else l.addPlugin(e)})),new Ue(s,h,a).parse(e,(function(e,n){if(e)return r(e);r(null,n,h,t)}),t)};return i}(0,0,a),f={version:[4,0,0],data:l,tree:Ie,Environment:o,AbstractFileManager:Ce,AbstractPluginLoader:ke,environment:e,visitors:De,Parser:Ue,functions:ct(e),contexts:j,SourceMapOutput:n,SourceMapBuilder:i,ParseTree:s,ImportManager:a,render:c,parse:h,LessError:V,transformTree:ht,utils:P,PluginManager:mt,logger:r},p=function(e){return function(){var t=Object.create(e.prototype);return e.apply(t,Array.prototype.slice.call(arguments,0)),t}},v=Object.create(f);for(var d in f.tree)if("function"==typeof(u=f.tree[d]))v[d.toLowerCase()]=p(u);else for(var m in v[d]=Object.create(null),u)v[d][m.toLowerCase()]=p(u[m]);return f.parse=f.parse.bind(v),f.render=f.render.bind(v),v}var yt={},bt=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return h(t,e),t.prototype.alwaysMakePathsAbsolute=function(){return!0},t.prototype.join=function(e,t){return e?this.extractUrlParts(t,e).path:t},t.prototype.doXHR=function(e,t,n,i){var r=new XMLHttpRequest,o=!pt.isFileProtocol||pt.fileAsync;function s(t,n,i){t.status>=200&&t.status<300?n(t.responseText,t.getResponseHeader("Last-Modified")):"function"==typeof i&&i(t.status,e)}"function"==typeof r.overrideMimeType&&r.overrideMimeType("text/css"),vt.debug("XHR: Getting '"+e+"'"),r.open("GET",e,o),r.setRequestHeader("Accept",t||"text/x-less, text/css; q=0.9, */*; q=0.5"),r.send(null),pt.isFileProtocol&&!pt.fileAsync?0===r.status||r.status>=200&&r.status<300?n(r.responseText):i(r.status,e):o?r.onreadystatechange=function(){4==r.readyState&&s(r,n,i)}:s(r,n,i)},t.prototype.supports=function(){return!0},t.prototype.clearFileCache=function(){yt={}},t.prototype.loadFile=function(e,t,n,i){t&&!this.isPathAbsolute(e)&&(e=t+e),e=n.ext?this.tryAppendExtension(e,n.ext):e,n=n||{};var r=this.extractUrlParts(e,window.location.href).url,o=this;return new Promise((function(e,t){if(n.useFileCache&&yt[r])try{var i=yt[r];return e({contents:i,filename:r,webInfo:{lastModified:new Date}})}catch(e){return t({filename:r,message:"Error loading file "+r+" error was "+e.message})}o.doXHR(r,n.mime,(function(t,n){yt[r]=t,e({contents:t,filename:r,webInfo:{lastModified:n}})}),(function(e,n){t({type:"File",message:"'"+n+"' wasn't found ("+e+")",href:r})}))}))},t}(Ce),wt=function(e,t){return pt=e,vt=t,bt},xt=function(e){function t(t){var n=e.call(this)||this;return n.less=t,n}return h(t,e),t.prototype.loadPlugin=function(e,t,n,i,r){return new Promise((function(o,s){r.loadFile(e,t,n,i).then(o).catch(s)}))},t}(ke),St=function(t,i,r){return{add:function(o,s){r.errorReporting&&"html"!==r.errorReporting?"console"===r.errorReporting?function(e,t){var n=e.filename||t,o=[],s=(e.type||"Syntax")+"Error: "+(e.message||"There is an error in your .less file")+" in "+n,a=function(e,t,n){void 0!==e.extract[t]&&o.push("{line} {content}".replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,n).replace(/\{content\}/,e.extract[t]))};e.line&&(a(e,0,""),a(e,1,"line"),a(e,2,""),s+=" on line "+e.line+", column "+(e.column+1)+":\n"+o.join("\n")),e.stack&&(e.extract||r.logLevel>=4)&&(s+="\nStack Trace\n"+e.stack),i.logger.error(s)}(o,s):"function"==typeof r.errorReporting&&r.errorReporting("add",o,s):function(i,o){var s,a,l="less-error-message:"+e(o||""),u=t.document.createElement("div"),c=[],h=i.filename||o,f=h.match(/([^\/]+(\?.*)?)$/)[1];u.id=l,u.className="less-error-message",a="

    "+(i.type||"Syntax")+"Error: "+(i.message||"There is an error in your .less file")+'

    in '+f+" ";var p=function(e,t,n){void 0!==e.extract[t]&&c.push('

  • {content}
  • '.replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,n).replace(/\{content\}/,e.extract[t]))};i.line&&(p(i,0,""),p(i,1,"line"),p(i,2,""),a+="on line "+i.line+", column "+(i.column+1)+":

      "+c.join("")+"
    "),i.stack&&(i.extract||r.logLevel>=4)&&(a+="
    Stack Trace
    "+i.stack.split("\n").slice(1).join("
    ")),u.innerHTML=a,n(t.document,[".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #dd6666;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.line {","color: #ff0000;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),u.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),"development"===r.env&&(s=setInterval((function(){var e=t.document,n=e.body;n&&(e.getElementById(l)?n.replaceChild(u,e.getElementById(l)):n.insertBefore(u,n.firstChild),clearInterval(s))}),10))}(o,s)},remove:function(n){r.errorReporting&&"html"!==r.errorReporting?"console"===r.errorReporting||"function"==typeof r.errorReporting&&r.errorReporting("remove",n):function(n){var i=t.document.getElementById("less-error-message:"+e(n));i&&i.parentNode.removeChild(i)}(n)}}},It={javascriptEnabled:!1,depends:!1,compress:!1,lint:!1,paths:[],color:!0,strictImports:!1,insecure:!1,rootpath:"",rewriteUrls:!1,math:1,strictUnits:!1,globalVars:null,modifyVars:null,urlArgs:""};if(window.less)for(var Ct in window.less)window.less.hasOwnProperty(Ct)&&(It[Ct]=window.less[Ct]);!function(e,n){t(n,i(e)),void 0===n.isFileProtocol&&(n.isFileProtocol=/^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(e.location.protocol)),n.async=n.async||!1,n.fileAsync=n.fileAsync||!1,n.poll=n.poll||(n.isFileProtocol?1e3:1500),n.env=n.env||("127.0.0.1"==e.location.hostname||"0.0.0.0"==e.location.hostname||"localhost"==e.location.hostname||e.location.port&&e.location.port.length>0||n.isFileProtocol?"development":"production");var r=/!dumpLineNumbers:(comments|mediaquery|all)/.exec(e.location.hash);r&&(n.dumpLineNumbers=r[1]),void 0===n.useFileCache&&(n.useFileCache=!0),void 0===n.onReady&&(n.onReady=!0),n.relativeUrls&&(n.rewriteUrls="all")}(window,It),It.plugins=It.plugins||[],window.LESS_PLUGINS&&(It.plugins=It.plugins.concat(window.LESS_PLUGINS));var kt,_t,At,Mt=function(e,i){var r=e.document,o=gt();o.options=i;var s=o.environment,a=wt(i,o.logger),l=new a;s.addFileManager(l),o.FileManager=a,o.PluginLoader=xt,function(e,t){t.logLevel=void 0!==t.logLevel?t.logLevel:"development"===t.env?3:1,t.loggers||(t.loggers=[{debug:function(e){t.logLevel>=4&&console.log(e)},info:function(e){t.logLevel>=3&&console.log(e)},warn:function(e){t.logLevel>=2&&console.warn(e)},error:function(e){t.logLevel>=1&&console.error(e)}}]);for(var n=0;n 0 && styleNode.childNodes.length > 0 &&\n oldStyleNode.firstChild.nodeValue === styleNode.firstChild.nodeValue);\n }\n\n const head = document.getElementsByTagName('head')[0];\n\n // If there is no oldStyleNode, just append; otherwise, only append if we need\n // to replace oldStyleNode with an updated stylesheet\n if (oldStyleNode === null || keepOldStyleNode === false) {\n const nextEl = sheet && sheet.nextSibling || null;\n if (nextEl) {\n nextEl.parentNode.insertBefore(styleNode, nextEl);\n } else {\n head.appendChild(styleNode);\n }\n }\n if (oldStyleNode && keepOldStyleNode === false) {\n oldStyleNode.parentNode.removeChild(oldStyleNode);\n }\n\n // For IE.\n // This needs to happen *after* the style element is added to the DOM, otherwise IE 7 and 8 may crash.\n // See http://social.msdn.microsoft.com/Forums/en-US/7e081b65-878a-4c22-8e68-c10d39c2ed32/internet-explorer-crashes-appending-style-element-to-head\n if (styleNode.styleSheet) {\n try {\n styleNode.styleSheet.cssText = styles;\n } catch (e) {\n throw new Error('Couldn\\'t reassign styleSheet.cssText.');\n }\n }\n },\n currentScript: function(window) {\n const document = window.document;\n return document.currentScript || (() => {\n const scripts = document.getElementsByTagName('script');\n return scripts[scripts.length - 1];\n })();\n }\n};\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","export default {\n 'aliceblue':'#f0f8ff',\n 'antiquewhite':'#faebd7',\n 'aqua':'#00ffff',\n 'aquamarine':'#7fffd4',\n 'azure':'#f0ffff',\n 'beige':'#f5f5dc',\n 'bisque':'#ffe4c4',\n 'black':'#000000',\n 'blanchedalmond':'#ffebcd',\n 'blue':'#0000ff',\n 'blueviolet':'#8a2be2',\n 'brown':'#a52a2a',\n 'burlywood':'#deb887',\n 'cadetblue':'#5f9ea0',\n 'chartreuse':'#7fff00',\n 'chocolate':'#d2691e',\n 'coral':'#ff7f50',\n 'cornflowerblue':'#6495ed',\n 'cornsilk':'#fff8dc',\n 'crimson':'#dc143c',\n 'cyan':'#00ffff',\n 'darkblue':'#00008b',\n 'darkcyan':'#008b8b',\n 'darkgoldenrod':'#b8860b',\n 'darkgray':'#a9a9a9',\n 'darkgrey':'#a9a9a9',\n 'darkgreen':'#006400',\n 'darkkhaki':'#bdb76b',\n 'darkmagenta':'#8b008b',\n 'darkolivegreen':'#556b2f',\n 'darkorange':'#ff8c00',\n 'darkorchid':'#9932cc',\n 'darkred':'#8b0000',\n 'darksalmon':'#e9967a',\n 'darkseagreen':'#8fbc8f',\n 'darkslateblue':'#483d8b',\n 'darkslategray':'#2f4f4f',\n 'darkslategrey':'#2f4f4f',\n 'darkturquoise':'#00ced1',\n 'darkviolet':'#9400d3',\n 'deeppink':'#ff1493',\n 'deepskyblue':'#00bfff',\n 'dimgray':'#696969',\n 'dimgrey':'#696969',\n 'dodgerblue':'#1e90ff',\n 'firebrick':'#b22222',\n 'floralwhite':'#fffaf0',\n 'forestgreen':'#228b22',\n 'fuchsia':'#ff00ff',\n 'gainsboro':'#dcdcdc',\n 'ghostwhite':'#f8f8ff',\n 'gold':'#ffd700',\n 'goldenrod':'#daa520',\n 'gray':'#808080',\n 'grey':'#808080',\n 'green':'#008000',\n 'greenyellow':'#adff2f',\n 'honeydew':'#f0fff0',\n 'hotpink':'#ff69b4',\n 'indianred':'#cd5c5c',\n 'indigo':'#4b0082',\n 'ivory':'#fffff0',\n 'khaki':'#f0e68c',\n 'lavender':'#e6e6fa',\n 'lavenderblush':'#fff0f5',\n 'lawngreen':'#7cfc00',\n 'lemonchiffon':'#fffacd',\n 'lightblue':'#add8e6',\n 'lightcoral':'#f08080',\n 'lightcyan':'#e0ffff',\n 'lightgoldenrodyellow':'#fafad2',\n 'lightgray':'#d3d3d3',\n 'lightgrey':'#d3d3d3',\n 'lightgreen':'#90ee90',\n 'lightpink':'#ffb6c1',\n 'lightsalmon':'#ffa07a',\n 'lightseagreen':'#20b2aa',\n 'lightskyblue':'#87cefa',\n 'lightslategray':'#778899',\n 'lightslategrey':'#778899',\n 'lightsteelblue':'#b0c4de',\n 'lightyellow':'#ffffe0',\n 'lime':'#00ff00',\n 'limegreen':'#32cd32',\n 'linen':'#faf0e6',\n 'magenta':'#ff00ff',\n 'maroon':'#800000',\n 'mediumaquamarine':'#66cdaa',\n 'mediumblue':'#0000cd',\n 'mediumorchid':'#ba55d3',\n 'mediumpurple':'#9370d8',\n 'mediumseagreen':'#3cb371',\n 'mediumslateblue':'#7b68ee',\n 'mediumspringgreen':'#00fa9a',\n 'mediumturquoise':'#48d1cc',\n 'mediumvioletred':'#c71585',\n 'midnightblue':'#191970',\n 'mintcream':'#f5fffa',\n 'mistyrose':'#ffe4e1',\n 'moccasin':'#ffe4b5',\n 'navajowhite':'#ffdead',\n 'navy':'#000080',\n 'oldlace':'#fdf5e6',\n 'olive':'#808000',\n 'olivedrab':'#6b8e23',\n 'orange':'#ffa500',\n 'orangered':'#ff4500',\n 'orchid':'#da70d6',\n 'palegoldenrod':'#eee8aa',\n 'palegreen':'#98fb98',\n 'paleturquoise':'#afeeee',\n 'palevioletred':'#d87093',\n 'papayawhip':'#ffefd5',\n 'peachpuff':'#ffdab9',\n 'peru':'#cd853f',\n 'pink':'#ffc0cb',\n 'plum':'#dda0dd',\n 'powderblue':'#b0e0e6',\n 'purple':'#800080',\n 'rebeccapurple':'#663399',\n 'red':'#ff0000',\n 'rosybrown':'#bc8f8f',\n 'royalblue':'#4169e1',\n 'saddlebrown':'#8b4513',\n 'salmon':'#fa8072',\n 'sandybrown':'#f4a460',\n 'seagreen':'#2e8b57',\n 'seashell':'#fff5ee',\n 'sienna':'#a0522d',\n 'silver':'#c0c0c0',\n 'skyblue':'#87ceeb',\n 'slateblue':'#6a5acd',\n 'slategray':'#708090',\n 'slategrey':'#708090',\n 'snow':'#fffafa',\n 'springgreen':'#00ff7f',\n 'steelblue':'#4682b4',\n 'tan':'#d2b48c',\n 'teal':'#008080',\n 'thistle':'#d8bfd8',\n 'tomato':'#ff6347',\n 'turquoise':'#40e0d0',\n 'violet':'#ee82ee',\n 'wheat':'#f5deb3',\n 'white':'#ffffff',\n 'whitesmoke':'#f5f5f5',\n 'yellow':'#ffff00',\n 'yellowgreen':'#9acd32'\n};","export default {\n length: {\n 'm': 1,\n 'cm': 0.01,\n 'mm': 0.001,\n 'in': 0.0254,\n 'px': 0.0254 / 96,\n 'pt': 0.0254 / 72,\n 'pc': 0.0254 / 72 * 12\n },\n duration: {\n 's': 1,\n 'ms': 0.001\n },\n angle: {\n 'rad': 1 / (2 * Math.PI),\n 'deg': 1 / 360,\n 'grad': 1 / 400,\n 'turn': 1\n }\n};","import colors from './colors';\nimport unitConversions from './unit-conversions';\n\nexport default { colors, unitConversions };\n","class Node {\n constructor() {\n this.parent = null;\n this.visibilityBlocks = undefined;\n this.nodeVisible = undefined;\n this.rootNode = null;\n this.parsed = null;\n\n const self = this;\n Object.defineProperty(this, 'currentFileInfo', {\n get: function() { return self.fileInfo(); }\n });\n Object.defineProperty(this, 'index', {\n get: function() { return self.getIndex(); }\n });\n\n }\n\n setParent(nodes, parent) {\n function set(node) {\n if (node && node instanceof Node) {\n node.parent = parent;\n }\n }\n if (Array.isArray(nodes)) {\n nodes.forEach(set);\n }\n else {\n set(nodes);\n }\n }\n\n getIndex() {\n return this._index || (this.parent && this.parent.getIndex()) || 0;\n }\n\n fileInfo() {\n return this._fileInfo || (this.parent && this.parent.fileInfo()) || {};\n }\n\n isRulesetLike() {\n return false;\n }\n\n toCSS(context) {\n const strs = [];\n this.genCSS(context, {\n add: function(chunk, fileInfo, index) {\n strs.push(chunk);\n },\n isEmpty: function () {\n return strs.length === 0;\n }\n });\n return strs.join('');\n }\n\n genCSS(context, output) {\n output.add(this.value);\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n eval() { return this; }\n\n _operate(context, op, a, b) {\n switch (op) {\n case '+': return a + b;\n case '-': return a - b;\n case '*': return a * b;\n case '/': return a / b;\n }\n }\n\n fround(context, value) {\n const precision = context && context.numPrecision;\n // add \"epsilon\" to ensure numbers like 1.000000005 (represented as 1.000000004999...) are properly rounded:\n return (precision) ? Number((value + 2e-16).toFixed(precision)) : value;\n }\n\n // Returns true if this node represents root of ast imported by reference\n blocksVisibility() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n return this.visibilityBlocks !== 0;\n }\n\n addVisibilityBlock() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks + 1;\n }\n\n removeVisibilityBlock() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks - 1;\n }\n\n // Turns on node visibility - if called node will be shown in output regardless\n // of whether it comes from import by reference or not\n ensureVisibility() {\n this.nodeVisible = true;\n }\n\n // Turns off node visibility - if called node will NOT be shown in output regardless\n // of whether it comes from import by reference or not\n ensureInvisibility() {\n this.nodeVisible = false;\n }\n\n // return values:\n // false - the node must not be visible\n // true - the node must be visible\n // undefined or null - the node has the same visibility as its parent\n isVisible() {\n return this.nodeVisible;\n }\n\n visibilityInfo() {\n return {\n visibilityBlocks: this.visibilityBlocks,\n nodeVisible: this.nodeVisible\n };\n }\n\n copyVisibilityInfo(info) {\n if (!info) {\n return;\n }\n this.visibilityBlocks = info.visibilityBlocks;\n this.nodeVisible = info.nodeVisible;\n }\n}\n\nNode.compare = (a, b) => {\n /* returns:\n -1: a < b\n 0: a = b\n 1: a > b\n and *any* other value for a != b (e.g. undefined, NaN, -2 etc.) */\n\n if ((a.compare) &&\n // for \"symmetric results\" force toCSS-based comparison\n // of Quoted or Anonymous if either value is one of those\n !(b.type === 'Quoted' || b.type === 'Anonymous')) {\n return a.compare(b);\n } else if (b.compare) {\n return -b.compare(a);\n } else if (a.type !== b.type) {\n return undefined;\n }\n\n a = a.value;\n b = b.value;\n if (!Array.isArray(a)) {\n return a === b ? 0 : undefined;\n }\n if (a.length !== b.length) {\n return undefined;\n }\n for (let i = 0; i < a.length; i++) {\n if (Node.compare(a[i], b[i]) !== 0) {\n return undefined;\n }\n }\n return 0;\n};\n\nNode.numericCompare = (a, b) => a < b ? -1\n : a === b ? 0\n : a > b ? 1 : undefined;\nexport default Node;\n","import Node from './node';\nimport colors from '../data/colors';\n\n//\n// RGB Colors - #ff0014, #eee\n//\nclass Color extends Node {\n constructor(rgb, a, originalForm) {\n super();\n\n const self = this;\n //\n // The end goal here, is to parse the arguments\n // into an integer triplet, such as `128, 255, 0`\n //\n // This facilitates operations and conversions.\n //\n if (Array.isArray(rgb)) {\n this.rgb = rgb;\n } else if (rgb.length >= 6) {\n this.rgb = [];\n rgb.match(/.{2}/g).map((c, i) => {\n if (i < 3) {\n self.rgb.push(parseInt(c, 16));\n } else {\n self.alpha = (parseInt(c, 16)) / 255;\n }\n });\n } else {\n this.rgb = [];\n rgb.split('').map((c, i) => {\n if (i < 3) {\n self.rgb.push(parseInt(c + c, 16));\n } else {\n self.alpha = (parseInt(c + c, 16)) / 255;\n }\n });\n }\n this.alpha = this.alpha || (typeof a === 'number' ? a : 1);\n if (typeof originalForm !== 'undefined') {\n this.value = originalForm;\n }\n }\n\n luma() {\n let r = this.rgb[0] / 255;\n let g = this.rgb[1] / 255;\n let b = this.rgb[2] / 255;\n\n r = (r <= 0.03928) ? r / 12.92 : Math.pow(((r + 0.055) / 1.055), 2.4);\n g = (g <= 0.03928) ? g / 12.92 : Math.pow(((g + 0.055) / 1.055), 2.4);\n b = (b <= 0.03928) ? b / 12.92 : Math.pow(((b + 0.055) / 1.055), 2.4);\n\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n }\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n }\n\n toCSS(context, doNotCompress) {\n const compress = context && context.compress && !doNotCompress;\n let color;\n let alpha;\n let colorFunction;\n let args = [];\n\n // `value` is set if this color was originally\n // converted from a named color string so we need\n // to respect this and try to output named color too.\n alpha = this.fround(context, this.alpha);\n\n if (this.value) {\n if (this.value.indexOf('rgb') === 0) {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n } else if (this.value.indexOf('hsl') === 0) {\n if (alpha < 1) {\n colorFunction = 'hsla';\n } else {\n colorFunction = 'hsl';\n }\n } else {\n return this.value;\n }\n } else {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n }\n\n switch (colorFunction) {\n case 'rgba':\n args = this.rgb.map(c => clamp(Math.round(c), 255)).concat(clamp(alpha, 1));\n break;\n case 'hsla':\n args.push(clamp(alpha, 1));\n case 'hsl':\n color = this.toHSL();\n args = [\n this.fround(context, color.h),\n `${this.fround(context, color.s * 100)}%`,\n `${this.fround(context, color.l * 100)}%`\n ].concat(args);\n }\n\n if (colorFunction) {\n // Values are capped between `0` and `255`, rounded and zero-padded.\n return `${colorFunction}(${args.join(`,${compress ? '' : ' '}`)})`;\n }\n\n color = this.toRGB();\n\n if (compress) {\n const splitcolor = color.split('');\n\n // Convert color to short format\n if (splitcolor[1] === splitcolor[2] && splitcolor[3] === splitcolor[4] && splitcolor[5] === splitcolor[6]) {\n color = `#${splitcolor[1]}${splitcolor[3]}${splitcolor[5]}`;\n }\n }\n\n return color;\n }\n\n //\n // Operations have to be done per-channel, if not,\n // channels will spill onto each other. Once we have\n // our result, in the form of an integer triplet,\n // we create a new Color node to hold the result.\n //\n operate(context, op, other) {\n const rgb = new Array(3);\n const alpha = this.alpha * (1 - other.alpha) + other.alpha;\n for (let c = 0; c < 3; c++) {\n rgb[c] = this._operate(context, op, this.rgb[c], other.rgb[c]);\n }\n return new Color(rgb, alpha);\n }\n\n toRGB() {\n return toHex(this.rgb);\n }\n\n toHSL() {\n const r = this.rgb[0] / 255;\n const g = this.rgb[1] / 255;\n const b = this.rgb[2] / 255;\n const a = this.alpha;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n let h;\n let s;\n const l = (max + min) / 2;\n const d = max - min;\n\n if (max === min) {\n h = s = 0;\n } else {\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, l, a };\n }\n\n // Adapted from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript\n toHSV() {\n const r = this.rgb[0] / 255;\n const g = this.rgb[1] / 255;\n const b = this.rgb[2] / 255;\n const a = this.alpha;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n let h;\n let s;\n const v = max;\n\n const d = max - min;\n if (max === 0) {\n s = 0;\n } else {\n s = d / max;\n }\n\n if (max === min) {\n h = 0;\n } else {\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, v, a };\n }\n\n toARGB() {\n return toHex([this.alpha * 255].concat(this.rgb));\n }\n\n compare(x) {\n return (x.rgb &&\n x.rgb[0] === this.rgb[0] &&\n x.rgb[1] === this.rgb[1] &&\n x.rgb[2] === this.rgb[2] &&\n x.alpha === this.alpha) ? 0 : undefined;\n }\n}\n\nColor.prototype.type = 'Color';\n\nfunction clamp(v, max) {\n return Math.min(Math.max(v, 0), max);\n}\n\nfunction toHex(v) {\n return `#${v.map(c => {\n c = clamp(Math.round(c), 255);\n return (c < 16 ? '0' : '') + c.toString(16);\n }).join('')}`;\n}\n\nColor.fromKeyword = keyword => {\n let c;\n const key = keyword.toLowerCase();\n if (colors.hasOwnProperty(key)) {\n c = new Color(colors[key].slice(1));\n }\n else if (key === 'transparent') {\n c = new Color([0, 0, 0], 0);\n }\n\n if (c) {\n c.value = keyword;\n return c;\n }\n};\nexport default Color;\n","import Node from './node';\n\nclass Paren extends Node {\n constructor(node) {\n super();\n\n this.value = node;\n }\n\n genCSS(context, output) {\n output.add('(');\n this.value.genCSS(context, output);\n output.add(')');\n }\n\n eval(context) {\n return new Paren(this.value.eval(context));\n }\n}\n\nParen.prototype.type = 'Paren';\nexport default Paren;\n","import Node from './node';\nconst _noSpaceCombinators = {\n '': true,\n ' ': true,\n '|': true\n};\n\nclass Combinator extends Node {\n constructor(value) {\n super();\n\n if (value === ' ') {\n this.value = ' ';\n this.emptyOrWhitespace = true;\n } else {\n this.value = value ? value.trim() : '';\n this.emptyOrWhitespace = this.value === '';\n }\n }\n\n genCSS(context, output) {\n const spaceOrEmpty = (context.compress || _noSpaceCombinators[this.value]) ? '' : ' ';\n output.add(spaceOrEmpty + this.value + spaceOrEmpty);\n }\n}\n\nCombinator.prototype.type = 'Combinator';\n\nexport default Combinator;\n","import Node from './node';\nimport Paren from './paren';\nimport Combinator from './combinator';\n\nclass Element extends Node {\n constructor(combinator, value, isVariable, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.combinator = combinator instanceof Combinator ?\n combinator : new Combinator(combinator);\n\n if (typeof value === 'string') {\n this.value = value.trim();\n } else if (value) {\n this.value = value;\n } else {\n this.value = '';\n }\n this.isVariable = isVariable;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.combinator, this);\n }\n\n accept(visitor) {\n const value = this.value;\n this.combinator = visitor.visit(this.combinator);\n if (typeof value === 'object') {\n this.value = visitor.visit(value);\n }\n }\n\n eval(context) {\n return new Element(this.combinator,\n this.value.eval ? this.value.eval(context) : this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n }\n\n clone() {\n return new Element(this.combinator,\n this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n }\n\n genCSS(context, output) {\n output.add(this.toCSS(context), this.fileInfo(), this.getIndex());\n }\n\n toCSS(context = {}) {\n let value = this.value;\n const firstSelector = context.firstSelector;\n if (value instanceof Paren) {\n // selector in parens should not be affected by outer selector\n // flags (breaks only interpolated selectors - see #1973)\n context.firstSelector = true;\n }\n value = value.toCSS ? value.toCSS(context) : value;\n context.firstSelector = firstSelector;\n if (value === '' && this.combinator.value.charAt(0) === '&') {\n return '';\n } else {\n return this.combinator.toCSS(context) + value;\n }\n }\n}\n\nElement.prototype.type = 'Element';\nexport default Element;\n","\nexport const Math = {\n ALWAYS: 0,\n PARENS_DIVISION: 1,\n PARENS: 2,\n STRICT_LEGACY: 3\n};\n\nexport const RewriteUrls = {\n OFF: 0,\n LOCAL: 1,\n ALL: 2\n};","/* jshint proto: true */\nimport * as Constants from './constants';\n\nexport function getLocation(index, inputStream) {\n let n = index + 1;\n let line = null;\n let column = -1;\n\n while (--n >= 0 && inputStream.charAt(n) !== '\\n') {\n column++;\n }\n\n if (typeof index === 'number') {\n line = (inputStream.slice(0, index).match(/\\n/g) || '').length;\n }\n\n return {\n line,\n column\n };\n}\n\nexport function copyArray(arr) {\n let i;\n const length = arr.length;\n const copy = new Array(length);\n\n for (i = 0; i < length; i++) {\n copy[i] = arr[i];\n }\n return copy;\n}\n\nexport function clone(obj) {\n const cloned = {};\n for (const prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n cloned[prop] = obj[prop];\n }\n }\n return cloned;\n}\n\nexport function defaults(obj1, obj2) {\n let newObj = obj2 || {};\n if (!obj2._defaults) {\n newObj = {};\n const defaults = {...obj1};\n newObj._defaults = defaults;\n const cloned = obj2 ? {...obj2} : {};\n Object.assign(newObj, defaults, cloned);\n }\n return newObj;\n}\n\nexport function copyOptions(obj1, obj2) {\n if (obj2 && obj2._defaults) {\n return obj2;\n }\n const opts = defaults(obj1, obj2);\n if (opts.strictMath) {\n opts.math = Constants.Math.STRICT_LEGACY;\n }\n // Back compat with changed relativeUrls option\n if (opts.relativeUrls) {\n opts.rewriteUrls = Constants.RewriteUrls.ALL;\n }\n if (typeof opts.math === 'string') {\n switch (opts.math.toLowerCase()) {\n case 'always':\n opts.math = Constants.Math.ALWAYS;\n break;\n case 'parens-division':\n opts.math = Constants.Math.PARENS_DIVISION;\n break;\n case 'strict':\n case 'parens':\n opts.math = Constants.Math.PARENS;\n break;\n case 'strict-legacy':\n opts.math = Constants.Math.STRICT_LEGACY;\n }\n }\n if (typeof opts.rewriteUrls === 'string') {\n switch (opts.rewriteUrls.toLowerCase()) {\n case 'off':\n opts.rewriteUrls = Constants.RewriteUrls.OFF;\n break;\n case 'local':\n opts.rewriteUrls = Constants.RewriteUrls.LOCAL;\n break;\n case 'all':\n opts.rewriteUrls = Constants.RewriteUrls.ALL;\n break;\n }\n }\n return opts;\n}\n\nexport function merge(obj1, obj2) {\n for (const prop in obj2) {\n if (obj2.hasOwnProperty(prop)) {\n obj1[prop] = obj2[prop];\n }\n }\n return obj1;\n}\n\nexport function flattenArray(arr, result = []) {\n for (let i = 0, length = arr.length; i < length; i++) {\n const value = arr[i];\n if (Array.isArray(value)) {\n flattenArray(value, result);\n } else {\n if (value !== undefined) {\n result.push(value);\n }\n }\n }\n return result;\n}","import * as utils from './utils';\n\nconst anonymousFunc = /(|Function):(\\d+):(\\d+)/;\n\n/**\n * This is a centralized class of any error that could be thrown internally (mostly by the parser).\n * Besides standard .message it keeps some additional data like a path to the file where the error\n * occurred along with line and column numbers.\n *\n * @class\n * @extends Error\n * @type {module.LessError}\n *\n * @prop {string} type\n * @prop {string} filename\n * @prop {number} index\n * @prop {number} line\n * @prop {number} column\n * @prop {number} callLine\n * @prop {number} callExtract\n * @prop {string[]} extract\n *\n * @param {Object} e - An error object to wrap around or just a descriptive object\n * @param {Object} fileContentMap - An object with file contents in 'contents' property (like importManager) @todo - move to fileManager?\n * @param {string} [currentFilename]\n */\nconst LessError = function LessError(e, fileContentMap, currentFilename) {\n Error.call(this);\n\n const filename = e.filename || currentFilename;\n\n this.message = e.message;\n this.stack = e.stack;\n\n if (fileContentMap && filename) {\n const input = fileContentMap.contents[filename];\n const loc = utils.getLocation(e.index, input);\n const line = loc.line;\n const col = loc.column;\n const callLine = e.call && utils.getLocation(e.call, input).line;\n const lines = input ? input.split('\\n') : '';\n\n this.type = e.type || 'Syntax';\n this.filename = filename;\n this.index = e.index;\n this.line = typeof line === 'number' ? line + 1 : null;\n this.column = col;\n\n if (!this.line && this.stack) {\n const found = this.stack.match(anonymousFunc);\n\n /**\n * We have to figure out how this environment stringifies anonymous functions\n * so we can correctly map plugin errors.\n * \n * Note, in Node 8, the output of anonymous funcs varied based on parameters\n * being present or not, so we inject dummy params.\n */\n const func = new Function('a', 'throw new Error()');\n let lineAdjust = 0;\n try {\n func();\n } catch (e) {\n const match = e.stack.match(anonymousFunc);\n const line = parseInt(match[2]);\n lineAdjust = 1 - line;\n }\n\n if (found) {\n if (found[2]) {\n this.line = parseInt(found[2]) + lineAdjust;\n }\n if (found[3]) {\n this.column = parseInt(found[3]);\n }\n }\n }\n\n this.callLine = callLine + 1;\n this.callExtract = lines[callLine];\n\n this.extract = [\n lines[this.line - 2],\n lines[this.line - 1],\n lines[this.line]\n ];\n }\n\n};\n\nif (typeof Object.create === 'undefined') {\n const F = () => {};\n F.prototype = Error.prototype;\n LessError.prototype = new F();\n} else {\n LessError.prototype = Object.create(Error.prototype);\n}\n\nLessError.prototype.constructor = LessError;\n\n/**\n * An overridden version of the default Object.prototype.toString\n * which uses additional information to create a helpful message.\n *\n * @param {Object} options\n * @returns {string}\n */\nLessError.prototype.toString = function(options = {}) {\n let message = '';\n const extract = this.extract || [];\n let error = [];\n let stylize = str => str;\n if (options.stylize) {\n const type = typeof options.stylize;\n if (type !== 'function') {\n throw Error(`options.stylize should be a function, got a ${type}!`);\n }\n stylize = options.stylize;\n }\n\n if (this.line !== null) {\n if (typeof extract[0] === 'string') {\n error.push(stylize(`${this.line - 1} ${extract[0]}`, 'grey'));\n }\n\n if (typeof extract[1] === 'string') {\n let errorTxt = `${this.line} `;\n if (extract[1]) {\n errorTxt += extract[1].slice(0, this.column) +\n stylize(stylize(stylize(extract[1].substr(this.column, 1), 'bold') +\n extract[1].slice(this.column + 1), 'red'), 'inverse');\n }\n error.push(errorTxt);\n }\n\n if (typeof extract[2] === 'string') {\n error.push(stylize(`${this.line + 1} ${extract[2]}`, 'grey'));\n }\n error = `${error.join('\\n') + stylize('', 'reset')}\\n`;\n }\n\n message += stylize(`${this.type}Error: ${this.message}`, 'red');\n if (this.filename) {\n message += stylize(' in ', 'red') + this.filename;\n }\n if (this.line) {\n message += stylize(` on line ${this.line}, column ${this.column + 1}:`, 'grey');\n }\n\n message += `\\n${error}`;\n\n if (this.callLine) {\n message += `${stylize('from ', 'red') + (this.filename || '')}/n`;\n message += `${stylize(this.callLine, 'grey')} ${this.callExtract}/n`;\n }\n\n return message;\n};\n\nexport default LessError;","import Node from './node';\nimport Element from './element';\nimport LessError from '../less-error';\n\nclass Selector extends Node {\n constructor(elements, extendList, condition, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.extendList = extendList;\n this.condition = condition;\n this.evaldCondition = !condition;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.elements = this.getElements(elements);\n this.mixinElements_ = undefined;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.elements, this);\n }\n\n accept(visitor) {\n if (this.elements) {\n this.elements = visitor.visitArray(this.elements);\n }\n if (this.extendList) {\n this.extendList = visitor.visitArray(this.extendList);\n }\n if (this.condition) {\n this.condition = visitor.visit(this.condition);\n }\n }\n\n createDerived(elements, extendList, evaldCondition) {\n elements = this.getElements(elements);\n const newSelector = new Selector(elements, extendList || this.extendList,\n null, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n newSelector.evaldCondition = (evaldCondition != null) ? evaldCondition : this.evaldCondition;\n newSelector.mediaEmpty = this.mediaEmpty;\n return newSelector;\n }\n\n getElements(els) {\n if (!els) {\n return [new Element('', '&', false, this._index, this._fileInfo)];\n }\n if (typeof els === 'string') {\n this.parse.parseNode(\n els, \n ['selector'],\n this._index, \n this._fileInfo, \n function(err, result) {\n if (err) {\n throw new LessError({\n index: err.index,\n message: err.message\n }, this.parse.imports, this._fileInfo.filename);\n }\n els = result[0].elements;\n });\n }\n return els;\n }\n\n createEmptySelectors() {\n const el = new Element('', '&', false, this._index, this._fileInfo);\n const sels = [new Selector([el], null, null, this._index, this._fileInfo)];\n sels[0].mediaEmpty = true;\n return sels;\n }\n\n match(other) {\n const elements = this.elements;\n const len = elements.length;\n let olen;\n let i;\n\n other = other.mixinElements();\n olen = other.length;\n if (olen === 0 || len < olen) {\n return 0;\n } else {\n for (i = 0; i < olen; i++) {\n if (elements[i].value !== other[i]) {\n return 0;\n }\n }\n }\n\n return olen; // return number of matched elements\n }\n\n mixinElements() {\n if (this.mixinElements_) {\n return this.mixinElements_;\n }\n\n let elements = this.elements.map( v => v.combinator.value + (v.value.value || v.value)).join('').match(/[,&#\\*\\.\\w-]([\\w-]|(\\\\.))*/g);\n\n if (elements) {\n if (elements[0] === '&') {\n elements.shift();\n }\n } else {\n elements = [];\n }\n\n return (this.mixinElements_ = elements);\n }\n\n isJustParentSelector() {\n return !this.mediaEmpty &&\n this.elements.length === 1 &&\n this.elements[0].value === '&' &&\n (this.elements[0].combinator.value === ' ' || this.elements[0].combinator.value === '');\n }\n\n eval(context) {\n const evaldCondition = this.condition && this.condition.eval(context);\n let elements = this.elements;\n let extendList = this.extendList;\n\n elements = elements && elements.map(e => e.eval(context));\n extendList = extendList && extendList.map(extend => extend.eval(context));\n\n return this.createDerived(elements, extendList, evaldCondition);\n }\n\n genCSS(context, output) {\n let i;\n let element;\n if ((!context || !context.firstSelector) && this.elements[0].combinator.value === '') {\n output.add(' ', this.fileInfo(), this.getIndex());\n }\n for (i = 0; i < this.elements.length; i++) {\n element = this.elements[i];\n element.genCSS(context, output);\n }\n }\n\n getIsOutput() {\n return this.evaldCondition;\n }\n}\n\nSelector.prototype.type = 'Selector';\nexport default Selector;\n","import Node from './node';\n\nclass Value extends Node {\n constructor(value) {\n super();\n\n if (!value) {\n throw new Error('Value requires an array argument');\n }\n if (!Array.isArray(value)) {\n this.value = [ value ];\n }\n else {\n this.value = value;\n }\n }\n\n accept(visitor) {\n if (this.value) {\n this.value = visitor.visitArray(this.value);\n }\n }\n\n eval(context) {\n if (this.value.length === 1) {\n return this.value[0].eval(context);\n } else {\n return new Value(this.value.map(v => v.eval(context)));\n }\n }\n\n genCSS(context, output) {\n let i;\n for (i = 0; i < this.value.length; i++) {\n this.value[i].genCSS(context, output);\n if (i + 1 < this.value.length) {\n output.add((context && context.compress) ? ',' : ', ');\n }\n }\n }\n}\n\nValue.prototype.type = 'Value';\nexport default Value;\n","import Node from './node';\n\nclass Keyword extends Node {\n constructor(value) {\n super();\n\n this.value = value;\n }\n\n genCSS(context, output) {\n if (this.value === '%') { throw { type: 'Syntax', message: 'Invalid % without number' }; }\n output.add(this.value);\n }\n}\n\nKeyword.prototype.type = 'Keyword';\n\nKeyword.True = new Keyword('true');\nKeyword.False = new Keyword('false');\n\nexport default Keyword;\n","import Node from './node';\n\nclass Anonymous extends Node {\n constructor(value, index, currentFileInfo, mapLines, rulesetLike, visibilityInfo) {\n super();\n\n this.value = value;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.mapLines = mapLines;\n this.rulesetLike = (typeof rulesetLike === 'undefined') ? false : rulesetLike;\n this.allowRoot = true;\n this.copyVisibilityInfo(visibilityInfo);\n }\n\n eval() {\n return new Anonymous(this.value, this._index, this._fileInfo, this.mapLines, this.rulesetLike, this.visibilityInfo());\n }\n\n compare(other) {\n return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n }\n\n isRulesetLike() {\n return this.rulesetLike;\n }\n\n genCSS(context, output) {\n this.nodeVisible = Boolean(this.value);\n if (this.nodeVisible) {\n output.add(this.value, this._fileInfo, this._index, this.mapLines);\n }\n }\n}\n\nAnonymous.prototype.type = 'Anonymous';\nexport default Anonymous;\n","import Node from './node';\nimport Value from './value';\nimport Keyword from './keyword';\nimport Anonymous from './anonymous';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\n\nclass Declaration extends Node {\n constructor(name, value, important, merge, index, currentFileInfo, inline, variable) {\n super();\n\n this.name = name;\n this.value = (value instanceof Node) ? value : new Value([value ? new Anonymous(value) : null]);\n this.important = important ? ` ${important.trim()}` : '';\n this.merge = merge;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.inline = inline || false;\n this.variable = (variable !== undefined) ? variable\n : (name.charAt && (name.charAt(0) === '@'));\n this.allowRoot = true;\n this.setParent(this.value, this);\n }\n\n genCSS(context, output) {\n output.add(this.name + (context.compress ? ':' : ': '), this.fileInfo(), this.getIndex());\n try {\n this.value.genCSS(context, output);\n }\n catch (e) {\n e.index = this._index;\n e.filename = this._fileInfo.filename;\n throw e;\n }\n output.add(this.important + ((this.inline || (context.lastRule && context.compress)) ? '' : ';'), this._fileInfo, this._index);\n }\n\n eval(context) {\n let mathBypass = false;\n let prevMath;\n let name = this.name;\n let evaldValue;\n let variable = this.variable;\n if (typeof name !== 'string') {\n // expand 'primitive' name directly to get\n // things faster (~10% for benchmark.less):\n name = (name.length === 1) && (name[0] instanceof Keyword) ?\n name[0].value : evalName(context, name);\n variable = false; // never treat expanded interpolation as new variable name\n }\n\n // @todo remove when parens-division is default\n if (name === 'font' && context.math === MATH.ALWAYS) {\n mathBypass = true;\n prevMath = context.math;\n context.math = MATH.PARENS_DIVISION;\n }\n try {\n context.importantScope.push({});\n evaldValue = this.value.eval(context);\n\n if (!this.variable && evaldValue.type === 'DetachedRuleset') {\n throw { message: 'Rulesets cannot be evaluated on a property.',\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n let important = this.important;\n const importantResult = context.importantScope.pop();\n if (!important && importantResult.important) {\n important = importantResult.important;\n }\n\n return new Declaration(name,\n evaldValue,\n important,\n this.merge,\n this.getIndex(), this.fileInfo(), this.inline,\n variable);\n }\n catch (e) {\n if (typeof e.index !== 'number') {\n e.index = this.getIndex();\n e.filename = this.fileInfo().filename;\n }\n throw e;\n }\n finally {\n if (mathBypass) {\n context.math = prevMath;\n }\n }\n }\n\n makeImportant() {\n return new Declaration(this.name,\n this.value,\n '!important',\n this.merge,\n this.getIndex(), this.fileInfo(), this.inline);\n }\n}\n\nfunction evalName(context, name) {\n let value = '';\n let i;\n const n = name.length;\n const output = {add: function (s) {value += s;}};\n for (i = 0; i < n; i++) {\n name[i].eval(context).genCSS(context, output);\n }\n return value;\n}\n\nDeclaration.prototype.type = 'Declaration';\nexport default Declaration;","const debugInfo = (context, ctx, lineSeparator) => {\n let result = '';\n if (context.dumpLineNumbers && !context.compress) {\n switch (context.dumpLineNumbers) {\n case 'comments':\n result = debugInfo.asComment(ctx);\n break;\n case 'mediaquery':\n result = debugInfo.asMediaQuery(ctx);\n break;\n case 'all':\n result = debugInfo.asComment(ctx) + (lineSeparator || '') + debugInfo.asMediaQuery(ctx);\n break;\n }\n }\n return result;\n};\n\ndebugInfo.asComment = ctx => ctx.debugInfo ? `/* line ${ctx.debugInfo.lineNumber}, ${ctx.debugInfo.fileName} */\\n` : '';\n\ndebugInfo.asMediaQuery = ctx => {\n if (!ctx.debugInfo) { return ''; }\n let filenameWithProtocol = ctx.debugInfo.fileName;\n if (!/^[a-z]+:\\/\\//i.test(filenameWithProtocol)) {\n filenameWithProtocol = `file://${filenameWithProtocol}`;\n }\n return `@media -sass-debug-info{filename{font-family:${filenameWithProtocol.replace(/([.:\\/\\\\])/g, a => {\n if (a == '\\\\') {\n a = '\\/';\n }\n return `\\\\${a}`;\n })}}line{font-family:\\\\00003${ctx.debugInfo.lineNumber}}}\\n`;\n};\n\nexport default debugInfo;\n","import Node from './node';\nimport getDebugInfo from './debug-info';\n\nclass Comment extends Node {\n constructor(value, isLineComment, index, currentFileInfo) {\n super();\n\n this.value = value;\n this.isLineComment = isLineComment;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.allowRoot = true;\n }\n\n genCSS(context, output) {\n if (this.debugInfo) {\n output.add(getDebugInfo(context, this), this.fileInfo(), this.getIndex());\n }\n output.add(this.value);\n }\n\n isSilent(context) {\n const isCompressed = context.compress && this.value[2] !== '!';\n return this.isLineComment || isCompressed;\n }\n}\n\nComment.prototype.type = 'Comment';\nexport default Comment;\n","const contexts = {};\nexport default contexts;\nimport * as Constants from './constants';\n\nconst copyFromOriginal = function copyFromOriginal(original, destination, propertiesToCopy) {\n if (!original) { return; }\n\n for (let i = 0; i < propertiesToCopy.length; i++) {\n if (original.hasOwnProperty(propertiesToCopy[i])) {\n destination[propertiesToCopy[i]] = original[propertiesToCopy[i]];\n }\n }\n};\n\n/*\n parse is used whilst parsing\n */\nconst parseCopyProperties = [\n // options\n 'paths', // option - unmodified - paths to search for imports on\n 'rewriteUrls', // option - whether to adjust URL's to be relative\n 'rootpath', // option - rootpath to append to URL's\n 'strictImports', // option -\n 'insecure', // option - whether to allow imports from insecure ssl hosts\n 'dumpLineNumbers', // option - whether to dump line numbers\n 'compress', // option - whether to compress\n 'syncImport', // option - whether to import synchronously\n 'chunkInput', // option - whether to chunk input. more performant but causes parse issues.\n 'mime', // browser only - mime type for sheet import\n 'useFileCache', // browser only - whether to use the per file session cache\n // context\n 'processImports', // option & context - whether to process imports. if false then imports will not be imported.\n // Used by the import manager to stop multiple import visitors being created.\n 'pluginManager' // Used as the plugin manager for the session\n];\n\ncontexts.Parse = function(options) {\n copyFromOriginal(options, this, parseCopyProperties);\n\n if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n};\n\nconst evalCopyProperties = [\n 'paths', // additional include paths\n 'compress', // whether to compress\n 'math', // whether math has to be within parenthesis\n 'strictUnits', // whether units need to evaluate correctly\n 'sourceMap', // whether to output a source map\n 'importMultiple', // whether we are currently importing multiple copies\n 'urlArgs', // whether to add args into url tokens\n 'javascriptEnabled', // option - whether Inline JavaScript is enabled. if undefined, defaults to false\n 'pluginManager', // Used as the plugin manager for the session\n 'importantScope', // used to bubble up !important statements\n 'rewriteUrls' // option - whether to adjust URL's to be relative\n];\n\nfunction isPathRelative(path) {\n return !/^(?:[a-z-]+:|\\/|#)/i.test(path);\n}\n\nfunction isPathLocalRelative(path) {\n return path.charAt(0) === '.';\n}\n\ncontexts.Eval = class {\n constructor(options, frames) {\n copyFromOriginal(options, this, evalCopyProperties);\n\n if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n\n this.frames = frames || [];\n this.importantScope = this.importantScope || [];\n this.inCalc = false;\n this.mathOn = true;\n }\n\n enterCalc() {\n if (!this.calcStack) {\n this.calcStack = [];\n }\n this.calcStack.push(true);\n this.inCalc = true;\n }\n\n exitCalc() {\n this.calcStack.pop();\n if (!this.calcStack.length) {\n this.inCalc = false;\n }\n }\n\n inParenthesis() {\n if (!this.parensStack) {\n this.parensStack = [];\n }\n this.parensStack.push(true);\n };\n\n outOfParenthesis() {\n this.parensStack.pop();\n };\n\n isMathOn(op) {\n if (!this.mathOn) {\n return false;\n }\n if (op === '/' && this.math !== Constants.Math.ALWAYS && (!this.parensStack || !this.parensStack.length)) {\n return false;\n }\n if (this.math > Constants.Math.PARENS_DIVISION) {\n return this.parensStack && this.parensStack.length;\n }\n return true;\n }\n\n pathRequiresRewrite(path) {\n const isRelative = this.rewriteUrls === Constants.RewriteUrls.LOCAL ? isPathLocalRelative : isPathRelative;\n\n return isRelative(path);\n }\n\n rewritePath(path, rootpath) {\n let newPath;\n\n rootpath = rootpath || '';\n newPath = this.normalizePath(rootpath + path);\n\n // If a path was explicit relative and the rootpath was not an absolute path\n // we must ensure that the new path is also explicit relative.\n if (isPathLocalRelative(path) &&\n isPathRelative(rootpath) &&\n isPathLocalRelative(newPath) === false) {\n newPath = `./${newPath}`;\n }\n\n return newPath;\n }\n\n normalizePath(path) {\n const segments = path.split('/').reverse();\n let segment;\n\n path = [];\n while (segments.length !== 0) {\n segment = segments.pop();\n switch ( segment ) {\n case '.':\n break;\n case '..':\n if ((path.length === 0) || (path[path.length - 1] === '..')) {\n path.push( segment );\n } else {\n path.pop();\n }\n break;\n default:\n path.push(segment);\n break;\n }\n }\n\n return path.join('/');\n }\n}\n","function makeRegistry( base ) {\n return {\n _data: {},\n add: function(name, func) {\n // precautionary case conversion, as later querying of\n // the registry by function-caller uses lower case as well.\n name = name.toLowerCase();\n\n if (this._data.hasOwnProperty(name)) {\n // TODO warn\n }\n this._data[name] = func;\n },\n addMultiple: function(functions) {\n Object.keys(functions).forEach(\n name => {\n this.add(name, functions[name]);\n });\n },\n get: function(name) {\n return this._data[name] || ( base && base.get( name ));\n },\n getLocalFunctions: function() {\n return this._data;\n },\n inherit: function() {\n return makeRegistry( this );\n },\n create: function(base) {\n return makeRegistry(base);\n }\n };\n}\n\nexport default makeRegistry( null );","import Keyword from '../tree/keyword';\n\nconst defaultFunc = {\n eval: function () {\n const v = this.value_;\n const e = this.error_;\n if (e) {\n throw e;\n }\n if (v != null) {\n return v ? Keyword.True : Keyword.False;\n }\n },\n value: function (v) {\n this.value_ = v;\n },\n error: function (e) {\n this.error_ = e;\n },\n reset: function () {\n this.value_ = this.error_ = null;\n }\n};\n\nexport default defaultFunc;\n","import Node from './node';\nimport Declaration from './declaration';\nimport Keyword from './keyword';\nimport Comment from './comment';\nimport Paren from './paren';\nimport Selector from './selector';\nimport Element from './element';\nimport Anonymous from './anonymous';\nimport contexts from '../contexts';\nimport globalFunctionRegistry from '../functions/function-registry';\nimport defaultFunc from '../functions/default';\nimport getDebugInfo from './debug-info';\nimport * as utils from '../utils';\n\nclass Ruleset extends Node {\n constructor(selectors, rules, strictImports, visibilityInfo) {\n super();\n\n this.selectors = selectors;\n this.rules = rules;\n this._lookups = {};\n this._variables = null;\n this._properties = null;\n this.strictImports = strictImports;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n\n this.setParent(this.selectors, this);\n this.setParent(this.rules, this);\n\n }\n\n isRulesetLike() {\n return true;\n }\n\n accept(visitor) {\n if (this.paths) {\n this.paths = visitor.visitArray(this.paths, true);\n } else if (this.selectors) {\n this.selectors = visitor.visitArray(this.selectors);\n }\n if (this.rules && this.rules.length) {\n this.rules = visitor.visitArray(this.rules);\n }\n }\n\n eval(context) {\n const that = this;\n let selectors;\n let selCnt;\n let selector;\n let i;\n let hasVariable;\n let hasOnePassingSelector = false;\n\n if (this.selectors && (selCnt = this.selectors.length)) {\n selectors = new Array(selCnt);\n defaultFunc.error({\n type: 'Syntax',\n message: 'it is currently only allowed in parametric mixin guards,'\n });\n\n for (i = 0; i < selCnt; i++) {\n selector = this.selectors[i].eval(context);\n for (var j = 0; j < selector.elements.length; j++) {\n if (selector.elements[j].isVariable) {\n hasVariable = true;\n break;\n }\n }\n selectors[i] = selector;\n if (selector.evaldCondition) {\n hasOnePassingSelector = true;\n }\n }\n\n if (hasVariable) {\n const toParseSelectors = new Array(selCnt);\n for (i = 0; i < selCnt; i++) {\n selector = selectors[i];\n toParseSelectors[i] = selector.toCSS(context);\n }\n this.parse.parseNode(\n toParseSelectors.join(','),\n [\"selectors\"], \n selectors[0].getIndex(), \n selectors[0].fileInfo(), \n (err, result) => {\n if (result) {\n selectors = utils.flattenArray(result);\n }\n });\n }\n\n defaultFunc.reset();\n } else {\n hasOnePassingSelector = true;\n }\n\n let rules = this.rules ? utils.copyArray(this.rules) : null;\n const ruleset = new Ruleset(selectors, rules, this.strictImports, this.visibilityInfo());\n let rule;\n let subRule;\n\n ruleset.originalRuleset = this;\n ruleset.root = this.root;\n ruleset.firstRoot = this.firstRoot;\n ruleset.allowImports = this.allowImports;\n\n if (this.debugInfo) {\n ruleset.debugInfo = this.debugInfo;\n }\n\n if (!hasOnePassingSelector) {\n rules.length = 0;\n }\n\n // inherit a function registry from the frames stack when possible;\n // otherwise from the global registry\n ruleset.functionRegistry = (frames => {\n let i = 0;\n const n = frames.length;\n let found;\n for ( ; i !== n ; ++i ) {\n found = frames[ i ].functionRegistry;\n if ( found ) { return found; }\n }\n return globalFunctionRegistry;\n })(context.frames).inherit();\n\n // push the current ruleset to the frames stack\n const ctxFrames = context.frames;\n ctxFrames.unshift(ruleset);\n\n // currrent selectors\n let ctxSelectors = context.selectors;\n if (!ctxSelectors) {\n context.selectors = ctxSelectors = [];\n }\n ctxSelectors.unshift(this.selectors);\n\n // Evaluate imports\n if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) {\n ruleset.evalImports(context);\n }\n\n // Store the frames around mixin definitions,\n // so they can be evaluated like closures when the time comes.\n const rsRules = ruleset.rules;\n for (i = 0; (rule = rsRules[i]); i++) {\n if (rule.evalFirst) {\n rsRules[i] = rule.eval(context);\n }\n }\n\n const mediaBlockCount = (context.mediaBlocks && context.mediaBlocks.length) || 0;\n\n // Evaluate mixin calls.\n for (i = 0; (rule = rsRules[i]); i++) {\n if (rule.type === 'MixinCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).filter(r => {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope if the variable is\n // already there. consider returning false here\n // but we need a way to \"return\" variable from mixins\n return !(ruleset.variable(r.name));\n }\n return true;\n });\n rsRules.splice(...[i, 1].concat(rules));\n i += rules.length - 1;\n ruleset.resetCache();\n } else if (rule.type === 'VariableCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).rules.filter(r => {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope at all\n return false;\n }\n return true;\n });\n rsRules.splice(...[i, 1].concat(rules));\n i += rules.length - 1;\n ruleset.resetCache();\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n if (!rule.evalFirst) {\n rsRules[i] = rule = rule.eval ? rule.eval(context) : rule;\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n // for rulesets, check if it is a css guard and can be removed\n if (rule instanceof Ruleset && rule.selectors && rule.selectors.length === 1) {\n // check if it can be folded in (e.g. & where)\n if (rule.selectors[0] && rule.selectors[0].isJustParentSelector()) {\n rsRules.splice(i--, 1);\n\n for (var j = 0; (subRule = rule.rules[j]); j++) {\n if (subRule instanceof Node) {\n subRule.copyVisibilityInfo(rule.visibilityInfo());\n if (!(subRule instanceof Declaration) || !subRule.variable) {\n rsRules.splice(++i, 0, subRule);\n }\n }\n }\n }\n }\n }\n\n // Pop the stack\n ctxFrames.shift();\n ctxSelectors.shift();\n\n if (context.mediaBlocks) {\n for (i = mediaBlockCount; i < context.mediaBlocks.length; i++) {\n context.mediaBlocks[i].bubbleSelectors(selectors);\n }\n }\n\n return ruleset;\n }\n\n evalImports(context) {\n const rules = this.rules;\n let i;\n let importRules;\n if (!rules) { return; }\n\n for (i = 0; i < rules.length; i++) {\n if (rules[i].type === 'Import') {\n importRules = rules[i].eval(context);\n if (importRules && (importRules.length || importRules.length === 0)) {\n rules.splice(...[i, 1].concat(importRules));\n i += importRules.length - 1;\n } else {\n rules.splice(i, 1, importRules);\n }\n this.resetCache();\n }\n }\n }\n\n makeImportant() {\n const result = new Ruleset(this.selectors, this.rules.map(r => {\n if (r.makeImportant) {\n return r.makeImportant();\n } else {\n return r;\n }\n }), this.strictImports, this.visibilityInfo());\n\n return result;\n }\n\n matchArgs(args) {\n return !args || args.length === 0;\n }\n\n // lets you call a css selector with a guard\n matchCondition(args, context) {\n const lastSelector = this.selectors[this.selectors.length - 1];\n if (!lastSelector.evaldCondition) {\n return false;\n }\n if (lastSelector.condition &&\n !lastSelector.condition.eval(\n new contexts.Eval(context,\n context.frames))) {\n return false;\n }\n return true;\n }\n\n resetCache() {\n this._rulesets = null;\n this._variables = null;\n this._properties = null;\n this._lookups = {};\n }\n\n variables() {\n if (!this._variables) {\n this._variables = !this.rules ? {} : this.rules.reduce((hash, r) => {\n if (r instanceof Declaration && r.variable === true) {\n hash[r.name] = r;\n }\n // when evaluating variables in an import statement, imports have not been eval'd\n // so we need to go inside import statements.\n // guard against root being a string (in the case of inlined less)\n if (r.type === 'Import' && r.root && r.root.variables) {\n const vars = r.root.variables();\n for (const name in vars) {\n if (vars.hasOwnProperty(name)) {\n hash[name] = r.root.variable(name);\n }\n }\n }\n return hash;\n }, {});\n }\n return this._variables;\n }\n\n properties() {\n if (!this._properties) {\n this._properties = !this.rules ? {} : this.rules.reduce((hash, r) => {\n if (r instanceof Declaration && r.variable !== true) {\n const name = (r.name.length === 1) && (r.name[0] instanceof Keyword) ?\n r.name[0].value : r.name;\n // Properties don't overwrite as they can merge\n if (!hash[`$${name}`]) {\n hash[`$${name}`] = [ r ];\n }\n else {\n hash[`$${name}`].push(r);\n }\n }\n return hash;\n }, {});\n }\n return this._properties;\n }\n\n variable(name) {\n const decl = this.variables()[name];\n if (decl) {\n return this.parseValue(decl);\n }\n }\n\n property(name) {\n const decl = this.properties()[name];\n if (decl) {\n return this.parseValue(decl);\n }\n }\n\n lastDeclaration() {\n for (let i = this.rules.length; i > 0; i--) {\n const decl = this.rules[i - 1];\n if (decl instanceof Declaration) {\n return this.parseValue(decl);\n }\n }\n }\n\n parseValue(toParse) {\n const self = this;\n function transformDeclaration(decl) {\n if (decl.value instanceof Anonymous && !decl.parsed) {\n if (typeof decl.value.value === 'string') {\n this.parse.parseNode(\n decl.value.value,\n ['value', 'important'], \n decl.value.getIndex(), \n decl.fileInfo(), \n (err, result) => {\n if (err) {\n decl.parsed = true;\n }\n if (result) {\n decl.value = result[0];\n decl.important = result[1] || '';\n decl.parsed = true;\n }\n });\n } else {\n decl.parsed = true;\n }\n\n return decl;\n }\n else {\n return decl;\n }\n }\n if (!Array.isArray(toParse)) {\n return transformDeclaration.call(self, toParse);\n }\n else {\n const nodes = [];\n toParse.forEach(n => {\n nodes.push(transformDeclaration.call(self, n));\n });\n return nodes;\n }\n }\n\n rulesets() {\n if (!this.rules) { return []; }\n\n const filtRules = [];\n const rules = this.rules;\n let i;\n let rule;\n\n for (i = 0; (rule = rules[i]); i++) {\n if (rule.isRuleset) {\n filtRules.push(rule);\n }\n }\n\n return filtRules;\n }\n\n prependRule(rule) {\n const rules = this.rules;\n if (rules) {\n rules.unshift(rule);\n } else {\n this.rules = [ rule ];\n }\n this.setParent(rule, this);\n }\n\n find(selector, self = this, filter) {\n const rules = [];\n let match;\n let foundMixins;\n const key = selector.toCSS();\n\n if (key in this._lookups) { return this._lookups[key]; }\n\n this.rulesets().forEach(rule => {\n if (rule !== self) {\n for (let j = 0; j < rule.selectors.length; j++) {\n match = selector.match(rule.selectors[j]);\n if (match) {\n if (selector.elements.length > match) {\n if (!filter || filter(rule)) {\n foundMixins = rule.find(new Selector(selector.elements.slice(match)), self, filter);\n for (let i = 0; i < foundMixins.length; ++i) {\n foundMixins[i].path.push(rule);\n }\n Array.prototype.push.apply(rules, foundMixins);\n }\n } else {\n rules.push({ rule, path: []});\n }\n break;\n }\n }\n }\n });\n this._lookups[key] = rules;\n return rules;\n }\n\n genCSS(context, output) {\n let i;\n let j;\n const charsetRuleNodes = [];\n let ruleNodes = [];\n\n let // Line number debugging\n debugInfo;\n\n let rule;\n let path;\n\n context.tabLevel = (context.tabLevel || 0);\n\n if (!this.root) {\n context.tabLevel++;\n }\n\n const tabRuleStr = context.compress ? '' : Array(context.tabLevel + 1).join(' ');\n const tabSetStr = context.compress ? '' : Array(context.tabLevel).join(' ');\n let sep;\n\n let charsetNodeIndex = 0;\n let importNodeIndex = 0;\n for (i = 0; (rule = this.rules[i]); i++) {\n if (rule instanceof Comment) {\n if (importNodeIndex === i) {\n importNodeIndex++;\n }\n ruleNodes.push(rule);\n } else if (rule.isCharset && rule.isCharset()) {\n ruleNodes.splice(charsetNodeIndex, 0, rule);\n charsetNodeIndex++;\n importNodeIndex++;\n } else if (rule.type === 'Import') {\n ruleNodes.splice(importNodeIndex, 0, rule);\n importNodeIndex++;\n } else {\n ruleNodes.push(rule);\n }\n }\n ruleNodes = charsetRuleNodes.concat(ruleNodes);\n\n // If this is the root node, we don't render\n // a selector, or {}.\n if (!this.root) {\n debugInfo = getDebugInfo(context, this, tabSetStr);\n\n if (debugInfo) {\n output.add(debugInfo);\n output.add(tabSetStr);\n }\n\n const paths = this.paths;\n const pathCnt = paths.length;\n let pathSubCnt;\n\n sep = context.compress ? ',' : (`,\\n${tabSetStr}`);\n\n for (i = 0; i < pathCnt; i++) {\n path = paths[i];\n if (!(pathSubCnt = path.length)) { continue; }\n if (i > 0) { output.add(sep); }\n\n context.firstSelector = true;\n path[0].genCSS(context, output);\n\n context.firstSelector = false;\n for (j = 1; j < pathSubCnt; j++) {\n path[j].genCSS(context, output);\n }\n }\n\n output.add((context.compress ? '{' : ' {\\n') + tabRuleStr);\n }\n\n // Compile rules and rulesets\n for (i = 0; (rule = ruleNodes[i]); i++) {\n\n if (i + 1 === ruleNodes.length) {\n context.lastRule = true;\n }\n\n const currentLastRule = context.lastRule;\n if (rule.isRulesetLike(rule)) {\n context.lastRule = false;\n }\n\n if (rule.genCSS) {\n rule.genCSS(context, output);\n } else if (rule.value) {\n output.add(rule.value.toString());\n }\n\n context.lastRule = currentLastRule;\n\n if (!context.lastRule && rule.isVisible()) {\n output.add(context.compress ? '' : (`\\n${tabRuleStr}`));\n } else {\n context.lastRule = false;\n }\n }\n\n if (!this.root) {\n output.add((context.compress ? '}' : `\\n${tabSetStr}}`));\n context.tabLevel--;\n }\n\n if (!output.isEmpty() && !context.compress && this.firstRoot) {\n output.add('\\n');\n }\n }\n\n joinSelectors(paths, context, selectors) {\n for (let s = 0; s < selectors.length; s++) {\n this.joinSelector(paths, context, selectors[s]);\n }\n }\n\n joinSelector(paths, context, selector) {\n function createParenthesis(elementsToPak, originalElement) {\n let replacementParen;\n let j;\n if (elementsToPak.length === 0) {\n replacementParen = new Paren(elementsToPak[0]);\n } else {\n const insideParent = new Array(elementsToPak.length);\n for (j = 0; j < elementsToPak.length; j++) {\n insideParent[j] = new Element(\n null,\n elementsToPak[j],\n originalElement.isVariable,\n originalElement._index,\n originalElement._fileInfo\n );\n }\n replacementParen = new Paren(new Selector(insideParent));\n }\n return replacementParen;\n }\n\n function createSelector(containedElement, originalElement) {\n let element;\n let selector;\n element = new Element(null, containedElement, originalElement.isVariable, originalElement._index, originalElement._fileInfo);\n selector = new Selector([element]);\n return selector;\n }\n\n // joins selector path from `beginningPath` with selector path in `addPath`\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns concatenated path\n function addReplacementIntoPath(beginningPath, addPath, replacedElement, originalSelector) {\n let newSelectorPath;\n let lastSelector;\n let newJoinedSelector;\n // our new selector path\n newSelectorPath = [];\n\n // construct the joined selector - if & is the first thing this will be empty,\n // if not newJoinedSelector will be the last set of elements in the selector\n if (beginningPath.length > 0) {\n newSelectorPath = utils.copyArray(beginningPath);\n lastSelector = newSelectorPath.pop();\n newJoinedSelector = originalSelector.createDerived(utils.copyArray(lastSelector.elements));\n }\n else {\n newJoinedSelector = originalSelector.createDerived([]);\n }\n\n if (addPath.length > 0) {\n // /deep/ is a CSS4 selector - (removed, so should deprecate)\n // that is valid without anything in front of it\n // so if the & does not have a combinator that is \"\" or \" \" then\n // and there is a combinator on the parent, then grab that.\n // this also allows + a { & .b { .a & { ... though not sure why you would want to do that\n let combinator = replacedElement.combinator;\n\n const parentEl = addPath[0].elements[0];\n if (combinator.emptyOrWhitespace && !parentEl.combinator.emptyOrWhitespace) {\n combinator = parentEl.combinator;\n }\n // join the elements so far with the first part of the parent\n newJoinedSelector.elements.push(new Element(\n combinator,\n parentEl.value,\n replacedElement.isVariable,\n replacedElement._index,\n replacedElement._fileInfo\n ));\n newJoinedSelector.elements = newJoinedSelector.elements.concat(addPath[0].elements.slice(1));\n }\n\n // now add the joined selector - but only if it is not empty\n if (newJoinedSelector.elements.length !== 0) {\n newSelectorPath.push(newJoinedSelector);\n }\n\n // put together the parent selectors after the join (e.g. the rest of the parent)\n if (addPath.length > 1) {\n let restOfPath = addPath.slice(1);\n restOfPath = restOfPath.map(selector => selector.createDerived(selector.elements, []));\n newSelectorPath = newSelectorPath.concat(restOfPath);\n }\n return newSelectorPath;\n }\n\n // joins selector path from `beginningPath` with every selector path in `addPaths` array\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns array with all concatenated paths\n function addAllReplacementsIntoPath( beginningPath, addPaths, replacedElement, originalSelector, result) {\n let j;\n for (j = 0; j < beginningPath.length; j++) {\n const newSelectorPath = addReplacementIntoPath(beginningPath[j], addPaths, replacedElement, originalSelector);\n result.push(newSelectorPath);\n }\n return result;\n }\n\n function mergeElementsOnToSelectors(elements, selectors) {\n let i;\n let sel;\n\n if (elements.length === 0) {\n return ;\n }\n if (selectors.length === 0) {\n selectors.push([ new Selector(elements) ]);\n return;\n }\n\n for (i = 0; (sel = selectors[i]); i++) {\n // if the previous thing in sel is a parent this needs to join on to it\n if (sel.length > 0) {\n sel[sel.length - 1] = sel[sel.length - 1].createDerived(sel[sel.length - 1].elements.concat(elements));\n }\n else {\n sel.push(new Selector(elements));\n }\n }\n }\n\n // replace all parent selectors inside `inSelector` by content of `context` array\n // resulting selectors are returned inside `paths` array\n // returns true if `inSelector` contained at least one parent selector\n function replaceParentSelector(paths, context, inSelector) {\n // The paths are [[Selector]]\n // The first list is a list of comma separated selectors\n // The inner list is a list of inheritance separated selectors\n // e.g.\n // .a, .b {\n // .c {\n // }\n // }\n // == [[.a] [.c]] [[.b] [.c]]\n //\n let i;\n\n let j;\n let k;\n let currentElements;\n let newSelectors;\n let selectorsMultiplied;\n let sel;\n let el;\n let hadParentSelector = false;\n let length;\n let lastSelector;\n function findNestedSelector(element) {\n let maybeSelector;\n if (!(element.value instanceof Paren)) {\n return null;\n }\n\n maybeSelector = element.value.value;\n if (!(maybeSelector instanceof Selector)) {\n return null;\n }\n\n return maybeSelector;\n }\n\n // the elements from the current selector so far\n currentElements = [];\n // the current list of new selectors to add to the path.\n // We will build it up. We initiate it with one empty selector as we \"multiply\" the new selectors\n // by the parents\n newSelectors = [\n []\n ];\n\n for (i = 0; (el = inSelector.elements[i]); i++) {\n // non parent reference elements just get added\n if (el.value !== '&') {\n const nestedSelector = findNestedSelector(el);\n if (nestedSelector != null) {\n // merge the current list of non parent selector elements\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n const nestedPaths = [];\n let replaced;\n const replacedNewSelectors = [];\n replaced = replaceParentSelector(nestedPaths, context, nestedSelector);\n hadParentSelector = hadParentSelector || replaced;\n // the nestedPaths array should have only one member - replaceParentSelector does not multiply selectors\n for (k = 0; k < nestedPaths.length; k++) {\n const replacementSelector = createSelector(createParenthesis(nestedPaths[k], el), el);\n addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors);\n }\n newSelectors = replacedNewSelectors;\n currentElements = [];\n } else {\n currentElements.push(el);\n }\n\n } else {\n hadParentSelector = true;\n // the new list of selectors to add\n selectorsMultiplied = [];\n\n // merge the current list of non parent selector elements\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n // loop through our current selectors\n for (j = 0; j < newSelectors.length; j++) {\n sel = newSelectors[j];\n // if we don't have any parent paths, the & might be in a mixin so that it can be used\n // whether there are parents or not\n if (context.length === 0) {\n // the combinator used on el should now be applied to the next element instead so that\n // it is not lost\n if (sel.length > 0) {\n sel[0].elements.push(new Element(el.combinator, '', el.isVariable, el._index, el._fileInfo));\n }\n selectorsMultiplied.push(sel);\n }\n else {\n // and the parent selectors\n for (k = 0; k < context.length; k++) {\n // We need to put the current selectors\n // then join the last selector's elements on to the parents selectors\n const newSelectorPath = addReplacementIntoPath(sel, context[k], el, inSelector);\n // add that to our new set of selectors\n selectorsMultiplied.push(newSelectorPath);\n }\n }\n }\n\n // our new selectors has been multiplied, so reset the state\n newSelectors = selectorsMultiplied;\n currentElements = [];\n }\n }\n\n // if we have any elements left over (e.g. .a& .b == .b)\n // add them on to all the current selectors\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n for (i = 0; i < newSelectors.length; i++) {\n length = newSelectors[i].length;\n if (length > 0) {\n paths.push(newSelectors[i]);\n lastSelector = newSelectors[i][length - 1];\n newSelectors[i][length - 1] = lastSelector.createDerived(lastSelector.elements, inSelector.extendList);\n }\n }\n\n return hadParentSelector;\n }\n\n function deriveSelector(visibilityInfo, deriveFrom) {\n const newSelector = deriveFrom.createDerived(deriveFrom.elements, deriveFrom.extendList, deriveFrom.evaldCondition);\n newSelector.copyVisibilityInfo(visibilityInfo);\n return newSelector;\n }\n\n // joinSelector code follows\n let i;\n\n let newPaths;\n let hadParentSelector;\n\n newPaths = [];\n hadParentSelector = replaceParentSelector(newPaths, context, selector);\n\n if (!hadParentSelector) {\n if (context.length > 0) {\n newPaths = [];\n for (i = 0; i < context.length; i++) {\n\n const concatenated = context[i].map(deriveSelector.bind(this, selector.visibilityInfo()));\n\n concatenated.push(selector);\n newPaths.push(concatenated);\n }\n }\n else {\n newPaths = [[selector]];\n }\n }\n\n for (i = 0; i < newPaths.length; i++) {\n paths.push(newPaths[i]);\n }\n }\n}\n\nRuleset.prototype.type = 'Ruleset';\nRuleset.prototype.isRuleset = true;\nexport default Ruleset;\n","import Node from './node';\nimport Selector from './selector';\nimport Ruleset from './ruleset';\nimport Anonymous from './anonymous';\n\nclass AtRule extends Node {\n constructor(\n name,\n value,\n rules,\n index,\n currentFileInfo,\n debugInfo,\n isRooted,\n visibilityInfo\n ) {\n super();\n\n let i;\n\n this.name = name;\n this.value = (value instanceof Node) ? value : (value ? new Anonymous(value) : value);\n if (rules) {\n if (Array.isArray(rules)) {\n this.rules = rules;\n } else {\n this.rules = [rules];\n this.rules[0].selectors = (new Selector([], null, null, index, currentFileInfo)).createEmptySelectors();\n }\n for (i = 0; i < this.rules.length; i++) {\n this.rules[i].allowImports = true;\n }\n this.setParent(this.rules, this);\n }\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.debugInfo = debugInfo;\n this.isRooted = isRooted || false;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n }\n\n accept(visitor) {\n const value = this.value;\n const rules = this.rules;\n if (rules) {\n this.rules = visitor.visitArray(rules);\n }\n if (value) {\n this.value = visitor.visit(value);\n }\n }\n\n isRulesetLike() {\n return this.rules || !this.isCharset();\n }\n\n isCharset() {\n return '@charset' === this.name;\n }\n\n genCSS(context, output) {\n const value = this.value;\n const rules = this.rules;\n output.add(this.name, this.fileInfo(), this.getIndex());\n if (value) {\n output.add(' ');\n value.genCSS(context, output);\n }\n if (rules) {\n this.outputRuleset(context, output, rules);\n } else {\n output.add(';');\n }\n }\n\n eval(context) {\n let mediaPathBackup;\n let mediaBlocksBackup;\n let value = this.value;\n let rules = this.rules;\n\n // media stored inside other atrule should not bubble over it\n // backpup media bubbling information\n mediaPathBackup = context.mediaPath;\n mediaBlocksBackup = context.mediaBlocks;\n // deleted media bubbling information\n context.mediaPath = [];\n context.mediaBlocks = [];\n\n if (value) {\n value = value.eval(context);\n }\n if (rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n rules = [rules[0].eval(context)];\n rules[0].root = true;\n }\n // restore media bubbling information\n context.mediaPath = mediaPathBackup;\n context.mediaBlocks = mediaBlocksBackup;\n\n return new AtRule(this.name, value, rules,\n this.getIndex(), this.fileInfo(), this.debugInfo, this.isRooted, this.visibilityInfo());\n }\n\n variable(name) {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.variable.call(this.rules[0], name);\n }\n }\n\n find(...args) {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.find.apply(this.rules[0], args);\n }\n }\n\n rulesets() {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.rulesets.apply(this.rules[0]);\n }\n }\n\n outputRuleset(context, output, rules) {\n const ruleCnt = rules.length;\n let i;\n context.tabLevel = (context.tabLevel | 0) + 1;\n\n // Compressed\n if (context.compress) {\n output.add('{');\n for (i = 0; i < ruleCnt; i++) {\n rules[i].genCSS(context, output);\n }\n output.add('}');\n context.tabLevel--;\n return;\n }\n\n // Non-compressed\n const tabSetStr = `\\n${Array(context.tabLevel).join(' ')}`;\n\n const tabRuleStr = `${tabSetStr} `;\n if (!ruleCnt) {\n output.add(` {${tabSetStr}}`);\n } else {\n output.add(` {${tabRuleStr}`);\n rules[0].genCSS(context, output);\n for (i = 1; i < ruleCnt; i++) {\n output.add(tabRuleStr);\n rules[i].genCSS(context, output);\n }\n output.add(`${tabSetStr}}`);\n }\n\n context.tabLevel--;\n }\n}\n\nAtRule.prototype.type = 'AtRule';\nexport default AtRule;\n","import Node from './node';\nimport contexts from '../contexts';\nimport * as utils from '../utils';\n\nclass DetachedRuleset extends Node {\n constructor(ruleset, frames) {\n super();\n\n this.ruleset = ruleset;\n this.frames = frames;\n this.setParent(this.ruleset, this);\n }\n\n accept(visitor) {\n this.ruleset = visitor.visit(this.ruleset);\n }\n\n eval(context) {\n const frames = this.frames || utils.copyArray(context.frames);\n return new DetachedRuleset(this.ruleset, frames);\n }\n\n callEval(context) {\n return this.ruleset.eval(this.frames ? new contexts.Eval(context, this.frames.concat(context.frames)) : context);\n }\n}\n\nDetachedRuleset.prototype.type = 'DetachedRuleset';\nDetachedRuleset.prototype.evalFirst = true;\nexport default DetachedRuleset;\n","import Node from './node';\nimport unitConversions from '../data/unit-conversions';\nimport * as utils from '../utils';\n\nclass Unit extends Node {\n constructor(numerator, denominator, backupUnit) {\n super();\n\n this.numerator = numerator ? utils.copyArray(numerator).sort() : [];\n this.denominator = denominator ? utils.copyArray(denominator).sort() : [];\n if (backupUnit) {\n this.backupUnit = backupUnit;\n } else if (numerator && numerator.length) {\n this.backupUnit = numerator[0];\n }\n }\n\n clone() {\n return new Unit(utils.copyArray(this.numerator), utils.copyArray(this.denominator), this.backupUnit);\n }\n\n genCSS(context, output) {\n // Dimension checks the unit is singular and throws an error if in strict math mode.\n const strictUnits = context && context.strictUnits;\n if (this.numerator.length === 1) {\n output.add(this.numerator[0]); // the ideal situation\n } else if (!strictUnits && this.backupUnit) {\n output.add(this.backupUnit);\n } else if (!strictUnits && this.denominator.length) {\n output.add(this.denominator[0]);\n }\n }\n\n toString() {\n let i;\n let returnStr = this.numerator.join('*');\n for (i = 0; i < this.denominator.length; i++) {\n returnStr += `/${this.denominator[i]}`;\n }\n return returnStr;\n }\n\n compare(other) {\n return this.is(other.toString()) ? 0 : undefined;\n }\n\n is(unitString) {\n return this.toString().toUpperCase() === unitString.toUpperCase();\n }\n\n isLength() {\n return RegExp('^(px|em|ex|ch|rem|in|cm|mm|pc|pt|ex|vw|vh|vmin|vmax)$', 'gi').test(this.toCSS());\n }\n\n isEmpty() {\n return this.numerator.length === 0 && this.denominator.length === 0;\n }\n\n isSingular() {\n return this.numerator.length <= 1 && this.denominator.length === 0;\n }\n\n map(callback) {\n let i;\n\n for (i = 0; i < this.numerator.length; i++) {\n this.numerator[i] = callback(this.numerator[i], false);\n }\n\n for (i = 0; i < this.denominator.length; i++) {\n this.denominator[i] = callback(this.denominator[i], true);\n }\n }\n\n usedUnits() {\n let group;\n const result = {};\n let mapUnit;\n let groupName;\n\n mapUnit = atomicUnit => {\n /* jshint loopfunc:true */\n if (group.hasOwnProperty(atomicUnit) && !result[groupName]) {\n result[groupName] = atomicUnit;\n }\n\n return atomicUnit;\n };\n\n for (groupName in unitConversions) {\n if (unitConversions.hasOwnProperty(groupName)) {\n group = unitConversions[groupName];\n\n this.map(mapUnit);\n }\n }\n\n return result;\n }\n\n cancel() {\n const counter = {};\n let atomicUnit;\n let i;\n\n for (i = 0; i < this.numerator.length; i++) {\n atomicUnit = this.numerator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) + 1;\n }\n\n for (i = 0; i < this.denominator.length; i++) {\n atomicUnit = this.denominator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) - 1;\n }\n\n this.numerator = [];\n this.denominator = [];\n\n for (atomicUnit in counter) {\n if (counter.hasOwnProperty(atomicUnit)) {\n const count = counter[atomicUnit];\n\n if (count > 0) {\n for (i = 0; i < count; i++) {\n this.numerator.push(atomicUnit);\n }\n } else if (count < 0) {\n for (i = 0; i < -count; i++) {\n this.denominator.push(atomicUnit);\n }\n }\n }\n }\n\n this.numerator.sort();\n this.denominator.sort();\n }\n}\n\nUnit.prototype.type = 'Unit';\nexport default Unit;\n","import Node from './node';\nimport unitConversions from '../data/unit-conversions';\nimport Unit from './unit';\nimport Color from './color';\n\n//\n// A number with a unit\n//\nclass Dimension extends Node {\n constructor(value, unit) {\n super();\n\n this.value = parseFloat(value);\n if (isNaN(this.value)) {\n throw new Error('Dimension is not a number.');\n }\n this.unit = (unit && unit instanceof Unit) ? unit :\n new Unit(unit ? [unit] : undefined);\n this.setParent(this.unit, this);\n }\n\n accept(visitor) {\n this.unit = visitor.visit(this.unit);\n }\n\n eval(context) {\n return this;\n }\n\n toColor() {\n return new Color([this.value, this.value, this.value]);\n }\n\n genCSS(context, output) {\n if ((context && context.strictUnits) && !this.unit.isSingular()) {\n throw new Error(`Multiple units in dimension. Correct the units or use the unit function. Bad unit: ${this.unit.toString()}`);\n }\n\n const value = this.fround(context, this.value);\n let strValue = String(value);\n\n if (value !== 0 && value < 0.000001 && value > -0.000001) {\n // would be output 1e-6 etc.\n strValue = value.toFixed(20).replace(/0+$/, '');\n }\n\n if (context && context.compress) {\n // Zero values doesn't need a unit\n if (value === 0 && this.unit.isLength()) {\n output.add(strValue);\n return;\n }\n\n // Float values doesn't need a leading zero\n if (value > 0 && value < 1) {\n strValue = (strValue).substr(1);\n }\n }\n\n output.add(strValue);\n this.unit.genCSS(context, output);\n }\n\n // In an operation between two Dimensions,\n // we default to the first Dimension's unit,\n // so `1px + 2` will yield `3px`.\n operate(context, op, other) {\n /* jshint noempty:false */\n let value = this._operate(context, op, this.value, other.value);\n\n let unit = this.unit.clone();\n\n if (op === '+' || op === '-') {\n if (unit.numerator.length === 0 && unit.denominator.length === 0) {\n unit = other.unit.clone();\n if (this.unit.backupUnit) {\n unit.backupUnit = this.unit.backupUnit;\n }\n } else if (other.unit.numerator.length === 0 && unit.denominator.length === 0) {\n // do nothing\n } else {\n other = other.convertTo(this.unit.usedUnits());\n\n if (context.strictUnits && other.unit.toString() !== unit.toString()) {\n throw new Error(`Incompatible units. Change the units or use the unit function. ` + \n `Bad units: '${unit.toString()}' and '${other.unit.toString()}'.`);\n }\n\n value = this._operate(context, op, this.value, other.value);\n }\n } else if (op === '*') {\n unit.numerator = unit.numerator.concat(other.unit.numerator).sort();\n unit.denominator = unit.denominator.concat(other.unit.denominator).sort();\n unit.cancel();\n } else if (op === '/') {\n unit.numerator = unit.numerator.concat(other.unit.denominator).sort();\n unit.denominator = unit.denominator.concat(other.unit.numerator).sort();\n unit.cancel();\n }\n return new Dimension(value, unit);\n }\n\n compare(other) {\n let a;\n let b;\n\n if (!(other instanceof Dimension)) {\n return undefined;\n }\n\n if (this.unit.isEmpty() || other.unit.isEmpty()) {\n a = this;\n b = other;\n } else {\n a = this.unify();\n b = other.unify();\n if (a.unit.compare(b.unit) !== 0) {\n return undefined;\n }\n }\n\n return Node.numericCompare(a.value, b.value);\n }\n\n unify() {\n return this.convertTo({ length: 'px', duration: 's', angle: 'rad' });\n }\n\n convertTo(conversions) {\n let value = this.value;\n const unit = this.unit.clone();\n let i;\n let groupName;\n let group;\n let targetUnit;\n let derivedConversions = {};\n let applyUnit;\n\n if (typeof conversions === 'string') {\n for (i in unitConversions) {\n if (unitConversions[i].hasOwnProperty(conversions)) {\n derivedConversions = {};\n derivedConversions[i] = conversions;\n }\n }\n conversions = derivedConversions;\n }\n applyUnit = (atomicUnit, denominator) => {\n /* jshint loopfunc:true */\n if (group.hasOwnProperty(atomicUnit)) {\n if (denominator) {\n value = value / (group[atomicUnit] / group[targetUnit]);\n } else {\n value = value * (group[atomicUnit] / group[targetUnit]);\n }\n\n return targetUnit;\n }\n\n return atomicUnit;\n };\n\n for (groupName in conversions) {\n if (conversions.hasOwnProperty(groupName)) {\n targetUnit = conversions[groupName];\n group = unitConversions[groupName];\n\n unit.map(applyUnit);\n }\n }\n\n unit.cancel();\n\n return new Dimension(value, unit);\n }\n}\n\nDimension.prototype.type = 'Dimension';\nexport default Dimension;\n","import Node from './node';\nimport Color from './color';\nimport Dimension from './dimension';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\n\nclass Operation extends Node {\n constructor(op, operands, isSpaced) {\n super();\n\n this.op = op.trim();\n this.operands = operands;\n this.isSpaced = isSpaced;\n }\n\n accept(visitor) {\n this.operands = visitor.visitArray(this.operands);\n }\n\n eval(context) {\n let a = this.operands[0].eval(context);\n let b = this.operands[1].eval(context);\n let op;\n\n if (context.isMathOn(this.op)) {\n op = this.op === './' ? '/' : this.op;\n if (a instanceof Dimension && b instanceof Color) {\n a = a.toColor();\n }\n if (b instanceof Dimension && a instanceof Color) {\n b = b.toColor();\n }\n if (!a.operate) {\n if (a instanceof Operation && a.op === '/' && context.math === MATH.PARENS_DIVISION) {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n throw { type: 'Operation',\n message: 'Operation on an invalid type' };\n }\n\n return a.operate(context, op, b);\n } else {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n }\n\n genCSS(context, output) {\n this.operands[0].genCSS(context, output);\n if (this.isSpaced) {\n output.add(' ');\n }\n output.add(this.op);\n if (this.isSpaced) {\n output.add(' ');\n }\n this.operands[1].genCSS(context, output);\n }\n}\n\nOperation.prototype.type = 'Operation';\nexport default Operation;\n","import Node from './node';\nimport Paren from './paren';\nimport Comment from './comment';\nimport Dimension from './dimension';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\nclass Expression extends Node {\n constructor(value, noSpacing) {\n super();\n\n this.value = value;\n this.noSpacing = noSpacing;\n if (!value) {\n throw new Error('Expression requires an array parameter');\n }\n }\n\n accept(visitor) {\n this.value = visitor.visitArray(this.value);\n }\n\n eval(context) {\n let returnValue;\n const mathOn = context.isMathOn();\n\n const inParenthesis = this.parens && \n (context.math !== MATH.STRICT_LEGACY || !this.parensInOp);\n\n let doubleParen = false;\n if (inParenthesis) {\n context.inParenthesis();\n }\n if (this.value.length > 1) {\n returnValue = new Expression(this.value.map(e => {\n if (!e.eval) {\n return e;\n }\n return e.eval(context);\n }), this.noSpacing);\n } else if (this.value.length === 1) {\n if (this.value[0].parens && !this.value[0].parensInOp && !context.inCalc) {\n doubleParen = true;\n }\n returnValue = this.value[0].eval(context);\n } else {\n returnValue = this;\n }\n if (inParenthesis) {\n context.outOfParenthesis();\n }\n if (this.parens && this.parensInOp && !mathOn && !doubleParen \n && (!(returnValue instanceof Dimension))) {\n returnValue = new Paren(returnValue);\n }\n return returnValue;\n }\n\n genCSS(context, output) {\n for (let i = 0; i < this.value.length; i++) {\n this.value[i].genCSS(context, output);\n if (!this.noSpacing && i + 1 < this.value.length) {\n output.add(' ');\n }\n }\n }\n\n throwAwayComments() {\n this.value = this.value.filter(v => !(v instanceof Comment));\n }\n}\n\nExpression.prototype.type = 'Expression';\nexport default Expression;\n","import Expression from '../tree/expression';\n\nclass functionCaller {\n constructor(name, context, index, currentFileInfo) {\n this.name = name.toLowerCase();\n this.index = index;\n this.context = context;\n this.currentFileInfo = currentFileInfo;\n\n this.func = context.frames[0].functionRegistry.get(this.name);\n }\n\n isValid() {\n return Boolean(this.func);\n }\n\n call(args) {\n const evalArgs = this.func.evalArgs;\n if (evalArgs !== false) {\n args = args.map(a => a.eval(this.context));\n }\n // This code is terrible and should be replaced as per this issue...\n // https://github.com/less/less.js/issues/2477\n if (Array.isArray(args)) {\n args = args.filter(item => {\n if (item.type === 'Comment') {\n return false;\n }\n return true;\n })\n .map(item => {\n if (item.type === 'Expression') {\n const subNodes = item.value.filter(item => {\n if (item.type === 'Comment') {\n return false;\n }\n return true;\n });\n if (subNodes.length === 1) {\n return subNodes[0];\n } else {\n return new Expression(subNodes);\n }\n }\n return item;\n });\n }\n\n if (evalArgs === false) {\n return this.func(this.context, ...args);\n }\n\n return this.func(...args);\n }\n}\n\nexport default functionCaller;\n","import Node from './node';\nimport Anonymous from './anonymous';\nimport FunctionCaller from '../functions/function-caller';\n\n//\n// A function call node.\n//\nclass Call extends Node {\n constructor(name, args, index, currentFileInfo) {\n super();\n\n this.name = name;\n this.args = args;\n this.calc = name === 'calc';\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n accept(visitor) {\n if (this.args) {\n this.args = visitor.visitArray(this.args);\n }\n }\n\n //\n // When evaluating a function call,\n // we either find the function in the functionRegistry,\n // in which case we call it, passing the evaluated arguments,\n // if this returns null or we cannot find the function, we\n // simply print it out as it appeared originally [2].\n //\n // The reason why we evaluate the arguments, is in the case where\n // we try to pass a variable to a function, like: `saturate(@color)`.\n // The function should receive the value, not the variable.\n //\n eval(context) {\n /**\n * Turn off math for calc(), and switch back on for evaluating nested functions\n */\n const currentMathContext = context.mathOn;\n context.mathOn = !this.calc;\n if (this.calc || context.inCalc) {\n context.enterCalc();\n }\n\n const exitCalc = () => {\n if (this.calc || context.inCalc) {\n context.exitCalc();\n }\n context.mathOn = currentMathContext;\n };\n\n let result;\n const funcCaller = new FunctionCaller(this.name, context, this.getIndex(), this.fileInfo());\n\n if (funcCaller.isValid()) {\n try {\n result = funcCaller.call(this.args);\n exitCalc();\n } catch (e) {\n if (e.hasOwnProperty('line') && e.hasOwnProperty('column')) {\n throw e\n }\n throw { \n type: e.type || 'Runtime',\n message: `error evaluating function \\`${this.name}\\`${e.message ? `: ${e.message}` : ''}`,\n index: this.getIndex(), \n filename: this.fileInfo().filename,\n line: e.lineNumber,\n column: e.columnNumber\n };\n }\n\n if (result !== null && result !== undefined) {\n // Results that that are not nodes are cast as Anonymous nodes\n // Falsy values or booleans are returned as empty nodes\n if (!(result instanceof Node)) {\n if (!result || result === true) {\n result = new Anonymous(null); \n }\n else {\n result = new Anonymous(result.toString()); \n }\n \n }\n result._index = this._index;\n result._fileInfo = this._fileInfo;\n return result;\n }\n }\n\n const args = this.args.map(a => a.eval(context));\n exitCalc();\n\n return new Call(this.name, args, this.getIndex(), this.fileInfo());\n }\n\n genCSS(context, output) {\n output.add(`${this.name}(`, this.fileInfo(), this.getIndex());\n\n for (let i = 0; i < this.args.length; i++) {\n this.args[i].genCSS(context, output);\n if (i + 1 < this.args.length) {\n output.add(', ');\n }\n }\n\n output.add(')');\n }\n}\n\nCall.prototype.type = 'Call';\nexport default Call;\n","import Node from './node';\nimport Call from './call';\n\nclass Variable extends Node {\n constructor(name, index, currentFileInfo) {\n super();\n\n this.name = name;\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n eval(context) {\n let variable;\n let name = this.name;\n\n if (name.indexOf('@@') === 0) {\n name = `@${new Variable(name.slice(1), this.getIndex(), this.fileInfo()).eval(context).value}`;\n }\n\n if (this.evaluating) {\n throw { type: 'Name',\n message: `Recursive variable definition for ${name}`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n variable = this.find(context.frames, frame => {\n const v = frame.variable(name);\n if (v) {\n if (v.important) {\n const importantScope = context.importantScope[context.importantScope.length - 1];\n importantScope.important = v.important;\n }\n // If in calc, wrap vars in a function call to cascade evaluate args first\n if (context.inCalc) {\n return (new Call('_SELF', [v.value])).eval(context);\n }\n else {\n return v.value.eval(context);\n }\n }\n });\n if (variable) {\n this.evaluating = false;\n return variable;\n } else {\n throw { type: 'Name',\n message: `variable ${name} is undefined`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n }\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n}\n\nVariable.prototype.type = 'Variable';\nexport default Variable;\n","import Node from './node';\nimport Declaration from './declaration';\n\nclass Property extends Node {\n constructor(name, index, currentFileInfo) {\n super();\n\n this.name = name;\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n eval(context) {\n let property;\n const name = this.name;\n // TODO: shorten this reference\n const mergeRules = context.pluginManager.less.visitors.ToCSSVisitor.prototype._mergeRules;\n\n if (this.evaluating) {\n throw { type: 'Name',\n message: `Recursive property reference for ${name}`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n property = this.find(context.frames, frame => {\n let v;\n const vArr = frame.property(name);\n if (vArr) {\n for (let i = 0; i < vArr.length; i++) {\n v = vArr[i];\n\n vArr[i] = new Declaration(v.name,\n v.value,\n v.important,\n v.merge,\n v.index,\n v.currentFileInfo,\n v.inline,\n v.variable\n );\n }\n mergeRules(vArr);\n\n v = vArr[vArr.length - 1];\n if (v.important) {\n const importantScope = context.importantScope[context.importantScope.length - 1];\n importantScope.important = v.important;\n }\n v = v.value.eval(context);\n return v;\n }\n });\n if (property) {\n this.evaluating = false;\n return property;\n } else {\n throw { type: 'Name',\n message: `Property '${name}' is undefined`,\n filename: this.currentFileInfo.filename,\n index: this.index };\n }\n }\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n}\n\nProperty.prototype.type = 'Property';\nexport default Property;\n","import Node from './node';\n\nclass Attribute extends Node {\n constructor(key, op, value) {\n super();\n\n this.key = key;\n this.op = op;\n this.value = value;\n }\n\n eval(context) {\n return new Attribute(this.key.eval ? this.key.eval(context) : this.key,\n this.op, (this.value && this.value.eval) ? this.value.eval(context) : this.value);\n }\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n }\n\n toCSS(context) {\n let value = this.key.toCSS ? this.key.toCSS(context) : this.key;\n\n if (this.op) {\n value += this.op;\n value += (this.value.toCSS ? this.value.toCSS(context) : this.value);\n }\n\n return `[${value}]`;\n }\n}\n\nAttribute.prototype.type = 'Attribute';\nexport default Attribute;\n","import Node from './node';\nimport Variable from './variable';\nimport Property from './property';\n\n\nclass Quoted extends Node {\n constructor(str, content, escaped, index, currentFileInfo) {\n super();\n\n this.escaped = (escaped == null) ? true : escaped;\n this.value = content || '';\n this.quote = str.charAt(0);\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.variableRegex = /@\\{([\\w-]+)\\}/g;\n this.propRegex = /\\$\\{([\\w-]+)\\}/g;\n this.allowRoot = escaped;\n }\n\n genCSS(context, output) {\n if (!this.escaped) {\n output.add(this.quote, this.fileInfo(), this.getIndex());\n }\n output.add(this.value);\n if (!this.escaped) {\n output.add(this.quote);\n }\n }\n\n containsVariables() {\n return this.value.match(this.variableRegex);\n }\n\n eval(context) {\n const that = this;\n let value = this.value;\n const variableReplacement = (_, name) => {\n const v = new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v.value : v.toCSS();\n };\n const propertyReplacement = (_, name) => {\n const v = new Property(`$${name}`, that.getIndex(), that.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v.value : v.toCSS();\n };\n function iterativeReplace(value, regexp, replacementFnc) {\n let evaluatedValue = value;\n do {\n value = evaluatedValue.toString();\n evaluatedValue = value.replace(regexp, replacementFnc);\n } while (value !== evaluatedValue);\n return evaluatedValue;\n }\n value = iterativeReplace(value, this.variableRegex, variableReplacement);\n value = iterativeReplace(value, this.propRegex, propertyReplacement);\n\n return new Quoted(this.quote + value + this.quote, value, this.escaped, this.getIndex(), this.fileInfo());\n }\n\n compare(other) {\n // when comparing quoted strings allow the quote to differ\n if (other.type === 'Quoted' && !this.escaped && !other.escaped) {\n return Node.numericCompare(this.value, other.value);\n } else {\n return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n }\n }\n}\n\nQuoted.prototype.type = 'Quoted';\nexport default Quoted;\n","import Node from './node';\n\nclass URL extends Node {\n constructor(val, index, currentFileInfo, isEvald) {\n super();\n\n this.value = val;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.isEvald = isEvald;\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n genCSS(context, output) {\n output.add('url(');\n this.value.genCSS(context, output);\n output.add(')');\n }\n\n eval(context) {\n const val = this.value.eval(context);\n let rootpath;\n\n if (!this.isEvald) {\n // Add the rootpath if the URL requires a rewrite\n rootpath = this.fileInfo() && this.fileInfo().rootpath;\n if (typeof rootpath === 'string' &&\n typeof val.value === 'string' &&\n context.pathRequiresRewrite(val.value)) {\n if (!val.quote) {\n rootpath = escapePath(rootpath);\n }\n val.value = context.rewritePath(val.value, rootpath);\n } else {\n val.value = context.normalizePath(val.value);\n }\n\n // Add url args if enabled\n if (context.urlArgs) {\n if (!val.value.match(/^\\s*data:/)) {\n const delimiter = val.value.indexOf('?') === -1 ? '?' : '&';\n const urlArgs = delimiter + context.urlArgs;\n if (val.value.indexOf('#') !== -1) {\n val.value = val.value.replace('#', `${urlArgs}#`);\n } else {\n val.value += urlArgs;\n }\n }\n }\n }\n\n return new URL(val, this.getIndex(), this.fileInfo(), true);\n }\n}\n\nURL.prototype.type = 'Url';\n\nfunction escapePath(path) {\n return path.replace(/[\\(\\)'\"\\s]/g, match => `\\\\${match}`);\n}\n\nexport default URL;\n","import Ruleset from './ruleset';\nimport Value from './value';\nimport Selector from './selector';\nimport Anonymous from './anonymous';\nimport Expression from './expression';\nimport AtRule from './atrule';\nimport * as utils from '../utils';\n\nclass Media extends AtRule {\n constructor(value, features, index, currentFileInfo, visibilityInfo) {\n super();\n\n this._index = index;\n this._fileInfo = currentFileInfo;\n\n const selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors();\n\n this.features = new Value(features);\n this.rules = [new Ruleset(selectors, value)];\n this.rules[0].allowImports = true;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n this.setParent(selectors, this);\n this.setParent(this.features, this);\n this.setParent(this.rules, this);\n }\n\n isRulesetLike() {\n return true;\n }\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this.features);\n }\n if (this.rules) {\n this.rules = visitor.visitArray(this.rules);\n }\n }\n\n genCSS(context, output) {\n output.add('@media ', this._fileInfo, this._index);\n this.features.genCSS(context, output);\n this.outputRuleset(context, output, this.rules);\n }\n\n eval(context) {\n if (!context.mediaBlocks) {\n context.mediaBlocks = [];\n context.mediaPath = [];\n }\n\n const media = new Media(null, [], this._index, this._fileInfo, this.visibilityInfo());\n if (this.debugInfo) {\n this.rules[0].debugInfo = this.debugInfo;\n media.debugInfo = this.debugInfo;\n }\n \n media.features = this.features.eval(context);\n\n context.mediaPath.push(media);\n context.mediaBlocks.push(media);\n\n this.rules[0].functionRegistry = context.frames[0].functionRegistry.inherit();\n context.frames.unshift(this.rules[0]);\n media.rules = [this.rules[0].eval(context)];\n context.frames.shift();\n\n context.mediaPath.pop();\n\n return context.mediaPath.length === 0 ? media.evalTop(context) :\n media.evalNested(context);\n }\n\n evalTop(context) {\n let result = this;\n\n // Render all dependent Media blocks.\n if (context.mediaBlocks.length > 1) {\n const selectors = (new Selector([], null, null, this.getIndex(), this.fileInfo())).createEmptySelectors();\n result = new Ruleset(selectors, context.mediaBlocks);\n result.multiMedia = true;\n result.copyVisibilityInfo(this.visibilityInfo());\n this.setParent(result, this);\n }\n\n delete context.mediaBlocks;\n delete context.mediaPath;\n\n return result;\n }\n\n evalNested(context) {\n let i;\n let value;\n const path = context.mediaPath.concat([this]);\n\n // Extract the media-query conditions separated with `,` (OR).\n for (i = 0; i < path.length; i++) {\n value = path[i].features instanceof Value ?\n path[i].features.value : path[i].features;\n path[i] = Array.isArray(value) ? value : [value];\n }\n\n // Trace all permutations to generate the resulting media-query.\n //\n // (a, b and c) with nested (d, e) ->\n // a and d\n // a and e\n // b and c and d\n // b and c and e\n this.features = new Value(this.permute(path).map(path => {\n path = path.map(fragment => fragment.toCSS ? fragment : new Anonymous(fragment));\n\n for (i = path.length - 1; i > 0; i--) {\n path.splice(i, 0, new Anonymous('and'));\n }\n\n return new Expression(path);\n }));\n this.setParent(this.features, this);\n\n // Fake a tree-node that doesn't output anything.\n return new Ruleset([], []);\n }\n\n permute(arr) {\n if (arr.length === 0) {\n return [];\n } else if (arr.length === 1) {\n return arr[0];\n } else {\n const result = [];\n const rest = this.permute(arr.slice(1));\n for (let i = 0; i < rest.length; i++) {\n for (let j = 0; j < arr[0].length; j++) {\n result.push([arr[0][j]].concat(rest[i]));\n }\n }\n return result;\n }\n }\n\n bubbleSelectors(selectors) {\n if (!selectors) {\n return;\n }\n this.rules = [new Ruleset(utils.copyArray(selectors), [this.rules[0]])];\n this.setParent(this.rules, this);\n }\n}\n\nMedia.prototype.type = 'Media';\nexport default Media;\n","import Node from './node';\nimport Media from './media';\nimport URL from './url';\nimport Quoted from './quoted';\nimport Ruleset from './ruleset';\nimport Anonymous from './anonymous';\nimport * as utils from '../utils';\nimport LessError from '../less-error';\n\n//\n// CSS @import node\n//\n// The general strategy here is that we don't want to wait\n// for the parsing to be completed, before we start importing\n// the file. That's because in the context of a browser,\n// most of the time will be spent waiting for the server to respond.\n//\n// On creation, we push the import path to our import queue, though\n// `import,push`, we also pass it a callback, which it'll call once\n// the file has been fetched, and parsed.\n//\nclass Import extends Node {\n constructor(path, features, options, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.options = options;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.path = path;\n this.features = features;\n this.allowRoot = true;\n\n if (this.options.less !== undefined || this.options.inline) {\n this.css = !this.options.less || this.options.inline;\n } else {\n const pathValue = this.getPath();\n if (pathValue && /[#\\.\\&\\?]css([\\?;].*)?$/.test(pathValue)) {\n this.css = true;\n }\n }\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.features, this);\n this.setParent(this.path, this);\n }\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this.features);\n }\n this.path = visitor.visit(this.path);\n if (!this.options.isPlugin && !this.options.inline && this.root) {\n this.root = visitor.visit(this.root);\n }\n }\n\n genCSS(context, output) {\n if (this.css && this.path._fileInfo.reference === undefined) {\n output.add('@import ', this._fileInfo, this._index);\n this.path.genCSS(context, output);\n if (this.features) {\n output.add(' ');\n this.features.genCSS(context, output);\n }\n output.add(';');\n }\n }\n\n getPath() {\n return (this.path instanceof URL) ?\n this.path.value.value : this.path.value;\n }\n\n isVariableImport() {\n let path = this.path;\n if (path instanceof URL) {\n path = path.value;\n }\n if (path instanceof Quoted) {\n return path.containsVariables();\n }\n\n return true;\n }\n\n evalForImport(context) {\n let path = this.path;\n\n if (path instanceof URL) {\n path = path.value;\n }\n\n return new Import(path.eval(context), this.features, this.options, this._index, this._fileInfo, this.visibilityInfo());\n }\n\n evalPath(context) {\n const path = this.path.eval(context);\n const fileInfo = this._fileInfo;\n\n if (!(path instanceof URL)) {\n // Add the rootpath if the URL requires a rewrite\n const pathValue = path.value;\n if (fileInfo &&\n pathValue &&\n context.pathRequiresRewrite(pathValue)) {\n path.value = context.rewritePath(pathValue, fileInfo.rootpath);\n } else {\n path.value = context.normalizePath(path.value);\n }\n }\n\n return path;\n }\n\n eval(context) {\n const result = this.doEval(context);\n if (this.options.reference || this.blocksVisibility()) {\n if (result.length || result.length === 0) {\n result.forEach(node => {\n node.addVisibilityBlock();\n }\n );\n } else {\n result.addVisibilityBlock();\n }\n }\n return result;\n }\n\n doEval(context) {\n let ruleset;\n let registry;\n const features = this.features && this.features.eval(context);\n\n if (this.options.isPlugin) {\n if (this.root && this.root.eval) {\n try {\n this.root.eval(context);\n }\n catch (e) {\n e.message = 'Plugin error during evaluation';\n throw new LessError(e, this.root.imports, this.root.filename);\n }\n }\n registry = context.frames[0] && context.frames[0].functionRegistry;\n if ( registry && this.root && this.root.functions ) {\n registry.addMultiple( this.root.functions );\n }\n\n return [];\n }\n\n if (this.skip) {\n if (typeof this.skip === 'function') {\n this.skip = this.skip();\n }\n if (this.skip) {\n return [];\n }\n }\n if (this.options.inline) {\n const contents = new Anonymous(this.root, 0,\n {\n filename: this.importedFilename,\n reference: this.path._fileInfo && this.path._fileInfo.reference\n }, true, true);\n\n return this.features ? new Media([contents], this.features.value) : [contents];\n } else if (this.css) {\n const newImport = new Import(this.evalPath(context), features, this.options, this._index);\n if (!newImport.css && this.error) {\n throw this.error;\n }\n return newImport;\n } else if (this.root) {\n ruleset = new Ruleset(null, utils.copyArray(this.root.rules));\n ruleset.evalImports(context);\n\n return this.features ? new Media(ruleset.rules, this.features.value) : ruleset.rules;\n } else {\n return [];\n }\n }\n}\n\nImport.prototype.type = 'Import';\nexport default Import;\n","import Node from './node';\nimport Variable from './variable';\n\nclass JsEvalNode extends Node {\n evaluateJavaScript(expression, context) {\n let result;\n const that = this;\n const evalContext = {};\n\n if (!context.javascriptEnabled) {\n throw { message: 'Inline JavaScript is not enabled. Is it set in your options?',\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n expression = expression.replace(/@\\{([\\w-]+)\\}/g, (_, name) => that.jsify(new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context)));\n\n try {\n expression = new Function(`return (${expression})`);\n } catch (e) {\n throw { message: `JavaScript evaluation error: ${e.message} from \\`${expression}\\`` ,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n const variables = context.frames[0].variables();\n for (const k in variables) {\n if (variables.hasOwnProperty(k)) {\n /* jshint loopfunc:true */\n evalContext[k.slice(1)] = {\n value: variables[k].value,\n toJS: function () {\n return this.value.eval(context).toCSS();\n }\n };\n }\n }\n\n try {\n result = expression.call(evalContext);\n } catch (e) {\n throw { message: `JavaScript evaluation error: '${e.name}: ${e.message.replace(/[\"]/g, '\\'')}'` ,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n return result;\n }\n\n jsify(obj) {\n if (Array.isArray(obj.value) && (obj.value.length > 1)) {\n return `[${obj.value.map(v => v.toCSS()).join(', ')}]`;\n } else {\n return obj.toCSS();\n }\n }\n}\n\nexport default JsEvalNode;\n","import JsEvalNode from './js-eval-node';\nimport Dimension from './dimension';\nimport Quoted from './quoted';\nimport Anonymous from './anonymous';\n\nclass JavaScript extends JsEvalNode {\n constructor(string, escaped, index, currentFileInfo) {\n super();\n\n this.escaped = escaped;\n this.expression = string;\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n eval(context) {\n const result = this.evaluateJavaScript(this.expression, context);\n const type = typeof result;\n\n if (type === 'number' && !isNaN(result)) {\n return new Dimension(result);\n } else if (type === 'string') {\n return new Quoted(`\"${result}\"`, result, this.escaped, this._index);\n } else if (Array.isArray(result)) {\n return new Anonymous(result.join(', '));\n } else {\n return new Anonymous(result);\n }\n }\n}\n\nJavaScript.prototype.type = 'JavaScript';\nexport default JavaScript;\n","import Node from './node';\n\nclass Assignment extends Node {\n constructor(key, val) {\n super();\n\n this.key = key;\n this.value = val;\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n eval(context) {\n if (this.value.eval) {\n return new Assignment(this.key, this.value.eval(context));\n }\n return this;\n }\n\n genCSS(context, output) {\n output.add(`${this.key}=`);\n if (this.value.genCSS) {\n this.value.genCSS(context, output);\n } else {\n output.add(this.value);\n }\n }\n}\n\nAssignment.prototype.type = 'Assignment';\nexport default Assignment;\n","import Node from './node';\n\nclass Condition extends Node {\n constructor(op, l, r, i, negate) {\n super();\n\n this.op = op.trim();\n this.lvalue = l;\n this.rvalue = r;\n this._index = i;\n this.negate = negate;\n }\n\n accept(visitor) {\n this.lvalue = visitor.visit(this.lvalue);\n this.rvalue = visitor.visit(this.rvalue);\n }\n\n eval(context) {\n const result = ((op, a, b) => {\n switch (op) {\n case 'and': return a && b;\n case 'or': return a || b;\n default:\n switch (Node.compare(a, b)) {\n case -1:\n return op === '<' || op === '=<' || op === '<=';\n case 0:\n return op === '=' || op === '>=' || op === '=<' || op === '<=';\n case 1:\n return op === '>' || op === '>=';\n default:\n return false;\n }\n }\n })(this.op, this.lvalue.eval(context), this.rvalue.eval(context));\n\n return this.negate ? !result : result;\n }\n}\n\nCondition.prototype.type = 'Condition';\nexport default Condition;\n","import Node from './node';\n\nclass UnicodeDescriptor extends Node {\n constructor(value) {\n super();\n\n this.value = value;\n }\n}\n\nUnicodeDescriptor.prototype.type = 'UnicodeDescriptor';\n\nexport default UnicodeDescriptor;\n","import Node from './node';\nimport Operation from './operation';\nimport Dimension from './dimension';\n\nclass Negative extends Node {\n constructor(node) {\n super();\n\n this.value = node;\n }\n\n genCSS(context, output) {\n output.add('-');\n this.value.genCSS(context, output);\n }\n\n eval(context) {\n if (context.isMathOn()) {\n return (new Operation('*', [new Dimension(-1), this.value])).eval(context);\n }\n return new Negative(this.value.eval(context));\n }\n}\n\nNegative.prototype.type = 'Negative';\nexport default Negative;\n","import Node from './node';\nimport Selector from './selector';\n\nclass Extend extends Node {\n constructor(selector, option, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.selector = selector;\n this.option = option;\n this.object_id = Extend.next_id++;\n this.parent_ids = [this.object_id];\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n\n switch (option) {\n case 'all':\n this.allowBefore = true;\n this.allowAfter = true;\n break;\n default:\n this.allowBefore = false;\n this.allowAfter = false;\n break;\n }\n this.setParent(this.selector, this);\n }\n\n accept(visitor) {\n this.selector = visitor.visit(this.selector);\n }\n\n eval(context) {\n return new Extend(this.selector.eval(context), this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n }\n\n clone(context) {\n return new Extend(this.selector, this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n }\n\n // it concatenates (joins) all selectors in selector array\n findSelfSelectors(selectors) {\n let selfElements = [];\n let i;\n let selectorElements;\n\n for (i = 0; i < selectors.length; i++) {\n selectorElements = selectors[i].elements;\n // duplicate the logic in genCSS function inside the selector node.\n // future TODO - move both logics into the selector joiner visitor\n if (i > 0 && selectorElements.length && selectorElements[0].combinator.value === '') {\n selectorElements[0].combinator.value = ' ';\n }\n selfElements = selfElements.concat(selectors[i].elements);\n }\n\n this.selfSelectors = [new Selector(selfElements)];\n this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo());\n }\n}\n\nExtend.next_id = 0;\n\nExtend.prototype.type = 'Extend';\nexport default Extend;\n","import Node from './node';\nimport Variable from './variable';\nimport Ruleset from './ruleset';\nimport DetachedRuleset from './detached-ruleset';\nimport LessError from '../less-error';\n\nclass VariableCall extends Node {\n constructor(variable, index, currentFileInfo) {\n super();\n\n this.variable = variable;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.allowRoot = true;\n }\n\n eval(context) {\n let rules;\n let detachedRuleset = new Variable(this.variable, this.getIndex(), this.fileInfo()).eval(context);\n const error = new LessError({message: `Could not evaluate variable call ${this.variable}`});\n\n if (!detachedRuleset.ruleset) {\n if (detachedRuleset.rules) {\n rules = detachedRuleset;\n }\n else if (Array.isArray(detachedRuleset)) {\n rules = new Ruleset('', detachedRuleset);\n }\n else if (Array.isArray(detachedRuleset.value)) {\n rules = new Ruleset('', detachedRuleset.value);\n }\n else {\n throw error;\n }\n detachedRuleset = new DetachedRuleset(rules);\n }\n\n if (detachedRuleset.ruleset) {\n return detachedRuleset.callEval(context);\n }\n throw error;\n }\n}\n\nVariableCall.prototype.type = 'VariableCall';\nexport default VariableCall;\n","import Node from './node';\nimport Variable from './variable';\nimport Ruleset from './ruleset';\nimport Selector from './selector';\n\nclass NamespaceValue extends Node {\n constructor(ruleCall, lookups, index, fileInfo) {\n super();\n\n this.value = ruleCall;\n this.lookups = lookups;\n this._index = index;\n this._fileInfo = fileInfo;\n }\n\n eval(context) {\n let i;\n let j;\n let name;\n let rules = this.value.eval(context);\n\n for (i = 0; i < this.lookups.length; i++) {\n name = this.lookups[i];\n\n /**\n * Eval'd DRs return rulesets.\n * Eval'd mixins return rules, so let's make a ruleset if we need it.\n * We need to do this because of late parsing of values\n */\n if (Array.isArray(rules)) {\n rules = new Ruleset([new Selector()], rules);\n }\n\n if (name === '') {\n rules = rules.lastDeclaration();\n }\n else if (name.charAt(0) === '@') {\n if (name.charAt(1) === '@') {\n name = `@${new Variable(name.substr(1)).eval(context).value}`;\n }\n if (rules.variables) {\n rules = rules.variable(name);\n }\n \n if (!rules) {\n throw { type: 'Name',\n message: `variable ${name} not found`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n }\n else {\n if (name.substring(0, 2) === '$@') {\n name = `$${new Variable(name.substr(1)).eval(context).value}`;\n }\n else {\n name = name.charAt(0) === '$' ? name : `$${name}`;\n }\n if (rules.properties) {\n rules = rules.property(name);\n }\n \n if (!rules) {\n throw { type: 'Name',\n message: `property \"${name.substr(1)}\" not found`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n // Properties are an array of values, since a ruleset can have multiple props.\n // We pick the last one (the \"cascaded\" value)\n rules = rules[rules.length - 1];\n }\n\n if (rules.value) {\n rules = rules.eval(context).value;\n }\n if (rules.ruleset) {\n rules = rules.ruleset.eval(context);\n }\n }\n return rules;\n }\n}\n\nNamespaceValue.prototype.type = 'NamespaceValue';\nexport default NamespaceValue;\n","import Selector from './selector';\nimport Element from './element';\nimport Ruleset from './ruleset';\nimport Declaration from './declaration';\nimport DetachedRuleset from './detached-ruleset';\nimport Expression from './expression';\nimport contexts from '../contexts';\nimport * as utils from '../utils';\n\nclass Definition extends Ruleset {\n constructor(name, params, rules, condition, variadic, frames, visibilityInfo) {\n super();\n\n this.name = name || 'anonymous mixin';\n this.selectors = [new Selector([new Element(null, name, false, this._index, this._fileInfo)])];\n this.params = params;\n this.condition = condition;\n this.variadic = variadic;\n this.arity = params.length;\n this.rules = rules;\n this._lookups = {};\n const optionalParameters = [];\n this.required = params.reduce((count, p) => {\n if (!p.name || (p.name && !p.value)) {\n return count + 1;\n }\n else {\n optionalParameters.push(p.name);\n return count;\n }\n }, 0);\n this.optionalParameters = optionalParameters;\n this.frames = frames;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n }\n\n accept(visitor) {\n if (this.params && this.params.length) {\n this.params = visitor.visitArray(this.params);\n }\n this.rules = visitor.visitArray(this.rules);\n if (this.condition) {\n this.condition = visitor.visit(this.condition);\n }\n }\n\n evalParams(context, mixinEnv, args, evaldArguments) {\n /* jshint boss:true */\n const frame = new Ruleset(null, null);\n\n let varargs;\n let arg;\n const params = utils.copyArray(this.params);\n let i;\n let j;\n let val;\n let name;\n let isNamedFound;\n let argIndex;\n let argsLength = 0;\n\n if (mixinEnv.frames && mixinEnv.frames[0] && mixinEnv.frames[0].functionRegistry) {\n frame.functionRegistry = mixinEnv.frames[0].functionRegistry.inherit();\n }\n mixinEnv = new contexts.Eval(mixinEnv, [frame].concat(mixinEnv.frames));\n\n if (args) {\n args = utils.copyArray(args);\n argsLength = args.length;\n\n for (i = 0; i < argsLength; i++) {\n arg = args[i];\n if (name = (arg && arg.name)) {\n isNamedFound = false;\n for (j = 0; j < params.length; j++) {\n if (!evaldArguments[j] && name === params[j].name) {\n evaldArguments[j] = arg.value.eval(context);\n frame.prependRule(new Declaration(name, arg.value.eval(context)));\n isNamedFound = true;\n break;\n }\n }\n if (isNamedFound) {\n args.splice(i, 1);\n i--;\n continue;\n } else {\n throw { type: 'Runtime', message: `Named argument for ${this.name} ${args[i].name} not found` };\n }\n }\n }\n }\n argIndex = 0;\n for (i = 0; i < params.length; i++) {\n if (evaldArguments[i]) { continue; }\n\n arg = args && args[argIndex];\n\n if (name = params[i].name) {\n if (params[i].variadic) {\n varargs = [];\n for (j = argIndex; j < argsLength; j++) {\n varargs.push(args[j].value.eval(context));\n }\n frame.prependRule(new Declaration(name, new Expression(varargs).eval(context)));\n } else {\n val = arg && arg.value;\n if (val) {\n // This was a mixin call, pass in a detached ruleset of it's eval'd rules\n if (Array.isArray(val)) {\n val = new DetachedRuleset(new Ruleset('', val));\n }\n else {\n val = val.eval(context);\n }\n } else if (params[i].value) {\n val = params[i].value.eval(mixinEnv);\n frame.resetCache();\n } else {\n throw { type: 'Runtime', message: `wrong number of arguments for ${this.name} (${argsLength} for ${this.arity})` };\n }\n\n frame.prependRule(new Declaration(name, val));\n evaldArguments[i] = val;\n }\n }\n\n if (params[i].variadic && args) {\n for (j = argIndex; j < argsLength; j++) {\n evaldArguments[j] = args[j].value.eval(context);\n }\n }\n argIndex++;\n }\n\n return frame;\n }\n\n makeImportant() {\n const rules = !this.rules ? this.rules : this.rules.map(r => {\n if (r.makeImportant) {\n return r.makeImportant(true);\n } else {\n return r;\n }\n });\n const result = new Definition(this.name, this.params, rules, this.condition, this.variadic, this.frames);\n return result;\n }\n\n eval(context) {\n return new Definition(this.name, this.params, this.rules, this.condition, this.variadic, this.frames || utils.copyArray(context.frames));\n }\n\n evalCall(context, args, important) {\n const _arguments = [];\n const mixinFrames = this.frames ? this.frames.concat(context.frames) : context.frames;\n const frame = this.evalParams(context, new contexts.Eval(context, mixinFrames), args, _arguments);\n let rules;\n let ruleset;\n\n frame.prependRule(new Declaration('@arguments', new Expression(_arguments).eval(context)));\n\n rules = utils.copyArray(this.rules);\n\n ruleset = new Ruleset(null, rules);\n ruleset.originalRuleset = this;\n ruleset = ruleset.eval(new contexts.Eval(context, [this, frame].concat(mixinFrames)));\n if (important) {\n ruleset = ruleset.makeImportant();\n }\n return ruleset;\n }\n\n matchCondition(args, context) {\n if (this.condition && !this.condition.eval(\n new contexts.Eval(context,\n [this.evalParams(context, /* the parameter variables */\n new contexts.Eval(context, this.frames ? this.frames.concat(context.frames) : context.frames), args, [])]\n .concat(this.frames || []) // the parent namespace/mixin frames\n .concat(context.frames)))) { // the current environment frames\n return false;\n }\n return true;\n }\n\n matchArgs(args, context) {\n const allArgsCnt = (args && args.length) || 0;\n let len;\n const optionalParameters = this.optionalParameters;\n const requiredArgsCnt = !args ? 0 : args.reduce((count, p) => {\n if (optionalParameters.indexOf(p.name) < 0) {\n return count + 1;\n } else {\n return count;\n }\n }, 0);\n\n if (!this.variadic) {\n if (requiredArgsCnt < this.required) {\n return false;\n }\n if (allArgsCnt > this.params.length) {\n return false;\n }\n } else {\n if (requiredArgsCnt < (this.required - 1)) {\n return false;\n }\n }\n\n // check patterns\n len = Math.min(requiredArgsCnt, this.arity);\n\n for (let i = 0; i < len; i++) {\n if (!this.params[i].name && !this.params[i].variadic) {\n if (args[i].value.eval(context).toCSS() != this.params[i].value.eval(context).toCSS()) {\n return false;\n }\n }\n }\n return true;\n }\n}\n\nDefinition.prototype.type = 'MixinDefinition';\nDefinition.prototype.evalFirst = true;\nexport default Definition;\n","import Node from './node';\nimport Selector from './selector';\nimport MixinDefinition from './mixin-definition';\nimport defaultFunc from '../functions/default';\n\nclass MixinCall extends Node {\n constructor(elements, args, index, currentFileInfo, important) {\n super();\n\n this.selector = new Selector(elements);\n this.arguments = args || [];\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.important = important;\n this.allowRoot = true;\n this.setParent(this.selector, this);\n }\n\n accept(visitor) {\n if (this.selector) {\n this.selector = visitor.visit(this.selector);\n }\n if (this.arguments.length) {\n this.arguments = visitor.visitArray(this.arguments);\n }\n }\n\n eval(context) {\n let mixins;\n let mixin;\n let mixinPath;\n const args = [];\n let arg;\n let argValue;\n const rules = [];\n let match = false;\n let i;\n let m;\n let f;\n let isRecursive;\n let isOneFound;\n const candidates = [];\n let candidate;\n const conditionResult = [];\n let defaultResult;\n const defFalseEitherCase = -1;\n const defNone = 0;\n const defTrue = 1;\n const defFalse = 2;\n let count;\n let originalRuleset;\n let noArgumentsFilter;\n\n this.selector = this.selector.eval(context);\n\n function calcDefGroup(mixin, mixinPath) {\n let f;\n let p;\n let namespace;\n\n for (f = 0; f < 2; f++) {\n conditionResult[f] = true;\n defaultFunc.value(f);\n for (p = 0; p < mixinPath.length && conditionResult[f]; p++) {\n namespace = mixinPath[p];\n if (namespace.matchCondition) {\n conditionResult[f] = conditionResult[f] && namespace.matchCondition(null, context);\n }\n }\n if (mixin.matchCondition) {\n conditionResult[f] = conditionResult[f] && mixin.matchCondition(args, context);\n }\n }\n if (conditionResult[0] || conditionResult[1]) {\n if (conditionResult[0] != conditionResult[1]) {\n return conditionResult[1] ?\n defTrue : defFalse;\n }\n\n return defNone;\n }\n return defFalseEitherCase;\n }\n\n for (i = 0; i < this.arguments.length; i++) {\n arg = this.arguments[i];\n argValue = arg.value.eval(context);\n if (arg.expand && Array.isArray(argValue.value)) {\n argValue = argValue.value;\n for (m = 0; m < argValue.length; m++) {\n args.push({value: argValue[m]});\n }\n } else {\n args.push({name: arg.name, value: argValue});\n }\n }\n\n noArgumentsFilter = rule => rule.matchArgs(null, context);\n\n for (i = 0; i < context.frames.length; i++) {\n if ((mixins = context.frames[i].find(this.selector, null, noArgumentsFilter)).length > 0) {\n isOneFound = true;\n\n // To make `default()` function independent of definition order we have two \"subpasses\" here.\n // At first we evaluate each guard *twice* (with `default() == true` and `default() == false`),\n // and build candidate list with corresponding flags. Then, when we know all possible matches,\n // we make a final decision.\n\n for (m = 0; m < mixins.length; m++) {\n mixin = mixins[m].rule;\n mixinPath = mixins[m].path;\n isRecursive = false;\n for (f = 0; f < context.frames.length; f++) {\n if ((!(mixin instanceof MixinDefinition)) && mixin === (context.frames[f].originalRuleset || context.frames[f])) {\n isRecursive = true;\n break;\n }\n }\n if (isRecursive) {\n continue;\n }\n\n if (mixin.matchArgs(args, context)) {\n candidate = {mixin, group: calcDefGroup(mixin, mixinPath)};\n\n if (candidate.group !== defFalseEitherCase) {\n candidates.push(candidate);\n }\n\n match = true;\n }\n }\n\n defaultFunc.reset();\n\n count = [0, 0, 0];\n for (m = 0; m < candidates.length; m++) {\n count[candidates[m].group]++;\n }\n\n if (count[defNone] > 0) {\n defaultResult = defFalse;\n } else {\n defaultResult = defTrue;\n if ((count[defTrue] + count[defFalse]) > 1) {\n throw { type: 'Runtime',\n message: `Ambiguous use of \\`default()\\` found when matching for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n }\n\n for (m = 0; m < candidates.length; m++) {\n candidate = candidates[m].group;\n if ((candidate === defNone) || (candidate === defaultResult)) {\n try {\n mixin = candidates[m].mixin;\n if (!(mixin instanceof MixinDefinition)) {\n originalRuleset = mixin.originalRuleset || mixin;\n mixin = new MixinDefinition('', [], mixin.rules, null, false, null, originalRuleset.visibilityInfo());\n mixin.originalRuleset = originalRuleset;\n }\n const newRules = mixin.evalCall(context, args, this.important).rules;\n this._setVisibilityToReplacement(newRules);\n Array.prototype.push.apply(rules, newRules);\n } catch (e) {\n throw { message: e.message, index: this.getIndex(), filename: this.fileInfo().filename, stack: e.stack };\n }\n }\n }\n\n if (match) {\n return rules;\n }\n }\n }\n if (isOneFound) {\n throw { type: 'Runtime',\n message: `No matching definition was found for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n } else {\n throw { type: 'Name',\n message: `${this.selector.toCSS().trim()} is undefined`,\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n }\n\n _setVisibilityToReplacement(replacement) {\n let i;\n let rule;\n if (this.blocksVisibility()) {\n for (i = 0; i < replacement.length; i++) {\n rule = replacement[i];\n rule.addVisibilityBlock();\n }\n }\n }\n\n format(args) {\n return `${this.selector.toCSS().trim()}(${args ? args.map(a => {\n let argValue = '';\n if (a.name) {\n argValue += `${a.name}:`;\n }\n if (a.value.toCSS) {\n argValue += a.value.toCSS();\n } else {\n argValue += '???';\n }\n return argValue;\n }).join(', ') : ''})`;\n }\n}\n\nMixinCall.prototype.type = 'MixinCall';\nexport default MixinCall;\n","const tree = Object.create(null);\n\nimport Node from './node';\nimport Color from './color';\nimport AtRule from './atrule';\nimport DetachedRuleset from './detached-ruleset';\nimport Operation from './operation';\nimport Dimension from './dimension';\nimport Unit from './unit';\nimport Keyword from './keyword';\nimport Variable from './variable';\nimport Property from './property';\nimport Ruleset from './ruleset';\nimport Element from './element';\nimport Attribute from './attribute';\nimport Combinator from './combinator';\nimport Selector from './selector';\nimport Quoted from './quoted';\nimport Expression from './expression';\nimport Declaration from './declaration';\nimport Call from './call';\nimport URL from './url';\nimport Import from './import';\nimport Comment from './comment';\nimport Anonymous from './anonymous';\nimport Value from './value';\nimport JavaScript from './javascript';\nimport Assignment from './assignment';\nimport Condition from './condition';\nimport Paren from './paren';\nimport Media from './media';\nimport UnicodeDescriptor from './unicode-descriptor';\nimport Negative from './negative';\nimport Extend from './extend';\nimport VariableCall from './variable-call';\nimport NamespaceValue from './namespace-value';\n\n// mixins\nimport MixinCall from './mixin-call';\nimport MixinDefinition from './mixin-definition';\n\nexport default {\n Node, Color, AtRule, DetachedRuleset, Operation,\n Dimension, Unit, Keyword, Variable, Property,\n Ruleset, Element, Attribute, Combinator, Selector,\n Quoted, Expression, Declaration, Call, URL, Import,\n Comment, Anonymous, Value, JavaScript, Assignment,\n Condition, Paren, Media, UnicodeDescriptor, Negative,\n Extend, VariableCall, NamespaceValue,\n mixin: {\n Call: MixinCall,\n Definition: MixinDefinition\n }\n};","export default {\n error: function(msg) {\n this._fireEvent('error', msg);\n },\n warn: function(msg) {\n this._fireEvent('warn', msg);\n },\n info: function(msg) {\n this._fireEvent('info', msg);\n },\n debug: function(msg) {\n this._fireEvent('debug', msg);\n },\n addListener: function(listener) {\n this._listeners.push(listener);\n },\n removeListener: function(listener) {\n for (let i = 0; i < this._listeners.length; i++) {\n if (this._listeners[i] === listener) {\n this._listeners.splice(i, 1);\n return;\n }\n }\n },\n _fireEvent: function(type, msg) {\n for (let i = 0; i < this._listeners.length; i++) {\n const logFunction = this._listeners[i][type];\n if (logFunction) {\n logFunction(msg);\n }\n }\n },\n _listeners: []\n};\n","/**\n * @todo Document why this abstraction exists, and the relationship between\n * environment, file managers, and plugin manager\n */\n\nimport logger from '../logger';\n\nclass environment {\n constructor(externalEnvironment, fileManagers) {\n this.fileManagers = fileManagers || [];\n externalEnvironment = externalEnvironment || {};\n\n const optionalFunctions = ['encodeBase64', 'mimeLookup', 'charsetLookup', 'getSourceMapGenerator'];\n const requiredFunctions = [];\n const functions = requiredFunctions.concat(optionalFunctions);\n\n for (let i = 0; i < functions.length; i++) {\n const propName = functions[i];\n const environmentFunc = externalEnvironment[propName];\n if (environmentFunc) {\n this[propName] = environmentFunc.bind(externalEnvironment);\n } else if (i < requiredFunctions.length) {\n this.warn(`missing required function in environment - ${propName}`);\n }\n }\n }\n\n getFileManager(filename, currentDirectory, options, environment, isSync) {\n\n if (!filename) {\n logger.warn('getFileManager called with no filename.. Please report this issue. continuing.');\n }\n if (currentDirectory == null) {\n logger.warn('getFileManager called with null directory.. Please report this issue. continuing.');\n }\n\n let fileManagers = this.fileManagers;\n if (options.pluginManager) {\n fileManagers = [].concat(fileManagers).concat(options.pluginManager.getFileManagers());\n }\n for (let i = fileManagers.length - 1; i >= 0 ; i--) {\n const fileManager = fileManagers[i];\n if (fileManager[isSync ? 'supportsSync' : 'supports'](filename, currentDirectory, options, environment)) {\n return fileManager;\n }\n }\n return null;\n }\n\n addFileManager(fileManager) {\n this.fileManagers.push(fileManager);\n }\n\n clearFileManagers() {\n this.fileManagers = [];\n }\n}\n\nexport default environment;\n","class AbstractFileManager {\n getPath(filename) {\n let j = filename.lastIndexOf('?');\n if (j > 0) {\n filename = filename.slice(0, j);\n }\n j = filename.lastIndexOf('/');\n if (j < 0) {\n j = filename.lastIndexOf('\\\\');\n }\n if (j < 0) {\n return '';\n }\n return filename.slice(0, j + 1);\n }\n\n tryAppendExtension(path, ext) {\n return /(\\.[a-z]*$)|([\\?;].*)$/.test(path) ? path : path + ext;\n }\n\n tryAppendLessExtension(path) {\n return this.tryAppendExtension(path, '.less');\n };\n\n supportsSync() { return false; }\n\n alwaysMakePathsAbsolute() { return false; }\n\n isPathAbsolute(filename) {\n return (/^(?:[a-z-]+:|\\/|\\\\|#)/i).test(filename);\n }\n // TODO: pull out / replace?\n join(basePath, laterPath) {\n if (!basePath) {\n return laterPath;\n }\n return basePath + laterPath;\n };\n\n pathDiff(url, baseUrl) {\n // diff between two paths to create a relative path\n const urlParts = this.extractUrlParts(url);\n const baseUrlParts = this.extractUrlParts(baseUrl);\n\n let i;\n let max;\n let urlDirectories;\n let baseUrlDirectories;\n let diff = '';\n if (urlParts.hostPart !== baseUrlParts.hostPart) {\n return '';\n }\n max = Math.max(baseUrlParts.directories.length, urlParts.directories.length);\n for (i = 0; i < max; i++) {\n if (baseUrlParts.directories[i] !== urlParts.directories[i]) { break; }\n }\n baseUrlDirectories = baseUrlParts.directories.slice(i);\n urlDirectories = urlParts.directories.slice(i);\n for (i = 0; i < baseUrlDirectories.length - 1; i++) {\n diff += '../';\n }\n for (i = 0; i < urlDirectories.length - 1; i++) {\n diff += `${urlDirectories[i]}/`;\n }\n return diff;\n };\n // helper function, not part of API\n extractUrlParts(url, baseUrl) {\n // urlParts[1] = protocol://hostname/ OR /\n // urlParts[2] = / if path relative to host base\n // urlParts[3] = directories\n // urlParts[4] = filename\n // urlParts[5] = parameters\n\n const urlPartsRegex = /^((?:[a-z-]+:)?\\/{2}(?:[^\\/\\?#]*\\/)|([\\/\\\\]))?((?:[^\\/\\\\\\?#]*[\\/\\\\])*)([^\\/\\\\\\?#]*)([#\\?].*)?$/i;\n\n const urlParts = url.match(urlPartsRegex);\n const returner = {};\n let rawDirectories = [];\n const directories = [];\n let i;\n let baseUrlParts;\n\n if (!urlParts) {\n throw new Error(`Could not parse sheet href - '${url}'`);\n }\n\n // Stylesheets in IE don't always return the full path\n if (baseUrl && (!urlParts[1] || urlParts[2])) {\n baseUrlParts = baseUrl.match(urlPartsRegex);\n if (!baseUrlParts) {\n throw new Error(`Could not parse page url - '${baseUrl}'`);\n }\n urlParts[1] = urlParts[1] || baseUrlParts[1] || '';\n if (!urlParts[2]) {\n urlParts[3] = baseUrlParts[3] + urlParts[3];\n }\n }\n\n if (urlParts[3]) {\n rawDirectories = urlParts[3].replace(/\\\\/g, '/').split('/');\n\n // collapse '..' and skip '.'\n for (i = 0; i < rawDirectories.length; i++) {\n\n if (rawDirectories[i] === '..') {\n directories.pop();\n }\n else if (rawDirectories[i] !== '.') {\n directories.push(rawDirectories[i]);\n }\n \n }\n }\n\n returner.hostPart = urlParts[1];\n returner.directories = directories;\n returner.rawPath = (urlParts[1] || '') + rawDirectories.join('/');\n returner.path = (urlParts[1] || '') + directories.join('/');\n returner.filename = urlParts[4];\n returner.fileUrl = returner.path + (urlParts[4] || '');\n returner.url = returner.fileUrl + (urlParts[5] || '');\n return returner;\n };\n}\n\nexport default AbstractFileManager;","import functionRegistry from '../functions/function-registry';\nimport LessError from '../less-error';\n\nclass AbstractPluginLoader {\n constructor() {\n // Implemented by Node.js plugin loader\n this.require = () => null\n }\n\n evalPlugin(contents, context, imports, pluginOptions, fileInfo) {\n let loader;\n let registry;\n let pluginObj;\n let localModule;\n let pluginManager;\n let filename;\n let result;\n\n pluginManager = context.pluginManager;\n\n if (fileInfo) {\n if (typeof fileInfo === 'string') {\n filename = fileInfo;\n }\n else {\n filename = fileInfo.filename;\n }\n }\n const shortname = (new this.less.FileManager()).extractUrlParts(filename).filename;\n\n if (filename) {\n pluginObj = pluginManager.get(filename);\n\n if (pluginObj) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imports, filename);\n }\n return pluginObj;\n }\n }\n localModule = {\n exports: {},\n pluginManager,\n fileInfo\n };\n registry = functionRegistry.create();\n\n const registerPlugin = obj => {\n pluginObj = obj;\n };\n\n try {\n loader = new Function('module', 'require', 'registerPlugin', 'functions', 'tree', 'less', 'fileInfo', contents);\n loader(localModule, this.require(filename), registerPlugin, registry, this.less.tree, this.less, fileInfo);\n }\n catch (e) {\n return new LessError(e, imports, filename);\n }\n\n if (!pluginObj) {\n pluginObj = localModule.exports;\n }\n pluginObj = this.validatePlugin(pluginObj, filename, shortname);\n\n if (pluginObj instanceof LessError) {\n return pluginObj;\n }\n\n if (pluginObj) {\n pluginObj.imports = imports;\n pluginObj.filename = filename;\n\n // For < 3.x (or unspecified minVersion) - setOptions() before install()\n if (!pluginObj.minVersion || this.compareVersion('3.0.0', pluginObj.minVersion) < 0) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n\n if (result) {\n return result;\n }\n }\n\n // Run on first load\n pluginManager.addPlugin(pluginObj, fileInfo.filename, registry);\n pluginObj.functions = registry.getLocalFunctions();\n\n // Need to call setOptions again because the pluginObj might have functions\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n\n // Run every @plugin call\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imports, filename);\n }\n\n }\n else {\n return new LessError({ message: 'Not a valid plugin' }, imports, filename);\n }\n\n return pluginObj;\n }\n\n trySetOptions(plugin, filename, name, options) {\n if (options && !plugin.setOptions) {\n return new LessError({\n message: `Options have been provided but the plugin ${name} does not support any options.`\n });\n }\n try {\n plugin.setOptions && plugin.setOptions(options);\n }\n catch (e) {\n return new LessError(e);\n }\n }\n\n validatePlugin(plugin, filename, name) {\n if (plugin) {\n // support plugins being a function\n // so that the plugin can be more usable programmatically\n if (typeof plugin === 'function') {\n plugin = new plugin();\n }\n\n if (plugin.minVersion) {\n if (this.compareVersion(plugin.minVersion, this.less.version) < 0) {\n return new LessError({\n message: `Plugin ${name} requires version ${this.versionToString(plugin.minVersion)}`\n });\n }\n }\n return plugin;\n }\n return null;\n }\n\n compareVersion(aVersion, bVersion) {\n if (typeof aVersion === 'string') {\n aVersion = aVersion.match(/^(\\d+)\\.?(\\d+)?\\.?(\\d+)?/);\n aVersion.shift();\n }\n for (let i = 0; i < aVersion.length; i++) {\n if (aVersion[i] !== bVersion[i]) {\n return parseInt(aVersion[i]) > parseInt(bVersion[i]) ? -1 : 1;\n }\n }\n return 0;\n }\n\n versionToString(version) {\n let versionString = '';\n for (let i = 0; i < version.length; i++) {\n versionString += (versionString ? '.' : '') + version[i];\n }\n return versionString;\n }\n\n printUsage(plugins) {\n for (let i = 0; i < plugins.length; i++) {\n const plugin = plugins[i];\n if (plugin.printUsage) {\n plugin.printUsage();\n }\n }\n }\n}\n\nexport default AbstractPluginLoader;\n\n","import tree from '../tree';\nconst _visitArgs = { visitDeeper: true };\nlet _hasIndexed = false;\n\nfunction _noop(node) {\n return node;\n}\n\nfunction indexNodeTypes(parent, ticker) {\n // add .typeIndex to tree node types for lookup table\n let key;\n\n let child;\n for (key in parent) { \n /* eslint guard-for-in: 0 */\n child = parent[key];\n switch (typeof child) {\n case 'function':\n // ignore bound functions directly on tree which do not have a prototype\n // or aren't nodes\n if (child.prototype && child.prototype.type) {\n child.prototype.typeIndex = ticker++;\n }\n break;\n case 'object':\n ticker = indexNodeTypes(child, ticker);\n break;\n \n }\n }\n return ticker;\n}\n\nclass Visitor {\n constructor(implementation) {\n this._implementation = implementation;\n this._visitInCache = {};\n this._visitOutCache = {};\n\n if (!_hasIndexed) {\n indexNodeTypes(tree, 1);\n _hasIndexed = true;\n }\n }\n\n visit(node) {\n if (!node) {\n return node;\n }\n\n const nodeTypeIndex = node.typeIndex;\n if (!nodeTypeIndex) {\n // MixinCall args aren't a node type?\n if (node.value && node.value.typeIndex) {\n this.visit(node.value);\n }\n return node;\n }\n\n const impl = this._implementation;\n let func = this._visitInCache[nodeTypeIndex];\n let funcOut = this._visitOutCache[nodeTypeIndex];\n const visitArgs = _visitArgs;\n let fnName;\n\n visitArgs.visitDeeper = true;\n\n if (!func) {\n fnName = `visit${node.type}`;\n func = impl[fnName] || _noop;\n funcOut = impl[`${fnName}Out`] || _noop;\n this._visitInCache[nodeTypeIndex] = func;\n this._visitOutCache[nodeTypeIndex] = funcOut;\n }\n\n if (func !== _noop) {\n const newNode = func.call(impl, node, visitArgs);\n if (node && impl.isReplacing) {\n node = newNode;\n }\n }\n\n if (visitArgs.visitDeeper && node) {\n if (node.length) {\n for (var i = 0, cnt = node.length; i < cnt; i++) {\n if (node[i].accept) {\n node[i].accept(this);\n }\n }\n } else if (node.accept) {\n node.accept(this);\n }\n }\n\n if (funcOut != _noop) {\n funcOut.call(impl, node);\n }\n\n return node;\n }\n\n visitArray(nodes, nonReplacing) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.length;\n let i;\n\n // Non-replacing\n if (nonReplacing || !this._implementation.isReplacing) {\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n // Replacing\n const out = [];\n for (i = 0; i < cnt; i++) {\n const evald = this.visit(nodes[i]);\n if (evald === undefined) { continue; }\n if (!evald.splice) {\n out.push(evald);\n } else if (evald.length) {\n this.flatten(evald, out);\n }\n }\n return out;\n }\n\n flatten(arr, out) {\n if (!out) {\n out = [];\n }\n\n let cnt;\n let i;\n let item;\n let nestedCnt;\n let j;\n let nestedItem;\n\n for (i = 0, cnt = arr.length; i < cnt; i++) {\n item = arr[i];\n if (item === undefined) {\n continue;\n }\n if (!item.splice) {\n out.push(item);\n continue;\n }\n\n for (j = 0, nestedCnt = item.length; j < nestedCnt; j++) {\n nestedItem = item[j];\n if (nestedItem === undefined) {\n continue;\n }\n if (!nestedItem.splice) {\n out.push(nestedItem);\n } else if (nestedItem.length) {\n this.flatten(nestedItem, out);\n }\n }\n }\n\n return out;\n }\n}\n\nexport default Visitor;\n","class ImportSequencer {\n constructor(onSequencerEmpty) {\n this.imports = [];\n this.variableImports = [];\n this._onSequencerEmpty = onSequencerEmpty;\n this._currentDepth = 0;\n }\n\n addImport(callback) {\n const importSequencer = this;\n\n const importItem = {\n callback,\n args: null,\n isReady: false\n };\n\n this.imports.push(importItem);\n return function(...args) {\n importItem.args = Array.prototype.slice.call(args, 0);\n importItem.isReady = true;\n importSequencer.tryRun();\n };\n }\n\n addVariableImport(callback) {\n this.variableImports.push(callback);\n }\n\n tryRun() {\n this._currentDepth++;\n try {\n while (true) {\n while (this.imports.length > 0) {\n const importItem = this.imports[0];\n if (!importItem.isReady) {\n return;\n }\n this.imports = this.imports.slice(1);\n importItem.callback.apply(null, importItem.args);\n }\n if (this.variableImports.length === 0) {\n break;\n }\n const variableImport = this.variableImports[0];\n this.variableImports = this.variableImports.slice(1);\n variableImport();\n }\n } finally {\n this._currentDepth--;\n }\n if (this._currentDepth === 0 && this._onSequencerEmpty) {\n this._onSequencerEmpty();\n }\n }\n}\n\nexport default ImportSequencer;\n","import contexts from '../contexts';\nimport Visitor from './visitor';\nimport ImportSequencer from './import-sequencer';\nimport * as utils from '../utils';\n\nconst ImportVisitor = function(importer, finish) {\n\n this._visitor = new Visitor(this);\n this._importer = importer;\n this._finish = finish;\n this.context = new contexts.Eval();\n this.importCount = 0;\n this.onceFileDetectionMap = {};\n this.recursionDetector = {};\n this._sequencer = new ImportSequencer(this._onSequencerEmpty.bind(this));\n};\n\nImportVisitor.prototype = {\n isReplacing: false,\n run: function (root) {\n try {\n // process the contents\n this._visitor.visit(root);\n }\n catch (e) {\n this.error = e;\n }\n\n this.isFinished = true;\n this._sequencer.tryRun();\n },\n _onSequencerEmpty: function() {\n if (!this.isFinished) {\n return;\n }\n this._finish(this.error);\n },\n visitImport: function (importNode, visitArgs) {\n const inlineCSS = importNode.options.inline;\n\n if (!importNode.css || inlineCSS) {\n\n const context = new contexts.Eval(this.context, utils.copyArray(this.context.frames));\n const importParent = context.frames[0];\n\n this.importCount++;\n if (importNode.isVariableImport()) {\n this._sequencer.addVariableImport(this.processImportNode.bind(this, importNode, context, importParent));\n } else {\n this.processImportNode(importNode, context, importParent);\n }\n }\n visitArgs.visitDeeper = false;\n },\n processImportNode: function(importNode, context, importParent) {\n let evaldImportNode;\n const inlineCSS = importNode.options.inline;\n\n try {\n evaldImportNode = importNode.evalForImport(context);\n } catch (e) {\n if (!e.filename) { e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename; }\n // attempt to eval properly and treat as css\n importNode.css = true;\n // if that fails, this error will be thrown\n importNode.error = e;\n }\n\n if (evaldImportNode && (!evaldImportNode.css || inlineCSS)) {\n if (evaldImportNode.options.multiple) {\n context.importMultiple = true;\n }\n\n // try appending if we haven't determined if it is css or not\n const tryAppendLessExtension = evaldImportNode.css === undefined;\n\n for (let i = 0; i < importParent.rules.length; i++) {\n if (importParent.rules[i] === importNode) {\n importParent.rules[i] = evaldImportNode;\n break;\n }\n }\n\n const onImported = this.onImported.bind(this, evaldImportNode, context);\n const sequencedOnImported = this._sequencer.addImport(onImported);\n\n this._importer.push(evaldImportNode.getPath(), tryAppendLessExtension, evaldImportNode.fileInfo(),\n evaldImportNode.options, sequencedOnImported);\n } else {\n this.importCount--;\n if (this.isFinished) {\n this._sequencer.tryRun();\n }\n }\n },\n onImported: function (importNode, context, e, root, importedAtRoot, fullPath) {\n if (e) {\n if (!e.filename) {\n e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename;\n }\n this.error = e;\n }\n\n const importVisitor = this;\n const inlineCSS = importNode.options.inline;\n const isPlugin = importNode.options.isPlugin;\n const isOptional = importNode.options.optional;\n const duplicateImport = importedAtRoot || fullPath in importVisitor.recursionDetector;\n\n if (!context.importMultiple) {\n if (duplicateImport) {\n importNode.skip = true;\n } else {\n importNode.skip = () => {\n if (fullPath in importVisitor.onceFileDetectionMap) {\n return true;\n }\n importVisitor.onceFileDetectionMap[fullPath] = true;\n return false;\n };\n }\n }\n\n if (!fullPath && isOptional) {\n importNode.skip = true;\n }\n\n if (root) {\n importNode.root = root;\n importNode.importedFilename = fullPath;\n\n if (!inlineCSS && !isPlugin && (context.importMultiple || !duplicateImport)) {\n importVisitor.recursionDetector[fullPath] = true;\n\n const oldContext = this.context;\n this.context = context;\n try {\n this._visitor.visit(root);\n } catch (e) {\n this.error = e;\n }\n this.context = oldContext;\n }\n }\n\n importVisitor.importCount--;\n\n if (importVisitor.isFinished) {\n importVisitor._sequencer.tryRun();\n }\n },\n visitDeclaration: function (declNode, visitArgs) {\n if (declNode.value.type === 'DetachedRuleset') {\n this.context.frames.unshift(declNode);\n } else {\n visitArgs.visitDeeper = false;\n }\n },\n visitDeclarationOut: function(declNode) {\n if (declNode.value.type === 'DetachedRuleset') {\n this.context.frames.shift();\n }\n },\n visitAtRule: function (atRuleNode, visitArgs) {\n this.context.frames.unshift(atRuleNode);\n },\n visitAtRuleOut: function (atRuleNode) {\n this.context.frames.shift();\n },\n visitMixinDefinition: function (mixinDefinitionNode, visitArgs) {\n this.context.frames.unshift(mixinDefinitionNode);\n },\n visitMixinDefinitionOut: function (mixinDefinitionNode) {\n this.context.frames.shift();\n },\n visitRuleset: function (rulesetNode, visitArgs) {\n this.context.frames.unshift(rulesetNode);\n },\n visitRulesetOut: function (rulesetNode) {\n this.context.frames.shift();\n },\n visitMedia: function (mediaNode, visitArgs) {\n this.context.frames.unshift(mediaNode.rules[0]);\n },\n visitMediaOut: function (mediaNode) {\n this.context.frames.shift();\n }\n};\nexport default ImportVisitor;\n","class SetTreeVisibilityVisitor {\n constructor(visible) {\n this.visible = visible;\n }\n\n run(root) {\n this.visit(root);\n }\n\n visitArray(nodes) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.length;\n let i;\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n visit(node) {\n if (!node) {\n return node;\n }\n if (node.constructor === Array) {\n return this.visitArray(node);\n }\n\n if (!node.blocksVisibility || node.blocksVisibility()) {\n return node;\n }\n if (this.visible) {\n node.ensureVisibility();\n } else {\n node.ensureInvisibility();\n }\n\n node.accept(this);\n return node;\n }\n}\n\nexport default SetTreeVisibilityVisitor;","import tree from '../tree';\nimport Visitor from './visitor';\nimport logger from '../logger';\nimport * as utils from '../utils';\n\n/* jshint loopfunc:true */\n\nclass ExtendFinderVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n this.contexts = [];\n this.allExtendsStack = [[]];\n }\n\n run(root) {\n root = this._visitor.visit(root);\n root.allExtends = this.allExtendsStack[0];\n return root;\n }\n\n visitDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n\n let i;\n let j;\n let extend;\n const allSelectorsExtendList = [];\n let extendList;\n\n // get &:extend(.a); rules which apply to all selectors in this ruleset\n const rules = rulesetNode.rules;\n\n const ruleCnt = rules ? rules.length : 0;\n for (i = 0; i < ruleCnt; i++) {\n if (rulesetNode.rules[i] instanceof tree.Extend) {\n allSelectorsExtendList.push(rules[i]);\n rulesetNode.extendOnEveryPath = true;\n }\n }\n\n // now find every selector and apply the extends that apply to all extends\n // and the ones which apply to an individual extend\n const paths = rulesetNode.paths;\n for (i = 0; i < paths.length; i++) {\n const selectorPath = paths[i];\n const selector = selectorPath[selectorPath.length - 1];\n const selExtendList = selector.extendList;\n\n extendList = selExtendList ? utils.copyArray(selExtendList).concat(allSelectorsExtendList)\n : allSelectorsExtendList;\n\n if (extendList) {\n extendList = extendList.map(allSelectorsExtend => allSelectorsExtend.clone());\n }\n\n for (j = 0; j < extendList.length; j++) {\n this.foundExtends = true;\n extend = extendList[j];\n extend.findSelfSelectors(selectorPath);\n extend.ruleset = rulesetNode;\n if (j === 0) { extend.firstExtendOnThisSelectorPath = true; }\n this.allExtendsStack[this.allExtendsStack.length - 1].push(extend);\n }\n }\n\n this.contexts.push(rulesetNode.selectors);\n }\n\n visitRulesetOut(rulesetNode) {\n if (!rulesetNode.root) {\n this.contexts.length = this.contexts.length - 1;\n }\n }\n\n visitMedia(mediaNode, visitArgs) {\n mediaNode.allExtends = [];\n this.allExtendsStack.push(mediaNode.allExtends);\n }\n\n visitMediaOut(mediaNode) {\n this.allExtendsStack.length = this.allExtendsStack.length - 1;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n atRuleNode.allExtends = [];\n this.allExtendsStack.push(atRuleNode.allExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n this.allExtendsStack.length = this.allExtendsStack.length - 1;\n }\n}\n\nclass ProcessExtendsVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n }\n\n run(root) {\n const extendFinder = new ExtendFinderVisitor();\n this.extendIndices = {};\n extendFinder.run(root);\n if (!extendFinder.foundExtends) { return root; }\n root.allExtends = root.allExtends.concat(this.doExtendChaining(root.allExtends, root.allExtends));\n this.allExtendsStack = [root.allExtends];\n const newRoot = this._visitor.visit(root);\n this.checkExtendsForNonMatched(root.allExtends);\n return newRoot;\n }\n\n checkExtendsForNonMatched(extendList) {\n const indices = this.extendIndices;\n extendList.filter(extend => !extend.hasFoundMatches && extend.parent_ids.length == 1).forEach(extend => {\n let selector = '_unknown_';\n try {\n selector = extend.selector.toCSS({});\n }\n catch (_) {}\n\n if (!indices[`${extend.index} ${selector}`]) {\n indices[`${extend.index} ${selector}`] = true;\n logger.warn(`extend '${selector}' has no matches`);\n }\n });\n }\n\n doExtendChaining(extendsList, extendsListTarget, iterationCount) {\n //\n // chaining is different from normal extension.. if we extend an extend then we are not just copying, altering\n // and pasting the selector we would do normally, but we are also adding an extend with the same target selector\n // this means this new extend can then go and alter other extends\n //\n // this method deals with all the chaining work - without it, extend is flat and doesn't work on other extend selectors\n // this is also the most expensive.. and a match on one selector can cause an extension of a selector we had already\n // processed if we look at each selector at a time, as is done in visitRuleset\n\n let extendIndex;\n\n let targetExtendIndex;\n let matches;\n const extendsToAdd = [];\n let newSelector;\n const extendVisitor = this;\n let selectorPath;\n let extend;\n let targetExtend;\n let newExtend;\n\n iterationCount = iterationCount || 0;\n\n // loop through comparing every extend with every target extend.\n // a target extend is the one on the ruleset we are looking at copy/edit/pasting in place\n // e.g. .a:extend(.b) {} and .b:extend(.c) {} then the first extend extends the second one\n // and the second is the target.\n // the separation into two lists allows us to process a subset of chains with a bigger set, as is the\n // case when processing media queries\n for (extendIndex = 0; extendIndex < extendsList.length; extendIndex++) {\n for (targetExtendIndex = 0; targetExtendIndex < extendsListTarget.length; targetExtendIndex++) {\n\n extend = extendsList[extendIndex];\n targetExtend = extendsListTarget[targetExtendIndex];\n\n // look for circular references\n if ( extend.parent_ids.indexOf( targetExtend.object_id ) >= 0 ) { continue; }\n\n // find a match in the target extends self selector (the bit before :extend)\n selectorPath = [targetExtend.selfSelectors[0]];\n matches = extendVisitor.findMatch(extend, selectorPath);\n\n if (matches.length) {\n extend.hasFoundMatches = true;\n\n // we found a match, so for each self selector..\n extend.selfSelectors.forEach(selfSelector => {\n const info = targetExtend.visibilityInfo();\n\n // process the extend as usual\n newSelector = extendVisitor.extendSelector(matches, selectorPath, selfSelector, extend.isVisible());\n\n // but now we create a new extend from it\n newExtend = new(tree.Extend)(targetExtend.selector, targetExtend.option, 0, targetExtend.fileInfo(), info);\n newExtend.selfSelectors = newSelector;\n\n // add the extend onto the list of extends for that selector\n newSelector[newSelector.length - 1].extendList = [newExtend];\n\n // record that we need to add it.\n extendsToAdd.push(newExtend);\n newExtend.ruleset = targetExtend.ruleset;\n\n // remember its parents for circular references\n newExtend.parent_ids = newExtend.parent_ids.concat(targetExtend.parent_ids, extend.parent_ids);\n\n // only process the selector once.. if we have :extend(.a,.b) then multiple\n // extends will look at the same selector path, so when extending\n // we know that any others will be duplicates in terms of what is added to the css\n if (targetExtend.firstExtendOnThisSelectorPath) {\n newExtend.firstExtendOnThisSelectorPath = true;\n targetExtend.ruleset.paths.push(newSelector);\n }\n });\n }\n }\n }\n\n if (extendsToAdd.length) {\n // try to detect circular references to stop a stack overflow.\n // may no longer be needed.\n this.extendChainCount++;\n if (iterationCount > 100) {\n let selectorOne = '{unable to calculate}';\n let selectorTwo = '{unable to calculate}';\n try {\n selectorOne = extendsToAdd[0].selfSelectors[0].toCSS();\n selectorTwo = extendsToAdd[0].selector.toCSS();\n }\n catch (e) {}\n throw { message: `extend circular reference detected. One of the circular extends is currently:${selectorOne}:extend(${selectorTwo})`};\n }\n\n // now process the new extends on the existing rules so that we can handle a extending b extending c extending\n // d extending e...\n return extendsToAdd.concat(extendVisitor.doExtendChaining(extendsToAdd, extendsListTarget, iterationCount + 1));\n } else {\n return extendsToAdd;\n }\n }\n\n visitDeclaration(ruleNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitSelector(selectorNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n let matches;\n let pathIndex;\n let extendIndex;\n const allExtends = this.allExtendsStack[this.allExtendsStack.length - 1];\n const selectorsToAdd = [];\n const extendVisitor = this;\n let selectorPath;\n\n // look at each selector path in the ruleset, find any extend matches and then copy, find and replace\n\n for (extendIndex = 0; extendIndex < allExtends.length; extendIndex++) {\n for (pathIndex = 0; pathIndex < rulesetNode.paths.length; pathIndex++) {\n selectorPath = rulesetNode.paths[pathIndex];\n\n // extending extends happens initially, before the main pass\n if (rulesetNode.extendOnEveryPath) { continue; }\n const extendList = selectorPath[selectorPath.length - 1].extendList;\n if (extendList && extendList.length) { continue; }\n\n matches = this.findMatch(allExtends[extendIndex], selectorPath);\n\n if (matches.length) {\n allExtends[extendIndex].hasFoundMatches = true;\n\n allExtends[extendIndex].selfSelectors.forEach(selfSelector => {\n let extendedSelectors;\n extendedSelectors = extendVisitor.extendSelector(matches, selectorPath, selfSelector, allExtends[extendIndex].isVisible());\n selectorsToAdd.push(extendedSelectors);\n });\n }\n }\n }\n rulesetNode.paths = rulesetNode.paths.concat(selectorsToAdd);\n }\n\n findMatch(extend, haystackSelectorPath) {\n //\n // look through the haystack selector path to try and find the needle - extend.selector\n // returns an array of selector matches that can then be replaced\n //\n let haystackSelectorIndex;\n\n let hackstackSelector;\n let hackstackElementIndex;\n let haystackElement;\n let targetCombinator;\n let i;\n const extendVisitor = this;\n const needleElements = extend.selector.elements;\n const potentialMatches = [];\n let potentialMatch;\n const matches = [];\n\n // loop through the haystack elements\n for (haystackSelectorIndex = 0; haystackSelectorIndex < haystackSelectorPath.length; haystackSelectorIndex++) {\n hackstackSelector = haystackSelectorPath[haystackSelectorIndex];\n\n for (hackstackElementIndex = 0; hackstackElementIndex < hackstackSelector.elements.length; hackstackElementIndex++) {\n\n haystackElement = hackstackSelector.elements[hackstackElementIndex];\n\n // if we allow elements before our match we can add a potential match every time. otherwise only at the first element.\n if (extend.allowBefore || (haystackSelectorIndex === 0 && hackstackElementIndex === 0)) {\n potentialMatches.push({pathIndex: haystackSelectorIndex, index: hackstackElementIndex, matched: 0,\n initialCombinator: haystackElement.combinator});\n }\n\n for (i = 0; i < potentialMatches.length; i++) {\n potentialMatch = potentialMatches[i];\n\n // selectors add \" \" onto the first element. When we use & it joins the selectors together, but if we don't\n // then each selector in haystackSelectorPath has a space before it added in the toCSS phase. so we need to\n // work out what the resulting combinator will be\n targetCombinator = haystackElement.combinator.value;\n if (targetCombinator === '' && hackstackElementIndex === 0) {\n targetCombinator = ' ';\n }\n\n // if we don't match, null our match to indicate failure\n if (!extendVisitor.isElementValuesEqual(needleElements[potentialMatch.matched].value, haystackElement.value) ||\n (potentialMatch.matched > 0 && needleElements[potentialMatch.matched].combinator.value !== targetCombinator)) {\n potentialMatch = null;\n } else {\n potentialMatch.matched++;\n }\n\n // if we are still valid and have finished, test whether we have elements after and whether these are allowed\n if (potentialMatch) {\n potentialMatch.finished = potentialMatch.matched === needleElements.length;\n if (potentialMatch.finished &&\n (!extend.allowAfter &&\n (hackstackElementIndex + 1 < hackstackSelector.elements.length || haystackSelectorIndex + 1 < haystackSelectorPath.length))) {\n potentialMatch = null;\n }\n }\n // if null we remove, if not, we are still valid, so either push as a valid match or continue\n if (potentialMatch) {\n if (potentialMatch.finished) {\n potentialMatch.length = needleElements.length;\n potentialMatch.endPathIndex = haystackSelectorIndex;\n potentialMatch.endPathElementIndex = hackstackElementIndex + 1; // index after end of match\n potentialMatches.length = 0; // we don't allow matches to overlap, so start matching again\n matches.push(potentialMatch);\n }\n } else {\n potentialMatches.splice(i, 1);\n i--;\n }\n }\n }\n }\n return matches;\n }\n\n isElementValuesEqual(elementValue1, elementValue2) {\n if (typeof elementValue1 === 'string' || typeof elementValue2 === 'string') {\n return elementValue1 === elementValue2;\n }\n if (elementValue1 instanceof tree.Attribute) {\n if (elementValue1.op !== elementValue2.op || elementValue1.key !== elementValue2.key) {\n return false;\n }\n if (!elementValue1.value || !elementValue2.value) {\n if (elementValue1.value || elementValue2.value) {\n return false;\n }\n return true;\n }\n elementValue1 = elementValue1.value.value || elementValue1.value;\n elementValue2 = elementValue2.value.value || elementValue2.value;\n return elementValue1 === elementValue2;\n }\n elementValue1 = elementValue1.value;\n elementValue2 = elementValue2.value;\n if (elementValue1 instanceof tree.Selector) {\n if (!(elementValue2 instanceof tree.Selector) || elementValue1.elements.length !== elementValue2.elements.length) {\n return false;\n }\n for (let i = 0; i < elementValue1.elements.length; i++) {\n if (elementValue1.elements[i].combinator.value !== elementValue2.elements[i].combinator.value) {\n if (i !== 0 || (elementValue1.elements[i].combinator.value || ' ') !== (elementValue2.elements[i].combinator.value || ' ')) {\n return false;\n }\n }\n if (!this.isElementValuesEqual(elementValue1.elements[i].value, elementValue2.elements[i].value)) {\n return false;\n }\n }\n return true;\n }\n return false;\n }\n\n extendSelector(matches, selectorPath, replacementSelector, isVisible) {\n // for a set of matches, replace each match with the replacement selector\n\n let currentSelectorPathIndex = 0;\n\n let currentSelectorPathElementIndex = 0;\n let path = [];\n let matchIndex;\n let selector;\n let firstElement;\n let match;\n let newElements;\n\n for (matchIndex = 0; matchIndex < matches.length; matchIndex++) {\n match = matches[matchIndex];\n selector = selectorPath[match.pathIndex];\n firstElement = new tree.Element(\n match.initialCombinator,\n replacementSelector.elements[0].value,\n replacementSelector.elements[0].isVariable,\n replacementSelector.elements[0].getIndex(),\n replacementSelector.elements[0].fileInfo()\n );\n\n if (match.pathIndex > currentSelectorPathIndex && currentSelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n\n newElements = selector.elements\n .slice(currentSelectorPathElementIndex, match.index)\n .concat([firstElement])\n .concat(replacementSelector.elements.slice(1));\n\n if (currentSelectorPathIndex === match.pathIndex && matchIndex > 0) {\n path[path.length - 1].elements =\n path[path.length - 1].elements.concat(newElements);\n } else {\n path = path.concat(selectorPath.slice(currentSelectorPathIndex, match.pathIndex));\n\n path.push(new tree.Selector(\n newElements\n ));\n }\n currentSelectorPathIndex = match.endPathIndex;\n currentSelectorPathElementIndex = match.endPathElementIndex;\n if (currentSelectorPathElementIndex >= selectorPath[currentSelectorPathIndex].elements.length) {\n currentSelectorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n }\n\n if (currentSelectorPathIndex < selectorPath.length && currentSelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathIndex++;\n }\n\n path = path.concat(selectorPath.slice(currentSelectorPathIndex, selectorPath.length));\n path = path.map(currentValue => {\n // we can re-use elements here, because the visibility property matters only for selectors\n const derived = currentValue.createDerived(currentValue.elements);\n if (isVisible) {\n derived.ensureVisibility();\n } else {\n derived.ensureInvisibility();\n }\n return derived;\n });\n return path;\n }\n\n visitMedia(mediaNode, visitArgs) {\n let newAllExtends = mediaNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, mediaNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitMediaOut(mediaNode) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStack.length = lastIndex;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n let newAllExtends = atRuleNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, atRuleNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStack.length = lastIndex;\n }\n}\n\nexport default ProcessExtendsVisitor;\n","import Visitor from './visitor';\n\nclass JoinSelectorVisitor {\n constructor() {\n this.contexts = [[]];\n this._visitor = new Visitor(this);\n }\n\n run(root) {\n return this._visitor.visit(root);\n }\n\n visitDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n const paths = [];\n let selectors;\n\n this.contexts.push(paths);\n\n if (!rulesetNode.root) {\n selectors = rulesetNode.selectors;\n if (selectors) {\n selectors = selectors.filter(selector => selector.getIsOutput());\n rulesetNode.selectors = selectors.length ? selectors : (selectors = null);\n if (selectors) { rulesetNode.joinSelectors(paths, context, selectors); }\n }\n if (!selectors) { rulesetNode.rules = null; }\n rulesetNode.paths = paths;\n }\n }\n\n visitRulesetOut(rulesetNode) {\n this.contexts.length = this.contexts.length - 1;\n }\n\n visitMedia(mediaNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n mediaNode.rules[0].root = (context.length === 0 || context[0].multiMedia);\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n if (atRuleNode.rules && atRuleNode.rules.length) {\n atRuleNode.rules[0].root = (atRuleNode.isRooted || context.length === 0 || null);\n }\n }\n}\n\nexport default JoinSelectorVisitor;\n","import tree from '../tree';\nimport Visitor from './visitor';\n\nclass CSSVisitorUtils {\n constructor(context) {\n this._visitor = new Visitor(this);\n this._context = context;\n }\n\n containsSilentNonBlockedChild(bodyRules) {\n let rule;\n if (!bodyRules) {\n return false;\n }\n for (let r = 0; r < bodyRules.length; r++) {\n rule = bodyRules[r];\n if (rule.isSilent && rule.isSilent(this._context) && !rule.blocksVisibility()) {\n // the atrule contains something that was referenced (likely by extend)\n // therefore it needs to be shown in output too\n return true;\n }\n }\n return false;\n }\n\n keepOnlyVisibleChilds(owner) {\n if (owner && owner.rules) {\n owner.rules = owner.rules.filter(thing => thing.isVisible());\n }\n }\n\n isEmpty(owner) {\n return (owner && owner.rules) \n ? (owner.rules.length === 0) : true;\n }\n\n hasVisibleSelector(rulesetNode) {\n return (rulesetNode && rulesetNode.paths)\n ? (rulesetNode.paths.length > 0) : false;\n }\n\n resolveVisibility(node, originalRules) {\n if (!node.blocksVisibility()) {\n if (this.isEmpty(node) && !this.containsSilentNonBlockedChild(originalRules)) {\n return ;\n }\n\n return node;\n }\n\n const compiledRulesBody = node.rules[0];\n this.keepOnlyVisibleChilds(compiledRulesBody);\n\n if (this.isEmpty(compiledRulesBody)) {\n return ;\n }\n\n node.ensureVisibility();\n node.removeVisibilityBlock();\n\n return node;\n }\n\n isVisibleRuleset(rulesetNode) {\n if (rulesetNode.firstRoot) {\n return true;\n }\n\n if (this.isEmpty(rulesetNode)) {\n return false;\n }\n\n if (!rulesetNode.root && !this.hasVisibleSelector(rulesetNode)) {\n return false;\n }\n\n return true;\n }\n}\n\nconst ToCSSVisitor = function(context) {\n this._visitor = new Visitor(this);\n this._context = context;\n this.utils = new CSSVisitorUtils(context);\n};\n\nToCSSVisitor.prototype = {\n isReplacing: true,\n run: function (root) {\n return this._visitor.visit(root);\n },\n\n visitDeclaration: function (declNode, visitArgs) {\n if (declNode.blocksVisibility() || declNode.variable) {\n return;\n }\n return declNode;\n },\n\n visitMixinDefinition: function (mixinNode, visitArgs) {\n // mixin definitions do not get eval'd - this means they keep state\n // so we have to clear that state here so it isn't used if toCSS is called twice\n mixinNode.frames = [];\n },\n\n visitExtend: function (extendNode, visitArgs) {\n },\n\n visitComment: function (commentNode, visitArgs) {\n if (commentNode.blocksVisibility() || commentNode.isSilent(this._context)) {\n return;\n }\n return commentNode;\n },\n\n visitMedia: function(mediaNode, visitArgs) {\n const originalRules = mediaNode.rules[0].rules;\n mediaNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n\n return this.utils.resolveVisibility(mediaNode, originalRules);\n },\n\n visitImport: function (importNode, visitArgs) {\n if (importNode.blocksVisibility()) {\n return ;\n }\n return importNode;\n },\n\n visitAtRule: function(atRuleNode, visitArgs) {\n if (atRuleNode.rules && atRuleNode.rules.length) {\n return this.visitAtRuleWithBody(atRuleNode, visitArgs);\n } else {\n return this.visitAtRuleWithoutBody(atRuleNode, visitArgs);\n }\n },\n\n visitAnonymous: function(anonymousNode, visitArgs) {\n if (!anonymousNode.blocksVisibility()) {\n anonymousNode.accept(this._visitor);\n return anonymousNode;\n }\n },\n\n visitAtRuleWithBody: function(atRuleNode, visitArgs) {\n // if there is only one nested ruleset and that one has no path, then it is\n // just fake ruleset\n function hasFakeRuleset(atRuleNode) {\n const bodyRules = atRuleNode.rules;\n return bodyRules.length === 1 && (!bodyRules[0].paths || bodyRules[0].paths.length === 0);\n }\n function getBodyRules(atRuleNode) {\n const nodeRules = atRuleNode.rules;\n if (hasFakeRuleset(atRuleNode)) {\n return nodeRules[0].rules;\n }\n\n return nodeRules;\n }\n // it is still true that it is only one ruleset in array\n // this is last such moment\n // process childs\n const originalRules = getBodyRules(atRuleNode);\n atRuleNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n\n if (!this.utils.isEmpty(atRuleNode)) {\n this._mergeRules(atRuleNode.rules[0].rules);\n }\n\n return this.utils.resolveVisibility(atRuleNode, originalRules);\n },\n\n visitAtRuleWithoutBody: function(atRuleNode, visitArgs) {\n if (atRuleNode.blocksVisibility()) {\n return;\n }\n\n if (atRuleNode.name === '@charset') {\n // Only output the debug info together with subsequent @charset definitions\n // a comment (or @media statement) before the actual @charset atrule would\n // be considered illegal css as it has to be on the first line\n if (this.charset) {\n if (atRuleNode.debugInfo) {\n const comment = new tree.Comment(`/* ${atRuleNode.toCSS(this._context).replace(/\\n/g, '')} */\\n`);\n comment.debugInfo = atRuleNode.debugInfo;\n return this._visitor.visit(comment);\n }\n return;\n }\n this.charset = true;\n }\n\n return atRuleNode;\n },\n\n checkValidNodes: function(rules, isRoot) {\n if (!rules) {\n return;\n }\n\n for (let i = 0; i < rules.length; i++) {\n const ruleNode = rules[i];\n if (isRoot && ruleNode instanceof tree.Declaration && !ruleNode.variable) {\n throw { message: 'Properties must be inside selector blocks. They cannot be in the root',\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n if (ruleNode instanceof tree.Call) {\n throw { message: `Function '${ruleNode.name}' is undefined`,\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n if (ruleNode.type && !ruleNode.allowRoot) {\n throw { message: `${ruleNode.type} node returned by a function is not valid here`,\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n }\n },\n\n visitRuleset: function (rulesetNode, visitArgs) {\n // at this point rulesets are nested into each other\n let rule;\n\n const rulesets = [];\n\n this.checkValidNodes(rulesetNode.rules, rulesetNode.firstRoot);\n\n if (!rulesetNode.root) {\n // remove invisible paths\n this._compileRulesetPaths(rulesetNode);\n\n // remove rulesets from this ruleset body and compile them separately\n const nodeRules = rulesetNode.rules;\n\n let nodeRuleCnt = nodeRules ? nodeRules.length : 0;\n for (let i = 0; i < nodeRuleCnt; ) {\n rule = nodeRules[i];\n if (rule && rule.rules) {\n // visit because we are moving them out from being a child\n rulesets.push(this._visitor.visit(rule));\n nodeRules.splice(i, 1);\n nodeRuleCnt--;\n continue;\n }\n i++;\n }\n // accept the visitor to remove rules and refactor itself\n // then we can decide nogw whether we want it or not\n // compile body\n if (nodeRuleCnt > 0) {\n rulesetNode.accept(this._visitor);\n } else {\n rulesetNode.rules = null;\n }\n visitArgs.visitDeeper = false;\n } else { // if (! rulesetNode.root) {\n rulesetNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n }\n\n if (rulesetNode.rules) {\n this._mergeRules(rulesetNode.rules);\n this._removeDuplicateRules(rulesetNode.rules);\n }\n\n // now decide whether we keep the ruleset\n if (this.utils.isVisibleRuleset(rulesetNode)) {\n rulesetNode.ensureVisibility();\n rulesets.splice(0, 0, rulesetNode);\n }\n\n if (rulesets.length === 1) {\n return rulesets[0];\n }\n return rulesets;\n },\n\n _compileRulesetPaths: function(rulesetNode) {\n if (rulesetNode.paths) {\n rulesetNode.paths = rulesetNode.paths\n .filter(p => {\n let i;\n if (p[0].elements[0].combinator.value === ' ') {\n p[0].elements[0].combinator = new(tree.Combinator)('');\n }\n for (i = 0; i < p.length; i++) {\n if (p[i].isVisible() && p[i].getIsOutput()) {\n return true;\n }\n }\n return false;\n });\n }\n },\n\n _removeDuplicateRules: function(rules) {\n if (!rules) { return; }\n\n // remove duplicates\n const ruleCache = {};\n\n let ruleList;\n let rule;\n let i;\n\n for (i = rules.length - 1; i >= 0 ; i--) {\n rule = rules[i];\n if (rule instanceof tree.Declaration) {\n if (!ruleCache[rule.name]) {\n ruleCache[rule.name] = rule;\n } else {\n ruleList = ruleCache[rule.name];\n if (ruleList instanceof tree.Declaration) {\n ruleList = ruleCache[rule.name] = [ruleCache[rule.name].toCSS(this._context)];\n }\n const ruleCSS = rule.toCSS(this._context);\n if (ruleList.indexOf(ruleCSS) !== -1) {\n rules.splice(i, 1);\n } else {\n ruleList.push(ruleCSS);\n }\n }\n }\n }\n },\n\n _mergeRules: function(rules) {\n if (!rules) {\n return; \n }\n\n const groups = {};\n const groupsArr = [];\n\n for (let i = 0; i < rules.length; i++) {\n const rule = rules[i];\n if (rule.merge) {\n const key = rule.name;\n groups[key] ? rules.splice(i--, 1) : \n groupsArr.push(groups[key] = []);\n groups[key].push(rule);\n }\n }\n\n groupsArr.forEach(group => {\n if (group.length > 0) {\n const result = group[0];\n let space = [];\n const comma = [new tree.Expression(space)];\n group.forEach(rule => {\n if ((rule.merge === '+') && (space.length > 0)) {\n comma.push(new tree.Expression(space = []));\n }\n space.push(rule.value);\n result.important = result.important || rule.important;\n });\n result.value = new tree.Value(comma);\n }\n });\n }\n};\n\nexport default ToCSSVisitor;\n","import Visitor from './visitor';\nimport ImportVisitor from './import-visitor';\nimport MarkVisibleSelectorsVisitor from './set-tree-visibility-visitor';\nimport ExtendVisitor from './extend-visitor';\nimport JoinSelectorVisitor from './join-selector-visitor';\nimport ToCSSVisitor from './to-css-visitor';\n\nexport default {\n Visitor,\n ImportVisitor,\n MarkVisibleSelectorsVisitor,\n ExtendVisitor,\n JoinSelectorVisitor,\n ToCSSVisitor\n};\n","import chunker from './chunker';\n\nexport default () => {\n let // Less input string\n input;\n\n let // current chunk\n j;\n\n const // holds state for backtracking\n saveStack = [];\n\n let // furthest index the parser has gone to\n furthest;\n\n let // if this is furthest we got to, this is the probably cause\n furthestPossibleErrorMessage;\n\n let // chunkified input\n chunks;\n\n let // current chunk\n current;\n\n let // index of current chunk, in `input`\n currentPos;\n\n const parserInput = {};\n const CHARCODE_SPACE = 32;\n const CHARCODE_TAB = 9;\n const CHARCODE_LF = 10;\n const CHARCODE_CR = 13;\n const CHARCODE_PLUS = 43;\n const CHARCODE_COMMA = 44;\n const CHARCODE_FORWARD_SLASH = 47;\n const CHARCODE_9 = 57;\n\n function skipWhitespace(length) {\n const oldi = parserInput.i;\n const oldj = j;\n const curr = parserInput.i - currentPos;\n const endIndex = parserInput.i + current.length - curr;\n const mem = (parserInput.i += length);\n const inp = input;\n let c;\n let nextChar;\n let comment;\n\n for (; parserInput.i < endIndex; parserInput.i++) {\n c = inp.charCodeAt(parserInput.i);\n\n if (parserInput.autoCommentAbsorb && c === CHARCODE_FORWARD_SLASH) {\n nextChar = inp.charAt(parserInput.i + 1);\n if (nextChar === '/') {\n comment = {index: parserInput.i, isLineComment: true};\n let nextNewLine = inp.indexOf('\\n', parserInput.i + 2);\n if (nextNewLine < 0) {\n nextNewLine = endIndex;\n }\n parserInput.i = nextNewLine;\n comment.text = inp.substr(comment.index, parserInput.i - comment.index);\n parserInput.commentStore.push(comment);\n continue;\n } else if (nextChar === '*') {\n const nextStarSlash = inp.indexOf('*/', parserInput.i + 2);\n if (nextStarSlash >= 0) {\n comment = {\n index: parserInput.i,\n text: inp.substr(parserInput.i, nextStarSlash + 2 - parserInput.i),\n isLineComment: false\n };\n parserInput.i += comment.text.length - 1;\n parserInput.commentStore.push(comment);\n continue;\n }\n }\n break;\n }\n\n if ((c !== CHARCODE_SPACE) && (c !== CHARCODE_LF) && (c !== CHARCODE_TAB) && (c !== CHARCODE_CR)) {\n break;\n }\n }\n\n current = current.slice(length + parserInput.i - mem + curr);\n currentPos = parserInput.i;\n\n if (!current.length) {\n if (j < chunks.length - 1) {\n current = chunks[++j];\n skipWhitespace(0); // skip space at the beginning of a chunk\n return true; // things changed\n }\n parserInput.finished = true;\n }\n\n return oldi !== parserInput.i || oldj !== j;\n }\n\n parserInput.save = () => {\n currentPos = parserInput.i;\n saveStack.push( { current, i: parserInput.i, j });\n };\n parserInput.restore = possibleErrorMessage => {\n\n if (parserInput.i > furthest || (parserInput.i === furthest && possibleErrorMessage && !furthestPossibleErrorMessage)) {\n furthest = parserInput.i;\n furthestPossibleErrorMessage = possibleErrorMessage;\n }\n const state = saveStack.pop();\n current = state.current;\n currentPos = parserInput.i = state.i;\n j = state.j;\n };\n parserInput.forget = () => {\n saveStack.pop();\n };\n parserInput.isWhitespace = offset => {\n const pos = parserInput.i + (offset || 0);\n const code = input.charCodeAt(pos);\n return (code === CHARCODE_SPACE || code === CHARCODE_CR || code === CHARCODE_TAB || code === CHARCODE_LF);\n };\n\n // Specialization of $(tok)\n parserInput.$re = tok => {\n if (parserInput.i > currentPos) {\n current = current.slice(parserInput.i - currentPos);\n currentPos = parserInput.i;\n }\n\n const m = tok.exec(current);\n if (!m) {\n return null;\n }\n\n skipWhitespace(m[0].length);\n if (typeof m === 'string') {\n return m;\n }\n\n return m.length === 1 ? m[0] : m;\n };\n\n parserInput.$char = tok => {\n if (input.charAt(parserInput.i) !== tok) {\n return null;\n }\n skipWhitespace(1);\n return tok;\n };\n\n parserInput.$str = tok => {\n const tokLength = tok.length;\n\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tokLength; i++) {\n if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n return null;\n }\n }\n\n skipWhitespace(tokLength);\n return tok;\n };\n\n parserInput.$quoted = loc => {\n const pos = loc || parserInput.i;\n const startChar = input.charAt(pos);\n\n if (startChar !== '\\'' && startChar !== '\"') {\n return;\n }\n const length = input.length;\n const currentPosition = pos;\n\n for (let i = 1; i + currentPosition < length; i++) {\n const nextChar = input.charAt(i + currentPosition);\n switch (nextChar) {\n case '\\\\':\n i++;\n continue;\n case '\\r':\n case '\\n':\n break;\n case startChar:\n const str = input.substr(currentPosition, i + 1);\n if (!loc && loc !== 0) {\n skipWhitespace(i + 1);\n return str\n }\n return [startChar, str];\n default:\n }\n }\n return null;\n };\n\n /**\n * Permissive parsing. Ignores everything except matching {} [] () and quotes\n * until matching token (outside of blocks)\n */\n parserInput.$parseUntil = tok => {\n let quote = '';\n let returnVal = null;\n let inComment = false;\n let blockDepth = 0;\n const blockStack = [];\n const parseGroups = [];\n const length = input.length;\n const startPos = parserInput.i;\n let lastPos = parserInput.i;\n let i = parserInput.i;\n let loop = true;\n let testChar;\n\n if (typeof tok === 'string') {\n testChar = char => char === tok\n } else {\n testChar = char => tok.test(char)\n }\n\n do {\n let prevChar;\n let nextChar = input.charAt(i);\n if (blockDepth === 0 && testChar(nextChar)) {\n returnVal = input.substr(lastPos, i - lastPos);\n if (returnVal) {\n parseGroups.push(returnVal);\n }\n else {\n parseGroups.push(' ');\n }\n returnVal = parseGroups;\n skipWhitespace(i - startPos);\n loop = false\n } else {\n if (inComment) {\n if (nextChar === '*' && \n input.charAt(i + 1) === '/') {\n i++;\n blockDepth--;\n inComment = false;\n }\n i++;\n continue;\n }\n switch (nextChar) {\n case '\\\\':\n i++;\n nextChar = input.charAt(i);\n parseGroups.push(input.substr(lastPos, i - lastPos + 1));\n lastPos = i + 1;\n break;\n case '/':\n if (input.charAt(i + 1) === '*') {\n i++;\n inComment = true;\n blockDepth++;\n }\n break;\n case '\\'':\n case '\"':\n quote = parserInput.$quoted(i);\n if (quote) {\n parseGroups.push(input.substr(lastPos, i - lastPos), quote);\n i += quote[1].length - 1;\n lastPos = i + 1;\n }\n else {\n skipWhitespace(i - startPos);\n returnVal = nextChar;\n loop = false;\n }\n break;\n case '{':\n blockStack.push('}');\n blockDepth++;\n break;\n case '(':\n blockStack.push(')');\n blockDepth++;\n break;\n case '[':\n blockStack.push(']');\n blockDepth++;\n break;\n case '}':\n case ')':\n case ']':\n const expected = blockStack.pop();\n if (nextChar === expected) {\n blockDepth--;\n } else {\n // move the parser to the error and return expected\n skipWhitespace(i - startPos);\n returnVal = expected;\n loop = false;\n }\n }\n i++;\n if (i > length) {\n loop = false;\n }\n }\n prevChar = nextChar;\n } while (loop);\n\n return returnVal ? returnVal : null;\n }\n\n parserInput.autoCommentAbsorb = true;\n parserInput.commentStore = [];\n parserInput.finished = false;\n\n // Same as $(), but don't change the state of the parser,\n // just return the match.\n parserInput.peek = tok => {\n if (typeof tok === 'string') {\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tok.length; i++) {\n if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n return false;\n }\n }\n return true;\n } else {\n return tok.test(current);\n }\n };\n\n // Specialization of peek()\n // TODO remove or change some currentChar calls to peekChar\n parserInput.peekChar = tok => input.charAt(parserInput.i) === tok;\n\n parserInput.currentChar = () => input.charAt(parserInput.i);\n\n parserInput.prevChar = () => input.charAt(parserInput.i - 1);\n\n parserInput.getInput = () => input;\n\n parserInput.peekNotNumeric = () => {\n const c = input.charCodeAt(parserInput.i);\n // Is the first char of the dimension 0-9, '.', '+' or '-'\n return (c > CHARCODE_9 || c < CHARCODE_PLUS) || c === CHARCODE_FORWARD_SLASH || c === CHARCODE_COMMA;\n };\n\n parserInput.start = (str, chunkInput, failFunction) => {\n input = str;\n parserInput.i = j = currentPos = furthest = 0;\n\n // chunking apparently makes things quicker (but my tests indicate\n // it might actually make things slower in node at least)\n // and it is a non-perfect parse - it can't recognise\n // unquoted urls, meaning it can't distinguish comments\n // meaning comments with quotes or {}() in them get 'counted'\n // and then lead to parse errors.\n // In addition if the chunking chunks in the wrong place we might\n // not be able to parse a parser statement in one go\n // this is officially deprecated but can be switched on via an option\n // in the case it causes too much performance issues.\n if (chunkInput) {\n chunks = chunker(str, failFunction);\n } else {\n chunks = [str];\n }\n\n current = chunks[0];\n\n skipWhitespace(0);\n };\n\n parserInput.end = () => {\n let message;\n const isFinished = parserInput.i >= input.length;\n\n if (parserInput.i < furthest) {\n message = furthestPossibleErrorMessage;\n parserInput.i = furthest;\n }\n return {\n isFinished,\n furthest: parserInput.i,\n furthestPossibleErrorMessage: message,\n furthestReachedEnd: parserInput.i >= input.length - 1,\n furthestChar: input[parserInput.i]\n };\n };\n\n return parserInput;\n};\n","// Split the input into chunks.\nexport default (input, fail) => {\n const len = input.length;\n let level = 0;\n let parenLevel = 0;\n let lastOpening;\n let lastOpeningParen;\n let lastMultiComment;\n let lastMultiCommentEndBrace;\n const chunks = [];\n let emitFrom = 0;\n let chunkerCurrentIndex;\n let currentChunkStartIndex;\n let cc;\n let cc2;\n let matched;\n\n function emitChunk(force) {\n const len = chunkerCurrentIndex - emitFrom;\n if (((len < 512) && !force) || !len) {\n return;\n }\n chunks.push(input.slice(emitFrom, chunkerCurrentIndex + 1));\n emitFrom = chunkerCurrentIndex + 1;\n }\n\n for (chunkerCurrentIndex = 0; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc = input.charCodeAt(chunkerCurrentIndex);\n if (((cc >= 97) && (cc <= 122)) || (cc < 34)) {\n // a-z or whitespace\n continue;\n }\n\n switch (cc) {\n case 40: // (\n parenLevel++;\n lastOpeningParen = chunkerCurrentIndex;\n continue;\n case 41: // )\n if (--parenLevel < 0) {\n return fail('missing opening `(`', chunkerCurrentIndex);\n }\n continue;\n case 59: // ;\n if (!parenLevel) { emitChunk(); }\n continue;\n case 123: // {\n level++;\n lastOpening = chunkerCurrentIndex;\n continue;\n case 125: // }\n if (--level < 0) {\n return fail('missing opening `{`', chunkerCurrentIndex);\n }\n if (!level && !parenLevel) { emitChunk(); }\n continue;\n case 92: // \\\n if (chunkerCurrentIndex < len - 1) { chunkerCurrentIndex++; continue; }\n return fail('unescaped `\\\\`', chunkerCurrentIndex);\n case 34:\n case 39:\n case 96: // \", ' and `\n matched = 0;\n currentChunkStartIndex = chunkerCurrentIndex;\n for (chunkerCurrentIndex = chunkerCurrentIndex + 1; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if (cc2 > 96) { continue; }\n if (cc2 == cc) { matched = 1; break; }\n if (cc2 == 92) { // \\\n if (chunkerCurrentIndex == len - 1) {\n return fail('unescaped `\\\\`', chunkerCurrentIndex);\n }\n chunkerCurrentIndex++;\n }\n }\n if (matched) { continue; }\n return fail(`unmatched \\`${String.fromCharCode(cc)}\\``, currentChunkStartIndex);\n case 47: // /, check for comment\n if (parenLevel || (chunkerCurrentIndex == len - 1)) { continue; }\n cc2 = input.charCodeAt(chunkerCurrentIndex + 1);\n if (cc2 == 47) {\n // //, find lnfeed\n for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if ((cc2 <= 13) && ((cc2 == 10) || (cc2 == 13))) { break; }\n }\n } else if (cc2 == 42) {\n // /*, find */\n lastMultiComment = currentChunkStartIndex = chunkerCurrentIndex;\n for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len - 1; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if (cc2 == 125) { lastMultiCommentEndBrace = chunkerCurrentIndex; }\n if (cc2 != 42) { continue; }\n if (input.charCodeAt(chunkerCurrentIndex + 1) == 47) { break; }\n }\n if (chunkerCurrentIndex == len - 1) {\n return fail('missing closing `*/`', currentChunkStartIndex);\n }\n chunkerCurrentIndex++;\n }\n continue;\n case 42: // *, check for unmatched */\n if ((chunkerCurrentIndex < len - 1) && (input.charCodeAt(chunkerCurrentIndex + 1) == 47)) {\n return fail('unmatched `/*`', chunkerCurrentIndex);\n }\n continue;\n }\n }\n\n if (level !== 0) {\n if ((lastMultiComment > lastOpening) && (lastMultiCommentEndBrace > lastMultiComment)) {\n return fail('missing closing `}` or `*/`', lastOpening);\n } else {\n return fail('missing closing `}`', lastOpening);\n }\n } else if (parenLevel !== 0) {\n return fail('missing closing `)`', lastOpeningParen);\n }\n\n emitChunk(true);\n return chunks;\n};\n","import LessError from '../less-error';\nimport tree from '../tree';\nimport visitors from '../visitors';\nimport getParserInput from './parser-input';\nimport * as utils from '../utils';\nimport functionRegistry from '../functions/function-registry';\n\n//\n// less.js - parser\n//\n// A relatively straight-forward predictive parser.\n// There is no tokenization/lexing stage, the input is parsed\n// in one sweep.\n//\n// To make the parser fast enough to run in the browser, several\n// optimization had to be made:\n//\n// - Matching and slicing on a huge input is often cause of slowdowns.\n// The solution is to chunkify the input into smaller strings.\n// The chunks are stored in the `chunks` var,\n// `j` holds the current chunk index, and `currentPos` holds\n// the index of the current chunk in relation to `input`.\n// This gives us an almost 4x speed-up.\n//\n// - In many cases, we don't need to match individual tokens;\n// for example, if a value doesn't hold any variables, operations\n// or dynamic references, the parser can effectively 'skip' it,\n// treating it as a literal.\n// An example would be '1px solid #000' - which evaluates to itself,\n// we don't need to know what the individual components are.\n// The drawback, of course is that you don't get the benefits of\n// syntax-checking on the CSS. This gives us a 50% speed-up in the parser,\n// and a smaller speed-up in the code-gen.\n//\n//\n// Token matching is done with the `$` function, which either takes\n// a terminal string or regexp, or a non-terminal function to call.\n// It also takes care of moving all the indices forwards.\n//\n\nconst Parser = function Parser(context, imports, fileInfo) {\n let parsers;\n const parserInput = getParserInput();\n\n function error(msg, type) {\n throw new LessError(\n {\n index: parserInput.i,\n filename: fileInfo.filename,\n type: type || 'Syntax',\n message: msg\n },\n imports\n );\n }\n\n function expect(arg, msg) {\n // some older browsers return typeof 'function' for RegExp\n const result = (arg instanceof Function) ? arg.call(parsers) : parserInput.$re(arg);\n if (result) {\n return result;\n }\n \n error(msg || (typeof arg === 'string'\n ? `expected '${arg}' got '${parserInput.currentChar()}'`\n : 'unexpected token'));\n }\n\n // Specialization of expect()\n function expectChar(arg, msg) {\n if (parserInput.$char(arg)) {\n return arg;\n }\n error(msg || `expected '${arg}' got '${parserInput.currentChar()}'`);\n }\n\n function getDebugInfo(index) {\n const filename = fileInfo.filename;\n\n return {\n lineNumber: utils.getLocation(index, parserInput.getInput()).line + 1,\n fileName: filename\n };\n }\n\n /**\n * Used after initial parsing to create nodes on the fly\n * \n * @param {String} str - string to parse \n * @param {Array} parseList - array of parsers to run input through e.g. [\"value\", \"important\"]\n * @param {Number} currentIndex - start number to begin indexing\n * @param {Object} fileInfo - fileInfo to attach to created nodes\n */\n function parseNode(str, parseList, currentIndex, fileInfo, callback) {\n let result;\n const returnNodes = [];\n const parser = parserInput;\n\n try {\n parser.start(str, false, function fail(msg, index) {\n callback({\n message: msg,\n index: index + currentIndex\n });\n });\n for (let x = 0, p, i; (p = parseList[x]); x++) {\n i = parser.i;\n result = parsers[p]();\n if (result) {\n try {\n result._index = i + currentIndex;\n result._fileInfo = fileInfo;\n } catch (e) {}\n returnNodes.push(result);\n }\n else {\n returnNodes.push(null);\n }\n }\n\n const endInfo = parser.end();\n if (endInfo.isFinished) {\n callback(null, returnNodes);\n }\n else {\n callback(true, null);\n }\n } catch (e) {\n throw new LessError({\n index: e.index + currentIndex,\n message: e.message\n }, imports, fileInfo.filename);\n }\n }\n\n //\n // The Parser\n //\n return {\n parserInput,\n imports,\n fileInfo,\n parseNode,\n //\n // Parse an input string into an abstract syntax tree,\n // @param str A string containing 'less' markup\n // @param callback call `callback` when done.\n // @param [additionalData] An optional map which can contains vars - a map (key, value) of variables to apply\n //\n parse: function (str, callback, additionalData) {\n let root;\n let error = null;\n let globalVars;\n let modifyVars;\n let ignored;\n let preText = '';\n\n globalVars = (additionalData && additionalData.globalVars) ? `${Parser.serializeVars(additionalData.globalVars)}\\n` : '';\n modifyVars = (additionalData && additionalData.modifyVars) ? `\\n${Parser.serializeVars(additionalData.modifyVars)}` : '';\n\n if (context.pluginManager) {\n const preProcessors = context.pluginManager.getPreProcessors();\n for (let i = 0; i < preProcessors.length; i++) {\n str = preProcessors[i].process(str, { context, imports, fileInfo });\n }\n }\n\n if (globalVars || (additionalData && additionalData.banner)) {\n preText = ((additionalData && additionalData.banner) ? additionalData.banner : '') + globalVars;\n ignored = imports.contentsIgnoredChars;\n ignored[fileInfo.filename] = ignored[fileInfo.filename] || 0;\n ignored[fileInfo.filename] += preText.length;\n }\n\n str = str.replace(/\\r\\n?/g, '\\n');\n // Remove potential UTF Byte Order Mark\n str = preText + str.replace(/^\\uFEFF/, '') + modifyVars;\n imports.contents[fileInfo.filename] = str;\n\n // Start with the primary rule.\n // The whole syntax tree is held under a Ruleset node,\n // with the `root` property set to true, so no `{}` are\n // output. The callback is called when the input is parsed.\n try {\n parserInput.start(str, context.chunkInput, function fail(msg, index) {\n throw new LessError({\n index,\n type: 'Parse',\n message: msg,\n filename: fileInfo.filename\n }, imports);\n });\n\n tree.Node.prototype.parse = this;\n root = new tree.Ruleset(null, this.parsers.primary());\n tree.Node.prototype.rootNode = root;\n root.root = true;\n root.firstRoot = true;\n root.functionRegistry = functionRegistry.inherit();\n \n } catch (e) {\n return callback(new LessError(e, imports, fileInfo.filename));\n }\n\n // If `i` is smaller than the `input.length - 1`,\n // it means the parser wasn't able to parse the whole\n // string, so we've got a parsing error.\n //\n // We try to extract a \\n delimited string,\n // showing the line where the parse error occurred.\n // We split it up into two parts (the part which parsed,\n // and the part which didn't), so we can color them differently.\n const endInfo = parserInput.end();\n if (!endInfo.isFinished) {\n\n let message = endInfo.furthestPossibleErrorMessage;\n\n if (!message) {\n message = 'Unrecognised input';\n if (endInfo.furthestChar === '}') {\n message += '. Possibly missing opening \\'{\\'';\n } else if (endInfo.furthestChar === ')') {\n message += '. Possibly missing opening \\'(\\'';\n } else if (endInfo.furthestReachedEnd) {\n message += '. Possibly missing something';\n }\n }\n\n error = new LessError({\n type: 'Parse',\n message,\n index: endInfo.furthest,\n filename: fileInfo.filename\n }, imports);\n }\n\n const finish = e => {\n e = error || e || imports.error;\n\n if (e) {\n if (!(e instanceof LessError)) {\n e = new LessError(e, imports, fileInfo.filename);\n }\n\n return callback(e);\n }\n else {\n return callback(null, root);\n }\n };\n\n if (context.processImports !== false) {\n new visitors.ImportVisitor(imports, finish)\n .run(root);\n } else {\n return finish();\n }\n },\n\n //\n // Here in, the parsing rules/functions\n //\n // The basic structure of the syntax tree generated is as follows:\n //\n // Ruleset -> Declaration -> Value -> Expression -> Entity\n //\n // Here's some Less code:\n //\n // .class {\n // color: #fff;\n // border: 1px solid #000;\n // width: @w + 4px;\n // > .child {...}\n // }\n //\n // And here's what the parse tree might look like:\n //\n // Ruleset (Selector '.class', [\n // Declaration (\"color\", Value ([Expression [Color #fff]]))\n // Declaration (\"border\", Value ([Expression [Dimension 1px][Keyword \"solid\"][Color #000]]))\n // Declaration (\"width\", Value ([Expression [Operation \" + \" [Variable \"@w\"][Dimension 4px]]]))\n // Ruleset (Selector [Element '>', '.child'], [...])\n // ])\n //\n // In general, most rules will try to parse a token with the `$re()` function, and if the return\n // value is truly, will return a new node, of the relevant type. Sometimes, we need to check\n // first, before parsing, that's when we use `peek()`.\n //\n parsers: parsers = {\n //\n // The `primary` rule is the *entry* and *exit* point of the parser.\n // The rules here can appear at any level of the parse tree.\n //\n // The recursive nature of the grammar is an interplay between the `block`\n // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule,\n // as represented by this simplified grammar:\n //\n // primary → (ruleset | declaration)+\n // ruleset → selector+ block\n // block → '{' primary '}'\n //\n // Only at one point is the primary rule not called from the\n // block rule: at the root level.\n //\n primary: function () {\n const mixin = this.mixin;\n let root = [];\n let node;\n\n while (true) {\n while (true) {\n node = this.comment();\n if (!node) { break; }\n root.push(node);\n }\n // always process comments before deciding if finished\n if (parserInput.finished) {\n break;\n }\n if (parserInput.peek('}')) {\n break;\n }\n\n node = this.extendRule();\n if (node) {\n root = root.concat(node);\n continue;\n }\n\n node = mixin.definition() || this.declaration() || mixin.call(false, false) || \n this.ruleset() || this.variableCall() || this.entities.call() || this.atrule();\n if (node) {\n root.push(node);\n } else {\n let foundSemiColon = false;\n while (parserInput.$char(';')) {\n foundSemiColon = true;\n }\n if (!foundSemiColon) {\n break;\n }\n }\n }\n\n return root;\n },\n\n // comments are collected by the main parsing mechanism and then assigned to nodes\n // where the current structure allows it\n comment: function () {\n if (parserInput.commentStore.length) {\n const comment = parserInput.commentStore.shift();\n return new(tree.Comment)(comment.text, comment.isLineComment, comment.index, fileInfo);\n }\n },\n\n //\n // Entities are tokens which can be found inside an Expression\n //\n entities: {\n mixinLookup: function() {\n return parsers.mixin.call(true, true);\n },\n //\n // A string, which supports escaping \" and '\n //\n // \"milky way\" 'he\\'s the one!'\n //\n quoted: function (forceEscaped) {\n let str;\n const index = parserInput.i;\n let isEscaped = false;\n\n parserInput.save();\n if (parserInput.$char('~')) {\n isEscaped = true;\n } else if (forceEscaped) {\n parserInput.restore();\n return;\n }\n\n str = parserInput.$quoted();\n if (!str) {\n parserInput.restore();\n return;\n }\n parserInput.forget();\n\n return new(tree.Quoted)(str.charAt(0), str.substr(1, str.length - 2), isEscaped, index, fileInfo);\n },\n\n //\n // A catch-all word, such as:\n //\n // black border-collapse\n //\n keyword: function () {\n const k = parserInput.$char('%') || parserInput.$re(/^\\[?(?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+\\]?/);\n if (k) {\n return tree.Color.fromKeyword(k) || new(tree.Keyword)(k);\n }\n },\n\n //\n // A function call\n //\n // rgb(255, 0, 255)\n //\n // The arguments are parsed with the `entities.arguments` parser.\n //\n call: function () {\n let name;\n let args;\n let func;\n const index = parserInput.i;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (parserInput.peek(/^url\\(/i)) {\n return;\n }\n\n parserInput.save();\n\n name = parserInput.$re(/^([\\w-]+|%|progid:[\\w\\.]+)\\(/);\n if (!name) {\n parserInput.forget(); \n return;\n }\n\n name = name[1];\n func = this.customFuncCall(name);\n if (func) {\n args = func.parse();\n if (args && func.stop) {\n parserInput.forget();\n return args;\n }\n }\n\n args = this.arguments(args);\n\n if (!parserInput.$char(')')) {\n parserInput.restore('Could not parse call arguments or missing \\')\\'');\n return;\n }\n\n parserInput.forget();\n\n return new(tree.Call)(name, args, index, fileInfo);\n },\n \n //\n // Parsing rules for functions with non-standard args, e.g.:\n //\n // boolean(not(2 > 1))\n //\n // This is a quick prototype, to be modified/improved when\n // more custom-parsed funcs come (e.g. `selector(...)`)\n //\n\n customFuncCall: function (name) {\n /* Ideally the table is to be moved out of here for faster perf.,\n but it's quite tricky since it relies on all these `parsers`\n and `expect` available only here */\n return {\n alpha: f(parsers.ieAlpha, true),\n boolean: f(condition),\n 'if': f(condition)\n }[name.toLowerCase()];\n\n function f(parse, stop) {\n return {\n parse, // parsing function\n stop // when true - stop after parse() and return its result, \n // otherwise continue for plain args\n };\n }\n \n function condition() {\n return [expect(parsers.condition, 'expected condition')];\n }\n },\n\n arguments: function (prevArgs) {\n let argsComma = prevArgs || [];\n const argsSemiColon = [];\n let isSemiColonSeparated;\n let value;\n\n parserInput.save();\n\n while (true) {\n if (prevArgs) {\n prevArgs = false;\n } else {\n value = parsers.detachedRuleset() || this.assignment() || parsers.expression();\n if (!value) {\n break;\n }\n\n if (value.value && value.value.length == 1) {\n value = value.value[0];\n }\n\n argsComma.push(value);\n }\n\n if (parserInput.$char(',')) {\n continue;\n }\n\n if (parserInput.$char(';') || isSemiColonSeparated) {\n isSemiColonSeparated = true;\n value = (argsComma.length < 1) ? argsComma[0]\n : new tree.Value(argsComma);\n argsSemiColon.push(value);\n argsComma = [];\n }\n }\n\n parserInput.forget();\n return isSemiColonSeparated ? argsSemiColon : argsComma;\n },\n literal: function () {\n return this.dimension() ||\n this.color() ||\n this.quoted() ||\n this.unicodeDescriptor();\n },\n\n // Assignments are argument entities for calls.\n // They are present in ie filter properties as shown below.\n //\n // filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* )\n //\n\n assignment: function () {\n let key;\n let value;\n parserInput.save();\n key = parserInput.$re(/^\\w+(?=\\s?=)/i);\n if (!key) {\n parserInput.restore();\n return;\n }\n if (!parserInput.$char('=')) {\n parserInput.restore();\n return;\n }\n value = parsers.entity();\n if (value) {\n parserInput.forget();\n return new(tree.Assignment)(key, value);\n } else {\n parserInput.restore();\n }\n },\n\n //\n // Parse url() tokens\n //\n // We use a specific rule for urls, because they don't really behave like\n // standard function calls. The difference is that the argument doesn't have\n // to be enclosed within a string, so it can't be parsed as an Expression.\n //\n url: function () {\n let value;\n const index = parserInput.i;\n\n parserInput.autoCommentAbsorb = false;\n\n if (!parserInput.$str('url(')) {\n parserInput.autoCommentAbsorb = true;\n return;\n }\n\n value = this.quoted() || this.variable() || this.property() ||\n parserInput.$re(/^(?:(?:\\\\[\\(\\)'\"])|[^\\(\\)'\"])+/) || '';\n\n parserInput.autoCommentAbsorb = true;\n\n expectChar(')');\n\n return new(tree.URL)((value.value != null || \n value instanceof tree.Variable || \n value instanceof tree.Property) ?\n value : new(tree.Anonymous)(value, index), index, fileInfo);\n },\n\n //\n // A Variable entity, such as `@fink`, in\n //\n // width: @fink + 2px\n //\n // We use a different parser for variable definitions,\n // see `parsers.variable`.\n //\n variable: function () {\n let ch;\n let name;\n const index = parserInput.i;\n\n parserInput.save();\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^@@?[\\w-]+/))) {\n ch = parserInput.currentChar();\n if (ch === '(' || ch === '[' && !parserInput.prevChar().match(/^\\s/)) {\n // this may be a VariableCall lookup\n const result = parsers.variableCall(name);\n if (result) {\n parserInput.forget();\n return result;\n }\n }\n parserInput.forget();\n return new(tree.Variable)(name, index, fileInfo);\n }\n parserInput.restore();\n },\n\n // A variable entity using the protective {} e.g. @{var}\n variableCurly: function () {\n let curly;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '@' && (curly = parserInput.$re(/^@\\{([\\w-]+)\\}/))) {\n return new(tree.Variable)(`@${curly[1]}`, index, fileInfo);\n }\n },\n //\n // A Property accessor, such as `$color`, in\n //\n // background-color: $color\n //\n property: function () {\n let name;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' && (name = parserInput.$re(/^\\$[\\w-]+/))) {\n return new(tree.Property)(name, index, fileInfo);\n }\n },\n\n // A property entity useing the protective {} e.g. ${prop}\n propertyCurly: function () {\n let curly;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' && (curly = parserInput.$re(/^\\$\\{([\\w-]+)\\}/))) {\n return new(tree.Property)(`$${curly[1]}`, index, fileInfo);\n }\n },\n //\n // A Hexadecimal color\n //\n // #4F3C2F\n //\n // `rgb` and `hsl` colors are parsed through the `entities.call` parser.\n //\n color: function () {\n let rgb;\n parserInput.save();\n\n if (parserInput.currentChar() === '#' && (rgb = parserInput.$re(/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})([\\w.#\\[])?/))) {\n if (!rgb[2]) {\n parserInput.forget();\n return new(tree.Color)(rgb[1], undefined, rgb[0]);\n } \n }\n parserInput.restore();\n },\n\n colorKeyword: function () {\n parserInput.save();\n const autoCommentAbsorb = parserInput.autoCommentAbsorb;\n parserInput.autoCommentAbsorb = false;\n const k = parserInput.$re(/^[_A-Za-z-][_A-Za-z0-9-]+/);\n parserInput.autoCommentAbsorb = autoCommentAbsorb;\n if (!k) {\n parserInput.forget();\n return;\n }\n parserInput.restore();\n const color = tree.Color.fromKeyword(k);\n if (color) {\n parserInput.$str(k);\n return color;\n }\n },\n\n //\n // A Dimension, that is, a number and a unit\n //\n // 0.5em 95%\n //\n dimension: function () {\n if (parserInput.peekNotNumeric()) {\n return;\n }\n\n const value = parserInput.$re(/^([+-]?\\d*\\.?\\d+)(%|[a-z_]+)?/i);\n if (value) {\n return new(tree.Dimension)(value[1], value[2]);\n }\n },\n\n //\n // A unicode descriptor, as is used in unicode-range\n //\n // U+0?? or U+00A1-00A9\n //\n unicodeDescriptor: function () {\n let ud;\n\n ud = parserInput.$re(/^U\\+[0-9a-fA-F?]+(\\-[0-9a-fA-F?]+)?/);\n if (ud) {\n return new(tree.UnicodeDescriptor)(ud[0]);\n }\n },\n\n //\n // JavaScript code to be evaluated\n //\n // `window.location.href`\n //\n javascript: function () {\n let js;\n const index = parserInput.i;\n\n parserInput.save();\n\n const escape = parserInput.$char('~');\n const jsQuote = parserInput.$char('`');\n\n if (!jsQuote) {\n parserInput.restore();\n return;\n }\n\n js = parserInput.$re(/^[^`]*`/);\n if (js) {\n parserInput.forget();\n return new(tree.JavaScript)(js.substr(0, js.length - 1), Boolean(escape), index, fileInfo);\n }\n parserInput.restore('invalid javascript definition');\n }\n },\n\n //\n // The variable part of a variable definition. Used in the `rule` parser\n //\n // @fink:\n //\n variable: function () {\n let name;\n\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^(@[\\w-]+)\\s*:/))) { return name[1]; }\n },\n\n //\n // Call a variable value to retrieve a detached ruleset\n // or a value from a detached ruleset's rules.\n //\n // @fink();\n // @fink;\n // color: @fink[@color];\n //\n variableCall: function (parsedName) {\n let lookups;\n const i = parserInput.i;\n const inValue = !!parsedName;\n let name = parsedName;\n\n parserInput.save();\n\n if (name || (parserInput.currentChar() === '@'\n && (name = parserInput.$re(/^(@[\\w-]+)(\\(\\s*\\))?/)))) {\n\n lookups = this.mixin.ruleLookups();\n\n if (!lookups && ((inValue && parserInput.$str('()') !== '()') || (name[2] !== '()'))) {\n parserInput.restore('Missing \\'[...]\\' lookup in variable call');\n return;\n }\n\n if (!inValue) {\n name = name[1];\n }\n\n const call = new tree.VariableCall(name, i, fileInfo);\n if (!inValue && parsers.end()) {\n parserInput.forget();\n return call;\n }\n else {\n parserInput.forget();\n return new tree.NamespaceValue(call, lookups, i, fileInfo);\n }\n }\n\n parserInput.restore();\n },\n\n //\n // extend syntax - used to extend selectors\n //\n extend: function(isRule) {\n let elements;\n let e;\n const index = parserInput.i;\n let option;\n let extendList;\n let extend;\n\n if (!parserInput.$str(isRule ? '&:extend(' : ':extend(')) {\n return;\n }\n\n do {\n option = null;\n elements = null;\n while (!(option = parserInput.$re(/^(all)(?=\\s*(\\)|,))/))) {\n e = this.element();\n if (!e) {\n break;\n }\n if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n }\n\n option = option && option[1];\n if (!elements) {\n error('Missing target selector for :extend().');\n }\n extend = new(tree.Extend)(new(tree.Selector)(elements), option, index, fileInfo);\n if (extendList) {\n extendList.push(extend);\n } else {\n extendList = [ extend ];\n }\n } while (parserInput.$char(','));\n\n expect(/^\\)/);\n\n if (isRule) {\n expect(/^;/);\n }\n\n return extendList;\n },\n\n //\n // extendRule - used in a rule to extend all the parent selectors\n //\n extendRule: function() {\n return this.extend(true);\n },\n\n //\n // Mixins\n //\n mixin: {\n //\n // A Mixin call, with an optional argument list\n //\n // #mixins > .square(#fff);\n // #mixins.square(#fff);\n // .rounded(4px, black);\n // .button;\n //\n // We can lookup / return a value using the lookup syntax:\n //\n // color: #mixin.square(#fff)[@color];\n //\n // The `while` loop is there because mixins can be\n // namespaced, but we only support the child and descendant\n // selector for now.\n //\n call: function (inValue, getLookup) {\n const s = parserInput.currentChar();\n let important = false;\n let lookups;\n const index = parserInput.i;\n let elements;\n let args;\n let hasParens;\n\n if (s !== '.' && s !== '#') { return; }\n\n parserInput.save(); // stop us absorbing part of an invalid selector\n\n elements = this.elements();\n\n if (elements) {\n if (parserInput.$char('(')) {\n args = this.args(true).args;\n expectChar(')');\n hasParens = true;\n }\n\n if (getLookup !== false) {\n lookups = this.ruleLookups();\n }\n if (getLookup === true && !lookups) {\n parserInput.restore();\n return;\n }\n\n if (inValue && !lookups && !hasParens) {\n // This isn't a valid in-value mixin call\n parserInput.restore();\n return;\n }\n\n if (!inValue && parsers.important()) {\n important = true;\n }\n\n if (inValue || parsers.end()) {\n parserInput.forget();\n const mixin = new(tree.mixin.Call)(elements, args, index, fileInfo, !lookups && important);\n if (lookups) {\n return new tree.NamespaceValue(mixin, lookups);\n }\n else {\n return mixin;\n }\n }\n }\n\n parserInput.restore();\n },\n /**\n * Matching elements for mixins\n * (Start with . or # and can have > )\n */\n elements: function() {\n let elements;\n let e;\n let c;\n let elem;\n let elemIndex;\n const re = /^[#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/;\n while (true) {\n elemIndex = parserInput.i;\n e = parserInput.$re(re);\n \n if (!e) {\n break;\n }\n elem = new(tree.Element)(c, e, false, elemIndex, fileInfo);\n if (elements) {\n elements.push(elem);\n } else {\n elements = [ elem ];\n }\n c = parserInput.$char('>');\n }\n return elements;\n },\n args: function (isCall) {\n const entities = parsers.entities;\n const returner = { args:null, variadic: false };\n let expressions = [];\n const argsSemiColon = [];\n const argsComma = [];\n let isSemiColonSeparated;\n let expressionContainsNamed;\n let name;\n let nameLoop;\n let value;\n let arg;\n let expand;\n let hasSep = true;\n\n parserInput.save();\n\n while (true) {\n if (isCall) {\n arg = parsers.detachedRuleset() || parsers.expression();\n } else {\n parserInput.commentStore.length = 0;\n if (parserInput.$str('...')) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ variadic: true });\n break;\n }\n arg = entities.variable() || entities.property() || entities.literal() || entities.keyword() || this.call(true);\n }\n\n if (!arg || !hasSep) {\n break;\n }\n\n nameLoop = null;\n if (arg.throwAwayComments) {\n arg.throwAwayComments();\n }\n value = arg;\n let val = null;\n\n if (isCall) {\n // Variable\n if (arg.value && arg.value.length == 1) {\n val = arg.value[0];\n }\n } else {\n val = arg;\n }\n\n if (val && (val instanceof tree.Variable || val instanceof tree.Property)) {\n if (parserInput.$char(':')) {\n if (expressions.length > 0) {\n if (isSemiColonSeparated) {\n error('Cannot mix ; and , as delimiter types');\n }\n expressionContainsNamed = true;\n }\n\n value = parsers.detachedRuleset() || parsers.expression();\n\n if (!value) {\n if (isCall) {\n error('could not understand value for named argument');\n } else {\n parserInput.restore();\n returner.args = [];\n return returner;\n }\n }\n nameLoop = (name = val.name);\n } else if (parserInput.$str('...')) {\n if (!isCall) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ name: arg.name, variadic: true });\n break;\n } else {\n expand = true;\n }\n } else if (!isCall) {\n name = nameLoop = val.name;\n value = null;\n }\n }\n\n if (value) {\n expressions.push(value);\n }\n\n argsComma.push({ name:nameLoop, value, expand });\n\n if (parserInput.$char(',')) {\n hasSep = true;\n continue;\n }\n hasSep = parserInput.$char(';') === ';';\n\n if (hasSep || isSemiColonSeparated) {\n\n if (expressionContainsNamed) {\n error('Cannot mix ; and , as delimiter types');\n }\n\n isSemiColonSeparated = true;\n\n if (expressions.length > 1) {\n value = new(tree.Value)(expressions);\n }\n argsSemiColon.push({ name, value, expand });\n\n name = null;\n expressions = [];\n expressionContainsNamed = false;\n }\n }\n\n parserInput.forget();\n returner.args = isSemiColonSeparated ? argsSemiColon : argsComma;\n return returner;\n },\n //\n // A Mixin definition, with a list of parameters\n //\n // .rounded (@radius: 2px, @color) {\n // ...\n // }\n //\n // Until we have a finer grained state-machine, we have to\n // do a look-ahead, to make sure we don't have a mixin call.\n // See the `rule` function for more information.\n //\n // We start by matching `.rounded (`, and then proceed on to\n // the argument list, which has optional default values.\n // We store the parameters in `params`, with a `value` key,\n // if there is a value, such as in the case of `@radius`.\n //\n // Once we've got our params list, and a closing `)`, we parse\n // the `{...}` block.\n //\n definition: function () {\n let name;\n let params = [];\n let match;\n let ruleset;\n let cond;\n let variadic = false;\n if ((parserInput.currentChar() !== '.' && parserInput.currentChar() !== '#') ||\n parserInput.peek(/^[^{]*\\}/)) {\n return;\n }\n\n parserInput.save();\n\n match = parserInput.$re(/^([#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\\s*\\(/);\n if (match) {\n name = match[1];\n\n const argInfo = this.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n\n // .mixincall(\"@{a}\");\n // looks a bit like a mixin definition..\n // also\n // .mixincall(@a: {rule: set;});\n // so we have to be nice and restore\n if (!parserInput.$char(')')) {\n parserInput.restore('Missing closing \\')\\'');\n return;\n }\n\n parserInput.commentStore.length = 0;\n\n if (parserInput.$str('when')) { // Guard\n cond = expect(parsers.conditions, 'expected condition');\n }\n\n ruleset = parsers.block();\n\n if (ruleset) {\n parserInput.forget();\n return new(tree.mixin.Definition)(name, params, ruleset, cond, variadic);\n } else {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n }\n },\n \n ruleLookups: function() {\n let rule;\n let args;\n const lookups = [];\n\n if (parserInput.currentChar() !== '[') { \n return;\n }\n\n while (true) {\n parserInput.save();\n args = null;\n rule = this.lookupValue();\n if (!rule && rule !== '') {\n parserInput.restore();\n break;\n }\n lookups.push(rule);\n parserInput.forget();\n }\n if (lookups.length > 0) {\n return lookups;\n }\n },\n \n lookupValue: function() {\n parserInput.save();\n \n if (!parserInput.$char('[')) { \n parserInput.restore();\n return;\n }\n \n const name = parserInput.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);\n \n if (!parserInput.$char(']')) {\n parserInput.restore();\n return;\n } \n\n if (name || name === '') {\n parserInput.forget();\n return name;\n }\n \n parserInput.restore();\n }\n },\n //\n // Entities are the smallest recognized token,\n // and can be found inside a rule's value.\n //\n entity: function () {\n const entities = this.entities;\n\n return this.comment() || entities.literal() || entities.variable() || entities.url() ||\n entities.property() || entities.call() || entities.keyword() || this.mixin.call(true) ||\n entities.javascript();\n },\n\n //\n // A Declaration terminator. Note that we use `peek()` to check for '}',\n // because the `block` rule will be expecting it, but we still need to make sure\n // it's there, if ';' was omitted.\n //\n end: function () {\n return parserInput.$char(';') || parserInput.peek('}');\n },\n\n //\n // IE's alpha function\n //\n // alpha(opacity=88)\n //\n ieAlpha: function () {\n let value;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (!parserInput.$re(/^opacity=/i)) { return; }\n value = parserInput.$re(/^\\d+/);\n if (!value) {\n value = expect(parsers.entities.variable, 'Could not parse alpha');\n value = `@{${value.name.slice(1)}}`;\n }\n expectChar(')');\n return new tree.Quoted('', `alpha(opacity=${value})`);\n },\n\n //\n // A Selector Element\n //\n // div\n // + h1\n // #socks\n // input[type=\"text\"]\n //\n // Elements are the building blocks for Selectors,\n // they are made out of a `Combinator` (see combinator rule),\n // and an element name, such as a tag a class, or `*`.\n //\n element: function () {\n let e;\n let c;\n let v;\n const index = parserInput.i;\n\n c = this.combinator();\n\n e = parserInput.$re(/^(?:\\d+\\.\\d+|\\d+)%/) ||\n parserInput.$re(/^(?:[.#]?|:*)(?:[\\w-]|[^\\x00-\\x9f]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/) ||\n parserInput.$char('*') || parserInput.$char('&') || this.attribute() ||\n parserInput.$re(/^\\([^&()@]+\\)/) || parserInput.$re(/^[\\.#:](?=@)/) ||\n this.entities.variableCurly();\n\n if (!e) {\n parserInput.save();\n if (parserInput.$char('(')) {\n if ((v = this.selector(false)) && parserInput.$char(')')) {\n e = new(tree.Paren)(v);\n parserInput.forget();\n } else {\n parserInput.restore('Missing closing \\')\\'');\n }\n } else {\n parserInput.forget();\n }\n }\n\n if (e) { return new(tree.Element)(c, e, e instanceof tree.Variable, index, fileInfo); }\n },\n\n //\n // Combinators combine elements together, in a Selector.\n //\n // Because our parser isn't white-space sensitive, special care\n // has to be taken, when parsing the descendant combinator, ` `,\n // as it's an empty space. We have to check the previous character\n // in the input, to see if it's a ` ` character. More info on how\n // we deal with this in *combinator.js*.\n //\n combinator: function () {\n let c = parserInput.currentChar();\n\n if (c === '/') {\n parserInput.save();\n const slashedCombinator = parserInput.$re(/^\\/[a-z]+\\//i);\n if (slashedCombinator) {\n parserInput.forget();\n return new(tree.Combinator)(slashedCombinator);\n }\n parserInput.restore();\n }\n\n if (c === '>' || c === '+' || c === '~' || c === '|' || c === '^') {\n parserInput.i++;\n if (c === '^' && parserInput.currentChar() === '^') {\n c = '^^';\n parserInput.i++;\n }\n while (parserInput.isWhitespace()) { parserInput.i++; }\n return new(tree.Combinator)(c);\n } else if (parserInput.isWhitespace(-1)) {\n return new(tree.Combinator)(' ');\n } else {\n return new(tree.Combinator)(null);\n }\n },\n //\n // A CSS Selector\n // with less extensions e.g. the ability to extend and guard\n //\n // .class > div + h1\n // li a:hover\n //\n // Selectors are made out of one or more Elements, see above.\n //\n selector: function (isLess) {\n const index = parserInput.i;\n let elements;\n let extendList;\n let c;\n let e;\n let allExtends;\n let when;\n let condition;\n isLess = isLess !== false;\n while ((isLess && (extendList = this.extend())) || (isLess && (when = parserInput.$str('when'))) || (e = this.element())) {\n if (when) {\n condition = expect(this.conditions, 'expected condition');\n } else if (condition) {\n error('CSS guard can only be used at the end of selector');\n } else if (extendList) {\n if (allExtends) {\n allExtends = allExtends.concat(extendList);\n } else {\n allExtends = extendList;\n }\n } else {\n if (allExtends) { error('Extend can only be used at the end of selector'); }\n c = parserInput.currentChar();\n if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n e = null;\n }\n if (c === '{' || c === '}' || c === ';' || c === ',' || c === ')') {\n break;\n }\n }\n\n if (elements) { return new(tree.Selector)(elements, allExtends, condition, index, fileInfo); }\n if (allExtends) { error('Extend must be used to extend a selector, it cannot be used on its own'); }\n },\n selectors: function () {\n let s;\n let selectors;\n while (true) {\n s = this.selector();\n if (!s) {\n break;\n }\n if (selectors) {\n selectors.push(s);\n } else {\n selectors = [ s ];\n }\n parserInput.commentStore.length = 0;\n if (s.condition && selectors.length > 1) {\n error(\"Guards are only currently allowed on a single selector.\");\n }\n if (!parserInput.$char(',')) { break; }\n if (s.condition) {\n error(\"Guards are only currently allowed on a single selector.\");\n }\n parserInput.commentStore.length = 0;\n }\n return selectors;\n },\n attribute: function () {\n if (!parserInput.$char('[')) { return; }\n\n const entities = this.entities;\n let key;\n let val;\n let op;\n\n if (!(key = entities.variableCurly())) {\n key = expect(/^(?:[_A-Za-z0-9-\\*]*\\|)?(?:[_A-Za-z0-9-]|\\\\.)+/);\n }\n\n op = parserInput.$re(/^[|~*$^]?=/);\n if (op) {\n val = entities.quoted() || parserInput.$re(/^[0-9]+%/) || parserInput.$re(/^[\\w-]+/) || entities.variableCurly();\n }\n\n expectChar(']');\n\n return new(tree.Attribute)(key, op, val);\n },\n\n //\n // The `block` rule is used by `ruleset` and `mixin.definition`.\n // It's a wrapper around the `primary` rule, with added `{}`.\n //\n block: function () {\n let content;\n if (parserInput.$char('{') && (content = this.primary()) && parserInput.$char('}')) {\n return content;\n }\n },\n\n blockRuleset: function() {\n let block = this.block();\n\n if (block) {\n block = new tree.Ruleset(null, block);\n }\n return block;\n },\n\n detachedRuleset: function() {\n let argInfo;\n let params;\n let variadic;\n\n parserInput.save();\n if (parserInput.$re(/^[.#]\\(/)) {\n /**\n * DR args currently only implemented for each() function, and not \n * yet settable as `@dr: #(@arg) {}`\n * This should be done when DRs are merged with mixins.\n * See: https://github.com/less/less-meta/issues/16\n */\n argInfo = this.mixin.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n if (!parserInput.$char(')')) {\n parserInput.restore();\n return;\n }\n }\n const blockRuleset = this.blockRuleset();\n if (blockRuleset) {\n parserInput.forget();\n if (params) {\n return new tree.mixin.Definition(null, params, blockRuleset, null, variadic);\n }\n return new tree.DetachedRuleset(blockRuleset);\n }\n parserInput.restore();\n },\n\n //\n // div, .class, body > p {...}\n //\n ruleset: function () {\n let selectors;\n let rules;\n let debugInfo;\n\n parserInput.save();\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(parserInput.i);\n }\n\n selectors = this.selectors();\n\n if (selectors && (rules = this.block())) {\n parserInput.forget();\n const ruleset = new(tree.Ruleset)(selectors, rules, context.strictImports);\n if (context.dumpLineNumbers) {\n ruleset.debugInfo = debugInfo;\n }\n return ruleset;\n } else {\n parserInput.restore();\n }\n },\n declaration: function () {\n let name;\n let value;\n const index = parserInput.i;\n let hasDR;\n const c = parserInput.currentChar();\n let important;\n let merge;\n let isVariable;\n\n if (c === '.' || c === '#' || c === '&' || c === ':') { return; }\n\n parserInput.save();\n\n name = this.variable() || this.ruleProperty();\n if (name) {\n isVariable = typeof name === 'string';\n\n if (isVariable) {\n value = this.detachedRuleset();\n if (value) {\n hasDR = true;\n }\n }\n\n parserInput.commentStore.length = 0;\n if (!value) {\n // a name returned by this.ruleProperty() is always an array of the form:\n // [string-1, ..., string-n, \"\"] or [string-1, ..., string-n, \"+\"]\n // where each item is a tree.Keyword or tree.Variable\n merge = !isVariable && name.length > 1 && name.pop().value;\n\n // Custom property values get permissive parsing\n if (name[0].value && name[0].value.slice(0, 2) === '--') {\n value = this.permissiveValue();\n }\n // Try to store values as anonymous\n // If we need the value later we'll re-parse it in ruleset.parseValue\n else {\n value = this.anonymousValue();\n }\n if (value) {\n parserInput.forget();\n // anonymous values absorb the end ';' which is required for them to work\n return new(tree.Declaration)(name, value, false, merge, index, fileInfo);\n }\n\n if (!value) {\n value = this.value();\n }\n\n if (value) {\n important = this.important();\n } else if (isVariable) {\n // As a last resort, try permissiveValue\n value = this.permissiveValue();\n }\n }\n\n if (value && (this.end() || hasDR)) {\n parserInput.forget();\n return new(tree.Declaration)(name, value, important, merge, index, fileInfo);\n }\n else {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n }\n },\n anonymousValue: function () {\n const index = parserInput.i;\n const match = parserInput.$re(/^([^.#@\\$+\\/'\"*`(;{}-]*);/);\n if (match) {\n return new(tree.Anonymous)(match[1], index);\n }\n },\n /**\n * Used for custom properties, at-rules, and variables (as fallback)\n * Parses almost anything inside of {} [] () \"\" blocks\n * until it reaches outer-most tokens.\n * \n * First, it will try to parse comments and entities to reach\n * the end. This is mostly like the Expression parser except no\n * math is allowed.\n */\n permissiveValue: function (untilTokens) {\n let i;\n let e;\n let done;\n let value;\n const tok = untilTokens || ';';\n const index = parserInput.i;\n const result = [];\n\n function testCurrentChar() {\n const char = parserInput.currentChar();\n if (typeof tok === 'string') {\n return char === tok;\n } else {\n return tok.test(char);\n }\n }\n if (testCurrentChar()) {\n return;\n }\n value = [];\n do {\n e = this.comment();\n if (e) {\n value.push(e);\n continue;\n }\n e = this.entity();\n if (e) {\n value.push(e);\n }\n } while (e);\n\n done = testCurrentChar();\n\n if (value.length > 0) {\n value = new(tree.Expression)(value);\n if (done) {\n return value;\n }\n else {\n result.push(value);\n }\n // Preserve space before $parseUntil as it will not\n if (parserInput.prevChar() === ' ') {\n result.push(new tree.Anonymous(' ', index));\n }\n }\n parserInput.save();\n\n value = parserInput.$parseUntil(tok);\n\n if (value) {\n if (typeof value === 'string') {\n error(`Expected '${value}'`, 'Parse');\n }\n if (value.length === 1 && value[0] === ' ') {\n parserInput.forget();\n return new tree.Anonymous('', index);\n }\n let item;\n for (i = 0; i < value.length; i++) {\n item = value[i];\n if (Array.isArray(item)) {\n // Treat actual quotes as normal quoted values\n result.push(new tree.Quoted(item[0], item[1], true, index, fileInfo));\n }\n else {\n if (i === value.length - 1) {\n item = item.trim();\n }\n // Treat like quoted values, but replace vars like unquoted expressions\n const quote = new tree.Quoted('\\'', item, true, index, fileInfo);\n quote.variableRegex = /@([\\w-]+)/g;\n quote.propRegex = /\\$([\\w-]+)/g;\n result.push(quote);\n }\n }\n parserInput.forget();\n return new tree.Expression(result, true);\n }\n parserInput.restore();\n },\n\n //\n // An @import atrule\n //\n // @import \"lib\";\n //\n // Depending on our environment, importing is done differently:\n // In the browser, it's an XHR request, in Node, it would be a\n // file-system operation. The function used for importing is\n // stored in `import`, which we pass to the Import constructor.\n //\n 'import': function () {\n let path;\n let features;\n const index = parserInput.i;\n\n const dir = parserInput.$re(/^@import?\\s+/);\n\n if (dir) {\n const options = (dir ? this.importOptions() : null) || {};\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n features = this.mediaFeatures();\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon or unrecognised media features on import');\n }\n features = features && new(tree.Value)(features);\n return new(tree.Import)(path, features, options, index, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed import statement');\n }\n }\n },\n\n importOptions: function() {\n let o;\n const options = {};\n let optionName;\n let value;\n\n // list of options, surrounded by parens\n if (!parserInput.$char('(')) { return null; }\n do {\n o = this.importOption();\n if (o) {\n optionName = o;\n value = true;\n switch (optionName) {\n case 'css':\n optionName = 'less';\n value = false;\n break;\n case 'once':\n optionName = 'multiple';\n value = false;\n break;\n }\n options[optionName] = value;\n if (!parserInput.$char(',')) { break; }\n }\n } while (o);\n expectChar(')');\n return options;\n },\n\n importOption: function() {\n const opt = parserInput.$re(/^(less|css|multiple|once|inline|reference|optional)/);\n if (opt) {\n return opt[1];\n }\n },\n\n mediaFeature: function () {\n const entities = this.entities;\n const nodes = [];\n let e;\n let p;\n parserInput.save();\n do {\n e = entities.keyword() || entities.variable() || entities.mixinLookup();\n if (e) {\n nodes.push(e);\n } else if (parserInput.$char('(')) {\n p = this.property();\n e = this.value();\n if (parserInput.$char(')')) {\n if (p && e) {\n nodes.push(new(tree.Paren)(new(tree.Declaration)(p, e, null, null, parserInput.i, fileInfo, true)));\n } else if (e) {\n nodes.push(new(tree.Paren)(e));\n } else {\n error('badly formed media feature definition');\n }\n } else {\n error('Missing closing \\')\\'', 'Parse');\n }\n }\n } while (e);\n\n parserInput.forget();\n if (nodes.length > 0) {\n return new(tree.Expression)(nodes);\n }\n },\n\n mediaFeatures: function () {\n const entities = this.entities;\n const features = [];\n let e;\n do {\n e = this.mediaFeature();\n if (e) {\n features.push(e);\n if (!parserInput.$char(',')) { break; }\n } else {\n e = entities.variable() || entities.mixinLookup();\n if (e) {\n features.push(e);\n if (!parserInput.$char(',')) { break; }\n }\n }\n } while (e);\n\n return features.length > 0 ? features : null;\n },\n\n media: function () {\n let features;\n let rules;\n let media;\n let debugInfo;\n const index = parserInput.i;\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(index);\n }\n\n parserInput.save();\n\n if (parserInput.$str('@media')) {\n features = this.mediaFeatures();\n\n rules = this.block();\n\n if (!rules) {\n error('media definitions require block statements after any features');\n }\n\n parserInput.forget();\n\n media = new(tree.Media)(rules, features, index, fileInfo);\n if (context.dumpLineNumbers) {\n media.debugInfo = debugInfo;\n }\n\n return media;\n }\n\n parserInput.restore();\n },\n\n //\n\n // A @plugin directive, used to import plugins dynamically.\n //\n // @plugin (args) \"lib\";\n //\n plugin: function () {\n let path;\n let args;\n let options;\n const index = parserInput.i;\n const dir = parserInput.$re(/^@plugin?\\s+/);\n\n if (dir) {\n args = this.pluginArgs();\n\n if (args) {\n options = {\n pluginArgs: args,\n isPlugin: true\n };\n }\n else {\n options = { isPlugin: true };\n }\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon on @plugin');\n }\n return new(tree.Import)(path, null, options, index, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed @plugin statement');\n }\n }\n },\n\n pluginArgs: function() {\n // list of options, surrounded by parens\n parserInput.save();\n if (!parserInput.$char('(')) {\n parserInput.restore();\n return null;\n }\n const args = parserInput.$re(/^\\s*([^\\);]+)\\)\\s*/);\n if (args[1]) {\n parserInput.forget();\n return args[1].trim();\n }\n else { \n parserInput.restore();\n return null;\n }\n },\n\n //\n // A CSS AtRule\n //\n // @charset \"utf-8\";\n //\n atrule: function () {\n const index = parserInput.i;\n let name;\n let value;\n let rules;\n let nonVendorSpecificName;\n let hasIdentifier;\n let hasExpression;\n let hasUnknown;\n let hasBlock = true;\n let isRooted = true;\n\n if (parserInput.currentChar() !== '@') { return; }\n\n value = this['import']() || this.plugin() || this.media();\n if (value) {\n return value;\n }\n\n parserInput.save();\n\n name = parserInput.$re(/^@[a-z-]+/);\n\n if (!name) { return; }\n\n nonVendorSpecificName = name;\n if (name.charAt(1) == '-' && name.indexOf('-', 2) > 0) {\n nonVendorSpecificName = `@${name.slice(name.indexOf('-', 2) + 1)}`;\n }\n\n switch (nonVendorSpecificName) {\n case '@charset':\n hasIdentifier = true;\n hasBlock = false;\n break;\n case '@namespace':\n hasExpression = true;\n hasBlock = false;\n break;\n case '@keyframes':\n case '@counter-style':\n hasIdentifier = true;\n break;\n case '@document':\n case '@supports':\n hasUnknown = true;\n isRooted = false;\n break;\n default:\n hasUnknown = true;\n break;\n }\n\n parserInput.commentStore.length = 0;\n\n if (hasIdentifier) {\n value = this.entity();\n if (!value) {\n error(`expected ${name} identifier`);\n }\n } else if (hasExpression) {\n value = this.expression();\n if (!value) {\n error(`expected ${name} expression`);\n }\n } else if (hasUnknown) {\n value = this.permissiveValue(/^[{;]/);\n hasBlock = (parserInput.currentChar() === '{');\n if (!value) {\n if (!hasBlock && parserInput.currentChar() !== ';') {\n error(`${name} rule is missing block or ending semi-colon`);\n }\n }\n else if (!value.value) {\n value = null;\n }\n }\n\n if (hasBlock) {\n rules = this.blockRuleset();\n }\n\n if (rules || (!hasBlock && value && parserInput.$char(';'))) {\n parserInput.forget();\n return new(tree.AtRule)(name, value, rules, index, fileInfo,\n context.dumpLineNumbers ? getDebugInfo(index) : null,\n isRooted\n );\n }\n\n parserInput.restore('at-rule options not recognised');\n },\n\n //\n // A Value is a comma-delimited list of Expressions\n //\n // font-family: Baskerville, Georgia, serif;\n //\n // In a Rule, a Value represents everything after the `:`,\n // and before the `;`.\n //\n value: function () {\n let e;\n const expressions = [];\n const index = parserInput.i;\n\n do {\n e = this.expression();\n if (e) {\n expressions.push(e);\n if (!parserInput.$char(',')) { break; }\n }\n } while (e);\n\n if (expressions.length > 0) {\n return new(tree.Value)(expressions, index);\n }\n },\n important: function () {\n if (parserInput.currentChar() === '!') {\n return parserInput.$re(/^! *important/);\n }\n },\n sub: function () {\n let a;\n let e;\n\n parserInput.save();\n if (parserInput.$char('(')) {\n a = this.addition();\n if (a && parserInput.$char(')')) {\n parserInput.forget();\n e = new(tree.Expression)([a]);\n e.parens = true;\n return e;\n }\n parserInput.restore('Expected \\')\\'');\n return;\n }\n parserInput.restore();\n },\n multiplication: function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.operand();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1);\n while (true) {\n if (parserInput.peek(/^\\/[*\\/]/)) {\n break;\n }\n\n parserInput.save();\n\n op = parserInput.$char('/') || parserInput.$char('*') || parserInput.$str('./');\n\n if (!op) { parserInput.forget(); break; }\n\n a = this.operand();\n\n if (!a) { parserInput.restore(); break; }\n parserInput.forget();\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n isSpaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n addition: function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.multiplication();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1);\n while (true) {\n op = parserInput.$re(/^[-+]\\s+/) || (!isSpaced && (parserInput.$char('+') || parserInput.$char('-')));\n if (!op) {\n break;\n }\n a = this.multiplication();\n if (!a) {\n break;\n }\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n isSpaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n conditions: function () {\n let a;\n let b;\n const index = parserInput.i;\n let condition;\n\n a = this.condition(true);\n if (a) {\n while (true) {\n if (!parserInput.peek(/^,\\s*(not\\s*)?\\(/) || !parserInput.$char(',')) {\n break;\n }\n b = this.condition(true);\n if (!b) {\n break;\n }\n condition = new(tree.Condition)('or', condition || a, b, index);\n }\n return condition || a;\n }\n },\n condition: function (needsParens) {\n let result;\n let logical;\n let next;\n function or() {\n return parserInput.$str('or');\n }\n\n result = this.conditionAnd(needsParens);\n if (!result) {\n return ;\n }\n logical = or();\n if (logical) {\n next = this.condition(needsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n }\n }\n return result;\n },\n conditionAnd: function (needsParens) {\n let result;\n let logical;\n let next;\n const self = this;\n function insideCondition() {\n const cond = self.negatedCondition(needsParens) || self.parenthesisCondition(needsParens);\n if (!cond && !needsParens) {\n return self.atomicCondition(needsParens);\n }\n return cond;\n }\n function and() {\n return parserInput.$str('and');\n }\n\n result = insideCondition();\n if (!result) {\n return ;\n }\n logical = and();\n if (logical) {\n next = this.conditionAnd(needsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n }\n }\n return result;\n },\n negatedCondition: function (needsParens) {\n if (parserInput.$str('not')) {\n const result = this.parenthesisCondition(needsParens);\n if (result) {\n result.negate = !result.negate;\n }\n return result;\n }\n },\n parenthesisCondition: function (needsParens) {\n function tryConditionFollowedByParenthesis(me) {\n let body;\n parserInput.save();\n body = me.condition(needsParens);\n if (!body) {\n parserInput.restore();\n return ;\n }\n if (!parserInput.$char(')')) {\n parserInput.restore();\n return ;\n }\n parserInput.forget();\n return body;\n }\n\n let body;\n parserInput.save();\n if (!parserInput.$str('(')) {\n parserInput.restore();\n return ;\n }\n body = tryConditionFollowedByParenthesis(this);\n if (body) {\n parserInput.forget();\n return body;\n }\n\n body = this.atomicCondition(needsParens);\n if (!body) {\n parserInput.restore();\n return ;\n }\n if (!parserInput.$char(')')) {\n parserInput.restore(`expected ')' got '${parserInput.currentChar()}'`);\n return ;\n }\n parserInput.forget();\n return body;\n },\n atomicCondition: function (needsParens) {\n const entities = this.entities;\n const index = parserInput.i;\n let a;\n let b;\n let c;\n let op;\n\n function cond() {\n return this.addition() || entities.keyword() || entities.quoted() || entities.mixinLookup();\n }\n cond = cond.bind(this);\n\n a = cond();\n if (a) {\n if (parserInput.$char('>')) {\n if (parserInput.$char('=')) {\n op = '>=';\n } else {\n op = '>';\n }\n } else\n if (parserInput.$char('<')) {\n if (parserInput.$char('=')) {\n op = '<=';\n } else {\n op = '<';\n }\n } else\n if (parserInput.$char('=')) {\n if (parserInput.$char('>')) {\n op = '=>';\n } else if (parserInput.$char('<')) {\n op = '=<';\n } else {\n op = '=';\n }\n }\n if (op) {\n b = cond();\n if (b) {\n c = new(tree.Condition)(op, a, b, index, false);\n } else {\n error('expected expression');\n }\n } else {\n c = new(tree.Condition)('=', a, new(tree.Keyword)('true'), index, false);\n }\n return c;\n }\n },\n\n //\n // An operand is anything that can be part of an operation,\n // such as a Color, or a Variable\n //\n operand: function () {\n const entities = this.entities;\n let negate;\n\n if (parserInput.peek(/^-[@\\$\\(]/)) {\n negate = parserInput.$char('-');\n }\n\n let o = this.sub() || entities.dimension() ||\n entities.color() || entities.variable() ||\n entities.property() || entities.call() ||\n entities.quoted(true) || entities.colorKeyword() ||\n entities.mixinLookup();\n\n if (negate) {\n o.parensInOp = true;\n o = new(tree.Negative)(o);\n }\n\n return o;\n },\n\n //\n // Expressions either represent mathematical operations,\n // or white-space delimited Entities.\n //\n // 1px solid black\n // @var * 2\n //\n expression: function () {\n const entities = [];\n let e;\n let delim;\n const index = parserInput.i;\n\n do {\n e = this.comment();\n if (e) {\n entities.push(e);\n continue;\n }\n e = this.addition() || this.entity();\n\n if (e instanceof tree.Comment) {\n e = null;\n }\n\n if (e) {\n entities.push(e);\n // operations do not allow keyword \"/\" dimension (e.g. small/20px) so we support that here\n if (!parserInput.peek(/^\\/[\\/*]/)) {\n delim = parserInput.$char('/');\n if (delim) {\n entities.push(new(tree.Anonymous)(delim, index));\n }\n }\n }\n } while (e);\n if (entities.length > 0) {\n return new(tree.Expression)(entities);\n }\n },\n property: function () {\n const name = parserInput.$re(/^(\\*?-?[_a-zA-Z0-9-]+)\\s*:/);\n if (name) {\n return name[1];\n }\n },\n ruleProperty: function () {\n let name = [];\n const index = [];\n let s;\n let k;\n\n parserInput.save();\n\n const simpleProperty = parserInput.$re(/^([_a-zA-Z0-9-]+)\\s*:/);\n if (simpleProperty) {\n name = [new(tree.Keyword)(simpleProperty[1])];\n parserInput.forget();\n return name;\n }\n\n function match(re) {\n const i = parserInput.i;\n const chunk = parserInput.$re(re);\n if (chunk) {\n index.push(i);\n return name.push(chunk[1]);\n }\n }\n\n match(/^(\\*?)/);\n while (true) {\n if (!match(/^((?:[\\w-]+)|(?:[@\\$]\\{[\\w-]+\\}))/)) {\n break;\n }\n }\n\n if ((name.length > 1) && match(/^((?:\\+_|\\+)?)\\s*:/)) {\n parserInput.forget();\n\n // at last, we have the complete match now. move forward,\n // convert name particles to tree objects and return:\n if (name[0] === '') {\n name.shift();\n index.shift();\n }\n for (k = 0; k < name.length; k++) {\n s = name[k];\n name[k] = (s.charAt(0) !== '@' && s.charAt(0) !== '$') ?\n new(tree.Keyword)(s) :\n (s.charAt(0) === '@' ?\n new(tree.Variable)(`@${s.slice(2, -1)}`, index[k], fileInfo) :\n new(tree.Property)(`$${s.slice(2, -1)}`, index[k], fileInfo));\n }\n return name;\n }\n parserInput.restore();\n }\n }\n };\n};\nParser.serializeVars = vars => {\n let s = '';\n\n for (const name in vars) {\n if (Object.hasOwnProperty.call(vars, name)) {\n const value = vars[name];\n s += `${((name[0] === '@') ? '' : '@') + name}: ${value}${(String(value).slice(-1) === ';') ? '' : ';'}`;\n }\n }\n\n return s;\n};\n\nexport default Parser;\n","import Anonymous from '../tree/anonymous';\nimport Keyword from '../tree/keyword';\n\nfunction boolean(condition) {\n return condition ? Keyword.True : Keyword.False;\n}\n\n/**\n * Functions with evalArgs set to false are sent context\n * as the first argument.\n */\nfunction If(context, condition, trueValue, falseValue) {\n return condition.eval(context) ? trueValue.eval(context)\n : (falseValue ? falseValue.eval(context) : new Anonymous);\n}\nIf.evalArgs = false\n\nexport default { boolean, 'if': If };\n","import Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nlet colorFunctions;\n\nfunction clamp(val) {\n return Math.min(1, Math.max(0, val));\n}\nfunction hsla(origColor, hsl) {\n const color = colorFunctions.hsla(hsl.h, hsl.s, hsl.l, hsl.a);\n if (color) {\n if (origColor.value && \n /^(rgb|hsl)/.test(origColor.value)) {\n color.value = origColor.value;\n } else {\n color.value = 'rgb';\n }\n return color;\n }\n}\nfunction toHSL(color) {\n if (color.toHSL) {\n return color.toHSL();\n } else {\n throw new Error('Argument cannot be evaluated to a color');\n }\n}\n\nfunction toHSV(color) {\n if (color.toHSV) {\n return color.toHSV();\n } else {\n throw new Error('Argument cannot be evaluated to a color');\n }\n}\n\nfunction number(n) {\n if (n instanceof Dimension) {\n return parseFloat(n.unit.is('%') ? n.value / 100 : n.value);\n } else if (typeof n === 'number') {\n return n;\n } else {\n throw {\n type: 'Argument',\n message: 'color functions take numbers as parameters'\n };\n }\n}\nfunction scaled(n, size) {\n if (n instanceof Dimension && n.unit.is('%')) {\n return parseFloat(n.value * size / 100);\n } else {\n return number(n);\n }\n}\ncolorFunctions = {\n rgb: function (r, g, b) {\n const color = colorFunctions.rgba(r, g, b, 1.0);\n if (color) {\n color.value = 'rgb';\n return color;\n }\n },\n rgba: function (r, g, b, a) {\n try {\n if (r instanceof Color) {\n if (g) {\n a = number(g);\n } else {\n a = r.alpha;\n }\n return new Color(r.rgb, a, 'rgba');\n }\n const rgb = [r, g, b].map(c => scaled(c, 255));\n a = number(a);\n return new Color(rgb, a, 'rgba');\n }\n catch (e) {}\n },\n hsl: function (h, s, l) {\n const color = colorFunctions.hsla(h, s, l, 1.0);\n if (color) {\n color.value = 'hsl';\n return color;\n }\n },\n hsla: function (h, s, l, a) {\n try {\n if (h instanceof Color) {\n if (s) {\n a = number(s);\n } else {\n a = h.alpha;\n }\n return new Color(h.rgb, a, 'hsla');\n }\n\n let m1;\n let m2;\n\n function hue(h) {\n h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h);\n if (h * 6 < 1) {\n return m1 + (m2 - m1) * h * 6;\n }\n else if (h * 2 < 1) {\n return m2;\n }\n else if (h * 3 < 2) {\n return m1 + (m2 - m1) * (2 / 3 - h) * 6;\n }\n else {\n return m1;\n }\n }\n\n h = (number(h) % 360) / 360;\n s = clamp(number(s));l = clamp(number(l));a = clamp(number(a));\n\n m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n m1 = l * 2 - m2;\n\n const rgb = [\n hue(h + 1 / 3) * 255,\n hue(h) * 255,\n hue(h - 1 / 3) * 255\n ];\n a = number(a);\n return new Color(rgb, a, 'hsla');\n }\n catch (e) {}\n },\n\n hsv: function(h, s, v) {\n return colorFunctions.hsva(h, s, v, 1.0);\n },\n\n hsva: function(h, s, v, a) {\n h = ((number(h) % 360) / 360) * 360;\n s = number(s);v = number(v);a = number(a);\n\n let i;\n let f;\n i = Math.floor((h / 60) % 6);\n f = (h / 60) - i;\n\n const vs = [v,\n v * (1 - s),\n v * (1 - f * s),\n v * (1 - (1 - f) * s)];\n const perm = [[0, 3, 1],\n [2, 0, 1],\n [1, 0, 3],\n [1, 2, 0],\n [3, 1, 0],\n [0, 1, 2]];\n\n return colorFunctions.rgba(vs[perm[i][0]] * 255,\n vs[perm[i][1]] * 255,\n vs[perm[i][2]] * 255,\n a);\n },\n\n hue: function (color) {\n return new Dimension(toHSL(color).h);\n },\n saturation: function (color) {\n return new Dimension(toHSL(color).s * 100, '%');\n },\n lightness: function (color) {\n return new Dimension(toHSL(color).l * 100, '%');\n },\n hsvhue: function(color) {\n return new Dimension(toHSV(color).h);\n },\n hsvsaturation: function (color) {\n return new Dimension(toHSV(color).s * 100, '%');\n },\n hsvvalue: function (color) {\n return new Dimension(toHSV(color).v * 100, '%');\n },\n red: function (color) {\n return new Dimension(color.rgb[0]);\n },\n green: function (color) {\n return new Dimension(color.rgb[1]);\n },\n blue: function (color) {\n return new Dimension(color.rgb[2]);\n },\n alpha: function (color) {\n return new Dimension(toHSL(color).a);\n },\n luma: function (color) {\n return new Dimension(color.luma() * color.alpha * 100, '%');\n },\n luminance: function (color) {\n const luminance =\n (0.2126 * color.rgb[0] / 255) +\n (0.7152 * color.rgb[1] / 255) +\n (0.0722 * color.rgb[2] / 255);\n\n return new Dimension(luminance * color.alpha * 100, '%');\n },\n saturate: function (color, amount, method) {\n // filter: saturate(3.2);\n // should be kept as is, so check for color\n if (!color.rgb) {\n return null;\n }\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.s += hsl.s * amount.value / 100;\n }\n else {\n hsl.s += amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n return hsla(color, hsl);\n },\n desaturate: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.s -= hsl.s * amount.value / 100;\n }\n else {\n hsl.s -= amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n return hsla(color, hsl);\n },\n lighten: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.l += hsl.l * amount.value / 100;\n }\n else {\n hsl.l += amount.value / 100;\n }\n hsl.l = clamp(hsl.l);\n return hsla(color, hsl);\n },\n darken: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.l -= hsl.l * amount.value / 100;\n }\n else {\n hsl.l -= amount.value / 100;\n }\n hsl.l = clamp(hsl.l);\n return hsla(color, hsl);\n },\n fadein: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.a += hsl.a * amount.value / 100;\n }\n else {\n hsl.a += amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fadeout: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.a -= hsl.a * amount.value / 100;\n }\n else {\n hsl.a -= amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fade: function (color, amount) {\n const hsl = toHSL(color);\n\n hsl.a = amount.value / 100;\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n spin: function (color, amount) {\n const hsl = toHSL(color);\n const hue = (hsl.h + amount.value) % 360;\n\n hsl.h = hue < 0 ? 360 + hue : hue;\n\n return hsla(color, hsl);\n },\n //\n // Copyright (c) 2006-2009 Hampton Catlin, Natalie Weizenbaum, and Chris Eppstein\n // http://sass-lang.com\n //\n mix: function (color1, color2, weight) {\n if (!weight) {\n weight = new Dimension(50);\n }\n const p = weight.value / 100.0;\n const w = p * 2 - 1;\n const a = toHSL(color1).a - toHSL(color2).a;\n\n const w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n const w2 = 1 - w1;\n\n const rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2,\n color1.rgb[1] * w1 + color2.rgb[1] * w2,\n color1.rgb[2] * w1 + color2.rgb[2] * w2];\n\n const alpha = color1.alpha * p + color2.alpha * (1 - p);\n\n return new Color(rgb, alpha);\n },\n greyscale: function (color) {\n return colorFunctions.desaturate(color, new Dimension(100));\n },\n contrast: function (color, dark, light, threshold) {\n // filter: contrast(3.2);\n // should be kept as is, so check for color\n if (!color.rgb) {\n return null;\n }\n if (typeof light === 'undefined') {\n light = colorFunctions.rgba(255, 255, 255, 1.0);\n }\n if (typeof dark === 'undefined') {\n dark = colorFunctions.rgba(0, 0, 0, 1.0);\n }\n // Figure out which is actually light and dark:\n if (dark.luma() > light.luma()) {\n const t = light;\n light = dark;\n dark = t;\n }\n if (typeof threshold === 'undefined') {\n threshold = 0.43;\n } else {\n threshold = number(threshold);\n }\n if (color.luma() < threshold) {\n return light;\n } else {\n return dark;\n }\n },\n // Changes made in 2.7.0 - Reverted in 3.0.0\n // contrast: function (color, color1, color2, threshold) {\n // // Return which of `color1` and `color2` has the greatest contrast with `color`\n // // according to the standard WCAG contrast ratio calculation.\n // // http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n // // The threshold param is no longer used, in line with SASS.\n // // filter: contrast(3.2);\n // // should be kept as is, so check for color\n // if (!color.rgb) {\n // return null;\n // }\n // if (typeof color1 === 'undefined') {\n // color1 = colorFunctions.rgba(0, 0, 0, 1.0);\n // }\n // if (typeof color2 === 'undefined') {\n // color2 = colorFunctions.rgba(255, 255, 255, 1.0);\n // }\n // var contrast1, contrast2;\n // var luma = color.luma();\n // var luma1 = color1.luma();\n // var luma2 = color2.luma();\n // // Calculate contrast ratios for each color\n // if (luma > luma1) {\n // contrast1 = (luma + 0.05) / (luma1 + 0.05);\n // } else {\n // contrast1 = (luma1 + 0.05) / (luma + 0.05);\n // }\n // if (luma > luma2) {\n // contrast2 = (luma + 0.05) / (luma2 + 0.05);\n // } else {\n // contrast2 = (luma2 + 0.05) / (luma + 0.05);\n // }\n // if (contrast1 > contrast2) {\n // return color1;\n // } else {\n // return color2;\n // }\n // },\n argb: function (color) {\n return new Anonymous(color.toARGB());\n },\n color: function(c) {\n if ((c instanceof Quoted) &&\n (/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})$/i.test(c.value))) {\n const val = c.value.slice(1);\n return new Color(val, undefined, `#${val}`);\n }\n if ((c instanceof Color) || (c = Color.fromKeyword(c.value))) {\n c.value = undefined;\n return c;\n }\n throw {\n type: 'Argument',\n message: 'argument must be a color keyword or 3|4|6|8 digit hex e.g. #FFF'\n };\n },\n tint: function(color, amount) {\n return colorFunctions.mix(colorFunctions.rgb(255, 255, 255), color, amount);\n },\n shade: function(color, amount) {\n return colorFunctions.mix(colorFunctions.rgb(0, 0, 0), color, amount);\n }\n};\n\nexport default colorFunctions;\n","import Color from '../tree/color';\n\n// Color Blending\n// ref: http://www.w3.org/TR/compositing-1\n\nfunction colorBlend(mode, color1, color2) {\n const ab = color1.alpha; // result\n\n let // backdrop\n cb;\n\n const as = color2.alpha;\n\n let // source\n cs;\n\n let ar;\n let cr;\n const r = [];\n\n ar = as + ab * (1 - as);\n for (let i = 0; i < 3; i++) {\n cb = color1.rgb[i] / 255;\n cs = color2.rgb[i] / 255;\n cr = mode(cb, cs);\n if (ar) {\n cr = (as * cs + ab * (cb -\n as * (cb + cs - cr))) / ar;\n }\n r[i] = cr * 255;\n }\n\n return new Color(r, ar);\n}\n\nconst colorBlendModeFunctions = {\n multiply: function(cb, cs) {\n return cb * cs;\n },\n screen: function(cb, cs) {\n return cb + cs - cb * cs;\n },\n overlay: function(cb, cs) {\n cb *= 2;\n return (cb <= 1) ?\n colorBlendModeFunctions.multiply(cb, cs) :\n colorBlendModeFunctions.screen(cb - 1, cs);\n },\n softlight: function(cb, cs) {\n let d = 1;\n let e = cb;\n if (cs > 0.5) {\n e = 1;\n d = (cb > 0.25) ? Math.sqrt(cb)\n : ((16 * cb - 12) * cb + 4) * cb;\n }\n return cb - (1 - 2 * cs) * e * (d - cb);\n },\n hardlight: function(cb, cs) {\n return colorBlendModeFunctions.overlay(cs, cb);\n },\n difference: function(cb, cs) {\n return Math.abs(cb - cs);\n },\n exclusion: function(cb, cs) {\n return cb + cs - 2 * cb * cs;\n },\n\n // non-w3c functions:\n average: function(cb, cs) {\n return (cb + cs) / 2;\n },\n negation: function(cb, cs) {\n return 1 - Math.abs(cb + cs - 1);\n }\n};\n\nfor (const f in colorBlendModeFunctions) {\n if (colorBlendModeFunctions.hasOwnProperty(f)) {\n colorBlend[f] = colorBlend.bind(null, colorBlendModeFunctions[f]);\n }\n}\n\nexport default colorBlend;\n","import Comment from '../tree/comment';\nimport Dimension from '../tree/dimension';\nimport Declaration from '../tree/declaration';\nimport Expression from '../tree/expression';\nimport Ruleset from '../tree/ruleset';\nimport Selector from '../tree/selector';\nimport Element from '../tree/element';\nimport Quote from '../tree/quoted';\n\nconst getItemsFromNode = node => {\n // handle non-array values as an array of length 1\n // return 'undefined' if index is invalid\n const items = Array.isArray(node.value) ?\n node.value : Array(node);\n\n return items;\n};\n\nexport default {\n _SELF: function(n) {\n return n;\n },\n extract: function(values, index) {\n // (1-based index)\n index = index.value - 1;\n\n return getItemsFromNode(values)[index];\n },\n length: function(values) {\n return new Dimension(getItemsFromNode(values).length);\n },\n /**\n * Creates a Less list of incremental values.\n * Modeled after Lodash's range function, also exists natively in PHP\n * \n * @param {Dimension} [start=1]\n * @param {Dimension} end - e.g. 10 or 10px - unit is added to output\n * @param {Dimension} [step=1] \n */\n range: function(start, end, step) {\n let from;\n let to;\n let stepValue = 1;\n const list = [];\n if (end) {\n to = end;\n from = start.value;\n if (step) {\n stepValue = step.value;\n }\n }\n else {\n from = 1;\n to = start;\n }\n\n for (let i = from; i <= to.value; i += stepValue) {\n list.push(new Dimension(i, to.unit));\n }\n\n return new Expression(list);\n },\n each: function(list, rs) {\n const rules = [];\n let newRules;\n let iterator;\n\n if (list.value && !(list instanceof Quote)) {\n if (Array.isArray(list.value)) {\n iterator = list.value;\n } else {\n iterator = [list.value];\n }\n } else if (list.ruleset) {\n iterator = list.ruleset.rules;\n } else if (list.rules) {\n iterator = list.rules;\n } else if (Array.isArray(list)) {\n iterator = list;\n } else {\n iterator = [list];\n }\n\n let valueName = '@value';\n let keyName = '@key';\n let indexName = '@index';\n\n if (rs.params) {\n valueName = rs.params[0] && rs.params[0].name;\n keyName = rs.params[1] && rs.params[1].name;\n indexName = rs.params[2] && rs.params[2].name;\n rs = rs.rules;\n } else {\n rs = rs.ruleset;\n }\n\n for (let i = 0; i < iterator.length; i++) {\n let key;\n let value;\n const item = iterator[i];\n if (item instanceof Declaration) {\n key = typeof item.name === 'string' ? item.name : item.name[0].value;\n value = item.value;\n } else {\n key = new Dimension(i + 1);\n value = item;\n }\n\n if (item instanceof Comment) {\n continue;\n }\n\n newRules = rs.rules.slice(0);\n if (valueName) {\n newRules.push(new Declaration(valueName,\n value,\n false, false, this.index, this.currentFileInfo));\n }\n if (indexName) {\n newRules.push(new Declaration(indexName,\n new Dimension(i + 1),\n false, false, this.index, this.currentFileInfo));\n }\n if (keyName) {\n newRules.push(new Declaration(keyName,\n key,\n false, false, this.index, this.currentFileInfo));\n }\n\n rules.push(new Ruleset([ new(Selector)([ new Element(\"\", '&') ]) ],\n newRules,\n rs.strictImports,\n rs.visibilityInfo()\n ));\n }\n\n return new Ruleset([ new(Selector)([ new Element(\"\", '&') ]) ],\n rules,\n rs.strictImports,\n rs.visibilityInfo()\n ).eval(this.context);\n }\n};\n","import Dimension from '../tree/dimension';\n\nconst MathHelper = (fn, unit, n) => {\n if (!(n instanceof Dimension)) {\n throw { type: 'Argument', message: 'argument must be a number' };\n }\n if (unit == null) {\n unit = n.unit;\n } else {\n n = n.unify();\n }\n return new Dimension(fn(parseFloat(n.value)), unit);\n};\n\nexport default MathHelper;","import mathHelper from './math-helper.js';\n\nconst mathFunctions = {\n // name, unit\n ceil: null,\n floor: null,\n sqrt: null,\n abs: null,\n tan: '',\n sin: '',\n cos: '',\n atan: 'rad',\n asin: 'rad',\n acos: 'rad'\n};\n\nfor (const f in mathFunctions) {\n if (mathFunctions.hasOwnProperty(f)) {\n mathFunctions[f] = mathHelper.bind(null, Math[f], mathFunctions[f]);\n }\n}\n\nmathFunctions.round = (n, f) => {\n const fraction = typeof f === 'undefined' ? 0 : f.value;\n return mathHelper(num => num.toFixed(fraction), null, n);\n};\n\nexport default mathFunctions;\n","import Dimension from '../tree/dimension';\nimport Anonymous from '../tree/anonymous';\nimport mathHelper from './math-helper.js';\n\nconst minMax = function (isMin, args) {\n args = Array.prototype.slice.call(args);\n switch (args.length) {\n case 0: throw { type: 'Argument', message: 'one or more arguments required' };\n }\n let i; // key is the unit.toString() for unified Dimension values,\n let j;\n let current;\n let currentUnified;\n let referenceUnified;\n let unit;\n let unitStatic;\n let unitClone;\n\n const // elems only contains original argument values.\n order = [];\n\n const values = {};\n // value is the index into the order array.\n for (i = 0; i < args.length; i++) {\n current = args[i];\n if (!(current instanceof Dimension)) {\n if (Array.isArray(args[i].value)) {\n Array.prototype.push.apply(args, Array.prototype.slice.call(args[i].value));\n }\n continue;\n }\n currentUnified = current.unit.toString() === '' && unitClone !== undefined ? new Dimension(current.value, unitClone).unify() : current.unify();\n unit = currentUnified.unit.toString() === '' && unitStatic !== undefined ? unitStatic : currentUnified.unit.toString();\n unitStatic = unit !== '' && unitStatic === undefined || unit !== '' && order[0].unify().unit.toString() === '' ? unit : unitStatic;\n unitClone = unit !== '' && unitClone === undefined ? current.unit.toString() : unitClone;\n j = values[''] !== undefined && unit !== '' && unit === unitStatic ? values[''] : values[unit];\n if (j === undefined) {\n if (unitStatic !== undefined && unit !== unitStatic) {\n throw { type: 'Argument', message: 'incompatible types' };\n }\n values[unit] = order.length;\n order.push(current);\n continue;\n }\n referenceUnified = order[j].unit.toString() === '' && unitClone !== undefined ? new Dimension(order[j].value, unitClone).unify() : order[j].unify();\n if ( isMin && currentUnified.value < referenceUnified.value ||\n !isMin && currentUnified.value > referenceUnified.value) {\n order[j] = current;\n }\n }\n if (order.length == 1) {\n return order[0];\n }\n args = order.map(function (a) { return a.toCSS(this.context); }).join(this.context.compress ? ',' : ', ');\n return new Anonymous(`${isMin ? 'min' : 'max'}(${args})`);\n};\n\nexport default {\n min: function(...args) {\n return minMax(true, args);\n },\n max: function(...args) {\n return minMax(false, args);\n },\n convert: function (val, unit) {\n return val.convertTo(unit.value);\n },\n pi: function () {\n return new Dimension(Math.PI);\n },\n mod: function(a, b) {\n return new Dimension(a.value % b.value, a.unit);\n },\n pow: function(x, y) {\n if (typeof x === 'number' && typeof y === 'number') {\n x = new Dimension(x);\n y = new Dimension(y);\n } else if (!(x instanceof Dimension) || !(y instanceof Dimension)) {\n throw { type: 'Argument', message: 'arguments must be numbers' };\n }\n\n return new Dimension(Math.pow(x.value, y.value), x.unit);\n },\n percentage: function (n) {\n const result = mathHelper(num => num * 100, '%', n);\n\n return result;\n }\n};\n","/**\n * Plugin Manager\n */\nclass PluginManager {\n constructor(less) {\n this.less = less;\n this.visitors = [];\n this.preProcessors = [];\n this.postProcessors = [];\n this.installedPlugins = [];\n this.fileManagers = [];\n this.iterator = -1;\n this.pluginCache = {};\n this.Loader = new less.PluginLoader(less);\n }\n\n /**\n * Adds all the plugins in the array\n * @param {Array} plugins\n */\n addPlugins(plugins) {\n if (plugins) {\n for (let i = 0; i < plugins.length; i++) {\n this.addPlugin(plugins[i]);\n }\n }\n }\n\n /**\n *\n * @param plugin\n * @param {String} filename\n */\n addPlugin(plugin, filename, functionRegistry) {\n this.installedPlugins.push(plugin);\n if (filename) {\n this.pluginCache[filename] = plugin;\n }\n if (plugin.install) {\n plugin.install(this.less, this, functionRegistry || this.less.functions.functionRegistry);\n }\n }\n\n /**\n *\n * @param filename\n */\n get(filename) {\n return this.pluginCache[filename];\n }\n\n /**\n * Adds a visitor. The visitor object has options on itself to determine\n * when it should run.\n * @param visitor\n */\n addVisitor(visitor) {\n this.visitors.push(visitor);\n }\n\n /**\n * Adds a pre processor object\n * @param {object} preProcessor\n * @param {number} priority - guidelines 1 = before import, 1000 = import, 2000 = after import\n */\n addPreProcessor(preProcessor, priority) {\n let indexToInsertAt;\n for (indexToInsertAt = 0; indexToInsertAt < this.preProcessors.length; indexToInsertAt++) {\n if (this.preProcessors[indexToInsertAt].priority >= priority) {\n break;\n }\n }\n this.preProcessors.splice(indexToInsertAt, 0, {preProcessor, priority});\n }\n\n /**\n * Adds a post processor object\n * @param {object} postProcessor\n * @param {number} priority - guidelines 1 = before compression, 1000 = compression, 2000 = after compression\n */\n addPostProcessor(postProcessor, priority) {\n let indexToInsertAt;\n for (indexToInsertAt = 0; indexToInsertAt < this.postProcessors.length; indexToInsertAt++) {\n if (this.postProcessors[indexToInsertAt].priority >= priority) {\n break;\n }\n }\n this.postProcessors.splice(indexToInsertAt, 0, {postProcessor, priority});\n }\n\n /**\n *\n * @param manager\n */\n addFileManager(manager) {\n this.fileManagers.push(manager);\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getPreProcessors() {\n const preProcessors = [];\n for (let i = 0; i < this.preProcessors.length; i++) {\n preProcessors.push(this.preProcessors[i].preProcessor);\n }\n return preProcessors;\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getPostProcessors() {\n const postProcessors = [];\n for (let i = 0; i < this.postProcessors.length; i++) {\n postProcessors.push(this.postProcessors[i].postProcessor);\n }\n return postProcessors;\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getVisitors() {\n return this.visitors;\n }\n\n visitor() {\n const self = this;\n return {\n first: function() {\n self.iterator = -1;\n return self.visitors[self.iterator];\n },\n get: function() {\n self.iterator += 1;\n return self.visitors[self.iterator];\n }\n };\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getFileManagers() {\n return this.fileManagers;\n }\n}\n\nlet pm;\n\nfunction PluginManagerFactory(less, newFactory) {\n if (newFactory || !pm) {\n pm = new PluginManager(less);\n }\n return pm;\n};\n\n//\nexport default PluginManagerFactory;\n","import Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport JavaScript from '../tree/javascript';\n\nexport default {\n e: function (str) {\n return new Quoted('\"', str instanceof JavaScript ? str.evaluated : str.value, true);\n },\n escape: function (str) {\n return new Anonymous(\n encodeURI(str.value).replace(/=/g, '%3D').replace(/:/g, '%3A').replace(/#/g, '%23').replace(/;/g, '%3B')\n .replace(/\\(/g, '%28').replace(/\\)/g, '%29'));\n },\n replace: function (string, pattern, replacement, flags) {\n let result = string.value;\n replacement = (replacement.type === 'Quoted') ?\n replacement.value : replacement.toCSS();\n result = result.replace(new RegExp(pattern.value, flags ? flags.value : ''), replacement);\n return new Quoted(string.quote || '', result, string.escaped);\n },\n '%': function (string /* arg, arg, ... */) {\n const args = Array.prototype.slice.call(arguments, 1);\n let result = string.value;\n\n for (let i = 0; i < args.length; i++) {\n /* jshint loopfunc:true */\n result = result.replace(/%[sda]/i, token => {\n const value = ((args[i].type === 'Quoted') &&\n token.match(/s/i)) ? args[i].value : args[i].toCSS();\n return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value;\n });\n }\n result = result.replace(/%%/g, '%');\n return new Quoted(string.quote || '', result, string.escaped);\n }\n};\n","import Keyword from '../tree/keyword';\nimport DetachedRuleset from '../tree/detached-ruleset';\nimport Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport URL from '../tree/url';\nimport Operation from '../tree/operation';\n\nconst isa = (n, Type) => (n instanceof Type) ? Keyword.True : Keyword.False;\nconst isunit = (n, unit) => {\n if (unit === undefined) {\n throw { type: 'Argument', message: 'missing the required second argument to isunit.' };\n }\n unit = typeof unit.value === 'string' ? unit.value : unit;\n if (typeof unit !== 'string') {\n throw { type: 'Argument', message: 'Second argument to isunit should be a unit or a string.' };\n }\n return (n instanceof Dimension) && n.unit.is(unit) ? Keyword.True : Keyword.False;\n};\n\nexport default {\n isruleset: function (n) {\n return isa(n, DetachedRuleset);\n },\n iscolor: function (n) {\n return isa(n, Color);\n },\n isnumber: function (n) {\n return isa(n, Dimension);\n },\n isstring: function (n) {\n return isa(n, Quoted);\n },\n iskeyword: function (n) {\n return isa(n, Keyword);\n },\n isurl: function (n) {\n return isa(n, URL);\n },\n ispixel: function (n) {\n return isunit(n, 'px');\n },\n ispercentage: function (n) {\n return isunit(n, '%');\n },\n isem: function (n) {\n return isunit(n, 'em');\n },\n isunit,\n unit: function (val, unit) {\n if (!(val instanceof Dimension)) {\n throw { type: 'Argument',\n message: `the first argument to unit must be a number${val instanceof Operation ? '. Have you forgotten parenthesis?' : ''}` };\n }\n if (unit) {\n if (unit instanceof Keyword) {\n unit = unit.value;\n } else {\n unit = unit.toCSS();\n }\n } else {\n unit = '';\n }\n return new Dimension(val.value, unit);\n },\n 'get-unit': function (n) {\n return new Anonymous(n.unit);\n }\n};\n","import functionRegistry from './function-registry';\nimport functionCaller from './function-caller';\n\nimport boolean from './boolean';\nimport defaultFunc from './default';\nimport color from './color';\nimport colorBlending from './color-blending';\nimport dataUri from './data-uri';\nimport list from './list';\nimport math from './math';\nimport number from './number';\nimport string from './string';\nimport svg from './svg';\nimport types from './types';\n\nexport default environment => {\n const functions = { functionRegistry, functionCaller };\n\n // register functions\n functionRegistry.addMultiple(boolean);\n functionRegistry.add('default', defaultFunc.eval.bind(defaultFunc));\n functionRegistry.addMultiple(color);\n functionRegistry.addMultiple(colorBlending);\n functionRegistry.addMultiple(dataUri(environment));\n functionRegistry.addMultiple(list);\n functionRegistry.addMultiple(math);\n functionRegistry.addMultiple(number);\n functionRegistry.addMultiple(string);\n functionRegistry.addMultiple(svg(environment));\n functionRegistry.addMultiple(types);\n\n return functions;\n};\n","import Quoted from '../tree/quoted';\nimport URL from '../tree/url';\nimport * as utils from '../utils';\nimport logger from '../logger';\n\nexport default environment => {\n \n const fallback = (functionThis, node) => new URL(node, functionThis.index, functionThis.currentFileInfo).eval(functionThis.context); \n\n return { 'data-uri': function(mimetypeNode, filePathNode) {\n\n if (!filePathNode) {\n filePathNode = mimetypeNode;\n mimetypeNode = null;\n }\n\n let mimetype = mimetypeNode && mimetypeNode.value;\n let filePath = filePathNode.value;\n const currentFileInfo = this.currentFileInfo;\n const currentDirectory = currentFileInfo.rewriteUrls ?\n currentFileInfo.currentDirectory : currentFileInfo.entryPath;\n\n const fragmentStart = filePath.indexOf('#');\n let fragment = '';\n if (fragmentStart !== -1) {\n fragment = filePath.slice(fragmentStart);\n filePath = filePath.slice(0, fragmentStart);\n }\n const context = utils.clone(this.context);\n context.rawBuffer = true;\n\n const fileManager = environment.getFileManager(filePath, currentDirectory, context, environment, true);\n\n if (!fileManager) {\n return fallback(this, filePathNode);\n }\n\n let useBase64 = false;\n\n // detect the mimetype if not given\n if (!mimetypeNode) {\n\n mimetype = environment.mimeLookup(filePath);\n\n if (mimetype === 'image/svg+xml') {\n useBase64 = false;\n } else {\n // use base 64 unless it's an ASCII or UTF-8 format\n const charset = environment.charsetLookup(mimetype);\n useBase64 = ['US-ASCII', 'UTF-8'].indexOf(charset) < 0;\n }\n if (useBase64) { mimetype += ';base64'; }\n }\n else {\n useBase64 = /;base64$/.test(mimetype);\n }\n\n const fileSync = fileManager.loadFileSync(filePath, currentDirectory, context, environment);\n if (!fileSync.contents) {\n logger.warn(`Skipped data-uri embedding of ${filePath} because file not found`);\n return fallback(this, filePathNode || mimetypeNode);\n }\n let buf = fileSync.contents;\n if (useBase64 && !environment.encodeBase64) {\n return fallback(this, filePathNode);\n }\n\n buf = useBase64 ? environment.encodeBase64(buf) : encodeURIComponent(buf);\n\n const uri = `data:${mimetype},${buf}${fragment}`;\n\n return new URL(new Quoted(`\"${uri}\"`, uri, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n }};\n};\n","import Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Expression from '../tree/expression';\nimport Quoted from '../tree/quoted';\nimport URL from '../tree/url';\n\nexport default environment => {\n return { 'svg-gradient': function(direction) {\n let stops;\n let gradientDirectionSvg;\n let gradientType = 'linear';\n let rectangleDimension = 'x=\"0\" y=\"0\" width=\"1\" height=\"1\"';\n const renderEnv = {compress: false};\n let returner;\n const directionValue = direction.toCSS(renderEnv);\n let i;\n let color;\n let position;\n let positionValue;\n let alpha;\n\n function throwArgumentDescriptor() {\n throw { type: 'Argument',\n message: 'svg-gradient expects direction, start_color [start_position], [color position,]...,' +\n ' end_color [end_position] or direction, color list' };\n }\n\n if (arguments.length == 2) {\n if (arguments[1].value.length < 2) {\n throwArgumentDescriptor();\n }\n stops = arguments[1].value;\n } else if (arguments.length < 3) {\n throwArgumentDescriptor();\n } else {\n stops = Array.prototype.slice.call(arguments, 1);\n }\n\n switch (directionValue) {\n case 'to bottom':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\"';\n break;\n case 'to right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'to bottom right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\"';\n break;\n case 'to top right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"100%\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'ellipse':\n case 'ellipse at center':\n gradientType = 'radial';\n gradientDirectionSvg = 'cx=\"50%\" cy=\"50%\" r=\"75%\"';\n rectangleDimension = 'x=\"-50\" y=\"-50\" width=\"101\" height=\"101\"';\n break;\n default:\n throw { type: 'Argument', message: 'svg-gradient direction must be \\'to bottom\\', \\'to right\\',' +\n ' \\'to bottom right\\', \\'to top right\\' or \\'ellipse at center\\'' };\n }\n returner = `<${gradientType}Gradient id=\"g\" ${gradientDirectionSvg}>`;\n\n for (i = 0; i < stops.length; i += 1) {\n if (stops[i] instanceof Expression) {\n color = stops[i].value[0];\n position = stops[i].value[1];\n } else {\n color = stops[i];\n position = undefined;\n }\n\n if (!(color instanceof Color) || (!((i === 0 || i + 1 === stops.length) && position === undefined) && !(position instanceof Dimension))) {\n throwArgumentDescriptor();\n }\n positionValue = position ? position.toCSS(renderEnv) : i === 0 ? '0%' : '100%';\n alpha = color.alpha;\n returner += ``;\n }\n returner += ``;\n\n returner = encodeURIComponent(returner);\n\n returner = `data:image/svg+xml,${returner}`;\n return new URL(new Quoted(`'${returner}'`, returner, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n }};\n};\n","import contexts from './contexts';\nimport visitor from './visitors';\nimport tree from './tree';\n\nexport default (root, options = {}) => {\n let evaldRoot;\n let variables = options.variables;\n const evalEnv = new contexts.Eval(options);\n\n //\n // Allows setting variables with a hash, so:\n //\n // `{ color: new tree.Color('#f01') }` will become:\n //\n // new tree.Declaration('@color',\n // new tree.Value([\n // new tree.Expression([\n // new tree.Color('#f01')\n // ])\n // ])\n // )\n //\n if (typeof variables === 'object' && !Array.isArray(variables)) {\n variables = Object.keys(variables).map(k => {\n let value = variables[k];\n\n if (!(value instanceof tree.Value)) {\n if (!(value instanceof tree.Expression)) {\n value = new tree.Expression([value]);\n }\n value = new tree.Value([value]);\n }\n return new tree.Declaration(`@${k}`, value, false, null, 0);\n });\n evalEnv.frames = [new tree.Ruleset(null, variables)];\n }\n\n const visitors = [\n new visitor.JoinSelectorVisitor(),\n new visitor.MarkVisibleSelectorsVisitor(true),\n new visitor.ExtendVisitor(),\n new visitor.ToCSSVisitor({compress: Boolean(options.compress)})\n ];\n\n const preEvalVisitors = [];\n let v;\n let visitorIterator;\n\n /**\n * first() / get() allows visitors to be added while visiting\n * \n * @todo Add scoping for visitors just like functions for @plugin; right now they're global\n */\n if (options.pluginManager) {\n visitorIterator = options.pluginManager.visitor();\n for (var i = 0; i < 2; i++) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (v.isPreEvalVisitor) {\n if (i === 0 || preEvalVisitors.indexOf(v) === -1) {\n preEvalVisitors.push(v);\n v.run(root);\n }\n }\n else {\n if (i === 0 || visitors.indexOf(v) === -1) {\n if (v.isPreVisitor) {\n visitors.unshift(v);\n }\n else {\n visitors.push(v);\n }\n }\n }\n }\n }\n }\n\n evaldRoot = root.eval(evalEnv);\n\n for (var i = 0; i < visitors.length; i++) {\n visitors[i].run(evaldRoot);\n }\n\n // Run any remaining visitors added after eval pass\n if (options.pluginManager) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (visitors.indexOf(v) === -1 && preEvalVisitors.indexOf(v) === -1) {\n v.run(evaldRoot);\n }\n }\n }\n\n return evaldRoot;\n};\n","/* global window, XMLHttpRequest */\n\nimport AbstractFileManager from '../less/environment/abstract-file-manager.js';\n\nlet options;\nlet logger;\nlet fileCache = {};\n\n// TODOS - move log somewhere. pathDiff and doing something similar in node. use pathDiff in the other browser file for the initial load\nclass FileManager extends AbstractFileManager {\n alwaysMakePathsAbsolute() {\n return true;\n }\n\n join(basePath, laterPath) {\n if (!basePath) {\n return laterPath;\n }\n return this.extractUrlParts(laterPath, basePath).path;\n }\n\n doXHR(url, type, callback, errback) {\n const xhr = new XMLHttpRequest();\n const async = options.isFileProtocol ? options.fileAsync : true;\n\n if (typeof xhr.overrideMimeType === 'function') {\n xhr.overrideMimeType('text/css');\n }\n logger.debug(`XHR: Getting '${url}'`);\n xhr.open('GET', url, async);\n xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5');\n xhr.send(null);\n\n function handleResponse(xhr, callback, errback) {\n if (xhr.status >= 200 && xhr.status < 300) {\n callback(xhr.responseText,\n xhr.getResponseHeader('Last-Modified'));\n } else if (typeof errback === 'function') {\n errback(xhr.status, url);\n }\n }\n\n if (options.isFileProtocol && !options.fileAsync) {\n if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) {\n callback(xhr.responseText);\n } else {\n errback(xhr.status, url);\n }\n } else if (async) {\n xhr.onreadystatechange = () => {\n if (xhr.readyState == 4) {\n handleResponse(xhr, callback, errback);\n }\n };\n } else {\n handleResponse(xhr, callback, errback);\n }\n }\n\n supports() {\n return true;\n }\n\n clearFileCache() {\n fileCache = {};\n }\n\n loadFile(filename, currentDirectory, options, environment) {\n // TODO: Add prefix support like less-node?\n // What about multiple paths?\n\n if (currentDirectory && !this.isPathAbsolute(filename)) {\n filename = currentDirectory + filename;\n }\n\n filename = options.ext ? this.tryAppendExtension(filename, options.ext) : filename;\n\n options = options || {};\n\n // sheet may be set to the stylesheet for the initial load or a collection of properties including\n // some context variables for imports\n const hrefParts = this.extractUrlParts(filename, window.location.href);\n const href = hrefParts.url;\n const self = this;\n \n return new Promise((resolve, reject) => {\n if (options.useFileCache && fileCache[href]) {\n try {\n const lessText = fileCache[href];\n return resolve({ contents: lessText, filename: href, webInfo: { lastModified: new Date() }});\n } catch (e) {\n return reject({ filename: href, message: `Error loading file ${href} error was ${e.message}` });\n }\n }\n\n self.doXHR(href, options.mime, function doXHRCallback(data, lastModified) {\n // per file cache\n fileCache[href] = data;\n\n // Use remote copy (re-parse)\n resolve({ contents: data, filename: href, webInfo: { lastModified }});\n }, function doXHRError(status, url) {\n reject({ type: 'File', message: `'${url}' wasn't found (${status})`, href });\n });\n });\n }\n}\n\nexport default (opts, log) => {\n options = opts;\n logger = log;\n return FileManager;\n}\n","import data from './data';\nimport tree from './tree';\nimport Environment from './environment/environment';\nimport AbstractFileManager from './environment/abstract-file-manager';\nimport AbstractPluginLoader from './environment/abstract-plugin-loader';\nimport visitors from './visitors';\nimport Parser from './parser/parser';\nimport Functions from './functions';\nimport contexts from './contexts';\nimport sourceMapOutput from './source-map-output';\nimport sourceMapBuilder from './source-map-builder';\nimport parseTree from './parse-tree';\nimport importManager from './import-manager';\nimport Render from './render';\nimport Parse from './parse';\nimport LessError from './less-error';\nimport transformTree from './transform-tree';\nimport * as utils from './utils';\nimport PluginManager from './plugin-manager';\nimport logger from './logger';\n\nexport default (environment, fileManagers) => {\n /**\n * @todo\n * This original code could be improved quite a bit.\n * Many classes / modules currently add side-effects / mutations to passed in objects,\n * which makes it hard to refactor and reason about. \n */\n environment = new Environment(environment, fileManagers);\n\n const SourceMapOutput = sourceMapOutput(environment);\n const SourceMapBuilder = sourceMapBuilder(SourceMapOutput, environment);\n const ParseTree = parseTree(SourceMapBuilder);\n const ImportManager = importManager(environment);\n const render = Render(environment, ParseTree, ImportManager);\n const parse = Parse(environment, ParseTree, ImportManager);\n const functions = Functions(environment);\n\n /**\n * @todo\n * This root properties / methods need to be organized.\n * It's not clear what should / must be public and why.\n */\n const initial = {\n version: [3, 12, 2],\n data,\n tree,\n Environment,\n AbstractFileManager,\n AbstractPluginLoader,\n environment,\n visitors,\n Parser,\n functions,\n contexts,\n SourceMapOutput,\n SourceMapBuilder,\n ParseTree,\n ImportManager,\n render,\n parse,\n LessError,\n transformTree,\n utils,\n PluginManager,\n logger\n };\n\n // Create a public API\n const ctor = t => function (...args) {\n return new t(...args);\n };\n\n let t;\n const api = Object.create(initial);\n for (const n in initial.tree) {\n /* eslint guard-for-in: 0 */\n t = initial.tree[n];\n if (typeof t === 'function') {\n api[n.toLowerCase()] = ctor(t);\n }\n else {\n api[n] = Object.create(null);\n for (const o in t) {\n /* eslint guard-for-in: 0 */\n api[n][o.toLowerCase()] = ctor(t[o]);\n }\n }\n }\n\n /**\n * Some of the functions assume a `this` context of the API object,\n * which causes it to fail when wrapped for ES6 imports.\n * \n * An assumed `this` should be removed in the future.\n */\n initial.parse = initial.parse.bind(api);\n initial.render = initial.render.bind(api);\n\n return api;\n};\n","export default environment => {\n class SourceMapOutput {\n constructor(options) {\n this._css = [];\n this._rootNode = options.rootNode;\n this._contentsMap = options.contentsMap;\n this._contentsIgnoredCharsMap = options.contentsIgnoredCharsMap;\n if (options.sourceMapFilename) {\n this._sourceMapFilename = options.sourceMapFilename.replace(/\\\\/g, '/');\n }\n this._outputFilename = options.outputFilename;\n this.sourceMapURL = options.sourceMapURL;\n if (options.sourceMapBasepath) {\n this._sourceMapBasepath = options.sourceMapBasepath.replace(/\\\\/g, '/');\n }\n if (options.sourceMapRootpath) {\n this._sourceMapRootpath = options.sourceMapRootpath.replace(/\\\\/g, '/');\n if (this._sourceMapRootpath.charAt(this._sourceMapRootpath.length - 1) !== '/') {\n this._sourceMapRootpath += '/';\n }\n } else {\n this._sourceMapRootpath = '';\n }\n this._outputSourceFiles = options.outputSourceFiles;\n this._sourceMapGeneratorConstructor = environment.getSourceMapGenerator();\n\n this._lineNumber = 0;\n this._column = 0;\n }\n\n removeBasepath(path) {\n if (this._sourceMapBasepath && path.indexOf(this._sourceMapBasepath) === 0) {\n path = path.substring(this._sourceMapBasepath.length);\n if (path.charAt(0) === '\\\\' || path.charAt(0) === '/') {\n path = path.substring(1);\n }\n }\n\n return path;\n }\n\n normalizeFilename(filename) {\n filename = filename.replace(/\\\\/g, '/');\n filename = this.removeBasepath(filename);\n return (this._sourceMapRootpath || '') + filename;\n }\n\n add(chunk, fileInfo, index, mapLines) {\n // ignore adding empty strings\n if (!chunk) {\n return;\n }\n\n let lines;\n let sourceLines;\n let columns;\n let sourceColumns;\n let i;\n\n if (fileInfo && fileInfo.filename) {\n let inputSource = this._contentsMap[fileInfo.filename];\n\n // remove vars/banner added to the top of the file\n if (this._contentsIgnoredCharsMap[fileInfo.filename]) {\n // adjust the index\n index -= this._contentsIgnoredCharsMap[fileInfo.filename];\n if (index < 0) { index = 0; }\n // adjust the source\n inputSource = inputSource.slice(this._contentsIgnoredCharsMap[fileInfo.filename]);\n }\n\n // ignore empty content\n if (inputSource === undefined) {\n return;\n }\n\n inputSource = inputSource.substring(0, index);\n sourceLines = inputSource.split('\\n');\n sourceColumns = sourceLines[sourceLines.length - 1];\n }\n\n lines = chunk.split('\\n');\n columns = lines[lines.length - 1];\n\n if (fileInfo && fileInfo.filename) {\n if (!mapLines) {\n this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + 1, column: this._column},\n original: { line: sourceLines.length, column: sourceColumns.length},\n source: this.normalizeFilename(fileInfo.filename)});\n } else {\n for (i = 0; i < lines.length; i++) {\n this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + i + 1, column: i === 0 ? this._column : 0},\n original: { line: sourceLines.length + i, column: i === 0 ? sourceColumns.length : 0},\n source: this.normalizeFilename(fileInfo.filename)});\n }\n }\n }\n\n if (lines.length === 1) {\n this._column += columns.length;\n } else {\n this._lineNumber += lines.length - 1;\n this._column = columns.length;\n }\n\n this._css.push(chunk);\n }\n\n isEmpty() {\n return this._css.length === 0;\n }\n\n toCSS(context) {\n this._sourceMapGenerator = new this._sourceMapGeneratorConstructor({ file: this._outputFilename, sourceRoot: null });\n\n if (this._outputSourceFiles) {\n for (const filename in this._contentsMap) {\n if (this._contentsMap.hasOwnProperty(filename)) {\n let source = this._contentsMap[filename];\n if (this._contentsIgnoredCharsMap[filename]) {\n source = source.slice(this._contentsIgnoredCharsMap[filename]);\n }\n this._sourceMapGenerator.setSourceContent(this.normalizeFilename(filename), source);\n }\n }\n }\n\n this._rootNode.genCSS(context, this);\n\n if (this._css.length > 0) {\n let sourceMapURL;\n const sourceMapContent = JSON.stringify(this._sourceMapGenerator.toJSON());\n\n if (this.sourceMapURL) {\n sourceMapURL = this.sourceMapURL;\n } else if (this._sourceMapFilename) {\n sourceMapURL = this._sourceMapFilename;\n }\n this.sourceMapURL = sourceMapURL;\n\n this.sourceMap = sourceMapContent;\n }\n\n return this._css.join('');\n }\n }\n\n return SourceMapOutput;\n};\n","export default (SourceMapOutput, environment) => {\n class SourceMapBuilder {\n constructor(options) {\n this.options = options;\n }\n\n toCSS(rootNode, options, imports) {\n const sourceMapOutput = new SourceMapOutput(\n {\n contentsIgnoredCharsMap: imports.contentsIgnoredChars,\n rootNode,\n contentsMap: imports.contents,\n sourceMapFilename: this.options.sourceMapFilename,\n sourceMapURL: this.options.sourceMapURL,\n outputFilename: this.options.sourceMapOutputFilename,\n sourceMapBasepath: this.options.sourceMapBasepath,\n sourceMapRootpath: this.options.sourceMapRootpath,\n outputSourceFiles: this.options.outputSourceFiles,\n sourceMapGenerator: this.options.sourceMapGenerator,\n sourceMapFileInline: this.options.sourceMapFileInline, \n disableSourcemapAnnotation: this.options.disableSourcemapAnnotation\n });\n\n const css = sourceMapOutput.toCSS(options);\n this.sourceMap = sourceMapOutput.sourceMap;\n this.sourceMapURL = sourceMapOutput.sourceMapURL;\n if (this.options.sourceMapInputFilename) {\n this.sourceMapInputFilename = sourceMapOutput.normalizeFilename(this.options.sourceMapInputFilename);\n }\n if (this.options.sourceMapBasepath !== undefined && this.sourceMapURL !== undefined) {\n this.sourceMapURL = sourceMapOutput.removeBasepath(this.sourceMapURL);\n }\n return css + this.getCSSAppendage();\n }\n\n getCSSAppendage() {\n\n let sourceMapURL = this.sourceMapURL;\n if (this.options.sourceMapFileInline) {\n if (this.sourceMap === undefined) {\n return '';\n }\n sourceMapURL = `data:application/json;base64,${environment.encodeBase64(this.sourceMap)}`;\n }\n\n if (this.options.disableSourcemapAnnotation) {\n return '';\n }\n\n if (sourceMapURL) {\n return `/*# sourceMappingURL=${sourceMapURL} */`;\n }\n return '';\n }\n\n getExternalSourceMap() {\n return this.sourceMap;\n }\n\n setExternalSourceMap(sourceMap) {\n this.sourceMap = sourceMap;\n }\n\n isInline() {\n return this.options.sourceMapFileInline;\n }\n\n getSourceMapURL() {\n return this.sourceMapURL;\n }\n\n getOutputFilename() {\n return this.options.sourceMapOutputFilename;\n }\n\n getInputFilename() {\n return this.sourceMapInputFilename;\n }\n }\n\n return SourceMapBuilder;\n};\n","import LessError from './less-error';\nimport transformTree from './transform-tree';\nimport logger from './logger';\n\nexport default SourceMapBuilder => {\n class ParseTree {\n constructor(root, imports) {\n this.root = root;\n this.imports = imports;\n }\n\n toCSS(options) {\n let evaldRoot;\n const result = {};\n let sourceMapBuilder;\n try {\n evaldRoot = transformTree(this.root, options);\n } catch (e) {\n throw new LessError(e, this.imports);\n }\n\n try {\n const compress = Boolean(options.compress);\n if (compress) {\n logger.warn('The compress option has been deprecated. ' + \n 'We recommend you use a dedicated css minifier, for instance see less-plugin-clean-css.');\n }\n\n const toCSSOptions = {\n compress,\n dumpLineNumbers: options.dumpLineNumbers,\n strictUnits: Boolean(options.strictUnits),\n numPrecision: 8};\n\n if (options.sourceMap) {\n sourceMapBuilder = new SourceMapBuilder(options.sourceMap);\n result.css = sourceMapBuilder.toCSS(evaldRoot, toCSSOptions, this.imports);\n } else {\n result.css = evaldRoot.toCSS(toCSSOptions);\n }\n } catch (e) {\n throw new LessError(e, this.imports);\n }\n\n if (options.pluginManager) {\n const postProcessors = options.pluginManager.getPostProcessors();\n for (let i = 0; i < postProcessors.length; i++) {\n result.css = postProcessors[i].process(result.css, { sourceMap: sourceMapBuilder, options, imports: this.imports });\n }\n }\n if (options.sourceMap) {\n result.map = sourceMapBuilder.getExternalSourceMap();\n }\n\n const rootFilename = this.imports.rootFilename\n result.imports = this.imports.files.filter(file => file !== rootFilename);\n return result;\n }\n }\n\n return ParseTree;\n};\n","import contexts from './contexts';\nimport Parser from './parser/parser';\nimport LessError from './less-error';\nimport * as utils from './utils';\nimport logger from './logger';\n\nexport default environment => {\n // FileInfo = {\n // 'rewriteUrls' - option - whether to adjust URL's to be relative\n // 'filename' - full resolved filename of current file\n // 'rootpath' - path to append to normal URLs for this node\n // 'currentDirectory' - path to the current file, absolute\n // 'rootFilename' - filename of the base file\n // 'entryPath' - absolute path to the entry file\n // 'reference' - whether the file should not be output and only output parts that are referenced\n\n class ImportManager {\n constructor(less, context, rootFileInfo) {\n this.less = less;\n this.rootFilename = rootFileInfo.filename;\n this.paths = context.paths || []; // Search paths, when importing\n this.contents = {}; // map - filename to contents of all the files\n this.contentsIgnoredChars = {}; // map - filename to lines at the beginning of each file to ignore\n this.mime = context.mime;\n this.error = null;\n this.context = context;\n // Deprecated? Unused outside of here, could be useful.\n this.queue = []; // Files which haven't been imported yet\n this.files = []; // List of files imported\n }\n\n /**\n * Add an import to be imported\n * @param path - the raw path\n * @param tryAppendExtension - whether to try appending a file extension (.less or .js if the path has no extension)\n * @param currentFileInfo - the current file info (used for instance to work out relative paths)\n * @param importOptions - import options\n * @param callback - callback for when it is imported\n */\n push(path, tryAppendExtension, currentFileInfo, importOptions, callback) {\n const importManager = this;\n const pluginLoader = this.context.pluginManager.Loader;\n\n this.queue.push(path);\n\n const fileParsedFunc = (e, root, fullPath) => {\n importManager.queue.splice(importManager.queue.indexOf(path), 1); // Remove the path from the queue\n\n const importedEqualsRoot = fullPath === importManager.rootFilename;\n if (importOptions.optional && e) {\n callback(null, {rules:[]}, false, null);\n logger.info(`The file ${fullPath} was skipped because it was not found and the import was marked optional.`);\n }\n else {\n const files = importManager.files\n if (files.indexOf(fullPath) === -1) {\n files.push(fullPath)\n }\n if (e && !importManager.error) { importManager.error = e; }\n callback(e, root, importedEqualsRoot, fullPath);\n }\n };\n\n const newFileInfo = {\n rewriteUrls: this.context.rewriteUrls,\n entryPath: currentFileInfo.entryPath,\n rootpath: currentFileInfo.rootpath,\n rootFilename: currentFileInfo.rootFilename\n };\n\n const fileManager = environment.getFileManager(path, currentFileInfo.currentDirectory, this.context, environment);\n\n if (!fileManager) {\n fileParsedFunc({ message: `Could not find a file-manager for ${path}` });\n return;\n }\n\n const loadFileCallback = loadedFile => {\n let plugin;\n const resolvedFilename = loadedFile.filename;\n const contents = loadedFile.contents.replace(/^\\uFEFF/, '');\n\n // Pass on an updated rootpath if path of imported file is relative and file\n // is in a (sub|sup) directory\n //\n // Examples:\n // - If path of imported file is 'module/nav/nav.less' and rootpath is 'less/',\n // then rootpath should become 'less/module/nav/'\n // - If path of imported file is '../mixins.less' and rootpath is 'less/',\n // then rootpath should become 'less/../'\n newFileInfo.currentDirectory = fileManager.getPath(resolvedFilename);\n if (newFileInfo.rewriteUrls) {\n newFileInfo.rootpath = fileManager.join(\n (importManager.context.rootpath || ''),\n fileManager.pathDiff(newFileInfo.currentDirectory, newFileInfo.entryPath));\n\n if (!fileManager.isPathAbsolute(newFileInfo.rootpath) && fileManager.alwaysMakePathsAbsolute()) {\n newFileInfo.rootpath = fileManager.join(newFileInfo.entryPath, newFileInfo.rootpath);\n }\n }\n newFileInfo.filename = resolvedFilename;\n\n const newEnv = new contexts.Parse(importManager.context);\n\n newEnv.processImports = false;\n importManager.contents[resolvedFilename] = contents;\n\n if (currentFileInfo.reference || importOptions.reference) {\n newFileInfo.reference = true;\n }\n\n if (importOptions.isPlugin) {\n plugin = pluginLoader.evalPlugin(contents, newEnv, importManager, importOptions.pluginArgs, newFileInfo);\n if (plugin instanceof LessError) {\n fileParsedFunc(plugin, null, resolvedFilename);\n }\n else {\n fileParsedFunc(null, plugin, resolvedFilename);\n }\n } else if (importOptions.inline) {\n fileParsedFunc(null, contents, resolvedFilename);\n } else {\n new Parser(newEnv, importManager, newFileInfo).parse(contents, (e, root) => {\n fileParsedFunc(e, root, resolvedFilename);\n });\n }\n };\n let loadedFile;\n let promise;\n const context = utils.clone(this.context);\n\n if (tryAppendExtension) {\n context.ext = importOptions.isPlugin ? '.js' : '.less';\n }\n\n if (importOptions.isPlugin) {\n context.mime = 'application/javascript';\n\n if (context.syncImport) {\n loadedFile = pluginLoader.loadPluginSync(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n } else {\n promise = pluginLoader.loadPlugin(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n }\n }\n else {\n if (context.syncImport) {\n loadedFile = fileManager.loadFileSync(path, currentFileInfo.currentDirectory, context, environment);\n } else {\n promise = fileManager.loadFile(path, currentFileInfo.currentDirectory, context, environment,\n (err, loadedFile) => {\n if (err) {\n fileParsedFunc(err);\n } else {\n loadFileCallback(loadedFile);\n }\n });\n }\n }\n if (loadedFile) {\n if (!loadedFile.filename) {\n fileParsedFunc(loadedFile);\n } else {\n loadFileCallback(loadedFile);\n }\n } else if (promise) {\n promise.then(loadFileCallback, fileParsedFunc);\n }\n }\n }\n\n return ImportManager;\n};\n","let PromiseConstructor;\nimport * as utils from './utils';\n\nexport default (environment, ParseTree, ImportManager) => {\n const render = function (input, options, callback) {\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(this.options, {});\n }\n else {\n options = utils.copyOptions(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n return new Promise((resolve, reject) => {\n render.call(self, input, options, (err, output) => {\n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n this.parse(input, options, (err, root, imports, options) => {\n if (err) { return callback(err); }\n\n let result;\n try {\n const parseTree = new ParseTree(root, imports);\n result = parseTree.toCSS(options);\n }\n catch (err) { return callback(err); }\n\n callback(null, result);\n });\n }\n };\n\n return render;\n};\n","let PromiseConstructor;\nimport contexts from './contexts';\nimport Parser from './parser/parser';\nimport PluginManager from './plugin-manager';\nimport LessError from './less-error';\nimport * as utils from './utils';\n\nexport default (environment, ParseTree, ImportManager) => {\n const parse = function (input, options, callback) {\n\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(this.options, {});\n }\n else {\n options = utils.copyOptions(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n return new Promise((resolve, reject) => {\n parse.call(self, input, options, (err, output) => {\n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n let context;\n let rootFileInfo;\n const pluginManager = new PluginManager(this, !options.reUsePluginManager);\n\n options.pluginManager = pluginManager;\n\n context = new contexts.Parse(options);\n\n if (options.rootFileInfo) {\n rootFileInfo = options.rootFileInfo;\n } else {\n const filename = options.filename || 'input';\n const entryPath = filename.replace(/[^\\/\\\\]*$/, '');\n rootFileInfo = {\n filename,\n rewriteUrls: context.rewriteUrls,\n rootpath: context.rootpath || '',\n currentDirectory: entryPath,\n entryPath,\n rootFilename: filename\n };\n // add in a missing trailing slash\n if (rootFileInfo.rootpath && rootFileInfo.rootpath.slice(-1) !== '/') {\n rootFileInfo.rootpath += '/';\n }\n }\n\n const imports = new ImportManager(this, context, rootFileInfo);\n this.importManager = imports;\n\n // TODO: allow the plugins to be just a list of paths or names\n // Do an async plugin queue like lessc\n\n if (options.plugins) {\n options.plugins.forEach(plugin => {\n let evalResult;\n let contents;\n if (plugin.fileContent) {\n contents = plugin.fileContent.replace(/^\\uFEFF/, '');\n evalResult = pluginManager.Loader.evalPlugin(contents, context, imports, plugin.options, plugin.filename);\n if (evalResult instanceof LessError) {\n return callback(evalResult);\n }\n }\n else {\n pluginManager.addPlugin(plugin);\n }\n });\n }\n\n new Parser(context, imports, rootFileInfo)\n .parse(input, (e, root) => {\n if (e) { return callback(e); }\n callback(null, root, imports, options);\n }, options);\n }\n };\n return parse;\n};\n","// TODO: Add tests for browser @plugin\n/* global window */\n\nimport AbstractPluginLoader from '../less/environment/abstract-plugin-loader.js';\n\n/**\n * Browser Plugin Loader\n */\nclass PluginLoader extends AbstractPluginLoader {\n constructor(less) {\n super();\n\n this.less = less;\n // Should we shim this.require for browser? Probably not?\n }\n\n loadPlugin(filename, basePath, context, environment, fileManager) {\n return new Promise((fulfill, reject) => {\n fileManager.loadFile(filename, basePath, context, environment)\n .then(fulfill).catch(reject);\n });\n }\n}\n\nexport default PluginLoader;\n\n","import * as utils from './utils';\nimport browser from './browser';\n\nexport default (window, less, options) => {\n\n function errorHTML(e, rootHref) {\n const id = `less-error-message:${utils.extractId(rootHref || '')}`;\n const template = '
  • {content}
  • ';\n const elem = window.document.createElement('div');\n let timer;\n let content;\n const errors = [];\n const filename = e.filename || rootHref;\n const filenameNoPath = filename.match(/([^\\/]+(\\?.*)?)$/)[1];\n\n elem.id = id;\n elem.className = 'less-error-message';\n\n content = `

    ${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'}` + \n `

    in ${filenameNoPath} `;\n\n const errorline = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\{content\\}/, e.extract[i]));\n }\n };\n\n if (e.line) {\n errorline(e, 0, '');\n errorline(e, 1, 'line');\n errorline(e, 2, '');\n content += `on line ${e.line}, column ${e.column + 1}:

      ${errors.join('')}
    `;\n }\n if (e.stack && (e.extract || options.logLevel >= 4)) {\n content += `
    Stack Trace
    ${e.stack.split('\\n').slice(1).join('
    ')}`;\n }\n elem.innerHTML = content;\n\n // CSS for error messages\n browser.createCSS(window.document, [\n '.less-error-message ul, .less-error-message li {',\n 'list-style-type: none;',\n 'margin-right: 15px;',\n 'padding: 4px 0;',\n 'margin: 0;',\n '}',\n '.less-error-message label {',\n 'font-size: 12px;',\n 'margin-right: 15px;',\n 'padding: 4px 0;',\n 'color: #cc7777;',\n '}',\n '.less-error-message pre {',\n 'color: #dd6666;',\n 'padding: 4px 0;',\n 'margin: 0;',\n 'display: inline-block;',\n '}',\n '.less-error-message pre.line {',\n 'color: #ff0000;',\n '}',\n '.less-error-message h3 {',\n 'font-size: 20px;',\n 'font-weight: bold;',\n 'padding: 15px 0 5px 0;',\n 'margin: 0;',\n '}',\n '.less-error-message a {',\n 'color: #10a',\n '}',\n '.less-error-message .error {',\n 'color: red;',\n 'font-weight: bold;',\n 'padding-bottom: 2px;',\n 'border-bottom: 1px dashed red;',\n '}'\n ].join('\\n'), { title: 'error-message' });\n\n elem.style.cssText = [\n 'font-family: Arial, sans-serif',\n 'border: 1px solid #e00',\n 'background-color: #eee',\n 'border-radius: 5px',\n '-webkit-border-radius: 5px',\n '-moz-border-radius: 5px',\n 'color: #e00',\n 'padding: 15px',\n 'margin-bottom: 15px'\n ].join(';');\n\n if (options.env === 'development') {\n timer = setInterval(() => {\n const document = window.document;\n const body = document.body;\n if (body) {\n if (document.getElementById(id)) {\n body.replaceChild(elem, document.getElementById(id));\n } else {\n body.insertBefore(elem, body.firstChild);\n }\n clearInterval(timer);\n }\n }, 10);\n }\n }\n\n function removeErrorHTML(path) {\n const node = window.document.getElementById(`less-error-message:${utils.extractId(path)}`);\n if (node) {\n node.parentNode.removeChild(node);\n }\n }\n\n function removeErrorConsole(path) {\n // no action\n }\n\n function removeError(path) {\n if (!options.errorReporting || options.errorReporting === 'html') {\n removeErrorHTML(path);\n } else if (options.errorReporting === 'console') {\n removeErrorConsole(path);\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('remove', path);\n }\n }\n\n function errorConsole(e, rootHref) {\n const template = '{line} {content}';\n const filename = e.filename || rootHref;\n const errors = [];\n let content = `${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'} in ${filename}`;\n\n const errorline = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\{content\\}/, e.extract[i]));\n }\n };\n\n if (e.line) {\n errorline(e, 0, '');\n errorline(e, 1, 'line');\n errorline(e, 2, '');\n content += ` on line ${e.line}, column ${e.column + 1}:\\n${errors.join('\\n')}`;\n }\n if (e.stack && (e.extract || options.logLevel >= 4)) {\n content += `\\nStack Trace\\n${e.stack}`;\n }\n less.logger.error(content);\n }\n\n function error(e, rootHref) {\n if (!options.errorReporting || options.errorReporting === 'html') {\n errorHTML(e, rootHref);\n } else if (options.errorReporting === 'console') {\n errorConsole(e, rootHref);\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('add', e, rootHref);\n }\n }\n\n return {\n add: error,\n remove: removeError\n };\n};\n","/**\n * Kicks off less and compiles any stylesheets\n * used in the browser distributed version of less\n * to kick-start less using the browser api\n */\n/* global window, document */\n\nimport defaultOptions from '../less/default-options';\nimport addDefaultOptions from './add-default-options';\nimport root from './index';\n\nconst options = defaultOptions();\n\nif (window.less) {\n for (const key in window.less) {\n if (window.less.hasOwnProperty(key)) {\n options[key] = window.less[key];\n }\n }\n}\naddDefaultOptions(window, options);\n\noptions.plugins = options.plugins || [];\n\nif (window.LESS_PLUGINS) {\n options.plugins = options.plugins.concat(window.LESS_PLUGINS);\n}\n\nconst less = root(window, options);\nexport default less;\n\nwindow.less = less;\n\nlet css;\nlet head;\nlet style;\n\n// Always restore page visibility\nfunction resolveOrReject(data) {\n if (data.filename) {\n console.warn(data);\n }\n if (!options.async) {\n head.removeChild(style);\n }\n}\n\nif (options.onReady) {\n if (/!watch/.test(window.location.hash)) {\n less.watch();\n }\n // Simulate synchronous stylesheet loading by hiding page rendering\n if (!options.async) {\n css = 'body { display: none !important }';\n head = document.head || document.getElementsByTagName('head')[0];\n style = document.createElement('style');\n\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n\n head.appendChild(style);\n }\n less.registerStylesheetsImmediately();\n less.pageLoadFinished = less.refresh(less.env === 'development').then(resolveOrReject, resolveOrReject);\n}\n","// Export a new default each time\nexport default () => ({\n /* Inline Javascript - @plugin still allowed */\n javascriptEnabled: false,\n\n /* Outputs a makefile import dependency list to stdout. */\n depends: false,\n\n /* (DEPRECATED) Compress using less built-in compression. \n * This does an okay job but does not utilise all the tricks of \n * dedicated css compression. */\n compress: false,\n\n /* Runs the less parser and just reports errors without any output. */\n lint: false,\n\n /* Sets available include paths.\n * If the file in an @import rule does not exist at that exact location, \n * less will look for it at the location(s) passed to this option. \n * You might use this for instance to specify a path to a library which \n * you want to be referenced simply and relatively in the less files. */\n paths: [],\n\n /* color output in the terminal */\n color: true,\n\n /* The strictImports controls whether the compiler will allow an @import inside of either \n * @media blocks or (a later addition) other selector blocks.\n * See: https://github.com/less/less.js/issues/656 */\n strictImports: false,\n\n /* Allow Imports from Insecure HTTPS Hosts */\n insecure: false,\n\n /* Allows you to add a path to every generated import and url in your css. \n * This does not affect less import statements that are processed, just ones \n * that are left in the output css. */\n rootpath: '',\n\n /* By default URLs are kept as-is, so if you import a file in a sub-directory \n * that references an image, exactly the same URL will be output in the css. \n * This option allows you to re-write URL's in imported files so that the \n * URL is always relative to the base imported file */\n rewriteUrls: false,\n\n /* How to process math \n * 0 always - eagerly try to solve all operations\n * 1 parens-division - require parens for division \"/\"\n * 2 parens | strict - require parens for all operations\n * 3 strict-legacy - legacy strict behavior (super-strict)\n */\n math: 0,\n\n /* Without this option, less attempts to guess at the output unit when it does maths. */\n strictUnits: false,\n\n /* Effectively the declaration is put at the top of your base Less file, \n * meaning it can be used but it also can be overridden if this variable \n * is defined in the file. */\n globalVars: null,\n\n /* As opposed to the global variable option, this puts the declaration at the\n * end of your base file, meaning it will override anything defined in your Less file. */\n modifyVars: null,\n\n /* This option allows you to specify a argument to go on to every URL. */\n urlArgs: ''\n});","import {addDataAttr} from './utils';\nimport browser from './browser';\n\nexport default (window, options) => {\n\n // use options from the current script tag data attribues\n addDataAttr(options, browser.currentScript(window));\n\n if (options.isFileProtocol === undefined) {\n options.isFileProtocol = /^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(window.location.protocol);\n }\n\n // Load styles asynchronously (default: false)\n //\n // This is set to `false` by default, so that the body\n // doesn't start loading before the stylesheets are parsed.\n // Setting this to `true` can result in flickering.\n //\n options.async = options.async || false;\n options.fileAsync = options.fileAsync || false;\n\n // Interval between watch polls\n options.poll = options.poll || (options.isFileProtocol ? 1000 : 1500);\n\n options.env = options.env || (window.location.hostname == '127.0.0.1' ||\n window.location.hostname == '0.0.0.0' ||\n window.location.hostname == 'localhost' ||\n (window.location.port &&\n window.location.port.length > 0) ||\n options.isFileProtocol ? 'development'\n : 'production');\n\n const dumpLineNumbers = /!dumpLineNumbers:(comments|mediaquery|all)/.exec(window.location.hash);\n if (dumpLineNumbers) {\n options.dumpLineNumbers = dumpLineNumbers[1];\n }\n\n if (options.useFileCache === undefined) {\n options.useFileCache = true;\n }\n\n if (options.onReady === undefined) {\n options.onReady = true;\n }\n\n if (options.relativeUrls) {\n options.rewriteUrls = 'all';\n }\n};\n","//\n// index.js\n// Should expose the additional browser functions on to the less object\n//\nimport {addDataAttr} from './utils';\nimport lessRoot from '../less';\nimport browser from './browser';\nimport FM from './file-manager';\nimport PluginLoader from './plugin-loader';\nimport LogListener from './log-listener';\nimport ErrorReporting from './error-reporting';\nimport Cache from './cache';\nimport ImageSize from './image-size';\n\nexport default (window, options) => {\n const document = window.document;\n const less = lessRoot();\n\n less.options = options;\n const environment = less.environment;\n const FileManager = FM(options, less.logger);\n const fileManager = new FileManager();\n environment.addFileManager(fileManager);\n less.FileManager = FileManager;\n less.PluginLoader = PluginLoader;\n\n LogListener(less, options);\n const errors = ErrorReporting(window, less, options);\n const cache = less.cache = options.cache || Cache(window, options, less.logger);\n ImageSize(less.environment);\n\n // Setup user functions - Deprecate?\n if (options.functions) {\n less.functions.functionRegistry.addMultiple(options.functions);\n }\n\n const typePattern = /^text\\/(x-)?less$/;\n\n function clone(obj) {\n const cloned = {};\n for (const prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n cloned[prop] = obj[prop];\n }\n }\n return cloned;\n }\n\n // only really needed for phantom\n function bind(func, thisArg) {\n const curryArgs = Array.prototype.slice.call(arguments, 2);\n return function() {\n const args = curryArgs.concat(Array.prototype.slice.call(arguments, 0));\n return func.apply(thisArg, args);\n };\n }\n\n function loadStyles(modifyVars) {\n const styles = document.getElementsByTagName('style');\n let style;\n\n for (let i = 0; i < styles.length; i++) {\n style = styles[i];\n if (style.type.match(typePattern)) {\n const instanceOptions = clone(options);\n instanceOptions.modifyVars = modifyVars;\n const lessText = style.innerHTML || '';\n instanceOptions.filename = document.location.href.replace(/#.*$/, '');\n\n /* jshint loopfunc:true */\n // use closure to store current style\n less.render(lessText, instanceOptions,\n bind((style, e, result) => {\n if (e) {\n errors.add(e, 'inline');\n } else {\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = result.css;\n } else {\n style.innerHTML = result.css;\n }\n }\n }, null, style));\n }\n }\n }\n\n function loadStyleSheet(sheet, callback, reload, remaining, modifyVars) {\n\n const instanceOptions = clone(options);\n addDataAttr(instanceOptions, sheet);\n instanceOptions.mime = sheet.type;\n\n if (modifyVars) {\n instanceOptions.modifyVars = modifyVars;\n }\n\n function loadInitialFileCallback(loadedFile) {\n const data = loadedFile.contents;\n const path = loadedFile.filename;\n const webInfo = loadedFile.webInfo;\n\n const newFileInfo = {\n currentDirectory: fileManager.getPath(path),\n filename: path,\n rootFilename: path,\n rewriteUrls: instanceOptions.rewriteUrls\n };\n\n newFileInfo.entryPath = newFileInfo.currentDirectory;\n newFileInfo.rootpath = instanceOptions.rootpath || newFileInfo.currentDirectory;\n\n if (webInfo) {\n webInfo.remaining = remaining;\n\n const css = cache.getCSS(path, webInfo, instanceOptions.modifyVars);\n if (!reload && css) {\n webInfo.local = true;\n callback(null, css, data, sheet, webInfo, path);\n return;\n }\n\n }\n\n // TODO add tests around how this behaves when reloading\n errors.remove(path);\n\n instanceOptions.rootFileInfo = newFileInfo;\n less.render(data, instanceOptions, (e, result) => {\n if (e) {\n e.href = path;\n callback(e);\n } else {\n cache.setCSS(sheet.href, webInfo.lastModified, instanceOptions.modifyVars, result.css);\n callback(null, result.css, data, sheet, webInfo, path);\n }\n });\n }\n\n fileManager.loadFile(sheet.href, null, instanceOptions, environment)\n .then(loadedFile => {\n loadInitialFileCallback(loadedFile);\n }).catch(err => {\n console.log(err);\n callback(err);\n });\n\n }\n\n function loadStyleSheets(callback, reload, modifyVars) {\n for (let i = 0; i < less.sheets.length; i++) {\n loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1), modifyVars);\n }\n }\n\n function initRunningMode() {\n if (less.env === 'development') {\n less.watchTimer = setInterval(() => {\n if (less.watchMode) {\n fileManager.clearFileCache();\n loadStyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n } else if (css) {\n browser.createCSS(window.document, css, sheet);\n }\n });\n }\n }, options.poll);\n }\n }\n\n //\n // Watch mode\n //\n less.watch = function () {\n if (!less.watchMode ) {\n less.env = 'development';\n initRunningMode();\n }\n this.watchMode = true;\n return true;\n };\n\n less.unwatch = function () {clearInterval(less.watchTimer); this.watchMode = false; return false; };\n\n //\n // Synchronously get all tags with the 'rel' attribute set to\n // \"stylesheet/less\".\n //\n less.registerStylesheetsImmediately = () => {\n const links = document.getElementsByTagName('link');\n less.sheets = [];\n\n for (let i = 0; i < links.length; i++) {\n if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) &&\n (links[i].type.match(typePattern)))) {\n less.sheets.push(links[i]);\n }\n }\n };\n\n //\n // Asynchronously get all tags with the 'rel' attribute set to\n // \"stylesheet/less\", returning a Promise.\n //\n less.registerStylesheets = () => new Promise((resolve, reject) => {\n less.registerStylesheetsImmediately();\n resolve();\n });\n\n //\n // With this function, it's possible to alter variables and re-render\n // CSS without reloading less-files\n //\n less.modifyVars = record => less.refresh(true, record, false);\n\n less.refresh = (reload, modifyVars, clearFileCache) => {\n if ((reload || clearFileCache) && clearFileCache !== false) {\n fileManager.clearFileCache();\n }\n return new Promise((resolve, reject) => {\n let startTime;\n let endTime;\n let totalMilliseconds;\n let remainingSheets;\n startTime = endTime = new Date();\n\n // Set counter for remaining unprocessed sheets\n remainingSheets = less.sheets.length;\n\n if (remainingSheets === 0) {\n\n endTime = new Date();\n totalMilliseconds = endTime - startTime;\n less.logger.info('Less has finished and no sheets were loaded.');\n resolve({\n startTime,\n endTime,\n totalMilliseconds,\n sheets: less.sheets.length\n });\n\n } else {\n // Relies on less.sheets array, callback seems to be guaranteed to be called for every element of the array\n loadStyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n reject(e);\n return;\n }\n if (webInfo.local) {\n less.logger.info(`Loading ${sheet.href} from cache.`);\n } else {\n less.logger.info(`Rendered ${sheet.href} successfully.`);\n }\n browser.createCSS(window.document, css, sheet);\n less.logger.info(`CSS for ${sheet.href} generated in ${new Date() - endTime}ms`);\n\n // Count completed sheet\n remainingSheets--;\n\n // Check if the last remaining sheet was processed and then call the promise\n if (remainingSheets === 0) {\n totalMilliseconds = new Date() - startTime;\n less.logger.info(`Less has finished. CSS generated in ${totalMilliseconds}ms`);\n resolve({\n startTime,\n endTime,\n totalMilliseconds,\n sheets: less.sheets.length\n });\n }\n endTime = new Date();\n }, reload, modifyVars);\n }\n\n loadStyles(modifyVars);\n });\n };\n\n less.refreshStyles = loadStyles;\n return less;\n};\n","export default (less, options) => {\n const logLevel_debug = 4;\n const logLevel_info = 3;\n const logLevel_warn = 2;\n const logLevel_error = 1;\n\n // The amount of logging in the javascript console.\n // 3 - Debug, information and errors\n // 2 - Information and errors\n // 1 - Errors\n // 0 - None\n // Defaults to 2\n options.logLevel = typeof options.logLevel !== 'undefined' ? options.logLevel : (options.env === 'development' ? logLevel_info : logLevel_error);\n\n if (!options.loggers) {\n options.loggers = [{\n debug: function(msg) {\n if (options.logLevel >= logLevel_debug) {\n console.log(msg);\n }\n },\n info: function(msg) {\n if (options.logLevel >= logLevel_info) {\n console.log(msg);\n }\n },\n warn: function(msg) {\n if (options.logLevel >= logLevel_warn) {\n console.warn(msg);\n }\n },\n error: function(msg) {\n if (options.logLevel >= logLevel_error) {\n console.error(msg);\n }\n }\n }];\n }\n for (let i = 0; i < options.loggers.length; i++) {\n less.logger.addListener(options.loggers[i]);\n }\n};\n","// Cache system is a bit outdated and could do with work\n\nexport default (window, options, logger) => {\n let cache = null;\n if (options.env !== 'development') {\n try {\n cache = (typeof window.localStorage === 'undefined') ? null : window.localStorage;\n } catch (_) {}\n }\n return {\n setCSS: function(path, lastModified, modifyVars, styles) {\n if (cache) {\n logger.info(`saving ${path} to cache.`);\n try {\n cache.setItem(path, styles);\n cache.setItem(`${path}:timestamp`, lastModified);\n if (modifyVars) {\n cache.setItem(`${path}:vars`, JSON.stringify(modifyVars));\n }\n } catch (e) {\n // TODO - could do with adding more robust error handling\n logger.error(`failed to save \"${path}\" to local storage for caching.`);\n }\n }\n },\n getCSS: function(path, webInfo, modifyVars) {\n const css = cache && cache.getItem(path);\n const timestamp = cache && cache.getItem(`${path}:timestamp`);\n let vars = cache && cache.getItem(`${path}:vars`);\n\n modifyVars = modifyVars || {};\n vars = vars || \"{}\"; // if not set, treat as the JSON representation of an empty object\n\n if (timestamp && webInfo.lastModified &&\n (new Date(webInfo.lastModified).valueOf() ===\n new Date(timestamp).valueOf()) &&\n JSON.stringify(modifyVars) === vars) {\n // Use local copy\n return css;\n }\n }\n };\n};\n","\nimport functionRegistry from './../less/functions/function-registry';\n\nexport default () => {\n function imageSize() {\n throw {\n type: 'Runtime',\n message: 'Image size functions are not supported in browser version of less'\n };\n }\n\n const imageFunctions = {\n 'image-size': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n },\n 'image-width': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n },\n 'image-height': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n }\n };\n\n functionRegistry.addMultiple(imageFunctions);\n};\n"],"names":["extractId","href","replace","addDataAttr","options","tag","opt","dataset","hasOwnProperty","JSON","parse","_","document","styles","sheet","id","title","utils.extractId","oldStyleNode","getElementById","keepOldStyleNode","styleNode","createElement","setAttribute","media","styleSheet","appendChild","createTextNode","childNodes","length","firstChild","nodeValue","head","getElementsByTagName","nextEl","nextSibling","parentNode","insertBefore","removeChild","cssText","e","Error","window","scripts","currentScript","extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","__extends","__","this","constructor","prototype","create","__assign","assign","t","s","i","n","arguments","call","apply","__spreadArrays","il","r","k","a","j","jl","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","darkgrey","darkgreen","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","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","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","m","cm","mm","in","px","pt","pc","duration","ms","angle","rad","Math","PI","deg","grad","turn","colors","unitConversions","parent","visibilityBlocks","undefined","nodeVisible","rootNode","parsed","self","defineProperty","get","fileInfo","getIndex","Node","nodes","set","node","isArray","forEach","_index","_fileInfo","context","strs","genCSS","add","chunk","index","push","isEmpty","join","output","value","visitor","visit","op","precision","numPrecision","Number","toFixed","info","compare","type","numericCompare","rgb","originalForm","_super","_this","match","map","c","parseInt","alpha","split","Color","g","pow","toCSS","doNotCompress","color","colorFunction","compress","args","fround","indexOf","clamp","round","concat","toHSL","h","l","toRGB","splitcolor","other","_operate","toHex","max","min","v","x","toString","fromKeyword","keyword","key","toLowerCase","slice","Paren","eval","_noSpaceCombinators"," ","|","emptyOrWhitespace","trim","Combinator","spaceOrEmpty","combinator","isVariable","currentFileInfo","visibilityInfo","copyVisibilityInfo","setParent","Element","firstSelector","charAt","ALWAYS","PARENS_DIVISION","PARENS","STRICT_LEGACY","RewriteUrls","getLocation","inputStream","line","column","copyArray","arr","copy","clone","obj","cloned","prop","defaults","obj1","obj2","newObj","_defaults","defaults_1","copyOptions","opts","strictMath","math","Constants.Math","relativeUrls","rewriteUrls","Constants.RewriteUrls","flattenArray","result","length_1","anonymousFunc","LessError","fileContentMap","currentFilename","filename","message","stack","input","contents","loc","utils.getLocation","col","callLine","lines","found","func","Function","lineAdjust","callExtract","extract","F","error","stylize","str","errorTxt","substr","elements","extendList","condition","evaldCondition","getElements","mixinElements_","Selector","visitArray","newSelector","mediaEmpty","els","parseNode","err","imports","sels","olen","len","mixinElements","shift","extend","createDerived","Value","Keyword","True","False","mapLines","rulesetLike","allowRoot","Anonymous","Boolean","MATH","name","important","merge","inline","variable","Declaration","lastRule","prevMath","evaldValue","mathBypass","evalName","importantScope","importantResult","pop","debugInfo","ctx","lineSeparator","dumpLineNumbers","asComment","asMediaQuery","lineNumber","fileName","filenameWithProtocol","test","isLineComment","Comment","getDebugInfo","isCompressed","contexts","copyFromOriginal","original","destination","propertiesToCopy","parseCopyProperties","Parse","paths","evalCopyProperties","isPathRelative","path","isPathLocalRelative","Eval","frames","inCalc","mathOn","calcStack","parensStack","rootpath","newPath","normalizePath","segment","segments","reverse","makeRegistry","base","_data","addMultiple","functions","keys","getLocalFunctions","inherit","defaultFunc","value_","error_","reset","selectors","rules","strictImports","_lookups","_variables","_properties","Ruleset","selCnt","selector","hasVariable","hasOnePassingSelector","toParseSelectors","utils.flattenArray","rule","subRule","utils.copyArray","ruleset","originalRuleset","root","firstRoot","allowImports","functionRegistry","globalFunctionRegistry","ctxFrames","unshift","ctxSelectors","evalImports","rsRules","evalFirst","mediaBlockCount","mediaBlocks","filter","splice","resetCache","isJustParentSelector","bubbleSelectors","importRules","makeImportant","lastSelector","_rulesets","reduce","hash","variables","vars","name_1","name_2","decl","parseValue","properties","toParse","transformDeclaration","nodes_1","filtRules","isRuleset","foundMixins","rulesets","find","ruleNodes","tabLevel","sep","tabRuleStr","tabSetStr","charsetNodeIndex","importNodeIndex","isCharset","pathCnt","pathSubCnt","currentLastRule","isRulesetLike","isVisible","joinSelector","createParenthesis","elementsToPak","originalElement","replacementParen","insideParent","createSelector","containedElement","element","addReplacementIntoPath","beginningPath","addPath","replacedElement","originalSelector","newSelectorPath","newJoinedSelector","parentEl","restOfPath","addAllReplacementsIntoPath","addPaths","mergeElementsOnToSelectors","sel","deriveSelector","deriveFrom","newPaths","replaceParentSelector","inSelector","currentElements","newSelectors","selectorsMultiplied","el","maybeSelector","hadParentSelector","nestedSelector","replaced","nestedPaths","replacedNewSelectors","concatenated","bind","isRooted","createEmptySelectors","AtRule","outputRuleset","mediaPathBackup","mediaBlocksBackup","mediaPath","_i","ruleCnt","DetachedRuleset","numerator","denominator","backupUnit","sort","Unit","strictUnits","returnStr","is","unitString","toUpperCase","RegExp","callback","group","mapUnit","groupName","atomicUnit","counter","count","unit","parseFloat","isNaN","Dimension","isSingular","strValue","String","isLength","convertTo","usedUnits","cancel","unify","conversions","targetUnit","applyUnit","derivedConversions","operands","isSpaced","Operation","isMathOn","toColor","operate","noSpacing","Expression","returnValue","inParenthesis","parens","parensInOp","doubleParen","outOfParenthesis","functionCaller","evalArgs","item","subNodes","calc","Call","currentMathContext","enterCalc","exitCalc","funcCaller","FunctionCaller","isValid","columnNumber","Variable","evaluating","frame","fun","Property","property","mergeRules","pluginManager","less","visitors","ToCSSVisitor","_mergeRules","vArr","Attribute","content","escaped","quote","variableRegex","propRegex","Quoted","that","iterativeReplace","regexp","replacementFnc","evaluatedValue","val","isEvald","URL","pathRequiresRewrite","rewritePath","urlArgs","features","Media","evalTop","evalNested","multiMedia","permute","fragment","rest","css","pathValue","getPath","Import","isPlugin","reference","containsVariables","doEval","blocksVisibility","addVisibilityBlock","registry","skip","importedFilename","newImport","evalPath","string","expression","JavaScript","evaluateJavaScript","JsEvalNode","evalContext","javascriptEnabled","jsify","toJS","Assignment","negate","lvalue","rvalue","Condition","UnicodeDescriptor","Negative","option","object_id","Extend","next_id","parent_ids","allowBefore","allowAfter","selectorElements","selfElements","selfSelectors","VariableCall","detachedRuleset","callEval","ruleCall","lookups","NamespaceValue","lastDeclaration","substring","params","variadic","arity","optionalParameters","required","Definition","mixinEnv","evaldArguments","varargs","arg","isNamedFound","argIndex","argsLength","prependRule","_arguments","mixinFrames","evalParams","allArgsCnt","requiredArgsCnt","MixinCall","mixins","mixin","mixinPath","argValue","f","isRecursive","isOneFound","candidate","defaultResult","noArgumentsFilter","candidates","conditionResult","calcDefGroup","namespace","matchCondition","expand","matchArgs","MixinDefinition","format","newRules","evalCall","_setVisibilityToReplacement","replacement","msg","_fireEvent","warn","debug","addListener","listener","_listeners","removeListener","logFunction","externalEnvironment","fileManagers","requiredFunctions","propName","environmentFunc","environment","currentDirectory","isSync","logger","getFileManagers","fileManager","AbstractFileManager","lastIndexOf","ext","tryAppendExtension","basePath","laterPath","url","baseUrl","urlDirectories","baseUrlDirectories","urlParts","extractUrlParts","baseUrlParts","diff","hostPart","directories","urlPartsRegex","returner","rawDirectories","rawPath","fileUrl","require","AbstractPluginLoader","pluginOptions","pluginObj","localModule","shortname","FileManager","trySetOptions","use","exports","loader","tree","validatePlugin","minVersion","compareVersion","addPlugin","plugin","setOptions","version","versionToString","aVersion","bVersion","versionString","plugins","printUsage","_visitArgs","visitDeeper","_hasIndexed","_noop","implementation","_implementation","_visitInCache","_visitOutCache","indexNodeTypes","ticker","child","typeIndex","Visitor","nodeTypeIndex","fnName","impl","funcOut","visitArgs","newNode","isReplacing","cnt","accept","nonReplacing","out","evald","flatten","nestedCnt","nestedItem","onSequencerEmpty","variableImports","_onSequencerEmpty","_currentDepth","ImportSequencer","importSequencer","importItem","isReady","tryRun","variableImport","ImportVisitor","importer","finish","_visitor","_importer","_finish","importCount","onceFileDetectionMap","recursionDetector","_sequencer","run","isFinished","visitImport","importNode","inlineCSS","importParent","isVariableImport","addVariableImport","processImportNode","evaldImportNode","evalForImport","multiple","importMultiple","tryAppendLessExtension","onImported","sequencedOnImported","addImport","importedAtRoot","fullPath","importVisitor","isOptional","optional","duplicateImport","oldContext","visitDeclaration","declNode","visitDeclarationOut","visitAtRule","atRuleNode","visitAtRuleOut","visitMixinDefinition","mixinDefinitionNode","visitMixinDefinitionOut","visitRuleset","rulesetNode","visitRulesetOut","visitMedia","mediaNode","visitMediaOut","visible","SetTreeVisibilityVisitor","ensureVisibility","ensureInvisibility","allExtendsStack","ExtendFinderVisitor","allExtends","allSelectorsExtendList","extendOnEveryPath","selectorPath","selExtendList","allSelectorsExtend","foundExtends","findSelfSelectors","firstExtendOnThisSelectorPath","ProcessExtendsVisitor","extendFinder","extendIndices","doExtendChaining","newRoot","checkExtendsForNonMatched","indices","hasFoundMatches","extendsList","extendsListTarget","iterationCount","extendIndex","targetExtendIndex","matches","targetExtend","newExtend","extendsToAdd","extendVisitor","findMatch","selfSelector","extendSelector","extendChainCount","selectorOne","selectorTwo","ruleNode","selectorNode","pathIndex","selectorsToAdd","extendedSelectors","haystackSelectorPath","haystackSelectorIndex","hackstackSelector","hackstackElementIndex","haystackElement","targetCombinator","potentialMatch","needleElements","potentialMatches","matched","initialCombinator","isElementValuesEqual","finished","endPathIndex","endPathElementIndex","elementValue1","elementValue2","replacementSelector","matchIndex","firstElement","newElements","currentSelectorPathIndex","currentSelectorPathElementIndex","currentValue","derived","newAllExtends","lastIndex","JoinSelectorVisitor","getIsOutput","joinSelectors","_context","CSSVisitorUtils","bodyRules","isSilent","owner","thing","originalRules","containsSilentNonBlockedChild","compiledRulesBody","keepOnlyVisibleChilds","removeVisibilityBlock","hasVisibleSelector","utils","mixinNode","visitExtend","extendNode","visitComment","commentNode","resolveVisibility","visitAtRuleWithBody","visitAtRuleWithoutBody","visitAnonymous","anonymousNode","nodeRules","hasFakeRuleset","getBodyRules","charset","comment","checkValidNodes","isRoot","_compileRulesetPaths","nodeRuleCnt","_removeDuplicateRules","isVisibleRuleset","ruleList","ruleCache","ruleCSS","groups","groupsArr","result_1","space_1","comma_1","MarkVisibleSelectorsVisitor","ExtendVisitor","furthest","furthestPossibleErrorMessage","chunks","current","currentPos","saveStack","parserInput","skipWhitespace","nextChar","oldi","oldj","curr","endIndex","mem","inp","charCodeAt","autoCommentAbsorb","nextNewLine","text","commentStore","nextStarSlash","save","restore","possibleErrorMessage","state","forget","isWhitespace","offset","pos","code","$re","tok","exec","$char","$str","tokLength","$quoted","startChar","currentPosition","$parseUntil","testChar","returnVal","inComment","blockDepth","blockStack","parseGroups","startPos","lastPos","loop","char","expected","peek","peekChar","currentChar","prevChar","getInput","peekNotNumeric","start","chunkInput","failFunction","fail","lastOpening","lastOpeningParen","lastMultiComment","lastMultiCommentEndBrace","chunkerCurrentIndex","currentChunkStartIndex","cc","cc2","level","parenLevel","emitFrom","emitChunk","force","fromCharCode","chunker","end","furthestReachedEnd","furthestChar","Parser","parsers","getParserInput","expect","expectChar","parseList","currentIndex","returnNodes","parser","additionalData","globalVars","modifyVars","ignored","preText","serializeVars","preProcessors","getPreProcessors","process","banner","contentsIgnoredChars","primary","endInfo","processImports","extendRule","definition","declaration","variableCall","entities","atrule","foundSemiColon","mixinLookup","quoted","forceEscaped","isEscaped","customFuncCall","stop","ieAlpha","boolean","if","prevArgs","isSemiColonSeparated","argsComma","argsSemiColon","assignment","literal","dimension","unicodeDescriptor","entity","ch","variableCurly","curly","propertyCurly","colorKeyword","ud","javascript","js","escape","parsedName","inValue","ruleLookups","isRule","getLookup","hasParens","elem","elemIndex","re","isCall","expressionContainsNamed","nameLoop","expressions","hasSep","throwAwayComments","cond","argInfo","conditions","block","lookupValue","attribute","slashedCombinator","isLess","when","blockRuleset","hasDR","ruleProperty","permissiveValue","anonymousValue","untilTokens","done","testCurrentChar","import","dir","importOptions","mediaFeatures","o","optionName","importOption","mediaFeature","pluginArgs","nonVendorSpecificName","hasIdentifier","hasExpression","hasUnknown","hasBlock","sub","addition","multiplication","operation","operand","needsParens","logical","next","conditionAnd","negatedCondition","parenthesisCondition","atomicCondition","body","me","tryConditionFollowedByParenthesis","delim","simpleProperty","If","trueValue","falseValue","colorFunctions","hsla","origColor","hsl","toHSV","number","rgba","size","m1_1","m2_1","hue","hsv","hsva","vs","floor","perm","saturation","lightness","hsvhue","hsvsaturation","hsvvalue","luma","luminance","saturate","amount","method","desaturate","lighten","darken","fadein","fadeout","fade","spin","mix","color1","color2","weight","w","w1","w2","greyscale","contrast","dark","light","threshold","argb","toARGB","tint","shade","colorBlend","mode","cb","cs","ar","cr","ab","as","colorBlendModeFunctions","multiply","screen","overlay","softlight","sqrt","hardlight","difference","abs","exclusion","average","negation","getItemsFromNode","_SELF","values","range","step","from","to","stepValue","list","each","rs","iterator","Quote","valueName","keyName","indexName","MathHelper","fn","mathFunctions","ceil","sin","cos","atan","asin","acos","mathHelper","fraction","num","pm","minMax","isMin","currentUnified","referenceUnified","unitStatic","unitClone","order","convert","pi","mod","y","percentage","evaluated","encodeURI","pattern","flags","%","token","encodeURIComponent","isa","Type","isunit","isruleset","iscolor","isnumber","isstring","iskeyword","isurl","ispixel","ispercentage","isem","get-unit","colorBlending","fallback","functionThis","data-uri","mimetypeNode","filePathNode","mimetype","filePath","entryPath","fragmentStart","utils.clone","rawBuffer","getFileManager","useBase64","mimeLookup","charsetLookup","fileSync","loadFileSync","buf","encodeBase64","uri","dataUri","svg-gradient","direction","stops","gradientDirectionSvg","position","positionValue","gradientType","rectangleDimension","renderEnv","directionValue","throwArgumentDescriptor","types","evaldRoot","evalEnv","visitorIterator","preEvalVisitors","first","isPreEvalVisitor","isPreVisitor","postProcessors","installedPlugins","pluginCache","Loader","PluginLoader","PluginManager","install","preProcessor","priority","indexToInsertAt","postProcessor","manager","PluginManagerFactory","newFactory","SourceMapOutput","_css","_rootNode","_contentsMap","contentsMap","_contentsIgnoredCharsMap","contentsIgnoredCharsMap","sourceMapFilename","_sourceMapFilename","_outputFilename","outputFilename","sourceMapURL","sourceMapBasepath","_sourceMapBasepath","sourceMapRootpath","_sourceMapRootpath","_outputSourceFiles","outputSourceFiles","_sourceMapGeneratorConstructor","getSourceMapGenerator","_lineNumber","_column","removeBasepath","sourceLines","columns","sourceColumns","inputSource","_sourceMapGenerator","addMapping","generated","source","normalizeFilename","file","sourceRoot","setSourceContent","sourceMapContent","stringify","toJSON","sourceMap","sourceMapOutput","Environment","SourceMapBuilder","sourceMapOutputFilename","sourceMapGenerator","sourceMapFileInline","disableSourcemapAnnotation","sourceMapInputFilename","getCSSAppendage","sourceMapBuilder","ParseTree","transformTree","toCSSOptions","getPostProcessors","getExternalSourceMap","rootFilename","files","parseTree","ImportManager","rootFileInfo","mime","queue","importManager","pluginLoader","fileParsedFunc","importedEqualsRoot","newFileInfo","loadedFile","promise","loadFileCallback","resolvedFilename","pathDiff","isPathAbsolute","alwaysMakePathsAbsolute","newEnv","evalPlugin","syncImport","loadPluginSync","loadPlugin","loadFile","then","render","utils.copyOptions","self_1","Promise","resolve","reject","Render","context_1","pluginManager_1","reUsePluginManager","imports_1","evalResult","fileContent","Functions","initial","data","ctor","api","fileCache","errback","xhr","XMLHttpRequest","async","isFileProtocol","fileAsync","handleResponse","status","responseText","getResponseHeader","overrideMimeType","open","setRequestHeader","send","onreadystatechange","readyState","location","useFileCache","lessText","webInfo","lastModified","Date","doXHR","log","fulfill","catch","rootHref","errorReporting","errors","errorline","classname","logLevel","errorConsole","timer","filenameNoPath","className","innerHTML","browser","style","env","setInterval","replaceChild","clearInterval","errorHTML","remove","removeErrorHTML","depends","lint","insecure","protocol","poll","hostname","port","onReady","addDefaultOptions","LESS_PLUGINS","lessRoot","FM","addFileManager","loggers","console","LogListener","ErrorReporting","cache","localStorage","setCSS","setItem","getCSS","getItem","timestamp","valueOf","Cache","imageSize","imageFunctions","image-size","image-width","image-height","ImageSize","typePattern","thisArg","curryArgs","loadStyles","instanceOptions","loadStyleSheet","reload","remaining","local","loadInitialFileCallback","loadStyleSheets","sheets","watch","watchMode","watchTimer","clearFileCache","unwatch","registerStylesheetsImmediately","links","rel","registerStylesheets","record","refresh","startTime","endTime","totalMilliseconds","remainingSheets","refreshStyles","resolveOrReject","pageLoadFinished"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"less.min.js","sources":["../src/less-browser/utils.js","../src/less-browser/browser.js","../src/less/logger.js","../src/less/environment/environment.js","../src/less/data/colors.js","../src/less/data/unit-conversions.js","../src/less/data/index.js","../src/less/tree/node.js","../node_modules/tslib/tslib.es6.js","../src/less/tree/color.js","../src/less/tree/paren.js","../src/less/tree/combinator.js","../src/less/tree/element.js","../src/less/constants.js","../src/less/utils.js","../src/less/less-error.js","../src/less/tree/selector.js","../src/less/tree/value.js","../src/less/tree/keyword.js","../src/less/tree/anonymous.js","../src/less/tree/declaration.js","../src/less/tree/debug-info.js","../src/less/tree/comment.js","../src/less/contexts.js","../src/less/functions/function-registry.js","../src/less/functions/default.js","../src/less/tree/ruleset.js","../src/less/tree/atrule.js","../src/less/tree/detached-ruleset.js","../src/less/tree/unit.js","../src/less/tree/dimension.js","../src/less/tree/operation.js","../src/less/tree/expression.js","../src/less/functions/function-caller.js","../src/less/tree/call.js","../src/less/tree/variable.js","../src/less/tree/property.js","../src/less/tree/attribute.js","../src/less/tree/quoted.js","../src/less/tree/url.js","../src/less/tree/media.js","../src/less/tree/import.js","../src/less/tree/js-eval-node.js","../src/less/tree/javascript.js","../src/less/tree/assignment.js","../src/less/tree/condition.js","../src/less/tree/unicode-descriptor.js","../src/less/tree/negative.js","../src/less/tree/extend.js","../src/less/tree/variable-call.js","../src/less/tree/namespace-value.js","../src/less/tree/mixin-definition.js","../src/less/tree/mixin-call.js","../src/less/tree/index.js","../src/less/environment/abstract-file-manager.js","../src/less/environment/abstract-plugin-loader.js","../src/less/visitors/visitor.js","../src/less/visitors/import-sequencer.js","../src/less/visitors/import-visitor.js","../src/less/visitors/set-tree-visibility-visitor.js","../src/less/visitors/extend-visitor.js","../src/less/visitors/join-selector-visitor.js","../src/less/visitors/to-css-visitor.js","../src/less/visitors/index.js","../src/less/parser/parser-input.js","../src/less/parser/chunker.js","../src/less/parser/parser.js","../src/less/functions/boolean.js","../src/less/functions/color.js","../src/less/functions/color-blending.js","../src/less/functions/list.js","../src/less/functions/math-helper.js","../src/less/functions/math.js","../src/less/functions/number.js","../src/less/functions/string.js","../src/less/functions/types.js","../src/less/functions/index.js","../src/less/functions/data-uri.js","../src/less/functions/svg.js","../src/less/transform-tree.js","../src/less/plugin-manager.js","../src/less-browser/file-manager.js","../src/less/index.js","../src/less/parse-tree.js","../src/less/source-map-builder.js","../src/less/source-map-output.js","../src/less/import-manager.js","../src/less/render.js","../src/less/parse.js","../src/less-browser/plugin-loader.js","../src/less-browser/error-reporting.js","../src/less-browser/bootstrap.js","../src/less/default-options.js","../src/less-browser/add-default-options.js","../src/less-browser/index.js","../src/less-browser/log-listener.js","../src/less-browser/cache.js","../src/less-browser/image-size.js"],"sourcesContent":["\nexport function extractId(href) {\n return href.replace(/^[a-z-]+:\\/+?[^\\/]+/, '') // Remove protocol & domain\n .replace(/[\\?\\&]livereload=\\w+/, '') // Remove LiveReload cachebuster\n .replace(/^\\//, '') // Remove root /\n .replace(/\\.[a-zA-Z]+$/, '') // Remove simple extension\n .replace(/[^\\.\\w-]+/g, '-') // Replace illegal characters\n .replace(/\\./g, ':'); // Replace dots with colons(for valid id)\n}\n\nexport function addDataAttr(options, tag) {\n for (const opt in tag.dataset) {\n if (tag.dataset.hasOwnProperty(opt)) {\n if (opt === 'env' || opt === 'dumpLineNumbers' || opt === 'rootpath' || opt === 'errorReporting') {\n options[opt] = tag.dataset[opt];\n } else {\n try {\n options[opt] = JSON.parse(tag.dataset[opt]);\n }\n catch (_) {}\n }\n }\n }\n}\n","import * as utils from './utils';\n\nexport default {\n createCSS: function (document, styles, sheet) {\n // Strip the query-string\n const href = sheet.href || '';\n\n // If there is no title set, use the filename, minus the extension\n const id = `less:${sheet.title || utils.extractId(href)}`;\n\n // If this has already been inserted into the DOM, we may need to replace it\n const oldStyleNode = document.getElementById(id);\n let keepOldStyleNode = false;\n\n // Create a new stylesheet node for insertion or (if necessary) replacement\n const styleNode = document.createElement('style');\n styleNode.setAttribute('type', 'text/css');\n if (sheet.media) {\n styleNode.setAttribute('media', sheet.media);\n }\n styleNode.id = id;\n\n if (!styleNode.styleSheet) {\n styleNode.appendChild(document.createTextNode(styles));\n\n // If new contents match contents of oldStyleNode, don't replace oldStyleNode\n keepOldStyleNode = (oldStyleNode !== null && oldStyleNode.childNodes.length > 0 && styleNode.childNodes.length > 0 &&\n oldStyleNode.firstChild.nodeValue === styleNode.firstChild.nodeValue);\n }\n\n const head = document.getElementsByTagName('head')[0];\n\n // If there is no oldStyleNode, just append; otherwise, only append if we need\n // to replace oldStyleNode with an updated stylesheet\n if (oldStyleNode === null || keepOldStyleNode === false) {\n const nextEl = sheet && sheet.nextSibling || null;\n if (nextEl) {\n nextEl.parentNode.insertBefore(styleNode, nextEl);\n } else {\n head.appendChild(styleNode);\n }\n }\n if (oldStyleNode && keepOldStyleNode === false) {\n oldStyleNode.parentNode.removeChild(oldStyleNode);\n }\n\n // For IE.\n // This needs to happen *after* the style element is added to the DOM, otherwise IE 7 and 8 may crash.\n // See http://social.msdn.microsoft.com/Forums/en-US/7e081b65-878a-4c22-8e68-c10d39c2ed32/internet-explorer-crashes-appending-style-element-to-head\n if (styleNode.styleSheet) {\n try {\n styleNode.styleSheet.cssText = styles;\n } catch (e) {\n throw new Error('Couldn\\'t reassign styleSheet.cssText.');\n }\n }\n },\n currentScript: function(window) {\n const document = window.document;\n return document.currentScript || (() => {\n const scripts = document.getElementsByTagName('script');\n return scripts[scripts.length - 1];\n })();\n }\n};\n","export default {\n error: function(msg) {\n this._fireEvent('error', msg);\n },\n warn: function(msg) {\n this._fireEvent('warn', msg);\n },\n info: function(msg) {\n this._fireEvent('info', msg);\n },\n debug: function(msg) {\n this._fireEvent('debug', msg);\n },\n addListener: function(listener) {\n this._listeners.push(listener);\n },\n removeListener: function(listener) {\n for (let i = 0; i < this._listeners.length; i++) {\n if (this._listeners[i] === listener) {\n this._listeners.splice(i, 1);\n return;\n }\n }\n },\n _fireEvent: function(type, msg) {\n for (let i = 0; i < this._listeners.length; i++) {\n const logFunction = this._listeners[i][type];\n if (logFunction) {\n logFunction(msg);\n }\n }\n },\n _listeners: []\n};\n","/**\n * @todo Document why this abstraction exists, and the relationship between\n * environment, file managers, and plugin manager\n */\n\nimport logger from '../logger';\n\nclass Environment {\n constructor(externalEnvironment, fileManagers) {\n this.fileManagers = fileManagers || [];\n externalEnvironment = externalEnvironment || {};\n\n const optionalFunctions = ['encodeBase64', 'mimeLookup', 'charsetLookup', 'getSourceMapGenerator'];\n const requiredFunctions = [];\n const functions = requiredFunctions.concat(optionalFunctions);\n\n for (let i = 0; i < functions.length; i++) {\n const propName = functions[i];\n const environmentFunc = externalEnvironment[propName];\n if (environmentFunc) {\n this[propName] = environmentFunc.bind(externalEnvironment);\n } else if (i < requiredFunctions.length) {\n this.warn(`missing required function in environment - ${propName}`);\n }\n }\n }\n\n getFileManager(filename, currentDirectory, options, environment, isSync) {\n\n if (!filename) {\n logger.warn('getFileManager called with no filename.. Please report this issue. continuing.');\n }\n if (currentDirectory == null) {\n logger.warn('getFileManager called with null directory.. Please report this issue. continuing.');\n }\n\n let fileManagers = this.fileManagers;\n if (options.pluginManager) {\n fileManagers = [].concat(fileManagers).concat(options.pluginManager.getFileManagers());\n }\n for (let i = fileManagers.length - 1; i >= 0 ; i--) {\n const fileManager = fileManagers[i];\n if (fileManager[isSync ? 'supportsSync' : 'supports'](filename, currentDirectory, options, environment)) {\n return fileManager;\n }\n }\n return null;\n }\n\n addFileManager(fileManager) {\n this.fileManagers.push(fileManager);\n }\n\n clearFileManagers() {\n this.fileManagers = [];\n }\n}\n\nexport default Environment;\n","export default {\n 'aliceblue':'#f0f8ff',\n 'antiquewhite':'#faebd7',\n 'aqua':'#00ffff',\n 'aquamarine':'#7fffd4',\n 'azure':'#f0ffff',\n 'beige':'#f5f5dc',\n 'bisque':'#ffe4c4',\n 'black':'#000000',\n 'blanchedalmond':'#ffebcd',\n 'blue':'#0000ff',\n 'blueviolet':'#8a2be2',\n 'brown':'#a52a2a',\n 'burlywood':'#deb887',\n 'cadetblue':'#5f9ea0',\n 'chartreuse':'#7fff00',\n 'chocolate':'#d2691e',\n 'coral':'#ff7f50',\n 'cornflowerblue':'#6495ed',\n 'cornsilk':'#fff8dc',\n 'crimson':'#dc143c',\n 'cyan':'#00ffff',\n 'darkblue':'#00008b',\n 'darkcyan':'#008b8b',\n 'darkgoldenrod':'#b8860b',\n 'darkgray':'#a9a9a9',\n 'darkgrey':'#a9a9a9',\n 'darkgreen':'#006400',\n 'darkkhaki':'#bdb76b',\n 'darkmagenta':'#8b008b',\n 'darkolivegreen':'#556b2f',\n 'darkorange':'#ff8c00',\n 'darkorchid':'#9932cc',\n 'darkred':'#8b0000',\n 'darksalmon':'#e9967a',\n 'darkseagreen':'#8fbc8f',\n 'darkslateblue':'#483d8b',\n 'darkslategray':'#2f4f4f',\n 'darkslategrey':'#2f4f4f',\n 'darkturquoise':'#00ced1',\n 'darkviolet':'#9400d3',\n 'deeppink':'#ff1493',\n 'deepskyblue':'#00bfff',\n 'dimgray':'#696969',\n 'dimgrey':'#696969',\n 'dodgerblue':'#1e90ff',\n 'firebrick':'#b22222',\n 'floralwhite':'#fffaf0',\n 'forestgreen':'#228b22',\n 'fuchsia':'#ff00ff',\n 'gainsboro':'#dcdcdc',\n 'ghostwhite':'#f8f8ff',\n 'gold':'#ffd700',\n 'goldenrod':'#daa520',\n 'gray':'#808080',\n 'grey':'#808080',\n 'green':'#008000',\n 'greenyellow':'#adff2f',\n 'honeydew':'#f0fff0',\n 'hotpink':'#ff69b4',\n 'indianred':'#cd5c5c',\n 'indigo':'#4b0082',\n 'ivory':'#fffff0',\n 'khaki':'#f0e68c',\n 'lavender':'#e6e6fa',\n 'lavenderblush':'#fff0f5',\n 'lawngreen':'#7cfc00',\n 'lemonchiffon':'#fffacd',\n 'lightblue':'#add8e6',\n 'lightcoral':'#f08080',\n 'lightcyan':'#e0ffff',\n 'lightgoldenrodyellow':'#fafad2',\n 'lightgray':'#d3d3d3',\n 'lightgrey':'#d3d3d3',\n 'lightgreen':'#90ee90',\n 'lightpink':'#ffb6c1',\n 'lightsalmon':'#ffa07a',\n 'lightseagreen':'#20b2aa',\n 'lightskyblue':'#87cefa',\n 'lightslategray':'#778899',\n 'lightslategrey':'#778899',\n 'lightsteelblue':'#b0c4de',\n 'lightyellow':'#ffffe0',\n 'lime':'#00ff00',\n 'limegreen':'#32cd32',\n 'linen':'#faf0e6',\n 'magenta':'#ff00ff',\n 'maroon':'#800000',\n 'mediumaquamarine':'#66cdaa',\n 'mediumblue':'#0000cd',\n 'mediumorchid':'#ba55d3',\n 'mediumpurple':'#9370d8',\n 'mediumseagreen':'#3cb371',\n 'mediumslateblue':'#7b68ee',\n 'mediumspringgreen':'#00fa9a',\n 'mediumturquoise':'#48d1cc',\n 'mediumvioletred':'#c71585',\n 'midnightblue':'#191970',\n 'mintcream':'#f5fffa',\n 'mistyrose':'#ffe4e1',\n 'moccasin':'#ffe4b5',\n 'navajowhite':'#ffdead',\n 'navy':'#000080',\n 'oldlace':'#fdf5e6',\n 'olive':'#808000',\n 'olivedrab':'#6b8e23',\n 'orange':'#ffa500',\n 'orangered':'#ff4500',\n 'orchid':'#da70d6',\n 'palegoldenrod':'#eee8aa',\n 'palegreen':'#98fb98',\n 'paleturquoise':'#afeeee',\n 'palevioletred':'#d87093',\n 'papayawhip':'#ffefd5',\n 'peachpuff':'#ffdab9',\n 'peru':'#cd853f',\n 'pink':'#ffc0cb',\n 'plum':'#dda0dd',\n 'powderblue':'#b0e0e6',\n 'purple':'#800080',\n 'rebeccapurple':'#663399',\n 'red':'#ff0000',\n 'rosybrown':'#bc8f8f',\n 'royalblue':'#4169e1',\n 'saddlebrown':'#8b4513',\n 'salmon':'#fa8072',\n 'sandybrown':'#f4a460',\n 'seagreen':'#2e8b57',\n 'seashell':'#fff5ee',\n 'sienna':'#a0522d',\n 'silver':'#c0c0c0',\n 'skyblue':'#87ceeb',\n 'slateblue':'#6a5acd',\n 'slategray':'#708090',\n 'slategrey':'#708090',\n 'snow':'#fffafa',\n 'springgreen':'#00ff7f',\n 'steelblue':'#4682b4',\n 'tan':'#d2b48c',\n 'teal':'#008080',\n 'thistle':'#d8bfd8',\n 'tomato':'#ff6347',\n 'turquoise':'#40e0d0',\n 'violet':'#ee82ee',\n 'wheat':'#f5deb3',\n 'white':'#ffffff',\n 'whitesmoke':'#f5f5f5',\n 'yellow':'#ffff00',\n 'yellowgreen':'#9acd32'\n};","export default {\n length: {\n 'm': 1,\n 'cm': 0.01,\n 'mm': 0.001,\n 'in': 0.0254,\n 'px': 0.0254 / 96,\n 'pt': 0.0254 / 72,\n 'pc': 0.0254 / 72 * 12\n },\n duration: {\n 's': 1,\n 'ms': 0.001\n },\n angle: {\n 'rad': 1 / (2 * Math.PI),\n 'deg': 1 / 360,\n 'grad': 1 / 400,\n 'turn': 1\n }\n};","import colors from './colors';\nimport unitConversions from './unit-conversions';\n\nexport default { colors, unitConversions };\n","class Node {\n constructor() {\n this.parent = null;\n this.visibilityBlocks = undefined;\n this.nodeVisible = undefined;\n this.rootNode = null;\n this.parsed = null;\n\n const self = this;\n Object.defineProperty(this, 'currentFileInfo', {\n get: function() { return self.fileInfo(); }\n });\n Object.defineProperty(this, 'index', {\n get: function() { return self.getIndex(); }\n });\n\n }\n\n setParent(nodes, parent) {\n function set(node) {\n if (node && node instanceof Node) {\n node.parent = parent;\n }\n }\n if (Array.isArray(nodes)) {\n nodes.forEach(set);\n }\n else {\n set(nodes);\n }\n }\n\n getIndex() {\n return this._index || (this.parent && this.parent.getIndex()) || 0;\n }\n\n fileInfo() {\n return this._fileInfo || (this.parent && this.parent.fileInfo()) || {};\n }\n\n isRulesetLike() { return false; }\n\n toCSS(context) {\n const strs = [];\n this.genCSS(context, {\n add: function(chunk, fileInfo, index) {\n strs.push(chunk);\n },\n isEmpty: function () {\n return strs.length === 0;\n }\n });\n return strs.join('');\n }\n\n genCSS(context, output) {\n output.add(this.value);\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n eval() { return this; }\n\n _operate(context, op, a, b) {\n switch (op) {\n case '+': return a + b;\n case '-': return a - b;\n case '*': return a * b;\n case '/': return a / b;\n }\n }\n\n fround(context, value) {\n const precision = context && context.numPrecision;\n // add \"epsilon\" to ensure numbers like 1.000000005 (represented as 1.000000004999...) are properly rounded:\n return (precision) ? Number((value + 2e-16).toFixed(precision)) : value;\n }\n\n static compare(a, b) {\n /* returns:\n -1: a < b\n 0: a = b\n 1: a > b\n and *any* other value for a != b (e.g. undefined, NaN, -2 etc.) */\n\n if ((a.compare) &&\n // for \"symmetric results\" force toCSS-based comparison\n // of Quoted or Anonymous if either value is one of those\n !(b.type === 'Quoted' || b.type === 'Anonymous')) {\n return a.compare(b);\n } else if (b.compare) {\n return -b.compare(a);\n } else if (a.type !== b.type) {\n return undefined;\n }\n\n a = a.value;\n b = b.value;\n if (!Array.isArray(a)) {\n return a === b ? 0 : undefined;\n }\n if (a.length !== b.length) {\n return undefined;\n }\n for (let i = 0; i < a.length; i++) {\n if (Node.compare(a[i], b[i]) !== 0) {\n return undefined;\n }\n }\n return 0;\n }\n\n static numericCompare(a, b) {\n return a < b ? -1\n : a === b ? 0\n : a > b ? 1 : undefined;\n }\n\n // Returns true if this node represents root of ast imported by reference\n blocksVisibility() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n return this.visibilityBlocks !== 0;\n }\n\n addVisibilityBlock() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks + 1;\n }\n\n removeVisibilityBlock() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks - 1;\n }\n\n // Turns on node visibility - if called node will be shown in output regardless\n // of whether it comes from import by reference or not\n ensureVisibility() {\n this.nodeVisible = true;\n }\n\n // Turns off node visibility - if called node will NOT be shown in output regardless\n // of whether it comes from import by reference or not\n ensureInvisibility() {\n this.nodeVisible = false;\n }\n\n // return values:\n // false - the node must not be visible\n // true - the node must be visible\n // undefined or null - the node has the same visibility as its parent\n isVisible() {\n return this.nodeVisible;\n }\n\n visibilityInfo() {\n return {\n visibilityBlocks: this.visibilityBlocks,\n nodeVisible: this.nodeVisible\n };\n }\n\n copyVisibilityInfo(info) {\n if (!info) {\n return;\n }\n this.visibilityBlocks = info.visibilityBlocks;\n this.nodeVisible = info.nodeVisible;\n }\n}\n\nexport default Node;\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import Node from './node';\nimport colors from '../data/colors';\n\n//\n// RGB Colors - #ff0014, #eee\n//\nclass Color extends Node {\n constructor(rgb, a, originalForm) {\n super();\n\n const self = this;\n //\n // The end goal here, is to parse the arguments\n // into an integer triplet, such as `128, 255, 0`\n //\n // This facilitates operations and conversions.\n //\n if (Array.isArray(rgb)) {\n this.rgb = rgb;\n } else if (rgb.length >= 6) {\n this.rgb = [];\n rgb.match(/.{2}/g).map(function (c, i) {\n if (i < 3) {\n self.rgb.push(parseInt(c, 16));\n } else {\n self.alpha = (parseInt(c, 16)) / 255;\n }\n });\n } else {\n this.rgb = [];\n rgb.split('').map(function (c, i) {\n if (i < 3) {\n self.rgb.push(parseInt(c + c, 16));\n } else {\n self.alpha = (parseInt(c + c, 16)) / 255;\n }\n });\n }\n this.alpha = this.alpha || (typeof a === 'number' ? a : 1);\n if (typeof originalForm !== 'undefined') {\n this.value = originalForm;\n }\n }\n\n luma() {\n let r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255;\n\n r = (r <= 0.03928) ? r / 12.92 : Math.pow(((r + 0.055) / 1.055), 2.4);\n g = (g <= 0.03928) ? g / 12.92 : Math.pow(((g + 0.055) / 1.055), 2.4);\n b = (b <= 0.03928) ? b / 12.92 : Math.pow(((b + 0.055) / 1.055), 2.4);\n\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n }\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n }\n\n toCSS(context, doNotCompress) {\n const compress = context && context.compress && !doNotCompress;\n let color;\n let alpha;\n let colorFunction;\n let args = [];\n\n // `value` is set if this color was originally\n // converted from a named color string so we need\n // to respect this and try to output named color too.\n alpha = this.fround(context, this.alpha);\n\n if (this.value) {\n if (this.value.indexOf('rgb') === 0) {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n } else if (this.value.indexOf('hsl') === 0) {\n if (alpha < 1) {\n colorFunction = 'hsla';\n } else {\n colorFunction = 'hsl';\n }\n } else {\n return this.value;\n }\n } else {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n }\n\n switch (colorFunction) {\n case 'rgba':\n args = this.rgb.map(function (c) {\n return clamp(Math.round(c), 255);\n }).concat(clamp(alpha, 1));\n break;\n case 'hsla':\n args.push(clamp(alpha, 1));\n case 'hsl':\n color = this.toHSL();\n args = [\n this.fround(context, color.h),\n `${this.fround(context, color.s * 100)}%`,\n `${this.fround(context, color.l * 100)}%`\n ].concat(args);\n }\n\n if (colorFunction) {\n // Values are capped between `0` and `255`, rounded and zero-padded.\n return `${colorFunction}(${args.join(`,${compress ? '' : ' '}`)})`;\n }\n\n color = this.toRGB();\n\n if (compress) {\n const splitcolor = color.split('');\n\n // Convert color to short format\n if (splitcolor[1] === splitcolor[2] && splitcolor[3] === splitcolor[4] && splitcolor[5] === splitcolor[6]) {\n color = `#${splitcolor[1]}${splitcolor[3]}${splitcolor[5]}`;\n }\n }\n\n return color;\n }\n\n //\n // Operations have to be done per-channel, if not,\n // channels will spill onto each other. Once we have\n // our result, in the form of an integer triplet,\n // we create a new Color node to hold the result.\n //\n operate(context, op, other) {\n const rgb = new Array(3);\n const alpha = this.alpha * (1 - other.alpha) + other.alpha;\n for (let c = 0; c < 3; c++) {\n rgb[c] = this._operate(context, op, this.rgb[c], other.rgb[c]);\n }\n return new Color(rgb, alpha);\n }\n\n toRGB() {\n return toHex(this.rgb);\n }\n\n toHSL() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h;\n let s;\n const l = (max + min) / 2;\n const d = max - min;\n\n if (max === min) {\n h = s = 0;\n } else {\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, l, a };\n }\n\n // Adapted from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript\n toHSV() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h;\n let s;\n const v = max;\n\n const d = max - min;\n if (max === 0) {\n s = 0;\n } else {\n s = d / max;\n }\n\n if (max === min) {\n h = 0;\n } else {\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, v, a };\n }\n\n toARGB() {\n return toHex([this.alpha * 255].concat(this.rgb));\n }\n\n compare(x) {\n return (x.rgb &&\n x.rgb[0] === this.rgb[0] &&\n x.rgb[1] === this.rgb[1] &&\n x.rgb[2] === this.rgb[2] &&\n x.alpha === this.alpha) ? 0 : undefined;\n }\n\n static fromKeyword(keyword) {\n let c;\n const key = keyword.toLowerCase();\n if (colors.hasOwnProperty(key)) {\n c = new Color(colors[key].slice(1));\n }\n else if (key === 'transparent') {\n c = new Color([0, 0, 0], 0);\n }\n\n if (c) {\n c.value = keyword;\n return c;\n }\n }\n}\n\nColor.prototype.type = 'Color';\n\nfunction clamp(v, max) {\n return Math.min(Math.max(v, 0), max);\n}\n\nfunction toHex(v) {\n return `#${v.map(function (c) {\n c = clamp(Math.round(c), 255);\n return (c < 16 ? '0' : '') + c.toString(16);\n}).join('')}`;\n}\n\nexport default Color;\n","import Node from './node';\n\nclass Paren extends Node {\n constructor(node) {\n super();\n\n this.value = node;\n }\n\n genCSS(context, output) {\n output.add('(');\n this.value.genCSS(context, output);\n output.add(')');\n }\n\n eval(context) {\n return new Paren(this.value.eval(context));\n }\n}\n\nParen.prototype.type = 'Paren';\nexport default Paren;\n","import Node from './node';\nconst _noSpaceCombinators = {\n '': true,\n ' ': true,\n '|': true\n};\n\nclass Combinator extends Node {\n constructor(value) {\n super();\n\n if (value === ' ') {\n this.value = ' ';\n this.emptyOrWhitespace = true;\n } else {\n this.value = value ? value.trim() : '';\n this.emptyOrWhitespace = this.value === '';\n }\n }\n\n genCSS(context, output) {\n const spaceOrEmpty = (context.compress || _noSpaceCombinators[this.value]) ? '' : ' ';\n output.add(spaceOrEmpty + this.value + spaceOrEmpty);\n }\n}\n\nCombinator.prototype.type = 'Combinator';\n\nexport default Combinator;\n","import Node from './node';\nimport Paren from './paren';\nimport Combinator from './combinator';\n\nclass Element extends Node {\n constructor(combinator, value, isVariable, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.combinator = combinator instanceof Combinator ?\n combinator : new Combinator(combinator);\n\n if (typeof value === 'string') {\n this.value = value.trim();\n } else if (value) {\n this.value = value;\n } else {\n this.value = '';\n }\n this.isVariable = isVariable;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.combinator, this);\n }\n\n accept(visitor) {\n const value = this.value;\n this.combinator = visitor.visit(this.combinator);\n if (typeof value === 'object') {\n this.value = visitor.visit(value);\n }\n }\n\n eval(context) {\n return new Element(this.combinator,\n this.value.eval ? this.value.eval(context) : this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n }\n\n clone() {\n return new Element(this.combinator,\n this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n }\n\n genCSS(context, output) {\n output.add(this.toCSS(context), this.fileInfo(), this.getIndex());\n }\n\n toCSS(context) {\n context = context || {};\n let value = this.value;\n const firstSelector = context.firstSelector;\n if (value instanceof Paren) {\n // selector in parens should not be affected by outer selector\n // flags (breaks only interpolated selectors - see #1973)\n context.firstSelector = true;\n }\n value = value.toCSS ? value.toCSS(context) : value;\n context.firstSelector = firstSelector;\n if (value === '' && this.combinator.value.charAt(0) === '&') {\n return '';\n } else {\n return this.combinator.toCSS(context) + value;\n }\n }\n}\n\nElement.prototype.type = 'Element';\nexport default Element;\n","\nexport const Math = {\n ALWAYS: 0,\n PARENS_DIVISION: 1,\n PARENS: 2,\n // removed - STRICT_LEGACY: 3\n};\n\nexport const RewriteUrls = {\n OFF: 0,\n LOCAL: 1,\n ALL: 2\n};","/* jshint proto: true */\nimport * as Constants from './constants';\n\nexport function getLocation(index, inputStream) {\n let n = index + 1;\n let line = null;\n let column = -1;\n\n while (--n >= 0 && inputStream.charAt(n) !== '\\n') {\n column++;\n }\n\n if (typeof index === 'number') {\n line = (inputStream.slice(0, index).match(/\\n/g) || '').length;\n }\n\n return {\n line,\n column\n };\n}\n\nexport function copyArray(arr) {\n let i;\n const length = arr.length;\n const copy = new Array(length);\n\n for (i = 0; i < length; i++) {\n copy[i] = arr[i];\n }\n return copy;\n}\n\nexport function clone(obj) {\n const cloned = {};\n for (const prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n cloned[prop] = obj[prop];\n }\n }\n return cloned;\n}\n\nexport function defaults(obj1, obj2) {\n let newObj = obj2 || {};\n if (!obj2._defaults) {\n newObj = {};\n const defaults = {...obj1};\n newObj._defaults = defaults;\n const cloned = obj2 ? {...obj2} : {};\n Object.assign(newObj, defaults, cloned);\n }\n return newObj;\n}\n\nexport function copyOptions(obj1, obj2) {\n if (obj2 && obj2._defaults) {\n return obj2;\n }\n const opts = defaults(obj1, obj2);\n if (opts.strictMath) {\n opts.math = Constants.Math.PARENS;\n }\n // Back compat with changed relativeUrls option\n if (opts.relativeUrls) {\n opts.rewriteUrls = Constants.RewriteUrls.ALL;\n }\n if (typeof opts.math === 'string') {\n switch (opts.math.toLowerCase()) {\n case 'always':\n opts.math = Constants.Math.ALWAYS;\n break;\n case 'parens-division':\n opts.math = Constants.Math.PARENS_DIVISION;\n break;\n case 'strict':\n case 'parens':\n opts.math = Constants.Math.PARENS;\n break;\n default:\n opts.math = Constants.Math.PARENS;\n }\n }\n if (typeof opts.rewriteUrls === 'string') {\n switch (opts.rewriteUrls.toLowerCase()) {\n case 'off':\n opts.rewriteUrls = Constants.RewriteUrls.OFF;\n break;\n case 'local':\n opts.rewriteUrls = Constants.RewriteUrls.LOCAL;\n break;\n case 'all':\n opts.rewriteUrls = Constants.RewriteUrls.ALL;\n break;\n }\n }\n return opts;\n}\n\nexport function merge(obj1, obj2) {\n for (const prop in obj2) {\n if (obj2.hasOwnProperty(prop)) {\n obj1[prop] = obj2[prop];\n }\n }\n return obj1;\n}\n\nexport function flattenArray(arr, result = []) {\n for (let i = 0, length = arr.length; i < length; i++) {\n const value = arr[i];\n if (Array.isArray(value)) {\n flattenArray(value, result);\n } else {\n if (value !== undefined) {\n result.push(value);\n }\n }\n }\n return result;\n}","import * as utils from './utils';\n\nconst anonymousFunc = /(|Function):(\\d+):(\\d+)/;\n\n/**\n * This is a centralized class of any error that could be thrown internally (mostly by the parser).\n * Besides standard .message it keeps some additional data like a path to the file where the error\n * occurred along with line and column numbers.\n *\n * @class\n * @extends Error\n * @type {module.LessError}\n *\n * @prop {string} type\n * @prop {string} filename\n * @prop {number} index\n * @prop {number} line\n * @prop {number} column\n * @prop {number} callLine\n * @prop {number} callExtract\n * @prop {string[]} extract\n *\n * @param {Object} e - An error object to wrap around or just a descriptive object\n * @param {Object} fileContentMap - An object with file contents in 'contents' property (like importManager) @todo - move to fileManager?\n * @param {string} [currentFilename]\n */\nconst LessError = function(e, fileContentMap, currentFilename) {\n Error.call(this);\n\n const filename = e.filename || currentFilename;\n\n this.message = e.message;\n this.stack = e.stack;\n\n if (fileContentMap && filename) {\n const input = fileContentMap.contents[filename];\n const loc = utils.getLocation(e.index, input);\n var line = loc.line;\n const col = loc.column;\n const callLine = e.call && utils.getLocation(e.call, input).line;\n const lines = input ? input.split('\\n') : '';\n\n this.type = e.type || 'Syntax';\n this.filename = filename;\n this.index = e.index;\n this.line = typeof line === 'number' ? line + 1 : null;\n this.column = col;\n\n if (!this.line && this.stack) {\n const found = this.stack.match(anonymousFunc);\n\n /**\n * We have to figure out how this environment stringifies anonymous functions\n * so we can correctly map plugin errors.\n * \n * Note, in Node 8, the output of anonymous funcs varied based on parameters\n * being present or not, so we inject dummy params.\n */\n const func = new Function('a', 'throw new Error()');\n let lineAdjust = 0;\n try {\n func();\n } catch (e) {\n const match = e.stack.match(anonymousFunc);\n var line = parseInt(match[2]);\n lineAdjust = 1 - line;\n }\n\n if (found) {\n if (found[2]) {\n this.line = parseInt(found[2]) + lineAdjust;\n }\n if (found[3]) {\n this.column = parseInt(found[3]);\n }\n }\n }\n\n this.callLine = callLine + 1;\n this.callExtract = lines[callLine];\n\n this.extract = [\n lines[this.line - 2],\n lines[this.line - 1],\n lines[this.line]\n ];\n }\n\n};\n\nif (typeof Object.create === 'undefined') {\n const F = function () {};\n F.prototype = Error.prototype;\n LessError.prototype = new F();\n} else {\n LessError.prototype = Object.create(Error.prototype);\n}\n\nLessError.prototype.constructor = LessError;\n\n/**\n * An overridden version of the default Object.prototype.toString\n * which uses additional information to create a helpful message.\n *\n * @param {Object} options\n * @returns {string}\n */\nLessError.prototype.toString = function(options) {\n options = options || {};\n\n let message = '';\n const extract = this.extract || [];\n let error = [];\n let stylize = function (str) { return str; };\n if (options.stylize) {\n const type = typeof options.stylize;\n if (type !== 'function') {\n throw Error(`options.stylize should be a function, got a ${type}!`);\n }\n stylize = options.stylize;\n }\n\n if (this.line !== null) {\n if (typeof extract[0] === 'string') {\n error.push(stylize(`${this.line - 1} ${extract[0]}`, 'grey'));\n }\n\n if (typeof extract[1] === 'string') {\n let errorTxt = `${this.line} `;\n if (extract[1]) {\n errorTxt += extract[1].slice(0, this.column) +\n stylize(stylize(stylize(extract[1].substr(this.column, 1), 'bold') +\n extract[1].slice(this.column + 1), 'red'), 'inverse');\n }\n error.push(errorTxt);\n }\n\n if (typeof extract[2] === 'string') {\n error.push(stylize(`${this.line + 1} ${extract[2]}`, 'grey'));\n }\n error = `${error.join('\\n') + stylize('', 'reset')}\\n`;\n }\n\n message += stylize(`${this.type}Error: ${this.message}`, 'red');\n if (this.filename) {\n message += stylize(' in ', 'red') + this.filename;\n }\n if (this.line) {\n message += stylize(` on line ${this.line}, column ${this.column + 1}:`, 'grey');\n }\n\n message += `\\n${error}`;\n\n if (this.callLine) {\n message += `${stylize('from ', 'red') + (this.filename || '')}/n`;\n message += `${stylize(this.callLine, 'grey')} ${this.callExtract}/n`;\n }\n\n return message;\n};\n\nexport default LessError;","import Node from './node';\nimport Element from './element';\nimport LessError from '../less-error';\n\nclass Selector extends Node {\n constructor(elements, extendList, condition, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.extendList = extendList;\n this.condition = condition;\n this.evaldCondition = !condition;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.elements = this.getElements(elements);\n this.mixinElements_ = undefined;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.elements, this);\n }\n\n accept(visitor) {\n if (this.elements) {\n this.elements = visitor.visitArray(this.elements);\n }\n if (this.extendList) {\n this.extendList = visitor.visitArray(this.extendList);\n }\n if (this.condition) {\n this.condition = visitor.visit(this.condition);\n }\n }\n\n createDerived(elements, extendList, evaldCondition) {\n elements = this.getElements(elements);\n const newSelector = new Selector(elements, extendList || this.extendList,\n null, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n newSelector.evaldCondition = (evaldCondition != null) ? evaldCondition : this.evaldCondition;\n newSelector.mediaEmpty = this.mediaEmpty;\n return newSelector;\n }\n\n getElements(els) {\n if (!els) {\n return [new Element('', '&', false, this._index, this._fileInfo)];\n }\n if (typeof els === 'string') {\n this.parse.parseNode(\n els, \n ['selector'],\n this._index, \n this._fileInfo, \n function(err, result) {\n if (err) {\n throw new LessError({\n index: err.index,\n message: err.message\n }, this.parse.imports, this._fileInfo.filename);\n }\n els = result[0].elements;\n });\n }\n return els;\n }\n\n createEmptySelectors() {\n const el = new Element('', '&', false, this._index, this._fileInfo), sels = [new Selector([el], null, null, this._index, this._fileInfo)];\n sels[0].mediaEmpty = true;\n return sels;\n }\n\n match(other) {\n const elements = this.elements;\n const len = elements.length;\n let olen;\n let i;\n\n other = other.mixinElements();\n olen = other.length;\n if (olen === 0 || len < olen) {\n return 0;\n } else {\n for (i = 0; i < olen; i++) {\n if (elements[i].value !== other[i]) {\n return 0;\n }\n }\n }\n\n return olen; // return number of matched elements\n }\n\n mixinElements() {\n if (this.mixinElements_) {\n return this.mixinElements_;\n }\n\n let elements = this.elements.map( function(v) {\n return v.combinator.value + (v.value.value || v.value);\n }).join('').match(/[,&#\\*\\.\\w-]([\\w-]|(\\\\.))*/g);\n\n if (elements) {\n if (elements[0] === '&') {\n elements.shift();\n }\n } else {\n elements = [];\n }\n\n return (this.mixinElements_ = elements);\n }\n\n isJustParentSelector() {\n return !this.mediaEmpty &&\n this.elements.length === 1 &&\n this.elements[0].value === '&' &&\n (this.elements[0].combinator.value === ' ' || this.elements[0].combinator.value === '');\n }\n\n eval(context) {\n const evaldCondition = this.condition && this.condition.eval(context);\n let elements = this.elements;\n let extendList = this.extendList;\n\n elements = elements && elements.map(function (e) { return e.eval(context); });\n extendList = extendList && extendList.map(function(extend) { return extend.eval(context); });\n\n return this.createDerived(elements, extendList, evaldCondition);\n }\n\n genCSS(context, output) {\n let i, element;\n if ((!context || !context.firstSelector) && this.elements[0].combinator.value === '') {\n output.add(' ', this.fileInfo(), this.getIndex());\n }\n for (i = 0; i < this.elements.length; i++) {\n element = this.elements[i];\n element.genCSS(context, output);\n }\n }\n\n getIsOutput() {\n return this.evaldCondition;\n }\n}\n\nSelector.prototype.type = 'Selector';\nexport default Selector;\n","import Node from './node';\n\nclass Value extends Node {\n constructor(value) {\n super();\n\n if (!value) {\n throw new Error('Value requires an array argument');\n }\n if (!Array.isArray(value)) {\n this.value = [ value ];\n }\n else {\n this.value = value;\n }\n }\n\n accept(visitor) {\n if (this.value) {\n this.value = visitor.visitArray(this.value);\n }\n }\n\n eval(context) {\n if (this.value.length === 1) {\n return this.value[0].eval(context);\n } else {\n return new Value(this.value.map(function (v) {\n return v.eval(context);\n }));\n }\n }\n\n genCSS(context, output) {\n let i;\n for (i = 0; i < this.value.length; i++) {\n this.value[i].genCSS(context, output);\n if (i + 1 < this.value.length) {\n output.add((context && context.compress) ? ',' : ', ');\n }\n }\n }\n}\n\nValue.prototype.type = 'Value';\nexport default Value;\n","import Node from './node';\n\nclass Keyword extends Node {\n constructor(value) {\n super();\n\n this.value = value;\n }\n\n genCSS(context, output) {\n if (this.value === '%') { throw { type: 'Syntax', message: 'Invalid % without number' }; }\n output.add(this.value);\n }\n}\n\nKeyword.prototype.type = 'Keyword';\n\nKeyword.True = new Keyword('true');\nKeyword.False = new Keyword('false');\n\nexport default Keyword;\n","import Node from './node';\n\nclass Anonymous extends Node {\n constructor(value, index, currentFileInfo, mapLines, rulesetLike, visibilityInfo) {\n super();\n\n this.value = value;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.mapLines = mapLines;\n this.rulesetLike = (typeof rulesetLike === 'undefined') ? false : rulesetLike;\n this.allowRoot = true;\n this.copyVisibilityInfo(visibilityInfo);\n }\n\n eval() {\n return new Anonymous(this.value, this._index, this._fileInfo, this.mapLines, this.rulesetLike, this.visibilityInfo());\n }\n\n compare(other) {\n return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n }\n\n isRulesetLike() {\n return this.rulesetLike;\n }\n\n genCSS(context, output) {\n this.nodeVisible = Boolean(this.value);\n if (this.nodeVisible) {\n output.add(this.value, this._fileInfo, this._index, this.mapLines);\n }\n }\n}\n\nAnonymous.prototype.type = 'Anonymous';\nexport default Anonymous;\n","import Node from './node';\nimport Value from './value';\nimport Keyword from './keyword';\nimport Anonymous from './anonymous';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\nclass Declaration extends Node {\n constructor(name, value, important, merge, index, currentFileInfo, inline, variable) {\n super();\n\n this.name = name;\n this.value = (value instanceof Node) ? value : new Value([value ? new Anonymous(value) : null]);\n this.important = important ? ` ${important.trim()}` : '';\n this.merge = merge;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.inline = inline || false;\n this.variable = (variable !== undefined) ? variable\n : (name.charAt && (name.charAt(0) === '@'));\n this.allowRoot = true;\n this.setParent(this.value, this);\n }\n\n genCSS(context, output) {\n output.add(this.name + (context.compress ? ':' : ': '), this.fileInfo(), this.getIndex());\n try {\n this.value.genCSS(context, output);\n }\n catch (e) {\n e.index = this._index;\n e.filename = this._fileInfo.filename;\n throw e;\n }\n output.add(this.important + ((this.inline || (context.lastRule && context.compress)) ? '' : ';'), this._fileInfo, this._index);\n }\n\n eval(context) {\n let mathBypass = false, prevMath, name = this.name, evaldValue, variable = this.variable;\n if (typeof name !== 'string') {\n // expand 'primitive' name directly to get\n // things faster (~10% for benchmark.less):\n name = (name.length === 1) && (name[0] instanceof Keyword) ?\n name[0].value : evalName(context, name);\n variable = false; // never treat expanded interpolation as new variable name\n }\n\n // @todo remove when parens-division is default\n if (name === 'font' && context.math === MATH.ALWAYS) {\n mathBypass = true;\n prevMath = context.math;\n context.math = MATH.PARENS_DIVISION;\n }\n try {\n context.importantScope.push({});\n evaldValue = this.value.eval(context);\n\n if (!this.variable && evaldValue.type === 'DetachedRuleset') {\n throw { message: 'Rulesets cannot be evaluated on a property.',\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n let important = this.important;\n const importantResult = context.importantScope.pop();\n if (!important && importantResult.important) {\n important = importantResult.important;\n }\n\n return new Declaration(name,\n evaldValue,\n important,\n this.merge,\n this.getIndex(), this.fileInfo(), this.inline,\n variable);\n }\n catch (e) {\n if (typeof e.index !== 'number') {\n e.index = this.getIndex();\n e.filename = this.fileInfo().filename;\n }\n throw e;\n }\n finally {\n if (mathBypass) {\n context.math = prevMath;\n }\n }\n }\n\n makeImportant() {\n return new Declaration(this.name,\n this.value,\n '!important',\n this.merge,\n this.getIndex(), this.fileInfo(), this.inline);\n }\n}\n\nfunction evalName(context, name) {\n let value = '';\n let i;\n const n = name.length;\n const output = {add: function (s) {value += s;}};\n for (i = 0; i < n; i++) {\n name[i].eval(context).genCSS(context, output);\n }\n return value;\n}\n\nDeclaration.prototype.type = 'Declaration';\nexport default Declaration;","class debugInfo {\n constructor(context, ctx, lineSeparator) {\n let result = '';\n if (context.dumpLineNumbers && !context.compress) {\n switch (context.dumpLineNumbers) {\n case 'comments':\n result = debugInfo.asComment(ctx);\n break;\n case 'mediaquery':\n result = debugInfo.asMediaQuery(ctx);\n break;\n case 'all':\n result = debugInfo.asComment(ctx) + (lineSeparator || '') + debugInfo.asMediaQuery(ctx);\n break;\n }\n }\n return result;\n }\n\n static asComment(ctx) {\n return `/* line ${ctx.debugInfo.lineNumber}, ${ctx.debugInfo.fileName} */\\n`;\n }\n\n static asMediaQuery(ctx) {\n let filenameWithProtocol = ctx.debugInfo.fileName;\n if (!/^[a-z]+:\\/\\//i.test(filenameWithProtocol)) {\n filenameWithProtocol = `file://${filenameWithProtocol}`;\n }\n return `@media -sass-debug-info{filename{font-family:${filenameWithProtocol.replace(/([.:\\/\\\\])/g, function (a) {\n if (a == '\\\\') {\n a = '\\/';\n }\n return `\\\\${a}`;\n})}}line{font-family:\\\\00003${ctx.debugInfo.lineNumber}}}\\n`;\n }\n}\n\nexport default debugInfo;\n","import Node from './node';\nimport getDebugInfo from './debug-info';\n\nclass Comment extends Node {\n constructor(value, isLineComment, index, currentFileInfo) {\n super();\n\n this.value = value;\n this.isLineComment = isLineComment;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.allowRoot = true;\n }\n\n genCSS(context, output) {\n if (this.debugInfo) {\n output.add(getDebugInfo(context, this), this.fileInfo(), this.getIndex());\n }\n output.add(this.value);\n }\n\n isSilent(context) {\n const isCompressed = context.compress && this.value[2] !== '!';\n return this.isLineComment || isCompressed;\n }\n}\n\nComment.prototype.type = 'Comment';\nexport default Comment;\n","const contexts = {};\nexport default contexts;\nimport * as Constants from './constants';\n\nconst copyFromOriginal = function copyFromOriginal(original, destination, propertiesToCopy) {\n if (!original) { return; }\n\n for (let i = 0; i < propertiesToCopy.length; i++) {\n if (original.hasOwnProperty(propertiesToCopy[i])) {\n destination[propertiesToCopy[i]] = original[propertiesToCopy[i]];\n }\n }\n};\n\n/*\n parse is used whilst parsing\n */\nconst parseCopyProperties = [\n // options\n 'paths', // option - unmodified - paths to search for imports on\n 'rewriteUrls', // option - whether to adjust URL's to be relative\n 'rootpath', // option - rootpath to append to URL's\n 'strictImports', // option -\n 'insecure', // option - whether to allow imports from insecure ssl hosts\n 'dumpLineNumbers', // option - whether to dump line numbers\n 'compress', // option - whether to compress\n 'syncImport', // option - whether to import synchronously\n 'chunkInput', // option - whether to chunk input. more performant but causes parse issues.\n 'mime', // browser only - mime type for sheet import\n 'useFileCache', // browser only - whether to use the per file session cache\n // context\n 'processImports', // option & context - whether to process imports. if false then imports will not be imported.\n // Used by the import manager to stop multiple import visitors being created.\n 'pluginManager' // Used as the plugin manager for the session\n];\n\ncontexts.Parse = function(options) {\n copyFromOriginal(options, this, parseCopyProperties);\n\n if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n};\n\nconst evalCopyProperties = [\n 'paths', // additional include paths\n 'compress', // whether to compress\n 'ieCompat', // whether to enforce IE compatibility (IE8 data-uri)\n 'math', // whether math has to be within parenthesis\n 'strictUnits', // whether units need to evaluate correctly\n 'sourceMap', // whether to output a source map\n 'importMultiple', // whether we are currently importing multiple copies\n 'urlArgs', // whether to add args into url tokens\n 'javascriptEnabled', // option - whether Inline JavaScript is enabled. if undefined, defaults to false\n 'pluginManager', // Used as the plugin manager for the session\n 'importantScope', // used to bubble up !important statements\n 'rewriteUrls' // option - whether to adjust URL's to be relative\n];\n\ncontexts.Eval = function(options, frames) {\n copyFromOriginal(options, this, evalCopyProperties);\n\n if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n\n this.frames = frames || [];\n this.importantScope = this.importantScope || [];\n};\n\ncontexts.Eval.prototype.enterCalc = function () {\n if (!this.calcStack) {\n this.calcStack = [];\n }\n this.calcStack.push(true);\n this.inCalc = true;\n};\n\ncontexts.Eval.prototype.exitCalc = function () {\n this.calcStack.pop();\n if (!this.calcStack.length) {\n this.inCalc = false;\n }\n};\n\ncontexts.Eval.prototype.inParenthesis = function () {\n if (!this.parensStack) {\n this.parensStack = [];\n }\n this.parensStack.push(true);\n};\n\ncontexts.Eval.prototype.outOfParenthesis = function () {\n this.parensStack.pop();\n};\n\ncontexts.Eval.prototype.inCalc = false;\ncontexts.Eval.prototype.mathOn = true;\ncontexts.Eval.prototype.isMathOn = function (op) {\n if (!this.mathOn) {\n return false;\n }\n if (op === '/' && this.math !== Constants.Math.ALWAYS && (!this.parensStack || !this.parensStack.length)) {\n return false;\n }\n if (this.math > Constants.Math.PARENS_DIVISION) {\n return this.parensStack && this.parensStack.length;\n }\n return true;\n};\n\ncontexts.Eval.prototype.pathRequiresRewrite = function (path) {\n const isRelative = this.rewriteUrls === Constants.RewriteUrls.LOCAL ? isPathLocalRelative : isPathRelative;\n\n return isRelative(path);\n};\n\ncontexts.Eval.prototype.rewritePath = function (path, rootpath) {\n let newPath;\n\n rootpath = rootpath || '';\n newPath = this.normalizePath(rootpath + path);\n\n // If a path was explicit relative and the rootpath was not an absolute path\n // we must ensure that the new path is also explicit relative.\n if (isPathLocalRelative(path) &&\n isPathRelative(rootpath) &&\n isPathLocalRelative(newPath) === false) {\n newPath = `./${newPath}`;\n }\n\n return newPath;\n};\n\ncontexts.Eval.prototype.normalizePath = function (path) {\n const segments = path.split('/').reverse();\n let segment;\n\n path = [];\n while (segments.length !== 0) {\n segment = segments.pop();\n switch ( segment ) {\n case '.':\n break;\n case '..':\n if ((path.length === 0) || (path[path.length - 1] === '..')) {\n path.push( segment );\n } else {\n path.pop();\n }\n break;\n default:\n path.push(segment);\n break;\n }\n }\n\n return path.join('/');\n};\n\nfunction isPathRelative(path) {\n return !/^(?:[a-z-]+:|\\/|#)/i.test(path);\n}\n\nfunction isPathLocalRelative(path) {\n return path.charAt(0) === '.';\n}\n\n// todo - do the same for the toCSS ?\n","function makeRegistry( base ) {\n return {\n _data: {},\n add: function(name, func) {\n // precautionary case conversion, as later querying of\n // the registry by function-caller uses lower case as well.\n name = name.toLowerCase();\n\n if (this._data.hasOwnProperty(name)) {\n // TODO warn\n }\n this._data[name] = func;\n },\n addMultiple: function(functions) {\n Object.keys(functions).forEach(\n name => {\n this.add(name, functions[name]);\n });\n },\n get: function(name) {\n return this._data[name] || ( base && base.get( name ));\n },\n getLocalFunctions: function() {\n return this._data;\n },\n inherit: function() {\n return makeRegistry( this );\n },\n create: function(base) {\n return makeRegistry(base);\n }\n };\n}\n\nexport default makeRegistry( null );","import Keyword from '../tree/keyword';\n\nconst defaultFunc = {\n eval: function () {\n const v = this.value_;\n const e = this.error_;\n if (e) {\n throw e;\n }\n if (v != null) {\n return v ? Keyword.True : Keyword.False;\n }\n },\n value: function (v) {\n this.value_ = v;\n },\n error: function (e) {\n this.error_ = e;\n },\n reset: function () {\n this.value_ = this.error_ = null;\n }\n};\n\nexport default defaultFunc;\n","import Node from './node';\nimport Declaration from './declaration';\nimport Keyword from './keyword';\nimport Comment from './comment';\nimport Paren from './paren';\nimport Selector from './selector';\nimport Element from './element';\nimport Anonymous from './anonymous';\nimport contexts from '../contexts';\nimport globalFunctionRegistry from '../functions/function-registry';\nimport defaultFunc from '../functions/default';\nimport getDebugInfo from './debug-info';\nimport * as utils from '../utils';\n\nclass Ruleset extends Node {\n constructor(selectors, rules, strictImports, visibilityInfo) {\n super();\n\n this.selectors = selectors;\n this.rules = rules;\n this._lookups = {};\n this._variables = null;\n this._properties = null;\n this.strictImports = strictImports;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n\n this.setParent(this.selectors, this);\n this.setParent(this.rules, this);\n\n }\n\n isRulesetLike() { return true; }\n\n accept(visitor) {\n if (this.paths) {\n this.paths = visitor.visitArray(this.paths, true);\n } else if (this.selectors) {\n this.selectors = visitor.visitArray(this.selectors);\n }\n if (this.rules && this.rules.length) {\n this.rules = visitor.visitArray(this.rules);\n }\n }\n\n eval(context) {\n const that = this;\n let selectors;\n let selCnt;\n let selector;\n let i;\n let hasVariable;\n let hasOnePassingSelector = false;\n\n if (this.selectors && (selCnt = this.selectors.length)) {\n selectors = new Array(selCnt);\n defaultFunc.error({\n type: 'Syntax',\n message: 'it is currently only allowed in parametric mixin guards,'\n });\n\n for (i = 0; i < selCnt; i++) {\n selector = this.selectors[i].eval(context);\n for (var j = 0; j < selector.elements.length; j++) {\n if (selector.elements[j].isVariable) {\n hasVariable = true;\n break;\n }\n }\n selectors[i] = selector;\n if (selector.evaldCondition) {\n hasOnePassingSelector = true;\n }\n }\n\n if (hasVariable) {\n const toParseSelectors = new Array(selCnt);\n for (i = 0; i < selCnt; i++) {\n selector = selectors[i];\n toParseSelectors[i] = selector.toCSS(context);\n }\n this.parse.parseNode(\n toParseSelectors.join(','),\n [\"selectors\"], \n selectors[0].getIndex(), \n selectors[0].fileInfo(), \n function(err, result) {\n if (result) {\n selectors = utils.flattenArray(result);\n }\n });\n }\n\n defaultFunc.reset();\n } else {\n hasOnePassingSelector = true;\n }\n\n let rules = this.rules ? utils.copyArray(this.rules) : null;\n const ruleset = new Ruleset(selectors, rules, this.strictImports, this.visibilityInfo());\n let rule;\n let subRule;\n\n ruleset.originalRuleset = this;\n ruleset.root = this.root;\n ruleset.firstRoot = this.firstRoot;\n ruleset.allowImports = this.allowImports;\n\n if (this.debugInfo) {\n ruleset.debugInfo = this.debugInfo;\n }\n\n if (!hasOnePassingSelector) {\n rules.length = 0;\n }\n\n // inherit a function registry from the frames stack when possible;\n // otherwise from the global registry\n ruleset.functionRegistry = (function (frames) {\n let i = 0;\n const n = frames.length;\n let found;\n for ( ; i !== n ; ++i ) {\n found = frames[ i ].functionRegistry;\n if ( found ) { return found; }\n }\n return globalFunctionRegistry;\n }(context.frames)).inherit();\n\n // push the current ruleset to the frames stack\n const ctxFrames = context.frames;\n ctxFrames.unshift(ruleset);\n\n // currrent selectors\n let ctxSelectors = context.selectors;\n if (!ctxSelectors) {\n context.selectors = ctxSelectors = [];\n }\n ctxSelectors.unshift(this.selectors);\n\n // Evaluate imports\n if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) {\n ruleset.evalImports(context);\n }\n\n // Store the frames around mixin definitions,\n // so they can be evaluated like closures when the time comes.\n const rsRules = ruleset.rules;\n for (i = 0; (rule = rsRules[i]); i++) {\n if (rule.evalFirst) {\n rsRules[i] = rule.eval(context);\n }\n }\n\n const mediaBlockCount = (context.mediaBlocks && context.mediaBlocks.length) || 0;\n\n // Evaluate mixin calls.\n for (i = 0; (rule = rsRules[i]); i++) {\n if (rule.type === 'MixinCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).filter(function(r) {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope if the variable is\n // already there. consider returning false here\n // but we need a way to \"return\" variable from mixins\n return !(ruleset.variable(r.name));\n }\n return true;\n });\n rsRules.splice.apply(rsRules, [i, 1].concat(rules));\n i += rules.length - 1;\n ruleset.resetCache();\n } else if (rule.type === 'VariableCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).rules.filter(function(r) {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope at all\n return false;\n }\n return true;\n });\n rsRules.splice.apply(rsRules, [i, 1].concat(rules));\n i += rules.length - 1;\n ruleset.resetCache();\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n if (!rule.evalFirst) {\n rsRules[i] = rule = rule.eval ? rule.eval(context) : rule;\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n // for rulesets, check if it is a css guard and can be removed\n if (rule instanceof Ruleset && rule.selectors && rule.selectors.length === 1) {\n // check if it can be folded in (e.g. & where)\n if (rule.selectors[0] && rule.selectors[0].isJustParentSelector()) {\n rsRules.splice(i--, 1);\n\n for (var j = 0; (subRule = rule.rules[j]); j++) {\n if (subRule instanceof Node) {\n subRule.copyVisibilityInfo(rule.visibilityInfo());\n if (!(subRule instanceof Declaration) || !subRule.variable) {\n rsRules.splice(++i, 0, subRule);\n }\n }\n }\n }\n }\n }\n\n // Pop the stack\n ctxFrames.shift();\n ctxSelectors.shift();\n\n if (context.mediaBlocks) {\n for (i = mediaBlockCount; i < context.mediaBlocks.length; i++) {\n context.mediaBlocks[i].bubbleSelectors(selectors);\n }\n }\n\n return ruleset;\n }\n\n evalImports(context) {\n const rules = this.rules;\n let i;\n let importRules;\n if (!rules) { return; }\n\n for (i = 0; i < rules.length; i++) {\n if (rules[i].type === 'Import') {\n importRules = rules[i].eval(context);\n if (importRules && (importRules.length || importRules.length === 0)) {\n rules.splice.apply(rules, [i, 1].concat(importRules));\n i += importRules.length - 1;\n } else {\n rules.splice(i, 1, importRules);\n }\n this.resetCache();\n }\n }\n }\n\n makeImportant() {\n const result = new Ruleset(this.selectors, this.rules.map(function (r) {\n if (r.makeImportant) {\n return r.makeImportant();\n } else {\n return r;\n }\n }), this.strictImports, this.visibilityInfo());\n\n return result;\n }\n\n matchArgs(args) {\n return !args || args.length === 0;\n }\n\n // lets you call a css selector with a guard\n matchCondition(args, context) {\n const lastSelector = this.selectors[this.selectors.length - 1];\n if (!lastSelector.evaldCondition) {\n return false;\n }\n if (lastSelector.condition &&\n !lastSelector.condition.eval(\n new contexts.Eval(context,\n context.frames))) {\n return false;\n }\n return true;\n }\n\n resetCache() {\n this._rulesets = null;\n this._variables = null;\n this._properties = null;\n this._lookups = {};\n }\n\n variables() {\n if (!this._variables) {\n this._variables = !this.rules ? {} : this.rules.reduce(function (hash, r) {\n if (r instanceof Declaration && r.variable === true) {\n hash[r.name] = r;\n }\n // when evaluating variables in an import statement, imports have not been eval'd\n // so we need to go inside import statements.\n // guard against root being a string (in the case of inlined less)\n if (r.type === 'Import' && r.root && r.root.variables) {\n const vars = r.root.variables();\n for (const name in vars) {\n if (vars.hasOwnProperty(name)) {\n hash[name] = r.root.variable(name);\n }\n }\n }\n return hash;\n }, {});\n }\n return this._variables;\n }\n\n properties() {\n if (!this._properties) {\n this._properties = !this.rules ? {} : this.rules.reduce(function (hash, r) {\n if (r instanceof Declaration && r.variable !== true) {\n const name = (r.name.length === 1) && (r.name[0] instanceof Keyword) ?\n r.name[0].value : r.name;\n // Properties don't overwrite as they can merge\n if (!hash[`$${name}`]) {\n hash[`$${name}`] = [ r ];\n }\n else {\n hash[`$${name}`].push(r);\n }\n }\n return hash;\n }, {});\n }\n return this._properties;\n }\n\n variable(name) {\n const decl = this.variables()[name];\n if (decl) {\n return this.parseValue(decl);\n }\n }\n\n property(name) {\n const decl = this.properties()[name];\n if (decl) {\n return this.parseValue(decl);\n }\n }\n\n lastDeclaration() {\n for (let i = this.rules.length; i > 0; i--) {\n const decl = this.rules[i - 1];\n if (decl instanceof Declaration) {\n return this.parseValue(decl);\n }\n }\n }\n\n parseValue(toParse) {\n const self = this;\n function transformDeclaration(decl) {\n if (decl.value instanceof Anonymous && !decl.parsed) {\n if (typeof decl.value.value === 'string') {\n this.parse.parseNode(\n decl.value.value,\n ['value', 'important'], \n decl.value.getIndex(), \n decl.fileInfo(), \n function(err, result) {\n if (err) {\n decl.parsed = true;\n }\n if (result) {\n decl.value = result[0];\n decl.important = result[1] || '';\n decl.parsed = true;\n }\n });\n } else {\n decl.parsed = true;\n }\n\n return decl;\n }\n else {\n return decl;\n }\n }\n if (!Array.isArray(toParse)) {\n return transformDeclaration.call(self, toParse);\n }\n else {\n const nodes = [];\n toParse.forEach(function(n) {\n nodes.push(transformDeclaration.call(self, n));\n });\n return nodes;\n }\n }\n\n rulesets() {\n if (!this.rules) { return []; }\n\n const filtRules = [];\n const rules = this.rules;\n let i;\n let rule;\n\n for (i = 0; (rule = rules[i]); i++) {\n if (rule.isRuleset) {\n filtRules.push(rule);\n }\n }\n\n return filtRules;\n }\n\n prependRule(rule) {\n const rules = this.rules;\n if (rules) {\n rules.unshift(rule);\n } else {\n this.rules = [ rule ];\n }\n this.setParent(rule, this);\n }\n\n find(selector, self, filter) {\n self = self || this;\n const rules = [];\n let match;\n let foundMixins;\n const key = selector.toCSS();\n\n if (key in this._lookups) { return this._lookups[key]; }\n\n this.rulesets().forEach(function (rule) {\n if (rule !== self) {\n for (let j = 0; j < rule.selectors.length; j++) {\n match = selector.match(rule.selectors[j]);\n if (match) {\n if (selector.elements.length > match) {\n if (!filter || filter(rule)) {\n foundMixins = rule.find(new Selector(selector.elements.slice(match)), self, filter);\n for (let i = 0; i < foundMixins.length; ++i) {\n foundMixins[i].path.push(rule);\n }\n Array.prototype.push.apply(rules, foundMixins);\n }\n } else {\n rules.push({ rule, path: []});\n }\n break;\n }\n }\n }\n });\n this._lookups[key] = rules;\n return rules;\n }\n\n genCSS(context, output) {\n let i;\n let j;\n const charsetRuleNodes = [];\n let ruleNodes = [];\n\n let // Line number debugging\n debugInfo;\n\n let rule;\n let path;\n\n context.tabLevel = (context.tabLevel || 0);\n\n if (!this.root) {\n context.tabLevel++;\n }\n\n const tabRuleStr = context.compress ? '' : Array(context.tabLevel + 1).join(' ');\n const tabSetStr = context.compress ? '' : Array(context.tabLevel).join(' ');\n let sep;\n\n let charsetNodeIndex = 0;\n let importNodeIndex = 0;\n for (i = 0; (rule = this.rules[i]); i++) {\n if (rule instanceof Comment) {\n if (importNodeIndex === i) {\n importNodeIndex++;\n }\n ruleNodes.push(rule);\n } else if (rule.isCharset && rule.isCharset()) {\n ruleNodes.splice(charsetNodeIndex, 0, rule);\n charsetNodeIndex++;\n importNodeIndex++;\n } else if (rule.type === 'Import') {\n ruleNodes.splice(importNodeIndex, 0, rule);\n importNodeIndex++;\n } else {\n ruleNodes.push(rule);\n }\n }\n ruleNodes = charsetRuleNodes.concat(ruleNodes);\n\n // If this is the root node, we don't render\n // a selector, or {}.\n if (!this.root) {\n debugInfo = getDebugInfo(context, this, tabSetStr);\n\n if (debugInfo) {\n output.add(debugInfo);\n output.add(tabSetStr);\n }\n\n const paths = this.paths;\n const pathCnt = paths.length;\n let pathSubCnt;\n\n sep = context.compress ? ',' : (`,\\n${tabSetStr}`);\n\n for (i = 0; i < pathCnt; i++) {\n path = paths[i];\n if (!(pathSubCnt = path.length)) { continue; }\n if (i > 0) { output.add(sep); }\n\n context.firstSelector = true;\n path[0].genCSS(context, output);\n\n context.firstSelector = false;\n for (j = 1; j < pathSubCnt; j++) {\n path[j].genCSS(context, output);\n }\n }\n\n output.add((context.compress ? '{' : ' {\\n') + tabRuleStr);\n }\n\n // Compile rules and rulesets\n for (i = 0; (rule = ruleNodes[i]); i++) {\n\n if (i + 1 === ruleNodes.length) {\n context.lastRule = true;\n }\n\n const currentLastRule = context.lastRule;\n if (rule.isRulesetLike(rule)) {\n context.lastRule = false;\n }\n\n if (rule.genCSS) {\n rule.genCSS(context, output);\n } else if (rule.value) {\n output.add(rule.value.toString());\n }\n\n context.lastRule = currentLastRule;\n\n if (!context.lastRule && rule.isVisible()) {\n output.add(context.compress ? '' : (`\\n${tabRuleStr}`));\n } else {\n context.lastRule = false;\n }\n }\n\n if (!this.root) {\n output.add((context.compress ? '}' : `\\n${tabSetStr}}`));\n context.tabLevel--;\n }\n\n if (!output.isEmpty() && !context.compress && this.firstRoot) {\n output.add('\\n');\n }\n }\n\n joinSelectors(paths, context, selectors) {\n for (let s = 0; s < selectors.length; s++) {\n this.joinSelector(paths, context, selectors[s]);\n }\n }\n\n joinSelector(paths, context, selector) {\n\n function createParenthesis(elementsToPak, originalElement) {\n let replacementParen, j;\n if (elementsToPak.length === 0) {\n replacementParen = new Paren(elementsToPak[0]);\n } else {\n const insideParent = new Array(elementsToPak.length);\n for (j = 0; j < elementsToPak.length; j++) {\n insideParent[j] = new Element(\n null,\n elementsToPak[j],\n originalElement.isVariable,\n originalElement._index,\n originalElement._fileInfo\n );\n }\n replacementParen = new Paren(new Selector(insideParent));\n }\n return replacementParen;\n }\n\n function createSelector(containedElement, originalElement) {\n let element, selector;\n element = new Element(null, containedElement, originalElement.isVariable, originalElement._index, originalElement._fileInfo);\n selector = new Selector([element]);\n return selector;\n }\n\n // joins selector path from `beginningPath` with selector path in `addPath`\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns concatenated path\n function addReplacementIntoPath(beginningPath, addPath, replacedElement, originalSelector) {\n let newSelectorPath, lastSelector, newJoinedSelector;\n // our new selector path\n newSelectorPath = [];\n\n // construct the joined selector - if & is the first thing this will be empty,\n // if not newJoinedSelector will be the last set of elements in the selector\n if (beginningPath.length > 0) {\n newSelectorPath = utils.copyArray(beginningPath);\n lastSelector = newSelectorPath.pop();\n newJoinedSelector = originalSelector.createDerived(utils.copyArray(lastSelector.elements));\n }\n else {\n newJoinedSelector = originalSelector.createDerived([]);\n }\n\n if (addPath.length > 0) {\n // /deep/ is a CSS4 selector - (removed, so should deprecate)\n // that is valid without anything in front of it\n // so if the & does not have a combinator that is \"\" or \" \" then\n // and there is a combinator on the parent, then grab that.\n // this also allows + a { & .b { .a & { ... though not sure why you would want to do that\n let combinator = replacedElement.combinator;\n\n const parentEl = addPath[0].elements[0];\n if (combinator.emptyOrWhitespace && !parentEl.combinator.emptyOrWhitespace) {\n combinator = parentEl.combinator;\n }\n // join the elements so far with the first part of the parent\n newJoinedSelector.elements.push(new Element(\n combinator,\n parentEl.value,\n replacedElement.isVariable,\n replacedElement._index,\n replacedElement._fileInfo\n ));\n newJoinedSelector.elements = newJoinedSelector.elements.concat(addPath[0].elements.slice(1));\n }\n\n // now add the joined selector - but only if it is not empty\n if (newJoinedSelector.elements.length !== 0) {\n newSelectorPath.push(newJoinedSelector);\n }\n\n // put together the parent selectors after the join (e.g. the rest of the parent)\n if (addPath.length > 1) {\n let restOfPath = addPath.slice(1);\n restOfPath = restOfPath.map(function (selector) {\n return selector.createDerived(selector.elements, []);\n });\n newSelectorPath = newSelectorPath.concat(restOfPath);\n }\n return newSelectorPath;\n }\n\n // joins selector path from `beginningPath` with every selector path in `addPaths` array\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns array with all concatenated paths\n function addAllReplacementsIntoPath( beginningPath, addPaths, replacedElement, originalSelector, result) {\n let j;\n for (j = 0; j < beginningPath.length; j++) {\n const newSelectorPath = addReplacementIntoPath(beginningPath[j], addPaths, replacedElement, originalSelector);\n result.push(newSelectorPath);\n }\n return result;\n }\n\n function mergeElementsOnToSelectors(elements, selectors) {\n let i, sel;\n\n if (elements.length === 0) {\n return ;\n }\n if (selectors.length === 0) {\n selectors.push([ new Selector(elements) ]);\n return;\n }\n\n for (i = 0; (sel = selectors[i]); i++) {\n // if the previous thing in sel is a parent this needs to join on to it\n if (sel.length > 0) {\n sel[sel.length - 1] = sel[sel.length - 1].createDerived(sel[sel.length - 1].elements.concat(elements));\n }\n else {\n sel.push(new Selector(elements));\n }\n }\n }\n\n // replace all parent selectors inside `inSelector` by content of `context` array\n // resulting selectors are returned inside `paths` array\n // returns true if `inSelector` contained at least one parent selector\n function replaceParentSelector(paths, context, inSelector) {\n // The paths are [[Selector]]\n // The first list is a list of comma separated selectors\n // The inner list is a list of inheritance separated selectors\n // e.g.\n // .a, .b {\n // .c {\n // }\n // }\n // == [[.a] [.c]] [[.b] [.c]]\n //\n let i, j, k, currentElements, newSelectors, selectorsMultiplied, sel, el, hadParentSelector = false, length, lastSelector;\n function findNestedSelector(element) {\n let maybeSelector;\n if (!(element.value instanceof Paren)) {\n return null;\n }\n\n maybeSelector = element.value.value;\n if (!(maybeSelector instanceof Selector)) {\n return null;\n }\n\n return maybeSelector;\n }\n\n // the elements from the current selector so far\n currentElements = [];\n // the current list of new selectors to add to the path.\n // We will build it up. We initiate it with one empty selector as we \"multiply\" the new selectors\n // by the parents\n newSelectors = [\n []\n ];\n\n for (i = 0; (el = inSelector.elements[i]); i++) {\n // non parent reference elements just get added\n if (el.value !== '&') {\n const nestedSelector = findNestedSelector(el);\n if (nestedSelector != null) {\n // merge the current list of non parent selector elements\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n const nestedPaths = [];\n let replaced;\n const replacedNewSelectors = [];\n replaced = replaceParentSelector(nestedPaths, context, nestedSelector);\n hadParentSelector = hadParentSelector || replaced;\n // the nestedPaths array should have only one member - replaceParentSelector does not multiply selectors\n for (k = 0; k < nestedPaths.length; k++) {\n const replacementSelector = createSelector(createParenthesis(nestedPaths[k], el), el);\n addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors);\n }\n newSelectors = replacedNewSelectors;\n currentElements = [];\n } else {\n currentElements.push(el);\n }\n\n } else {\n hadParentSelector = true;\n // the new list of selectors to add\n selectorsMultiplied = [];\n\n // merge the current list of non parent selector elements\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n // loop through our current selectors\n for (j = 0; j < newSelectors.length; j++) {\n sel = newSelectors[j];\n // if we don't have any parent paths, the & might be in a mixin so that it can be used\n // whether there are parents or not\n if (context.length === 0) {\n // the combinator used on el should now be applied to the next element instead so that\n // it is not lost\n if (sel.length > 0) {\n sel[0].elements.push(new Element(el.combinator, '', el.isVariable, el._index, el._fileInfo));\n }\n selectorsMultiplied.push(sel);\n }\n else {\n // and the parent selectors\n for (k = 0; k < context.length; k++) {\n // We need to put the current selectors\n // then join the last selector's elements on to the parents selectors\n const newSelectorPath = addReplacementIntoPath(sel, context[k], el, inSelector);\n // add that to our new set of selectors\n selectorsMultiplied.push(newSelectorPath);\n }\n }\n }\n\n // our new selectors has been multiplied, so reset the state\n newSelectors = selectorsMultiplied;\n currentElements = [];\n }\n }\n\n // if we have any elements left over (e.g. .a& .b == .b)\n // add them on to all the current selectors\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n for (i = 0; i < newSelectors.length; i++) {\n length = newSelectors[i].length;\n if (length > 0) {\n paths.push(newSelectors[i]);\n lastSelector = newSelectors[i][length - 1];\n newSelectors[i][length - 1] = lastSelector.createDerived(lastSelector.elements, inSelector.extendList);\n }\n }\n\n return hadParentSelector;\n }\n\n function deriveSelector(visibilityInfo, deriveFrom) {\n const newSelector = deriveFrom.createDerived(deriveFrom.elements, deriveFrom.extendList, deriveFrom.evaldCondition);\n newSelector.copyVisibilityInfo(visibilityInfo);\n return newSelector;\n }\n\n // joinSelector code follows\n let i, newPaths, hadParentSelector;\n\n newPaths = [];\n hadParentSelector = replaceParentSelector(newPaths, context, selector);\n\n if (!hadParentSelector) {\n if (context.length > 0) {\n newPaths = [];\n for (i = 0; i < context.length; i++) {\n\n const concatenated = context[i].map(deriveSelector.bind(this, selector.visibilityInfo()));\n\n concatenated.push(selector);\n newPaths.push(concatenated);\n }\n }\n else {\n newPaths = [[selector]];\n }\n }\n\n for (i = 0; i < newPaths.length; i++) {\n paths.push(newPaths[i]);\n }\n\n }\n}\n\nRuleset.prototype.type = 'Ruleset';\nRuleset.prototype.isRuleset = true;\nexport default Ruleset;\n","import Node from './node';\nimport Selector from './selector';\nimport Ruleset from './ruleset';\nimport Anonymous from './anonymous';\n\nclass AtRule extends Node {\n constructor(\n name,\n value,\n rules,\n index,\n currentFileInfo,\n debugInfo,\n isRooted,\n visibilityInfo\n ) {\n super();\n\n let i;\n\n this.name = name;\n this.value = (value instanceof Node) ? value : (value ? new Anonymous(value) : value);\n if (rules) {\n if (Array.isArray(rules)) {\n this.rules = rules;\n } else {\n this.rules = [rules];\n this.rules[0].selectors = (new Selector([], null, null, index, currentFileInfo)).createEmptySelectors();\n }\n for (i = 0; i < this.rules.length; i++) {\n this.rules[i].allowImports = true;\n }\n this.setParent(this.rules, this);\n }\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.debugInfo = debugInfo;\n this.isRooted = isRooted || false;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n }\n\n accept(visitor) {\n const value = this.value, rules = this.rules;\n if (rules) {\n this.rules = visitor.visitArray(rules);\n }\n if (value) {\n this.value = visitor.visit(value);\n }\n }\n\n isRulesetLike() {\n return this.rules || !this.isCharset();\n }\n\n isCharset() {\n return '@charset' === this.name;\n }\n\n genCSS(context, output) {\n const value = this.value, rules = this.rules;\n output.add(this.name, this.fileInfo(), this.getIndex());\n if (value) {\n output.add(' ');\n value.genCSS(context, output);\n }\n if (rules) {\n this.outputRuleset(context, output, rules);\n } else {\n output.add(';');\n }\n }\n\n eval(context) {\n let mediaPathBackup, mediaBlocksBackup, value = this.value, rules = this.rules;\n\n // media stored inside other atrule should not bubble over it\n // backpup media bubbling information\n mediaPathBackup = context.mediaPath;\n mediaBlocksBackup = context.mediaBlocks;\n // deleted media bubbling information\n context.mediaPath = [];\n context.mediaBlocks = [];\n\n if (value) {\n value = value.eval(context);\n }\n if (rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n rules = [rules[0].eval(context)];\n rules[0].root = true;\n }\n // restore media bubbling information\n context.mediaPath = mediaPathBackup;\n context.mediaBlocks = mediaBlocksBackup;\n\n return new AtRule(this.name, value, rules,\n this.getIndex(), this.fileInfo(), this.debugInfo, this.isRooted, this.visibilityInfo());\n }\n\n variable(name) {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.variable.call(this.rules[0], name);\n }\n }\n\n find() {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.find.apply(this.rules[0], arguments);\n }\n }\n\n rulesets() {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.rulesets.apply(this.rules[0]);\n }\n }\n\n outputRuleset(context, output, rules) {\n const ruleCnt = rules.length;\n let i;\n context.tabLevel = (context.tabLevel | 0) + 1;\n\n // Compressed\n if (context.compress) {\n output.add('{');\n for (i = 0; i < ruleCnt; i++) {\n rules[i].genCSS(context, output);\n }\n output.add('}');\n context.tabLevel--;\n return;\n }\n\n // Non-compressed\n const tabSetStr = `\\n${Array(context.tabLevel).join(' ')}`, tabRuleStr = `${tabSetStr} `;\n if (!ruleCnt) {\n output.add(` {${tabSetStr}}`);\n } else {\n output.add(` {${tabRuleStr}`);\n rules[0].genCSS(context, output);\n for (i = 1; i < ruleCnt; i++) {\n output.add(tabRuleStr);\n rules[i].genCSS(context, output);\n }\n output.add(`${tabSetStr}}`);\n }\n\n context.tabLevel--;\n }\n}\n\nAtRule.prototype.type = 'AtRule';\nexport default AtRule;\n","import Node from './node';\nimport contexts from '../contexts';\nimport * as utils from '../utils';\n\nclass DetachedRuleset extends Node {\n constructor(ruleset, frames) {\n super();\n\n this.ruleset = ruleset;\n this.frames = frames;\n this.setParent(this.ruleset, this);\n }\n\n accept(visitor) {\n this.ruleset = visitor.visit(this.ruleset);\n }\n\n eval(context) {\n const frames = this.frames || utils.copyArray(context.frames);\n return new DetachedRuleset(this.ruleset, frames);\n }\n\n callEval(context) {\n return this.ruleset.eval(this.frames ? new contexts.Eval(context, this.frames.concat(context.frames)) : context);\n }\n}\n\nDetachedRuleset.prototype.type = 'DetachedRuleset';\nDetachedRuleset.prototype.evalFirst = true;\nexport default DetachedRuleset;\n","import Node from './node';\nimport unitConversions from '../data/unit-conversions';\nimport * as utils from '../utils';\n\nclass Unit extends Node {\n constructor(numerator, denominator, backupUnit) {\n super();\n\n this.numerator = numerator ? utils.copyArray(numerator).sort() : [];\n this.denominator = denominator ? utils.copyArray(denominator).sort() : [];\n if (backupUnit) {\n this.backupUnit = backupUnit;\n } else if (numerator && numerator.length) {\n this.backupUnit = numerator[0];\n }\n }\n\n clone() {\n return new Unit(utils.copyArray(this.numerator), utils.copyArray(this.denominator), this.backupUnit);\n }\n\n genCSS(context, output) {\n // Dimension checks the unit is singular and throws an error if in strict math mode.\n const strictUnits = context && context.strictUnits;\n if (this.numerator.length === 1) {\n output.add(this.numerator[0]); // the ideal situation\n } else if (!strictUnits && this.backupUnit) {\n output.add(this.backupUnit);\n } else if (!strictUnits && this.denominator.length) {\n output.add(this.denominator[0]);\n }\n }\n\n toString() {\n let i, returnStr = this.numerator.join('*');\n for (i = 0; i < this.denominator.length; i++) {\n returnStr += `/${this.denominator[i]}`;\n }\n return returnStr;\n }\n\n compare(other) {\n return this.is(other.toString()) ? 0 : undefined;\n }\n\n is(unitString) {\n return this.toString().toUpperCase() === unitString.toUpperCase();\n }\n\n isLength() {\n return RegExp('^(px|em|ex|ch|rem|in|cm|mm|pc|pt|ex|vw|vh|vmin|vmax)$', 'gi').test(this.toCSS());\n }\n\n isEmpty() {\n return this.numerator.length === 0 && this.denominator.length === 0;\n }\n\n isSingular() {\n return this.numerator.length <= 1 && this.denominator.length === 0;\n }\n\n map(callback) {\n let i;\n\n for (i = 0; i < this.numerator.length; i++) {\n this.numerator[i] = callback(this.numerator[i], false);\n }\n\n for (i = 0; i < this.denominator.length; i++) {\n this.denominator[i] = callback(this.denominator[i], true);\n }\n }\n\n usedUnits() {\n let group;\n const result = {};\n let mapUnit;\n let groupName;\n\n mapUnit = function (atomicUnit) {\n /* jshint loopfunc:true */\n if (group.hasOwnProperty(atomicUnit) && !result[groupName]) {\n result[groupName] = atomicUnit;\n }\n\n return atomicUnit;\n };\n\n for (groupName in unitConversions) {\n if (unitConversions.hasOwnProperty(groupName)) {\n group = unitConversions[groupName];\n\n this.map(mapUnit);\n }\n }\n\n return result;\n }\n\n cancel() {\n const counter = {};\n let atomicUnit;\n let i;\n\n for (i = 0; i < this.numerator.length; i++) {\n atomicUnit = this.numerator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) + 1;\n }\n\n for (i = 0; i < this.denominator.length; i++) {\n atomicUnit = this.denominator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) - 1;\n }\n\n this.numerator = [];\n this.denominator = [];\n\n for (atomicUnit in counter) {\n if (counter.hasOwnProperty(atomicUnit)) {\n const count = counter[atomicUnit];\n\n if (count > 0) {\n for (i = 0; i < count; i++) {\n this.numerator.push(atomicUnit);\n }\n } else if (count < 0) {\n for (i = 0; i < -count; i++) {\n this.denominator.push(atomicUnit);\n }\n }\n }\n }\n\n this.numerator.sort();\n this.denominator.sort();\n }\n}\n\nUnit.prototype.type = 'Unit';\nexport default Unit;\n","import Node from './node';\nimport unitConversions from '../data/unit-conversions';\nimport Unit from './unit';\nimport Color from './color';\n\n//\n// A number with a unit\n//\nclass Dimension extends Node {\n constructor(value, unit) {\n super();\n\n this.value = parseFloat(value);\n if (isNaN(this.value)) {\n throw new Error('Dimension is not a number.');\n }\n this.unit = (unit && unit instanceof Unit) ? unit :\n new Unit(unit ? [unit] : undefined);\n this.setParent(this.unit, this);\n }\n\n accept(visitor) {\n this.unit = visitor.visit(this.unit);\n }\n\n eval(context) {\n return this;\n }\n\n toColor() {\n return new Color([this.value, this.value, this.value]);\n }\n\n genCSS(context, output) {\n if ((context && context.strictUnits) && !this.unit.isSingular()) {\n throw new Error(`Multiple units in dimension. Correct the units or use the unit function. Bad unit: ${this.unit.toString()}`);\n }\n\n const value = this.fround(context, this.value);\n let strValue = String(value);\n\n if (value !== 0 && value < 0.000001 && value > -0.000001) {\n // would be output 1e-6 etc.\n strValue = value.toFixed(20).replace(/0+$/, '');\n }\n\n if (context && context.compress) {\n // Zero values doesn't need a unit\n if (value === 0 && this.unit.isLength()) {\n output.add(strValue);\n return;\n }\n\n // Float values doesn't need a leading zero\n if (value > 0 && value < 1) {\n strValue = (strValue).substr(1);\n }\n }\n\n output.add(strValue);\n this.unit.genCSS(context, output);\n }\n\n // In an operation between two Dimensions,\n // we default to the first Dimension's unit,\n // so `1px + 2` will yield `3px`.\n operate(context, op, other) {\n /* jshint noempty:false */\n let value = this._operate(context, op, this.value, other.value), unit = this.unit.clone();\n\n if (op === '+' || op === '-') {\n if (unit.numerator.length === 0 && unit.denominator.length === 0) {\n unit = other.unit.clone();\n if (this.unit.backupUnit) {\n unit.backupUnit = this.unit.backupUnit;\n }\n } else if (other.unit.numerator.length === 0 && unit.denominator.length === 0) {\n // do nothing\n } else {\n other = other.convertTo(this.unit.usedUnits());\n\n if (context.strictUnits && other.unit.toString() !== unit.toString()) {\n throw new Error(`Incompatible units. Change the units or use the unit function. Bad units: '${unit.toString()}' and '${other.unit.toString()}'.`);\n }\n\n value = this._operate(context, op, this.value, other.value);\n }\n } else if (op === '*') {\n unit.numerator = unit.numerator.concat(other.unit.numerator).sort();\n unit.denominator = unit.denominator.concat(other.unit.denominator).sort();\n unit.cancel();\n } else if (op === '/') {\n unit.numerator = unit.numerator.concat(other.unit.denominator).sort();\n unit.denominator = unit.denominator.concat(other.unit.numerator).sort();\n unit.cancel();\n }\n return new Dimension(value, unit);\n }\n\n compare(other) {\n let a, b;\n\n if (!(other instanceof Dimension)) {\n return undefined;\n }\n\n if (this.unit.isEmpty() || other.unit.isEmpty()) {\n a = this;\n b = other;\n } else {\n a = this.unify();\n b = other.unify();\n if (a.unit.compare(b.unit) !== 0) {\n return undefined;\n }\n }\n\n return Node.numericCompare(a.value, b.value);\n }\n\n unify() {\n return this.convertTo({ length: 'px', duration: 's', angle: 'rad' });\n }\n\n convertTo(conversions) {\n let value = this.value;\n const unit = this.unit.clone();\n let i;\n let groupName;\n let group;\n let targetUnit;\n let derivedConversions = {};\n let applyUnit;\n\n if (typeof conversions === 'string') {\n for (i in unitConversions) {\n if (unitConversions[i].hasOwnProperty(conversions)) {\n derivedConversions = {};\n derivedConversions[i] = conversions;\n }\n }\n conversions = derivedConversions;\n }\n applyUnit = function (atomicUnit, denominator) {\n /* jshint loopfunc:true */\n if (group.hasOwnProperty(atomicUnit)) {\n if (denominator) {\n value = value / (group[atomicUnit] / group[targetUnit]);\n } else {\n value = value * (group[atomicUnit] / group[targetUnit]);\n }\n\n return targetUnit;\n }\n\n return atomicUnit;\n };\n\n for (groupName in conversions) {\n if (conversions.hasOwnProperty(groupName)) {\n targetUnit = conversions[groupName];\n group = unitConversions[groupName];\n\n unit.map(applyUnit);\n }\n }\n\n unit.cancel();\n\n return new Dimension(value, unit);\n }\n}\n\nDimension.prototype.type = 'Dimension';\nexport default Dimension;\n","import Node from './node';\nimport Color from './color';\nimport Dimension from './dimension';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\n\nclass Operation extends Node {\n constructor(op, operands, isSpaced) {\n super();\n\n this.op = op.trim();\n this.operands = operands;\n this.isSpaced = isSpaced;\n }\n\n accept(visitor) {\n this.operands = visitor.visitArray(this.operands);\n }\n\n eval(context) {\n let a = this.operands[0].eval(context), b = this.operands[1].eval(context), op;\n\n if (context.isMathOn(this.op)) {\n op = this.op === './' ? '/' : this.op;\n if (a instanceof Dimension && b instanceof Color) {\n a = a.toColor();\n }\n if (b instanceof Dimension && a instanceof Color) {\n b = b.toColor();\n }\n if (!a.operate) {\n if (a instanceof Operation && a.op === '/' && context.math === MATH.PARENS_DIVISION) {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n throw { type: 'Operation',\n message: 'Operation on an invalid type' };\n }\n\n return a.operate(context, op, b);\n } else {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n }\n\n genCSS(context, output) {\n this.operands[0].genCSS(context, output);\n if (this.isSpaced) {\n output.add(' ');\n }\n output.add(this.op);\n if (this.isSpaced) {\n output.add(' ');\n }\n this.operands[1].genCSS(context, output);\n }\n}\n\nOperation.prototype.type = 'Operation';\nexport default Operation;\n","import Node from './node';\nimport Paren from './paren';\nimport Comment from './comment';\nimport Dimension from './dimension';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\nclass Expression extends Node {\n constructor(value, noSpacing) {\n super();\n\n this.value = value;\n this.noSpacing = noSpacing;\n if (!value) {\n throw new Error('Expression requires an array parameter');\n }\n }\n\n accept(visitor) {\n this.value = visitor.visitArray(this.value);\n }\n\n eval(context) {\n let returnValue;\n const mathOn = context.isMathOn();\n const inParenthesis = this.parens;\n\n let doubleParen = false;\n if (inParenthesis) {\n context.inParenthesis();\n }\n if (this.value.length > 1) {\n returnValue = new Expression(this.value.map(function (e) {\n if (!e.eval) {\n return e;\n }\n return e.eval(context);\n }), this.noSpacing);\n } else if (this.value.length === 1) {\n if (this.value[0].parens && !this.value[0].parensInOp && !context.inCalc) {\n doubleParen = true;\n }\n returnValue = this.value[0].eval(context);\n } else {\n returnValue = this;\n }\n if (inParenthesis) {\n context.outOfParenthesis();\n }\n if (this.parens && this.parensInOp && !mathOn && !doubleParen \n && (!(returnValue instanceof Dimension))) {\n returnValue = new Paren(returnValue);\n }\n return returnValue;\n }\n\n genCSS(context, output) {\n for (let i = 0; i < this.value.length; i++) {\n this.value[i].genCSS(context, output);\n if (!this.noSpacing && i + 1 < this.value.length) {\n output.add(' ');\n }\n }\n }\n\n throwAwayComments() {\n this.value = this.value.filter(function(v) {\n return !(v instanceof Comment);\n });\n }\n}\n\nExpression.prototype.type = 'Expression';\nexport default Expression;\n","import Expression from '../tree/expression';\n\nclass functionCaller {\n constructor(name, context, index, currentFileInfo) {\n this.name = name.toLowerCase();\n this.index = index;\n this.context = context;\n this.currentFileInfo = currentFileInfo;\n\n this.func = context.frames[0].functionRegistry.get(this.name);\n }\n\n isValid() {\n return Boolean(this.func);\n }\n\n call(args) {\n if (!(Array.isArray(args))) {\n args = [args];\n }\n const evalArgs = this.func.evalArgs;\n if (evalArgs !== false) {\n args = args.map(a => a.eval(this.context));\n }\n const commentFilter = item => !(item.type === 'Comment');\n\n // This code is terrible and should be replaced as per this issue...\n // https://github.com/less/less.js/issues/2477\n args = args\n .filter(commentFilter)\n .map(item => {\n if (item.type === 'Expression') {\n const subNodes = item.value.filter(commentFilter);\n if (subNodes.length === 1) {\n return subNodes[0];\n } else {\n return new Expression(subNodes);\n }\n }\n return item;\n });\n\n if (evalArgs === false) {\n return this.func(this.context, ...args);\n }\n\n return this.func(...args);\n }\n}\n\nexport default functionCaller;\n","import Node from './node';\nimport Anonymous from './anonymous';\nimport FunctionCaller from '../functions/function-caller';\nimport logger from '../logger';\n\n//\n// A function call node.\n//\nclass Call extends Node {\n constructor(name, args, index, currentFileInfo) {\n super();\n\n this.name = name;\n this.args = args;\n this.calc = name === 'calc';\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n accept(visitor) {\n if (this.args) {\n this.args = visitor.visitArray(this.args);\n }\n }\n\n //\n // When evaluating a function call,\n // we either find the function in the functionRegistry,\n // in which case we call it, passing the evaluated arguments,\n // if this returns null or we cannot find the function, we\n // simply print it out as it appeared originally [2].\n //\n // The reason why we evaluate the arguments, is in the case where\n // we try to pass a variable to a function, like: `saturate(@color)`.\n // The function should receive the value, not the variable.\n //\n eval(context) {\n /**\n * Turn off math for calc(), and switch back on for evaluating nested functions\n */\n const currentMathContext = context.mathOn;\n context.mathOn = !this.calc;\n if (this.calc || context.inCalc) {\n context.enterCalc();\n }\n\n const exitCalc = () => {\n if (this.calc || context.inCalc) {\n context.exitCalc();\n }\n context.mathOn = currentMathContext;\n };\n\n let result;\n const funcCaller = new FunctionCaller(this.name, context, this.getIndex(), this.fileInfo());\n\n if (funcCaller.isValid()) {\n try {\n result = funcCaller.call(this.args);\n exitCalc();\n } catch (e) {\n if (e.hasOwnProperty('line') && e.hasOwnProperty('column')) {\n throw e;\n }\n throw { \n type: e.type || 'Runtime',\n message: `Error evaluating function \\`${this.name}\\`${e.message ? `: ${e.message}` : ''}`,\n index: this.getIndex(), \n filename: this.fileInfo().filename,\n line: e.lineNumber,\n column: e.columnNumber\n };\n }\n }\n\n if (result !== null && result !== undefined) {\n // Results that that are not nodes are cast as Anonymous nodes\n // Falsy values or booleans are returned as empty nodes\n if (!(result instanceof Node)) {\n if (!result || result === true) {\n result = new Anonymous(null); \n }\n else {\n result = new Anonymous(result.toString()); \n }\n \n }\n result._index = this._index;\n result._fileInfo = this._fileInfo;\n return result;\n }\n\n const args = this.args.map(a => a.eval(context));\n exitCalc();\n\n return new Call(this.name, args, this.getIndex(), this.fileInfo());\n }\n\n genCSS(context, output) {\n output.add(`${this.name}(`, this.fileInfo(), this.getIndex());\n\n for (let i = 0; i < this.args.length; i++) {\n this.args[i].genCSS(context, output);\n if (i + 1 < this.args.length) {\n output.add(', ');\n }\n }\n\n output.add(')');\n }\n}\n\nCall.prototype.type = 'Call';\nexport default Call;\n","import Node from './node';\nimport Call from './call';\n\nclass Variable extends Node {\n constructor(name, index, currentFileInfo) {\n super();\n\n this.name = name;\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n eval(context) {\n let variable, name = this.name;\n\n if (name.indexOf('@@') === 0) {\n name = `@${new Variable(name.slice(1), this.getIndex(), this.fileInfo()).eval(context).value}`;\n }\n\n if (this.evaluating) {\n throw { type: 'Name',\n message: `Recursive variable definition for ${name}`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n variable = this.find(context.frames, function (frame) {\n const v = frame.variable(name);\n if (v) {\n if (v.important) {\n const importantScope = context.importantScope[context.importantScope.length - 1];\n importantScope.important = v.important;\n }\n // If in calc, wrap vars in a function call to cascade evaluate args first\n if (context.inCalc) {\n return (new Call('_SELF', [v.value])).eval(context);\n }\n else {\n return v.value.eval(context);\n }\n }\n });\n if (variable) {\n this.evaluating = false;\n return variable;\n } else {\n throw { type: 'Name',\n message: `variable ${name} is undefined`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n }\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n}\n\nVariable.prototype.type = 'Variable';\nexport default Variable;\n","import Node from './node';\nimport Declaration from './declaration';\n\nclass Property extends Node {\n constructor(name, index, currentFileInfo) {\n super();\n\n this.name = name;\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n eval(context) {\n let property;\n const name = this.name;\n // TODO: shorten this reference\n const mergeRules = context.pluginManager.less.visitors.ToCSSVisitor.prototype._mergeRules;\n\n if (this.evaluating) {\n throw { type: 'Name',\n message: `Recursive property reference for ${name}`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n property = this.find(context.frames, function (frame) {\n let v;\n const vArr = frame.property(name);\n if (vArr) {\n for (let i = 0; i < vArr.length; i++) {\n v = vArr[i];\n\n vArr[i] = new Declaration(v.name,\n v.value,\n v.important,\n v.merge,\n v.index,\n v.currentFileInfo,\n v.inline,\n v.variable\n );\n }\n mergeRules(vArr);\n\n v = vArr[vArr.length - 1];\n if (v.important) {\n const importantScope = context.importantScope[context.importantScope.length - 1];\n importantScope.important = v.important;\n }\n v = v.value.eval(context);\n return v;\n }\n });\n if (property) {\n this.evaluating = false;\n return property;\n } else {\n throw { type: 'Name',\n message: `Property '${name}' is undefined`,\n filename: this.currentFileInfo.filename,\n index: this.index };\n }\n }\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n}\n\nProperty.prototype.type = 'Property';\nexport default Property;\n","import Node from './node';\n\nclass Attribute extends Node {\n constructor(key, op, value) {\n super();\n\n this.key = key;\n this.op = op;\n this.value = value;\n }\n\n eval(context) {\n return new Attribute(this.key.eval ? this.key.eval(context) : this.key,\n this.op, (this.value && this.value.eval) ? this.value.eval(context) : this.value);\n }\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n }\n\n toCSS(context) {\n let value = this.key.toCSS ? this.key.toCSS(context) : this.key;\n\n if (this.op) {\n value += this.op;\n value += (this.value.toCSS ? this.value.toCSS(context) : this.value);\n }\n\n return `[${value}]`;\n }\n}\n\nAttribute.prototype.type = 'Attribute';\nexport default Attribute;\n","import Node from './node';\nimport Variable from './variable';\nimport Property from './property';\n\n\nclass Quoted extends Node {\n constructor(str, content, escaped, index, currentFileInfo) {\n super();\n\n this.escaped = (escaped == null) ? true : escaped;\n this.value = content || '';\n this.quote = str.charAt(0);\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.variableRegex = /@\\{([\\w-]+)\\}/g;\n this.propRegex = /\\$\\{([\\w-]+)\\}/g;\n this.allowRoot = escaped;\n }\n\n genCSS(context, output) {\n if (!this.escaped) {\n output.add(this.quote, this.fileInfo(), this.getIndex());\n }\n output.add(this.value);\n if (!this.escaped) {\n output.add(this.quote);\n }\n }\n\n containsVariables() {\n return this.value.match(this.variableRegex);\n }\n\n eval(context) {\n const that = this;\n let value = this.value;\n const variableReplacement = function (_, name) {\n const v = new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v.value : v.toCSS();\n };\n const propertyReplacement = function (_, name) {\n const v = new Property(`$${name}`, that.getIndex(), that.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v.value : v.toCSS();\n };\n function iterativeReplace(value, regexp, replacementFnc) {\n let evaluatedValue = value;\n do {\n value = evaluatedValue.toString();\n evaluatedValue = value.replace(regexp, replacementFnc);\n } while (value !== evaluatedValue);\n return evaluatedValue;\n }\n value = iterativeReplace(value, this.variableRegex, variableReplacement);\n value = iterativeReplace(value, this.propRegex, propertyReplacement);\n return new Quoted(this.quote + value + this.quote, value, this.escaped, this.getIndex(), this.fileInfo());\n }\n\n compare(other) {\n // when comparing quoted strings allow the quote to differ\n if (other.type === 'Quoted' && !this.escaped && !other.escaped) {\n return Node.numericCompare(this.value, other.value);\n } else {\n return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n }\n }\n}\n\nQuoted.prototype.type = 'Quoted';\nexport default Quoted;\n","import Node from './node';\n\nclass URL extends Node {\n constructor(val, index, currentFileInfo, isEvald) {\n super();\n\n this.value = val;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.isEvald = isEvald;\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n genCSS(context, output) {\n output.add('url(');\n this.value.genCSS(context, output);\n output.add(')');\n }\n\n eval(context) {\n const val = this.value.eval(context);\n let rootpath;\n\n if (!this.isEvald) {\n // Add the rootpath if the URL requires a rewrite\n rootpath = this.fileInfo() && this.fileInfo().rootpath;\n if (typeof rootpath === 'string' &&\n typeof val.value === 'string' &&\n context.pathRequiresRewrite(val.value)) {\n if (!val.quote) {\n rootpath = escapePath(rootpath);\n }\n val.value = context.rewritePath(val.value, rootpath);\n } else {\n val.value = context.normalizePath(val.value);\n }\n\n // Add url args if enabled\n if (context.urlArgs) {\n if (!val.value.match(/^\\s*data:/)) {\n const delimiter = val.value.indexOf('?') === -1 ? '?' : '&';\n const urlArgs = delimiter + context.urlArgs;\n if (val.value.indexOf('#') !== -1) {\n val.value = val.value.replace('#', `${urlArgs}#`);\n } else {\n val.value += urlArgs;\n }\n }\n }\n }\n\n return new URL(val, this.getIndex(), this.fileInfo(), true);\n }\n}\n\nURL.prototype.type = 'Url';\n\nfunction escapePath(path) {\n return path.replace(/[\\(\\)'\"\\s]/g, function(match) { return `\\\\${match}`; });\n}\n\nexport default URL;\n","import Ruleset from './ruleset';\nimport Value from './value';\nimport Selector from './selector';\nimport Anonymous from './anonymous';\nimport Expression from './expression';\nimport AtRule from './atrule';\nimport * as utils from '../utils';\n\nclass Media extends AtRule {\n constructor(value, features, index, currentFileInfo, visibilityInfo) {\n super();\n\n this._index = index;\n this._fileInfo = currentFileInfo;\n\n const selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors();\n\n this.features = new Value(features);\n this.rules = [new Ruleset(selectors, value)];\n this.rules[0].allowImports = true;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n this.setParent(selectors, this);\n this.setParent(this.features, this);\n this.setParent(this.rules, this);\n }\n\n isRulesetLike() {\n return true;\n }\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this.features);\n }\n if (this.rules) {\n this.rules = visitor.visitArray(this.rules);\n }\n }\n\n genCSS(context, output) {\n output.add('@media ', this._fileInfo, this._index);\n this.features.genCSS(context, output);\n this.outputRuleset(context, output, this.rules);\n }\n\n eval(context) {\n if (!context.mediaBlocks) {\n context.mediaBlocks = [];\n context.mediaPath = [];\n }\n\n const media = new Media(null, [], this._index, this._fileInfo, this.visibilityInfo());\n if (this.debugInfo) {\n this.rules[0].debugInfo = this.debugInfo;\n media.debugInfo = this.debugInfo;\n }\n \n media.features = this.features.eval(context);\n\n context.mediaPath.push(media);\n context.mediaBlocks.push(media);\n\n this.rules[0].functionRegistry = context.frames[0].functionRegistry.inherit();\n context.frames.unshift(this.rules[0]);\n media.rules = [this.rules[0].eval(context)];\n context.frames.shift();\n\n context.mediaPath.pop();\n\n return context.mediaPath.length === 0 ? media.evalTop(context) :\n media.evalNested(context);\n }\n\n evalTop(context) {\n let result = this;\n\n // Render all dependent Media blocks.\n if (context.mediaBlocks.length > 1) {\n const selectors = (new Selector([], null, null, this.getIndex(), this.fileInfo())).createEmptySelectors();\n result = new Ruleset(selectors, context.mediaBlocks);\n result.multiMedia = true;\n result.copyVisibilityInfo(this.visibilityInfo());\n this.setParent(result, this);\n }\n\n delete context.mediaBlocks;\n delete context.mediaPath;\n\n return result;\n }\n\n evalNested(context) {\n let i;\n let value;\n const path = context.mediaPath.concat([this]);\n\n // Extract the media-query conditions separated with `,` (OR).\n for (i = 0; i < path.length; i++) {\n value = path[i].features instanceof Value ?\n path[i].features.value : path[i].features;\n path[i] = Array.isArray(value) ? value : [value];\n }\n\n // Trace all permutations to generate the resulting media-query.\n //\n // (a, b and c) with nested (d, e) ->\n // a and d\n // a and e\n // b and c and d\n // b and c and e\n this.features = new Value(this.permute(path).map(path => {\n path = path.map(fragment => fragment.toCSS ? fragment : new Anonymous(fragment));\n\n for (i = path.length - 1; i > 0; i--) {\n path.splice(i, 0, new Anonymous('and'));\n }\n\n return new Expression(path);\n }));\n this.setParent(this.features, this);\n\n // Fake a tree-node that doesn't output anything.\n return new Ruleset([], []);\n }\n\n permute(arr) {\n if (arr.length === 0) {\n return [];\n } else if (arr.length === 1) {\n return arr[0];\n } else {\n const result = [];\n const rest = this.permute(arr.slice(1));\n for (let i = 0; i < rest.length; i++) {\n for (let j = 0; j < arr[0].length; j++) {\n result.push([arr[0][j]].concat(rest[i]));\n }\n }\n return result;\n }\n }\n\n bubbleSelectors(selectors) {\n if (!selectors) {\n return;\n }\n this.rules = [new Ruleset(utils.copyArray(selectors), [this.rules[0]])];\n this.setParent(this.rules, this);\n }\n}\n\nMedia.prototype.type = 'Media';\nexport default Media;\n","import Node from './node';\nimport Media from './media';\nimport URL from './url';\nimport Quoted from './quoted';\nimport Ruleset from './ruleset';\nimport Anonymous from './anonymous';\nimport * as utils from '../utils';\nimport LessError from '../less-error';\n\n//\n// CSS @import node\n//\n// The general strategy here is that we don't want to wait\n// for the parsing to be completed, before we start importing\n// the file. That's because in the context of a browser,\n// most of the time will be spent waiting for the server to respond.\n//\n// On creation, we push the import path to our import queue, though\n// `import,push`, we also pass it a callback, which it'll call once\n// the file has been fetched, and parsed.\n//\nclass Import extends Node {\n constructor(path, features, options, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.options = options;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.path = path;\n this.features = features;\n this.allowRoot = true;\n\n if (this.options.less !== undefined || this.options.inline) {\n this.css = !this.options.less || this.options.inline;\n } else {\n const pathValue = this.getPath();\n if (pathValue && /[#\\.\\&\\?]css([\\?;].*)?$/.test(pathValue)) {\n this.css = true;\n }\n }\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.features, this);\n this.setParent(this.path, this);\n }\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this.features);\n }\n this.path = visitor.visit(this.path);\n if (!this.options.isPlugin && !this.options.inline && this.root) {\n this.root = visitor.visit(this.root);\n }\n }\n\n genCSS(context, output) {\n if (this.css && this.path._fileInfo.reference === undefined) {\n output.add('@import ', this._fileInfo, this._index);\n this.path.genCSS(context, output);\n if (this.features) {\n output.add(' ');\n this.features.genCSS(context, output);\n }\n output.add(';');\n }\n }\n\n getPath() {\n return (this.path instanceof URL) ?\n this.path.value.value : this.path.value;\n }\n\n isVariableImport() {\n let path = this.path;\n if (path instanceof URL) {\n path = path.value;\n }\n if (path instanceof Quoted) {\n return path.containsVariables();\n }\n\n return true;\n }\n\n evalForImport(context) {\n let path = this.path;\n\n if (path instanceof URL) {\n path = path.value;\n }\n\n return new Import(path.eval(context), this.features, this.options, this._index, this._fileInfo, this.visibilityInfo());\n }\n\n evalPath(context) {\n const path = this.path.eval(context);\n const fileInfo = this._fileInfo;\n\n if (!(path instanceof URL)) {\n // Add the rootpath if the URL requires a rewrite\n const pathValue = path.value;\n if (fileInfo &&\n pathValue &&\n context.pathRequiresRewrite(pathValue)) {\n path.value = context.rewritePath(pathValue, fileInfo.rootpath);\n } else {\n path.value = context.normalizePath(path.value);\n }\n }\n\n return path;\n }\n\n eval(context) {\n const result = this.doEval(context);\n if (this.options.reference || this.blocksVisibility()) {\n if (result.length || result.length === 0) {\n result.forEach(function (node) {\n node.addVisibilityBlock();\n }\n );\n } else {\n result.addVisibilityBlock();\n }\n }\n return result;\n }\n\n doEval(context) {\n let ruleset;\n let registry;\n const features = this.features && this.features.eval(context);\n\n if (this.options.isPlugin) {\n if (this.root && this.root.eval) {\n try {\n this.root.eval(context);\n }\n catch (e) {\n e.message = 'Plugin error during evaluation';\n throw new LessError(e, this.root.imports, this.root.filename);\n }\n }\n registry = context.frames[0] && context.frames[0].functionRegistry;\n if ( registry && this.root && this.root.functions ) {\n registry.addMultiple( this.root.functions );\n }\n\n return [];\n }\n\n if (this.skip) {\n if (typeof this.skip === 'function') {\n this.skip = this.skip();\n }\n if (this.skip) {\n return [];\n }\n }\n if (this.options.inline) {\n const contents = new Anonymous(this.root, 0,\n {\n filename: this.importedFilename,\n reference: this.path._fileInfo && this.path._fileInfo.reference\n }, true, true);\n\n return this.features ? new Media([contents], this.features.value) : [contents];\n } else if (this.css) {\n const newImport = new Import(this.evalPath(context), features, this.options, this._index);\n if (!newImport.css && this.error) {\n throw this.error;\n }\n return newImport;\n } else if (this.root) {\n ruleset = new Ruleset(null, utils.copyArray(this.root.rules));\n ruleset.evalImports(context);\n\n return this.features ? new Media(ruleset.rules, this.features.value) : ruleset.rules;\n } else {\n return [];\n }\n }\n}\n\nImport.prototype.type = 'Import';\nexport default Import;\n","import Node from './node';\nimport Variable from './variable';\n\nclass JsEvalNode extends Node {\n evaluateJavaScript(expression, context) {\n let result;\n const that = this;\n const evalContext = {};\n\n if (!context.javascriptEnabled) {\n throw { message: 'Inline JavaScript is not enabled. Is it set in your options?',\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n expression = expression.replace(/@\\{([\\w-]+)\\}/g, function (_, name) {\n return that.jsify(new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context));\n });\n\n try {\n expression = new Function(`return (${expression})`);\n } catch (e) {\n throw { message: `JavaScript evaluation error: ${e.message} from \\`${expression}\\`` ,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n const variables = context.frames[0].variables();\n for (const k in variables) {\n if (variables.hasOwnProperty(k)) {\n /* jshint loopfunc:true */\n evalContext[k.slice(1)] = {\n value: variables[k].value,\n toJS: function () {\n return this.value.eval(context).toCSS();\n }\n };\n }\n }\n\n try {\n result = expression.call(evalContext);\n } catch (e) {\n throw { message: `JavaScript evaluation error: '${e.name}: ${e.message.replace(/[\"]/g, '\\'')}'` ,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n return result;\n }\n\n jsify(obj) {\n if (Array.isArray(obj.value) && (obj.value.length > 1)) {\n return `[${obj.value.map(function (v) { return v.toCSS(); }).join(', ')}]`;\n } else {\n return obj.toCSS();\n }\n }\n}\n\nexport default JsEvalNode;\n","import JsEvalNode from './js-eval-node';\nimport Dimension from './dimension';\nimport Quoted from './quoted';\nimport Anonymous from './anonymous';\n\nclass JavaScript extends JsEvalNode {\n constructor(string, escaped, index, currentFileInfo) {\n super();\n\n this.escaped = escaped;\n this.expression = string;\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n eval(context) {\n const result = this.evaluateJavaScript(this.expression, context);\n const type = typeof result;\n\n if (type === 'number' && !isNaN(result)) {\n return new Dimension(result);\n } else if (type === 'string') {\n return new Quoted(`\"${result}\"`, result, this.escaped, this._index);\n } else if (Array.isArray(result)) {\n return new Anonymous(result.join(', '));\n } else {\n return new Anonymous(result);\n }\n }\n}\n\nJavaScript.prototype.type = 'JavaScript';\nexport default JavaScript;\n","import Node from './node';\n\nclass Assignment extends Node {\n constructor(key, val) {\n super();\n\n this.key = key;\n this.value = val;\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n eval(context) {\n if (this.value.eval) {\n return new Assignment(this.key, this.value.eval(context));\n }\n return this;\n }\n\n genCSS(context, output) {\n output.add(`${this.key}=`);\n if (this.value.genCSS) {\n this.value.genCSS(context, output);\n } else {\n output.add(this.value);\n }\n }\n}\n\nAssignment.prototype.type = 'Assignment';\nexport default Assignment;\n","import Node from './node';\n\nclass Condition extends Node {\n constructor(op, l, r, i, negate) {\n super();\n\n this.op = op.trim();\n this.lvalue = l;\n this.rvalue = r;\n this._index = i;\n this.negate = negate;\n }\n\n accept(visitor) {\n this.lvalue = visitor.visit(this.lvalue);\n this.rvalue = visitor.visit(this.rvalue);\n }\n\n eval(context) {\n const result = (function (op, a, b) {\n switch (op) {\n case 'and': return a && b;\n case 'or': return a || b;\n default:\n switch (Node.compare(a, b)) {\n case -1:\n return op === '<' || op === '=<' || op === '<=';\n case 0:\n return op === '=' || op === '>=' || op === '=<' || op === '<=';\n case 1:\n return op === '>' || op === '>=';\n default:\n return false;\n }\n }\n })(this.op, this.lvalue.eval(context), this.rvalue.eval(context));\n\n return this.negate ? !result : result;\n }\n}\n\nCondition.prototype.type = 'Condition';\nexport default Condition;\n","import Node from './node';\n\nclass UnicodeDescriptor extends Node {\n constructor(value) {\n super();\n\n this.value = value;\n }\n}\n\nUnicodeDescriptor.prototype.type = 'UnicodeDescriptor';\n\nexport default UnicodeDescriptor;\n","import Node from './node';\nimport Operation from './operation';\nimport Dimension from './dimension';\n\nclass Negative extends Node {\n constructor(node) {\n super();\n\n this.value = node;\n }\n\n genCSS(context, output) {\n output.add('-');\n this.value.genCSS(context, output);\n }\n\n eval(context) {\n if (context.isMathOn()) {\n return (new Operation('*', [new Dimension(-1), this.value])).eval(context);\n }\n return new Negative(this.value.eval(context));\n }\n}\n\nNegative.prototype.type = 'Negative';\nexport default Negative;\n","import Node from './node';\nimport Selector from './selector';\n\nclass Extend extends Node {\n constructor(selector, option, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.selector = selector;\n this.option = option;\n this.object_id = Extend.next_id++;\n this.parent_ids = [this.object_id];\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n\n switch (option) {\n case 'all':\n this.allowBefore = true;\n this.allowAfter = true;\n break;\n default:\n this.allowBefore = false;\n this.allowAfter = false;\n break;\n }\n this.setParent(this.selector, this);\n }\n\n accept(visitor) {\n this.selector = visitor.visit(this.selector);\n }\n\n eval(context) {\n return new Extend(this.selector.eval(context), this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n }\n\n clone(context) {\n return new Extend(this.selector, this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n }\n\n // it concatenates (joins) all selectors in selector array\n findSelfSelectors(selectors) {\n let selfElements = [], i, selectorElements;\n\n for (i = 0; i < selectors.length; i++) {\n selectorElements = selectors[i].elements;\n // duplicate the logic in genCSS function inside the selector node.\n // future TODO - move both logics into the selector joiner visitor\n if (i > 0 && selectorElements.length && selectorElements[0].combinator.value === '') {\n selectorElements[0].combinator.value = ' ';\n }\n selfElements = selfElements.concat(selectors[i].elements);\n }\n\n this.selfSelectors = [new Selector(selfElements)];\n this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo());\n }\n}\n\nExtend.next_id = 0;\n\nExtend.prototype.type = 'Extend';\nexport default Extend;\n","import Node from './node';\nimport Variable from './variable';\nimport Ruleset from './ruleset';\nimport DetachedRuleset from './detached-ruleset';\nimport LessError from '../less-error';\n\nclass VariableCall extends Node {\n constructor(variable, index, currentFileInfo) {\n super();\n\n this.variable = variable;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.allowRoot = true;\n }\n\n eval(context) {\n let rules;\n let detachedRuleset = new Variable(this.variable, this.getIndex(), this.fileInfo()).eval(context);\n const error = new LessError({message: `Could not evaluate variable call ${this.variable}`});\n\n if (!detachedRuleset.ruleset) {\n if (detachedRuleset.rules) {\n rules = detachedRuleset;\n }\n else if (Array.isArray(detachedRuleset)) {\n rules = new Ruleset('', detachedRuleset);\n }\n else if (Array.isArray(detachedRuleset.value)) {\n rules = new Ruleset('', detachedRuleset.value);\n }\n else {\n throw error;\n }\n detachedRuleset = new DetachedRuleset(rules);\n }\n\n if (detachedRuleset.ruleset) {\n return detachedRuleset.callEval(context);\n }\n throw error;\n }\n}\n\nVariableCall.prototype.type = 'VariableCall';\nexport default VariableCall;\n","import Node from './node';\nimport Variable from './variable';\nimport Ruleset from './ruleset';\nimport Selector from './selector';\n\nclass NamespaceValue extends Node {\n constructor(ruleCall, lookups, index, fileInfo) {\n super();\n\n this.value = ruleCall;\n this.lookups = lookups;\n this._index = index;\n this._fileInfo = fileInfo;\n }\n\n eval(context) {\n let i, j, name, rules = this.value.eval(context);\n \n for (i = 0; i < this.lookups.length; i++) {\n name = this.lookups[i];\n\n /**\n * Eval'd DRs return rulesets.\n * Eval'd mixins return rules, so let's make a ruleset if we need it.\n * We need to do this because of late parsing of values\n */\n if (Array.isArray(rules)) {\n rules = new Ruleset([new Selector()], rules);\n }\n\n if (name === '') {\n rules = rules.lastDeclaration();\n }\n else if (name.charAt(0) === '@') {\n if (name.charAt(1) === '@') {\n name = `@${new Variable(name.substr(1)).eval(context).value}`;\n }\n if (rules.variables) {\n rules = rules.variable(name);\n }\n \n if (!rules) {\n throw { type: 'Name',\n message: `variable ${name} not found`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n }\n else {\n if (name.substring(0, 2) === '$@') {\n name = `$${new Variable(name.substr(1)).eval(context).value}`;\n }\n else {\n name = name.charAt(0) === '$' ? name : `$${name}`;\n }\n if (rules.properties) {\n rules = rules.property(name);\n }\n \n if (!rules) {\n throw { type: 'Name',\n message: `property \"${name.substr(1)}\" not found`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n // Properties are an array of values, since a ruleset can have multiple props.\n // We pick the last one (the \"cascaded\" value)\n rules = rules[rules.length - 1];\n }\n\n if (rules.value) {\n rules = rules.eval(context).value;\n }\n if (rules.ruleset) {\n rules = rules.ruleset.eval(context);\n }\n }\n return rules;\n }\n}\n\nNamespaceValue.prototype.type = 'NamespaceValue';\nexport default NamespaceValue;\n","import Selector from './selector';\nimport Element from './element';\nimport Ruleset from './ruleset';\nimport Declaration from './declaration';\nimport DetachedRuleset from './detached-ruleset';\nimport Expression from './expression';\nimport contexts from '../contexts';\nimport * as utils from '../utils';\n\nclass Definition extends Ruleset {\n constructor(name, params, rules, condition, variadic, frames, visibilityInfo) {\n super();\n\n this.name = name || 'anonymous mixin';\n this.selectors = [new Selector([new Element(null, name, false, this._index, this._fileInfo)])];\n this.params = params;\n this.condition = condition;\n this.variadic = variadic;\n this.arity = params.length;\n this.rules = rules;\n this._lookups = {};\n const optionalParameters = [];\n this.required = params.reduce(function (count, p) {\n if (!p.name || (p.name && !p.value)) {\n return count + 1;\n }\n else {\n optionalParameters.push(p.name);\n return count;\n }\n }, 0);\n this.optionalParameters = optionalParameters;\n this.frames = frames;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n }\n\n accept(visitor) {\n if (this.params && this.params.length) {\n this.params = visitor.visitArray(this.params);\n }\n this.rules = visitor.visitArray(this.rules);\n if (this.condition) {\n this.condition = visitor.visit(this.condition);\n }\n }\n\n evalParams(context, mixinEnv, args, evaldArguments) {\n /* jshint boss:true */\n const frame = new Ruleset(null, null);\n\n let varargs;\n let arg;\n const params = utils.copyArray(this.params);\n let i;\n let j;\n let val;\n let name;\n let isNamedFound;\n let argIndex;\n let argsLength = 0;\n\n if (mixinEnv.frames && mixinEnv.frames[0] && mixinEnv.frames[0].functionRegistry) {\n frame.functionRegistry = mixinEnv.frames[0].functionRegistry.inherit();\n }\n mixinEnv = new contexts.Eval(mixinEnv, [frame].concat(mixinEnv.frames));\n\n if (args) {\n args = utils.copyArray(args);\n argsLength = args.length;\n\n for (i = 0; i < argsLength; i++) {\n arg = args[i];\n if (name = (arg && arg.name)) {\n isNamedFound = false;\n for (j = 0; j < params.length; j++) {\n if (!evaldArguments[j] && name === params[j].name) {\n evaldArguments[j] = arg.value.eval(context);\n frame.prependRule(new Declaration(name, arg.value.eval(context)));\n isNamedFound = true;\n break;\n }\n }\n if (isNamedFound) {\n args.splice(i, 1);\n i--;\n continue;\n } else {\n throw { type: 'Runtime', message: `Named argument for ${this.name} ${args[i].name} not found` };\n }\n }\n }\n }\n argIndex = 0;\n for (i = 0; i < params.length; i++) {\n if (evaldArguments[i]) { continue; }\n\n arg = args && args[argIndex];\n\n if (name = params[i].name) {\n if (params[i].variadic) {\n varargs = [];\n for (j = argIndex; j < argsLength; j++) {\n varargs.push(args[j].value.eval(context));\n }\n frame.prependRule(new Declaration(name, new Expression(varargs).eval(context)));\n } else {\n val = arg && arg.value;\n if (val) {\n // This was a mixin call, pass in a detached ruleset of it's eval'd rules\n if (Array.isArray(val)) {\n val = new DetachedRuleset(new Ruleset('', val));\n }\n else {\n val = val.eval(context);\n }\n } else if (params[i].value) {\n val = params[i].value.eval(mixinEnv);\n frame.resetCache();\n } else {\n throw { type: 'Runtime', message: `wrong number of arguments for ${this.name} (${argsLength} for ${this.arity})` };\n }\n\n frame.prependRule(new Declaration(name, val));\n evaldArguments[i] = val;\n }\n }\n\n if (params[i].variadic && args) {\n for (j = argIndex; j < argsLength; j++) {\n evaldArguments[j] = args[j].value.eval(context);\n }\n }\n argIndex++;\n }\n\n return frame;\n }\n\n makeImportant() {\n const rules = !this.rules ? this.rules : this.rules.map(function (r) {\n if (r.makeImportant) {\n return r.makeImportant(true);\n } else {\n return r;\n }\n });\n const result = new Definition(this.name, this.params, rules, this.condition, this.variadic, this.frames);\n return result;\n }\n\n eval(context) {\n return new Definition(this.name, this.params, this.rules, this.condition, this.variadic, this.frames || utils.copyArray(context.frames));\n }\n\n evalCall(context, args, important) {\n const _arguments = [];\n const mixinFrames = this.frames ? this.frames.concat(context.frames) : context.frames;\n const frame = this.evalParams(context, new contexts.Eval(context, mixinFrames), args, _arguments);\n let rules;\n let ruleset;\n\n frame.prependRule(new Declaration('@arguments', new Expression(_arguments).eval(context)));\n\n rules = utils.copyArray(this.rules);\n\n ruleset = new Ruleset(null, rules);\n ruleset.originalRuleset = this;\n ruleset = ruleset.eval(new contexts.Eval(context, [this, frame].concat(mixinFrames)));\n if (important) {\n ruleset = ruleset.makeImportant();\n }\n return ruleset;\n }\n\n matchCondition(args, context) {\n if (this.condition && !this.condition.eval(\n new contexts.Eval(context,\n [this.evalParams(context, /* the parameter variables */\n new contexts.Eval(context, this.frames ? this.frames.concat(context.frames) : context.frames), args, [])]\n .concat(this.frames || []) // the parent namespace/mixin frames\n .concat(context.frames)))) { // the current environment frames\n return false;\n }\n return true;\n }\n\n matchArgs(args, context) {\n const allArgsCnt = (args && args.length) || 0;\n let len;\n const optionalParameters = this.optionalParameters;\n const requiredArgsCnt = !args ? 0 : args.reduce(function (count, p) {\n if (optionalParameters.indexOf(p.name) < 0) {\n return count + 1;\n } else {\n return count;\n }\n }, 0);\n\n if (!this.variadic) {\n if (requiredArgsCnt < this.required) {\n return false;\n }\n if (allArgsCnt > this.params.length) {\n return false;\n }\n } else {\n if (requiredArgsCnt < (this.required - 1)) {\n return false;\n }\n }\n\n // check patterns\n len = Math.min(requiredArgsCnt, this.arity);\n\n for (let i = 0; i < len; i++) {\n if (!this.params[i].name && !this.params[i].variadic) {\n if (args[i].value.eval(context).toCSS() != this.params[i].value.eval(context).toCSS()) {\n return false;\n }\n }\n }\n return true;\n }\n}\n\nDefinition.prototype.type = 'MixinDefinition';\nDefinition.prototype.evalFirst = true;\nexport default Definition;\n","import Node from './node';\nimport Selector from './selector';\nimport MixinDefinition from './mixin-definition';\nimport defaultFunc from '../functions/default';\n\nclass MixinCall extends Node {\n constructor(elements, args, index, currentFileInfo, important) {\n super();\n\n this.selector = new Selector(elements);\n this.arguments = args || [];\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.important = important;\n this.allowRoot = true;\n this.setParent(this.selector, this);\n }\n\n accept(visitor) {\n if (this.selector) {\n this.selector = visitor.visit(this.selector);\n }\n if (this.arguments.length) {\n this.arguments = visitor.visitArray(this.arguments);\n }\n }\n\n eval(context) {\n let mixins;\n let mixin;\n let mixinPath;\n const args = [];\n let arg;\n let argValue;\n const rules = [];\n let match = false;\n let i;\n let m;\n let f;\n let isRecursive;\n let isOneFound;\n const candidates = [];\n let candidate;\n const conditionResult = [];\n let defaultResult;\n const defFalseEitherCase = -1;\n const defNone = 0;\n const defTrue = 1;\n const defFalse = 2;\n let count;\n let originalRuleset;\n let noArgumentsFilter;\n\n this.selector = this.selector.eval(context);\n\n function calcDefGroup(mixin, mixinPath) {\n let f, p, namespace;\n\n for (f = 0; f < 2; f++) {\n conditionResult[f] = true;\n defaultFunc.value(f);\n for (p = 0; p < mixinPath.length && conditionResult[f]; p++) {\n namespace = mixinPath[p];\n if (namespace.matchCondition) {\n conditionResult[f] = conditionResult[f] && namespace.matchCondition(null, context);\n }\n }\n if (mixin.matchCondition) {\n conditionResult[f] = conditionResult[f] && mixin.matchCondition(args, context);\n }\n }\n if (conditionResult[0] || conditionResult[1]) {\n if (conditionResult[0] != conditionResult[1]) {\n return conditionResult[1] ?\n defTrue : defFalse;\n }\n\n return defNone;\n }\n return defFalseEitherCase;\n }\n\n for (i = 0; i < this.arguments.length; i++) {\n arg = this.arguments[i];\n argValue = arg.value.eval(context);\n if (arg.expand && Array.isArray(argValue.value)) {\n argValue = argValue.value;\n for (m = 0; m < argValue.length; m++) {\n args.push({value: argValue[m]});\n }\n } else {\n args.push({name: arg.name, value: argValue});\n }\n }\n\n noArgumentsFilter = function(rule) {return rule.matchArgs(null, context);};\n\n for (i = 0; i < context.frames.length; i++) {\n if ((mixins = context.frames[i].find(this.selector, null, noArgumentsFilter)).length > 0) {\n isOneFound = true;\n\n // To make `default()` function independent of definition order we have two \"subpasses\" here.\n // At first we evaluate each guard *twice* (with `default() == true` and `default() == false`),\n // and build candidate list with corresponding flags. Then, when we know all possible matches,\n // we make a final decision.\n\n for (m = 0; m < mixins.length; m++) {\n mixin = mixins[m].rule;\n mixinPath = mixins[m].path;\n isRecursive = false;\n for (f = 0; f < context.frames.length; f++) {\n if ((!(mixin instanceof MixinDefinition)) && mixin === (context.frames[f].originalRuleset || context.frames[f])) {\n isRecursive = true;\n break;\n }\n }\n if (isRecursive) {\n continue;\n }\n\n if (mixin.matchArgs(args, context)) {\n candidate = {mixin, group: calcDefGroup(mixin, mixinPath)};\n\n if (candidate.group !== defFalseEitherCase) {\n candidates.push(candidate);\n }\n\n match = true;\n }\n }\n\n defaultFunc.reset();\n\n count = [0, 0, 0];\n for (m = 0; m < candidates.length; m++) {\n count[candidates[m].group]++;\n }\n\n if (count[defNone] > 0) {\n defaultResult = defFalse;\n } else {\n defaultResult = defTrue;\n if ((count[defTrue] + count[defFalse]) > 1) {\n throw { type: 'Runtime',\n message: `Ambiguous use of \\`default()\\` found when matching for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n }\n\n for (m = 0; m < candidates.length; m++) {\n candidate = candidates[m].group;\n if ((candidate === defNone) || (candidate === defaultResult)) {\n try {\n mixin = candidates[m].mixin;\n if (!(mixin instanceof MixinDefinition)) {\n originalRuleset = mixin.originalRuleset || mixin;\n mixin = new MixinDefinition('', [], mixin.rules, null, false, null, originalRuleset.visibilityInfo());\n mixin.originalRuleset = originalRuleset;\n }\n const newRules = mixin.evalCall(context, args, this.important).rules;\n this._setVisibilityToReplacement(newRules);\n Array.prototype.push.apply(rules, newRules);\n } catch (e) {\n throw { message: e.message, index: this.getIndex(), filename: this.fileInfo().filename, stack: e.stack };\n }\n }\n }\n\n if (match) {\n return rules;\n }\n }\n }\n if (isOneFound) {\n throw { type: 'Runtime',\n message: `No matching definition was found for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n } else {\n throw { type: 'Name',\n message: `${this.selector.toCSS().trim()} is undefined`,\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n }\n\n _setVisibilityToReplacement(replacement) {\n let i, rule;\n if (this.blocksVisibility()) {\n for (i = 0; i < replacement.length; i++) {\n rule = replacement[i];\n rule.addVisibilityBlock();\n }\n }\n }\n\n format(args) {\n return `${this.selector.toCSS().trim()}(${args ? args.map(function (a) {\n let argValue = '';\n if (a.name) {\n argValue += `${a.name}:`;\n }\n if (a.value.toCSS) {\n argValue += a.value.toCSS();\n } else {\n argValue += '???';\n }\n return argValue;\n }).join(', ') : ''})`;\n }\n}\n\nMixinCall.prototype.type = 'MixinCall';\nexport default MixinCall;\n","import Node from './node';\nimport Color from './color';\nimport AtRule from './atrule';\nimport DetachedRuleset from './detached-ruleset';\nimport Operation from './operation';\nimport Dimension from './dimension';\nimport Unit from './unit';\nimport Keyword from './keyword';\nimport Variable from './variable';\nimport Property from './property';\nimport Ruleset from './ruleset';\nimport Element from './element';\nimport Attribute from './attribute';\nimport Combinator from './combinator';\nimport Selector from './selector';\nimport Quoted from './quoted';\nimport Expression from './expression';\nimport Declaration from './declaration';\nimport Call from './call';\nimport URL from './url';\nimport Import from './import';\nimport Comment from './comment';\nimport Anonymous from './anonymous';\nimport Value from './value';\nimport JavaScript from './javascript';\nimport Assignment from './assignment';\nimport Condition from './condition';\nimport Paren from './paren';\nimport Media from './media';\nimport UnicodeDescriptor from './unicode-descriptor';\nimport Negative from './negative';\nimport Extend from './extend';\nimport VariableCall from './variable-call';\nimport NamespaceValue from './namespace-value';\n\n// mixins\nimport MixinCall from './mixin-call';\nimport MixinDefinition from './mixin-definition';\n\nexport default {\n Node, Color, AtRule, DetachedRuleset, Operation,\n Dimension, Unit, Keyword, Variable, Property,\n Ruleset, Element, Attribute, Combinator, Selector,\n Quoted, Expression, Declaration, Call, URL, Import,\n Comment, Anonymous, Value, JavaScript, Assignment,\n Condition, Paren, Media, UnicodeDescriptor, Negative,\n Extend, VariableCall, NamespaceValue,\n mixin: {\n Call: MixinCall,\n Definition: MixinDefinition\n }\n};","class AbstractFileManager {\n getPath(filename) {\n let j = filename.lastIndexOf('?');\n if (j > 0) {\n filename = filename.slice(0, j);\n }\n j = filename.lastIndexOf('/');\n if (j < 0) {\n j = filename.lastIndexOf('\\\\');\n }\n if (j < 0) {\n return '';\n }\n return filename.slice(0, j + 1);\n }\n\n tryAppendExtension(path, ext) {\n return /(\\.[a-z]*$)|([\\?;].*)$/.test(path) ? path : path + ext;\n }\n\n tryAppendLessExtension(path) {\n return this.tryAppendExtension(path, '.less');\n }\n\n supportsSync() {\n return false;\n }\n\n alwaysMakePathsAbsolute() {\n return false;\n }\n\n isPathAbsolute(filename) {\n return (/^(?:[a-z-]+:|\\/|\\\\|#)/i).test(filename);\n }\n\n // TODO: pull out / replace?\n join(basePath, laterPath) {\n if (!basePath) {\n return laterPath;\n }\n return basePath + laterPath;\n }\n\n pathDiff(url, baseUrl) {\n // diff between two paths to create a relative path\n\n const urlParts = this.extractUrlParts(url);\n\n const baseUrlParts = this.extractUrlParts(baseUrl);\n let i;\n let max;\n let urlDirectories;\n let baseUrlDirectories;\n let diff = '';\n if (urlParts.hostPart !== baseUrlParts.hostPart) {\n return '';\n }\n max = Math.max(baseUrlParts.directories.length, urlParts.directories.length);\n for (i = 0; i < max; i++) {\n if (baseUrlParts.directories[i] !== urlParts.directories[i]) { break; }\n }\n baseUrlDirectories = baseUrlParts.directories.slice(i);\n urlDirectories = urlParts.directories.slice(i);\n for (i = 0; i < baseUrlDirectories.length - 1; i++) {\n diff += '../';\n }\n for (i = 0; i < urlDirectories.length - 1; i++) {\n diff += `${urlDirectories[i]}/`;\n }\n return diff;\n }\n\n // helper function, not part of API\n extractUrlParts(url, baseUrl) {\n // urlParts[1] = protocol://hostname/ OR /\n // urlParts[2] = / if path relative to host base\n // urlParts[3] = directories\n // urlParts[4] = filename\n // urlParts[5] = parameters\n\n const urlPartsRegex = /^((?:[a-z-]+:)?\\/{2}(?:[^\\/\\?#]*\\/)|([\\/\\\\]))?((?:[^\\/\\\\\\?#]*[\\/\\\\])*)([^\\/\\\\\\?#]*)([#\\?].*)?$/i;\n\n const urlParts = url.match(urlPartsRegex);\n const returner = {};\n let rawDirectories = [];\n const directories = [];\n let i;\n let baseUrlParts;\n\n if (!urlParts) {\n throw new Error(`Could not parse sheet href - '${url}'`);\n }\n\n // Stylesheets in IE don't always return the full path\n if (baseUrl && (!urlParts[1] || urlParts[2])) {\n baseUrlParts = baseUrl.match(urlPartsRegex);\n if (!baseUrlParts) {\n throw new Error(`Could not parse page url - '${baseUrl}'`);\n }\n urlParts[1] = urlParts[1] || baseUrlParts[1] || '';\n if (!urlParts[2]) {\n urlParts[3] = baseUrlParts[3] + urlParts[3];\n }\n }\n\n if (urlParts[3]) {\n rawDirectories = urlParts[3].replace(/\\\\/g, '/').split('/');\n\n // collapse '..' and skip '.'\n for (i = 0; i < rawDirectories.length; i++) {\n\n if (rawDirectories[i] === '..') {\n directories.pop();\n }\n else if (rawDirectories[i] !== '.') {\n directories.push(rawDirectories[i]);\n }\n \n }\n }\n\n returner.hostPart = urlParts[1];\n returner.directories = directories;\n returner.rawPath = (urlParts[1] || '') + rawDirectories.join('/');\n returner.path = (urlParts[1] || '') + directories.join('/');\n returner.filename = urlParts[4];\n returner.fileUrl = returner.path + (urlParts[4] || '');\n returner.url = returner.fileUrl + (urlParts[5] || '');\n return returner;\n }\n}\n\nexport default AbstractFileManager;\n","import functionRegistry from '../functions/function-registry';\nimport LessError from '../less-error';\n\nclass AbstractPluginLoader {\n constructor() {\n // Implemented by Node.js plugin loader\n this.require = function() {\n return null;\n }\n }\n\n evalPlugin(contents, context, imports, pluginOptions, fileInfo) {\n\n let loader, registry, pluginObj, localModule, pluginManager, filename, result;\n\n pluginManager = context.pluginManager;\n\n if (fileInfo) {\n if (typeof fileInfo === 'string') {\n filename = fileInfo;\n }\n else {\n filename = fileInfo.filename;\n }\n }\n const shortname = (new this.less.FileManager()).extractUrlParts(filename).filename;\n\n if (filename) {\n pluginObj = pluginManager.get(filename);\n\n if (pluginObj) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imports, filename);\n }\n return pluginObj;\n }\n }\n localModule = {\n exports: {},\n pluginManager,\n fileInfo\n };\n registry = functionRegistry.create();\n\n const registerPlugin = function(obj) {\n pluginObj = obj;\n };\n\n try {\n loader = new Function('module', 'require', 'registerPlugin', 'functions', 'tree', 'less', 'fileInfo', contents);\n loader(localModule, this.require(filename), registerPlugin, registry, this.less.tree, this.less, fileInfo);\n }\n catch (e) {\n return new LessError(e, imports, filename);\n }\n\n if (!pluginObj) {\n pluginObj = localModule.exports;\n }\n pluginObj = this.validatePlugin(pluginObj, filename, shortname);\n\n if (pluginObj instanceof LessError) {\n return pluginObj;\n }\n\n if (pluginObj) {\n pluginObj.imports = imports;\n pluginObj.filename = filename;\n\n // For < 3.x (or unspecified minVersion) - setOptions() before install()\n if (!pluginObj.minVersion || this.compareVersion('3.0.0', pluginObj.minVersion) < 0) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n\n if (result) {\n return result;\n }\n }\n\n // Run on first load\n pluginManager.addPlugin(pluginObj, fileInfo.filename, registry);\n pluginObj.functions = registry.getLocalFunctions();\n\n // Need to call setOptions again because the pluginObj might have functions\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n\n // Run every @plugin call\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imports, filename);\n }\n\n }\n else {\n return new LessError({ message: 'Not a valid plugin' }, imports, filename);\n }\n\n return pluginObj;\n\n }\n\n trySetOptions(plugin, filename, name, options) {\n if (options && !plugin.setOptions) {\n return new LessError({\n message: `Options have been provided but the plugin ${name} does not support any options.`\n });\n }\n try {\n plugin.setOptions && plugin.setOptions(options);\n }\n catch (e) {\n return new LessError(e);\n }\n }\n\n validatePlugin(plugin, filename, name) {\n if (plugin) {\n // support plugins being a function\n // so that the plugin can be more usable programmatically\n if (typeof plugin === 'function') {\n plugin = new plugin();\n }\n\n if (plugin.minVersion) {\n if (this.compareVersion(plugin.minVersion, this.less.version) < 0) {\n return new LessError({\n message: `Plugin ${name} requires version ${this.versionToString(plugin.minVersion)}`\n });\n }\n }\n return plugin;\n }\n return null;\n }\n\n compareVersion(aVersion, bVersion) {\n if (typeof aVersion === 'string') {\n aVersion = aVersion.match(/^(\\d+)\\.?(\\d+)?\\.?(\\d+)?/);\n aVersion.shift();\n }\n for (let i = 0; i < aVersion.length; i++) {\n if (aVersion[i] !== bVersion[i]) {\n return parseInt(aVersion[i]) > parseInt(bVersion[i]) ? -1 : 1;\n }\n }\n return 0;\n }\n\n versionToString(version) {\n let versionString = '';\n for (let i = 0; i < version.length; i++) {\n versionString += (versionString ? '.' : '') + version[i];\n }\n return versionString;\n }\n\n printUsage(plugins) {\n for (let i = 0; i < plugins.length; i++) {\n const plugin = plugins[i];\n if (plugin.printUsage) {\n plugin.printUsage();\n }\n }\n }\n}\n\nexport default AbstractPluginLoader;\n\n","import tree from '../tree';\n\nconst _visitArgs = { visitDeeper: true };\nlet _hasIndexed = false;\n\nfunction _noop(node) {\n return node;\n}\n\nfunction indexNodeTypes(parent, ticker) {\n // add .typeIndex to tree node types for lookup table\n let key, child;\n for (key in parent) { \n /* eslint guard-for-in: 0 */\n child = parent[key];\n switch (typeof child) {\n case 'function':\n // ignore bound functions directly on tree which do not have a prototype\n // or aren't nodes\n if (child.prototype && child.prototype.type) {\n child.prototype.typeIndex = ticker++;\n }\n break;\n case 'object':\n ticker = indexNodeTypes(child, ticker);\n break;\n \n }\n }\n return ticker;\n}\n\nclass Visitor {\n constructor(implementation) {\n this._implementation = implementation;\n this._visitInCache = {};\n this._visitOutCache = {};\n\n if (!_hasIndexed) {\n indexNodeTypes(tree, 1);\n _hasIndexed = true;\n }\n }\n\n visit(node) {\n if (!node) {\n return node;\n }\n\n const nodeTypeIndex = node.typeIndex;\n if (!nodeTypeIndex) {\n // MixinCall args aren't a node type?\n if (node.value && node.value.typeIndex) {\n this.visit(node.value);\n }\n return node;\n }\n\n const impl = this._implementation;\n let func = this._visitInCache[nodeTypeIndex];\n let funcOut = this._visitOutCache[nodeTypeIndex];\n const visitArgs = _visitArgs;\n let fnName;\n\n visitArgs.visitDeeper = true;\n\n if (!func) {\n fnName = `visit${node.type}`;\n func = impl[fnName] || _noop;\n funcOut = impl[`${fnName}Out`] || _noop;\n this._visitInCache[nodeTypeIndex] = func;\n this._visitOutCache[nodeTypeIndex] = funcOut;\n }\n\n if (func !== _noop) {\n const newNode = func.call(impl, node, visitArgs);\n if (node && impl.isReplacing) {\n node = newNode;\n }\n }\n\n if (visitArgs.visitDeeper && node) {\n if (node.length) {\n for (let i = 0, cnt = node.length; i < cnt; i++) {\n if (node[i].accept) {\n node[i].accept(this);\n }\n }\n } else if (node.accept) {\n node.accept(this);\n }\n }\n\n if (funcOut != _noop) {\n funcOut.call(impl, node);\n }\n\n return node;\n }\n\n visitArray(nodes, nonReplacing) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.length;\n let i;\n\n // Non-replacing\n if (nonReplacing || !this._implementation.isReplacing) {\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n // Replacing\n const out = [];\n for (i = 0; i < cnt; i++) {\n const evald = this.visit(nodes[i]);\n if (evald === undefined) { continue; }\n if (!evald.splice) {\n out.push(evald);\n } else if (evald.length) {\n this.flatten(evald, out);\n }\n }\n return out;\n }\n\n flatten(arr, out) {\n if (!out) {\n out = [];\n }\n\n let cnt, i, item, nestedCnt, j, nestedItem;\n\n for (i = 0, cnt = arr.length; i < cnt; i++) {\n item = arr[i];\n if (item === undefined) {\n continue;\n }\n if (!item.splice) {\n out.push(item);\n continue;\n }\n\n for (j = 0, nestedCnt = item.length; j < nestedCnt; j++) {\n nestedItem = item[j];\n if (nestedItem === undefined) {\n continue;\n }\n if (!nestedItem.splice) {\n out.push(nestedItem);\n } else if (nestedItem.length) {\n this.flatten(nestedItem, out);\n }\n }\n }\n\n return out;\n }\n}\n\nexport default Visitor;\n","class ImportSequencer {\n constructor(onSequencerEmpty) {\n this.imports = [];\n this.variableImports = [];\n this._onSequencerEmpty = onSequencerEmpty;\n this._currentDepth = 0;\n }\n\n addImport(callback) {\n const importSequencer = this,\n importItem = {\n callback,\n args: null,\n isReady: false\n };\n this.imports.push(importItem);\n return function() {\n importItem.args = Array.prototype.slice.call(arguments, 0);\n importItem.isReady = true;\n importSequencer.tryRun();\n };\n }\n\n addVariableImport(callback) {\n this.variableImports.push(callback);\n }\n\n tryRun() {\n this._currentDepth++;\n try {\n while (true) {\n while (this.imports.length > 0) {\n const importItem = this.imports[0];\n if (!importItem.isReady) {\n return;\n }\n this.imports = this.imports.slice(1);\n importItem.callback.apply(null, importItem.args);\n }\n if (this.variableImports.length === 0) {\n break;\n }\n const variableImport = this.variableImports[0];\n this.variableImports = this.variableImports.slice(1);\n variableImport();\n }\n } finally {\n this._currentDepth--;\n }\n if (this._currentDepth === 0 && this._onSequencerEmpty) {\n this._onSequencerEmpty();\n }\n }\n}\n\nexport default ImportSequencer;\n","import contexts from '../contexts';\nimport Visitor from './visitor';\nimport ImportSequencer from './import-sequencer';\nimport * as utils from '../utils';\n\nconst ImportVisitor = function(importer, finish) {\n\n this._visitor = new Visitor(this);\n this._importer = importer;\n this._finish = finish;\n this.context = new contexts.Eval();\n this.importCount = 0;\n this.onceFileDetectionMap = {};\n this.recursionDetector = {};\n this._sequencer = new ImportSequencer(this._onSequencerEmpty.bind(this));\n};\n\nImportVisitor.prototype = {\n isReplacing: false,\n run: function (root) {\n try {\n // process the contents\n this._visitor.visit(root);\n }\n catch (e) {\n this.error = e;\n }\n\n this.isFinished = true;\n this._sequencer.tryRun();\n },\n _onSequencerEmpty: function() {\n if (!this.isFinished) {\n return;\n }\n this._finish(this.error);\n },\n visitImport: function (importNode, visitArgs) {\n const inlineCSS = importNode.options.inline;\n\n if (!importNode.css || inlineCSS) {\n\n const context = new contexts.Eval(this.context, utils.copyArray(this.context.frames));\n const importParent = context.frames[0];\n\n this.importCount++;\n if (importNode.isVariableImport()) {\n this._sequencer.addVariableImport(this.processImportNode.bind(this, importNode, context, importParent));\n } else {\n this.processImportNode(importNode, context, importParent);\n }\n }\n visitArgs.visitDeeper = false;\n },\n processImportNode: function(importNode, context, importParent) {\n let evaldImportNode;\n const inlineCSS = importNode.options.inline;\n\n try {\n evaldImportNode = importNode.evalForImport(context);\n } catch (e) {\n if (!e.filename) { e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename; }\n // attempt to eval properly and treat as css\n importNode.css = true;\n // if that fails, this error will be thrown\n importNode.error = e;\n }\n\n if (evaldImportNode && (!evaldImportNode.css || inlineCSS)) {\n\n if (evaldImportNode.options.multiple) {\n context.importMultiple = true;\n }\n\n // try appending if we haven't determined if it is css or not\n const tryAppendLessExtension = evaldImportNode.css === undefined;\n\n for (let i = 0; i < importParent.rules.length; i++) {\n if (importParent.rules[i] === importNode) {\n importParent.rules[i] = evaldImportNode;\n break;\n }\n }\n\n const onImported = this.onImported.bind(this, evaldImportNode, context), sequencedOnImported = this._sequencer.addImport(onImported);\n\n this._importer.push(evaldImportNode.getPath(), tryAppendLessExtension, evaldImportNode.fileInfo(),\n evaldImportNode.options, sequencedOnImported);\n } else {\n this.importCount--;\n if (this.isFinished) {\n this._sequencer.tryRun();\n }\n }\n },\n onImported: function (importNode, context, e, root, importedAtRoot, fullPath) {\n if (e) {\n if (!e.filename) {\n e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename;\n }\n this.error = e;\n }\n\n const importVisitor = this, inlineCSS = importNode.options.inline, isPlugin = importNode.options.isPlugin, isOptional = importNode.options.optional, duplicateImport = importedAtRoot || fullPath in importVisitor.recursionDetector;\n\n if (!context.importMultiple) {\n if (duplicateImport) {\n importNode.skip = true;\n } else {\n importNode.skip = function() {\n if (fullPath in importVisitor.onceFileDetectionMap) {\n return true;\n }\n importVisitor.onceFileDetectionMap[fullPath] = true;\n return false;\n };\n }\n }\n\n if (!fullPath && isOptional) {\n importNode.skip = true;\n }\n\n if (root) {\n importNode.root = root;\n importNode.importedFilename = fullPath;\n\n if (!inlineCSS && !isPlugin && (context.importMultiple || !duplicateImport)) {\n importVisitor.recursionDetector[fullPath] = true;\n\n const oldContext = this.context;\n this.context = context;\n try {\n this._visitor.visit(root);\n } catch (e) {\n this.error = e;\n }\n this.context = oldContext;\n }\n }\n\n importVisitor.importCount--;\n\n if (importVisitor.isFinished) {\n importVisitor._sequencer.tryRun();\n }\n },\n visitDeclaration: function (declNode, visitArgs) {\n if (declNode.value.type === 'DetachedRuleset') {\n this.context.frames.unshift(declNode);\n } else {\n visitArgs.visitDeeper = false;\n }\n },\n visitDeclarationOut: function(declNode) {\n if (declNode.value.type === 'DetachedRuleset') {\n this.context.frames.shift();\n }\n },\n visitAtRule: function (atRuleNode, visitArgs) {\n this.context.frames.unshift(atRuleNode);\n },\n visitAtRuleOut: function (atRuleNode) {\n this.context.frames.shift();\n },\n visitMixinDefinition: function (mixinDefinitionNode, visitArgs) {\n this.context.frames.unshift(mixinDefinitionNode);\n },\n visitMixinDefinitionOut: function (mixinDefinitionNode) {\n this.context.frames.shift();\n },\n visitRuleset: function (rulesetNode, visitArgs) {\n this.context.frames.unshift(rulesetNode);\n },\n visitRulesetOut: function (rulesetNode) {\n this.context.frames.shift();\n },\n visitMedia: function (mediaNode, visitArgs) {\n this.context.frames.unshift(mediaNode.rules[0]);\n },\n visitMediaOut: function (mediaNode) {\n this.context.frames.shift();\n }\n};\nexport default ImportVisitor;\n","class SetTreeVisibilityVisitor {\n constructor(visible) {\n this.visible = visible;\n }\n\n run(root) {\n this.visit(root);\n }\n\n visitArray(nodes) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.length;\n let i;\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n visit(node) {\n if (!node) {\n return node;\n }\n if (node.constructor === Array) {\n return this.visitArray(node);\n }\n\n if (!node.blocksVisibility || node.blocksVisibility()) {\n return node;\n }\n if (this.visible) {\n node.ensureVisibility();\n } else {\n node.ensureInvisibility();\n }\n\n node.accept(this);\n return node;\n }\n}\n\nexport default SetTreeVisibilityVisitor;","import tree from '../tree';\nimport Visitor from './visitor';\nimport logger from '../logger';\nimport * as utils from '../utils';\n\n/* jshint loopfunc:true */\n\nclass ExtendFinderVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n this.contexts = [];\n this.allExtendsStack = [[]];\n }\n\n run(root) {\n root = this._visitor.visit(root);\n root.allExtends = this.allExtendsStack[0];\n return root;\n }\n\n visitDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n\n let i;\n let j;\n let extend;\n const allSelectorsExtendList = [];\n let extendList;\n\n // get &:extend(.a); rules which apply to all selectors in this ruleset\n const rules = rulesetNode.rules, ruleCnt = rules ? rules.length : 0;\n for (i = 0; i < ruleCnt; i++) {\n if (rulesetNode.rules[i] instanceof tree.Extend) {\n allSelectorsExtendList.push(rules[i]);\n rulesetNode.extendOnEveryPath = true;\n }\n }\n\n // now find every selector and apply the extends that apply to all extends\n // and the ones which apply to an individual extend\n const paths = rulesetNode.paths;\n for (i = 0; i < paths.length; i++) {\n const selectorPath = paths[i], selector = selectorPath[selectorPath.length - 1], selExtendList = selector.extendList;\n\n extendList = selExtendList ? utils.copyArray(selExtendList).concat(allSelectorsExtendList)\n : allSelectorsExtendList;\n\n if (extendList) {\n extendList = extendList.map(function(allSelectorsExtend) {\n return allSelectorsExtend.clone();\n });\n }\n\n for (j = 0; j < extendList.length; j++) {\n this.foundExtends = true;\n extend = extendList[j];\n extend.findSelfSelectors(selectorPath);\n extend.ruleset = rulesetNode;\n if (j === 0) { extend.firstExtendOnThisSelectorPath = true; }\n this.allExtendsStack[this.allExtendsStack.length - 1].push(extend);\n }\n }\n\n this.contexts.push(rulesetNode.selectors);\n }\n\n visitRulesetOut(rulesetNode) {\n if (!rulesetNode.root) {\n this.contexts.length = this.contexts.length - 1;\n }\n }\n\n visitMedia(mediaNode, visitArgs) {\n mediaNode.allExtends = [];\n this.allExtendsStack.push(mediaNode.allExtends);\n }\n\n visitMediaOut(mediaNode) {\n this.allExtendsStack.length = this.allExtendsStack.length - 1;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n atRuleNode.allExtends = [];\n this.allExtendsStack.push(atRuleNode.allExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n this.allExtendsStack.length = this.allExtendsStack.length - 1;\n }\n}\n\nclass ProcessExtendsVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n }\n\n run(root) {\n const extendFinder = new ExtendFinderVisitor();\n this.extendIndices = {};\n extendFinder.run(root);\n if (!extendFinder.foundExtends) { return root; }\n root.allExtends = root.allExtends.concat(this.doExtendChaining(root.allExtends, root.allExtends));\n this.allExtendsStack = [root.allExtends];\n const newRoot = this._visitor.visit(root);\n this.checkExtendsForNonMatched(root.allExtends);\n return newRoot;\n }\n\n checkExtendsForNonMatched(extendList) {\n const indices = this.extendIndices;\n extendList.filter(function(extend) {\n return !extend.hasFoundMatches && extend.parent_ids.length == 1;\n }).forEach(function(extend) {\n let selector = '_unknown_';\n try {\n selector = extend.selector.toCSS({});\n }\n catch (_) {}\n\n if (!indices[`${extend.index} ${selector}`]) {\n indices[`${extend.index} ${selector}`] = true;\n logger.warn(`extend '${selector}' has no matches`);\n }\n });\n }\n\n doExtendChaining(extendsList, extendsListTarget, iterationCount) {\n //\n // chaining is different from normal extension.. if we extend an extend then we are not just copying, altering\n // and pasting the selector we would do normally, but we are also adding an extend with the same target selector\n // this means this new extend can then go and alter other extends\n //\n // this method deals with all the chaining work - without it, extend is flat and doesn't work on other extend selectors\n // this is also the most expensive.. and a match on one selector can cause an extension of a selector we had already\n // processed if we look at each selector at a time, as is done in visitRuleset\n\n let extendIndex;\n\n let targetExtendIndex;\n let matches;\n const extendsToAdd = [];\n let newSelector;\n const extendVisitor = this;\n let selectorPath;\n let extend;\n let targetExtend;\n let newExtend;\n\n iterationCount = iterationCount || 0;\n\n // loop through comparing every extend with every target extend.\n // a target extend is the one on the ruleset we are looking at copy/edit/pasting in place\n // e.g. .a:extend(.b) {} and .b:extend(.c) {} then the first extend extends the second one\n // and the second is the target.\n // the separation into two lists allows us to process a subset of chains with a bigger set, as is the\n // case when processing media queries\n for (extendIndex = 0; extendIndex < extendsList.length; extendIndex++) {\n for (targetExtendIndex = 0; targetExtendIndex < extendsListTarget.length; targetExtendIndex++) {\n\n extend = extendsList[extendIndex];\n targetExtend = extendsListTarget[targetExtendIndex];\n\n // look for circular references\n if ( extend.parent_ids.indexOf( targetExtend.object_id ) >= 0 ) { continue; }\n\n // find a match in the target extends self selector (the bit before :extend)\n selectorPath = [targetExtend.selfSelectors[0]];\n matches = extendVisitor.findMatch(extend, selectorPath);\n\n if (matches.length) {\n extend.hasFoundMatches = true;\n\n // we found a match, so for each self selector..\n extend.selfSelectors.forEach(function(selfSelector) {\n const info = targetExtend.visibilityInfo();\n\n // process the extend as usual\n newSelector = extendVisitor.extendSelector(matches, selectorPath, selfSelector, extend.isVisible());\n\n // but now we create a new extend from it\n newExtend = new(tree.Extend)(targetExtend.selector, targetExtend.option, 0, targetExtend.fileInfo(), info);\n newExtend.selfSelectors = newSelector;\n\n // add the extend onto the list of extends for that selector\n newSelector[newSelector.length - 1].extendList = [newExtend];\n\n // record that we need to add it.\n extendsToAdd.push(newExtend);\n newExtend.ruleset = targetExtend.ruleset;\n\n // remember its parents for circular references\n newExtend.parent_ids = newExtend.parent_ids.concat(targetExtend.parent_ids, extend.parent_ids);\n\n // only process the selector once.. if we have :extend(.a,.b) then multiple\n // extends will look at the same selector path, so when extending\n // we know that any others will be duplicates in terms of what is added to the css\n if (targetExtend.firstExtendOnThisSelectorPath) {\n newExtend.firstExtendOnThisSelectorPath = true;\n targetExtend.ruleset.paths.push(newSelector);\n }\n });\n }\n }\n }\n\n if (extendsToAdd.length) {\n // try to detect circular references to stop a stack overflow.\n // may no longer be needed.\n this.extendChainCount++;\n if (iterationCount > 100) {\n let selectorOne = '{unable to calculate}';\n let selectorTwo = '{unable to calculate}';\n try {\n selectorOne = extendsToAdd[0].selfSelectors[0].toCSS();\n selectorTwo = extendsToAdd[0].selector.toCSS();\n }\n catch (e) {}\n throw { message: `extend circular reference detected. One of the circular extends is currently:${selectorOne}:extend(${selectorTwo})`};\n }\n\n // now process the new extends on the existing rules so that we can handle a extending b extending c extending\n // d extending e...\n return extendsToAdd.concat(extendVisitor.doExtendChaining(extendsToAdd, extendsListTarget, iterationCount + 1));\n } else {\n return extendsToAdd;\n }\n }\n\n visitDeclaration(ruleNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitSelector(selectorNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n let matches;\n let pathIndex;\n let extendIndex;\n const allExtends = this.allExtendsStack[this.allExtendsStack.length - 1];\n const selectorsToAdd = [];\n const extendVisitor = this;\n let selectorPath;\n\n // look at each selector path in the ruleset, find any extend matches and then copy, find and replace\n\n for (extendIndex = 0; extendIndex < allExtends.length; extendIndex++) {\n for (pathIndex = 0; pathIndex < rulesetNode.paths.length; pathIndex++) {\n selectorPath = rulesetNode.paths[pathIndex];\n\n // extending extends happens initially, before the main pass\n if (rulesetNode.extendOnEveryPath) { continue; }\n const extendList = selectorPath[selectorPath.length - 1].extendList;\n if (extendList && extendList.length) { continue; }\n\n matches = this.findMatch(allExtends[extendIndex], selectorPath);\n\n if (matches.length) {\n allExtends[extendIndex].hasFoundMatches = true;\n\n allExtends[extendIndex].selfSelectors.forEach(function(selfSelector) {\n let extendedSelectors;\n extendedSelectors = extendVisitor.extendSelector(matches, selectorPath, selfSelector, allExtends[extendIndex].isVisible());\n selectorsToAdd.push(extendedSelectors);\n });\n }\n }\n }\n rulesetNode.paths = rulesetNode.paths.concat(selectorsToAdd);\n }\n\n findMatch(extend, haystackSelectorPath) {\n //\n // look through the haystack selector path to try and find the needle - extend.selector\n // returns an array of selector matches that can then be replaced\n //\n let haystackSelectorIndex;\n\n let hackstackSelector;\n let hackstackElementIndex;\n let haystackElement;\n let targetCombinator;\n let i;\n const extendVisitor = this;\n const needleElements = extend.selector.elements;\n const potentialMatches = [];\n let potentialMatch;\n const matches = [];\n\n // loop through the haystack elements\n for (haystackSelectorIndex = 0; haystackSelectorIndex < haystackSelectorPath.length; haystackSelectorIndex++) {\n hackstackSelector = haystackSelectorPath[haystackSelectorIndex];\n\n for (hackstackElementIndex = 0; hackstackElementIndex < hackstackSelector.elements.length; hackstackElementIndex++) {\n\n haystackElement = hackstackSelector.elements[hackstackElementIndex];\n\n // if we allow elements before our match we can add a potential match every time. otherwise only at the first element.\n if (extend.allowBefore || (haystackSelectorIndex === 0 && hackstackElementIndex === 0)) {\n potentialMatches.push({pathIndex: haystackSelectorIndex, index: hackstackElementIndex, matched: 0,\n initialCombinator: haystackElement.combinator});\n }\n\n for (i = 0; i < potentialMatches.length; i++) {\n potentialMatch = potentialMatches[i];\n\n // selectors add \" \" onto the first element. When we use & it joins the selectors together, but if we don't\n // then each selector in haystackSelectorPath has a space before it added in the toCSS phase. so we need to\n // work out what the resulting combinator will be\n targetCombinator = haystackElement.combinator.value;\n if (targetCombinator === '' && hackstackElementIndex === 0) {\n targetCombinator = ' ';\n }\n\n // if we don't match, null our match to indicate failure\n if (!extendVisitor.isElementValuesEqual(needleElements[potentialMatch.matched].value, haystackElement.value) ||\n (potentialMatch.matched > 0 && needleElements[potentialMatch.matched].combinator.value !== targetCombinator)) {\n potentialMatch = null;\n } else {\n potentialMatch.matched++;\n }\n\n // if we are still valid and have finished, test whether we have elements after and whether these are allowed\n if (potentialMatch) {\n potentialMatch.finished = potentialMatch.matched === needleElements.length;\n if (potentialMatch.finished &&\n (!extend.allowAfter &&\n (hackstackElementIndex + 1 < hackstackSelector.elements.length || haystackSelectorIndex + 1 < haystackSelectorPath.length))) {\n potentialMatch = null;\n }\n }\n // if null we remove, if not, we are still valid, so either push as a valid match or continue\n if (potentialMatch) {\n if (potentialMatch.finished) {\n potentialMatch.length = needleElements.length;\n potentialMatch.endPathIndex = haystackSelectorIndex;\n potentialMatch.endPathElementIndex = hackstackElementIndex + 1; // index after end of match\n potentialMatches.length = 0; // we don't allow matches to overlap, so start matching again\n matches.push(potentialMatch);\n }\n } else {\n potentialMatches.splice(i, 1);\n i--;\n }\n }\n }\n }\n return matches;\n }\n\n isElementValuesEqual(elementValue1, elementValue2) {\n if (typeof elementValue1 === 'string' || typeof elementValue2 === 'string') {\n return elementValue1 === elementValue2;\n }\n if (elementValue1 instanceof tree.Attribute) {\n if (elementValue1.op !== elementValue2.op || elementValue1.key !== elementValue2.key) {\n return false;\n }\n if (!elementValue1.value || !elementValue2.value) {\n if (elementValue1.value || elementValue2.value) {\n return false;\n }\n return true;\n }\n elementValue1 = elementValue1.value.value || elementValue1.value;\n elementValue2 = elementValue2.value.value || elementValue2.value;\n return elementValue1 === elementValue2;\n }\n elementValue1 = elementValue1.value;\n elementValue2 = elementValue2.value;\n if (elementValue1 instanceof tree.Selector) {\n if (!(elementValue2 instanceof tree.Selector) || elementValue1.elements.length !== elementValue2.elements.length) {\n return false;\n }\n for (let i = 0; i < elementValue1.elements.length; i++) {\n if (elementValue1.elements[i].combinator.value !== elementValue2.elements[i].combinator.value) {\n if (i !== 0 || (elementValue1.elements[i].combinator.value || ' ') !== (elementValue2.elements[i].combinator.value || ' ')) {\n return false;\n }\n }\n if (!this.isElementValuesEqual(elementValue1.elements[i].value, elementValue2.elements[i].value)) {\n return false;\n }\n }\n return true;\n }\n return false;\n }\n\n extendSelector(matches, selectorPath, replacementSelector, isVisible) {\n\n // for a set of matches, replace each match with the replacement selector\n\n let currentSelectorPathIndex = 0, currentSelectorPathElementIndex = 0, path = [], matchIndex, selector, firstElement, match, newElements;\n\n for (matchIndex = 0; matchIndex < matches.length; matchIndex++) {\n match = matches[matchIndex];\n selector = selectorPath[match.pathIndex];\n firstElement = new tree.Element(\n match.initialCombinator,\n replacementSelector.elements[0].value,\n replacementSelector.elements[0].isVariable,\n replacementSelector.elements[0].getIndex(),\n replacementSelector.elements[0].fileInfo()\n );\n\n if (match.pathIndex > currentSelectorPathIndex && currentSelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n\n newElements = selector.elements\n .slice(currentSelectorPathElementIndex, match.index)\n .concat([firstElement])\n .concat(replacementSelector.elements.slice(1));\n\n if (currentSelectorPathIndex === match.pathIndex && matchIndex > 0) {\n path[path.length - 1].elements =\n path[path.length - 1].elements.concat(newElements);\n } else {\n path = path.concat(selectorPath.slice(currentSelectorPathIndex, match.pathIndex));\n\n path.push(new tree.Selector(\n newElements\n ));\n }\n currentSelectorPathIndex = match.endPathIndex;\n currentSelectorPathElementIndex = match.endPathElementIndex;\n if (currentSelectorPathElementIndex >= selectorPath[currentSelectorPathIndex].elements.length) {\n currentSelectorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n }\n\n if (currentSelectorPathIndex < selectorPath.length && currentSelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathIndex++;\n }\n\n path = path.concat(selectorPath.slice(currentSelectorPathIndex, selectorPath.length));\n path = path.map(function (currentValue) {\n // we can re-use elements here, because the visibility property matters only for selectors\n const derived = currentValue.createDerived(currentValue.elements);\n if (isVisible) {\n derived.ensureVisibility();\n } else {\n derived.ensureInvisibility();\n }\n return derived;\n });\n return path;\n }\n\n visitMedia(mediaNode, visitArgs) {\n let newAllExtends = mediaNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, mediaNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitMediaOut(mediaNode) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStack.length = lastIndex;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n let newAllExtends = atRuleNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, atRuleNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStack.length = lastIndex;\n }\n}\n\nexport default ProcessExtendsVisitor;\n","import Visitor from './visitor';\n\nclass JoinSelectorVisitor {\n constructor() {\n this.contexts = [[]];\n this._visitor = new Visitor(this);\n }\n\n run(root) {\n return this._visitor.visit(root);\n }\n\n visitDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n const paths = [];\n let selectors;\n\n this.contexts.push(paths);\n\n if (!rulesetNode.root) {\n selectors = rulesetNode.selectors;\n if (selectors) {\n selectors = selectors.filter(function(selector) { return selector.getIsOutput(); });\n rulesetNode.selectors = selectors.length ? selectors : (selectors = null);\n if (selectors) { rulesetNode.joinSelectors(paths, context, selectors); }\n }\n if (!selectors) { rulesetNode.rules = null; }\n rulesetNode.paths = paths;\n }\n }\n\n visitRulesetOut(rulesetNode) {\n this.contexts.length = this.contexts.length - 1;\n }\n\n visitMedia(mediaNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n mediaNode.rules[0].root = (context.length === 0 || context[0].multiMedia);\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n if (atRuleNode.rules && atRuleNode.rules.length) {\n atRuleNode.rules[0].root = (atRuleNode.isRooted || context.length === 0 || null);\n }\n }\n}\n\nexport default JoinSelectorVisitor;\n","import tree from '../tree';\nimport Visitor from './visitor';\n\nclass CSSVisitorUtils {\n constructor(context) {\n this._visitor = new Visitor(this);\n this._context = context;\n }\n\n containsSilentNonBlockedChild(bodyRules) {\n let rule;\n if (!bodyRules) {\n return false;\n }\n for (let r = 0; r < bodyRules.length; r++) {\n rule = bodyRules[r];\n if (rule.isSilent && rule.isSilent(this._context) && !rule.blocksVisibility()) {\n // the atrule contains something that was referenced (likely by extend)\n // therefore it needs to be shown in output too\n return true;\n }\n }\n return false;\n }\n\n keepOnlyVisibleChilds(owner) {\n if (owner && owner.rules) {\n owner.rules = owner.rules.filter(thing => thing.isVisible());\n }\n }\n\n isEmpty(owner) {\n return (owner && owner.rules) \n ? (owner.rules.length === 0) : true;\n }\n\n hasVisibleSelector(rulesetNode) {\n return (rulesetNode && rulesetNode.paths)\n ? (rulesetNode.paths.length > 0) : false;\n }\n\n resolveVisibility(node, originalRules) {\n if (!node.blocksVisibility()) {\n if (this.isEmpty(node) && !this.containsSilentNonBlockedChild(originalRules)) {\n return ;\n }\n\n return node;\n }\n\n const compiledRulesBody = node.rules[0];\n this.keepOnlyVisibleChilds(compiledRulesBody);\n\n if (this.isEmpty(compiledRulesBody)) {\n return ;\n }\n\n node.ensureVisibility();\n node.removeVisibilityBlock();\n\n return node;\n }\n\n isVisibleRuleset(rulesetNode) {\n if (rulesetNode.firstRoot) {\n return true;\n }\n\n if (this.isEmpty(rulesetNode)) {\n return false;\n }\n\n if (!rulesetNode.root && !this.hasVisibleSelector(rulesetNode)) {\n return false;\n }\n\n return true;\n }\n}\n\nconst ToCSSVisitor = function(context) {\n this._visitor = new Visitor(this);\n this._context = context;\n this.utils = new CSSVisitorUtils(context);\n};\n\nToCSSVisitor.prototype = {\n isReplacing: true,\n run: function (root) {\n return this._visitor.visit(root);\n },\n\n visitDeclaration: function (declNode, visitArgs) {\n if (declNode.blocksVisibility() || declNode.variable) {\n return;\n }\n return declNode;\n },\n\n visitMixinDefinition: function (mixinNode, visitArgs) {\n // mixin definitions do not get eval'd - this means they keep state\n // so we have to clear that state here so it isn't used if toCSS is called twice\n mixinNode.frames = [];\n },\n\n visitExtend: function (extendNode, visitArgs) {\n },\n\n visitComment: function (commentNode, visitArgs) {\n if (commentNode.blocksVisibility() || commentNode.isSilent(this._context)) {\n return;\n }\n return commentNode;\n },\n\n visitMedia: function(mediaNode, visitArgs) {\n const originalRules = mediaNode.rules[0].rules;\n mediaNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n\n return this.utils.resolveVisibility(mediaNode, originalRules);\n },\n\n visitImport: function (importNode, visitArgs) {\n if (importNode.blocksVisibility()) {\n return ;\n }\n return importNode;\n },\n\n visitAtRule: function(atRuleNode, visitArgs) {\n if (atRuleNode.rules && atRuleNode.rules.length) {\n return this.visitAtRuleWithBody(atRuleNode, visitArgs);\n } else {\n return this.visitAtRuleWithoutBody(atRuleNode, visitArgs);\n }\n },\n\n visitAnonymous: function(anonymousNode, visitArgs) {\n if (!anonymousNode.blocksVisibility()) {\n anonymousNode.accept(this._visitor);\n return anonymousNode;\n }\n },\n\n visitAtRuleWithBody: function(atRuleNode, visitArgs) {\n // if there is only one nested ruleset and that one has no path, then it is\n // just fake ruleset\n function hasFakeRuleset(atRuleNode) {\n const bodyRules = atRuleNode.rules;\n return bodyRules.length === 1 && (!bodyRules[0].paths || bodyRules[0].paths.length === 0);\n }\n function getBodyRules(atRuleNode) {\n const nodeRules = atRuleNode.rules;\n if (hasFakeRuleset(atRuleNode)) {\n return nodeRules[0].rules;\n }\n\n return nodeRules;\n }\n // it is still true that it is only one ruleset in array\n // this is last such moment\n // process childs\n const originalRules = getBodyRules(atRuleNode);\n atRuleNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n\n if (!this.utils.isEmpty(atRuleNode)) {\n this._mergeRules(atRuleNode.rules[0].rules);\n }\n\n return this.utils.resolveVisibility(atRuleNode, originalRules);\n },\n\n visitAtRuleWithoutBody: function(atRuleNode, visitArgs) {\n if (atRuleNode.blocksVisibility()) {\n return;\n }\n\n if (atRuleNode.name === '@charset') {\n // Only output the debug info together with subsequent @charset definitions\n // a comment (or @media statement) before the actual @charset atrule would\n // be considered illegal css as it has to be on the first line\n if (this.charset) {\n if (atRuleNode.debugInfo) {\n const comment = new tree.Comment(`/* ${atRuleNode.toCSS(this._context).replace(/\\n/g, '')} */\\n`);\n comment.debugInfo = atRuleNode.debugInfo;\n return this._visitor.visit(comment);\n }\n return;\n }\n this.charset = true;\n }\n\n return atRuleNode;\n },\n\n checkValidNodes: function(rules, isRoot) {\n if (!rules) {\n return;\n }\n\n for (let i = 0; i < rules.length; i++) {\n const ruleNode = rules[i];\n if (isRoot && ruleNode instanceof tree.Declaration && !ruleNode.variable) {\n throw { message: 'Properties must be inside selector blocks. They cannot be in the root',\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n if (ruleNode instanceof tree.Call) {\n throw { message: `Function '${ruleNode.name}' did not return a root node`,\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n if (ruleNode.type && !ruleNode.allowRoot) {\n throw { message: `${ruleNode.type} node returned by a function is not valid here`,\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n }\n },\n\n visitRuleset: function (rulesetNode, visitArgs) {\n // at this point rulesets are nested into each other\n let rule;\n\n const rulesets = [];\n\n this.checkValidNodes(rulesetNode.rules, rulesetNode.firstRoot);\n\n if (!rulesetNode.root) {\n // remove invisible paths\n this._compileRulesetPaths(rulesetNode);\n\n // remove rulesets from this ruleset body and compile them separately\n const nodeRules = rulesetNode.rules;\n\n let nodeRuleCnt = nodeRules ? nodeRules.length : 0;\n for (let i = 0; i < nodeRuleCnt; ) {\n rule = nodeRules[i];\n if (rule && rule.rules) {\n // visit because we are moving them out from being a child\n rulesets.push(this._visitor.visit(rule));\n nodeRules.splice(i, 1);\n nodeRuleCnt--;\n continue;\n }\n i++;\n }\n // accept the visitor to remove rules and refactor itself\n // then we can decide nogw whether we want it or not\n // compile body\n if (nodeRuleCnt > 0) {\n rulesetNode.accept(this._visitor);\n } else {\n rulesetNode.rules = null;\n }\n visitArgs.visitDeeper = false;\n } else { // if (! rulesetNode.root) {\n rulesetNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n }\n\n if (rulesetNode.rules) {\n this._mergeRules(rulesetNode.rules);\n this._removeDuplicateRules(rulesetNode.rules);\n }\n\n // now decide whether we keep the ruleset\n if (this.utils.isVisibleRuleset(rulesetNode)) {\n rulesetNode.ensureVisibility();\n rulesets.splice(0, 0, rulesetNode);\n }\n\n if (rulesets.length === 1) {\n return rulesets[0];\n }\n return rulesets;\n },\n\n _compileRulesetPaths: function(rulesetNode) {\n if (rulesetNode.paths) {\n rulesetNode.paths = rulesetNode.paths\n .filter(p => {\n let i;\n if (p[0].elements[0].combinator.value === ' ') {\n p[0].elements[0].combinator = new(tree.Combinator)('');\n }\n for (i = 0; i < p.length; i++) {\n if (p[i].isVisible() && p[i].getIsOutput()) {\n return true;\n }\n }\n return false;\n });\n }\n },\n\n _removeDuplicateRules: function(rules) {\n if (!rules) { return; }\n\n // remove duplicates\n const ruleCache = {};\n\n let ruleList;\n let rule;\n let i;\n\n for (i = rules.length - 1; i >= 0 ; i--) {\n rule = rules[i];\n if (rule instanceof tree.Declaration) {\n if (!ruleCache[rule.name]) {\n ruleCache[rule.name] = rule;\n } else {\n ruleList = ruleCache[rule.name];\n if (ruleList instanceof tree.Declaration) {\n ruleList = ruleCache[rule.name] = [ruleCache[rule.name].toCSS(this._context)];\n }\n const ruleCSS = rule.toCSS(this._context);\n if (ruleList.indexOf(ruleCSS) !== -1) {\n rules.splice(i, 1);\n } else {\n ruleList.push(ruleCSS);\n }\n }\n }\n }\n },\n\n _mergeRules: function(rules) {\n if (!rules) {\n return; \n }\n\n const groups = {};\n const groupsArr = [];\n\n for (let i = 0; i < rules.length; i++) {\n const rule = rules[i];\n if (rule.merge) {\n const key = rule.name;\n groups[key] ? rules.splice(i--, 1) : \n groupsArr.push(groups[key] = []);\n groups[key].push(rule);\n }\n }\n\n groupsArr.forEach(group => {\n if (group.length > 0) {\n const result = group[0];\n let space = [];\n const comma = [new tree.Expression(space)];\n group.forEach(rule => {\n if ((rule.merge === '+') && (space.length > 0)) {\n comma.push(new tree.Expression(space = []));\n }\n space.push(rule.value);\n result.important = result.important || rule.important;\n });\n result.value = new tree.Value(comma);\n }\n });\n }\n};\n\nexport default ToCSSVisitor;\n","import Visitor from './visitor';\nimport ImportVisitor from './import-visitor';\nimport MarkVisibleSelectorsVisitor from './set-tree-visibility-visitor';\nimport ExtendVisitor from './extend-visitor';\nimport JoinSelectorVisitor from './join-selector-visitor';\nimport ToCSSVisitor from './to-css-visitor';\n\nexport default {\n Visitor,\n ImportVisitor,\n MarkVisibleSelectorsVisitor,\n ExtendVisitor,\n JoinSelectorVisitor,\n ToCSSVisitor\n};\n","import chunker from './chunker';\n\nexport default () => {\n let // Less input string\n input;\n\n let // current chunk\n j;\n\n const // holds state for backtracking\n saveStack = [];\n\n let // furthest index the parser has gone to\n furthest;\n\n let // if this is furthest we got to, this is the probably cause\n furthestPossibleErrorMessage;\n\n let // chunkified input\n chunks;\n\n let // current chunk\n current;\n\n let // index of current chunk, in `input`\n currentPos;\n\n const parserInput = {};\n const CHARCODE_SPACE = 32;\n const CHARCODE_TAB = 9;\n const CHARCODE_LF = 10;\n const CHARCODE_CR = 13;\n const CHARCODE_PLUS = 43;\n const CHARCODE_COMMA = 44;\n const CHARCODE_FORWARD_SLASH = 47;\n const CHARCODE_9 = 57;\n\n function skipWhitespace(length) {\n const oldi = parserInput.i;\n const oldj = j;\n const curr = parserInput.i - currentPos;\n const endIndex = parserInput.i + current.length - curr;\n const mem = (parserInput.i += length);\n const inp = input;\n let c;\n let nextChar;\n let comment;\n\n for (; parserInput.i < endIndex; parserInput.i++) {\n c = inp.charCodeAt(parserInput.i);\n\n if (parserInput.autoCommentAbsorb && c === CHARCODE_FORWARD_SLASH) {\n nextChar = inp.charAt(parserInput.i + 1);\n if (nextChar === '/') {\n comment = {index: parserInput.i, isLineComment: true};\n let nextNewLine = inp.indexOf('\\n', parserInput.i + 2);\n if (nextNewLine < 0) {\n nextNewLine = endIndex;\n }\n parserInput.i = nextNewLine;\n comment.text = inp.substr(comment.index, parserInput.i - comment.index);\n parserInput.commentStore.push(comment);\n continue;\n } else if (nextChar === '*') {\n const nextStarSlash = inp.indexOf('*/', parserInput.i + 2);\n if (nextStarSlash >= 0) {\n comment = {\n index: parserInput.i,\n text: inp.substr(parserInput.i, nextStarSlash + 2 - parserInput.i),\n isLineComment: false\n };\n parserInput.i += comment.text.length - 1;\n parserInput.commentStore.push(comment);\n continue;\n }\n }\n break;\n }\n\n if ((c !== CHARCODE_SPACE) && (c !== CHARCODE_LF) && (c !== CHARCODE_TAB) && (c !== CHARCODE_CR)) {\n break;\n }\n }\n\n current = current.slice(length + parserInput.i - mem + curr);\n currentPos = parserInput.i;\n\n if (!current.length) {\n if (j < chunks.length - 1) {\n current = chunks[++j];\n skipWhitespace(0); // skip space at the beginning of a chunk\n return true; // things changed\n }\n parserInput.finished = true;\n }\n\n return oldi !== parserInput.i || oldj !== j;\n }\n\n parserInput.save = () => {\n currentPos = parserInput.i;\n saveStack.push( { current, i: parserInput.i, j });\n };\n parserInput.restore = possibleErrorMessage => {\n\n if (parserInput.i > furthest || (parserInput.i === furthest && possibleErrorMessage && !furthestPossibleErrorMessage)) {\n furthest = parserInput.i;\n furthestPossibleErrorMessage = possibleErrorMessage;\n }\n const state = saveStack.pop();\n current = state.current;\n currentPos = parserInput.i = state.i;\n j = state.j;\n };\n parserInput.forget = () => {\n saveStack.pop();\n };\n parserInput.isWhitespace = offset => {\n const pos = parserInput.i + (offset || 0);\n const code = input.charCodeAt(pos);\n return (code === CHARCODE_SPACE || code === CHARCODE_CR || code === CHARCODE_TAB || code === CHARCODE_LF);\n };\n\n // Specialization of $(tok)\n parserInput.$re = tok => {\n if (parserInput.i > currentPos) {\n current = current.slice(parserInput.i - currentPos);\n currentPos = parserInput.i;\n }\n\n const m = tok.exec(current);\n if (!m) {\n return null;\n }\n\n skipWhitespace(m[0].length);\n if (typeof m === 'string') {\n return m;\n }\n\n return m.length === 1 ? m[0] : m;\n };\n\n parserInput.$char = tok => {\n if (input.charAt(parserInput.i) !== tok) {\n return null;\n }\n skipWhitespace(1);\n return tok;\n };\n\n parserInput.$str = tok => {\n const tokLength = tok.length;\n\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tokLength; i++) {\n if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n return null;\n }\n }\n\n skipWhitespace(tokLength);\n return tok;\n };\n\n parserInput.$quoted = loc => {\n const pos = loc || parserInput.i;\n const startChar = input.charAt(pos);\n\n if (startChar !== '\\'' && startChar !== '\"') {\n return;\n }\n const length = input.length;\n const currentPosition = pos;\n\n for (let i = 1; i + currentPosition < length; i++) {\n const nextChar = input.charAt(i + currentPosition);\n switch (nextChar) {\n case '\\\\':\n i++;\n continue;\n case '\\r':\n case '\\n':\n break;\n case startChar:\n const str = input.substr(currentPosition, i + 1);\n if (!loc && loc !== 0) {\n skipWhitespace(i + 1);\n return str\n }\n return [startChar, str];\n default:\n }\n }\n return null;\n };\n\n /**\n * Permissive parsing. Ignores everything except matching {} [] () and quotes\n * until matching token (outside of blocks)\n */\n parserInput.$parseUntil = tok => {\n let quote = '';\n let returnVal = null;\n let inComment = false;\n let blockDepth = 0;\n const blockStack = [];\n const parseGroups = [];\n const length = input.length;\n const startPos = parserInput.i;\n let lastPos = parserInput.i;\n let i = parserInput.i;\n let loop = true;\n let testChar;\n\n if (typeof tok === 'string') {\n testChar = char => char === tok\n } else {\n testChar = char => tok.test(char)\n }\n\n do {\n let prevChar;\n let nextChar = input.charAt(i);\n if (blockDepth === 0 && testChar(nextChar)) {\n returnVal = input.substr(lastPos, i - lastPos);\n if (returnVal) {\n parseGroups.push(returnVal);\n }\n else {\n parseGroups.push(' ');\n }\n returnVal = parseGroups;\n skipWhitespace(i - startPos);\n loop = false\n } else {\n if (inComment) {\n if (nextChar === '*' && \n input.charAt(i + 1) === '/') {\n i++;\n blockDepth--;\n inComment = false;\n }\n i++;\n continue;\n }\n switch (nextChar) {\n case '\\\\':\n i++;\n nextChar = input.charAt(i);\n parseGroups.push(input.substr(lastPos, i - lastPos + 1));\n lastPos = i + 1;\n break;\n case '/':\n if (input.charAt(i + 1) === '*') {\n i++;\n inComment = true;\n blockDepth++;\n }\n break;\n case '\\'':\n case '\"':\n quote = parserInput.$quoted(i);\n if (quote) {\n parseGroups.push(input.substr(lastPos, i - lastPos), quote);\n i += quote[1].length - 1;\n lastPos = i + 1;\n }\n else {\n skipWhitespace(i - startPos);\n returnVal = nextChar;\n loop = false;\n }\n break;\n case '{':\n blockStack.push('}');\n blockDepth++;\n break;\n case '(':\n blockStack.push(')');\n blockDepth++;\n break;\n case '[':\n blockStack.push(']');\n blockDepth++;\n break;\n case '}':\n case ')':\n case ']':\n const expected = blockStack.pop();\n if (nextChar === expected) {\n blockDepth--;\n } else {\n // move the parser to the error and return expected\n skipWhitespace(i - startPos);\n returnVal = expected;\n loop = false;\n }\n }\n i++;\n if (i > length) {\n loop = false;\n }\n }\n prevChar = nextChar;\n } while (loop);\n\n return returnVal ? returnVal : null;\n }\n\n parserInput.autoCommentAbsorb = true;\n parserInput.commentStore = [];\n parserInput.finished = false;\n\n // Same as $(), but don't change the state of the parser,\n // just return the match.\n parserInput.peek = tok => {\n if (typeof tok === 'string') {\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tok.length; i++) {\n if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n return false;\n }\n }\n return true;\n } else {\n return tok.test(current);\n }\n };\n\n // Specialization of peek()\n // TODO remove or change some currentChar calls to peekChar\n parserInput.peekChar = tok => input.charAt(parserInput.i) === tok;\n\n parserInput.currentChar = () => input.charAt(parserInput.i);\n\n parserInput.prevChar = () => input.charAt(parserInput.i - 1);\n\n parserInput.getInput = () => input;\n\n parserInput.peekNotNumeric = () => {\n const c = input.charCodeAt(parserInput.i);\n // Is the first char of the dimension 0-9, '.', '+' or '-'\n return (c > CHARCODE_9 || c < CHARCODE_PLUS) || c === CHARCODE_FORWARD_SLASH || c === CHARCODE_COMMA;\n };\n\n parserInput.start = (str, chunkInput, failFunction) => {\n input = str;\n parserInput.i = j = currentPos = furthest = 0;\n\n // chunking apparently makes things quicker (but my tests indicate\n // it might actually make things slower in node at least)\n // and it is a non-perfect parse - it can't recognise\n // unquoted urls, meaning it can't distinguish comments\n // meaning comments with quotes or {}() in them get 'counted'\n // and then lead to parse errors.\n // In addition if the chunking chunks in the wrong place we might\n // not be able to parse a parser statement in one go\n // this is officially deprecated but can be switched on via an option\n // in the case it causes too much performance issues.\n if (chunkInput) {\n chunks = chunker(str, failFunction);\n } else {\n chunks = [str];\n }\n\n current = chunks[0];\n\n skipWhitespace(0);\n };\n\n parserInput.end = () => {\n let message;\n const isFinished = parserInput.i >= input.length;\n\n if (parserInput.i < furthest) {\n message = furthestPossibleErrorMessage;\n parserInput.i = furthest;\n }\n return {\n isFinished,\n furthest: parserInput.i,\n furthestPossibleErrorMessage: message,\n furthestReachedEnd: parserInput.i >= input.length - 1,\n furthestChar: input[parserInput.i]\n };\n };\n\n return parserInput;\n};\n","// Split the input into chunks.\nexport default function (input, fail) {\n const len = input.length;\n let level = 0;\n let parenLevel = 0;\n let lastOpening;\n let lastOpeningParen;\n let lastMultiComment;\n let lastMultiCommentEndBrace;\n const chunks = [];\n let emitFrom = 0;\n let chunkerCurrentIndex;\n let currentChunkStartIndex;\n let cc;\n let cc2;\n let matched;\n\n function emitChunk(force) {\n const len = chunkerCurrentIndex - emitFrom;\n if (((len < 512) && !force) || !len) {\n return;\n }\n chunks.push(input.slice(emitFrom, chunkerCurrentIndex + 1));\n emitFrom = chunkerCurrentIndex + 1;\n }\n\n for (chunkerCurrentIndex = 0; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc = input.charCodeAt(chunkerCurrentIndex);\n if (((cc >= 97) && (cc <= 122)) || (cc < 34)) {\n // a-z or whitespace\n continue;\n }\n\n switch (cc) {\n case 40: // (\n parenLevel++;\n lastOpeningParen = chunkerCurrentIndex;\n continue;\n case 41: // )\n if (--parenLevel < 0) {\n return fail('missing opening `(`', chunkerCurrentIndex);\n }\n continue;\n case 59: // ;\n if (!parenLevel) { emitChunk(); }\n continue;\n case 123: // {\n level++;\n lastOpening = chunkerCurrentIndex;\n continue;\n case 125: // }\n if (--level < 0) {\n return fail('missing opening `{`', chunkerCurrentIndex);\n }\n if (!level && !parenLevel) { emitChunk(); }\n continue;\n case 92: // \\\n if (chunkerCurrentIndex < len - 1) { chunkerCurrentIndex++; continue; }\n return fail('unescaped `\\\\`', chunkerCurrentIndex);\n case 34:\n case 39:\n case 96: // \", ' and `\n matched = 0;\n currentChunkStartIndex = chunkerCurrentIndex;\n for (chunkerCurrentIndex = chunkerCurrentIndex + 1; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if (cc2 > 96) { continue; }\n if (cc2 == cc) { matched = 1; break; }\n if (cc2 == 92) { // \\\n if (chunkerCurrentIndex == len - 1) {\n return fail('unescaped `\\\\`', chunkerCurrentIndex);\n }\n chunkerCurrentIndex++;\n }\n }\n if (matched) { continue; }\n return fail(`unmatched \\`${String.fromCharCode(cc)}\\``, currentChunkStartIndex);\n case 47: // /, check for comment\n if (parenLevel || (chunkerCurrentIndex == len - 1)) { continue; }\n cc2 = input.charCodeAt(chunkerCurrentIndex + 1);\n if (cc2 == 47) {\n // //, find lnfeed\n for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if ((cc2 <= 13) && ((cc2 == 10) || (cc2 == 13))) { break; }\n }\n } else if (cc2 == 42) {\n // /*, find */\n lastMultiComment = currentChunkStartIndex = chunkerCurrentIndex;\n for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len - 1; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if (cc2 == 125) { lastMultiCommentEndBrace = chunkerCurrentIndex; }\n if (cc2 != 42) { continue; }\n if (input.charCodeAt(chunkerCurrentIndex + 1) == 47) { break; }\n }\n if (chunkerCurrentIndex == len - 1) {\n return fail('missing closing `*/`', currentChunkStartIndex);\n }\n chunkerCurrentIndex++;\n }\n continue;\n case 42: // *, check for unmatched */\n if ((chunkerCurrentIndex < len - 1) && (input.charCodeAt(chunkerCurrentIndex + 1) == 47)) {\n return fail('unmatched `/*`', chunkerCurrentIndex);\n }\n continue;\n }\n }\n\n if (level !== 0) {\n if ((lastMultiComment > lastOpening) && (lastMultiCommentEndBrace > lastMultiComment)) {\n return fail('missing closing `}` or `*/`', lastOpening);\n } else {\n return fail('missing closing `}`', lastOpening);\n }\n } else if (parenLevel !== 0) {\n return fail('missing closing `)`', lastOpeningParen);\n }\n\n emitChunk(true);\n return chunks;\n};\n","import LessError from '../less-error';\nimport tree from '../tree';\nimport visitors from '../visitors';\nimport getParserInput from './parser-input';\nimport * as utils from '../utils';\nimport functionRegistry from '../functions/function-registry';\n\n//\n// less.js - parser\n//\n// A relatively straight-forward predictive parser.\n// There is no tokenization/lexing stage, the input is parsed\n// in one sweep.\n//\n// To make the parser fast enough to run in the browser, several\n// optimization had to be made:\n//\n// - Matching and slicing on a huge input is often cause of slowdowns.\n// The solution is to chunkify the input into smaller strings.\n// The chunks are stored in the `chunks` var,\n// `j` holds the current chunk index, and `currentPos` holds\n// the index of the current chunk in relation to `input`.\n// This gives us an almost 4x speed-up.\n//\n// - In many cases, we don't need to match individual tokens;\n// for example, if a value doesn't hold any variables, operations\n// or dynamic references, the parser can effectively 'skip' it,\n// treating it as a literal.\n// An example would be '1px solid #000' - which evaluates to itself,\n// we don't need to know what the individual components are.\n// The drawback, of course is that you don't get the benefits of\n// syntax-checking on the CSS. This gives us a 50% speed-up in the parser,\n// and a smaller speed-up in the code-gen.\n//\n//\n// Token matching is done with the `$` function, which either takes\n// a terminal string or regexp, or a non-terminal function to call.\n// It also takes care of moving all the indices forwards.\n//\n\nconst Parser = function Parser(context, imports, fileInfo) {\n let parsers;\n const parserInput = getParserInput();\n\n function error(msg, type) {\n throw new LessError(\n {\n index: parserInput.i,\n filename: fileInfo.filename,\n type: type || 'Syntax',\n message: msg\n },\n imports\n );\n }\n\n function expect(arg, msg) {\n // some older browsers return typeof 'function' for RegExp\n const result = (arg instanceof Function) ? arg.call(parsers) : parserInput.$re(arg);\n if (result) {\n return result;\n }\n \n error(msg || (typeof arg === 'string'\n ? `expected '${arg}' got '${parserInput.currentChar()}'`\n : 'unexpected token'));\n }\n\n // Specialization of expect()\n function expectChar(arg, msg) {\n if (parserInput.$char(arg)) {\n return arg;\n }\n error(msg || `expected '${arg}' got '${parserInput.currentChar()}'`);\n }\n\n function getDebugInfo(index) {\n const filename = fileInfo.filename;\n\n return {\n lineNumber: utils.getLocation(index, parserInput.getInput()).line + 1,\n fileName: filename\n };\n }\n\n /**\n * Used after initial parsing to create nodes on the fly\n * \n * @param {String} str - string to parse \n * @param {Array} parseList - array of parsers to run input through e.g. [\"value\", \"important\"]\n * @param {Number} currentIndex - start number to begin indexing\n * @param {Object} fileInfo - fileInfo to attach to created nodes\n */\n function parseNode(str, parseList, currentIndex, fileInfo, callback) {\n let result;\n const returnNodes = [];\n const parser = parserInput;\n\n try {\n parser.start(str, false, function fail(msg, index) {\n callback({\n message: msg,\n index: index + currentIndex\n });\n });\n for (let x = 0, p, i; (p = parseList[x]); x++) {\n i = parser.i;\n result = parsers[p]();\n if (result) {\n try {\n result._index = i + currentIndex;\n result._fileInfo = fileInfo;\n } catch (e) {}\n returnNodes.push(result);\n }\n else {\n returnNodes.push(null);\n }\n }\n\n const endInfo = parser.end();\n if (endInfo.isFinished) {\n callback(null, returnNodes);\n }\n else {\n callback(true, null);\n }\n } catch (e) {\n throw new LessError({\n index: e.index + currentIndex,\n message: e.message\n }, imports, fileInfo.filename);\n }\n }\n\n //\n // The Parser\n //\n return {\n parserInput,\n imports,\n fileInfo,\n parseNode,\n //\n // Parse an input string into an abstract syntax tree,\n // @param str A string containing 'less' markup\n // @param callback call `callback` when done.\n // @param [additionalData] An optional map which can contains vars - a map (key, value) of variables to apply\n //\n parse: function (str, callback, additionalData) {\n let root;\n let error = null;\n let globalVars;\n let modifyVars;\n let ignored;\n let preText = '';\n\n globalVars = (additionalData && additionalData.globalVars) ? `${Parser.serializeVars(additionalData.globalVars)}\\n` : '';\n modifyVars = (additionalData && additionalData.modifyVars) ? `\\n${Parser.serializeVars(additionalData.modifyVars)}` : '';\n\n if (context.pluginManager) {\n const preProcessors = context.pluginManager.getPreProcessors();\n for (let i = 0; i < preProcessors.length; i++) {\n str = preProcessors[i].process(str, { context, imports, fileInfo });\n }\n }\n\n if (globalVars || (additionalData && additionalData.banner)) {\n preText = ((additionalData && additionalData.banner) ? additionalData.banner : '') + globalVars;\n ignored = imports.contentsIgnoredChars;\n ignored[fileInfo.filename] = ignored[fileInfo.filename] || 0;\n ignored[fileInfo.filename] += preText.length;\n }\n\n str = str.replace(/\\r\\n?/g, '\\n');\n // Remove potential UTF Byte Order Mark\n str = preText + str.replace(/^\\uFEFF/, '') + modifyVars;\n imports.contents[fileInfo.filename] = str;\n\n // Start with the primary rule.\n // The whole syntax tree is held under a Ruleset node,\n // with the `root` property set to true, so no `{}` are\n // output. The callback is called when the input is parsed.\n try {\n parserInput.start(str, context.chunkInput, function fail(msg, index) {\n throw new LessError({\n index,\n type: 'Parse',\n message: msg,\n filename: fileInfo.filename\n }, imports);\n });\n\n tree.Node.prototype.parse = this;\n root = new tree.Ruleset(null, this.parsers.primary());\n tree.Node.prototype.rootNode = root;\n root.root = true;\n root.firstRoot = true;\n root.functionRegistry = functionRegistry.inherit();\n \n } catch (e) {\n return callback(new LessError(e, imports, fileInfo.filename));\n }\n\n // If `i` is smaller than the `input.length - 1`,\n // it means the parser wasn't able to parse the whole\n // string, so we've got a parsing error.\n //\n // We try to extract a \\n delimited string,\n // showing the line where the parse error occurred.\n // We split it up into two parts (the part which parsed,\n // and the part which didn't), so we can color them differently.\n const endInfo = parserInput.end();\n if (!endInfo.isFinished) {\n\n let message = endInfo.furthestPossibleErrorMessage;\n\n if (!message) {\n message = 'Unrecognised input';\n if (endInfo.furthestChar === '}') {\n message += '. Possibly missing opening \\'{\\'';\n } else if (endInfo.furthestChar === ')') {\n message += '. Possibly missing opening \\'(\\'';\n } else if (endInfo.furthestReachedEnd) {\n message += '. Possibly missing something';\n }\n }\n\n error = new LessError({\n type: 'Parse',\n message,\n index: endInfo.furthest,\n filename: fileInfo.filename\n }, imports);\n }\n\n const finish = e => {\n e = error || e || imports.error;\n\n if (e) {\n if (!(e instanceof LessError)) {\n e = new LessError(e, imports, fileInfo.filename);\n }\n\n return callback(e);\n }\n else {\n return callback(null, root);\n }\n };\n\n if (context.processImports !== false) {\n new visitors.ImportVisitor(imports, finish)\n .run(root);\n } else {\n return finish();\n }\n },\n\n //\n // Here in, the parsing rules/functions\n //\n // The basic structure of the syntax tree generated is as follows:\n //\n // Ruleset -> Declaration -> Value -> Expression -> Entity\n //\n // Here's some Less code:\n //\n // .class {\n // color: #fff;\n // border: 1px solid #000;\n // width: @w + 4px;\n // > .child {...}\n // }\n //\n // And here's what the parse tree might look like:\n //\n // Ruleset (Selector '.class', [\n // Declaration (\"color\", Value ([Expression [Color #fff]]))\n // Declaration (\"border\", Value ([Expression [Dimension 1px][Keyword \"solid\"][Color #000]]))\n // Declaration (\"width\", Value ([Expression [Operation \" + \" [Variable \"@w\"][Dimension 4px]]]))\n // Ruleset (Selector [Element '>', '.child'], [...])\n // ])\n //\n // In general, most rules will try to parse a token with the `$re()` function, and if the return\n // value is truly, will return a new node, of the relevant type. Sometimes, we need to check\n // first, before parsing, that's when we use `peek()`.\n //\n parsers: parsers = {\n //\n // The `primary` rule is the *entry* and *exit* point of the parser.\n // The rules here can appear at any level of the parse tree.\n //\n // The recursive nature of the grammar is an interplay between the `block`\n // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule,\n // as represented by this simplified grammar:\n //\n // primary → (ruleset | declaration)+\n // ruleset → selector+ block\n // block → '{' primary '}'\n //\n // Only at one point is the primary rule not called from the\n // block rule: at the root level.\n //\n primary: function () {\n const mixin = this.mixin;\n let root = [];\n let node;\n\n while (true) {\n while (true) {\n node = this.comment();\n if (!node) { break; }\n root.push(node);\n }\n // always process comments before deciding if finished\n if (parserInput.finished) {\n break;\n }\n if (parserInput.peek('}')) {\n break;\n }\n\n node = this.extendRule();\n if (node) {\n root = root.concat(node);\n continue;\n }\n\n node = mixin.definition() || this.declaration() || mixin.call(false, false) || \n this.ruleset() || this.variableCall() || this.entities.call() || this.atrule();\n if (node) {\n root.push(node);\n } else {\n let foundSemiColon = false;\n while (parserInput.$char(';')) {\n foundSemiColon = true;\n }\n if (!foundSemiColon) {\n break;\n }\n }\n }\n\n return root;\n },\n\n // comments are collected by the main parsing mechanism and then assigned to nodes\n // where the current structure allows it\n comment: function () {\n if (parserInput.commentStore.length) {\n const comment = parserInput.commentStore.shift();\n return new(tree.Comment)(comment.text, comment.isLineComment, comment.index, fileInfo);\n }\n },\n\n //\n // Entities are tokens which can be found inside an Expression\n //\n entities: {\n mixinLookup: function() {\n return parsers.mixin.call(true, true);\n },\n //\n // A string, which supports escaping \" and '\n //\n // \"milky way\" 'he\\'s the one!'\n //\n quoted: function (forceEscaped) {\n let str;\n const index = parserInput.i;\n let isEscaped = false;\n\n parserInput.save();\n if (parserInput.$char('~')) {\n isEscaped = true;\n } else if (forceEscaped) {\n parserInput.restore();\n return;\n }\n\n str = parserInput.$quoted();\n if (!str) {\n parserInput.restore();\n return;\n }\n parserInput.forget();\n\n return new(tree.Quoted)(str.charAt(0), str.substr(1, str.length - 2), isEscaped, index, fileInfo);\n },\n\n //\n // A catch-all word, such as:\n //\n // black border-collapse\n //\n keyword: function () {\n const k = parserInput.$char('%') || parserInput.$re(/^\\[?(?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+\\]?/);\n if (k) {\n return tree.Color.fromKeyword(k) || new(tree.Keyword)(k);\n }\n },\n\n //\n // A function call\n //\n // rgb(255, 0, 255)\n //\n // The arguments are parsed with the `entities.arguments` parser.\n //\n call: function () {\n let name;\n let args;\n let func;\n const index = parserInput.i;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (parserInput.peek(/^url\\(/i)) {\n return;\n }\n\n parserInput.save();\n\n name = parserInput.$re(/^([\\w-]+|%|~|progid:[\\w\\.]+)\\(/);\n if (!name) {\n parserInput.forget(); \n return;\n }\n\n name = name[1];\n func = this.customFuncCall(name);\n if (func) {\n args = func.parse();\n if (args && func.stop) {\n parserInput.forget();\n return args;\n }\n }\n\n args = this.arguments(args);\n\n if (!parserInput.$char(')')) {\n parserInput.restore('Could not parse call arguments or missing \\')\\'');\n return;\n }\n\n parserInput.forget();\n\n return new(tree.Call)(name, args, index, fileInfo);\n },\n \n //\n // Parsing rules for functions with non-standard args, e.g.:\n //\n // boolean(not(2 > 1))\n //\n // This is a quick prototype, to be modified/improved when\n // more custom-parsed funcs come (e.g. `selector(...)`)\n //\n\n customFuncCall: function (name) {\n /* Ideally the table is to be moved out of here for faster perf.,\n but it's quite tricky since it relies on all these `parsers`\n and `expect` available only here */\n return {\n alpha: f(parsers.ieAlpha, true),\n boolean: f(condition),\n 'if': f(condition)\n }[name.toLowerCase()];\n\n function f(parse, stop) {\n return {\n parse, // parsing function\n stop // when true - stop after parse() and return its result, \n // otherwise continue for plain args\n };\n }\n \n function condition() {\n return [expect(parsers.condition, 'expected condition')];\n }\n },\n\n arguments: function (prevArgs) {\n let argsComma = prevArgs || [];\n const argsSemiColon = [];\n let isSemiColonSeparated;\n let value;\n\n parserInput.save();\n\n while (true) {\n if (prevArgs) {\n prevArgs = false;\n } else {\n value = parsers.detachedRuleset() || this.assignment() || parsers.expression();\n if (!value) {\n break;\n }\n\n if (value.value && value.value.length == 1) {\n value = value.value[0];\n }\n\n argsComma.push(value);\n }\n\n if (parserInput.$char(',')) {\n continue;\n }\n\n if (parserInput.$char(';') || isSemiColonSeparated) {\n isSemiColonSeparated = true;\n value = (argsComma.length < 1) ? argsComma[0]\n : new tree.Value(argsComma);\n argsSemiColon.push(value);\n argsComma = [];\n }\n }\n\n parserInput.forget();\n return isSemiColonSeparated ? argsSemiColon : argsComma;\n },\n literal: function () {\n return this.dimension() ||\n this.color() ||\n this.quoted() ||\n this.unicodeDescriptor();\n },\n\n // Assignments are argument entities for calls.\n // They are present in ie filter properties as shown below.\n //\n // filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* )\n //\n\n assignment: function () {\n let key;\n let value;\n parserInput.save();\n key = parserInput.$re(/^\\w+(?=\\s?=)/i);\n if (!key) {\n parserInput.restore();\n return;\n }\n if (!parserInput.$char('=')) {\n parserInput.restore();\n return;\n }\n value = parsers.entity();\n if (value) {\n parserInput.forget();\n return new(tree.Assignment)(key, value);\n } else {\n parserInput.restore();\n }\n },\n\n //\n // Parse url() tokens\n //\n // We use a specific rule for urls, because they don't really behave like\n // standard function calls. The difference is that the argument doesn't have\n // to be enclosed within a string, so it can't be parsed as an Expression.\n //\n url: function () {\n let value;\n const index = parserInput.i;\n\n parserInput.autoCommentAbsorb = false;\n\n if (!parserInput.$str('url(')) {\n parserInput.autoCommentAbsorb = true;\n return;\n }\n\n value = this.quoted() || this.variable() || this.property() ||\n parserInput.$re(/^(?:(?:\\\\[\\(\\)'\"])|[^\\(\\)'\"])+/) || '';\n\n parserInput.autoCommentAbsorb = true;\n\n expectChar(')');\n\n return new(tree.URL)((value.value != null || \n value instanceof tree.Variable || \n value instanceof tree.Property) ?\n value : new(tree.Anonymous)(value, index), index, fileInfo);\n },\n\n //\n // A Variable entity, such as `@fink`, in\n //\n // width: @fink + 2px\n //\n // We use a different parser for variable definitions,\n // see `parsers.variable`.\n //\n variable: function () {\n let ch;\n let name;\n const index = parserInput.i;\n\n parserInput.save();\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^@@?[\\w-]+/))) {\n ch = parserInput.currentChar();\n if (ch === '(' || ch === '[' && !parserInput.prevChar().match(/^\\s/)) {\n // this may be a VariableCall lookup\n const result = parsers.variableCall(name);\n if (result) {\n parserInput.forget();\n return result;\n }\n }\n parserInput.forget();\n return new(tree.Variable)(name, index, fileInfo);\n }\n parserInput.restore();\n },\n\n // A variable entity using the protective {} e.g. @{var}\n variableCurly: function () {\n let curly;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '@' && (curly = parserInput.$re(/^@\\{([\\w-]+)\\}/))) {\n return new(tree.Variable)(`@${curly[1]}`, index, fileInfo);\n }\n },\n //\n // A Property accessor, such as `$color`, in\n //\n // background-color: $color\n //\n property: function () {\n let name;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' && (name = parserInput.$re(/^\\$[\\w-]+/))) {\n return new(tree.Property)(name, index, fileInfo);\n }\n },\n\n // A property entity useing the protective {} e.g. ${prop}\n propertyCurly: function () {\n let curly;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' && (curly = parserInput.$re(/^\\$\\{([\\w-]+)\\}/))) {\n return new(tree.Property)(`$${curly[1]}`, index, fileInfo);\n }\n },\n //\n // A Hexadecimal color\n //\n // #4F3C2F\n //\n // `rgb` and `hsl` colors are parsed through the `entities.call` parser.\n //\n color: function () {\n let rgb;\n parserInput.save();\n\n if (parserInput.currentChar() === '#' && (rgb = parserInput.$re(/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})([\\w.#\\[])?/))) {\n if (!rgb[2]) {\n parserInput.forget();\n return new(tree.Color)(rgb[1], undefined, rgb[0]);\n } \n }\n parserInput.restore();\n },\n\n colorKeyword: function () {\n parserInput.save();\n const autoCommentAbsorb = parserInput.autoCommentAbsorb;\n parserInput.autoCommentAbsorb = false;\n const k = parserInput.$re(/^[_A-Za-z-][_A-Za-z0-9-]+/);\n parserInput.autoCommentAbsorb = autoCommentAbsorb;\n if (!k) {\n parserInput.forget();\n return;\n }\n parserInput.restore();\n const color = tree.Color.fromKeyword(k);\n if (color) {\n parserInput.$str(k);\n return color;\n }\n },\n\n //\n // A Dimension, that is, a number and a unit\n //\n // 0.5em 95%\n //\n dimension: function () {\n if (parserInput.peekNotNumeric()) {\n return;\n }\n\n const value = parserInput.$re(/^([+-]?\\d*\\.?\\d+)(%|[a-z_]+)?/i);\n if (value) {\n return new(tree.Dimension)(value[1], value[2]);\n }\n },\n\n //\n // A unicode descriptor, as is used in unicode-range\n //\n // U+0?? or U+00A1-00A9\n //\n unicodeDescriptor: function () {\n let ud;\n\n ud = parserInput.$re(/^U\\+[0-9a-fA-F?]+(\\-[0-9a-fA-F?]+)?/);\n if (ud) {\n return new(tree.UnicodeDescriptor)(ud[0]);\n }\n },\n\n //\n // JavaScript code to be evaluated\n //\n // `window.location.href`\n //\n javascript: function () {\n let js;\n const index = parserInput.i;\n\n parserInput.save();\n\n const escape = parserInput.$char('~');\n const jsQuote = parserInput.$char('`');\n\n if (!jsQuote) {\n parserInput.restore();\n return;\n }\n\n js = parserInput.$re(/^[^`]*`/);\n if (js) {\n parserInput.forget();\n return new(tree.JavaScript)(js.substr(0, js.length - 1), Boolean(escape), index, fileInfo);\n }\n parserInput.restore('invalid javascript definition');\n }\n },\n\n //\n // The variable part of a variable definition. Used in the `rule` parser\n //\n // @fink:\n //\n variable: function () {\n let name;\n\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^(@[\\w-]+)\\s*:/))) { return name[1]; }\n },\n\n //\n // Call a variable value to retrieve a detached ruleset\n // or a value from a detached ruleset's rules.\n //\n // @fink();\n // @fink;\n // color: @fink[@color];\n //\n variableCall: function (parsedName) {\n let lookups;\n const i = parserInput.i;\n const inValue = !!parsedName;\n let name = parsedName;\n\n parserInput.save();\n\n if (name || (parserInput.currentChar() === '@'\n && (name = parserInput.$re(/^(@[\\w-]+)(\\(\\s*\\))?/)))) {\n\n lookups = this.mixin.ruleLookups();\n\n if (!lookups && ((inValue && parserInput.$str('()') !== '()') || (name[2] !== '()'))) {\n parserInput.restore('Missing \\'[...]\\' lookup in variable call');\n return;\n }\n\n if (!inValue) {\n name = name[1];\n }\n\n const call = new tree.VariableCall(name, i, fileInfo);\n if (!inValue && parsers.end()) {\n parserInput.forget();\n return call;\n }\n else {\n parserInput.forget();\n return new tree.NamespaceValue(call, lookups, i, fileInfo);\n }\n }\n\n parserInput.restore();\n },\n\n //\n // extend syntax - used to extend selectors\n //\n extend: function(isRule) {\n let elements;\n let e;\n const index = parserInput.i;\n let option;\n let extendList;\n let extend;\n\n if (!parserInput.$str(isRule ? '&:extend(' : ':extend(')) {\n return;\n }\n\n do {\n option = null;\n elements = null;\n while (!(option = parserInput.$re(/^(all)(?=\\s*(\\)|,))/))) {\n e = this.element();\n if (!e) {\n break;\n }\n if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n }\n\n option = option && option[1];\n if (!elements) {\n error('Missing target selector for :extend().');\n }\n extend = new(tree.Extend)(new(tree.Selector)(elements), option, index, fileInfo);\n if (extendList) {\n extendList.push(extend);\n } else {\n extendList = [ extend ];\n }\n } while (parserInput.$char(','));\n\n expect(/^\\)/);\n\n if (isRule) {\n expect(/^;/);\n }\n\n return extendList;\n },\n\n //\n // extendRule - used in a rule to extend all the parent selectors\n //\n extendRule: function() {\n return this.extend(true);\n },\n\n //\n // Mixins\n //\n mixin: {\n //\n // A Mixin call, with an optional argument list\n //\n // #mixins > .square(#fff);\n // #mixins.square(#fff);\n // .rounded(4px, black);\n // .button;\n //\n // We can lookup / return a value using the lookup syntax:\n //\n // color: #mixin.square(#fff)[@color];\n //\n // The `while` loop is there because mixins can be\n // namespaced, but we only support the child and descendant\n // selector for now.\n //\n call: function (inValue, getLookup) {\n const s = parserInput.currentChar();\n let important = false;\n let lookups;\n const index = parserInput.i;\n let elements;\n let args;\n let hasParens;\n\n if (s !== '.' && s !== '#') { return; }\n\n parserInput.save(); // stop us absorbing part of an invalid selector\n\n elements = this.elements();\n\n if (elements) {\n if (parserInput.$char('(')) {\n args = this.args(true).args;\n expectChar(')');\n hasParens = true;\n }\n\n if (getLookup !== false) {\n lookups = this.ruleLookups();\n }\n if (getLookup === true && !lookups) {\n parserInput.restore();\n return;\n }\n\n if (!lookups && !hasParens) {\n // This isn't a valid mixin call\n parserInput.restore('Unrecognized input. Possibly missing \\'(\\' in mixin call.');\n return;\n }\n\n if (!inValue && parsers.important()) {\n important = true;\n }\n\n if (inValue || parsers.end()) {\n parserInput.forget();\n const mixin = new(tree.mixin.Call)(elements, args, index, fileInfo, !lookups && important);\n if (lookups) {\n return new tree.NamespaceValue(mixin, lookups);\n }\n else {\n return mixin;\n }\n }\n }\n\n parserInput.restore();\n },\n /**\n * Matching elements for mixins\n * (Start with . or # and can have > )\n */\n elements: function() {\n let elements;\n let e;\n let c;\n let elem;\n let elemIndex;\n const re = /^[#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/;\n while (true) {\n elemIndex = parserInput.i;\n e = parserInput.$re(re);\n \n if (!e) {\n break;\n }\n elem = new(tree.Element)(c, e, false, elemIndex, fileInfo);\n if (elements) {\n elements.push(elem);\n } else {\n elements = [ elem ];\n }\n c = parserInput.$char('>');\n }\n return elements;\n },\n args: function (isCall) {\n const entities = parsers.entities;\n const returner = { args:null, variadic: false };\n let expressions = [];\n const argsSemiColon = [];\n const argsComma = [];\n let isSemiColonSeparated;\n let expressionContainsNamed;\n let name;\n let nameLoop;\n let value;\n let arg;\n let expand;\n let hasSep = true;\n\n parserInput.save();\n\n while (true) {\n if (isCall) {\n arg = parsers.detachedRuleset() || parsers.expression();\n } else {\n parserInput.commentStore.length = 0;\n if (parserInput.$str('...')) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ variadic: true });\n break;\n }\n arg = entities.variable() || entities.property() || entities.literal() || entities.keyword() || this.call(true);\n }\n\n if (!arg || !hasSep) {\n break;\n }\n\n nameLoop = null;\n if (arg.throwAwayComments) {\n arg.throwAwayComments();\n }\n value = arg;\n let val = null;\n\n if (isCall) {\n // Variable\n if (arg.value && arg.value.length == 1) {\n val = arg.value[0];\n }\n } else {\n val = arg;\n }\n\n if (val && (val instanceof tree.Variable || val instanceof tree.Property)) {\n if (parserInput.$char(':')) {\n if (expressions.length > 0) {\n if (isSemiColonSeparated) {\n error('Cannot mix ; and , as delimiter types');\n }\n expressionContainsNamed = true;\n }\n\n value = parsers.detachedRuleset() || parsers.expression();\n\n if (!value) {\n if (isCall) {\n error('could not understand value for named argument');\n } else {\n parserInput.restore();\n returner.args = [];\n return returner;\n }\n }\n nameLoop = (name = val.name);\n } else if (parserInput.$str('...')) {\n if (!isCall) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ name: arg.name, variadic: true });\n break;\n } else {\n expand = true;\n }\n } else if (!isCall) {\n name = nameLoop = val.name;\n value = null;\n }\n }\n\n if (value) {\n expressions.push(value);\n }\n\n argsComma.push({ name:nameLoop, value, expand });\n\n if (parserInput.$char(',')) {\n hasSep = true;\n continue;\n }\n hasSep = parserInput.$char(';') === ';';\n\n if (hasSep || isSemiColonSeparated) {\n\n if (expressionContainsNamed) {\n error('Cannot mix ; and , as delimiter types');\n }\n\n isSemiColonSeparated = true;\n\n if (expressions.length > 1) {\n value = new(tree.Value)(expressions);\n }\n argsSemiColon.push({ name, value, expand });\n\n name = null;\n expressions = [];\n expressionContainsNamed = false;\n }\n }\n\n parserInput.forget();\n returner.args = isSemiColonSeparated ? argsSemiColon : argsComma;\n return returner;\n },\n //\n // A Mixin definition, with a list of parameters\n //\n // .rounded (@radius: 2px, @color) {\n // ...\n // }\n //\n // Until we have a finer grained state-machine, we have to\n // do a look-ahead, to make sure we don't have a mixin call.\n // See the `rule` function for more information.\n //\n // We start by matching `.rounded (`, and then proceed on to\n // the argument list, which has optional default values.\n // We store the parameters in `params`, with a `value` key,\n // if there is a value, such as in the case of `@radius`.\n //\n // Once we've got our params list, and a closing `)`, we parse\n // the `{...}` block.\n //\n definition: function () {\n let name;\n let params = [];\n let match;\n let ruleset;\n let cond;\n let variadic = false;\n if ((parserInput.currentChar() !== '.' && parserInput.currentChar() !== '#') ||\n parserInput.peek(/^[^{]*\\}/)) {\n return;\n }\n\n parserInput.save();\n\n match = parserInput.$re(/^([#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\\s*\\(/);\n if (match) {\n name = match[1];\n\n const argInfo = this.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n\n // .mixincall(\"@{a}\");\n // looks a bit like a mixin definition..\n // also\n // .mixincall(@a: {rule: set;});\n // so we have to be nice and restore\n if (!parserInput.$char(')')) {\n parserInput.restore('Missing closing \\')\\'');\n return;\n }\n\n parserInput.commentStore.length = 0;\n\n if (parserInput.$str('when')) { // Guard\n cond = expect(parsers.conditions, 'expected condition');\n }\n\n ruleset = parsers.block();\n\n if (ruleset) {\n parserInput.forget();\n return new(tree.mixin.Definition)(name, params, ruleset, cond, variadic);\n } else {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n }\n },\n \n ruleLookups: function() {\n let rule;\n let args;\n const lookups = [];\n\n if (parserInput.currentChar() !== '[') { \n return;\n }\n\n while (true) {\n parserInput.save();\n args = null;\n rule = this.lookupValue();\n if (!rule && rule !== '') {\n parserInput.restore();\n break;\n }\n lookups.push(rule);\n parserInput.forget();\n }\n if (lookups.length > 0) {\n return lookups;\n }\n },\n \n lookupValue: function() {\n parserInput.save();\n \n if (!parserInput.$char('[')) { \n parserInput.restore();\n return;\n }\n \n const name = parserInput.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);\n \n if (!parserInput.$char(']')) {\n parserInput.restore();\n return;\n } \n\n if (name || name === '') {\n parserInput.forget();\n return name;\n }\n \n parserInput.restore();\n }\n },\n //\n // Entities are the smallest recognized token,\n // and can be found inside a rule's value.\n //\n entity: function () {\n const entities = this.entities;\n\n return this.comment() || entities.literal() || entities.variable() || entities.url() ||\n entities.property() || entities.call() || entities.keyword() || this.mixin.call(true) ||\n entities.javascript();\n },\n\n //\n // A Declaration terminator. Note that we use `peek()` to check for '}',\n // because the `block` rule will be expecting it, but we still need to make sure\n // it's there, if ';' was omitted.\n //\n end: function () {\n return parserInput.$char(';') || parserInput.peek('}');\n },\n\n //\n // IE's alpha function\n //\n // alpha(opacity=88)\n //\n ieAlpha: function () {\n let value;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (!parserInput.$re(/^opacity=/i)) { return; }\n value = parserInput.$re(/^\\d+/);\n if (!value) {\n value = expect(parsers.entities.variable, 'Could not parse alpha');\n value = `@{${value.name.slice(1)}}`;\n }\n expectChar(')');\n return new tree.Quoted('', `alpha(opacity=${value})`);\n },\n\n //\n // A Selector Element\n //\n // div\n // + h1\n // #socks\n // input[type=\"text\"]\n //\n // Elements are the building blocks for Selectors,\n // they are made out of a `Combinator` (see combinator rule),\n // and an element name, such as a tag a class, or `*`.\n //\n element: function () {\n let e;\n let c;\n let v;\n const index = parserInput.i;\n\n c = this.combinator();\n\n e = parserInput.$re(/^(?:\\d+\\.\\d+|\\d+)%/) ||\n parserInput.$re(/^(?:[.#]?|:*)(?:[\\w-]|[^\\x00-\\x9f]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/) ||\n parserInput.$char('*') || parserInput.$char('&') || this.attribute() ||\n parserInput.$re(/^\\([^&()@]+\\)/) || parserInput.$re(/^[\\.#:](?=@)/) ||\n this.entities.variableCurly();\n\n if (!e) {\n parserInput.save();\n if (parserInput.$char('(')) {\n if ((v = this.selector(false)) && parserInput.$char(')')) {\n e = new(tree.Paren)(v);\n parserInput.forget();\n } else {\n parserInput.restore('Missing closing \\')\\'');\n }\n } else {\n parserInput.forget();\n }\n }\n\n if (e) { return new(tree.Element)(c, e, e instanceof tree.Variable, index, fileInfo); }\n },\n\n //\n // Combinators combine elements together, in a Selector.\n //\n // Because our parser isn't white-space sensitive, special care\n // has to be taken, when parsing the descendant combinator, ` `,\n // as it's an empty space. We have to check the previous character\n // in the input, to see if it's a ` ` character. More info on how\n // we deal with this in *combinator.js*.\n //\n combinator: function () {\n let c = parserInput.currentChar();\n\n if (c === '/') {\n parserInput.save();\n const slashedCombinator = parserInput.$re(/^\\/[a-z]+\\//i);\n if (slashedCombinator) {\n parserInput.forget();\n return new(tree.Combinator)(slashedCombinator);\n }\n parserInput.restore();\n }\n\n if (c === '>' || c === '+' || c === '~' || c === '|' || c === '^') {\n parserInput.i++;\n if (c === '^' && parserInput.currentChar() === '^') {\n c = '^^';\n parserInput.i++;\n }\n while (parserInput.isWhitespace()) { parserInput.i++; }\n return new(tree.Combinator)(c);\n } else if (parserInput.isWhitespace(-1)) {\n return new(tree.Combinator)(' ');\n } else {\n return new(tree.Combinator)(null);\n }\n },\n //\n // A CSS Selector\n // with less extensions e.g. the ability to extend and guard\n //\n // .class > div + h1\n // li a:hover\n //\n // Selectors are made out of one or more Elements, see above.\n //\n selector: function (isLess) {\n const index = parserInput.i;\n let elements;\n let extendList;\n let c;\n let e;\n let allExtends;\n let when;\n let condition;\n isLess = isLess !== false;\n while ((isLess && (extendList = this.extend())) || (isLess && (when = parserInput.$str('when'))) || (e = this.element())) {\n if (when) {\n condition = expect(this.conditions, 'expected condition');\n } else if (condition) {\n error('CSS guard can only be used at the end of selector');\n } else if (extendList) {\n if (allExtends) {\n allExtends = allExtends.concat(extendList);\n } else {\n allExtends = extendList;\n }\n } else {\n if (allExtends) { error('Extend can only be used at the end of selector'); }\n c = parserInput.currentChar();\n if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n e = null;\n }\n if (c === '{' || c === '}' || c === ';' || c === ',' || c === ')') {\n break;\n }\n }\n\n if (elements) { return new(tree.Selector)(elements, allExtends, condition, index, fileInfo); }\n if (allExtends) { error('Extend must be used to extend a selector, it cannot be used on its own'); }\n },\n selectors: function () {\n let s;\n let selectors;\n while (true) {\n s = this.selector();\n if (!s) {\n break;\n }\n if (selectors) {\n selectors.push(s);\n } else {\n selectors = [ s ];\n }\n parserInput.commentStore.length = 0;\n if (s.condition && selectors.length > 1) {\n error(\"Guards are only currently allowed on a single selector.\");\n }\n if (!parserInput.$char(',')) { break; }\n if (s.condition) {\n error(\"Guards are only currently allowed on a single selector.\");\n }\n parserInput.commentStore.length = 0;\n }\n return selectors;\n },\n attribute: function () {\n if (!parserInput.$char('[')) { return; }\n\n const entities = this.entities;\n let key;\n let val;\n let op;\n\n if (!(key = entities.variableCurly())) {\n key = expect(/^(?:[_A-Za-z0-9-\\*]*\\|)?(?:[_A-Za-z0-9-]|\\\\.)+/);\n }\n\n op = parserInput.$re(/^[|~*$^]?=/);\n if (op) {\n val = entities.quoted() || parserInput.$re(/^[0-9]+%/) || parserInput.$re(/^[\\w-]+/) || entities.variableCurly();\n }\n\n expectChar(']');\n\n return new(tree.Attribute)(key, op, val);\n },\n\n //\n // The `block` rule is used by `ruleset` and `mixin.definition`.\n // It's a wrapper around the `primary` rule, with added `{}`.\n //\n block: function () {\n let content;\n if (parserInput.$char('{') && (content = this.primary()) && parserInput.$char('}')) {\n return content;\n }\n },\n\n blockRuleset: function() {\n let block = this.block();\n\n if (block) {\n block = new tree.Ruleset(null, block);\n }\n return block;\n },\n\n detachedRuleset: function() {\n let argInfo;\n let params;\n let variadic;\n\n parserInput.save();\n if (parserInput.$re(/^[.#]\\(/)) {\n /**\n * DR args currently only implemented for each() function, and not \n * yet settable as `@dr: #(@arg) {}`\n * This should be done when DRs are merged with mixins.\n * See: https://github.com/less/less-meta/issues/16\n */\n argInfo = this.mixin.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n if (!parserInput.$char(')')) {\n parserInput.restore();\n return;\n }\n }\n const blockRuleset = this.blockRuleset();\n if (blockRuleset) {\n parserInput.forget();\n if (params) {\n return new tree.mixin.Definition(null, params, blockRuleset, null, variadic);\n }\n return new tree.DetachedRuleset(blockRuleset);\n }\n parserInput.restore();\n },\n\n //\n // div, .class, body > p {...}\n //\n ruleset: function () {\n let selectors;\n let rules;\n let debugInfo;\n\n parserInput.save();\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(parserInput.i);\n }\n\n selectors = this.selectors();\n\n if (selectors && (rules = this.block())) {\n parserInput.forget();\n const ruleset = new(tree.Ruleset)(selectors, rules, context.strictImports);\n if (context.dumpLineNumbers) {\n ruleset.debugInfo = debugInfo;\n }\n return ruleset;\n } else {\n parserInput.restore();\n }\n },\n declaration: function () {\n let name;\n let value;\n const index = parserInput.i;\n let hasDR;\n const c = parserInput.currentChar();\n let important;\n let merge;\n let isVariable;\n\n if (c === '.' || c === '#' || c === '&' || c === ':') { return; }\n\n parserInput.save();\n\n name = this.variable() || this.ruleProperty();\n if (name) {\n isVariable = typeof name === 'string';\n\n if (isVariable) {\n value = this.detachedRuleset();\n if (value) {\n hasDR = true;\n }\n }\n\n parserInput.commentStore.length = 0;\n if (!value) {\n // a name returned by this.ruleProperty() is always an array of the form:\n // [string-1, ..., string-n, \"\"] or [string-1, ..., string-n, \"+\"]\n // where each item is a tree.Keyword or tree.Variable\n merge = !isVariable && name.length > 1 && name.pop().value;\n\n // Custom property values get permissive parsing\n if (name[0].value && name[0].value.slice(0, 2) === '--') {\n value = this.permissiveValue();\n }\n // Try to store values as anonymous\n // If we need the value later we'll re-parse it in ruleset.parseValue\n else {\n value = this.anonymousValue();\n }\n if (value) {\n parserInput.forget();\n // anonymous values absorb the end ';' which is required for them to work\n return new(tree.Declaration)(name, value, false, merge, index, fileInfo);\n }\n\n if (!value) {\n value = this.value();\n }\n\n if (value) {\n important = this.important();\n } else if (isVariable) {\n // As a last resort, try permissiveValue\n value = this.permissiveValue();\n }\n }\n\n if (value && (this.end() || hasDR)) {\n parserInput.forget();\n return new(tree.Declaration)(name, value, important, merge, index, fileInfo);\n }\n else {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n }\n },\n anonymousValue: function () {\n const index = parserInput.i;\n const match = parserInput.$re(/^([^.#@\\$+\\/'\"*`(;{}-]*);/);\n if (match) {\n return new(tree.Anonymous)(match[1], index);\n }\n },\n /**\n * Used for custom properties, at-rules, and variables (as fallback)\n * Parses almost anything inside of {} [] () \"\" blocks\n * until it reaches outer-most tokens.\n * \n * First, it will try to parse comments and entities to reach\n * the end. This is mostly like the Expression parser except no\n * math is allowed.\n */\n permissiveValue: function (untilTokens) {\n let i;\n let e;\n let done;\n let value;\n const tok = untilTokens || ';';\n const index = parserInput.i;\n const result = [];\n\n function testCurrentChar() {\n const char = parserInput.currentChar();\n if (typeof tok === 'string') {\n return char === tok;\n } else {\n return tok.test(char);\n }\n }\n if (testCurrentChar()) {\n return;\n }\n value = [];\n do {\n e = this.comment();\n if (e) {\n value.push(e);\n continue;\n }\n e = this.entity();\n if (e) {\n value.push(e);\n }\n } while (e);\n\n done = testCurrentChar();\n\n if (value.length > 0) {\n value = new(tree.Expression)(value);\n if (done) {\n return value;\n }\n else {\n result.push(value);\n }\n // Preserve space before $parseUntil as it will not\n if (parserInput.prevChar() === ' ') {\n result.push(new tree.Anonymous(' ', index));\n }\n }\n parserInput.save();\n\n value = parserInput.$parseUntil(tok);\n\n if (value) {\n if (typeof value === 'string') {\n error(`Expected '${value}'`, 'Parse');\n }\n if (value.length === 1 && value[0] === ' ') {\n parserInput.forget();\n return new tree.Anonymous('', index);\n }\n let item;\n for (i = 0; i < value.length; i++) {\n item = value[i];\n if (Array.isArray(item)) {\n // Treat actual quotes as normal quoted values\n result.push(new tree.Quoted(item[0], item[1], true, index, fileInfo));\n }\n else {\n if (i === value.length - 1) {\n item = item.trim();\n }\n // Treat like quoted values, but replace vars like unquoted expressions\n const quote = new tree.Quoted('\\'', item, true, index, fileInfo);\n quote.variableRegex = /@([\\w-]+)/g;\n quote.propRegex = /\\$([\\w-]+)/g;\n result.push(quote);\n }\n }\n parserInput.forget();\n return new tree.Expression(result, true);\n }\n parserInput.restore();\n },\n\n //\n // An @import atrule\n //\n // @import \"lib\";\n //\n // Depending on our environment, importing is done differently:\n // In the browser, it's an XHR request, in Node, it would be a\n // file-system operation. The function used for importing is\n // stored in `import`, which we pass to the Import constructor.\n //\n 'import': function () {\n let path;\n let features;\n const index = parserInput.i;\n\n const dir = parserInput.$re(/^@import?\\s+/);\n\n if (dir) {\n const options = (dir ? this.importOptions() : null) || {};\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n features = this.mediaFeatures();\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon or unrecognised media features on import');\n }\n features = features && new(tree.Value)(features);\n return new(tree.Import)(path, features, options, index, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed import statement');\n }\n }\n },\n\n importOptions: function() {\n let o;\n const options = {};\n let optionName;\n let value;\n\n // list of options, surrounded by parens\n if (!parserInput.$char('(')) { return null; }\n do {\n o = this.importOption();\n if (o) {\n optionName = o;\n value = true;\n switch (optionName) {\n case 'css':\n optionName = 'less';\n value = false;\n break;\n case 'once':\n optionName = 'multiple';\n value = false;\n break;\n }\n options[optionName] = value;\n if (!parserInput.$char(',')) { break; }\n }\n } while (o);\n expectChar(')');\n return options;\n },\n\n importOption: function() {\n const opt = parserInput.$re(/^(less|css|multiple|once|inline|reference|optional)/);\n if (opt) {\n return opt[1];\n }\n },\n\n mediaFeature: function () {\n const entities = this.entities;\n const nodes = [];\n let e;\n let p;\n parserInput.save();\n do {\n e = entities.keyword() || entities.variable() || entities.mixinLookup();\n if (e) {\n nodes.push(e);\n } else if (parserInput.$char('(')) {\n p = this.property();\n e = this.value();\n if (parserInput.$char(')')) {\n if (p && e) {\n nodes.push(new(tree.Paren)(new(tree.Declaration)(p, e, null, null, parserInput.i, fileInfo, true)));\n } else if (e) {\n nodes.push(new(tree.Paren)(e));\n } else {\n error('badly formed media feature definition');\n }\n } else {\n error('Missing closing \\')\\'', 'Parse');\n }\n }\n } while (e);\n\n parserInput.forget();\n if (nodes.length > 0) {\n return new(tree.Expression)(nodes);\n }\n },\n\n mediaFeatures: function () {\n const entities = this.entities;\n const features = [];\n let e;\n do {\n e = this.mediaFeature();\n if (e) {\n features.push(e);\n if (!parserInput.$char(',')) { break; }\n } else {\n e = entities.variable() || entities.mixinLookup();\n if (e) {\n features.push(e);\n if (!parserInput.$char(',')) { break; }\n }\n }\n } while (e);\n\n return features.length > 0 ? features : null;\n },\n\n media: function () {\n let features;\n let rules;\n let media;\n let debugInfo;\n const index = parserInput.i;\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(index);\n }\n\n parserInput.save();\n\n if (parserInput.$str('@media')) {\n features = this.mediaFeatures();\n\n rules = this.block();\n\n if (!rules) {\n error('media definitions require block statements after any features');\n }\n\n parserInput.forget();\n\n media = new(tree.Media)(rules, features, index, fileInfo);\n if (context.dumpLineNumbers) {\n media.debugInfo = debugInfo;\n }\n\n return media;\n }\n\n parserInput.restore();\n },\n\n //\n\n // A @plugin directive, used to import plugins dynamically.\n //\n // @plugin (args) \"lib\";\n //\n plugin: function () {\n let path;\n let args;\n let options;\n const index = parserInput.i;\n const dir = parserInput.$re(/^@plugin?\\s+/);\n\n if (dir) {\n args = this.pluginArgs();\n\n if (args) {\n options = {\n pluginArgs: args,\n isPlugin: true\n };\n }\n else {\n options = { isPlugin: true };\n }\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon on @plugin');\n }\n return new(tree.Import)(path, null, options, index, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed @plugin statement');\n }\n }\n },\n\n pluginArgs: function() {\n // list of options, surrounded by parens\n parserInput.save();\n if (!parserInput.$char('(')) {\n parserInput.restore();\n return null;\n }\n const args = parserInput.$re(/^\\s*([^\\);]+)\\)\\s*/);\n if (args[1]) {\n parserInput.forget();\n return args[1].trim();\n }\n else { \n parserInput.restore();\n return null;\n }\n },\n\n //\n // A CSS AtRule\n //\n // @charset \"utf-8\";\n //\n atrule: function () {\n const index = parserInput.i;\n let name;\n let value;\n let rules;\n let nonVendorSpecificName;\n let hasIdentifier;\n let hasExpression;\n let hasUnknown;\n let hasBlock = true;\n let isRooted = true;\n\n if (parserInput.currentChar() !== '@') { return; }\n\n value = this['import']() || this.plugin() || this.media();\n if (value) {\n return value;\n }\n\n parserInput.save();\n\n name = parserInput.$re(/^@[a-z-]+/);\n\n if (!name) { return; }\n\n nonVendorSpecificName = name;\n if (name.charAt(1) == '-' && name.indexOf('-', 2) > 0) {\n nonVendorSpecificName = `@${name.slice(name.indexOf('-', 2) + 1)}`;\n }\n\n switch (nonVendorSpecificName) {\n case '@charset':\n hasIdentifier = true;\n hasBlock = false;\n break;\n case '@namespace':\n hasExpression = true;\n hasBlock = false;\n break;\n case '@keyframes':\n case '@counter-style':\n hasIdentifier = true;\n break;\n case '@document':\n case '@supports':\n hasUnknown = true;\n isRooted = false;\n break;\n default:\n hasUnknown = true;\n break;\n }\n\n parserInput.commentStore.length = 0;\n\n if (hasIdentifier) {\n value = this.entity();\n if (!value) {\n error(`expected ${name} identifier`);\n }\n } else if (hasExpression) {\n value = this.expression();\n if (!value) {\n error(`expected ${name} expression`);\n }\n } else if (hasUnknown) {\n value = this.permissiveValue(/^[{;]/);\n hasBlock = (parserInput.currentChar() === '{');\n if (!value) {\n if (!hasBlock && parserInput.currentChar() !== ';') {\n error(`${name} rule is missing block or ending semi-colon`);\n }\n }\n else if (!value.value) {\n value = null;\n }\n }\n\n if (hasBlock) {\n rules = this.blockRuleset();\n }\n\n if (rules || (!hasBlock && value && parserInput.$char(';'))) {\n parserInput.forget();\n return new(tree.AtRule)(name, value, rules, index, fileInfo,\n context.dumpLineNumbers ? getDebugInfo(index) : null,\n isRooted\n );\n }\n\n parserInput.restore('at-rule options not recognised');\n },\n\n //\n // A Value is a comma-delimited list of Expressions\n //\n // font-family: Baskerville, Georgia, serif;\n //\n // In a Rule, a Value represents everything after the `:`,\n // and before the `;`.\n //\n value: function () {\n let e;\n const expressions = [];\n const index = parserInput.i;\n\n do {\n e = this.expression();\n if (e) {\n expressions.push(e);\n if (!parserInput.$char(',')) { break; }\n }\n } while (e);\n\n if (expressions.length > 0) {\n return new(tree.Value)(expressions, index);\n }\n },\n important: function () {\n if (parserInput.currentChar() === '!') {\n return parserInput.$re(/^! *important/);\n }\n },\n sub: function () {\n let a;\n let e;\n\n parserInput.save();\n if (parserInput.$char('(')) {\n a = this.addition();\n if (a && parserInput.$char(')')) {\n parserInput.forget();\n e = new(tree.Expression)([a]);\n e.parens = true;\n return e;\n }\n parserInput.restore('Expected \\')\\'');\n return;\n }\n parserInput.restore();\n },\n multiplication: function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.operand();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1);\n while (true) {\n if (parserInput.peek(/^\\/[*\\/]/)) {\n break;\n }\n\n parserInput.save();\n\n op = parserInput.$char('/') || parserInput.$char('*') || parserInput.$str('./');\n\n if (!op) { parserInput.forget(); break; }\n\n a = this.operand();\n\n if (!a) { parserInput.restore(); break; }\n parserInput.forget();\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n isSpaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n addition: function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.multiplication();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1);\n while (true) {\n op = parserInput.$re(/^[-+]\\s+/) || (!isSpaced && (parserInput.$char('+') || parserInput.$char('-')));\n if (!op) {\n break;\n }\n a = this.multiplication();\n if (!a) {\n break;\n }\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n isSpaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n conditions: function () {\n let a;\n let b;\n const index = parserInput.i;\n let condition;\n\n a = this.condition(true);\n if (a) {\n while (true) {\n if (!parserInput.peek(/^,\\s*(not\\s*)?\\(/) || !parserInput.$char(',')) {\n break;\n }\n b = this.condition(true);\n if (!b) {\n break;\n }\n condition = new(tree.Condition)('or', condition || a, b, index);\n }\n return condition || a;\n }\n },\n condition: function (needsParens) {\n let result;\n let logical;\n let next;\n function or() {\n return parserInput.$str('or');\n }\n\n result = this.conditionAnd(needsParens);\n if (!result) {\n return ;\n }\n logical = or();\n if (logical) {\n next = this.condition(needsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n }\n }\n return result;\n },\n conditionAnd: function (needsParens) {\n let result;\n let logical;\n let next;\n const self = this;\n function insideCondition() {\n const cond = self.negatedCondition(needsParens) || self.parenthesisCondition(needsParens);\n if (!cond && !needsParens) {\n return self.atomicCondition(needsParens);\n }\n return cond;\n }\n function and() {\n return parserInput.$str('and');\n }\n\n result = insideCondition();\n if (!result) {\n return ;\n }\n logical = and();\n if (logical) {\n next = this.conditionAnd(needsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n }\n }\n return result;\n },\n negatedCondition: function (needsParens) {\n if (parserInput.$str('not')) {\n const result = this.parenthesisCondition(needsParens);\n if (result) {\n result.negate = !result.negate;\n }\n return result;\n }\n },\n parenthesisCondition: function (needsParens) {\n function tryConditionFollowedByParenthesis(me) {\n let body;\n parserInput.save();\n body = me.condition(needsParens);\n if (!body) {\n parserInput.restore();\n return ;\n }\n if (!parserInput.$char(')')) {\n parserInput.restore();\n return ;\n }\n parserInput.forget();\n return body;\n }\n\n let body;\n parserInput.save();\n if (!parserInput.$str('(')) {\n parserInput.restore();\n return ;\n }\n body = tryConditionFollowedByParenthesis(this);\n if (body) {\n parserInput.forget();\n return body;\n }\n\n body = this.atomicCondition(needsParens);\n if (!body) {\n parserInput.restore();\n return ;\n }\n if (!parserInput.$char(')')) {\n parserInput.restore(`expected ')' got '${parserInput.currentChar()}'`);\n return ;\n }\n parserInput.forget();\n return body;\n },\n atomicCondition: function (needsParens) {\n const entities = this.entities;\n const index = parserInput.i;\n let a;\n let b;\n let c;\n let op;\n\n function cond() {\n return this.addition() || entities.keyword() || entities.quoted() || entities.mixinLookup();\n }\n cond = cond.bind(this);\n\n a = cond();\n if (a) {\n if (parserInput.$char('>')) {\n if (parserInput.$char('=')) {\n op = '>=';\n } else {\n op = '>';\n }\n } else\n if (parserInput.$char('<')) {\n if (parserInput.$char('=')) {\n op = '<=';\n } else {\n op = '<';\n }\n } else\n if (parserInput.$char('=')) {\n if (parserInput.$char('>')) {\n op = '=>';\n } else if (parserInput.$char('<')) {\n op = '=<';\n } else {\n op = '=';\n }\n }\n if (op) {\n b = cond();\n if (b) {\n c = new(tree.Condition)(op, a, b, index, false);\n } else {\n error('expected expression');\n }\n } else {\n c = new(tree.Condition)('=', a, new(tree.Keyword)('true'), index, false);\n }\n return c;\n }\n },\n\n //\n // An operand is anything that can be part of an operation,\n // such as a Color, or a Variable\n //\n operand: function () {\n const entities = this.entities;\n let negate;\n\n if (parserInput.peek(/^-[@\\$\\(]/)) {\n negate = parserInput.$char('-');\n }\n\n let o = this.sub() || entities.dimension() ||\n entities.color() || entities.variable() ||\n entities.property() || entities.call() ||\n entities.quoted(true) || entities.colorKeyword() ||\n entities.mixinLookup();\n\n if (negate) {\n o.parensInOp = true;\n o = new(tree.Negative)(o);\n }\n\n return o;\n },\n\n //\n // Expressions either represent mathematical operations,\n // or white-space delimited Entities.\n //\n // 1px solid black\n // @var * 2\n //\n expression: function () {\n const entities = [];\n let e;\n let delim;\n const index = parserInput.i;\n\n do {\n e = this.comment();\n if (e) {\n entities.push(e);\n continue;\n }\n e = this.addition() || this.entity();\n\n if (e instanceof tree.Comment) {\n e = null;\n }\n\n if (e) {\n entities.push(e);\n // operations do not allow keyword \"/\" dimension (e.g. small/20px) so we support that here\n if (!parserInput.peek(/^\\/[\\/*]/)) {\n delim = parserInput.$char('/');\n if (delim) {\n entities.push(new(tree.Anonymous)(delim, index));\n }\n }\n }\n } while (e);\n if (entities.length > 0) {\n return new(tree.Expression)(entities);\n }\n },\n property: function () {\n const name = parserInput.$re(/^(\\*?-?[_a-zA-Z0-9-]+)\\s*:/);\n if (name) {\n return name[1];\n }\n },\n ruleProperty: function () {\n let name = [];\n const index = [];\n let s;\n let k;\n\n parserInput.save();\n\n const simpleProperty = parserInput.$re(/^([_a-zA-Z0-9-]+)\\s*:/);\n if (simpleProperty) {\n name = [new(tree.Keyword)(simpleProperty[1])];\n parserInput.forget();\n return name;\n }\n\n function match(re) {\n const i = parserInput.i;\n const chunk = parserInput.$re(re);\n if (chunk) {\n index.push(i);\n return name.push(chunk[1]);\n }\n }\n\n match(/^(\\*?)/);\n while (true) {\n if (!match(/^((?:[\\w-]+)|(?:[@\\$]\\{[\\w-]+\\}))/)) {\n break;\n }\n }\n\n if ((name.length > 1) && match(/^((?:\\+_|\\+)?)\\s*:/)) {\n parserInput.forget();\n\n // at last, we have the complete match now. move forward,\n // convert name particles to tree objects and return:\n if (name[0] === '') {\n name.shift();\n index.shift();\n }\n for (k = 0; k < name.length; k++) {\n s = name[k];\n name[k] = (s.charAt(0) !== '@' && s.charAt(0) !== '$') ?\n new(tree.Keyword)(s) :\n (s.charAt(0) === '@' ?\n new(tree.Variable)(`@${s.slice(2, -1)}`, index[k], fileInfo) :\n new(tree.Property)(`$${s.slice(2, -1)}`, index[k], fileInfo));\n }\n return name;\n }\n parserInput.restore();\n }\n }\n };\n};\nParser.serializeVars = vars => {\n let s = '';\n\n for (const name in vars) {\n if (Object.hasOwnProperty.call(vars, name)) {\n const value = vars[name];\n s += `${((name[0] === '@') ? '' : '@') + name}: ${value}${(String(value).slice(-1) === ';') ? '' : ';'}`;\n }\n }\n\n return s;\n};\n\nexport default Parser;\n","import Anonymous from '../tree/anonymous';\nimport Keyword from '../tree/keyword';\n\nfunction boolean(condition) {\n return condition ? Keyword.True : Keyword.False;\n}\n\n/**\n * Functions with evalArgs set to false are sent context\n * as the first argument.\n */\nfunction If(context, condition, trueValue, falseValue) {\n return condition.eval(context) ? trueValue.eval(context)\n : (falseValue ? falseValue.eval(context) : new Anonymous);\n}\nIf.evalArgs = false\n\nexport default { boolean, 'if': If };\n","import Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport Expression from '../tree/expression';\nimport Operation from '../tree/operation';\nlet colorFunctions;\n\nfunction clamp(val) {\n return Math.min(1, Math.max(0, val));\n}\nfunction hsla(origColor, hsl) {\n const color = colorFunctions.hsla(hsl.h, hsl.s, hsl.l, hsl.a);\n if (color) {\n if (origColor.value && \n /^(rgb|hsl)/.test(origColor.value)) {\n color.value = origColor.value;\n } else {\n color.value = 'rgb';\n }\n return color;\n }\n}\nfunction toHSL(color) {\n if (color.toHSL) {\n return color.toHSL();\n } else {\n throw new Error('Argument cannot be evaluated to a color');\n }\n}\n\nfunction toHSV(color) {\n if (color.toHSV) {\n return color.toHSV();\n } else {\n throw new Error('Argument cannot be evaluated to a color');\n }\n}\n\nfunction number(n) {\n if (n instanceof Dimension) {\n return parseFloat(n.unit.is('%') ? n.value / 100 : n.value);\n } else if (typeof n === 'number') {\n return n;\n } else {\n throw {\n type: 'Argument',\n message: 'color functions take numbers as parameters'\n };\n }\n}\nfunction scaled(n, size) {\n if (n instanceof Dimension && n.unit.is('%')) {\n return parseFloat(n.value * size / 100);\n } else {\n return number(n);\n }\n}\ncolorFunctions = {\n rgb: function (r, g, b) {\n let a = 1\n /**\n * Comma-less syntax\n * e.g. rgb(0 128 255 / 50%)\n */\n if (r instanceof Expression) {\n const val = r.value\n r = val[0]\n g = val[1]\n b = val[2]\n /** \n * @todo - should this be normalized in\n * function caller? Or parsed differently?\n */\n if (b instanceof Operation) {\n const op = b\n b = op.operands[0]\n a = op.operands[1]\n }\n }\n const color = colorFunctions.rgba(r, g, b, a);\n if (color) {\n color.value = 'rgb';\n return color;\n }\n },\n rgba: function (r, g, b, a) {\n try {\n if (r instanceof Color) {\n if (g) {\n a = number(g);\n } else {\n a = r.alpha;\n }\n return new Color(r.rgb, a, 'rgba');\n }\n const rgb = [r, g, b].map(c => scaled(c, 255));\n a = number(a);\n return new Color(rgb, a, 'rgba');\n }\n catch (e) {}\n },\n hsl: function (h, s, l) {\n let a = 1\n if (h instanceof Expression) {\n const val = h.value\n h = val[0]\n s = val[1]\n l = val[2]\n\n if (l instanceof Operation) {\n const op = l\n l = op.operands[0]\n a = op.operands[1]\n }\n }\n const color = colorFunctions.hsla(h, s, l, a);\n if (color) {\n color.value = 'hsl';\n return color;\n }\n },\n hsla: function (h, s, l, a) {\n try {\n if (h instanceof Color) {\n if (s) {\n a = number(s);\n } else {\n a = h.alpha;\n }\n return new Color(h.rgb, a, 'hsla');\n }\n\n let m1;\n let m2;\n\n function hue(h) {\n h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h);\n if (h * 6 < 1) {\n return m1 + (m2 - m1) * h * 6;\n }\n else if (h * 2 < 1) {\n return m2;\n }\n else if (h * 3 < 2) {\n return m1 + (m2 - m1) * (2 / 3 - h) * 6;\n }\n else {\n return m1;\n }\n }\n\n h = (number(h) % 360) / 360;\n s = clamp(number(s));l = clamp(number(l));a = clamp(number(a));\n\n m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n m1 = l * 2 - m2;\n\n const rgb = [\n hue(h + 1 / 3) * 255,\n hue(h) * 255,\n hue(h - 1 / 3) * 255\n ];\n a = number(a);\n return new Color(rgb, a, 'hsla');\n }\n catch (e) {}\n },\n\n hsv: function(h, s, v) {\n return colorFunctions.hsva(h, s, v, 1.0);\n },\n\n hsva: function(h, s, v, a) {\n h = ((number(h) % 360) / 360) * 360;\n s = number(s);v = number(v);a = number(a);\n\n let i;\n let f;\n i = Math.floor((h / 60) % 6);\n f = (h / 60) - i;\n\n const vs = [v,\n v * (1 - s),\n v * (1 - f * s),\n v * (1 - (1 - f) * s)];\n const perm = [[0, 3, 1],\n [2, 0, 1],\n [1, 0, 3],\n [1, 2, 0],\n [3, 1, 0],\n [0, 1, 2]];\n\n return colorFunctions.rgba(vs[perm[i][0]] * 255,\n vs[perm[i][1]] * 255,\n vs[perm[i][2]] * 255,\n a);\n },\n\n hue: function (color) {\n return new Dimension(toHSL(color).h);\n },\n saturation: function (color) {\n return new Dimension(toHSL(color).s * 100, '%');\n },\n lightness: function (color) {\n return new Dimension(toHSL(color).l * 100, '%');\n },\n hsvhue: function(color) {\n return new Dimension(toHSV(color).h);\n },\n hsvsaturation: function (color) {\n return new Dimension(toHSV(color).s * 100, '%');\n },\n hsvvalue: function (color) {\n return new Dimension(toHSV(color).v * 100, '%');\n },\n red: function (color) {\n return new Dimension(color.rgb[0]);\n },\n green: function (color) {\n return new Dimension(color.rgb[1]);\n },\n blue: function (color) {\n return new Dimension(color.rgb[2]);\n },\n alpha: function (color) {\n return new Dimension(toHSL(color).a);\n },\n luma: function (color) {\n return new Dimension(color.luma() * color.alpha * 100, '%');\n },\n luminance: function (color) {\n const luminance =\n (0.2126 * color.rgb[0] / 255) +\n (0.7152 * color.rgb[1] / 255) +\n (0.0722 * color.rgb[2] / 255);\n\n return new Dimension(luminance * color.alpha * 100, '%');\n },\n saturate: function (color, amount, method) {\n // filter: saturate(3.2);\n // should be kept as is, so check for color\n if (!color.rgb) {\n return null;\n }\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.s += hsl.s * amount.value / 100;\n }\n else {\n hsl.s += amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n return hsla(color, hsl);\n },\n desaturate: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.s -= hsl.s * amount.value / 100;\n }\n else {\n hsl.s -= amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n return hsla(color, hsl);\n },\n lighten: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.l += hsl.l * amount.value / 100;\n }\n else {\n hsl.l += amount.value / 100;\n }\n hsl.l = clamp(hsl.l);\n return hsla(color, hsl);\n },\n darken: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.l -= hsl.l * amount.value / 100;\n }\n else {\n hsl.l -= amount.value / 100;\n }\n hsl.l = clamp(hsl.l);\n return hsla(color, hsl);\n },\n fadein: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.a += hsl.a * amount.value / 100;\n }\n else {\n hsl.a += amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fadeout: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.a -= hsl.a * amount.value / 100;\n }\n else {\n hsl.a -= amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fade: function (color, amount) {\n const hsl = toHSL(color);\n\n hsl.a = amount.value / 100;\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n spin: function (color, amount) {\n const hsl = toHSL(color);\n const hue = (hsl.h + amount.value) % 360;\n\n hsl.h = hue < 0 ? 360 + hue : hue;\n\n return hsla(color, hsl);\n },\n //\n // Copyright (c) 2006-2009 Hampton Catlin, Natalie Weizenbaum, and Chris Eppstein\n // http://sass-lang.com\n //\n mix: function (color1, color2, weight) {\n if (!weight) {\n weight = new Dimension(50);\n }\n const p = weight.value / 100.0;\n const w = p * 2 - 1;\n const a = toHSL(color1).a - toHSL(color2).a;\n\n const w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n const w2 = 1 - w1;\n\n const rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2,\n color1.rgb[1] * w1 + color2.rgb[1] * w2,\n color1.rgb[2] * w1 + color2.rgb[2] * w2];\n\n const alpha = color1.alpha * p + color2.alpha * (1 - p);\n\n return new Color(rgb, alpha);\n },\n greyscale: function (color) {\n return colorFunctions.desaturate(color, new Dimension(100));\n },\n contrast: function (color, dark, light, threshold) {\n // filter: contrast(3.2);\n // should be kept as is, so check for color\n if (!color.rgb) {\n return null;\n }\n if (typeof light === 'undefined') {\n light = colorFunctions.rgba(255, 255, 255, 1.0);\n }\n if (typeof dark === 'undefined') {\n dark = colorFunctions.rgba(0, 0, 0, 1.0);\n }\n // Figure out which is actually light and dark:\n if (dark.luma() > light.luma()) {\n const t = light;\n light = dark;\n dark = t;\n }\n if (typeof threshold === 'undefined') {\n threshold = 0.43;\n } else {\n threshold = number(threshold);\n }\n if (color.luma() < threshold) {\n return light;\n } else {\n return dark;\n }\n },\n // Changes made in 2.7.0 - Reverted in 3.0.0\n // contrast: function (color, color1, color2, threshold) {\n // // Return which of `color1` and `color2` has the greatest contrast with `color`\n // // according to the standard WCAG contrast ratio calculation.\n // // http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n // // The threshold param is no longer used, in line with SASS.\n // // filter: contrast(3.2);\n // // should be kept as is, so check for color\n // if (!color.rgb) {\n // return null;\n // }\n // if (typeof color1 === 'undefined') {\n // color1 = colorFunctions.rgba(0, 0, 0, 1.0);\n // }\n // if (typeof color2 === 'undefined') {\n // color2 = colorFunctions.rgba(255, 255, 255, 1.0);\n // }\n // var contrast1, contrast2;\n // var luma = color.luma();\n // var luma1 = color1.luma();\n // var luma2 = color2.luma();\n // // Calculate contrast ratios for each color\n // if (luma > luma1) {\n // contrast1 = (luma + 0.05) / (luma1 + 0.05);\n // } else {\n // contrast1 = (luma1 + 0.05) / (luma + 0.05);\n // }\n // if (luma > luma2) {\n // contrast2 = (luma + 0.05) / (luma2 + 0.05);\n // } else {\n // contrast2 = (luma2 + 0.05) / (luma + 0.05);\n // }\n // if (contrast1 > contrast2) {\n // return color1;\n // } else {\n // return color2;\n // }\n // },\n argb: function (color) {\n return new Anonymous(color.toARGB());\n },\n color: function(c) {\n if ((c instanceof Quoted) &&\n (/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})$/i.test(c.value))) {\n const val = c.value.slice(1);\n return new Color(val, undefined, `#${val}`);\n }\n if ((c instanceof Color) || (c = Color.fromKeyword(c.value))) {\n c.value = undefined;\n return c;\n }\n throw {\n type: 'Argument',\n message: 'argument must be a color keyword or 3|4|6|8 digit hex e.g. #FFF'\n };\n },\n tint: function(color, amount) {\n return colorFunctions.mix(colorFunctions.rgb(255, 255, 255), color, amount);\n },\n shade: function(color, amount) {\n return colorFunctions.mix(colorFunctions.rgb(0, 0, 0), color, amount);\n }\n};\n\nexport default colorFunctions;\n","import Color from '../tree/color';\n\n// Color Blending\n// ref: http://www.w3.org/TR/compositing-1\n\nfunction colorBlend(mode, color1, color2) {\n const ab = color1.alpha; // result\n\n let // backdrop\n cb;\n\n const as = color2.alpha;\n\n let // source\n cs;\n\n let ar;\n let cr;\n const r = [];\n\n ar = as + ab * (1 - as);\n for (let i = 0; i < 3; i++) {\n cb = color1.rgb[i] / 255;\n cs = color2.rgb[i] / 255;\n cr = mode(cb, cs);\n if (ar) {\n cr = (as * cs + ab * (cb -\n as * (cb + cs - cr))) / ar;\n }\n r[i] = cr * 255;\n }\n\n return new Color(r, ar);\n}\n\nconst colorBlendModeFunctions = {\n multiply: function(cb, cs) {\n return cb * cs;\n },\n screen: function(cb, cs) {\n return cb + cs - cb * cs;\n },\n overlay: function(cb, cs) {\n cb *= 2;\n return (cb <= 1) ?\n colorBlendModeFunctions.multiply(cb, cs) :\n colorBlendModeFunctions.screen(cb - 1, cs);\n },\n softlight: function(cb, cs) {\n let d = 1;\n let e = cb;\n if (cs > 0.5) {\n e = 1;\n d = (cb > 0.25) ? Math.sqrt(cb)\n : ((16 * cb - 12) * cb + 4) * cb;\n }\n return cb - (1 - 2 * cs) * e * (d - cb);\n },\n hardlight: function(cb, cs) {\n return colorBlendModeFunctions.overlay(cs, cb);\n },\n difference: function(cb, cs) {\n return Math.abs(cb - cs);\n },\n exclusion: function(cb, cs) {\n return cb + cs - 2 * cb * cs;\n },\n\n // non-w3c functions:\n average: function(cb, cs) {\n return (cb + cs) / 2;\n },\n negation: function(cb, cs) {\n return 1 - Math.abs(cb + cs - 1);\n }\n};\n\nfor (const f in colorBlendModeFunctions) {\n if (colorBlendModeFunctions.hasOwnProperty(f)) {\n colorBlend[f] = colorBlend.bind(null, colorBlendModeFunctions[f]);\n }\n}\n\nexport default colorBlend;\n","import Comment from '../tree/comment';\nimport Node from '../tree/node';\nimport Dimension from '../tree/dimension';\nimport Declaration from '../tree/declaration';\nimport Expression from '../tree/expression';\nimport Ruleset from '../tree/ruleset';\nimport Selector from '../tree/selector';\nimport Element from '../tree/element';\nimport Quote from '../tree/quoted';\nimport Value from '../tree/value';\n\nconst getItemsFromNode = node => {\n // handle non-array values as an array of length 1\n // return 'undefined' if index is invalid\n const items = Array.isArray(node.value) ?\n node.value : Array(node);\n\n return items;\n};\n\nexport default {\n _SELF: function(n) {\n return n;\n },\n '~': function(...expr) {\n if (expr.length === 1) {\n return expr[0];\n }\n return new Value(expr);\n },\n extract: function(values, index) {\n // (1-based index)\n index = index.value - 1;\n\n return getItemsFromNode(values)[index];\n },\n length: function(values) {\n return new Dimension(getItemsFromNode(values).length);\n },\n /**\n * Creates a Less list of incremental values.\n * Modeled after Lodash's range function, also exists natively in PHP\n * \n * @param {Dimension} [start=1]\n * @param {Dimension} end - e.g. 10 or 10px - unit is added to output\n * @param {Dimension} [step=1] \n */\n range: function(start, end, step) {\n let from;\n let to;\n let stepValue = 1;\n const list = [];\n if (end) {\n to = end;\n from = start.value;\n if (step) {\n stepValue = step.value;\n }\n }\n else {\n from = 1;\n to = start;\n }\n\n for (let i = from; i <= to.value; i += stepValue) {\n list.push(new Dimension(i, to.unit));\n }\n\n return new Expression(list);\n },\n each: function(list, rs) {\n const rules = [];\n let newRules;\n let iterator;\n\n const tryEval = val => {\n if (val instanceof Node) {\n return val.eval(this.context);\n }\n return val;\n };\n\n if (list.value && !(list instanceof Quote)) {\n if (Array.isArray(list.value)) {\n iterator = list.value.map(tryEval);\n } else {\n iterator = [tryEval(list.value)];\n }\n } else if (list.ruleset) {\n iterator = tryEval(list.ruleset).rules;\n } else if (list.rules) {\n iterator = list.rules.map(tryEval);\n } else if (Array.isArray(list)) {\n iterator = list.map(tryEval);\n } else {\n iterator = [tryEval(list)];\n }\n\n let valueName = '@value';\n let keyName = '@key';\n let indexName = '@index';\n\n if (rs.params) {\n valueName = rs.params[0] && rs.params[0].name;\n keyName = rs.params[1] && rs.params[1].name;\n indexName = rs.params[2] && rs.params[2].name;\n rs = rs.rules;\n } else {\n rs = rs.ruleset;\n }\n\n for (let i = 0; i < iterator.length; i++) {\n let key;\n let value;\n const item = iterator[i];\n if (item instanceof Declaration) {\n key = typeof item.name === 'string' ? item.name : item.name[0].value;\n value = item.value;\n } else {\n key = new Dimension(i + 1);\n value = item;\n }\n\n if (item instanceof Comment) {\n continue;\n }\n\n newRules = rs.rules.slice(0);\n if (valueName) {\n newRules.push(new Declaration(valueName,\n value,\n false, false, this.index, this.currentFileInfo));\n }\n if (indexName) {\n newRules.push(new Declaration(indexName,\n new Dimension(i + 1),\n false, false, this.index, this.currentFileInfo));\n }\n if (keyName) {\n newRules.push(new Declaration(keyName,\n key,\n false, false, this.index, this.currentFileInfo));\n }\n\n rules.push(new Ruleset([ new(Selector)([ new Element(\"\", '&') ]) ],\n newRules,\n rs.strictImports,\n rs.visibilityInfo()\n ));\n }\n\n return new Ruleset([ new(Selector)([ new Element(\"\", '&') ]) ],\n rules,\n rs.strictImports,\n rs.visibilityInfo()\n ).eval(this.context);\n }\n};\n","import Dimension from '../tree/dimension';\n\nconst MathHelper = (fn, unit, n) => {\n if (!(n instanceof Dimension)) {\n throw { type: 'Argument', message: 'argument must be a number' };\n }\n if (unit == null) {\n unit = n.unit;\n } else {\n n = n.unify();\n }\n return new Dimension(fn(parseFloat(n.value)), unit);\n};\n\nexport default MathHelper;","import mathHelper from './math-helper.js';\n\nconst mathFunctions = {\n // name, unit\n ceil: null,\n floor: null,\n sqrt: null,\n abs: null,\n tan: '',\n sin: '',\n cos: '',\n atan: 'rad',\n asin: 'rad',\n acos: 'rad'\n};\n\nfor (const f in mathFunctions) {\n if (mathFunctions.hasOwnProperty(f)) {\n mathFunctions[f] = mathHelper.bind(null, Math[f], mathFunctions[f]);\n }\n}\n\nmathFunctions.round = (n, f) => {\n const fraction = typeof f === 'undefined' ? 0 : f.value;\n return mathHelper(num => num.toFixed(fraction), null, n);\n};\n\nexport default mathFunctions;\n","import Dimension from '../tree/dimension';\nimport Anonymous from '../tree/anonymous';\nimport mathHelper from './math-helper.js';\n\nconst minMax = function (isMin, args) {\n args = Array.prototype.slice.call(args);\n switch (args.length) {\n case 0: throw { type: 'Argument', message: 'one or more arguments required' };\n }\n let i; // key is the unit.toString() for unified Dimension values,\n let j;\n let current;\n let currentUnified;\n let referenceUnified;\n let unit;\n let unitStatic;\n let unitClone;\n\n const // elems only contains original argument values.\n order = [];\n\n const values = {};\n // value is the index into the order array.\n for (i = 0; i < args.length; i++) {\n current = args[i];\n if (!(current instanceof Dimension)) {\n if (Array.isArray(args[i].value)) {\n Array.prototype.push.apply(args, Array.prototype.slice.call(args[i].value));\n }\n continue;\n }\n currentUnified = current.unit.toString() === '' && unitClone !== undefined ? new Dimension(current.value, unitClone).unify() : current.unify();\n unit = currentUnified.unit.toString() === '' && unitStatic !== undefined ? unitStatic : currentUnified.unit.toString();\n unitStatic = unit !== '' && unitStatic === undefined || unit !== '' && order[0].unify().unit.toString() === '' ? unit : unitStatic;\n unitClone = unit !== '' && unitClone === undefined ? current.unit.toString() : unitClone;\n j = values[''] !== undefined && unit !== '' && unit === unitStatic ? values[''] : values[unit];\n if (j === undefined) {\n if (unitStatic !== undefined && unit !== unitStatic) {\n throw { type: 'Argument', message: 'incompatible types' };\n }\n values[unit] = order.length;\n order.push(current);\n continue;\n }\n referenceUnified = order[j].unit.toString() === '' && unitClone !== undefined ? new Dimension(order[j].value, unitClone).unify() : order[j].unify();\n if ( isMin && currentUnified.value < referenceUnified.value ||\n !isMin && currentUnified.value > referenceUnified.value) {\n order[j] = current;\n }\n }\n if (order.length == 1) {\n return order[0];\n }\n args = order.map(function (a) { return a.toCSS(this.context); }).join(this.context.compress ? ',' : ', ');\n return new Anonymous(`${isMin ? 'min' : 'max'}(${args})`);\n};\n\nexport default {\n min: function(...args) {\n try {\n return minMax(true, args);\n } catch (e) {}\n },\n max: function(...args) {\n try {\n return minMax(false, args);\n } catch (e) {}\n },\n convert: function (val, unit) {\n return val.convertTo(unit.value);\n },\n pi: function () {\n return new Dimension(Math.PI);\n },\n mod: function(a, b) {\n return new Dimension(a.value % b.value, a.unit);\n },\n pow: function(x, y) {\n if (typeof x === 'number' && typeof y === 'number') {\n x = new Dimension(x);\n y = new Dimension(y);\n } else if (!(x instanceof Dimension) || !(y instanceof Dimension)) {\n throw { type: 'Argument', message: 'arguments must be numbers' };\n }\n\n return new Dimension(Math.pow(x.value, y.value), x.unit);\n },\n percentage: function (n) {\n const result = mathHelper(num => num * 100, '%', n);\n\n return result;\n }\n};\n","import Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport JavaScript from '../tree/javascript';\n\nexport default {\n e: function (str) {\n return new Quoted('\"', str instanceof JavaScript ? str.evaluated : str.value, true);\n },\n escape: function (str) {\n return new Anonymous(\n encodeURI(str.value).replace(/=/g, '%3D').replace(/:/g, '%3A').replace(/#/g, '%23').replace(/;/g, '%3B')\n .replace(/\\(/g, '%28').replace(/\\)/g, '%29'));\n },\n replace: function (string, pattern, replacement, flags) {\n let result = string.value;\n replacement = (replacement.type === 'Quoted') ?\n replacement.value : replacement.toCSS();\n result = result.replace(new RegExp(pattern.value, flags ? flags.value : ''), replacement);\n return new Quoted(string.quote || '', result, string.escaped);\n },\n '%': function (string /* arg, arg, ... */) {\n const args = Array.prototype.slice.call(arguments, 1);\n let result = string.value;\n\n for (let i = 0; i < args.length; i++) {\n /* jshint loopfunc:true */\n result = result.replace(/%[sda]/i, token => {\n const value = ((args[i].type === 'Quoted') &&\n token.match(/s/i)) ? args[i].value : args[i].toCSS();\n return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value;\n });\n }\n result = result.replace(/%%/g, '%');\n return new Quoted(string.quote || '', result, string.escaped);\n }\n};\n","import Keyword from '../tree/keyword';\nimport DetachedRuleset from '../tree/detached-ruleset';\nimport Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport URL from '../tree/url';\nimport Operation from '../tree/operation';\n\nconst isa = (n, Type) => (n instanceof Type) ? Keyword.True : Keyword.False;\nconst isunit = (n, unit) => {\n if (unit === undefined) {\n throw { type: 'Argument', message: 'missing the required second argument to isunit.' };\n }\n unit = typeof unit.value === 'string' ? unit.value : unit;\n if (typeof unit !== 'string') {\n throw { type: 'Argument', message: 'Second argument to isunit should be a unit or a string.' };\n }\n return (n instanceof Dimension) && n.unit.is(unit) ? Keyword.True : Keyword.False;\n};\n\nexport default {\n isruleset: function (n) {\n return isa(n, DetachedRuleset);\n },\n iscolor: function (n) {\n return isa(n, Color);\n },\n isnumber: function (n) {\n return isa(n, Dimension);\n },\n isstring: function (n) {\n return isa(n, Quoted);\n },\n iskeyword: function (n) {\n return isa(n, Keyword);\n },\n isurl: function (n) {\n return isa(n, URL);\n },\n ispixel: function (n) {\n return isunit(n, 'px');\n },\n ispercentage: function (n) {\n return isunit(n, '%');\n },\n isem: function (n) {\n return isunit(n, 'em');\n },\n isunit,\n unit: function (val, unit) {\n if (!(val instanceof Dimension)) {\n throw { type: 'Argument',\n message: `the first argument to unit must be a number${val instanceof Operation ? '. Have you forgotten parenthesis?' : ''}` };\n }\n if (unit) {\n if (unit instanceof Keyword) {\n unit = unit.value;\n } else {\n unit = unit.toCSS();\n }\n } else {\n unit = '';\n }\n return new Dimension(val.value, unit);\n },\n 'get-unit': function (n) {\n return new Anonymous(n.unit);\n }\n};\n","import functionRegistry from './function-registry';\nimport functionCaller from './function-caller';\n\nimport boolean from './boolean';\nimport defaultFunc from './default';\nimport color from './color';\nimport colorBlending from './color-blending';\nimport dataUri from './data-uri';\nimport list from './list';\nimport math from './math';\nimport number from './number';\nimport string from './string';\nimport svg from './svg';\nimport types from './types';\n\nexport default environment => {\n const functions = { functionRegistry, functionCaller };\n\n // register functions\n functionRegistry.addMultiple(boolean);\n functionRegistry.add('default', defaultFunc.eval.bind(defaultFunc));\n functionRegistry.addMultiple(color);\n functionRegistry.addMultiple(colorBlending);\n functionRegistry.addMultiple(dataUri(environment));\n functionRegistry.addMultiple(list);\n functionRegistry.addMultiple(math);\n functionRegistry.addMultiple(number);\n functionRegistry.addMultiple(string);\n functionRegistry.addMultiple(svg(environment));\n functionRegistry.addMultiple(types);\n\n return functions;\n};\n","import Quoted from '../tree/quoted';\nimport URL from '../tree/url';\nimport * as utils from '../utils';\nimport logger from '../logger';\n\nexport default environment => {\n \n const fallback = (functionThis, node) => new URL(node, functionThis.index, functionThis.currentFileInfo).eval(functionThis.context); \n\n return { 'data-uri': function(mimetypeNode, filePathNode) {\n\n if (!filePathNode) {\n filePathNode = mimetypeNode;\n mimetypeNode = null;\n }\n\n let mimetype = mimetypeNode && mimetypeNode.value;\n let filePath = filePathNode.value;\n const currentFileInfo = this.currentFileInfo;\n const currentDirectory = currentFileInfo.rewriteUrls ?\n currentFileInfo.currentDirectory : currentFileInfo.entryPath;\n\n const fragmentStart = filePath.indexOf('#');\n let fragment = '';\n if (fragmentStart !== -1) {\n fragment = filePath.slice(fragmentStart);\n filePath = filePath.slice(0, fragmentStart);\n }\n const context = utils.clone(this.context);\n context.rawBuffer = true;\n\n const fileManager = environment.getFileManager(filePath, currentDirectory, context, environment, true);\n\n if (!fileManager) {\n return fallback(this, filePathNode);\n }\n\n let useBase64 = false;\n\n // detect the mimetype if not given\n if (!mimetypeNode) {\n\n mimetype = environment.mimeLookup(filePath);\n\n if (mimetype === 'image/svg+xml') {\n useBase64 = false;\n } else {\n // use base 64 unless it's an ASCII or UTF-8 format\n const charset = environment.charsetLookup(mimetype);\n useBase64 = ['US-ASCII', 'UTF-8'].indexOf(charset) < 0;\n }\n if (useBase64) { mimetype += ';base64'; }\n }\n else {\n useBase64 = /;base64$/.test(mimetype);\n }\n\n const fileSync = fileManager.loadFileSync(filePath, currentDirectory, context, environment);\n if (!fileSync.contents) {\n logger.warn(`Skipped data-uri embedding of ${filePath} because file not found`);\n return fallback(this, filePathNode || mimetypeNode);\n }\n let buf = fileSync.contents;\n if (useBase64 && !environment.encodeBase64) {\n return fallback(this, filePathNode);\n }\n\n buf = useBase64 ? environment.encodeBase64(buf) : encodeURIComponent(buf);\n\n const uri = `data:${mimetype},${buf}${fragment}`;\n\n return new URL(new Quoted(`\"${uri}\"`, uri, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n }};\n};\n","import Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Expression from '../tree/expression';\nimport Quoted from '../tree/quoted';\nimport URL from '../tree/url';\n\nexport default environment => {\n return { 'svg-gradient': function(direction) {\n let stops;\n let gradientDirectionSvg;\n let gradientType = 'linear';\n let rectangleDimension = 'x=\"0\" y=\"0\" width=\"1\" height=\"1\"';\n const renderEnv = {compress: false};\n let returner;\n const directionValue = direction.toCSS(renderEnv);\n let i;\n let color;\n let position;\n let positionValue;\n let alpha;\n\n function throwArgumentDescriptor() {\n throw { type: 'Argument',\n message: 'svg-gradient expects direction, start_color [start_position], [color position,]...,' +\n ' end_color [end_position] or direction, color list' };\n }\n\n if (arguments.length == 2) {\n if (arguments[1].value.length < 2) {\n throwArgumentDescriptor();\n }\n stops = arguments[1].value;\n } else if (arguments.length < 3) {\n throwArgumentDescriptor();\n } else {\n stops = Array.prototype.slice.call(arguments, 1);\n }\n\n switch (directionValue) {\n case 'to bottom':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\"';\n break;\n case 'to right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'to bottom right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\"';\n break;\n case 'to top right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"100%\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'ellipse':\n case 'ellipse at center':\n gradientType = 'radial';\n gradientDirectionSvg = 'cx=\"50%\" cy=\"50%\" r=\"75%\"';\n rectangleDimension = 'x=\"-50\" y=\"-50\" width=\"101\" height=\"101\"';\n break;\n default:\n throw { type: 'Argument', message: 'svg-gradient direction must be \\'to bottom\\', \\'to right\\',' +\n ' \\'to bottom right\\', \\'to top right\\' or \\'ellipse at center\\'' };\n }\n returner = `<${gradientType}Gradient id=\"g\" ${gradientDirectionSvg}>`;\n\n for (i = 0; i < stops.length; i += 1) {\n if (stops[i] instanceof Expression) {\n color = stops[i].value[0];\n position = stops[i].value[1];\n } else {\n color = stops[i];\n position = undefined;\n }\n\n if (!(color instanceof Color) || (!((i === 0 || i + 1 === stops.length) && position === undefined) && !(position instanceof Dimension))) {\n throwArgumentDescriptor();\n }\n positionValue = position ? position.toCSS(renderEnv) : i === 0 ? '0%' : '100%';\n alpha = color.alpha;\n returner += ``;\n }\n returner += ``;\n\n returner = encodeURIComponent(returner);\n\n returner = `data:image/svg+xml,${returner}`;\n return new URL(new Quoted(`'${returner}'`, returner, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n }};\n};\n","import contexts from './contexts';\nimport visitor from './visitors';\nimport tree from './tree';\n\nexport default function(root, options) {\n options = options || {};\n let evaldRoot;\n let variables = options.variables;\n const evalEnv = new contexts.Eval(options);\n\n //\n // Allows setting variables with a hash, so:\n //\n // `{ color: new tree.Color('#f01') }` will become:\n //\n // new tree.Declaration('@color',\n // new tree.Value([\n // new tree.Expression([\n // new tree.Color('#f01')\n // ])\n // ])\n // )\n //\n if (typeof variables === 'object' && !Array.isArray(variables)) {\n variables = Object.keys(variables).map(function (k) {\n let value = variables[k];\n\n if (!(value instanceof tree.Value)) {\n if (!(value instanceof tree.Expression)) {\n value = new tree.Expression([value]);\n }\n value = new tree.Value([value]);\n }\n return new tree.Declaration(`@${k}`, value, false, null, 0);\n });\n evalEnv.frames = [new tree.Ruleset(null, variables)];\n }\n\n const visitors = [\n new visitor.JoinSelectorVisitor(),\n new visitor.MarkVisibleSelectorsVisitor(true),\n new visitor.ExtendVisitor(),\n new visitor.ToCSSVisitor({compress: Boolean(options.compress)})\n ];\n\n const preEvalVisitors = [];\n let v;\n let visitorIterator;\n\n /**\n * first() / get() allows visitors to be added while visiting\n * \n * @todo Add scoping for visitors just like functions for @plugin; right now they're global\n */\n if (options.pluginManager) {\n visitorIterator = options.pluginManager.visitor();\n for (var i = 0; i < 2; i++) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (v.isPreEvalVisitor) {\n if (i === 0 || preEvalVisitors.indexOf(v) === -1) {\n preEvalVisitors.push(v);\n v.run(root);\n }\n }\n else {\n if (i === 0 || visitors.indexOf(v) === -1) {\n if (v.isPreVisitor) {\n visitors.unshift(v);\n }\n else {\n visitors.push(v);\n }\n }\n }\n }\n }\n }\n\n evaldRoot = root.eval(evalEnv);\n\n for (var i = 0; i < visitors.length; i++) {\n visitors[i].run(evaldRoot);\n }\n\n // Run any remaining visitors added after eval pass\n if (options.pluginManager) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (visitors.indexOf(v) === -1 && preEvalVisitors.indexOf(v) === -1) {\n v.run(evaldRoot);\n }\n }\n }\n\n return evaldRoot;\n};\n","/**\n * Plugin Manager\n */\nclass PluginManager {\n constructor(less) {\n this.less = less;\n this.visitors = [];\n this.preProcessors = [];\n this.postProcessors = [];\n this.installedPlugins = [];\n this.fileManagers = [];\n this.iterator = -1;\n this.pluginCache = {};\n this.Loader = new less.PluginLoader(less);\n }\n\n /**\n * Adds all the plugins in the array\n * @param {Array} plugins\n */\n addPlugins(plugins) {\n if (plugins) {\n for (let i = 0; i < plugins.length; i++) {\n this.addPlugin(plugins[i]);\n }\n }\n }\n\n /**\n *\n * @param plugin\n * @param {String} filename\n */\n addPlugin(plugin, filename, functionRegistry) {\n this.installedPlugins.push(plugin);\n if (filename) {\n this.pluginCache[filename] = plugin;\n }\n if (plugin.install) {\n plugin.install(this.less, this, functionRegistry || this.less.functions.functionRegistry);\n }\n }\n\n /**\n *\n * @param filename\n */\n get(filename) {\n return this.pluginCache[filename];\n }\n\n /**\n * Adds a visitor. The visitor object has options on itself to determine\n * when it should run.\n * @param visitor\n */\n addVisitor(visitor) {\n this.visitors.push(visitor);\n }\n\n /**\n * Adds a pre processor object\n * @param {object} preProcessor\n * @param {number} priority - guidelines 1 = before import, 1000 = import, 2000 = after import\n */\n addPreProcessor(preProcessor, priority) {\n let indexToInsertAt;\n for (indexToInsertAt = 0; indexToInsertAt < this.preProcessors.length; indexToInsertAt++) {\n if (this.preProcessors[indexToInsertAt].priority >= priority) {\n break;\n }\n }\n this.preProcessors.splice(indexToInsertAt, 0, {preProcessor, priority});\n }\n\n /**\n * Adds a post processor object\n * @param {object} postProcessor\n * @param {number} priority - guidelines 1 = before compression, 1000 = compression, 2000 = after compression\n */\n addPostProcessor(postProcessor, priority) {\n let indexToInsertAt;\n for (indexToInsertAt = 0; indexToInsertAt < this.postProcessors.length; indexToInsertAt++) {\n if (this.postProcessors[indexToInsertAt].priority >= priority) {\n break;\n }\n }\n this.postProcessors.splice(indexToInsertAt, 0, {postProcessor, priority});\n }\n\n /**\n *\n * @param manager\n */\n addFileManager(manager) {\n this.fileManagers.push(manager);\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getPreProcessors() {\n const preProcessors = [];\n for (let i = 0; i < this.preProcessors.length; i++) {\n preProcessors.push(this.preProcessors[i].preProcessor);\n }\n return preProcessors;\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getPostProcessors() {\n const postProcessors = [];\n for (let i = 0; i < this.postProcessors.length; i++) {\n postProcessors.push(this.postProcessors[i].postProcessor);\n }\n return postProcessors;\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getVisitors() {\n return this.visitors;\n }\n\n visitor() {\n const self = this;\n return {\n first: function() {\n self.iterator = -1;\n return self.visitors[self.iterator];\n },\n get: function() {\n self.iterator += 1;\n return self.visitors[self.iterator];\n }\n };\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getFileManagers() {\n return this.fileManagers;\n }\n}\n\nlet pm;\n\nconst PluginManagerFactory = function(less, newFactory) {\n if (newFactory || !pm) {\n pm = new PluginManager(less);\n }\n return pm;\n};\n\n//\nexport default PluginManagerFactory;\n","/* global window, XMLHttpRequest */\n\nimport AbstractFileManager from '../less/environment/abstract-file-manager.js';\n\nlet options;\nlet logger;\nlet fileCache = {};\n\n// TODOS - move log somewhere. pathDiff and doing something similar in node. use pathDiff in the other browser file for the initial load\nclass FileManager extends AbstractFileManager {\n alwaysMakePathsAbsolute() {\n return true;\n }\n\n join(basePath, laterPath) {\n if (!basePath) {\n return laterPath;\n }\n return this.extractUrlParts(laterPath, basePath).path;\n }\n\n doXHR(url, type, callback, errback) {\n const xhr = new XMLHttpRequest();\n const async = options.isFileProtocol ? options.fileAsync : true;\n\n if (typeof xhr.overrideMimeType === 'function') {\n xhr.overrideMimeType('text/css');\n }\n logger.debug(`XHR: Getting '${url}'`);\n xhr.open('GET', url, async);\n xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5');\n xhr.send(null);\n\n function handleResponse(xhr, callback, errback) {\n if (xhr.status >= 200 && xhr.status < 300) {\n callback(xhr.responseText,\n xhr.getResponseHeader('Last-Modified'));\n } else if (typeof errback === 'function') {\n errback(xhr.status, url);\n }\n }\n\n if (options.isFileProtocol && !options.fileAsync) {\n if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) {\n callback(xhr.responseText);\n } else {\n errback(xhr.status, url);\n }\n } else if (async) {\n xhr.onreadystatechange = () => {\n if (xhr.readyState == 4) {\n handleResponse(xhr, callback, errback);\n }\n };\n } else {\n handleResponse(xhr, callback, errback);\n }\n }\n\n supports() {\n return true;\n }\n\n clearFileCache() {\n fileCache = {};\n }\n\n loadFile(filename, currentDirectory, options, environment) {\n // TODO: Add prefix support like less-node?\n // What about multiple paths?\n\n if (currentDirectory && !this.isPathAbsolute(filename)) {\n filename = currentDirectory + filename;\n }\n\n filename = options.ext ? this.tryAppendExtension(filename, options.ext) : filename;\n\n options = options || {};\n\n // sheet may be set to the stylesheet for the initial load or a collection of properties including\n // some context variables for imports\n const hrefParts = this.extractUrlParts(filename, window.location.href);\n const href = hrefParts.url;\n const self = this;\n \n return new Promise((resolve, reject) => {\n if (options.useFileCache && fileCache[href]) {\n try {\n const lessText = fileCache[href];\n return resolve({ contents: lessText, filename: href, webInfo: { lastModified: new Date() }});\n } catch (e) {\n return reject({ filename: href, message: `Error loading file ${href} error was ${e.message}` });\n }\n }\n\n self.doXHR(href, options.mime, function doXHRCallback(data, lastModified) {\n // per file cache\n fileCache[href] = data;\n\n // Use remote copy (re-parse)\n resolve({ contents: data, filename: href, webInfo: { lastModified }});\n }, function doXHRError(status, url) {\n reject({ type: 'File', message: `'${url}' wasn't found (${status})`, href });\n });\n });\n }\n}\n\nexport default (opts, log) => {\n options = opts;\n logger = log;\n return FileManager;\n}\n","import Environment from './environment/environment';\nimport data from './data';\nimport tree from './tree';\nimport AbstractFileManager from './environment/abstract-file-manager';\nimport AbstractPluginLoader from './environment/abstract-plugin-loader';\nimport visitors from './visitors';\nimport Parser from './parser/parser';\nimport functions from './functions';\nimport contexts from './contexts';\nimport LessError from './less-error';\nimport transformTree from './transform-tree';\nimport * as utils from './utils';\nimport PluginManager from './plugin-manager';\nimport logger from './logger';\nimport SourceMapOutput from './source-map-output';\nimport SourceMapBuilder from './source-map-builder';\nimport ParseTree from './parse-tree';\nimport ImportManager from './import-manager';\nimport Parse from './parse';\nimport Render from './render';\n\nexport default function(environment, fileManagers) {\n let sourceMapOutput, sourceMapBuilder, parseTree, importManager;\n\n environment = new Environment(environment, fileManagers);\n sourceMapOutput = SourceMapOutput(environment);\n sourceMapBuilder = SourceMapBuilder(sourceMapOutput, environment);\n parseTree = ParseTree(sourceMapBuilder);\n importManager = ImportManager(environment);\n\n const render = Render(environment, parseTree, importManager);\n const parse = Parse(environment, parseTree, importManager);\n\n const initial = {\n version: [4, 0, 0],\n data,\n tree,\n Environment,\n AbstractFileManager,\n AbstractPluginLoader,\n environment,\n visitors,\n Parser,\n functions: functions(environment),\n contexts,\n SourceMapOutput: sourceMapOutput,\n SourceMapBuilder: sourceMapBuilder,\n ParseTree: parseTree,\n ImportManager: importManager,\n render,\n parse,\n LessError,\n transformTree,\n utils,\n PluginManager,\n logger\n };\n\n // Create a public API\n\n const ctor = function(t) {\n return function() {\n const obj = Object.create(t.prototype);\n t.apply(obj, Array.prototype.slice.call(arguments, 0));\n return obj;\n };\n };\n let t;\n const api = Object.create(initial);\n for (const n in initial.tree) {\n /* eslint guard-for-in: 0 */\n t = initial.tree[n];\n if (typeof t === 'function') {\n api[n.toLowerCase()] = ctor(t);\n }\n else {\n api[n] = Object.create(null);\n for (const o in t) {\n /* eslint guard-for-in: 0 */\n api[n][o.toLowerCase()] = ctor(t[o]);\n }\n }\n }\n\n /**\n * Some of the functions assume a `this` context of the API object,\n * which causes it to fail when wrapped for ES6 imports.\n * \n * An assumed `this` should be removed in the future.\n */\n initial.parse = initial.parse.bind(api);\n initial.render = initial.render.bind(api);\n\n return api;\n};\n","import LessError from './less-error';\nimport transformTree from './transform-tree';\nimport logger from './logger';\n\nexport default function(SourceMapBuilder) {\n class ParseTree {\n constructor(root, imports) {\n this.root = root;\n this.imports = imports;\n }\n\n toCSS(options) {\n let evaldRoot;\n const result = {};\n let sourceMapBuilder;\n try {\n evaldRoot = transformTree(this.root, options);\n } catch (e) {\n throw new LessError(e, this.imports);\n }\n\n try {\n const compress = Boolean(options.compress);\n if (compress) {\n logger.warn('The compress option has been deprecated. ' + \n 'We recommend you use a dedicated css minifier, for instance see less-plugin-clean-css.');\n }\n\n const toCSSOptions = {\n compress,\n dumpLineNumbers: options.dumpLineNumbers,\n strictUnits: Boolean(options.strictUnits),\n numPrecision: 8};\n\n if (options.sourceMap) {\n sourceMapBuilder = new SourceMapBuilder(options.sourceMap);\n result.css = sourceMapBuilder.toCSS(evaldRoot, toCSSOptions, this.imports);\n } else {\n result.css = evaldRoot.toCSS(toCSSOptions);\n }\n } catch (e) {\n throw new LessError(e, this.imports);\n }\n\n if (options.pluginManager) {\n const postProcessors = options.pluginManager.getPostProcessors();\n for (let i = 0; i < postProcessors.length; i++) {\n result.css = postProcessors[i].process(result.css, { sourceMap: sourceMapBuilder, options, imports: this.imports });\n }\n }\n if (options.sourceMap) {\n result.map = sourceMapBuilder.getExternalSourceMap();\n }\n\n result.imports = [];\n for (const file in this.imports.files) {\n if (this.imports.files.hasOwnProperty(file) && file !== this.imports.rootFilename) {\n result.imports.push(file);\n }\n }\n return result;\n }\n }\n\n return ParseTree;\n};\n","export default function (SourceMapOutput, environment) {\n class SourceMapBuilder {\n constructor(options) {\n this.options = options;\n }\n\n toCSS(rootNode, options, imports) {\n const sourceMapOutput = new SourceMapOutput(\n {\n contentsIgnoredCharsMap: imports.contentsIgnoredChars,\n rootNode,\n contentsMap: imports.contents,\n sourceMapFilename: this.options.sourceMapFilename,\n sourceMapURL: this.options.sourceMapURL,\n outputFilename: this.options.sourceMapOutputFilename,\n sourceMapBasepath: this.options.sourceMapBasepath,\n sourceMapRootpath: this.options.sourceMapRootpath,\n outputSourceFiles: this.options.outputSourceFiles,\n sourceMapGenerator: this.options.sourceMapGenerator,\n sourceMapFileInline: this.options.sourceMapFileInline, \n disableSourcemapAnnotation: this.options.disableSourcemapAnnotation\n });\n\n const css = sourceMapOutput.toCSS(options);\n this.sourceMap = sourceMapOutput.sourceMap;\n this.sourceMapURL = sourceMapOutput.sourceMapURL;\n if (this.options.sourceMapInputFilename) {\n this.sourceMapInputFilename = sourceMapOutput.normalizeFilename(this.options.sourceMapInputFilename);\n }\n if (this.options.sourceMapBasepath !== undefined && this.sourceMapURL !== undefined) {\n this.sourceMapURL = sourceMapOutput.removeBasepath(this.sourceMapURL);\n }\n return css + this.getCSSAppendage();\n }\n\n getCSSAppendage() {\n\n let sourceMapURL = this.sourceMapURL;\n if (this.options.sourceMapFileInline) {\n if (this.sourceMap === undefined) {\n return '';\n }\n sourceMapURL = `data:application/json;base64,${environment.encodeBase64(this.sourceMap)}`;\n }\n\n if (this.options.disableSourcemapAnnotation) {\n return '';\n }\n\n if (sourceMapURL) {\n return `/*# sourceMappingURL=${sourceMapURL} */`;\n }\n return '';\n }\n\n getExternalSourceMap() {\n return this.sourceMap;\n }\n\n setExternalSourceMap(sourceMap) {\n this.sourceMap = sourceMap;\n }\n\n isInline() {\n return this.options.sourceMapFileInline;\n }\n\n getSourceMapURL() {\n return this.sourceMapURL;\n }\n\n getOutputFilename() {\n return this.options.sourceMapOutputFilename;\n }\n\n getInputFilename() {\n return this.sourceMapInputFilename;\n }\n }\n\n return SourceMapBuilder;\n};\n","export default function (environment) {\n class SourceMapOutput {\n constructor(options) {\n this._css = [];\n this._rootNode = options.rootNode;\n this._contentsMap = options.contentsMap;\n this._contentsIgnoredCharsMap = options.contentsIgnoredCharsMap;\n if (options.sourceMapFilename) {\n this._sourceMapFilename = options.sourceMapFilename.replace(/\\\\/g, '/');\n }\n this._outputFilename = options.outputFilename;\n this.sourceMapURL = options.sourceMapURL;\n if (options.sourceMapBasepath) {\n this._sourceMapBasepath = options.sourceMapBasepath.replace(/\\\\/g, '/');\n }\n if (options.sourceMapRootpath) {\n this._sourceMapRootpath = options.sourceMapRootpath.replace(/\\\\/g, '/');\n if (this._sourceMapRootpath.charAt(this._sourceMapRootpath.length - 1) !== '/') {\n this._sourceMapRootpath += '/';\n }\n } else {\n this._sourceMapRootpath = '';\n }\n this._outputSourceFiles = options.outputSourceFiles;\n this._sourceMapGeneratorConstructor = environment.getSourceMapGenerator();\n\n this._lineNumber = 0;\n this._column = 0;\n }\n\n removeBasepath(path) {\n if (this._sourceMapBasepath && path.indexOf(this._sourceMapBasepath) === 0) {\n path = path.substring(this._sourceMapBasepath.length);\n if (path.charAt(0) === '\\\\' || path.charAt(0) === '/') {\n path = path.substring(1);\n }\n }\n\n return path;\n }\n\n normalizeFilename(filename) {\n filename = filename.replace(/\\\\/g, '/');\n filename = this.removeBasepath(filename);\n return (this._sourceMapRootpath || '') + filename;\n }\n\n add(chunk, fileInfo, index, mapLines) {\n\n // ignore adding empty strings\n if (!chunk) {\n return;\n }\n\n let lines, sourceLines, columns, sourceColumns, i;\n\n if (fileInfo && fileInfo.filename) {\n let inputSource = this._contentsMap[fileInfo.filename];\n\n // remove vars/banner added to the top of the file\n if (this._contentsIgnoredCharsMap[fileInfo.filename]) {\n // adjust the index\n index -= this._contentsIgnoredCharsMap[fileInfo.filename];\n if (index < 0) { index = 0; }\n // adjust the source\n inputSource = inputSource.slice(this._contentsIgnoredCharsMap[fileInfo.filename]);\n }\n\n // ignore empty content\n if (inputSource === undefined) {\n return;\n }\n\n inputSource = inputSource.substring(0, index);\n sourceLines = inputSource.split('\\n');\n sourceColumns = sourceLines[sourceLines.length - 1];\n }\n\n lines = chunk.split('\\n');\n columns = lines[lines.length - 1];\n\n if (fileInfo && fileInfo.filename) {\n if (!mapLines) {\n this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + 1, column: this._column},\n original: { line: sourceLines.length, column: sourceColumns.length},\n source: this.normalizeFilename(fileInfo.filename)});\n } else {\n for (i = 0; i < lines.length; i++) {\n this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + i + 1, column: i === 0 ? this._column : 0},\n original: { line: sourceLines.length + i, column: i === 0 ? sourceColumns.length : 0},\n source: this.normalizeFilename(fileInfo.filename)});\n }\n }\n }\n\n if (lines.length === 1) {\n this._column += columns.length;\n } else {\n this._lineNumber += lines.length - 1;\n this._column = columns.length;\n }\n\n this._css.push(chunk);\n }\n\n isEmpty() {\n return this._css.length === 0;\n }\n\n toCSS(context) {\n this._sourceMapGenerator = new this._sourceMapGeneratorConstructor({ file: this._outputFilename, sourceRoot: null });\n\n if (this._outputSourceFiles) {\n for (const filename in this._contentsMap) {\n if (this._contentsMap.hasOwnProperty(filename)) {\n let source = this._contentsMap[filename];\n if (this._contentsIgnoredCharsMap[filename]) {\n source = source.slice(this._contentsIgnoredCharsMap[filename]);\n }\n this._sourceMapGenerator.setSourceContent(this.normalizeFilename(filename), source);\n }\n }\n }\n\n this._rootNode.genCSS(context, this);\n\n if (this._css.length > 0) {\n let sourceMapURL;\n const sourceMapContent = JSON.stringify(this._sourceMapGenerator.toJSON());\n\n if (this.sourceMapURL) {\n sourceMapURL = this.sourceMapURL;\n } else if (this._sourceMapFilename) {\n sourceMapURL = this._sourceMapFilename;\n }\n this.sourceMapURL = sourceMapURL;\n\n this.sourceMap = sourceMapContent;\n }\n\n return this._css.join('');\n }\n }\n\n return SourceMapOutput;\n};\n","import contexts from './contexts';\nimport Parser from './parser/parser';\nimport LessError from './less-error';\nimport * as utils from './utils';\nimport logger from './logger';\n\nexport default function(environment) {\n // FileInfo = {\n // 'rewriteUrls' - option - whether to adjust URL's to be relative\n // 'filename' - full resolved filename of current file\n // 'rootpath' - path to append to normal URLs for this node\n // 'currentDirectory' - path to the current file, absolute\n // 'rootFilename' - filename of the base file\n // 'entryPath' - absolute path to the entry file\n // 'reference' - whether the file should not be output and only output parts that are referenced\n\n class ImportManager {\n constructor(less, context, rootFileInfo) {\n this.less = less;\n this.rootFilename = rootFileInfo.filename;\n this.paths = context.paths || []; // Search paths, when importing\n this.contents = {}; // map - filename to contents of all the files\n this.contentsIgnoredChars = {}; // map - filename to lines at the beginning of each file to ignore\n this.mime = context.mime;\n this.error = null;\n this.context = context;\n // Deprecated? Unused outside of here, could be useful.\n this.queue = []; // Files which haven't been imported yet\n this.files = {}; // Holds the imported parse trees.\n }\n\n /**\n * Add an import to be imported\n * @param path - the raw path\n * @param tryAppendExtension - whether to try appending a file extension (.less or .js if the path has no extension)\n * @param currentFileInfo - the current file info (used for instance to work out relative paths)\n * @param importOptions - import options\n * @param callback - callback for when it is imported\n */\n push(path, tryAppendExtension, currentFileInfo, importOptions, callback) {\n const importManager = this, pluginLoader = this.context.pluginManager.Loader;\n\n this.queue.push(path);\n\n const fileParsedFunc = function (e, root, fullPath) {\n importManager.queue.splice(importManager.queue.indexOf(path), 1); // Remove the path from the queue\n\n const importedEqualsRoot = fullPath === importManager.rootFilename;\n if (importOptions.optional && e) {\n callback(null, {rules:[]}, false, null);\n logger.info(`The file ${fullPath} was skipped because it was not found and the import was marked optional.`);\n }\n else {\n // Inline imports aren't cached here.\n // If we start to cache them, please make sure they won't conflict with non-inline imports of the\n // same name as they used to do before this comment and the condition below have been added.\n if (!importManager.files[fullPath] && !importOptions.inline) {\n importManager.files[fullPath] = { root, options: importOptions };\n }\n if (e && !importManager.error) { importManager.error = e; }\n callback(e, root, importedEqualsRoot, fullPath);\n }\n };\n\n const newFileInfo = {\n rewriteUrls: this.context.rewriteUrls,\n entryPath: currentFileInfo.entryPath,\n rootpath: currentFileInfo.rootpath,\n rootFilename: currentFileInfo.rootFilename\n };\n\n const fileManager = environment.getFileManager(path, currentFileInfo.currentDirectory, this.context, environment);\n\n if (!fileManager) {\n fileParsedFunc({ message: `Could not find a file-manager for ${path}` });\n return;\n }\n\n const loadFileCallback = function(loadedFile) {\n let plugin;\n const resolvedFilename = loadedFile.filename;\n const contents = loadedFile.contents.replace(/^\\uFEFF/, '');\n\n // Pass on an updated rootpath if path of imported file is relative and file\n // is in a (sub|sup) directory\n //\n // Examples:\n // - If path of imported file is 'module/nav/nav.less' and rootpath is 'less/',\n // then rootpath should become 'less/module/nav/'\n // - If path of imported file is '../mixins.less' and rootpath is 'less/',\n // then rootpath should become 'less/../'\n newFileInfo.currentDirectory = fileManager.getPath(resolvedFilename);\n if (newFileInfo.rewriteUrls) {\n newFileInfo.rootpath = fileManager.join(\n (importManager.context.rootpath || ''),\n fileManager.pathDiff(newFileInfo.currentDirectory, newFileInfo.entryPath));\n\n if (!fileManager.isPathAbsolute(newFileInfo.rootpath) && fileManager.alwaysMakePathsAbsolute()) {\n newFileInfo.rootpath = fileManager.join(newFileInfo.entryPath, newFileInfo.rootpath);\n }\n }\n newFileInfo.filename = resolvedFilename;\n\n const newEnv = new contexts.Parse(importManager.context);\n\n newEnv.processImports = false;\n importManager.contents[resolvedFilename] = contents;\n\n if (currentFileInfo.reference || importOptions.reference) {\n newFileInfo.reference = true;\n }\n\n if (importOptions.isPlugin) {\n plugin = pluginLoader.evalPlugin(contents, newEnv, importManager, importOptions.pluginArgs, newFileInfo);\n if (plugin instanceof LessError) {\n fileParsedFunc(plugin, null, resolvedFilename);\n }\n else {\n fileParsedFunc(null, plugin, resolvedFilename);\n }\n } else if (importOptions.inline) {\n fileParsedFunc(null, contents, resolvedFilename);\n } else {\n\n // import (multiple) parse trees apparently get altered and can't be cached.\n // TODO: investigate why this is\n if (importManager.files[resolvedFilename]\n && !importManager.files[resolvedFilename].options.multiple\n && !importOptions.multiple) {\n\n fileParsedFunc(null, importManager.files[resolvedFilename].root, resolvedFilename);\n }\n else {\n new Parser(newEnv, importManager, newFileInfo).parse(contents, function (e, root) {\n fileParsedFunc(e, root, resolvedFilename);\n });\n }\n }\n };\n let loadedFile;\n let promise;\n const context = utils.clone(this.context);\n\n if (tryAppendExtension) {\n context.ext = importOptions.isPlugin ? '.js' : '.less';\n }\n\n if (importOptions.isPlugin) {\n context.mime = 'application/javascript';\n\n if (context.syncImport) {\n loadedFile = pluginLoader.loadPluginSync(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n } else {\n promise = pluginLoader.loadPlugin(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n }\n }\n else {\n if (context.syncImport) {\n loadedFile = fileManager.loadFileSync(path, currentFileInfo.currentDirectory, context, environment);\n } else {\n promise = fileManager.loadFile(path, currentFileInfo.currentDirectory, context, environment,\n (err, loadedFile) => {\n if (err) {\n fileParsedFunc(err);\n } else {\n loadFileCallback(loadedFile);\n }\n });\n }\n }\n if (loadedFile) {\n if (!loadedFile.filename) {\n fileParsedFunc(loadedFile);\n } else {\n loadFileCallback(loadedFile);\n }\n } else if (promise) {\n promise.then(loadFileCallback, fileParsedFunc);\n }\n }\n }\n\n return ImportManager;\n};\n","import * as utils from './utils';\n\nexport default function(environment, ParseTree, ImportManager) {\n const render = function (input, options, callback) {\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(this.options, {});\n }\n else {\n options = utils.copyOptions(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n return new Promise(function (resolve, reject) {\n render.call(self, input, options, function(err, output) {\n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n this.parse(input, options, function(err, root, imports, options) {\n if (err) { return callback(err); }\n\n let result;\n try {\n const parseTree = new ParseTree(root, imports);\n result = parseTree.toCSS(options);\n }\n catch (err) { return callback(err); }\n\n callback(null, result);\n });\n }\n };\n\n return render;\n};\n","import contexts from './contexts';\nimport Parser from './parser/parser';\nimport PluginManager from './plugin-manager';\nimport LessError from './less-error';\nimport * as utils from './utils';\n\nexport default function(environment, ParseTree, ImportManager) {\n const parse = function (input, options, callback) {\n\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(this.options, {});\n }\n else {\n options = utils.copyOptions(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n return new Promise(function (resolve, reject) {\n parse.call(self, input, options, function(err, output) {\n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n let context;\n let rootFileInfo;\n const pluginManager = new PluginManager(this, !options.reUsePluginManager);\n\n options.pluginManager = pluginManager;\n\n context = new contexts.Parse(options);\n\n if (options.rootFileInfo) {\n rootFileInfo = options.rootFileInfo;\n } else {\n const filename = options.filename || 'input';\n const entryPath = filename.replace(/[^\\/\\\\]*$/, '');\n rootFileInfo = {\n filename,\n rewriteUrls: context.rewriteUrls,\n rootpath: context.rootpath || '',\n currentDirectory: entryPath,\n entryPath,\n rootFilename: filename\n };\n // add in a missing trailing slash\n if (rootFileInfo.rootpath && rootFileInfo.rootpath.slice(-1) !== '/') {\n rootFileInfo.rootpath += '/';\n }\n }\n\n const imports = new ImportManager(this, context, rootFileInfo);\n this.importManager = imports;\n\n // TODO: allow the plugins to be just a list of paths or names\n // Do an async plugin queue like lessc\n\n if (options.plugins) {\n options.plugins.forEach(function(plugin) {\n let evalResult, contents;\n if (plugin.fileContent) {\n contents = plugin.fileContent.replace(/^\\uFEFF/, '');\n evalResult = pluginManager.Loader.evalPlugin(contents, context, imports, plugin.options, plugin.filename);\n if (evalResult instanceof LessError) {\n return callback(evalResult);\n }\n }\n else {\n pluginManager.addPlugin(plugin);\n }\n });\n }\n\n new Parser(context, imports, rootFileInfo)\n .parse(input, function (e, root) {\n if (e) { return callback(e); }\n callback(null, root, imports, options);\n }, options);\n }\n };\n return parse;\n};\n","// TODO: Add tests for browser @plugin\n/* global window */\n\nimport AbstractPluginLoader from '../less/environment/abstract-plugin-loader.js';\n\n/**\n * Browser Plugin Loader\n */\nclass PluginLoader extends AbstractPluginLoader {\n constructor(less) {\n super();\n\n this.less = less;\n // Should we shim this.require for browser? Probably not?\n }\n\n loadPlugin(filename, basePath, context, environment, fileManager) {\n return new Promise((fulfill, reject) => {\n fileManager.loadFile(filename, basePath, context, environment)\n .then(fulfill).catch(reject);\n });\n }\n}\n\nexport default PluginLoader;\n\n","import * as utils from './utils';\nimport browser from './browser';\n\nexport default (window, less, options) => {\n\n function errorHTML(e, rootHref) {\n const id = `less-error-message:${utils.extractId(rootHref || '')}`;\n const template = '
  • {content}
  • ';\n const elem = window.document.createElement('div');\n let timer;\n let content;\n const errors = [];\n const filename = e.filename || rootHref;\n const filenameNoPath = filename.match(/([^\\/]+(\\?.*)?)$/)[1];\n\n elem.id = id;\n elem.className = 'less-error-message';\n\n content = `

    ${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'}` + \n `

    in ${filenameNoPath} `;\n\n const errorline = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\{content\\}/, e.extract[i]));\n }\n };\n\n if (e.line) {\n errorline(e, 0, '');\n errorline(e, 1, 'line');\n errorline(e, 2, '');\n content += `on line ${e.line}, column ${e.column + 1}:

      ${errors.join('')}
    `;\n }\n if (e.stack && (e.extract || options.logLevel >= 4)) {\n content += `
    Stack Trace
    ${e.stack.split('\\n').slice(1).join('
    ')}`;\n }\n elem.innerHTML = content;\n\n // CSS for error messages\n browser.createCSS(window.document, [\n '.less-error-message ul, .less-error-message li {',\n 'list-style-type: none;',\n 'margin-right: 15px;',\n 'padding: 4px 0;',\n 'margin: 0;',\n '}',\n '.less-error-message label {',\n 'font-size: 12px;',\n 'margin-right: 15px;',\n 'padding: 4px 0;',\n 'color: #cc7777;',\n '}',\n '.less-error-message pre {',\n 'color: #dd6666;',\n 'padding: 4px 0;',\n 'margin: 0;',\n 'display: inline-block;',\n '}',\n '.less-error-message pre.line {',\n 'color: #ff0000;',\n '}',\n '.less-error-message h3 {',\n 'font-size: 20px;',\n 'font-weight: bold;',\n 'padding: 15px 0 5px 0;',\n 'margin: 0;',\n '}',\n '.less-error-message a {',\n 'color: #10a',\n '}',\n '.less-error-message .error {',\n 'color: red;',\n 'font-weight: bold;',\n 'padding-bottom: 2px;',\n 'border-bottom: 1px dashed red;',\n '}'\n ].join('\\n'), { title: 'error-message' });\n\n elem.style.cssText = [\n 'font-family: Arial, sans-serif',\n 'border: 1px solid #e00',\n 'background-color: #eee',\n 'border-radius: 5px',\n '-webkit-border-radius: 5px',\n '-moz-border-radius: 5px',\n 'color: #e00',\n 'padding: 15px',\n 'margin-bottom: 15px'\n ].join(';');\n\n if (options.env === 'development') {\n timer = setInterval(() => {\n const document = window.document;\n const body = document.body;\n if (body) {\n if (document.getElementById(id)) {\n body.replaceChild(elem, document.getElementById(id));\n } else {\n body.insertBefore(elem, body.firstChild);\n }\n clearInterval(timer);\n }\n }, 10);\n }\n }\n\n function removeErrorHTML(path) {\n const node = window.document.getElementById(`less-error-message:${utils.extractId(path)}`);\n if (node) {\n node.parentNode.removeChild(node);\n }\n }\n\n function removeErrorConsole(path) {\n // no action\n }\n\n function removeError(path) {\n if (!options.errorReporting || options.errorReporting === 'html') {\n removeErrorHTML(path);\n } else if (options.errorReporting === 'console') {\n removeErrorConsole(path);\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('remove', path);\n }\n }\n\n function errorConsole(e, rootHref) {\n const template = '{line} {content}';\n const filename = e.filename || rootHref;\n const errors = [];\n let content = `${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'} in ${filename}`;\n\n const errorline = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\{content\\}/, e.extract[i]));\n }\n };\n\n if (e.line) {\n errorline(e, 0, '');\n errorline(e, 1, 'line');\n errorline(e, 2, '');\n content += ` on line ${e.line}, column ${e.column + 1}:\\n${errors.join('\\n')}`;\n }\n if (e.stack && (e.extract || options.logLevel >= 4)) {\n content += `\\nStack Trace\\n${e.stack}`;\n }\n less.logger.error(content);\n }\n\n function error(e, rootHref) {\n if (!options.errorReporting || options.errorReporting === 'html') {\n errorHTML(e, rootHref);\n } else if (options.errorReporting === 'console') {\n errorConsole(e, rootHref);\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('add', e, rootHref);\n }\n }\n\n return {\n add: error,\n remove: removeError\n };\n};\n","/**\n * Kicks off less and compiles any stylesheets\n * used in the browser distributed version of less\n * to kick-start less using the browser api\n */\n/* global window, document */\n\nimport defaultOptions from '../less/default-options';\nimport addDefaultOptions from './add-default-options';\nimport root from './index';\n\nconst options = defaultOptions();\n\nif (window.less) {\n for (const key in window.less) {\n if (window.less.hasOwnProperty(key)) {\n options[key] = window.less[key];\n }\n }\n}\naddDefaultOptions(window, options);\n\noptions.plugins = options.plugins || [];\n\nif (window.LESS_PLUGINS) {\n options.plugins = options.plugins.concat(window.LESS_PLUGINS);\n}\n\nconst less = root(window, options);\nexport default less;\n\nwindow.less = less;\n\nlet css;\nlet head;\nlet style;\n\n// Always restore page visibility\nfunction resolveOrReject(data) {\n if (data.filename) {\n console.warn(data);\n }\n if (!options.async) {\n head.removeChild(style);\n }\n}\n\nif (options.onReady) {\n if (/!watch/.test(window.location.hash)) {\n less.watch();\n }\n // Simulate synchronous stylesheet loading by hiding page rendering\n if (!options.async) {\n css = 'body { display: none !important }';\n head = document.head || document.getElementsByTagName('head')[0];\n style = document.createElement('style');\n\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n\n head.appendChild(style);\n }\n less.registerStylesheetsImmediately();\n less.pageLoadFinished = less.refresh(less.env === 'development').then(resolveOrReject, resolveOrReject);\n}\n","// Export a new default each time\nexport default function() {\n return {\n /* Inline Javascript - @plugin still allowed */\n javascriptEnabled: false,\n\n /* Outputs a makefile import dependency list to stdout. */\n depends: false,\n\n /* (DEPRECATED) Compress using less built-in compression. \n * This does an okay job but does not utilise all the tricks of \n * dedicated css compression. */\n compress: false,\n\n /* Runs the less parser and just reports errors without any output. */\n lint: false,\n\n /* Sets available include paths.\n * If the file in an @import rule does not exist at that exact location, \n * less will look for it at the location(s) passed to this option. \n * You might use this for instance to specify a path to a library which \n * you want to be referenced simply and relatively in the less files. */\n paths: [],\n\n /* color output in the terminal */\n color: true,\n\n /* The strictImports controls whether the compiler will allow an @import inside of either \n * @media blocks or (a later addition) other selector blocks.\n * See: https://github.com/less/less.js/issues/656 */\n strictImports: false,\n\n /* Allow Imports from Insecure HTTPS Hosts */\n insecure: false,\n\n /* Allows you to add a path to every generated import and url in your css. \n * This does not affect less import statements that are processed, just ones \n * that are left in the output css. */\n rootpath: '',\n\n /* By default URLs are kept as-is, so if you import a file in a sub-directory \n * that references an image, exactly the same URL will be output in the css. \n * This option allows you to re-write URL's in imported files so that the \n * URL is always relative to the base imported file */\n rewriteUrls: false,\n\n /* How to process math \n * 0 always - eagerly try to solve all operations\n * 1 parens-division - require parens for division \"/\"\n * 2 parens | strict - require parens for all operations\n * 3 strict-legacy - legacy strict behavior (super-strict)\n */\n math: 1,\n\n /* Without this option, less attempts to guess at the output unit when it does maths. */\n strictUnits: false,\n\n /* Effectively the declaration is put at the top of your base Less file, \n * meaning it can be used but it also can be overridden if this variable \n * is defined in the file. */\n globalVars: null,\n\n /* As opposed to the global variable option, this puts the declaration at the\n * end of your base file, meaning it will override anything defined in your Less file. */\n modifyVars: null,\n\n /* This option allows you to specify a argument to go on to every URL. */\n urlArgs: ''\n }\n};","import {addDataAttr} from './utils';\nimport browser from './browser';\n\nexport default (window, options) => {\n\n // use options from the current script tag data attribues\n addDataAttr(options, browser.currentScript(window));\n\n if (options.isFileProtocol === undefined) {\n options.isFileProtocol = /^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(window.location.protocol);\n }\n\n // Load styles asynchronously (default: false)\n //\n // This is set to `false` by default, so that the body\n // doesn't start loading before the stylesheets are parsed.\n // Setting this to `true` can result in flickering.\n //\n options.async = options.async || false;\n options.fileAsync = options.fileAsync || false;\n\n // Interval between watch polls\n options.poll = options.poll || (options.isFileProtocol ? 1000 : 1500);\n\n options.env = options.env || (window.location.hostname == '127.0.0.1' ||\n window.location.hostname == '0.0.0.0' ||\n window.location.hostname == 'localhost' ||\n (window.location.port &&\n window.location.port.length > 0) ||\n options.isFileProtocol ? 'development'\n : 'production');\n\n const dumpLineNumbers = /!dumpLineNumbers:(comments|mediaquery|all)/.exec(window.location.hash);\n if (dumpLineNumbers) {\n options.dumpLineNumbers = dumpLineNumbers[1];\n }\n\n if (options.useFileCache === undefined) {\n options.useFileCache = true;\n }\n\n if (options.onReady === undefined) {\n options.onReady = true;\n }\n\n if (options.relativeUrls) {\n options.rewriteUrls = 'all';\n }\n};\n","//\n// index.js\n// Should expose the additional browser functions on to the less object\n//\nimport {addDataAttr} from './utils';\nimport lessRoot from '../less';\nimport browser from './browser';\nimport FM from './file-manager';\nimport PluginLoader from './plugin-loader';\nimport LogListener from './log-listener';\nimport ErrorReporting from './error-reporting';\nimport Cache from './cache';\nimport ImageSize from './image-size';\n\nexport default (window, options) => {\n const document = window.document;\n const less = lessRoot();\n\n less.options = options;\n const environment = less.environment;\n const FileManager = FM(options, less.logger);\n const fileManager = new FileManager();\n environment.addFileManager(fileManager);\n less.FileManager = FileManager;\n less.PluginLoader = PluginLoader;\n\n LogListener(less, options);\n const errors = ErrorReporting(window, less, options);\n const cache = less.cache = options.cache || Cache(window, options, less.logger);\n ImageSize(less.environment);\n\n // Setup user functions - Deprecate?\n if (options.functions) {\n less.functions.functionRegistry.addMultiple(options.functions);\n }\n\n const typePattern = /^text\\/(x-)?less$/;\n\n function clone(obj) {\n const cloned = {};\n for (const prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n cloned[prop] = obj[prop];\n }\n }\n return cloned;\n }\n\n // only really needed for phantom\n function bind(func, thisArg) {\n const curryArgs = Array.prototype.slice.call(arguments, 2);\n return function() {\n const args = curryArgs.concat(Array.prototype.slice.call(arguments, 0));\n return func.apply(thisArg, args);\n };\n }\n\n function loadStyles(modifyVars) {\n const styles = document.getElementsByTagName('style');\n let style;\n\n for (let i = 0; i < styles.length; i++) {\n style = styles[i];\n if (style.type.match(typePattern)) {\n const instanceOptions = clone(options);\n instanceOptions.modifyVars = modifyVars;\n const lessText = style.innerHTML || '';\n instanceOptions.filename = document.location.href.replace(/#.*$/, '');\n\n /* jshint loopfunc:true */\n // use closure to store current style\n less.render(lessText, instanceOptions,\n bind((style, e, result) => {\n if (e) {\n errors.add(e, 'inline');\n } else {\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = result.css;\n } else {\n style.innerHTML = result.css;\n }\n }\n }, null, style));\n }\n }\n }\n\n function loadStyleSheet(sheet, callback, reload, remaining, modifyVars) {\n\n const instanceOptions = clone(options);\n addDataAttr(instanceOptions, sheet);\n instanceOptions.mime = sheet.type;\n\n if (modifyVars) {\n instanceOptions.modifyVars = modifyVars;\n }\n\n function loadInitialFileCallback(loadedFile) {\n const data = loadedFile.contents;\n const path = loadedFile.filename;\n const webInfo = loadedFile.webInfo;\n\n const newFileInfo = {\n currentDirectory: fileManager.getPath(path),\n filename: path,\n rootFilename: path,\n rewriteUrls: instanceOptions.rewriteUrls\n };\n\n newFileInfo.entryPath = newFileInfo.currentDirectory;\n newFileInfo.rootpath = instanceOptions.rootpath || newFileInfo.currentDirectory;\n\n if (webInfo) {\n webInfo.remaining = remaining;\n\n const css = cache.getCSS(path, webInfo, instanceOptions.modifyVars);\n if (!reload && css) {\n webInfo.local = true;\n callback(null, css, data, sheet, webInfo, path);\n return;\n }\n\n }\n\n // TODO add tests around how this behaves when reloading\n errors.remove(path);\n\n instanceOptions.rootFileInfo = newFileInfo;\n less.render(data, instanceOptions, (e, result) => {\n if (e) {\n e.href = path;\n callback(e);\n } else {\n cache.setCSS(sheet.href, webInfo.lastModified, instanceOptions.modifyVars, result.css);\n callback(null, result.css, data, sheet, webInfo, path);\n }\n });\n }\n\n fileManager.loadFile(sheet.href, null, instanceOptions, environment)\n .then(loadedFile => {\n loadInitialFileCallback(loadedFile);\n }).catch(err => {\n console.log(err);\n callback(err);\n });\n\n }\n\n function loadStyleSheets(callback, reload, modifyVars) {\n for (let i = 0; i < less.sheets.length; i++) {\n loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1), modifyVars);\n }\n }\n\n function initRunningMode() {\n if (less.env === 'development') {\n less.watchTimer = setInterval(() => {\n if (less.watchMode) {\n fileManager.clearFileCache();\n loadStyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n } else if (css) {\n browser.createCSS(window.document, css, sheet);\n }\n });\n }\n }, options.poll);\n }\n }\n\n //\n // Watch mode\n //\n less.watch = function () {\n if (!less.watchMode ) {\n less.env = 'development';\n initRunningMode();\n }\n this.watchMode = true;\n return true;\n };\n\n less.unwatch = function () {clearInterval(less.watchTimer); this.watchMode = false; return false; };\n\n //\n // Synchronously get all tags with the 'rel' attribute set to\n // \"stylesheet/less\".\n //\n less.registerStylesheetsImmediately = () => {\n const links = document.getElementsByTagName('link');\n less.sheets = [];\n\n for (let i = 0; i < links.length; i++) {\n if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) &&\n (links[i].type.match(typePattern)))) {\n less.sheets.push(links[i]);\n }\n }\n };\n\n //\n // Asynchronously get all tags with the 'rel' attribute set to\n // \"stylesheet/less\", returning a Promise.\n //\n less.registerStylesheets = () => new Promise((resolve, reject) => {\n less.registerStylesheetsImmediately();\n resolve();\n });\n\n //\n // With this function, it's possible to alter variables and re-render\n // CSS without reloading less-files\n //\n less.modifyVars = record => less.refresh(true, record, false);\n\n less.refresh = (reload, modifyVars, clearFileCache) => {\n if ((reload || clearFileCache) && clearFileCache !== false) {\n fileManager.clearFileCache();\n }\n return new Promise((resolve, reject) => {\n let startTime;\n let endTime;\n let totalMilliseconds;\n let remainingSheets;\n startTime = endTime = new Date();\n\n // Set counter for remaining unprocessed sheets\n remainingSheets = less.sheets.length;\n\n if (remainingSheets === 0) {\n\n endTime = new Date();\n totalMilliseconds = endTime - startTime;\n less.logger.info('Less has finished and no sheets were loaded.');\n resolve({\n startTime,\n endTime,\n totalMilliseconds,\n sheets: less.sheets.length\n });\n\n } else {\n // Relies on less.sheets array, callback seems to be guaranteed to be called for every element of the array\n loadStyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n reject(e);\n return;\n }\n if (webInfo.local) {\n less.logger.info(`Loading ${sheet.href} from cache.`);\n } else {\n less.logger.info(`Rendered ${sheet.href} successfully.`);\n }\n browser.createCSS(window.document, css, sheet);\n less.logger.info(`CSS for ${sheet.href} generated in ${new Date() - endTime}ms`);\n\n // Count completed sheet\n remainingSheets--;\n\n // Check if the last remaining sheet was processed and then call the promise\n if (remainingSheets === 0) {\n totalMilliseconds = new Date() - startTime;\n less.logger.info(`Less has finished. CSS generated in ${totalMilliseconds}ms`);\n resolve({\n startTime,\n endTime,\n totalMilliseconds,\n sheets: less.sheets.length\n });\n }\n endTime = new Date();\n }, reload, modifyVars);\n }\n\n loadStyles(modifyVars);\n });\n };\n\n less.refreshStyles = loadStyles;\n return less;\n};\n","export default (less, options) => {\n const logLevel_debug = 4;\n const logLevel_info = 3;\n const logLevel_warn = 2;\n const logLevel_error = 1;\n\n // The amount of logging in the javascript console.\n // 3 - Debug, information and errors\n // 2 - Information and errors\n // 1 - Errors\n // 0 - None\n // Defaults to 2\n options.logLevel = typeof options.logLevel !== 'undefined' ? options.logLevel : (options.env === 'development' ? logLevel_info : logLevel_error);\n\n if (!options.loggers) {\n options.loggers = [{\n debug: function(msg) {\n if (options.logLevel >= logLevel_debug) {\n console.log(msg);\n }\n },\n info: function(msg) {\n if (options.logLevel >= logLevel_info) {\n console.log(msg);\n }\n },\n warn: function(msg) {\n if (options.logLevel >= logLevel_warn) {\n console.warn(msg);\n }\n },\n error: function(msg) {\n if (options.logLevel >= logLevel_error) {\n console.error(msg);\n }\n }\n }];\n }\n for (let i = 0; i < options.loggers.length; i++) {\n less.logger.addListener(options.loggers[i]);\n }\n};\n","// Cache system is a bit outdated and could do with work\n\nexport default (window, options, logger) => {\n let cache = null;\n if (options.env !== 'development') {\n try {\n cache = (typeof window.localStorage === 'undefined') ? null : window.localStorage;\n } catch (_) {}\n }\n return {\n setCSS: function(path, lastModified, modifyVars, styles) {\n if (cache) {\n logger.info(`saving ${path} to cache.`);\n try {\n cache.setItem(path, styles);\n cache.setItem(`${path}:timestamp`, lastModified);\n if (modifyVars) {\n cache.setItem(`${path}:vars`, JSON.stringify(modifyVars));\n }\n } catch (e) {\n // TODO - could do with adding more robust error handling\n logger.error(`failed to save \"${path}\" to local storage for caching.`);\n }\n }\n },\n getCSS: function(path, webInfo, modifyVars) {\n const css = cache && cache.getItem(path);\n const timestamp = cache && cache.getItem(`${path}:timestamp`);\n let vars = cache && cache.getItem(`${path}:vars`);\n\n modifyVars = modifyVars || {};\n vars = vars || \"{}\"; // if not set, treat as the JSON representation of an empty object\n\n if (timestamp && webInfo.lastModified &&\n (new Date(webInfo.lastModified).valueOf() ===\n new Date(timestamp).valueOf()) &&\n JSON.stringify(modifyVars) === vars) {\n // Use local copy\n return css;\n }\n }\n };\n};\n","\nimport functionRegistry from './../less/functions/function-registry';\n\nexport default () => {\n function imageSize() {\n throw {\n type: 'Runtime',\n message: 'Image size functions are not supported in browser version of less'\n };\n }\n\n const imageFunctions = {\n 'image-size': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n },\n 'image-width': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n },\n 'image-height': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n }\n };\n\n functionRegistry.addMultiple(imageFunctions);\n};\n"],"names":["extractId","href","replace","addDataAttr","options","tag","opt","dataset","hasOwnProperty","JSON","parse","_","document","styles","sheet","id","title","utils.extractId","oldStyleNode","getElementById","keepOldStyleNode","styleNode","createElement","setAttribute","media","styleSheet","appendChild","createTextNode","childNodes","length","firstChild","nodeValue","head","getElementsByTagName","nextEl","nextSibling","parentNode","insertBefore","removeChild","cssText","e","Error","window","scripts","currentScript","error","msg","this","_fireEvent","warn","info","debug","addListener","listener","_listeners","push","removeListener","i","splice","type","logFunction","externalEnvironment","fileManagers","requiredFunctions","functions","concat","propName","environmentFunc","bind","Environment","filename","currentDirectory","environment","isSync","logger","pluginManager","getFileManagers","fileManager","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","darkgrey","darkgreen","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","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","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","m","cm","mm","in","px","pt","pc","duration","s","ms","angle","rad","Math","PI","deg","grad","turn","colors","unitConversions","parent","visibilityBlocks","undefined","nodeVisible","rootNode","parsed","self","Object","defineProperty","get","fileInfo","getIndex","Node","nodes","set","node","Array","isArray","forEach","_index","_fileInfo","context","strs","genCSS","add","chunk","index","isEmpty","join","output","value","visitor","visit","op","a","b","precision","numPrecision","Number","toFixed","compare","extendStatics","d","setPrototypeOf","__proto__","p","__extends","__","constructor","prototype","create","__assign","assign","t","n","arguments","call","apply","rgb","originalForm","_super","_this","match","map","c","parseInt","alpha","split","Color","r","g","pow","toCSS","doNotCompress","color","colorFunction","compress","args","fround","indexOf","clamp","round","toHSL","h","l","toRGB","splitcolor","other","_operate","toHex","max","min","v","x","keyword","key","toLowerCase","slice","toString","Paren","eval","_noSpaceCombinators"," ","|","emptyOrWhitespace","trim","Combinator","spaceOrEmpty","combinator","isVariable","currentFileInfo","visibilityInfo","copyVisibilityInfo","setParent","Element","firstSelector","charAt","ALWAYS","PARENS_DIVISION","PARENS","RewriteUrls","getLocation","inputStream","line","column","copyArray","arr","copy","clone","obj","cloned","prop","defaults","obj1","obj2","newObj","_defaults","defaults_1","copyOptions","opts","strictMath","math","Constants.Math","relativeUrls","rewriteUrls","Constants.RewriteUrls","flattenArray","result","length_1","anonymousFunc","LessError","fileContentMap","currentFilename","message","stack","input","contents","loc","utils.getLocation","col","callLine","lines","found","func","Function","lineAdjust","callExtract","extract","F","stylize","str","errorTxt","substr","elements","extendList","condition","evaldCondition","getElements","mixinElements_","Selector","visitArray","newSelector","mediaEmpty","els","parseNode","err","imports","sels","olen","len","mixinElements","shift","extend","createDerived","Value","Keyword","True","False","mapLines","rulesetLike","allowRoot","Anonymous","Boolean","MATH","name","important","merge","inline","variable","Declaration","lastRule","prevMath","evaldValue","mathBypass","evalName","importantScope","importantResult","pop","ctx","lineSeparator","dumpLineNumbers","debugInfo","asComment","asMediaQuery","lineNumber","fileName","filenameWithProtocol","test","isLineComment","Comment","getDebugInfo","isCompressed","contexts","copyFromOriginal","original","destination","propertiesToCopy","parseCopyProperties","Parse","paths","evalCopyProperties","isPathRelative","path","isPathLocalRelative","Eval","frames","enterCalc","calcStack","inCalc","exitCalc","inParenthesis","parensStack","outOfParenthesis","mathOn","isMathOn","pathRequiresRewrite","rewritePath","rootpath","newPath","normalizePath","segment","segments","reverse","makeRegistry","base","_data","addMultiple","keys","getLocalFunctions","inherit","defaultFunc","value_","error_","reset","selectors","rules","strictImports","_lookups","_variables","_properties","Ruleset","selCnt","selector","hasVariable","hasOnePassingSelector","j","toParseSelectors","utils.flattenArray","rule","subRule","utils.copyArray","ruleset","originalRuleset","root","firstRoot","allowImports","functionRegistry","globalFunctionRegistry","ctxFrames","unshift","ctxSelectors","evalImports","rsRules","evalFirst","mediaBlockCount","mediaBlocks","filter","resetCache","isJustParentSelector","bubbleSelectors","importRules","makeImportant","lastSelector","_rulesets","reduce","hash","variables","vars","name_1","name_2","decl","parseValue","properties","toParse","transformDeclaration","nodes_1","filtRules","isRuleset","foundMixins","rulesets","find","ruleNodes","tabLevel","sep","tabRuleStr","tabSetStr","charsetNodeIndex","importNodeIndex","isCharset","pathCnt","pathSubCnt","currentLastRule","isRulesetLike","isVisible","joinSelector","createParenthesis","elementsToPak","originalElement","replacementParen","insideParent","createSelector","containedElement","element","addReplacementIntoPath","beginningPath","addPath","replacedElement","originalSelector","newSelectorPath","newJoinedSelector","parentEl","restOfPath","addAllReplacementsIntoPath","addPaths","mergeElementsOnToSelectors","sel","deriveSelector","deriveFrom","newPaths","replaceParentSelector","inSelector","k","currentElements","newSelectors","selectorsMultiplied","el","maybeSelector","hadParentSelector","nestedSelector","replaced","nestedPaths","replacedNewSelectors","concatenated","isRooted","createEmptySelectors","AtRule","outputRuleset","mediaPathBackup","mediaBlocksBackup","mediaPath","ruleCnt","DetachedRuleset","numerator","denominator","backupUnit","sort","Unit","strictUnits","returnStr","is","unitString","toUpperCase","RegExp","callback","group","mapUnit","groupName","atomicUnit","counter","count","unit","parseFloat","isNaN","Dimension","isSingular","strValue","String","isLength","convertTo","usedUnits","cancel","unify","numericCompare","conversions","targetUnit","applyUnit","derivedConversions","operands","isSpaced","Operation","toColor","operate","noSpacing","Expression","returnValue","parens","doubleParen","parensInOp","functionCaller","evalArgs","commentFilter","item","subNodes","il","jl","calc","Call","currentMathContext","funcCaller","FunctionCaller","isValid","columnNumber","Variable","evaluating","frame","fun","Property","property","mergeRules","less","visitors","ToCSSVisitor","_mergeRules","vArr","Attribute","content","escaped","quote","variableRegex","propRegex","Quoted","that","iterativeReplace","regexp","replacementFnc","evaluatedValue","val","isEvald","URL","urlArgs","features","Media","evalTop","evalNested","multiMedia","permute","fragment","rest","css","pathValue","getPath","Import","isPlugin","reference","containsVariables","doEval","blocksVisibility","addVisibilityBlock","registry","skip","importedFilename","newImport","evalPath","string","expression","JavaScript","evaluateJavaScript","JsEvalNode","evalContext","javascriptEnabled","jsify","toJS","Assignment","negate","lvalue","rvalue","Condition","UnicodeDescriptor","Negative","option","object_id","Extend","next_id","parent_ids","allowBefore","allowAfter","selectorElements","selfElements","selfSelectors","VariableCall","detachedRuleset","callEval","ruleCall","lookups","NamespaceValue","lastDeclaration","substring","params","variadic","arity","optionalParameters","required","Definition","mixinEnv","evaldArguments","varargs","arg","isNamedFound","argIndex","argsLength","prependRule","_arguments","mixinFrames","evalParams","allArgsCnt","requiredArgsCnt","MixinCall","mixins","mixin","mixinPath","argValue","f","isRecursive","isOneFound","candidate","defaultResult","noArgumentsFilter","candidates","conditionResult","calcDefGroup","namespace","matchCondition","expand","matchArgs","MixinDefinition","format","newRules","evalCall","_setVisibilityToReplacement","replacement","AbstractFileManager","lastIndexOf","ext","tryAppendExtension","basePath","laterPath","url","baseUrl","urlDirectories","baseUrlDirectories","urlParts","extractUrlParts","baseUrlParts","diff","hostPart","directories","urlPartsRegex","returner","rawDirectories","rawPath","fileUrl","require","AbstractPluginLoader","pluginOptions","pluginObj","localModule","shortname","FileManager","trySetOptions","use","exports","loader","tree","validatePlugin","minVersion","compareVersion","addPlugin","plugin","setOptions","version","versionToString","aVersion","bVersion","versionString","plugins","printUsage","_visitArgs","visitDeeper","_hasIndexed","_noop","implementation","_implementation","_visitInCache","_visitOutCache","indexNodeTypes","ticker","child","typeIndex","Visitor","nodeTypeIndex","fnName","impl","funcOut","visitArgs","newNode","isReplacing","cnt","accept","nonReplacing","out","evald","flatten","nestedCnt","nestedItem","onSequencerEmpty","variableImports","_onSequencerEmpty","_currentDepth","ImportSequencer","importSequencer","importItem","isReady","tryRun","variableImport","ImportVisitor","importer","finish","_visitor","_importer","_finish","importCount","onceFileDetectionMap","recursionDetector","_sequencer","run","isFinished","visitImport","importNode","inlineCSS","importParent","isVariableImport","addVariableImport","processImportNode","evaldImportNode","evalForImport","multiple","importMultiple","tryAppendLessExtension","onImported","sequencedOnImported","addImport","importedAtRoot","fullPath","importVisitor","isOptional","optional","duplicateImport","oldContext","visitDeclaration","declNode","visitDeclarationOut","visitAtRule","atRuleNode","visitAtRuleOut","visitMixinDefinition","mixinDefinitionNode","visitMixinDefinitionOut","visitRuleset","rulesetNode","visitRulesetOut","visitMedia","mediaNode","visitMediaOut","visible","SetTreeVisibilityVisitor","ensureVisibility","ensureInvisibility","allExtendsStack","ExtendFinderVisitor","allExtends","allSelectorsExtendList","extendOnEveryPath","selectorPath","selExtendList","allSelectorsExtend","foundExtends","findSelfSelectors","firstExtendOnThisSelectorPath","ProcessExtendsVisitor","extendFinder","extendIndices","doExtendChaining","newRoot","checkExtendsForNonMatched","indices","hasFoundMatches","extendsList","extendsListTarget","iterationCount","extendIndex","targetExtendIndex","matches","targetExtend","newExtend","extendsToAdd","extendVisitor","findMatch","selfSelector","extendSelector","extendChainCount","selectorOne","selectorTwo","ruleNode","selectorNode","pathIndex","selectorsToAdd","extendedSelectors","haystackSelectorPath","haystackSelectorIndex","hackstackSelector","hackstackElementIndex","haystackElement","targetCombinator","potentialMatch","needleElements","potentialMatches","matched","initialCombinator","isElementValuesEqual","finished","endPathIndex","endPathElementIndex","elementValue1","elementValue2","replacementSelector","matchIndex","firstElement","newElements","currentSelectorPathIndex","currentSelectorPathElementIndex","currentValue","derived","newAllExtends","lastIndex","JoinSelectorVisitor","getIsOutput","joinSelectors","_context","CSSVisitorUtils","bodyRules","isSilent","owner","thing","originalRules","containsSilentNonBlockedChild","compiledRulesBody","keepOnlyVisibleChilds","removeVisibilityBlock","hasVisibleSelector","utils","mixinNode","visitExtend","extendNode","visitComment","commentNode","resolveVisibility","visitAtRuleWithBody","visitAtRuleWithoutBody","visitAnonymous","anonymousNode","nodeRules","hasFakeRuleset","getBodyRules","charset","comment","checkValidNodes","isRoot","_compileRulesetPaths","nodeRuleCnt","_removeDuplicateRules","isVisibleRuleset","ruleList","ruleCache","ruleCSS","groups","groupsArr","result_1","space_1","comma_1","MarkVisibleSelectorsVisitor","ExtendVisitor","furthest","furthestPossibleErrorMessage","chunks","current","currentPos","saveStack","parserInput","skipWhitespace","nextChar","oldi","oldj","curr","endIndex","mem","inp","charCodeAt","autoCommentAbsorb","nextNewLine","text","commentStore","nextStarSlash","save","restore","possibleErrorMessage","state","forget","isWhitespace","offset","pos","code","$re","tok","exec","$char","$str","tokLength","$quoted","startChar","currentPosition","$parseUntil","testChar","returnVal","inComment","blockDepth","blockStack","parseGroups","startPos","lastPos","loop","char","expected","peek","peekChar","currentChar","prevChar","getInput","peekNotNumeric","start","chunkInput","failFunction","fail","lastOpening","lastOpeningParen","lastMultiComment","lastMultiCommentEndBrace","chunkerCurrentIndex","currentChunkStartIndex","cc","cc2","level","parenLevel","emitFrom","emitChunk","force","fromCharCode","chunker","end","furthestReachedEnd","furthestChar","Parser","parsers","getParserInput","expect","expectChar","parseList","currentIndex","returnNodes","parser","additionalData","globalVars","modifyVars","ignored","preText","serializeVars","preProcessors","getPreProcessors","process","banner","contentsIgnoredChars","primary","endInfo","processImports","extendRule","definition","declaration","variableCall","entities","atrule","foundSemiColon","mixinLookup","quoted","forceEscaped","isEscaped","fromKeyword","customFuncCall","stop","ieAlpha","boolean","if","prevArgs","isSemiColonSeparated","argsComma","argsSemiColon","assignment","literal","dimension","unicodeDescriptor","entity","ch","variableCurly","curly","propertyCurly","colorKeyword","ud","javascript","js","escape","parsedName","inValue","ruleLookups","isRule","getLookup","hasParens","elem","elemIndex","re","isCall","expressionContainsNamed","nameLoop","expressions","hasSep","throwAwayComments","cond","argInfo","conditions","block","lookupValue","attribute","slashedCombinator","isLess","when","blockRuleset","hasDR","ruleProperty","permissiveValue","anonymousValue","untilTokens","done","testCurrentChar","import","dir","importOptions","mediaFeatures","o","optionName","importOption","mediaFeature","pluginArgs","nonVendorSpecificName","hasIdentifier","hasExpression","hasUnknown","hasBlock","sub","addition","multiplication","operation","operand","needsParens","logical","next","conditionAnd","negatedCondition","parenthesisCondition","atomicCondition","body","me","tryConditionFollowedByParenthesis","delim","simpleProperty","If","trueValue","falseValue","colorFunctions","hsla","origColor","hsl","toHSV","number","rgba","size","m1_1","m2_1","hue","hsv","hsva","vs","floor","perm","saturation","lightness","hsvhue","hsvsaturation","hsvvalue","luma","luminance","saturate","amount","method","desaturate","lighten","darken","fadein","fadeout","fade","spin","mix","color1","color2","weight","w","w1","w2","greyscale","contrast","dark","light","threshold","argb","toARGB","tint","shade","colorBlend","mode","cb","cs","ar","cr","ab","as","colorBlendModeFunctions","multiply","screen","overlay","softlight","sqrt","hardlight","difference","abs","exclusion","average","negation","getItemsFromNode","_SELF","~","_i","expr","values","range","step","from","to","stepValue","list","each","rs","iterator","tryEval","Quote","valueName","keyName","indexName","MathHelper","fn","mathFunctions","ceil","sin","cos","atan","asin","acos","mathHelper","fraction","num","minMax","isMin","currentUnified","referenceUnified","unitStatic","unitClone","order","convert","pi","mod","y","percentage","evaluated","encodeURI","pattern","flags","%","token","encodeURIComponent","isa","Type","isunit","isruleset","iscolor","isnumber","isstring","iskeyword","isurl","ispixel","ispercentage","isem","get-unit","colorBlending","fallback","functionThis","data-uri","mimetypeNode","filePathNode","mimetype","filePath","entryPath","fragmentStart","utils.clone","rawBuffer","getFileManager","useBase64","mimeLookup","charsetLookup","fileSync","loadFileSync","buf","encodeBase64","uri","dataUri","svg-gradient","direction","stops","gradientDirectionSvg","position","positionValue","gradientType","rectangleDimension","renderEnv","directionValue","throwArgumentDescriptor","types","evaldRoot","evalEnv","visitorIterator","preEvalVisitors","first","isPreEvalVisitor","isPreVisitor","pm","postProcessors","installedPlugins","pluginCache","Loader","PluginLoader","PluginManager","install","preProcessor","priority","indexToInsertAt","postProcessor","manager","PluginManagerFactory","newFactory","sourceMapOutput","sourceMapBuilder","parseTree","importManager","SourceMapBuilder","ParseTree","transformTree","toCSSOptions","sourceMap","getPostProcessors","file","getExternalSourceMap","files","rootFilename","SourceMapOutput","contentsIgnoredCharsMap","contentsMap","sourceMapFilename","sourceMapURL","outputFilename","sourceMapOutputFilename","sourceMapBasepath","sourceMapRootpath","outputSourceFiles","sourceMapGenerator","sourceMapFileInline","disableSourcemapAnnotation","sourceMapInputFilename","normalizeFilename","removeBasepath","getCSSAppendage","_css","_rootNode","_contentsMap","_contentsIgnoredCharsMap","_sourceMapFilename","_outputFilename","_sourceMapBasepath","_sourceMapRootpath","_outputSourceFiles","_sourceMapGeneratorConstructor","getSourceMapGenerator","_lineNumber","_column","sourceLines","columns","sourceColumns","inputSource","_sourceMapGenerator","addMapping","generated","source","sourceRoot","setSourceContent","sourceMapContent","stringify","toJSON","rootFileInfo","mime","queue","ImportManager","pluginLoader","fileParsedFunc","importedEqualsRoot","newFileInfo","loadedFile","promise","loadFileCallback","resolvedFilename","pathDiff","isPathAbsolute","alwaysMakePathsAbsolute","newEnv","evalPlugin","syncImport","loadPluginSync","loadPlugin","loadFile","then","render","utils.copyOptions","self_1","Promise","resolve","reject","Render","context_1","pluginManager_1","reUsePluginManager","imports_1","evalResult","fileContent","initial","data","ctor","api","fileCache","errback","xhr","XMLHttpRequest","async","isFileProtocol","fileAsync","handleResponse","status","responseText","getResponseHeader","overrideMimeType","open","setRequestHeader","send","onreadystatechange","readyState","location","useFileCache","lessText","webInfo","lastModified","Date","doXHR","log","fulfill","catch","rootHref","errorReporting","errors","errorline","classname","logLevel","errorConsole","timer","filenameNoPath","className","innerHTML","browser","style","env","setInterval","replaceChild","clearInterval","errorHTML","remove","removeErrorHTML","depends","lint","insecure","protocol","poll","hostname","port","onReady","addDefaultOptions","LESS_PLUGINS","lessRoot","FM","addFileManager","loggers","console","LogListener","ErrorReporting","cache","localStorage","setCSS","setItem","getCSS","getItem","timestamp","valueOf","Cache","imageSize","imageFunctions","image-size","image-width","image-height","ImageSize","typePattern","thisArg","curryArgs","loadStyles","instanceOptions","loadStyleSheet","reload","remaining","local","loadInitialFileCallback","loadStyleSheets","sheets","watch","watchMode","watchTimer","clearFileCache","unwatch","registerStylesheetsImmediately","links","rel","registerStylesheets","record","refresh","startTime","endTime","totalMilliseconds","remainingSheets","refreshStyles","resolveOrReject","pageLoadFinished"],"mappings":"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"} \ No newline at end of file From 92d46f7c4f95786c523cc8d3c46852bbcc0b183f Mon Sep 17 00:00:00 2001 From: Matthew Dean Date: Sat, 5 Dec 2020 09:12:10 -0800 Subject: [PATCH 10/19] Updated dist files --- lerna.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lerna.json b/lerna.json index d190800cd..d27fc5bf8 100644 --- a/lerna.json +++ b/lerna.json @@ -3,5 +3,5 @@ "packages/*" ], "npmClient": "npm", - "version": "3.12.2" + "version": "4.0.0" } From 9a340cd7f8aa99e586be6b412e9e34e9e466564f Mon Sep 17 00:00:00 2001 From: Matthew Dean Date: Sat, 5 Dec 2020 09:12:40 -0800 Subject: [PATCH 11/19] v4.0.0 --- packages/less/package-lock.json | 2 +- packages/less/package.json | 4 ++-- packages/test-data/package.json | 2 +- packages/test-import-module/package.json | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/less/package-lock.json b/packages/less/package-lock.json index 9f92c4b14..0e27fee1b 100644 --- a/packages/less/package-lock.json +++ b/packages/less/package-lock.json @@ -1,6 +1,6 @@ { "name": "less", - "version": "3.12.2", + "version": "4.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/packages/less/package.json b/packages/less/package.json index e41b02a7d..76f1ae656 100644 --- a/packages/less/package.json +++ b/packages/less/package.json @@ -54,8 +54,8 @@ "source-map": "~0.6.0" }, "devDependencies": { - "@less/test-data": "^3.12.2", - "@less/test-import-module": "^3.12.0", + "@less/test-data": "^4.0.0", + "@less/test-import-module": "^4.0.0", "@typescript-eslint/eslint-plugin": "^3.3.0", "@typescript-eslint/parser": "^3.3.0", "benny": "^3.6.12", diff --git a/packages/test-data/package.json b/packages/test-data/package.json index e60f371f8..f73d282ed 100644 --- a/packages/test-data/package.json +++ b/packages/test-data/package.json @@ -3,7 +3,7 @@ "publishConfig": { "access": "public" }, - "version": "3.12.2", + "version": "4.0.0", "description": "Less files and CSS results", "author": { "name": "Alexis Sellier", diff --git a/packages/test-import-module/package.json b/packages/test-import-module/package.json index be9e1c5bc..1d002a5dc 100644 --- a/packages/test-import-module/package.json +++ b/packages/test-import-module/package.json @@ -1,7 +1,7 @@ { "name": "@less/test-import-module", "private": true, - "version": "3.12.0", + "version": "4.0.0", "description": "Less files to be included in node_modules directory for testing import from node_modules", "author": { "name": "Alexis Sellier", From 70e242c5bdb2245696f7ca63845b50a8d00cf5ac Mon Sep 17 00:00:00 2001 From: Matthew Dean Date: Sat, 5 Dec 2020 09:17:16 -0800 Subject: [PATCH 12/19] Remove ieCompat option --- packages/less/src/less/contexts.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/less/src/less/contexts.js b/packages/less/src/less/contexts.js index d6b4540c2..e76658833 100644 --- a/packages/less/src/less/contexts.js +++ b/packages/less/src/less/contexts.js @@ -43,7 +43,6 @@ contexts.Parse = function(options) { const evalCopyProperties = [ 'paths', // additional include paths 'compress', // whether to compress - 'ieCompat', // whether to enforce IE compatibility (IE8 data-uri) 'math', // whether math has to be within parenthesis 'strictUnits', // whether units need to evaluate correctly 'sourceMap', // whether to output a source map From d6cc422f94e7274b912ba524772ab71c70fce42b Mon Sep 17 00:00:00 2001 From: Matthew Dean Date: Sat, 5 Dec 2020 09:18:40 -0800 Subject: [PATCH 13/19] Add dist files --- dist/less.js | 3 +-- dist/less.min.js | 4 ++-- dist/less.min.js.map | 2 +- packages/less/dist/less.js | 3 +-- packages/less/dist/less.min.js | 4 ++-- packages/less/dist/less.min.js.map | 2 +- 6 files changed, 8 insertions(+), 10 deletions(-) diff --git a/dist/less.js b/dist/less.js index 06749c853..3d7366530 100644 --- a/dist/less.js +++ b/dist/less.js @@ -1,5 +1,5 @@ /** - * Less - Leaner CSS v3.12.1-alpha.13+ed734098 + * Less - Leaner CSS v4.0.1-alpha.0+70e242c5 * http://lesscss.org * * Copyright (c) 2009-2020, Alexis Sellier @@ -1674,7 +1674,6 @@ var evalCopyProperties = [ 'paths', 'compress', - 'ieCompat', 'math', 'strictUnits', 'sourceMap', diff --git a/dist/less.min.js b/dist/less.min.js index 302041fa6..34348cf92 100644 --- a/dist/less.min.js +++ b/dist/less.min.js @@ -1,5 +1,5 @@ /** - * Less - Leaner CSS v3.12.1-alpha.13+ed734098 + * Less - Leaner CSS v4.0.1-alpha.0+70e242c5 * http://lesscss.org * * Copyright (c) 2009-2020, Alexis Sellier @@ -7,5 +7,5 @@ * * @license Apache-2.0 */ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).less=t()}(this,(function(){"use strict";function e(e){return e.replace(/^[a-z-]+:\/+?[^\/]+/,"").replace(/[\?\&]livereload=\w+/,"").replace(/^\//,"").replace(/\.[a-zA-Z]+$/,"").replace(/[^\.\w-]+/g,"-").replace(/\./g,":")}function t(e,t){for(var n in t.dataset)if(t.dataset.hasOwnProperty(n))if("env"===n||"dumpLineNumbers"===n||"rootpath"===n||"errorReporting"===n)e[n]=t.dataset[n];else try{e[n]=JSON.parse(t.dataset[n])}catch(e){}}var n=function(t,n,i){var r=i.href||"",o="less:"+(i.title||e(r)),s=t.getElementById(o),a=!1,l=t.createElement("style");l.setAttribute("type","text/css"),i.media&&l.setAttribute("media",i.media),l.id=o,l.styleSheet||(l.appendChild(t.createTextNode(n)),a=null!==s&&s.childNodes.length>0&&l.childNodes.length>0&&s.firstChild.nodeValue===l.firstChild.nodeValue);var u=t.getElementsByTagName("head")[0];if(null===s||!1===a){var c=i&&i.nextSibling||null;c?c.parentNode.insertBefore(l,c):u.appendChild(l)}if(s&&!1===a&&s.parentNode.removeChild(s),l.styleSheet)try{l.styleSheet.cssText=n}catch(e){throw new Error("Couldn't reassign styleSheet.cssText.")}},i=function(e){var t,n=e.document;return n.currentScript||(t=n.getElementsByTagName("script"))[t.length-1]},r={error:function(e){this._fireEvent("error",e)},warn:function(e){this._fireEvent("warn",e)},info:function(e){this._fireEvent("info",e)},debug:function(e){this._fireEvent("debug",e)},addListener:function(e){this._listeners.push(e)},removeListener:function(e){for(var t=0;t=0;a--){var l=s[a];if(l[o?"supportsSync":"supports"](e,t,n,i))return l}return null},e.prototype.addFileManager=function(e){this.fileManagers.push(e)},e.prototype.clearFileManagers=function(){this.fileManagers=[]},e}(),s={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",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:"#ff00ff",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:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",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:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",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:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},a={length:{m:1,cm:.01,mm:.001,in:.0254,px:.0254/96,pt:.0254/72,pc:.0254/72*12},duration:{s:1,ms:.001},angle:{rad:1/(2*Math.PI),deg:1/360,grad:1/400,turn:1}},l={colors:s,unitConversions:a},u=function(){function e(){this.parent=null,this.visibilityBlocks=void 0,this.nodeVisible=void 0,this.rootNode=null,this.parsed=null;var e=this;Object.defineProperty(this,"currentFileInfo",{get:function(){return e.fileInfo()}}),Object.defineProperty(this,"index",{get:function(){return e.getIndex()}})}return e.prototype.setParent=function(t,n){function i(t){t&&t instanceof e&&(t.parent=n)}Array.isArray(t)?t.forEach(i):i(t)},e.prototype.getIndex=function(){return this._index||this.parent&&this.parent.getIndex()||0},e.prototype.fileInfo=function(){return this._fileInfo||this.parent&&this.parent.fileInfo()||{}},e.prototype.isRulesetLike=function(){return!1},e.prototype.toCSS=function(e){var t=[];return this.genCSS(e,{add:function(e,n,i){t.push(e)},isEmpty:function(){return 0===t.length}}),t.join("")},e.prototype.genCSS=function(e,t){t.add(this.value)},e.prototype.accept=function(e){this.value=e.visit(this.value)},e.prototype.eval=function(){return this},e.prototype._operate=function(e,t,n,i){switch(t){case"+":return n+i;case"-":return n-i;case"*":return n*i;case"/":return n/i}},e.prototype.fround=function(e,t){var n=e&&e.numPrecision;return n?Number((t+2e-16).toFixed(n)):t},e.compare=function(t,n){if(t.compare&&"Quoted"!==n.type&&"Anonymous"!==n.type)return t.compare(n);if(n.compare)return-n.compare(t);if(t.type===n.type){if(t=t.value,n=n.value,!Array.isArray(t))return t===n?0:void 0;if(t.length===n.length){for(var i=0;it?1:void 0},e.prototype.blocksVisibility=function(){return null==this.visibilityBlocks&&(this.visibilityBlocks=0),0!==this.visibilityBlocks},e.prototype.addVisibilityBlock=function(){null==this.visibilityBlocks&&(this.visibilityBlocks=0),this.visibilityBlocks=this.visibilityBlocks+1},e.prototype.removeVisibilityBlock=function(){null==this.visibilityBlocks&&(this.visibilityBlocks=0),this.visibilityBlocks=this.visibilityBlocks-1},e.prototype.ensureVisibility=function(){this.nodeVisible=!0},e.prototype.ensureInvisibility=function(){this.nodeVisible=!1},e.prototype.isVisible=function(){return this.nodeVisible},e.prototype.visibilityInfo=function(){return{visibilityBlocks:this.visibilityBlocks,nodeVisible:this.nodeVisible}},e.prototype.copyVisibilityInfo=function(e){e&&(this.visibilityBlocks=e.visibilityBlocks,this.nodeVisible=e.nodeVisible)},e}(),c=function(e,t){return(c=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};function h(e,t){function n(){this.constructor=e}c(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var f=function(){return(f=Object.assign||function(e){for(var t,n=1,i=arguments.length;n=6?(r.rgb=[],t.match(/.{2}/g).map((function(e,t){t<3?o.rgb.push(parseInt(e,16)):o.alpha=parseInt(e,16)/255}))):(r.rgb=[],t.split("").map((function(e,t){t<3?o.rgb.push(parseInt(e+e,16)):o.alpha=parseInt(e+e,16)/255}))),r.alpha=r.alpha||("number"==typeof n?n:1),void 0!==i&&(r.value=i),r}return h(t,e),t.prototype.luma=function(){var e=this.rgb[0]/255,t=this.rgb[1]/255,n=this.rgb[2]/255;return.2126*(e=e<=.03928?e/12.92:Math.pow((e+.055)/1.055,2.4))+.7152*(t=t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4))+.0722*(n=n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4))},t.prototype.genCSS=function(e,t){t.add(this.toCSS(e))},t.prototype.toCSS=function(e,t){var n,i,r,o=e&&e.compress&&!t,s=[];if(i=this.fround(e,this.alpha),this.value)if(0===this.value.indexOf("rgb"))i<1&&(r="rgba");else{if(0!==this.value.indexOf("hsl"))return this.value;r=i<1?"hsla":"hsl"}else i<1&&(r="rgba");switch(r){case"rgba":s=this.rgb.map((function(e){return v(Math.round(e),255)})).concat(v(i,1));break;case"hsla":s.push(v(i,1));case"hsl":n=this.toHSL(),s=[this.fround(e,n.h),this.fround(e,100*n.s)+"%",this.fround(e,100*n.l)+"%"].concat(s)}if(r)return r+"("+s.join(","+(o?"":" "))+")";if(n=this.toRGB(),o){var a=n.split("");a[1]===a[2]&&a[3]===a[4]&&a[5]===a[6]&&(n="#"+a[1]+a[3]+a[5])}return n},t.prototype.operate=function(e,n,i){for(var r=new Array(3),o=this.alpha*(1-i.alpha)+i.alpha,s=0;s<3;s++)r[s]=this._operate(e,n,this.rgb[s],i.rgb[s]);return new t(r,o)},t.prototype.toRGB=function(){return d(this.rgb)},t.prototype.toHSL=function(){var e,t,n=this.rgb[0]/255,i=this.rgb[1]/255,r=this.rgb[2]/255,o=this.alpha,s=Math.max(n,i,r),a=Math.min(n,i,r),l=(s+a)/2,u=s-a;if(s===a)e=t=0;else{switch(t=l>.5?u/(2-s-a):u/(s+a),s){case n:e=(i-r)/u+(i=0&&"\n"!==t.charAt(n);)r++;return"number"==typeof e&&(i=(t.slice(0,e).match(/\n/g)||"").length),{line:i,column:r}}function k(e){var t,n=e.length,i=new Array(n);for(t=0;t|Function):(\d+):(\d+)/,V=function(e,t,n){Error.call(this);var i=e.filename||n;if(this.message=e.message,this.stack=e.stack,t&&i){var r=t.contents[i],o=C(e.index,r),s=o.line,a=o.column,l=e.call&&C(e.call,r).line,u=r?r.split("\n"):"";if(this.type=e.type||"Syntax",this.filename=i,this.index=e.index,this.line="number"==typeof s?s+1:null,this.column=a,!this.line&&this.stack){var c=this.stack.match(R),h=new Function("a","throw new Error()"),f=0;try{h()}catch(e){var p=e.stack.match(R);f=1-(s=parseInt(p[2]))}c&&(c[2]&&(this.line=parseInt(c[2])+f),c[3]&&(this.column=parseInt(c[3])))}this.callLine=l+1,this.callExtract=u[l],this.extract=[u[this.line-2],u[this.line-1],u[this.line]]}};if(void 0===Object.create){var F=function(){};F.prototype=Error.prototype,V.prototype=new F}else V.prototype=Object.create(Error.prototype);V.prototype.constructor=V,V.prototype.toString=function(e){e=e||{};var t="",n=this.extract||[],i=[],r=function(e){return e};if(e.stylize){var o=typeof e.stylize;if("function"!==o)throw Error("options.stylize should be a function, got a "+o+"!");r=e.stylize}if(null!==this.line){if("string"==typeof n[0]&&i.push(r(this.line-1+" "+n[0],"grey")),"string"==typeof n[1]){var s=this.line+" ";n[1]&&(s+=n[1].slice(0,this.column)+r(r(r(n[1].substr(this.column,1),"bold")+n[1].slice(this.column+1),"red"),"inverse")),i.push(s)}"string"==typeof n[2]&&i.push(r(this.line+1+" "+n[2],"grey")),i=i.join("\n")+r("","reset")+"\n"}return t+=r(this.type+"Error: "+this.message,"red"),this.filename&&(t+=r(" in ","red")+this.filename),this.line&&(t+=r(" on line "+this.line+", column "+(this.column+1)+":","grey")),t+="\n"+i,this.callLine&&(t+=r("from ","red")+(this.filename||"")+"/n",t+=r(this.callLine,"grey")+" "+this.callExtract+"/n"),t};var $=function(e){function t(t,n,i,r,o,s){var a=e.call(this)||this;return a.extendList=n,a.condition=i,a.evaldCondition=!i,a._index=r,a._fileInfo=o,a.elements=a.getElements(t),a.mixinElements_=void 0,a.copyVisibilityInfo(s),a.setParent(a.elements,a),a}return h(t,e),t.prototype.accept=function(e){this.elements&&(this.elements=e.visitArray(this.elements)),this.extendList&&(this.extendList=e.visitArray(this.extendList)),this.condition&&(this.condition=e.visit(this.condition))},t.prototype.createDerived=function(e,n,i){var r=new t(e=this.getElements(e),n||this.extendList,null,this.getIndex(),this.fileInfo(),this.visibilityInfo());return r.evaldCondition=null!=i?i:this.evaldCondition,r.mediaEmpty=this.mediaEmpty,r},t.prototype.getElements=function(e){return e?("string"==typeof e&&this.parse.parseNode(e,["selector"],this._index,this._fileInfo,(function(t,n){if(t)throw new V({index:t.index,message:t.message},this.parse.imports,this._fileInfo.filename);e=n[0].elements})),e):[new b("","&",!1,this._index,this._fileInfo)]},t.prototype.createEmptySelectors=function(){var e=[new t([new b("","&",!1,this._index,this._fileInfo)],null,null,this._index,this._fileInfo)];return e[0].mediaEmpty=!0,e},t.prototype.match=function(e){var t,n,i=this.elements,r=i.length;if(0===(t=(e=e.mixinElements()).length)||rw.PARENS_DIVISION)||this.parensStack&&this.parensStack.length))},j.Eval.prototype.pathRequiresRewrite=function(e){return(this.rewriteUrls===S?J:W)(e)},j.Eval.prototype.rewritePath=function(e,t){var n;return t=t||"",n=this.normalizePath(t+e),J(e)&&W(t)&&!1===J(n)&&(n="./"+n),n},j.Eval.prototype.normalizePath=function(e){var t,n=e.split("/").reverse();for(e=[];0!==n.length;)switch(t=n.pop()){case".":break;case"..":0===e.length||".."===e[e.length-1]?e.push(t):e.pop();break;default:e.push(t)}return e.join("/")};var H=function e(t){return{_data:{},add:function(e,t){e=e.toLowerCase(),this._data.hasOwnProperty(e),this._data[e]=t},addMultiple:function(e){var t=this;Object.keys(e).forEach((function(n){t.add(n,e[n])}))},get:function(e){return this._data[e]||t&&t.get(e)},getLocalFunctions:function(){return this._data},inherit:function(){return e(this)},create:function(t){return e(t)}}}(null),Q={eval:function(){var e=this.value_,t=this.error_;if(t)throw t;if(null!=e)return e?L.True:L.False},value:function(e){this.value_=e},error:function(e){this.error_=e},reset:function(){this.value_=this.error_=null}},K=function(e){function t(t,n,i,r){var o=e.call(this)||this;return o.selectors=t,o.rules=n,o._lookups={},o._variables=null,o._properties=null,o.strictImports=i,o.copyVisibilityInfo(r),o.allowRoot=!0,o.setParent(o.selectors,o),o.setParent(o.rules,o),o}return h(t,e),t.prototype.isRulesetLike=function(){return!0},t.prototype.accept=function(e){this.paths?this.paths=e.visitArray(this.paths,!0):this.selectors&&(this.selectors=e.visitArray(this.selectors)),this.rules&&this.rules.length&&(this.rules=e.visitArray(this.rules))},t.prototype.eval=function(e){var n,i,r,o,s,a=!1;if(this.selectors&&(i=this.selectors.length)){for(n=new Array(i),Q.error({type:"Syntax",message:"it is currently only allowed in parametric mixin guards,"}),o=0;o0;e--){var t=this.rules[e-1];if(t instanceof B)return this.parseValue(t)}},t.prototype.parseValue=function(e){var t=this;function n(e){return e.value instanceof N&&!e.parsed?("string"==typeof e.value.value?this.parse.parseNode(e.value.value,["value","important"],e.value.getIndex(),e.fileInfo(),(function(t,n){t&&(e.parsed=!0),n&&(e.value=n[0],e.important=n[1]||"",e.parsed=!0)})):e.parsed=!0,e):e}if(Array.isArray(e)){var i=[];return e.forEach((function(e){i.push(n.call(t,e))})),i}return n.call(t,e)},t.prototype.rulesets=function(){if(!this.rules)return[];var e,t,n=[],i=this.rules;for(e=0;t=i[e];e++)t.isRuleset&&n.push(t);return n},t.prototype.prependRule=function(e){var t=this.rules;t?t.unshift(e):this.rules=[e],this.setParent(e,this)},t.prototype.find=function(e,t,n){t=t||this;var i,r,o=[],s=e.toCSS();return s in this._lookups?this._lookups[s]:(this.rulesets().forEach((function(s){if(s!==t)for(var a=0;ai){if(!n||n(s)){r=s.find(new $(e.elements.slice(i)),t,n);for(var l=0;l0&&t.add(l),e.firstSelector=!0,s[0].genCSS(e,t),e.firstSelector=!1,i=1;i0?(o=(r=k(e)).pop(),s=i.createDerived(k(o.elements))):s=i.createDerived([]),t.length>0){var a=n.combinator,l=t[0].elements[0];a.emptyOrWhitespace&&!l.combinator.emptyOrWhitespace&&(a=l.combinator),s.elements.push(new b(a,l.value,n.isVariable,n._index,n._fileInfo)),s.elements=s.elements.concat(t[0].elements.slice(1))}if(0!==s.elements.length&&r.push(s),t.length>1){var u=t.slice(1);u=u.map((function(e){return e.createDerived(e.elements,[])})),r=r.concat(u)}return r}function s(e,t,n,i,r){var s;for(s=0;s0?i[i.length-1]=i[i.length-1].createDerived(i[i.length-1].elements.concat(e)):i.push(new $(e));else t.push([new $(e)])}function l(e,t){var n=t.createDerived(t.elements,t.extendList,t.evaldCondition);return n.copyVisibilityInfo(e),n}var u,c;if(!function e(t,n,l){var u,c,h,f,p,v,d,g,y,w,x,S,I=!1;for(f=[],p=[[]],u=0;g=l.elements[u];u++)if("&"!==g.value){var C=(S=void 0,(x=g).value instanceof m&&(S=x.value.value)instanceof $?S:null);if(null!=C){a(f,p);var k,_=[],A=[];for(k=e(_,n,C),I=I||k,h=0;h<_.length;h++){s(p,[r(i(_[h],g),g)],g,l,A)}p=A,f=[]}else f.push(g)}else{for(I=!0,v=[],a(f,p),c=0;c0&&d[0].elements.push(new b(g.combinator,"",g.isVariable,g._index,g._fileInfo)),v.push(d);else for(h=0;h0&&(t.push(p[u]),w=p[u][y-1],p[u][y-1]=w.createDerived(w.elements,l.extendList));return I}(c=[],t,n))if(t.length>0)for(c=[],u=0;u0)for(t=0;t-1e-6&&(i=n.toFixed(20).replace(/0+$/,"")),e&&e.compress){if(0===n&&this.unit.isLength())return void t.add(i);n>0&&n<1&&(i=i.substr(1))}t.add(i),this.unit.genCSS(e,t)},t.prototype.operate=function(e,n,i){var r=this._operate(e,n,this.value,i.value),o=this.unit.clone();if("+"===n||"-"===n)if(0===o.numerator.length&&0===o.denominator.length)o=i.unit.clone(),this.unit.backupUnit&&(o.backupUnit=this.unit.backupUnit);else if(0===i.unit.numerator.length&&0===o.denominator.length);else{if(i=i.convertTo(this.unit.usedUnits()),e.strictUnits&&i.unit.toString()!==o.toString())throw new Error("Incompatible units. Change the units or use the unit function. Bad units: '"+o.toString()+"' and '"+i.unit.toString()+"'.");r=this._operate(e,n,this.value,i.value)}else"*"===n?(o.numerator=o.numerator.concat(i.unit.numerator).sort(),o.denominator=o.denominator.concat(i.unit.denominator).sort(),o.cancel()):"/"===n&&(o.numerator=o.numerator.concat(i.unit.denominator).sort(),o.denominator=o.denominator.concat(i.unit.numerator).sort(),o.cancel());return new t(r,o)},t.prototype.compare=function(e){var n,i;if(e instanceof t){if(this.unit.isEmpty()||e.unit.isEmpty())n=this,i=e;else if(n=this.unify(),i=e.unify(),0!==n.unit.compare(i.unit))return;return u.numericCompare(n.value,i.value)}},t.prototype.unify=function(){return this.convertTo({length:"px",duration:"s",angle:"rad"})},t.prototype.convertTo=function(e){var n,i,r,o,s,l=this.value,u=this.unit.clone(),c={};if("string"==typeof e){for(n in a)a[n].hasOwnProperty(e)&&((c={})[n]=e);e=c}for(i in s=function(e,t){return r.hasOwnProperty(e)?(t?l/=r[e]/r[o]:l*=r[e]/r[o],o):e},e)e.hasOwnProperty(i)&&(o=e[i],r=a[i],u.map(s));return u.cancel(),new t(l,u)},t}(u);ee.prototype.type="Dimension";var te=w,ne=function(e){function t(t,n,i){var r=e.call(this)||this;return r.op=t.trim(),r.operands=n,r.isSpaced=i,r}return h(t,e),t.prototype.accept=function(e){this.operands=e.visitArray(this.operands)},t.prototype.eval=function(e){var n,i=this.operands[0].eval(e),r=this.operands[1].eval(e);if(e.isMathOn(this.op)){if(n="./"===this.op?"/":this.op,i instanceof ee&&r instanceof p&&(i=i.toColor()),r instanceof ee&&i instanceof p&&(r=r.toColor()),!i.operate){if(i instanceof t&&"/"===i.op&&e.math===te.PARENS_DIVISION)return new t(this.op,[i,r],this.isSpaced);throw{type:"Operation",message:"Operation on an invalid type"}}return i.operate(e,n,r)}return new t(this.op,[i,r],this.isSpaced)},t.prototype.genCSS=function(e,t){this.operands[0].genCSS(e,t),this.isSpaced&&t.add(" "),t.add(this.op),this.isSpaced&&t.add(" "),this.operands[1].genCSS(e,t)},t}(u);ne.prototype.type="Operation";var ie=function(e){function t(t,n){var i=e.call(this)||this;if(i.value=t,i.noSpacing=n,!t)throw new Error("Expression requires an array parameter");return i}return h(t,e),t.prototype.accept=function(e){this.value=e.visitArray(this.value)},t.prototype.eval=function(e){var n,i=e.isMathOn(),r=this.parens,o=!1;return r&&e.inParenthesis(),this.value.length>1?n=new t(this.value.map((function(t){return t.eval?t.eval(e):t})),this.noSpacing):1===this.value.length?(!this.value[0].parens||this.value[0].parensInOp||e.inCalc||(o=!0),n=this.value[0].eval(e)):n=this,r&&e.outOfParenthesis(),!this.parens||!this.parensInOp||i||o||n instanceof ee||(n=new m(n)),n},t.prototype.genCSS=function(e,t){for(var n=0;n1){var n=new $([],null,null,this.getIndex(),this.fileInfo()).createEmptySelectors();(t=new K(n,e.mediaBlocks)).multiMedia=!0,t.copyVisibilityInfo(this.visibilityInfo()),this.setParent(t,this)}return delete e.mediaBlocks,delete e.mediaPath,t},t.prototype.evalNested=function(e){var t,n,i=e.mediaPath.concat([this]);for(t=0;t0;t--)e.splice(t,0,new N("and"));return new ie(e)}))),this.setParent(this.features,this),new K([],[])},t.prototype.permute=function(e){if(0===e.length)return[];if(1===e.length)return e[0];for(var t=[],n=this.permute(e.slice(1)),i=0;i1?"["+e.value.map((function(e){return e.toCSS()})).join(", ")+"]":e.toCSS()},t}(u));pe.prototype.type="JavaScript";var ve=function(e){function t(t,n){var i=e.call(this)||this;return i.key=t,i.value=n,i}return h(t,e),t.prototype.accept=function(e){this.value=e.visit(this.value)},t.prototype.eval=function(e){return this.value.eval?new t(this.key,this.value.eval(e)):this},t.prototype.genCSS=function(e,t){t.add(this.key+"="),this.value.genCSS?this.value.genCSS(e,t):t.add(this.value)},t}(u);ve.prototype.type="Assignment";var de=function(e){function t(t,n,i,r,o){var s=e.call(this)||this;return s.op=t.trim(),s.lvalue=n,s.rvalue=i,s._index=r,s.negate=o,s}return h(t,e),t.prototype.accept=function(e){this.lvalue=e.visit(this.lvalue),this.rvalue=e.visit(this.rvalue)},t.prototype.eval=function(e){var t=function(e,t,n){switch(e){case"and":return t&&n;case"or":return t||n;default:switch(u.compare(t,n)){case-1:return"<"===e||"=<"===e||"<="===e;case 0:return"="===e||">="===e||"=<"===e||"<="===e;case 1:return">"===e||">="===e;default:return!1}}}(this.op,this.lvalue.eval(e),this.rvalue.eval(e));return this.negate?!t:t},t}(u);de.prototype.type="Condition";var me=function(e){function t(t){var n=e.call(this)||this;return n.value=t,n}return h(t,e),t}(u);me.prototype.type="UnicodeDescriptor";var ge=function(e){function t(t){var n=e.call(this)||this;return n.value=t,n}return h(t,e),t.prototype.genCSS=function(e,t){t.add("-"),this.value.genCSS(e,t)},t.prototype.eval=function(e){return e.isMathOn()?new ne("*",[new ee(-1),this.value]).eval(e):new t(this.value.eval(e))},t}(u);ge.prototype.type="Negative";var ye=function(e){function t(n,i,r,o,s){var a=e.call(this)||this;switch(a.selector=n,a.option=i,a.object_id=t.next_id++,a.parent_ids=[a.object_id],a._index=r,a._fileInfo=o,a.copyVisibilityInfo(s),a.allowRoot=!0,i){case"all":a.allowBefore=!0,a.allowAfter=!0;break;default:a.allowBefore=!1,a.allowAfter=!1}return a.setParent(a.selector,a),a}return h(t,e),t.prototype.accept=function(e){this.selector=e.visit(this.selector)},t.prototype.eval=function(e){return new t(this.selector.eval(e),this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},t.prototype.clone=function(e){return new t(this.selector,this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},t.prototype.findSelfSelectors=function(e){var t,n,i=[];for(t=0;t0&&n.length&&""===n[0].combinator.value&&(n[0].combinator.value=" "),i=i.concat(e[t].elements);this.selfSelectors=[new $(i)],this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo())},t}(u);ye.next_id=0,ye.prototype.type="Extend";var be=function(e){function t(t,n,i){var r=e.call(this)||this;return r.variable=t,r._index=n,r._fileInfo=i,r.allowRoot=!0,r}return h(t,e),t.prototype.eval=function(e){var t,n=new se(this.variable,this.getIndex(),this.fileInfo()).eval(e),i=new V({message:"Could not evaluate variable call "+this.variable});if(!n.ruleset){if(n.rules)t=n;else if(Array.isArray(n))t=new K("",n);else{if(!Array.isArray(n.value))throw i;t=new K("",n.value)}n=new X(t)}if(n.ruleset)return n.callEval(e);throw i},t}(u);be.prototype.type="VariableCall";var we=function(e){function t(t,n,i,r){var o=e.call(this)||this;return o.value=t,o.lookups=n,o._index=i,o._fileInfo=r,o}return h(t,e),t.prototype.eval=function(e){var t,n,i=this.value.eval(e);for(t=0;tthis.params.length)return!1}n=Math.min(o,this.arity);for(var s=0;s0){for(c=!0,a=0;a0)f=2;else if(f=1,p[1]+p[2]>1)throw{type:"Runtime",message:"Ambiguous use of `default()` found when matching for `"+this.format(m)+"`",index:this.getIndex(),filename:this.fileInfo().filename};for(a=0;a0&&(e=e.slice(0,t)),(t=e.lastIndexOf("/"))<0&&(t=e.lastIndexOf("\\")),t<0?"":e.slice(0,t+1)},e.prototype.tryAppendExtension=function(e,t){return/(\.[a-z]*$)|([\?;].*)$/.test(e)?e:e+t},e.prototype.tryAppendLessExtension=function(e){return this.tryAppendExtension(e,".less")},e.prototype.supportsSync=function(){return!1},e.prototype.alwaysMakePathsAbsolute=function(){return!1},e.prototype.isPathAbsolute=function(e){return/^(?:[a-z-]+:|\/|\\|#)/i.test(e)},e.prototype.join=function(e,t){return e?e+t:t},e.prototype.pathDiff=function(e,t){var n,i,r,o,s=this.extractUrlParts(e),a=this.extractUrlParts(t),l="";if(s.hostPart!==a.hostPart)return"";for(i=Math.max(a.directories.length,s.directories.length),n=0;nparseInt(t[n])?-1:1;return 0},e.prototype.versionToString=function(e){for(var t="",n=0;n0;){var e=this.imports[0];if(!e.isReady)return;this.imports=this.imports.slice(1),e.callback.apply(null,e.args)}if(0===this.variableImports.length)break;var t=this.variableImports[0];this.variableImports=this.variableImports.slice(1),t()}}finally{this._currentDepth--}0===this._currentDepth&&this._onSequencerEmpty&&this._onSequencerEmpty()},e}(),Re=function(e,t){this._visitor=new Ee(this),this._importer=e,this._finish=t,this.context=new j.Eval,this.importCount=0,this.onceFileDetectionMap={},this.recursionDetector={},this._sequencer=new Pe(this._onSequencerEmpty.bind(this))};Re.prototype={isReplacing:!1,run:function(e){try{this._visitor.visit(e)}catch(e){this.error=e}this.isFinished=!0,this._sequencer.tryRun()},_onSequencerEmpty:function(){this.isFinished&&this._finish(this.error)},visitImport:function(e,t){var n=e.options.inline;if(!e.css||n){var i=new j.Eval(this.context,k(this.context.frames)),r=i.frames[0];this.importCount++,e.isVariableImport()?this._sequencer.addVariableImport(this.processImportNode.bind(this,e,i,r)):this.processImportNode(e,i,r)}t.visitDeeper=!1},processImportNode:function(e,t,n){var i,r=e.options.inline;try{i=e.evalForImport(t)}catch(t){t.filename||(t.index=e.getIndex(),t.filename=e.fileInfo().filename),e.css=!0,e.error=t}if(!i||i.css&&!r)this.importCount--,this.isFinished&&this._sequencer.tryRun();else{i.options.multiple&&(t.importMultiple=!0);for(var o=void 0===i.css,s=0;s=0||(a=[u.selfSelectors[0]],(o=f.findMatch(l,a)).length&&(l.hasFoundMatches=!0,l.selfSelectors.forEach((function(e){var t=u.visibilityInfo();s=f.extendSelector(o,a,e,l.isVisible()),(c=new Ie.Extend(u.selector,u.option,0,u.fileInfo(),t)).selfSelectors=s,s[s.length-1].extendList=[c],h.push(c),c.ruleset=u.ruleset,c.parent_ids=c.parent_ids.concat(u.parent_ids,l.parent_ids),u.firstExtendOnThisSelectorPath&&(c.firstExtendOnThisSelectorPath=!0,u.ruleset.paths.push(s))}))));if(h.length){if(this.extendChainCount++,n>100){var p="{unable to calculate}",v="{unable to calculate}";try{p=h[0].selfSelectors[0].toCSS(),v=h[0].selector.toCSS()}catch(e){}throw{message:"extend circular reference detected. One of the circular extends is currently:"+p+":extend("+v+")"}}return h.concat(f.doExtendChaining(h,t,n+1))}return h},e.prototype.visitDeclaration=function(e,t){t.visitDeeper=!1},e.prototype.visitMixinDefinition=function(e,t){t.visitDeeper=!1},e.prototype.visitSelector=function(e,t){t.visitDeeper=!1},e.prototype.visitRuleset=function(e,t){if(!e.root){var n,i,r,o,s=this.allExtendsStack[this.allExtendsStack.length-1],a=[],l=this;for(r=0;r0&&u[l.matched].combinator.value!==s?l=null:l.matched++,l&&(l.finished=l.matched===u.length,l.finished&&!e.allowAfter&&(r+1u&&c>0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[u].elements.slice(c)),c=0,u++),l=o.elements.slice(c,a.index).concat([s]).concat(n.elements.slice(1)),u===a.pathIndex&&r>0?h[h.length-1].elements=h[h.length-1].elements.concat(l):(h=h.concat(t.slice(u,a.pathIndex))).push(new Ie.Selector(l)),u=a.endPathIndex,(c=a.endPathElementIndex)>=t[u].elements.length&&(c=0,u++);return u0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[u].elements.slice(c)),u++),h=(h=h.concat(t.slice(u,t.length))).map((function(e){var t=e.createDerived(e.elements);return i?t.ensureVisibility():t.ensureInvisibility(),t}))},e.prototype.visitMedia=function(e,t){var n=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);n=n.concat(this.doExtendChaining(n,e.allExtends)),this.allExtendsStack.push(n)},e.prototype.visitMediaOut=function(e){var t=this.allExtendsStack.length-1;this.allExtendsStack.length=t},e.prototype.visitAtRule=function(e,t){var n=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);n=n.concat(this.doExtendChaining(n,e.allExtends)),this.allExtendsStack.push(n)},e.prototype.visitAtRuleOut=function(e){var t=this.allExtendsStack.length-1;this.allExtendsStack.length=t},e}(),Oe=function(){function e(){this.contexts=[[]],this._visitor=new Ee(this)}return e.prototype.run=function(e){return this._visitor.visit(e)},e.prototype.visitDeclaration=function(e,t){t.visitDeeper=!1},e.prototype.visitMixinDefinition=function(e,t){t.visitDeeper=!1},e.prototype.visitRuleset=function(e,t){var n,i=this.contexts[this.contexts.length-1],r=[];this.contexts.push(r),e.root||((n=e.selectors)&&(n=n.filter((function(e){return e.getIsOutput()})),e.selectors=n.length?n:n=null,n&&e.joinSelectors(r,i,n)),n||(e.rules=null),e.paths=r)},e.prototype.visitRulesetOut=function(e){this.contexts.length=this.contexts.length-1},e.prototype.visitMedia=function(e,t){var n=this.contexts[this.contexts.length-1];e.rules[0].root=0===n.length||n[0].multiMedia},e.prototype.visitAtRule=function(e,t){var n=this.contexts[this.contexts.length-1];e.rules&&e.rules.length&&(e.rules[0].root=e.isRooted||0===n.length||null)},e}(),Le=function(){function e(e){this._visitor=new Ee(this),this._context=e}return e.prototype.containsSilentNonBlockedChild=function(e){var t;if(!e)return!1;for(var n=0;n0},e.prototype.resolveVisibility=function(e,t){if(!e.blocksVisibility()){if(this.isEmpty(e)&&!this.containsSilentNonBlockedChild(t))return;return e}var n=e.rules[0];if(this.keepOnlyVisibleChilds(n),!this.isEmpty(n))return e.ensureVisibility(),e.removeVisibilityBlock(),e},e.prototype.isVisibleRuleset=function(e){return!!e.firstRoot||!this.isEmpty(e)&&!(!e.root&&!this.hasVisibleSelector(e))},e}(),Ne=function(e){this._visitor=new Ee(this),this._context=e,this.utils=new Le(e)};Ne.prototype={isReplacing:!0,run:function(e){return this._visitor.visit(e)},visitDeclaration:function(e,t){if(!e.blocksVisibility()&&!e.variable)return e},visitMixinDefinition:function(e,t){e.frames=[]},visitExtend:function(e,t){},visitComment:function(e,t){if(!e.blocksVisibility()&&!e.isSilent(this._context))return e},visitMedia:function(e,t){var n=e.rules[0].rules;return e.accept(this._visitor),t.visitDeeper=!1,this.utils.resolveVisibility(e,n)},visitImport:function(e,t){if(!e.blocksVisibility())return e},visitAtRule:function(e,t){return e.rules&&e.rules.length?this.visitAtRuleWithBody(e,t):this.visitAtRuleWithoutBody(e,t)},visitAnonymous:function(e,t){if(!e.blocksVisibility())return e.accept(this._visitor),e},visitAtRuleWithBody:function(e,t){var n=function(e){var t=e.rules;return function(e){var t=e.rules;return 1===t.length&&(!t[0].paths||0===t[0].paths.length)}(e)?t[0].rules:t}(e);return e.accept(this._visitor),t.visitDeeper=!1,this.utils.isEmpty(e)||this._mergeRules(e.rules[0].rules),this.utils.resolveVisibility(e,n)},visitAtRuleWithoutBody:function(e,t){if(!e.blocksVisibility()){if("@charset"===e.name){if(this.charset){if(e.debugInfo){var n=new Ie.Comment("/* "+e.toCSS(this._context).replace(/\n/g,"")+" */\n");return n.debugInfo=e.debugInfo,this._visitor.visit(n)}return}this.charset=!0}return e}},checkValidNodes:function(e,t){if(e)for(var n=0;n0?e.accept(this._visitor):e.rules=null,t.visitDeeper=!1}return e.rules&&(this._mergeRules(e.rules),this._removeDuplicateRules(e.rules)),this.utils.isVisibleRuleset(e)&&(e.ensureVisibility(),i.splice(0,0,e)),1===i.length?i[0]:i},_compileRulesetPaths:function(e){e.paths&&(e.paths=e.paths.filter((function(e){var t;for(" "===e[0].elements[0].combinator.value&&(e[0].elements[0].combinator=new Ie.Combinator("")),t=0;t=0;i--)if((n=e[i])instanceof Ie.Declaration)if(r[n.name]){(t=r[n.name])instanceof Ie.Declaration&&(t=r[n.name]=[r[n.name].toCSS(this._context)]);var o=n.toCSS(this._context);-1!==t.indexOf(o)?e.splice(i,1):t.push(o)}else r[n.name]=n}},_mergeRules:function(e){if(e){for(var t={},n=[],i=0;i0){var t=e[0],n=[],i=[new Ie.Expression(n)];e.forEach((function(e){"+"===e.merge&&n.length>0&&i.push(new Ie.Expression(n=[])),n.push(e.value),t.important=t.important||e.important})),t.value=new Ie.Value(i)}}))}}};var De={Visitor:Ee,ImportVisitor:Re,MarkVisibleSelectorsVisitor:Ve,ExtendVisitor:$e,JoinSelectorVisitor:Oe,ToCSSVisitor:Ne};var Be=function(){var e,t,n,i,r,o,s,a=[],l={};function u(n){for(var i,a,c,h=l.i,f=t,p=l.i-s,v=l.i+o.length-p,d=l.i+=n,m=e;l.i=0){c={index:l.i,text:m.substr(l.i,y+2-l.i),isLineComment:!1},l.i+=c.text.length-1,l.commentStore.push(c);continue}}break}if(32!==i&&10!==i&&9!==i&&13!==i)break}if(o=o.slice(n+l.i-d+p),s=l.i,!o.length){if(tn||l.i===n&&e&&!i)&&(n=l.i,i=e);var r=a.pop();o=r.current,s=l.i=r.i,t=r.j},l.forget=function(){a.pop()},l.isWhitespace=function(t){var n=l.i+(t||0),i=e.charCodeAt(n);return 32===i||13===i||9===i||10===i},l.$re=function(e){l.i>s&&(o=o.slice(l.i-s),s=l.i);var t=e.exec(o);return t?(u(t[0].length),"string"==typeof t?t:1===t.length?t[0]:t):null},l.$char=function(t){return e.charAt(l.i)!==t?null:(u(1),t)},l.$str=function(t){for(var n=t.length,i=0;ih&&(d=!1)}}while(d);return r||null},l.autoCommentAbsorb=!0,l.commentStore=[],l.finished=!1,l.peek=function(t){if("string"==typeof t){for(var n=0;n57||t<43||47===t||44===t},l.start=function(i,a,c){e=i,l.i=t=s=n=0,r=a?function(e,t){var n,i,r,o,s,a,l,u,c,h=e.length,f=0,p=0,v=[],d=0;function m(t){var n=s-d;n<512&&!t||!n||(v.push(e.slice(d,s+1)),d=s+1)}for(s=0;s=97&&l<=122||l<34))switch(l){case 40:p++,i=s;continue;case 41:if(--p<0)return t("missing opening `(`",s);continue;case 59:p||m();continue;case 123:f++,n=s;continue;case 125:if(--f<0)return t("missing opening `{`",s);f||p||m();continue;case 92:if(s96)){if(u==l){c=1;break}if(92==u){if(s==h-1)return t("unescaped `\\`",s);s++}}if(c)continue;return t("unmatched `"+String.fromCharCode(l)+"`",a);case 47:if(p||s==h-1)continue;if(47==(u=e.charCodeAt(s+1)))for(s+=2;sn&&o>r?"missing closing `}` or `*/`":"missing closing `}`",n):0!==p?t("missing closing `)`",i):(m(!0),v)}(i,c):[i],o=r[0],u(0)},l.end=function(){var t,r=l.i>=e.length;return l.i=e.length-1,furthestChar:e[l.i]}},l},Ue=function e(t,n,i){var r,o=Be();function s(e,t){throw new V({index:o.i,filename:i.filename,type:t||"Syntax",message:e},n)}function a(e,t){var n=e instanceof Function?e.call(r):o.$re(e);if(n)return n;s(t||("string"==typeof e?"expected '"+e+"' got '"+o.currentChar()+"'":"unexpected token"))}function l(e,t){if(o.$char(e))return e;s(t||"expected '"+e+"' got '"+o.currentChar()+"'")}function u(e){var t=i.filename;return{lineNumber:C(e,o.getInput()).line+1,fileName:t}}return{parserInput:o,imports:n,fileInfo:i,parseNode:function(e,t,i,s,a){var l,u=[],c=o;try{c.start(e,!1,(function(e,t){a({message:e,index:t+i})}));for(var h=0,f=void 0,p=void 0;f=t[h];h++)if(p=c.i,l=r[f]()){try{l._index=p+i,l._fileInfo=s}catch(e){}u.push(l)}else u.push(null);c.end().isFinished?a(null,u):a(!0,null)}catch(e){throw new V({index:e.index+i,message:e.message},n,s.filename)}},parse:function(r,s,a){var l,u,c,h,f=null,p="";if(u=a&&a.globalVars?e.serializeVars(a.globalVars)+"\n":"",c=a&&a.modifyVars?"\n"+e.serializeVars(a.modifyVars):"",t.pluginManager)for(var v=t.pluginManager.getPreProcessors(),d=0;d");return e},args:function(e){var t,n,i,a,l,u,c,h=r.entities,f={args:null,variadic:!1},p=[],v=[],d=[],m=!0;for(o.save();;){if(e)u=r.detachedRuleset()||r.expression();else{if(o.commentStore.length=0,o.$str("...")){f.variadic=!0,o.$char(";")&&!t&&(t=!0),(t?v:d).push({variadic:!0});break}u=h.variable()||h.property()||h.literal()||h.keyword()||this.call(!0)}if(!u||!m)break;a=null,u.throwAwayComments&&u.throwAwayComments(),l=u;var g=null;if(e?u.value&&1==u.value.length&&(g=u.value[0]):g=u,g&&(g instanceof Ie.Variable||g instanceof Ie.Property))if(o.$char(":")){if(p.length>0&&(t&&s("Cannot mix ; and , as delimiter types"),n=!0),!(l=r.detachedRuleset()||r.expression())){if(!e)return o.restore(),f.args=[],f;s("could not understand value for named argument")}a=i=g.name}else if(o.$str("...")){if(!e){f.variadic=!0,o.$char(";")&&!t&&(t=!0),(t?v:d).push({name:u.name,variadic:!0});break}c=!0}else e||(i=a=g.name,l=null);l&&p.push(l),d.push({name:a,value:l,expand:c}),o.$char(",")?m=!0:((m=";"===o.$char(";"))||t)&&(n&&s("Cannot mix ; and , as delimiter types"),t=!0,p.length>1&&(l=new Ie.Value(p)),v.push({name:i,value:l,expand:c}),i=null,p=[],n=!1)}return o.forget(),f.args=t?v:d,f},definition:function(){var e,t,n,i,s=[],l=!1;if(!("."!==o.currentChar()&&"#"!==o.currentChar()||o.peek(/^[^{]*\}/)))if(o.save(),t=o.$re(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/)){e=t[1];var u=this.args(!1);if(s=u.args,l=u.variadic,!o.$char(")"))return void o.restore("Missing closing ')'");if(o.commentStore.length=0,o.$str("when")&&(i=a(r.conditions,"expected condition")),n=r.block())return o.forget(),new Ie.mixin.Definition(e,s,n,i,l);o.restore()}else o.restore()},ruleLookups:function(){var e,t=[];if("["===o.currentChar()){for(;;){if(o.save(),!(e=this.lookupValue())&&""!==e){o.restore();break}t.push(e),o.forget()}return t.length>0?t:void 0}},lookupValue:function(){if(o.save(),o.$char("[")){var e=o.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);if(o.$char("]"))return e||""===e?(o.forget(),e):void o.restore();o.restore()}else o.restore()}},entity:function(){var e=this.entities;return this.comment()||e.literal()||e.variable()||e.url()||e.property()||e.call()||e.keyword()||this.mixin.call(!0)||e.javascript()},end:function(){return o.$char(";")||o.peek("}")},ieAlpha:function(){var e;if(o.$re(/^opacity=/i))return(e=o.$re(/^\d+/))||(e="@{"+(e=a(r.entities.variable,"Could not parse alpha")).name.slice(1)+"}"),l(")"),new Ie.Quoted("","alpha(opacity="+e+")")},element:function(){var e,t,n,r=o.i;if(t=this.combinator(),(e=o.$re(/^(?:\d+\.\d+|\d+)%/)||o.$re(/^(?:[.#]?|:*)(?:[\w-]|[^\x00-\x9f]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/)||o.$char("*")||o.$char("&")||this.attribute()||o.$re(/^\([^&()@]+\)/)||o.$re(/^[\.#:](?=@)/)||this.entities.variableCurly())||(o.save(),o.$char("(")?(n=this.selector(!1))&&o.$char(")")?(e=new Ie.Paren(n),o.forget()):o.restore("Missing closing ')'"):o.forget()),e)return new Ie.Element(t,e,e instanceof Ie.Variable,r,i)},combinator:function(){var e=o.currentChar();if("/"===e){o.save();var t=o.$re(/^\/[a-z]+\//i);if(t)return o.forget(),new Ie.Combinator(t);o.restore()}if(">"===e||"+"===e||"~"===e||"|"===e||"^"===e){for(o.i++,"^"===e&&"^"===o.currentChar()&&(e="^^",o.i++);o.isWhitespace();)o.i++;return new Ie.Combinator(e)}return o.isWhitespace(-1)?new Ie.Combinator(" "):new Ie.Combinator(null)},selector:function(e){var t,n,r,l,u,c,h,f=o.i;for(e=!1!==e;(e&&(n=this.extend())||e&&(c=o.$str("when"))||(l=this.element()))&&(c?h=a(this.conditions,"expected condition"):h?s("CSS guard can only be used at the end of selector"):n?u=u?u.concat(n):n:(u&&s("Extend can only be used at the end of selector"),r=o.currentChar(),t?t.push(l):t=[l],l=null),"{"!==r&&"}"!==r&&";"!==r&&","!==r&&")"!==r););if(t)return new Ie.Selector(t,u,h,f,i);u&&s("Extend must be used to extend a selector, it cannot be used on its own")},selectors:function(){for(var e,t;(e=this.selector())&&(t?t.push(e):t=[e],o.commentStore.length=0,e.condition&&t.length>1&&s("Guards are only currently allowed on a single selector."),o.$char(","));)e.condition&&s("Guards are only currently allowed on a single selector."),o.commentStore.length=0;return t},attribute:function(){if(o.$char("[")){var e,t,n,i=this.entities;return(e=i.variableCurly())||(e=a(/^(?:[_A-Za-z0-9-\*]*\|)?(?:[_A-Za-z0-9-]|\\.)+/)),(n=o.$re(/^[|~*$^]?=/))&&(t=i.quoted()||o.$re(/^[0-9]+%/)||o.$re(/^[\w-]+/)||i.variableCurly()),l("]"),new Ie.Attribute(e,n,t)}},block:function(){var e;if(o.$char("{")&&(e=this.primary())&&o.$char("}"))return e},blockRuleset:function(){var e=this.block();return e&&(e=new Ie.Ruleset(null,e)),e},detachedRuleset:function(){var e,t,n;if(o.save(),!o.$re(/^[.#]\(/)||(t=(e=this.mixin.args(!1)).args,n=e.variadic,o.$char(")"))){var i=this.blockRuleset();if(i)return o.forget(),t?new Ie.mixin.Definition(null,t,i,null,n):new Ie.DetachedRuleset(i);o.restore()}else o.restore()},ruleset:function(){var e,n,i;if(o.save(),t.dumpLineNumbers&&(i=u(o.i)),(e=this.selectors())&&(n=this.block())){o.forget();var r=new Ie.Ruleset(e,n,t.strictImports);return t.dumpLineNumbers&&(r.debugInfo=i),r}o.restore()},declaration:function(){var e,t,n,r,s,a,l=o.i,u=o.currentChar();if("."!==u&&"#"!==u&&"&"!==u&&":"!==u)if(o.save(),e=this.variable()||this.ruleProperty()){if((a="string"==typeof e)&&(t=this.detachedRuleset())&&(n=!0),o.commentStore.length=0,!t){if(s=!a&&e.length>1&&e.pop().value,t=e[0].value&&"--"===e[0].value.slice(0,2)?this.permissiveValue():this.anonymousValue())return o.forget(),new Ie.Declaration(e,t,!1,s,l,i);t||(t=this.value()),t?r=this.important():a&&(t=this.permissiveValue())}if(t&&(this.end()||n))return o.forget(),new Ie.Declaration(e,t,r,s,l,i);o.restore()}else o.restore()},anonymousValue:function(){var e=o.i,t=o.$re(/^([^.#@\$+\/'"*`(;{}-]*);/);if(t)return new Ie.Anonymous(t[1],e)},permissiveValue:function(e){var t,n,r,a,l=e||";",u=o.i,c=[];function h(){var e=o.currentChar();return"string"==typeof l?e===l:l.test(e)}if(!h()){a=[];do{((n=this.comment())||(n=this.entity()))&&a.push(n)}while(n);if(r=h(),a.length>0){if(a=new Ie.Expression(a),r)return a;c.push(a)," "===o.prevChar()&&c.push(new Ie.Anonymous(" ",u))}if(o.save(),a=o.$parseUntil(l)){if("string"==typeof a&&s("Expected '"+a+"'","Parse"),1===a.length&&" "===a[0])return o.forget(),new Ie.Anonymous("",u);var f=void 0;for(t=0;t0)return new Ie.Expression(r)},mediaFeatures:function(){var e,t=this.entities,n=[];do{if(e=this.mediaFeature()){if(n.push(e),!o.$char(","))break}else if((e=t.variable()||t.mixinLookup())&&(n.push(e),!o.$char(",")))break}while(e);return n.length>0?n:null},media:function(){var e,n,r,a,l=o.i;if(t.dumpLineNumbers&&(a=u(l)),o.save(),o.$str("@media"))return e=this.mediaFeatures(),(n=this.block())||s("media definitions require block statements after any features"),o.forget(),r=new Ie.Media(n,e,l,i),t.dumpLineNumbers&&(r.debugInfo=a),r;o.restore()},plugin:function(){var e,t,n,r=o.i;if(o.$re(/^@plugin?\s+/)){if(n=(t=this.pluginArgs())?{pluginArgs:t,isPlugin:!0}:{isPlugin:!0},e=this.entities.quoted()||this.entities.url())return o.$char(";")||(o.i=r,s("missing semi-colon on @plugin")),new Ie.Import(e,null,n,r,i);o.i=r,s("malformed @plugin statement")}},pluginArgs:function(){if(o.save(),!o.$char("("))return o.restore(),null;var e=o.$re(/^\s*([^\);]+)\)\s*/);return e[1]?(o.forget(),e[1].trim()):(o.restore(),null)},atrule:function(){var e,n,r,a,l,c,h,f=o.i,p=!0,v=!0;if("@"===o.currentChar()){if(n=this.import()||this.plugin()||this.media())return n;if(o.save(),e=o.$re(/^@[a-z-]+/)){switch(a=e,"-"==e.charAt(1)&&e.indexOf("-",2)>0&&(a="@"+e.slice(e.indexOf("-",2)+1)),a){case"@charset":l=!0,p=!1;break;case"@namespace":c=!0,p=!1;break;case"@keyframes":case"@counter-style":l=!0;break;case"@document":case"@supports":h=!0,v=!1;break;default:h=!0}if(o.commentStore.length=0,l?(n=this.entity())||s("expected "+e+" identifier"):c?(n=this.expression())||s("expected "+e+" expression"):h&&(n=this.permissiveValue(/^[{;]/),p="{"===o.currentChar(),n?n.value||(n=null):p||";"===o.currentChar()||s(e+" rule is missing block or ending semi-colon")),p&&(r=this.blockRuleset()),r||!p&&n&&o.$char(";"))return o.forget(),new Ie.AtRule(e,n,r,f,i,t.dumpLineNumbers?u(f):null,v);o.restore("at-rule options not recognised")}}},value:function(){var e,t=[],n=o.i;do{if((e=this.expression())&&(t.push(e),!o.$char(",")))break}while(e);if(t.length>0)return new Ie.Value(t,n)},important:function(){if("!"===o.currentChar())return o.$re(/^! *important/)},sub:function(){var e,t;if(o.save(),o.$char("("))return(e=this.addition())&&o.$char(")")?(o.forget(),(t=new Ie.Expression([e])).parens=!0,t):void o.restore("Expected ')'");o.restore()},multiplication:function(){var e,t,n,i,r;if(e=this.operand()){for(r=o.isWhitespace(-1);!o.peek(/^\/[*\/]/);){if(o.save(),!(n=o.$char("/")||o.$char("*")||o.$str("./"))){o.forget();break}if(!(t=this.operand())){o.restore();break}o.forget(),e.parensInOp=!0,t.parensInOp=!0,i=new Ie.Operation(n,[i||e,t],r),r=o.isWhitespace(-1)}return i||e}},addition:function(){var e,t,n,i,r;if(e=this.multiplication()){for(r=o.isWhitespace(-1);(n=o.$re(/^[-+]\s+/)||!r&&(o.$char("+")||o.$char("-")))&&(t=this.multiplication());)e.parensInOp=!0,t.parensInOp=!0,i=new Ie.Operation(n,[i||e,t],r),r=o.isWhitespace(-1);return i||e}},conditions:function(){var e,t,n,i=o.i;if(e=this.condition(!0)){for(;o.peek(/^,\s*(not\s*)?\(/)&&o.$char(",")&&(t=this.condition(!0));)n=new Ie.Condition("or",n||e,t,i);return n||e}},condition:function(e){var t,n,i;if(t=this.conditionAnd(e)){if(n=o.$str("or")){if(!(i=this.condition(e)))return;t=new Ie.Condition(n,t,i)}return t}},conditionAnd:function(e){var t,n,i,r,s=this;if(t=(r=s.negatedCondition(e)||s.parenthesisCondition(e))||e?r:s.atomicCondition(e)){if(n=o.$str("and")){if(!(i=this.conditionAnd(e)))return;t=new Ie.Condition(n,t,i)}return t}},negatedCondition:function(e){if(o.$str("not")){var t=this.parenthesisCondition(e);return t&&(t.negate=!t.negate),t}},parenthesisCondition:function(e){var t;if(o.save(),o.$str("(")){if(t=function(t){var n;if(o.save(),n=t.condition(e)){if(o.$char(")"))return o.forget(),n;o.restore()}else o.restore()}(this))return o.forget(),t;if(t=this.atomicCondition(e)){if(o.$char(")"))return o.forget(),t;o.restore("expected ')' got '"+o.currentChar()+"'")}else o.restore()}else o.restore()},atomicCondition:function(e){var t,n,i,r,a=this.entities,l=o.i;function u(){return this.addition()||a.keyword()||a.quoted()||a.mixinLookup()}if(t=(u=u.bind(this))())return o.$char(">")?r=o.$char("=")?">=":">":o.$char("<")?r=o.$char("=")?"<=":"<":o.$char("=")&&(r=o.$char(">")?"=>":o.$char("<")?"=<":"="),r?(n=u())?i=new Ie.Condition(r,t,n,l,!1):s("expected expression"):i=new Ie.Condition("=",t,new Ie.Keyword("true"),l,!1),i},operand:function(){var e,t=this.entities;o.peek(/^-[@\$\(]/)&&(e=o.$char("-"));var n=this.sub()||t.dimension()||t.color()||t.variable()||t.property()||t.call()||t.quoted(!0)||t.colorKeyword()||t.mixinLookup();return e&&(n.parensInOp=!0,n=new Ie.Negative(n)),n},expression:function(){var e,t,n=[],i=o.i;do{(e=this.comment())?n.push(e):((e=this.addition()||this.entity())instanceof Ie.Comment&&(e=null),e&&(n.push(e),o.peek(/^\/[\/*]/)||(t=o.$char("/"))&&n.push(new Ie.Anonymous(t,i))))}while(e);if(n.length>0)return new Ie.Expression(n)},property:function(){var e=o.$re(/^(\*?-?[_a-zA-Z0-9-]+)\s*:/);if(e)return e[1]},ruleProperty:function(){var e,t,n=[],r=[];o.save();var s=o.$re(/^([_a-zA-Z0-9-]+)\s*:/);if(s)return n=[new Ie.Keyword(s[1])],o.forget(),n;function a(e){var t=o.i,i=o.$re(e);if(i)return r.push(t),n.push(i[1])}for(a(/^(\*?)/);a(/^((?:[\w-]+)|(?:[@\$]\{[\w-]+\}))/););if(n.length>1&&a(/^((?:\+_|\+)?)\s*:/)){for(o.forget(),""===n[0]&&(n.shift(),r.shift()),t=0;t1?e-1:e)<1?r+(o-r)*e*6:2*e<1?o:3*e<2?r+(o-r)*(2/3-e)*6:r}e=He(e)%360/360,t=ze(He(t)),n=ze(He(n)),i=ze(He(i)),r=2*n-(o=n<=.5?n*(t+1):n+t-n*t);var a=[255*s(e+1/3),255*s(e),255*s(e-1/3)];return i=He(i),new p(a,i,"hsla")}catch(e){}},hsv:function(e,t,n){return je.hsva(e,t,n,1)},hsva:function(e,t,n,i){var r,o;e=He(e)%360/360*360,t=He(t),n=He(n),i=He(i);var s=[n,n*(1-t),n*(1-(o=e/60-(r=Math.floor(e/60%6)))*t),n*(1-(1-o)*t)],a=[[0,3,1],[2,0,1],[1,0,3],[1,2,0],[3,1,0],[0,1,2]];return je.rgba(255*s[a[r][0]],255*s[a[r][1]],255*s[a[r][2]],i)},hue:function(e){return new ee(We(e).h)},saturation:function(e){return new ee(100*We(e).s,"%")},lightness:function(e){return new ee(100*We(e).l,"%")},hsvhue:function(e){return new ee(Je(e).h)},hsvsaturation:function(e){return new ee(100*Je(e).s,"%")},hsvvalue:function(e){return new ee(100*Je(e).v,"%")},red:function(e){return new ee(e.rgb[0])},green:function(e){return new ee(e.rgb[1])},blue:function(e){return new ee(e.rgb[2])},alpha:function(e){return new ee(We(e).a)},luma:function(e){return new ee(e.luma()*e.alpha*100,"%")},luminance:function(e){var t=.2126*e.rgb[0]/255+.7152*e.rgb[1]/255+.0722*e.rgb[2]/255;return new ee(t*e.alpha*100,"%")},saturate:function(e,t,n){if(!e.rgb)return null;var i=We(e);return void 0!==n&&"relative"===n.value?i.s+=i.s*t.value/100:i.s+=t.value/100,i.s=ze(i.s),Ge(e,i)},desaturate:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.s-=i.s*t.value/100:i.s-=t.value/100,i.s=ze(i.s),Ge(e,i)},lighten:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.l+=i.l*t.value/100:i.l+=t.value/100,i.l=ze(i.l),Ge(e,i)},darken:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.l-=i.l*t.value/100:i.l-=t.value/100,i.l=ze(i.l),Ge(e,i)},fadein:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.a+=i.a*t.value/100:i.a+=t.value/100,i.a=ze(i.a),Ge(e,i)},fadeout:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.a-=i.a*t.value/100:i.a-=t.value/100,i.a=ze(i.a),Ge(e,i)},fade:function(e,t){var n=We(e);return n.a=t.value/100,n.a=ze(n.a),Ge(e,n)},spin:function(e,t){var n=We(e),i=(n.h+t.value)%360;return n.h=i<0?360+i:i,Ge(e,n)},mix:function(e,t,n){n||(n=new ee(50));var i=n.value/100,r=2*i-1,o=We(e).a-We(t).a,s=((r*o==-1?r:(r+o)/(1+r*o))+1)/2,a=1-s,l=[e.rgb[0]*s+t.rgb[0]*a,e.rgb[1]*s+t.rgb[1]*a,e.rgb[2]*s+t.rgb[2]*a],u=e.alpha*i+t.alpha*(1-i);return new p(l,u)},greyscale:function(e){return je.desaturate(e,new ee(100))},contrast:function(e,t,n,i){if(!e.rgb)return null;if(void 0===n&&(n=je.rgba(255,255,255,1)),void 0===t&&(t=je.rgba(0,0,0,1)),t.luma()>n.luma()){var r=n;n=t,t=r}return i=void 0===i?.43:He(i),e.luma().5&&(i=1,n=e>.25?Math.sqrt(e):((16*e-12)*e+4)*e),e-(1-2*t)*i*(n-e)},hardlight:function(e,t){return Ze.overlay(t,e)},difference:function(e,t){return Math.abs(e-t)},exclusion:function(e,t){return e+t-2*e*t},average:function(e,t){return(e+t)/2},negation:function(e,t){return 1-Math.abs(e+t-1)}};for(var Xe in Ze)Ze.hasOwnProperty(Xe)&&(Ke[Xe]=Ke.bind(null,Ze[Xe]));var Ye=function(e){return Array.isArray(e.value)?e.value:Array(e)},et={_SELF:function(e){return e},"~":function(){for(var e=[],t=0;ts.value)&&(c[i]=r);else{if(void 0!==l&&a!==l)throw{type:"Argument",message:"incompatible types"};h[a]=c.length,c.push(r)}else Array.isArray(t[n].value)&&Array.prototype.push.apply(t,Array.prototype.slice.call(t[n].value));return 1==c.length?c[0]:(t=c.map((function(e){return e.toCSS(this.context)})).join(this.context.compress?",":", "),new N((e?"min":"max")+"("+t+")"))},ot={min:function(){for(var e=[],t=0;t",r=0;r";return i+="',i=encodeURIComponent(i),new ce(new ue("'"+(i="data:image/svg+xml,"+i)+"'",i,!1,this.index,this.currentFileInfo),this.index,this.currentFileInfo)}}),H.addMultiple(ut),t};function ht(e,t){var n,i=(t=t||{}).variables,r=new j.Eval(t);"object"!=typeof i||Array.isArray(i)||(i=Object.keys(i).map((function(e){var t=i[e];return t instanceof Ie.Value||(t instanceof Ie.Expression||(t=new Ie.Expression([t])),t=new Ie.Value([t])),new Ie.Declaration("@"+e,t,!1,null,0)})),r.frames=[new Ie.Ruleset(null,i)]);var o,s,a=[new De.JoinSelectorVisitor,new De.MarkVisibleSelectorsVisitor(!0),new De.ExtendVisitor,new De.ToCSSVisitor({compress:Boolean(t.compress)})],l=[];if(t.pluginManager){s=t.pluginManager.visitor();for(var u=0;u<2;u++)for(s.first();o=s.get();)o.isPreEvalVisitor?0!==u&&-1!==l.indexOf(o)||(l.push(o),o.run(e)):0!==u&&-1!==a.indexOf(o)||(o.isPreVisitor?a.unshift(o):a.push(o))}n=e.eval(r);for(u=0;u=t);n++);this.preProcessors.splice(n,0,{preProcessor:e,priority:t})},e.prototype.addPostProcessor=function(e,t){var n;for(n=0;n=t);n++);this.postProcessors.splice(n,0,{postProcessor:e,priority:t})},e.prototype.addFileManager=function(e){this.fileManagers.push(e)},e.prototype.getPreProcessors=function(){for(var e=[],t=0;t0){var i=void 0,r=JSON.stringify(this._sourceMapGenerator.toJSON());this.sourceMapURL?i=this.sourceMapURL:this._sourceMapFilename&&(i=this._sourceMapFilename),this.sourceMapURL=i,this.sourceMap=r}return this._css.join("")},t}()}(e=new o(e,t)),e)),a=function(e){return function(){function t(e,t,n){this.less=e,this.rootFilename=n.filename,this.paths=t.paths||[],this.contents={},this.contentsIgnoredChars={},this.mime=t.mime,this.error=null,this.context=t,this.queue=[],this.files={}}return t.prototype.push=function(t,n,i,o,s){var a=this,l=this.context.pluginManager.Loader;this.queue.push(t);var u=function(e,n,i){a.queue.splice(a.queue.indexOf(t),1);var l=i===a.rootFilename;o.optional&&e?(s(null,{rules:[]},!1,null),r.info("The file "+i+" was skipped because it was not found and the import was marked optional.")):(a.files[i]||o.inline||(a.files[i]={root:n,options:o}),e&&!a.error&&(a.error=e),s(e,n,l,i))},c={rewriteUrls:this.context.rewriteUrls,entryPath:i.entryPath,rootpath:i.rootpath,rootFilename:i.rootFilename},h=e.getFileManager(t,i.currentDirectory,this.context,e);if(h){var f,p,v=function(e){var t,n=e.filename,r=e.contents.replace(/^\uFEFF/,"");c.currentDirectory=h.getPath(n),c.rewriteUrls&&(c.rootpath=h.join(a.context.rootpath||"",h.pathDiff(c.currentDirectory,c.entryPath)),!h.isPathAbsolute(c.rootpath)&&h.alwaysMakePathsAbsolute()&&(c.rootpath=h.join(c.entryPath,c.rootpath))),c.filename=n;var s=new j.Parse(a.context);s.processImports=!1,a.contents[n]=r,(i.reference||o.reference)&&(c.reference=!0),o.isPlugin?(t=l.evalPlugin(r,s,a,o.pluginArgs,c))instanceof V?u(t,null,n):u(null,t,n):o.inline?u(null,r,n):!a.files[n]||a.files[n].options.multiple||o.multiple?new Ue(s,a,c).parse(r,(function(e,t){u(e,t,n)})):u(null,a.files[n].root,n)},d=_(this.context);n&&(d.ext=o.isPlugin?".js":".less"),o.isPlugin?(d.mime="application/javascript",d.syncImport?f=l.loadPluginSync(t,i.currentDirectory,d,e,h):p=l.loadPlugin(t,i.currentDirectory,d,e,h)):d.syncImport?f=h.loadFileSync(t,i.currentDirectory,d,e):p=h.loadFile(t,i.currentDirectory,d,e,(function(e,t){e?u(e):v(t)})),f?f.filename?v(f):u(f):p&&p.then(v,u)}else u({message:"Could not find a file-manager for "+t})},t}()}(e);var u,c=function(e,t,n){var i=function(e,n,r){if("function"==typeof n?(r=n,n=M(this.options,{})):n=M(this.options,n||{}),!r){var o=this;return new Promise((function(t,r){i.call(o,e,n,(function(e,n){e?r(e):t(n)}))}))}this.parse(e,n,(function(e,n,i,o){if(e)return r(e);var s;try{s=new t(n,i).toCSS(o)}catch(e){return r(e)}r(null,s)}))};return i}(0,s),h=function(e,t,n){var i=function(e,t,r){if("function"==typeof t?(r=t,t=M(this.options,{})):t=M(this.options,t||{}),!r){var o=this;return new Promise((function(n,r){i.call(o,e,t,(function(e,t){e?r(e):n(t)}))}))}var s,a=void 0,l=new mt(this,!t.reUsePluginManager);if(t.pluginManager=l,s=new j.Parse(t),t.rootFileInfo)a=t.rootFileInfo;else{var u=t.filename||"input",c=u.replace(/[^\/\\]*$/,"");(a={filename:u,rewriteUrls:s.rewriteUrls,rootpath:s.rootpath||"",currentDirectory:c,entryPath:c,rootFilename:u}).rootpath&&"/"!==a.rootpath.slice(-1)&&(a.rootpath+="/")}var h=new n(this,s,a);this.importManager=h,t.plugins&&t.plugins.forEach((function(e){var t,n;if(e.fileContent){if(n=e.fileContent.replace(/^\uFEFF/,""),(t=l.Loader.evalPlugin(n,s,h,e.options,e.filename))instanceof V)return r(t)}else l.addPlugin(e)})),new Ue(s,h,a).parse(e,(function(e,n){if(e)return r(e);r(null,n,h,t)}),t)};return i}(0,0,a),f={version:[4,0,0],data:l,tree:Ie,Environment:o,AbstractFileManager:Ce,AbstractPluginLoader:ke,environment:e,visitors:De,Parser:Ue,functions:ct(e),contexts:j,SourceMapOutput:n,SourceMapBuilder:i,ParseTree:s,ImportManager:a,render:c,parse:h,LessError:V,transformTree:ht,utils:P,PluginManager:mt,logger:r},p=function(e){return function(){var t=Object.create(e.prototype);return e.apply(t,Array.prototype.slice.call(arguments,0)),t}},v=Object.create(f);for(var d in f.tree)if("function"==typeof(u=f.tree[d]))v[d.toLowerCase()]=p(u);else for(var m in v[d]=Object.create(null),u)v[d][m.toLowerCase()]=p(u[m]);return f.parse=f.parse.bind(v),f.render=f.render.bind(v),v}var yt={},bt=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return h(t,e),t.prototype.alwaysMakePathsAbsolute=function(){return!0},t.prototype.join=function(e,t){return e?this.extractUrlParts(t,e).path:t},t.prototype.doXHR=function(e,t,n,i){var r=new XMLHttpRequest,o=!pt.isFileProtocol||pt.fileAsync;function s(t,n,i){t.status>=200&&t.status<300?n(t.responseText,t.getResponseHeader("Last-Modified")):"function"==typeof i&&i(t.status,e)}"function"==typeof r.overrideMimeType&&r.overrideMimeType("text/css"),vt.debug("XHR: Getting '"+e+"'"),r.open("GET",e,o),r.setRequestHeader("Accept",t||"text/x-less, text/css; q=0.9, */*; q=0.5"),r.send(null),pt.isFileProtocol&&!pt.fileAsync?0===r.status||r.status>=200&&r.status<300?n(r.responseText):i(r.status,e):o?r.onreadystatechange=function(){4==r.readyState&&s(r,n,i)}:s(r,n,i)},t.prototype.supports=function(){return!0},t.prototype.clearFileCache=function(){yt={}},t.prototype.loadFile=function(e,t,n,i){t&&!this.isPathAbsolute(e)&&(e=t+e),e=n.ext?this.tryAppendExtension(e,n.ext):e,n=n||{};var r=this.extractUrlParts(e,window.location.href).url,o=this;return new Promise((function(e,t){if(n.useFileCache&&yt[r])try{var i=yt[r];return e({contents:i,filename:r,webInfo:{lastModified:new Date}})}catch(e){return t({filename:r,message:"Error loading file "+r+" error was "+e.message})}o.doXHR(r,n.mime,(function(t,n){yt[r]=t,e({contents:t,filename:r,webInfo:{lastModified:n}})}),(function(e,n){t({type:"File",message:"'"+n+"' wasn't found ("+e+")",href:r})}))}))},t}(Ce),wt=function(e,t){return pt=e,vt=t,bt},xt=function(e){function t(t){var n=e.call(this)||this;return n.less=t,n}return h(t,e),t.prototype.loadPlugin=function(e,t,n,i,r){return new Promise((function(o,s){r.loadFile(e,t,n,i).then(o).catch(s)}))},t}(ke),St=function(t,i,r){return{add:function(o,s){r.errorReporting&&"html"!==r.errorReporting?"console"===r.errorReporting?function(e,t){var n=e.filename||t,o=[],s=(e.type||"Syntax")+"Error: "+(e.message||"There is an error in your .less file")+" in "+n,a=function(e,t,n){void 0!==e.extract[t]&&o.push("{line} {content}".replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,n).replace(/\{content\}/,e.extract[t]))};e.line&&(a(e,0,""),a(e,1,"line"),a(e,2,""),s+=" on line "+e.line+", column "+(e.column+1)+":\n"+o.join("\n")),e.stack&&(e.extract||r.logLevel>=4)&&(s+="\nStack Trace\n"+e.stack),i.logger.error(s)}(o,s):"function"==typeof r.errorReporting&&r.errorReporting("add",o,s):function(i,o){var s,a,l="less-error-message:"+e(o||""),u=t.document.createElement("div"),c=[],h=i.filename||o,f=h.match(/([^\/]+(\?.*)?)$/)[1];u.id=l,u.className="less-error-message",a="

    "+(i.type||"Syntax")+"Error: "+(i.message||"There is an error in your .less file")+'

    in '+f+" ";var p=function(e,t,n){void 0!==e.extract[t]&&c.push('

  • {content}
  • '.replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,n).replace(/\{content\}/,e.extract[t]))};i.line&&(p(i,0,""),p(i,1,"line"),p(i,2,""),a+="on line "+i.line+", column "+(i.column+1)+":

      "+c.join("")+"
    "),i.stack&&(i.extract||r.logLevel>=4)&&(a+="
    Stack Trace
    "+i.stack.split("\n").slice(1).join("
    ")),u.innerHTML=a,n(t.document,[".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #dd6666;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.line {","color: #ff0000;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),u.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),"development"===r.env&&(s=setInterval((function(){var e=t.document,n=e.body;n&&(e.getElementById(l)?n.replaceChild(u,e.getElementById(l)):n.insertBefore(u,n.firstChild),clearInterval(s))}),10))}(o,s)},remove:function(n){r.errorReporting&&"html"!==r.errorReporting?"console"===r.errorReporting||"function"==typeof r.errorReporting&&r.errorReporting("remove",n):function(n){var i=t.document.getElementById("less-error-message:"+e(n));i&&i.parentNode.removeChild(i)}(n)}}},It={javascriptEnabled:!1,depends:!1,compress:!1,lint:!1,paths:[],color:!0,strictImports:!1,insecure:!1,rootpath:"",rewriteUrls:!1,math:1,strictUnits:!1,globalVars:null,modifyVars:null,urlArgs:""};if(window.less)for(var Ct in window.less)window.less.hasOwnProperty(Ct)&&(It[Ct]=window.less[Ct]);!function(e,n){t(n,i(e)),void 0===n.isFileProtocol&&(n.isFileProtocol=/^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(e.location.protocol)),n.async=n.async||!1,n.fileAsync=n.fileAsync||!1,n.poll=n.poll||(n.isFileProtocol?1e3:1500),n.env=n.env||("127.0.0.1"==e.location.hostname||"0.0.0.0"==e.location.hostname||"localhost"==e.location.hostname||e.location.port&&e.location.port.length>0||n.isFileProtocol?"development":"production");var r=/!dumpLineNumbers:(comments|mediaquery|all)/.exec(e.location.hash);r&&(n.dumpLineNumbers=r[1]),void 0===n.useFileCache&&(n.useFileCache=!0),void 0===n.onReady&&(n.onReady=!0),n.relativeUrls&&(n.rewriteUrls="all")}(window,It),It.plugins=It.plugins||[],window.LESS_PLUGINS&&(It.plugins=It.plugins.concat(window.LESS_PLUGINS));var kt,_t,At,Mt=function(e,i){var r=e.document,o=gt();o.options=i;var s=o.environment,a=wt(i,o.logger),l=new a;s.addFileManager(l),o.FileManager=a,o.PluginLoader=xt,function(e,t){t.logLevel=void 0!==t.logLevel?t.logLevel:"development"===t.env?3:1,t.loggers||(t.loggers=[{debug:function(e){t.logLevel>=4&&console.log(e)},info:function(e){t.logLevel>=3&&console.log(e)},warn:function(e){t.logLevel>=2&&console.warn(e)},error:function(e){t.logLevel>=1&&console.error(e)}}]);for(var n=0;n0&&l.childNodes.length>0&&s.firstChild.nodeValue===l.firstChild.nodeValue);var u=t.getElementsByTagName("head")[0];if(null===s||!1===a){var c=i&&i.nextSibling||null;c?c.parentNode.insertBefore(l,c):u.appendChild(l)}if(s&&!1===a&&s.parentNode.removeChild(s),l.styleSheet)try{l.styleSheet.cssText=n}catch(e){throw new Error("Couldn't reassign styleSheet.cssText.")}},i=function(e){var t,n=e.document;return n.currentScript||(t=n.getElementsByTagName("script"))[t.length-1]},r={error:function(e){this._fireEvent("error",e)},warn:function(e){this._fireEvent("warn",e)},info:function(e){this._fireEvent("info",e)},debug:function(e){this._fireEvent("debug",e)},addListener:function(e){this._listeners.push(e)},removeListener:function(e){for(var t=0;t=0;a--){var l=s[a];if(l[o?"supportsSync":"supports"](e,t,n,i))return l}return null},e.prototype.addFileManager=function(e){this.fileManagers.push(e)},e.prototype.clearFileManagers=function(){this.fileManagers=[]},e}(),s={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",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:"#ff00ff",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:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",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:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",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:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},a={length:{m:1,cm:.01,mm:.001,in:.0254,px:.0254/96,pt:.0254/72,pc:.0254/72*12},duration:{s:1,ms:.001},angle:{rad:1/(2*Math.PI),deg:1/360,grad:1/400,turn:1}},l={colors:s,unitConversions:a},u=function(){function e(){this.parent=null,this.visibilityBlocks=void 0,this.nodeVisible=void 0,this.rootNode=null,this.parsed=null;var e=this;Object.defineProperty(this,"currentFileInfo",{get:function(){return e.fileInfo()}}),Object.defineProperty(this,"index",{get:function(){return e.getIndex()}})}return e.prototype.setParent=function(t,n){function i(t){t&&t instanceof e&&(t.parent=n)}Array.isArray(t)?t.forEach(i):i(t)},e.prototype.getIndex=function(){return this._index||this.parent&&this.parent.getIndex()||0},e.prototype.fileInfo=function(){return this._fileInfo||this.parent&&this.parent.fileInfo()||{}},e.prototype.isRulesetLike=function(){return!1},e.prototype.toCSS=function(e){var t=[];return this.genCSS(e,{add:function(e,n,i){t.push(e)},isEmpty:function(){return 0===t.length}}),t.join("")},e.prototype.genCSS=function(e,t){t.add(this.value)},e.prototype.accept=function(e){this.value=e.visit(this.value)},e.prototype.eval=function(){return this},e.prototype._operate=function(e,t,n,i){switch(t){case"+":return n+i;case"-":return n-i;case"*":return n*i;case"/":return n/i}},e.prototype.fround=function(e,t){var n=e&&e.numPrecision;return n?Number((t+2e-16).toFixed(n)):t},e.compare=function(t,n){if(t.compare&&"Quoted"!==n.type&&"Anonymous"!==n.type)return t.compare(n);if(n.compare)return-n.compare(t);if(t.type===n.type){if(t=t.value,n=n.value,!Array.isArray(t))return t===n?0:void 0;if(t.length===n.length){for(var i=0;it?1:void 0},e.prototype.blocksVisibility=function(){return null==this.visibilityBlocks&&(this.visibilityBlocks=0),0!==this.visibilityBlocks},e.prototype.addVisibilityBlock=function(){null==this.visibilityBlocks&&(this.visibilityBlocks=0),this.visibilityBlocks=this.visibilityBlocks+1},e.prototype.removeVisibilityBlock=function(){null==this.visibilityBlocks&&(this.visibilityBlocks=0),this.visibilityBlocks=this.visibilityBlocks-1},e.prototype.ensureVisibility=function(){this.nodeVisible=!0},e.prototype.ensureInvisibility=function(){this.nodeVisible=!1},e.prototype.isVisible=function(){return this.nodeVisible},e.prototype.visibilityInfo=function(){return{visibilityBlocks:this.visibilityBlocks,nodeVisible:this.nodeVisible}},e.prototype.copyVisibilityInfo=function(e){e&&(this.visibilityBlocks=e.visibilityBlocks,this.nodeVisible=e.nodeVisible)},e}(),c=function(e,t){return(c=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};function h(e,t){function n(){this.constructor=e}c(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var f=function(){return(f=Object.assign||function(e){for(var t,n=1,i=arguments.length;n=6?(r.rgb=[],t.match(/.{2}/g).map((function(e,t){t<3?o.rgb.push(parseInt(e,16)):o.alpha=parseInt(e,16)/255}))):(r.rgb=[],t.split("").map((function(e,t){t<3?o.rgb.push(parseInt(e+e,16)):o.alpha=parseInt(e+e,16)/255}))),r.alpha=r.alpha||("number"==typeof n?n:1),void 0!==i&&(r.value=i),r}return h(t,e),t.prototype.luma=function(){var e=this.rgb[0]/255,t=this.rgb[1]/255,n=this.rgb[2]/255;return.2126*(e=e<=.03928?e/12.92:Math.pow((e+.055)/1.055,2.4))+.7152*(t=t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4))+.0722*(n=n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4))},t.prototype.genCSS=function(e,t){t.add(this.toCSS(e))},t.prototype.toCSS=function(e,t){var n,i,r,o=e&&e.compress&&!t,s=[];if(i=this.fround(e,this.alpha),this.value)if(0===this.value.indexOf("rgb"))i<1&&(r="rgba");else{if(0!==this.value.indexOf("hsl"))return this.value;r=i<1?"hsla":"hsl"}else i<1&&(r="rgba");switch(r){case"rgba":s=this.rgb.map((function(e){return v(Math.round(e),255)})).concat(v(i,1));break;case"hsla":s.push(v(i,1));case"hsl":n=this.toHSL(),s=[this.fround(e,n.h),this.fround(e,100*n.s)+"%",this.fround(e,100*n.l)+"%"].concat(s)}if(r)return r+"("+s.join(","+(o?"":" "))+")";if(n=this.toRGB(),o){var a=n.split("");a[1]===a[2]&&a[3]===a[4]&&a[5]===a[6]&&(n="#"+a[1]+a[3]+a[5])}return n},t.prototype.operate=function(e,n,i){for(var r=new Array(3),o=this.alpha*(1-i.alpha)+i.alpha,s=0;s<3;s++)r[s]=this._operate(e,n,this.rgb[s],i.rgb[s]);return new t(r,o)},t.prototype.toRGB=function(){return d(this.rgb)},t.prototype.toHSL=function(){var e,t,n=this.rgb[0]/255,i=this.rgb[1]/255,r=this.rgb[2]/255,o=this.alpha,s=Math.max(n,i,r),a=Math.min(n,i,r),l=(s+a)/2,u=s-a;if(s===a)e=t=0;else{switch(t=l>.5?u/(2-s-a):u/(s+a),s){case n:e=(i-r)/u+(i=0&&"\n"!==t.charAt(n);)r++;return"number"==typeof e&&(i=(t.slice(0,e).match(/\n/g)||"").length),{line:i,column:r}}function k(e){var t,n=e.length,i=new Array(n);for(t=0;t|Function):(\d+):(\d+)/,V=function(e,t,n){Error.call(this);var i=e.filename||n;if(this.message=e.message,this.stack=e.stack,t&&i){var r=t.contents[i],o=C(e.index,r),s=o.line,a=o.column,l=e.call&&C(e.call,r).line,u=r?r.split("\n"):"";if(this.type=e.type||"Syntax",this.filename=i,this.index=e.index,this.line="number"==typeof s?s+1:null,this.column=a,!this.line&&this.stack){var c=this.stack.match(R),h=new Function("a","throw new Error()"),f=0;try{h()}catch(e){var p=e.stack.match(R);f=1-(s=parseInt(p[2]))}c&&(c[2]&&(this.line=parseInt(c[2])+f),c[3]&&(this.column=parseInt(c[3])))}this.callLine=l+1,this.callExtract=u[l],this.extract=[u[this.line-2],u[this.line-1],u[this.line]]}};if(void 0===Object.create){var F=function(){};F.prototype=Error.prototype,V.prototype=new F}else V.prototype=Object.create(Error.prototype);V.prototype.constructor=V,V.prototype.toString=function(e){e=e||{};var t="",n=this.extract||[],i=[],r=function(e){return e};if(e.stylize){var o=typeof e.stylize;if("function"!==o)throw Error("options.stylize should be a function, got a "+o+"!");r=e.stylize}if(null!==this.line){if("string"==typeof n[0]&&i.push(r(this.line-1+" "+n[0],"grey")),"string"==typeof n[1]){var s=this.line+" ";n[1]&&(s+=n[1].slice(0,this.column)+r(r(r(n[1].substr(this.column,1),"bold")+n[1].slice(this.column+1),"red"),"inverse")),i.push(s)}"string"==typeof n[2]&&i.push(r(this.line+1+" "+n[2],"grey")),i=i.join("\n")+r("","reset")+"\n"}return t+=r(this.type+"Error: "+this.message,"red"),this.filename&&(t+=r(" in ","red")+this.filename),this.line&&(t+=r(" on line "+this.line+", column "+(this.column+1)+":","grey")),t+="\n"+i,this.callLine&&(t+=r("from ","red")+(this.filename||"")+"/n",t+=r(this.callLine,"grey")+" "+this.callExtract+"/n"),t};var $=function(e){function t(t,n,i,r,o,s){var a=e.call(this)||this;return a.extendList=n,a.condition=i,a.evaldCondition=!i,a._index=r,a._fileInfo=o,a.elements=a.getElements(t),a.mixinElements_=void 0,a.copyVisibilityInfo(s),a.setParent(a.elements,a),a}return h(t,e),t.prototype.accept=function(e){this.elements&&(this.elements=e.visitArray(this.elements)),this.extendList&&(this.extendList=e.visitArray(this.extendList)),this.condition&&(this.condition=e.visit(this.condition))},t.prototype.createDerived=function(e,n,i){var r=new t(e=this.getElements(e),n||this.extendList,null,this.getIndex(),this.fileInfo(),this.visibilityInfo());return r.evaldCondition=null!=i?i:this.evaldCondition,r.mediaEmpty=this.mediaEmpty,r},t.prototype.getElements=function(e){return e?("string"==typeof e&&this.parse.parseNode(e,["selector"],this._index,this._fileInfo,(function(t,n){if(t)throw new V({index:t.index,message:t.message},this.parse.imports,this._fileInfo.filename);e=n[0].elements})),e):[new b("","&",!1,this._index,this._fileInfo)]},t.prototype.createEmptySelectors=function(){var e=[new t([new b("","&",!1,this._index,this._fileInfo)],null,null,this._index,this._fileInfo)];return e[0].mediaEmpty=!0,e},t.prototype.match=function(e){var t,n,i=this.elements,r=i.length;if(0===(t=(e=e.mixinElements()).length)||rw.PARENS_DIVISION)||this.parensStack&&this.parensStack.length))},j.Eval.prototype.pathRequiresRewrite=function(e){return(this.rewriteUrls===S?J:W)(e)},j.Eval.prototype.rewritePath=function(e,t){var n;return t=t||"",n=this.normalizePath(t+e),J(e)&&W(t)&&!1===J(n)&&(n="./"+n),n},j.Eval.prototype.normalizePath=function(e){var t,n=e.split("/").reverse();for(e=[];0!==n.length;)switch(t=n.pop()){case".":break;case"..":0===e.length||".."===e[e.length-1]?e.push(t):e.pop();break;default:e.push(t)}return e.join("/")};var H=function e(t){return{_data:{},add:function(e,t){e=e.toLowerCase(),this._data.hasOwnProperty(e),this._data[e]=t},addMultiple:function(e){var t=this;Object.keys(e).forEach((function(n){t.add(n,e[n])}))},get:function(e){return this._data[e]||t&&t.get(e)},getLocalFunctions:function(){return this._data},inherit:function(){return e(this)},create:function(t){return e(t)}}}(null),Q={eval:function(){var e=this.value_,t=this.error_;if(t)throw t;if(null!=e)return e?L.True:L.False},value:function(e){this.value_=e},error:function(e){this.error_=e},reset:function(){this.value_=this.error_=null}},K=function(e){function t(t,n,i,r){var o=e.call(this)||this;return o.selectors=t,o.rules=n,o._lookups={},o._variables=null,o._properties=null,o.strictImports=i,o.copyVisibilityInfo(r),o.allowRoot=!0,o.setParent(o.selectors,o),o.setParent(o.rules,o),o}return h(t,e),t.prototype.isRulesetLike=function(){return!0},t.prototype.accept=function(e){this.paths?this.paths=e.visitArray(this.paths,!0):this.selectors&&(this.selectors=e.visitArray(this.selectors)),this.rules&&this.rules.length&&(this.rules=e.visitArray(this.rules))},t.prototype.eval=function(e){var n,i,r,o,s,a=!1;if(this.selectors&&(i=this.selectors.length)){for(n=new Array(i),Q.error({type:"Syntax",message:"it is currently only allowed in parametric mixin guards,"}),o=0;o0;e--){var t=this.rules[e-1];if(t instanceof B)return this.parseValue(t)}},t.prototype.parseValue=function(e){var t=this;function n(e){return e.value instanceof N&&!e.parsed?("string"==typeof e.value.value?this.parse.parseNode(e.value.value,["value","important"],e.value.getIndex(),e.fileInfo(),(function(t,n){t&&(e.parsed=!0),n&&(e.value=n[0],e.important=n[1]||"",e.parsed=!0)})):e.parsed=!0,e):e}if(Array.isArray(e)){var i=[];return e.forEach((function(e){i.push(n.call(t,e))})),i}return n.call(t,e)},t.prototype.rulesets=function(){if(!this.rules)return[];var e,t,n=[],i=this.rules;for(e=0;t=i[e];e++)t.isRuleset&&n.push(t);return n},t.prototype.prependRule=function(e){var t=this.rules;t?t.unshift(e):this.rules=[e],this.setParent(e,this)},t.prototype.find=function(e,t,n){t=t||this;var i,r,o=[],s=e.toCSS();return s in this._lookups?this._lookups[s]:(this.rulesets().forEach((function(s){if(s!==t)for(var a=0;ai){if(!n||n(s)){r=s.find(new $(e.elements.slice(i)),t,n);for(var l=0;l0&&t.add(l),e.firstSelector=!0,s[0].genCSS(e,t),e.firstSelector=!1,i=1;i0?(o=(r=k(e)).pop(),s=i.createDerived(k(o.elements))):s=i.createDerived([]),t.length>0){var a=n.combinator,l=t[0].elements[0];a.emptyOrWhitespace&&!l.combinator.emptyOrWhitespace&&(a=l.combinator),s.elements.push(new b(a,l.value,n.isVariable,n._index,n._fileInfo)),s.elements=s.elements.concat(t[0].elements.slice(1))}if(0!==s.elements.length&&r.push(s),t.length>1){var u=t.slice(1);u=u.map((function(e){return e.createDerived(e.elements,[])})),r=r.concat(u)}return r}function s(e,t,n,i,r){var s;for(s=0;s0?i[i.length-1]=i[i.length-1].createDerived(i[i.length-1].elements.concat(e)):i.push(new $(e));else t.push([new $(e)])}function l(e,t){var n=t.createDerived(t.elements,t.extendList,t.evaldCondition);return n.copyVisibilityInfo(e),n}var u,c;if(!function e(t,n,l){var u,c,h,f,p,v,d,g,y,w,x,S,I=!1;for(f=[],p=[[]],u=0;g=l.elements[u];u++)if("&"!==g.value){var C=(S=void 0,(x=g).value instanceof m&&(S=x.value.value)instanceof $?S:null);if(null!=C){a(f,p);var k,_=[],A=[];for(k=e(_,n,C),I=I||k,h=0;h<_.length;h++){s(p,[r(i(_[h],g),g)],g,l,A)}p=A,f=[]}else f.push(g)}else{for(I=!0,v=[],a(f,p),c=0;c0&&d[0].elements.push(new b(g.combinator,"",g.isVariable,g._index,g._fileInfo)),v.push(d);else for(h=0;h0&&(t.push(p[u]),w=p[u][y-1],p[u][y-1]=w.createDerived(w.elements,l.extendList));return I}(c=[],t,n))if(t.length>0)for(c=[],u=0;u0)for(t=0;t-1e-6&&(i=n.toFixed(20).replace(/0+$/,"")),e&&e.compress){if(0===n&&this.unit.isLength())return void t.add(i);n>0&&n<1&&(i=i.substr(1))}t.add(i),this.unit.genCSS(e,t)},t.prototype.operate=function(e,n,i){var r=this._operate(e,n,this.value,i.value),o=this.unit.clone();if("+"===n||"-"===n)if(0===o.numerator.length&&0===o.denominator.length)o=i.unit.clone(),this.unit.backupUnit&&(o.backupUnit=this.unit.backupUnit);else if(0===i.unit.numerator.length&&0===o.denominator.length);else{if(i=i.convertTo(this.unit.usedUnits()),e.strictUnits&&i.unit.toString()!==o.toString())throw new Error("Incompatible units. Change the units or use the unit function. Bad units: '"+o.toString()+"' and '"+i.unit.toString()+"'.");r=this._operate(e,n,this.value,i.value)}else"*"===n?(o.numerator=o.numerator.concat(i.unit.numerator).sort(),o.denominator=o.denominator.concat(i.unit.denominator).sort(),o.cancel()):"/"===n&&(o.numerator=o.numerator.concat(i.unit.denominator).sort(),o.denominator=o.denominator.concat(i.unit.numerator).sort(),o.cancel());return new t(r,o)},t.prototype.compare=function(e){var n,i;if(e instanceof t){if(this.unit.isEmpty()||e.unit.isEmpty())n=this,i=e;else if(n=this.unify(),i=e.unify(),0!==n.unit.compare(i.unit))return;return u.numericCompare(n.value,i.value)}},t.prototype.unify=function(){return this.convertTo({length:"px",duration:"s",angle:"rad"})},t.prototype.convertTo=function(e){var n,i,r,o,s,l=this.value,u=this.unit.clone(),c={};if("string"==typeof e){for(n in a)a[n].hasOwnProperty(e)&&((c={})[n]=e);e=c}for(i in s=function(e,t){return r.hasOwnProperty(e)?(t?l/=r[e]/r[o]:l*=r[e]/r[o],o):e},e)e.hasOwnProperty(i)&&(o=e[i],r=a[i],u.map(s));return u.cancel(),new t(l,u)},t}(u);ee.prototype.type="Dimension";var te=w,ne=function(e){function t(t,n,i){var r=e.call(this)||this;return r.op=t.trim(),r.operands=n,r.isSpaced=i,r}return h(t,e),t.prototype.accept=function(e){this.operands=e.visitArray(this.operands)},t.prototype.eval=function(e){var n,i=this.operands[0].eval(e),r=this.operands[1].eval(e);if(e.isMathOn(this.op)){if(n="./"===this.op?"/":this.op,i instanceof ee&&r instanceof p&&(i=i.toColor()),r instanceof ee&&i instanceof p&&(r=r.toColor()),!i.operate){if(i instanceof t&&"/"===i.op&&e.math===te.PARENS_DIVISION)return new t(this.op,[i,r],this.isSpaced);throw{type:"Operation",message:"Operation on an invalid type"}}return i.operate(e,n,r)}return new t(this.op,[i,r],this.isSpaced)},t.prototype.genCSS=function(e,t){this.operands[0].genCSS(e,t),this.isSpaced&&t.add(" "),t.add(this.op),this.isSpaced&&t.add(" "),this.operands[1].genCSS(e,t)},t}(u);ne.prototype.type="Operation";var ie=function(e){function t(t,n){var i=e.call(this)||this;if(i.value=t,i.noSpacing=n,!t)throw new Error("Expression requires an array parameter");return i}return h(t,e),t.prototype.accept=function(e){this.value=e.visitArray(this.value)},t.prototype.eval=function(e){var n,i=e.isMathOn(),r=this.parens,o=!1;return r&&e.inParenthesis(),this.value.length>1?n=new t(this.value.map((function(t){return t.eval?t.eval(e):t})),this.noSpacing):1===this.value.length?(!this.value[0].parens||this.value[0].parensInOp||e.inCalc||(o=!0),n=this.value[0].eval(e)):n=this,r&&e.outOfParenthesis(),!this.parens||!this.parensInOp||i||o||n instanceof ee||(n=new m(n)),n},t.prototype.genCSS=function(e,t){for(var n=0;n1){var n=new $([],null,null,this.getIndex(),this.fileInfo()).createEmptySelectors();(t=new K(n,e.mediaBlocks)).multiMedia=!0,t.copyVisibilityInfo(this.visibilityInfo()),this.setParent(t,this)}return delete e.mediaBlocks,delete e.mediaPath,t},t.prototype.evalNested=function(e){var t,n,i=e.mediaPath.concat([this]);for(t=0;t0;t--)e.splice(t,0,new N("and"));return new ie(e)}))),this.setParent(this.features,this),new K([],[])},t.prototype.permute=function(e){if(0===e.length)return[];if(1===e.length)return e[0];for(var t=[],n=this.permute(e.slice(1)),i=0;i1?"["+e.value.map((function(e){return e.toCSS()})).join(", ")+"]":e.toCSS()},t}(u));pe.prototype.type="JavaScript";var ve=function(e){function t(t,n){var i=e.call(this)||this;return i.key=t,i.value=n,i}return h(t,e),t.prototype.accept=function(e){this.value=e.visit(this.value)},t.prototype.eval=function(e){return this.value.eval?new t(this.key,this.value.eval(e)):this},t.prototype.genCSS=function(e,t){t.add(this.key+"="),this.value.genCSS?this.value.genCSS(e,t):t.add(this.value)},t}(u);ve.prototype.type="Assignment";var de=function(e){function t(t,n,i,r,o){var s=e.call(this)||this;return s.op=t.trim(),s.lvalue=n,s.rvalue=i,s._index=r,s.negate=o,s}return h(t,e),t.prototype.accept=function(e){this.lvalue=e.visit(this.lvalue),this.rvalue=e.visit(this.rvalue)},t.prototype.eval=function(e){var t=function(e,t,n){switch(e){case"and":return t&&n;case"or":return t||n;default:switch(u.compare(t,n)){case-1:return"<"===e||"=<"===e||"<="===e;case 0:return"="===e||">="===e||"=<"===e||"<="===e;case 1:return">"===e||">="===e;default:return!1}}}(this.op,this.lvalue.eval(e),this.rvalue.eval(e));return this.negate?!t:t},t}(u);de.prototype.type="Condition";var me=function(e){function t(t){var n=e.call(this)||this;return n.value=t,n}return h(t,e),t}(u);me.prototype.type="UnicodeDescriptor";var ge=function(e){function t(t){var n=e.call(this)||this;return n.value=t,n}return h(t,e),t.prototype.genCSS=function(e,t){t.add("-"),this.value.genCSS(e,t)},t.prototype.eval=function(e){return e.isMathOn()?new ne("*",[new ee(-1),this.value]).eval(e):new t(this.value.eval(e))},t}(u);ge.prototype.type="Negative";var ye=function(e){function t(n,i,r,o,s){var a=e.call(this)||this;switch(a.selector=n,a.option=i,a.object_id=t.next_id++,a.parent_ids=[a.object_id],a._index=r,a._fileInfo=o,a.copyVisibilityInfo(s),a.allowRoot=!0,i){case"all":a.allowBefore=!0,a.allowAfter=!0;break;default:a.allowBefore=!1,a.allowAfter=!1}return a.setParent(a.selector,a),a}return h(t,e),t.prototype.accept=function(e){this.selector=e.visit(this.selector)},t.prototype.eval=function(e){return new t(this.selector.eval(e),this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},t.prototype.clone=function(e){return new t(this.selector,this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},t.prototype.findSelfSelectors=function(e){var t,n,i=[];for(t=0;t0&&n.length&&""===n[0].combinator.value&&(n[0].combinator.value=" "),i=i.concat(e[t].elements);this.selfSelectors=[new $(i)],this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo())},t}(u);ye.next_id=0,ye.prototype.type="Extend";var be=function(e){function t(t,n,i){var r=e.call(this)||this;return r.variable=t,r._index=n,r._fileInfo=i,r.allowRoot=!0,r}return h(t,e),t.prototype.eval=function(e){var t,n=new se(this.variable,this.getIndex(),this.fileInfo()).eval(e),i=new V({message:"Could not evaluate variable call "+this.variable});if(!n.ruleset){if(n.rules)t=n;else if(Array.isArray(n))t=new K("",n);else{if(!Array.isArray(n.value))throw i;t=new K("",n.value)}n=new X(t)}if(n.ruleset)return n.callEval(e);throw i},t}(u);be.prototype.type="VariableCall";var we=function(e){function t(t,n,i,r){var o=e.call(this)||this;return o.value=t,o.lookups=n,o._index=i,o._fileInfo=r,o}return h(t,e),t.prototype.eval=function(e){var t,n,i=this.value.eval(e);for(t=0;tthis.params.length)return!1}n=Math.min(o,this.arity);for(var s=0;s0){for(c=!0,a=0;a0)f=2;else if(f=1,p[1]+p[2]>1)throw{type:"Runtime",message:"Ambiguous use of `default()` found when matching for `"+this.format(m)+"`",index:this.getIndex(),filename:this.fileInfo().filename};for(a=0;a0&&(e=e.slice(0,t)),(t=e.lastIndexOf("/"))<0&&(t=e.lastIndexOf("\\")),t<0?"":e.slice(0,t+1)},e.prototype.tryAppendExtension=function(e,t){return/(\.[a-z]*$)|([\?;].*)$/.test(e)?e:e+t},e.prototype.tryAppendLessExtension=function(e){return this.tryAppendExtension(e,".less")},e.prototype.supportsSync=function(){return!1},e.prototype.alwaysMakePathsAbsolute=function(){return!1},e.prototype.isPathAbsolute=function(e){return/^(?:[a-z-]+:|\/|\\|#)/i.test(e)},e.prototype.join=function(e,t){return e?e+t:t},e.prototype.pathDiff=function(e,t){var n,i,r,o,s=this.extractUrlParts(e),a=this.extractUrlParts(t),l="";if(s.hostPart!==a.hostPart)return"";for(i=Math.max(a.directories.length,s.directories.length),n=0;nparseInt(t[n])?-1:1;return 0},e.prototype.versionToString=function(e){for(var t="",n=0;n0;){var e=this.imports[0];if(!e.isReady)return;this.imports=this.imports.slice(1),e.callback.apply(null,e.args)}if(0===this.variableImports.length)break;var t=this.variableImports[0];this.variableImports=this.variableImports.slice(1),t()}}finally{this._currentDepth--}0===this._currentDepth&&this._onSequencerEmpty&&this._onSequencerEmpty()},e}(),Re=function(e,t){this._visitor=new Ee(this),this._importer=e,this._finish=t,this.context=new j.Eval,this.importCount=0,this.onceFileDetectionMap={},this.recursionDetector={},this._sequencer=new Pe(this._onSequencerEmpty.bind(this))};Re.prototype={isReplacing:!1,run:function(e){try{this._visitor.visit(e)}catch(e){this.error=e}this.isFinished=!0,this._sequencer.tryRun()},_onSequencerEmpty:function(){this.isFinished&&this._finish(this.error)},visitImport:function(e,t){var n=e.options.inline;if(!e.css||n){var i=new j.Eval(this.context,k(this.context.frames)),r=i.frames[0];this.importCount++,e.isVariableImport()?this._sequencer.addVariableImport(this.processImportNode.bind(this,e,i,r)):this.processImportNode(e,i,r)}t.visitDeeper=!1},processImportNode:function(e,t,n){var i,r=e.options.inline;try{i=e.evalForImport(t)}catch(t){t.filename||(t.index=e.getIndex(),t.filename=e.fileInfo().filename),e.css=!0,e.error=t}if(!i||i.css&&!r)this.importCount--,this.isFinished&&this._sequencer.tryRun();else{i.options.multiple&&(t.importMultiple=!0);for(var o=void 0===i.css,s=0;s=0||(a=[u.selfSelectors[0]],(o=f.findMatch(l,a)).length&&(l.hasFoundMatches=!0,l.selfSelectors.forEach((function(e){var t=u.visibilityInfo();s=f.extendSelector(o,a,e,l.isVisible()),(c=new Ie.Extend(u.selector,u.option,0,u.fileInfo(),t)).selfSelectors=s,s[s.length-1].extendList=[c],h.push(c),c.ruleset=u.ruleset,c.parent_ids=c.parent_ids.concat(u.parent_ids,l.parent_ids),u.firstExtendOnThisSelectorPath&&(c.firstExtendOnThisSelectorPath=!0,u.ruleset.paths.push(s))}))));if(h.length){if(this.extendChainCount++,n>100){var p="{unable to calculate}",v="{unable to calculate}";try{p=h[0].selfSelectors[0].toCSS(),v=h[0].selector.toCSS()}catch(e){}throw{message:"extend circular reference detected. One of the circular extends is currently:"+p+":extend("+v+")"}}return h.concat(f.doExtendChaining(h,t,n+1))}return h},e.prototype.visitDeclaration=function(e,t){t.visitDeeper=!1},e.prototype.visitMixinDefinition=function(e,t){t.visitDeeper=!1},e.prototype.visitSelector=function(e,t){t.visitDeeper=!1},e.prototype.visitRuleset=function(e,t){if(!e.root){var n,i,r,o,s=this.allExtendsStack[this.allExtendsStack.length-1],a=[],l=this;for(r=0;r0&&u[l.matched].combinator.value!==s?l=null:l.matched++,l&&(l.finished=l.matched===u.length,l.finished&&!e.allowAfter&&(r+1u&&c>0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[u].elements.slice(c)),c=0,u++),l=o.elements.slice(c,a.index).concat([s]).concat(n.elements.slice(1)),u===a.pathIndex&&r>0?h[h.length-1].elements=h[h.length-1].elements.concat(l):(h=h.concat(t.slice(u,a.pathIndex))).push(new Ie.Selector(l)),u=a.endPathIndex,(c=a.endPathElementIndex)>=t[u].elements.length&&(c=0,u++);return u0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[u].elements.slice(c)),u++),h=(h=h.concat(t.slice(u,t.length))).map((function(e){var t=e.createDerived(e.elements);return i?t.ensureVisibility():t.ensureInvisibility(),t}))},e.prototype.visitMedia=function(e,t){var n=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);n=n.concat(this.doExtendChaining(n,e.allExtends)),this.allExtendsStack.push(n)},e.prototype.visitMediaOut=function(e){var t=this.allExtendsStack.length-1;this.allExtendsStack.length=t},e.prototype.visitAtRule=function(e,t){var n=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);n=n.concat(this.doExtendChaining(n,e.allExtends)),this.allExtendsStack.push(n)},e.prototype.visitAtRuleOut=function(e){var t=this.allExtendsStack.length-1;this.allExtendsStack.length=t},e}(),Oe=function(){function e(){this.contexts=[[]],this._visitor=new Ee(this)}return e.prototype.run=function(e){return this._visitor.visit(e)},e.prototype.visitDeclaration=function(e,t){t.visitDeeper=!1},e.prototype.visitMixinDefinition=function(e,t){t.visitDeeper=!1},e.prototype.visitRuleset=function(e,t){var n,i=this.contexts[this.contexts.length-1],r=[];this.contexts.push(r),e.root||((n=e.selectors)&&(n=n.filter((function(e){return e.getIsOutput()})),e.selectors=n.length?n:n=null,n&&e.joinSelectors(r,i,n)),n||(e.rules=null),e.paths=r)},e.prototype.visitRulesetOut=function(e){this.contexts.length=this.contexts.length-1},e.prototype.visitMedia=function(e,t){var n=this.contexts[this.contexts.length-1];e.rules[0].root=0===n.length||n[0].multiMedia},e.prototype.visitAtRule=function(e,t){var n=this.contexts[this.contexts.length-1];e.rules&&e.rules.length&&(e.rules[0].root=e.isRooted||0===n.length||null)},e}(),Le=function(){function e(e){this._visitor=new Ee(this),this._context=e}return e.prototype.containsSilentNonBlockedChild=function(e){var t;if(!e)return!1;for(var n=0;n0},e.prototype.resolveVisibility=function(e,t){if(!e.blocksVisibility()){if(this.isEmpty(e)&&!this.containsSilentNonBlockedChild(t))return;return e}var n=e.rules[0];if(this.keepOnlyVisibleChilds(n),!this.isEmpty(n))return e.ensureVisibility(),e.removeVisibilityBlock(),e},e.prototype.isVisibleRuleset=function(e){return!!e.firstRoot||!this.isEmpty(e)&&!(!e.root&&!this.hasVisibleSelector(e))},e}(),Ne=function(e){this._visitor=new Ee(this),this._context=e,this.utils=new Le(e)};Ne.prototype={isReplacing:!0,run:function(e){return this._visitor.visit(e)},visitDeclaration:function(e,t){if(!e.blocksVisibility()&&!e.variable)return e},visitMixinDefinition:function(e,t){e.frames=[]},visitExtend:function(e,t){},visitComment:function(e,t){if(!e.blocksVisibility()&&!e.isSilent(this._context))return e},visitMedia:function(e,t){var n=e.rules[0].rules;return e.accept(this._visitor),t.visitDeeper=!1,this.utils.resolveVisibility(e,n)},visitImport:function(e,t){if(!e.blocksVisibility())return e},visitAtRule:function(e,t){return e.rules&&e.rules.length?this.visitAtRuleWithBody(e,t):this.visitAtRuleWithoutBody(e,t)},visitAnonymous:function(e,t){if(!e.blocksVisibility())return e.accept(this._visitor),e},visitAtRuleWithBody:function(e,t){var n=function(e){var t=e.rules;return function(e){var t=e.rules;return 1===t.length&&(!t[0].paths||0===t[0].paths.length)}(e)?t[0].rules:t}(e);return e.accept(this._visitor),t.visitDeeper=!1,this.utils.isEmpty(e)||this._mergeRules(e.rules[0].rules),this.utils.resolveVisibility(e,n)},visitAtRuleWithoutBody:function(e,t){if(!e.blocksVisibility()){if("@charset"===e.name){if(this.charset){if(e.debugInfo){var n=new Ie.Comment("/* "+e.toCSS(this._context).replace(/\n/g,"")+" */\n");return n.debugInfo=e.debugInfo,this._visitor.visit(n)}return}this.charset=!0}return e}},checkValidNodes:function(e,t){if(e)for(var n=0;n0?e.accept(this._visitor):e.rules=null,t.visitDeeper=!1}return e.rules&&(this._mergeRules(e.rules),this._removeDuplicateRules(e.rules)),this.utils.isVisibleRuleset(e)&&(e.ensureVisibility(),i.splice(0,0,e)),1===i.length?i[0]:i},_compileRulesetPaths:function(e){e.paths&&(e.paths=e.paths.filter((function(e){var t;for(" "===e[0].elements[0].combinator.value&&(e[0].elements[0].combinator=new Ie.Combinator("")),t=0;t=0;i--)if((n=e[i])instanceof Ie.Declaration)if(r[n.name]){(t=r[n.name])instanceof Ie.Declaration&&(t=r[n.name]=[r[n.name].toCSS(this._context)]);var o=n.toCSS(this._context);-1!==t.indexOf(o)?e.splice(i,1):t.push(o)}else r[n.name]=n}},_mergeRules:function(e){if(e){for(var t={},n=[],i=0;i0){var t=e[0],n=[],i=[new Ie.Expression(n)];e.forEach((function(e){"+"===e.merge&&n.length>0&&i.push(new Ie.Expression(n=[])),n.push(e.value),t.important=t.important||e.important})),t.value=new Ie.Value(i)}}))}}};var De={Visitor:Ee,ImportVisitor:Re,MarkVisibleSelectorsVisitor:Ve,ExtendVisitor:$e,JoinSelectorVisitor:Oe,ToCSSVisitor:Ne};var Be=function(){var e,t,n,i,r,o,s,a=[],l={};function u(n){for(var i,a,c,h=l.i,f=t,p=l.i-s,v=l.i+o.length-p,d=l.i+=n,m=e;l.i=0){c={index:l.i,text:m.substr(l.i,y+2-l.i),isLineComment:!1},l.i+=c.text.length-1,l.commentStore.push(c);continue}}break}if(32!==i&&10!==i&&9!==i&&13!==i)break}if(o=o.slice(n+l.i-d+p),s=l.i,!o.length){if(tn||l.i===n&&e&&!i)&&(n=l.i,i=e);var r=a.pop();o=r.current,s=l.i=r.i,t=r.j},l.forget=function(){a.pop()},l.isWhitespace=function(t){var n=l.i+(t||0),i=e.charCodeAt(n);return 32===i||13===i||9===i||10===i},l.$re=function(e){l.i>s&&(o=o.slice(l.i-s),s=l.i);var t=e.exec(o);return t?(u(t[0].length),"string"==typeof t?t:1===t.length?t[0]:t):null},l.$char=function(t){return e.charAt(l.i)!==t?null:(u(1),t)},l.$str=function(t){for(var n=t.length,i=0;ih&&(d=!1)}}while(d);return r||null},l.autoCommentAbsorb=!0,l.commentStore=[],l.finished=!1,l.peek=function(t){if("string"==typeof t){for(var n=0;n57||t<43||47===t||44===t},l.start=function(i,a,c){e=i,l.i=t=s=n=0,r=a?function(e,t){var n,i,r,o,s,a,l,u,c,h=e.length,f=0,p=0,v=[],d=0;function m(t){var n=s-d;n<512&&!t||!n||(v.push(e.slice(d,s+1)),d=s+1)}for(s=0;s=97&&l<=122||l<34))switch(l){case 40:p++,i=s;continue;case 41:if(--p<0)return t("missing opening `(`",s);continue;case 59:p||m();continue;case 123:f++,n=s;continue;case 125:if(--f<0)return t("missing opening `{`",s);f||p||m();continue;case 92:if(s96)){if(u==l){c=1;break}if(92==u){if(s==h-1)return t("unescaped `\\`",s);s++}}if(c)continue;return t("unmatched `"+String.fromCharCode(l)+"`",a);case 47:if(p||s==h-1)continue;if(47==(u=e.charCodeAt(s+1)))for(s+=2;sn&&o>r?"missing closing `}` or `*/`":"missing closing `}`",n):0!==p?t("missing closing `)`",i):(m(!0),v)}(i,c):[i],o=r[0],u(0)},l.end=function(){var t,r=l.i>=e.length;return l.i=e.length-1,furthestChar:e[l.i]}},l},Ue=function e(t,n,i){var r,o=Be();function s(e,t){throw new V({index:o.i,filename:i.filename,type:t||"Syntax",message:e},n)}function a(e,t){var n=e instanceof Function?e.call(r):o.$re(e);if(n)return n;s(t||("string"==typeof e?"expected '"+e+"' got '"+o.currentChar()+"'":"unexpected token"))}function l(e,t){if(o.$char(e))return e;s(t||"expected '"+e+"' got '"+o.currentChar()+"'")}function u(e){var t=i.filename;return{lineNumber:C(e,o.getInput()).line+1,fileName:t}}return{parserInput:o,imports:n,fileInfo:i,parseNode:function(e,t,i,s,a){var l,u=[],c=o;try{c.start(e,!1,(function(e,t){a({message:e,index:t+i})}));for(var h=0,f=void 0,p=void 0;f=t[h];h++)if(p=c.i,l=r[f]()){try{l._index=p+i,l._fileInfo=s}catch(e){}u.push(l)}else u.push(null);c.end().isFinished?a(null,u):a(!0,null)}catch(e){throw new V({index:e.index+i,message:e.message},n,s.filename)}},parse:function(r,s,a){var l,u,c,h,f=null,p="";if(u=a&&a.globalVars?e.serializeVars(a.globalVars)+"\n":"",c=a&&a.modifyVars?"\n"+e.serializeVars(a.modifyVars):"",t.pluginManager)for(var v=t.pluginManager.getPreProcessors(),d=0;d");return e},args:function(e){var t,n,i,a,l,u,c,h=r.entities,f={args:null,variadic:!1},p=[],v=[],d=[],m=!0;for(o.save();;){if(e)u=r.detachedRuleset()||r.expression();else{if(o.commentStore.length=0,o.$str("...")){f.variadic=!0,o.$char(";")&&!t&&(t=!0),(t?v:d).push({variadic:!0});break}u=h.variable()||h.property()||h.literal()||h.keyword()||this.call(!0)}if(!u||!m)break;a=null,u.throwAwayComments&&u.throwAwayComments(),l=u;var g=null;if(e?u.value&&1==u.value.length&&(g=u.value[0]):g=u,g&&(g instanceof Ie.Variable||g instanceof Ie.Property))if(o.$char(":")){if(p.length>0&&(t&&s("Cannot mix ; and , as delimiter types"),n=!0),!(l=r.detachedRuleset()||r.expression())){if(!e)return o.restore(),f.args=[],f;s("could not understand value for named argument")}a=i=g.name}else if(o.$str("...")){if(!e){f.variadic=!0,o.$char(";")&&!t&&(t=!0),(t?v:d).push({name:u.name,variadic:!0});break}c=!0}else e||(i=a=g.name,l=null);l&&p.push(l),d.push({name:a,value:l,expand:c}),o.$char(",")?m=!0:((m=";"===o.$char(";"))||t)&&(n&&s("Cannot mix ; and , as delimiter types"),t=!0,p.length>1&&(l=new Ie.Value(p)),v.push({name:i,value:l,expand:c}),i=null,p=[],n=!1)}return o.forget(),f.args=t?v:d,f},definition:function(){var e,t,n,i,s=[],l=!1;if(!("."!==o.currentChar()&&"#"!==o.currentChar()||o.peek(/^[^{]*\}/)))if(o.save(),t=o.$re(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/)){e=t[1];var u=this.args(!1);if(s=u.args,l=u.variadic,!o.$char(")"))return void o.restore("Missing closing ')'");if(o.commentStore.length=0,o.$str("when")&&(i=a(r.conditions,"expected condition")),n=r.block())return o.forget(),new Ie.mixin.Definition(e,s,n,i,l);o.restore()}else o.restore()},ruleLookups:function(){var e,t=[];if("["===o.currentChar()){for(;;){if(o.save(),!(e=this.lookupValue())&&""!==e){o.restore();break}t.push(e),o.forget()}return t.length>0?t:void 0}},lookupValue:function(){if(o.save(),o.$char("[")){var e=o.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);if(o.$char("]"))return e||""===e?(o.forget(),e):void o.restore();o.restore()}else o.restore()}},entity:function(){var e=this.entities;return this.comment()||e.literal()||e.variable()||e.url()||e.property()||e.call()||e.keyword()||this.mixin.call(!0)||e.javascript()},end:function(){return o.$char(";")||o.peek("}")},ieAlpha:function(){var e;if(o.$re(/^opacity=/i))return(e=o.$re(/^\d+/))||(e="@{"+(e=a(r.entities.variable,"Could not parse alpha")).name.slice(1)+"}"),l(")"),new Ie.Quoted("","alpha(opacity="+e+")")},element:function(){var e,t,n,r=o.i;if(t=this.combinator(),(e=o.$re(/^(?:\d+\.\d+|\d+)%/)||o.$re(/^(?:[.#]?|:*)(?:[\w-]|[^\x00-\x9f]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/)||o.$char("*")||o.$char("&")||this.attribute()||o.$re(/^\([^&()@]+\)/)||o.$re(/^[\.#:](?=@)/)||this.entities.variableCurly())||(o.save(),o.$char("(")?(n=this.selector(!1))&&o.$char(")")?(e=new Ie.Paren(n),o.forget()):o.restore("Missing closing ')'"):o.forget()),e)return new Ie.Element(t,e,e instanceof Ie.Variable,r,i)},combinator:function(){var e=o.currentChar();if("/"===e){o.save();var t=o.$re(/^\/[a-z]+\//i);if(t)return o.forget(),new Ie.Combinator(t);o.restore()}if(">"===e||"+"===e||"~"===e||"|"===e||"^"===e){for(o.i++,"^"===e&&"^"===o.currentChar()&&(e="^^",o.i++);o.isWhitespace();)o.i++;return new Ie.Combinator(e)}return o.isWhitespace(-1)?new Ie.Combinator(" "):new Ie.Combinator(null)},selector:function(e){var t,n,r,l,u,c,h,f=o.i;for(e=!1!==e;(e&&(n=this.extend())||e&&(c=o.$str("when"))||(l=this.element()))&&(c?h=a(this.conditions,"expected condition"):h?s("CSS guard can only be used at the end of selector"):n?u=u?u.concat(n):n:(u&&s("Extend can only be used at the end of selector"),r=o.currentChar(),t?t.push(l):t=[l],l=null),"{"!==r&&"}"!==r&&";"!==r&&","!==r&&")"!==r););if(t)return new Ie.Selector(t,u,h,f,i);u&&s("Extend must be used to extend a selector, it cannot be used on its own")},selectors:function(){for(var e,t;(e=this.selector())&&(t?t.push(e):t=[e],o.commentStore.length=0,e.condition&&t.length>1&&s("Guards are only currently allowed on a single selector."),o.$char(","));)e.condition&&s("Guards are only currently allowed on a single selector."),o.commentStore.length=0;return t},attribute:function(){if(o.$char("[")){var e,t,n,i=this.entities;return(e=i.variableCurly())||(e=a(/^(?:[_A-Za-z0-9-\*]*\|)?(?:[_A-Za-z0-9-]|\\.)+/)),(n=o.$re(/^[|~*$^]?=/))&&(t=i.quoted()||o.$re(/^[0-9]+%/)||o.$re(/^[\w-]+/)||i.variableCurly()),l("]"),new Ie.Attribute(e,n,t)}},block:function(){var e;if(o.$char("{")&&(e=this.primary())&&o.$char("}"))return e},blockRuleset:function(){var e=this.block();return e&&(e=new Ie.Ruleset(null,e)),e},detachedRuleset:function(){var e,t,n;if(o.save(),!o.$re(/^[.#]\(/)||(t=(e=this.mixin.args(!1)).args,n=e.variadic,o.$char(")"))){var i=this.blockRuleset();if(i)return o.forget(),t?new Ie.mixin.Definition(null,t,i,null,n):new Ie.DetachedRuleset(i);o.restore()}else o.restore()},ruleset:function(){var e,n,i;if(o.save(),t.dumpLineNumbers&&(i=u(o.i)),(e=this.selectors())&&(n=this.block())){o.forget();var r=new Ie.Ruleset(e,n,t.strictImports);return t.dumpLineNumbers&&(r.debugInfo=i),r}o.restore()},declaration:function(){var e,t,n,r,s,a,l=o.i,u=o.currentChar();if("."!==u&&"#"!==u&&"&"!==u&&":"!==u)if(o.save(),e=this.variable()||this.ruleProperty()){if((a="string"==typeof e)&&(t=this.detachedRuleset())&&(n=!0),o.commentStore.length=0,!t){if(s=!a&&e.length>1&&e.pop().value,t=e[0].value&&"--"===e[0].value.slice(0,2)?this.permissiveValue():this.anonymousValue())return o.forget(),new Ie.Declaration(e,t,!1,s,l,i);t||(t=this.value()),t?r=this.important():a&&(t=this.permissiveValue())}if(t&&(this.end()||n))return o.forget(),new Ie.Declaration(e,t,r,s,l,i);o.restore()}else o.restore()},anonymousValue:function(){var e=o.i,t=o.$re(/^([^.#@\$+\/'"*`(;{}-]*);/);if(t)return new Ie.Anonymous(t[1],e)},permissiveValue:function(e){var t,n,r,a,l=e||";",u=o.i,c=[];function h(){var e=o.currentChar();return"string"==typeof l?e===l:l.test(e)}if(!h()){a=[];do{((n=this.comment())||(n=this.entity()))&&a.push(n)}while(n);if(r=h(),a.length>0){if(a=new Ie.Expression(a),r)return a;c.push(a)," "===o.prevChar()&&c.push(new Ie.Anonymous(" ",u))}if(o.save(),a=o.$parseUntil(l)){if("string"==typeof a&&s("Expected '"+a+"'","Parse"),1===a.length&&" "===a[0])return o.forget(),new Ie.Anonymous("",u);var f=void 0;for(t=0;t0)return new Ie.Expression(r)},mediaFeatures:function(){var e,t=this.entities,n=[];do{if(e=this.mediaFeature()){if(n.push(e),!o.$char(","))break}else if((e=t.variable()||t.mixinLookup())&&(n.push(e),!o.$char(",")))break}while(e);return n.length>0?n:null},media:function(){var e,n,r,a,l=o.i;if(t.dumpLineNumbers&&(a=u(l)),o.save(),o.$str("@media"))return e=this.mediaFeatures(),(n=this.block())||s("media definitions require block statements after any features"),o.forget(),r=new Ie.Media(n,e,l,i),t.dumpLineNumbers&&(r.debugInfo=a),r;o.restore()},plugin:function(){var e,t,n,r=o.i;if(o.$re(/^@plugin?\s+/)){if(n=(t=this.pluginArgs())?{pluginArgs:t,isPlugin:!0}:{isPlugin:!0},e=this.entities.quoted()||this.entities.url())return o.$char(";")||(o.i=r,s("missing semi-colon on @plugin")),new Ie.Import(e,null,n,r,i);o.i=r,s("malformed @plugin statement")}},pluginArgs:function(){if(o.save(),!o.$char("("))return o.restore(),null;var e=o.$re(/^\s*([^\);]+)\)\s*/);return e[1]?(o.forget(),e[1].trim()):(o.restore(),null)},atrule:function(){var e,n,r,a,l,c,h,f=o.i,p=!0,v=!0;if("@"===o.currentChar()){if(n=this.import()||this.plugin()||this.media())return n;if(o.save(),e=o.$re(/^@[a-z-]+/)){switch(a=e,"-"==e.charAt(1)&&e.indexOf("-",2)>0&&(a="@"+e.slice(e.indexOf("-",2)+1)),a){case"@charset":l=!0,p=!1;break;case"@namespace":c=!0,p=!1;break;case"@keyframes":case"@counter-style":l=!0;break;case"@document":case"@supports":h=!0,v=!1;break;default:h=!0}if(o.commentStore.length=0,l?(n=this.entity())||s("expected "+e+" identifier"):c?(n=this.expression())||s("expected "+e+" expression"):h&&(n=this.permissiveValue(/^[{;]/),p="{"===o.currentChar(),n?n.value||(n=null):p||";"===o.currentChar()||s(e+" rule is missing block or ending semi-colon")),p&&(r=this.blockRuleset()),r||!p&&n&&o.$char(";"))return o.forget(),new Ie.AtRule(e,n,r,f,i,t.dumpLineNumbers?u(f):null,v);o.restore("at-rule options not recognised")}}},value:function(){var e,t=[],n=o.i;do{if((e=this.expression())&&(t.push(e),!o.$char(",")))break}while(e);if(t.length>0)return new Ie.Value(t,n)},important:function(){if("!"===o.currentChar())return o.$re(/^! *important/)},sub:function(){var e,t;if(o.save(),o.$char("("))return(e=this.addition())&&o.$char(")")?(o.forget(),(t=new Ie.Expression([e])).parens=!0,t):void o.restore("Expected ')'");o.restore()},multiplication:function(){var e,t,n,i,r;if(e=this.operand()){for(r=o.isWhitespace(-1);!o.peek(/^\/[*\/]/);){if(o.save(),!(n=o.$char("/")||o.$char("*")||o.$str("./"))){o.forget();break}if(!(t=this.operand())){o.restore();break}o.forget(),e.parensInOp=!0,t.parensInOp=!0,i=new Ie.Operation(n,[i||e,t],r),r=o.isWhitespace(-1)}return i||e}},addition:function(){var e,t,n,i,r;if(e=this.multiplication()){for(r=o.isWhitespace(-1);(n=o.$re(/^[-+]\s+/)||!r&&(o.$char("+")||o.$char("-")))&&(t=this.multiplication());)e.parensInOp=!0,t.parensInOp=!0,i=new Ie.Operation(n,[i||e,t],r),r=o.isWhitespace(-1);return i||e}},conditions:function(){var e,t,n,i=o.i;if(e=this.condition(!0)){for(;o.peek(/^,\s*(not\s*)?\(/)&&o.$char(",")&&(t=this.condition(!0));)n=new Ie.Condition("or",n||e,t,i);return n||e}},condition:function(e){var t,n,i;if(t=this.conditionAnd(e)){if(n=o.$str("or")){if(!(i=this.condition(e)))return;t=new Ie.Condition(n,t,i)}return t}},conditionAnd:function(e){var t,n,i,r,s=this;if(t=(r=s.negatedCondition(e)||s.parenthesisCondition(e))||e?r:s.atomicCondition(e)){if(n=o.$str("and")){if(!(i=this.conditionAnd(e)))return;t=new Ie.Condition(n,t,i)}return t}},negatedCondition:function(e){if(o.$str("not")){var t=this.parenthesisCondition(e);return t&&(t.negate=!t.negate),t}},parenthesisCondition:function(e){var t;if(o.save(),o.$str("(")){if(t=function(t){var n;if(o.save(),n=t.condition(e)){if(o.$char(")"))return o.forget(),n;o.restore()}else o.restore()}(this))return o.forget(),t;if(t=this.atomicCondition(e)){if(o.$char(")"))return o.forget(),t;o.restore("expected ')' got '"+o.currentChar()+"'")}else o.restore()}else o.restore()},atomicCondition:function(e){var t,n,i,r,a=this.entities,l=o.i;function u(){return this.addition()||a.keyword()||a.quoted()||a.mixinLookup()}if(t=(u=u.bind(this))())return o.$char(">")?r=o.$char("=")?">=":">":o.$char("<")?r=o.$char("=")?"<=":"<":o.$char("=")&&(r=o.$char(">")?"=>":o.$char("<")?"=<":"="),r?(n=u())?i=new Ie.Condition(r,t,n,l,!1):s("expected expression"):i=new Ie.Condition("=",t,new Ie.Keyword("true"),l,!1),i},operand:function(){var e,t=this.entities;o.peek(/^-[@\$\(]/)&&(e=o.$char("-"));var n=this.sub()||t.dimension()||t.color()||t.variable()||t.property()||t.call()||t.quoted(!0)||t.colorKeyword()||t.mixinLookup();return e&&(n.parensInOp=!0,n=new Ie.Negative(n)),n},expression:function(){var e,t,n=[],i=o.i;do{(e=this.comment())?n.push(e):((e=this.addition()||this.entity())instanceof Ie.Comment&&(e=null),e&&(n.push(e),o.peek(/^\/[\/*]/)||(t=o.$char("/"))&&n.push(new Ie.Anonymous(t,i))))}while(e);if(n.length>0)return new Ie.Expression(n)},property:function(){var e=o.$re(/^(\*?-?[_a-zA-Z0-9-]+)\s*:/);if(e)return e[1]},ruleProperty:function(){var e,t,n=[],r=[];o.save();var s=o.$re(/^([_a-zA-Z0-9-]+)\s*:/);if(s)return n=[new Ie.Keyword(s[1])],o.forget(),n;function a(e){var t=o.i,i=o.$re(e);if(i)return r.push(t),n.push(i[1])}for(a(/^(\*?)/);a(/^((?:[\w-]+)|(?:[@\$]\{[\w-]+\}))/););if(n.length>1&&a(/^((?:\+_|\+)?)\s*:/)){for(o.forget(),""===n[0]&&(n.shift(),r.shift()),t=0;t1?e-1:e)<1?r+(o-r)*e*6:2*e<1?o:3*e<2?r+(o-r)*(2/3-e)*6:r}e=He(e)%360/360,t=ze(He(t)),n=ze(He(n)),i=ze(He(i)),r=2*n-(o=n<=.5?n*(t+1):n+t-n*t);var a=[255*s(e+1/3),255*s(e),255*s(e-1/3)];return i=He(i),new p(a,i,"hsla")}catch(e){}},hsv:function(e,t,n){return je.hsva(e,t,n,1)},hsva:function(e,t,n,i){var r,o;e=He(e)%360/360*360,t=He(t),n=He(n),i=He(i);var s=[n,n*(1-t),n*(1-(o=e/60-(r=Math.floor(e/60%6)))*t),n*(1-(1-o)*t)],a=[[0,3,1],[2,0,1],[1,0,3],[1,2,0],[3,1,0],[0,1,2]];return je.rgba(255*s[a[r][0]],255*s[a[r][1]],255*s[a[r][2]],i)},hue:function(e){return new ee(We(e).h)},saturation:function(e){return new ee(100*We(e).s,"%")},lightness:function(e){return new ee(100*We(e).l,"%")},hsvhue:function(e){return new ee(Je(e).h)},hsvsaturation:function(e){return new ee(100*Je(e).s,"%")},hsvvalue:function(e){return new ee(100*Je(e).v,"%")},red:function(e){return new ee(e.rgb[0])},green:function(e){return new ee(e.rgb[1])},blue:function(e){return new ee(e.rgb[2])},alpha:function(e){return new ee(We(e).a)},luma:function(e){return new ee(e.luma()*e.alpha*100,"%")},luminance:function(e){var t=.2126*e.rgb[0]/255+.7152*e.rgb[1]/255+.0722*e.rgb[2]/255;return new ee(t*e.alpha*100,"%")},saturate:function(e,t,n){if(!e.rgb)return null;var i=We(e);return void 0!==n&&"relative"===n.value?i.s+=i.s*t.value/100:i.s+=t.value/100,i.s=ze(i.s),Ge(e,i)},desaturate:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.s-=i.s*t.value/100:i.s-=t.value/100,i.s=ze(i.s),Ge(e,i)},lighten:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.l+=i.l*t.value/100:i.l+=t.value/100,i.l=ze(i.l),Ge(e,i)},darken:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.l-=i.l*t.value/100:i.l-=t.value/100,i.l=ze(i.l),Ge(e,i)},fadein:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.a+=i.a*t.value/100:i.a+=t.value/100,i.a=ze(i.a),Ge(e,i)},fadeout:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.a-=i.a*t.value/100:i.a-=t.value/100,i.a=ze(i.a),Ge(e,i)},fade:function(e,t){var n=We(e);return n.a=t.value/100,n.a=ze(n.a),Ge(e,n)},spin:function(e,t){var n=We(e),i=(n.h+t.value)%360;return n.h=i<0?360+i:i,Ge(e,n)},mix:function(e,t,n){n||(n=new ee(50));var i=n.value/100,r=2*i-1,o=We(e).a-We(t).a,s=((r*o==-1?r:(r+o)/(1+r*o))+1)/2,a=1-s,l=[e.rgb[0]*s+t.rgb[0]*a,e.rgb[1]*s+t.rgb[1]*a,e.rgb[2]*s+t.rgb[2]*a],u=e.alpha*i+t.alpha*(1-i);return new p(l,u)},greyscale:function(e){return je.desaturate(e,new ee(100))},contrast:function(e,t,n,i){if(!e.rgb)return null;if(void 0===n&&(n=je.rgba(255,255,255,1)),void 0===t&&(t=je.rgba(0,0,0,1)),t.luma()>n.luma()){var r=n;n=t,t=r}return i=void 0===i?.43:He(i),e.luma().5&&(i=1,n=e>.25?Math.sqrt(e):((16*e-12)*e+4)*e),e-(1-2*t)*i*(n-e)},hardlight:function(e,t){return Ze.overlay(t,e)},difference:function(e,t){return Math.abs(e-t)},exclusion:function(e,t){return e+t-2*e*t},average:function(e,t){return(e+t)/2},negation:function(e,t){return 1-Math.abs(e+t-1)}};for(var Xe in Ze)Ze.hasOwnProperty(Xe)&&(Ke[Xe]=Ke.bind(null,Ze[Xe]));var Ye=function(e){return Array.isArray(e.value)?e.value:Array(e)},et={_SELF:function(e){return e},"~":function(){for(var e=[],t=0;ts.value)&&(c[i]=r);else{if(void 0!==l&&a!==l)throw{type:"Argument",message:"incompatible types"};h[a]=c.length,c.push(r)}else Array.isArray(t[n].value)&&Array.prototype.push.apply(t,Array.prototype.slice.call(t[n].value));return 1==c.length?c[0]:(t=c.map((function(e){return e.toCSS(this.context)})).join(this.context.compress?",":", "),new N((e?"min":"max")+"("+t+")"))},ot={min:function(){for(var e=[],t=0;t",r=0;r";return i+="',i=encodeURIComponent(i),new ce(new ue("'"+(i="data:image/svg+xml,"+i)+"'",i,!1,this.index,this.currentFileInfo),this.index,this.currentFileInfo)}}),H.addMultiple(ut),t};function ht(e,t){var n,i=(t=t||{}).variables,r=new j.Eval(t);"object"!=typeof i||Array.isArray(i)||(i=Object.keys(i).map((function(e){var t=i[e];return t instanceof Ie.Value||(t instanceof Ie.Expression||(t=new Ie.Expression([t])),t=new Ie.Value([t])),new Ie.Declaration("@"+e,t,!1,null,0)})),r.frames=[new Ie.Ruleset(null,i)]);var o,s,a=[new De.JoinSelectorVisitor,new De.MarkVisibleSelectorsVisitor(!0),new De.ExtendVisitor,new De.ToCSSVisitor({compress:Boolean(t.compress)})],l=[];if(t.pluginManager){s=t.pluginManager.visitor();for(var u=0;u<2;u++)for(s.first();o=s.get();)o.isPreEvalVisitor?0!==u&&-1!==l.indexOf(o)||(l.push(o),o.run(e)):0!==u&&-1!==a.indexOf(o)||(o.isPreVisitor?a.unshift(o):a.push(o))}n=e.eval(r);for(u=0;u=t);n++);this.preProcessors.splice(n,0,{preProcessor:e,priority:t})},e.prototype.addPostProcessor=function(e,t){var n;for(n=0;n=t);n++);this.postProcessors.splice(n,0,{postProcessor:e,priority:t})},e.prototype.addFileManager=function(e){this.fileManagers.push(e)},e.prototype.getPreProcessors=function(){for(var e=[],t=0;t0){var i=void 0,r=JSON.stringify(this._sourceMapGenerator.toJSON());this.sourceMapURL?i=this.sourceMapURL:this._sourceMapFilename&&(i=this._sourceMapFilename),this.sourceMapURL=i,this.sourceMap=r}return this._css.join("")},t}()}(e=new o(e,t)),e)),a=function(e){return function(){function t(e,t,n){this.less=e,this.rootFilename=n.filename,this.paths=t.paths||[],this.contents={},this.contentsIgnoredChars={},this.mime=t.mime,this.error=null,this.context=t,this.queue=[],this.files={}}return t.prototype.push=function(t,n,i,o,s){var a=this,l=this.context.pluginManager.Loader;this.queue.push(t);var u=function(e,n,i){a.queue.splice(a.queue.indexOf(t),1);var l=i===a.rootFilename;o.optional&&e?(s(null,{rules:[]},!1,null),r.info("The file "+i+" was skipped because it was not found and the import was marked optional.")):(a.files[i]||o.inline||(a.files[i]={root:n,options:o}),e&&!a.error&&(a.error=e),s(e,n,l,i))},c={rewriteUrls:this.context.rewriteUrls,entryPath:i.entryPath,rootpath:i.rootpath,rootFilename:i.rootFilename},h=e.getFileManager(t,i.currentDirectory,this.context,e);if(h){var f,p,v=function(e){var t,n=e.filename,r=e.contents.replace(/^\uFEFF/,"");c.currentDirectory=h.getPath(n),c.rewriteUrls&&(c.rootpath=h.join(a.context.rootpath||"",h.pathDiff(c.currentDirectory,c.entryPath)),!h.isPathAbsolute(c.rootpath)&&h.alwaysMakePathsAbsolute()&&(c.rootpath=h.join(c.entryPath,c.rootpath))),c.filename=n;var s=new j.Parse(a.context);s.processImports=!1,a.contents[n]=r,(i.reference||o.reference)&&(c.reference=!0),o.isPlugin?(t=l.evalPlugin(r,s,a,o.pluginArgs,c))instanceof V?u(t,null,n):u(null,t,n):o.inline?u(null,r,n):!a.files[n]||a.files[n].options.multiple||o.multiple?new Ue(s,a,c).parse(r,(function(e,t){u(e,t,n)})):u(null,a.files[n].root,n)},d=_(this.context);n&&(d.ext=o.isPlugin?".js":".less"),o.isPlugin?(d.mime="application/javascript",d.syncImport?f=l.loadPluginSync(t,i.currentDirectory,d,e,h):p=l.loadPlugin(t,i.currentDirectory,d,e,h)):d.syncImport?f=h.loadFileSync(t,i.currentDirectory,d,e):p=h.loadFile(t,i.currentDirectory,d,e,(function(e,t){e?u(e):v(t)})),f?f.filename?v(f):u(f):p&&p.then(v,u)}else u({message:"Could not find a file-manager for "+t})},t}()}(e);var u,c=function(e,t,n){var i=function(e,n,r){if("function"==typeof n?(r=n,n=M(this.options,{})):n=M(this.options,n||{}),!r){var o=this;return new Promise((function(t,r){i.call(o,e,n,(function(e,n){e?r(e):t(n)}))}))}this.parse(e,n,(function(e,n,i,o){if(e)return r(e);var s;try{s=new t(n,i).toCSS(o)}catch(e){return r(e)}r(null,s)}))};return i}(0,s),h=function(e,t,n){var i=function(e,t,r){if("function"==typeof t?(r=t,t=M(this.options,{})):t=M(this.options,t||{}),!r){var o=this;return new Promise((function(n,r){i.call(o,e,t,(function(e,t){e?r(e):n(t)}))}))}var s,a=void 0,l=new mt(this,!t.reUsePluginManager);if(t.pluginManager=l,s=new j.Parse(t),t.rootFileInfo)a=t.rootFileInfo;else{var u=t.filename||"input",c=u.replace(/[^\/\\]*$/,"");(a={filename:u,rewriteUrls:s.rewriteUrls,rootpath:s.rootpath||"",currentDirectory:c,entryPath:c,rootFilename:u}).rootpath&&"/"!==a.rootpath.slice(-1)&&(a.rootpath+="/")}var h=new n(this,s,a);this.importManager=h,t.plugins&&t.plugins.forEach((function(e){var t,n;if(e.fileContent){if(n=e.fileContent.replace(/^\uFEFF/,""),(t=l.Loader.evalPlugin(n,s,h,e.options,e.filename))instanceof V)return r(t)}else l.addPlugin(e)})),new Ue(s,h,a).parse(e,(function(e,n){if(e)return r(e);r(null,n,h,t)}),t)};return i}(0,0,a),f={version:[4,0,0],data:l,tree:Ie,Environment:o,AbstractFileManager:Ce,AbstractPluginLoader:ke,environment:e,visitors:De,Parser:Ue,functions:ct(e),contexts:j,SourceMapOutput:n,SourceMapBuilder:i,ParseTree:s,ImportManager:a,render:c,parse:h,LessError:V,transformTree:ht,utils:P,PluginManager:mt,logger:r},p=function(e){return function(){var t=Object.create(e.prototype);return e.apply(t,Array.prototype.slice.call(arguments,0)),t}},v=Object.create(f);for(var d in f.tree)if("function"==typeof(u=f.tree[d]))v[d.toLowerCase()]=p(u);else for(var m in v[d]=Object.create(null),u)v[d][m.toLowerCase()]=p(u[m]);return f.parse=f.parse.bind(v),f.render=f.render.bind(v),v}var yt={},bt=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return h(t,e),t.prototype.alwaysMakePathsAbsolute=function(){return!0},t.prototype.join=function(e,t){return e?this.extractUrlParts(t,e).path:t},t.prototype.doXHR=function(e,t,n,i){var r=new XMLHttpRequest,o=!pt.isFileProtocol||pt.fileAsync;function s(t,n,i){t.status>=200&&t.status<300?n(t.responseText,t.getResponseHeader("Last-Modified")):"function"==typeof i&&i(t.status,e)}"function"==typeof r.overrideMimeType&&r.overrideMimeType("text/css"),vt.debug("XHR: Getting '"+e+"'"),r.open("GET",e,o),r.setRequestHeader("Accept",t||"text/x-less, text/css; q=0.9, */*; q=0.5"),r.send(null),pt.isFileProtocol&&!pt.fileAsync?0===r.status||r.status>=200&&r.status<300?n(r.responseText):i(r.status,e):o?r.onreadystatechange=function(){4==r.readyState&&s(r,n,i)}:s(r,n,i)},t.prototype.supports=function(){return!0},t.prototype.clearFileCache=function(){yt={}},t.prototype.loadFile=function(e,t,n,i){t&&!this.isPathAbsolute(e)&&(e=t+e),e=n.ext?this.tryAppendExtension(e,n.ext):e,n=n||{};var r=this.extractUrlParts(e,window.location.href).url,o=this;return new Promise((function(e,t){if(n.useFileCache&&yt[r])try{var i=yt[r];return e({contents:i,filename:r,webInfo:{lastModified:new Date}})}catch(e){return t({filename:r,message:"Error loading file "+r+" error was "+e.message})}o.doXHR(r,n.mime,(function(t,n){yt[r]=t,e({contents:t,filename:r,webInfo:{lastModified:n}})}),(function(e,n){t({type:"File",message:"'"+n+"' wasn't found ("+e+")",href:r})}))}))},t}(Ce),wt=function(e,t){return pt=e,vt=t,bt},xt=function(e){function t(t){var n=e.call(this)||this;return n.less=t,n}return h(t,e),t.prototype.loadPlugin=function(e,t,n,i,r){return new Promise((function(o,s){r.loadFile(e,t,n,i).then(o).catch(s)}))},t}(ke),St=function(t,i,r){return{add:function(o,s){r.errorReporting&&"html"!==r.errorReporting?"console"===r.errorReporting?function(e,t){var n=e.filename||t,o=[],s=(e.type||"Syntax")+"Error: "+(e.message||"There is an error in your .less file")+" in "+n,a=function(e,t,n){void 0!==e.extract[t]&&o.push("{line} {content}".replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,n).replace(/\{content\}/,e.extract[t]))};e.line&&(a(e,0,""),a(e,1,"line"),a(e,2,""),s+=" on line "+e.line+", column "+(e.column+1)+":\n"+o.join("\n")),e.stack&&(e.extract||r.logLevel>=4)&&(s+="\nStack Trace\n"+e.stack),i.logger.error(s)}(o,s):"function"==typeof r.errorReporting&&r.errorReporting("add",o,s):function(i,o){var s,a,l="less-error-message:"+e(o||""),u=t.document.createElement("div"),c=[],h=i.filename||o,f=h.match(/([^\/]+(\?.*)?)$/)[1];u.id=l,u.className="less-error-message",a="

    "+(i.type||"Syntax")+"Error: "+(i.message||"There is an error in your .less file")+'

    in '+f+" ";var p=function(e,t,n){void 0!==e.extract[t]&&c.push('

  • {content}
  • '.replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,n).replace(/\{content\}/,e.extract[t]))};i.line&&(p(i,0,""),p(i,1,"line"),p(i,2,""),a+="on line "+i.line+", column "+(i.column+1)+":

      "+c.join("")+"
    "),i.stack&&(i.extract||r.logLevel>=4)&&(a+="
    Stack Trace
    "+i.stack.split("\n").slice(1).join("
    ")),u.innerHTML=a,n(t.document,[".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #dd6666;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.line {","color: #ff0000;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),u.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),"development"===r.env&&(s=setInterval((function(){var e=t.document,n=e.body;n&&(e.getElementById(l)?n.replaceChild(u,e.getElementById(l)):n.insertBefore(u,n.firstChild),clearInterval(s))}),10))}(o,s)},remove:function(n){r.errorReporting&&"html"!==r.errorReporting?"console"===r.errorReporting||"function"==typeof r.errorReporting&&r.errorReporting("remove",n):function(n){var i=t.document.getElementById("less-error-message:"+e(n));i&&i.parentNode.removeChild(i)}(n)}}},It={javascriptEnabled:!1,depends:!1,compress:!1,lint:!1,paths:[],color:!0,strictImports:!1,insecure:!1,rootpath:"",rewriteUrls:!1,math:1,strictUnits:!1,globalVars:null,modifyVars:null,urlArgs:""};if(window.less)for(var Ct in window.less)window.less.hasOwnProperty(Ct)&&(It[Ct]=window.less[Ct]);!function(e,n){t(n,i(e)),void 0===n.isFileProtocol&&(n.isFileProtocol=/^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(e.location.protocol)),n.async=n.async||!1,n.fileAsync=n.fileAsync||!1,n.poll=n.poll||(n.isFileProtocol?1e3:1500),n.env=n.env||("127.0.0.1"==e.location.hostname||"0.0.0.0"==e.location.hostname||"localhost"==e.location.hostname||e.location.port&&e.location.port.length>0||n.isFileProtocol?"development":"production");var r=/!dumpLineNumbers:(comments|mediaquery|all)/.exec(e.location.hash);r&&(n.dumpLineNumbers=r[1]),void 0===n.useFileCache&&(n.useFileCache=!0),void 0===n.onReady&&(n.onReady=!0),n.relativeUrls&&(n.rewriteUrls="all")}(window,It),It.plugins=It.plugins||[],window.LESS_PLUGINS&&(It.plugins=It.plugins.concat(window.LESS_PLUGINS));var kt,_t,At,Mt=function(e,i){var r=e.document,o=gt();o.options=i;var s=o.environment,a=wt(i,o.logger),l=new a;s.addFileManager(l),o.FileManager=a,o.PluginLoader=xt,function(e,t){t.logLevel=void 0!==t.logLevel?t.logLevel:"development"===t.env?3:1,t.loggers||(t.loggers=[{debug:function(e){t.logLevel>=4&&console.log(e)},info:function(e){t.logLevel>=3&&console.log(e)},warn:function(e){t.logLevel>=2&&console.warn(e)},error:function(e){t.logLevel>=1&&console.error(e)}}]);for(var n=0;n 0 && styleNode.childNodes.length > 0 &&\n oldStyleNode.firstChild.nodeValue === styleNode.firstChild.nodeValue);\n }\n\n const head = document.getElementsByTagName('head')[0];\n\n // If there is no oldStyleNode, just append; otherwise, only append if we need\n // to replace oldStyleNode with an updated stylesheet\n if (oldStyleNode === null || keepOldStyleNode === false) {\n const nextEl = sheet && sheet.nextSibling || null;\n if (nextEl) {\n nextEl.parentNode.insertBefore(styleNode, nextEl);\n } else {\n head.appendChild(styleNode);\n }\n }\n if (oldStyleNode && keepOldStyleNode === false) {\n oldStyleNode.parentNode.removeChild(oldStyleNode);\n }\n\n // For IE.\n // This needs to happen *after* the style element is added to the DOM, otherwise IE 7 and 8 may crash.\n // See http://social.msdn.microsoft.com/Forums/en-US/7e081b65-878a-4c22-8e68-c10d39c2ed32/internet-explorer-crashes-appending-style-element-to-head\n if (styleNode.styleSheet) {\n try {\n styleNode.styleSheet.cssText = styles;\n } catch (e) {\n throw new Error('Couldn\\'t reassign styleSheet.cssText.');\n }\n }\n },\n currentScript: function(window) {\n const document = window.document;\n return document.currentScript || (() => {\n const scripts = document.getElementsByTagName('script');\n return scripts[scripts.length - 1];\n })();\n }\n};\n","export default {\n error: function(msg) {\n this._fireEvent('error', msg);\n },\n warn: function(msg) {\n this._fireEvent('warn', msg);\n },\n info: function(msg) {\n this._fireEvent('info', msg);\n },\n debug: function(msg) {\n this._fireEvent('debug', msg);\n },\n addListener: function(listener) {\n this._listeners.push(listener);\n },\n removeListener: function(listener) {\n for (let i = 0; i < this._listeners.length; i++) {\n if (this._listeners[i] === listener) {\n this._listeners.splice(i, 1);\n return;\n }\n }\n },\n _fireEvent: function(type, msg) {\n for (let i = 0; i < this._listeners.length; i++) {\n const logFunction = this._listeners[i][type];\n if (logFunction) {\n logFunction(msg);\n }\n }\n },\n _listeners: []\n};\n","/**\n * @todo Document why this abstraction exists, and the relationship between\n * environment, file managers, and plugin manager\n */\n\nimport logger from '../logger';\n\nclass Environment {\n constructor(externalEnvironment, fileManagers) {\n this.fileManagers = fileManagers || [];\n externalEnvironment = externalEnvironment || {};\n\n const optionalFunctions = ['encodeBase64', 'mimeLookup', 'charsetLookup', 'getSourceMapGenerator'];\n const requiredFunctions = [];\n const functions = requiredFunctions.concat(optionalFunctions);\n\n for (let i = 0; i < functions.length; i++) {\n const propName = functions[i];\n const environmentFunc = externalEnvironment[propName];\n if (environmentFunc) {\n this[propName] = environmentFunc.bind(externalEnvironment);\n } else if (i < requiredFunctions.length) {\n this.warn(`missing required function in environment - ${propName}`);\n }\n }\n }\n\n getFileManager(filename, currentDirectory, options, environment, isSync) {\n\n if (!filename) {\n logger.warn('getFileManager called with no filename.. Please report this issue. continuing.');\n }\n if (currentDirectory == null) {\n logger.warn('getFileManager called with null directory.. Please report this issue. continuing.');\n }\n\n let fileManagers = this.fileManagers;\n if (options.pluginManager) {\n fileManagers = [].concat(fileManagers).concat(options.pluginManager.getFileManagers());\n }\n for (let i = fileManagers.length - 1; i >= 0 ; i--) {\n const fileManager = fileManagers[i];\n if (fileManager[isSync ? 'supportsSync' : 'supports'](filename, currentDirectory, options, environment)) {\n return fileManager;\n }\n }\n return null;\n }\n\n addFileManager(fileManager) {\n this.fileManagers.push(fileManager);\n }\n\n clearFileManagers() {\n this.fileManagers = [];\n }\n}\n\nexport default Environment;\n","export default {\n 'aliceblue':'#f0f8ff',\n 'antiquewhite':'#faebd7',\n 'aqua':'#00ffff',\n 'aquamarine':'#7fffd4',\n 'azure':'#f0ffff',\n 'beige':'#f5f5dc',\n 'bisque':'#ffe4c4',\n 'black':'#000000',\n 'blanchedalmond':'#ffebcd',\n 'blue':'#0000ff',\n 'blueviolet':'#8a2be2',\n 'brown':'#a52a2a',\n 'burlywood':'#deb887',\n 'cadetblue':'#5f9ea0',\n 'chartreuse':'#7fff00',\n 'chocolate':'#d2691e',\n 'coral':'#ff7f50',\n 'cornflowerblue':'#6495ed',\n 'cornsilk':'#fff8dc',\n 'crimson':'#dc143c',\n 'cyan':'#00ffff',\n 'darkblue':'#00008b',\n 'darkcyan':'#008b8b',\n 'darkgoldenrod':'#b8860b',\n 'darkgray':'#a9a9a9',\n 'darkgrey':'#a9a9a9',\n 'darkgreen':'#006400',\n 'darkkhaki':'#bdb76b',\n 'darkmagenta':'#8b008b',\n 'darkolivegreen':'#556b2f',\n 'darkorange':'#ff8c00',\n 'darkorchid':'#9932cc',\n 'darkred':'#8b0000',\n 'darksalmon':'#e9967a',\n 'darkseagreen':'#8fbc8f',\n 'darkslateblue':'#483d8b',\n 'darkslategray':'#2f4f4f',\n 'darkslategrey':'#2f4f4f',\n 'darkturquoise':'#00ced1',\n 'darkviolet':'#9400d3',\n 'deeppink':'#ff1493',\n 'deepskyblue':'#00bfff',\n 'dimgray':'#696969',\n 'dimgrey':'#696969',\n 'dodgerblue':'#1e90ff',\n 'firebrick':'#b22222',\n 'floralwhite':'#fffaf0',\n 'forestgreen':'#228b22',\n 'fuchsia':'#ff00ff',\n 'gainsboro':'#dcdcdc',\n 'ghostwhite':'#f8f8ff',\n 'gold':'#ffd700',\n 'goldenrod':'#daa520',\n 'gray':'#808080',\n 'grey':'#808080',\n 'green':'#008000',\n 'greenyellow':'#adff2f',\n 'honeydew':'#f0fff0',\n 'hotpink':'#ff69b4',\n 'indianred':'#cd5c5c',\n 'indigo':'#4b0082',\n 'ivory':'#fffff0',\n 'khaki':'#f0e68c',\n 'lavender':'#e6e6fa',\n 'lavenderblush':'#fff0f5',\n 'lawngreen':'#7cfc00',\n 'lemonchiffon':'#fffacd',\n 'lightblue':'#add8e6',\n 'lightcoral':'#f08080',\n 'lightcyan':'#e0ffff',\n 'lightgoldenrodyellow':'#fafad2',\n 'lightgray':'#d3d3d3',\n 'lightgrey':'#d3d3d3',\n 'lightgreen':'#90ee90',\n 'lightpink':'#ffb6c1',\n 'lightsalmon':'#ffa07a',\n 'lightseagreen':'#20b2aa',\n 'lightskyblue':'#87cefa',\n 'lightslategray':'#778899',\n 'lightslategrey':'#778899',\n 'lightsteelblue':'#b0c4de',\n 'lightyellow':'#ffffe0',\n 'lime':'#00ff00',\n 'limegreen':'#32cd32',\n 'linen':'#faf0e6',\n 'magenta':'#ff00ff',\n 'maroon':'#800000',\n 'mediumaquamarine':'#66cdaa',\n 'mediumblue':'#0000cd',\n 'mediumorchid':'#ba55d3',\n 'mediumpurple':'#9370d8',\n 'mediumseagreen':'#3cb371',\n 'mediumslateblue':'#7b68ee',\n 'mediumspringgreen':'#00fa9a',\n 'mediumturquoise':'#48d1cc',\n 'mediumvioletred':'#c71585',\n 'midnightblue':'#191970',\n 'mintcream':'#f5fffa',\n 'mistyrose':'#ffe4e1',\n 'moccasin':'#ffe4b5',\n 'navajowhite':'#ffdead',\n 'navy':'#000080',\n 'oldlace':'#fdf5e6',\n 'olive':'#808000',\n 'olivedrab':'#6b8e23',\n 'orange':'#ffa500',\n 'orangered':'#ff4500',\n 'orchid':'#da70d6',\n 'palegoldenrod':'#eee8aa',\n 'palegreen':'#98fb98',\n 'paleturquoise':'#afeeee',\n 'palevioletred':'#d87093',\n 'papayawhip':'#ffefd5',\n 'peachpuff':'#ffdab9',\n 'peru':'#cd853f',\n 'pink':'#ffc0cb',\n 'plum':'#dda0dd',\n 'powderblue':'#b0e0e6',\n 'purple':'#800080',\n 'rebeccapurple':'#663399',\n 'red':'#ff0000',\n 'rosybrown':'#bc8f8f',\n 'royalblue':'#4169e1',\n 'saddlebrown':'#8b4513',\n 'salmon':'#fa8072',\n 'sandybrown':'#f4a460',\n 'seagreen':'#2e8b57',\n 'seashell':'#fff5ee',\n 'sienna':'#a0522d',\n 'silver':'#c0c0c0',\n 'skyblue':'#87ceeb',\n 'slateblue':'#6a5acd',\n 'slategray':'#708090',\n 'slategrey':'#708090',\n 'snow':'#fffafa',\n 'springgreen':'#00ff7f',\n 'steelblue':'#4682b4',\n 'tan':'#d2b48c',\n 'teal':'#008080',\n 'thistle':'#d8bfd8',\n 'tomato':'#ff6347',\n 'turquoise':'#40e0d0',\n 'violet':'#ee82ee',\n 'wheat':'#f5deb3',\n 'white':'#ffffff',\n 'whitesmoke':'#f5f5f5',\n 'yellow':'#ffff00',\n 'yellowgreen':'#9acd32'\n};","export default {\n length: {\n 'm': 1,\n 'cm': 0.01,\n 'mm': 0.001,\n 'in': 0.0254,\n 'px': 0.0254 / 96,\n 'pt': 0.0254 / 72,\n 'pc': 0.0254 / 72 * 12\n },\n duration: {\n 's': 1,\n 'ms': 0.001\n },\n angle: {\n 'rad': 1 / (2 * Math.PI),\n 'deg': 1 / 360,\n 'grad': 1 / 400,\n 'turn': 1\n }\n};","import colors from './colors';\nimport unitConversions from './unit-conversions';\n\nexport default { colors, unitConversions };\n","class Node {\n constructor() {\n this.parent = null;\n this.visibilityBlocks = undefined;\n this.nodeVisible = undefined;\n this.rootNode = null;\n this.parsed = null;\n\n const self = this;\n Object.defineProperty(this, 'currentFileInfo', {\n get: function() { return self.fileInfo(); }\n });\n Object.defineProperty(this, 'index', {\n get: function() { return self.getIndex(); }\n });\n\n }\n\n setParent(nodes, parent) {\n function set(node) {\n if (node && node instanceof Node) {\n node.parent = parent;\n }\n }\n if (Array.isArray(nodes)) {\n nodes.forEach(set);\n }\n else {\n set(nodes);\n }\n }\n\n getIndex() {\n return this._index || (this.parent && this.parent.getIndex()) || 0;\n }\n\n fileInfo() {\n return this._fileInfo || (this.parent && this.parent.fileInfo()) || {};\n }\n\n isRulesetLike() { return false; }\n\n toCSS(context) {\n const strs = [];\n this.genCSS(context, {\n add: function(chunk, fileInfo, index) {\n strs.push(chunk);\n },\n isEmpty: function () {\n return strs.length === 0;\n }\n });\n return strs.join('');\n }\n\n genCSS(context, output) {\n output.add(this.value);\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n eval() { return this; }\n\n _operate(context, op, a, b) {\n switch (op) {\n case '+': return a + b;\n case '-': return a - b;\n case '*': return a * b;\n case '/': return a / b;\n }\n }\n\n fround(context, value) {\n const precision = context && context.numPrecision;\n // add \"epsilon\" to ensure numbers like 1.000000005 (represented as 1.000000004999...) are properly rounded:\n return (precision) ? Number((value + 2e-16).toFixed(precision)) : value;\n }\n\n static compare(a, b) {\n /* returns:\n -1: a < b\n 0: a = b\n 1: a > b\n and *any* other value for a != b (e.g. undefined, NaN, -2 etc.) */\n\n if ((a.compare) &&\n // for \"symmetric results\" force toCSS-based comparison\n // of Quoted or Anonymous if either value is one of those\n !(b.type === 'Quoted' || b.type === 'Anonymous')) {\n return a.compare(b);\n } else if (b.compare) {\n return -b.compare(a);\n } else if (a.type !== b.type) {\n return undefined;\n }\n\n a = a.value;\n b = b.value;\n if (!Array.isArray(a)) {\n return a === b ? 0 : undefined;\n }\n if (a.length !== b.length) {\n return undefined;\n }\n for (let i = 0; i < a.length; i++) {\n if (Node.compare(a[i], b[i]) !== 0) {\n return undefined;\n }\n }\n return 0;\n }\n\n static numericCompare(a, b) {\n return a < b ? -1\n : a === b ? 0\n : a > b ? 1 : undefined;\n }\n\n // Returns true if this node represents root of ast imported by reference\n blocksVisibility() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n return this.visibilityBlocks !== 0;\n }\n\n addVisibilityBlock() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks + 1;\n }\n\n removeVisibilityBlock() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks - 1;\n }\n\n // Turns on node visibility - if called node will be shown in output regardless\n // of whether it comes from import by reference or not\n ensureVisibility() {\n this.nodeVisible = true;\n }\n\n // Turns off node visibility - if called node will NOT be shown in output regardless\n // of whether it comes from import by reference or not\n ensureInvisibility() {\n this.nodeVisible = false;\n }\n\n // return values:\n // false - the node must not be visible\n // true - the node must be visible\n // undefined or null - the node has the same visibility as its parent\n isVisible() {\n return this.nodeVisible;\n }\n\n visibilityInfo() {\n return {\n visibilityBlocks: this.visibilityBlocks,\n nodeVisible: this.nodeVisible\n };\n }\n\n copyVisibilityInfo(info) {\n if (!info) {\n return;\n }\n this.visibilityBlocks = info.visibilityBlocks;\n this.nodeVisible = info.nodeVisible;\n }\n}\n\nexport default Node;\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import Node from './node';\nimport colors from '../data/colors';\n\n//\n// RGB Colors - #ff0014, #eee\n//\nclass Color extends Node {\n constructor(rgb, a, originalForm) {\n super();\n\n const self = this;\n //\n // The end goal here, is to parse the arguments\n // into an integer triplet, such as `128, 255, 0`\n //\n // This facilitates operations and conversions.\n //\n if (Array.isArray(rgb)) {\n this.rgb = rgb;\n } else if (rgb.length >= 6) {\n this.rgb = [];\n rgb.match(/.{2}/g).map(function (c, i) {\n if (i < 3) {\n self.rgb.push(parseInt(c, 16));\n } else {\n self.alpha = (parseInt(c, 16)) / 255;\n }\n });\n } else {\n this.rgb = [];\n rgb.split('').map(function (c, i) {\n if (i < 3) {\n self.rgb.push(parseInt(c + c, 16));\n } else {\n self.alpha = (parseInt(c + c, 16)) / 255;\n }\n });\n }\n this.alpha = this.alpha || (typeof a === 'number' ? a : 1);\n if (typeof originalForm !== 'undefined') {\n this.value = originalForm;\n }\n }\n\n luma() {\n let r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255;\n\n r = (r <= 0.03928) ? r / 12.92 : Math.pow(((r + 0.055) / 1.055), 2.4);\n g = (g <= 0.03928) ? g / 12.92 : Math.pow(((g + 0.055) / 1.055), 2.4);\n b = (b <= 0.03928) ? b / 12.92 : Math.pow(((b + 0.055) / 1.055), 2.4);\n\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n }\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n }\n\n toCSS(context, doNotCompress) {\n const compress = context && context.compress && !doNotCompress;\n let color;\n let alpha;\n let colorFunction;\n let args = [];\n\n // `value` is set if this color was originally\n // converted from a named color string so we need\n // to respect this and try to output named color too.\n alpha = this.fround(context, this.alpha);\n\n if (this.value) {\n if (this.value.indexOf('rgb') === 0) {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n } else if (this.value.indexOf('hsl') === 0) {\n if (alpha < 1) {\n colorFunction = 'hsla';\n } else {\n colorFunction = 'hsl';\n }\n } else {\n return this.value;\n }\n } else {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n }\n\n switch (colorFunction) {\n case 'rgba':\n args = this.rgb.map(function (c) {\n return clamp(Math.round(c), 255);\n }).concat(clamp(alpha, 1));\n break;\n case 'hsla':\n args.push(clamp(alpha, 1));\n case 'hsl':\n color = this.toHSL();\n args = [\n this.fround(context, color.h),\n `${this.fround(context, color.s * 100)}%`,\n `${this.fround(context, color.l * 100)}%`\n ].concat(args);\n }\n\n if (colorFunction) {\n // Values are capped between `0` and `255`, rounded and zero-padded.\n return `${colorFunction}(${args.join(`,${compress ? '' : ' '}`)})`;\n }\n\n color = this.toRGB();\n\n if (compress) {\n const splitcolor = color.split('');\n\n // Convert color to short format\n if (splitcolor[1] === splitcolor[2] && splitcolor[3] === splitcolor[4] && splitcolor[5] === splitcolor[6]) {\n color = `#${splitcolor[1]}${splitcolor[3]}${splitcolor[5]}`;\n }\n }\n\n return color;\n }\n\n //\n // Operations have to be done per-channel, if not,\n // channels will spill onto each other. Once we have\n // our result, in the form of an integer triplet,\n // we create a new Color node to hold the result.\n //\n operate(context, op, other) {\n const rgb = new Array(3);\n const alpha = this.alpha * (1 - other.alpha) + other.alpha;\n for (let c = 0; c < 3; c++) {\n rgb[c] = this._operate(context, op, this.rgb[c], other.rgb[c]);\n }\n return new Color(rgb, alpha);\n }\n\n toRGB() {\n return toHex(this.rgb);\n }\n\n toHSL() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h;\n let s;\n const l = (max + min) / 2;\n const d = max - min;\n\n if (max === min) {\n h = s = 0;\n } else {\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, l, a };\n }\n\n // Adapted from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript\n toHSV() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h;\n let s;\n const v = max;\n\n const d = max - min;\n if (max === 0) {\n s = 0;\n } else {\n s = d / max;\n }\n\n if (max === min) {\n h = 0;\n } else {\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, v, a };\n }\n\n toARGB() {\n return toHex([this.alpha * 255].concat(this.rgb));\n }\n\n compare(x) {\n return (x.rgb &&\n x.rgb[0] === this.rgb[0] &&\n x.rgb[1] === this.rgb[1] &&\n x.rgb[2] === this.rgb[2] &&\n x.alpha === this.alpha) ? 0 : undefined;\n }\n\n static fromKeyword(keyword) {\n let c;\n const key = keyword.toLowerCase();\n if (colors.hasOwnProperty(key)) {\n c = new Color(colors[key].slice(1));\n }\n else if (key === 'transparent') {\n c = new Color([0, 0, 0], 0);\n }\n\n if (c) {\n c.value = keyword;\n return c;\n }\n }\n}\n\nColor.prototype.type = 'Color';\n\nfunction clamp(v, max) {\n return Math.min(Math.max(v, 0), max);\n}\n\nfunction toHex(v) {\n return `#${v.map(function (c) {\n c = clamp(Math.round(c), 255);\n return (c < 16 ? '0' : '') + c.toString(16);\n}).join('')}`;\n}\n\nexport default Color;\n","import Node from './node';\n\nclass Paren extends Node {\n constructor(node) {\n super();\n\n this.value = node;\n }\n\n genCSS(context, output) {\n output.add('(');\n this.value.genCSS(context, output);\n output.add(')');\n }\n\n eval(context) {\n return new Paren(this.value.eval(context));\n }\n}\n\nParen.prototype.type = 'Paren';\nexport default Paren;\n","import Node from './node';\nconst _noSpaceCombinators = {\n '': true,\n ' ': true,\n '|': true\n};\n\nclass Combinator extends Node {\n constructor(value) {\n super();\n\n if (value === ' ') {\n this.value = ' ';\n this.emptyOrWhitespace = true;\n } else {\n this.value = value ? value.trim() : '';\n this.emptyOrWhitespace = this.value === '';\n }\n }\n\n genCSS(context, output) {\n const spaceOrEmpty = (context.compress || _noSpaceCombinators[this.value]) ? '' : ' ';\n output.add(spaceOrEmpty + this.value + spaceOrEmpty);\n }\n}\n\nCombinator.prototype.type = 'Combinator';\n\nexport default Combinator;\n","import Node from './node';\nimport Paren from './paren';\nimport Combinator from './combinator';\n\nclass Element extends Node {\n constructor(combinator, value, isVariable, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.combinator = combinator instanceof Combinator ?\n combinator : new Combinator(combinator);\n\n if (typeof value === 'string') {\n this.value = value.trim();\n } else if (value) {\n this.value = value;\n } else {\n this.value = '';\n }\n this.isVariable = isVariable;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.combinator, this);\n }\n\n accept(visitor) {\n const value = this.value;\n this.combinator = visitor.visit(this.combinator);\n if (typeof value === 'object') {\n this.value = visitor.visit(value);\n }\n }\n\n eval(context) {\n return new Element(this.combinator,\n this.value.eval ? this.value.eval(context) : this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n }\n\n clone() {\n return new Element(this.combinator,\n this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n }\n\n genCSS(context, output) {\n output.add(this.toCSS(context), this.fileInfo(), this.getIndex());\n }\n\n toCSS(context) {\n context = context || {};\n let value = this.value;\n const firstSelector = context.firstSelector;\n if (value instanceof Paren) {\n // selector in parens should not be affected by outer selector\n // flags (breaks only interpolated selectors - see #1973)\n context.firstSelector = true;\n }\n value = value.toCSS ? value.toCSS(context) : value;\n context.firstSelector = firstSelector;\n if (value === '' && this.combinator.value.charAt(0) === '&') {\n return '';\n } else {\n return this.combinator.toCSS(context) + value;\n }\n }\n}\n\nElement.prototype.type = 'Element';\nexport default Element;\n","\nexport const Math = {\n ALWAYS: 0,\n PARENS_DIVISION: 1,\n PARENS: 2,\n // removed - STRICT_LEGACY: 3\n};\n\nexport const RewriteUrls = {\n OFF: 0,\n LOCAL: 1,\n ALL: 2\n};","/* jshint proto: true */\nimport * as Constants from './constants';\n\nexport function getLocation(index, inputStream) {\n let n = index + 1;\n let line = null;\n let column = -1;\n\n while (--n >= 0 && inputStream.charAt(n) !== '\\n') {\n column++;\n }\n\n if (typeof index === 'number') {\n line = (inputStream.slice(0, index).match(/\\n/g) || '').length;\n }\n\n return {\n line,\n column\n };\n}\n\nexport function copyArray(arr) {\n let i;\n const length = arr.length;\n const copy = new Array(length);\n\n for (i = 0; i < length; i++) {\n copy[i] = arr[i];\n }\n return copy;\n}\n\nexport function clone(obj) {\n const cloned = {};\n for (const prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n cloned[prop] = obj[prop];\n }\n }\n return cloned;\n}\n\nexport function defaults(obj1, obj2) {\n let newObj = obj2 || {};\n if (!obj2._defaults) {\n newObj = {};\n const defaults = {...obj1};\n newObj._defaults = defaults;\n const cloned = obj2 ? {...obj2} : {};\n Object.assign(newObj, defaults, cloned);\n }\n return newObj;\n}\n\nexport function copyOptions(obj1, obj2) {\n if (obj2 && obj2._defaults) {\n return obj2;\n }\n const opts = defaults(obj1, obj2);\n if (opts.strictMath) {\n opts.math = Constants.Math.PARENS;\n }\n // Back compat with changed relativeUrls option\n if (opts.relativeUrls) {\n opts.rewriteUrls = Constants.RewriteUrls.ALL;\n }\n if (typeof opts.math === 'string') {\n switch (opts.math.toLowerCase()) {\n case 'always':\n opts.math = Constants.Math.ALWAYS;\n break;\n case 'parens-division':\n opts.math = Constants.Math.PARENS_DIVISION;\n break;\n case 'strict':\n case 'parens':\n opts.math = Constants.Math.PARENS;\n break;\n default:\n opts.math = Constants.Math.PARENS;\n }\n }\n if (typeof opts.rewriteUrls === 'string') {\n switch (opts.rewriteUrls.toLowerCase()) {\n case 'off':\n opts.rewriteUrls = Constants.RewriteUrls.OFF;\n break;\n case 'local':\n opts.rewriteUrls = Constants.RewriteUrls.LOCAL;\n break;\n case 'all':\n opts.rewriteUrls = Constants.RewriteUrls.ALL;\n break;\n }\n }\n return opts;\n}\n\nexport function merge(obj1, obj2) {\n for (const prop in obj2) {\n if (obj2.hasOwnProperty(prop)) {\n obj1[prop] = obj2[prop];\n }\n }\n return obj1;\n}\n\nexport function flattenArray(arr, result = []) {\n for (let i = 0, length = arr.length; i < length; i++) {\n const value = arr[i];\n if (Array.isArray(value)) {\n flattenArray(value, result);\n } else {\n if (value !== undefined) {\n result.push(value);\n }\n }\n }\n return result;\n}","import * as utils from './utils';\n\nconst anonymousFunc = /(|Function):(\\d+):(\\d+)/;\n\n/**\n * This is a centralized class of any error that could be thrown internally (mostly by the parser).\n * Besides standard .message it keeps some additional data like a path to the file where the error\n * occurred along with line and column numbers.\n *\n * @class\n * @extends Error\n * @type {module.LessError}\n *\n * @prop {string} type\n * @prop {string} filename\n * @prop {number} index\n * @prop {number} line\n * @prop {number} column\n * @prop {number} callLine\n * @prop {number} callExtract\n * @prop {string[]} extract\n *\n * @param {Object} e - An error object to wrap around or just a descriptive object\n * @param {Object} fileContentMap - An object with file contents in 'contents' property (like importManager) @todo - move to fileManager?\n * @param {string} [currentFilename]\n */\nconst LessError = function(e, fileContentMap, currentFilename) {\n Error.call(this);\n\n const filename = e.filename || currentFilename;\n\n this.message = e.message;\n this.stack = e.stack;\n\n if (fileContentMap && filename) {\n const input = fileContentMap.contents[filename];\n const loc = utils.getLocation(e.index, input);\n var line = loc.line;\n const col = loc.column;\n const callLine = e.call && utils.getLocation(e.call, input).line;\n const lines = input ? input.split('\\n') : '';\n\n this.type = e.type || 'Syntax';\n this.filename = filename;\n this.index = e.index;\n this.line = typeof line === 'number' ? line + 1 : null;\n this.column = col;\n\n if (!this.line && this.stack) {\n const found = this.stack.match(anonymousFunc);\n\n /**\n * We have to figure out how this environment stringifies anonymous functions\n * so we can correctly map plugin errors.\n * \n * Note, in Node 8, the output of anonymous funcs varied based on parameters\n * being present or not, so we inject dummy params.\n */\n const func = new Function('a', 'throw new Error()');\n let lineAdjust = 0;\n try {\n func();\n } catch (e) {\n const match = e.stack.match(anonymousFunc);\n var line = parseInt(match[2]);\n lineAdjust = 1 - line;\n }\n\n if (found) {\n if (found[2]) {\n this.line = parseInt(found[2]) + lineAdjust;\n }\n if (found[3]) {\n this.column = parseInt(found[3]);\n }\n }\n }\n\n this.callLine = callLine + 1;\n this.callExtract = lines[callLine];\n\n this.extract = [\n lines[this.line - 2],\n lines[this.line - 1],\n lines[this.line]\n ];\n }\n\n};\n\nif (typeof Object.create === 'undefined') {\n const F = function () {};\n F.prototype = Error.prototype;\n LessError.prototype = new F();\n} else {\n LessError.prototype = Object.create(Error.prototype);\n}\n\nLessError.prototype.constructor = LessError;\n\n/**\n * An overridden version of the default Object.prototype.toString\n * which uses additional information to create a helpful message.\n *\n * @param {Object} options\n * @returns {string}\n */\nLessError.prototype.toString = function(options) {\n options = options || {};\n\n let message = '';\n const extract = this.extract || [];\n let error = [];\n let stylize = function (str) { return str; };\n if (options.stylize) {\n const type = typeof options.stylize;\n if (type !== 'function') {\n throw Error(`options.stylize should be a function, got a ${type}!`);\n }\n stylize = options.stylize;\n }\n\n if (this.line !== null) {\n if (typeof extract[0] === 'string') {\n error.push(stylize(`${this.line - 1} ${extract[0]}`, 'grey'));\n }\n\n if (typeof extract[1] === 'string') {\n let errorTxt = `${this.line} `;\n if (extract[1]) {\n errorTxt += extract[1].slice(0, this.column) +\n stylize(stylize(stylize(extract[1].substr(this.column, 1), 'bold') +\n extract[1].slice(this.column + 1), 'red'), 'inverse');\n }\n error.push(errorTxt);\n }\n\n if (typeof extract[2] === 'string') {\n error.push(stylize(`${this.line + 1} ${extract[2]}`, 'grey'));\n }\n error = `${error.join('\\n') + stylize('', 'reset')}\\n`;\n }\n\n message += stylize(`${this.type}Error: ${this.message}`, 'red');\n if (this.filename) {\n message += stylize(' in ', 'red') + this.filename;\n }\n if (this.line) {\n message += stylize(` on line ${this.line}, column ${this.column + 1}:`, 'grey');\n }\n\n message += `\\n${error}`;\n\n if (this.callLine) {\n message += `${stylize('from ', 'red') + (this.filename || '')}/n`;\n message += `${stylize(this.callLine, 'grey')} ${this.callExtract}/n`;\n }\n\n return message;\n};\n\nexport default LessError;","import Node from './node';\nimport Element from './element';\nimport LessError from '../less-error';\n\nclass Selector extends Node {\n constructor(elements, extendList, condition, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.extendList = extendList;\n this.condition = condition;\n this.evaldCondition = !condition;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.elements = this.getElements(elements);\n this.mixinElements_ = undefined;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.elements, this);\n }\n\n accept(visitor) {\n if (this.elements) {\n this.elements = visitor.visitArray(this.elements);\n }\n if (this.extendList) {\n this.extendList = visitor.visitArray(this.extendList);\n }\n if (this.condition) {\n this.condition = visitor.visit(this.condition);\n }\n }\n\n createDerived(elements, extendList, evaldCondition) {\n elements = this.getElements(elements);\n const newSelector = new Selector(elements, extendList || this.extendList,\n null, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n newSelector.evaldCondition = (evaldCondition != null) ? evaldCondition : this.evaldCondition;\n newSelector.mediaEmpty = this.mediaEmpty;\n return newSelector;\n }\n\n getElements(els) {\n if (!els) {\n return [new Element('', '&', false, this._index, this._fileInfo)];\n }\n if (typeof els === 'string') {\n this.parse.parseNode(\n els, \n ['selector'],\n this._index, \n this._fileInfo, \n function(err, result) {\n if (err) {\n throw new LessError({\n index: err.index,\n message: err.message\n }, this.parse.imports, this._fileInfo.filename);\n }\n els = result[0].elements;\n });\n }\n return els;\n }\n\n createEmptySelectors() {\n const el = new Element('', '&', false, this._index, this._fileInfo), sels = [new Selector([el], null, null, this._index, this._fileInfo)];\n sels[0].mediaEmpty = true;\n return sels;\n }\n\n match(other) {\n const elements = this.elements;\n const len = elements.length;\n let olen;\n let i;\n\n other = other.mixinElements();\n olen = other.length;\n if (olen === 0 || len < olen) {\n return 0;\n } else {\n for (i = 0; i < olen; i++) {\n if (elements[i].value !== other[i]) {\n return 0;\n }\n }\n }\n\n return olen; // return number of matched elements\n }\n\n mixinElements() {\n if (this.mixinElements_) {\n return this.mixinElements_;\n }\n\n let elements = this.elements.map( function(v) {\n return v.combinator.value + (v.value.value || v.value);\n }).join('').match(/[,&#\\*\\.\\w-]([\\w-]|(\\\\.))*/g);\n\n if (elements) {\n if (elements[0] === '&') {\n elements.shift();\n }\n } else {\n elements = [];\n }\n\n return (this.mixinElements_ = elements);\n }\n\n isJustParentSelector() {\n return !this.mediaEmpty &&\n this.elements.length === 1 &&\n this.elements[0].value === '&' &&\n (this.elements[0].combinator.value === ' ' || this.elements[0].combinator.value === '');\n }\n\n eval(context) {\n const evaldCondition = this.condition && this.condition.eval(context);\n let elements = this.elements;\n let extendList = this.extendList;\n\n elements = elements && elements.map(function (e) { return e.eval(context); });\n extendList = extendList && extendList.map(function(extend) { return extend.eval(context); });\n\n return this.createDerived(elements, extendList, evaldCondition);\n }\n\n genCSS(context, output) {\n let i, element;\n if ((!context || !context.firstSelector) && this.elements[0].combinator.value === '') {\n output.add(' ', this.fileInfo(), this.getIndex());\n }\n for (i = 0; i < this.elements.length; i++) {\n element = this.elements[i];\n element.genCSS(context, output);\n }\n }\n\n getIsOutput() {\n return this.evaldCondition;\n }\n}\n\nSelector.prototype.type = 'Selector';\nexport default Selector;\n","import Node from './node';\n\nclass Value extends Node {\n constructor(value) {\n super();\n\n if (!value) {\n throw new Error('Value requires an array argument');\n }\n if (!Array.isArray(value)) {\n this.value = [ value ];\n }\n else {\n this.value = value;\n }\n }\n\n accept(visitor) {\n if (this.value) {\n this.value = visitor.visitArray(this.value);\n }\n }\n\n eval(context) {\n if (this.value.length === 1) {\n return this.value[0].eval(context);\n } else {\n return new Value(this.value.map(function (v) {\n return v.eval(context);\n }));\n }\n }\n\n genCSS(context, output) {\n let i;\n for (i = 0; i < this.value.length; i++) {\n this.value[i].genCSS(context, output);\n if (i + 1 < this.value.length) {\n output.add((context && context.compress) ? ',' : ', ');\n }\n }\n }\n}\n\nValue.prototype.type = 'Value';\nexport default Value;\n","import Node from './node';\n\nclass Keyword extends Node {\n constructor(value) {\n super();\n\n this.value = value;\n }\n\n genCSS(context, output) {\n if (this.value === '%') { throw { type: 'Syntax', message: 'Invalid % without number' }; }\n output.add(this.value);\n }\n}\n\nKeyword.prototype.type = 'Keyword';\n\nKeyword.True = new Keyword('true');\nKeyword.False = new Keyword('false');\n\nexport default Keyword;\n","import Node from './node';\n\nclass Anonymous extends Node {\n constructor(value, index, currentFileInfo, mapLines, rulesetLike, visibilityInfo) {\n super();\n\n this.value = value;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.mapLines = mapLines;\n this.rulesetLike = (typeof rulesetLike === 'undefined') ? false : rulesetLike;\n this.allowRoot = true;\n this.copyVisibilityInfo(visibilityInfo);\n }\n\n eval() {\n return new Anonymous(this.value, this._index, this._fileInfo, this.mapLines, this.rulesetLike, this.visibilityInfo());\n }\n\n compare(other) {\n return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n }\n\n isRulesetLike() {\n return this.rulesetLike;\n }\n\n genCSS(context, output) {\n this.nodeVisible = Boolean(this.value);\n if (this.nodeVisible) {\n output.add(this.value, this._fileInfo, this._index, this.mapLines);\n }\n }\n}\n\nAnonymous.prototype.type = 'Anonymous';\nexport default Anonymous;\n","import Node from './node';\nimport Value from './value';\nimport Keyword from './keyword';\nimport Anonymous from './anonymous';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\nclass Declaration extends Node {\n constructor(name, value, important, merge, index, currentFileInfo, inline, variable) {\n super();\n\n this.name = name;\n this.value = (value instanceof Node) ? value : new Value([value ? new Anonymous(value) : null]);\n this.important = important ? ` ${important.trim()}` : '';\n this.merge = merge;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.inline = inline || false;\n this.variable = (variable !== undefined) ? variable\n : (name.charAt && (name.charAt(0) === '@'));\n this.allowRoot = true;\n this.setParent(this.value, this);\n }\n\n genCSS(context, output) {\n output.add(this.name + (context.compress ? ':' : ': '), this.fileInfo(), this.getIndex());\n try {\n this.value.genCSS(context, output);\n }\n catch (e) {\n e.index = this._index;\n e.filename = this._fileInfo.filename;\n throw e;\n }\n output.add(this.important + ((this.inline || (context.lastRule && context.compress)) ? '' : ';'), this._fileInfo, this._index);\n }\n\n eval(context) {\n let mathBypass = false, prevMath, name = this.name, evaldValue, variable = this.variable;\n if (typeof name !== 'string') {\n // expand 'primitive' name directly to get\n // things faster (~10% for benchmark.less):\n name = (name.length === 1) && (name[0] instanceof Keyword) ?\n name[0].value : evalName(context, name);\n variable = false; // never treat expanded interpolation as new variable name\n }\n\n // @todo remove when parens-division is default\n if (name === 'font' && context.math === MATH.ALWAYS) {\n mathBypass = true;\n prevMath = context.math;\n context.math = MATH.PARENS_DIVISION;\n }\n try {\n context.importantScope.push({});\n evaldValue = this.value.eval(context);\n\n if (!this.variable && evaldValue.type === 'DetachedRuleset') {\n throw { message: 'Rulesets cannot be evaluated on a property.',\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n let important = this.important;\n const importantResult = context.importantScope.pop();\n if (!important && importantResult.important) {\n important = importantResult.important;\n }\n\n return new Declaration(name,\n evaldValue,\n important,\n this.merge,\n this.getIndex(), this.fileInfo(), this.inline,\n variable);\n }\n catch (e) {\n if (typeof e.index !== 'number') {\n e.index = this.getIndex();\n e.filename = this.fileInfo().filename;\n }\n throw e;\n }\n finally {\n if (mathBypass) {\n context.math = prevMath;\n }\n }\n }\n\n makeImportant() {\n return new Declaration(this.name,\n this.value,\n '!important',\n this.merge,\n this.getIndex(), this.fileInfo(), this.inline);\n }\n}\n\nfunction evalName(context, name) {\n let value = '';\n let i;\n const n = name.length;\n const output = {add: function (s) {value += s;}};\n for (i = 0; i < n; i++) {\n name[i].eval(context).genCSS(context, output);\n }\n return value;\n}\n\nDeclaration.prototype.type = 'Declaration';\nexport default Declaration;","class debugInfo {\n constructor(context, ctx, lineSeparator) {\n let result = '';\n if (context.dumpLineNumbers && !context.compress) {\n switch (context.dumpLineNumbers) {\n case 'comments':\n result = debugInfo.asComment(ctx);\n break;\n case 'mediaquery':\n result = debugInfo.asMediaQuery(ctx);\n break;\n case 'all':\n result = debugInfo.asComment(ctx) + (lineSeparator || '') + debugInfo.asMediaQuery(ctx);\n break;\n }\n }\n return result;\n }\n\n static asComment(ctx) {\n return `/* line ${ctx.debugInfo.lineNumber}, ${ctx.debugInfo.fileName} */\\n`;\n }\n\n static asMediaQuery(ctx) {\n let filenameWithProtocol = ctx.debugInfo.fileName;\n if (!/^[a-z]+:\\/\\//i.test(filenameWithProtocol)) {\n filenameWithProtocol = `file://${filenameWithProtocol}`;\n }\n return `@media -sass-debug-info{filename{font-family:${filenameWithProtocol.replace(/([.:\\/\\\\])/g, function (a) {\n if (a == '\\\\') {\n a = '\\/';\n }\n return `\\\\${a}`;\n})}}line{font-family:\\\\00003${ctx.debugInfo.lineNumber}}}\\n`;\n }\n}\n\nexport default debugInfo;\n","import Node from './node';\nimport getDebugInfo from './debug-info';\n\nclass Comment extends Node {\n constructor(value, isLineComment, index, currentFileInfo) {\n super();\n\n this.value = value;\n this.isLineComment = isLineComment;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.allowRoot = true;\n }\n\n genCSS(context, output) {\n if (this.debugInfo) {\n output.add(getDebugInfo(context, this), this.fileInfo(), this.getIndex());\n }\n output.add(this.value);\n }\n\n isSilent(context) {\n const isCompressed = context.compress && this.value[2] !== '!';\n return this.isLineComment || isCompressed;\n }\n}\n\nComment.prototype.type = 'Comment';\nexport default Comment;\n","const contexts = {};\nexport default contexts;\nimport * as Constants from './constants';\n\nconst copyFromOriginal = function copyFromOriginal(original, destination, propertiesToCopy) {\n if (!original) { return; }\n\n for (let i = 0; i < propertiesToCopy.length; i++) {\n if (original.hasOwnProperty(propertiesToCopy[i])) {\n destination[propertiesToCopy[i]] = original[propertiesToCopy[i]];\n }\n }\n};\n\n/*\n parse is used whilst parsing\n */\nconst parseCopyProperties = [\n // options\n 'paths', // option - unmodified - paths to search for imports on\n 'rewriteUrls', // option - whether to adjust URL's to be relative\n 'rootpath', // option - rootpath to append to URL's\n 'strictImports', // option -\n 'insecure', // option - whether to allow imports from insecure ssl hosts\n 'dumpLineNumbers', // option - whether to dump line numbers\n 'compress', // option - whether to compress\n 'syncImport', // option - whether to import synchronously\n 'chunkInput', // option - whether to chunk input. more performant but causes parse issues.\n 'mime', // browser only - mime type for sheet import\n 'useFileCache', // browser only - whether to use the per file session cache\n // context\n 'processImports', // option & context - whether to process imports. if false then imports will not be imported.\n // Used by the import manager to stop multiple import visitors being created.\n 'pluginManager' // Used as the plugin manager for the session\n];\n\ncontexts.Parse = function(options) {\n copyFromOriginal(options, this, parseCopyProperties);\n\n if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n};\n\nconst evalCopyProperties = [\n 'paths', // additional include paths\n 'compress', // whether to compress\n 'ieCompat', // whether to enforce IE compatibility (IE8 data-uri)\n 'math', // whether math has to be within parenthesis\n 'strictUnits', // whether units need to evaluate correctly\n 'sourceMap', // whether to output a source map\n 'importMultiple', // whether we are currently importing multiple copies\n 'urlArgs', // whether to add args into url tokens\n 'javascriptEnabled', // option - whether Inline JavaScript is enabled. if undefined, defaults to false\n 'pluginManager', // Used as the plugin manager for the session\n 'importantScope', // used to bubble up !important statements\n 'rewriteUrls' // option - whether to adjust URL's to be relative\n];\n\ncontexts.Eval = function(options, frames) {\n copyFromOriginal(options, this, evalCopyProperties);\n\n if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n\n this.frames = frames || [];\n this.importantScope = this.importantScope || [];\n};\n\ncontexts.Eval.prototype.enterCalc = function () {\n if (!this.calcStack) {\n this.calcStack = [];\n }\n this.calcStack.push(true);\n this.inCalc = true;\n};\n\ncontexts.Eval.prototype.exitCalc = function () {\n this.calcStack.pop();\n if (!this.calcStack.length) {\n this.inCalc = false;\n }\n};\n\ncontexts.Eval.prototype.inParenthesis = function () {\n if (!this.parensStack) {\n this.parensStack = [];\n }\n this.parensStack.push(true);\n};\n\ncontexts.Eval.prototype.outOfParenthesis = function () {\n this.parensStack.pop();\n};\n\ncontexts.Eval.prototype.inCalc = false;\ncontexts.Eval.prototype.mathOn = true;\ncontexts.Eval.prototype.isMathOn = function (op) {\n if (!this.mathOn) {\n return false;\n }\n if (op === '/' && this.math !== Constants.Math.ALWAYS && (!this.parensStack || !this.parensStack.length)) {\n return false;\n }\n if (this.math > Constants.Math.PARENS_DIVISION) {\n return this.parensStack && this.parensStack.length;\n }\n return true;\n};\n\ncontexts.Eval.prototype.pathRequiresRewrite = function (path) {\n const isRelative = this.rewriteUrls === Constants.RewriteUrls.LOCAL ? isPathLocalRelative : isPathRelative;\n\n return isRelative(path);\n};\n\ncontexts.Eval.prototype.rewritePath = function (path, rootpath) {\n let newPath;\n\n rootpath = rootpath || '';\n newPath = this.normalizePath(rootpath + path);\n\n // If a path was explicit relative and the rootpath was not an absolute path\n // we must ensure that the new path is also explicit relative.\n if (isPathLocalRelative(path) &&\n isPathRelative(rootpath) &&\n isPathLocalRelative(newPath) === false) {\n newPath = `./${newPath}`;\n }\n\n return newPath;\n};\n\ncontexts.Eval.prototype.normalizePath = function (path) {\n const segments = path.split('/').reverse();\n let segment;\n\n path = [];\n while (segments.length !== 0) {\n segment = segments.pop();\n switch ( segment ) {\n case '.':\n break;\n case '..':\n if ((path.length === 0) || (path[path.length - 1] === '..')) {\n path.push( segment );\n } else {\n path.pop();\n }\n break;\n default:\n path.push(segment);\n break;\n }\n }\n\n return path.join('/');\n};\n\nfunction isPathRelative(path) {\n return !/^(?:[a-z-]+:|\\/|#)/i.test(path);\n}\n\nfunction isPathLocalRelative(path) {\n return path.charAt(0) === '.';\n}\n\n// todo - do the same for the toCSS ?\n","function makeRegistry( base ) {\n return {\n _data: {},\n add: function(name, func) {\n // precautionary case conversion, as later querying of\n // the registry by function-caller uses lower case as well.\n name = name.toLowerCase();\n\n if (this._data.hasOwnProperty(name)) {\n // TODO warn\n }\n this._data[name] = func;\n },\n addMultiple: function(functions) {\n Object.keys(functions).forEach(\n name => {\n this.add(name, functions[name]);\n });\n },\n get: function(name) {\n return this._data[name] || ( base && base.get( name ));\n },\n getLocalFunctions: function() {\n return this._data;\n },\n inherit: function() {\n return makeRegistry( this );\n },\n create: function(base) {\n return makeRegistry(base);\n }\n };\n}\n\nexport default makeRegistry( null );","import Keyword from '../tree/keyword';\n\nconst defaultFunc = {\n eval: function () {\n const v = this.value_;\n const e = this.error_;\n if (e) {\n throw e;\n }\n if (v != null) {\n return v ? Keyword.True : Keyword.False;\n }\n },\n value: function (v) {\n this.value_ = v;\n },\n error: function (e) {\n this.error_ = e;\n },\n reset: function () {\n this.value_ = this.error_ = null;\n }\n};\n\nexport default defaultFunc;\n","import Node from './node';\nimport Declaration from './declaration';\nimport Keyword from './keyword';\nimport Comment from './comment';\nimport Paren from './paren';\nimport Selector from './selector';\nimport Element from './element';\nimport Anonymous from './anonymous';\nimport contexts from '../contexts';\nimport globalFunctionRegistry from '../functions/function-registry';\nimport defaultFunc from '../functions/default';\nimport getDebugInfo from './debug-info';\nimport * as utils from '../utils';\n\nclass Ruleset extends Node {\n constructor(selectors, rules, strictImports, visibilityInfo) {\n super();\n\n this.selectors = selectors;\n this.rules = rules;\n this._lookups = {};\n this._variables = null;\n this._properties = null;\n this.strictImports = strictImports;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n\n this.setParent(this.selectors, this);\n this.setParent(this.rules, this);\n\n }\n\n isRulesetLike() { return true; }\n\n accept(visitor) {\n if (this.paths) {\n this.paths = visitor.visitArray(this.paths, true);\n } else if (this.selectors) {\n this.selectors = visitor.visitArray(this.selectors);\n }\n if (this.rules && this.rules.length) {\n this.rules = visitor.visitArray(this.rules);\n }\n }\n\n eval(context) {\n const that = this;\n let selectors;\n let selCnt;\n let selector;\n let i;\n let hasVariable;\n let hasOnePassingSelector = false;\n\n if (this.selectors && (selCnt = this.selectors.length)) {\n selectors = new Array(selCnt);\n defaultFunc.error({\n type: 'Syntax',\n message: 'it is currently only allowed in parametric mixin guards,'\n });\n\n for (i = 0; i < selCnt; i++) {\n selector = this.selectors[i].eval(context);\n for (var j = 0; j < selector.elements.length; j++) {\n if (selector.elements[j].isVariable) {\n hasVariable = true;\n break;\n }\n }\n selectors[i] = selector;\n if (selector.evaldCondition) {\n hasOnePassingSelector = true;\n }\n }\n\n if (hasVariable) {\n const toParseSelectors = new Array(selCnt);\n for (i = 0; i < selCnt; i++) {\n selector = selectors[i];\n toParseSelectors[i] = selector.toCSS(context);\n }\n this.parse.parseNode(\n toParseSelectors.join(','),\n [\"selectors\"], \n selectors[0].getIndex(), \n selectors[0].fileInfo(), \n function(err, result) {\n if (result) {\n selectors = utils.flattenArray(result);\n }\n });\n }\n\n defaultFunc.reset();\n } else {\n hasOnePassingSelector = true;\n }\n\n let rules = this.rules ? utils.copyArray(this.rules) : null;\n const ruleset = new Ruleset(selectors, rules, this.strictImports, this.visibilityInfo());\n let rule;\n let subRule;\n\n ruleset.originalRuleset = this;\n ruleset.root = this.root;\n ruleset.firstRoot = this.firstRoot;\n ruleset.allowImports = this.allowImports;\n\n if (this.debugInfo) {\n ruleset.debugInfo = this.debugInfo;\n }\n\n if (!hasOnePassingSelector) {\n rules.length = 0;\n }\n\n // inherit a function registry from the frames stack when possible;\n // otherwise from the global registry\n ruleset.functionRegistry = (function (frames) {\n let i = 0;\n const n = frames.length;\n let found;\n for ( ; i !== n ; ++i ) {\n found = frames[ i ].functionRegistry;\n if ( found ) { return found; }\n }\n return globalFunctionRegistry;\n }(context.frames)).inherit();\n\n // push the current ruleset to the frames stack\n const ctxFrames = context.frames;\n ctxFrames.unshift(ruleset);\n\n // currrent selectors\n let ctxSelectors = context.selectors;\n if (!ctxSelectors) {\n context.selectors = ctxSelectors = [];\n }\n ctxSelectors.unshift(this.selectors);\n\n // Evaluate imports\n if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) {\n ruleset.evalImports(context);\n }\n\n // Store the frames around mixin definitions,\n // so they can be evaluated like closures when the time comes.\n const rsRules = ruleset.rules;\n for (i = 0; (rule = rsRules[i]); i++) {\n if (rule.evalFirst) {\n rsRules[i] = rule.eval(context);\n }\n }\n\n const mediaBlockCount = (context.mediaBlocks && context.mediaBlocks.length) || 0;\n\n // Evaluate mixin calls.\n for (i = 0; (rule = rsRules[i]); i++) {\n if (rule.type === 'MixinCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).filter(function(r) {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope if the variable is\n // already there. consider returning false here\n // but we need a way to \"return\" variable from mixins\n return !(ruleset.variable(r.name));\n }\n return true;\n });\n rsRules.splice.apply(rsRules, [i, 1].concat(rules));\n i += rules.length - 1;\n ruleset.resetCache();\n } else if (rule.type === 'VariableCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).rules.filter(function(r) {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope at all\n return false;\n }\n return true;\n });\n rsRules.splice.apply(rsRules, [i, 1].concat(rules));\n i += rules.length - 1;\n ruleset.resetCache();\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n if (!rule.evalFirst) {\n rsRules[i] = rule = rule.eval ? rule.eval(context) : rule;\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n // for rulesets, check if it is a css guard and can be removed\n if (rule instanceof Ruleset && rule.selectors && rule.selectors.length === 1) {\n // check if it can be folded in (e.g. & where)\n if (rule.selectors[0] && rule.selectors[0].isJustParentSelector()) {\n rsRules.splice(i--, 1);\n\n for (var j = 0; (subRule = rule.rules[j]); j++) {\n if (subRule instanceof Node) {\n subRule.copyVisibilityInfo(rule.visibilityInfo());\n if (!(subRule instanceof Declaration) || !subRule.variable) {\n rsRules.splice(++i, 0, subRule);\n }\n }\n }\n }\n }\n }\n\n // Pop the stack\n ctxFrames.shift();\n ctxSelectors.shift();\n\n if (context.mediaBlocks) {\n for (i = mediaBlockCount; i < context.mediaBlocks.length; i++) {\n context.mediaBlocks[i].bubbleSelectors(selectors);\n }\n }\n\n return ruleset;\n }\n\n evalImports(context) {\n const rules = this.rules;\n let i;\n let importRules;\n if (!rules) { return; }\n\n for (i = 0; i < rules.length; i++) {\n if (rules[i].type === 'Import') {\n importRules = rules[i].eval(context);\n if (importRules && (importRules.length || importRules.length === 0)) {\n rules.splice.apply(rules, [i, 1].concat(importRules));\n i += importRules.length - 1;\n } else {\n rules.splice(i, 1, importRules);\n }\n this.resetCache();\n }\n }\n }\n\n makeImportant() {\n const result = new Ruleset(this.selectors, this.rules.map(function (r) {\n if (r.makeImportant) {\n return r.makeImportant();\n } else {\n return r;\n }\n }), this.strictImports, this.visibilityInfo());\n\n return result;\n }\n\n matchArgs(args) {\n return !args || args.length === 0;\n }\n\n // lets you call a css selector with a guard\n matchCondition(args, context) {\n const lastSelector = this.selectors[this.selectors.length - 1];\n if (!lastSelector.evaldCondition) {\n return false;\n }\n if (lastSelector.condition &&\n !lastSelector.condition.eval(\n new contexts.Eval(context,\n context.frames))) {\n return false;\n }\n return true;\n }\n\n resetCache() {\n this._rulesets = null;\n this._variables = null;\n this._properties = null;\n this._lookups = {};\n }\n\n variables() {\n if (!this._variables) {\n this._variables = !this.rules ? {} : this.rules.reduce(function (hash, r) {\n if (r instanceof Declaration && r.variable === true) {\n hash[r.name] = r;\n }\n // when evaluating variables in an import statement, imports have not been eval'd\n // so we need to go inside import statements.\n // guard against root being a string (in the case of inlined less)\n if (r.type === 'Import' && r.root && r.root.variables) {\n const vars = r.root.variables();\n for (const name in vars) {\n if (vars.hasOwnProperty(name)) {\n hash[name] = r.root.variable(name);\n }\n }\n }\n return hash;\n }, {});\n }\n return this._variables;\n }\n\n properties() {\n if (!this._properties) {\n this._properties = !this.rules ? {} : this.rules.reduce(function (hash, r) {\n if (r instanceof Declaration && r.variable !== true) {\n const name = (r.name.length === 1) && (r.name[0] instanceof Keyword) ?\n r.name[0].value : r.name;\n // Properties don't overwrite as they can merge\n if (!hash[`$${name}`]) {\n hash[`$${name}`] = [ r ];\n }\n else {\n hash[`$${name}`].push(r);\n }\n }\n return hash;\n }, {});\n }\n return this._properties;\n }\n\n variable(name) {\n const decl = this.variables()[name];\n if (decl) {\n return this.parseValue(decl);\n }\n }\n\n property(name) {\n const decl = this.properties()[name];\n if (decl) {\n return this.parseValue(decl);\n }\n }\n\n lastDeclaration() {\n for (let i = this.rules.length; i > 0; i--) {\n const decl = this.rules[i - 1];\n if (decl instanceof Declaration) {\n return this.parseValue(decl);\n }\n }\n }\n\n parseValue(toParse) {\n const self = this;\n function transformDeclaration(decl) {\n if (decl.value instanceof Anonymous && !decl.parsed) {\n if (typeof decl.value.value === 'string') {\n this.parse.parseNode(\n decl.value.value,\n ['value', 'important'], \n decl.value.getIndex(), \n decl.fileInfo(), \n function(err, result) {\n if (err) {\n decl.parsed = true;\n }\n if (result) {\n decl.value = result[0];\n decl.important = result[1] || '';\n decl.parsed = true;\n }\n });\n } else {\n decl.parsed = true;\n }\n\n return decl;\n }\n else {\n return decl;\n }\n }\n if (!Array.isArray(toParse)) {\n return transformDeclaration.call(self, toParse);\n }\n else {\n const nodes = [];\n toParse.forEach(function(n) {\n nodes.push(transformDeclaration.call(self, n));\n });\n return nodes;\n }\n }\n\n rulesets() {\n if (!this.rules) { return []; }\n\n const filtRules = [];\n const rules = this.rules;\n let i;\n let rule;\n\n for (i = 0; (rule = rules[i]); i++) {\n if (rule.isRuleset) {\n filtRules.push(rule);\n }\n }\n\n return filtRules;\n }\n\n prependRule(rule) {\n const rules = this.rules;\n if (rules) {\n rules.unshift(rule);\n } else {\n this.rules = [ rule ];\n }\n this.setParent(rule, this);\n }\n\n find(selector, self, filter) {\n self = self || this;\n const rules = [];\n let match;\n let foundMixins;\n const key = selector.toCSS();\n\n if (key in this._lookups) { return this._lookups[key]; }\n\n this.rulesets().forEach(function (rule) {\n if (rule !== self) {\n for (let j = 0; j < rule.selectors.length; j++) {\n match = selector.match(rule.selectors[j]);\n if (match) {\n if (selector.elements.length > match) {\n if (!filter || filter(rule)) {\n foundMixins = rule.find(new Selector(selector.elements.slice(match)), self, filter);\n for (let i = 0; i < foundMixins.length; ++i) {\n foundMixins[i].path.push(rule);\n }\n Array.prototype.push.apply(rules, foundMixins);\n }\n } else {\n rules.push({ rule, path: []});\n }\n break;\n }\n }\n }\n });\n this._lookups[key] = rules;\n return rules;\n }\n\n genCSS(context, output) {\n let i;\n let j;\n const charsetRuleNodes = [];\n let ruleNodes = [];\n\n let // Line number debugging\n debugInfo;\n\n let rule;\n let path;\n\n context.tabLevel = (context.tabLevel || 0);\n\n if (!this.root) {\n context.tabLevel++;\n }\n\n const tabRuleStr = context.compress ? '' : Array(context.tabLevel + 1).join(' ');\n const tabSetStr = context.compress ? '' : Array(context.tabLevel).join(' ');\n let sep;\n\n let charsetNodeIndex = 0;\n let importNodeIndex = 0;\n for (i = 0; (rule = this.rules[i]); i++) {\n if (rule instanceof Comment) {\n if (importNodeIndex === i) {\n importNodeIndex++;\n }\n ruleNodes.push(rule);\n } else if (rule.isCharset && rule.isCharset()) {\n ruleNodes.splice(charsetNodeIndex, 0, rule);\n charsetNodeIndex++;\n importNodeIndex++;\n } else if (rule.type === 'Import') {\n ruleNodes.splice(importNodeIndex, 0, rule);\n importNodeIndex++;\n } else {\n ruleNodes.push(rule);\n }\n }\n ruleNodes = charsetRuleNodes.concat(ruleNodes);\n\n // If this is the root node, we don't render\n // a selector, or {}.\n if (!this.root) {\n debugInfo = getDebugInfo(context, this, tabSetStr);\n\n if (debugInfo) {\n output.add(debugInfo);\n output.add(tabSetStr);\n }\n\n const paths = this.paths;\n const pathCnt = paths.length;\n let pathSubCnt;\n\n sep = context.compress ? ',' : (`,\\n${tabSetStr}`);\n\n for (i = 0; i < pathCnt; i++) {\n path = paths[i];\n if (!(pathSubCnt = path.length)) { continue; }\n if (i > 0) { output.add(sep); }\n\n context.firstSelector = true;\n path[0].genCSS(context, output);\n\n context.firstSelector = false;\n for (j = 1; j < pathSubCnt; j++) {\n path[j].genCSS(context, output);\n }\n }\n\n output.add((context.compress ? '{' : ' {\\n') + tabRuleStr);\n }\n\n // Compile rules and rulesets\n for (i = 0; (rule = ruleNodes[i]); i++) {\n\n if (i + 1 === ruleNodes.length) {\n context.lastRule = true;\n }\n\n const currentLastRule = context.lastRule;\n if (rule.isRulesetLike(rule)) {\n context.lastRule = false;\n }\n\n if (rule.genCSS) {\n rule.genCSS(context, output);\n } else if (rule.value) {\n output.add(rule.value.toString());\n }\n\n context.lastRule = currentLastRule;\n\n if (!context.lastRule && rule.isVisible()) {\n output.add(context.compress ? '' : (`\\n${tabRuleStr}`));\n } else {\n context.lastRule = false;\n }\n }\n\n if (!this.root) {\n output.add((context.compress ? '}' : `\\n${tabSetStr}}`));\n context.tabLevel--;\n }\n\n if (!output.isEmpty() && !context.compress && this.firstRoot) {\n output.add('\\n');\n }\n }\n\n joinSelectors(paths, context, selectors) {\n for (let s = 0; s < selectors.length; s++) {\n this.joinSelector(paths, context, selectors[s]);\n }\n }\n\n joinSelector(paths, context, selector) {\n\n function createParenthesis(elementsToPak, originalElement) {\n let replacementParen, j;\n if (elementsToPak.length === 0) {\n replacementParen = new Paren(elementsToPak[0]);\n } else {\n const insideParent = new Array(elementsToPak.length);\n for (j = 0; j < elementsToPak.length; j++) {\n insideParent[j] = new Element(\n null,\n elementsToPak[j],\n originalElement.isVariable,\n originalElement._index,\n originalElement._fileInfo\n );\n }\n replacementParen = new Paren(new Selector(insideParent));\n }\n return replacementParen;\n }\n\n function createSelector(containedElement, originalElement) {\n let element, selector;\n element = new Element(null, containedElement, originalElement.isVariable, originalElement._index, originalElement._fileInfo);\n selector = new Selector([element]);\n return selector;\n }\n\n // joins selector path from `beginningPath` with selector path in `addPath`\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns concatenated path\n function addReplacementIntoPath(beginningPath, addPath, replacedElement, originalSelector) {\n let newSelectorPath, lastSelector, newJoinedSelector;\n // our new selector path\n newSelectorPath = [];\n\n // construct the joined selector - if & is the first thing this will be empty,\n // if not newJoinedSelector will be the last set of elements in the selector\n if (beginningPath.length > 0) {\n newSelectorPath = utils.copyArray(beginningPath);\n lastSelector = newSelectorPath.pop();\n newJoinedSelector = originalSelector.createDerived(utils.copyArray(lastSelector.elements));\n }\n else {\n newJoinedSelector = originalSelector.createDerived([]);\n }\n\n if (addPath.length > 0) {\n // /deep/ is a CSS4 selector - (removed, so should deprecate)\n // that is valid without anything in front of it\n // so if the & does not have a combinator that is \"\" or \" \" then\n // and there is a combinator on the parent, then grab that.\n // this also allows + a { & .b { .a & { ... though not sure why you would want to do that\n let combinator = replacedElement.combinator;\n\n const parentEl = addPath[0].elements[0];\n if (combinator.emptyOrWhitespace && !parentEl.combinator.emptyOrWhitespace) {\n combinator = parentEl.combinator;\n }\n // join the elements so far with the first part of the parent\n newJoinedSelector.elements.push(new Element(\n combinator,\n parentEl.value,\n replacedElement.isVariable,\n replacedElement._index,\n replacedElement._fileInfo\n ));\n newJoinedSelector.elements = newJoinedSelector.elements.concat(addPath[0].elements.slice(1));\n }\n\n // now add the joined selector - but only if it is not empty\n if (newJoinedSelector.elements.length !== 0) {\n newSelectorPath.push(newJoinedSelector);\n }\n\n // put together the parent selectors after the join (e.g. the rest of the parent)\n if (addPath.length > 1) {\n let restOfPath = addPath.slice(1);\n restOfPath = restOfPath.map(function (selector) {\n return selector.createDerived(selector.elements, []);\n });\n newSelectorPath = newSelectorPath.concat(restOfPath);\n }\n return newSelectorPath;\n }\n\n // joins selector path from `beginningPath` with every selector path in `addPaths` array\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns array with all concatenated paths\n function addAllReplacementsIntoPath( beginningPath, addPaths, replacedElement, originalSelector, result) {\n let j;\n for (j = 0; j < beginningPath.length; j++) {\n const newSelectorPath = addReplacementIntoPath(beginningPath[j], addPaths, replacedElement, originalSelector);\n result.push(newSelectorPath);\n }\n return result;\n }\n\n function mergeElementsOnToSelectors(elements, selectors) {\n let i, sel;\n\n if (elements.length === 0) {\n return ;\n }\n if (selectors.length === 0) {\n selectors.push([ new Selector(elements) ]);\n return;\n }\n\n for (i = 0; (sel = selectors[i]); i++) {\n // if the previous thing in sel is a parent this needs to join on to it\n if (sel.length > 0) {\n sel[sel.length - 1] = sel[sel.length - 1].createDerived(sel[sel.length - 1].elements.concat(elements));\n }\n else {\n sel.push(new Selector(elements));\n }\n }\n }\n\n // replace all parent selectors inside `inSelector` by content of `context` array\n // resulting selectors are returned inside `paths` array\n // returns true if `inSelector` contained at least one parent selector\n function replaceParentSelector(paths, context, inSelector) {\n // The paths are [[Selector]]\n // The first list is a list of comma separated selectors\n // The inner list is a list of inheritance separated selectors\n // e.g.\n // .a, .b {\n // .c {\n // }\n // }\n // == [[.a] [.c]] [[.b] [.c]]\n //\n let i, j, k, currentElements, newSelectors, selectorsMultiplied, sel, el, hadParentSelector = false, length, lastSelector;\n function findNestedSelector(element) {\n let maybeSelector;\n if (!(element.value instanceof Paren)) {\n return null;\n }\n\n maybeSelector = element.value.value;\n if (!(maybeSelector instanceof Selector)) {\n return null;\n }\n\n return maybeSelector;\n }\n\n // the elements from the current selector so far\n currentElements = [];\n // the current list of new selectors to add to the path.\n // We will build it up. We initiate it with one empty selector as we \"multiply\" the new selectors\n // by the parents\n newSelectors = [\n []\n ];\n\n for (i = 0; (el = inSelector.elements[i]); i++) {\n // non parent reference elements just get added\n if (el.value !== '&') {\n const nestedSelector = findNestedSelector(el);\n if (nestedSelector != null) {\n // merge the current list of non parent selector elements\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n const nestedPaths = [];\n let replaced;\n const replacedNewSelectors = [];\n replaced = replaceParentSelector(nestedPaths, context, nestedSelector);\n hadParentSelector = hadParentSelector || replaced;\n // the nestedPaths array should have only one member - replaceParentSelector does not multiply selectors\n for (k = 0; k < nestedPaths.length; k++) {\n const replacementSelector = createSelector(createParenthesis(nestedPaths[k], el), el);\n addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors);\n }\n newSelectors = replacedNewSelectors;\n currentElements = [];\n } else {\n currentElements.push(el);\n }\n\n } else {\n hadParentSelector = true;\n // the new list of selectors to add\n selectorsMultiplied = [];\n\n // merge the current list of non parent selector elements\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n // loop through our current selectors\n for (j = 0; j < newSelectors.length; j++) {\n sel = newSelectors[j];\n // if we don't have any parent paths, the & might be in a mixin so that it can be used\n // whether there are parents or not\n if (context.length === 0) {\n // the combinator used on el should now be applied to the next element instead so that\n // it is not lost\n if (sel.length > 0) {\n sel[0].elements.push(new Element(el.combinator, '', el.isVariable, el._index, el._fileInfo));\n }\n selectorsMultiplied.push(sel);\n }\n else {\n // and the parent selectors\n for (k = 0; k < context.length; k++) {\n // We need to put the current selectors\n // then join the last selector's elements on to the parents selectors\n const newSelectorPath = addReplacementIntoPath(sel, context[k], el, inSelector);\n // add that to our new set of selectors\n selectorsMultiplied.push(newSelectorPath);\n }\n }\n }\n\n // our new selectors has been multiplied, so reset the state\n newSelectors = selectorsMultiplied;\n currentElements = [];\n }\n }\n\n // if we have any elements left over (e.g. .a& .b == .b)\n // add them on to all the current selectors\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n for (i = 0; i < newSelectors.length; i++) {\n length = newSelectors[i].length;\n if (length > 0) {\n paths.push(newSelectors[i]);\n lastSelector = newSelectors[i][length - 1];\n newSelectors[i][length - 1] = lastSelector.createDerived(lastSelector.elements, inSelector.extendList);\n }\n }\n\n return hadParentSelector;\n }\n\n function deriveSelector(visibilityInfo, deriveFrom) {\n const newSelector = deriveFrom.createDerived(deriveFrom.elements, deriveFrom.extendList, deriveFrom.evaldCondition);\n newSelector.copyVisibilityInfo(visibilityInfo);\n return newSelector;\n }\n\n // joinSelector code follows\n let i, newPaths, hadParentSelector;\n\n newPaths = [];\n hadParentSelector = replaceParentSelector(newPaths, context, selector);\n\n if (!hadParentSelector) {\n if (context.length > 0) {\n newPaths = [];\n for (i = 0; i < context.length; i++) {\n\n const concatenated = context[i].map(deriveSelector.bind(this, selector.visibilityInfo()));\n\n concatenated.push(selector);\n newPaths.push(concatenated);\n }\n }\n else {\n newPaths = [[selector]];\n }\n }\n\n for (i = 0; i < newPaths.length; i++) {\n paths.push(newPaths[i]);\n }\n\n }\n}\n\nRuleset.prototype.type = 'Ruleset';\nRuleset.prototype.isRuleset = true;\nexport default Ruleset;\n","import Node from './node';\nimport Selector from './selector';\nimport Ruleset from './ruleset';\nimport Anonymous from './anonymous';\n\nclass AtRule extends Node {\n constructor(\n name,\n value,\n rules,\n index,\n currentFileInfo,\n debugInfo,\n isRooted,\n visibilityInfo\n ) {\n super();\n\n let i;\n\n this.name = name;\n this.value = (value instanceof Node) ? value : (value ? new Anonymous(value) : value);\n if (rules) {\n if (Array.isArray(rules)) {\n this.rules = rules;\n } else {\n this.rules = [rules];\n this.rules[0].selectors = (new Selector([], null, null, index, currentFileInfo)).createEmptySelectors();\n }\n for (i = 0; i < this.rules.length; i++) {\n this.rules[i].allowImports = true;\n }\n this.setParent(this.rules, this);\n }\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.debugInfo = debugInfo;\n this.isRooted = isRooted || false;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n }\n\n accept(visitor) {\n const value = this.value, rules = this.rules;\n if (rules) {\n this.rules = visitor.visitArray(rules);\n }\n if (value) {\n this.value = visitor.visit(value);\n }\n }\n\n isRulesetLike() {\n return this.rules || !this.isCharset();\n }\n\n isCharset() {\n return '@charset' === this.name;\n }\n\n genCSS(context, output) {\n const value = this.value, rules = this.rules;\n output.add(this.name, this.fileInfo(), this.getIndex());\n if (value) {\n output.add(' ');\n value.genCSS(context, output);\n }\n if (rules) {\n this.outputRuleset(context, output, rules);\n } else {\n output.add(';');\n }\n }\n\n eval(context) {\n let mediaPathBackup, mediaBlocksBackup, value = this.value, rules = this.rules;\n\n // media stored inside other atrule should not bubble over it\n // backpup media bubbling information\n mediaPathBackup = context.mediaPath;\n mediaBlocksBackup = context.mediaBlocks;\n // deleted media bubbling information\n context.mediaPath = [];\n context.mediaBlocks = [];\n\n if (value) {\n value = value.eval(context);\n }\n if (rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n rules = [rules[0].eval(context)];\n rules[0].root = true;\n }\n // restore media bubbling information\n context.mediaPath = mediaPathBackup;\n context.mediaBlocks = mediaBlocksBackup;\n\n return new AtRule(this.name, value, rules,\n this.getIndex(), this.fileInfo(), this.debugInfo, this.isRooted, this.visibilityInfo());\n }\n\n variable(name) {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.variable.call(this.rules[0], name);\n }\n }\n\n find() {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.find.apply(this.rules[0], arguments);\n }\n }\n\n rulesets() {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.rulesets.apply(this.rules[0]);\n }\n }\n\n outputRuleset(context, output, rules) {\n const ruleCnt = rules.length;\n let i;\n context.tabLevel = (context.tabLevel | 0) + 1;\n\n // Compressed\n if (context.compress) {\n output.add('{');\n for (i = 0; i < ruleCnt; i++) {\n rules[i].genCSS(context, output);\n }\n output.add('}');\n context.tabLevel--;\n return;\n }\n\n // Non-compressed\n const tabSetStr = `\\n${Array(context.tabLevel).join(' ')}`, tabRuleStr = `${tabSetStr} `;\n if (!ruleCnt) {\n output.add(` {${tabSetStr}}`);\n } else {\n output.add(` {${tabRuleStr}`);\n rules[0].genCSS(context, output);\n for (i = 1; i < ruleCnt; i++) {\n output.add(tabRuleStr);\n rules[i].genCSS(context, output);\n }\n output.add(`${tabSetStr}}`);\n }\n\n context.tabLevel--;\n }\n}\n\nAtRule.prototype.type = 'AtRule';\nexport default AtRule;\n","import Node from './node';\nimport contexts from '../contexts';\nimport * as utils from '../utils';\n\nclass DetachedRuleset extends Node {\n constructor(ruleset, frames) {\n super();\n\n this.ruleset = ruleset;\n this.frames = frames;\n this.setParent(this.ruleset, this);\n }\n\n accept(visitor) {\n this.ruleset = visitor.visit(this.ruleset);\n }\n\n eval(context) {\n const frames = this.frames || utils.copyArray(context.frames);\n return new DetachedRuleset(this.ruleset, frames);\n }\n\n callEval(context) {\n return this.ruleset.eval(this.frames ? new contexts.Eval(context, this.frames.concat(context.frames)) : context);\n }\n}\n\nDetachedRuleset.prototype.type = 'DetachedRuleset';\nDetachedRuleset.prototype.evalFirst = true;\nexport default DetachedRuleset;\n","import Node from './node';\nimport unitConversions from '../data/unit-conversions';\nimport * as utils from '../utils';\n\nclass Unit extends Node {\n constructor(numerator, denominator, backupUnit) {\n super();\n\n this.numerator = numerator ? utils.copyArray(numerator).sort() : [];\n this.denominator = denominator ? utils.copyArray(denominator).sort() : [];\n if (backupUnit) {\n this.backupUnit = backupUnit;\n } else if (numerator && numerator.length) {\n this.backupUnit = numerator[0];\n }\n }\n\n clone() {\n return new Unit(utils.copyArray(this.numerator), utils.copyArray(this.denominator), this.backupUnit);\n }\n\n genCSS(context, output) {\n // Dimension checks the unit is singular and throws an error if in strict math mode.\n const strictUnits = context && context.strictUnits;\n if (this.numerator.length === 1) {\n output.add(this.numerator[0]); // the ideal situation\n } else if (!strictUnits && this.backupUnit) {\n output.add(this.backupUnit);\n } else if (!strictUnits && this.denominator.length) {\n output.add(this.denominator[0]);\n }\n }\n\n toString() {\n let i, returnStr = this.numerator.join('*');\n for (i = 0; i < this.denominator.length; i++) {\n returnStr += `/${this.denominator[i]}`;\n }\n return returnStr;\n }\n\n compare(other) {\n return this.is(other.toString()) ? 0 : undefined;\n }\n\n is(unitString) {\n return this.toString().toUpperCase() === unitString.toUpperCase();\n }\n\n isLength() {\n return RegExp('^(px|em|ex|ch|rem|in|cm|mm|pc|pt|ex|vw|vh|vmin|vmax)$', 'gi').test(this.toCSS());\n }\n\n isEmpty() {\n return this.numerator.length === 0 && this.denominator.length === 0;\n }\n\n isSingular() {\n return this.numerator.length <= 1 && this.denominator.length === 0;\n }\n\n map(callback) {\n let i;\n\n for (i = 0; i < this.numerator.length; i++) {\n this.numerator[i] = callback(this.numerator[i], false);\n }\n\n for (i = 0; i < this.denominator.length; i++) {\n this.denominator[i] = callback(this.denominator[i], true);\n }\n }\n\n usedUnits() {\n let group;\n const result = {};\n let mapUnit;\n let groupName;\n\n mapUnit = function (atomicUnit) {\n /* jshint loopfunc:true */\n if (group.hasOwnProperty(atomicUnit) && !result[groupName]) {\n result[groupName] = atomicUnit;\n }\n\n return atomicUnit;\n };\n\n for (groupName in unitConversions) {\n if (unitConversions.hasOwnProperty(groupName)) {\n group = unitConversions[groupName];\n\n this.map(mapUnit);\n }\n }\n\n return result;\n }\n\n cancel() {\n const counter = {};\n let atomicUnit;\n let i;\n\n for (i = 0; i < this.numerator.length; i++) {\n atomicUnit = this.numerator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) + 1;\n }\n\n for (i = 0; i < this.denominator.length; i++) {\n atomicUnit = this.denominator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) - 1;\n }\n\n this.numerator = [];\n this.denominator = [];\n\n for (atomicUnit in counter) {\n if (counter.hasOwnProperty(atomicUnit)) {\n const count = counter[atomicUnit];\n\n if (count > 0) {\n for (i = 0; i < count; i++) {\n this.numerator.push(atomicUnit);\n }\n } else if (count < 0) {\n for (i = 0; i < -count; i++) {\n this.denominator.push(atomicUnit);\n }\n }\n }\n }\n\n this.numerator.sort();\n this.denominator.sort();\n }\n}\n\nUnit.prototype.type = 'Unit';\nexport default Unit;\n","import Node from './node';\nimport unitConversions from '../data/unit-conversions';\nimport Unit from './unit';\nimport Color from './color';\n\n//\n// A number with a unit\n//\nclass Dimension extends Node {\n constructor(value, unit) {\n super();\n\n this.value = parseFloat(value);\n if (isNaN(this.value)) {\n throw new Error('Dimension is not a number.');\n }\n this.unit = (unit && unit instanceof Unit) ? unit :\n new Unit(unit ? [unit] : undefined);\n this.setParent(this.unit, this);\n }\n\n accept(visitor) {\n this.unit = visitor.visit(this.unit);\n }\n\n eval(context) {\n return this;\n }\n\n toColor() {\n return new Color([this.value, this.value, this.value]);\n }\n\n genCSS(context, output) {\n if ((context && context.strictUnits) && !this.unit.isSingular()) {\n throw new Error(`Multiple units in dimension. Correct the units or use the unit function. Bad unit: ${this.unit.toString()}`);\n }\n\n const value = this.fround(context, this.value);\n let strValue = String(value);\n\n if (value !== 0 && value < 0.000001 && value > -0.000001) {\n // would be output 1e-6 etc.\n strValue = value.toFixed(20).replace(/0+$/, '');\n }\n\n if (context && context.compress) {\n // Zero values doesn't need a unit\n if (value === 0 && this.unit.isLength()) {\n output.add(strValue);\n return;\n }\n\n // Float values doesn't need a leading zero\n if (value > 0 && value < 1) {\n strValue = (strValue).substr(1);\n }\n }\n\n output.add(strValue);\n this.unit.genCSS(context, output);\n }\n\n // In an operation between two Dimensions,\n // we default to the first Dimension's unit,\n // so `1px + 2` will yield `3px`.\n operate(context, op, other) {\n /* jshint noempty:false */\n let value = this._operate(context, op, this.value, other.value), unit = this.unit.clone();\n\n if (op === '+' || op === '-') {\n if (unit.numerator.length === 0 && unit.denominator.length === 0) {\n unit = other.unit.clone();\n if (this.unit.backupUnit) {\n unit.backupUnit = this.unit.backupUnit;\n }\n } else if (other.unit.numerator.length === 0 && unit.denominator.length === 0) {\n // do nothing\n } else {\n other = other.convertTo(this.unit.usedUnits());\n\n if (context.strictUnits && other.unit.toString() !== unit.toString()) {\n throw new Error(`Incompatible units. Change the units or use the unit function. Bad units: '${unit.toString()}' and '${other.unit.toString()}'.`);\n }\n\n value = this._operate(context, op, this.value, other.value);\n }\n } else if (op === '*') {\n unit.numerator = unit.numerator.concat(other.unit.numerator).sort();\n unit.denominator = unit.denominator.concat(other.unit.denominator).sort();\n unit.cancel();\n } else if (op === '/') {\n unit.numerator = unit.numerator.concat(other.unit.denominator).sort();\n unit.denominator = unit.denominator.concat(other.unit.numerator).sort();\n unit.cancel();\n }\n return new Dimension(value, unit);\n }\n\n compare(other) {\n let a, b;\n\n if (!(other instanceof Dimension)) {\n return undefined;\n }\n\n if (this.unit.isEmpty() || other.unit.isEmpty()) {\n a = this;\n b = other;\n } else {\n a = this.unify();\n b = other.unify();\n if (a.unit.compare(b.unit) !== 0) {\n return undefined;\n }\n }\n\n return Node.numericCompare(a.value, b.value);\n }\n\n unify() {\n return this.convertTo({ length: 'px', duration: 's', angle: 'rad' });\n }\n\n convertTo(conversions) {\n let value = this.value;\n const unit = this.unit.clone();\n let i;\n let groupName;\n let group;\n let targetUnit;\n let derivedConversions = {};\n let applyUnit;\n\n if (typeof conversions === 'string') {\n for (i in unitConversions) {\n if (unitConversions[i].hasOwnProperty(conversions)) {\n derivedConversions = {};\n derivedConversions[i] = conversions;\n }\n }\n conversions = derivedConversions;\n }\n applyUnit = function (atomicUnit, denominator) {\n /* jshint loopfunc:true */\n if (group.hasOwnProperty(atomicUnit)) {\n if (denominator) {\n value = value / (group[atomicUnit] / group[targetUnit]);\n } else {\n value = value * (group[atomicUnit] / group[targetUnit]);\n }\n\n return targetUnit;\n }\n\n return atomicUnit;\n };\n\n for (groupName in conversions) {\n if (conversions.hasOwnProperty(groupName)) {\n targetUnit = conversions[groupName];\n group = unitConversions[groupName];\n\n unit.map(applyUnit);\n }\n }\n\n unit.cancel();\n\n return new Dimension(value, unit);\n }\n}\n\nDimension.prototype.type = 'Dimension';\nexport default Dimension;\n","import Node from './node';\nimport Color from './color';\nimport Dimension from './dimension';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\n\nclass Operation extends Node {\n constructor(op, operands, isSpaced) {\n super();\n\n this.op = op.trim();\n this.operands = operands;\n this.isSpaced = isSpaced;\n }\n\n accept(visitor) {\n this.operands = visitor.visitArray(this.operands);\n }\n\n eval(context) {\n let a = this.operands[0].eval(context), b = this.operands[1].eval(context), op;\n\n if (context.isMathOn(this.op)) {\n op = this.op === './' ? '/' : this.op;\n if (a instanceof Dimension && b instanceof Color) {\n a = a.toColor();\n }\n if (b instanceof Dimension && a instanceof Color) {\n b = b.toColor();\n }\n if (!a.operate) {\n if (a instanceof Operation && a.op === '/' && context.math === MATH.PARENS_DIVISION) {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n throw { type: 'Operation',\n message: 'Operation on an invalid type' };\n }\n\n return a.operate(context, op, b);\n } else {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n }\n\n genCSS(context, output) {\n this.operands[0].genCSS(context, output);\n if (this.isSpaced) {\n output.add(' ');\n }\n output.add(this.op);\n if (this.isSpaced) {\n output.add(' ');\n }\n this.operands[1].genCSS(context, output);\n }\n}\n\nOperation.prototype.type = 'Operation';\nexport default Operation;\n","import Node from './node';\nimport Paren from './paren';\nimport Comment from './comment';\nimport Dimension from './dimension';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\nclass Expression extends Node {\n constructor(value, noSpacing) {\n super();\n\n this.value = value;\n this.noSpacing = noSpacing;\n if (!value) {\n throw new Error('Expression requires an array parameter');\n }\n }\n\n accept(visitor) {\n this.value = visitor.visitArray(this.value);\n }\n\n eval(context) {\n let returnValue;\n const mathOn = context.isMathOn();\n const inParenthesis = this.parens;\n\n let doubleParen = false;\n if (inParenthesis) {\n context.inParenthesis();\n }\n if (this.value.length > 1) {\n returnValue = new Expression(this.value.map(function (e) {\n if (!e.eval) {\n return e;\n }\n return e.eval(context);\n }), this.noSpacing);\n } else if (this.value.length === 1) {\n if (this.value[0].parens && !this.value[0].parensInOp && !context.inCalc) {\n doubleParen = true;\n }\n returnValue = this.value[0].eval(context);\n } else {\n returnValue = this;\n }\n if (inParenthesis) {\n context.outOfParenthesis();\n }\n if (this.parens && this.parensInOp && !mathOn && !doubleParen \n && (!(returnValue instanceof Dimension))) {\n returnValue = new Paren(returnValue);\n }\n return returnValue;\n }\n\n genCSS(context, output) {\n for (let i = 0; i < this.value.length; i++) {\n this.value[i].genCSS(context, output);\n if (!this.noSpacing && i + 1 < this.value.length) {\n output.add(' ');\n }\n }\n }\n\n throwAwayComments() {\n this.value = this.value.filter(function(v) {\n return !(v instanceof Comment);\n });\n }\n}\n\nExpression.prototype.type = 'Expression';\nexport default Expression;\n","import Expression from '../tree/expression';\n\nclass functionCaller {\n constructor(name, context, index, currentFileInfo) {\n this.name = name.toLowerCase();\n this.index = index;\n this.context = context;\n this.currentFileInfo = currentFileInfo;\n\n this.func = context.frames[0].functionRegistry.get(this.name);\n }\n\n isValid() {\n return Boolean(this.func);\n }\n\n call(args) {\n if (!(Array.isArray(args))) {\n args = [args];\n }\n const evalArgs = this.func.evalArgs;\n if (evalArgs !== false) {\n args = args.map(a => a.eval(this.context));\n }\n const commentFilter = item => !(item.type === 'Comment');\n\n // This code is terrible and should be replaced as per this issue...\n // https://github.com/less/less.js/issues/2477\n args = args\n .filter(commentFilter)\n .map(item => {\n if (item.type === 'Expression') {\n const subNodes = item.value.filter(commentFilter);\n if (subNodes.length === 1) {\n return subNodes[0];\n } else {\n return new Expression(subNodes);\n }\n }\n return item;\n });\n\n if (evalArgs === false) {\n return this.func(this.context, ...args);\n }\n\n return this.func(...args);\n }\n}\n\nexport default functionCaller;\n","import Node from './node';\nimport Anonymous from './anonymous';\nimport FunctionCaller from '../functions/function-caller';\nimport logger from '../logger';\n\n//\n// A function call node.\n//\nclass Call extends Node {\n constructor(name, args, index, currentFileInfo) {\n super();\n\n this.name = name;\n this.args = args;\n this.calc = name === 'calc';\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n accept(visitor) {\n if (this.args) {\n this.args = visitor.visitArray(this.args);\n }\n }\n\n //\n // When evaluating a function call,\n // we either find the function in the functionRegistry,\n // in which case we call it, passing the evaluated arguments,\n // if this returns null or we cannot find the function, we\n // simply print it out as it appeared originally [2].\n //\n // The reason why we evaluate the arguments, is in the case where\n // we try to pass a variable to a function, like: `saturate(@color)`.\n // The function should receive the value, not the variable.\n //\n eval(context) {\n /**\n * Turn off math for calc(), and switch back on for evaluating nested functions\n */\n const currentMathContext = context.mathOn;\n context.mathOn = !this.calc;\n if (this.calc || context.inCalc) {\n context.enterCalc();\n }\n\n const exitCalc = () => {\n if (this.calc || context.inCalc) {\n context.exitCalc();\n }\n context.mathOn = currentMathContext;\n };\n\n let result;\n const funcCaller = new FunctionCaller(this.name, context, this.getIndex(), this.fileInfo());\n\n if (funcCaller.isValid()) {\n try {\n result = funcCaller.call(this.args);\n exitCalc();\n } catch (e) {\n if (e.hasOwnProperty('line') && e.hasOwnProperty('column')) {\n throw e;\n }\n throw { \n type: e.type || 'Runtime',\n message: `Error evaluating function \\`${this.name}\\`${e.message ? `: ${e.message}` : ''}`,\n index: this.getIndex(), \n filename: this.fileInfo().filename,\n line: e.lineNumber,\n column: e.columnNumber\n };\n }\n }\n\n if (result !== null && result !== undefined) {\n // Results that that are not nodes are cast as Anonymous nodes\n // Falsy values or booleans are returned as empty nodes\n if (!(result instanceof Node)) {\n if (!result || result === true) {\n result = new Anonymous(null); \n }\n else {\n result = new Anonymous(result.toString()); \n }\n \n }\n result._index = this._index;\n result._fileInfo = this._fileInfo;\n return result;\n }\n\n const args = this.args.map(a => a.eval(context));\n exitCalc();\n\n return new Call(this.name, args, this.getIndex(), this.fileInfo());\n }\n\n genCSS(context, output) {\n output.add(`${this.name}(`, this.fileInfo(), this.getIndex());\n\n for (let i = 0; i < this.args.length; i++) {\n this.args[i].genCSS(context, output);\n if (i + 1 < this.args.length) {\n output.add(', ');\n }\n }\n\n output.add(')');\n }\n}\n\nCall.prototype.type = 'Call';\nexport default Call;\n","import Node from './node';\nimport Call from './call';\n\nclass Variable extends Node {\n constructor(name, index, currentFileInfo) {\n super();\n\n this.name = name;\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n eval(context) {\n let variable, name = this.name;\n\n if (name.indexOf('@@') === 0) {\n name = `@${new Variable(name.slice(1), this.getIndex(), this.fileInfo()).eval(context).value}`;\n }\n\n if (this.evaluating) {\n throw { type: 'Name',\n message: `Recursive variable definition for ${name}`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n variable = this.find(context.frames, function (frame) {\n const v = frame.variable(name);\n if (v) {\n if (v.important) {\n const importantScope = context.importantScope[context.importantScope.length - 1];\n importantScope.important = v.important;\n }\n // If in calc, wrap vars in a function call to cascade evaluate args first\n if (context.inCalc) {\n return (new Call('_SELF', [v.value])).eval(context);\n }\n else {\n return v.value.eval(context);\n }\n }\n });\n if (variable) {\n this.evaluating = false;\n return variable;\n } else {\n throw { type: 'Name',\n message: `variable ${name} is undefined`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n }\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n}\n\nVariable.prototype.type = 'Variable';\nexport default Variable;\n","import Node from './node';\nimport Declaration from './declaration';\n\nclass Property extends Node {\n constructor(name, index, currentFileInfo) {\n super();\n\n this.name = name;\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n eval(context) {\n let property;\n const name = this.name;\n // TODO: shorten this reference\n const mergeRules = context.pluginManager.less.visitors.ToCSSVisitor.prototype._mergeRules;\n\n if (this.evaluating) {\n throw { type: 'Name',\n message: `Recursive property reference for ${name}`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n property = this.find(context.frames, function (frame) {\n let v;\n const vArr = frame.property(name);\n if (vArr) {\n for (let i = 0; i < vArr.length; i++) {\n v = vArr[i];\n\n vArr[i] = new Declaration(v.name,\n v.value,\n v.important,\n v.merge,\n v.index,\n v.currentFileInfo,\n v.inline,\n v.variable\n );\n }\n mergeRules(vArr);\n\n v = vArr[vArr.length - 1];\n if (v.important) {\n const importantScope = context.importantScope[context.importantScope.length - 1];\n importantScope.important = v.important;\n }\n v = v.value.eval(context);\n return v;\n }\n });\n if (property) {\n this.evaluating = false;\n return property;\n } else {\n throw { type: 'Name',\n message: `Property '${name}' is undefined`,\n filename: this.currentFileInfo.filename,\n index: this.index };\n }\n }\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n}\n\nProperty.prototype.type = 'Property';\nexport default Property;\n","import Node from './node';\n\nclass Attribute extends Node {\n constructor(key, op, value) {\n super();\n\n this.key = key;\n this.op = op;\n this.value = value;\n }\n\n eval(context) {\n return new Attribute(this.key.eval ? this.key.eval(context) : this.key,\n this.op, (this.value && this.value.eval) ? this.value.eval(context) : this.value);\n }\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n }\n\n toCSS(context) {\n let value = this.key.toCSS ? this.key.toCSS(context) : this.key;\n\n if (this.op) {\n value += this.op;\n value += (this.value.toCSS ? this.value.toCSS(context) : this.value);\n }\n\n return `[${value}]`;\n }\n}\n\nAttribute.prototype.type = 'Attribute';\nexport default Attribute;\n","import Node from './node';\nimport Variable from './variable';\nimport Property from './property';\n\n\nclass Quoted extends Node {\n constructor(str, content, escaped, index, currentFileInfo) {\n super();\n\n this.escaped = (escaped == null) ? true : escaped;\n this.value = content || '';\n this.quote = str.charAt(0);\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.variableRegex = /@\\{([\\w-]+)\\}/g;\n this.propRegex = /\\$\\{([\\w-]+)\\}/g;\n this.allowRoot = escaped;\n }\n\n genCSS(context, output) {\n if (!this.escaped) {\n output.add(this.quote, this.fileInfo(), this.getIndex());\n }\n output.add(this.value);\n if (!this.escaped) {\n output.add(this.quote);\n }\n }\n\n containsVariables() {\n return this.value.match(this.variableRegex);\n }\n\n eval(context) {\n const that = this;\n let value = this.value;\n const variableReplacement = function (_, name) {\n const v = new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v.value : v.toCSS();\n };\n const propertyReplacement = function (_, name) {\n const v = new Property(`$${name}`, that.getIndex(), that.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v.value : v.toCSS();\n };\n function iterativeReplace(value, regexp, replacementFnc) {\n let evaluatedValue = value;\n do {\n value = evaluatedValue.toString();\n evaluatedValue = value.replace(regexp, replacementFnc);\n } while (value !== evaluatedValue);\n return evaluatedValue;\n }\n value = iterativeReplace(value, this.variableRegex, variableReplacement);\n value = iterativeReplace(value, this.propRegex, propertyReplacement);\n return new Quoted(this.quote + value + this.quote, value, this.escaped, this.getIndex(), this.fileInfo());\n }\n\n compare(other) {\n // when comparing quoted strings allow the quote to differ\n if (other.type === 'Quoted' && !this.escaped && !other.escaped) {\n return Node.numericCompare(this.value, other.value);\n } else {\n return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n }\n }\n}\n\nQuoted.prototype.type = 'Quoted';\nexport default Quoted;\n","import Node from './node';\n\nclass URL extends Node {\n constructor(val, index, currentFileInfo, isEvald) {\n super();\n\n this.value = val;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.isEvald = isEvald;\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n genCSS(context, output) {\n output.add('url(');\n this.value.genCSS(context, output);\n output.add(')');\n }\n\n eval(context) {\n const val = this.value.eval(context);\n let rootpath;\n\n if (!this.isEvald) {\n // Add the rootpath if the URL requires a rewrite\n rootpath = this.fileInfo() && this.fileInfo().rootpath;\n if (typeof rootpath === 'string' &&\n typeof val.value === 'string' &&\n context.pathRequiresRewrite(val.value)) {\n if (!val.quote) {\n rootpath = escapePath(rootpath);\n }\n val.value = context.rewritePath(val.value, rootpath);\n } else {\n val.value = context.normalizePath(val.value);\n }\n\n // Add url args if enabled\n if (context.urlArgs) {\n if (!val.value.match(/^\\s*data:/)) {\n const delimiter = val.value.indexOf('?') === -1 ? '?' : '&';\n const urlArgs = delimiter + context.urlArgs;\n if (val.value.indexOf('#') !== -1) {\n val.value = val.value.replace('#', `${urlArgs}#`);\n } else {\n val.value += urlArgs;\n }\n }\n }\n }\n\n return new URL(val, this.getIndex(), this.fileInfo(), true);\n }\n}\n\nURL.prototype.type = 'Url';\n\nfunction escapePath(path) {\n return path.replace(/[\\(\\)'\"\\s]/g, function(match) { return `\\\\${match}`; });\n}\n\nexport default URL;\n","import Ruleset from './ruleset';\nimport Value from './value';\nimport Selector from './selector';\nimport Anonymous from './anonymous';\nimport Expression from './expression';\nimport AtRule from './atrule';\nimport * as utils from '../utils';\n\nclass Media extends AtRule {\n constructor(value, features, index, currentFileInfo, visibilityInfo) {\n super();\n\n this._index = index;\n this._fileInfo = currentFileInfo;\n\n const selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors();\n\n this.features = new Value(features);\n this.rules = [new Ruleset(selectors, value)];\n this.rules[0].allowImports = true;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n this.setParent(selectors, this);\n this.setParent(this.features, this);\n this.setParent(this.rules, this);\n }\n\n isRulesetLike() {\n return true;\n }\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this.features);\n }\n if (this.rules) {\n this.rules = visitor.visitArray(this.rules);\n }\n }\n\n genCSS(context, output) {\n output.add('@media ', this._fileInfo, this._index);\n this.features.genCSS(context, output);\n this.outputRuleset(context, output, this.rules);\n }\n\n eval(context) {\n if (!context.mediaBlocks) {\n context.mediaBlocks = [];\n context.mediaPath = [];\n }\n\n const media = new Media(null, [], this._index, this._fileInfo, this.visibilityInfo());\n if (this.debugInfo) {\n this.rules[0].debugInfo = this.debugInfo;\n media.debugInfo = this.debugInfo;\n }\n \n media.features = this.features.eval(context);\n\n context.mediaPath.push(media);\n context.mediaBlocks.push(media);\n\n this.rules[0].functionRegistry = context.frames[0].functionRegistry.inherit();\n context.frames.unshift(this.rules[0]);\n media.rules = [this.rules[0].eval(context)];\n context.frames.shift();\n\n context.mediaPath.pop();\n\n return context.mediaPath.length === 0 ? media.evalTop(context) :\n media.evalNested(context);\n }\n\n evalTop(context) {\n let result = this;\n\n // Render all dependent Media blocks.\n if (context.mediaBlocks.length > 1) {\n const selectors = (new Selector([], null, null, this.getIndex(), this.fileInfo())).createEmptySelectors();\n result = new Ruleset(selectors, context.mediaBlocks);\n result.multiMedia = true;\n result.copyVisibilityInfo(this.visibilityInfo());\n this.setParent(result, this);\n }\n\n delete context.mediaBlocks;\n delete context.mediaPath;\n\n return result;\n }\n\n evalNested(context) {\n let i;\n let value;\n const path = context.mediaPath.concat([this]);\n\n // Extract the media-query conditions separated with `,` (OR).\n for (i = 0; i < path.length; i++) {\n value = path[i].features instanceof Value ?\n path[i].features.value : path[i].features;\n path[i] = Array.isArray(value) ? value : [value];\n }\n\n // Trace all permutations to generate the resulting media-query.\n //\n // (a, b and c) with nested (d, e) ->\n // a and d\n // a and e\n // b and c and d\n // b and c and e\n this.features = new Value(this.permute(path).map(path => {\n path = path.map(fragment => fragment.toCSS ? fragment : new Anonymous(fragment));\n\n for (i = path.length - 1; i > 0; i--) {\n path.splice(i, 0, new Anonymous('and'));\n }\n\n return new Expression(path);\n }));\n this.setParent(this.features, this);\n\n // Fake a tree-node that doesn't output anything.\n return new Ruleset([], []);\n }\n\n permute(arr) {\n if (arr.length === 0) {\n return [];\n } else if (arr.length === 1) {\n return arr[0];\n } else {\n const result = [];\n const rest = this.permute(arr.slice(1));\n for (let i = 0; i < rest.length; i++) {\n for (let j = 0; j < arr[0].length; j++) {\n result.push([arr[0][j]].concat(rest[i]));\n }\n }\n return result;\n }\n }\n\n bubbleSelectors(selectors) {\n if (!selectors) {\n return;\n }\n this.rules = [new Ruleset(utils.copyArray(selectors), [this.rules[0]])];\n this.setParent(this.rules, this);\n }\n}\n\nMedia.prototype.type = 'Media';\nexport default Media;\n","import Node from './node';\nimport Media from './media';\nimport URL from './url';\nimport Quoted from './quoted';\nimport Ruleset from './ruleset';\nimport Anonymous from './anonymous';\nimport * as utils from '../utils';\nimport LessError from '../less-error';\n\n//\n// CSS @import node\n//\n// The general strategy here is that we don't want to wait\n// for the parsing to be completed, before we start importing\n// the file. That's because in the context of a browser,\n// most of the time will be spent waiting for the server to respond.\n//\n// On creation, we push the import path to our import queue, though\n// `import,push`, we also pass it a callback, which it'll call once\n// the file has been fetched, and parsed.\n//\nclass Import extends Node {\n constructor(path, features, options, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.options = options;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.path = path;\n this.features = features;\n this.allowRoot = true;\n\n if (this.options.less !== undefined || this.options.inline) {\n this.css = !this.options.less || this.options.inline;\n } else {\n const pathValue = this.getPath();\n if (pathValue && /[#\\.\\&\\?]css([\\?;].*)?$/.test(pathValue)) {\n this.css = true;\n }\n }\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.features, this);\n this.setParent(this.path, this);\n }\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this.features);\n }\n this.path = visitor.visit(this.path);\n if (!this.options.isPlugin && !this.options.inline && this.root) {\n this.root = visitor.visit(this.root);\n }\n }\n\n genCSS(context, output) {\n if (this.css && this.path._fileInfo.reference === undefined) {\n output.add('@import ', this._fileInfo, this._index);\n this.path.genCSS(context, output);\n if (this.features) {\n output.add(' ');\n this.features.genCSS(context, output);\n }\n output.add(';');\n }\n }\n\n getPath() {\n return (this.path instanceof URL) ?\n this.path.value.value : this.path.value;\n }\n\n isVariableImport() {\n let path = this.path;\n if (path instanceof URL) {\n path = path.value;\n }\n if (path instanceof Quoted) {\n return path.containsVariables();\n }\n\n return true;\n }\n\n evalForImport(context) {\n let path = this.path;\n\n if (path instanceof URL) {\n path = path.value;\n }\n\n return new Import(path.eval(context), this.features, this.options, this._index, this._fileInfo, this.visibilityInfo());\n }\n\n evalPath(context) {\n const path = this.path.eval(context);\n const fileInfo = this._fileInfo;\n\n if (!(path instanceof URL)) {\n // Add the rootpath if the URL requires a rewrite\n const pathValue = path.value;\n if (fileInfo &&\n pathValue &&\n context.pathRequiresRewrite(pathValue)) {\n path.value = context.rewritePath(pathValue, fileInfo.rootpath);\n } else {\n path.value = context.normalizePath(path.value);\n }\n }\n\n return path;\n }\n\n eval(context) {\n const result = this.doEval(context);\n if (this.options.reference || this.blocksVisibility()) {\n if (result.length || result.length === 0) {\n result.forEach(function (node) {\n node.addVisibilityBlock();\n }\n );\n } else {\n result.addVisibilityBlock();\n }\n }\n return result;\n }\n\n doEval(context) {\n let ruleset;\n let registry;\n const features = this.features && this.features.eval(context);\n\n if (this.options.isPlugin) {\n if (this.root && this.root.eval) {\n try {\n this.root.eval(context);\n }\n catch (e) {\n e.message = 'Plugin error during evaluation';\n throw new LessError(e, this.root.imports, this.root.filename);\n }\n }\n registry = context.frames[0] && context.frames[0].functionRegistry;\n if ( registry && this.root && this.root.functions ) {\n registry.addMultiple( this.root.functions );\n }\n\n return [];\n }\n\n if (this.skip) {\n if (typeof this.skip === 'function') {\n this.skip = this.skip();\n }\n if (this.skip) {\n return [];\n }\n }\n if (this.options.inline) {\n const contents = new Anonymous(this.root, 0,\n {\n filename: this.importedFilename,\n reference: this.path._fileInfo && this.path._fileInfo.reference\n }, true, true);\n\n return this.features ? new Media([contents], this.features.value) : [contents];\n } else if (this.css) {\n const newImport = new Import(this.evalPath(context), features, this.options, this._index);\n if (!newImport.css && this.error) {\n throw this.error;\n }\n return newImport;\n } else if (this.root) {\n ruleset = new Ruleset(null, utils.copyArray(this.root.rules));\n ruleset.evalImports(context);\n\n return this.features ? new Media(ruleset.rules, this.features.value) : ruleset.rules;\n } else {\n return [];\n }\n }\n}\n\nImport.prototype.type = 'Import';\nexport default Import;\n","import Node from './node';\nimport Variable from './variable';\n\nclass JsEvalNode extends Node {\n evaluateJavaScript(expression, context) {\n let result;\n const that = this;\n const evalContext = {};\n\n if (!context.javascriptEnabled) {\n throw { message: 'Inline JavaScript is not enabled. Is it set in your options?',\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n expression = expression.replace(/@\\{([\\w-]+)\\}/g, function (_, name) {\n return that.jsify(new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context));\n });\n\n try {\n expression = new Function(`return (${expression})`);\n } catch (e) {\n throw { message: `JavaScript evaluation error: ${e.message} from \\`${expression}\\`` ,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n const variables = context.frames[0].variables();\n for (const k in variables) {\n if (variables.hasOwnProperty(k)) {\n /* jshint loopfunc:true */\n evalContext[k.slice(1)] = {\n value: variables[k].value,\n toJS: function () {\n return this.value.eval(context).toCSS();\n }\n };\n }\n }\n\n try {\n result = expression.call(evalContext);\n } catch (e) {\n throw { message: `JavaScript evaluation error: '${e.name}: ${e.message.replace(/[\"]/g, '\\'')}'` ,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n return result;\n }\n\n jsify(obj) {\n if (Array.isArray(obj.value) && (obj.value.length > 1)) {\n return `[${obj.value.map(function (v) { return v.toCSS(); }).join(', ')}]`;\n } else {\n return obj.toCSS();\n }\n }\n}\n\nexport default JsEvalNode;\n","import JsEvalNode from './js-eval-node';\nimport Dimension from './dimension';\nimport Quoted from './quoted';\nimport Anonymous from './anonymous';\n\nclass JavaScript extends JsEvalNode {\n constructor(string, escaped, index, currentFileInfo) {\n super();\n\n this.escaped = escaped;\n this.expression = string;\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n eval(context) {\n const result = this.evaluateJavaScript(this.expression, context);\n const type = typeof result;\n\n if (type === 'number' && !isNaN(result)) {\n return new Dimension(result);\n } else if (type === 'string') {\n return new Quoted(`\"${result}\"`, result, this.escaped, this._index);\n } else if (Array.isArray(result)) {\n return new Anonymous(result.join(', '));\n } else {\n return new Anonymous(result);\n }\n }\n}\n\nJavaScript.prototype.type = 'JavaScript';\nexport default JavaScript;\n","import Node from './node';\n\nclass Assignment extends Node {\n constructor(key, val) {\n super();\n\n this.key = key;\n this.value = val;\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n eval(context) {\n if (this.value.eval) {\n return new Assignment(this.key, this.value.eval(context));\n }\n return this;\n }\n\n genCSS(context, output) {\n output.add(`${this.key}=`);\n if (this.value.genCSS) {\n this.value.genCSS(context, output);\n } else {\n output.add(this.value);\n }\n }\n}\n\nAssignment.prototype.type = 'Assignment';\nexport default Assignment;\n","import Node from './node';\n\nclass Condition extends Node {\n constructor(op, l, r, i, negate) {\n super();\n\n this.op = op.trim();\n this.lvalue = l;\n this.rvalue = r;\n this._index = i;\n this.negate = negate;\n }\n\n accept(visitor) {\n this.lvalue = visitor.visit(this.lvalue);\n this.rvalue = visitor.visit(this.rvalue);\n }\n\n eval(context) {\n const result = (function (op, a, b) {\n switch (op) {\n case 'and': return a && b;\n case 'or': return a || b;\n default:\n switch (Node.compare(a, b)) {\n case -1:\n return op === '<' || op === '=<' || op === '<=';\n case 0:\n return op === '=' || op === '>=' || op === '=<' || op === '<=';\n case 1:\n return op === '>' || op === '>=';\n default:\n return false;\n }\n }\n })(this.op, this.lvalue.eval(context), this.rvalue.eval(context));\n\n return this.negate ? !result : result;\n }\n}\n\nCondition.prototype.type = 'Condition';\nexport default Condition;\n","import Node from './node';\n\nclass UnicodeDescriptor extends Node {\n constructor(value) {\n super();\n\n this.value = value;\n }\n}\n\nUnicodeDescriptor.prototype.type = 'UnicodeDescriptor';\n\nexport default UnicodeDescriptor;\n","import Node from './node';\nimport Operation from './operation';\nimport Dimension from './dimension';\n\nclass Negative extends Node {\n constructor(node) {\n super();\n\n this.value = node;\n }\n\n genCSS(context, output) {\n output.add('-');\n this.value.genCSS(context, output);\n }\n\n eval(context) {\n if (context.isMathOn()) {\n return (new Operation('*', [new Dimension(-1), this.value])).eval(context);\n }\n return new Negative(this.value.eval(context));\n }\n}\n\nNegative.prototype.type = 'Negative';\nexport default Negative;\n","import Node from './node';\nimport Selector from './selector';\n\nclass Extend extends Node {\n constructor(selector, option, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.selector = selector;\n this.option = option;\n this.object_id = Extend.next_id++;\n this.parent_ids = [this.object_id];\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n\n switch (option) {\n case 'all':\n this.allowBefore = true;\n this.allowAfter = true;\n break;\n default:\n this.allowBefore = false;\n this.allowAfter = false;\n break;\n }\n this.setParent(this.selector, this);\n }\n\n accept(visitor) {\n this.selector = visitor.visit(this.selector);\n }\n\n eval(context) {\n return new Extend(this.selector.eval(context), this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n }\n\n clone(context) {\n return new Extend(this.selector, this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n }\n\n // it concatenates (joins) all selectors in selector array\n findSelfSelectors(selectors) {\n let selfElements = [], i, selectorElements;\n\n for (i = 0; i < selectors.length; i++) {\n selectorElements = selectors[i].elements;\n // duplicate the logic in genCSS function inside the selector node.\n // future TODO - move both logics into the selector joiner visitor\n if (i > 0 && selectorElements.length && selectorElements[0].combinator.value === '') {\n selectorElements[0].combinator.value = ' ';\n }\n selfElements = selfElements.concat(selectors[i].elements);\n }\n\n this.selfSelectors = [new Selector(selfElements)];\n this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo());\n }\n}\n\nExtend.next_id = 0;\n\nExtend.prototype.type = 'Extend';\nexport default Extend;\n","import Node from './node';\nimport Variable from './variable';\nimport Ruleset from './ruleset';\nimport DetachedRuleset from './detached-ruleset';\nimport LessError from '../less-error';\n\nclass VariableCall extends Node {\n constructor(variable, index, currentFileInfo) {\n super();\n\n this.variable = variable;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.allowRoot = true;\n }\n\n eval(context) {\n let rules;\n let detachedRuleset = new Variable(this.variable, this.getIndex(), this.fileInfo()).eval(context);\n const error = new LessError({message: `Could not evaluate variable call ${this.variable}`});\n\n if (!detachedRuleset.ruleset) {\n if (detachedRuleset.rules) {\n rules = detachedRuleset;\n }\n else if (Array.isArray(detachedRuleset)) {\n rules = new Ruleset('', detachedRuleset);\n }\n else if (Array.isArray(detachedRuleset.value)) {\n rules = new Ruleset('', detachedRuleset.value);\n }\n else {\n throw error;\n }\n detachedRuleset = new DetachedRuleset(rules);\n }\n\n if (detachedRuleset.ruleset) {\n return detachedRuleset.callEval(context);\n }\n throw error;\n }\n}\n\nVariableCall.prototype.type = 'VariableCall';\nexport default VariableCall;\n","import Node from './node';\nimport Variable from './variable';\nimport Ruleset from './ruleset';\nimport Selector from './selector';\n\nclass NamespaceValue extends Node {\n constructor(ruleCall, lookups, index, fileInfo) {\n super();\n\n this.value = ruleCall;\n this.lookups = lookups;\n this._index = index;\n this._fileInfo = fileInfo;\n }\n\n eval(context) {\n let i, j, name, rules = this.value.eval(context);\n \n for (i = 0; i < this.lookups.length; i++) {\n name = this.lookups[i];\n\n /**\n * Eval'd DRs return rulesets.\n * Eval'd mixins return rules, so let's make a ruleset if we need it.\n * We need to do this because of late parsing of values\n */\n if (Array.isArray(rules)) {\n rules = new Ruleset([new Selector()], rules);\n }\n\n if (name === '') {\n rules = rules.lastDeclaration();\n }\n else if (name.charAt(0) === '@') {\n if (name.charAt(1) === '@') {\n name = `@${new Variable(name.substr(1)).eval(context).value}`;\n }\n if (rules.variables) {\n rules = rules.variable(name);\n }\n \n if (!rules) {\n throw { type: 'Name',\n message: `variable ${name} not found`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n }\n else {\n if (name.substring(0, 2) === '$@') {\n name = `$${new Variable(name.substr(1)).eval(context).value}`;\n }\n else {\n name = name.charAt(0) === '$' ? name : `$${name}`;\n }\n if (rules.properties) {\n rules = rules.property(name);\n }\n \n if (!rules) {\n throw { type: 'Name',\n message: `property \"${name.substr(1)}\" not found`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n // Properties are an array of values, since a ruleset can have multiple props.\n // We pick the last one (the \"cascaded\" value)\n rules = rules[rules.length - 1];\n }\n\n if (rules.value) {\n rules = rules.eval(context).value;\n }\n if (rules.ruleset) {\n rules = rules.ruleset.eval(context);\n }\n }\n return rules;\n }\n}\n\nNamespaceValue.prototype.type = 'NamespaceValue';\nexport default NamespaceValue;\n","import Selector from './selector';\nimport Element from './element';\nimport Ruleset from './ruleset';\nimport Declaration from './declaration';\nimport DetachedRuleset from './detached-ruleset';\nimport Expression from './expression';\nimport contexts from '../contexts';\nimport * as utils from '../utils';\n\nclass Definition extends Ruleset {\n constructor(name, params, rules, condition, variadic, frames, visibilityInfo) {\n super();\n\n this.name = name || 'anonymous mixin';\n this.selectors = [new Selector([new Element(null, name, false, this._index, this._fileInfo)])];\n this.params = params;\n this.condition = condition;\n this.variadic = variadic;\n this.arity = params.length;\n this.rules = rules;\n this._lookups = {};\n const optionalParameters = [];\n this.required = params.reduce(function (count, p) {\n if (!p.name || (p.name && !p.value)) {\n return count + 1;\n }\n else {\n optionalParameters.push(p.name);\n return count;\n }\n }, 0);\n this.optionalParameters = optionalParameters;\n this.frames = frames;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n }\n\n accept(visitor) {\n if (this.params && this.params.length) {\n this.params = visitor.visitArray(this.params);\n }\n this.rules = visitor.visitArray(this.rules);\n if (this.condition) {\n this.condition = visitor.visit(this.condition);\n }\n }\n\n evalParams(context, mixinEnv, args, evaldArguments) {\n /* jshint boss:true */\n const frame = new Ruleset(null, null);\n\n let varargs;\n let arg;\n const params = utils.copyArray(this.params);\n let i;\n let j;\n let val;\n let name;\n let isNamedFound;\n let argIndex;\n let argsLength = 0;\n\n if (mixinEnv.frames && mixinEnv.frames[0] && mixinEnv.frames[0].functionRegistry) {\n frame.functionRegistry = mixinEnv.frames[0].functionRegistry.inherit();\n }\n mixinEnv = new contexts.Eval(mixinEnv, [frame].concat(mixinEnv.frames));\n\n if (args) {\n args = utils.copyArray(args);\n argsLength = args.length;\n\n for (i = 0; i < argsLength; i++) {\n arg = args[i];\n if (name = (arg && arg.name)) {\n isNamedFound = false;\n for (j = 0; j < params.length; j++) {\n if (!evaldArguments[j] && name === params[j].name) {\n evaldArguments[j] = arg.value.eval(context);\n frame.prependRule(new Declaration(name, arg.value.eval(context)));\n isNamedFound = true;\n break;\n }\n }\n if (isNamedFound) {\n args.splice(i, 1);\n i--;\n continue;\n } else {\n throw { type: 'Runtime', message: `Named argument for ${this.name} ${args[i].name} not found` };\n }\n }\n }\n }\n argIndex = 0;\n for (i = 0; i < params.length; i++) {\n if (evaldArguments[i]) { continue; }\n\n arg = args && args[argIndex];\n\n if (name = params[i].name) {\n if (params[i].variadic) {\n varargs = [];\n for (j = argIndex; j < argsLength; j++) {\n varargs.push(args[j].value.eval(context));\n }\n frame.prependRule(new Declaration(name, new Expression(varargs).eval(context)));\n } else {\n val = arg && arg.value;\n if (val) {\n // This was a mixin call, pass in a detached ruleset of it's eval'd rules\n if (Array.isArray(val)) {\n val = new DetachedRuleset(new Ruleset('', val));\n }\n else {\n val = val.eval(context);\n }\n } else if (params[i].value) {\n val = params[i].value.eval(mixinEnv);\n frame.resetCache();\n } else {\n throw { type: 'Runtime', message: `wrong number of arguments for ${this.name} (${argsLength} for ${this.arity})` };\n }\n\n frame.prependRule(new Declaration(name, val));\n evaldArguments[i] = val;\n }\n }\n\n if (params[i].variadic && args) {\n for (j = argIndex; j < argsLength; j++) {\n evaldArguments[j] = args[j].value.eval(context);\n }\n }\n argIndex++;\n }\n\n return frame;\n }\n\n makeImportant() {\n const rules = !this.rules ? this.rules : this.rules.map(function (r) {\n if (r.makeImportant) {\n return r.makeImportant(true);\n } else {\n return r;\n }\n });\n const result = new Definition(this.name, this.params, rules, this.condition, this.variadic, this.frames);\n return result;\n }\n\n eval(context) {\n return new Definition(this.name, this.params, this.rules, this.condition, this.variadic, this.frames || utils.copyArray(context.frames));\n }\n\n evalCall(context, args, important) {\n const _arguments = [];\n const mixinFrames = this.frames ? this.frames.concat(context.frames) : context.frames;\n const frame = this.evalParams(context, new contexts.Eval(context, mixinFrames), args, _arguments);\n let rules;\n let ruleset;\n\n frame.prependRule(new Declaration('@arguments', new Expression(_arguments).eval(context)));\n\n rules = utils.copyArray(this.rules);\n\n ruleset = new Ruleset(null, rules);\n ruleset.originalRuleset = this;\n ruleset = ruleset.eval(new contexts.Eval(context, [this, frame].concat(mixinFrames)));\n if (important) {\n ruleset = ruleset.makeImportant();\n }\n return ruleset;\n }\n\n matchCondition(args, context) {\n if (this.condition && !this.condition.eval(\n new contexts.Eval(context,\n [this.evalParams(context, /* the parameter variables */\n new contexts.Eval(context, this.frames ? this.frames.concat(context.frames) : context.frames), args, [])]\n .concat(this.frames || []) // the parent namespace/mixin frames\n .concat(context.frames)))) { // the current environment frames\n return false;\n }\n return true;\n }\n\n matchArgs(args, context) {\n const allArgsCnt = (args && args.length) || 0;\n let len;\n const optionalParameters = this.optionalParameters;\n const requiredArgsCnt = !args ? 0 : args.reduce(function (count, p) {\n if (optionalParameters.indexOf(p.name) < 0) {\n return count + 1;\n } else {\n return count;\n }\n }, 0);\n\n if (!this.variadic) {\n if (requiredArgsCnt < this.required) {\n return false;\n }\n if (allArgsCnt > this.params.length) {\n return false;\n }\n } else {\n if (requiredArgsCnt < (this.required - 1)) {\n return false;\n }\n }\n\n // check patterns\n len = Math.min(requiredArgsCnt, this.arity);\n\n for (let i = 0; i < len; i++) {\n if (!this.params[i].name && !this.params[i].variadic) {\n if (args[i].value.eval(context).toCSS() != this.params[i].value.eval(context).toCSS()) {\n return false;\n }\n }\n }\n return true;\n }\n}\n\nDefinition.prototype.type = 'MixinDefinition';\nDefinition.prototype.evalFirst = true;\nexport default Definition;\n","import Node from './node';\nimport Selector from './selector';\nimport MixinDefinition from './mixin-definition';\nimport defaultFunc from '../functions/default';\n\nclass MixinCall extends Node {\n constructor(elements, args, index, currentFileInfo, important) {\n super();\n\n this.selector = new Selector(elements);\n this.arguments = args || [];\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.important = important;\n this.allowRoot = true;\n this.setParent(this.selector, this);\n }\n\n accept(visitor) {\n if (this.selector) {\n this.selector = visitor.visit(this.selector);\n }\n if (this.arguments.length) {\n this.arguments = visitor.visitArray(this.arguments);\n }\n }\n\n eval(context) {\n let mixins;\n let mixin;\n let mixinPath;\n const args = [];\n let arg;\n let argValue;\n const rules = [];\n let match = false;\n let i;\n let m;\n let f;\n let isRecursive;\n let isOneFound;\n const candidates = [];\n let candidate;\n const conditionResult = [];\n let defaultResult;\n const defFalseEitherCase = -1;\n const defNone = 0;\n const defTrue = 1;\n const defFalse = 2;\n let count;\n let originalRuleset;\n let noArgumentsFilter;\n\n this.selector = this.selector.eval(context);\n\n function calcDefGroup(mixin, mixinPath) {\n let f, p, namespace;\n\n for (f = 0; f < 2; f++) {\n conditionResult[f] = true;\n defaultFunc.value(f);\n for (p = 0; p < mixinPath.length && conditionResult[f]; p++) {\n namespace = mixinPath[p];\n if (namespace.matchCondition) {\n conditionResult[f] = conditionResult[f] && namespace.matchCondition(null, context);\n }\n }\n if (mixin.matchCondition) {\n conditionResult[f] = conditionResult[f] && mixin.matchCondition(args, context);\n }\n }\n if (conditionResult[0] || conditionResult[1]) {\n if (conditionResult[0] != conditionResult[1]) {\n return conditionResult[1] ?\n defTrue : defFalse;\n }\n\n return defNone;\n }\n return defFalseEitherCase;\n }\n\n for (i = 0; i < this.arguments.length; i++) {\n arg = this.arguments[i];\n argValue = arg.value.eval(context);\n if (arg.expand && Array.isArray(argValue.value)) {\n argValue = argValue.value;\n for (m = 0; m < argValue.length; m++) {\n args.push({value: argValue[m]});\n }\n } else {\n args.push({name: arg.name, value: argValue});\n }\n }\n\n noArgumentsFilter = function(rule) {return rule.matchArgs(null, context);};\n\n for (i = 0; i < context.frames.length; i++) {\n if ((mixins = context.frames[i].find(this.selector, null, noArgumentsFilter)).length > 0) {\n isOneFound = true;\n\n // To make `default()` function independent of definition order we have two \"subpasses\" here.\n // At first we evaluate each guard *twice* (with `default() == true` and `default() == false`),\n // and build candidate list with corresponding flags. Then, when we know all possible matches,\n // we make a final decision.\n\n for (m = 0; m < mixins.length; m++) {\n mixin = mixins[m].rule;\n mixinPath = mixins[m].path;\n isRecursive = false;\n for (f = 0; f < context.frames.length; f++) {\n if ((!(mixin instanceof MixinDefinition)) && mixin === (context.frames[f].originalRuleset || context.frames[f])) {\n isRecursive = true;\n break;\n }\n }\n if (isRecursive) {\n continue;\n }\n\n if (mixin.matchArgs(args, context)) {\n candidate = {mixin, group: calcDefGroup(mixin, mixinPath)};\n\n if (candidate.group !== defFalseEitherCase) {\n candidates.push(candidate);\n }\n\n match = true;\n }\n }\n\n defaultFunc.reset();\n\n count = [0, 0, 0];\n for (m = 0; m < candidates.length; m++) {\n count[candidates[m].group]++;\n }\n\n if (count[defNone] > 0) {\n defaultResult = defFalse;\n } else {\n defaultResult = defTrue;\n if ((count[defTrue] + count[defFalse]) > 1) {\n throw { type: 'Runtime',\n message: `Ambiguous use of \\`default()\\` found when matching for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n }\n\n for (m = 0; m < candidates.length; m++) {\n candidate = candidates[m].group;\n if ((candidate === defNone) || (candidate === defaultResult)) {\n try {\n mixin = candidates[m].mixin;\n if (!(mixin instanceof MixinDefinition)) {\n originalRuleset = mixin.originalRuleset || mixin;\n mixin = new MixinDefinition('', [], mixin.rules, null, false, null, originalRuleset.visibilityInfo());\n mixin.originalRuleset = originalRuleset;\n }\n const newRules = mixin.evalCall(context, args, this.important).rules;\n this._setVisibilityToReplacement(newRules);\n Array.prototype.push.apply(rules, newRules);\n } catch (e) {\n throw { message: e.message, index: this.getIndex(), filename: this.fileInfo().filename, stack: e.stack };\n }\n }\n }\n\n if (match) {\n return rules;\n }\n }\n }\n if (isOneFound) {\n throw { type: 'Runtime',\n message: `No matching definition was found for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n } else {\n throw { type: 'Name',\n message: `${this.selector.toCSS().trim()} is undefined`,\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n }\n\n _setVisibilityToReplacement(replacement) {\n let i, rule;\n if (this.blocksVisibility()) {\n for (i = 0; i < replacement.length; i++) {\n rule = replacement[i];\n rule.addVisibilityBlock();\n }\n }\n }\n\n format(args) {\n return `${this.selector.toCSS().trim()}(${args ? args.map(function (a) {\n let argValue = '';\n if (a.name) {\n argValue += `${a.name}:`;\n }\n if (a.value.toCSS) {\n argValue += a.value.toCSS();\n } else {\n argValue += '???';\n }\n return argValue;\n }).join(', ') : ''})`;\n }\n}\n\nMixinCall.prototype.type = 'MixinCall';\nexport default MixinCall;\n","import Node from './node';\nimport Color from './color';\nimport AtRule from './atrule';\nimport DetachedRuleset from './detached-ruleset';\nimport Operation from './operation';\nimport Dimension from './dimension';\nimport Unit from './unit';\nimport Keyword from './keyword';\nimport Variable from './variable';\nimport Property from './property';\nimport Ruleset from './ruleset';\nimport Element from './element';\nimport Attribute from './attribute';\nimport Combinator from './combinator';\nimport Selector from './selector';\nimport Quoted from './quoted';\nimport Expression from './expression';\nimport Declaration from './declaration';\nimport Call from './call';\nimport URL from './url';\nimport Import from './import';\nimport Comment from './comment';\nimport Anonymous from './anonymous';\nimport Value from './value';\nimport JavaScript from './javascript';\nimport Assignment from './assignment';\nimport Condition from './condition';\nimport Paren from './paren';\nimport Media from './media';\nimport UnicodeDescriptor from './unicode-descriptor';\nimport Negative from './negative';\nimport Extend from './extend';\nimport VariableCall from './variable-call';\nimport NamespaceValue from './namespace-value';\n\n// mixins\nimport MixinCall from './mixin-call';\nimport MixinDefinition from './mixin-definition';\n\nexport default {\n Node, Color, AtRule, DetachedRuleset, Operation,\n Dimension, Unit, Keyword, Variable, Property,\n Ruleset, Element, Attribute, Combinator, Selector,\n Quoted, Expression, Declaration, Call, URL, Import,\n Comment, Anonymous, Value, JavaScript, Assignment,\n Condition, Paren, Media, UnicodeDescriptor, Negative,\n Extend, VariableCall, NamespaceValue,\n mixin: {\n Call: MixinCall,\n Definition: MixinDefinition\n }\n};","class AbstractFileManager {\n getPath(filename) {\n let j = filename.lastIndexOf('?');\n if (j > 0) {\n filename = filename.slice(0, j);\n }\n j = filename.lastIndexOf('/');\n if (j < 0) {\n j = filename.lastIndexOf('\\\\');\n }\n if (j < 0) {\n return '';\n }\n return filename.slice(0, j + 1);\n }\n\n tryAppendExtension(path, ext) {\n return /(\\.[a-z]*$)|([\\?;].*)$/.test(path) ? path : path + ext;\n }\n\n tryAppendLessExtension(path) {\n return this.tryAppendExtension(path, '.less');\n }\n\n supportsSync() {\n return false;\n }\n\n alwaysMakePathsAbsolute() {\n return false;\n }\n\n isPathAbsolute(filename) {\n return (/^(?:[a-z-]+:|\\/|\\\\|#)/i).test(filename);\n }\n\n // TODO: pull out / replace?\n join(basePath, laterPath) {\n if (!basePath) {\n return laterPath;\n }\n return basePath + laterPath;\n }\n\n pathDiff(url, baseUrl) {\n // diff between two paths to create a relative path\n\n const urlParts = this.extractUrlParts(url);\n\n const baseUrlParts = this.extractUrlParts(baseUrl);\n let i;\n let max;\n let urlDirectories;\n let baseUrlDirectories;\n let diff = '';\n if (urlParts.hostPart !== baseUrlParts.hostPart) {\n return '';\n }\n max = Math.max(baseUrlParts.directories.length, urlParts.directories.length);\n for (i = 0; i < max; i++) {\n if (baseUrlParts.directories[i] !== urlParts.directories[i]) { break; }\n }\n baseUrlDirectories = baseUrlParts.directories.slice(i);\n urlDirectories = urlParts.directories.slice(i);\n for (i = 0; i < baseUrlDirectories.length - 1; i++) {\n diff += '../';\n }\n for (i = 0; i < urlDirectories.length - 1; i++) {\n diff += `${urlDirectories[i]}/`;\n }\n return diff;\n }\n\n // helper function, not part of API\n extractUrlParts(url, baseUrl) {\n // urlParts[1] = protocol://hostname/ OR /\n // urlParts[2] = / if path relative to host base\n // urlParts[3] = directories\n // urlParts[4] = filename\n // urlParts[5] = parameters\n\n const urlPartsRegex = /^((?:[a-z-]+:)?\\/{2}(?:[^\\/\\?#]*\\/)|([\\/\\\\]))?((?:[^\\/\\\\\\?#]*[\\/\\\\])*)([^\\/\\\\\\?#]*)([#\\?].*)?$/i;\n\n const urlParts = url.match(urlPartsRegex);\n const returner = {};\n let rawDirectories = [];\n const directories = [];\n let i;\n let baseUrlParts;\n\n if (!urlParts) {\n throw new Error(`Could not parse sheet href - '${url}'`);\n }\n\n // Stylesheets in IE don't always return the full path\n if (baseUrl && (!urlParts[1] || urlParts[2])) {\n baseUrlParts = baseUrl.match(urlPartsRegex);\n if (!baseUrlParts) {\n throw new Error(`Could not parse page url - '${baseUrl}'`);\n }\n urlParts[1] = urlParts[1] || baseUrlParts[1] || '';\n if (!urlParts[2]) {\n urlParts[3] = baseUrlParts[3] + urlParts[3];\n }\n }\n\n if (urlParts[3]) {\n rawDirectories = urlParts[3].replace(/\\\\/g, '/').split('/');\n\n // collapse '..' and skip '.'\n for (i = 0; i < rawDirectories.length; i++) {\n\n if (rawDirectories[i] === '..') {\n directories.pop();\n }\n else if (rawDirectories[i] !== '.') {\n directories.push(rawDirectories[i]);\n }\n \n }\n }\n\n returner.hostPart = urlParts[1];\n returner.directories = directories;\n returner.rawPath = (urlParts[1] || '') + rawDirectories.join('/');\n returner.path = (urlParts[1] || '') + directories.join('/');\n returner.filename = urlParts[4];\n returner.fileUrl = returner.path + (urlParts[4] || '');\n returner.url = returner.fileUrl + (urlParts[5] || '');\n return returner;\n }\n}\n\nexport default AbstractFileManager;\n","import functionRegistry from '../functions/function-registry';\nimport LessError from '../less-error';\n\nclass AbstractPluginLoader {\n constructor() {\n // Implemented by Node.js plugin loader\n this.require = function() {\n return null;\n }\n }\n\n evalPlugin(contents, context, imports, pluginOptions, fileInfo) {\n\n let loader, registry, pluginObj, localModule, pluginManager, filename, result;\n\n pluginManager = context.pluginManager;\n\n if (fileInfo) {\n if (typeof fileInfo === 'string') {\n filename = fileInfo;\n }\n else {\n filename = fileInfo.filename;\n }\n }\n const shortname = (new this.less.FileManager()).extractUrlParts(filename).filename;\n\n if (filename) {\n pluginObj = pluginManager.get(filename);\n\n if (pluginObj) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imports, filename);\n }\n return pluginObj;\n }\n }\n localModule = {\n exports: {},\n pluginManager,\n fileInfo\n };\n registry = functionRegistry.create();\n\n const registerPlugin = function(obj) {\n pluginObj = obj;\n };\n\n try {\n loader = new Function('module', 'require', 'registerPlugin', 'functions', 'tree', 'less', 'fileInfo', contents);\n loader(localModule, this.require(filename), registerPlugin, registry, this.less.tree, this.less, fileInfo);\n }\n catch (e) {\n return new LessError(e, imports, filename);\n }\n\n if (!pluginObj) {\n pluginObj = localModule.exports;\n }\n pluginObj = this.validatePlugin(pluginObj, filename, shortname);\n\n if (pluginObj instanceof LessError) {\n return pluginObj;\n }\n\n if (pluginObj) {\n pluginObj.imports = imports;\n pluginObj.filename = filename;\n\n // For < 3.x (or unspecified minVersion) - setOptions() before install()\n if (!pluginObj.minVersion || this.compareVersion('3.0.0', pluginObj.minVersion) < 0) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n\n if (result) {\n return result;\n }\n }\n\n // Run on first load\n pluginManager.addPlugin(pluginObj, fileInfo.filename, registry);\n pluginObj.functions = registry.getLocalFunctions();\n\n // Need to call setOptions again because the pluginObj might have functions\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n\n // Run every @plugin call\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imports, filename);\n }\n\n }\n else {\n return new LessError({ message: 'Not a valid plugin' }, imports, filename);\n }\n\n return pluginObj;\n\n }\n\n trySetOptions(plugin, filename, name, options) {\n if (options && !plugin.setOptions) {\n return new LessError({\n message: `Options have been provided but the plugin ${name} does not support any options.`\n });\n }\n try {\n plugin.setOptions && plugin.setOptions(options);\n }\n catch (e) {\n return new LessError(e);\n }\n }\n\n validatePlugin(plugin, filename, name) {\n if (plugin) {\n // support plugins being a function\n // so that the plugin can be more usable programmatically\n if (typeof plugin === 'function') {\n plugin = new plugin();\n }\n\n if (plugin.minVersion) {\n if (this.compareVersion(plugin.minVersion, this.less.version) < 0) {\n return new LessError({\n message: `Plugin ${name} requires version ${this.versionToString(plugin.minVersion)}`\n });\n }\n }\n return plugin;\n }\n return null;\n }\n\n compareVersion(aVersion, bVersion) {\n if (typeof aVersion === 'string') {\n aVersion = aVersion.match(/^(\\d+)\\.?(\\d+)?\\.?(\\d+)?/);\n aVersion.shift();\n }\n for (let i = 0; i < aVersion.length; i++) {\n if (aVersion[i] !== bVersion[i]) {\n return parseInt(aVersion[i]) > parseInt(bVersion[i]) ? -1 : 1;\n }\n }\n return 0;\n }\n\n versionToString(version) {\n let versionString = '';\n for (let i = 0; i < version.length; i++) {\n versionString += (versionString ? '.' : '') + version[i];\n }\n return versionString;\n }\n\n printUsage(plugins) {\n for (let i = 0; i < plugins.length; i++) {\n const plugin = plugins[i];\n if (plugin.printUsage) {\n plugin.printUsage();\n }\n }\n }\n}\n\nexport default AbstractPluginLoader;\n\n","import tree from '../tree';\n\nconst _visitArgs = { visitDeeper: true };\nlet _hasIndexed = false;\n\nfunction _noop(node) {\n return node;\n}\n\nfunction indexNodeTypes(parent, ticker) {\n // add .typeIndex to tree node types for lookup table\n let key, child;\n for (key in parent) { \n /* eslint guard-for-in: 0 */\n child = parent[key];\n switch (typeof child) {\n case 'function':\n // ignore bound functions directly on tree which do not have a prototype\n // or aren't nodes\n if (child.prototype && child.prototype.type) {\n child.prototype.typeIndex = ticker++;\n }\n break;\n case 'object':\n ticker = indexNodeTypes(child, ticker);\n break;\n \n }\n }\n return ticker;\n}\n\nclass Visitor {\n constructor(implementation) {\n this._implementation = implementation;\n this._visitInCache = {};\n this._visitOutCache = {};\n\n if (!_hasIndexed) {\n indexNodeTypes(tree, 1);\n _hasIndexed = true;\n }\n }\n\n visit(node) {\n if (!node) {\n return node;\n }\n\n const nodeTypeIndex = node.typeIndex;\n if (!nodeTypeIndex) {\n // MixinCall args aren't a node type?\n if (node.value && node.value.typeIndex) {\n this.visit(node.value);\n }\n return node;\n }\n\n const impl = this._implementation;\n let func = this._visitInCache[nodeTypeIndex];\n let funcOut = this._visitOutCache[nodeTypeIndex];\n const visitArgs = _visitArgs;\n let fnName;\n\n visitArgs.visitDeeper = true;\n\n if (!func) {\n fnName = `visit${node.type}`;\n func = impl[fnName] || _noop;\n funcOut = impl[`${fnName}Out`] || _noop;\n this._visitInCache[nodeTypeIndex] = func;\n this._visitOutCache[nodeTypeIndex] = funcOut;\n }\n\n if (func !== _noop) {\n const newNode = func.call(impl, node, visitArgs);\n if (node && impl.isReplacing) {\n node = newNode;\n }\n }\n\n if (visitArgs.visitDeeper && node) {\n if (node.length) {\n for (let i = 0, cnt = node.length; i < cnt; i++) {\n if (node[i].accept) {\n node[i].accept(this);\n }\n }\n } else if (node.accept) {\n node.accept(this);\n }\n }\n\n if (funcOut != _noop) {\n funcOut.call(impl, node);\n }\n\n return node;\n }\n\n visitArray(nodes, nonReplacing) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.length;\n let i;\n\n // Non-replacing\n if (nonReplacing || !this._implementation.isReplacing) {\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n // Replacing\n const out = [];\n for (i = 0; i < cnt; i++) {\n const evald = this.visit(nodes[i]);\n if (evald === undefined) { continue; }\n if (!evald.splice) {\n out.push(evald);\n } else if (evald.length) {\n this.flatten(evald, out);\n }\n }\n return out;\n }\n\n flatten(arr, out) {\n if (!out) {\n out = [];\n }\n\n let cnt, i, item, nestedCnt, j, nestedItem;\n\n for (i = 0, cnt = arr.length; i < cnt; i++) {\n item = arr[i];\n if (item === undefined) {\n continue;\n }\n if (!item.splice) {\n out.push(item);\n continue;\n }\n\n for (j = 0, nestedCnt = item.length; j < nestedCnt; j++) {\n nestedItem = item[j];\n if (nestedItem === undefined) {\n continue;\n }\n if (!nestedItem.splice) {\n out.push(nestedItem);\n } else if (nestedItem.length) {\n this.flatten(nestedItem, out);\n }\n }\n }\n\n return out;\n }\n}\n\nexport default Visitor;\n","class ImportSequencer {\n constructor(onSequencerEmpty) {\n this.imports = [];\n this.variableImports = [];\n this._onSequencerEmpty = onSequencerEmpty;\n this._currentDepth = 0;\n }\n\n addImport(callback) {\n const importSequencer = this,\n importItem = {\n callback,\n args: null,\n isReady: false\n };\n this.imports.push(importItem);\n return function() {\n importItem.args = Array.prototype.slice.call(arguments, 0);\n importItem.isReady = true;\n importSequencer.tryRun();\n };\n }\n\n addVariableImport(callback) {\n this.variableImports.push(callback);\n }\n\n tryRun() {\n this._currentDepth++;\n try {\n while (true) {\n while (this.imports.length > 0) {\n const importItem = this.imports[0];\n if (!importItem.isReady) {\n return;\n }\n this.imports = this.imports.slice(1);\n importItem.callback.apply(null, importItem.args);\n }\n if (this.variableImports.length === 0) {\n break;\n }\n const variableImport = this.variableImports[0];\n this.variableImports = this.variableImports.slice(1);\n variableImport();\n }\n } finally {\n this._currentDepth--;\n }\n if (this._currentDepth === 0 && this._onSequencerEmpty) {\n this._onSequencerEmpty();\n }\n }\n}\n\nexport default ImportSequencer;\n","import contexts from '../contexts';\nimport Visitor from './visitor';\nimport ImportSequencer from './import-sequencer';\nimport * as utils from '../utils';\n\nconst ImportVisitor = function(importer, finish) {\n\n this._visitor = new Visitor(this);\n this._importer = importer;\n this._finish = finish;\n this.context = new contexts.Eval();\n this.importCount = 0;\n this.onceFileDetectionMap = {};\n this.recursionDetector = {};\n this._sequencer = new ImportSequencer(this._onSequencerEmpty.bind(this));\n};\n\nImportVisitor.prototype = {\n isReplacing: false,\n run: function (root) {\n try {\n // process the contents\n this._visitor.visit(root);\n }\n catch (e) {\n this.error = e;\n }\n\n this.isFinished = true;\n this._sequencer.tryRun();\n },\n _onSequencerEmpty: function() {\n if (!this.isFinished) {\n return;\n }\n this._finish(this.error);\n },\n visitImport: function (importNode, visitArgs) {\n const inlineCSS = importNode.options.inline;\n\n if (!importNode.css || inlineCSS) {\n\n const context = new contexts.Eval(this.context, utils.copyArray(this.context.frames));\n const importParent = context.frames[0];\n\n this.importCount++;\n if (importNode.isVariableImport()) {\n this._sequencer.addVariableImport(this.processImportNode.bind(this, importNode, context, importParent));\n } else {\n this.processImportNode(importNode, context, importParent);\n }\n }\n visitArgs.visitDeeper = false;\n },\n processImportNode: function(importNode, context, importParent) {\n let evaldImportNode;\n const inlineCSS = importNode.options.inline;\n\n try {\n evaldImportNode = importNode.evalForImport(context);\n } catch (e) {\n if (!e.filename) { e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename; }\n // attempt to eval properly and treat as css\n importNode.css = true;\n // if that fails, this error will be thrown\n importNode.error = e;\n }\n\n if (evaldImportNode && (!evaldImportNode.css || inlineCSS)) {\n\n if (evaldImportNode.options.multiple) {\n context.importMultiple = true;\n }\n\n // try appending if we haven't determined if it is css or not\n const tryAppendLessExtension = evaldImportNode.css === undefined;\n\n for (let i = 0; i < importParent.rules.length; i++) {\n if (importParent.rules[i] === importNode) {\n importParent.rules[i] = evaldImportNode;\n break;\n }\n }\n\n const onImported = this.onImported.bind(this, evaldImportNode, context), sequencedOnImported = this._sequencer.addImport(onImported);\n\n this._importer.push(evaldImportNode.getPath(), tryAppendLessExtension, evaldImportNode.fileInfo(),\n evaldImportNode.options, sequencedOnImported);\n } else {\n this.importCount--;\n if (this.isFinished) {\n this._sequencer.tryRun();\n }\n }\n },\n onImported: function (importNode, context, e, root, importedAtRoot, fullPath) {\n if (e) {\n if (!e.filename) {\n e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename;\n }\n this.error = e;\n }\n\n const importVisitor = this, inlineCSS = importNode.options.inline, isPlugin = importNode.options.isPlugin, isOptional = importNode.options.optional, duplicateImport = importedAtRoot || fullPath in importVisitor.recursionDetector;\n\n if (!context.importMultiple) {\n if (duplicateImport) {\n importNode.skip = true;\n } else {\n importNode.skip = function() {\n if (fullPath in importVisitor.onceFileDetectionMap) {\n return true;\n }\n importVisitor.onceFileDetectionMap[fullPath] = true;\n return false;\n };\n }\n }\n\n if (!fullPath && isOptional) {\n importNode.skip = true;\n }\n\n if (root) {\n importNode.root = root;\n importNode.importedFilename = fullPath;\n\n if (!inlineCSS && !isPlugin && (context.importMultiple || !duplicateImport)) {\n importVisitor.recursionDetector[fullPath] = true;\n\n const oldContext = this.context;\n this.context = context;\n try {\n this._visitor.visit(root);\n } catch (e) {\n this.error = e;\n }\n this.context = oldContext;\n }\n }\n\n importVisitor.importCount--;\n\n if (importVisitor.isFinished) {\n importVisitor._sequencer.tryRun();\n }\n },\n visitDeclaration: function (declNode, visitArgs) {\n if (declNode.value.type === 'DetachedRuleset') {\n this.context.frames.unshift(declNode);\n } else {\n visitArgs.visitDeeper = false;\n }\n },\n visitDeclarationOut: function(declNode) {\n if (declNode.value.type === 'DetachedRuleset') {\n this.context.frames.shift();\n }\n },\n visitAtRule: function (atRuleNode, visitArgs) {\n this.context.frames.unshift(atRuleNode);\n },\n visitAtRuleOut: function (atRuleNode) {\n this.context.frames.shift();\n },\n visitMixinDefinition: function (mixinDefinitionNode, visitArgs) {\n this.context.frames.unshift(mixinDefinitionNode);\n },\n visitMixinDefinitionOut: function (mixinDefinitionNode) {\n this.context.frames.shift();\n },\n visitRuleset: function (rulesetNode, visitArgs) {\n this.context.frames.unshift(rulesetNode);\n },\n visitRulesetOut: function (rulesetNode) {\n this.context.frames.shift();\n },\n visitMedia: function (mediaNode, visitArgs) {\n this.context.frames.unshift(mediaNode.rules[0]);\n },\n visitMediaOut: function (mediaNode) {\n this.context.frames.shift();\n }\n};\nexport default ImportVisitor;\n","class SetTreeVisibilityVisitor {\n constructor(visible) {\n this.visible = visible;\n }\n\n run(root) {\n this.visit(root);\n }\n\n visitArray(nodes) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.length;\n let i;\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n visit(node) {\n if (!node) {\n return node;\n }\n if (node.constructor === Array) {\n return this.visitArray(node);\n }\n\n if (!node.blocksVisibility || node.blocksVisibility()) {\n return node;\n }\n if (this.visible) {\n node.ensureVisibility();\n } else {\n node.ensureInvisibility();\n }\n\n node.accept(this);\n return node;\n }\n}\n\nexport default SetTreeVisibilityVisitor;","import tree from '../tree';\nimport Visitor from './visitor';\nimport logger from '../logger';\nimport * as utils from '../utils';\n\n/* jshint loopfunc:true */\n\nclass ExtendFinderVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n this.contexts = [];\n this.allExtendsStack = [[]];\n }\n\n run(root) {\n root = this._visitor.visit(root);\n root.allExtends = this.allExtendsStack[0];\n return root;\n }\n\n visitDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n\n let i;\n let j;\n let extend;\n const allSelectorsExtendList = [];\n let extendList;\n\n // get &:extend(.a); rules which apply to all selectors in this ruleset\n const rules = rulesetNode.rules, ruleCnt = rules ? rules.length : 0;\n for (i = 0; i < ruleCnt; i++) {\n if (rulesetNode.rules[i] instanceof tree.Extend) {\n allSelectorsExtendList.push(rules[i]);\n rulesetNode.extendOnEveryPath = true;\n }\n }\n\n // now find every selector and apply the extends that apply to all extends\n // and the ones which apply to an individual extend\n const paths = rulesetNode.paths;\n for (i = 0; i < paths.length; i++) {\n const selectorPath = paths[i], selector = selectorPath[selectorPath.length - 1], selExtendList = selector.extendList;\n\n extendList = selExtendList ? utils.copyArray(selExtendList).concat(allSelectorsExtendList)\n : allSelectorsExtendList;\n\n if (extendList) {\n extendList = extendList.map(function(allSelectorsExtend) {\n return allSelectorsExtend.clone();\n });\n }\n\n for (j = 0; j < extendList.length; j++) {\n this.foundExtends = true;\n extend = extendList[j];\n extend.findSelfSelectors(selectorPath);\n extend.ruleset = rulesetNode;\n if (j === 0) { extend.firstExtendOnThisSelectorPath = true; }\n this.allExtendsStack[this.allExtendsStack.length - 1].push(extend);\n }\n }\n\n this.contexts.push(rulesetNode.selectors);\n }\n\n visitRulesetOut(rulesetNode) {\n if (!rulesetNode.root) {\n this.contexts.length = this.contexts.length - 1;\n }\n }\n\n visitMedia(mediaNode, visitArgs) {\n mediaNode.allExtends = [];\n this.allExtendsStack.push(mediaNode.allExtends);\n }\n\n visitMediaOut(mediaNode) {\n this.allExtendsStack.length = this.allExtendsStack.length - 1;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n atRuleNode.allExtends = [];\n this.allExtendsStack.push(atRuleNode.allExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n this.allExtendsStack.length = this.allExtendsStack.length - 1;\n }\n}\n\nclass ProcessExtendsVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n }\n\n run(root) {\n const extendFinder = new ExtendFinderVisitor();\n this.extendIndices = {};\n extendFinder.run(root);\n if (!extendFinder.foundExtends) { return root; }\n root.allExtends = root.allExtends.concat(this.doExtendChaining(root.allExtends, root.allExtends));\n this.allExtendsStack = [root.allExtends];\n const newRoot = this._visitor.visit(root);\n this.checkExtendsForNonMatched(root.allExtends);\n return newRoot;\n }\n\n checkExtendsForNonMatched(extendList) {\n const indices = this.extendIndices;\n extendList.filter(function(extend) {\n return !extend.hasFoundMatches && extend.parent_ids.length == 1;\n }).forEach(function(extend) {\n let selector = '_unknown_';\n try {\n selector = extend.selector.toCSS({});\n }\n catch (_) {}\n\n if (!indices[`${extend.index} ${selector}`]) {\n indices[`${extend.index} ${selector}`] = true;\n logger.warn(`extend '${selector}' has no matches`);\n }\n });\n }\n\n doExtendChaining(extendsList, extendsListTarget, iterationCount) {\n //\n // chaining is different from normal extension.. if we extend an extend then we are not just copying, altering\n // and pasting the selector we would do normally, but we are also adding an extend with the same target selector\n // this means this new extend can then go and alter other extends\n //\n // this method deals with all the chaining work - without it, extend is flat and doesn't work on other extend selectors\n // this is also the most expensive.. and a match on one selector can cause an extension of a selector we had already\n // processed if we look at each selector at a time, as is done in visitRuleset\n\n let extendIndex;\n\n let targetExtendIndex;\n let matches;\n const extendsToAdd = [];\n let newSelector;\n const extendVisitor = this;\n let selectorPath;\n let extend;\n let targetExtend;\n let newExtend;\n\n iterationCount = iterationCount || 0;\n\n // loop through comparing every extend with every target extend.\n // a target extend is the one on the ruleset we are looking at copy/edit/pasting in place\n // e.g. .a:extend(.b) {} and .b:extend(.c) {} then the first extend extends the second one\n // and the second is the target.\n // the separation into two lists allows us to process a subset of chains with a bigger set, as is the\n // case when processing media queries\n for (extendIndex = 0; extendIndex < extendsList.length; extendIndex++) {\n for (targetExtendIndex = 0; targetExtendIndex < extendsListTarget.length; targetExtendIndex++) {\n\n extend = extendsList[extendIndex];\n targetExtend = extendsListTarget[targetExtendIndex];\n\n // look for circular references\n if ( extend.parent_ids.indexOf( targetExtend.object_id ) >= 0 ) { continue; }\n\n // find a match in the target extends self selector (the bit before :extend)\n selectorPath = [targetExtend.selfSelectors[0]];\n matches = extendVisitor.findMatch(extend, selectorPath);\n\n if (matches.length) {\n extend.hasFoundMatches = true;\n\n // we found a match, so for each self selector..\n extend.selfSelectors.forEach(function(selfSelector) {\n const info = targetExtend.visibilityInfo();\n\n // process the extend as usual\n newSelector = extendVisitor.extendSelector(matches, selectorPath, selfSelector, extend.isVisible());\n\n // but now we create a new extend from it\n newExtend = new(tree.Extend)(targetExtend.selector, targetExtend.option, 0, targetExtend.fileInfo(), info);\n newExtend.selfSelectors = newSelector;\n\n // add the extend onto the list of extends for that selector\n newSelector[newSelector.length - 1].extendList = [newExtend];\n\n // record that we need to add it.\n extendsToAdd.push(newExtend);\n newExtend.ruleset = targetExtend.ruleset;\n\n // remember its parents for circular references\n newExtend.parent_ids = newExtend.parent_ids.concat(targetExtend.parent_ids, extend.parent_ids);\n\n // only process the selector once.. if we have :extend(.a,.b) then multiple\n // extends will look at the same selector path, so when extending\n // we know that any others will be duplicates in terms of what is added to the css\n if (targetExtend.firstExtendOnThisSelectorPath) {\n newExtend.firstExtendOnThisSelectorPath = true;\n targetExtend.ruleset.paths.push(newSelector);\n }\n });\n }\n }\n }\n\n if (extendsToAdd.length) {\n // try to detect circular references to stop a stack overflow.\n // may no longer be needed.\n this.extendChainCount++;\n if (iterationCount > 100) {\n let selectorOne = '{unable to calculate}';\n let selectorTwo = '{unable to calculate}';\n try {\n selectorOne = extendsToAdd[0].selfSelectors[0].toCSS();\n selectorTwo = extendsToAdd[0].selector.toCSS();\n }\n catch (e) {}\n throw { message: `extend circular reference detected. One of the circular extends is currently:${selectorOne}:extend(${selectorTwo})`};\n }\n\n // now process the new extends on the existing rules so that we can handle a extending b extending c extending\n // d extending e...\n return extendsToAdd.concat(extendVisitor.doExtendChaining(extendsToAdd, extendsListTarget, iterationCount + 1));\n } else {\n return extendsToAdd;\n }\n }\n\n visitDeclaration(ruleNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitSelector(selectorNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n let matches;\n let pathIndex;\n let extendIndex;\n const allExtends = this.allExtendsStack[this.allExtendsStack.length - 1];\n const selectorsToAdd = [];\n const extendVisitor = this;\n let selectorPath;\n\n // look at each selector path in the ruleset, find any extend matches and then copy, find and replace\n\n for (extendIndex = 0; extendIndex < allExtends.length; extendIndex++) {\n for (pathIndex = 0; pathIndex < rulesetNode.paths.length; pathIndex++) {\n selectorPath = rulesetNode.paths[pathIndex];\n\n // extending extends happens initially, before the main pass\n if (rulesetNode.extendOnEveryPath) { continue; }\n const extendList = selectorPath[selectorPath.length - 1].extendList;\n if (extendList && extendList.length) { continue; }\n\n matches = this.findMatch(allExtends[extendIndex], selectorPath);\n\n if (matches.length) {\n allExtends[extendIndex].hasFoundMatches = true;\n\n allExtends[extendIndex].selfSelectors.forEach(function(selfSelector) {\n let extendedSelectors;\n extendedSelectors = extendVisitor.extendSelector(matches, selectorPath, selfSelector, allExtends[extendIndex].isVisible());\n selectorsToAdd.push(extendedSelectors);\n });\n }\n }\n }\n rulesetNode.paths = rulesetNode.paths.concat(selectorsToAdd);\n }\n\n findMatch(extend, haystackSelectorPath) {\n //\n // look through the haystack selector path to try and find the needle - extend.selector\n // returns an array of selector matches that can then be replaced\n //\n let haystackSelectorIndex;\n\n let hackstackSelector;\n let hackstackElementIndex;\n let haystackElement;\n let targetCombinator;\n let i;\n const extendVisitor = this;\n const needleElements = extend.selector.elements;\n const potentialMatches = [];\n let potentialMatch;\n const matches = [];\n\n // loop through the haystack elements\n for (haystackSelectorIndex = 0; haystackSelectorIndex < haystackSelectorPath.length; haystackSelectorIndex++) {\n hackstackSelector = haystackSelectorPath[haystackSelectorIndex];\n\n for (hackstackElementIndex = 0; hackstackElementIndex < hackstackSelector.elements.length; hackstackElementIndex++) {\n\n haystackElement = hackstackSelector.elements[hackstackElementIndex];\n\n // if we allow elements before our match we can add a potential match every time. otherwise only at the first element.\n if (extend.allowBefore || (haystackSelectorIndex === 0 && hackstackElementIndex === 0)) {\n potentialMatches.push({pathIndex: haystackSelectorIndex, index: hackstackElementIndex, matched: 0,\n initialCombinator: haystackElement.combinator});\n }\n\n for (i = 0; i < potentialMatches.length; i++) {\n potentialMatch = potentialMatches[i];\n\n // selectors add \" \" onto the first element. When we use & it joins the selectors together, but if we don't\n // then each selector in haystackSelectorPath has a space before it added in the toCSS phase. so we need to\n // work out what the resulting combinator will be\n targetCombinator = haystackElement.combinator.value;\n if (targetCombinator === '' && hackstackElementIndex === 0) {\n targetCombinator = ' ';\n }\n\n // if we don't match, null our match to indicate failure\n if (!extendVisitor.isElementValuesEqual(needleElements[potentialMatch.matched].value, haystackElement.value) ||\n (potentialMatch.matched > 0 && needleElements[potentialMatch.matched].combinator.value !== targetCombinator)) {\n potentialMatch = null;\n } else {\n potentialMatch.matched++;\n }\n\n // if we are still valid and have finished, test whether we have elements after and whether these are allowed\n if (potentialMatch) {\n potentialMatch.finished = potentialMatch.matched === needleElements.length;\n if (potentialMatch.finished &&\n (!extend.allowAfter &&\n (hackstackElementIndex + 1 < hackstackSelector.elements.length || haystackSelectorIndex + 1 < haystackSelectorPath.length))) {\n potentialMatch = null;\n }\n }\n // if null we remove, if not, we are still valid, so either push as a valid match or continue\n if (potentialMatch) {\n if (potentialMatch.finished) {\n potentialMatch.length = needleElements.length;\n potentialMatch.endPathIndex = haystackSelectorIndex;\n potentialMatch.endPathElementIndex = hackstackElementIndex + 1; // index after end of match\n potentialMatches.length = 0; // we don't allow matches to overlap, so start matching again\n matches.push(potentialMatch);\n }\n } else {\n potentialMatches.splice(i, 1);\n i--;\n }\n }\n }\n }\n return matches;\n }\n\n isElementValuesEqual(elementValue1, elementValue2) {\n if (typeof elementValue1 === 'string' || typeof elementValue2 === 'string') {\n return elementValue1 === elementValue2;\n }\n if (elementValue1 instanceof tree.Attribute) {\n if (elementValue1.op !== elementValue2.op || elementValue1.key !== elementValue2.key) {\n return false;\n }\n if (!elementValue1.value || !elementValue2.value) {\n if (elementValue1.value || elementValue2.value) {\n return false;\n }\n return true;\n }\n elementValue1 = elementValue1.value.value || elementValue1.value;\n elementValue2 = elementValue2.value.value || elementValue2.value;\n return elementValue1 === elementValue2;\n }\n elementValue1 = elementValue1.value;\n elementValue2 = elementValue2.value;\n if (elementValue1 instanceof tree.Selector) {\n if (!(elementValue2 instanceof tree.Selector) || elementValue1.elements.length !== elementValue2.elements.length) {\n return false;\n }\n for (let i = 0; i < elementValue1.elements.length; i++) {\n if (elementValue1.elements[i].combinator.value !== elementValue2.elements[i].combinator.value) {\n if (i !== 0 || (elementValue1.elements[i].combinator.value || ' ') !== (elementValue2.elements[i].combinator.value || ' ')) {\n return false;\n }\n }\n if (!this.isElementValuesEqual(elementValue1.elements[i].value, elementValue2.elements[i].value)) {\n return false;\n }\n }\n return true;\n }\n return false;\n }\n\n extendSelector(matches, selectorPath, replacementSelector, isVisible) {\n\n // for a set of matches, replace each match with the replacement selector\n\n let currentSelectorPathIndex = 0, currentSelectorPathElementIndex = 0, path = [], matchIndex, selector, firstElement, match, newElements;\n\n for (matchIndex = 0; matchIndex < matches.length; matchIndex++) {\n match = matches[matchIndex];\n selector = selectorPath[match.pathIndex];\n firstElement = new tree.Element(\n match.initialCombinator,\n replacementSelector.elements[0].value,\n replacementSelector.elements[0].isVariable,\n replacementSelector.elements[0].getIndex(),\n replacementSelector.elements[0].fileInfo()\n );\n\n if (match.pathIndex > currentSelectorPathIndex && currentSelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n\n newElements = selector.elements\n .slice(currentSelectorPathElementIndex, match.index)\n .concat([firstElement])\n .concat(replacementSelector.elements.slice(1));\n\n if (currentSelectorPathIndex === match.pathIndex && matchIndex > 0) {\n path[path.length - 1].elements =\n path[path.length - 1].elements.concat(newElements);\n } else {\n path = path.concat(selectorPath.slice(currentSelectorPathIndex, match.pathIndex));\n\n path.push(new tree.Selector(\n newElements\n ));\n }\n currentSelectorPathIndex = match.endPathIndex;\n currentSelectorPathElementIndex = match.endPathElementIndex;\n if (currentSelectorPathElementIndex >= selectorPath[currentSelectorPathIndex].elements.length) {\n currentSelectorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n }\n\n if (currentSelectorPathIndex < selectorPath.length && currentSelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathIndex++;\n }\n\n path = path.concat(selectorPath.slice(currentSelectorPathIndex, selectorPath.length));\n path = path.map(function (currentValue) {\n // we can re-use elements here, because the visibility property matters only for selectors\n const derived = currentValue.createDerived(currentValue.elements);\n if (isVisible) {\n derived.ensureVisibility();\n } else {\n derived.ensureInvisibility();\n }\n return derived;\n });\n return path;\n }\n\n visitMedia(mediaNode, visitArgs) {\n let newAllExtends = mediaNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, mediaNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitMediaOut(mediaNode) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStack.length = lastIndex;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n let newAllExtends = atRuleNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, atRuleNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStack.length = lastIndex;\n }\n}\n\nexport default ProcessExtendsVisitor;\n","import Visitor from './visitor';\n\nclass JoinSelectorVisitor {\n constructor() {\n this.contexts = [[]];\n this._visitor = new Visitor(this);\n }\n\n run(root) {\n return this._visitor.visit(root);\n }\n\n visitDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n const paths = [];\n let selectors;\n\n this.contexts.push(paths);\n\n if (!rulesetNode.root) {\n selectors = rulesetNode.selectors;\n if (selectors) {\n selectors = selectors.filter(function(selector) { return selector.getIsOutput(); });\n rulesetNode.selectors = selectors.length ? selectors : (selectors = null);\n if (selectors) { rulesetNode.joinSelectors(paths, context, selectors); }\n }\n if (!selectors) { rulesetNode.rules = null; }\n rulesetNode.paths = paths;\n }\n }\n\n visitRulesetOut(rulesetNode) {\n this.contexts.length = this.contexts.length - 1;\n }\n\n visitMedia(mediaNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n mediaNode.rules[0].root = (context.length === 0 || context[0].multiMedia);\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n if (atRuleNode.rules && atRuleNode.rules.length) {\n atRuleNode.rules[0].root = (atRuleNode.isRooted || context.length === 0 || null);\n }\n }\n}\n\nexport default JoinSelectorVisitor;\n","import tree from '../tree';\nimport Visitor from './visitor';\n\nclass CSSVisitorUtils {\n constructor(context) {\n this._visitor = new Visitor(this);\n this._context = context;\n }\n\n containsSilentNonBlockedChild(bodyRules) {\n let rule;\n if (!bodyRules) {\n return false;\n }\n for (let r = 0; r < bodyRules.length; r++) {\n rule = bodyRules[r];\n if (rule.isSilent && rule.isSilent(this._context) && !rule.blocksVisibility()) {\n // the atrule contains something that was referenced (likely by extend)\n // therefore it needs to be shown in output too\n return true;\n }\n }\n return false;\n }\n\n keepOnlyVisibleChilds(owner) {\n if (owner && owner.rules) {\n owner.rules = owner.rules.filter(thing => thing.isVisible());\n }\n }\n\n isEmpty(owner) {\n return (owner && owner.rules) \n ? (owner.rules.length === 0) : true;\n }\n\n hasVisibleSelector(rulesetNode) {\n return (rulesetNode && rulesetNode.paths)\n ? (rulesetNode.paths.length > 0) : false;\n }\n\n resolveVisibility(node, originalRules) {\n if (!node.blocksVisibility()) {\n if (this.isEmpty(node) && !this.containsSilentNonBlockedChild(originalRules)) {\n return ;\n }\n\n return node;\n }\n\n const compiledRulesBody = node.rules[0];\n this.keepOnlyVisibleChilds(compiledRulesBody);\n\n if (this.isEmpty(compiledRulesBody)) {\n return ;\n }\n\n node.ensureVisibility();\n node.removeVisibilityBlock();\n\n return node;\n }\n\n isVisibleRuleset(rulesetNode) {\n if (rulesetNode.firstRoot) {\n return true;\n }\n\n if (this.isEmpty(rulesetNode)) {\n return false;\n }\n\n if (!rulesetNode.root && !this.hasVisibleSelector(rulesetNode)) {\n return false;\n }\n\n return true;\n }\n}\n\nconst ToCSSVisitor = function(context) {\n this._visitor = new Visitor(this);\n this._context = context;\n this.utils = new CSSVisitorUtils(context);\n};\n\nToCSSVisitor.prototype = {\n isReplacing: true,\n run: function (root) {\n return this._visitor.visit(root);\n },\n\n visitDeclaration: function (declNode, visitArgs) {\n if (declNode.blocksVisibility() || declNode.variable) {\n return;\n }\n return declNode;\n },\n\n visitMixinDefinition: function (mixinNode, visitArgs) {\n // mixin definitions do not get eval'd - this means they keep state\n // so we have to clear that state here so it isn't used if toCSS is called twice\n mixinNode.frames = [];\n },\n\n visitExtend: function (extendNode, visitArgs) {\n },\n\n visitComment: function (commentNode, visitArgs) {\n if (commentNode.blocksVisibility() || commentNode.isSilent(this._context)) {\n return;\n }\n return commentNode;\n },\n\n visitMedia: function(mediaNode, visitArgs) {\n const originalRules = mediaNode.rules[0].rules;\n mediaNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n\n return this.utils.resolveVisibility(mediaNode, originalRules);\n },\n\n visitImport: function (importNode, visitArgs) {\n if (importNode.blocksVisibility()) {\n return ;\n }\n return importNode;\n },\n\n visitAtRule: function(atRuleNode, visitArgs) {\n if (atRuleNode.rules && atRuleNode.rules.length) {\n return this.visitAtRuleWithBody(atRuleNode, visitArgs);\n } else {\n return this.visitAtRuleWithoutBody(atRuleNode, visitArgs);\n }\n },\n\n visitAnonymous: function(anonymousNode, visitArgs) {\n if (!anonymousNode.blocksVisibility()) {\n anonymousNode.accept(this._visitor);\n return anonymousNode;\n }\n },\n\n visitAtRuleWithBody: function(atRuleNode, visitArgs) {\n // if there is only one nested ruleset and that one has no path, then it is\n // just fake ruleset\n function hasFakeRuleset(atRuleNode) {\n const bodyRules = atRuleNode.rules;\n return bodyRules.length === 1 && (!bodyRules[0].paths || bodyRules[0].paths.length === 0);\n }\n function getBodyRules(atRuleNode) {\n const nodeRules = atRuleNode.rules;\n if (hasFakeRuleset(atRuleNode)) {\n return nodeRules[0].rules;\n }\n\n return nodeRules;\n }\n // it is still true that it is only one ruleset in array\n // this is last such moment\n // process childs\n const originalRules = getBodyRules(atRuleNode);\n atRuleNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n\n if (!this.utils.isEmpty(atRuleNode)) {\n this._mergeRules(atRuleNode.rules[0].rules);\n }\n\n return this.utils.resolveVisibility(atRuleNode, originalRules);\n },\n\n visitAtRuleWithoutBody: function(atRuleNode, visitArgs) {\n if (atRuleNode.blocksVisibility()) {\n return;\n }\n\n if (atRuleNode.name === '@charset') {\n // Only output the debug info together with subsequent @charset definitions\n // a comment (or @media statement) before the actual @charset atrule would\n // be considered illegal css as it has to be on the first line\n if (this.charset) {\n if (atRuleNode.debugInfo) {\n const comment = new tree.Comment(`/* ${atRuleNode.toCSS(this._context).replace(/\\n/g, '')} */\\n`);\n comment.debugInfo = atRuleNode.debugInfo;\n return this._visitor.visit(comment);\n }\n return;\n }\n this.charset = true;\n }\n\n return atRuleNode;\n },\n\n checkValidNodes: function(rules, isRoot) {\n if (!rules) {\n return;\n }\n\n for (let i = 0; i < rules.length; i++) {\n const ruleNode = rules[i];\n if (isRoot && ruleNode instanceof tree.Declaration && !ruleNode.variable) {\n throw { message: 'Properties must be inside selector blocks. They cannot be in the root',\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n if (ruleNode instanceof tree.Call) {\n throw { message: `Function '${ruleNode.name}' did not return a root node`,\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n if (ruleNode.type && !ruleNode.allowRoot) {\n throw { message: `${ruleNode.type} node returned by a function is not valid here`,\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n }\n },\n\n visitRuleset: function (rulesetNode, visitArgs) {\n // at this point rulesets are nested into each other\n let rule;\n\n const rulesets = [];\n\n this.checkValidNodes(rulesetNode.rules, rulesetNode.firstRoot);\n\n if (!rulesetNode.root) {\n // remove invisible paths\n this._compileRulesetPaths(rulesetNode);\n\n // remove rulesets from this ruleset body and compile them separately\n const nodeRules = rulesetNode.rules;\n\n let nodeRuleCnt = nodeRules ? nodeRules.length : 0;\n for (let i = 0; i < nodeRuleCnt; ) {\n rule = nodeRules[i];\n if (rule && rule.rules) {\n // visit because we are moving them out from being a child\n rulesets.push(this._visitor.visit(rule));\n nodeRules.splice(i, 1);\n nodeRuleCnt--;\n continue;\n }\n i++;\n }\n // accept the visitor to remove rules and refactor itself\n // then we can decide nogw whether we want it or not\n // compile body\n if (nodeRuleCnt > 0) {\n rulesetNode.accept(this._visitor);\n } else {\n rulesetNode.rules = null;\n }\n visitArgs.visitDeeper = false;\n } else { // if (! rulesetNode.root) {\n rulesetNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n }\n\n if (rulesetNode.rules) {\n this._mergeRules(rulesetNode.rules);\n this._removeDuplicateRules(rulesetNode.rules);\n }\n\n // now decide whether we keep the ruleset\n if (this.utils.isVisibleRuleset(rulesetNode)) {\n rulesetNode.ensureVisibility();\n rulesets.splice(0, 0, rulesetNode);\n }\n\n if (rulesets.length === 1) {\n return rulesets[0];\n }\n return rulesets;\n },\n\n _compileRulesetPaths: function(rulesetNode) {\n if (rulesetNode.paths) {\n rulesetNode.paths = rulesetNode.paths\n .filter(p => {\n let i;\n if (p[0].elements[0].combinator.value === ' ') {\n p[0].elements[0].combinator = new(tree.Combinator)('');\n }\n for (i = 0; i < p.length; i++) {\n if (p[i].isVisible() && p[i].getIsOutput()) {\n return true;\n }\n }\n return false;\n });\n }\n },\n\n _removeDuplicateRules: function(rules) {\n if (!rules) { return; }\n\n // remove duplicates\n const ruleCache = {};\n\n let ruleList;\n let rule;\n let i;\n\n for (i = rules.length - 1; i >= 0 ; i--) {\n rule = rules[i];\n if (rule instanceof tree.Declaration) {\n if (!ruleCache[rule.name]) {\n ruleCache[rule.name] = rule;\n } else {\n ruleList = ruleCache[rule.name];\n if (ruleList instanceof tree.Declaration) {\n ruleList = ruleCache[rule.name] = [ruleCache[rule.name].toCSS(this._context)];\n }\n const ruleCSS = rule.toCSS(this._context);\n if (ruleList.indexOf(ruleCSS) !== -1) {\n rules.splice(i, 1);\n } else {\n ruleList.push(ruleCSS);\n }\n }\n }\n }\n },\n\n _mergeRules: function(rules) {\n if (!rules) {\n return; \n }\n\n const groups = {};\n const groupsArr = [];\n\n for (let i = 0; i < rules.length; i++) {\n const rule = rules[i];\n if (rule.merge) {\n const key = rule.name;\n groups[key] ? rules.splice(i--, 1) : \n groupsArr.push(groups[key] = []);\n groups[key].push(rule);\n }\n }\n\n groupsArr.forEach(group => {\n if (group.length > 0) {\n const result = group[0];\n let space = [];\n const comma = [new tree.Expression(space)];\n group.forEach(rule => {\n if ((rule.merge === '+') && (space.length > 0)) {\n comma.push(new tree.Expression(space = []));\n }\n space.push(rule.value);\n result.important = result.important || rule.important;\n });\n result.value = new tree.Value(comma);\n }\n });\n }\n};\n\nexport default ToCSSVisitor;\n","import Visitor from './visitor';\nimport ImportVisitor from './import-visitor';\nimport MarkVisibleSelectorsVisitor from './set-tree-visibility-visitor';\nimport ExtendVisitor from './extend-visitor';\nimport JoinSelectorVisitor from './join-selector-visitor';\nimport ToCSSVisitor from './to-css-visitor';\n\nexport default {\n Visitor,\n ImportVisitor,\n MarkVisibleSelectorsVisitor,\n ExtendVisitor,\n JoinSelectorVisitor,\n ToCSSVisitor\n};\n","import chunker from './chunker';\n\nexport default () => {\n let // Less input string\n input;\n\n let // current chunk\n j;\n\n const // holds state for backtracking\n saveStack = [];\n\n let // furthest index the parser has gone to\n furthest;\n\n let // if this is furthest we got to, this is the probably cause\n furthestPossibleErrorMessage;\n\n let // chunkified input\n chunks;\n\n let // current chunk\n current;\n\n let // index of current chunk, in `input`\n currentPos;\n\n const parserInput = {};\n const CHARCODE_SPACE = 32;\n const CHARCODE_TAB = 9;\n const CHARCODE_LF = 10;\n const CHARCODE_CR = 13;\n const CHARCODE_PLUS = 43;\n const CHARCODE_COMMA = 44;\n const CHARCODE_FORWARD_SLASH = 47;\n const CHARCODE_9 = 57;\n\n function skipWhitespace(length) {\n const oldi = parserInput.i;\n const oldj = j;\n const curr = parserInput.i - currentPos;\n const endIndex = parserInput.i + current.length - curr;\n const mem = (parserInput.i += length);\n const inp = input;\n let c;\n let nextChar;\n let comment;\n\n for (; parserInput.i < endIndex; parserInput.i++) {\n c = inp.charCodeAt(parserInput.i);\n\n if (parserInput.autoCommentAbsorb && c === CHARCODE_FORWARD_SLASH) {\n nextChar = inp.charAt(parserInput.i + 1);\n if (nextChar === '/') {\n comment = {index: parserInput.i, isLineComment: true};\n let nextNewLine = inp.indexOf('\\n', parserInput.i + 2);\n if (nextNewLine < 0) {\n nextNewLine = endIndex;\n }\n parserInput.i = nextNewLine;\n comment.text = inp.substr(comment.index, parserInput.i - comment.index);\n parserInput.commentStore.push(comment);\n continue;\n } else if (nextChar === '*') {\n const nextStarSlash = inp.indexOf('*/', parserInput.i + 2);\n if (nextStarSlash >= 0) {\n comment = {\n index: parserInput.i,\n text: inp.substr(parserInput.i, nextStarSlash + 2 - parserInput.i),\n isLineComment: false\n };\n parserInput.i += comment.text.length - 1;\n parserInput.commentStore.push(comment);\n continue;\n }\n }\n break;\n }\n\n if ((c !== CHARCODE_SPACE) && (c !== CHARCODE_LF) && (c !== CHARCODE_TAB) && (c !== CHARCODE_CR)) {\n break;\n }\n }\n\n current = current.slice(length + parserInput.i - mem + curr);\n currentPos = parserInput.i;\n\n if (!current.length) {\n if (j < chunks.length - 1) {\n current = chunks[++j];\n skipWhitespace(0); // skip space at the beginning of a chunk\n return true; // things changed\n }\n parserInput.finished = true;\n }\n\n return oldi !== parserInput.i || oldj !== j;\n }\n\n parserInput.save = () => {\n currentPos = parserInput.i;\n saveStack.push( { current, i: parserInput.i, j });\n };\n parserInput.restore = possibleErrorMessage => {\n\n if (parserInput.i > furthest || (parserInput.i === furthest && possibleErrorMessage && !furthestPossibleErrorMessage)) {\n furthest = parserInput.i;\n furthestPossibleErrorMessage = possibleErrorMessage;\n }\n const state = saveStack.pop();\n current = state.current;\n currentPos = parserInput.i = state.i;\n j = state.j;\n };\n parserInput.forget = () => {\n saveStack.pop();\n };\n parserInput.isWhitespace = offset => {\n const pos = parserInput.i + (offset || 0);\n const code = input.charCodeAt(pos);\n return (code === CHARCODE_SPACE || code === CHARCODE_CR || code === CHARCODE_TAB || code === CHARCODE_LF);\n };\n\n // Specialization of $(tok)\n parserInput.$re = tok => {\n if (parserInput.i > currentPos) {\n current = current.slice(parserInput.i - currentPos);\n currentPos = parserInput.i;\n }\n\n const m = tok.exec(current);\n if (!m) {\n return null;\n }\n\n skipWhitespace(m[0].length);\n if (typeof m === 'string') {\n return m;\n }\n\n return m.length === 1 ? m[0] : m;\n };\n\n parserInput.$char = tok => {\n if (input.charAt(parserInput.i) !== tok) {\n return null;\n }\n skipWhitespace(1);\n return tok;\n };\n\n parserInput.$str = tok => {\n const tokLength = tok.length;\n\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tokLength; i++) {\n if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n return null;\n }\n }\n\n skipWhitespace(tokLength);\n return tok;\n };\n\n parserInput.$quoted = loc => {\n const pos = loc || parserInput.i;\n const startChar = input.charAt(pos);\n\n if (startChar !== '\\'' && startChar !== '\"') {\n return;\n }\n const length = input.length;\n const currentPosition = pos;\n\n for (let i = 1; i + currentPosition < length; i++) {\n const nextChar = input.charAt(i + currentPosition);\n switch (nextChar) {\n case '\\\\':\n i++;\n continue;\n case '\\r':\n case '\\n':\n break;\n case startChar:\n const str = input.substr(currentPosition, i + 1);\n if (!loc && loc !== 0) {\n skipWhitespace(i + 1);\n return str\n }\n return [startChar, str];\n default:\n }\n }\n return null;\n };\n\n /**\n * Permissive parsing. Ignores everything except matching {} [] () and quotes\n * until matching token (outside of blocks)\n */\n parserInput.$parseUntil = tok => {\n let quote = '';\n let returnVal = null;\n let inComment = false;\n let blockDepth = 0;\n const blockStack = [];\n const parseGroups = [];\n const length = input.length;\n const startPos = parserInput.i;\n let lastPos = parserInput.i;\n let i = parserInput.i;\n let loop = true;\n let testChar;\n\n if (typeof tok === 'string') {\n testChar = char => char === tok\n } else {\n testChar = char => tok.test(char)\n }\n\n do {\n let prevChar;\n let nextChar = input.charAt(i);\n if (blockDepth === 0 && testChar(nextChar)) {\n returnVal = input.substr(lastPos, i - lastPos);\n if (returnVal) {\n parseGroups.push(returnVal);\n }\n else {\n parseGroups.push(' ');\n }\n returnVal = parseGroups;\n skipWhitespace(i - startPos);\n loop = false\n } else {\n if (inComment) {\n if (nextChar === '*' && \n input.charAt(i + 1) === '/') {\n i++;\n blockDepth--;\n inComment = false;\n }\n i++;\n continue;\n }\n switch (nextChar) {\n case '\\\\':\n i++;\n nextChar = input.charAt(i);\n parseGroups.push(input.substr(lastPos, i - lastPos + 1));\n lastPos = i + 1;\n break;\n case '/':\n if (input.charAt(i + 1) === '*') {\n i++;\n inComment = true;\n blockDepth++;\n }\n break;\n case '\\'':\n case '\"':\n quote = parserInput.$quoted(i);\n if (quote) {\n parseGroups.push(input.substr(lastPos, i - lastPos), quote);\n i += quote[1].length - 1;\n lastPos = i + 1;\n }\n else {\n skipWhitespace(i - startPos);\n returnVal = nextChar;\n loop = false;\n }\n break;\n case '{':\n blockStack.push('}');\n blockDepth++;\n break;\n case '(':\n blockStack.push(')');\n blockDepth++;\n break;\n case '[':\n blockStack.push(']');\n blockDepth++;\n break;\n case '}':\n case ')':\n case ']':\n const expected = blockStack.pop();\n if (nextChar === expected) {\n blockDepth--;\n } else {\n // move the parser to the error and return expected\n skipWhitespace(i - startPos);\n returnVal = expected;\n loop = false;\n }\n }\n i++;\n if (i > length) {\n loop = false;\n }\n }\n prevChar = nextChar;\n } while (loop);\n\n return returnVal ? returnVal : null;\n }\n\n parserInput.autoCommentAbsorb = true;\n parserInput.commentStore = [];\n parserInput.finished = false;\n\n // Same as $(), but don't change the state of the parser,\n // just return the match.\n parserInput.peek = tok => {\n if (typeof tok === 'string') {\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tok.length; i++) {\n if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n return false;\n }\n }\n return true;\n } else {\n return tok.test(current);\n }\n };\n\n // Specialization of peek()\n // TODO remove or change some currentChar calls to peekChar\n parserInput.peekChar = tok => input.charAt(parserInput.i) === tok;\n\n parserInput.currentChar = () => input.charAt(parserInput.i);\n\n parserInput.prevChar = () => input.charAt(parserInput.i - 1);\n\n parserInput.getInput = () => input;\n\n parserInput.peekNotNumeric = () => {\n const c = input.charCodeAt(parserInput.i);\n // Is the first char of the dimension 0-9, '.', '+' or '-'\n return (c > CHARCODE_9 || c < CHARCODE_PLUS) || c === CHARCODE_FORWARD_SLASH || c === CHARCODE_COMMA;\n };\n\n parserInput.start = (str, chunkInput, failFunction) => {\n input = str;\n parserInput.i = j = currentPos = furthest = 0;\n\n // chunking apparently makes things quicker (but my tests indicate\n // it might actually make things slower in node at least)\n // and it is a non-perfect parse - it can't recognise\n // unquoted urls, meaning it can't distinguish comments\n // meaning comments with quotes or {}() in them get 'counted'\n // and then lead to parse errors.\n // In addition if the chunking chunks in the wrong place we might\n // not be able to parse a parser statement in one go\n // this is officially deprecated but can be switched on via an option\n // in the case it causes too much performance issues.\n if (chunkInput) {\n chunks = chunker(str, failFunction);\n } else {\n chunks = [str];\n }\n\n current = chunks[0];\n\n skipWhitespace(0);\n };\n\n parserInput.end = () => {\n let message;\n const isFinished = parserInput.i >= input.length;\n\n if (parserInput.i < furthest) {\n message = furthestPossibleErrorMessage;\n parserInput.i = furthest;\n }\n return {\n isFinished,\n furthest: parserInput.i,\n furthestPossibleErrorMessage: message,\n furthestReachedEnd: parserInput.i >= input.length - 1,\n furthestChar: input[parserInput.i]\n };\n };\n\n return parserInput;\n};\n","// Split the input into chunks.\nexport default function (input, fail) {\n const len = input.length;\n let level = 0;\n let parenLevel = 0;\n let lastOpening;\n let lastOpeningParen;\n let lastMultiComment;\n let lastMultiCommentEndBrace;\n const chunks = [];\n let emitFrom = 0;\n let chunkerCurrentIndex;\n let currentChunkStartIndex;\n let cc;\n let cc2;\n let matched;\n\n function emitChunk(force) {\n const len = chunkerCurrentIndex - emitFrom;\n if (((len < 512) && !force) || !len) {\n return;\n }\n chunks.push(input.slice(emitFrom, chunkerCurrentIndex + 1));\n emitFrom = chunkerCurrentIndex + 1;\n }\n\n for (chunkerCurrentIndex = 0; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc = input.charCodeAt(chunkerCurrentIndex);\n if (((cc >= 97) && (cc <= 122)) || (cc < 34)) {\n // a-z or whitespace\n continue;\n }\n\n switch (cc) {\n case 40: // (\n parenLevel++;\n lastOpeningParen = chunkerCurrentIndex;\n continue;\n case 41: // )\n if (--parenLevel < 0) {\n return fail('missing opening `(`', chunkerCurrentIndex);\n }\n continue;\n case 59: // ;\n if (!parenLevel) { emitChunk(); }\n continue;\n case 123: // {\n level++;\n lastOpening = chunkerCurrentIndex;\n continue;\n case 125: // }\n if (--level < 0) {\n return fail('missing opening `{`', chunkerCurrentIndex);\n }\n if (!level && !parenLevel) { emitChunk(); }\n continue;\n case 92: // \\\n if (chunkerCurrentIndex < len - 1) { chunkerCurrentIndex++; continue; }\n return fail('unescaped `\\\\`', chunkerCurrentIndex);\n case 34:\n case 39:\n case 96: // \", ' and `\n matched = 0;\n currentChunkStartIndex = chunkerCurrentIndex;\n for (chunkerCurrentIndex = chunkerCurrentIndex + 1; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if (cc2 > 96) { continue; }\n if (cc2 == cc) { matched = 1; break; }\n if (cc2 == 92) { // \\\n if (chunkerCurrentIndex == len - 1) {\n return fail('unescaped `\\\\`', chunkerCurrentIndex);\n }\n chunkerCurrentIndex++;\n }\n }\n if (matched) { continue; }\n return fail(`unmatched \\`${String.fromCharCode(cc)}\\``, currentChunkStartIndex);\n case 47: // /, check for comment\n if (parenLevel || (chunkerCurrentIndex == len - 1)) { continue; }\n cc2 = input.charCodeAt(chunkerCurrentIndex + 1);\n if (cc2 == 47) {\n // //, find lnfeed\n for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if ((cc2 <= 13) && ((cc2 == 10) || (cc2 == 13))) { break; }\n }\n } else if (cc2 == 42) {\n // /*, find */\n lastMultiComment = currentChunkStartIndex = chunkerCurrentIndex;\n for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len - 1; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if (cc2 == 125) { lastMultiCommentEndBrace = chunkerCurrentIndex; }\n if (cc2 != 42) { continue; }\n if (input.charCodeAt(chunkerCurrentIndex + 1) == 47) { break; }\n }\n if (chunkerCurrentIndex == len - 1) {\n return fail('missing closing `*/`', currentChunkStartIndex);\n }\n chunkerCurrentIndex++;\n }\n continue;\n case 42: // *, check for unmatched */\n if ((chunkerCurrentIndex < len - 1) && (input.charCodeAt(chunkerCurrentIndex + 1) == 47)) {\n return fail('unmatched `/*`', chunkerCurrentIndex);\n }\n continue;\n }\n }\n\n if (level !== 0) {\n if ((lastMultiComment > lastOpening) && (lastMultiCommentEndBrace > lastMultiComment)) {\n return fail('missing closing `}` or `*/`', lastOpening);\n } else {\n return fail('missing closing `}`', lastOpening);\n }\n } else if (parenLevel !== 0) {\n return fail('missing closing `)`', lastOpeningParen);\n }\n\n emitChunk(true);\n return chunks;\n};\n","import LessError from '../less-error';\nimport tree from '../tree';\nimport visitors from '../visitors';\nimport getParserInput from './parser-input';\nimport * as utils from '../utils';\nimport functionRegistry from '../functions/function-registry';\n\n//\n// less.js - parser\n//\n// A relatively straight-forward predictive parser.\n// There is no tokenization/lexing stage, the input is parsed\n// in one sweep.\n//\n// To make the parser fast enough to run in the browser, several\n// optimization had to be made:\n//\n// - Matching and slicing on a huge input is often cause of slowdowns.\n// The solution is to chunkify the input into smaller strings.\n// The chunks are stored in the `chunks` var,\n// `j` holds the current chunk index, and `currentPos` holds\n// the index of the current chunk in relation to `input`.\n// This gives us an almost 4x speed-up.\n//\n// - In many cases, we don't need to match individual tokens;\n// for example, if a value doesn't hold any variables, operations\n// or dynamic references, the parser can effectively 'skip' it,\n// treating it as a literal.\n// An example would be '1px solid #000' - which evaluates to itself,\n// we don't need to know what the individual components are.\n// The drawback, of course is that you don't get the benefits of\n// syntax-checking on the CSS. This gives us a 50% speed-up in the parser,\n// and a smaller speed-up in the code-gen.\n//\n//\n// Token matching is done with the `$` function, which either takes\n// a terminal string or regexp, or a non-terminal function to call.\n// It also takes care of moving all the indices forwards.\n//\n\nconst Parser = function Parser(context, imports, fileInfo) {\n let parsers;\n const parserInput = getParserInput();\n\n function error(msg, type) {\n throw new LessError(\n {\n index: parserInput.i,\n filename: fileInfo.filename,\n type: type || 'Syntax',\n message: msg\n },\n imports\n );\n }\n\n function expect(arg, msg) {\n // some older browsers return typeof 'function' for RegExp\n const result = (arg instanceof Function) ? arg.call(parsers) : parserInput.$re(arg);\n if (result) {\n return result;\n }\n \n error(msg || (typeof arg === 'string'\n ? `expected '${arg}' got '${parserInput.currentChar()}'`\n : 'unexpected token'));\n }\n\n // Specialization of expect()\n function expectChar(arg, msg) {\n if (parserInput.$char(arg)) {\n return arg;\n }\n error(msg || `expected '${arg}' got '${parserInput.currentChar()}'`);\n }\n\n function getDebugInfo(index) {\n const filename = fileInfo.filename;\n\n return {\n lineNumber: utils.getLocation(index, parserInput.getInput()).line + 1,\n fileName: filename\n };\n }\n\n /**\n * Used after initial parsing to create nodes on the fly\n * \n * @param {String} str - string to parse \n * @param {Array} parseList - array of parsers to run input through e.g. [\"value\", \"important\"]\n * @param {Number} currentIndex - start number to begin indexing\n * @param {Object} fileInfo - fileInfo to attach to created nodes\n */\n function parseNode(str, parseList, currentIndex, fileInfo, callback) {\n let result;\n const returnNodes = [];\n const parser = parserInput;\n\n try {\n parser.start(str, false, function fail(msg, index) {\n callback({\n message: msg,\n index: index + currentIndex\n });\n });\n for (let x = 0, p, i; (p = parseList[x]); x++) {\n i = parser.i;\n result = parsers[p]();\n if (result) {\n try {\n result._index = i + currentIndex;\n result._fileInfo = fileInfo;\n } catch (e) {}\n returnNodes.push(result);\n }\n else {\n returnNodes.push(null);\n }\n }\n\n const endInfo = parser.end();\n if (endInfo.isFinished) {\n callback(null, returnNodes);\n }\n else {\n callback(true, null);\n }\n } catch (e) {\n throw new LessError({\n index: e.index + currentIndex,\n message: e.message\n }, imports, fileInfo.filename);\n }\n }\n\n //\n // The Parser\n //\n return {\n parserInput,\n imports,\n fileInfo,\n parseNode,\n //\n // Parse an input string into an abstract syntax tree,\n // @param str A string containing 'less' markup\n // @param callback call `callback` when done.\n // @param [additionalData] An optional map which can contains vars - a map (key, value) of variables to apply\n //\n parse: function (str, callback, additionalData) {\n let root;\n let error = null;\n let globalVars;\n let modifyVars;\n let ignored;\n let preText = '';\n\n globalVars = (additionalData && additionalData.globalVars) ? `${Parser.serializeVars(additionalData.globalVars)}\\n` : '';\n modifyVars = (additionalData && additionalData.modifyVars) ? `\\n${Parser.serializeVars(additionalData.modifyVars)}` : '';\n\n if (context.pluginManager) {\n const preProcessors = context.pluginManager.getPreProcessors();\n for (let i = 0; i < preProcessors.length; i++) {\n str = preProcessors[i].process(str, { context, imports, fileInfo });\n }\n }\n\n if (globalVars || (additionalData && additionalData.banner)) {\n preText = ((additionalData && additionalData.banner) ? additionalData.banner : '') + globalVars;\n ignored = imports.contentsIgnoredChars;\n ignored[fileInfo.filename] = ignored[fileInfo.filename] || 0;\n ignored[fileInfo.filename] += preText.length;\n }\n\n str = str.replace(/\\r\\n?/g, '\\n');\n // Remove potential UTF Byte Order Mark\n str = preText + str.replace(/^\\uFEFF/, '') + modifyVars;\n imports.contents[fileInfo.filename] = str;\n\n // Start with the primary rule.\n // The whole syntax tree is held under a Ruleset node,\n // with the `root` property set to true, so no `{}` are\n // output. The callback is called when the input is parsed.\n try {\n parserInput.start(str, context.chunkInput, function fail(msg, index) {\n throw new LessError({\n index,\n type: 'Parse',\n message: msg,\n filename: fileInfo.filename\n }, imports);\n });\n\n tree.Node.prototype.parse = this;\n root = new tree.Ruleset(null, this.parsers.primary());\n tree.Node.prototype.rootNode = root;\n root.root = true;\n root.firstRoot = true;\n root.functionRegistry = functionRegistry.inherit();\n \n } catch (e) {\n return callback(new LessError(e, imports, fileInfo.filename));\n }\n\n // If `i` is smaller than the `input.length - 1`,\n // it means the parser wasn't able to parse the whole\n // string, so we've got a parsing error.\n //\n // We try to extract a \\n delimited string,\n // showing the line where the parse error occurred.\n // We split it up into two parts (the part which parsed,\n // and the part which didn't), so we can color them differently.\n const endInfo = parserInput.end();\n if (!endInfo.isFinished) {\n\n let message = endInfo.furthestPossibleErrorMessage;\n\n if (!message) {\n message = 'Unrecognised input';\n if (endInfo.furthestChar === '}') {\n message += '. Possibly missing opening \\'{\\'';\n } else if (endInfo.furthestChar === ')') {\n message += '. Possibly missing opening \\'(\\'';\n } else if (endInfo.furthestReachedEnd) {\n message += '. Possibly missing something';\n }\n }\n\n error = new LessError({\n type: 'Parse',\n message,\n index: endInfo.furthest,\n filename: fileInfo.filename\n }, imports);\n }\n\n const finish = e => {\n e = error || e || imports.error;\n\n if (e) {\n if (!(e instanceof LessError)) {\n e = new LessError(e, imports, fileInfo.filename);\n }\n\n return callback(e);\n }\n else {\n return callback(null, root);\n }\n };\n\n if (context.processImports !== false) {\n new visitors.ImportVisitor(imports, finish)\n .run(root);\n } else {\n return finish();\n }\n },\n\n //\n // Here in, the parsing rules/functions\n //\n // The basic structure of the syntax tree generated is as follows:\n //\n // Ruleset -> Declaration -> Value -> Expression -> Entity\n //\n // Here's some Less code:\n //\n // .class {\n // color: #fff;\n // border: 1px solid #000;\n // width: @w + 4px;\n // > .child {...}\n // }\n //\n // And here's what the parse tree might look like:\n //\n // Ruleset (Selector '.class', [\n // Declaration (\"color\", Value ([Expression [Color #fff]]))\n // Declaration (\"border\", Value ([Expression [Dimension 1px][Keyword \"solid\"][Color #000]]))\n // Declaration (\"width\", Value ([Expression [Operation \" + \" [Variable \"@w\"][Dimension 4px]]]))\n // Ruleset (Selector [Element '>', '.child'], [...])\n // ])\n //\n // In general, most rules will try to parse a token with the `$re()` function, and if the return\n // value is truly, will return a new node, of the relevant type. Sometimes, we need to check\n // first, before parsing, that's when we use `peek()`.\n //\n parsers: parsers = {\n //\n // The `primary` rule is the *entry* and *exit* point of the parser.\n // The rules here can appear at any level of the parse tree.\n //\n // The recursive nature of the grammar is an interplay between the `block`\n // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule,\n // as represented by this simplified grammar:\n //\n // primary → (ruleset | declaration)+\n // ruleset → selector+ block\n // block → '{' primary '}'\n //\n // Only at one point is the primary rule not called from the\n // block rule: at the root level.\n //\n primary: function () {\n const mixin = this.mixin;\n let root = [];\n let node;\n\n while (true) {\n while (true) {\n node = this.comment();\n if (!node) { break; }\n root.push(node);\n }\n // always process comments before deciding if finished\n if (parserInput.finished) {\n break;\n }\n if (parserInput.peek('}')) {\n break;\n }\n\n node = this.extendRule();\n if (node) {\n root = root.concat(node);\n continue;\n }\n\n node = mixin.definition() || this.declaration() || mixin.call(false, false) || \n this.ruleset() || this.variableCall() || this.entities.call() || this.atrule();\n if (node) {\n root.push(node);\n } else {\n let foundSemiColon = false;\n while (parserInput.$char(';')) {\n foundSemiColon = true;\n }\n if (!foundSemiColon) {\n break;\n }\n }\n }\n\n return root;\n },\n\n // comments are collected by the main parsing mechanism and then assigned to nodes\n // where the current structure allows it\n comment: function () {\n if (parserInput.commentStore.length) {\n const comment = parserInput.commentStore.shift();\n return new(tree.Comment)(comment.text, comment.isLineComment, comment.index, fileInfo);\n }\n },\n\n //\n // Entities are tokens which can be found inside an Expression\n //\n entities: {\n mixinLookup: function() {\n return parsers.mixin.call(true, true);\n },\n //\n // A string, which supports escaping \" and '\n //\n // \"milky way\" 'he\\'s the one!'\n //\n quoted: function (forceEscaped) {\n let str;\n const index = parserInput.i;\n let isEscaped = false;\n\n parserInput.save();\n if (parserInput.$char('~')) {\n isEscaped = true;\n } else if (forceEscaped) {\n parserInput.restore();\n return;\n }\n\n str = parserInput.$quoted();\n if (!str) {\n parserInput.restore();\n return;\n }\n parserInput.forget();\n\n return new(tree.Quoted)(str.charAt(0), str.substr(1, str.length - 2), isEscaped, index, fileInfo);\n },\n\n //\n // A catch-all word, such as:\n //\n // black border-collapse\n //\n keyword: function () {\n const k = parserInput.$char('%') || parserInput.$re(/^\\[?(?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+\\]?/);\n if (k) {\n return tree.Color.fromKeyword(k) || new(tree.Keyword)(k);\n }\n },\n\n //\n // A function call\n //\n // rgb(255, 0, 255)\n //\n // The arguments are parsed with the `entities.arguments` parser.\n //\n call: function () {\n let name;\n let args;\n let func;\n const index = parserInput.i;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (parserInput.peek(/^url\\(/i)) {\n return;\n }\n\n parserInput.save();\n\n name = parserInput.$re(/^([\\w-]+|%|~|progid:[\\w\\.]+)\\(/);\n if (!name) {\n parserInput.forget(); \n return;\n }\n\n name = name[1];\n func = this.customFuncCall(name);\n if (func) {\n args = func.parse();\n if (args && func.stop) {\n parserInput.forget();\n return args;\n }\n }\n\n args = this.arguments(args);\n\n if (!parserInput.$char(')')) {\n parserInput.restore('Could not parse call arguments or missing \\')\\'');\n return;\n }\n\n parserInput.forget();\n\n return new(tree.Call)(name, args, index, fileInfo);\n },\n \n //\n // Parsing rules for functions with non-standard args, e.g.:\n //\n // boolean(not(2 > 1))\n //\n // This is a quick prototype, to be modified/improved when\n // more custom-parsed funcs come (e.g. `selector(...)`)\n //\n\n customFuncCall: function (name) {\n /* Ideally the table is to be moved out of here for faster perf.,\n but it's quite tricky since it relies on all these `parsers`\n and `expect` available only here */\n return {\n alpha: f(parsers.ieAlpha, true),\n boolean: f(condition),\n 'if': f(condition)\n }[name.toLowerCase()];\n\n function f(parse, stop) {\n return {\n parse, // parsing function\n stop // when true - stop after parse() and return its result, \n // otherwise continue for plain args\n };\n }\n \n function condition() {\n return [expect(parsers.condition, 'expected condition')];\n }\n },\n\n arguments: function (prevArgs) {\n let argsComma = prevArgs || [];\n const argsSemiColon = [];\n let isSemiColonSeparated;\n let value;\n\n parserInput.save();\n\n while (true) {\n if (prevArgs) {\n prevArgs = false;\n } else {\n value = parsers.detachedRuleset() || this.assignment() || parsers.expression();\n if (!value) {\n break;\n }\n\n if (value.value && value.value.length == 1) {\n value = value.value[0];\n }\n\n argsComma.push(value);\n }\n\n if (parserInput.$char(',')) {\n continue;\n }\n\n if (parserInput.$char(';') || isSemiColonSeparated) {\n isSemiColonSeparated = true;\n value = (argsComma.length < 1) ? argsComma[0]\n : new tree.Value(argsComma);\n argsSemiColon.push(value);\n argsComma = [];\n }\n }\n\n parserInput.forget();\n return isSemiColonSeparated ? argsSemiColon : argsComma;\n },\n literal: function () {\n return this.dimension() ||\n this.color() ||\n this.quoted() ||\n this.unicodeDescriptor();\n },\n\n // Assignments are argument entities for calls.\n // They are present in ie filter properties as shown below.\n //\n // filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* )\n //\n\n assignment: function () {\n let key;\n let value;\n parserInput.save();\n key = parserInput.$re(/^\\w+(?=\\s?=)/i);\n if (!key) {\n parserInput.restore();\n return;\n }\n if (!parserInput.$char('=')) {\n parserInput.restore();\n return;\n }\n value = parsers.entity();\n if (value) {\n parserInput.forget();\n return new(tree.Assignment)(key, value);\n } else {\n parserInput.restore();\n }\n },\n\n //\n // Parse url() tokens\n //\n // We use a specific rule for urls, because they don't really behave like\n // standard function calls. The difference is that the argument doesn't have\n // to be enclosed within a string, so it can't be parsed as an Expression.\n //\n url: function () {\n let value;\n const index = parserInput.i;\n\n parserInput.autoCommentAbsorb = false;\n\n if (!parserInput.$str('url(')) {\n parserInput.autoCommentAbsorb = true;\n return;\n }\n\n value = this.quoted() || this.variable() || this.property() ||\n parserInput.$re(/^(?:(?:\\\\[\\(\\)'\"])|[^\\(\\)'\"])+/) || '';\n\n parserInput.autoCommentAbsorb = true;\n\n expectChar(')');\n\n return new(tree.URL)((value.value != null || \n value instanceof tree.Variable || \n value instanceof tree.Property) ?\n value : new(tree.Anonymous)(value, index), index, fileInfo);\n },\n\n //\n // A Variable entity, such as `@fink`, in\n //\n // width: @fink + 2px\n //\n // We use a different parser for variable definitions,\n // see `parsers.variable`.\n //\n variable: function () {\n let ch;\n let name;\n const index = parserInput.i;\n\n parserInput.save();\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^@@?[\\w-]+/))) {\n ch = parserInput.currentChar();\n if (ch === '(' || ch === '[' && !parserInput.prevChar().match(/^\\s/)) {\n // this may be a VariableCall lookup\n const result = parsers.variableCall(name);\n if (result) {\n parserInput.forget();\n return result;\n }\n }\n parserInput.forget();\n return new(tree.Variable)(name, index, fileInfo);\n }\n parserInput.restore();\n },\n\n // A variable entity using the protective {} e.g. @{var}\n variableCurly: function () {\n let curly;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '@' && (curly = parserInput.$re(/^@\\{([\\w-]+)\\}/))) {\n return new(tree.Variable)(`@${curly[1]}`, index, fileInfo);\n }\n },\n //\n // A Property accessor, such as `$color`, in\n //\n // background-color: $color\n //\n property: function () {\n let name;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' && (name = parserInput.$re(/^\\$[\\w-]+/))) {\n return new(tree.Property)(name, index, fileInfo);\n }\n },\n\n // A property entity useing the protective {} e.g. ${prop}\n propertyCurly: function () {\n let curly;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' && (curly = parserInput.$re(/^\\$\\{([\\w-]+)\\}/))) {\n return new(tree.Property)(`$${curly[1]}`, index, fileInfo);\n }\n },\n //\n // A Hexadecimal color\n //\n // #4F3C2F\n //\n // `rgb` and `hsl` colors are parsed through the `entities.call` parser.\n //\n color: function () {\n let rgb;\n parserInput.save();\n\n if (parserInput.currentChar() === '#' && (rgb = parserInput.$re(/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})([\\w.#\\[])?/))) {\n if (!rgb[2]) {\n parserInput.forget();\n return new(tree.Color)(rgb[1], undefined, rgb[0]);\n } \n }\n parserInput.restore();\n },\n\n colorKeyword: function () {\n parserInput.save();\n const autoCommentAbsorb = parserInput.autoCommentAbsorb;\n parserInput.autoCommentAbsorb = false;\n const k = parserInput.$re(/^[_A-Za-z-][_A-Za-z0-9-]+/);\n parserInput.autoCommentAbsorb = autoCommentAbsorb;\n if (!k) {\n parserInput.forget();\n return;\n }\n parserInput.restore();\n const color = tree.Color.fromKeyword(k);\n if (color) {\n parserInput.$str(k);\n return color;\n }\n },\n\n //\n // A Dimension, that is, a number and a unit\n //\n // 0.5em 95%\n //\n dimension: function () {\n if (parserInput.peekNotNumeric()) {\n return;\n }\n\n const value = parserInput.$re(/^([+-]?\\d*\\.?\\d+)(%|[a-z_]+)?/i);\n if (value) {\n return new(tree.Dimension)(value[1], value[2]);\n }\n },\n\n //\n // A unicode descriptor, as is used in unicode-range\n //\n // U+0?? or U+00A1-00A9\n //\n unicodeDescriptor: function () {\n let ud;\n\n ud = parserInput.$re(/^U\\+[0-9a-fA-F?]+(\\-[0-9a-fA-F?]+)?/);\n if (ud) {\n return new(tree.UnicodeDescriptor)(ud[0]);\n }\n },\n\n //\n // JavaScript code to be evaluated\n //\n // `window.location.href`\n //\n javascript: function () {\n let js;\n const index = parserInput.i;\n\n parserInput.save();\n\n const escape = parserInput.$char('~');\n const jsQuote = parserInput.$char('`');\n\n if (!jsQuote) {\n parserInput.restore();\n return;\n }\n\n js = parserInput.$re(/^[^`]*`/);\n if (js) {\n parserInput.forget();\n return new(tree.JavaScript)(js.substr(0, js.length - 1), Boolean(escape), index, fileInfo);\n }\n parserInput.restore('invalid javascript definition');\n }\n },\n\n //\n // The variable part of a variable definition. Used in the `rule` parser\n //\n // @fink:\n //\n variable: function () {\n let name;\n\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^(@[\\w-]+)\\s*:/))) { return name[1]; }\n },\n\n //\n // Call a variable value to retrieve a detached ruleset\n // or a value from a detached ruleset's rules.\n //\n // @fink();\n // @fink;\n // color: @fink[@color];\n //\n variableCall: function (parsedName) {\n let lookups;\n const i = parserInput.i;\n const inValue = !!parsedName;\n let name = parsedName;\n\n parserInput.save();\n\n if (name || (parserInput.currentChar() === '@'\n && (name = parserInput.$re(/^(@[\\w-]+)(\\(\\s*\\))?/)))) {\n\n lookups = this.mixin.ruleLookups();\n\n if (!lookups && ((inValue && parserInput.$str('()') !== '()') || (name[2] !== '()'))) {\n parserInput.restore('Missing \\'[...]\\' lookup in variable call');\n return;\n }\n\n if (!inValue) {\n name = name[1];\n }\n\n const call = new tree.VariableCall(name, i, fileInfo);\n if (!inValue && parsers.end()) {\n parserInput.forget();\n return call;\n }\n else {\n parserInput.forget();\n return new tree.NamespaceValue(call, lookups, i, fileInfo);\n }\n }\n\n parserInput.restore();\n },\n\n //\n // extend syntax - used to extend selectors\n //\n extend: function(isRule) {\n let elements;\n let e;\n const index = parserInput.i;\n let option;\n let extendList;\n let extend;\n\n if (!parserInput.$str(isRule ? '&:extend(' : ':extend(')) {\n return;\n }\n\n do {\n option = null;\n elements = null;\n while (!(option = parserInput.$re(/^(all)(?=\\s*(\\)|,))/))) {\n e = this.element();\n if (!e) {\n break;\n }\n if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n }\n\n option = option && option[1];\n if (!elements) {\n error('Missing target selector for :extend().');\n }\n extend = new(tree.Extend)(new(tree.Selector)(elements), option, index, fileInfo);\n if (extendList) {\n extendList.push(extend);\n } else {\n extendList = [ extend ];\n }\n } while (parserInput.$char(','));\n\n expect(/^\\)/);\n\n if (isRule) {\n expect(/^;/);\n }\n\n return extendList;\n },\n\n //\n // extendRule - used in a rule to extend all the parent selectors\n //\n extendRule: function() {\n return this.extend(true);\n },\n\n //\n // Mixins\n //\n mixin: {\n //\n // A Mixin call, with an optional argument list\n //\n // #mixins > .square(#fff);\n // #mixins.square(#fff);\n // .rounded(4px, black);\n // .button;\n //\n // We can lookup / return a value using the lookup syntax:\n //\n // color: #mixin.square(#fff)[@color];\n //\n // The `while` loop is there because mixins can be\n // namespaced, but we only support the child and descendant\n // selector for now.\n //\n call: function (inValue, getLookup) {\n const s = parserInput.currentChar();\n let important = false;\n let lookups;\n const index = parserInput.i;\n let elements;\n let args;\n let hasParens;\n\n if (s !== '.' && s !== '#') { return; }\n\n parserInput.save(); // stop us absorbing part of an invalid selector\n\n elements = this.elements();\n\n if (elements) {\n if (parserInput.$char('(')) {\n args = this.args(true).args;\n expectChar(')');\n hasParens = true;\n }\n\n if (getLookup !== false) {\n lookups = this.ruleLookups();\n }\n if (getLookup === true && !lookups) {\n parserInput.restore();\n return;\n }\n\n if (!lookups && !hasParens) {\n // This isn't a valid mixin call\n parserInput.restore('Unrecognized input. Possibly missing \\'(\\' in mixin call.');\n return;\n }\n\n if (!inValue && parsers.important()) {\n important = true;\n }\n\n if (inValue || parsers.end()) {\n parserInput.forget();\n const mixin = new(tree.mixin.Call)(elements, args, index, fileInfo, !lookups && important);\n if (lookups) {\n return new tree.NamespaceValue(mixin, lookups);\n }\n else {\n return mixin;\n }\n }\n }\n\n parserInput.restore();\n },\n /**\n * Matching elements for mixins\n * (Start with . or # and can have > )\n */\n elements: function() {\n let elements;\n let e;\n let c;\n let elem;\n let elemIndex;\n const re = /^[#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/;\n while (true) {\n elemIndex = parserInput.i;\n e = parserInput.$re(re);\n \n if (!e) {\n break;\n }\n elem = new(tree.Element)(c, e, false, elemIndex, fileInfo);\n if (elements) {\n elements.push(elem);\n } else {\n elements = [ elem ];\n }\n c = parserInput.$char('>');\n }\n return elements;\n },\n args: function (isCall) {\n const entities = parsers.entities;\n const returner = { args:null, variadic: false };\n let expressions = [];\n const argsSemiColon = [];\n const argsComma = [];\n let isSemiColonSeparated;\n let expressionContainsNamed;\n let name;\n let nameLoop;\n let value;\n let arg;\n let expand;\n let hasSep = true;\n\n parserInput.save();\n\n while (true) {\n if (isCall) {\n arg = parsers.detachedRuleset() || parsers.expression();\n } else {\n parserInput.commentStore.length = 0;\n if (parserInput.$str('...')) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ variadic: true });\n break;\n }\n arg = entities.variable() || entities.property() || entities.literal() || entities.keyword() || this.call(true);\n }\n\n if (!arg || !hasSep) {\n break;\n }\n\n nameLoop = null;\n if (arg.throwAwayComments) {\n arg.throwAwayComments();\n }\n value = arg;\n let val = null;\n\n if (isCall) {\n // Variable\n if (arg.value && arg.value.length == 1) {\n val = arg.value[0];\n }\n } else {\n val = arg;\n }\n\n if (val && (val instanceof tree.Variable || val instanceof tree.Property)) {\n if (parserInput.$char(':')) {\n if (expressions.length > 0) {\n if (isSemiColonSeparated) {\n error('Cannot mix ; and , as delimiter types');\n }\n expressionContainsNamed = true;\n }\n\n value = parsers.detachedRuleset() || parsers.expression();\n\n if (!value) {\n if (isCall) {\n error('could not understand value for named argument');\n } else {\n parserInput.restore();\n returner.args = [];\n return returner;\n }\n }\n nameLoop = (name = val.name);\n } else if (parserInput.$str('...')) {\n if (!isCall) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ name: arg.name, variadic: true });\n break;\n } else {\n expand = true;\n }\n } else if (!isCall) {\n name = nameLoop = val.name;\n value = null;\n }\n }\n\n if (value) {\n expressions.push(value);\n }\n\n argsComma.push({ name:nameLoop, value, expand });\n\n if (parserInput.$char(',')) {\n hasSep = true;\n continue;\n }\n hasSep = parserInput.$char(';') === ';';\n\n if (hasSep || isSemiColonSeparated) {\n\n if (expressionContainsNamed) {\n error('Cannot mix ; and , as delimiter types');\n }\n\n isSemiColonSeparated = true;\n\n if (expressions.length > 1) {\n value = new(tree.Value)(expressions);\n }\n argsSemiColon.push({ name, value, expand });\n\n name = null;\n expressions = [];\n expressionContainsNamed = false;\n }\n }\n\n parserInput.forget();\n returner.args = isSemiColonSeparated ? argsSemiColon : argsComma;\n return returner;\n },\n //\n // A Mixin definition, with a list of parameters\n //\n // .rounded (@radius: 2px, @color) {\n // ...\n // }\n //\n // Until we have a finer grained state-machine, we have to\n // do a look-ahead, to make sure we don't have a mixin call.\n // See the `rule` function for more information.\n //\n // We start by matching `.rounded (`, and then proceed on to\n // the argument list, which has optional default values.\n // We store the parameters in `params`, with a `value` key,\n // if there is a value, such as in the case of `@radius`.\n //\n // Once we've got our params list, and a closing `)`, we parse\n // the `{...}` block.\n //\n definition: function () {\n let name;\n let params = [];\n let match;\n let ruleset;\n let cond;\n let variadic = false;\n if ((parserInput.currentChar() !== '.' && parserInput.currentChar() !== '#') ||\n parserInput.peek(/^[^{]*\\}/)) {\n return;\n }\n\n parserInput.save();\n\n match = parserInput.$re(/^([#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\\s*\\(/);\n if (match) {\n name = match[1];\n\n const argInfo = this.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n\n // .mixincall(\"@{a}\");\n // looks a bit like a mixin definition..\n // also\n // .mixincall(@a: {rule: set;});\n // so we have to be nice and restore\n if (!parserInput.$char(')')) {\n parserInput.restore('Missing closing \\')\\'');\n return;\n }\n\n parserInput.commentStore.length = 0;\n\n if (parserInput.$str('when')) { // Guard\n cond = expect(parsers.conditions, 'expected condition');\n }\n\n ruleset = parsers.block();\n\n if (ruleset) {\n parserInput.forget();\n return new(tree.mixin.Definition)(name, params, ruleset, cond, variadic);\n } else {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n }\n },\n \n ruleLookups: function() {\n let rule;\n let args;\n const lookups = [];\n\n if (parserInput.currentChar() !== '[') { \n return;\n }\n\n while (true) {\n parserInput.save();\n args = null;\n rule = this.lookupValue();\n if (!rule && rule !== '') {\n parserInput.restore();\n break;\n }\n lookups.push(rule);\n parserInput.forget();\n }\n if (lookups.length > 0) {\n return lookups;\n }\n },\n \n lookupValue: function() {\n parserInput.save();\n \n if (!parserInput.$char('[')) { \n parserInput.restore();\n return;\n }\n \n const name = parserInput.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);\n \n if (!parserInput.$char(']')) {\n parserInput.restore();\n return;\n } \n\n if (name || name === '') {\n parserInput.forget();\n return name;\n }\n \n parserInput.restore();\n }\n },\n //\n // Entities are the smallest recognized token,\n // and can be found inside a rule's value.\n //\n entity: function () {\n const entities = this.entities;\n\n return this.comment() || entities.literal() || entities.variable() || entities.url() ||\n entities.property() || entities.call() || entities.keyword() || this.mixin.call(true) ||\n entities.javascript();\n },\n\n //\n // A Declaration terminator. Note that we use `peek()` to check for '}',\n // because the `block` rule will be expecting it, but we still need to make sure\n // it's there, if ';' was omitted.\n //\n end: function () {\n return parserInput.$char(';') || parserInput.peek('}');\n },\n\n //\n // IE's alpha function\n //\n // alpha(opacity=88)\n //\n ieAlpha: function () {\n let value;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (!parserInput.$re(/^opacity=/i)) { return; }\n value = parserInput.$re(/^\\d+/);\n if (!value) {\n value = expect(parsers.entities.variable, 'Could not parse alpha');\n value = `@{${value.name.slice(1)}}`;\n }\n expectChar(')');\n return new tree.Quoted('', `alpha(opacity=${value})`);\n },\n\n //\n // A Selector Element\n //\n // div\n // + h1\n // #socks\n // input[type=\"text\"]\n //\n // Elements are the building blocks for Selectors,\n // they are made out of a `Combinator` (see combinator rule),\n // and an element name, such as a tag a class, or `*`.\n //\n element: function () {\n let e;\n let c;\n let v;\n const index = parserInput.i;\n\n c = this.combinator();\n\n e = parserInput.$re(/^(?:\\d+\\.\\d+|\\d+)%/) ||\n parserInput.$re(/^(?:[.#]?|:*)(?:[\\w-]|[^\\x00-\\x9f]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/) ||\n parserInput.$char('*') || parserInput.$char('&') || this.attribute() ||\n parserInput.$re(/^\\([^&()@]+\\)/) || parserInput.$re(/^[\\.#:](?=@)/) ||\n this.entities.variableCurly();\n\n if (!e) {\n parserInput.save();\n if (parserInput.$char('(')) {\n if ((v = this.selector(false)) && parserInput.$char(')')) {\n e = new(tree.Paren)(v);\n parserInput.forget();\n } else {\n parserInput.restore('Missing closing \\')\\'');\n }\n } else {\n parserInput.forget();\n }\n }\n\n if (e) { return new(tree.Element)(c, e, e instanceof tree.Variable, index, fileInfo); }\n },\n\n //\n // Combinators combine elements together, in a Selector.\n //\n // Because our parser isn't white-space sensitive, special care\n // has to be taken, when parsing the descendant combinator, ` `,\n // as it's an empty space. We have to check the previous character\n // in the input, to see if it's a ` ` character. More info on how\n // we deal with this in *combinator.js*.\n //\n combinator: function () {\n let c = parserInput.currentChar();\n\n if (c === '/') {\n parserInput.save();\n const slashedCombinator = parserInput.$re(/^\\/[a-z]+\\//i);\n if (slashedCombinator) {\n parserInput.forget();\n return new(tree.Combinator)(slashedCombinator);\n }\n parserInput.restore();\n }\n\n if (c === '>' || c === '+' || c === '~' || c === '|' || c === '^') {\n parserInput.i++;\n if (c === '^' && parserInput.currentChar() === '^') {\n c = '^^';\n parserInput.i++;\n }\n while (parserInput.isWhitespace()) { parserInput.i++; }\n return new(tree.Combinator)(c);\n } else if (parserInput.isWhitespace(-1)) {\n return new(tree.Combinator)(' ');\n } else {\n return new(tree.Combinator)(null);\n }\n },\n //\n // A CSS Selector\n // with less extensions e.g. the ability to extend and guard\n //\n // .class > div + h1\n // li a:hover\n //\n // Selectors are made out of one or more Elements, see above.\n //\n selector: function (isLess) {\n const index = parserInput.i;\n let elements;\n let extendList;\n let c;\n let e;\n let allExtends;\n let when;\n let condition;\n isLess = isLess !== false;\n while ((isLess && (extendList = this.extend())) || (isLess && (when = parserInput.$str('when'))) || (e = this.element())) {\n if (when) {\n condition = expect(this.conditions, 'expected condition');\n } else if (condition) {\n error('CSS guard can only be used at the end of selector');\n } else if (extendList) {\n if (allExtends) {\n allExtends = allExtends.concat(extendList);\n } else {\n allExtends = extendList;\n }\n } else {\n if (allExtends) { error('Extend can only be used at the end of selector'); }\n c = parserInput.currentChar();\n if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n e = null;\n }\n if (c === '{' || c === '}' || c === ';' || c === ',' || c === ')') {\n break;\n }\n }\n\n if (elements) { return new(tree.Selector)(elements, allExtends, condition, index, fileInfo); }\n if (allExtends) { error('Extend must be used to extend a selector, it cannot be used on its own'); }\n },\n selectors: function () {\n let s;\n let selectors;\n while (true) {\n s = this.selector();\n if (!s) {\n break;\n }\n if (selectors) {\n selectors.push(s);\n } else {\n selectors = [ s ];\n }\n parserInput.commentStore.length = 0;\n if (s.condition && selectors.length > 1) {\n error(\"Guards are only currently allowed on a single selector.\");\n }\n if (!parserInput.$char(',')) { break; }\n if (s.condition) {\n error(\"Guards are only currently allowed on a single selector.\");\n }\n parserInput.commentStore.length = 0;\n }\n return selectors;\n },\n attribute: function () {\n if (!parserInput.$char('[')) { return; }\n\n const entities = this.entities;\n let key;\n let val;\n let op;\n\n if (!(key = entities.variableCurly())) {\n key = expect(/^(?:[_A-Za-z0-9-\\*]*\\|)?(?:[_A-Za-z0-9-]|\\\\.)+/);\n }\n\n op = parserInput.$re(/^[|~*$^]?=/);\n if (op) {\n val = entities.quoted() || parserInput.$re(/^[0-9]+%/) || parserInput.$re(/^[\\w-]+/) || entities.variableCurly();\n }\n\n expectChar(']');\n\n return new(tree.Attribute)(key, op, val);\n },\n\n //\n // The `block` rule is used by `ruleset` and `mixin.definition`.\n // It's a wrapper around the `primary` rule, with added `{}`.\n //\n block: function () {\n let content;\n if (parserInput.$char('{') && (content = this.primary()) && parserInput.$char('}')) {\n return content;\n }\n },\n\n blockRuleset: function() {\n let block = this.block();\n\n if (block) {\n block = new tree.Ruleset(null, block);\n }\n return block;\n },\n\n detachedRuleset: function() {\n let argInfo;\n let params;\n let variadic;\n\n parserInput.save();\n if (parserInput.$re(/^[.#]\\(/)) {\n /**\n * DR args currently only implemented for each() function, and not \n * yet settable as `@dr: #(@arg) {}`\n * This should be done when DRs are merged with mixins.\n * See: https://github.com/less/less-meta/issues/16\n */\n argInfo = this.mixin.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n if (!parserInput.$char(')')) {\n parserInput.restore();\n return;\n }\n }\n const blockRuleset = this.blockRuleset();\n if (blockRuleset) {\n parserInput.forget();\n if (params) {\n return new tree.mixin.Definition(null, params, blockRuleset, null, variadic);\n }\n return new tree.DetachedRuleset(blockRuleset);\n }\n parserInput.restore();\n },\n\n //\n // div, .class, body > p {...}\n //\n ruleset: function () {\n let selectors;\n let rules;\n let debugInfo;\n\n parserInput.save();\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(parserInput.i);\n }\n\n selectors = this.selectors();\n\n if (selectors && (rules = this.block())) {\n parserInput.forget();\n const ruleset = new(tree.Ruleset)(selectors, rules, context.strictImports);\n if (context.dumpLineNumbers) {\n ruleset.debugInfo = debugInfo;\n }\n return ruleset;\n } else {\n parserInput.restore();\n }\n },\n declaration: function () {\n let name;\n let value;\n const index = parserInput.i;\n let hasDR;\n const c = parserInput.currentChar();\n let important;\n let merge;\n let isVariable;\n\n if (c === '.' || c === '#' || c === '&' || c === ':') { return; }\n\n parserInput.save();\n\n name = this.variable() || this.ruleProperty();\n if (name) {\n isVariable = typeof name === 'string';\n\n if (isVariable) {\n value = this.detachedRuleset();\n if (value) {\n hasDR = true;\n }\n }\n\n parserInput.commentStore.length = 0;\n if (!value) {\n // a name returned by this.ruleProperty() is always an array of the form:\n // [string-1, ..., string-n, \"\"] or [string-1, ..., string-n, \"+\"]\n // where each item is a tree.Keyword or tree.Variable\n merge = !isVariable && name.length > 1 && name.pop().value;\n\n // Custom property values get permissive parsing\n if (name[0].value && name[0].value.slice(0, 2) === '--') {\n value = this.permissiveValue();\n }\n // Try to store values as anonymous\n // If we need the value later we'll re-parse it in ruleset.parseValue\n else {\n value = this.anonymousValue();\n }\n if (value) {\n parserInput.forget();\n // anonymous values absorb the end ';' which is required for them to work\n return new(tree.Declaration)(name, value, false, merge, index, fileInfo);\n }\n\n if (!value) {\n value = this.value();\n }\n\n if (value) {\n important = this.important();\n } else if (isVariable) {\n // As a last resort, try permissiveValue\n value = this.permissiveValue();\n }\n }\n\n if (value && (this.end() || hasDR)) {\n parserInput.forget();\n return new(tree.Declaration)(name, value, important, merge, index, fileInfo);\n }\n else {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n }\n },\n anonymousValue: function () {\n const index = parserInput.i;\n const match = parserInput.$re(/^([^.#@\\$+\\/'\"*`(;{}-]*);/);\n if (match) {\n return new(tree.Anonymous)(match[1], index);\n }\n },\n /**\n * Used for custom properties, at-rules, and variables (as fallback)\n * Parses almost anything inside of {} [] () \"\" blocks\n * until it reaches outer-most tokens.\n * \n * First, it will try to parse comments and entities to reach\n * the end. This is mostly like the Expression parser except no\n * math is allowed.\n */\n permissiveValue: function (untilTokens) {\n let i;\n let e;\n let done;\n let value;\n const tok = untilTokens || ';';\n const index = parserInput.i;\n const result = [];\n\n function testCurrentChar() {\n const char = parserInput.currentChar();\n if (typeof tok === 'string') {\n return char === tok;\n } else {\n return tok.test(char);\n }\n }\n if (testCurrentChar()) {\n return;\n }\n value = [];\n do {\n e = this.comment();\n if (e) {\n value.push(e);\n continue;\n }\n e = this.entity();\n if (e) {\n value.push(e);\n }\n } while (e);\n\n done = testCurrentChar();\n\n if (value.length > 0) {\n value = new(tree.Expression)(value);\n if (done) {\n return value;\n }\n else {\n result.push(value);\n }\n // Preserve space before $parseUntil as it will not\n if (parserInput.prevChar() === ' ') {\n result.push(new tree.Anonymous(' ', index));\n }\n }\n parserInput.save();\n\n value = parserInput.$parseUntil(tok);\n\n if (value) {\n if (typeof value === 'string') {\n error(`Expected '${value}'`, 'Parse');\n }\n if (value.length === 1 && value[0] === ' ') {\n parserInput.forget();\n return new tree.Anonymous('', index);\n }\n let item;\n for (i = 0; i < value.length; i++) {\n item = value[i];\n if (Array.isArray(item)) {\n // Treat actual quotes as normal quoted values\n result.push(new tree.Quoted(item[0], item[1], true, index, fileInfo));\n }\n else {\n if (i === value.length - 1) {\n item = item.trim();\n }\n // Treat like quoted values, but replace vars like unquoted expressions\n const quote = new tree.Quoted('\\'', item, true, index, fileInfo);\n quote.variableRegex = /@([\\w-]+)/g;\n quote.propRegex = /\\$([\\w-]+)/g;\n result.push(quote);\n }\n }\n parserInput.forget();\n return new tree.Expression(result, true);\n }\n parserInput.restore();\n },\n\n //\n // An @import atrule\n //\n // @import \"lib\";\n //\n // Depending on our environment, importing is done differently:\n // In the browser, it's an XHR request, in Node, it would be a\n // file-system operation. The function used for importing is\n // stored in `import`, which we pass to the Import constructor.\n //\n 'import': function () {\n let path;\n let features;\n const index = parserInput.i;\n\n const dir = parserInput.$re(/^@import?\\s+/);\n\n if (dir) {\n const options = (dir ? this.importOptions() : null) || {};\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n features = this.mediaFeatures();\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon or unrecognised media features on import');\n }\n features = features && new(tree.Value)(features);\n return new(tree.Import)(path, features, options, index, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed import statement');\n }\n }\n },\n\n importOptions: function() {\n let o;\n const options = {};\n let optionName;\n let value;\n\n // list of options, surrounded by parens\n if (!parserInput.$char('(')) { return null; }\n do {\n o = this.importOption();\n if (o) {\n optionName = o;\n value = true;\n switch (optionName) {\n case 'css':\n optionName = 'less';\n value = false;\n break;\n case 'once':\n optionName = 'multiple';\n value = false;\n break;\n }\n options[optionName] = value;\n if (!parserInput.$char(',')) { break; }\n }\n } while (o);\n expectChar(')');\n return options;\n },\n\n importOption: function() {\n const opt = parserInput.$re(/^(less|css|multiple|once|inline|reference|optional)/);\n if (opt) {\n return opt[1];\n }\n },\n\n mediaFeature: function () {\n const entities = this.entities;\n const nodes = [];\n let e;\n let p;\n parserInput.save();\n do {\n e = entities.keyword() || entities.variable() || entities.mixinLookup();\n if (e) {\n nodes.push(e);\n } else if (parserInput.$char('(')) {\n p = this.property();\n e = this.value();\n if (parserInput.$char(')')) {\n if (p && e) {\n nodes.push(new(tree.Paren)(new(tree.Declaration)(p, e, null, null, parserInput.i, fileInfo, true)));\n } else if (e) {\n nodes.push(new(tree.Paren)(e));\n } else {\n error('badly formed media feature definition');\n }\n } else {\n error('Missing closing \\')\\'', 'Parse');\n }\n }\n } while (e);\n\n parserInput.forget();\n if (nodes.length > 0) {\n return new(tree.Expression)(nodes);\n }\n },\n\n mediaFeatures: function () {\n const entities = this.entities;\n const features = [];\n let e;\n do {\n e = this.mediaFeature();\n if (e) {\n features.push(e);\n if (!parserInput.$char(',')) { break; }\n } else {\n e = entities.variable() || entities.mixinLookup();\n if (e) {\n features.push(e);\n if (!parserInput.$char(',')) { break; }\n }\n }\n } while (e);\n\n return features.length > 0 ? features : null;\n },\n\n media: function () {\n let features;\n let rules;\n let media;\n let debugInfo;\n const index = parserInput.i;\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(index);\n }\n\n parserInput.save();\n\n if (parserInput.$str('@media')) {\n features = this.mediaFeatures();\n\n rules = this.block();\n\n if (!rules) {\n error('media definitions require block statements after any features');\n }\n\n parserInput.forget();\n\n media = new(tree.Media)(rules, features, index, fileInfo);\n if (context.dumpLineNumbers) {\n media.debugInfo = debugInfo;\n }\n\n return media;\n }\n\n parserInput.restore();\n },\n\n //\n\n // A @plugin directive, used to import plugins dynamically.\n //\n // @plugin (args) \"lib\";\n //\n plugin: function () {\n let path;\n let args;\n let options;\n const index = parserInput.i;\n const dir = parserInput.$re(/^@plugin?\\s+/);\n\n if (dir) {\n args = this.pluginArgs();\n\n if (args) {\n options = {\n pluginArgs: args,\n isPlugin: true\n };\n }\n else {\n options = { isPlugin: true };\n }\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon on @plugin');\n }\n return new(tree.Import)(path, null, options, index, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed @plugin statement');\n }\n }\n },\n\n pluginArgs: function() {\n // list of options, surrounded by parens\n parserInput.save();\n if (!parserInput.$char('(')) {\n parserInput.restore();\n return null;\n }\n const args = parserInput.$re(/^\\s*([^\\);]+)\\)\\s*/);\n if (args[1]) {\n parserInput.forget();\n return args[1].trim();\n }\n else { \n parserInput.restore();\n return null;\n }\n },\n\n //\n // A CSS AtRule\n //\n // @charset \"utf-8\";\n //\n atrule: function () {\n const index = parserInput.i;\n let name;\n let value;\n let rules;\n let nonVendorSpecificName;\n let hasIdentifier;\n let hasExpression;\n let hasUnknown;\n let hasBlock = true;\n let isRooted = true;\n\n if (parserInput.currentChar() !== '@') { return; }\n\n value = this['import']() || this.plugin() || this.media();\n if (value) {\n return value;\n }\n\n parserInput.save();\n\n name = parserInput.$re(/^@[a-z-]+/);\n\n if (!name) { return; }\n\n nonVendorSpecificName = name;\n if (name.charAt(1) == '-' && name.indexOf('-', 2) > 0) {\n nonVendorSpecificName = `@${name.slice(name.indexOf('-', 2) + 1)}`;\n }\n\n switch (nonVendorSpecificName) {\n case '@charset':\n hasIdentifier = true;\n hasBlock = false;\n break;\n case '@namespace':\n hasExpression = true;\n hasBlock = false;\n break;\n case '@keyframes':\n case '@counter-style':\n hasIdentifier = true;\n break;\n case '@document':\n case '@supports':\n hasUnknown = true;\n isRooted = false;\n break;\n default:\n hasUnknown = true;\n break;\n }\n\n parserInput.commentStore.length = 0;\n\n if (hasIdentifier) {\n value = this.entity();\n if (!value) {\n error(`expected ${name} identifier`);\n }\n } else if (hasExpression) {\n value = this.expression();\n if (!value) {\n error(`expected ${name} expression`);\n }\n } else if (hasUnknown) {\n value = this.permissiveValue(/^[{;]/);\n hasBlock = (parserInput.currentChar() === '{');\n if (!value) {\n if (!hasBlock && parserInput.currentChar() !== ';') {\n error(`${name} rule is missing block or ending semi-colon`);\n }\n }\n else if (!value.value) {\n value = null;\n }\n }\n\n if (hasBlock) {\n rules = this.blockRuleset();\n }\n\n if (rules || (!hasBlock && value && parserInput.$char(';'))) {\n parserInput.forget();\n return new(tree.AtRule)(name, value, rules, index, fileInfo,\n context.dumpLineNumbers ? getDebugInfo(index) : null,\n isRooted\n );\n }\n\n parserInput.restore('at-rule options not recognised');\n },\n\n //\n // A Value is a comma-delimited list of Expressions\n //\n // font-family: Baskerville, Georgia, serif;\n //\n // In a Rule, a Value represents everything after the `:`,\n // and before the `;`.\n //\n value: function () {\n let e;\n const expressions = [];\n const index = parserInput.i;\n\n do {\n e = this.expression();\n if (e) {\n expressions.push(e);\n if (!parserInput.$char(',')) { break; }\n }\n } while (e);\n\n if (expressions.length > 0) {\n return new(tree.Value)(expressions, index);\n }\n },\n important: function () {\n if (parserInput.currentChar() === '!') {\n return parserInput.$re(/^! *important/);\n }\n },\n sub: function () {\n let a;\n let e;\n\n parserInput.save();\n if (parserInput.$char('(')) {\n a = this.addition();\n if (a && parserInput.$char(')')) {\n parserInput.forget();\n e = new(tree.Expression)([a]);\n e.parens = true;\n return e;\n }\n parserInput.restore('Expected \\')\\'');\n return;\n }\n parserInput.restore();\n },\n multiplication: function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.operand();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1);\n while (true) {\n if (parserInput.peek(/^\\/[*\\/]/)) {\n break;\n }\n\n parserInput.save();\n\n op = parserInput.$char('/') || parserInput.$char('*') || parserInput.$str('./');\n\n if (!op) { parserInput.forget(); break; }\n\n a = this.operand();\n\n if (!a) { parserInput.restore(); break; }\n parserInput.forget();\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n isSpaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n addition: function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.multiplication();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1);\n while (true) {\n op = parserInput.$re(/^[-+]\\s+/) || (!isSpaced && (parserInput.$char('+') || parserInput.$char('-')));\n if (!op) {\n break;\n }\n a = this.multiplication();\n if (!a) {\n break;\n }\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n isSpaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n conditions: function () {\n let a;\n let b;\n const index = parserInput.i;\n let condition;\n\n a = this.condition(true);\n if (a) {\n while (true) {\n if (!parserInput.peek(/^,\\s*(not\\s*)?\\(/) || !parserInput.$char(',')) {\n break;\n }\n b = this.condition(true);\n if (!b) {\n break;\n }\n condition = new(tree.Condition)('or', condition || a, b, index);\n }\n return condition || a;\n }\n },\n condition: function (needsParens) {\n let result;\n let logical;\n let next;\n function or() {\n return parserInput.$str('or');\n }\n\n result = this.conditionAnd(needsParens);\n if (!result) {\n return ;\n }\n logical = or();\n if (logical) {\n next = this.condition(needsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n }\n }\n return result;\n },\n conditionAnd: function (needsParens) {\n let result;\n let logical;\n let next;\n const self = this;\n function insideCondition() {\n const cond = self.negatedCondition(needsParens) || self.parenthesisCondition(needsParens);\n if (!cond && !needsParens) {\n return self.atomicCondition(needsParens);\n }\n return cond;\n }\n function and() {\n return parserInput.$str('and');\n }\n\n result = insideCondition();\n if (!result) {\n return ;\n }\n logical = and();\n if (logical) {\n next = this.conditionAnd(needsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n }\n }\n return result;\n },\n negatedCondition: function (needsParens) {\n if (parserInput.$str('not')) {\n const result = this.parenthesisCondition(needsParens);\n if (result) {\n result.negate = !result.negate;\n }\n return result;\n }\n },\n parenthesisCondition: function (needsParens) {\n function tryConditionFollowedByParenthesis(me) {\n let body;\n parserInput.save();\n body = me.condition(needsParens);\n if (!body) {\n parserInput.restore();\n return ;\n }\n if (!parserInput.$char(')')) {\n parserInput.restore();\n return ;\n }\n parserInput.forget();\n return body;\n }\n\n let body;\n parserInput.save();\n if (!parserInput.$str('(')) {\n parserInput.restore();\n return ;\n }\n body = tryConditionFollowedByParenthesis(this);\n if (body) {\n parserInput.forget();\n return body;\n }\n\n body = this.atomicCondition(needsParens);\n if (!body) {\n parserInput.restore();\n return ;\n }\n if (!parserInput.$char(')')) {\n parserInput.restore(`expected ')' got '${parserInput.currentChar()}'`);\n return ;\n }\n parserInput.forget();\n return body;\n },\n atomicCondition: function (needsParens) {\n const entities = this.entities;\n const index = parserInput.i;\n let a;\n let b;\n let c;\n let op;\n\n function cond() {\n return this.addition() || entities.keyword() || entities.quoted() || entities.mixinLookup();\n }\n cond = cond.bind(this);\n\n a = cond();\n if (a) {\n if (parserInput.$char('>')) {\n if (parserInput.$char('=')) {\n op = '>=';\n } else {\n op = '>';\n }\n } else\n if (parserInput.$char('<')) {\n if (parserInput.$char('=')) {\n op = '<=';\n } else {\n op = '<';\n }\n } else\n if (parserInput.$char('=')) {\n if (parserInput.$char('>')) {\n op = '=>';\n } else if (parserInput.$char('<')) {\n op = '=<';\n } else {\n op = '=';\n }\n }\n if (op) {\n b = cond();\n if (b) {\n c = new(tree.Condition)(op, a, b, index, false);\n } else {\n error('expected expression');\n }\n } else {\n c = new(tree.Condition)('=', a, new(tree.Keyword)('true'), index, false);\n }\n return c;\n }\n },\n\n //\n // An operand is anything that can be part of an operation,\n // such as a Color, or a Variable\n //\n operand: function () {\n const entities = this.entities;\n let negate;\n\n if (parserInput.peek(/^-[@\\$\\(]/)) {\n negate = parserInput.$char('-');\n }\n\n let o = this.sub() || entities.dimension() ||\n entities.color() || entities.variable() ||\n entities.property() || entities.call() ||\n entities.quoted(true) || entities.colorKeyword() ||\n entities.mixinLookup();\n\n if (negate) {\n o.parensInOp = true;\n o = new(tree.Negative)(o);\n }\n\n return o;\n },\n\n //\n // Expressions either represent mathematical operations,\n // or white-space delimited Entities.\n //\n // 1px solid black\n // @var * 2\n //\n expression: function () {\n const entities = [];\n let e;\n let delim;\n const index = parserInput.i;\n\n do {\n e = this.comment();\n if (e) {\n entities.push(e);\n continue;\n }\n e = this.addition() || this.entity();\n\n if (e instanceof tree.Comment) {\n e = null;\n }\n\n if (e) {\n entities.push(e);\n // operations do not allow keyword \"/\" dimension (e.g. small/20px) so we support that here\n if (!parserInput.peek(/^\\/[\\/*]/)) {\n delim = parserInput.$char('/');\n if (delim) {\n entities.push(new(tree.Anonymous)(delim, index));\n }\n }\n }\n } while (e);\n if (entities.length > 0) {\n return new(tree.Expression)(entities);\n }\n },\n property: function () {\n const name = parserInput.$re(/^(\\*?-?[_a-zA-Z0-9-]+)\\s*:/);\n if (name) {\n return name[1];\n }\n },\n ruleProperty: function () {\n let name = [];\n const index = [];\n let s;\n let k;\n\n parserInput.save();\n\n const simpleProperty = parserInput.$re(/^([_a-zA-Z0-9-]+)\\s*:/);\n if (simpleProperty) {\n name = [new(tree.Keyword)(simpleProperty[1])];\n parserInput.forget();\n return name;\n }\n\n function match(re) {\n const i = parserInput.i;\n const chunk = parserInput.$re(re);\n if (chunk) {\n index.push(i);\n return name.push(chunk[1]);\n }\n }\n\n match(/^(\\*?)/);\n while (true) {\n if (!match(/^((?:[\\w-]+)|(?:[@\\$]\\{[\\w-]+\\}))/)) {\n break;\n }\n }\n\n if ((name.length > 1) && match(/^((?:\\+_|\\+)?)\\s*:/)) {\n parserInput.forget();\n\n // at last, we have the complete match now. move forward,\n // convert name particles to tree objects and return:\n if (name[0] === '') {\n name.shift();\n index.shift();\n }\n for (k = 0; k < name.length; k++) {\n s = name[k];\n name[k] = (s.charAt(0) !== '@' && s.charAt(0) !== '$') ?\n new(tree.Keyword)(s) :\n (s.charAt(0) === '@' ?\n new(tree.Variable)(`@${s.slice(2, -1)}`, index[k], fileInfo) :\n new(tree.Property)(`$${s.slice(2, -1)}`, index[k], fileInfo));\n }\n return name;\n }\n parserInput.restore();\n }\n }\n };\n};\nParser.serializeVars = vars => {\n let s = '';\n\n for (const name in vars) {\n if (Object.hasOwnProperty.call(vars, name)) {\n const value = vars[name];\n s += `${((name[0] === '@') ? '' : '@') + name}: ${value}${(String(value).slice(-1) === ';') ? '' : ';'}`;\n }\n }\n\n return s;\n};\n\nexport default Parser;\n","import Anonymous from '../tree/anonymous';\nimport Keyword from '../tree/keyword';\n\nfunction boolean(condition) {\n return condition ? Keyword.True : Keyword.False;\n}\n\n/**\n * Functions with evalArgs set to false are sent context\n * as the first argument.\n */\nfunction If(context, condition, trueValue, falseValue) {\n return condition.eval(context) ? trueValue.eval(context)\n : (falseValue ? falseValue.eval(context) : new Anonymous);\n}\nIf.evalArgs = false\n\nexport default { boolean, 'if': If };\n","import Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport Expression from '../tree/expression';\nimport Operation from '../tree/operation';\nlet colorFunctions;\n\nfunction clamp(val) {\n return Math.min(1, Math.max(0, val));\n}\nfunction hsla(origColor, hsl) {\n const color = colorFunctions.hsla(hsl.h, hsl.s, hsl.l, hsl.a);\n if (color) {\n if (origColor.value && \n /^(rgb|hsl)/.test(origColor.value)) {\n color.value = origColor.value;\n } else {\n color.value = 'rgb';\n }\n return color;\n }\n}\nfunction toHSL(color) {\n if (color.toHSL) {\n return color.toHSL();\n } else {\n throw new Error('Argument cannot be evaluated to a color');\n }\n}\n\nfunction toHSV(color) {\n if (color.toHSV) {\n return color.toHSV();\n } else {\n throw new Error('Argument cannot be evaluated to a color');\n }\n}\n\nfunction number(n) {\n if (n instanceof Dimension) {\n return parseFloat(n.unit.is('%') ? n.value / 100 : n.value);\n } else if (typeof n === 'number') {\n return n;\n } else {\n throw {\n type: 'Argument',\n message: 'color functions take numbers as parameters'\n };\n }\n}\nfunction scaled(n, size) {\n if (n instanceof Dimension && n.unit.is('%')) {\n return parseFloat(n.value * size / 100);\n } else {\n return number(n);\n }\n}\ncolorFunctions = {\n rgb: function (r, g, b) {\n let a = 1\n /**\n * Comma-less syntax\n * e.g. rgb(0 128 255 / 50%)\n */\n if (r instanceof Expression) {\n const val = r.value\n r = val[0]\n g = val[1]\n b = val[2]\n /** \n * @todo - should this be normalized in\n * function caller? Or parsed differently?\n */\n if (b instanceof Operation) {\n const op = b\n b = op.operands[0]\n a = op.operands[1]\n }\n }\n const color = colorFunctions.rgba(r, g, b, a);\n if (color) {\n color.value = 'rgb';\n return color;\n }\n },\n rgba: function (r, g, b, a) {\n try {\n if (r instanceof Color) {\n if (g) {\n a = number(g);\n } else {\n a = r.alpha;\n }\n return new Color(r.rgb, a, 'rgba');\n }\n const rgb = [r, g, b].map(c => scaled(c, 255));\n a = number(a);\n return new Color(rgb, a, 'rgba');\n }\n catch (e) {}\n },\n hsl: function (h, s, l) {\n let a = 1\n if (h instanceof Expression) {\n const val = h.value\n h = val[0]\n s = val[1]\n l = val[2]\n\n if (l instanceof Operation) {\n const op = l\n l = op.operands[0]\n a = op.operands[1]\n }\n }\n const color = colorFunctions.hsla(h, s, l, a);\n if (color) {\n color.value = 'hsl';\n return color;\n }\n },\n hsla: function (h, s, l, a) {\n try {\n if (h instanceof Color) {\n if (s) {\n a = number(s);\n } else {\n a = h.alpha;\n }\n return new Color(h.rgb, a, 'hsla');\n }\n\n let m1;\n let m2;\n\n function hue(h) {\n h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h);\n if (h * 6 < 1) {\n return m1 + (m2 - m1) * h * 6;\n }\n else if (h * 2 < 1) {\n return m2;\n }\n else if (h * 3 < 2) {\n return m1 + (m2 - m1) * (2 / 3 - h) * 6;\n }\n else {\n return m1;\n }\n }\n\n h = (number(h) % 360) / 360;\n s = clamp(number(s));l = clamp(number(l));a = clamp(number(a));\n\n m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n m1 = l * 2 - m2;\n\n const rgb = [\n hue(h + 1 / 3) * 255,\n hue(h) * 255,\n hue(h - 1 / 3) * 255\n ];\n a = number(a);\n return new Color(rgb, a, 'hsla');\n }\n catch (e) {}\n },\n\n hsv: function(h, s, v) {\n return colorFunctions.hsva(h, s, v, 1.0);\n },\n\n hsva: function(h, s, v, a) {\n h = ((number(h) % 360) / 360) * 360;\n s = number(s);v = number(v);a = number(a);\n\n let i;\n let f;\n i = Math.floor((h / 60) % 6);\n f = (h / 60) - i;\n\n const vs = [v,\n v * (1 - s),\n v * (1 - f * s),\n v * (1 - (1 - f) * s)];\n const perm = [[0, 3, 1],\n [2, 0, 1],\n [1, 0, 3],\n [1, 2, 0],\n [3, 1, 0],\n [0, 1, 2]];\n\n return colorFunctions.rgba(vs[perm[i][0]] * 255,\n vs[perm[i][1]] * 255,\n vs[perm[i][2]] * 255,\n a);\n },\n\n hue: function (color) {\n return new Dimension(toHSL(color).h);\n },\n saturation: function (color) {\n return new Dimension(toHSL(color).s * 100, '%');\n },\n lightness: function (color) {\n return new Dimension(toHSL(color).l * 100, '%');\n },\n hsvhue: function(color) {\n return new Dimension(toHSV(color).h);\n },\n hsvsaturation: function (color) {\n return new Dimension(toHSV(color).s * 100, '%');\n },\n hsvvalue: function (color) {\n return new Dimension(toHSV(color).v * 100, '%');\n },\n red: function (color) {\n return new Dimension(color.rgb[0]);\n },\n green: function (color) {\n return new Dimension(color.rgb[1]);\n },\n blue: function (color) {\n return new Dimension(color.rgb[2]);\n },\n alpha: function (color) {\n return new Dimension(toHSL(color).a);\n },\n luma: function (color) {\n return new Dimension(color.luma() * color.alpha * 100, '%');\n },\n luminance: function (color) {\n const luminance =\n (0.2126 * color.rgb[0] / 255) +\n (0.7152 * color.rgb[1] / 255) +\n (0.0722 * color.rgb[2] / 255);\n\n return new Dimension(luminance * color.alpha * 100, '%');\n },\n saturate: function (color, amount, method) {\n // filter: saturate(3.2);\n // should be kept as is, so check for color\n if (!color.rgb) {\n return null;\n }\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.s += hsl.s * amount.value / 100;\n }\n else {\n hsl.s += amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n return hsla(color, hsl);\n },\n desaturate: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.s -= hsl.s * amount.value / 100;\n }\n else {\n hsl.s -= amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n return hsla(color, hsl);\n },\n lighten: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.l += hsl.l * amount.value / 100;\n }\n else {\n hsl.l += amount.value / 100;\n }\n hsl.l = clamp(hsl.l);\n return hsla(color, hsl);\n },\n darken: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.l -= hsl.l * amount.value / 100;\n }\n else {\n hsl.l -= amount.value / 100;\n }\n hsl.l = clamp(hsl.l);\n return hsla(color, hsl);\n },\n fadein: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.a += hsl.a * amount.value / 100;\n }\n else {\n hsl.a += amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fadeout: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.a -= hsl.a * amount.value / 100;\n }\n else {\n hsl.a -= amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fade: function (color, amount) {\n const hsl = toHSL(color);\n\n hsl.a = amount.value / 100;\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n spin: function (color, amount) {\n const hsl = toHSL(color);\n const hue = (hsl.h + amount.value) % 360;\n\n hsl.h = hue < 0 ? 360 + hue : hue;\n\n return hsla(color, hsl);\n },\n //\n // Copyright (c) 2006-2009 Hampton Catlin, Natalie Weizenbaum, and Chris Eppstein\n // http://sass-lang.com\n //\n mix: function (color1, color2, weight) {\n if (!weight) {\n weight = new Dimension(50);\n }\n const p = weight.value / 100.0;\n const w = p * 2 - 1;\n const a = toHSL(color1).a - toHSL(color2).a;\n\n const w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n const w2 = 1 - w1;\n\n const rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2,\n color1.rgb[1] * w1 + color2.rgb[1] * w2,\n color1.rgb[2] * w1 + color2.rgb[2] * w2];\n\n const alpha = color1.alpha * p + color2.alpha * (1 - p);\n\n return new Color(rgb, alpha);\n },\n greyscale: function (color) {\n return colorFunctions.desaturate(color, new Dimension(100));\n },\n contrast: function (color, dark, light, threshold) {\n // filter: contrast(3.2);\n // should be kept as is, so check for color\n if (!color.rgb) {\n return null;\n }\n if (typeof light === 'undefined') {\n light = colorFunctions.rgba(255, 255, 255, 1.0);\n }\n if (typeof dark === 'undefined') {\n dark = colorFunctions.rgba(0, 0, 0, 1.0);\n }\n // Figure out which is actually light and dark:\n if (dark.luma() > light.luma()) {\n const t = light;\n light = dark;\n dark = t;\n }\n if (typeof threshold === 'undefined') {\n threshold = 0.43;\n } else {\n threshold = number(threshold);\n }\n if (color.luma() < threshold) {\n return light;\n } else {\n return dark;\n }\n },\n // Changes made in 2.7.0 - Reverted in 3.0.0\n // contrast: function (color, color1, color2, threshold) {\n // // Return which of `color1` and `color2` has the greatest contrast with `color`\n // // according to the standard WCAG contrast ratio calculation.\n // // http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n // // The threshold param is no longer used, in line with SASS.\n // // filter: contrast(3.2);\n // // should be kept as is, so check for color\n // if (!color.rgb) {\n // return null;\n // }\n // if (typeof color1 === 'undefined') {\n // color1 = colorFunctions.rgba(0, 0, 0, 1.0);\n // }\n // if (typeof color2 === 'undefined') {\n // color2 = colorFunctions.rgba(255, 255, 255, 1.0);\n // }\n // var contrast1, contrast2;\n // var luma = color.luma();\n // var luma1 = color1.luma();\n // var luma2 = color2.luma();\n // // Calculate contrast ratios for each color\n // if (luma > luma1) {\n // contrast1 = (luma + 0.05) / (luma1 + 0.05);\n // } else {\n // contrast1 = (luma1 + 0.05) / (luma + 0.05);\n // }\n // if (luma > luma2) {\n // contrast2 = (luma + 0.05) / (luma2 + 0.05);\n // } else {\n // contrast2 = (luma2 + 0.05) / (luma + 0.05);\n // }\n // if (contrast1 > contrast2) {\n // return color1;\n // } else {\n // return color2;\n // }\n // },\n argb: function (color) {\n return new Anonymous(color.toARGB());\n },\n color: function(c) {\n if ((c instanceof Quoted) &&\n (/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})$/i.test(c.value))) {\n const val = c.value.slice(1);\n return new Color(val, undefined, `#${val}`);\n }\n if ((c instanceof Color) || (c = Color.fromKeyword(c.value))) {\n c.value = undefined;\n return c;\n }\n throw {\n type: 'Argument',\n message: 'argument must be a color keyword or 3|4|6|8 digit hex e.g. #FFF'\n };\n },\n tint: function(color, amount) {\n return colorFunctions.mix(colorFunctions.rgb(255, 255, 255), color, amount);\n },\n shade: function(color, amount) {\n return colorFunctions.mix(colorFunctions.rgb(0, 0, 0), color, amount);\n }\n};\n\nexport default colorFunctions;\n","import Color from '../tree/color';\n\n// Color Blending\n// ref: http://www.w3.org/TR/compositing-1\n\nfunction colorBlend(mode, color1, color2) {\n const ab = color1.alpha; // result\n\n let // backdrop\n cb;\n\n const as = color2.alpha;\n\n let // source\n cs;\n\n let ar;\n let cr;\n const r = [];\n\n ar = as + ab * (1 - as);\n for (let i = 0; i < 3; i++) {\n cb = color1.rgb[i] / 255;\n cs = color2.rgb[i] / 255;\n cr = mode(cb, cs);\n if (ar) {\n cr = (as * cs + ab * (cb -\n as * (cb + cs - cr))) / ar;\n }\n r[i] = cr * 255;\n }\n\n return new Color(r, ar);\n}\n\nconst colorBlendModeFunctions = {\n multiply: function(cb, cs) {\n return cb * cs;\n },\n screen: function(cb, cs) {\n return cb + cs - cb * cs;\n },\n overlay: function(cb, cs) {\n cb *= 2;\n return (cb <= 1) ?\n colorBlendModeFunctions.multiply(cb, cs) :\n colorBlendModeFunctions.screen(cb - 1, cs);\n },\n softlight: function(cb, cs) {\n let d = 1;\n let e = cb;\n if (cs > 0.5) {\n e = 1;\n d = (cb > 0.25) ? Math.sqrt(cb)\n : ((16 * cb - 12) * cb + 4) * cb;\n }\n return cb - (1 - 2 * cs) * e * (d - cb);\n },\n hardlight: function(cb, cs) {\n return colorBlendModeFunctions.overlay(cs, cb);\n },\n difference: function(cb, cs) {\n return Math.abs(cb - cs);\n },\n exclusion: function(cb, cs) {\n return cb + cs - 2 * cb * cs;\n },\n\n // non-w3c functions:\n average: function(cb, cs) {\n return (cb + cs) / 2;\n },\n negation: function(cb, cs) {\n return 1 - Math.abs(cb + cs - 1);\n }\n};\n\nfor (const f in colorBlendModeFunctions) {\n if (colorBlendModeFunctions.hasOwnProperty(f)) {\n colorBlend[f] = colorBlend.bind(null, colorBlendModeFunctions[f]);\n }\n}\n\nexport default colorBlend;\n","import Comment from '../tree/comment';\nimport Node from '../tree/node';\nimport Dimension from '../tree/dimension';\nimport Declaration from '../tree/declaration';\nimport Expression from '../tree/expression';\nimport Ruleset from '../tree/ruleset';\nimport Selector from '../tree/selector';\nimport Element from '../tree/element';\nimport Quote from '../tree/quoted';\nimport Value from '../tree/value';\n\nconst getItemsFromNode = node => {\n // handle non-array values as an array of length 1\n // return 'undefined' if index is invalid\n const items = Array.isArray(node.value) ?\n node.value : Array(node);\n\n return items;\n};\n\nexport default {\n _SELF: function(n) {\n return n;\n },\n '~': function(...expr) {\n if (expr.length === 1) {\n return expr[0];\n }\n return new Value(expr);\n },\n extract: function(values, index) {\n // (1-based index)\n index = index.value - 1;\n\n return getItemsFromNode(values)[index];\n },\n length: function(values) {\n return new Dimension(getItemsFromNode(values).length);\n },\n /**\n * Creates a Less list of incremental values.\n * Modeled after Lodash's range function, also exists natively in PHP\n * \n * @param {Dimension} [start=1]\n * @param {Dimension} end - e.g. 10 or 10px - unit is added to output\n * @param {Dimension} [step=1] \n */\n range: function(start, end, step) {\n let from;\n let to;\n let stepValue = 1;\n const list = [];\n if (end) {\n to = end;\n from = start.value;\n if (step) {\n stepValue = step.value;\n }\n }\n else {\n from = 1;\n to = start;\n }\n\n for (let i = from; i <= to.value; i += stepValue) {\n list.push(new Dimension(i, to.unit));\n }\n\n return new Expression(list);\n },\n each: function(list, rs) {\n const rules = [];\n let newRules;\n let iterator;\n\n const tryEval = val => {\n if (val instanceof Node) {\n return val.eval(this.context);\n }\n return val;\n };\n\n if (list.value && !(list instanceof Quote)) {\n if (Array.isArray(list.value)) {\n iterator = list.value.map(tryEval);\n } else {\n iterator = [tryEval(list.value)];\n }\n } else if (list.ruleset) {\n iterator = tryEval(list.ruleset).rules;\n } else if (list.rules) {\n iterator = list.rules.map(tryEval);\n } else if (Array.isArray(list)) {\n iterator = list.map(tryEval);\n } else {\n iterator = [tryEval(list)];\n }\n\n let valueName = '@value';\n let keyName = '@key';\n let indexName = '@index';\n\n if (rs.params) {\n valueName = rs.params[0] && rs.params[0].name;\n keyName = rs.params[1] && rs.params[1].name;\n indexName = rs.params[2] && rs.params[2].name;\n rs = rs.rules;\n } else {\n rs = rs.ruleset;\n }\n\n for (let i = 0; i < iterator.length; i++) {\n let key;\n let value;\n const item = iterator[i];\n if (item instanceof Declaration) {\n key = typeof item.name === 'string' ? item.name : item.name[0].value;\n value = item.value;\n } else {\n key = new Dimension(i + 1);\n value = item;\n }\n\n if (item instanceof Comment) {\n continue;\n }\n\n newRules = rs.rules.slice(0);\n if (valueName) {\n newRules.push(new Declaration(valueName,\n value,\n false, false, this.index, this.currentFileInfo));\n }\n if (indexName) {\n newRules.push(new Declaration(indexName,\n new Dimension(i + 1),\n false, false, this.index, this.currentFileInfo));\n }\n if (keyName) {\n newRules.push(new Declaration(keyName,\n key,\n false, false, this.index, this.currentFileInfo));\n }\n\n rules.push(new Ruleset([ new(Selector)([ new Element(\"\", '&') ]) ],\n newRules,\n rs.strictImports,\n rs.visibilityInfo()\n ));\n }\n\n return new Ruleset([ new(Selector)([ new Element(\"\", '&') ]) ],\n rules,\n rs.strictImports,\n rs.visibilityInfo()\n ).eval(this.context);\n }\n};\n","import Dimension from '../tree/dimension';\n\nconst MathHelper = (fn, unit, n) => {\n if (!(n instanceof Dimension)) {\n throw { type: 'Argument', message: 'argument must be a number' };\n }\n if (unit == null) {\n unit = n.unit;\n } else {\n n = n.unify();\n }\n return new Dimension(fn(parseFloat(n.value)), unit);\n};\n\nexport default MathHelper;","import mathHelper from './math-helper.js';\n\nconst mathFunctions = {\n // name, unit\n ceil: null,\n floor: null,\n sqrt: null,\n abs: null,\n tan: '',\n sin: '',\n cos: '',\n atan: 'rad',\n asin: 'rad',\n acos: 'rad'\n};\n\nfor (const f in mathFunctions) {\n if (mathFunctions.hasOwnProperty(f)) {\n mathFunctions[f] = mathHelper.bind(null, Math[f], mathFunctions[f]);\n }\n}\n\nmathFunctions.round = (n, f) => {\n const fraction = typeof f === 'undefined' ? 0 : f.value;\n return mathHelper(num => num.toFixed(fraction), null, n);\n};\n\nexport default mathFunctions;\n","import Dimension from '../tree/dimension';\nimport Anonymous from '../tree/anonymous';\nimport mathHelper from './math-helper.js';\n\nconst minMax = function (isMin, args) {\n args = Array.prototype.slice.call(args);\n switch (args.length) {\n case 0: throw { type: 'Argument', message: 'one or more arguments required' };\n }\n let i; // key is the unit.toString() for unified Dimension values,\n let j;\n let current;\n let currentUnified;\n let referenceUnified;\n let unit;\n let unitStatic;\n let unitClone;\n\n const // elems only contains original argument values.\n order = [];\n\n const values = {};\n // value is the index into the order array.\n for (i = 0; i < args.length; i++) {\n current = args[i];\n if (!(current instanceof Dimension)) {\n if (Array.isArray(args[i].value)) {\n Array.prototype.push.apply(args, Array.prototype.slice.call(args[i].value));\n }\n continue;\n }\n currentUnified = current.unit.toString() === '' && unitClone !== undefined ? new Dimension(current.value, unitClone).unify() : current.unify();\n unit = currentUnified.unit.toString() === '' && unitStatic !== undefined ? unitStatic : currentUnified.unit.toString();\n unitStatic = unit !== '' && unitStatic === undefined || unit !== '' && order[0].unify().unit.toString() === '' ? unit : unitStatic;\n unitClone = unit !== '' && unitClone === undefined ? current.unit.toString() : unitClone;\n j = values[''] !== undefined && unit !== '' && unit === unitStatic ? values[''] : values[unit];\n if (j === undefined) {\n if (unitStatic !== undefined && unit !== unitStatic) {\n throw { type: 'Argument', message: 'incompatible types' };\n }\n values[unit] = order.length;\n order.push(current);\n continue;\n }\n referenceUnified = order[j].unit.toString() === '' && unitClone !== undefined ? new Dimension(order[j].value, unitClone).unify() : order[j].unify();\n if ( isMin && currentUnified.value < referenceUnified.value ||\n !isMin && currentUnified.value > referenceUnified.value) {\n order[j] = current;\n }\n }\n if (order.length == 1) {\n return order[0];\n }\n args = order.map(function (a) { return a.toCSS(this.context); }).join(this.context.compress ? ',' : ', ');\n return new Anonymous(`${isMin ? 'min' : 'max'}(${args})`);\n};\n\nexport default {\n min: function(...args) {\n try {\n return minMax(true, args);\n } catch (e) {}\n },\n max: function(...args) {\n try {\n return minMax(false, args);\n } catch (e) {}\n },\n convert: function (val, unit) {\n return val.convertTo(unit.value);\n },\n pi: function () {\n return new Dimension(Math.PI);\n },\n mod: function(a, b) {\n return new Dimension(a.value % b.value, a.unit);\n },\n pow: function(x, y) {\n if (typeof x === 'number' && typeof y === 'number') {\n x = new Dimension(x);\n y = new Dimension(y);\n } else if (!(x instanceof Dimension) || !(y instanceof Dimension)) {\n throw { type: 'Argument', message: 'arguments must be numbers' };\n }\n\n return new Dimension(Math.pow(x.value, y.value), x.unit);\n },\n percentage: function (n) {\n const result = mathHelper(num => num * 100, '%', n);\n\n return result;\n }\n};\n","import Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport JavaScript from '../tree/javascript';\n\nexport default {\n e: function (str) {\n return new Quoted('\"', str instanceof JavaScript ? str.evaluated : str.value, true);\n },\n escape: function (str) {\n return new Anonymous(\n encodeURI(str.value).replace(/=/g, '%3D').replace(/:/g, '%3A').replace(/#/g, '%23').replace(/;/g, '%3B')\n .replace(/\\(/g, '%28').replace(/\\)/g, '%29'));\n },\n replace: function (string, pattern, replacement, flags) {\n let result = string.value;\n replacement = (replacement.type === 'Quoted') ?\n replacement.value : replacement.toCSS();\n result = result.replace(new RegExp(pattern.value, flags ? flags.value : ''), replacement);\n return new Quoted(string.quote || '', result, string.escaped);\n },\n '%': function (string /* arg, arg, ... */) {\n const args = Array.prototype.slice.call(arguments, 1);\n let result = string.value;\n\n for (let i = 0; i < args.length; i++) {\n /* jshint loopfunc:true */\n result = result.replace(/%[sda]/i, token => {\n const value = ((args[i].type === 'Quoted') &&\n token.match(/s/i)) ? args[i].value : args[i].toCSS();\n return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value;\n });\n }\n result = result.replace(/%%/g, '%');\n return new Quoted(string.quote || '', result, string.escaped);\n }\n};\n","import Keyword from '../tree/keyword';\nimport DetachedRuleset from '../tree/detached-ruleset';\nimport Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport URL from '../tree/url';\nimport Operation from '../tree/operation';\n\nconst isa = (n, Type) => (n instanceof Type) ? Keyword.True : Keyword.False;\nconst isunit = (n, unit) => {\n if (unit === undefined) {\n throw { type: 'Argument', message: 'missing the required second argument to isunit.' };\n }\n unit = typeof unit.value === 'string' ? unit.value : unit;\n if (typeof unit !== 'string') {\n throw { type: 'Argument', message: 'Second argument to isunit should be a unit or a string.' };\n }\n return (n instanceof Dimension) && n.unit.is(unit) ? Keyword.True : Keyword.False;\n};\n\nexport default {\n isruleset: function (n) {\n return isa(n, DetachedRuleset);\n },\n iscolor: function (n) {\n return isa(n, Color);\n },\n isnumber: function (n) {\n return isa(n, Dimension);\n },\n isstring: function (n) {\n return isa(n, Quoted);\n },\n iskeyword: function (n) {\n return isa(n, Keyword);\n },\n isurl: function (n) {\n return isa(n, URL);\n },\n ispixel: function (n) {\n return isunit(n, 'px');\n },\n ispercentage: function (n) {\n return isunit(n, '%');\n },\n isem: function (n) {\n return isunit(n, 'em');\n },\n isunit,\n unit: function (val, unit) {\n if (!(val instanceof Dimension)) {\n throw { type: 'Argument',\n message: `the first argument to unit must be a number${val instanceof Operation ? '. Have you forgotten parenthesis?' : ''}` };\n }\n if (unit) {\n if (unit instanceof Keyword) {\n unit = unit.value;\n } else {\n unit = unit.toCSS();\n }\n } else {\n unit = '';\n }\n return new Dimension(val.value, unit);\n },\n 'get-unit': function (n) {\n return new Anonymous(n.unit);\n }\n};\n","import functionRegistry from './function-registry';\nimport functionCaller from './function-caller';\n\nimport boolean from './boolean';\nimport defaultFunc from './default';\nimport color from './color';\nimport colorBlending from './color-blending';\nimport dataUri from './data-uri';\nimport list from './list';\nimport math from './math';\nimport number from './number';\nimport string from './string';\nimport svg from './svg';\nimport types from './types';\n\nexport default environment => {\n const functions = { functionRegistry, functionCaller };\n\n // register functions\n functionRegistry.addMultiple(boolean);\n functionRegistry.add('default', defaultFunc.eval.bind(defaultFunc));\n functionRegistry.addMultiple(color);\n functionRegistry.addMultiple(colorBlending);\n functionRegistry.addMultiple(dataUri(environment));\n functionRegistry.addMultiple(list);\n functionRegistry.addMultiple(math);\n functionRegistry.addMultiple(number);\n functionRegistry.addMultiple(string);\n functionRegistry.addMultiple(svg(environment));\n functionRegistry.addMultiple(types);\n\n return functions;\n};\n","import Quoted from '../tree/quoted';\nimport URL from '../tree/url';\nimport * as utils from '../utils';\nimport logger from '../logger';\n\nexport default environment => {\n \n const fallback = (functionThis, node) => new URL(node, functionThis.index, functionThis.currentFileInfo).eval(functionThis.context); \n\n return { 'data-uri': function(mimetypeNode, filePathNode) {\n\n if (!filePathNode) {\n filePathNode = mimetypeNode;\n mimetypeNode = null;\n }\n\n let mimetype = mimetypeNode && mimetypeNode.value;\n let filePath = filePathNode.value;\n const currentFileInfo = this.currentFileInfo;\n const currentDirectory = currentFileInfo.rewriteUrls ?\n currentFileInfo.currentDirectory : currentFileInfo.entryPath;\n\n const fragmentStart = filePath.indexOf('#');\n let fragment = '';\n if (fragmentStart !== -1) {\n fragment = filePath.slice(fragmentStart);\n filePath = filePath.slice(0, fragmentStart);\n }\n const context = utils.clone(this.context);\n context.rawBuffer = true;\n\n const fileManager = environment.getFileManager(filePath, currentDirectory, context, environment, true);\n\n if (!fileManager) {\n return fallback(this, filePathNode);\n }\n\n let useBase64 = false;\n\n // detect the mimetype if not given\n if (!mimetypeNode) {\n\n mimetype = environment.mimeLookup(filePath);\n\n if (mimetype === 'image/svg+xml') {\n useBase64 = false;\n } else {\n // use base 64 unless it's an ASCII or UTF-8 format\n const charset = environment.charsetLookup(mimetype);\n useBase64 = ['US-ASCII', 'UTF-8'].indexOf(charset) < 0;\n }\n if (useBase64) { mimetype += ';base64'; }\n }\n else {\n useBase64 = /;base64$/.test(mimetype);\n }\n\n const fileSync = fileManager.loadFileSync(filePath, currentDirectory, context, environment);\n if (!fileSync.contents) {\n logger.warn(`Skipped data-uri embedding of ${filePath} because file not found`);\n return fallback(this, filePathNode || mimetypeNode);\n }\n let buf = fileSync.contents;\n if (useBase64 && !environment.encodeBase64) {\n return fallback(this, filePathNode);\n }\n\n buf = useBase64 ? environment.encodeBase64(buf) : encodeURIComponent(buf);\n\n const uri = `data:${mimetype},${buf}${fragment}`;\n\n return new URL(new Quoted(`\"${uri}\"`, uri, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n }};\n};\n","import Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Expression from '../tree/expression';\nimport Quoted from '../tree/quoted';\nimport URL from '../tree/url';\n\nexport default environment => {\n return { 'svg-gradient': function(direction) {\n let stops;\n let gradientDirectionSvg;\n let gradientType = 'linear';\n let rectangleDimension = 'x=\"0\" y=\"0\" width=\"1\" height=\"1\"';\n const renderEnv = {compress: false};\n let returner;\n const directionValue = direction.toCSS(renderEnv);\n let i;\n let color;\n let position;\n let positionValue;\n let alpha;\n\n function throwArgumentDescriptor() {\n throw { type: 'Argument',\n message: 'svg-gradient expects direction, start_color [start_position], [color position,]...,' +\n ' end_color [end_position] or direction, color list' };\n }\n\n if (arguments.length == 2) {\n if (arguments[1].value.length < 2) {\n throwArgumentDescriptor();\n }\n stops = arguments[1].value;\n } else if (arguments.length < 3) {\n throwArgumentDescriptor();\n } else {\n stops = Array.prototype.slice.call(arguments, 1);\n }\n\n switch (directionValue) {\n case 'to bottom':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\"';\n break;\n case 'to right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'to bottom right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\"';\n break;\n case 'to top right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"100%\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'ellipse':\n case 'ellipse at center':\n gradientType = 'radial';\n gradientDirectionSvg = 'cx=\"50%\" cy=\"50%\" r=\"75%\"';\n rectangleDimension = 'x=\"-50\" y=\"-50\" width=\"101\" height=\"101\"';\n break;\n default:\n throw { type: 'Argument', message: 'svg-gradient direction must be \\'to bottom\\', \\'to right\\',' +\n ' \\'to bottom right\\', \\'to top right\\' or \\'ellipse at center\\'' };\n }\n returner = `<${gradientType}Gradient id=\"g\" ${gradientDirectionSvg}>`;\n\n for (i = 0; i < stops.length; i += 1) {\n if (stops[i] instanceof Expression) {\n color = stops[i].value[0];\n position = stops[i].value[1];\n } else {\n color = stops[i];\n position = undefined;\n }\n\n if (!(color instanceof Color) || (!((i === 0 || i + 1 === stops.length) && position === undefined) && !(position instanceof Dimension))) {\n throwArgumentDescriptor();\n }\n positionValue = position ? position.toCSS(renderEnv) : i === 0 ? '0%' : '100%';\n alpha = color.alpha;\n returner += ``;\n }\n returner += ``;\n\n returner = encodeURIComponent(returner);\n\n returner = `data:image/svg+xml,${returner}`;\n return new URL(new Quoted(`'${returner}'`, returner, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n }};\n};\n","import contexts from './contexts';\nimport visitor from './visitors';\nimport tree from './tree';\n\nexport default function(root, options) {\n options = options || {};\n let evaldRoot;\n let variables = options.variables;\n const evalEnv = new contexts.Eval(options);\n\n //\n // Allows setting variables with a hash, so:\n //\n // `{ color: new tree.Color('#f01') }` will become:\n //\n // new tree.Declaration('@color',\n // new tree.Value([\n // new tree.Expression([\n // new tree.Color('#f01')\n // ])\n // ])\n // )\n //\n if (typeof variables === 'object' && !Array.isArray(variables)) {\n variables = Object.keys(variables).map(function (k) {\n let value = variables[k];\n\n if (!(value instanceof tree.Value)) {\n if (!(value instanceof tree.Expression)) {\n value = new tree.Expression([value]);\n }\n value = new tree.Value([value]);\n }\n return new tree.Declaration(`@${k}`, value, false, null, 0);\n });\n evalEnv.frames = [new tree.Ruleset(null, variables)];\n }\n\n const visitors = [\n new visitor.JoinSelectorVisitor(),\n new visitor.MarkVisibleSelectorsVisitor(true),\n new visitor.ExtendVisitor(),\n new visitor.ToCSSVisitor({compress: Boolean(options.compress)})\n ];\n\n const preEvalVisitors = [];\n let v;\n let visitorIterator;\n\n /**\n * first() / get() allows visitors to be added while visiting\n * \n * @todo Add scoping for visitors just like functions for @plugin; right now they're global\n */\n if (options.pluginManager) {\n visitorIterator = options.pluginManager.visitor();\n for (var i = 0; i < 2; i++) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (v.isPreEvalVisitor) {\n if (i === 0 || preEvalVisitors.indexOf(v) === -1) {\n preEvalVisitors.push(v);\n v.run(root);\n }\n }\n else {\n if (i === 0 || visitors.indexOf(v) === -1) {\n if (v.isPreVisitor) {\n visitors.unshift(v);\n }\n else {\n visitors.push(v);\n }\n }\n }\n }\n }\n }\n\n evaldRoot = root.eval(evalEnv);\n\n for (var i = 0; i < visitors.length; i++) {\n visitors[i].run(evaldRoot);\n }\n\n // Run any remaining visitors added after eval pass\n if (options.pluginManager) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (visitors.indexOf(v) === -1 && preEvalVisitors.indexOf(v) === -1) {\n v.run(evaldRoot);\n }\n }\n }\n\n return evaldRoot;\n};\n","/**\n * Plugin Manager\n */\nclass PluginManager {\n constructor(less) {\n this.less = less;\n this.visitors = [];\n this.preProcessors = [];\n this.postProcessors = [];\n this.installedPlugins = [];\n this.fileManagers = [];\n this.iterator = -1;\n this.pluginCache = {};\n this.Loader = new less.PluginLoader(less);\n }\n\n /**\n * Adds all the plugins in the array\n * @param {Array} plugins\n */\n addPlugins(plugins) {\n if (plugins) {\n for (let i = 0; i < plugins.length; i++) {\n this.addPlugin(plugins[i]);\n }\n }\n }\n\n /**\n *\n * @param plugin\n * @param {String} filename\n */\n addPlugin(plugin, filename, functionRegistry) {\n this.installedPlugins.push(plugin);\n if (filename) {\n this.pluginCache[filename] = plugin;\n }\n if (plugin.install) {\n plugin.install(this.less, this, functionRegistry || this.less.functions.functionRegistry);\n }\n }\n\n /**\n *\n * @param filename\n */\n get(filename) {\n return this.pluginCache[filename];\n }\n\n /**\n * Adds a visitor. The visitor object has options on itself to determine\n * when it should run.\n * @param visitor\n */\n addVisitor(visitor) {\n this.visitors.push(visitor);\n }\n\n /**\n * Adds a pre processor object\n * @param {object} preProcessor\n * @param {number} priority - guidelines 1 = before import, 1000 = import, 2000 = after import\n */\n addPreProcessor(preProcessor, priority) {\n let indexToInsertAt;\n for (indexToInsertAt = 0; indexToInsertAt < this.preProcessors.length; indexToInsertAt++) {\n if (this.preProcessors[indexToInsertAt].priority >= priority) {\n break;\n }\n }\n this.preProcessors.splice(indexToInsertAt, 0, {preProcessor, priority});\n }\n\n /**\n * Adds a post processor object\n * @param {object} postProcessor\n * @param {number} priority - guidelines 1 = before compression, 1000 = compression, 2000 = after compression\n */\n addPostProcessor(postProcessor, priority) {\n let indexToInsertAt;\n for (indexToInsertAt = 0; indexToInsertAt < this.postProcessors.length; indexToInsertAt++) {\n if (this.postProcessors[indexToInsertAt].priority >= priority) {\n break;\n }\n }\n this.postProcessors.splice(indexToInsertAt, 0, {postProcessor, priority});\n }\n\n /**\n *\n * @param manager\n */\n addFileManager(manager) {\n this.fileManagers.push(manager);\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getPreProcessors() {\n const preProcessors = [];\n for (let i = 0; i < this.preProcessors.length; i++) {\n preProcessors.push(this.preProcessors[i].preProcessor);\n }\n return preProcessors;\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getPostProcessors() {\n const postProcessors = [];\n for (let i = 0; i < this.postProcessors.length; i++) {\n postProcessors.push(this.postProcessors[i].postProcessor);\n }\n return postProcessors;\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getVisitors() {\n return this.visitors;\n }\n\n visitor() {\n const self = this;\n return {\n first: function() {\n self.iterator = -1;\n return self.visitors[self.iterator];\n },\n get: function() {\n self.iterator += 1;\n return self.visitors[self.iterator];\n }\n };\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getFileManagers() {\n return this.fileManagers;\n }\n}\n\nlet pm;\n\nconst PluginManagerFactory = function(less, newFactory) {\n if (newFactory || !pm) {\n pm = new PluginManager(less);\n }\n return pm;\n};\n\n//\nexport default PluginManagerFactory;\n","/* global window, XMLHttpRequest */\n\nimport AbstractFileManager from '../less/environment/abstract-file-manager.js';\n\nlet options;\nlet logger;\nlet fileCache = {};\n\n// TODOS - move log somewhere. pathDiff and doing something similar in node. use pathDiff in the other browser file for the initial load\nclass FileManager extends AbstractFileManager {\n alwaysMakePathsAbsolute() {\n return true;\n }\n\n join(basePath, laterPath) {\n if (!basePath) {\n return laterPath;\n }\n return this.extractUrlParts(laterPath, basePath).path;\n }\n\n doXHR(url, type, callback, errback) {\n const xhr = new XMLHttpRequest();\n const async = options.isFileProtocol ? options.fileAsync : true;\n\n if (typeof xhr.overrideMimeType === 'function') {\n xhr.overrideMimeType('text/css');\n }\n logger.debug(`XHR: Getting '${url}'`);\n xhr.open('GET', url, async);\n xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5');\n xhr.send(null);\n\n function handleResponse(xhr, callback, errback) {\n if (xhr.status >= 200 && xhr.status < 300) {\n callback(xhr.responseText,\n xhr.getResponseHeader('Last-Modified'));\n } else if (typeof errback === 'function') {\n errback(xhr.status, url);\n }\n }\n\n if (options.isFileProtocol && !options.fileAsync) {\n if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) {\n callback(xhr.responseText);\n } else {\n errback(xhr.status, url);\n }\n } else if (async) {\n xhr.onreadystatechange = () => {\n if (xhr.readyState == 4) {\n handleResponse(xhr, callback, errback);\n }\n };\n } else {\n handleResponse(xhr, callback, errback);\n }\n }\n\n supports() {\n return true;\n }\n\n clearFileCache() {\n fileCache = {};\n }\n\n loadFile(filename, currentDirectory, options, environment) {\n // TODO: Add prefix support like less-node?\n // What about multiple paths?\n\n if (currentDirectory && !this.isPathAbsolute(filename)) {\n filename = currentDirectory + filename;\n }\n\n filename = options.ext ? this.tryAppendExtension(filename, options.ext) : filename;\n\n options = options || {};\n\n // sheet may be set to the stylesheet for the initial load or a collection of properties including\n // some context variables for imports\n const hrefParts = this.extractUrlParts(filename, window.location.href);\n const href = hrefParts.url;\n const self = this;\n \n return new Promise((resolve, reject) => {\n if (options.useFileCache && fileCache[href]) {\n try {\n const lessText = fileCache[href];\n return resolve({ contents: lessText, filename: href, webInfo: { lastModified: new Date() }});\n } catch (e) {\n return reject({ filename: href, message: `Error loading file ${href} error was ${e.message}` });\n }\n }\n\n self.doXHR(href, options.mime, function doXHRCallback(data, lastModified) {\n // per file cache\n fileCache[href] = data;\n\n // Use remote copy (re-parse)\n resolve({ contents: data, filename: href, webInfo: { lastModified }});\n }, function doXHRError(status, url) {\n reject({ type: 'File', message: `'${url}' wasn't found (${status})`, href });\n });\n });\n }\n}\n\nexport default (opts, log) => {\n options = opts;\n logger = log;\n return FileManager;\n}\n","import Environment from './environment/environment';\nimport data from './data';\nimport tree from './tree';\nimport AbstractFileManager from './environment/abstract-file-manager';\nimport AbstractPluginLoader from './environment/abstract-plugin-loader';\nimport visitors from './visitors';\nimport Parser from './parser/parser';\nimport functions from './functions';\nimport contexts from './contexts';\nimport LessError from './less-error';\nimport transformTree from './transform-tree';\nimport * as utils from './utils';\nimport PluginManager from './plugin-manager';\nimport logger from './logger';\nimport SourceMapOutput from './source-map-output';\nimport SourceMapBuilder from './source-map-builder';\nimport ParseTree from './parse-tree';\nimport ImportManager from './import-manager';\nimport Parse from './parse';\nimport Render from './render';\n\nexport default function(environment, fileManagers) {\n let sourceMapOutput, sourceMapBuilder, parseTree, importManager;\n\n environment = new Environment(environment, fileManagers);\n sourceMapOutput = SourceMapOutput(environment);\n sourceMapBuilder = SourceMapBuilder(sourceMapOutput, environment);\n parseTree = ParseTree(sourceMapBuilder);\n importManager = ImportManager(environment);\n\n const render = Render(environment, parseTree, importManager);\n const parse = Parse(environment, parseTree, importManager);\n\n const initial = {\n version: [4, 0, 0],\n data,\n tree,\n Environment,\n AbstractFileManager,\n AbstractPluginLoader,\n environment,\n visitors,\n Parser,\n functions: functions(environment),\n contexts,\n SourceMapOutput: sourceMapOutput,\n SourceMapBuilder: sourceMapBuilder,\n ParseTree: parseTree,\n ImportManager: importManager,\n render,\n parse,\n LessError,\n transformTree,\n utils,\n PluginManager,\n logger\n };\n\n // Create a public API\n\n const ctor = function(t) {\n return function() {\n const obj = Object.create(t.prototype);\n t.apply(obj, Array.prototype.slice.call(arguments, 0));\n return obj;\n };\n };\n let t;\n const api = Object.create(initial);\n for (const n in initial.tree) {\n /* eslint guard-for-in: 0 */\n t = initial.tree[n];\n if (typeof t === 'function') {\n api[n.toLowerCase()] = ctor(t);\n }\n else {\n api[n] = Object.create(null);\n for (const o in t) {\n /* eslint guard-for-in: 0 */\n api[n][o.toLowerCase()] = ctor(t[o]);\n }\n }\n }\n\n /**\n * Some of the functions assume a `this` context of the API object,\n * which causes it to fail when wrapped for ES6 imports.\n * \n * An assumed `this` should be removed in the future.\n */\n initial.parse = initial.parse.bind(api);\n initial.render = initial.render.bind(api);\n\n return api;\n};\n","import LessError from './less-error';\nimport transformTree from './transform-tree';\nimport logger from './logger';\n\nexport default function(SourceMapBuilder) {\n class ParseTree {\n constructor(root, imports) {\n this.root = root;\n this.imports = imports;\n }\n\n toCSS(options) {\n let evaldRoot;\n const result = {};\n let sourceMapBuilder;\n try {\n evaldRoot = transformTree(this.root, options);\n } catch (e) {\n throw new LessError(e, this.imports);\n }\n\n try {\n const compress = Boolean(options.compress);\n if (compress) {\n logger.warn('The compress option has been deprecated. ' + \n 'We recommend you use a dedicated css minifier, for instance see less-plugin-clean-css.');\n }\n\n const toCSSOptions = {\n compress,\n dumpLineNumbers: options.dumpLineNumbers,\n strictUnits: Boolean(options.strictUnits),\n numPrecision: 8};\n\n if (options.sourceMap) {\n sourceMapBuilder = new SourceMapBuilder(options.sourceMap);\n result.css = sourceMapBuilder.toCSS(evaldRoot, toCSSOptions, this.imports);\n } else {\n result.css = evaldRoot.toCSS(toCSSOptions);\n }\n } catch (e) {\n throw new LessError(e, this.imports);\n }\n\n if (options.pluginManager) {\n const postProcessors = options.pluginManager.getPostProcessors();\n for (let i = 0; i < postProcessors.length; i++) {\n result.css = postProcessors[i].process(result.css, { sourceMap: sourceMapBuilder, options, imports: this.imports });\n }\n }\n if (options.sourceMap) {\n result.map = sourceMapBuilder.getExternalSourceMap();\n }\n\n result.imports = [];\n for (const file in this.imports.files) {\n if (this.imports.files.hasOwnProperty(file) && file !== this.imports.rootFilename) {\n result.imports.push(file);\n }\n }\n return result;\n }\n }\n\n return ParseTree;\n};\n","export default function (SourceMapOutput, environment) {\n class SourceMapBuilder {\n constructor(options) {\n this.options = options;\n }\n\n toCSS(rootNode, options, imports) {\n const sourceMapOutput = new SourceMapOutput(\n {\n contentsIgnoredCharsMap: imports.contentsIgnoredChars,\n rootNode,\n contentsMap: imports.contents,\n sourceMapFilename: this.options.sourceMapFilename,\n sourceMapURL: this.options.sourceMapURL,\n outputFilename: this.options.sourceMapOutputFilename,\n sourceMapBasepath: this.options.sourceMapBasepath,\n sourceMapRootpath: this.options.sourceMapRootpath,\n outputSourceFiles: this.options.outputSourceFiles,\n sourceMapGenerator: this.options.sourceMapGenerator,\n sourceMapFileInline: this.options.sourceMapFileInline, \n disableSourcemapAnnotation: this.options.disableSourcemapAnnotation\n });\n\n const css = sourceMapOutput.toCSS(options);\n this.sourceMap = sourceMapOutput.sourceMap;\n this.sourceMapURL = sourceMapOutput.sourceMapURL;\n if (this.options.sourceMapInputFilename) {\n this.sourceMapInputFilename = sourceMapOutput.normalizeFilename(this.options.sourceMapInputFilename);\n }\n if (this.options.sourceMapBasepath !== undefined && this.sourceMapURL !== undefined) {\n this.sourceMapURL = sourceMapOutput.removeBasepath(this.sourceMapURL);\n }\n return css + this.getCSSAppendage();\n }\n\n getCSSAppendage() {\n\n let sourceMapURL = this.sourceMapURL;\n if (this.options.sourceMapFileInline) {\n if (this.sourceMap === undefined) {\n return '';\n }\n sourceMapURL = `data:application/json;base64,${environment.encodeBase64(this.sourceMap)}`;\n }\n\n if (this.options.disableSourcemapAnnotation) {\n return '';\n }\n\n if (sourceMapURL) {\n return `/*# sourceMappingURL=${sourceMapURL} */`;\n }\n return '';\n }\n\n getExternalSourceMap() {\n return this.sourceMap;\n }\n\n setExternalSourceMap(sourceMap) {\n this.sourceMap = sourceMap;\n }\n\n isInline() {\n return this.options.sourceMapFileInline;\n }\n\n getSourceMapURL() {\n return this.sourceMapURL;\n }\n\n getOutputFilename() {\n return this.options.sourceMapOutputFilename;\n }\n\n getInputFilename() {\n return this.sourceMapInputFilename;\n }\n }\n\n return SourceMapBuilder;\n};\n","export default function (environment) {\n class SourceMapOutput {\n constructor(options) {\n this._css = [];\n this._rootNode = options.rootNode;\n this._contentsMap = options.contentsMap;\n this._contentsIgnoredCharsMap = options.contentsIgnoredCharsMap;\n if (options.sourceMapFilename) {\n this._sourceMapFilename = options.sourceMapFilename.replace(/\\\\/g, '/');\n }\n this._outputFilename = options.outputFilename;\n this.sourceMapURL = options.sourceMapURL;\n if (options.sourceMapBasepath) {\n this._sourceMapBasepath = options.sourceMapBasepath.replace(/\\\\/g, '/');\n }\n if (options.sourceMapRootpath) {\n this._sourceMapRootpath = options.sourceMapRootpath.replace(/\\\\/g, '/');\n if (this._sourceMapRootpath.charAt(this._sourceMapRootpath.length - 1) !== '/') {\n this._sourceMapRootpath += '/';\n }\n } else {\n this._sourceMapRootpath = '';\n }\n this._outputSourceFiles = options.outputSourceFiles;\n this._sourceMapGeneratorConstructor = environment.getSourceMapGenerator();\n\n this._lineNumber = 0;\n this._column = 0;\n }\n\n removeBasepath(path) {\n if (this._sourceMapBasepath && path.indexOf(this._sourceMapBasepath) === 0) {\n path = path.substring(this._sourceMapBasepath.length);\n if (path.charAt(0) === '\\\\' || path.charAt(0) === '/') {\n path = path.substring(1);\n }\n }\n\n return path;\n }\n\n normalizeFilename(filename) {\n filename = filename.replace(/\\\\/g, '/');\n filename = this.removeBasepath(filename);\n return (this._sourceMapRootpath || '') + filename;\n }\n\n add(chunk, fileInfo, index, mapLines) {\n\n // ignore adding empty strings\n if (!chunk) {\n return;\n }\n\n let lines, sourceLines, columns, sourceColumns, i;\n\n if (fileInfo && fileInfo.filename) {\n let inputSource = this._contentsMap[fileInfo.filename];\n\n // remove vars/banner added to the top of the file\n if (this._contentsIgnoredCharsMap[fileInfo.filename]) {\n // adjust the index\n index -= this._contentsIgnoredCharsMap[fileInfo.filename];\n if (index < 0) { index = 0; }\n // adjust the source\n inputSource = inputSource.slice(this._contentsIgnoredCharsMap[fileInfo.filename]);\n }\n\n // ignore empty content\n if (inputSource === undefined) {\n return;\n }\n\n inputSource = inputSource.substring(0, index);\n sourceLines = inputSource.split('\\n');\n sourceColumns = sourceLines[sourceLines.length - 1];\n }\n\n lines = chunk.split('\\n');\n columns = lines[lines.length - 1];\n\n if (fileInfo && fileInfo.filename) {\n if (!mapLines) {\n this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + 1, column: this._column},\n original: { line: sourceLines.length, column: sourceColumns.length},\n source: this.normalizeFilename(fileInfo.filename)});\n } else {\n for (i = 0; i < lines.length; i++) {\n this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + i + 1, column: i === 0 ? this._column : 0},\n original: { line: sourceLines.length + i, column: i === 0 ? sourceColumns.length : 0},\n source: this.normalizeFilename(fileInfo.filename)});\n }\n }\n }\n\n if (lines.length === 1) {\n this._column += columns.length;\n } else {\n this._lineNumber += lines.length - 1;\n this._column = columns.length;\n }\n\n this._css.push(chunk);\n }\n\n isEmpty() {\n return this._css.length === 0;\n }\n\n toCSS(context) {\n this._sourceMapGenerator = new this._sourceMapGeneratorConstructor({ file: this._outputFilename, sourceRoot: null });\n\n if (this._outputSourceFiles) {\n for (const filename in this._contentsMap) {\n if (this._contentsMap.hasOwnProperty(filename)) {\n let source = this._contentsMap[filename];\n if (this._contentsIgnoredCharsMap[filename]) {\n source = source.slice(this._contentsIgnoredCharsMap[filename]);\n }\n this._sourceMapGenerator.setSourceContent(this.normalizeFilename(filename), source);\n }\n }\n }\n\n this._rootNode.genCSS(context, this);\n\n if (this._css.length > 0) {\n let sourceMapURL;\n const sourceMapContent = JSON.stringify(this._sourceMapGenerator.toJSON());\n\n if (this.sourceMapURL) {\n sourceMapURL = this.sourceMapURL;\n } else if (this._sourceMapFilename) {\n sourceMapURL = this._sourceMapFilename;\n }\n this.sourceMapURL = sourceMapURL;\n\n this.sourceMap = sourceMapContent;\n }\n\n return this._css.join('');\n }\n }\n\n return SourceMapOutput;\n};\n","import contexts from './contexts';\nimport Parser from './parser/parser';\nimport LessError from './less-error';\nimport * as utils from './utils';\nimport logger from './logger';\n\nexport default function(environment) {\n // FileInfo = {\n // 'rewriteUrls' - option - whether to adjust URL's to be relative\n // 'filename' - full resolved filename of current file\n // 'rootpath' - path to append to normal URLs for this node\n // 'currentDirectory' - path to the current file, absolute\n // 'rootFilename' - filename of the base file\n // 'entryPath' - absolute path to the entry file\n // 'reference' - whether the file should not be output and only output parts that are referenced\n\n class ImportManager {\n constructor(less, context, rootFileInfo) {\n this.less = less;\n this.rootFilename = rootFileInfo.filename;\n this.paths = context.paths || []; // Search paths, when importing\n this.contents = {}; // map - filename to contents of all the files\n this.contentsIgnoredChars = {}; // map - filename to lines at the beginning of each file to ignore\n this.mime = context.mime;\n this.error = null;\n this.context = context;\n // Deprecated? Unused outside of here, could be useful.\n this.queue = []; // Files which haven't been imported yet\n this.files = {}; // Holds the imported parse trees.\n }\n\n /**\n * Add an import to be imported\n * @param path - the raw path\n * @param tryAppendExtension - whether to try appending a file extension (.less or .js if the path has no extension)\n * @param currentFileInfo - the current file info (used for instance to work out relative paths)\n * @param importOptions - import options\n * @param callback - callback for when it is imported\n */\n push(path, tryAppendExtension, currentFileInfo, importOptions, callback) {\n const importManager = this, pluginLoader = this.context.pluginManager.Loader;\n\n this.queue.push(path);\n\n const fileParsedFunc = function (e, root, fullPath) {\n importManager.queue.splice(importManager.queue.indexOf(path), 1); // Remove the path from the queue\n\n const importedEqualsRoot = fullPath === importManager.rootFilename;\n if (importOptions.optional && e) {\n callback(null, {rules:[]}, false, null);\n logger.info(`The file ${fullPath} was skipped because it was not found and the import was marked optional.`);\n }\n else {\n // Inline imports aren't cached here.\n // If we start to cache them, please make sure they won't conflict with non-inline imports of the\n // same name as they used to do before this comment and the condition below have been added.\n if (!importManager.files[fullPath] && !importOptions.inline) {\n importManager.files[fullPath] = { root, options: importOptions };\n }\n if (e && !importManager.error) { importManager.error = e; }\n callback(e, root, importedEqualsRoot, fullPath);\n }\n };\n\n const newFileInfo = {\n rewriteUrls: this.context.rewriteUrls,\n entryPath: currentFileInfo.entryPath,\n rootpath: currentFileInfo.rootpath,\n rootFilename: currentFileInfo.rootFilename\n };\n\n const fileManager = environment.getFileManager(path, currentFileInfo.currentDirectory, this.context, environment);\n\n if (!fileManager) {\n fileParsedFunc({ message: `Could not find a file-manager for ${path}` });\n return;\n }\n\n const loadFileCallback = function(loadedFile) {\n let plugin;\n const resolvedFilename = loadedFile.filename;\n const contents = loadedFile.contents.replace(/^\\uFEFF/, '');\n\n // Pass on an updated rootpath if path of imported file is relative and file\n // is in a (sub|sup) directory\n //\n // Examples:\n // - If path of imported file is 'module/nav/nav.less' and rootpath is 'less/',\n // then rootpath should become 'less/module/nav/'\n // - If path of imported file is '../mixins.less' and rootpath is 'less/',\n // then rootpath should become 'less/../'\n newFileInfo.currentDirectory = fileManager.getPath(resolvedFilename);\n if (newFileInfo.rewriteUrls) {\n newFileInfo.rootpath = fileManager.join(\n (importManager.context.rootpath || ''),\n fileManager.pathDiff(newFileInfo.currentDirectory, newFileInfo.entryPath));\n\n if (!fileManager.isPathAbsolute(newFileInfo.rootpath) && fileManager.alwaysMakePathsAbsolute()) {\n newFileInfo.rootpath = fileManager.join(newFileInfo.entryPath, newFileInfo.rootpath);\n }\n }\n newFileInfo.filename = resolvedFilename;\n\n const newEnv = new contexts.Parse(importManager.context);\n\n newEnv.processImports = false;\n importManager.contents[resolvedFilename] = contents;\n\n if (currentFileInfo.reference || importOptions.reference) {\n newFileInfo.reference = true;\n }\n\n if (importOptions.isPlugin) {\n plugin = pluginLoader.evalPlugin(contents, newEnv, importManager, importOptions.pluginArgs, newFileInfo);\n if (plugin instanceof LessError) {\n fileParsedFunc(plugin, null, resolvedFilename);\n }\n else {\n fileParsedFunc(null, plugin, resolvedFilename);\n }\n } else if (importOptions.inline) {\n fileParsedFunc(null, contents, resolvedFilename);\n } else {\n\n // import (multiple) parse trees apparently get altered and can't be cached.\n // TODO: investigate why this is\n if (importManager.files[resolvedFilename]\n && !importManager.files[resolvedFilename].options.multiple\n && !importOptions.multiple) {\n\n fileParsedFunc(null, importManager.files[resolvedFilename].root, resolvedFilename);\n }\n else {\n new Parser(newEnv, importManager, newFileInfo).parse(contents, function (e, root) {\n fileParsedFunc(e, root, resolvedFilename);\n });\n }\n }\n };\n let loadedFile;\n let promise;\n const context = utils.clone(this.context);\n\n if (tryAppendExtension) {\n context.ext = importOptions.isPlugin ? '.js' : '.less';\n }\n\n if (importOptions.isPlugin) {\n context.mime = 'application/javascript';\n\n if (context.syncImport) {\n loadedFile = pluginLoader.loadPluginSync(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n } else {\n promise = pluginLoader.loadPlugin(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n }\n }\n else {\n if (context.syncImport) {\n loadedFile = fileManager.loadFileSync(path, currentFileInfo.currentDirectory, context, environment);\n } else {\n promise = fileManager.loadFile(path, currentFileInfo.currentDirectory, context, environment,\n (err, loadedFile) => {\n if (err) {\n fileParsedFunc(err);\n } else {\n loadFileCallback(loadedFile);\n }\n });\n }\n }\n if (loadedFile) {\n if (!loadedFile.filename) {\n fileParsedFunc(loadedFile);\n } else {\n loadFileCallback(loadedFile);\n }\n } else if (promise) {\n promise.then(loadFileCallback, fileParsedFunc);\n }\n }\n }\n\n return ImportManager;\n};\n","import * as utils from './utils';\n\nexport default function(environment, ParseTree, ImportManager) {\n const render = function (input, options, callback) {\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(this.options, {});\n }\n else {\n options = utils.copyOptions(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n return new Promise(function (resolve, reject) {\n render.call(self, input, options, function(err, output) {\n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n this.parse(input, options, function(err, root, imports, options) {\n if (err) { return callback(err); }\n\n let result;\n try {\n const parseTree = new ParseTree(root, imports);\n result = parseTree.toCSS(options);\n }\n catch (err) { return callback(err); }\n\n callback(null, result);\n });\n }\n };\n\n return render;\n};\n","import contexts from './contexts';\nimport Parser from './parser/parser';\nimport PluginManager from './plugin-manager';\nimport LessError from './less-error';\nimport * as utils from './utils';\n\nexport default function(environment, ParseTree, ImportManager) {\n const parse = function (input, options, callback) {\n\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(this.options, {});\n }\n else {\n options = utils.copyOptions(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n return new Promise(function (resolve, reject) {\n parse.call(self, input, options, function(err, output) {\n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n let context;\n let rootFileInfo;\n const pluginManager = new PluginManager(this, !options.reUsePluginManager);\n\n options.pluginManager = pluginManager;\n\n context = new contexts.Parse(options);\n\n if (options.rootFileInfo) {\n rootFileInfo = options.rootFileInfo;\n } else {\n const filename = options.filename || 'input';\n const entryPath = filename.replace(/[^\\/\\\\]*$/, '');\n rootFileInfo = {\n filename,\n rewriteUrls: context.rewriteUrls,\n rootpath: context.rootpath || '',\n currentDirectory: entryPath,\n entryPath,\n rootFilename: filename\n };\n // add in a missing trailing slash\n if (rootFileInfo.rootpath && rootFileInfo.rootpath.slice(-1) !== '/') {\n rootFileInfo.rootpath += '/';\n }\n }\n\n const imports = new ImportManager(this, context, rootFileInfo);\n this.importManager = imports;\n\n // TODO: allow the plugins to be just a list of paths or names\n // Do an async plugin queue like lessc\n\n if (options.plugins) {\n options.plugins.forEach(function(plugin) {\n let evalResult, contents;\n if (plugin.fileContent) {\n contents = plugin.fileContent.replace(/^\\uFEFF/, '');\n evalResult = pluginManager.Loader.evalPlugin(contents, context, imports, plugin.options, plugin.filename);\n if (evalResult instanceof LessError) {\n return callback(evalResult);\n }\n }\n else {\n pluginManager.addPlugin(plugin);\n }\n });\n }\n\n new Parser(context, imports, rootFileInfo)\n .parse(input, function (e, root) {\n if (e) { return callback(e); }\n callback(null, root, imports, options);\n }, options);\n }\n };\n return parse;\n};\n","// TODO: Add tests for browser @plugin\n/* global window */\n\nimport AbstractPluginLoader from '../less/environment/abstract-plugin-loader.js';\n\n/**\n * Browser Plugin Loader\n */\nclass PluginLoader extends AbstractPluginLoader {\n constructor(less) {\n super();\n\n this.less = less;\n // Should we shim this.require for browser? Probably not?\n }\n\n loadPlugin(filename, basePath, context, environment, fileManager) {\n return new Promise((fulfill, reject) => {\n fileManager.loadFile(filename, basePath, context, environment)\n .then(fulfill).catch(reject);\n });\n }\n}\n\nexport default PluginLoader;\n\n","import * as utils from './utils';\nimport browser from './browser';\n\nexport default (window, less, options) => {\n\n function errorHTML(e, rootHref) {\n const id = `less-error-message:${utils.extractId(rootHref || '')}`;\n const template = '
  • {content}
  • ';\n const elem = window.document.createElement('div');\n let timer;\n let content;\n const errors = [];\n const filename = e.filename || rootHref;\n const filenameNoPath = filename.match(/([^\\/]+(\\?.*)?)$/)[1];\n\n elem.id = id;\n elem.className = 'less-error-message';\n\n content = `

    ${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'}` + \n `

    in ${filenameNoPath} `;\n\n const errorline = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\{content\\}/, e.extract[i]));\n }\n };\n\n if (e.line) {\n errorline(e, 0, '');\n errorline(e, 1, 'line');\n errorline(e, 2, '');\n content += `on line ${e.line}, column ${e.column + 1}:

      ${errors.join('')}
    `;\n }\n if (e.stack && (e.extract || options.logLevel >= 4)) {\n content += `
    Stack Trace
    ${e.stack.split('\\n').slice(1).join('
    ')}`;\n }\n elem.innerHTML = content;\n\n // CSS for error messages\n browser.createCSS(window.document, [\n '.less-error-message ul, .less-error-message li {',\n 'list-style-type: none;',\n 'margin-right: 15px;',\n 'padding: 4px 0;',\n 'margin: 0;',\n '}',\n '.less-error-message label {',\n 'font-size: 12px;',\n 'margin-right: 15px;',\n 'padding: 4px 0;',\n 'color: #cc7777;',\n '}',\n '.less-error-message pre {',\n 'color: #dd6666;',\n 'padding: 4px 0;',\n 'margin: 0;',\n 'display: inline-block;',\n '}',\n '.less-error-message pre.line {',\n 'color: #ff0000;',\n '}',\n '.less-error-message h3 {',\n 'font-size: 20px;',\n 'font-weight: bold;',\n 'padding: 15px 0 5px 0;',\n 'margin: 0;',\n '}',\n '.less-error-message a {',\n 'color: #10a',\n '}',\n '.less-error-message .error {',\n 'color: red;',\n 'font-weight: bold;',\n 'padding-bottom: 2px;',\n 'border-bottom: 1px dashed red;',\n '}'\n ].join('\\n'), { title: 'error-message' });\n\n elem.style.cssText = [\n 'font-family: Arial, sans-serif',\n 'border: 1px solid #e00',\n 'background-color: #eee',\n 'border-radius: 5px',\n '-webkit-border-radius: 5px',\n '-moz-border-radius: 5px',\n 'color: #e00',\n 'padding: 15px',\n 'margin-bottom: 15px'\n ].join(';');\n\n if (options.env === 'development') {\n timer = setInterval(() => {\n const document = window.document;\n const body = document.body;\n if (body) {\n if (document.getElementById(id)) {\n body.replaceChild(elem, document.getElementById(id));\n } else {\n body.insertBefore(elem, body.firstChild);\n }\n clearInterval(timer);\n }\n }, 10);\n }\n }\n\n function removeErrorHTML(path) {\n const node = window.document.getElementById(`less-error-message:${utils.extractId(path)}`);\n if (node) {\n node.parentNode.removeChild(node);\n }\n }\n\n function removeErrorConsole(path) {\n // no action\n }\n\n function removeError(path) {\n if (!options.errorReporting || options.errorReporting === 'html') {\n removeErrorHTML(path);\n } else if (options.errorReporting === 'console') {\n removeErrorConsole(path);\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('remove', path);\n }\n }\n\n function errorConsole(e, rootHref) {\n const template = '{line} {content}';\n const filename = e.filename || rootHref;\n const errors = [];\n let content = `${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'} in ${filename}`;\n\n const errorline = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\{content\\}/, e.extract[i]));\n }\n };\n\n if (e.line) {\n errorline(e, 0, '');\n errorline(e, 1, 'line');\n errorline(e, 2, '');\n content += ` on line ${e.line}, column ${e.column + 1}:\\n${errors.join('\\n')}`;\n }\n if (e.stack && (e.extract || options.logLevel >= 4)) {\n content += `\\nStack Trace\\n${e.stack}`;\n }\n less.logger.error(content);\n }\n\n function error(e, rootHref) {\n if (!options.errorReporting || options.errorReporting === 'html') {\n errorHTML(e, rootHref);\n } else if (options.errorReporting === 'console') {\n errorConsole(e, rootHref);\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('add', e, rootHref);\n }\n }\n\n return {\n add: error,\n remove: removeError\n };\n};\n","/**\n * Kicks off less and compiles any stylesheets\n * used in the browser distributed version of less\n * to kick-start less using the browser api\n */\n/* global window, document */\n\nimport defaultOptions from '../less/default-options';\nimport addDefaultOptions from './add-default-options';\nimport root from './index';\n\nconst options = defaultOptions();\n\nif (window.less) {\n for (const key in window.less) {\n if (window.less.hasOwnProperty(key)) {\n options[key] = window.less[key];\n }\n }\n}\naddDefaultOptions(window, options);\n\noptions.plugins = options.plugins || [];\n\nif (window.LESS_PLUGINS) {\n options.plugins = options.plugins.concat(window.LESS_PLUGINS);\n}\n\nconst less = root(window, options);\nexport default less;\n\nwindow.less = less;\n\nlet css;\nlet head;\nlet style;\n\n// Always restore page visibility\nfunction resolveOrReject(data) {\n if (data.filename) {\n console.warn(data);\n }\n if (!options.async) {\n head.removeChild(style);\n }\n}\n\nif (options.onReady) {\n if (/!watch/.test(window.location.hash)) {\n less.watch();\n }\n // Simulate synchronous stylesheet loading by hiding page rendering\n if (!options.async) {\n css = 'body { display: none !important }';\n head = document.head || document.getElementsByTagName('head')[0];\n style = document.createElement('style');\n\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n\n head.appendChild(style);\n }\n less.registerStylesheetsImmediately();\n less.pageLoadFinished = less.refresh(less.env === 'development').then(resolveOrReject, resolveOrReject);\n}\n","// Export a new default each time\nexport default function() {\n return {\n /* Inline Javascript - @plugin still allowed */\n javascriptEnabled: false,\n\n /* Outputs a makefile import dependency list to stdout. */\n depends: false,\n\n /* (DEPRECATED) Compress using less built-in compression. \n * This does an okay job but does not utilise all the tricks of \n * dedicated css compression. */\n compress: false,\n\n /* Runs the less parser and just reports errors without any output. */\n lint: false,\n\n /* Sets available include paths.\n * If the file in an @import rule does not exist at that exact location, \n * less will look for it at the location(s) passed to this option. \n * You might use this for instance to specify a path to a library which \n * you want to be referenced simply and relatively in the less files. */\n paths: [],\n\n /* color output in the terminal */\n color: true,\n\n /* The strictImports controls whether the compiler will allow an @import inside of either \n * @media blocks or (a later addition) other selector blocks.\n * See: https://github.com/less/less.js/issues/656 */\n strictImports: false,\n\n /* Allow Imports from Insecure HTTPS Hosts */\n insecure: false,\n\n /* Allows you to add a path to every generated import and url in your css. \n * This does not affect less import statements that are processed, just ones \n * that are left in the output css. */\n rootpath: '',\n\n /* By default URLs are kept as-is, so if you import a file in a sub-directory \n * that references an image, exactly the same URL will be output in the css. \n * This option allows you to re-write URL's in imported files so that the \n * URL is always relative to the base imported file */\n rewriteUrls: false,\n\n /* How to process math \n * 0 always - eagerly try to solve all operations\n * 1 parens-division - require parens for division \"/\"\n * 2 parens | strict - require parens for all operations\n * 3 strict-legacy - legacy strict behavior (super-strict)\n */\n math: 1,\n\n /* Without this option, less attempts to guess at the output unit when it does maths. */\n strictUnits: false,\n\n /* Effectively the declaration is put at the top of your base Less file, \n * meaning it can be used but it also can be overridden if this variable \n * is defined in the file. */\n globalVars: null,\n\n /* As opposed to the global variable option, this puts the declaration at the\n * end of your base file, meaning it will override anything defined in your Less file. */\n modifyVars: null,\n\n /* This option allows you to specify a argument to go on to every URL. */\n urlArgs: ''\n }\n};","import {addDataAttr} from './utils';\nimport browser from './browser';\n\nexport default (window, options) => {\n\n // use options from the current script tag data attribues\n addDataAttr(options, browser.currentScript(window));\n\n if (options.isFileProtocol === undefined) {\n options.isFileProtocol = /^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(window.location.protocol);\n }\n\n // Load styles asynchronously (default: false)\n //\n // This is set to `false` by default, so that the body\n // doesn't start loading before the stylesheets are parsed.\n // Setting this to `true` can result in flickering.\n //\n options.async = options.async || false;\n options.fileAsync = options.fileAsync || false;\n\n // Interval between watch polls\n options.poll = options.poll || (options.isFileProtocol ? 1000 : 1500);\n\n options.env = options.env || (window.location.hostname == '127.0.0.1' ||\n window.location.hostname == '0.0.0.0' ||\n window.location.hostname == 'localhost' ||\n (window.location.port &&\n window.location.port.length > 0) ||\n options.isFileProtocol ? 'development'\n : 'production');\n\n const dumpLineNumbers = /!dumpLineNumbers:(comments|mediaquery|all)/.exec(window.location.hash);\n if (dumpLineNumbers) {\n options.dumpLineNumbers = dumpLineNumbers[1];\n }\n\n if (options.useFileCache === undefined) {\n options.useFileCache = true;\n }\n\n if (options.onReady === undefined) {\n options.onReady = true;\n }\n\n if (options.relativeUrls) {\n options.rewriteUrls = 'all';\n }\n};\n","//\n// index.js\n// Should expose the additional browser functions on to the less object\n//\nimport {addDataAttr} from './utils';\nimport lessRoot from '../less';\nimport browser from './browser';\nimport FM from './file-manager';\nimport PluginLoader from './plugin-loader';\nimport LogListener from './log-listener';\nimport ErrorReporting from './error-reporting';\nimport Cache from './cache';\nimport ImageSize from './image-size';\n\nexport default (window, options) => {\n const document = window.document;\n const less = lessRoot();\n\n less.options = options;\n const environment = less.environment;\n const FileManager = FM(options, less.logger);\n const fileManager = new FileManager();\n environment.addFileManager(fileManager);\n less.FileManager = FileManager;\n less.PluginLoader = PluginLoader;\n\n LogListener(less, options);\n const errors = ErrorReporting(window, less, options);\n const cache = less.cache = options.cache || Cache(window, options, less.logger);\n ImageSize(less.environment);\n\n // Setup user functions - Deprecate?\n if (options.functions) {\n less.functions.functionRegistry.addMultiple(options.functions);\n }\n\n const typePattern = /^text\\/(x-)?less$/;\n\n function clone(obj) {\n const cloned = {};\n for (const prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n cloned[prop] = obj[prop];\n }\n }\n return cloned;\n }\n\n // only really needed for phantom\n function bind(func, thisArg) {\n const curryArgs = Array.prototype.slice.call(arguments, 2);\n return function() {\n const args = curryArgs.concat(Array.prototype.slice.call(arguments, 0));\n return func.apply(thisArg, args);\n };\n }\n\n function loadStyles(modifyVars) {\n const styles = document.getElementsByTagName('style');\n let style;\n\n for (let i = 0; i < styles.length; i++) {\n style = styles[i];\n if (style.type.match(typePattern)) {\n const instanceOptions = clone(options);\n instanceOptions.modifyVars = modifyVars;\n const lessText = style.innerHTML || '';\n instanceOptions.filename = document.location.href.replace(/#.*$/, '');\n\n /* jshint loopfunc:true */\n // use closure to store current style\n less.render(lessText, instanceOptions,\n bind((style, e, result) => {\n if (e) {\n errors.add(e, 'inline');\n } else {\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = result.css;\n } else {\n style.innerHTML = result.css;\n }\n }\n }, null, style));\n }\n }\n }\n\n function loadStyleSheet(sheet, callback, reload, remaining, modifyVars) {\n\n const instanceOptions = clone(options);\n addDataAttr(instanceOptions, sheet);\n instanceOptions.mime = sheet.type;\n\n if (modifyVars) {\n instanceOptions.modifyVars = modifyVars;\n }\n\n function loadInitialFileCallback(loadedFile) {\n const data = loadedFile.contents;\n const path = loadedFile.filename;\n const webInfo = loadedFile.webInfo;\n\n const newFileInfo = {\n currentDirectory: fileManager.getPath(path),\n filename: path,\n rootFilename: path,\n rewriteUrls: instanceOptions.rewriteUrls\n };\n\n newFileInfo.entryPath = newFileInfo.currentDirectory;\n newFileInfo.rootpath = instanceOptions.rootpath || newFileInfo.currentDirectory;\n\n if (webInfo) {\n webInfo.remaining = remaining;\n\n const css = cache.getCSS(path, webInfo, instanceOptions.modifyVars);\n if (!reload && css) {\n webInfo.local = true;\n callback(null, css, data, sheet, webInfo, path);\n return;\n }\n\n }\n\n // TODO add tests around how this behaves when reloading\n errors.remove(path);\n\n instanceOptions.rootFileInfo = newFileInfo;\n less.render(data, instanceOptions, (e, result) => {\n if (e) {\n e.href = path;\n callback(e);\n } else {\n cache.setCSS(sheet.href, webInfo.lastModified, instanceOptions.modifyVars, result.css);\n callback(null, result.css, data, sheet, webInfo, path);\n }\n });\n }\n\n fileManager.loadFile(sheet.href, null, instanceOptions, environment)\n .then(loadedFile => {\n loadInitialFileCallback(loadedFile);\n }).catch(err => {\n console.log(err);\n callback(err);\n });\n\n }\n\n function loadStyleSheets(callback, reload, modifyVars) {\n for (let i = 0; i < less.sheets.length; i++) {\n loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1), modifyVars);\n }\n }\n\n function initRunningMode() {\n if (less.env === 'development') {\n less.watchTimer = setInterval(() => {\n if (less.watchMode) {\n fileManager.clearFileCache();\n loadStyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n } else if (css) {\n browser.createCSS(window.document, css, sheet);\n }\n });\n }\n }, options.poll);\n }\n }\n\n //\n // Watch mode\n //\n less.watch = function () {\n if (!less.watchMode ) {\n less.env = 'development';\n initRunningMode();\n }\n this.watchMode = true;\n return true;\n };\n\n less.unwatch = function () {clearInterval(less.watchTimer); this.watchMode = false; return false; };\n\n //\n // Synchronously get all tags with the 'rel' attribute set to\n // \"stylesheet/less\".\n //\n less.registerStylesheetsImmediately = () => {\n const links = document.getElementsByTagName('link');\n less.sheets = [];\n\n for (let i = 0; i < links.length; i++) {\n if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) &&\n (links[i].type.match(typePattern)))) {\n less.sheets.push(links[i]);\n }\n }\n };\n\n //\n // Asynchronously get all tags with the 'rel' attribute set to\n // \"stylesheet/less\", returning a Promise.\n //\n less.registerStylesheets = () => new Promise((resolve, reject) => {\n less.registerStylesheetsImmediately();\n resolve();\n });\n\n //\n // With this function, it's possible to alter variables and re-render\n // CSS without reloading less-files\n //\n less.modifyVars = record => less.refresh(true, record, false);\n\n less.refresh = (reload, modifyVars, clearFileCache) => {\n if ((reload || clearFileCache) && clearFileCache !== false) {\n fileManager.clearFileCache();\n }\n return new Promise((resolve, reject) => {\n let startTime;\n let endTime;\n let totalMilliseconds;\n let remainingSheets;\n startTime = endTime = new Date();\n\n // Set counter for remaining unprocessed sheets\n remainingSheets = less.sheets.length;\n\n if (remainingSheets === 0) {\n\n endTime = new Date();\n totalMilliseconds = endTime - startTime;\n less.logger.info('Less has finished and no sheets were loaded.');\n resolve({\n startTime,\n endTime,\n totalMilliseconds,\n sheets: less.sheets.length\n });\n\n } else {\n // Relies on less.sheets array, callback seems to be guaranteed to be called for every element of the array\n loadStyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n reject(e);\n return;\n }\n if (webInfo.local) {\n less.logger.info(`Loading ${sheet.href} from cache.`);\n } else {\n less.logger.info(`Rendered ${sheet.href} successfully.`);\n }\n browser.createCSS(window.document, css, sheet);\n less.logger.info(`CSS for ${sheet.href} generated in ${new Date() - endTime}ms`);\n\n // Count completed sheet\n remainingSheets--;\n\n // Check if the last remaining sheet was processed and then call the promise\n if (remainingSheets === 0) {\n totalMilliseconds = new Date() - startTime;\n less.logger.info(`Less has finished. CSS generated in ${totalMilliseconds}ms`);\n resolve({\n startTime,\n endTime,\n totalMilliseconds,\n sheets: less.sheets.length\n });\n }\n endTime = new Date();\n }, reload, modifyVars);\n }\n\n loadStyles(modifyVars);\n });\n };\n\n less.refreshStyles = loadStyles;\n return less;\n};\n","export default (less, options) => {\n const logLevel_debug = 4;\n const logLevel_info = 3;\n const logLevel_warn = 2;\n const logLevel_error = 1;\n\n // The amount of logging in the javascript console.\n // 3 - Debug, information and errors\n // 2 - Information and errors\n // 1 - Errors\n // 0 - None\n // Defaults to 2\n options.logLevel = typeof options.logLevel !== 'undefined' ? options.logLevel : (options.env === 'development' ? logLevel_info : logLevel_error);\n\n if (!options.loggers) {\n options.loggers = [{\n debug: function(msg) {\n if (options.logLevel >= logLevel_debug) {\n console.log(msg);\n }\n },\n info: function(msg) {\n if (options.logLevel >= logLevel_info) {\n console.log(msg);\n }\n },\n warn: function(msg) {\n if (options.logLevel >= logLevel_warn) {\n console.warn(msg);\n }\n },\n error: function(msg) {\n if (options.logLevel >= logLevel_error) {\n console.error(msg);\n }\n }\n }];\n }\n for (let i = 0; i < options.loggers.length; i++) {\n less.logger.addListener(options.loggers[i]);\n }\n};\n","// Cache system is a bit outdated and could do with work\n\nexport default (window, options, logger) => {\n let cache = null;\n if (options.env !== 'development') {\n try {\n cache = (typeof window.localStorage === 'undefined') ? null : window.localStorage;\n } catch (_) {}\n }\n return {\n setCSS: function(path, lastModified, modifyVars, styles) {\n if (cache) {\n logger.info(`saving ${path} to cache.`);\n try {\n cache.setItem(path, styles);\n cache.setItem(`${path}:timestamp`, lastModified);\n if (modifyVars) {\n cache.setItem(`${path}:vars`, JSON.stringify(modifyVars));\n }\n } catch (e) {\n // TODO - could do with adding more robust error handling\n logger.error(`failed to save \"${path}\" to local storage for caching.`);\n }\n }\n },\n getCSS: function(path, webInfo, modifyVars) {\n const css = cache && cache.getItem(path);\n const timestamp = cache && cache.getItem(`${path}:timestamp`);\n let vars = cache && cache.getItem(`${path}:vars`);\n\n modifyVars = modifyVars || {};\n vars = vars || \"{}\"; // if not set, treat as the JSON representation of an empty object\n\n if (timestamp && webInfo.lastModified &&\n (new Date(webInfo.lastModified).valueOf() ===\n new Date(timestamp).valueOf()) &&\n JSON.stringify(modifyVars) === vars) {\n // Use local copy\n return css;\n }\n }\n };\n};\n","\nimport functionRegistry from './../less/functions/function-registry';\n\nexport default () => {\n function imageSize() {\n throw {\n type: 'Runtime',\n message: 'Image size functions are not supported in browser version of less'\n };\n }\n\n const imageFunctions = {\n 'image-size': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n },\n 'image-width': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n },\n 'image-height': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n }\n };\n\n functionRegistry.addMultiple(imageFunctions);\n};\n"],"names":["extractId","href","replace","addDataAttr","options","tag","opt","dataset","hasOwnProperty","JSON","parse","_","document","styles","sheet","id","title","utils.extractId","oldStyleNode","getElementById","keepOldStyleNode","styleNode","createElement","setAttribute","media","styleSheet","appendChild","createTextNode","childNodes","length","firstChild","nodeValue","head","getElementsByTagName","nextEl","nextSibling","parentNode","insertBefore","removeChild","cssText","e","Error","window","scripts","currentScript","error","msg","this","_fireEvent","warn","info","debug","addListener","listener","_listeners","push","removeListener","i","splice","type","logFunction","externalEnvironment","fileManagers","requiredFunctions","functions","concat","propName","environmentFunc","bind","Environment","filename","currentDirectory","environment","isSync","logger","pluginManager","getFileManagers","fileManager","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","darkgrey","darkgreen","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","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","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","m","cm","mm","in","px","pt","pc","duration","s","ms","angle","rad","Math","PI","deg","grad","turn","colors","unitConversions","parent","visibilityBlocks","undefined","nodeVisible","rootNode","parsed","self","Object","defineProperty","get","fileInfo","getIndex","Node","nodes","set","node","Array","isArray","forEach","_index","_fileInfo","context","strs","genCSS","add","chunk","index","isEmpty","join","output","value","visitor","visit","op","a","b","precision","numPrecision","Number","toFixed","compare","extendStatics","d","setPrototypeOf","__proto__","p","__extends","__","constructor","prototype","create","__assign","assign","t","n","arguments","call","apply","rgb","originalForm","_super","_this","match","map","c","parseInt","alpha","split","Color","r","g","pow","toCSS","doNotCompress","color","colorFunction","compress","args","fround","indexOf","clamp","round","toHSL","h","l","toRGB","splitcolor","other","_operate","toHex","max","min","v","x","keyword","key","toLowerCase","slice","toString","Paren","eval","_noSpaceCombinators"," ","|","emptyOrWhitespace","trim","Combinator","spaceOrEmpty","combinator","isVariable","currentFileInfo","visibilityInfo","copyVisibilityInfo","setParent","Element","firstSelector","charAt","ALWAYS","PARENS_DIVISION","PARENS","RewriteUrls","getLocation","inputStream","line","column","copyArray","arr","copy","clone","obj","cloned","prop","defaults","obj1","obj2","newObj","_defaults","defaults_1","copyOptions","opts","strictMath","math","Constants.Math","relativeUrls","rewriteUrls","Constants.RewriteUrls","flattenArray","result","length_1","anonymousFunc","LessError","fileContentMap","currentFilename","message","stack","input","contents","loc","utils.getLocation","col","callLine","lines","found","func","Function","lineAdjust","callExtract","extract","F","stylize","str","errorTxt","substr","elements","extendList","condition","evaldCondition","getElements","mixinElements_","Selector","visitArray","newSelector","mediaEmpty","els","parseNode","err","imports","sels","olen","len","mixinElements","shift","extend","createDerived","Value","Keyword","True","False","mapLines","rulesetLike","allowRoot","Anonymous","Boolean","MATH","name","important","merge","inline","variable","Declaration","lastRule","prevMath","evaldValue","mathBypass","evalName","importantScope","importantResult","pop","ctx","lineSeparator","dumpLineNumbers","debugInfo","asComment","asMediaQuery","lineNumber","fileName","filenameWithProtocol","test","isLineComment","Comment","getDebugInfo","isCompressed","contexts","copyFromOriginal","original","destination","propertiesToCopy","parseCopyProperties","Parse","paths","evalCopyProperties","isPathRelative","path","isPathLocalRelative","Eval","frames","enterCalc","calcStack","inCalc","exitCalc","inParenthesis","parensStack","outOfParenthesis","mathOn","isMathOn","pathRequiresRewrite","rewritePath","rootpath","newPath","normalizePath","segment","segments","reverse","makeRegistry","base","_data","addMultiple","keys","getLocalFunctions","inherit","defaultFunc","value_","error_","reset","selectors","rules","strictImports","_lookups","_variables","_properties","Ruleset","selCnt","selector","hasVariable","hasOnePassingSelector","j","toParseSelectors","utils.flattenArray","rule","subRule","utils.copyArray","ruleset","originalRuleset","root","firstRoot","allowImports","functionRegistry","globalFunctionRegistry","ctxFrames","unshift","ctxSelectors","evalImports","rsRules","evalFirst","mediaBlockCount","mediaBlocks","filter","resetCache","isJustParentSelector","bubbleSelectors","importRules","makeImportant","lastSelector","_rulesets","reduce","hash","variables","vars","name_1","name_2","decl","parseValue","properties","toParse","transformDeclaration","nodes_1","filtRules","isRuleset","foundMixins","rulesets","find","ruleNodes","tabLevel","sep","tabRuleStr","tabSetStr","charsetNodeIndex","importNodeIndex","isCharset","pathCnt","pathSubCnt","currentLastRule","isRulesetLike","isVisible","joinSelector","createParenthesis","elementsToPak","originalElement","replacementParen","insideParent","createSelector","containedElement","element","addReplacementIntoPath","beginningPath","addPath","replacedElement","originalSelector","newSelectorPath","newJoinedSelector","parentEl","restOfPath","addAllReplacementsIntoPath","addPaths","mergeElementsOnToSelectors","sel","deriveSelector","deriveFrom","newPaths","replaceParentSelector","inSelector","k","currentElements","newSelectors","selectorsMultiplied","el","maybeSelector","hadParentSelector","nestedSelector","replaced","nestedPaths","replacedNewSelectors","concatenated","isRooted","createEmptySelectors","AtRule","outputRuleset","mediaPathBackup","mediaBlocksBackup","mediaPath","ruleCnt","DetachedRuleset","numerator","denominator","backupUnit","sort","Unit","strictUnits","returnStr","is","unitString","toUpperCase","RegExp","callback","group","mapUnit","groupName","atomicUnit","counter","count","unit","parseFloat","isNaN","Dimension","isSingular","strValue","String","isLength","convertTo","usedUnits","cancel","unify","numericCompare","conversions","targetUnit","applyUnit","derivedConversions","operands","isSpaced","Operation","toColor","operate","noSpacing","Expression","returnValue","parens","doubleParen","parensInOp","functionCaller","evalArgs","commentFilter","item","subNodes","il","jl","calc","Call","currentMathContext","funcCaller","FunctionCaller","isValid","columnNumber","Variable","evaluating","frame","fun","Property","property","mergeRules","less","visitors","ToCSSVisitor","_mergeRules","vArr","Attribute","content","escaped","quote","variableRegex","propRegex","Quoted","that","iterativeReplace","regexp","replacementFnc","evaluatedValue","val","isEvald","URL","urlArgs","features","Media","evalTop","evalNested","multiMedia","permute","fragment","rest","css","pathValue","getPath","Import","isPlugin","reference","containsVariables","doEval","blocksVisibility","addVisibilityBlock","registry","skip","importedFilename","newImport","evalPath","string","expression","JavaScript","evaluateJavaScript","JsEvalNode","evalContext","javascriptEnabled","jsify","toJS","Assignment","negate","lvalue","rvalue","Condition","UnicodeDescriptor","Negative","option","object_id","Extend","next_id","parent_ids","allowBefore","allowAfter","selectorElements","selfElements","selfSelectors","VariableCall","detachedRuleset","callEval","ruleCall","lookups","NamespaceValue","lastDeclaration","substring","params","variadic","arity","optionalParameters","required","Definition","mixinEnv","evaldArguments","varargs","arg","isNamedFound","argIndex","argsLength","prependRule","_arguments","mixinFrames","evalParams","allArgsCnt","requiredArgsCnt","MixinCall","mixins","mixin","mixinPath","argValue","f","isRecursive","isOneFound","candidate","defaultResult","noArgumentsFilter","candidates","conditionResult","calcDefGroup","namespace","matchCondition","expand","matchArgs","MixinDefinition","format","newRules","evalCall","_setVisibilityToReplacement","replacement","AbstractFileManager","lastIndexOf","ext","tryAppendExtension","basePath","laterPath","url","baseUrl","urlDirectories","baseUrlDirectories","urlParts","extractUrlParts","baseUrlParts","diff","hostPart","directories","urlPartsRegex","returner","rawDirectories","rawPath","fileUrl","require","AbstractPluginLoader","pluginOptions","pluginObj","localModule","shortname","FileManager","trySetOptions","use","exports","loader","tree","validatePlugin","minVersion","compareVersion","addPlugin","plugin","setOptions","version","versionToString","aVersion","bVersion","versionString","plugins","printUsage","_visitArgs","visitDeeper","_hasIndexed","_noop","implementation","_implementation","_visitInCache","_visitOutCache","indexNodeTypes","ticker","child","typeIndex","Visitor","nodeTypeIndex","fnName","impl","funcOut","visitArgs","newNode","isReplacing","cnt","accept","nonReplacing","out","evald","flatten","nestedCnt","nestedItem","onSequencerEmpty","variableImports","_onSequencerEmpty","_currentDepth","ImportSequencer","importSequencer","importItem","isReady","tryRun","variableImport","ImportVisitor","importer","finish","_visitor","_importer","_finish","importCount","onceFileDetectionMap","recursionDetector","_sequencer","run","isFinished","visitImport","importNode","inlineCSS","importParent","isVariableImport","addVariableImport","processImportNode","evaldImportNode","evalForImport","multiple","importMultiple","tryAppendLessExtension","onImported","sequencedOnImported","addImport","importedAtRoot","fullPath","importVisitor","isOptional","optional","duplicateImport","oldContext","visitDeclaration","declNode","visitDeclarationOut","visitAtRule","atRuleNode","visitAtRuleOut","visitMixinDefinition","mixinDefinitionNode","visitMixinDefinitionOut","visitRuleset","rulesetNode","visitRulesetOut","visitMedia","mediaNode","visitMediaOut","visible","SetTreeVisibilityVisitor","ensureVisibility","ensureInvisibility","allExtendsStack","ExtendFinderVisitor","allExtends","allSelectorsExtendList","extendOnEveryPath","selectorPath","selExtendList","allSelectorsExtend","foundExtends","findSelfSelectors","firstExtendOnThisSelectorPath","ProcessExtendsVisitor","extendFinder","extendIndices","doExtendChaining","newRoot","checkExtendsForNonMatched","indices","hasFoundMatches","extendsList","extendsListTarget","iterationCount","extendIndex","targetExtendIndex","matches","targetExtend","newExtend","extendsToAdd","extendVisitor","findMatch","selfSelector","extendSelector","extendChainCount","selectorOne","selectorTwo","ruleNode","selectorNode","pathIndex","selectorsToAdd","extendedSelectors","haystackSelectorPath","haystackSelectorIndex","hackstackSelector","hackstackElementIndex","haystackElement","targetCombinator","potentialMatch","needleElements","potentialMatches","matched","initialCombinator","isElementValuesEqual","finished","endPathIndex","endPathElementIndex","elementValue1","elementValue2","replacementSelector","matchIndex","firstElement","newElements","currentSelectorPathIndex","currentSelectorPathElementIndex","currentValue","derived","newAllExtends","lastIndex","JoinSelectorVisitor","getIsOutput","joinSelectors","_context","CSSVisitorUtils","bodyRules","isSilent","owner","thing","originalRules","containsSilentNonBlockedChild","compiledRulesBody","keepOnlyVisibleChilds","removeVisibilityBlock","hasVisibleSelector","utils","mixinNode","visitExtend","extendNode","visitComment","commentNode","resolveVisibility","visitAtRuleWithBody","visitAtRuleWithoutBody","visitAnonymous","anonymousNode","nodeRules","hasFakeRuleset","getBodyRules","charset","comment","checkValidNodes","isRoot","_compileRulesetPaths","nodeRuleCnt","_removeDuplicateRules","isVisibleRuleset","ruleList","ruleCache","ruleCSS","groups","groupsArr","result_1","space_1","comma_1","MarkVisibleSelectorsVisitor","ExtendVisitor","furthest","furthestPossibleErrorMessage","chunks","current","currentPos","saveStack","parserInput","skipWhitespace","nextChar","oldi","oldj","curr","endIndex","mem","inp","charCodeAt","autoCommentAbsorb","nextNewLine","text","commentStore","nextStarSlash","save","restore","possibleErrorMessage","state","forget","isWhitespace","offset","pos","code","$re","tok","exec","$char","$str","tokLength","$quoted","startChar","currentPosition","$parseUntil","testChar","returnVal","inComment","blockDepth","blockStack","parseGroups","startPos","lastPos","loop","char","expected","peek","peekChar","currentChar","prevChar","getInput","peekNotNumeric","start","chunkInput","failFunction","fail","lastOpening","lastOpeningParen","lastMultiComment","lastMultiCommentEndBrace","chunkerCurrentIndex","currentChunkStartIndex","cc","cc2","level","parenLevel","emitFrom","emitChunk","force","fromCharCode","chunker","end","furthestReachedEnd","furthestChar","Parser","parsers","getParserInput","expect","expectChar","parseList","currentIndex","returnNodes","parser","additionalData","globalVars","modifyVars","ignored","preText","serializeVars","preProcessors","getPreProcessors","process","banner","contentsIgnoredChars","primary","endInfo","processImports","extendRule","definition","declaration","variableCall","entities","atrule","foundSemiColon","mixinLookup","quoted","forceEscaped","isEscaped","fromKeyword","customFuncCall","stop","ieAlpha","boolean","if","prevArgs","isSemiColonSeparated","argsComma","argsSemiColon","assignment","literal","dimension","unicodeDescriptor","entity","ch","variableCurly","curly","propertyCurly","colorKeyword","ud","javascript","js","escape","parsedName","inValue","ruleLookups","isRule","getLookup","hasParens","elem","elemIndex","re","isCall","expressionContainsNamed","nameLoop","expressions","hasSep","throwAwayComments","cond","argInfo","conditions","block","lookupValue","attribute","slashedCombinator","isLess","when","blockRuleset","hasDR","ruleProperty","permissiveValue","anonymousValue","untilTokens","done","testCurrentChar","import","dir","importOptions","mediaFeatures","o","optionName","importOption","mediaFeature","pluginArgs","nonVendorSpecificName","hasIdentifier","hasExpression","hasUnknown","hasBlock","sub","addition","multiplication","operation","operand","needsParens","logical","next","conditionAnd","negatedCondition","parenthesisCondition","atomicCondition","body","me","tryConditionFollowedByParenthesis","delim","simpleProperty","If","trueValue","falseValue","colorFunctions","hsla","origColor","hsl","toHSV","number","rgba","size","m1_1","m2_1","hue","hsv","hsva","vs","floor","perm","saturation","lightness","hsvhue","hsvsaturation","hsvvalue","luma","luminance","saturate","amount","method","desaturate","lighten","darken","fadein","fadeout","fade","spin","mix","color1","color2","weight","w","w1","w2","greyscale","contrast","dark","light","threshold","argb","toARGB","tint","shade","colorBlend","mode","cb","cs","ar","cr","ab","as","colorBlendModeFunctions","multiply","screen","overlay","softlight","sqrt","hardlight","difference","abs","exclusion","average","negation","getItemsFromNode","_SELF","~","_i","expr","values","range","step","from","to","stepValue","list","each","rs","iterator","tryEval","Quote","valueName","keyName","indexName","MathHelper","fn","mathFunctions","ceil","sin","cos","atan","asin","acos","mathHelper","fraction","num","minMax","isMin","currentUnified","referenceUnified","unitStatic","unitClone","order","convert","pi","mod","y","percentage","evaluated","encodeURI","pattern","flags","%","token","encodeURIComponent","isa","Type","isunit","isruleset","iscolor","isnumber","isstring","iskeyword","isurl","ispixel","ispercentage","isem","get-unit","colorBlending","fallback","functionThis","data-uri","mimetypeNode","filePathNode","mimetype","filePath","entryPath","fragmentStart","utils.clone","rawBuffer","getFileManager","useBase64","mimeLookup","charsetLookup","fileSync","loadFileSync","buf","encodeBase64","uri","dataUri","svg-gradient","direction","stops","gradientDirectionSvg","position","positionValue","gradientType","rectangleDimension","renderEnv","directionValue","throwArgumentDescriptor","types","evaldRoot","evalEnv","visitorIterator","preEvalVisitors","first","isPreEvalVisitor","isPreVisitor","pm","postProcessors","installedPlugins","pluginCache","Loader","PluginLoader","PluginManager","install","preProcessor","priority","indexToInsertAt","postProcessor","manager","PluginManagerFactory","newFactory","sourceMapOutput","sourceMapBuilder","parseTree","importManager","SourceMapBuilder","ParseTree","transformTree","toCSSOptions","sourceMap","getPostProcessors","file","getExternalSourceMap","files","rootFilename","SourceMapOutput","contentsIgnoredCharsMap","contentsMap","sourceMapFilename","sourceMapURL","outputFilename","sourceMapOutputFilename","sourceMapBasepath","sourceMapRootpath","outputSourceFiles","sourceMapGenerator","sourceMapFileInline","disableSourcemapAnnotation","sourceMapInputFilename","normalizeFilename","removeBasepath","getCSSAppendage","_css","_rootNode","_contentsMap","_contentsIgnoredCharsMap","_sourceMapFilename","_outputFilename","_sourceMapBasepath","_sourceMapRootpath","_outputSourceFiles","_sourceMapGeneratorConstructor","getSourceMapGenerator","_lineNumber","_column","sourceLines","columns","sourceColumns","inputSource","_sourceMapGenerator","addMapping","generated","source","sourceRoot","setSourceContent","sourceMapContent","stringify","toJSON","rootFileInfo","mime","queue","ImportManager","pluginLoader","fileParsedFunc","importedEqualsRoot","newFileInfo","loadedFile","promise","loadFileCallback","resolvedFilename","pathDiff","isPathAbsolute","alwaysMakePathsAbsolute","newEnv","evalPlugin","syncImport","loadPluginSync","loadPlugin","loadFile","then","render","utils.copyOptions","self_1","Promise","resolve","reject","Render","context_1","pluginManager_1","reUsePluginManager","imports_1","evalResult","fileContent","initial","data","ctor","api","fileCache","errback","xhr","XMLHttpRequest","async","isFileProtocol","fileAsync","handleResponse","status","responseText","getResponseHeader","overrideMimeType","open","setRequestHeader","send","onreadystatechange","readyState","location","useFileCache","lessText","webInfo","lastModified","Date","doXHR","log","fulfill","catch","rootHref","errorReporting","errors","errorline","classname","logLevel","errorConsole","timer","filenameNoPath","className","innerHTML","browser","style","env","setInterval","replaceChild","clearInterval","errorHTML","remove","removeErrorHTML","depends","lint","insecure","protocol","poll","hostname","port","onReady","addDefaultOptions","LESS_PLUGINS","lessRoot","FM","addFileManager","loggers","console","LogListener","ErrorReporting","cache","localStorage","setCSS","setItem","getCSS","getItem","timestamp","valueOf","Cache","imageSize","imageFunctions","image-size","image-width","image-height","ImageSize","typePattern","thisArg","curryArgs","loadStyles","instanceOptions","loadStyleSheet","reload","remaining","local","loadInitialFileCallback","loadStyleSheets","sheets","watch","watchMode","watchTimer","clearFileCache","unwatch","registerStylesheetsImmediately","links","rel","registerStylesheets","record","refresh","startTime","endTime","totalMilliseconds","remainingSheets","refreshStyles","resolveOrReject","pageLoadFinished"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"less.min.js","sources":["../src/less-browser/utils.js","../src/less-browser/browser.js","../src/less/logger.js","../src/less/environment/environment.js","../src/less/data/colors.js","../src/less/data/unit-conversions.js","../src/less/data/index.js","../src/less/tree/node.js","../node_modules/tslib/tslib.es6.js","../src/less/tree/color.js","../src/less/tree/paren.js","../src/less/tree/combinator.js","../src/less/tree/element.js","../src/less/constants.js","../src/less/utils.js","../src/less/less-error.js","../src/less/tree/selector.js","../src/less/tree/value.js","../src/less/tree/keyword.js","../src/less/tree/anonymous.js","../src/less/tree/declaration.js","../src/less/tree/debug-info.js","../src/less/tree/comment.js","../src/less/contexts.js","../src/less/functions/function-registry.js","../src/less/functions/default.js","../src/less/tree/ruleset.js","../src/less/tree/atrule.js","../src/less/tree/detached-ruleset.js","../src/less/tree/unit.js","../src/less/tree/dimension.js","../src/less/tree/operation.js","../src/less/tree/expression.js","../src/less/functions/function-caller.js","../src/less/tree/call.js","../src/less/tree/variable.js","../src/less/tree/property.js","../src/less/tree/attribute.js","../src/less/tree/quoted.js","../src/less/tree/url.js","../src/less/tree/media.js","../src/less/tree/import.js","../src/less/tree/js-eval-node.js","../src/less/tree/javascript.js","../src/less/tree/assignment.js","../src/less/tree/condition.js","../src/less/tree/unicode-descriptor.js","../src/less/tree/negative.js","../src/less/tree/extend.js","../src/less/tree/variable-call.js","../src/less/tree/namespace-value.js","../src/less/tree/mixin-definition.js","../src/less/tree/mixin-call.js","../src/less/tree/index.js","../src/less/environment/abstract-file-manager.js","../src/less/environment/abstract-plugin-loader.js","../src/less/visitors/visitor.js","../src/less/visitors/import-sequencer.js","../src/less/visitors/import-visitor.js","../src/less/visitors/set-tree-visibility-visitor.js","../src/less/visitors/extend-visitor.js","../src/less/visitors/join-selector-visitor.js","../src/less/visitors/to-css-visitor.js","../src/less/visitors/index.js","../src/less/parser/parser-input.js","../src/less/parser/chunker.js","../src/less/parser/parser.js","../src/less/functions/boolean.js","../src/less/functions/color.js","../src/less/functions/color-blending.js","../src/less/functions/list.js","../src/less/functions/math-helper.js","../src/less/functions/math.js","../src/less/functions/number.js","../src/less/functions/string.js","../src/less/functions/types.js","../src/less/functions/index.js","../src/less/functions/data-uri.js","../src/less/functions/svg.js","../src/less/transform-tree.js","../src/less/plugin-manager.js","../src/less-browser/file-manager.js","../src/less/index.js","../src/less/parse-tree.js","../src/less/source-map-builder.js","../src/less/source-map-output.js","../src/less/import-manager.js","../src/less/render.js","../src/less/parse.js","../src/less-browser/plugin-loader.js","../src/less-browser/error-reporting.js","../src/less-browser/bootstrap.js","../src/less/default-options.js","../src/less-browser/add-default-options.js","../src/less-browser/index.js","../src/less-browser/log-listener.js","../src/less-browser/cache.js","../src/less-browser/image-size.js"],"sourcesContent":["\nexport function extractId(href) {\n return href.replace(/^[a-z-]+:\\/+?[^\\/]+/, '') // Remove protocol & domain\n .replace(/[\\?\\&]livereload=\\w+/, '') // Remove LiveReload cachebuster\n .replace(/^\\//, '') // Remove root /\n .replace(/\\.[a-zA-Z]+$/, '') // Remove simple extension\n .replace(/[^\\.\\w-]+/g, '-') // Replace illegal characters\n .replace(/\\./g, ':'); // Replace dots with colons(for valid id)\n}\n\nexport function addDataAttr(options, tag) {\n for (const opt in tag.dataset) {\n if (tag.dataset.hasOwnProperty(opt)) {\n if (opt === 'env' || opt === 'dumpLineNumbers' || opt === 'rootpath' || opt === 'errorReporting') {\n options[opt] = tag.dataset[opt];\n } else {\n try {\n options[opt] = JSON.parse(tag.dataset[opt]);\n }\n catch (_) {}\n }\n }\n }\n}\n","import * as utils from './utils';\n\nexport default {\n createCSS: function (document, styles, sheet) {\n // Strip the query-string\n const href = sheet.href || '';\n\n // If there is no title set, use the filename, minus the extension\n const id = `less:${sheet.title || utils.extractId(href)}`;\n\n // If this has already been inserted into the DOM, we may need to replace it\n const oldStyleNode = document.getElementById(id);\n let keepOldStyleNode = false;\n\n // Create a new stylesheet node for insertion or (if necessary) replacement\n const styleNode = document.createElement('style');\n styleNode.setAttribute('type', 'text/css');\n if (sheet.media) {\n styleNode.setAttribute('media', sheet.media);\n }\n styleNode.id = id;\n\n if (!styleNode.styleSheet) {\n styleNode.appendChild(document.createTextNode(styles));\n\n // If new contents match contents of oldStyleNode, don't replace oldStyleNode\n keepOldStyleNode = (oldStyleNode !== null && oldStyleNode.childNodes.length > 0 && styleNode.childNodes.length > 0 &&\n oldStyleNode.firstChild.nodeValue === styleNode.firstChild.nodeValue);\n }\n\n const head = document.getElementsByTagName('head')[0];\n\n // If there is no oldStyleNode, just append; otherwise, only append if we need\n // to replace oldStyleNode with an updated stylesheet\n if (oldStyleNode === null || keepOldStyleNode === false) {\n const nextEl = sheet && sheet.nextSibling || null;\n if (nextEl) {\n nextEl.parentNode.insertBefore(styleNode, nextEl);\n } else {\n head.appendChild(styleNode);\n }\n }\n if (oldStyleNode && keepOldStyleNode === false) {\n oldStyleNode.parentNode.removeChild(oldStyleNode);\n }\n\n // For IE.\n // This needs to happen *after* the style element is added to the DOM, otherwise IE 7 and 8 may crash.\n // See http://social.msdn.microsoft.com/Forums/en-US/7e081b65-878a-4c22-8e68-c10d39c2ed32/internet-explorer-crashes-appending-style-element-to-head\n if (styleNode.styleSheet) {\n try {\n styleNode.styleSheet.cssText = styles;\n } catch (e) {\n throw new Error('Couldn\\'t reassign styleSheet.cssText.');\n }\n }\n },\n currentScript: function(window) {\n const document = window.document;\n return document.currentScript || (() => {\n const scripts = document.getElementsByTagName('script');\n return scripts[scripts.length - 1];\n })();\n }\n};\n","export default {\n error: function(msg) {\n this._fireEvent('error', msg);\n },\n warn: function(msg) {\n this._fireEvent('warn', msg);\n },\n info: function(msg) {\n this._fireEvent('info', msg);\n },\n debug: function(msg) {\n this._fireEvent('debug', msg);\n },\n addListener: function(listener) {\n this._listeners.push(listener);\n },\n removeListener: function(listener) {\n for (let i = 0; i < this._listeners.length; i++) {\n if (this._listeners[i] === listener) {\n this._listeners.splice(i, 1);\n return;\n }\n }\n },\n _fireEvent: function(type, msg) {\n for (let i = 0; i < this._listeners.length; i++) {\n const logFunction = this._listeners[i][type];\n if (logFunction) {\n logFunction(msg);\n }\n }\n },\n _listeners: []\n};\n","/**\n * @todo Document why this abstraction exists, and the relationship between\n * environment, file managers, and plugin manager\n */\n\nimport logger from '../logger';\n\nclass Environment {\n constructor(externalEnvironment, fileManagers) {\n this.fileManagers = fileManagers || [];\n externalEnvironment = externalEnvironment || {};\n\n const optionalFunctions = ['encodeBase64', 'mimeLookup', 'charsetLookup', 'getSourceMapGenerator'];\n const requiredFunctions = [];\n const functions = requiredFunctions.concat(optionalFunctions);\n\n for (let i = 0; i < functions.length; i++) {\n const propName = functions[i];\n const environmentFunc = externalEnvironment[propName];\n if (environmentFunc) {\n this[propName] = environmentFunc.bind(externalEnvironment);\n } else if (i < requiredFunctions.length) {\n this.warn(`missing required function in environment - ${propName}`);\n }\n }\n }\n\n getFileManager(filename, currentDirectory, options, environment, isSync) {\n\n if (!filename) {\n logger.warn('getFileManager called with no filename.. Please report this issue. continuing.');\n }\n if (currentDirectory == null) {\n logger.warn('getFileManager called with null directory.. Please report this issue. continuing.');\n }\n\n let fileManagers = this.fileManagers;\n if (options.pluginManager) {\n fileManagers = [].concat(fileManagers).concat(options.pluginManager.getFileManagers());\n }\n for (let i = fileManagers.length - 1; i >= 0 ; i--) {\n const fileManager = fileManagers[i];\n if (fileManager[isSync ? 'supportsSync' : 'supports'](filename, currentDirectory, options, environment)) {\n return fileManager;\n }\n }\n return null;\n }\n\n addFileManager(fileManager) {\n this.fileManagers.push(fileManager);\n }\n\n clearFileManagers() {\n this.fileManagers = [];\n }\n}\n\nexport default Environment;\n","export default {\n 'aliceblue':'#f0f8ff',\n 'antiquewhite':'#faebd7',\n 'aqua':'#00ffff',\n 'aquamarine':'#7fffd4',\n 'azure':'#f0ffff',\n 'beige':'#f5f5dc',\n 'bisque':'#ffe4c4',\n 'black':'#000000',\n 'blanchedalmond':'#ffebcd',\n 'blue':'#0000ff',\n 'blueviolet':'#8a2be2',\n 'brown':'#a52a2a',\n 'burlywood':'#deb887',\n 'cadetblue':'#5f9ea0',\n 'chartreuse':'#7fff00',\n 'chocolate':'#d2691e',\n 'coral':'#ff7f50',\n 'cornflowerblue':'#6495ed',\n 'cornsilk':'#fff8dc',\n 'crimson':'#dc143c',\n 'cyan':'#00ffff',\n 'darkblue':'#00008b',\n 'darkcyan':'#008b8b',\n 'darkgoldenrod':'#b8860b',\n 'darkgray':'#a9a9a9',\n 'darkgrey':'#a9a9a9',\n 'darkgreen':'#006400',\n 'darkkhaki':'#bdb76b',\n 'darkmagenta':'#8b008b',\n 'darkolivegreen':'#556b2f',\n 'darkorange':'#ff8c00',\n 'darkorchid':'#9932cc',\n 'darkred':'#8b0000',\n 'darksalmon':'#e9967a',\n 'darkseagreen':'#8fbc8f',\n 'darkslateblue':'#483d8b',\n 'darkslategray':'#2f4f4f',\n 'darkslategrey':'#2f4f4f',\n 'darkturquoise':'#00ced1',\n 'darkviolet':'#9400d3',\n 'deeppink':'#ff1493',\n 'deepskyblue':'#00bfff',\n 'dimgray':'#696969',\n 'dimgrey':'#696969',\n 'dodgerblue':'#1e90ff',\n 'firebrick':'#b22222',\n 'floralwhite':'#fffaf0',\n 'forestgreen':'#228b22',\n 'fuchsia':'#ff00ff',\n 'gainsboro':'#dcdcdc',\n 'ghostwhite':'#f8f8ff',\n 'gold':'#ffd700',\n 'goldenrod':'#daa520',\n 'gray':'#808080',\n 'grey':'#808080',\n 'green':'#008000',\n 'greenyellow':'#adff2f',\n 'honeydew':'#f0fff0',\n 'hotpink':'#ff69b4',\n 'indianred':'#cd5c5c',\n 'indigo':'#4b0082',\n 'ivory':'#fffff0',\n 'khaki':'#f0e68c',\n 'lavender':'#e6e6fa',\n 'lavenderblush':'#fff0f5',\n 'lawngreen':'#7cfc00',\n 'lemonchiffon':'#fffacd',\n 'lightblue':'#add8e6',\n 'lightcoral':'#f08080',\n 'lightcyan':'#e0ffff',\n 'lightgoldenrodyellow':'#fafad2',\n 'lightgray':'#d3d3d3',\n 'lightgrey':'#d3d3d3',\n 'lightgreen':'#90ee90',\n 'lightpink':'#ffb6c1',\n 'lightsalmon':'#ffa07a',\n 'lightseagreen':'#20b2aa',\n 'lightskyblue':'#87cefa',\n 'lightslategray':'#778899',\n 'lightslategrey':'#778899',\n 'lightsteelblue':'#b0c4de',\n 'lightyellow':'#ffffe0',\n 'lime':'#00ff00',\n 'limegreen':'#32cd32',\n 'linen':'#faf0e6',\n 'magenta':'#ff00ff',\n 'maroon':'#800000',\n 'mediumaquamarine':'#66cdaa',\n 'mediumblue':'#0000cd',\n 'mediumorchid':'#ba55d3',\n 'mediumpurple':'#9370d8',\n 'mediumseagreen':'#3cb371',\n 'mediumslateblue':'#7b68ee',\n 'mediumspringgreen':'#00fa9a',\n 'mediumturquoise':'#48d1cc',\n 'mediumvioletred':'#c71585',\n 'midnightblue':'#191970',\n 'mintcream':'#f5fffa',\n 'mistyrose':'#ffe4e1',\n 'moccasin':'#ffe4b5',\n 'navajowhite':'#ffdead',\n 'navy':'#000080',\n 'oldlace':'#fdf5e6',\n 'olive':'#808000',\n 'olivedrab':'#6b8e23',\n 'orange':'#ffa500',\n 'orangered':'#ff4500',\n 'orchid':'#da70d6',\n 'palegoldenrod':'#eee8aa',\n 'palegreen':'#98fb98',\n 'paleturquoise':'#afeeee',\n 'palevioletred':'#d87093',\n 'papayawhip':'#ffefd5',\n 'peachpuff':'#ffdab9',\n 'peru':'#cd853f',\n 'pink':'#ffc0cb',\n 'plum':'#dda0dd',\n 'powderblue':'#b0e0e6',\n 'purple':'#800080',\n 'rebeccapurple':'#663399',\n 'red':'#ff0000',\n 'rosybrown':'#bc8f8f',\n 'royalblue':'#4169e1',\n 'saddlebrown':'#8b4513',\n 'salmon':'#fa8072',\n 'sandybrown':'#f4a460',\n 'seagreen':'#2e8b57',\n 'seashell':'#fff5ee',\n 'sienna':'#a0522d',\n 'silver':'#c0c0c0',\n 'skyblue':'#87ceeb',\n 'slateblue':'#6a5acd',\n 'slategray':'#708090',\n 'slategrey':'#708090',\n 'snow':'#fffafa',\n 'springgreen':'#00ff7f',\n 'steelblue':'#4682b4',\n 'tan':'#d2b48c',\n 'teal':'#008080',\n 'thistle':'#d8bfd8',\n 'tomato':'#ff6347',\n 'turquoise':'#40e0d0',\n 'violet':'#ee82ee',\n 'wheat':'#f5deb3',\n 'white':'#ffffff',\n 'whitesmoke':'#f5f5f5',\n 'yellow':'#ffff00',\n 'yellowgreen':'#9acd32'\n};","export default {\n length: {\n 'm': 1,\n 'cm': 0.01,\n 'mm': 0.001,\n 'in': 0.0254,\n 'px': 0.0254 / 96,\n 'pt': 0.0254 / 72,\n 'pc': 0.0254 / 72 * 12\n },\n duration: {\n 's': 1,\n 'ms': 0.001\n },\n angle: {\n 'rad': 1 / (2 * Math.PI),\n 'deg': 1 / 360,\n 'grad': 1 / 400,\n 'turn': 1\n }\n};","import colors from './colors';\nimport unitConversions from './unit-conversions';\n\nexport default { colors, unitConversions };\n","class Node {\n constructor() {\n this.parent = null;\n this.visibilityBlocks = undefined;\n this.nodeVisible = undefined;\n this.rootNode = null;\n this.parsed = null;\n\n const self = this;\n Object.defineProperty(this, 'currentFileInfo', {\n get: function() { return self.fileInfo(); }\n });\n Object.defineProperty(this, 'index', {\n get: function() { return self.getIndex(); }\n });\n\n }\n\n setParent(nodes, parent) {\n function set(node) {\n if (node && node instanceof Node) {\n node.parent = parent;\n }\n }\n if (Array.isArray(nodes)) {\n nodes.forEach(set);\n }\n else {\n set(nodes);\n }\n }\n\n getIndex() {\n return this._index || (this.parent && this.parent.getIndex()) || 0;\n }\n\n fileInfo() {\n return this._fileInfo || (this.parent && this.parent.fileInfo()) || {};\n }\n\n isRulesetLike() { return false; }\n\n toCSS(context) {\n const strs = [];\n this.genCSS(context, {\n add: function(chunk, fileInfo, index) {\n strs.push(chunk);\n },\n isEmpty: function () {\n return strs.length === 0;\n }\n });\n return strs.join('');\n }\n\n genCSS(context, output) {\n output.add(this.value);\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n eval() { return this; }\n\n _operate(context, op, a, b) {\n switch (op) {\n case '+': return a + b;\n case '-': return a - b;\n case '*': return a * b;\n case '/': return a / b;\n }\n }\n\n fround(context, value) {\n const precision = context && context.numPrecision;\n // add \"epsilon\" to ensure numbers like 1.000000005 (represented as 1.000000004999...) are properly rounded:\n return (precision) ? Number((value + 2e-16).toFixed(precision)) : value;\n }\n\n static compare(a, b) {\n /* returns:\n -1: a < b\n 0: a = b\n 1: a > b\n and *any* other value for a != b (e.g. undefined, NaN, -2 etc.) */\n\n if ((a.compare) &&\n // for \"symmetric results\" force toCSS-based comparison\n // of Quoted or Anonymous if either value is one of those\n !(b.type === 'Quoted' || b.type === 'Anonymous')) {\n return a.compare(b);\n } else if (b.compare) {\n return -b.compare(a);\n } else if (a.type !== b.type) {\n return undefined;\n }\n\n a = a.value;\n b = b.value;\n if (!Array.isArray(a)) {\n return a === b ? 0 : undefined;\n }\n if (a.length !== b.length) {\n return undefined;\n }\n for (let i = 0; i < a.length; i++) {\n if (Node.compare(a[i], b[i]) !== 0) {\n return undefined;\n }\n }\n return 0;\n }\n\n static numericCompare(a, b) {\n return a < b ? -1\n : a === b ? 0\n : a > b ? 1 : undefined;\n }\n\n // Returns true if this node represents root of ast imported by reference\n blocksVisibility() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n return this.visibilityBlocks !== 0;\n }\n\n addVisibilityBlock() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks + 1;\n }\n\n removeVisibilityBlock() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks - 1;\n }\n\n // Turns on node visibility - if called node will be shown in output regardless\n // of whether it comes from import by reference or not\n ensureVisibility() {\n this.nodeVisible = true;\n }\n\n // Turns off node visibility - if called node will NOT be shown in output regardless\n // of whether it comes from import by reference or not\n ensureInvisibility() {\n this.nodeVisible = false;\n }\n\n // return values:\n // false - the node must not be visible\n // true - the node must be visible\n // undefined or null - the node has the same visibility as its parent\n isVisible() {\n return this.nodeVisible;\n }\n\n visibilityInfo() {\n return {\n visibilityBlocks: this.visibilityBlocks,\n nodeVisible: this.nodeVisible\n };\n }\n\n copyVisibilityInfo(info) {\n if (!info) {\n return;\n }\n this.visibilityBlocks = info.visibilityBlocks;\n this.nodeVisible = info.nodeVisible;\n }\n}\n\nexport default Node;\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import Node from './node';\nimport colors from '../data/colors';\n\n//\n// RGB Colors - #ff0014, #eee\n//\nclass Color extends Node {\n constructor(rgb, a, originalForm) {\n super();\n\n const self = this;\n //\n // The end goal here, is to parse the arguments\n // into an integer triplet, such as `128, 255, 0`\n //\n // This facilitates operations and conversions.\n //\n if (Array.isArray(rgb)) {\n this.rgb = rgb;\n } else if (rgb.length >= 6) {\n this.rgb = [];\n rgb.match(/.{2}/g).map(function (c, i) {\n if (i < 3) {\n self.rgb.push(parseInt(c, 16));\n } else {\n self.alpha = (parseInt(c, 16)) / 255;\n }\n });\n } else {\n this.rgb = [];\n rgb.split('').map(function (c, i) {\n if (i < 3) {\n self.rgb.push(parseInt(c + c, 16));\n } else {\n self.alpha = (parseInt(c + c, 16)) / 255;\n }\n });\n }\n this.alpha = this.alpha || (typeof a === 'number' ? a : 1);\n if (typeof originalForm !== 'undefined') {\n this.value = originalForm;\n }\n }\n\n luma() {\n let r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255;\n\n r = (r <= 0.03928) ? r / 12.92 : Math.pow(((r + 0.055) / 1.055), 2.4);\n g = (g <= 0.03928) ? g / 12.92 : Math.pow(((g + 0.055) / 1.055), 2.4);\n b = (b <= 0.03928) ? b / 12.92 : Math.pow(((b + 0.055) / 1.055), 2.4);\n\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n }\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n }\n\n toCSS(context, doNotCompress) {\n const compress = context && context.compress && !doNotCompress;\n let color;\n let alpha;\n let colorFunction;\n let args = [];\n\n // `value` is set if this color was originally\n // converted from a named color string so we need\n // to respect this and try to output named color too.\n alpha = this.fround(context, this.alpha);\n\n if (this.value) {\n if (this.value.indexOf('rgb') === 0) {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n } else if (this.value.indexOf('hsl') === 0) {\n if (alpha < 1) {\n colorFunction = 'hsla';\n } else {\n colorFunction = 'hsl';\n }\n } else {\n return this.value;\n }\n } else {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n }\n\n switch (colorFunction) {\n case 'rgba':\n args = this.rgb.map(function (c) {\n return clamp(Math.round(c), 255);\n }).concat(clamp(alpha, 1));\n break;\n case 'hsla':\n args.push(clamp(alpha, 1));\n case 'hsl':\n color = this.toHSL();\n args = [\n this.fround(context, color.h),\n `${this.fround(context, color.s * 100)}%`,\n `${this.fround(context, color.l * 100)}%`\n ].concat(args);\n }\n\n if (colorFunction) {\n // Values are capped between `0` and `255`, rounded and zero-padded.\n return `${colorFunction}(${args.join(`,${compress ? '' : ' '}`)})`;\n }\n\n color = this.toRGB();\n\n if (compress) {\n const splitcolor = color.split('');\n\n // Convert color to short format\n if (splitcolor[1] === splitcolor[2] && splitcolor[3] === splitcolor[4] && splitcolor[5] === splitcolor[6]) {\n color = `#${splitcolor[1]}${splitcolor[3]}${splitcolor[5]}`;\n }\n }\n\n return color;\n }\n\n //\n // Operations have to be done per-channel, if not,\n // channels will spill onto each other. Once we have\n // our result, in the form of an integer triplet,\n // we create a new Color node to hold the result.\n //\n operate(context, op, other) {\n const rgb = new Array(3);\n const alpha = this.alpha * (1 - other.alpha) + other.alpha;\n for (let c = 0; c < 3; c++) {\n rgb[c] = this._operate(context, op, this.rgb[c], other.rgb[c]);\n }\n return new Color(rgb, alpha);\n }\n\n toRGB() {\n return toHex(this.rgb);\n }\n\n toHSL() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h;\n let s;\n const l = (max + min) / 2;\n const d = max - min;\n\n if (max === min) {\n h = s = 0;\n } else {\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, l, a };\n }\n\n // Adapted from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript\n toHSV() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h;\n let s;\n const v = max;\n\n const d = max - min;\n if (max === 0) {\n s = 0;\n } else {\n s = d / max;\n }\n\n if (max === min) {\n h = 0;\n } else {\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, v, a };\n }\n\n toARGB() {\n return toHex([this.alpha * 255].concat(this.rgb));\n }\n\n compare(x) {\n return (x.rgb &&\n x.rgb[0] === this.rgb[0] &&\n x.rgb[1] === this.rgb[1] &&\n x.rgb[2] === this.rgb[2] &&\n x.alpha === this.alpha) ? 0 : undefined;\n }\n\n static fromKeyword(keyword) {\n let c;\n const key = keyword.toLowerCase();\n if (colors.hasOwnProperty(key)) {\n c = new Color(colors[key].slice(1));\n }\n else if (key === 'transparent') {\n c = new Color([0, 0, 0], 0);\n }\n\n if (c) {\n c.value = keyword;\n return c;\n }\n }\n}\n\nColor.prototype.type = 'Color';\n\nfunction clamp(v, max) {\n return Math.min(Math.max(v, 0), max);\n}\n\nfunction toHex(v) {\n return `#${v.map(function (c) {\n c = clamp(Math.round(c), 255);\n return (c < 16 ? '0' : '') + c.toString(16);\n}).join('')}`;\n}\n\nexport default Color;\n","import Node from './node';\n\nclass Paren extends Node {\n constructor(node) {\n super();\n\n this.value = node;\n }\n\n genCSS(context, output) {\n output.add('(');\n this.value.genCSS(context, output);\n output.add(')');\n }\n\n eval(context) {\n return new Paren(this.value.eval(context));\n }\n}\n\nParen.prototype.type = 'Paren';\nexport default Paren;\n","import Node from './node';\nconst _noSpaceCombinators = {\n '': true,\n ' ': true,\n '|': true\n};\n\nclass Combinator extends Node {\n constructor(value) {\n super();\n\n if (value === ' ') {\n this.value = ' ';\n this.emptyOrWhitespace = true;\n } else {\n this.value = value ? value.trim() : '';\n this.emptyOrWhitespace = this.value === '';\n }\n }\n\n genCSS(context, output) {\n const spaceOrEmpty = (context.compress || _noSpaceCombinators[this.value]) ? '' : ' ';\n output.add(spaceOrEmpty + this.value + spaceOrEmpty);\n }\n}\n\nCombinator.prototype.type = 'Combinator';\n\nexport default Combinator;\n","import Node from './node';\nimport Paren from './paren';\nimport Combinator from './combinator';\n\nclass Element extends Node {\n constructor(combinator, value, isVariable, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.combinator = combinator instanceof Combinator ?\n combinator : new Combinator(combinator);\n\n if (typeof value === 'string') {\n this.value = value.trim();\n } else if (value) {\n this.value = value;\n } else {\n this.value = '';\n }\n this.isVariable = isVariable;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.combinator, this);\n }\n\n accept(visitor) {\n const value = this.value;\n this.combinator = visitor.visit(this.combinator);\n if (typeof value === 'object') {\n this.value = visitor.visit(value);\n }\n }\n\n eval(context) {\n return new Element(this.combinator,\n this.value.eval ? this.value.eval(context) : this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n }\n\n clone() {\n return new Element(this.combinator,\n this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n }\n\n genCSS(context, output) {\n output.add(this.toCSS(context), this.fileInfo(), this.getIndex());\n }\n\n toCSS(context) {\n context = context || {};\n let value = this.value;\n const firstSelector = context.firstSelector;\n if (value instanceof Paren) {\n // selector in parens should not be affected by outer selector\n // flags (breaks only interpolated selectors - see #1973)\n context.firstSelector = true;\n }\n value = value.toCSS ? value.toCSS(context) : value;\n context.firstSelector = firstSelector;\n if (value === '' && this.combinator.value.charAt(0) === '&') {\n return '';\n } else {\n return this.combinator.toCSS(context) + value;\n }\n }\n}\n\nElement.prototype.type = 'Element';\nexport default Element;\n","\nexport const Math = {\n ALWAYS: 0,\n PARENS_DIVISION: 1,\n PARENS: 2,\n // removed - STRICT_LEGACY: 3\n};\n\nexport const RewriteUrls = {\n OFF: 0,\n LOCAL: 1,\n ALL: 2\n};","/* jshint proto: true */\nimport * as Constants from './constants';\n\nexport function getLocation(index, inputStream) {\n let n = index + 1;\n let line = null;\n let column = -1;\n\n while (--n >= 0 && inputStream.charAt(n) !== '\\n') {\n column++;\n }\n\n if (typeof index === 'number') {\n line = (inputStream.slice(0, index).match(/\\n/g) || '').length;\n }\n\n return {\n line,\n column\n };\n}\n\nexport function copyArray(arr) {\n let i;\n const length = arr.length;\n const copy = new Array(length);\n\n for (i = 0; i < length; i++) {\n copy[i] = arr[i];\n }\n return copy;\n}\n\nexport function clone(obj) {\n const cloned = {};\n for (const prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n cloned[prop] = obj[prop];\n }\n }\n return cloned;\n}\n\nexport function defaults(obj1, obj2) {\n let newObj = obj2 || {};\n if (!obj2._defaults) {\n newObj = {};\n const defaults = {...obj1};\n newObj._defaults = defaults;\n const cloned = obj2 ? {...obj2} : {};\n Object.assign(newObj, defaults, cloned);\n }\n return newObj;\n}\n\nexport function copyOptions(obj1, obj2) {\n if (obj2 && obj2._defaults) {\n return obj2;\n }\n const opts = defaults(obj1, obj2);\n if (opts.strictMath) {\n opts.math = Constants.Math.PARENS;\n }\n // Back compat with changed relativeUrls option\n if (opts.relativeUrls) {\n opts.rewriteUrls = Constants.RewriteUrls.ALL;\n }\n if (typeof opts.math === 'string') {\n switch (opts.math.toLowerCase()) {\n case 'always':\n opts.math = Constants.Math.ALWAYS;\n break;\n case 'parens-division':\n opts.math = Constants.Math.PARENS_DIVISION;\n break;\n case 'strict':\n case 'parens':\n opts.math = Constants.Math.PARENS;\n break;\n default:\n opts.math = Constants.Math.PARENS;\n }\n }\n if (typeof opts.rewriteUrls === 'string') {\n switch (opts.rewriteUrls.toLowerCase()) {\n case 'off':\n opts.rewriteUrls = Constants.RewriteUrls.OFF;\n break;\n case 'local':\n opts.rewriteUrls = Constants.RewriteUrls.LOCAL;\n break;\n case 'all':\n opts.rewriteUrls = Constants.RewriteUrls.ALL;\n break;\n }\n }\n return opts;\n}\n\nexport function merge(obj1, obj2) {\n for (const prop in obj2) {\n if (obj2.hasOwnProperty(prop)) {\n obj1[prop] = obj2[prop];\n }\n }\n return obj1;\n}\n\nexport function flattenArray(arr, result = []) {\n for (let i = 0, length = arr.length; i < length; i++) {\n const value = arr[i];\n if (Array.isArray(value)) {\n flattenArray(value, result);\n } else {\n if (value !== undefined) {\n result.push(value);\n }\n }\n }\n return result;\n}","import * as utils from './utils';\n\nconst anonymousFunc = /(|Function):(\\d+):(\\d+)/;\n\n/**\n * This is a centralized class of any error that could be thrown internally (mostly by the parser).\n * Besides standard .message it keeps some additional data like a path to the file where the error\n * occurred along with line and column numbers.\n *\n * @class\n * @extends Error\n * @type {module.LessError}\n *\n * @prop {string} type\n * @prop {string} filename\n * @prop {number} index\n * @prop {number} line\n * @prop {number} column\n * @prop {number} callLine\n * @prop {number} callExtract\n * @prop {string[]} extract\n *\n * @param {Object} e - An error object to wrap around or just a descriptive object\n * @param {Object} fileContentMap - An object with file contents in 'contents' property (like importManager) @todo - move to fileManager?\n * @param {string} [currentFilename]\n */\nconst LessError = function(e, fileContentMap, currentFilename) {\n Error.call(this);\n\n const filename = e.filename || currentFilename;\n\n this.message = e.message;\n this.stack = e.stack;\n\n if (fileContentMap && filename) {\n const input = fileContentMap.contents[filename];\n const loc = utils.getLocation(e.index, input);\n var line = loc.line;\n const col = loc.column;\n const callLine = e.call && utils.getLocation(e.call, input).line;\n const lines = input ? input.split('\\n') : '';\n\n this.type = e.type || 'Syntax';\n this.filename = filename;\n this.index = e.index;\n this.line = typeof line === 'number' ? line + 1 : null;\n this.column = col;\n\n if (!this.line && this.stack) {\n const found = this.stack.match(anonymousFunc);\n\n /**\n * We have to figure out how this environment stringifies anonymous functions\n * so we can correctly map plugin errors.\n * \n * Note, in Node 8, the output of anonymous funcs varied based on parameters\n * being present or not, so we inject dummy params.\n */\n const func = new Function('a', 'throw new Error()');\n let lineAdjust = 0;\n try {\n func();\n } catch (e) {\n const match = e.stack.match(anonymousFunc);\n var line = parseInt(match[2]);\n lineAdjust = 1 - line;\n }\n\n if (found) {\n if (found[2]) {\n this.line = parseInt(found[2]) + lineAdjust;\n }\n if (found[3]) {\n this.column = parseInt(found[3]);\n }\n }\n }\n\n this.callLine = callLine + 1;\n this.callExtract = lines[callLine];\n\n this.extract = [\n lines[this.line - 2],\n lines[this.line - 1],\n lines[this.line]\n ];\n }\n\n};\n\nif (typeof Object.create === 'undefined') {\n const F = function () {};\n F.prototype = Error.prototype;\n LessError.prototype = new F();\n} else {\n LessError.prototype = Object.create(Error.prototype);\n}\n\nLessError.prototype.constructor = LessError;\n\n/**\n * An overridden version of the default Object.prototype.toString\n * which uses additional information to create a helpful message.\n *\n * @param {Object} options\n * @returns {string}\n */\nLessError.prototype.toString = function(options) {\n options = options || {};\n\n let message = '';\n const extract = this.extract || [];\n let error = [];\n let stylize = function (str) { return str; };\n if (options.stylize) {\n const type = typeof options.stylize;\n if (type !== 'function') {\n throw Error(`options.stylize should be a function, got a ${type}!`);\n }\n stylize = options.stylize;\n }\n\n if (this.line !== null) {\n if (typeof extract[0] === 'string') {\n error.push(stylize(`${this.line - 1} ${extract[0]}`, 'grey'));\n }\n\n if (typeof extract[1] === 'string') {\n let errorTxt = `${this.line} `;\n if (extract[1]) {\n errorTxt += extract[1].slice(0, this.column) +\n stylize(stylize(stylize(extract[1].substr(this.column, 1), 'bold') +\n extract[1].slice(this.column + 1), 'red'), 'inverse');\n }\n error.push(errorTxt);\n }\n\n if (typeof extract[2] === 'string') {\n error.push(stylize(`${this.line + 1} ${extract[2]}`, 'grey'));\n }\n error = `${error.join('\\n') + stylize('', 'reset')}\\n`;\n }\n\n message += stylize(`${this.type}Error: ${this.message}`, 'red');\n if (this.filename) {\n message += stylize(' in ', 'red') + this.filename;\n }\n if (this.line) {\n message += stylize(` on line ${this.line}, column ${this.column + 1}:`, 'grey');\n }\n\n message += `\\n${error}`;\n\n if (this.callLine) {\n message += `${stylize('from ', 'red') + (this.filename || '')}/n`;\n message += `${stylize(this.callLine, 'grey')} ${this.callExtract}/n`;\n }\n\n return message;\n};\n\nexport default LessError;","import Node from './node';\nimport Element from './element';\nimport LessError from '../less-error';\n\nclass Selector extends Node {\n constructor(elements, extendList, condition, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.extendList = extendList;\n this.condition = condition;\n this.evaldCondition = !condition;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.elements = this.getElements(elements);\n this.mixinElements_ = undefined;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.elements, this);\n }\n\n accept(visitor) {\n if (this.elements) {\n this.elements = visitor.visitArray(this.elements);\n }\n if (this.extendList) {\n this.extendList = visitor.visitArray(this.extendList);\n }\n if (this.condition) {\n this.condition = visitor.visit(this.condition);\n }\n }\n\n createDerived(elements, extendList, evaldCondition) {\n elements = this.getElements(elements);\n const newSelector = new Selector(elements, extendList || this.extendList,\n null, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n newSelector.evaldCondition = (evaldCondition != null) ? evaldCondition : this.evaldCondition;\n newSelector.mediaEmpty = this.mediaEmpty;\n return newSelector;\n }\n\n getElements(els) {\n if (!els) {\n return [new Element('', '&', false, this._index, this._fileInfo)];\n }\n if (typeof els === 'string') {\n this.parse.parseNode(\n els, \n ['selector'],\n this._index, \n this._fileInfo, \n function(err, result) {\n if (err) {\n throw new LessError({\n index: err.index,\n message: err.message\n }, this.parse.imports, this._fileInfo.filename);\n }\n els = result[0].elements;\n });\n }\n return els;\n }\n\n createEmptySelectors() {\n const el = new Element('', '&', false, this._index, this._fileInfo), sels = [new Selector([el], null, null, this._index, this._fileInfo)];\n sels[0].mediaEmpty = true;\n return sels;\n }\n\n match(other) {\n const elements = this.elements;\n const len = elements.length;\n let olen;\n let i;\n\n other = other.mixinElements();\n olen = other.length;\n if (olen === 0 || len < olen) {\n return 0;\n } else {\n for (i = 0; i < olen; i++) {\n if (elements[i].value !== other[i]) {\n return 0;\n }\n }\n }\n\n return olen; // return number of matched elements\n }\n\n mixinElements() {\n if (this.mixinElements_) {\n return this.mixinElements_;\n }\n\n let elements = this.elements.map( function(v) {\n return v.combinator.value + (v.value.value || v.value);\n }).join('').match(/[,&#\\*\\.\\w-]([\\w-]|(\\\\.))*/g);\n\n if (elements) {\n if (elements[0] === '&') {\n elements.shift();\n }\n } else {\n elements = [];\n }\n\n return (this.mixinElements_ = elements);\n }\n\n isJustParentSelector() {\n return !this.mediaEmpty &&\n this.elements.length === 1 &&\n this.elements[0].value === '&' &&\n (this.elements[0].combinator.value === ' ' || this.elements[0].combinator.value === '');\n }\n\n eval(context) {\n const evaldCondition = this.condition && this.condition.eval(context);\n let elements = this.elements;\n let extendList = this.extendList;\n\n elements = elements && elements.map(function (e) { return e.eval(context); });\n extendList = extendList && extendList.map(function(extend) { return extend.eval(context); });\n\n return this.createDerived(elements, extendList, evaldCondition);\n }\n\n genCSS(context, output) {\n let i, element;\n if ((!context || !context.firstSelector) && this.elements[0].combinator.value === '') {\n output.add(' ', this.fileInfo(), this.getIndex());\n }\n for (i = 0; i < this.elements.length; i++) {\n element = this.elements[i];\n element.genCSS(context, output);\n }\n }\n\n getIsOutput() {\n return this.evaldCondition;\n }\n}\n\nSelector.prototype.type = 'Selector';\nexport default Selector;\n","import Node from './node';\n\nclass Value extends Node {\n constructor(value) {\n super();\n\n if (!value) {\n throw new Error('Value requires an array argument');\n }\n if (!Array.isArray(value)) {\n this.value = [ value ];\n }\n else {\n this.value = value;\n }\n }\n\n accept(visitor) {\n if (this.value) {\n this.value = visitor.visitArray(this.value);\n }\n }\n\n eval(context) {\n if (this.value.length === 1) {\n return this.value[0].eval(context);\n } else {\n return new Value(this.value.map(function (v) {\n return v.eval(context);\n }));\n }\n }\n\n genCSS(context, output) {\n let i;\n for (i = 0; i < this.value.length; i++) {\n this.value[i].genCSS(context, output);\n if (i + 1 < this.value.length) {\n output.add((context && context.compress) ? ',' : ', ');\n }\n }\n }\n}\n\nValue.prototype.type = 'Value';\nexport default Value;\n","import Node from './node';\n\nclass Keyword extends Node {\n constructor(value) {\n super();\n\n this.value = value;\n }\n\n genCSS(context, output) {\n if (this.value === '%') { throw { type: 'Syntax', message: 'Invalid % without number' }; }\n output.add(this.value);\n }\n}\n\nKeyword.prototype.type = 'Keyword';\n\nKeyword.True = new Keyword('true');\nKeyword.False = new Keyword('false');\n\nexport default Keyword;\n","import Node from './node';\n\nclass Anonymous extends Node {\n constructor(value, index, currentFileInfo, mapLines, rulesetLike, visibilityInfo) {\n super();\n\n this.value = value;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.mapLines = mapLines;\n this.rulesetLike = (typeof rulesetLike === 'undefined') ? false : rulesetLike;\n this.allowRoot = true;\n this.copyVisibilityInfo(visibilityInfo);\n }\n\n eval() {\n return new Anonymous(this.value, this._index, this._fileInfo, this.mapLines, this.rulesetLike, this.visibilityInfo());\n }\n\n compare(other) {\n return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n }\n\n isRulesetLike() {\n return this.rulesetLike;\n }\n\n genCSS(context, output) {\n this.nodeVisible = Boolean(this.value);\n if (this.nodeVisible) {\n output.add(this.value, this._fileInfo, this._index, this.mapLines);\n }\n }\n}\n\nAnonymous.prototype.type = 'Anonymous';\nexport default Anonymous;\n","import Node from './node';\nimport Value from './value';\nimport Keyword from './keyword';\nimport Anonymous from './anonymous';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\nclass Declaration extends Node {\n constructor(name, value, important, merge, index, currentFileInfo, inline, variable) {\n super();\n\n this.name = name;\n this.value = (value instanceof Node) ? value : new Value([value ? new Anonymous(value) : null]);\n this.important = important ? ` ${important.trim()}` : '';\n this.merge = merge;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.inline = inline || false;\n this.variable = (variable !== undefined) ? variable\n : (name.charAt && (name.charAt(0) === '@'));\n this.allowRoot = true;\n this.setParent(this.value, this);\n }\n\n genCSS(context, output) {\n output.add(this.name + (context.compress ? ':' : ': '), this.fileInfo(), this.getIndex());\n try {\n this.value.genCSS(context, output);\n }\n catch (e) {\n e.index = this._index;\n e.filename = this._fileInfo.filename;\n throw e;\n }\n output.add(this.important + ((this.inline || (context.lastRule && context.compress)) ? '' : ';'), this._fileInfo, this._index);\n }\n\n eval(context) {\n let mathBypass = false, prevMath, name = this.name, evaldValue, variable = this.variable;\n if (typeof name !== 'string') {\n // expand 'primitive' name directly to get\n // things faster (~10% for benchmark.less):\n name = (name.length === 1) && (name[0] instanceof Keyword) ?\n name[0].value : evalName(context, name);\n variable = false; // never treat expanded interpolation as new variable name\n }\n\n // @todo remove when parens-division is default\n if (name === 'font' && context.math === MATH.ALWAYS) {\n mathBypass = true;\n prevMath = context.math;\n context.math = MATH.PARENS_DIVISION;\n }\n try {\n context.importantScope.push({});\n evaldValue = this.value.eval(context);\n\n if (!this.variable && evaldValue.type === 'DetachedRuleset') {\n throw { message: 'Rulesets cannot be evaluated on a property.',\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n let important = this.important;\n const importantResult = context.importantScope.pop();\n if (!important && importantResult.important) {\n important = importantResult.important;\n }\n\n return new Declaration(name,\n evaldValue,\n important,\n this.merge,\n this.getIndex(), this.fileInfo(), this.inline,\n variable);\n }\n catch (e) {\n if (typeof e.index !== 'number') {\n e.index = this.getIndex();\n e.filename = this.fileInfo().filename;\n }\n throw e;\n }\n finally {\n if (mathBypass) {\n context.math = prevMath;\n }\n }\n }\n\n makeImportant() {\n return new Declaration(this.name,\n this.value,\n '!important',\n this.merge,\n this.getIndex(), this.fileInfo(), this.inline);\n }\n}\n\nfunction evalName(context, name) {\n let value = '';\n let i;\n const n = name.length;\n const output = {add: function (s) {value += s;}};\n for (i = 0; i < n; i++) {\n name[i].eval(context).genCSS(context, output);\n }\n return value;\n}\n\nDeclaration.prototype.type = 'Declaration';\nexport default Declaration;","class debugInfo {\n constructor(context, ctx, lineSeparator) {\n let result = '';\n if (context.dumpLineNumbers && !context.compress) {\n switch (context.dumpLineNumbers) {\n case 'comments':\n result = debugInfo.asComment(ctx);\n break;\n case 'mediaquery':\n result = debugInfo.asMediaQuery(ctx);\n break;\n case 'all':\n result = debugInfo.asComment(ctx) + (lineSeparator || '') + debugInfo.asMediaQuery(ctx);\n break;\n }\n }\n return result;\n }\n\n static asComment(ctx) {\n return `/* line ${ctx.debugInfo.lineNumber}, ${ctx.debugInfo.fileName} */\\n`;\n }\n\n static asMediaQuery(ctx) {\n let filenameWithProtocol = ctx.debugInfo.fileName;\n if (!/^[a-z]+:\\/\\//i.test(filenameWithProtocol)) {\n filenameWithProtocol = `file://${filenameWithProtocol}`;\n }\n return `@media -sass-debug-info{filename{font-family:${filenameWithProtocol.replace(/([.:\\/\\\\])/g, function (a) {\n if (a == '\\\\') {\n a = '\\/';\n }\n return `\\\\${a}`;\n})}}line{font-family:\\\\00003${ctx.debugInfo.lineNumber}}}\\n`;\n }\n}\n\nexport default debugInfo;\n","import Node from './node';\nimport getDebugInfo from './debug-info';\n\nclass Comment extends Node {\n constructor(value, isLineComment, index, currentFileInfo) {\n super();\n\n this.value = value;\n this.isLineComment = isLineComment;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.allowRoot = true;\n }\n\n genCSS(context, output) {\n if (this.debugInfo) {\n output.add(getDebugInfo(context, this), this.fileInfo(), this.getIndex());\n }\n output.add(this.value);\n }\n\n isSilent(context) {\n const isCompressed = context.compress && this.value[2] !== '!';\n return this.isLineComment || isCompressed;\n }\n}\n\nComment.prototype.type = 'Comment';\nexport default Comment;\n","const contexts = {};\nexport default contexts;\nimport * as Constants from './constants';\n\nconst copyFromOriginal = function copyFromOriginal(original, destination, propertiesToCopy) {\n if (!original) { return; }\n\n for (let i = 0; i < propertiesToCopy.length; i++) {\n if (original.hasOwnProperty(propertiesToCopy[i])) {\n destination[propertiesToCopy[i]] = original[propertiesToCopy[i]];\n }\n }\n};\n\n/*\n parse is used whilst parsing\n */\nconst parseCopyProperties = [\n // options\n 'paths', // option - unmodified - paths to search for imports on\n 'rewriteUrls', // option - whether to adjust URL's to be relative\n 'rootpath', // option - rootpath to append to URL's\n 'strictImports', // option -\n 'insecure', // option - whether to allow imports from insecure ssl hosts\n 'dumpLineNumbers', // option - whether to dump line numbers\n 'compress', // option - whether to compress\n 'syncImport', // option - whether to import synchronously\n 'chunkInput', // option - whether to chunk input. more performant but causes parse issues.\n 'mime', // browser only - mime type for sheet import\n 'useFileCache', // browser only - whether to use the per file session cache\n // context\n 'processImports', // option & context - whether to process imports. if false then imports will not be imported.\n // Used by the import manager to stop multiple import visitors being created.\n 'pluginManager' // Used as the plugin manager for the session\n];\n\ncontexts.Parse = function(options) {\n copyFromOriginal(options, this, parseCopyProperties);\n\n if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n};\n\nconst evalCopyProperties = [\n 'paths', // additional include paths\n 'compress', // whether to compress\n 'math', // whether math has to be within parenthesis\n 'strictUnits', // whether units need to evaluate correctly\n 'sourceMap', // whether to output a source map\n 'importMultiple', // whether we are currently importing multiple copies\n 'urlArgs', // whether to add args into url tokens\n 'javascriptEnabled', // option - whether Inline JavaScript is enabled. if undefined, defaults to false\n 'pluginManager', // Used as the plugin manager for the session\n 'importantScope', // used to bubble up !important statements\n 'rewriteUrls' // option - whether to adjust URL's to be relative\n];\n\ncontexts.Eval = function(options, frames) {\n copyFromOriginal(options, this, evalCopyProperties);\n\n if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n\n this.frames = frames || [];\n this.importantScope = this.importantScope || [];\n};\n\ncontexts.Eval.prototype.enterCalc = function () {\n if (!this.calcStack) {\n this.calcStack = [];\n }\n this.calcStack.push(true);\n this.inCalc = true;\n};\n\ncontexts.Eval.prototype.exitCalc = function () {\n this.calcStack.pop();\n if (!this.calcStack.length) {\n this.inCalc = false;\n }\n};\n\ncontexts.Eval.prototype.inParenthesis = function () {\n if (!this.parensStack) {\n this.parensStack = [];\n }\n this.parensStack.push(true);\n};\n\ncontexts.Eval.prototype.outOfParenthesis = function () {\n this.parensStack.pop();\n};\n\ncontexts.Eval.prototype.inCalc = false;\ncontexts.Eval.prototype.mathOn = true;\ncontexts.Eval.prototype.isMathOn = function (op) {\n if (!this.mathOn) {\n return false;\n }\n if (op === '/' && this.math !== Constants.Math.ALWAYS && (!this.parensStack || !this.parensStack.length)) {\n return false;\n }\n if (this.math > Constants.Math.PARENS_DIVISION) {\n return this.parensStack && this.parensStack.length;\n }\n return true;\n};\n\ncontexts.Eval.prototype.pathRequiresRewrite = function (path) {\n const isRelative = this.rewriteUrls === Constants.RewriteUrls.LOCAL ? isPathLocalRelative : isPathRelative;\n\n return isRelative(path);\n};\n\ncontexts.Eval.prototype.rewritePath = function (path, rootpath) {\n let newPath;\n\n rootpath = rootpath || '';\n newPath = this.normalizePath(rootpath + path);\n\n // If a path was explicit relative and the rootpath was not an absolute path\n // we must ensure that the new path is also explicit relative.\n if (isPathLocalRelative(path) &&\n isPathRelative(rootpath) &&\n isPathLocalRelative(newPath) === false) {\n newPath = `./${newPath}`;\n }\n\n return newPath;\n};\n\ncontexts.Eval.prototype.normalizePath = function (path) {\n const segments = path.split('/').reverse();\n let segment;\n\n path = [];\n while (segments.length !== 0) {\n segment = segments.pop();\n switch ( segment ) {\n case '.':\n break;\n case '..':\n if ((path.length === 0) || (path[path.length - 1] === '..')) {\n path.push( segment );\n } else {\n path.pop();\n }\n break;\n default:\n path.push(segment);\n break;\n }\n }\n\n return path.join('/');\n};\n\nfunction isPathRelative(path) {\n return !/^(?:[a-z-]+:|\\/|#)/i.test(path);\n}\n\nfunction isPathLocalRelative(path) {\n return path.charAt(0) === '.';\n}\n\n// todo - do the same for the toCSS ?\n","function makeRegistry( base ) {\n return {\n _data: {},\n add: function(name, func) {\n // precautionary case conversion, as later querying of\n // the registry by function-caller uses lower case as well.\n name = name.toLowerCase();\n\n if (this._data.hasOwnProperty(name)) {\n // TODO warn\n }\n this._data[name] = func;\n },\n addMultiple: function(functions) {\n Object.keys(functions).forEach(\n name => {\n this.add(name, functions[name]);\n });\n },\n get: function(name) {\n return this._data[name] || ( base && base.get( name ));\n },\n getLocalFunctions: function() {\n return this._data;\n },\n inherit: function() {\n return makeRegistry( this );\n },\n create: function(base) {\n return makeRegistry(base);\n }\n };\n}\n\nexport default makeRegistry( null );","import Keyword from '../tree/keyword';\n\nconst defaultFunc = {\n eval: function () {\n const v = this.value_;\n const e = this.error_;\n if (e) {\n throw e;\n }\n if (v != null) {\n return v ? Keyword.True : Keyword.False;\n }\n },\n value: function (v) {\n this.value_ = v;\n },\n error: function (e) {\n this.error_ = e;\n },\n reset: function () {\n this.value_ = this.error_ = null;\n }\n};\n\nexport default defaultFunc;\n","import Node from './node';\nimport Declaration from './declaration';\nimport Keyword from './keyword';\nimport Comment from './comment';\nimport Paren from './paren';\nimport Selector from './selector';\nimport Element from './element';\nimport Anonymous from './anonymous';\nimport contexts from '../contexts';\nimport globalFunctionRegistry from '../functions/function-registry';\nimport defaultFunc from '../functions/default';\nimport getDebugInfo from './debug-info';\nimport * as utils from '../utils';\n\nclass Ruleset extends Node {\n constructor(selectors, rules, strictImports, visibilityInfo) {\n super();\n\n this.selectors = selectors;\n this.rules = rules;\n this._lookups = {};\n this._variables = null;\n this._properties = null;\n this.strictImports = strictImports;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n\n this.setParent(this.selectors, this);\n this.setParent(this.rules, this);\n\n }\n\n isRulesetLike() { return true; }\n\n accept(visitor) {\n if (this.paths) {\n this.paths = visitor.visitArray(this.paths, true);\n } else if (this.selectors) {\n this.selectors = visitor.visitArray(this.selectors);\n }\n if (this.rules && this.rules.length) {\n this.rules = visitor.visitArray(this.rules);\n }\n }\n\n eval(context) {\n const that = this;\n let selectors;\n let selCnt;\n let selector;\n let i;\n let hasVariable;\n let hasOnePassingSelector = false;\n\n if (this.selectors && (selCnt = this.selectors.length)) {\n selectors = new Array(selCnt);\n defaultFunc.error({\n type: 'Syntax',\n message: 'it is currently only allowed in parametric mixin guards,'\n });\n\n for (i = 0; i < selCnt; i++) {\n selector = this.selectors[i].eval(context);\n for (var j = 0; j < selector.elements.length; j++) {\n if (selector.elements[j].isVariable) {\n hasVariable = true;\n break;\n }\n }\n selectors[i] = selector;\n if (selector.evaldCondition) {\n hasOnePassingSelector = true;\n }\n }\n\n if (hasVariable) {\n const toParseSelectors = new Array(selCnt);\n for (i = 0; i < selCnt; i++) {\n selector = selectors[i];\n toParseSelectors[i] = selector.toCSS(context);\n }\n this.parse.parseNode(\n toParseSelectors.join(','),\n [\"selectors\"], \n selectors[0].getIndex(), \n selectors[0].fileInfo(), \n function(err, result) {\n if (result) {\n selectors = utils.flattenArray(result);\n }\n });\n }\n\n defaultFunc.reset();\n } else {\n hasOnePassingSelector = true;\n }\n\n let rules = this.rules ? utils.copyArray(this.rules) : null;\n const ruleset = new Ruleset(selectors, rules, this.strictImports, this.visibilityInfo());\n let rule;\n let subRule;\n\n ruleset.originalRuleset = this;\n ruleset.root = this.root;\n ruleset.firstRoot = this.firstRoot;\n ruleset.allowImports = this.allowImports;\n\n if (this.debugInfo) {\n ruleset.debugInfo = this.debugInfo;\n }\n\n if (!hasOnePassingSelector) {\n rules.length = 0;\n }\n\n // inherit a function registry from the frames stack when possible;\n // otherwise from the global registry\n ruleset.functionRegistry = (function (frames) {\n let i = 0;\n const n = frames.length;\n let found;\n for ( ; i !== n ; ++i ) {\n found = frames[ i ].functionRegistry;\n if ( found ) { return found; }\n }\n return globalFunctionRegistry;\n }(context.frames)).inherit();\n\n // push the current ruleset to the frames stack\n const ctxFrames = context.frames;\n ctxFrames.unshift(ruleset);\n\n // currrent selectors\n let ctxSelectors = context.selectors;\n if (!ctxSelectors) {\n context.selectors = ctxSelectors = [];\n }\n ctxSelectors.unshift(this.selectors);\n\n // Evaluate imports\n if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) {\n ruleset.evalImports(context);\n }\n\n // Store the frames around mixin definitions,\n // so they can be evaluated like closures when the time comes.\n const rsRules = ruleset.rules;\n for (i = 0; (rule = rsRules[i]); i++) {\n if (rule.evalFirst) {\n rsRules[i] = rule.eval(context);\n }\n }\n\n const mediaBlockCount = (context.mediaBlocks && context.mediaBlocks.length) || 0;\n\n // Evaluate mixin calls.\n for (i = 0; (rule = rsRules[i]); i++) {\n if (rule.type === 'MixinCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).filter(function(r) {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope if the variable is\n // already there. consider returning false here\n // but we need a way to \"return\" variable from mixins\n return !(ruleset.variable(r.name));\n }\n return true;\n });\n rsRules.splice.apply(rsRules, [i, 1].concat(rules));\n i += rules.length - 1;\n ruleset.resetCache();\n } else if (rule.type === 'VariableCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).rules.filter(function(r) {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope at all\n return false;\n }\n return true;\n });\n rsRules.splice.apply(rsRules, [i, 1].concat(rules));\n i += rules.length - 1;\n ruleset.resetCache();\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n if (!rule.evalFirst) {\n rsRules[i] = rule = rule.eval ? rule.eval(context) : rule;\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n // for rulesets, check if it is a css guard and can be removed\n if (rule instanceof Ruleset && rule.selectors && rule.selectors.length === 1) {\n // check if it can be folded in (e.g. & where)\n if (rule.selectors[0] && rule.selectors[0].isJustParentSelector()) {\n rsRules.splice(i--, 1);\n\n for (var j = 0; (subRule = rule.rules[j]); j++) {\n if (subRule instanceof Node) {\n subRule.copyVisibilityInfo(rule.visibilityInfo());\n if (!(subRule instanceof Declaration) || !subRule.variable) {\n rsRules.splice(++i, 0, subRule);\n }\n }\n }\n }\n }\n }\n\n // Pop the stack\n ctxFrames.shift();\n ctxSelectors.shift();\n\n if (context.mediaBlocks) {\n for (i = mediaBlockCount; i < context.mediaBlocks.length; i++) {\n context.mediaBlocks[i].bubbleSelectors(selectors);\n }\n }\n\n return ruleset;\n }\n\n evalImports(context) {\n const rules = this.rules;\n let i;\n let importRules;\n if (!rules) { return; }\n\n for (i = 0; i < rules.length; i++) {\n if (rules[i].type === 'Import') {\n importRules = rules[i].eval(context);\n if (importRules && (importRules.length || importRules.length === 0)) {\n rules.splice.apply(rules, [i, 1].concat(importRules));\n i += importRules.length - 1;\n } else {\n rules.splice(i, 1, importRules);\n }\n this.resetCache();\n }\n }\n }\n\n makeImportant() {\n const result = new Ruleset(this.selectors, this.rules.map(function (r) {\n if (r.makeImportant) {\n return r.makeImportant();\n } else {\n return r;\n }\n }), this.strictImports, this.visibilityInfo());\n\n return result;\n }\n\n matchArgs(args) {\n return !args || args.length === 0;\n }\n\n // lets you call a css selector with a guard\n matchCondition(args, context) {\n const lastSelector = this.selectors[this.selectors.length - 1];\n if (!lastSelector.evaldCondition) {\n return false;\n }\n if (lastSelector.condition &&\n !lastSelector.condition.eval(\n new contexts.Eval(context,\n context.frames))) {\n return false;\n }\n return true;\n }\n\n resetCache() {\n this._rulesets = null;\n this._variables = null;\n this._properties = null;\n this._lookups = {};\n }\n\n variables() {\n if (!this._variables) {\n this._variables = !this.rules ? {} : this.rules.reduce(function (hash, r) {\n if (r instanceof Declaration && r.variable === true) {\n hash[r.name] = r;\n }\n // when evaluating variables in an import statement, imports have not been eval'd\n // so we need to go inside import statements.\n // guard against root being a string (in the case of inlined less)\n if (r.type === 'Import' && r.root && r.root.variables) {\n const vars = r.root.variables();\n for (const name in vars) {\n if (vars.hasOwnProperty(name)) {\n hash[name] = r.root.variable(name);\n }\n }\n }\n return hash;\n }, {});\n }\n return this._variables;\n }\n\n properties() {\n if (!this._properties) {\n this._properties = !this.rules ? {} : this.rules.reduce(function (hash, r) {\n if (r instanceof Declaration && r.variable !== true) {\n const name = (r.name.length === 1) && (r.name[0] instanceof Keyword) ?\n r.name[0].value : r.name;\n // Properties don't overwrite as they can merge\n if (!hash[`$${name}`]) {\n hash[`$${name}`] = [ r ];\n }\n else {\n hash[`$${name}`].push(r);\n }\n }\n return hash;\n }, {});\n }\n return this._properties;\n }\n\n variable(name) {\n const decl = this.variables()[name];\n if (decl) {\n return this.parseValue(decl);\n }\n }\n\n property(name) {\n const decl = this.properties()[name];\n if (decl) {\n return this.parseValue(decl);\n }\n }\n\n lastDeclaration() {\n for (let i = this.rules.length; i > 0; i--) {\n const decl = this.rules[i - 1];\n if (decl instanceof Declaration) {\n return this.parseValue(decl);\n }\n }\n }\n\n parseValue(toParse) {\n const self = this;\n function transformDeclaration(decl) {\n if (decl.value instanceof Anonymous && !decl.parsed) {\n if (typeof decl.value.value === 'string') {\n this.parse.parseNode(\n decl.value.value,\n ['value', 'important'], \n decl.value.getIndex(), \n decl.fileInfo(), \n function(err, result) {\n if (err) {\n decl.parsed = true;\n }\n if (result) {\n decl.value = result[0];\n decl.important = result[1] || '';\n decl.parsed = true;\n }\n });\n } else {\n decl.parsed = true;\n }\n\n return decl;\n }\n else {\n return decl;\n }\n }\n if (!Array.isArray(toParse)) {\n return transformDeclaration.call(self, toParse);\n }\n else {\n const nodes = [];\n toParse.forEach(function(n) {\n nodes.push(transformDeclaration.call(self, n));\n });\n return nodes;\n }\n }\n\n rulesets() {\n if (!this.rules) { return []; }\n\n const filtRules = [];\n const rules = this.rules;\n let i;\n let rule;\n\n for (i = 0; (rule = rules[i]); i++) {\n if (rule.isRuleset) {\n filtRules.push(rule);\n }\n }\n\n return filtRules;\n }\n\n prependRule(rule) {\n const rules = this.rules;\n if (rules) {\n rules.unshift(rule);\n } else {\n this.rules = [ rule ];\n }\n this.setParent(rule, this);\n }\n\n find(selector, self, filter) {\n self = self || this;\n const rules = [];\n let match;\n let foundMixins;\n const key = selector.toCSS();\n\n if (key in this._lookups) { return this._lookups[key]; }\n\n this.rulesets().forEach(function (rule) {\n if (rule !== self) {\n for (let j = 0; j < rule.selectors.length; j++) {\n match = selector.match(rule.selectors[j]);\n if (match) {\n if (selector.elements.length > match) {\n if (!filter || filter(rule)) {\n foundMixins = rule.find(new Selector(selector.elements.slice(match)), self, filter);\n for (let i = 0; i < foundMixins.length; ++i) {\n foundMixins[i].path.push(rule);\n }\n Array.prototype.push.apply(rules, foundMixins);\n }\n } else {\n rules.push({ rule, path: []});\n }\n break;\n }\n }\n }\n });\n this._lookups[key] = rules;\n return rules;\n }\n\n genCSS(context, output) {\n let i;\n let j;\n const charsetRuleNodes = [];\n let ruleNodes = [];\n\n let // Line number debugging\n debugInfo;\n\n let rule;\n let path;\n\n context.tabLevel = (context.tabLevel || 0);\n\n if (!this.root) {\n context.tabLevel++;\n }\n\n const tabRuleStr = context.compress ? '' : Array(context.tabLevel + 1).join(' ');\n const tabSetStr = context.compress ? '' : Array(context.tabLevel).join(' ');\n let sep;\n\n let charsetNodeIndex = 0;\n let importNodeIndex = 0;\n for (i = 0; (rule = this.rules[i]); i++) {\n if (rule instanceof Comment) {\n if (importNodeIndex === i) {\n importNodeIndex++;\n }\n ruleNodes.push(rule);\n } else if (rule.isCharset && rule.isCharset()) {\n ruleNodes.splice(charsetNodeIndex, 0, rule);\n charsetNodeIndex++;\n importNodeIndex++;\n } else if (rule.type === 'Import') {\n ruleNodes.splice(importNodeIndex, 0, rule);\n importNodeIndex++;\n } else {\n ruleNodes.push(rule);\n }\n }\n ruleNodes = charsetRuleNodes.concat(ruleNodes);\n\n // If this is the root node, we don't render\n // a selector, or {}.\n if (!this.root) {\n debugInfo = getDebugInfo(context, this, tabSetStr);\n\n if (debugInfo) {\n output.add(debugInfo);\n output.add(tabSetStr);\n }\n\n const paths = this.paths;\n const pathCnt = paths.length;\n let pathSubCnt;\n\n sep = context.compress ? ',' : (`,\\n${tabSetStr}`);\n\n for (i = 0; i < pathCnt; i++) {\n path = paths[i];\n if (!(pathSubCnt = path.length)) { continue; }\n if (i > 0) { output.add(sep); }\n\n context.firstSelector = true;\n path[0].genCSS(context, output);\n\n context.firstSelector = false;\n for (j = 1; j < pathSubCnt; j++) {\n path[j].genCSS(context, output);\n }\n }\n\n output.add((context.compress ? '{' : ' {\\n') + tabRuleStr);\n }\n\n // Compile rules and rulesets\n for (i = 0; (rule = ruleNodes[i]); i++) {\n\n if (i + 1 === ruleNodes.length) {\n context.lastRule = true;\n }\n\n const currentLastRule = context.lastRule;\n if (rule.isRulesetLike(rule)) {\n context.lastRule = false;\n }\n\n if (rule.genCSS) {\n rule.genCSS(context, output);\n } else if (rule.value) {\n output.add(rule.value.toString());\n }\n\n context.lastRule = currentLastRule;\n\n if (!context.lastRule && rule.isVisible()) {\n output.add(context.compress ? '' : (`\\n${tabRuleStr}`));\n } else {\n context.lastRule = false;\n }\n }\n\n if (!this.root) {\n output.add((context.compress ? '}' : `\\n${tabSetStr}}`));\n context.tabLevel--;\n }\n\n if (!output.isEmpty() && !context.compress && this.firstRoot) {\n output.add('\\n');\n }\n }\n\n joinSelectors(paths, context, selectors) {\n for (let s = 0; s < selectors.length; s++) {\n this.joinSelector(paths, context, selectors[s]);\n }\n }\n\n joinSelector(paths, context, selector) {\n\n function createParenthesis(elementsToPak, originalElement) {\n let replacementParen, j;\n if (elementsToPak.length === 0) {\n replacementParen = new Paren(elementsToPak[0]);\n } else {\n const insideParent = new Array(elementsToPak.length);\n for (j = 0; j < elementsToPak.length; j++) {\n insideParent[j] = new Element(\n null,\n elementsToPak[j],\n originalElement.isVariable,\n originalElement._index,\n originalElement._fileInfo\n );\n }\n replacementParen = new Paren(new Selector(insideParent));\n }\n return replacementParen;\n }\n\n function createSelector(containedElement, originalElement) {\n let element, selector;\n element = new Element(null, containedElement, originalElement.isVariable, originalElement._index, originalElement._fileInfo);\n selector = new Selector([element]);\n return selector;\n }\n\n // joins selector path from `beginningPath` with selector path in `addPath`\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns concatenated path\n function addReplacementIntoPath(beginningPath, addPath, replacedElement, originalSelector) {\n let newSelectorPath, lastSelector, newJoinedSelector;\n // our new selector path\n newSelectorPath = [];\n\n // construct the joined selector - if & is the first thing this will be empty,\n // if not newJoinedSelector will be the last set of elements in the selector\n if (beginningPath.length > 0) {\n newSelectorPath = utils.copyArray(beginningPath);\n lastSelector = newSelectorPath.pop();\n newJoinedSelector = originalSelector.createDerived(utils.copyArray(lastSelector.elements));\n }\n else {\n newJoinedSelector = originalSelector.createDerived([]);\n }\n\n if (addPath.length > 0) {\n // /deep/ is a CSS4 selector - (removed, so should deprecate)\n // that is valid without anything in front of it\n // so if the & does not have a combinator that is \"\" or \" \" then\n // and there is a combinator on the parent, then grab that.\n // this also allows + a { & .b { .a & { ... though not sure why you would want to do that\n let combinator = replacedElement.combinator;\n\n const parentEl = addPath[0].elements[0];\n if (combinator.emptyOrWhitespace && !parentEl.combinator.emptyOrWhitespace) {\n combinator = parentEl.combinator;\n }\n // join the elements so far with the first part of the parent\n newJoinedSelector.elements.push(new Element(\n combinator,\n parentEl.value,\n replacedElement.isVariable,\n replacedElement._index,\n replacedElement._fileInfo\n ));\n newJoinedSelector.elements = newJoinedSelector.elements.concat(addPath[0].elements.slice(1));\n }\n\n // now add the joined selector - but only if it is not empty\n if (newJoinedSelector.elements.length !== 0) {\n newSelectorPath.push(newJoinedSelector);\n }\n\n // put together the parent selectors after the join (e.g. the rest of the parent)\n if (addPath.length > 1) {\n let restOfPath = addPath.slice(1);\n restOfPath = restOfPath.map(function (selector) {\n return selector.createDerived(selector.elements, []);\n });\n newSelectorPath = newSelectorPath.concat(restOfPath);\n }\n return newSelectorPath;\n }\n\n // joins selector path from `beginningPath` with every selector path in `addPaths` array\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns array with all concatenated paths\n function addAllReplacementsIntoPath( beginningPath, addPaths, replacedElement, originalSelector, result) {\n let j;\n for (j = 0; j < beginningPath.length; j++) {\n const newSelectorPath = addReplacementIntoPath(beginningPath[j], addPaths, replacedElement, originalSelector);\n result.push(newSelectorPath);\n }\n return result;\n }\n\n function mergeElementsOnToSelectors(elements, selectors) {\n let i, sel;\n\n if (elements.length === 0) {\n return ;\n }\n if (selectors.length === 0) {\n selectors.push([ new Selector(elements) ]);\n return;\n }\n\n for (i = 0; (sel = selectors[i]); i++) {\n // if the previous thing in sel is a parent this needs to join on to it\n if (sel.length > 0) {\n sel[sel.length - 1] = sel[sel.length - 1].createDerived(sel[sel.length - 1].elements.concat(elements));\n }\n else {\n sel.push(new Selector(elements));\n }\n }\n }\n\n // replace all parent selectors inside `inSelector` by content of `context` array\n // resulting selectors are returned inside `paths` array\n // returns true if `inSelector` contained at least one parent selector\n function replaceParentSelector(paths, context, inSelector) {\n // The paths are [[Selector]]\n // The first list is a list of comma separated selectors\n // The inner list is a list of inheritance separated selectors\n // e.g.\n // .a, .b {\n // .c {\n // }\n // }\n // == [[.a] [.c]] [[.b] [.c]]\n //\n let i, j, k, currentElements, newSelectors, selectorsMultiplied, sel, el, hadParentSelector = false, length, lastSelector;\n function findNestedSelector(element) {\n let maybeSelector;\n if (!(element.value instanceof Paren)) {\n return null;\n }\n\n maybeSelector = element.value.value;\n if (!(maybeSelector instanceof Selector)) {\n return null;\n }\n\n return maybeSelector;\n }\n\n // the elements from the current selector so far\n currentElements = [];\n // the current list of new selectors to add to the path.\n // We will build it up. We initiate it with one empty selector as we \"multiply\" the new selectors\n // by the parents\n newSelectors = [\n []\n ];\n\n for (i = 0; (el = inSelector.elements[i]); i++) {\n // non parent reference elements just get added\n if (el.value !== '&') {\n const nestedSelector = findNestedSelector(el);\n if (nestedSelector != null) {\n // merge the current list of non parent selector elements\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n const nestedPaths = [];\n let replaced;\n const replacedNewSelectors = [];\n replaced = replaceParentSelector(nestedPaths, context, nestedSelector);\n hadParentSelector = hadParentSelector || replaced;\n // the nestedPaths array should have only one member - replaceParentSelector does not multiply selectors\n for (k = 0; k < nestedPaths.length; k++) {\n const replacementSelector = createSelector(createParenthesis(nestedPaths[k], el), el);\n addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors);\n }\n newSelectors = replacedNewSelectors;\n currentElements = [];\n } else {\n currentElements.push(el);\n }\n\n } else {\n hadParentSelector = true;\n // the new list of selectors to add\n selectorsMultiplied = [];\n\n // merge the current list of non parent selector elements\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n // loop through our current selectors\n for (j = 0; j < newSelectors.length; j++) {\n sel = newSelectors[j];\n // if we don't have any parent paths, the & might be in a mixin so that it can be used\n // whether there are parents or not\n if (context.length === 0) {\n // the combinator used on el should now be applied to the next element instead so that\n // it is not lost\n if (sel.length > 0) {\n sel[0].elements.push(new Element(el.combinator, '', el.isVariable, el._index, el._fileInfo));\n }\n selectorsMultiplied.push(sel);\n }\n else {\n // and the parent selectors\n for (k = 0; k < context.length; k++) {\n // We need to put the current selectors\n // then join the last selector's elements on to the parents selectors\n const newSelectorPath = addReplacementIntoPath(sel, context[k], el, inSelector);\n // add that to our new set of selectors\n selectorsMultiplied.push(newSelectorPath);\n }\n }\n }\n\n // our new selectors has been multiplied, so reset the state\n newSelectors = selectorsMultiplied;\n currentElements = [];\n }\n }\n\n // if we have any elements left over (e.g. .a& .b == .b)\n // add them on to all the current selectors\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n for (i = 0; i < newSelectors.length; i++) {\n length = newSelectors[i].length;\n if (length > 0) {\n paths.push(newSelectors[i]);\n lastSelector = newSelectors[i][length - 1];\n newSelectors[i][length - 1] = lastSelector.createDerived(lastSelector.elements, inSelector.extendList);\n }\n }\n\n return hadParentSelector;\n }\n\n function deriveSelector(visibilityInfo, deriveFrom) {\n const newSelector = deriveFrom.createDerived(deriveFrom.elements, deriveFrom.extendList, deriveFrom.evaldCondition);\n newSelector.copyVisibilityInfo(visibilityInfo);\n return newSelector;\n }\n\n // joinSelector code follows\n let i, newPaths, hadParentSelector;\n\n newPaths = [];\n hadParentSelector = replaceParentSelector(newPaths, context, selector);\n\n if (!hadParentSelector) {\n if (context.length > 0) {\n newPaths = [];\n for (i = 0; i < context.length; i++) {\n\n const concatenated = context[i].map(deriveSelector.bind(this, selector.visibilityInfo()));\n\n concatenated.push(selector);\n newPaths.push(concatenated);\n }\n }\n else {\n newPaths = [[selector]];\n }\n }\n\n for (i = 0; i < newPaths.length; i++) {\n paths.push(newPaths[i]);\n }\n\n }\n}\n\nRuleset.prototype.type = 'Ruleset';\nRuleset.prototype.isRuleset = true;\nexport default Ruleset;\n","import Node from './node';\nimport Selector from './selector';\nimport Ruleset from './ruleset';\nimport Anonymous from './anonymous';\n\nclass AtRule extends Node {\n constructor(\n name,\n value,\n rules,\n index,\n currentFileInfo,\n debugInfo,\n isRooted,\n visibilityInfo\n ) {\n super();\n\n let i;\n\n this.name = name;\n this.value = (value instanceof Node) ? value : (value ? new Anonymous(value) : value);\n if (rules) {\n if (Array.isArray(rules)) {\n this.rules = rules;\n } else {\n this.rules = [rules];\n this.rules[0].selectors = (new Selector([], null, null, index, currentFileInfo)).createEmptySelectors();\n }\n for (i = 0; i < this.rules.length; i++) {\n this.rules[i].allowImports = true;\n }\n this.setParent(this.rules, this);\n }\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.debugInfo = debugInfo;\n this.isRooted = isRooted || false;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n }\n\n accept(visitor) {\n const value = this.value, rules = this.rules;\n if (rules) {\n this.rules = visitor.visitArray(rules);\n }\n if (value) {\n this.value = visitor.visit(value);\n }\n }\n\n isRulesetLike() {\n return this.rules || !this.isCharset();\n }\n\n isCharset() {\n return '@charset' === this.name;\n }\n\n genCSS(context, output) {\n const value = this.value, rules = this.rules;\n output.add(this.name, this.fileInfo(), this.getIndex());\n if (value) {\n output.add(' ');\n value.genCSS(context, output);\n }\n if (rules) {\n this.outputRuleset(context, output, rules);\n } else {\n output.add(';');\n }\n }\n\n eval(context) {\n let mediaPathBackup, mediaBlocksBackup, value = this.value, rules = this.rules;\n\n // media stored inside other atrule should not bubble over it\n // backpup media bubbling information\n mediaPathBackup = context.mediaPath;\n mediaBlocksBackup = context.mediaBlocks;\n // deleted media bubbling information\n context.mediaPath = [];\n context.mediaBlocks = [];\n\n if (value) {\n value = value.eval(context);\n }\n if (rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n rules = [rules[0].eval(context)];\n rules[0].root = true;\n }\n // restore media bubbling information\n context.mediaPath = mediaPathBackup;\n context.mediaBlocks = mediaBlocksBackup;\n\n return new AtRule(this.name, value, rules,\n this.getIndex(), this.fileInfo(), this.debugInfo, this.isRooted, this.visibilityInfo());\n }\n\n variable(name) {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.variable.call(this.rules[0], name);\n }\n }\n\n find() {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.find.apply(this.rules[0], arguments);\n }\n }\n\n rulesets() {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.rulesets.apply(this.rules[0]);\n }\n }\n\n outputRuleset(context, output, rules) {\n const ruleCnt = rules.length;\n let i;\n context.tabLevel = (context.tabLevel | 0) + 1;\n\n // Compressed\n if (context.compress) {\n output.add('{');\n for (i = 0; i < ruleCnt; i++) {\n rules[i].genCSS(context, output);\n }\n output.add('}');\n context.tabLevel--;\n return;\n }\n\n // Non-compressed\n const tabSetStr = `\\n${Array(context.tabLevel).join(' ')}`, tabRuleStr = `${tabSetStr} `;\n if (!ruleCnt) {\n output.add(` {${tabSetStr}}`);\n } else {\n output.add(` {${tabRuleStr}`);\n rules[0].genCSS(context, output);\n for (i = 1; i < ruleCnt; i++) {\n output.add(tabRuleStr);\n rules[i].genCSS(context, output);\n }\n output.add(`${tabSetStr}}`);\n }\n\n context.tabLevel--;\n }\n}\n\nAtRule.prototype.type = 'AtRule';\nexport default AtRule;\n","import Node from './node';\nimport contexts from '../contexts';\nimport * as utils from '../utils';\n\nclass DetachedRuleset extends Node {\n constructor(ruleset, frames) {\n super();\n\n this.ruleset = ruleset;\n this.frames = frames;\n this.setParent(this.ruleset, this);\n }\n\n accept(visitor) {\n this.ruleset = visitor.visit(this.ruleset);\n }\n\n eval(context) {\n const frames = this.frames || utils.copyArray(context.frames);\n return new DetachedRuleset(this.ruleset, frames);\n }\n\n callEval(context) {\n return this.ruleset.eval(this.frames ? new contexts.Eval(context, this.frames.concat(context.frames)) : context);\n }\n}\n\nDetachedRuleset.prototype.type = 'DetachedRuleset';\nDetachedRuleset.prototype.evalFirst = true;\nexport default DetachedRuleset;\n","import Node from './node';\nimport unitConversions from '../data/unit-conversions';\nimport * as utils from '../utils';\n\nclass Unit extends Node {\n constructor(numerator, denominator, backupUnit) {\n super();\n\n this.numerator = numerator ? utils.copyArray(numerator).sort() : [];\n this.denominator = denominator ? utils.copyArray(denominator).sort() : [];\n if (backupUnit) {\n this.backupUnit = backupUnit;\n } else if (numerator && numerator.length) {\n this.backupUnit = numerator[0];\n }\n }\n\n clone() {\n return new Unit(utils.copyArray(this.numerator), utils.copyArray(this.denominator), this.backupUnit);\n }\n\n genCSS(context, output) {\n // Dimension checks the unit is singular and throws an error if in strict math mode.\n const strictUnits = context && context.strictUnits;\n if (this.numerator.length === 1) {\n output.add(this.numerator[0]); // the ideal situation\n } else if (!strictUnits && this.backupUnit) {\n output.add(this.backupUnit);\n } else if (!strictUnits && this.denominator.length) {\n output.add(this.denominator[0]);\n }\n }\n\n toString() {\n let i, returnStr = this.numerator.join('*');\n for (i = 0; i < this.denominator.length; i++) {\n returnStr += `/${this.denominator[i]}`;\n }\n return returnStr;\n }\n\n compare(other) {\n return this.is(other.toString()) ? 0 : undefined;\n }\n\n is(unitString) {\n return this.toString().toUpperCase() === unitString.toUpperCase();\n }\n\n isLength() {\n return RegExp('^(px|em|ex|ch|rem|in|cm|mm|pc|pt|ex|vw|vh|vmin|vmax)$', 'gi').test(this.toCSS());\n }\n\n isEmpty() {\n return this.numerator.length === 0 && this.denominator.length === 0;\n }\n\n isSingular() {\n return this.numerator.length <= 1 && this.denominator.length === 0;\n }\n\n map(callback) {\n let i;\n\n for (i = 0; i < this.numerator.length; i++) {\n this.numerator[i] = callback(this.numerator[i], false);\n }\n\n for (i = 0; i < this.denominator.length; i++) {\n this.denominator[i] = callback(this.denominator[i], true);\n }\n }\n\n usedUnits() {\n let group;\n const result = {};\n let mapUnit;\n let groupName;\n\n mapUnit = function (atomicUnit) {\n /* jshint loopfunc:true */\n if (group.hasOwnProperty(atomicUnit) && !result[groupName]) {\n result[groupName] = atomicUnit;\n }\n\n return atomicUnit;\n };\n\n for (groupName in unitConversions) {\n if (unitConversions.hasOwnProperty(groupName)) {\n group = unitConversions[groupName];\n\n this.map(mapUnit);\n }\n }\n\n return result;\n }\n\n cancel() {\n const counter = {};\n let atomicUnit;\n let i;\n\n for (i = 0; i < this.numerator.length; i++) {\n atomicUnit = this.numerator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) + 1;\n }\n\n for (i = 0; i < this.denominator.length; i++) {\n atomicUnit = this.denominator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) - 1;\n }\n\n this.numerator = [];\n this.denominator = [];\n\n for (atomicUnit in counter) {\n if (counter.hasOwnProperty(atomicUnit)) {\n const count = counter[atomicUnit];\n\n if (count > 0) {\n for (i = 0; i < count; i++) {\n this.numerator.push(atomicUnit);\n }\n } else if (count < 0) {\n for (i = 0; i < -count; i++) {\n this.denominator.push(atomicUnit);\n }\n }\n }\n }\n\n this.numerator.sort();\n this.denominator.sort();\n }\n}\n\nUnit.prototype.type = 'Unit';\nexport default Unit;\n","import Node from './node';\nimport unitConversions from '../data/unit-conversions';\nimport Unit from './unit';\nimport Color from './color';\n\n//\n// A number with a unit\n//\nclass Dimension extends Node {\n constructor(value, unit) {\n super();\n\n this.value = parseFloat(value);\n if (isNaN(this.value)) {\n throw new Error('Dimension is not a number.');\n }\n this.unit = (unit && unit instanceof Unit) ? unit :\n new Unit(unit ? [unit] : undefined);\n this.setParent(this.unit, this);\n }\n\n accept(visitor) {\n this.unit = visitor.visit(this.unit);\n }\n\n eval(context) {\n return this;\n }\n\n toColor() {\n return new Color([this.value, this.value, this.value]);\n }\n\n genCSS(context, output) {\n if ((context && context.strictUnits) && !this.unit.isSingular()) {\n throw new Error(`Multiple units in dimension. Correct the units or use the unit function. Bad unit: ${this.unit.toString()}`);\n }\n\n const value = this.fround(context, this.value);\n let strValue = String(value);\n\n if (value !== 0 && value < 0.000001 && value > -0.000001) {\n // would be output 1e-6 etc.\n strValue = value.toFixed(20).replace(/0+$/, '');\n }\n\n if (context && context.compress) {\n // Zero values doesn't need a unit\n if (value === 0 && this.unit.isLength()) {\n output.add(strValue);\n return;\n }\n\n // Float values doesn't need a leading zero\n if (value > 0 && value < 1) {\n strValue = (strValue).substr(1);\n }\n }\n\n output.add(strValue);\n this.unit.genCSS(context, output);\n }\n\n // In an operation between two Dimensions,\n // we default to the first Dimension's unit,\n // so `1px + 2` will yield `3px`.\n operate(context, op, other) {\n /* jshint noempty:false */\n let value = this._operate(context, op, this.value, other.value), unit = this.unit.clone();\n\n if (op === '+' || op === '-') {\n if (unit.numerator.length === 0 && unit.denominator.length === 0) {\n unit = other.unit.clone();\n if (this.unit.backupUnit) {\n unit.backupUnit = this.unit.backupUnit;\n }\n } else if (other.unit.numerator.length === 0 && unit.denominator.length === 0) {\n // do nothing\n } else {\n other = other.convertTo(this.unit.usedUnits());\n\n if (context.strictUnits && other.unit.toString() !== unit.toString()) {\n throw new Error(`Incompatible units. Change the units or use the unit function. Bad units: '${unit.toString()}' and '${other.unit.toString()}'.`);\n }\n\n value = this._operate(context, op, this.value, other.value);\n }\n } else if (op === '*') {\n unit.numerator = unit.numerator.concat(other.unit.numerator).sort();\n unit.denominator = unit.denominator.concat(other.unit.denominator).sort();\n unit.cancel();\n } else if (op === '/') {\n unit.numerator = unit.numerator.concat(other.unit.denominator).sort();\n unit.denominator = unit.denominator.concat(other.unit.numerator).sort();\n unit.cancel();\n }\n return new Dimension(value, unit);\n }\n\n compare(other) {\n let a, b;\n\n if (!(other instanceof Dimension)) {\n return undefined;\n }\n\n if (this.unit.isEmpty() || other.unit.isEmpty()) {\n a = this;\n b = other;\n } else {\n a = this.unify();\n b = other.unify();\n if (a.unit.compare(b.unit) !== 0) {\n return undefined;\n }\n }\n\n return Node.numericCompare(a.value, b.value);\n }\n\n unify() {\n return this.convertTo({ length: 'px', duration: 's', angle: 'rad' });\n }\n\n convertTo(conversions) {\n let value = this.value;\n const unit = this.unit.clone();\n let i;\n let groupName;\n let group;\n let targetUnit;\n let derivedConversions = {};\n let applyUnit;\n\n if (typeof conversions === 'string') {\n for (i in unitConversions) {\n if (unitConversions[i].hasOwnProperty(conversions)) {\n derivedConversions = {};\n derivedConversions[i] = conversions;\n }\n }\n conversions = derivedConversions;\n }\n applyUnit = function (atomicUnit, denominator) {\n /* jshint loopfunc:true */\n if (group.hasOwnProperty(atomicUnit)) {\n if (denominator) {\n value = value / (group[atomicUnit] / group[targetUnit]);\n } else {\n value = value * (group[atomicUnit] / group[targetUnit]);\n }\n\n return targetUnit;\n }\n\n return atomicUnit;\n };\n\n for (groupName in conversions) {\n if (conversions.hasOwnProperty(groupName)) {\n targetUnit = conversions[groupName];\n group = unitConversions[groupName];\n\n unit.map(applyUnit);\n }\n }\n\n unit.cancel();\n\n return new Dimension(value, unit);\n }\n}\n\nDimension.prototype.type = 'Dimension';\nexport default Dimension;\n","import Node from './node';\nimport Color from './color';\nimport Dimension from './dimension';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\n\nclass Operation extends Node {\n constructor(op, operands, isSpaced) {\n super();\n\n this.op = op.trim();\n this.operands = operands;\n this.isSpaced = isSpaced;\n }\n\n accept(visitor) {\n this.operands = visitor.visitArray(this.operands);\n }\n\n eval(context) {\n let a = this.operands[0].eval(context), b = this.operands[1].eval(context), op;\n\n if (context.isMathOn(this.op)) {\n op = this.op === './' ? '/' : this.op;\n if (a instanceof Dimension && b instanceof Color) {\n a = a.toColor();\n }\n if (b instanceof Dimension && a instanceof Color) {\n b = b.toColor();\n }\n if (!a.operate) {\n if (a instanceof Operation && a.op === '/' && context.math === MATH.PARENS_DIVISION) {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n throw { type: 'Operation',\n message: 'Operation on an invalid type' };\n }\n\n return a.operate(context, op, b);\n } else {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n }\n\n genCSS(context, output) {\n this.operands[0].genCSS(context, output);\n if (this.isSpaced) {\n output.add(' ');\n }\n output.add(this.op);\n if (this.isSpaced) {\n output.add(' ');\n }\n this.operands[1].genCSS(context, output);\n }\n}\n\nOperation.prototype.type = 'Operation';\nexport default Operation;\n","import Node from './node';\nimport Paren from './paren';\nimport Comment from './comment';\nimport Dimension from './dimension';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\nclass Expression extends Node {\n constructor(value, noSpacing) {\n super();\n\n this.value = value;\n this.noSpacing = noSpacing;\n if (!value) {\n throw new Error('Expression requires an array parameter');\n }\n }\n\n accept(visitor) {\n this.value = visitor.visitArray(this.value);\n }\n\n eval(context) {\n let returnValue;\n const mathOn = context.isMathOn();\n const inParenthesis = this.parens;\n\n let doubleParen = false;\n if (inParenthesis) {\n context.inParenthesis();\n }\n if (this.value.length > 1) {\n returnValue = new Expression(this.value.map(function (e) {\n if (!e.eval) {\n return e;\n }\n return e.eval(context);\n }), this.noSpacing);\n } else if (this.value.length === 1) {\n if (this.value[0].parens && !this.value[0].parensInOp && !context.inCalc) {\n doubleParen = true;\n }\n returnValue = this.value[0].eval(context);\n } else {\n returnValue = this;\n }\n if (inParenthesis) {\n context.outOfParenthesis();\n }\n if (this.parens && this.parensInOp && !mathOn && !doubleParen \n && (!(returnValue instanceof Dimension))) {\n returnValue = new Paren(returnValue);\n }\n return returnValue;\n }\n\n genCSS(context, output) {\n for (let i = 0; i < this.value.length; i++) {\n this.value[i].genCSS(context, output);\n if (!this.noSpacing && i + 1 < this.value.length) {\n output.add(' ');\n }\n }\n }\n\n throwAwayComments() {\n this.value = this.value.filter(function(v) {\n return !(v instanceof Comment);\n });\n }\n}\n\nExpression.prototype.type = 'Expression';\nexport default Expression;\n","import Expression from '../tree/expression';\n\nclass functionCaller {\n constructor(name, context, index, currentFileInfo) {\n this.name = name.toLowerCase();\n this.index = index;\n this.context = context;\n this.currentFileInfo = currentFileInfo;\n\n this.func = context.frames[0].functionRegistry.get(this.name);\n }\n\n isValid() {\n return Boolean(this.func);\n }\n\n call(args) {\n if (!(Array.isArray(args))) {\n args = [args];\n }\n const evalArgs = this.func.evalArgs;\n if (evalArgs !== false) {\n args = args.map(a => a.eval(this.context));\n }\n const commentFilter = item => !(item.type === 'Comment');\n\n // This code is terrible and should be replaced as per this issue...\n // https://github.com/less/less.js/issues/2477\n args = args\n .filter(commentFilter)\n .map(item => {\n if (item.type === 'Expression') {\n const subNodes = item.value.filter(commentFilter);\n if (subNodes.length === 1) {\n return subNodes[0];\n } else {\n return new Expression(subNodes);\n }\n }\n return item;\n });\n\n if (evalArgs === false) {\n return this.func(this.context, ...args);\n }\n\n return this.func(...args);\n }\n}\n\nexport default functionCaller;\n","import Node from './node';\nimport Anonymous from './anonymous';\nimport FunctionCaller from '../functions/function-caller';\nimport logger from '../logger';\n\n//\n// A function call node.\n//\nclass Call extends Node {\n constructor(name, args, index, currentFileInfo) {\n super();\n\n this.name = name;\n this.args = args;\n this.calc = name === 'calc';\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n accept(visitor) {\n if (this.args) {\n this.args = visitor.visitArray(this.args);\n }\n }\n\n //\n // When evaluating a function call,\n // we either find the function in the functionRegistry,\n // in which case we call it, passing the evaluated arguments,\n // if this returns null or we cannot find the function, we\n // simply print it out as it appeared originally [2].\n //\n // The reason why we evaluate the arguments, is in the case where\n // we try to pass a variable to a function, like: `saturate(@color)`.\n // The function should receive the value, not the variable.\n //\n eval(context) {\n /**\n * Turn off math for calc(), and switch back on for evaluating nested functions\n */\n const currentMathContext = context.mathOn;\n context.mathOn = !this.calc;\n if (this.calc || context.inCalc) {\n context.enterCalc();\n }\n\n const exitCalc = () => {\n if (this.calc || context.inCalc) {\n context.exitCalc();\n }\n context.mathOn = currentMathContext;\n };\n\n let result;\n const funcCaller = new FunctionCaller(this.name, context, this.getIndex(), this.fileInfo());\n\n if (funcCaller.isValid()) {\n try {\n result = funcCaller.call(this.args);\n exitCalc();\n } catch (e) {\n if (e.hasOwnProperty('line') && e.hasOwnProperty('column')) {\n throw e;\n }\n throw { \n type: e.type || 'Runtime',\n message: `Error evaluating function \\`${this.name}\\`${e.message ? `: ${e.message}` : ''}`,\n index: this.getIndex(), \n filename: this.fileInfo().filename,\n line: e.lineNumber,\n column: e.columnNumber\n };\n }\n }\n\n if (result !== null && result !== undefined) {\n // Results that that are not nodes are cast as Anonymous nodes\n // Falsy values or booleans are returned as empty nodes\n if (!(result instanceof Node)) {\n if (!result || result === true) {\n result = new Anonymous(null); \n }\n else {\n result = new Anonymous(result.toString()); \n }\n \n }\n result._index = this._index;\n result._fileInfo = this._fileInfo;\n return result;\n }\n\n const args = this.args.map(a => a.eval(context));\n exitCalc();\n\n return new Call(this.name, args, this.getIndex(), this.fileInfo());\n }\n\n genCSS(context, output) {\n output.add(`${this.name}(`, this.fileInfo(), this.getIndex());\n\n for (let i = 0; i < this.args.length; i++) {\n this.args[i].genCSS(context, output);\n if (i + 1 < this.args.length) {\n output.add(', ');\n }\n }\n\n output.add(')');\n }\n}\n\nCall.prototype.type = 'Call';\nexport default Call;\n","import Node from './node';\nimport Call from './call';\n\nclass Variable extends Node {\n constructor(name, index, currentFileInfo) {\n super();\n\n this.name = name;\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n eval(context) {\n let variable, name = this.name;\n\n if (name.indexOf('@@') === 0) {\n name = `@${new Variable(name.slice(1), this.getIndex(), this.fileInfo()).eval(context).value}`;\n }\n\n if (this.evaluating) {\n throw { type: 'Name',\n message: `Recursive variable definition for ${name}`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n variable = this.find(context.frames, function (frame) {\n const v = frame.variable(name);\n if (v) {\n if (v.important) {\n const importantScope = context.importantScope[context.importantScope.length - 1];\n importantScope.important = v.important;\n }\n // If in calc, wrap vars in a function call to cascade evaluate args first\n if (context.inCalc) {\n return (new Call('_SELF', [v.value])).eval(context);\n }\n else {\n return v.value.eval(context);\n }\n }\n });\n if (variable) {\n this.evaluating = false;\n return variable;\n } else {\n throw { type: 'Name',\n message: `variable ${name} is undefined`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n }\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n}\n\nVariable.prototype.type = 'Variable';\nexport default Variable;\n","import Node from './node';\nimport Declaration from './declaration';\n\nclass Property extends Node {\n constructor(name, index, currentFileInfo) {\n super();\n\n this.name = name;\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n eval(context) {\n let property;\n const name = this.name;\n // TODO: shorten this reference\n const mergeRules = context.pluginManager.less.visitors.ToCSSVisitor.prototype._mergeRules;\n\n if (this.evaluating) {\n throw { type: 'Name',\n message: `Recursive property reference for ${name}`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n property = this.find(context.frames, function (frame) {\n let v;\n const vArr = frame.property(name);\n if (vArr) {\n for (let i = 0; i < vArr.length; i++) {\n v = vArr[i];\n\n vArr[i] = new Declaration(v.name,\n v.value,\n v.important,\n v.merge,\n v.index,\n v.currentFileInfo,\n v.inline,\n v.variable\n );\n }\n mergeRules(vArr);\n\n v = vArr[vArr.length - 1];\n if (v.important) {\n const importantScope = context.importantScope[context.importantScope.length - 1];\n importantScope.important = v.important;\n }\n v = v.value.eval(context);\n return v;\n }\n });\n if (property) {\n this.evaluating = false;\n return property;\n } else {\n throw { type: 'Name',\n message: `Property '${name}' is undefined`,\n filename: this.currentFileInfo.filename,\n index: this.index };\n }\n }\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n}\n\nProperty.prototype.type = 'Property';\nexport default Property;\n","import Node from './node';\n\nclass Attribute extends Node {\n constructor(key, op, value) {\n super();\n\n this.key = key;\n this.op = op;\n this.value = value;\n }\n\n eval(context) {\n return new Attribute(this.key.eval ? this.key.eval(context) : this.key,\n this.op, (this.value && this.value.eval) ? this.value.eval(context) : this.value);\n }\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n }\n\n toCSS(context) {\n let value = this.key.toCSS ? this.key.toCSS(context) : this.key;\n\n if (this.op) {\n value += this.op;\n value += (this.value.toCSS ? this.value.toCSS(context) : this.value);\n }\n\n return `[${value}]`;\n }\n}\n\nAttribute.prototype.type = 'Attribute';\nexport default Attribute;\n","import Node from './node';\nimport Variable from './variable';\nimport Property from './property';\n\n\nclass Quoted extends Node {\n constructor(str, content, escaped, index, currentFileInfo) {\n super();\n\n this.escaped = (escaped == null) ? true : escaped;\n this.value = content || '';\n this.quote = str.charAt(0);\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.variableRegex = /@\\{([\\w-]+)\\}/g;\n this.propRegex = /\\$\\{([\\w-]+)\\}/g;\n this.allowRoot = escaped;\n }\n\n genCSS(context, output) {\n if (!this.escaped) {\n output.add(this.quote, this.fileInfo(), this.getIndex());\n }\n output.add(this.value);\n if (!this.escaped) {\n output.add(this.quote);\n }\n }\n\n containsVariables() {\n return this.value.match(this.variableRegex);\n }\n\n eval(context) {\n const that = this;\n let value = this.value;\n const variableReplacement = function (_, name) {\n const v = new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v.value : v.toCSS();\n };\n const propertyReplacement = function (_, name) {\n const v = new Property(`$${name}`, that.getIndex(), that.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v.value : v.toCSS();\n };\n function iterativeReplace(value, regexp, replacementFnc) {\n let evaluatedValue = value;\n do {\n value = evaluatedValue.toString();\n evaluatedValue = value.replace(regexp, replacementFnc);\n } while (value !== evaluatedValue);\n return evaluatedValue;\n }\n value = iterativeReplace(value, this.variableRegex, variableReplacement);\n value = iterativeReplace(value, this.propRegex, propertyReplacement);\n return new Quoted(this.quote + value + this.quote, value, this.escaped, this.getIndex(), this.fileInfo());\n }\n\n compare(other) {\n // when comparing quoted strings allow the quote to differ\n if (other.type === 'Quoted' && !this.escaped && !other.escaped) {\n return Node.numericCompare(this.value, other.value);\n } else {\n return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n }\n }\n}\n\nQuoted.prototype.type = 'Quoted';\nexport default Quoted;\n","import Node from './node';\n\nclass URL extends Node {\n constructor(val, index, currentFileInfo, isEvald) {\n super();\n\n this.value = val;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.isEvald = isEvald;\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n genCSS(context, output) {\n output.add('url(');\n this.value.genCSS(context, output);\n output.add(')');\n }\n\n eval(context) {\n const val = this.value.eval(context);\n let rootpath;\n\n if (!this.isEvald) {\n // Add the rootpath if the URL requires a rewrite\n rootpath = this.fileInfo() && this.fileInfo().rootpath;\n if (typeof rootpath === 'string' &&\n typeof val.value === 'string' &&\n context.pathRequiresRewrite(val.value)) {\n if (!val.quote) {\n rootpath = escapePath(rootpath);\n }\n val.value = context.rewritePath(val.value, rootpath);\n } else {\n val.value = context.normalizePath(val.value);\n }\n\n // Add url args if enabled\n if (context.urlArgs) {\n if (!val.value.match(/^\\s*data:/)) {\n const delimiter = val.value.indexOf('?') === -1 ? '?' : '&';\n const urlArgs = delimiter + context.urlArgs;\n if (val.value.indexOf('#') !== -1) {\n val.value = val.value.replace('#', `${urlArgs}#`);\n } else {\n val.value += urlArgs;\n }\n }\n }\n }\n\n return new URL(val, this.getIndex(), this.fileInfo(), true);\n }\n}\n\nURL.prototype.type = 'Url';\n\nfunction escapePath(path) {\n return path.replace(/[\\(\\)'\"\\s]/g, function(match) { return `\\\\${match}`; });\n}\n\nexport default URL;\n","import Ruleset from './ruleset';\nimport Value from './value';\nimport Selector from './selector';\nimport Anonymous from './anonymous';\nimport Expression from './expression';\nimport AtRule from './atrule';\nimport * as utils from '../utils';\n\nclass Media extends AtRule {\n constructor(value, features, index, currentFileInfo, visibilityInfo) {\n super();\n\n this._index = index;\n this._fileInfo = currentFileInfo;\n\n const selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors();\n\n this.features = new Value(features);\n this.rules = [new Ruleset(selectors, value)];\n this.rules[0].allowImports = true;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n this.setParent(selectors, this);\n this.setParent(this.features, this);\n this.setParent(this.rules, this);\n }\n\n isRulesetLike() {\n return true;\n }\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this.features);\n }\n if (this.rules) {\n this.rules = visitor.visitArray(this.rules);\n }\n }\n\n genCSS(context, output) {\n output.add('@media ', this._fileInfo, this._index);\n this.features.genCSS(context, output);\n this.outputRuleset(context, output, this.rules);\n }\n\n eval(context) {\n if (!context.mediaBlocks) {\n context.mediaBlocks = [];\n context.mediaPath = [];\n }\n\n const media = new Media(null, [], this._index, this._fileInfo, this.visibilityInfo());\n if (this.debugInfo) {\n this.rules[0].debugInfo = this.debugInfo;\n media.debugInfo = this.debugInfo;\n }\n \n media.features = this.features.eval(context);\n\n context.mediaPath.push(media);\n context.mediaBlocks.push(media);\n\n this.rules[0].functionRegistry = context.frames[0].functionRegistry.inherit();\n context.frames.unshift(this.rules[0]);\n media.rules = [this.rules[0].eval(context)];\n context.frames.shift();\n\n context.mediaPath.pop();\n\n return context.mediaPath.length === 0 ? media.evalTop(context) :\n media.evalNested(context);\n }\n\n evalTop(context) {\n let result = this;\n\n // Render all dependent Media blocks.\n if (context.mediaBlocks.length > 1) {\n const selectors = (new Selector([], null, null, this.getIndex(), this.fileInfo())).createEmptySelectors();\n result = new Ruleset(selectors, context.mediaBlocks);\n result.multiMedia = true;\n result.copyVisibilityInfo(this.visibilityInfo());\n this.setParent(result, this);\n }\n\n delete context.mediaBlocks;\n delete context.mediaPath;\n\n return result;\n }\n\n evalNested(context) {\n let i;\n let value;\n const path = context.mediaPath.concat([this]);\n\n // Extract the media-query conditions separated with `,` (OR).\n for (i = 0; i < path.length; i++) {\n value = path[i].features instanceof Value ?\n path[i].features.value : path[i].features;\n path[i] = Array.isArray(value) ? value : [value];\n }\n\n // Trace all permutations to generate the resulting media-query.\n //\n // (a, b and c) with nested (d, e) ->\n // a and d\n // a and e\n // b and c and d\n // b and c and e\n this.features = new Value(this.permute(path).map(path => {\n path = path.map(fragment => fragment.toCSS ? fragment : new Anonymous(fragment));\n\n for (i = path.length - 1; i > 0; i--) {\n path.splice(i, 0, new Anonymous('and'));\n }\n\n return new Expression(path);\n }));\n this.setParent(this.features, this);\n\n // Fake a tree-node that doesn't output anything.\n return new Ruleset([], []);\n }\n\n permute(arr) {\n if (arr.length === 0) {\n return [];\n } else if (arr.length === 1) {\n return arr[0];\n } else {\n const result = [];\n const rest = this.permute(arr.slice(1));\n for (let i = 0; i < rest.length; i++) {\n for (let j = 0; j < arr[0].length; j++) {\n result.push([arr[0][j]].concat(rest[i]));\n }\n }\n return result;\n }\n }\n\n bubbleSelectors(selectors) {\n if (!selectors) {\n return;\n }\n this.rules = [new Ruleset(utils.copyArray(selectors), [this.rules[0]])];\n this.setParent(this.rules, this);\n }\n}\n\nMedia.prototype.type = 'Media';\nexport default Media;\n","import Node from './node';\nimport Media from './media';\nimport URL from './url';\nimport Quoted from './quoted';\nimport Ruleset from './ruleset';\nimport Anonymous from './anonymous';\nimport * as utils from '../utils';\nimport LessError from '../less-error';\n\n//\n// CSS @import node\n//\n// The general strategy here is that we don't want to wait\n// for the parsing to be completed, before we start importing\n// the file. That's because in the context of a browser,\n// most of the time will be spent waiting for the server to respond.\n//\n// On creation, we push the import path to our import queue, though\n// `import,push`, we also pass it a callback, which it'll call once\n// the file has been fetched, and parsed.\n//\nclass Import extends Node {\n constructor(path, features, options, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.options = options;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.path = path;\n this.features = features;\n this.allowRoot = true;\n\n if (this.options.less !== undefined || this.options.inline) {\n this.css = !this.options.less || this.options.inline;\n } else {\n const pathValue = this.getPath();\n if (pathValue && /[#\\.\\&\\?]css([\\?;].*)?$/.test(pathValue)) {\n this.css = true;\n }\n }\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.features, this);\n this.setParent(this.path, this);\n }\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this.features);\n }\n this.path = visitor.visit(this.path);\n if (!this.options.isPlugin && !this.options.inline && this.root) {\n this.root = visitor.visit(this.root);\n }\n }\n\n genCSS(context, output) {\n if (this.css && this.path._fileInfo.reference === undefined) {\n output.add('@import ', this._fileInfo, this._index);\n this.path.genCSS(context, output);\n if (this.features) {\n output.add(' ');\n this.features.genCSS(context, output);\n }\n output.add(';');\n }\n }\n\n getPath() {\n return (this.path instanceof URL) ?\n this.path.value.value : this.path.value;\n }\n\n isVariableImport() {\n let path = this.path;\n if (path instanceof URL) {\n path = path.value;\n }\n if (path instanceof Quoted) {\n return path.containsVariables();\n }\n\n return true;\n }\n\n evalForImport(context) {\n let path = this.path;\n\n if (path instanceof URL) {\n path = path.value;\n }\n\n return new Import(path.eval(context), this.features, this.options, this._index, this._fileInfo, this.visibilityInfo());\n }\n\n evalPath(context) {\n const path = this.path.eval(context);\n const fileInfo = this._fileInfo;\n\n if (!(path instanceof URL)) {\n // Add the rootpath if the URL requires a rewrite\n const pathValue = path.value;\n if (fileInfo &&\n pathValue &&\n context.pathRequiresRewrite(pathValue)) {\n path.value = context.rewritePath(pathValue, fileInfo.rootpath);\n } else {\n path.value = context.normalizePath(path.value);\n }\n }\n\n return path;\n }\n\n eval(context) {\n const result = this.doEval(context);\n if (this.options.reference || this.blocksVisibility()) {\n if (result.length || result.length === 0) {\n result.forEach(function (node) {\n node.addVisibilityBlock();\n }\n );\n } else {\n result.addVisibilityBlock();\n }\n }\n return result;\n }\n\n doEval(context) {\n let ruleset;\n let registry;\n const features = this.features && this.features.eval(context);\n\n if (this.options.isPlugin) {\n if (this.root && this.root.eval) {\n try {\n this.root.eval(context);\n }\n catch (e) {\n e.message = 'Plugin error during evaluation';\n throw new LessError(e, this.root.imports, this.root.filename);\n }\n }\n registry = context.frames[0] && context.frames[0].functionRegistry;\n if ( registry && this.root && this.root.functions ) {\n registry.addMultiple( this.root.functions );\n }\n\n return [];\n }\n\n if (this.skip) {\n if (typeof this.skip === 'function') {\n this.skip = this.skip();\n }\n if (this.skip) {\n return [];\n }\n }\n if (this.options.inline) {\n const contents = new Anonymous(this.root, 0,\n {\n filename: this.importedFilename,\n reference: this.path._fileInfo && this.path._fileInfo.reference\n }, true, true);\n\n return this.features ? new Media([contents], this.features.value) : [contents];\n } else if (this.css) {\n const newImport = new Import(this.evalPath(context), features, this.options, this._index);\n if (!newImport.css && this.error) {\n throw this.error;\n }\n return newImport;\n } else if (this.root) {\n ruleset = new Ruleset(null, utils.copyArray(this.root.rules));\n ruleset.evalImports(context);\n\n return this.features ? new Media(ruleset.rules, this.features.value) : ruleset.rules;\n } else {\n return [];\n }\n }\n}\n\nImport.prototype.type = 'Import';\nexport default Import;\n","import Node from './node';\nimport Variable from './variable';\n\nclass JsEvalNode extends Node {\n evaluateJavaScript(expression, context) {\n let result;\n const that = this;\n const evalContext = {};\n\n if (!context.javascriptEnabled) {\n throw { message: 'Inline JavaScript is not enabled. Is it set in your options?',\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n expression = expression.replace(/@\\{([\\w-]+)\\}/g, function (_, name) {\n return that.jsify(new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context));\n });\n\n try {\n expression = new Function(`return (${expression})`);\n } catch (e) {\n throw { message: `JavaScript evaluation error: ${e.message} from \\`${expression}\\`` ,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n const variables = context.frames[0].variables();\n for (const k in variables) {\n if (variables.hasOwnProperty(k)) {\n /* jshint loopfunc:true */\n evalContext[k.slice(1)] = {\n value: variables[k].value,\n toJS: function () {\n return this.value.eval(context).toCSS();\n }\n };\n }\n }\n\n try {\n result = expression.call(evalContext);\n } catch (e) {\n throw { message: `JavaScript evaluation error: '${e.name}: ${e.message.replace(/[\"]/g, '\\'')}'` ,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n return result;\n }\n\n jsify(obj) {\n if (Array.isArray(obj.value) && (obj.value.length > 1)) {\n return `[${obj.value.map(function (v) { return v.toCSS(); }).join(', ')}]`;\n } else {\n return obj.toCSS();\n }\n }\n}\n\nexport default JsEvalNode;\n","import JsEvalNode from './js-eval-node';\nimport Dimension from './dimension';\nimport Quoted from './quoted';\nimport Anonymous from './anonymous';\n\nclass JavaScript extends JsEvalNode {\n constructor(string, escaped, index, currentFileInfo) {\n super();\n\n this.escaped = escaped;\n this.expression = string;\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n eval(context) {\n const result = this.evaluateJavaScript(this.expression, context);\n const type = typeof result;\n\n if (type === 'number' && !isNaN(result)) {\n return new Dimension(result);\n } else if (type === 'string') {\n return new Quoted(`\"${result}\"`, result, this.escaped, this._index);\n } else if (Array.isArray(result)) {\n return new Anonymous(result.join(', '));\n } else {\n return new Anonymous(result);\n }\n }\n}\n\nJavaScript.prototype.type = 'JavaScript';\nexport default JavaScript;\n","import Node from './node';\n\nclass Assignment extends Node {\n constructor(key, val) {\n super();\n\n this.key = key;\n this.value = val;\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n eval(context) {\n if (this.value.eval) {\n return new Assignment(this.key, this.value.eval(context));\n }\n return this;\n }\n\n genCSS(context, output) {\n output.add(`${this.key}=`);\n if (this.value.genCSS) {\n this.value.genCSS(context, output);\n } else {\n output.add(this.value);\n }\n }\n}\n\nAssignment.prototype.type = 'Assignment';\nexport default Assignment;\n","import Node from './node';\n\nclass Condition extends Node {\n constructor(op, l, r, i, negate) {\n super();\n\n this.op = op.trim();\n this.lvalue = l;\n this.rvalue = r;\n this._index = i;\n this.negate = negate;\n }\n\n accept(visitor) {\n this.lvalue = visitor.visit(this.lvalue);\n this.rvalue = visitor.visit(this.rvalue);\n }\n\n eval(context) {\n const result = (function (op, a, b) {\n switch (op) {\n case 'and': return a && b;\n case 'or': return a || b;\n default:\n switch (Node.compare(a, b)) {\n case -1:\n return op === '<' || op === '=<' || op === '<=';\n case 0:\n return op === '=' || op === '>=' || op === '=<' || op === '<=';\n case 1:\n return op === '>' || op === '>=';\n default:\n return false;\n }\n }\n })(this.op, this.lvalue.eval(context), this.rvalue.eval(context));\n\n return this.negate ? !result : result;\n }\n}\n\nCondition.prototype.type = 'Condition';\nexport default Condition;\n","import Node from './node';\n\nclass UnicodeDescriptor extends Node {\n constructor(value) {\n super();\n\n this.value = value;\n }\n}\n\nUnicodeDescriptor.prototype.type = 'UnicodeDescriptor';\n\nexport default UnicodeDescriptor;\n","import Node from './node';\nimport Operation from './operation';\nimport Dimension from './dimension';\n\nclass Negative extends Node {\n constructor(node) {\n super();\n\n this.value = node;\n }\n\n genCSS(context, output) {\n output.add('-');\n this.value.genCSS(context, output);\n }\n\n eval(context) {\n if (context.isMathOn()) {\n return (new Operation('*', [new Dimension(-1), this.value])).eval(context);\n }\n return new Negative(this.value.eval(context));\n }\n}\n\nNegative.prototype.type = 'Negative';\nexport default Negative;\n","import Node from './node';\nimport Selector from './selector';\n\nclass Extend extends Node {\n constructor(selector, option, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.selector = selector;\n this.option = option;\n this.object_id = Extend.next_id++;\n this.parent_ids = [this.object_id];\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n\n switch (option) {\n case 'all':\n this.allowBefore = true;\n this.allowAfter = true;\n break;\n default:\n this.allowBefore = false;\n this.allowAfter = false;\n break;\n }\n this.setParent(this.selector, this);\n }\n\n accept(visitor) {\n this.selector = visitor.visit(this.selector);\n }\n\n eval(context) {\n return new Extend(this.selector.eval(context), this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n }\n\n clone(context) {\n return new Extend(this.selector, this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n }\n\n // it concatenates (joins) all selectors in selector array\n findSelfSelectors(selectors) {\n let selfElements = [], i, selectorElements;\n\n for (i = 0; i < selectors.length; i++) {\n selectorElements = selectors[i].elements;\n // duplicate the logic in genCSS function inside the selector node.\n // future TODO - move both logics into the selector joiner visitor\n if (i > 0 && selectorElements.length && selectorElements[0].combinator.value === '') {\n selectorElements[0].combinator.value = ' ';\n }\n selfElements = selfElements.concat(selectors[i].elements);\n }\n\n this.selfSelectors = [new Selector(selfElements)];\n this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo());\n }\n}\n\nExtend.next_id = 0;\n\nExtend.prototype.type = 'Extend';\nexport default Extend;\n","import Node from './node';\nimport Variable from './variable';\nimport Ruleset from './ruleset';\nimport DetachedRuleset from './detached-ruleset';\nimport LessError from '../less-error';\n\nclass VariableCall extends Node {\n constructor(variable, index, currentFileInfo) {\n super();\n\n this.variable = variable;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.allowRoot = true;\n }\n\n eval(context) {\n let rules;\n let detachedRuleset = new Variable(this.variable, this.getIndex(), this.fileInfo()).eval(context);\n const error = new LessError({message: `Could not evaluate variable call ${this.variable}`});\n\n if (!detachedRuleset.ruleset) {\n if (detachedRuleset.rules) {\n rules = detachedRuleset;\n }\n else if (Array.isArray(detachedRuleset)) {\n rules = new Ruleset('', detachedRuleset);\n }\n else if (Array.isArray(detachedRuleset.value)) {\n rules = new Ruleset('', detachedRuleset.value);\n }\n else {\n throw error;\n }\n detachedRuleset = new DetachedRuleset(rules);\n }\n\n if (detachedRuleset.ruleset) {\n return detachedRuleset.callEval(context);\n }\n throw error;\n }\n}\n\nVariableCall.prototype.type = 'VariableCall';\nexport default VariableCall;\n","import Node from './node';\nimport Variable from './variable';\nimport Ruleset from './ruleset';\nimport Selector from './selector';\n\nclass NamespaceValue extends Node {\n constructor(ruleCall, lookups, index, fileInfo) {\n super();\n\n this.value = ruleCall;\n this.lookups = lookups;\n this._index = index;\n this._fileInfo = fileInfo;\n }\n\n eval(context) {\n let i, j, name, rules = this.value.eval(context);\n \n for (i = 0; i < this.lookups.length; i++) {\n name = this.lookups[i];\n\n /**\n * Eval'd DRs return rulesets.\n * Eval'd mixins return rules, so let's make a ruleset if we need it.\n * We need to do this because of late parsing of values\n */\n if (Array.isArray(rules)) {\n rules = new Ruleset([new Selector()], rules);\n }\n\n if (name === '') {\n rules = rules.lastDeclaration();\n }\n else if (name.charAt(0) === '@') {\n if (name.charAt(1) === '@') {\n name = `@${new Variable(name.substr(1)).eval(context).value}`;\n }\n if (rules.variables) {\n rules = rules.variable(name);\n }\n \n if (!rules) {\n throw { type: 'Name',\n message: `variable ${name} not found`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n }\n else {\n if (name.substring(0, 2) === '$@') {\n name = `$${new Variable(name.substr(1)).eval(context).value}`;\n }\n else {\n name = name.charAt(0) === '$' ? name : `$${name}`;\n }\n if (rules.properties) {\n rules = rules.property(name);\n }\n \n if (!rules) {\n throw { type: 'Name',\n message: `property \"${name.substr(1)}\" not found`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n // Properties are an array of values, since a ruleset can have multiple props.\n // We pick the last one (the \"cascaded\" value)\n rules = rules[rules.length - 1];\n }\n\n if (rules.value) {\n rules = rules.eval(context).value;\n }\n if (rules.ruleset) {\n rules = rules.ruleset.eval(context);\n }\n }\n return rules;\n }\n}\n\nNamespaceValue.prototype.type = 'NamespaceValue';\nexport default NamespaceValue;\n","import Selector from './selector';\nimport Element from './element';\nimport Ruleset from './ruleset';\nimport Declaration from './declaration';\nimport DetachedRuleset from './detached-ruleset';\nimport Expression from './expression';\nimport contexts from '../contexts';\nimport * as utils from '../utils';\n\nclass Definition extends Ruleset {\n constructor(name, params, rules, condition, variadic, frames, visibilityInfo) {\n super();\n\n this.name = name || 'anonymous mixin';\n this.selectors = [new Selector([new Element(null, name, false, this._index, this._fileInfo)])];\n this.params = params;\n this.condition = condition;\n this.variadic = variadic;\n this.arity = params.length;\n this.rules = rules;\n this._lookups = {};\n const optionalParameters = [];\n this.required = params.reduce(function (count, p) {\n if (!p.name || (p.name && !p.value)) {\n return count + 1;\n }\n else {\n optionalParameters.push(p.name);\n return count;\n }\n }, 0);\n this.optionalParameters = optionalParameters;\n this.frames = frames;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n }\n\n accept(visitor) {\n if (this.params && this.params.length) {\n this.params = visitor.visitArray(this.params);\n }\n this.rules = visitor.visitArray(this.rules);\n if (this.condition) {\n this.condition = visitor.visit(this.condition);\n }\n }\n\n evalParams(context, mixinEnv, args, evaldArguments) {\n /* jshint boss:true */\n const frame = new Ruleset(null, null);\n\n let varargs;\n let arg;\n const params = utils.copyArray(this.params);\n let i;\n let j;\n let val;\n let name;\n let isNamedFound;\n let argIndex;\n let argsLength = 0;\n\n if (mixinEnv.frames && mixinEnv.frames[0] && mixinEnv.frames[0].functionRegistry) {\n frame.functionRegistry = mixinEnv.frames[0].functionRegistry.inherit();\n }\n mixinEnv = new contexts.Eval(mixinEnv, [frame].concat(mixinEnv.frames));\n\n if (args) {\n args = utils.copyArray(args);\n argsLength = args.length;\n\n for (i = 0; i < argsLength; i++) {\n arg = args[i];\n if (name = (arg && arg.name)) {\n isNamedFound = false;\n for (j = 0; j < params.length; j++) {\n if (!evaldArguments[j] && name === params[j].name) {\n evaldArguments[j] = arg.value.eval(context);\n frame.prependRule(new Declaration(name, arg.value.eval(context)));\n isNamedFound = true;\n break;\n }\n }\n if (isNamedFound) {\n args.splice(i, 1);\n i--;\n continue;\n } else {\n throw { type: 'Runtime', message: `Named argument for ${this.name} ${args[i].name} not found` };\n }\n }\n }\n }\n argIndex = 0;\n for (i = 0; i < params.length; i++) {\n if (evaldArguments[i]) { continue; }\n\n arg = args && args[argIndex];\n\n if (name = params[i].name) {\n if (params[i].variadic) {\n varargs = [];\n for (j = argIndex; j < argsLength; j++) {\n varargs.push(args[j].value.eval(context));\n }\n frame.prependRule(new Declaration(name, new Expression(varargs).eval(context)));\n } else {\n val = arg && arg.value;\n if (val) {\n // This was a mixin call, pass in a detached ruleset of it's eval'd rules\n if (Array.isArray(val)) {\n val = new DetachedRuleset(new Ruleset('', val));\n }\n else {\n val = val.eval(context);\n }\n } else if (params[i].value) {\n val = params[i].value.eval(mixinEnv);\n frame.resetCache();\n } else {\n throw { type: 'Runtime', message: `wrong number of arguments for ${this.name} (${argsLength} for ${this.arity})` };\n }\n\n frame.prependRule(new Declaration(name, val));\n evaldArguments[i] = val;\n }\n }\n\n if (params[i].variadic && args) {\n for (j = argIndex; j < argsLength; j++) {\n evaldArguments[j] = args[j].value.eval(context);\n }\n }\n argIndex++;\n }\n\n return frame;\n }\n\n makeImportant() {\n const rules = !this.rules ? this.rules : this.rules.map(function (r) {\n if (r.makeImportant) {\n return r.makeImportant(true);\n } else {\n return r;\n }\n });\n const result = new Definition(this.name, this.params, rules, this.condition, this.variadic, this.frames);\n return result;\n }\n\n eval(context) {\n return new Definition(this.name, this.params, this.rules, this.condition, this.variadic, this.frames || utils.copyArray(context.frames));\n }\n\n evalCall(context, args, important) {\n const _arguments = [];\n const mixinFrames = this.frames ? this.frames.concat(context.frames) : context.frames;\n const frame = this.evalParams(context, new contexts.Eval(context, mixinFrames), args, _arguments);\n let rules;\n let ruleset;\n\n frame.prependRule(new Declaration('@arguments', new Expression(_arguments).eval(context)));\n\n rules = utils.copyArray(this.rules);\n\n ruleset = new Ruleset(null, rules);\n ruleset.originalRuleset = this;\n ruleset = ruleset.eval(new contexts.Eval(context, [this, frame].concat(mixinFrames)));\n if (important) {\n ruleset = ruleset.makeImportant();\n }\n return ruleset;\n }\n\n matchCondition(args, context) {\n if (this.condition && !this.condition.eval(\n new contexts.Eval(context,\n [this.evalParams(context, /* the parameter variables */\n new contexts.Eval(context, this.frames ? this.frames.concat(context.frames) : context.frames), args, [])]\n .concat(this.frames || []) // the parent namespace/mixin frames\n .concat(context.frames)))) { // the current environment frames\n return false;\n }\n return true;\n }\n\n matchArgs(args, context) {\n const allArgsCnt = (args && args.length) || 0;\n let len;\n const optionalParameters = this.optionalParameters;\n const requiredArgsCnt = !args ? 0 : args.reduce(function (count, p) {\n if (optionalParameters.indexOf(p.name) < 0) {\n return count + 1;\n } else {\n return count;\n }\n }, 0);\n\n if (!this.variadic) {\n if (requiredArgsCnt < this.required) {\n return false;\n }\n if (allArgsCnt > this.params.length) {\n return false;\n }\n } else {\n if (requiredArgsCnt < (this.required - 1)) {\n return false;\n }\n }\n\n // check patterns\n len = Math.min(requiredArgsCnt, this.arity);\n\n for (let i = 0; i < len; i++) {\n if (!this.params[i].name && !this.params[i].variadic) {\n if (args[i].value.eval(context).toCSS() != this.params[i].value.eval(context).toCSS()) {\n return false;\n }\n }\n }\n return true;\n }\n}\n\nDefinition.prototype.type = 'MixinDefinition';\nDefinition.prototype.evalFirst = true;\nexport default Definition;\n","import Node from './node';\nimport Selector from './selector';\nimport MixinDefinition from './mixin-definition';\nimport defaultFunc from '../functions/default';\n\nclass MixinCall extends Node {\n constructor(elements, args, index, currentFileInfo, important) {\n super();\n\n this.selector = new Selector(elements);\n this.arguments = args || [];\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.important = important;\n this.allowRoot = true;\n this.setParent(this.selector, this);\n }\n\n accept(visitor) {\n if (this.selector) {\n this.selector = visitor.visit(this.selector);\n }\n if (this.arguments.length) {\n this.arguments = visitor.visitArray(this.arguments);\n }\n }\n\n eval(context) {\n let mixins;\n let mixin;\n let mixinPath;\n const args = [];\n let arg;\n let argValue;\n const rules = [];\n let match = false;\n let i;\n let m;\n let f;\n let isRecursive;\n let isOneFound;\n const candidates = [];\n let candidate;\n const conditionResult = [];\n let defaultResult;\n const defFalseEitherCase = -1;\n const defNone = 0;\n const defTrue = 1;\n const defFalse = 2;\n let count;\n let originalRuleset;\n let noArgumentsFilter;\n\n this.selector = this.selector.eval(context);\n\n function calcDefGroup(mixin, mixinPath) {\n let f, p, namespace;\n\n for (f = 0; f < 2; f++) {\n conditionResult[f] = true;\n defaultFunc.value(f);\n for (p = 0; p < mixinPath.length && conditionResult[f]; p++) {\n namespace = mixinPath[p];\n if (namespace.matchCondition) {\n conditionResult[f] = conditionResult[f] && namespace.matchCondition(null, context);\n }\n }\n if (mixin.matchCondition) {\n conditionResult[f] = conditionResult[f] && mixin.matchCondition(args, context);\n }\n }\n if (conditionResult[0] || conditionResult[1]) {\n if (conditionResult[0] != conditionResult[1]) {\n return conditionResult[1] ?\n defTrue : defFalse;\n }\n\n return defNone;\n }\n return defFalseEitherCase;\n }\n\n for (i = 0; i < this.arguments.length; i++) {\n arg = this.arguments[i];\n argValue = arg.value.eval(context);\n if (arg.expand && Array.isArray(argValue.value)) {\n argValue = argValue.value;\n for (m = 0; m < argValue.length; m++) {\n args.push({value: argValue[m]});\n }\n } else {\n args.push({name: arg.name, value: argValue});\n }\n }\n\n noArgumentsFilter = function(rule) {return rule.matchArgs(null, context);};\n\n for (i = 0; i < context.frames.length; i++) {\n if ((mixins = context.frames[i].find(this.selector, null, noArgumentsFilter)).length > 0) {\n isOneFound = true;\n\n // To make `default()` function independent of definition order we have two \"subpasses\" here.\n // At first we evaluate each guard *twice* (with `default() == true` and `default() == false`),\n // and build candidate list with corresponding flags. Then, when we know all possible matches,\n // we make a final decision.\n\n for (m = 0; m < mixins.length; m++) {\n mixin = mixins[m].rule;\n mixinPath = mixins[m].path;\n isRecursive = false;\n for (f = 0; f < context.frames.length; f++) {\n if ((!(mixin instanceof MixinDefinition)) && mixin === (context.frames[f].originalRuleset || context.frames[f])) {\n isRecursive = true;\n break;\n }\n }\n if (isRecursive) {\n continue;\n }\n\n if (mixin.matchArgs(args, context)) {\n candidate = {mixin, group: calcDefGroup(mixin, mixinPath)};\n\n if (candidate.group !== defFalseEitherCase) {\n candidates.push(candidate);\n }\n\n match = true;\n }\n }\n\n defaultFunc.reset();\n\n count = [0, 0, 0];\n for (m = 0; m < candidates.length; m++) {\n count[candidates[m].group]++;\n }\n\n if (count[defNone] > 0) {\n defaultResult = defFalse;\n } else {\n defaultResult = defTrue;\n if ((count[defTrue] + count[defFalse]) > 1) {\n throw { type: 'Runtime',\n message: `Ambiguous use of \\`default()\\` found when matching for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n }\n\n for (m = 0; m < candidates.length; m++) {\n candidate = candidates[m].group;\n if ((candidate === defNone) || (candidate === defaultResult)) {\n try {\n mixin = candidates[m].mixin;\n if (!(mixin instanceof MixinDefinition)) {\n originalRuleset = mixin.originalRuleset || mixin;\n mixin = new MixinDefinition('', [], mixin.rules, null, false, null, originalRuleset.visibilityInfo());\n mixin.originalRuleset = originalRuleset;\n }\n const newRules = mixin.evalCall(context, args, this.important).rules;\n this._setVisibilityToReplacement(newRules);\n Array.prototype.push.apply(rules, newRules);\n } catch (e) {\n throw { message: e.message, index: this.getIndex(), filename: this.fileInfo().filename, stack: e.stack };\n }\n }\n }\n\n if (match) {\n return rules;\n }\n }\n }\n if (isOneFound) {\n throw { type: 'Runtime',\n message: `No matching definition was found for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n } else {\n throw { type: 'Name',\n message: `${this.selector.toCSS().trim()} is undefined`,\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n }\n\n _setVisibilityToReplacement(replacement) {\n let i, rule;\n if (this.blocksVisibility()) {\n for (i = 0; i < replacement.length; i++) {\n rule = replacement[i];\n rule.addVisibilityBlock();\n }\n }\n }\n\n format(args) {\n return `${this.selector.toCSS().trim()}(${args ? args.map(function (a) {\n let argValue = '';\n if (a.name) {\n argValue += `${a.name}:`;\n }\n if (a.value.toCSS) {\n argValue += a.value.toCSS();\n } else {\n argValue += '???';\n }\n return argValue;\n }).join(', ') : ''})`;\n }\n}\n\nMixinCall.prototype.type = 'MixinCall';\nexport default MixinCall;\n","import Node from './node';\nimport Color from './color';\nimport AtRule from './atrule';\nimport DetachedRuleset from './detached-ruleset';\nimport Operation from './operation';\nimport Dimension from './dimension';\nimport Unit from './unit';\nimport Keyword from './keyword';\nimport Variable from './variable';\nimport Property from './property';\nimport Ruleset from './ruleset';\nimport Element from './element';\nimport Attribute from './attribute';\nimport Combinator from './combinator';\nimport Selector from './selector';\nimport Quoted from './quoted';\nimport Expression from './expression';\nimport Declaration from './declaration';\nimport Call from './call';\nimport URL from './url';\nimport Import from './import';\nimport Comment from './comment';\nimport Anonymous from './anonymous';\nimport Value from './value';\nimport JavaScript from './javascript';\nimport Assignment from './assignment';\nimport Condition from './condition';\nimport Paren from './paren';\nimport Media from './media';\nimport UnicodeDescriptor from './unicode-descriptor';\nimport Negative from './negative';\nimport Extend from './extend';\nimport VariableCall from './variable-call';\nimport NamespaceValue from './namespace-value';\n\n// mixins\nimport MixinCall from './mixin-call';\nimport MixinDefinition from './mixin-definition';\n\nexport default {\n Node, Color, AtRule, DetachedRuleset, Operation,\n Dimension, Unit, Keyword, Variable, Property,\n Ruleset, Element, Attribute, Combinator, Selector,\n Quoted, Expression, Declaration, Call, URL, Import,\n Comment, Anonymous, Value, JavaScript, Assignment,\n Condition, Paren, Media, UnicodeDescriptor, Negative,\n Extend, VariableCall, NamespaceValue,\n mixin: {\n Call: MixinCall,\n Definition: MixinDefinition\n }\n};","class AbstractFileManager {\n getPath(filename) {\n let j = filename.lastIndexOf('?');\n if (j > 0) {\n filename = filename.slice(0, j);\n }\n j = filename.lastIndexOf('/');\n if (j < 0) {\n j = filename.lastIndexOf('\\\\');\n }\n if (j < 0) {\n return '';\n }\n return filename.slice(0, j + 1);\n }\n\n tryAppendExtension(path, ext) {\n return /(\\.[a-z]*$)|([\\?;].*)$/.test(path) ? path : path + ext;\n }\n\n tryAppendLessExtension(path) {\n return this.tryAppendExtension(path, '.less');\n }\n\n supportsSync() {\n return false;\n }\n\n alwaysMakePathsAbsolute() {\n return false;\n }\n\n isPathAbsolute(filename) {\n return (/^(?:[a-z-]+:|\\/|\\\\|#)/i).test(filename);\n }\n\n // TODO: pull out / replace?\n join(basePath, laterPath) {\n if (!basePath) {\n return laterPath;\n }\n return basePath + laterPath;\n }\n\n pathDiff(url, baseUrl) {\n // diff between two paths to create a relative path\n\n const urlParts = this.extractUrlParts(url);\n\n const baseUrlParts = this.extractUrlParts(baseUrl);\n let i;\n let max;\n let urlDirectories;\n let baseUrlDirectories;\n let diff = '';\n if (urlParts.hostPart !== baseUrlParts.hostPart) {\n return '';\n }\n max = Math.max(baseUrlParts.directories.length, urlParts.directories.length);\n for (i = 0; i < max; i++) {\n if (baseUrlParts.directories[i] !== urlParts.directories[i]) { break; }\n }\n baseUrlDirectories = baseUrlParts.directories.slice(i);\n urlDirectories = urlParts.directories.slice(i);\n for (i = 0; i < baseUrlDirectories.length - 1; i++) {\n diff += '../';\n }\n for (i = 0; i < urlDirectories.length - 1; i++) {\n diff += `${urlDirectories[i]}/`;\n }\n return diff;\n }\n\n // helper function, not part of API\n extractUrlParts(url, baseUrl) {\n // urlParts[1] = protocol://hostname/ OR /\n // urlParts[2] = / if path relative to host base\n // urlParts[3] = directories\n // urlParts[4] = filename\n // urlParts[5] = parameters\n\n const urlPartsRegex = /^((?:[a-z-]+:)?\\/{2}(?:[^\\/\\?#]*\\/)|([\\/\\\\]))?((?:[^\\/\\\\\\?#]*[\\/\\\\])*)([^\\/\\\\\\?#]*)([#\\?].*)?$/i;\n\n const urlParts = url.match(urlPartsRegex);\n const returner = {};\n let rawDirectories = [];\n const directories = [];\n let i;\n let baseUrlParts;\n\n if (!urlParts) {\n throw new Error(`Could not parse sheet href - '${url}'`);\n }\n\n // Stylesheets in IE don't always return the full path\n if (baseUrl && (!urlParts[1] || urlParts[2])) {\n baseUrlParts = baseUrl.match(urlPartsRegex);\n if (!baseUrlParts) {\n throw new Error(`Could not parse page url - '${baseUrl}'`);\n }\n urlParts[1] = urlParts[1] || baseUrlParts[1] || '';\n if (!urlParts[2]) {\n urlParts[3] = baseUrlParts[3] + urlParts[3];\n }\n }\n\n if (urlParts[3]) {\n rawDirectories = urlParts[3].replace(/\\\\/g, '/').split('/');\n\n // collapse '..' and skip '.'\n for (i = 0; i < rawDirectories.length; i++) {\n\n if (rawDirectories[i] === '..') {\n directories.pop();\n }\n else if (rawDirectories[i] !== '.') {\n directories.push(rawDirectories[i]);\n }\n \n }\n }\n\n returner.hostPart = urlParts[1];\n returner.directories = directories;\n returner.rawPath = (urlParts[1] || '') + rawDirectories.join('/');\n returner.path = (urlParts[1] || '') + directories.join('/');\n returner.filename = urlParts[4];\n returner.fileUrl = returner.path + (urlParts[4] || '');\n returner.url = returner.fileUrl + (urlParts[5] || '');\n return returner;\n }\n}\n\nexport default AbstractFileManager;\n","import functionRegistry from '../functions/function-registry';\nimport LessError from '../less-error';\n\nclass AbstractPluginLoader {\n constructor() {\n // Implemented by Node.js plugin loader\n this.require = function() {\n return null;\n }\n }\n\n evalPlugin(contents, context, imports, pluginOptions, fileInfo) {\n\n let loader, registry, pluginObj, localModule, pluginManager, filename, result;\n\n pluginManager = context.pluginManager;\n\n if (fileInfo) {\n if (typeof fileInfo === 'string') {\n filename = fileInfo;\n }\n else {\n filename = fileInfo.filename;\n }\n }\n const shortname = (new this.less.FileManager()).extractUrlParts(filename).filename;\n\n if (filename) {\n pluginObj = pluginManager.get(filename);\n\n if (pluginObj) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imports, filename);\n }\n return pluginObj;\n }\n }\n localModule = {\n exports: {},\n pluginManager,\n fileInfo\n };\n registry = functionRegistry.create();\n\n const registerPlugin = function(obj) {\n pluginObj = obj;\n };\n\n try {\n loader = new Function('module', 'require', 'registerPlugin', 'functions', 'tree', 'less', 'fileInfo', contents);\n loader(localModule, this.require(filename), registerPlugin, registry, this.less.tree, this.less, fileInfo);\n }\n catch (e) {\n return new LessError(e, imports, filename);\n }\n\n if (!pluginObj) {\n pluginObj = localModule.exports;\n }\n pluginObj = this.validatePlugin(pluginObj, filename, shortname);\n\n if (pluginObj instanceof LessError) {\n return pluginObj;\n }\n\n if (pluginObj) {\n pluginObj.imports = imports;\n pluginObj.filename = filename;\n\n // For < 3.x (or unspecified minVersion) - setOptions() before install()\n if (!pluginObj.minVersion || this.compareVersion('3.0.0', pluginObj.minVersion) < 0) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n\n if (result) {\n return result;\n }\n }\n\n // Run on first load\n pluginManager.addPlugin(pluginObj, fileInfo.filename, registry);\n pluginObj.functions = registry.getLocalFunctions();\n\n // Need to call setOptions again because the pluginObj might have functions\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n\n // Run every @plugin call\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imports, filename);\n }\n\n }\n else {\n return new LessError({ message: 'Not a valid plugin' }, imports, filename);\n }\n\n return pluginObj;\n\n }\n\n trySetOptions(plugin, filename, name, options) {\n if (options && !plugin.setOptions) {\n return new LessError({\n message: `Options have been provided but the plugin ${name} does not support any options.`\n });\n }\n try {\n plugin.setOptions && plugin.setOptions(options);\n }\n catch (e) {\n return new LessError(e);\n }\n }\n\n validatePlugin(plugin, filename, name) {\n if (plugin) {\n // support plugins being a function\n // so that the plugin can be more usable programmatically\n if (typeof plugin === 'function') {\n plugin = new plugin();\n }\n\n if (plugin.minVersion) {\n if (this.compareVersion(plugin.minVersion, this.less.version) < 0) {\n return new LessError({\n message: `Plugin ${name} requires version ${this.versionToString(plugin.minVersion)}`\n });\n }\n }\n return plugin;\n }\n return null;\n }\n\n compareVersion(aVersion, bVersion) {\n if (typeof aVersion === 'string') {\n aVersion = aVersion.match(/^(\\d+)\\.?(\\d+)?\\.?(\\d+)?/);\n aVersion.shift();\n }\n for (let i = 0; i < aVersion.length; i++) {\n if (aVersion[i] !== bVersion[i]) {\n return parseInt(aVersion[i]) > parseInt(bVersion[i]) ? -1 : 1;\n }\n }\n return 0;\n }\n\n versionToString(version) {\n let versionString = '';\n for (let i = 0; i < version.length; i++) {\n versionString += (versionString ? '.' : '') + version[i];\n }\n return versionString;\n }\n\n printUsage(plugins) {\n for (let i = 0; i < plugins.length; i++) {\n const plugin = plugins[i];\n if (plugin.printUsage) {\n plugin.printUsage();\n }\n }\n }\n}\n\nexport default AbstractPluginLoader;\n\n","import tree from '../tree';\n\nconst _visitArgs = { visitDeeper: true };\nlet _hasIndexed = false;\n\nfunction _noop(node) {\n return node;\n}\n\nfunction indexNodeTypes(parent, ticker) {\n // add .typeIndex to tree node types for lookup table\n let key, child;\n for (key in parent) { \n /* eslint guard-for-in: 0 */\n child = parent[key];\n switch (typeof child) {\n case 'function':\n // ignore bound functions directly on tree which do not have a prototype\n // or aren't nodes\n if (child.prototype && child.prototype.type) {\n child.prototype.typeIndex = ticker++;\n }\n break;\n case 'object':\n ticker = indexNodeTypes(child, ticker);\n break;\n \n }\n }\n return ticker;\n}\n\nclass Visitor {\n constructor(implementation) {\n this._implementation = implementation;\n this._visitInCache = {};\n this._visitOutCache = {};\n\n if (!_hasIndexed) {\n indexNodeTypes(tree, 1);\n _hasIndexed = true;\n }\n }\n\n visit(node) {\n if (!node) {\n return node;\n }\n\n const nodeTypeIndex = node.typeIndex;\n if (!nodeTypeIndex) {\n // MixinCall args aren't a node type?\n if (node.value && node.value.typeIndex) {\n this.visit(node.value);\n }\n return node;\n }\n\n const impl = this._implementation;\n let func = this._visitInCache[nodeTypeIndex];\n let funcOut = this._visitOutCache[nodeTypeIndex];\n const visitArgs = _visitArgs;\n let fnName;\n\n visitArgs.visitDeeper = true;\n\n if (!func) {\n fnName = `visit${node.type}`;\n func = impl[fnName] || _noop;\n funcOut = impl[`${fnName}Out`] || _noop;\n this._visitInCache[nodeTypeIndex] = func;\n this._visitOutCache[nodeTypeIndex] = funcOut;\n }\n\n if (func !== _noop) {\n const newNode = func.call(impl, node, visitArgs);\n if (node && impl.isReplacing) {\n node = newNode;\n }\n }\n\n if (visitArgs.visitDeeper && node) {\n if (node.length) {\n for (let i = 0, cnt = node.length; i < cnt; i++) {\n if (node[i].accept) {\n node[i].accept(this);\n }\n }\n } else if (node.accept) {\n node.accept(this);\n }\n }\n\n if (funcOut != _noop) {\n funcOut.call(impl, node);\n }\n\n return node;\n }\n\n visitArray(nodes, nonReplacing) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.length;\n let i;\n\n // Non-replacing\n if (nonReplacing || !this._implementation.isReplacing) {\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n // Replacing\n const out = [];\n for (i = 0; i < cnt; i++) {\n const evald = this.visit(nodes[i]);\n if (evald === undefined) { continue; }\n if (!evald.splice) {\n out.push(evald);\n } else if (evald.length) {\n this.flatten(evald, out);\n }\n }\n return out;\n }\n\n flatten(arr, out) {\n if (!out) {\n out = [];\n }\n\n let cnt, i, item, nestedCnt, j, nestedItem;\n\n for (i = 0, cnt = arr.length; i < cnt; i++) {\n item = arr[i];\n if (item === undefined) {\n continue;\n }\n if (!item.splice) {\n out.push(item);\n continue;\n }\n\n for (j = 0, nestedCnt = item.length; j < nestedCnt; j++) {\n nestedItem = item[j];\n if (nestedItem === undefined) {\n continue;\n }\n if (!nestedItem.splice) {\n out.push(nestedItem);\n } else if (nestedItem.length) {\n this.flatten(nestedItem, out);\n }\n }\n }\n\n return out;\n }\n}\n\nexport default Visitor;\n","class ImportSequencer {\n constructor(onSequencerEmpty) {\n this.imports = [];\n this.variableImports = [];\n this._onSequencerEmpty = onSequencerEmpty;\n this._currentDepth = 0;\n }\n\n addImport(callback) {\n const importSequencer = this,\n importItem = {\n callback,\n args: null,\n isReady: false\n };\n this.imports.push(importItem);\n return function() {\n importItem.args = Array.prototype.slice.call(arguments, 0);\n importItem.isReady = true;\n importSequencer.tryRun();\n };\n }\n\n addVariableImport(callback) {\n this.variableImports.push(callback);\n }\n\n tryRun() {\n this._currentDepth++;\n try {\n while (true) {\n while (this.imports.length > 0) {\n const importItem = this.imports[0];\n if (!importItem.isReady) {\n return;\n }\n this.imports = this.imports.slice(1);\n importItem.callback.apply(null, importItem.args);\n }\n if (this.variableImports.length === 0) {\n break;\n }\n const variableImport = this.variableImports[0];\n this.variableImports = this.variableImports.slice(1);\n variableImport();\n }\n } finally {\n this._currentDepth--;\n }\n if (this._currentDepth === 0 && this._onSequencerEmpty) {\n this._onSequencerEmpty();\n }\n }\n}\n\nexport default ImportSequencer;\n","import contexts from '../contexts';\nimport Visitor from './visitor';\nimport ImportSequencer from './import-sequencer';\nimport * as utils from '../utils';\n\nconst ImportVisitor = function(importer, finish) {\n\n this._visitor = new Visitor(this);\n this._importer = importer;\n this._finish = finish;\n this.context = new contexts.Eval();\n this.importCount = 0;\n this.onceFileDetectionMap = {};\n this.recursionDetector = {};\n this._sequencer = new ImportSequencer(this._onSequencerEmpty.bind(this));\n};\n\nImportVisitor.prototype = {\n isReplacing: false,\n run: function (root) {\n try {\n // process the contents\n this._visitor.visit(root);\n }\n catch (e) {\n this.error = e;\n }\n\n this.isFinished = true;\n this._sequencer.tryRun();\n },\n _onSequencerEmpty: function() {\n if (!this.isFinished) {\n return;\n }\n this._finish(this.error);\n },\n visitImport: function (importNode, visitArgs) {\n const inlineCSS = importNode.options.inline;\n\n if (!importNode.css || inlineCSS) {\n\n const context = new contexts.Eval(this.context, utils.copyArray(this.context.frames));\n const importParent = context.frames[0];\n\n this.importCount++;\n if (importNode.isVariableImport()) {\n this._sequencer.addVariableImport(this.processImportNode.bind(this, importNode, context, importParent));\n } else {\n this.processImportNode(importNode, context, importParent);\n }\n }\n visitArgs.visitDeeper = false;\n },\n processImportNode: function(importNode, context, importParent) {\n let evaldImportNode;\n const inlineCSS = importNode.options.inline;\n\n try {\n evaldImportNode = importNode.evalForImport(context);\n } catch (e) {\n if (!e.filename) { e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename; }\n // attempt to eval properly and treat as css\n importNode.css = true;\n // if that fails, this error will be thrown\n importNode.error = e;\n }\n\n if (evaldImportNode && (!evaldImportNode.css || inlineCSS)) {\n\n if (evaldImportNode.options.multiple) {\n context.importMultiple = true;\n }\n\n // try appending if we haven't determined if it is css or not\n const tryAppendLessExtension = evaldImportNode.css === undefined;\n\n for (let i = 0; i < importParent.rules.length; i++) {\n if (importParent.rules[i] === importNode) {\n importParent.rules[i] = evaldImportNode;\n break;\n }\n }\n\n const onImported = this.onImported.bind(this, evaldImportNode, context), sequencedOnImported = this._sequencer.addImport(onImported);\n\n this._importer.push(evaldImportNode.getPath(), tryAppendLessExtension, evaldImportNode.fileInfo(),\n evaldImportNode.options, sequencedOnImported);\n } else {\n this.importCount--;\n if (this.isFinished) {\n this._sequencer.tryRun();\n }\n }\n },\n onImported: function (importNode, context, e, root, importedAtRoot, fullPath) {\n if (e) {\n if (!e.filename) {\n e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename;\n }\n this.error = e;\n }\n\n const importVisitor = this, inlineCSS = importNode.options.inline, isPlugin = importNode.options.isPlugin, isOptional = importNode.options.optional, duplicateImport = importedAtRoot || fullPath in importVisitor.recursionDetector;\n\n if (!context.importMultiple) {\n if (duplicateImport) {\n importNode.skip = true;\n } else {\n importNode.skip = function() {\n if (fullPath in importVisitor.onceFileDetectionMap) {\n return true;\n }\n importVisitor.onceFileDetectionMap[fullPath] = true;\n return false;\n };\n }\n }\n\n if (!fullPath && isOptional) {\n importNode.skip = true;\n }\n\n if (root) {\n importNode.root = root;\n importNode.importedFilename = fullPath;\n\n if (!inlineCSS && !isPlugin && (context.importMultiple || !duplicateImport)) {\n importVisitor.recursionDetector[fullPath] = true;\n\n const oldContext = this.context;\n this.context = context;\n try {\n this._visitor.visit(root);\n } catch (e) {\n this.error = e;\n }\n this.context = oldContext;\n }\n }\n\n importVisitor.importCount--;\n\n if (importVisitor.isFinished) {\n importVisitor._sequencer.tryRun();\n }\n },\n visitDeclaration: function (declNode, visitArgs) {\n if (declNode.value.type === 'DetachedRuleset') {\n this.context.frames.unshift(declNode);\n } else {\n visitArgs.visitDeeper = false;\n }\n },\n visitDeclarationOut: function(declNode) {\n if (declNode.value.type === 'DetachedRuleset') {\n this.context.frames.shift();\n }\n },\n visitAtRule: function (atRuleNode, visitArgs) {\n this.context.frames.unshift(atRuleNode);\n },\n visitAtRuleOut: function (atRuleNode) {\n this.context.frames.shift();\n },\n visitMixinDefinition: function (mixinDefinitionNode, visitArgs) {\n this.context.frames.unshift(mixinDefinitionNode);\n },\n visitMixinDefinitionOut: function (mixinDefinitionNode) {\n this.context.frames.shift();\n },\n visitRuleset: function (rulesetNode, visitArgs) {\n this.context.frames.unshift(rulesetNode);\n },\n visitRulesetOut: function (rulesetNode) {\n this.context.frames.shift();\n },\n visitMedia: function (mediaNode, visitArgs) {\n this.context.frames.unshift(mediaNode.rules[0]);\n },\n visitMediaOut: function (mediaNode) {\n this.context.frames.shift();\n }\n};\nexport default ImportVisitor;\n","class SetTreeVisibilityVisitor {\n constructor(visible) {\n this.visible = visible;\n }\n\n run(root) {\n this.visit(root);\n }\n\n visitArray(nodes) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.length;\n let i;\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n visit(node) {\n if (!node) {\n return node;\n }\n if (node.constructor === Array) {\n return this.visitArray(node);\n }\n\n if (!node.blocksVisibility || node.blocksVisibility()) {\n return node;\n }\n if (this.visible) {\n node.ensureVisibility();\n } else {\n node.ensureInvisibility();\n }\n\n node.accept(this);\n return node;\n }\n}\n\nexport default SetTreeVisibilityVisitor;","import tree from '../tree';\nimport Visitor from './visitor';\nimport logger from '../logger';\nimport * as utils from '../utils';\n\n/* jshint loopfunc:true */\n\nclass ExtendFinderVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n this.contexts = [];\n this.allExtendsStack = [[]];\n }\n\n run(root) {\n root = this._visitor.visit(root);\n root.allExtends = this.allExtendsStack[0];\n return root;\n }\n\n visitDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n\n let i;\n let j;\n let extend;\n const allSelectorsExtendList = [];\n let extendList;\n\n // get &:extend(.a); rules which apply to all selectors in this ruleset\n const rules = rulesetNode.rules, ruleCnt = rules ? rules.length : 0;\n for (i = 0; i < ruleCnt; i++) {\n if (rulesetNode.rules[i] instanceof tree.Extend) {\n allSelectorsExtendList.push(rules[i]);\n rulesetNode.extendOnEveryPath = true;\n }\n }\n\n // now find every selector and apply the extends that apply to all extends\n // and the ones which apply to an individual extend\n const paths = rulesetNode.paths;\n for (i = 0; i < paths.length; i++) {\n const selectorPath = paths[i], selector = selectorPath[selectorPath.length - 1], selExtendList = selector.extendList;\n\n extendList = selExtendList ? utils.copyArray(selExtendList).concat(allSelectorsExtendList)\n : allSelectorsExtendList;\n\n if (extendList) {\n extendList = extendList.map(function(allSelectorsExtend) {\n return allSelectorsExtend.clone();\n });\n }\n\n for (j = 0; j < extendList.length; j++) {\n this.foundExtends = true;\n extend = extendList[j];\n extend.findSelfSelectors(selectorPath);\n extend.ruleset = rulesetNode;\n if (j === 0) { extend.firstExtendOnThisSelectorPath = true; }\n this.allExtendsStack[this.allExtendsStack.length - 1].push(extend);\n }\n }\n\n this.contexts.push(rulesetNode.selectors);\n }\n\n visitRulesetOut(rulesetNode) {\n if (!rulesetNode.root) {\n this.contexts.length = this.contexts.length - 1;\n }\n }\n\n visitMedia(mediaNode, visitArgs) {\n mediaNode.allExtends = [];\n this.allExtendsStack.push(mediaNode.allExtends);\n }\n\n visitMediaOut(mediaNode) {\n this.allExtendsStack.length = this.allExtendsStack.length - 1;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n atRuleNode.allExtends = [];\n this.allExtendsStack.push(atRuleNode.allExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n this.allExtendsStack.length = this.allExtendsStack.length - 1;\n }\n}\n\nclass ProcessExtendsVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n }\n\n run(root) {\n const extendFinder = new ExtendFinderVisitor();\n this.extendIndices = {};\n extendFinder.run(root);\n if (!extendFinder.foundExtends) { return root; }\n root.allExtends = root.allExtends.concat(this.doExtendChaining(root.allExtends, root.allExtends));\n this.allExtendsStack = [root.allExtends];\n const newRoot = this._visitor.visit(root);\n this.checkExtendsForNonMatched(root.allExtends);\n return newRoot;\n }\n\n checkExtendsForNonMatched(extendList) {\n const indices = this.extendIndices;\n extendList.filter(function(extend) {\n return !extend.hasFoundMatches && extend.parent_ids.length == 1;\n }).forEach(function(extend) {\n let selector = '_unknown_';\n try {\n selector = extend.selector.toCSS({});\n }\n catch (_) {}\n\n if (!indices[`${extend.index} ${selector}`]) {\n indices[`${extend.index} ${selector}`] = true;\n logger.warn(`extend '${selector}' has no matches`);\n }\n });\n }\n\n doExtendChaining(extendsList, extendsListTarget, iterationCount) {\n //\n // chaining is different from normal extension.. if we extend an extend then we are not just copying, altering\n // and pasting the selector we would do normally, but we are also adding an extend with the same target selector\n // this means this new extend can then go and alter other extends\n //\n // this method deals with all the chaining work - without it, extend is flat and doesn't work on other extend selectors\n // this is also the most expensive.. and a match on one selector can cause an extension of a selector we had already\n // processed if we look at each selector at a time, as is done in visitRuleset\n\n let extendIndex;\n\n let targetExtendIndex;\n let matches;\n const extendsToAdd = [];\n let newSelector;\n const extendVisitor = this;\n let selectorPath;\n let extend;\n let targetExtend;\n let newExtend;\n\n iterationCount = iterationCount || 0;\n\n // loop through comparing every extend with every target extend.\n // a target extend is the one on the ruleset we are looking at copy/edit/pasting in place\n // e.g. .a:extend(.b) {} and .b:extend(.c) {} then the first extend extends the second one\n // and the second is the target.\n // the separation into two lists allows us to process a subset of chains with a bigger set, as is the\n // case when processing media queries\n for (extendIndex = 0; extendIndex < extendsList.length; extendIndex++) {\n for (targetExtendIndex = 0; targetExtendIndex < extendsListTarget.length; targetExtendIndex++) {\n\n extend = extendsList[extendIndex];\n targetExtend = extendsListTarget[targetExtendIndex];\n\n // look for circular references\n if ( extend.parent_ids.indexOf( targetExtend.object_id ) >= 0 ) { continue; }\n\n // find a match in the target extends self selector (the bit before :extend)\n selectorPath = [targetExtend.selfSelectors[0]];\n matches = extendVisitor.findMatch(extend, selectorPath);\n\n if (matches.length) {\n extend.hasFoundMatches = true;\n\n // we found a match, so for each self selector..\n extend.selfSelectors.forEach(function(selfSelector) {\n const info = targetExtend.visibilityInfo();\n\n // process the extend as usual\n newSelector = extendVisitor.extendSelector(matches, selectorPath, selfSelector, extend.isVisible());\n\n // but now we create a new extend from it\n newExtend = new(tree.Extend)(targetExtend.selector, targetExtend.option, 0, targetExtend.fileInfo(), info);\n newExtend.selfSelectors = newSelector;\n\n // add the extend onto the list of extends for that selector\n newSelector[newSelector.length - 1].extendList = [newExtend];\n\n // record that we need to add it.\n extendsToAdd.push(newExtend);\n newExtend.ruleset = targetExtend.ruleset;\n\n // remember its parents for circular references\n newExtend.parent_ids = newExtend.parent_ids.concat(targetExtend.parent_ids, extend.parent_ids);\n\n // only process the selector once.. if we have :extend(.a,.b) then multiple\n // extends will look at the same selector path, so when extending\n // we know that any others will be duplicates in terms of what is added to the css\n if (targetExtend.firstExtendOnThisSelectorPath) {\n newExtend.firstExtendOnThisSelectorPath = true;\n targetExtend.ruleset.paths.push(newSelector);\n }\n });\n }\n }\n }\n\n if (extendsToAdd.length) {\n // try to detect circular references to stop a stack overflow.\n // may no longer be needed.\n this.extendChainCount++;\n if (iterationCount > 100) {\n let selectorOne = '{unable to calculate}';\n let selectorTwo = '{unable to calculate}';\n try {\n selectorOne = extendsToAdd[0].selfSelectors[0].toCSS();\n selectorTwo = extendsToAdd[0].selector.toCSS();\n }\n catch (e) {}\n throw { message: `extend circular reference detected. One of the circular extends is currently:${selectorOne}:extend(${selectorTwo})`};\n }\n\n // now process the new extends on the existing rules so that we can handle a extending b extending c extending\n // d extending e...\n return extendsToAdd.concat(extendVisitor.doExtendChaining(extendsToAdd, extendsListTarget, iterationCount + 1));\n } else {\n return extendsToAdd;\n }\n }\n\n visitDeclaration(ruleNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitSelector(selectorNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n let matches;\n let pathIndex;\n let extendIndex;\n const allExtends = this.allExtendsStack[this.allExtendsStack.length - 1];\n const selectorsToAdd = [];\n const extendVisitor = this;\n let selectorPath;\n\n // look at each selector path in the ruleset, find any extend matches and then copy, find and replace\n\n for (extendIndex = 0; extendIndex < allExtends.length; extendIndex++) {\n for (pathIndex = 0; pathIndex < rulesetNode.paths.length; pathIndex++) {\n selectorPath = rulesetNode.paths[pathIndex];\n\n // extending extends happens initially, before the main pass\n if (rulesetNode.extendOnEveryPath) { continue; }\n const extendList = selectorPath[selectorPath.length - 1].extendList;\n if (extendList && extendList.length) { continue; }\n\n matches = this.findMatch(allExtends[extendIndex], selectorPath);\n\n if (matches.length) {\n allExtends[extendIndex].hasFoundMatches = true;\n\n allExtends[extendIndex].selfSelectors.forEach(function(selfSelector) {\n let extendedSelectors;\n extendedSelectors = extendVisitor.extendSelector(matches, selectorPath, selfSelector, allExtends[extendIndex].isVisible());\n selectorsToAdd.push(extendedSelectors);\n });\n }\n }\n }\n rulesetNode.paths = rulesetNode.paths.concat(selectorsToAdd);\n }\n\n findMatch(extend, haystackSelectorPath) {\n //\n // look through the haystack selector path to try and find the needle - extend.selector\n // returns an array of selector matches that can then be replaced\n //\n let haystackSelectorIndex;\n\n let hackstackSelector;\n let hackstackElementIndex;\n let haystackElement;\n let targetCombinator;\n let i;\n const extendVisitor = this;\n const needleElements = extend.selector.elements;\n const potentialMatches = [];\n let potentialMatch;\n const matches = [];\n\n // loop through the haystack elements\n for (haystackSelectorIndex = 0; haystackSelectorIndex < haystackSelectorPath.length; haystackSelectorIndex++) {\n hackstackSelector = haystackSelectorPath[haystackSelectorIndex];\n\n for (hackstackElementIndex = 0; hackstackElementIndex < hackstackSelector.elements.length; hackstackElementIndex++) {\n\n haystackElement = hackstackSelector.elements[hackstackElementIndex];\n\n // if we allow elements before our match we can add a potential match every time. otherwise only at the first element.\n if (extend.allowBefore || (haystackSelectorIndex === 0 && hackstackElementIndex === 0)) {\n potentialMatches.push({pathIndex: haystackSelectorIndex, index: hackstackElementIndex, matched: 0,\n initialCombinator: haystackElement.combinator});\n }\n\n for (i = 0; i < potentialMatches.length; i++) {\n potentialMatch = potentialMatches[i];\n\n // selectors add \" \" onto the first element. When we use & it joins the selectors together, but if we don't\n // then each selector in haystackSelectorPath has a space before it added in the toCSS phase. so we need to\n // work out what the resulting combinator will be\n targetCombinator = haystackElement.combinator.value;\n if (targetCombinator === '' && hackstackElementIndex === 0) {\n targetCombinator = ' ';\n }\n\n // if we don't match, null our match to indicate failure\n if (!extendVisitor.isElementValuesEqual(needleElements[potentialMatch.matched].value, haystackElement.value) ||\n (potentialMatch.matched > 0 && needleElements[potentialMatch.matched].combinator.value !== targetCombinator)) {\n potentialMatch = null;\n } else {\n potentialMatch.matched++;\n }\n\n // if we are still valid and have finished, test whether we have elements after and whether these are allowed\n if (potentialMatch) {\n potentialMatch.finished = potentialMatch.matched === needleElements.length;\n if (potentialMatch.finished &&\n (!extend.allowAfter &&\n (hackstackElementIndex + 1 < hackstackSelector.elements.length || haystackSelectorIndex + 1 < haystackSelectorPath.length))) {\n potentialMatch = null;\n }\n }\n // if null we remove, if not, we are still valid, so either push as a valid match or continue\n if (potentialMatch) {\n if (potentialMatch.finished) {\n potentialMatch.length = needleElements.length;\n potentialMatch.endPathIndex = haystackSelectorIndex;\n potentialMatch.endPathElementIndex = hackstackElementIndex + 1; // index after end of match\n potentialMatches.length = 0; // we don't allow matches to overlap, so start matching again\n matches.push(potentialMatch);\n }\n } else {\n potentialMatches.splice(i, 1);\n i--;\n }\n }\n }\n }\n return matches;\n }\n\n isElementValuesEqual(elementValue1, elementValue2) {\n if (typeof elementValue1 === 'string' || typeof elementValue2 === 'string') {\n return elementValue1 === elementValue2;\n }\n if (elementValue1 instanceof tree.Attribute) {\n if (elementValue1.op !== elementValue2.op || elementValue1.key !== elementValue2.key) {\n return false;\n }\n if (!elementValue1.value || !elementValue2.value) {\n if (elementValue1.value || elementValue2.value) {\n return false;\n }\n return true;\n }\n elementValue1 = elementValue1.value.value || elementValue1.value;\n elementValue2 = elementValue2.value.value || elementValue2.value;\n return elementValue1 === elementValue2;\n }\n elementValue1 = elementValue1.value;\n elementValue2 = elementValue2.value;\n if (elementValue1 instanceof tree.Selector) {\n if (!(elementValue2 instanceof tree.Selector) || elementValue1.elements.length !== elementValue2.elements.length) {\n return false;\n }\n for (let i = 0; i < elementValue1.elements.length; i++) {\n if (elementValue1.elements[i].combinator.value !== elementValue2.elements[i].combinator.value) {\n if (i !== 0 || (elementValue1.elements[i].combinator.value || ' ') !== (elementValue2.elements[i].combinator.value || ' ')) {\n return false;\n }\n }\n if (!this.isElementValuesEqual(elementValue1.elements[i].value, elementValue2.elements[i].value)) {\n return false;\n }\n }\n return true;\n }\n return false;\n }\n\n extendSelector(matches, selectorPath, replacementSelector, isVisible) {\n\n // for a set of matches, replace each match with the replacement selector\n\n let currentSelectorPathIndex = 0, currentSelectorPathElementIndex = 0, path = [], matchIndex, selector, firstElement, match, newElements;\n\n for (matchIndex = 0; matchIndex < matches.length; matchIndex++) {\n match = matches[matchIndex];\n selector = selectorPath[match.pathIndex];\n firstElement = new tree.Element(\n match.initialCombinator,\n replacementSelector.elements[0].value,\n replacementSelector.elements[0].isVariable,\n replacementSelector.elements[0].getIndex(),\n replacementSelector.elements[0].fileInfo()\n );\n\n if (match.pathIndex > currentSelectorPathIndex && currentSelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n\n newElements = selector.elements\n .slice(currentSelectorPathElementIndex, match.index)\n .concat([firstElement])\n .concat(replacementSelector.elements.slice(1));\n\n if (currentSelectorPathIndex === match.pathIndex && matchIndex > 0) {\n path[path.length - 1].elements =\n path[path.length - 1].elements.concat(newElements);\n } else {\n path = path.concat(selectorPath.slice(currentSelectorPathIndex, match.pathIndex));\n\n path.push(new tree.Selector(\n newElements\n ));\n }\n currentSelectorPathIndex = match.endPathIndex;\n currentSelectorPathElementIndex = match.endPathElementIndex;\n if (currentSelectorPathElementIndex >= selectorPath[currentSelectorPathIndex].elements.length) {\n currentSelectorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n }\n\n if (currentSelectorPathIndex < selectorPath.length && currentSelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathIndex++;\n }\n\n path = path.concat(selectorPath.slice(currentSelectorPathIndex, selectorPath.length));\n path = path.map(function (currentValue) {\n // we can re-use elements here, because the visibility property matters only for selectors\n const derived = currentValue.createDerived(currentValue.elements);\n if (isVisible) {\n derived.ensureVisibility();\n } else {\n derived.ensureInvisibility();\n }\n return derived;\n });\n return path;\n }\n\n visitMedia(mediaNode, visitArgs) {\n let newAllExtends = mediaNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, mediaNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitMediaOut(mediaNode) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStack.length = lastIndex;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n let newAllExtends = atRuleNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, atRuleNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStack.length = lastIndex;\n }\n}\n\nexport default ProcessExtendsVisitor;\n","import Visitor from './visitor';\n\nclass JoinSelectorVisitor {\n constructor() {\n this.contexts = [[]];\n this._visitor = new Visitor(this);\n }\n\n run(root) {\n return this._visitor.visit(root);\n }\n\n visitDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n const paths = [];\n let selectors;\n\n this.contexts.push(paths);\n\n if (!rulesetNode.root) {\n selectors = rulesetNode.selectors;\n if (selectors) {\n selectors = selectors.filter(function(selector) { return selector.getIsOutput(); });\n rulesetNode.selectors = selectors.length ? selectors : (selectors = null);\n if (selectors) { rulesetNode.joinSelectors(paths, context, selectors); }\n }\n if (!selectors) { rulesetNode.rules = null; }\n rulesetNode.paths = paths;\n }\n }\n\n visitRulesetOut(rulesetNode) {\n this.contexts.length = this.contexts.length - 1;\n }\n\n visitMedia(mediaNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n mediaNode.rules[0].root = (context.length === 0 || context[0].multiMedia);\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n if (atRuleNode.rules && atRuleNode.rules.length) {\n atRuleNode.rules[0].root = (atRuleNode.isRooted || context.length === 0 || null);\n }\n }\n}\n\nexport default JoinSelectorVisitor;\n","import tree from '../tree';\nimport Visitor from './visitor';\n\nclass CSSVisitorUtils {\n constructor(context) {\n this._visitor = new Visitor(this);\n this._context = context;\n }\n\n containsSilentNonBlockedChild(bodyRules) {\n let rule;\n if (!bodyRules) {\n return false;\n }\n for (let r = 0; r < bodyRules.length; r++) {\n rule = bodyRules[r];\n if (rule.isSilent && rule.isSilent(this._context) && !rule.blocksVisibility()) {\n // the atrule contains something that was referenced (likely by extend)\n // therefore it needs to be shown in output too\n return true;\n }\n }\n return false;\n }\n\n keepOnlyVisibleChilds(owner) {\n if (owner && owner.rules) {\n owner.rules = owner.rules.filter(thing => thing.isVisible());\n }\n }\n\n isEmpty(owner) {\n return (owner && owner.rules) \n ? (owner.rules.length === 0) : true;\n }\n\n hasVisibleSelector(rulesetNode) {\n return (rulesetNode && rulesetNode.paths)\n ? (rulesetNode.paths.length > 0) : false;\n }\n\n resolveVisibility(node, originalRules) {\n if (!node.blocksVisibility()) {\n if (this.isEmpty(node) && !this.containsSilentNonBlockedChild(originalRules)) {\n return ;\n }\n\n return node;\n }\n\n const compiledRulesBody = node.rules[0];\n this.keepOnlyVisibleChilds(compiledRulesBody);\n\n if (this.isEmpty(compiledRulesBody)) {\n return ;\n }\n\n node.ensureVisibility();\n node.removeVisibilityBlock();\n\n return node;\n }\n\n isVisibleRuleset(rulesetNode) {\n if (rulesetNode.firstRoot) {\n return true;\n }\n\n if (this.isEmpty(rulesetNode)) {\n return false;\n }\n\n if (!rulesetNode.root && !this.hasVisibleSelector(rulesetNode)) {\n return false;\n }\n\n return true;\n }\n}\n\nconst ToCSSVisitor = function(context) {\n this._visitor = new Visitor(this);\n this._context = context;\n this.utils = new CSSVisitorUtils(context);\n};\n\nToCSSVisitor.prototype = {\n isReplacing: true,\n run: function (root) {\n return this._visitor.visit(root);\n },\n\n visitDeclaration: function (declNode, visitArgs) {\n if (declNode.blocksVisibility() || declNode.variable) {\n return;\n }\n return declNode;\n },\n\n visitMixinDefinition: function (mixinNode, visitArgs) {\n // mixin definitions do not get eval'd - this means they keep state\n // so we have to clear that state here so it isn't used if toCSS is called twice\n mixinNode.frames = [];\n },\n\n visitExtend: function (extendNode, visitArgs) {\n },\n\n visitComment: function (commentNode, visitArgs) {\n if (commentNode.blocksVisibility() || commentNode.isSilent(this._context)) {\n return;\n }\n return commentNode;\n },\n\n visitMedia: function(mediaNode, visitArgs) {\n const originalRules = mediaNode.rules[0].rules;\n mediaNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n\n return this.utils.resolveVisibility(mediaNode, originalRules);\n },\n\n visitImport: function (importNode, visitArgs) {\n if (importNode.blocksVisibility()) {\n return ;\n }\n return importNode;\n },\n\n visitAtRule: function(atRuleNode, visitArgs) {\n if (atRuleNode.rules && atRuleNode.rules.length) {\n return this.visitAtRuleWithBody(atRuleNode, visitArgs);\n } else {\n return this.visitAtRuleWithoutBody(atRuleNode, visitArgs);\n }\n },\n\n visitAnonymous: function(anonymousNode, visitArgs) {\n if (!anonymousNode.blocksVisibility()) {\n anonymousNode.accept(this._visitor);\n return anonymousNode;\n }\n },\n\n visitAtRuleWithBody: function(atRuleNode, visitArgs) {\n // if there is only one nested ruleset and that one has no path, then it is\n // just fake ruleset\n function hasFakeRuleset(atRuleNode) {\n const bodyRules = atRuleNode.rules;\n return bodyRules.length === 1 && (!bodyRules[0].paths || bodyRules[0].paths.length === 0);\n }\n function getBodyRules(atRuleNode) {\n const nodeRules = atRuleNode.rules;\n if (hasFakeRuleset(atRuleNode)) {\n return nodeRules[0].rules;\n }\n\n return nodeRules;\n }\n // it is still true that it is only one ruleset in array\n // this is last such moment\n // process childs\n const originalRules = getBodyRules(atRuleNode);\n atRuleNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n\n if (!this.utils.isEmpty(atRuleNode)) {\n this._mergeRules(atRuleNode.rules[0].rules);\n }\n\n return this.utils.resolveVisibility(atRuleNode, originalRules);\n },\n\n visitAtRuleWithoutBody: function(atRuleNode, visitArgs) {\n if (atRuleNode.blocksVisibility()) {\n return;\n }\n\n if (atRuleNode.name === '@charset') {\n // Only output the debug info together with subsequent @charset definitions\n // a comment (or @media statement) before the actual @charset atrule would\n // be considered illegal css as it has to be on the first line\n if (this.charset) {\n if (atRuleNode.debugInfo) {\n const comment = new tree.Comment(`/* ${atRuleNode.toCSS(this._context).replace(/\\n/g, '')} */\\n`);\n comment.debugInfo = atRuleNode.debugInfo;\n return this._visitor.visit(comment);\n }\n return;\n }\n this.charset = true;\n }\n\n return atRuleNode;\n },\n\n checkValidNodes: function(rules, isRoot) {\n if (!rules) {\n return;\n }\n\n for (let i = 0; i < rules.length; i++) {\n const ruleNode = rules[i];\n if (isRoot && ruleNode instanceof tree.Declaration && !ruleNode.variable) {\n throw { message: 'Properties must be inside selector blocks. They cannot be in the root',\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n if (ruleNode instanceof tree.Call) {\n throw { message: `Function '${ruleNode.name}' did not return a root node`,\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n if (ruleNode.type && !ruleNode.allowRoot) {\n throw { message: `${ruleNode.type} node returned by a function is not valid here`,\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n }\n },\n\n visitRuleset: function (rulesetNode, visitArgs) {\n // at this point rulesets are nested into each other\n let rule;\n\n const rulesets = [];\n\n this.checkValidNodes(rulesetNode.rules, rulesetNode.firstRoot);\n\n if (!rulesetNode.root) {\n // remove invisible paths\n this._compileRulesetPaths(rulesetNode);\n\n // remove rulesets from this ruleset body and compile them separately\n const nodeRules = rulesetNode.rules;\n\n let nodeRuleCnt = nodeRules ? nodeRules.length : 0;\n for (let i = 0; i < nodeRuleCnt; ) {\n rule = nodeRules[i];\n if (rule && rule.rules) {\n // visit because we are moving them out from being a child\n rulesets.push(this._visitor.visit(rule));\n nodeRules.splice(i, 1);\n nodeRuleCnt--;\n continue;\n }\n i++;\n }\n // accept the visitor to remove rules and refactor itself\n // then we can decide nogw whether we want it or not\n // compile body\n if (nodeRuleCnt > 0) {\n rulesetNode.accept(this._visitor);\n } else {\n rulesetNode.rules = null;\n }\n visitArgs.visitDeeper = false;\n } else { // if (! rulesetNode.root) {\n rulesetNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n }\n\n if (rulesetNode.rules) {\n this._mergeRules(rulesetNode.rules);\n this._removeDuplicateRules(rulesetNode.rules);\n }\n\n // now decide whether we keep the ruleset\n if (this.utils.isVisibleRuleset(rulesetNode)) {\n rulesetNode.ensureVisibility();\n rulesets.splice(0, 0, rulesetNode);\n }\n\n if (rulesets.length === 1) {\n return rulesets[0];\n }\n return rulesets;\n },\n\n _compileRulesetPaths: function(rulesetNode) {\n if (rulesetNode.paths) {\n rulesetNode.paths = rulesetNode.paths\n .filter(p => {\n let i;\n if (p[0].elements[0].combinator.value === ' ') {\n p[0].elements[0].combinator = new(tree.Combinator)('');\n }\n for (i = 0; i < p.length; i++) {\n if (p[i].isVisible() && p[i].getIsOutput()) {\n return true;\n }\n }\n return false;\n });\n }\n },\n\n _removeDuplicateRules: function(rules) {\n if (!rules) { return; }\n\n // remove duplicates\n const ruleCache = {};\n\n let ruleList;\n let rule;\n let i;\n\n for (i = rules.length - 1; i >= 0 ; i--) {\n rule = rules[i];\n if (rule instanceof tree.Declaration) {\n if (!ruleCache[rule.name]) {\n ruleCache[rule.name] = rule;\n } else {\n ruleList = ruleCache[rule.name];\n if (ruleList instanceof tree.Declaration) {\n ruleList = ruleCache[rule.name] = [ruleCache[rule.name].toCSS(this._context)];\n }\n const ruleCSS = rule.toCSS(this._context);\n if (ruleList.indexOf(ruleCSS) !== -1) {\n rules.splice(i, 1);\n } else {\n ruleList.push(ruleCSS);\n }\n }\n }\n }\n },\n\n _mergeRules: function(rules) {\n if (!rules) {\n return; \n }\n\n const groups = {};\n const groupsArr = [];\n\n for (let i = 0; i < rules.length; i++) {\n const rule = rules[i];\n if (rule.merge) {\n const key = rule.name;\n groups[key] ? rules.splice(i--, 1) : \n groupsArr.push(groups[key] = []);\n groups[key].push(rule);\n }\n }\n\n groupsArr.forEach(group => {\n if (group.length > 0) {\n const result = group[0];\n let space = [];\n const comma = [new tree.Expression(space)];\n group.forEach(rule => {\n if ((rule.merge === '+') && (space.length > 0)) {\n comma.push(new tree.Expression(space = []));\n }\n space.push(rule.value);\n result.important = result.important || rule.important;\n });\n result.value = new tree.Value(comma);\n }\n });\n }\n};\n\nexport default ToCSSVisitor;\n","import Visitor from './visitor';\nimport ImportVisitor from './import-visitor';\nimport MarkVisibleSelectorsVisitor from './set-tree-visibility-visitor';\nimport ExtendVisitor from './extend-visitor';\nimport JoinSelectorVisitor from './join-selector-visitor';\nimport ToCSSVisitor from './to-css-visitor';\n\nexport default {\n Visitor,\n ImportVisitor,\n MarkVisibleSelectorsVisitor,\n ExtendVisitor,\n JoinSelectorVisitor,\n ToCSSVisitor\n};\n","import chunker from './chunker';\n\nexport default () => {\n let // Less input string\n input;\n\n let // current chunk\n j;\n\n const // holds state for backtracking\n saveStack = [];\n\n let // furthest index the parser has gone to\n furthest;\n\n let // if this is furthest we got to, this is the probably cause\n furthestPossibleErrorMessage;\n\n let // chunkified input\n chunks;\n\n let // current chunk\n current;\n\n let // index of current chunk, in `input`\n currentPos;\n\n const parserInput = {};\n const CHARCODE_SPACE = 32;\n const CHARCODE_TAB = 9;\n const CHARCODE_LF = 10;\n const CHARCODE_CR = 13;\n const CHARCODE_PLUS = 43;\n const CHARCODE_COMMA = 44;\n const CHARCODE_FORWARD_SLASH = 47;\n const CHARCODE_9 = 57;\n\n function skipWhitespace(length) {\n const oldi = parserInput.i;\n const oldj = j;\n const curr = parserInput.i - currentPos;\n const endIndex = parserInput.i + current.length - curr;\n const mem = (parserInput.i += length);\n const inp = input;\n let c;\n let nextChar;\n let comment;\n\n for (; parserInput.i < endIndex; parserInput.i++) {\n c = inp.charCodeAt(parserInput.i);\n\n if (parserInput.autoCommentAbsorb && c === CHARCODE_FORWARD_SLASH) {\n nextChar = inp.charAt(parserInput.i + 1);\n if (nextChar === '/') {\n comment = {index: parserInput.i, isLineComment: true};\n let nextNewLine = inp.indexOf('\\n', parserInput.i + 2);\n if (nextNewLine < 0) {\n nextNewLine = endIndex;\n }\n parserInput.i = nextNewLine;\n comment.text = inp.substr(comment.index, parserInput.i - comment.index);\n parserInput.commentStore.push(comment);\n continue;\n } else if (nextChar === '*') {\n const nextStarSlash = inp.indexOf('*/', parserInput.i + 2);\n if (nextStarSlash >= 0) {\n comment = {\n index: parserInput.i,\n text: inp.substr(parserInput.i, nextStarSlash + 2 - parserInput.i),\n isLineComment: false\n };\n parserInput.i += comment.text.length - 1;\n parserInput.commentStore.push(comment);\n continue;\n }\n }\n break;\n }\n\n if ((c !== CHARCODE_SPACE) && (c !== CHARCODE_LF) && (c !== CHARCODE_TAB) && (c !== CHARCODE_CR)) {\n break;\n }\n }\n\n current = current.slice(length + parserInput.i - mem + curr);\n currentPos = parserInput.i;\n\n if (!current.length) {\n if (j < chunks.length - 1) {\n current = chunks[++j];\n skipWhitespace(0); // skip space at the beginning of a chunk\n return true; // things changed\n }\n parserInput.finished = true;\n }\n\n return oldi !== parserInput.i || oldj !== j;\n }\n\n parserInput.save = () => {\n currentPos = parserInput.i;\n saveStack.push( { current, i: parserInput.i, j });\n };\n parserInput.restore = possibleErrorMessage => {\n\n if (parserInput.i > furthest || (parserInput.i === furthest && possibleErrorMessage && !furthestPossibleErrorMessage)) {\n furthest = parserInput.i;\n furthestPossibleErrorMessage = possibleErrorMessage;\n }\n const state = saveStack.pop();\n current = state.current;\n currentPos = parserInput.i = state.i;\n j = state.j;\n };\n parserInput.forget = () => {\n saveStack.pop();\n };\n parserInput.isWhitespace = offset => {\n const pos = parserInput.i + (offset || 0);\n const code = input.charCodeAt(pos);\n return (code === CHARCODE_SPACE || code === CHARCODE_CR || code === CHARCODE_TAB || code === CHARCODE_LF);\n };\n\n // Specialization of $(tok)\n parserInput.$re = tok => {\n if (parserInput.i > currentPos) {\n current = current.slice(parserInput.i - currentPos);\n currentPos = parserInput.i;\n }\n\n const m = tok.exec(current);\n if (!m) {\n return null;\n }\n\n skipWhitespace(m[0].length);\n if (typeof m === 'string') {\n return m;\n }\n\n return m.length === 1 ? m[0] : m;\n };\n\n parserInput.$char = tok => {\n if (input.charAt(parserInput.i) !== tok) {\n return null;\n }\n skipWhitespace(1);\n return tok;\n };\n\n parserInput.$str = tok => {\n const tokLength = tok.length;\n\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tokLength; i++) {\n if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n return null;\n }\n }\n\n skipWhitespace(tokLength);\n return tok;\n };\n\n parserInput.$quoted = loc => {\n const pos = loc || parserInput.i;\n const startChar = input.charAt(pos);\n\n if (startChar !== '\\'' && startChar !== '\"') {\n return;\n }\n const length = input.length;\n const currentPosition = pos;\n\n for (let i = 1; i + currentPosition < length; i++) {\n const nextChar = input.charAt(i + currentPosition);\n switch (nextChar) {\n case '\\\\':\n i++;\n continue;\n case '\\r':\n case '\\n':\n break;\n case startChar:\n const str = input.substr(currentPosition, i + 1);\n if (!loc && loc !== 0) {\n skipWhitespace(i + 1);\n return str\n }\n return [startChar, str];\n default:\n }\n }\n return null;\n };\n\n /**\n * Permissive parsing. Ignores everything except matching {} [] () and quotes\n * until matching token (outside of blocks)\n */\n parserInput.$parseUntil = tok => {\n let quote = '';\n let returnVal = null;\n let inComment = false;\n let blockDepth = 0;\n const blockStack = [];\n const parseGroups = [];\n const length = input.length;\n const startPos = parserInput.i;\n let lastPos = parserInput.i;\n let i = parserInput.i;\n let loop = true;\n let testChar;\n\n if (typeof tok === 'string') {\n testChar = char => char === tok\n } else {\n testChar = char => tok.test(char)\n }\n\n do {\n let prevChar;\n let nextChar = input.charAt(i);\n if (blockDepth === 0 && testChar(nextChar)) {\n returnVal = input.substr(lastPos, i - lastPos);\n if (returnVal) {\n parseGroups.push(returnVal);\n }\n else {\n parseGroups.push(' ');\n }\n returnVal = parseGroups;\n skipWhitespace(i - startPos);\n loop = false\n } else {\n if (inComment) {\n if (nextChar === '*' && \n input.charAt(i + 1) === '/') {\n i++;\n blockDepth--;\n inComment = false;\n }\n i++;\n continue;\n }\n switch (nextChar) {\n case '\\\\':\n i++;\n nextChar = input.charAt(i);\n parseGroups.push(input.substr(lastPos, i - lastPos + 1));\n lastPos = i + 1;\n break;\n case '/':\n if (input.charAt(i + 1) === '*') {\n i++;\n inComment = true;\n blockDepth++;\n }\n break;\n case '\\'':\n case '\"':\n quote = parserInput.$quoted(i);\n if (quote) {\n parseGroups.push(input.substr(lastPos, i - lastPos), quote);\n i += quote[1].length - 1;\n lastPos = i + 1;\n }\n else {\n skipWhitespace(i - startPos);\n returnVal = nextChar;\n loop = false;\n }\n break;\n case '{':\n blockStack.push('}');\n blockDepth++;\n break;\n case '(':\n blockStack.push(')');\n blockDepth++;\n break;\n case '[':\n blockStack.push(']');\n blockDepth++;\n break;\n case '}':\n case ')':\n case ']':\n const expected = blockStack.pop();\n if (nextChar === expected) {\n blockDepth--;\n } else {\n // move the parser to the error and return expected\n skipWhitespace(i - startPos);\n returnVal = expected;\n loop = false;\n }\n }\n i++;\n if (i > length) {\n loop = false;\n }\n }\n prevChar = nextChar;\n } while (loop);\n\n return returnVal ? returnVal : null;\n }\n\n parserInput.autoCommentAbsorb = true;\n parserInput.commentStore = [];\n parserInput.finished = false;\n\n // Same as $(), but don't change the state of the parser,\n // just return the match.\n parserInput.peek = tok => {\n if (typeof tok === 'string') {\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tok.length; i++) {\n if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n return false;\n }\n }\n return true;\n } else {\n return tok.test(current);\n }\n };\n\n // Specialization of peek()\n // TODO remove or change some currentChar calls to peekChar\n parserInput.peekChar = tok => input.charAt(parserInput.i) === tok;\n\n parserInput.currentChar = () => input.charAt(parserInput.i);\n\n parserInput.prevChar = () => input.charAt(parserInput.i - 1);\n\n parserInput.getInput = () => input;\n\n parserInput.peekNotNumeric = () => {\n const c = input.charCodeAt(parserInput.i);\n // Is the first char of the dimension 0-9, '.', '+' or '-'\n return (c > CHARCODE_9 || c < CHARCODE_PLUS) || c === CHARCODE_FORWARD_SLASH || c === CHARCODE_COMMA;\n };\n\n parserInput.start = (str, chunkInput, failFunction) => {\n input = str;\n parserInput.i = j = currentPos = furthest = 0;\n\n // chunking apparently makes things quicker (but my tests indicate\n // it might actually make things slower in node at least)\n // and it is a non-perfect parse - it can't recognise\n // unquoted urls, meaning it can't distinguish comments\n // meaning comments with quotes or {}() in them get 'counted'\n // and then lead to parse errors.\n // In addition if the chunking chunks in the wrong place we might\n // not be able to parse a parser statement in one go\n // this is officially deprecated but can be switched on via an option\n // in the case it causes too much performance issues.\n if (chunkInput) {\n chunks = chunker(str, failFunction);\n } else {\n chunks = [str];\n }\n\n current = chunks[0];\n\n skipWhitespace(0);\n };\n\n parserInput.end = () => {\n let message;\n const isFinished = parserInput.i >= input.length;\n\n if (parserInput.i < furthest) {\n message = furthestPossibleErrorMessage;\n parserInput.i = furthest;\n }\n return {\n isFinished,\n furthest: parserInput.i,\n furthestPossibleErrorMessage: message,\n furthestReachedEnd: parserInput.i >= input.length - 1,\n furthestChar: input[parserInput.i]\n };\n };\n\n return parserInput;\n};\n","// Split the input into chunks.\nexport default function (input, fail) {\n const len = input.length;\n let level = 0;\n let parenLevel = 0;\n let lastOpening;\n let lastOpeningParen;\n let lastMultiComment;\n let lastMultiCommentEndBrace;\n const chunks = [];\n let emitFrom = 0;\n let chunkerCurrentIndex;\n let currentChunkStartIndex;\n let cc;\n let cc2;\n let matched;\n\n function emitChunk(force) {\n const len = chunkerCurrentIndex - emitFrom;\n if (((len < 512) && !force) || !len) {\n return;\n }\n chunks.push(input.slice(emitFrom, chunkerCurrentIndex + 1));\n emitFrom = chunkerCurrentIndex + 1;\n }\n\n for (chunkerCurrentIndex = 0; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc = input.charCodeAt(chunkerCurrentIndex);\n if (((cc >= 97) && (cc <= 122)) || (cc < 34)) {\n // a-z or whitespace\n continue;\n }\n\n switch (cc) {\n case 40: // (\n parenLevel++;\n lastOpeningParen = chunkerCurrentIndex;\n continue;\n case 41: // )\n if (--parenLevel < 0) {\n return fail('missing opening `(`', chunkerCurrentIndex);\n }\n continue;\n case 59: // ;\n if (!parenLevel) { emitChunk(); }\n continue;\n case 123: // {\n level++;\n lastOpening = chunkerCurrentIndex;\n continue;\n case 125: // }\n if (--level < 0) {\n return fail('missing opening `{`', chunkerCurrentIndex);\n }\n if (!level && !parenLevel) { emitChunk(); }\n continue;\n case 92: // \\\n if (chunkerCurrentIndex < len - 1) { chunkerCurrentIndex++; continue; }\n return fail('unescaped `\\\\`', chunkerCurrentIndex);\n case 34:\n case 39:\n case 96: // \", ' and `\n matched = 0;\n currentChunkStartIndex = chunkerCurrentIndex;\n for (chunkerCurrentIndex = chunkerCurrentIndex + 1; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if (cc2 > 96) { continue; }\n if (cc2 == cc) { matched = 1; break; }\n if (cc2 == 92) { // \\\n if (chunkerCurrentIndex == len - 1) {\n return fail('unescaped `\\\\`', chunkerCurrentIndex);\n }\n chunkerCurrentIndex++;\n }\n }\n if (matched) { continue; }\n return fail(`unmatched \\`${String.fromCharCode(cc)}\\``, currentChunkStartIndex);\n case 47: // /, check for comment\n if (parenLevel || (chunkerCurrentIndex == len - 1)) { continue; }\n cc2 = input.charCodeAt(chunkerCurrentIndex + 1);\n if (cc2 == 47) {\n // //, find lnfeed\n for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if ((cc2 <= 13) && ((cc2 == 10) || (cc2 == 13))) { break; }\n }\n } else if (cc2 == 42) {\n // /*, find */\n lastMultiComment = currentChunkStartIndex = chunkerCurrentIndex;\n for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len - 1; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if (cc2 == 125) { lastMultiCommentEndBrace = chunkerCurrentIndex; }\n if (cc2 != 42) { continue; }\n if (input.charCodeAt(chunkerCurrentIndex + 1) == 47) { break; }\n }\n if (chunkerCurrentIndex == len - 1) {\n return fail('missing closing `*/`', currentChunkStartIndex);\n }\n chunkerCurrentIndex++;\n }\n continue;\n case 42: // *, check for unmatched */\n if ((chunkerCurrentIndex < len - 1) && (input.charCodeAt(chunkerCurrentIndex + 1) == 47)) {\n return fail('unmatched `/*`', chunkerCurrentIndex);\n }\n continue;\n }\n }\n\n if (level !== 0) {\n if ((lastMultiComment > lastOpening) && (lastMultiCommentEndBrace > lastMultiComment)) {\n return fail('missing closing `}` or `*/`', lastOpening);\n } else {\n return fail('missing closing `}`', lastOpening);\n }\n } else if (parenLevel !== 0) {\n return fail('missing closing `)`', lastOpeningParen);\n }\n\n emitChunk(true);\n return chunks;\n};\n","import LessError from '../less-error';\nimport tree from '../tree';\nimport visitors from '../visitors';\nimport getParserInput from './parser-input';\nimport * as utils from '../utils';\nimport functionRegistry from '../functions/function-registry';\n\n//\n// less.js - parser\n//\n// A relatively straight-forward predictive parser.\n// There is no tokenization/lexing stage, the input is parsed\n// in one sweep.\n//\n// To make the parser fast enough to run in the browser, several\n// optimization had to be made:\n//\n// - Matching and slicing on a huge input is often cause of slowdowns.\n// The solution is to chunkify the input into smaller strings.\n// The chunks are stored in the `chunks` var,\n// `j` holds the current chunk index, and `currentPos` holds\n// the index of the current chunk in relation to `input`.\n// This gives us an almost 4x speed-up.\n//\n// - In many cases, we don't need to match individual tokens;\n// for example, if a value doesn't hold any variables, operations\n// or dynamic references, the parser can effectively 'skip' it,\n// treating it as a literal.\n// An example would be '1px solid #000' - which evaluates to itself,\n// we don't need to know what the individual components are.\n// The drawback, of course is that you don't get the benefits of\n// syntax-checking on the CSS. This gives us a 50% speed-up in the parser,\n// and a smaller speed-up in the code-gen.\n//\n//\n// Token matching is done with the `$` function, which either takes\n// a terminal string or regexp, or a non-terminal function to call.\n// It also takes care of moving all the indices forwards.\n//\n\nconst Parser = function Parser(context, imports, fileInfo) {\n let parsers;\n const parserInput = getParserInput();\n\n function error(msg, type) {\n throw new LessError(\n {\n index: parserInput.i,\n filename: fileInfo.filename,\n type: type || 'Syntax',\n message: msg\n },\n imports\n );\n }\n\n function expect(arg, msg) {\n // some older browsers return typeof 'function' for RegExp\n const result = (arg instanceof Function) ? arg.call(parsers) : parserInput.$re(arg);\n if (result) {\n return result;\n }\n \n error(msg || (typeof arg === 'string'\n ? `expected '${arg}' got '${parserInput.currentChar()}'`\n : 'unexpected token'));\n }\n\n // Specialization of expect()\n function expectChar(arg, msg) {\n if (parserInput.$char(arg)) {\n return arg;\n }\n error(msg || `expected '${arg}' got '${parserInput.currentChar()}'`);\n }\n\n function getDebugInfo(index) {\n const filename = fileInfo.filename;\n\n return {\n lineNumber: utils.getLocation(index, parserInput.getInput()).line + 1,\n fileName: filename\n };\n }\n\n /**\n * Used after initial parsing to create nodes on the fly\n * \n * @param {String} str - string to parse \n * @param {Array} parseList - array of parsers to run input through e.g. [\"value\", \"important\"]\n * @param {Number} currentIndex - start number to begin indexing\n * @param {Object} fileInfo - fileInfo to attach to created nodes\n */\n function parseNode(str, parseList, currentIndex, fileInfo, callback) {\n let result;\n const returnNodes = [];\n const parser = parserInput;\n\n try {\n parser.start(str, false, function fail(msg, index) {\n callback({\n message: msg,\n index: index + currentIndex\n });\n });\n for (let x = 0, p, i; (p = parseList[x]); x++) {\n i = parser.i;\n result = parsers[p]();\n if (result) {\n try {\n result._index = i + currentIndex;\n result._fileInfo = fileInfo;\n } catch (e) {}\n returnNodes.push(result);\n }\n else {\n returnNodes.push(null);\n }\n }\n\n const endInfo = parser.end();\n if (endInfo.isFinished) {\n callback(null, returnNodes);\n }\n else {\n callback(true, null);\n }\n } catch (e) {\n throw new LessError({\n index: e.index + currentIndex,\n message: e.message\n }, imports, fileInfo.filename);\n }\n }\n\n //\n // The Parser\n //\n return {\n parserInput,\n imports,\n fileInfo,\n parseNode,\n //\n // Parse an input string into an abstract syntax tree,\n // @param str A string containing 'less' markup\n // @param callback call `callback` when done.\n // @param [additionalData] An optional map which can contains vars - a map (key, value) of variables to apply\n //\n parse: function (str, callback, additionalData) {\n let root;\n let error = null;\n let globalVars;\n let modifyVars;\n let ignored;\n let preText = '';\n\n globalVars = (additionalData && additionalData.globalVars) ? `${Parser.serializeVars(additionalData.globalVars)}\\n` : '';\n modifyVars = (additionalData && additionalData.modifyVars) ? `\\n${Parser.serializeVars(additionalData.modifyVars)}` : '';\n\n if (context.pluginManager) {\n const preProcessors = context.pluginManager.getPreProcessors();\n for (let i = 0; i < preProcessors.length; i++) {\n str = preProcessors[i].process(str, { context, imports, fileInfo });\n }\n }\n\n if (globalVars || (additionalData && additionalData.banner)) {\n preText = ((additionalData && additionalData.banner) ? additionalData.banner : '') + globalVars;\n ignored = imports.contentsIgnoredChars;\n ignored[fileInfo.filename] = ignored[fileInfo.filename] || 0;\n ignored[fileInfo.filename] += preText.length;\n }\n\n str = str.replace(/\\r\\n?/g, '\\n');\n // Remove potential UTF Byte Order Mark\n str = preText + str.replace(/^\\uFEFF/, '') + modifyVars;\n imports.contents[fileInfo.filename] = str;\n\n // Start with the primary rule.\n // The whole syntax tree is held under a Ruleset node,\n // with the `root` property set to true, so no `{}` are\n // output. The callback is called when the input is parsed.\n try {\n parserInput.start(str, context.chunkInput, function fail(msg, index) {\n throw new LessError({\n index,\n type: 'Parse',\n message: msg,\n filename: fileInfo.filename\n }, imports);\n });\n\n tree.Node.prototype.parse = this;\n root = new tree.Ruleset(null, this.parsers.primary());\n tree.Node.prototype.rootNode = root;\n root.root = true;\n root.firstRoot = true;\n root.functionRegistry = functionRegistry.inherit();\n \n } catch (e) {\n return callback(new LessError(e, imports, fileInfo.filename));\n }\n\n // If `i` is smaller than the `input.length - 1`,\n // it means the parser wasn't able to parse the whole\n // string, so we've got a parsing error.\n //\n // We try to extract a \\n delimited string,\n // showing the line where the parse error occurred.\n // We split it up into two parts (the part which parsed,\n // and the part which didn't), so we can color them differently.\n const endInfo = parserInput.end();\n if (!endInfo.isFinished) {\n\n let message = endInfo.furthestPossibleErrorMessage;\n\n if (!message) {\n message = 'Unrecognised input';\n if (endInfo.furthestChar === '}') {\n message += '. Possibly missing opening \\'{\\'';\n } else if (endInfo.furthestChar === ')') {\n message += '. Possibly missing opening \\'(\\'';\n } else if (endInfo.furthestReachedEnd) {\n message += '. Possibly missing something';\n }\n }\n\n error = new LessError({\n type: 'Parse',\n message,\n index: endInfo.furthest,\n filename: fileInfo.filename\n }, imports);\n }\n\n const finish = e => {\n e = error || e || imports.error;\n\n if (e) {\n if (!(e instanceof LessError)) {\n e = new LessError(e, imports, fileInfo.filename);\n }\n\n return callback(e);\n }\n else {\n return callback(null, root);\n }\n };\n\n if (context.processImports !== false) {\n new visitors.ImportVisitor(imports, finish)\n .run(root);\n } else {\n return finish();\n }\n },\n\n //\n // Here in, the parsing rules/functions\n //\n // The basic structure of the syntax tree generated is as follows:\n //\n // Ruleset -> Declaration -> Value -> Expression -> Entity\n //\n // Here's some Less code:\n //\n // .class {\n // color: #fff;\n // border: 1px solid #000;\n // width: @w + 4px;\n // > .child {...}\n // }\n //\n // And here's what the parse tree might look like:\n //\n // Ruleset (Selector '.class', [\n // Declaration (\"color\", Value ([Expression [Color #fff]]))\n // Declaration (\"border\", Value ([Expression [Dimension 1px][Keyword \"solid\"][Color #000]]))\n // Declaration (\"width\", Value ([Expression [Operation \" + \" [Variable \"@w\"][Dimension 4px]]]))\n // Ruleset (Selector [Element '>', '.child'], [...])\n // ])\n //\n // In general, most rules will try to parse a token with the `$re()` function, and if the return\n // value is truly, will return a new node, of the relevant type. Sometimes, we need to check\n // first, before parsing, that's when we use `peek()`.\n //\n parsers: parsers = {\n //\n // The `primary` rule is the *entry* and *exit* point of the parser.\n // The rules here can appear at any level of the parse tree.\n //\n // The recursive nature of the grammar is an interplay between the `block`\n // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule,\n // as represented by this simplified grammar:\n //\n // primary → (ruleset | declaration)+\n // ruleset → selector+ block\n // block → '{' primary '}'\n //\n // Only at one point is the primary rule not called from the\n // block rule: at the root level.\n //\n primary: function () {\n const mixin = this.mixin;\n let root = [];\n let node;\n\n while (true) {\n while (true) {\n node = this.comment();\n if (!node) { break; }\n root.push(node);\n }\n // always process comments before deciding if finished\n if (parserInput.finished) {\n break;\n }\n if (parserInput.peek('}')) {\n break;\n }\n\n node = this.extendRule();\n if (node) {\n root = root.concat(node);\n continue;\n }\n\n node = mixin.definition() || this.declaration() || mixin.call(false, false) || \n this.ruleset() || this.variableCall() || this.entities.call() || this.atrule();\n if (node) {\n root.push(node);\n } else {\n let foundSemiColon = false;\n while (parserInput.$char(';')) {\n foundSemiColon = true;\n }\n if (!foundSemiColon) {\n break;\n }\n }\n }\n\n return root;\n },\n\n // comments are collected by the main parsing mechanism and then assigned to nodes\n // where the current structure allows it\n comment: function () {\n if (parserInput.commentStore.length) {\n const comment = parserInput.commentStore.shift();\n return new(tree.Comment)(comment.text, comment.isLineComment, comment.index, fileInfo);\n }\n },\n\n //\n // Entities are tokens which can be found inside an Expression\n //\n entities: {\n mixinLookup: function() {\n return parsers.mixin.call(true, true);\n },\n //\n // A string, which supports escaping \" and '\n //\n // \"milky way\" 'he\\'s the one!'\n //\n quoted: function (forceEscaped) {\n let str;\n const index = parserInput.i;\n let isEscaped = false;\n\n parserInput.save();\n if (parserInput.$char('~')) {\n isEscaped = true;\n } else if (forceEscaped) {\n parserInput.restore();\n return;\n }\n\n str = parserInput.$quoted();\n if (!str) {\n parserInput.restore();\n return;\n }\n parserInput.forget();\n\n return new(tree.Quoted)(str.charAt(0), str.substr(1, str.length - 2), isEscaped, index, fileInfo);\n },\n\n //\n // A catch-all word, such as:\n //\n // black border-collapse\n //\n keyword: function () {\n const k = parserInput.$char('%') || parserInput.$re(/^\\[?(?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+\\]?/);\n if (k) {\n return tree.Color.fromKeyword(k) || new(tree.Keyword)(k);\n }\n },\n\n //\n // A function call\n //\n // rgb(255, 0, 255)\n //\n // The arguments are parsed with the `entities.arguments` parser.\n //\n call: function () {\n let name;\n let args;\n let func;\n const index = parserInput.i;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (parserInput.peek(/^url\\(/i)) {\n return;\n }\n\n parserInput.save();\n\n name = parserInput.$re(/^([\\w-]+|%|~|progid:[\\w\\.]+)\\(/);\n if (!name) {\n parserInput.forget(); \n return;\n }\n\n name = name[1];\n func = this.customFuncCall(name);\n if (func) {\n args = func.parse();\n if (args && func.stop) {\n parserInput.forget();\n return args;\n }\n }\n\n args = this.arguments(args);\n\n if (!parserInput.$char(')')) {\n parserInput.restore('Could not parse call arguments or missing \\')\\'');\n return;\n }\n\n parserInput.forget();\n\n return new(tree.Call)(name, args, index, fileInfo);\n },\n \n //\n // Parsing rules for functions with non-standard args, e.g.:\n //\n // boolean(not(2 > 1))\n //\n // This is a quick prototype, to be modified/improved when\n // more custom-parsed funcs come (e.g. `selector(...)`)\n //\n\n customFuncCall: function (name) {\n /* Ideally the table is to be moved out of here for faster perf.,\n but it's quite tricky since it relies on all these `parsers`\n and `expect` available only here */\n return {\n alpha: f(parsers.ieAlpha, true),\n boolean: f(condition),\n 'if': f(condition)\n }[name.toLowerCase()];\n\n function f(parse, stop) {\n return {\n parse, // parsing function\n stop // when true - stop after parse() and return its result, \n // otherwise continue for plain args\n };\n }\n \n function condition() {\n return [expect(parsers.condition, 'expected condition')];\n }\n },\n\n arguments: function (prevArgs) {\n let argsComma = prevArgs || [];\n const argsSemiColon = [];\n let isSemiColonSeparated;\n let value;\n\n parserInput.save();\n\n while (true) {\n if (prevArgs) {\n prevArgs = false;\n } else {\n value = parsers.detachedRuleset() || this.assignment() || parsers.expression();\n if (!value) {\n break;\n }\n\n if (value.value && value.value.length == 1) {\n value = value.value[0];\n }\n\n argsComma.push(value);\n }\n\n if (parserInput.$char(',')) {\n continue;\n }\n\n if (parserInput.$char(';') || isSemiColonSeparated) {\n isSemiColonSeparated = true;\n value = (argsComma.length < 1) ? argsComma[0]\n : new tree.Value(argsComma);\n argsSemiColon.push(value);\n argsComma = [];\n }\n }\n\n parserInput.forget();\n return isSemiColonSeparated ? argsSemiColon : argsComma;\n },\n literal: function () {\n return this.dimension() ||\n this.color() ||\n this.quoted() ||\n this.unicodeDescriptor();\n },\n\n // Assignments are argument entities for calls.\n // They are present in ie filter properties as shown below.\n //\n // filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* )\n //\n\n assignment: function () {\n let key;\n let value;\n parserInput.save();\n key = parserInput.$re(/^\\w+(?=\\s?=)/i);\n if (!key) {\n parserInput.restore();\n return;\n }\n if (!parserInput.$char('=')) {\n parserInput.restore();\n return;\n }\n value = parsers.entity();\n if (value) {\n parserInput.forget();\n return new(tree.Assignment)(key, value);\n } else {\n parserInput.restore();\n }\n },\n\n //\n // Parse url() tokens\n //\n // We use a specific rule for urls, because they don't really behave like\n // standard function calls. The difference is that the argument doesn't have\n // to be enclosed within a string, so it can't be parsed as an Expression.\n //\n url: function () {\n let value;\n const index = parserInput.i;\n\n parserInput.autoCommentAbsorb = false;\n\n if (!parserInput.$str('url(')) {\n parserInput.autoCommentAbsorb = true;\n return;\n }\n\n value = this.quoted() || this.variable() || this.property() ||\n parserInput.$re(/^(?:(?:\\\\[\\(\\)'\"])|[^\\(\\)'\"])+/) || '';\n\n parserInput.autoCommentAbsorb = true;\n\n expectChar(')');\n\n return new(tree.URL)((value.value != null || \n value instanceof tree.Variable || \n value instanceof tree.Property) ?\n value : new(tree.Anonymous)(value, index), index, fileInfo);\n },\n\n //\n // A Variable entity, such as `@fink`, in\n //\n // width: @fink + 2px\n //\n // We use a different parser for variable definitions,\n // see `parsers.variable`.\n //\n variable: function () {\n let ch;\n let name;\n const index = parserInput.i;\n\n parserInput.save();\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^@@?[\\w-]+/))) {\n ch = parserInput.currentChar();\n if (ch === '(' || ch === '[' && !parserInput.prevChar().match(/^\\s/)) {\n // this may be a VariableCall lookup\n const result = parsers.variableCall(name);\n if (result) {\n parserInput.forget();\n return result;\n }\n }\n parserInput.forget();\n return new(tree.Variable)(name, index, fileInfo);\n }\n parserInput.restore();\n },\n\n // A variable entity using the protective {} e.g. @{var}\n variableCurly: function () {\n let curly;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '@' && (curly = parserInput.$re(/^@\\{([\\w-]+)\\}/))) {\n return new(tree.Variable)(`@${curly[1]}`, index, fileInfo);\n }\n },\n //\n // A Property accessor, such as `$color`, in\n //\n // background-color: $color\n //\n property: function () {\n let name;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' && (name = parserInput.$re(/^\\$[\\w-]+/))) {\n return new(tree.Property)(name, index, fileInfo);\n }\n },\n\n // A property entity useing the protective {} e.g. ${prop}\n propertyCurly: function () {\n let curly;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' && (curly = parserInput.$re(/^\\$\\{([\\w-]+)\\}/))) {\n return new(tree.Property)(`$${curly[1]}`, index, fileInfo);\n }\n },\n //\n // A Hexadecimal color\n //\n // #4F3C2F\n //\n // `rgb` and `hsl` colors are parsed through the `entities.call` parser.\n //\n color: function () {\n let rgb;\n parserInput.save();\n\n if (parserInput.currentChar() === '#' && (rgb = parserInput.$re(/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})([\\w.#\\[])?/))) {\n if (!rgb[2]) {\n parserInput.forget();\n return new(tree.Color)(rgb[1], undefined, rgb[0]);\n } \n }\n parserInput.restore();\n },\n\n colorKeyword: function () {\n parserInput.save();\n const autoCommentAbsorb = parserInput.autoCommentAbsorb;\n parserInput.autoCommentAbsorb = false;\n const k = parserInput.$re(/^[_A-Za-z-][_A-Za-z0-9-]+/);\n parserInput.autoCommentAbsorb = autoCommentAbsorb;\n if (!k) {\n parserInput.forget();\n return;\n }\n parserInput.restore();\n const color = tree.Color.fromKeyword(k);\n if (color) {\n parserInput.$str(k);\n return color;\n }\n },\n\n //\n // A Dimension, that is, a number and a unit\n //\n // 0.5em 95%\n //\n dimension: function () {\n if (parserInput.peekNotNumeric()) {\n return;\n }\n\n const value = parserInput.$re(/^([+-]?\\d*\\.?\\d+)(%|[a-z_]+)?/i);\n if (value) {\n return new(tree.Dimension)(value[1], value[2]);\n }\n },\n\n //\n // A unicode descriptor, as is used in unicode-range\n //\n // U+0?? or U+00A1-00A9\n //\n unicodeDescriptor: function () {\n let ud;\n\n ud = parserInput.$re(/^U\\+[0-9a-fA-F?]+(\\-[0-9a-fA-F?]+)?/);\n if (ud) {\n return new(tree.UnicodeDescriptor)(ud[0]);\n }\n },\n\n //\n // JavaScript code to be evaluated\n //\n // `window.location.href`\n //\n javascript: function () {\n let js;\n const index = parserInput.i;\n\n parserInput.save();\n\n const escape = parserInput.$char('~');\n const jsQuote = parserInput.$char('`');\n\n if (!jsQuote) {\n parserInput.restore();\n return;\n }\n\n js = parserInput.$re(/^[^`]*`/);\n if (js) {\n parserInput.forget();\n return new(tree.JavaScript)(js.substr(0, js.length - 1), Boolean(escape), index, fileInfo);\n }\n parserInput.restore('invalid javascript definition');\n }\n },\n\n //\n // The variable part of a variable definition. Used in the `rule` parser\n //\n // @fink:\n //\n variable: function () {\n let name;\n\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^(@[\\w-]+)\\s*:/))) { return name[1]; }\n },\n\n //\n // Call a variable value to retrieve a detached ruleset\n // or a value from a detached ruleset's rules.\n //\n // @fink();\n // @fink;\n // color: @fink[@color];\n //\n variableCall: function (parsedName) {\n let lookups;\n const i = parserInput.i;\n const inValue = !!parsedName;\n let name = parsedName;\n\n parserInput.save();\n\n if (name || (parserInput.currentChar() === '@'\n && (name = parserInput.$re(/^(@[\\w-]+)(\\(\\s*\\))?/)))) {\n\n lookups = this.mixin.ruleLookups();\n\n if (!lookups && ((inValue && parserInput.$str('()') !== '()') || (name[2] !== '()'))) {\n parserInput.restore('Missing \\'[...]\\' lookup in variable call');\n return;\n }\n\n if (!inValue) {\n name = name[1];\n }\n\n const call = new tree.VariableCall(name, i, fileInfo);\n if (!inValue && parsers.end()) {\n parserInput.forget();\n return call;\n }\n else {\n parserInput.forget();\n return new tree.NamespaceValue(call, lookups, i, fileInfo);\n }\n }\n\n parserInput.restore();\n },\n\n //\n // extend syntax - used to extend selectors\n //\n extend: function(isRule) {\n let elements;\n let e;\n const index = parserInput.i;\n let option;\n let extendList;\n let extend;\n\n if (!parserInput.$str(isRule ? '&:extend(' : ':extend(')) {\n return;\n }\n\n do {\n option = null;\n elements = null;\n while (!(option = parserInput.$re(/^(all)(?=\\s*(\\)|,))/))) {\n e = this.element();\n if (!e) {\n break;\n }\n if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n }\n\n option = option && option[1];\n if (!elements) {\n error('Missing target selector for :extend().');\n }\n extend = new(tree.Extend)(new(tree.Selector)(elements), option, index, fileInfo);\n if (extendList) {\n extendList.push(extend);\n } else {\n extendList = [ extend ];\n }\n } while (parserInput.$char(','));\n\n expect(/^\\)/);\n\n if (isRule) {\n expect(/^;/);\n }\n\n return extendList;\n },\n\n //\n // extendRule - used in a rule to extend all the parent selectors\n //\n extendRule: function() {\n return this.extend(true);\n },\n\n //\n // Mixins\n //\n mixin: {\n //\n // A Mixin call, with an optional argument list\n //\n // #mixins > .square(#fff);\n // #mixins.square(#fff);\n // .rounded(4px, black);\n // .button;\n //\n // We can lookup / return a value using the lookup syntax:\n //\n // color: #mixin.square(#fff)[@color];\n //\n // The `while` loop is there because mixins can be\n // namespaced, but we only support the child and descendant\n // selector for now.\n //\n call: function (inValue, getLookup) {\n const s = parserInput.currentChar();\n let important = false;\n let lookups;\n const index = parserInput.i;\n let elements;\n let args;\n let hasParens;\n\n if (s !== '.' && s !== '#') { return; }\n\n parserInput.save(); // stop us absorbing part of an invalid selector\n\n elements = this.elements();\n\n if (elements) {\n if (parserInput.$char('(')) {\n args = this.args(true).args;\n expectChar(')');\n hasParens = true;\n }\n\n if (getLookup !== false) {\n lookups = this.ruleLookups();\n }\n if (getLookup === true && !lookups) {\n parserInput.restore();\n return;\n }\n\n if (!lookups && !hasParens) {\n // This isn't a valid mixin call\n parserInput.restore('Unrecognized input. Possibly missing \\'(\\' in mixin call.');\n return;\n }\n\n if (!inValue && parsers.important()) {\n important = true;\n }\n\n if (inValue || parsers.end()) {\n parserInput.forget();\n const mixin = new(tree.mixin.Call)(elements, args, index, fileInfo, !lookups && important);\n if (lookups) {\n return new tree.NamespaceValue(mixin, lookups);\n }\n else {\n return mixin;\n }\n }\n }\n\n parserInput.restore();\n },\n /**\n * Matching elements for mixins\n * (Start with . or # and can have > )\n */\n elements: function() {\n let elements;\n let e;\n let c;\n let elem;\n let elemIndex;\n const re = /^[#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/;\n while (true) {\n elemIndex = parserInput.i;\n e = parserInput.$re(re);\n \n if (!e) {\n break;\n }\n elem = new(tree.Element)(c, e, false, elemIndex, fileInfo);\n if (elements) {\n elements.push(elem);\n } else {\n elements = [ elem ];\n }\n c = parserInput.$char('>');\n }\n return elements;\n },\n args: function (isCall) {\n const entities = parsers.entities;\n const returner = { args:null, variadic: false };\n let expressions = [];\n const argsSemiColon = [];\n const argsComma = [];\n let isSemiColonSeparated;\n let expressionContainsNamed;\n let name;\n let nameLoop;\n let value;\n let arg;\n let expand;\n let hasSep = true;\n\n parserInput.save();\n\n while (true) {\n if (isCall) {\n arg = parsers.detachedRuleset() || parsers.expression();\n } else {\n parserInput.commentStore.length = 0;\n if (parserInput.$str('...')) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ variadic: true });\n break;\n }\n arg = entities.variable() || entities.property() || entities.literal() || entities.keyword() || this.call(true);\n }\n\n if (!arg || !hasSep) {\n break;\n }\n\n nameLoop = null;\n if (arg.throwAwayComments) {\n arg.throwAwayComments();\n }\n value = arg;\n let val = null;\n\n if (isCall) {\n // Variable\n if (arg.value && arg.value.length == 1) {\n val = arg.value[0];\n }\n } else {\n val = arg;\n }\n\n if (val && (val instanceof tree.Variable || val instanceof tree.Property)) {\n if (parserInput.$char(':')) {\n if (expressions.length > 0) {\n if (isSemiColonSeparated) {\n error('Cannot mix ; and , as delimiter types');\n }\n expressionContainsNamed = true;\n }\n\n value = parsers.detachedRuleset() || parsers.expression();\n\n if (!value) {\n if (isCall) {\n error('could not understand value for named argument');\n } else {\n parserInput.restore();\n returner.args = [];\n return returner;\n }\n }\n nameLoop = (name = val.name);\n } else if (parserInput.$str('...')) {\n if (!isCall) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ name: arg.name, variadic: true });\n break;\n } else {\n expand = true;\n }\n } else if (!isCall) {\n name = nameLoop = val.name;\n value = null;\n }\n }\n\n if (value) {\n expressions.push(value);\n }\n\n argsComma.push({ name:nameLoop, value, expand });\n\n if (parserInput.$char(',')) {\n hasSep = true;\n continue;\n }\n hasSep = parserInput.$char(';') === ';';\n\n if (hasSep || isSemiColonSeparated) {\n\n if (expressionContainsNamed) {\n error('Cannot mix ; and , as delimiter types');\n }\n\n isSemiColonSeparated = true;\n\n if (expressions.length > 1) {\n value = new(tree.Value)(expressions);\n }\n argsSemiColon.push({ name, value, expand });\n\n name = null;\n expressions = [];\n expressionContainsNamed = false;\n }\n }\n\n parserInput.forget();\n returner.args = isSemiColonSeparated ? argsSemiColon : argsComma;\n return returner;\n },\n //\n // A Mixin definition, with a list of parameters\n //\n // .rounded (@radius: 2px, @color) {\n // ...\n // }\n //\n // Until we have a finer grained state-machine, we have to\n // do a look-ahead, to make sure we don't have a mixin call.\n // See the `rule` function for more information.\n //\n // We start by matching `.rounded (`, and then proceed on to\n // the argument list, which has optional default values.\n // We store the parameters in `params`, with a `value` key,\n // if there is a value, such as in the case of `@radius`.\n //\n // Once we've got our params list, and a closing `)`, we parse\n // the `{...}` block.\n //\n definition: function () {\n let name;\n let params = [];\n let match;\n let ruleset;\n let cond;\n let variadic = false;\n if ((parserInput.currentChar() !== '.' && parserInput.currentChar() !== '#') ||\n parserInput.peek(/^[^{]*\\}/)) {\n return;\n }\n\n parserInput.save();\n\n match = parserInput.$re(/^([#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\\s*\\(/);\n if (match) {\n name = match[1];\n\n const argInfo = this.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n\n // .mixincall(\"@{a}\");\n // looks a bit like a mixin definition..\n // also\n // .mixincall(@a: {rule: set;});\n // so we have to be nice and restore\n if (!parserInput.$char(')')) {\n parserInput.restore('Missing closing \\')\\'');\n return;\n }\n\n parserInput.commentStore.length = 0;\n\n if (parserInput.$str('when')) { // Guard\n cond = expect(parsers.conditions, 'expected condition');\n }\n\n ruleset = parsers.block();\n\n if (ruleset) {\n parserInput.forget();\n return new(tree.mixin.Definition)(name, params, ruleset, cond, variadic);\n } else {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n }\n },\n \n ruleLookups: function() {\n let rule;\n let args;\n const lookups = [];\n\n if (parserInput.currentChar() !== '[') { \n return;\n }\n\n while (true) {\n parserInput.save();\n args = null;\n rule = this.lookupValue();\n if (!rule && rule !== '') {\n parserInput.restore();\n break;\n }\n lookups.push(rule);\n parserInput.forget();\n }\n if (lookups.length > 0) {\n return lookups;\n }\n },\n \n lookupValue: function() {\n parserInput.save();\n \n if (!parserInput.$char('[')) { \n parserInput.restore();\n return;\n }\n \n const name = parserInput.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);\n \n if (!parserInput.$char(']')) {\n parserInput.restore();\n return;\n } \n\n if (name || name === '') {\n parserInput.forget();\n return name;\n }\n \n parserInput.restore();\n }\n },\n //\n // Entities are the smallest recognized token,\n // and can be found inside a rule's value.\n //\n entity: function () {\n const entities = this.entities;\n\n return this.comment() || entities.literal() || entities.variable() || entities.url() ||\n entities.property() || entities.call() || entities.keyword() || this.mixin.call(true) ||\n entities.javascript();\n },\n\n //\n // A Declaration terminator. Note that we use `peek()` to check for '}',\n // because the `block` rule will be expecting it, but we still need to make sure\n // it's there, if ';' was omitted.\n //\n end: function () {\n return parserInput.$char(';') || parserInput.peek('}');\n },\n\n //\n // IE's alpha function\n //\n // alpha(opacity=88)\n //\n ieAlpha: function () {\n let value;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (!parserInput.$re(/^opacity=/i)) { return; }\n value = parserInput.$re(/^\\d+/);\n if (!value) {\n value = expect(parsers.entities.variable, 'Could not parse alpha');\n value = `@{${value.name.slice(1)}}`;\n }\n expectChar(')');\n return new tree.Quoted('', `alpha(opacity=${value})`);\n },\n\n //\n // A Selector Element\n //\n // div\n // + h1\n // #socks\n // input[type=\"text\"]\n //\n // Elements are the building blocks for Selectors,\n // they are made out of a `Combinator` (see combinator rule),\n // and an element name, such as a tag a class, or `*`.\n //\n element: function () {\n let e;\n let c;\n let v;\n const index = parserInput.i;\n\n c = this.combinator();\n\n e = parserInput.$re(/^(?:\\d+\\.\\d+|\\d+)%/) ||\n parserInput.$re(/^(?:[.#]?|:*)(?:[\\w-]|[^\\x00-\\x9f]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/) ||\n parserInput.$char('*') || parserInput.$char('&') || this.attribute() ||\n parserInput.$re(/^\\([^&()@]+\\)/) || parserInput.$re(/^[\\.#:](?=@)/) ||\n this.entities.variableCurly();\n\n if (!e) {\n parserInput.save();\n if (parserInput.$char('(')) {\n if ((v = this.selector(false)) && parserInput.$char(')')) {\n e = new(tree.Paren)(v);\n parserInput.forget();\n } else {\n parserInput.restore('Missing closing \\')\\'');\n }\n } else {\n parserInput.forget();\n }\n }\n\n if (e) { return new(tree.Element)(c, e, e instanceof tree.Variable, index, fileInfo); }\n },\n\n //\n // Combinators combine elements together, in a Selector.\n //\n // Because our parser isn't white-space sensitive, special care\n // has to be taken, when parsing the descendant combinator, ` `,\n // as it's an empty space. We have to check the previous character\n // in the input, to see if it's a ` ` character. More info on how\n // we deal with this in *combinator.js*.\n //\n combinator: function () {\n let c = parserInput.currentChar();\n\n if (c === '/') {\n parserInput.save();\n const slashedCombinator = parserInput.$re(/^\\/[a-z]+\\//i);\n if (slashedCombinator) {\n parserInput.forget();\n return new(tree.Combinator)(slashedCombinator);\n }\n parserInput.restore();\n }\n\n if (c === '>' || c === '+' || c === '~' || c === '|' || c === '^') {\n parserInput.i++;\n if (c === '^' && parserInput.currentChar() === '^') {\n c = '^^';\n parserInput.i++;\n }\n while (parserInput.isWhitespace()) { parserInput.i++; }\n return new(tree.Combinator)(c);\n } else if (parserInput.isWhitespace(-1)) {\n return new(tree.Combinator)(' ');\n } else {\n return new(tree.Combinator)(null);\n }\n },\n //\n // A CSS Selector\n // with less extensions e.g. the ability to extend and guard\n //\n // .class > div + h1\n // li a:hover\n //\n // Selectors are made out of one or more Elements, see above.\n //\n selector: function (isLess) {\n const index = parserInput.i;\n let elements;\n let extendList;\n let c;\n let e;\n let allExtends;\n let when;\n let condition;\n isLess = isLess !== false;\n while ((isLess && (extendList = this.extend())) || (isLess && (when = parserInput.$str('when'))) || (e = this.element())) {\n if (when) {\n condition = expect(this.conditions, 'expected condition');\n } else if (condition) {\n error('CSS guard can only be used at the end of selector');\n } else if (extendList) {\n if (allExtends) {\n allExtends = allExtends.concat(extendList);\n } else {\n allExtends = extendList;\n }\n } else {\n if (allExtends) { error('Extend can only be used at the end of selector'); }\n c = parserInput.currentChar();\n if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n e = null;\n }\n if (c === '{' || c === '}' || c === ';' || c === ',' || c === ')') {\n break;\n }\n }\n\n if (elements) { return new(tree.Selector)(elements, allExtends, condition, index, fileInfo); }\n if (allExtends) { error('Extend must be used to extend a selector, it cannot be used on its own'); }\n },\n selectors: function () {\n let s;\n let selectors;\n while (true) {\n s = this.selector();\n if (!s) {\n break;\n }\n if (selectors) {\n selectors.push(s);\n } else {\n selectors = [ s ];\n }\n parserInput.commentStore.length = 0;\n if (s.condition && selectors.length > 1) {\n error(\"Guards are only currently allowed on a single selector.\");\n }\n if (!parserInput.$char(',')) { break; }\n if (s.condition) {\n error(\"Guards are only currently allowed on a single selector.\");\n }\n parserInput.commentStore.length = 0;\n }\n return selectors;\n },\n attribute: function () {\n if (!parserInput.$char('[')) { return; }\n\n const entities = this.entities;\n let key;\n let val;\n let op;\n\n if (!(key = entities.variableCurly())) {\n key = expect(/^(?:[_A-Za-z0-9-\\*]*\\|)?(?:[_A-Za-z0-9-]|\\\\.)+/);\n }\n\n op = parserInput.$re(/^[|~*$^]?=/);\n if (op) {\n val = entities.quoted() || parserInput.$re(/^[0-9]+%/) || parserInput.$re(/^[\\w-]+/) || entities.variableCurly();\n }\n\n expectChar(']');\n\n return new(tree.Attribute)(key, op, val);\n },\n\n //\n // The `block` rule is used by `ruleset` and `mixin.definition`.\n // It's a wrapper around the `primary` rule, with added `{}`.\n //\n block: function () {\n let content;\n if (parserInput.$char('{') && (content = this.primary()) && parserInput.$char('}')) {\n return content;\n }\n },\n\n blockRuleset: function() {\n let block = this.block();\n\n if (block) {\n block = new tree.Ruleset(null, block);\n }\n return block;\n },\n\n detachedRuleset: function() {\n let argInfo;\n let params;\n let variadic;\n\n parserInput.save();\n if (parserInput.$re(/^[.#]\\(/)) {\n /**\n * DR args currently only implemented for each() function, and not \n * yet settable as `@dr: #(@arg) {}`\n * This should be done when DRs are merged with mixins.\n * See: https://github.com/less/less-meta/issues/16\n */\n argInfo = this.mixin.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n if (!parserInput.$char(')')) {\n parserInput.restore();\n return;\n }\n }\n const blockRuleset = this.blockRuleset();\n if (blockRuleset) {\n parserInput.forget();\n if (params) {\n return new tree.mixin.Definition(null, params, blockRuleset, null, variadic);\n }\n return new tree.DetachedRuleset(blockRuleset);\n }\n parserInput.restore();\n },\n\n //\n // div, .class, body > p {...}\n //\n ruleset: function () {\n let selectors;\n let rules;\n let debugInfo;\n\n parserInput.save();\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(parserInput.i);\n }\n\n selectors = this.selectors();\n\n if (selectors && (rules = this.block())) {\n parserInput.forget();\n const ruleset = new(tree.Ruleset)(selectors, rules, context.strictImports);\n if (context.dumpLineNumbers) {\n ruleset.debugInfo = debugInfo;\n }\n return ruleset;\n } else {\n parserInput.restore();\n }\n },\n declaration: function () {\n let name;\n let value;\n const index = parserInput.i;\n let hasDR;\n const c = parserInput.currentChar();\n let important;\n let merge;\n let isVariable;\n\n if (c === '.' || c === '#' || c === '&' || c === ':') { return; }\n\n parserInput.save();\n\n name = this.variable() || this.ruleProperty();\n if (name) {\n isVariable = typeof name === 'string';\n\n if (isVariable) {\n value = this.detachedRuleset();\n if (value) {\n hasDR = true;\n }\n }\n\n parserInput.commentStore.length = 0;\n if (!value) {\n // a name returned by this.ruleProperty() is always an array of the form:\n // [string-1, ..., string-n, \"\"] or [string-1, ..., string-n, \"+\"]\n // where each item is a tree.Keyword or tree.Variable\n merge = !isVariable && name.length > 1 && name.pop().value;\n\n // Custom property values get permissive parsing\n if (name[0].value && name[0].value.slice(0, 2) === '--') {\n value = this.permissiveValue();\n }\n // Try to store values as anonymous\n // If we need the value later we'll re-parse it in ruleset.parseValue\n else {\n value = this.anonymousValue();\n }\n if (value) {\n parserInput.forget();\n // anonymous values absorb the end ';' which is required for them to work\n return new(tree.Declaration)(name, value, false, merge, index, fileInfo);\n }\n\n if (!value) {\n value = this.value();\n }\n\n if (value) {\n important = this.important();\n } else if (isVariable) {\n // As a last resort, try permissiveValue\n value = this.permissiveValue();\n }\n }\n\n if (value && (this.end() || hasDR)) {\n parserInput.forget();\n return new(tree.Declaration)(name, value, important, merge, index, fileInfo);\n }\n else {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n }\n },\n anonymousValue: function () {\n const index = parserInput.i;\n const match = parserInput.$re(/^([^.#@\\$+\\/'\"*`(;{}-]*);/);\n if (match) {\n return new(tree.Anonymous)(match[1], index);\n }\n },\n /**\n * Used for custom properties, at-rules, and variables (as fallback)\n * Parses almost anything inside of {} [] () \"\" blocks\n * until it reaches outer-most tokens.\n * \n * First, it will try to parse comments and entities to reach\n * the end. This is mostly like the Expression parser except no\n * math is allowed.\n */\n permissiveValue: function (untilTokens) {\n let i;\n let e;\n let done;\n let value;\n const tok = untilTokens || ';';\n const index = parserInput.i;\n const result = [];\n\n function testCurrentChar() {\n const char = parserInput.currentChar();\n if (typeof tok === 'string') {\n return char === tok;\n } else {\n return tok.test(char);\n }\n }\n if (testCurrentChar()) {\n return;\n }\n value = [];\n do {\n e = this.comment();\n if (e) {\n value.push(e);\n continue;\n }\n e = this.entity();\n if (e) {\n value.push(e);\n }\n } while (e);\n\n done = testCurrentChar();\n\n if (value.length > 0) {\n value = new(tree.Expression)(value);\n if (done) {\n return value;\n }\n else {\n result.push(value);\n }\n // Preserve space before $parseUntil as it will not\n if (parserInput.prevChar() === ' ') {\n result.push(new tree.Anonymous(' ', index));\n }\n }\n parserInput.save();\n\n value = parserInput.$parseUntil(tok);\n\n if (value) {\n if (typeof value === 'string') {\n error(`Expected '${value}'`, 'Parse');\n }\n if (value.length === 1 && value[0] === ' ') {\n parserInput.forget();\n return new tree.Anonymous('', index);\n }\n let item;\n for (i = 0; i < value.length; i++) {\n item = value[i];\n if (Array.isArray(item)) {\n // Treat actual quotes as normal quoted values\n result.push(new tree.Quoted(item[0], item[1], true, index, fileInfo));\n }\n else {\n if (i === value.length - 1) {\n item = item.trim();\n }\n // Treat like quoted values, but replace vars like unquoted expressions\n const quote = new tree.Quoted('\\'', item, true, index, fileInfo);\n quote.variableRegex = /@([\\w-]+)/g;\n quote.propRegex = /\\$([\\w-]+)/g;\n result.push(quote);\n }\n }\n parserInput.forget();\n return new tree.Expression(result, true);\n }\n parserInput.restore();\n },\n\n //\n // An @import atrule\n //\n // @import \"lib\";\n //\n // Depending on our environment, importing is done differently:\n // In the browser, it's an XHR request, in Node, it would be a\n // file-system operation. The function used for importing is\n // stored in `import`, which we pass to the Import constructor.\n //\n 'import': function () {\n let path;\n let features;\n const index = parserInput.i;\n\n const dir = parserInput.$re(/^@import?\\s+/);\n\n if (dir) {\n const options = (dir ? this.importOptions() : null) || {};\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n features = this.mediaFeatures();\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon or unrecognised media features on import');\n }\n features = features && new(tree.Value)(features);\n return new(tree.Import)(path, features, options, index, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed import statement');\n }\n }\n },\n\n importOptions: function() {\n let o;\n const options = {};\n let optionName;\n let value;\n\n // list of options, surrounded by parens\n if (!parserInput.$char('(')) { return null; }\n do {\n o = this.importOption();\n if (o) {\n optionName = o;\n value = true;\n switch (optionName) {\n case 'css':\n optionName = 'less';\n value = false;\n break;\n case 'once':\n optionName = 'multiple';\n value = false;\n break;\n }\n options[optionName] = value;\n if (!parserInput.$char(',')) { break; }\n }\n } while (o);\n expectChar(')');\n return options;\n },\n\n importOption: function() {\n const opt = parserInput.$re(/^(less|css|multiple|once|inline|reference|optional)/);\n if (opt) {\n return opt[1];\n }\n },\n\n mediaFeature: function () {\n const entities = this.entities;\n const nodes = [];\n let e;\n let p;\n parserInput.save();\n do {\n e = entities.keyword() || entities.variable() || entities.mixinLookup();\n if (e) {\n nodes.push(e);\n } else if (parserInput.$char('(')) {\n p = this.property();\n e = this.value();\n if (parserInput.$char(')')) {\n if (p && e) {\n nodes.push(new(tree.Paren)(new(tree.Declaration)(p, e, null, null, parserInput.i, fileInfo, true)));\n } else if (e) {\n nodes.push(new(tree.Paren)(e));\n } else {\n error('badly formed media feature definition');\n }\n } else {\n error('Missing closing \\')\\'', 'Parse');\n }\n }\n } while (e);\n\n parserInput.forget();\n if (nodes.length > 0) {\n return new(tree.Expression)(nodes);\n }\n },\n\n mediaFeatures: function () {\n const entities = this.entities;\n const features = [];\n let e;\n do {\n e = this.mediaFeature();\n if (e) {\n features.push(e);\n if (!parserInput.$char(',')) { break; }\n } else {\n e = entities.variable() || entities.mixinLookup();\n if (e) {\n features.push(e);\n if (!parserInput.$char(',')) { break; }\n }\n }\n } while (e);\n\n return features.length > 0 ? features : null;\n },\n\n media: function () {\n let features;\n let rules;\n let media;\n let debugInfo;\n const index = parserInput.i;\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(index);\n }\n\n parserInput.save();\n\n if (parserInput.$str('@media')) {\n features = this.mediaFeatures();\n\n rules = this.block();\n\n if (!rules) {\n error('media definitions require block statements after any features');\n }\n\n parserInput.forget();\n\n media = new(tree.Media)(rules, features, index, fileInfo);\n if (context.dumpLineNumbers) {\n media.debugInfo = debugInfo;\n }\n\n return media;\n }\n\n parserInput.restore();\n },\n\n //\n\n // A @plugin directive, used to import plugins dynamically.\n //\n // @plugin (args) \"lib\";\n //\n plugin: function () {\n let path;\n let args;\n let options;\n const index = parserInput.i;\n const dir = parserInput.$re(/^@plugin?\\s+/);\n\n if (dir) {\n args = this.pluginArgs();\n\n if (args) {\n options = {\n pluginArgs: args,\n isPlugin: true\n };\n }\n else {\n options = { isPlugin: true };\n }\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon on @plugin');\n }\n return new(tree.Import)(path, null, options, index, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed @plugin statement');\n }\n }\n },\n\n pluginArgs: function() {\n // list of options, surrounded by parens\n parserInput.save();\n if (!parserInput.$char('(')) {\n parserInput.restore();\n return null;\n }\n const args = parserInput.$re(/^\\s*([^\\);]+)\\)\\s*/);\n if (args[1]) {\n parserInput.forget();\n return args[1].trim();\n }\n else { \n parserInput.restore();\n return null;\n }\n },\n\n //\n // A CSS AtRule\n //\n // @charset \"utf-8\";\n //\n atrule: function () {\n const index = parserInput.i;\n let name;\n let value;\n let rules;\n let nonVendorSpecificName;\n let hasIdentifier;\n let hasExpression;\n let hasUnknown;\n let hasBlock = true;\n let isRooted = true;\n\n if (parserInput.currentChar() !== '@') { return; }\n\n value = this['import']() || this.plugin() || this.media();\n if (value) {\n return value;\n }\n\n parserInput.save();\n\n name = parserInput.$re(/^@[a-z-]+/);\n\n if (!name) { return; }\n\n nonVendorSpecificName = name;\n if (name.charAt(1) == '-' && name.indexOf('-', 2) > 0) {\n nonVendorSpecificName = `@${name.slice(name.indexOf('-', 2) + 1)}`;\n }\n\n switch (nonVendorSpecificName) {\n case '@charset':\n hasIdentifier = true;\n hasBlock = false;\n break;\n case '@namespace':\n hasExpression = true;\n hasBlock = false;\n break;\n case '@keyframes':\n case '@counter-style':\n hasIdentifier = true;\n break;\n case '@document':\n case '@supports':\n hasUnknown = true;\n isRooted = false;\n break;\n default:\n hasUnknown = true;\n break;\n }\n\n parserInput.commentStore.length = 0;\n\n if (hasIdentifier) {\n value = this.entity();\n if (!value) {\n error(`expected ${name} identifier`);\n }\n } else if (hasExpression) {\n value = this.expression();\n if (!value) {\n error(`expected ${name} expression`);\n }\n } else if (hasUnknown) {\n value = this.permissiveValue(/^[{;]/);\n hasBlock = (parserInput.currentChar() === '{');\n if (!value) {\n if (!hasBlock && parserInput.currentChar() !== ';') {\n error(`${name} rule is missing block or ending semi-colon`);\n }\n }\n else if (!value.value) {\n value = null;\n }\n }\n\n if (hasBlock) {\n rules = this.blockRuleset();\n }\n\n if (rules || (!hasBlock && value && parserInput.$char(';'))) {\n parserInput.forget();\n return new(tree.AtRule)(name, value, rules, index, fileInfo,\n context.dumpLineNumbers ? getDebugInfo(index) : null,\n isRooted\n );\n }\n\n parserInput.restore('at-rule options not recognised');\n },\n\n //\n // A Value is a comma-delimited list of Expressions\n //\n // font-family: Baskerville, Georgia, serif;\n //\n // In a Rule, a Value represents everything after the `:`,\n // and before the `;`.\n //\n value: function () {\n let e;\n const expressions = [];\n const index = parserInput.i;\n\n do {\n e = this.expression();\n if (e) {\n expressions.push(e);\n if (!parserInput.$char(',')) { break; }\n }\n } while (e);\n\n if (expressions.length > 0) {\n return new(tree.Value)(expressions, index);\n }\n },\n important: function () {\n if (parserInput.currentChar() === '!') {\n return parserInput.$re(/^! *important/);\n }\n },\n sub: function () {\n let a;\n let e;\n\n parserInput.save();\n if (parserInput.$char('(')) {\n a = this.addition();\n if (a && parserInput.$char(')')) {\n parserInput.forget();\n e = new(tree.Expression)([a]);\n e.parens = true;\n return e;\n }\n parserInput.restore('Expected \\')\\'');\n return;\n }\n parserInput.restore();\n },\n multiplication: function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.operand();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1);\n while (true) {\n if (parserInput.peek(/^\\/[*\\/]/)) {\n break;\n }\n\n parserInput.save();\n\n op = parserInput.$char('/') || parserInput.$char('*') || parserInput.$str('./');\n\n if (!op) { parserInput.forget(); break; }\n\n a = this.operand();\n\n if (!a) { parserInput.restore(); break; }\n parserInput.forget();\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n isSpaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n addition: function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.multiplication();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1);\n while (true) {\n op = parserInput.$re(/^[-+]\\s+/) || (!isSpaced && (parserInput.$char('+') || parserInput.$char('-')));\n if (!op) {\n break;\n }\n a = this.multiplication();\n if (!a) {\n break;\n }\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n isSpaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n conditions: function () {\n let a;\n let b;\n const index = parserInput.i;\n let condition;\n\n a = this.condition(true);\n if (a) {\n while (true) {\n if (!parserInput.peek(/^,\\s*(not\\s*)?\\(/) || !parserInput.$char(',')) {\n break;\n }\n b = this.condition(true);\n if (!b) {\n break;\n }\n condition = new(tree.Condition)('or', condition || a, b, index);\n }\n return condition || a;\n }\n },\n condition: function (needsParens) {\n let result;\n let logical;\n let next;\n function or() {\n return parserInput.$str('or');\n }\n\n result = this.conditionAnd(needsParens);\n if (!result) {\n return ;\n }\n logical = or();\n if (logical) {\n next = this.condition(needsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n }\n }\n return result;\n },\n conditionAnd: function (needsParens) {\n let result;\n let logical;\n let next;\n const self = this;\n function insideCondition() {\n const cond = self.negatedCondition(needsParens) || self.parenthesisCondition(needsParens);\n if (!cond && !needsParens) {\n return self.atomicCondition(needsParens);\n }\n return cond;\n }\n function and() {\n return parserInput.$str('and');\n }\n\n result = insideCondition();\n if (!result) {\n return ;\n }\n logical = and();\n if (logical) {\n next = this.conditionAnd(needsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n }\n }\n return result;\n },\n negatedCondition: function (needsParens) {\n if (parserInput.$str('not')) {\n const result = this.parenthesisCondition(needsParens);\n if (result) {\n result.negate = !result.negate;\n }\n return result;\n }\n },\n parenthesisCondition: function (needsParens) {\n function tryConditionFollowedByParenthesis(me) {\n let body;\n parserInput.save();\n body = me.condition(needsParens);\n if (!body) {\n parserInput.restore();\n return ;\n }\n if (!parserInput.$char(')')) {\n parserInput.restore();\n return ;\n }\n parserInput.forget();\n return body;\n }\n\n let body;\n parserInput.save();\n if (!parserInput.$str('(')) {\n parserInput.restore();\n return ;\n }\n body = tryConditionFollowedByParenthesis(this);\n if (body) {\n parserInput.forget();\n return body;\n }\n\n body = this.atomicCondition(needsParens);\n if (!body) {\n parserInput.restore();\n return ;\n }\n if (!parserInput.$char(')')) {\n parserInput.restore(`expected ')' got '${parserInput.currentChar()}'`);\n return ;\n }\n parserInput.forget();\n return body;\n },\n atomicCondition: function (needsParens) {\n const entities = this.entities;\n const index = parserInput.i;\n let a;\n let b;\n let c;\n let op;\n\n function cond() {\n return this.addition() || entities.keyword() || entities.quoted() || entities.mixinLookup();\n }\n cond = cond.bind(this);\n\n a = cond();\n if (a) {\n if (parserInput.$char('>')) {\n if (parserInput.$char('=')) {\n op = '>=';\n } else {\n op = '>';\n }\n } else\n if (parserInput.$char('<')) {\n if (parserInput.$char('=')) {\n op = '<=';\n } else {\n op = '<';\n }\n } else\n if (parserInput.$char('=')) {\n if (parserInput.$char('>')) {\n op = '=>';\n } else if (parserInput.$char('<')) {\n op = '=<';\n } else {\n op = '=';\n }\n }\n if (op) {\n b = cond();\n if (b) {\n c = new(tree.Condition)(op, a, b, index, false);\n } else {\n error('expected expression');\n }\n } else {\n c = new(tree.Condition)('=', a, new(tree.Keyword)('true'), index, false);\n }\n return c;\n }\n },\n\n //\n // An operand is anything that can be part of an operation,\n // such as a Color, or a Variable\n //\n operand: function () {\n const entities = this.entities;\n let negate;\n\n if (parserInput.peek(/^-[@\\$\\(]/)) {\n negate = parserInput.$char('-');\n }\n\n let o = this.sub() || entities.dimension() ||\n entities.color() || entities.variable() ||\n entities.property() || entities.call() ||\n entities.quoted(true) || entities.colorKeyword() ||\n entities.mixinLookup();\n\n if (negate) {\n o.parensInOp = true;\n o = new(tree.Negative)(o);\n }\n\n return o;\n },\n\n //\n // Expressions either represent mathematical operations,\n // or white-space delimited Entities.\n //\n // 1px solid black\n // @var * 2\n //\n expression: function () {\n const entities = [];\n let e;\n let delim;\n const index = parserInput.i;\n\n do {\n e = this.comment();\n if (e) {\n entities.push(e);\n continue;\n }\n e = this.addition() || this.entity();\n\n if (e instanceof tree.Comment) {\n e = null;\n }\n\n if (e) {\n entities.push(e);\n // operations do not allow keyword \"/\" dimension (e.g. small/20px) so we support that here\n if (!parserInput.peek(/^\\/[\\/*]/)) {\n delim = parserInput.$char('/');\n if (delim) {\n entities.push(new(tree.Anonymous)(delim, index));\n }\n }\n }\n } while (e);\n if (entities.length > 0) {\n return new(tree.Expression)(entities);\n }\n },\n property: function () {\n const name = parserInput.$re(/^(\\*?-?[_a-zA-Z0-9-]+)\\s*:/);\n if (name) {\n return name[1];\n }\n },\n ruleProperty: function () {\n let name = [];\n const index = [];\n let s;\n let k;\n\n parserInput.save();\n\n const simpleProperty = parserInput.$re(/^([_a-zA-Z0-9-]+)\\s*:/);\n if (simpleProperty) {\n name = [new(tree.Keyword)(simpleProperty[1])];\n parserInput.forget();\n return name;\n }\n\n function match(re) {\n const i = parserInput.i;\n const chunk = parserInput.$re(re);\n if (chunk) {\n index.push(i);\n return name.push(chunk[1]);\n }\n }\n\n match(/^(\\*?)/);\n while (true) {\n if (!match(/^((?:[\\w-]+)|(?:[@\\$]\\{[\\w-]+\\}))/)) {\n break;\n }\n }\n\n if ((name.length > 1) && match(/^((?:\\+_|\\+)?)\\s*:/)) {\n parserInput.forget();\n\n // at last, we have the complete match now. move forward,\n // convert name particles to tree objects and return:\n if (name[0] === '') {\n name.shift();\n index.shift();\n }\n for (k = 0; k < name.length; k++) {\n s = name[k];\n name[k] = (s.charAt(0) !== '@' && s.charAt(0) !== '$') ?\n new(tree.Keyword)(s) :\n (s.charAt(0) === '@' ?\n new(tree.Variable)(`@${s.slice(2, -1)}`, index[k], fileInfo) :\n new(tree.Property)(`$${s.slice(2, -1)}`, index[k], fileInfo));\n }\n return name;\n }\n parserInput.restore();\n }\n }\n };\n};\nParser.serializeVars = vars => {\n let s = '';\n\n for (const name in vars) {\n if (Object.hasOwnProperty.call(vars, name)) {\n const value = vars[name];\n s += `${((name[0] === '@') ? '' : '@') + name}: ${value}${(String(value).slice(-1) === ';') ? '' : ';'}`;\n }\n }\n\n return s;\n};\n\nexport default Parser;\n","import Anonymous from '../tree/anonymous';\nimport Keyword from '../tree/keyword';\n\nfunction boolean(condition) {\n return condition ? Keyword.True : Keyword.False;\n}\n\n/**\n * Functions with evalArgs set to false are sent context\n * as the first argument.\n */\nfunction If(context, condition, trueValue, falseValue) {\n return condition.eval(context) ? trueValue.eval(context)\n : (falseValue ? falseValue.eval(context) : new Anonymous);\n}\nIf.evalArgs = false\n\nexport default { boolean, 'if': If };\n","import Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport Expression from '../tree/expression';\nimport Operation from '../tree/operation';\nlet colorFunctions;\n\nfunction clamp(val) {\n return Math.min(1, Math.max(0, val));\n}\nfunction hsla(origColor, hsl) {\n const color = colorFunctions.hsla(hsl.h, hsl.s, hsl.l, hsl.a);\n if (color) {\n if (origColor.value && \n /^(rgb|hsl)/.test(origColor.value)) {\n color.value = origColor.value;\n } else {\n color.value = 'rgb';\n }\n return color;\n }\n}\nfunction toHSL(color) {\n if (color.toHSL) {\n return color.toHSL();\n } else {\n throw new Error('Argument cannot be evaluated to a color');\n }\n}\n\nfunction toHSV(color) {\n if (color.toHSV) {\n return color.toHSV();\n } else {\n throw new Error('Argument cannot be evaluated to a color');\n }\n}\n\nfunction number(n) {\n if (n instanceof Dimension) {\n return parseFloat(n.unit.is('%') ? n.value / 100 : n.value);\n } else if (typeof n === 'number') {\n return n;\n } else {\n throw {\n type: 'Argument',\n message: 'color functions take numbers as parameters'\n };\n }\n}\nfunction scaled(n, size) {\n if (n instanceof Dimension && n.unit.is('%')) {\n return parseFloat(n.value * size / 100);\n } else {\n return number(n);\n }\n}\ncolorFunctions = {\n rgb: function (r, g, b) {\n let a = 1\n /**\n * Comma-less syntax\n * e.g. rgb(0 128 255 / 50%)\n */\n if (r instanceof Expression) {\n const val = r.value\n r = val[0]\n g = val[1]\n b = val[2]\n /** \n * @todo - should this be normalized in\n * function caller? Or parsed differently?\n */\n if (b instanceof Operation) {\n const op = b\n b = op.operands[0]\n a = op.operands[1]\n }\n }\n const color = colorFunctions.rgba(r, g, b, a);\n if (color) {\n color.value = 'rgb';\n return color;\n }\n },\n rgba: function (r, g, b, a) {\n try {\n if (r instanceof Color) {\n if (g) {\n a = number(g);\n } else {\n a = r.alpha;\n }\n return new Color(r.rgb, a, 'rgba');\n }\n const rgb = [r, g, b].map(c => scaled(c, 255));\n a = number(a);\n return new Color(rgb, a, 'rgba');\n }\n catch (e) {}\n },\n hsl: function (h, s, l) {\n let a = 1\n if (h instanceof Expression) {\n const val = h.value\n h = val[0]\n s = val[1]\n l = val[2]\n\n if (l instanceof Operation) {\n const op = l\n l = op.operands[0]\n a = op.operands[1]\n }\n }\n const color = colorFunctions.hsla(h, s, l, a);\n if (color) {\n color.value = 'hsl';\n return color;\n }\n },\n hsla: function (h, s, l, a) {\n try {\n if (h instanceof Color) {\n if (s) {\n a = number(s);\n } else {\n a = h.alpha;\n }\n return new Color(h.rgb, a, 'hsla');\n }\n\n let m1;\n let m2;\n\n function hue(h) {\n h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h);\n if (h * 6 < 1) {\n return m1 + (m2 - m1) * h * 6;\n }\n else if (h * 2 < 1) {\n return m2;\n }\n else if (h * 3 < 2) {\n return m1 + (m2 - m1) * (2 / 3 - h) * 6;\n }\n else {\n return m1;\n }\n }\n\n h = (number(h) % 360) / 360;\n s = clamp(number(s));l = clamp(number(l));a = clamp(number(a));\n\n m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n m1 = l * 2 - m2;\n\n const rgb = [\n hue(h + 1 / 3) * 255,\n hue(h) * 255,\n hue(h - 1 / 3) * 255\n ];\n a = number(a);\n return new Color(rgb, a, 'hsla');\n }\n catch (e) {}\n },\n\n hsv: function(h, s, v) {\n return colorFunctions.hsva(h, s, v, 1.0);\n },\n\n hsva: function(h, s, v, a) {\n h = ((number(h) % 360) / 360) * 360;\n s = number(s);v = number(v);a = number(a);\n\n let i;\n let f;\n i = Math.floor((h / 60) % 6);\n f = (h / 60) - i;\n\n const vs = [v,\n v * (1 - s),\n v * (1 - f * s),\n v * (1 - (1 - f) * s)];\n const perm = [[0, 3, 1],\n [2, 0, 1],\n [1, 0, 3],\n [1, 2, 0],\n [3, 1, 0],\n [0, 1, 2]];\n\n return colorFunctions.rgba(vs[perm[i][0]] * 255,\n vs[perm[i][1]] * 255,\n vs[perm[i][2]] * 255,\n a);\n },\n\n hue: function (color) {\n return new Dimension(toHSL(color).h);\n },\n saturation: function (color) {\n return new Dimension(toHSL(color).s * 100, '%');\n },\n lightness: function (color) {\n return new Dimension(toHSL(color).l * 100, '%');\n },\n hsvhue: function(color) {\n return new Dimension(toHSV(color).h);\n },\n hsvsaturation: function (color) {\n return new Dimension(toHSV(color).s * 100, '%');\n },\n hsvvalue: function (color) {\n return new Dimension(toHSV(color).v * 100, '%');\n },\n red: function (color) {\n return new Dimension(color.rgb[0]);\n },\n green: function (color) {\n return new Dimension(color.rgb[1]);\n },\n blue: function (color) {\n return new Dimension(color.rgb[2]);\n },\n alpha: function (color) {\n return new Dimension(toHSL(color).a);\n },\n luma: function (color) {\n return new Dimension(color.luma() * color.alpha * 100, '%');\n },\n luminance: function (color) {\n const luminance =\n (0.2126 * color.rgb[0] / 255) +\n (0.7152 * color.rgb[1] / 255) +\n (0.0722 * color.rgb[2] / 255);\n\n return new Dimension(luminance * color.alpha * 100, '%');\n },\n saturate: function (color, amount, method) {\n // filter: saturate(3.2);\n // should be kept as is, so check for color\n if (!color.rgb) {\n return null;\n }\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.s += hsl.s * amount.value / 100;\n }\n else {\n hsl.s += amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n return hsla(color, hsl);\n },\n desaturate: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.s -= hsl.s * amount.value / 100;\n }\n else {\n hsl.s -= amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n return hsla(color, hsl);\n },\n lighten: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.l += hsl.l * amount.value / 100;\n }\n else {\n hsl.l += amount.value / 100;\n }\n hsl.l = clamp(hsl.l);\n return hsla(color, hsl);\n },\n darken: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.l -= hsl.l * amount.value / 100;\n }\n else {\n hsl.l -= amount.value / 100;\n }\n hsl.l = clamp(hsl.l);\n return hsla(color, hsl);\n },\n fadein: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.a += hsl.a * amount.value / 100;\n }\n else {\n hsl.a += amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fadeout: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.a -= hsl.a * amount.value / 100;\n }\n else {\n hsl.a -= amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fade: function (color, amount) {\n const hsl = toHSL(color);\n\n hsl.a = amount.value / 100;\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n spin: function (color, amount) {\n const hsl = toHSL(color);\n const hue = (hsl.h + amount.value) % 360;\n\n hsl.h = hue < 0 ? 360 + hue : hue;\n\n return hsla(color, hsl);\n },\n //\n // Copyright (c) 2006-2009 Hampton Catlin, Natalie Weizenbaum, and Chris Eppstein\n // http://sass-lang.com\n //\n mix: function (color1, color2, weight) {\n if (!weight) {\n weight = new Dimension(50);\n }\n const p = weight.value / 100.0;\n const w = p * 2 - 1;\n const a = toHSL(color1).a - toHSL(color2).a;\n\n const w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n const w2 = 1 - w1;\n\n const rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2,\n color1.rgb[1] * w1 + color2.rgb[1] * w2,\n color1.rgb[2] * w1 + color2.rgb[2] * w2];\n\n const alpha = color1.alpha * p + color2.alpha * (1 - p);\n\n return new Color(rgb, alpha);\n },\n greyscale: function (color) {\n return colorFunctions.desaturate(color, new Dimension(100));\n },\n contrast: function (color, dark, light, threshold) {\n // filter: contrast(3.2);\n // should be kept as is, so check for color\n if (!color.rgb) {\n return null;\n }\n if (typeof light === 'undefined') {\n light = colorFunctions.rgba(255, 255, 255, 1.0);\n }\n if (typeof dark === 'undefined') {\n dark = colorFunctions.rgba(0, 0, 0, 1.0);\n }\n // Figure out which is actually light and dark:\n if (dark.luma() > light.luma()) {\n const t = light;\n light = dark;\n dark = t;\n }\n if (typeof threshold === 'undefined') {\n threshold = 0.43;\n } else {\n threshold = number(threshold);\n }\n if (color.luma() < threshold) {\n return light;\n } else {\n return dark;\n }\n },\n // Changes made in 2.7.0 - Reverted in 3.0.0\n // contrast: function (color, color1, color2, threshold) {\n // // Return which of `color1` and `color2` has the greatest contrast with `color`\n // // according to the standard WCAG contrast ratio calculation.\n // // http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n // // The threshold param is no longer used, in line with SASS.\n // // filter: contrast(3.2);\n // // should be kept as is, so check for color\n // if (!color.rgb) {\n // return null;\n // }\n // if (typeof color1 === 'undefined') {\n // color1 = colorFunctions.rgba(0, 0, 0, 1.0);\n // }\n // if (typeof color2 === 'undefined') {\n // color2 = colorFunctions.rgba(255, 255, 255, 1.0);\n // }\n // var contrast1, contrast2;\n // var luma = color.luma();\n // var luma1 = color1.luma();\n // var luma2 = color2.luma();\n // // Calculate contrast ratios for each color\n // if (luma > luma1) {\n // contrast1 = (luma + 0.05) / (luma1 + 0.05);\n // } else {\n // contrast1 = (luma1 + 0.05) / (luma + 0.05);\n // }\n // if (luma > luma2) {\n // contrast2 = (luma + 0.05) / (luma2 + 0.05);\n // } else {\n // contrast2 = (luma2 + 0.05) / (luma + 0.05);\n // }\n // if (contrast1 > contrast2) {\n // return color1;\n // } else {\n // return color2;\n // }\n // },\n argb: function (color) {\n return new Anonymous(color.toARGB());\n },\n color: function(c) {\n if ((c instanceof Quoted) &&\n (/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})$/i.test(c.value))) {\n const val = c.value.slice(1);\n return new Color(val, undefined, `#${val}`);\n }\n if ((c instanceof Color) || (c = Color.fromKeyword(c.value))) {\n c.value = undefined;\n return c;\n }\n throw {\n type: 'Argument',\n message: 'argument must be a color keyword or 3|4|6|8 digit hex e.g. #FFF'\n };\n },\n tint: function(color, amount) {\n return colorFunctions.mix(colorFunctions.rgb(255, 255, 255), color, amount);\n },\n shade: function(color, amount) {\n return colorFunctions.mix(colorFunctions.rgb(0, 0, 0), color, amount);\n }\n};\n\nexport default colorFunctions;\n","import Color from '../tree/color';\n\n// Color Blending\n// ref: http://www.w3.org/TR/compositing-1\n\nfunction colorBlend(mode, color1, color2) {\n const ab = color1.alpha; // result\n\n let // backdrop\n cb;\n\n const as = color2.alpha;\n\n let // source\n cs;\n\n let ar;\n let cr;\n const r = [];\n\n ar = as + ab * (1 - as);\n for (let i = 0; i < 3; i++) {\n cb = color1.rgb[i] / 255;\n cs = color2.rgb[i] / 255;\n cr = mode(cb, cs);\n if (ar) {\n cr = (as * cs + ab * (cb -\n as * (cb + cs - cr))) / ar;\n }\n r[i] = cr * 255;\n }\n\n return new Color(r, ar);\n}\n\nconst colorBlendModeFunctions = {\n multiply: function(cb, cs) {\n return cb * cs;\n },\n screen: function(cb, cs) {\n return cb + cs - cb * cs;\n },\n overlay: function(cb, cs) {\n cb *= 2;\n return (cb <= 1) ?\n colorBlendModeFunctions.multiply(cb, cs) :\n colorBlendModeFunctions.screen(cb - 1, cs);\n },\n softlight: function(cb, cs) {\n let d = 1;\n let e = cb;\n if (cs > 0.5) {\n e = 1;\n d = (cb > 0.25) ? Math.sqrt(cb)\n : ((16 * cb - 12) * cb + 4) * cb;\n }\n return cb - (1 - 2 * cs) * e * (d - cb);\n },\n hardlight: function(cb, cs) {\n return colorBlendModeFunctions.overlay(cs, cb);\n },\n difference: function(cb, cs) {\n return Math.abs(cb - cs);\n },\n exclusion: function(cb, cs) {\n return cb + cs - 2 * cb * cs;\n },\n\n // non-w3c functions:\n average: function(cb, cs) {\n return (cb + cs) / 2;\n },\n negation: function(cb, cs) {\n return 1 - Math.abs(cb + cs - 1);\n }\n};\n\nfor (const f in colorBlendModeFunctions) {\n if (colorBlendModeFunctions.hasOwnProperty(f)) {\n colorBlend[f] = colorBlend.bind(null, colorBlendModeFunctions[f]);\n }\n}\n\nexport default colorBlend;\n","import Comment from '../tree/comment';\nimport Node from '../tree/node';\nimport Dimension from '../tree/dimension';\nimport Declaration from '../tree/declaration';\nimport Expression from '../tree/expression';\nimport Ruleset from '../tree/ruleset';\nimport Selector from '../tree/selector';\nimport Element from '../tree/element';\nimport Quote from '../tree/quoted';\nimport Value from '../tree/value';\n\nconst getItemsFromNode = node => {\n // handle non-array values as an array of length 1\n // return 'undefined' if index is invalid\n const items = Array.isArray(node.value) ?\n node.value : Array(node);\n\n return items;\n};\n\nexport default {\n _SELF: function(n) {\n return n;\n },\n '~': function(...expr) {\n if (expr.length === 1) {\n return expr[0];\n }\n return new Value(expr);\n },\n extract: function(values, index) {\n // (1-based index)\n index = index.value - 1;\n\n return getItemsFromNode(values)[index];\n },\n length: function(values) {\n return new Dimension(getItemsFromNode(values).length);\n },\n /**\n * Creates a Less list of incremental values.\n * Modeled after Lodash's range function, also exists natively in PHP\n * \n * @param {Dimension} [start=1]\n * @param {Dimension} end - e.g. 10 or 10px - unit is added to output\n * @param {Dimension} [step=1] \n */\n range: function(start, end, step) {\n let from;\n let to;\n let stepValue = 1;\n const list = [];\n if (end) {\n to = end;\n from = start.value;\n if (step) {\n stepValue = step.value;\n }\n }\n else {\n from = 1;\n to = start;\n }\n\n for (let i = from; i <= to.value; i += stepValue) {\n list.push(new Dimension(i, to.unit));\n }\n\n return new Expression(list);\n },\n each: function(list, rs) {\n const rules = [];\n let newRules;\n let iterator;\n\n const tryEval = val => {\n if (val instanceof Node) {\n return val.eval(this.context);\n }\n return val;\n };\n\n if (list.value && !(list instanceof Quote)) {\n if (Array.isArray(list.value)) {\n iterator = list.value.map(tryEval);\n } else {\n iterator = [tryEval(list.value)];\n }\n } else if (list.ruleset) {\n iterator = tryEval(list.ruleset).rules;\n } else if (list.rules) {\n iterator = list.rules.map(tryEval);\n } else if (Array.isArray(list)) {\n iterator = list.map(tryEval);\n } else {\n iterator = [tryEval(list)];\n }\n\n let valueName = '@value';\n let keyName = '@key';\n let indexName = '@index';\n\n if (rs.params) {\n valueName = rs.params[0] && rs.params[0].name;\n keyName = rs.params[1] && rs.params[1].name;\n indexName = rs.params[2] && rs.params[2].name;\n rs = rs.rules;\n } else {\n rs = rs.ruleset;\n }\n\n for (let i = 0; i < iterator.length; i++) {\n let key;\n let value;\n const item = iterator[i];\n if (item instanceof Declaration) {\n key = typeof item.name === 'string' ? item.name : item.name[0].value;\n value = item.value;\n } else {\n key = new Dimension(i + 1);\n value = item;\n }\n\n if (item instanceof Comment) {\n continue;\n }\n\n newRules = rs.rules.slice(0);\n if (valueName) {\n newRules.push(new Declaration(valueName,\n value,\n false, false, this.index, this.currentFileInfo));\n }\n if (indexName) {\n newRules.push(new Declaration(indexName,\n new Dimension(i + 1),\n false, false, this.index, this.currentFileInfo));\n }\n if (keyName) {\n newRules.push(new Declaration(keyName,\n key,\n false, false, this.index, this.currentFileInfo));\n }\n\n rules.push(new Ruleset([ new(Selector)([ new Element(\"\", '&') ]) ],\n newRules,\n rs.strictImports,\n rs.visibilityInfo()\n ));\n }\n\n return new Ruleset([ new(Selector)([ new Element(\"\", '&') ]) ],\n rules,\n rs.strictImports,\n rs.visibilityInfo()\n ).eval(this.context);\n }\n};\n","import Dimension from '../tree/dimension';\n\nconst MathHelper = (fn, unit, n) => {\n if (!(n instanceof Dimension)) {\n throw { type: 'Argument', message: 'argument must be a number' };\n }\n if (unit == null) {\n unit = n.unit;\n } else {\n n = n.unify();\n }\n return new Dimension(fn(parseFloat(n.value)), unit);\n};\n\nexport default MathHelper;","import mathHelper from './math-helper.js';\n\nconst mathFunctions = {\n // name, unit\n ceil: null,\n floor: null,\n sqrt: null,\n abs: null,\n tan: '',\n sin: '',\n cos: '',\n atan: 'rad',\n asin: 'rad',\n acos: 'rad'\n};\n\nfor (const f in mathFunctions) {\n if (mathFunctions.hasOwnProperty(f)) {\n mathFunctions[f] = mathHelper.bind(null, Math[f], mathFunctions[f]);\n }\n}\n\nmathFunctions.round = (n, f) => {\n const fraction = typeof f === 'undefined' ? 0 : f.value;\n return mathHelper(num => num.toFixed(fraction), null, n);\n};\n\nexport default mathFunctions;\n","import Dimension from '../tree/dimension';\nimport Anonymous from '../tree/anonymous';\nimport mathHelper from './math-helper.js';\n\nconst minMax = function (isMin, args) {\n args = Array.prototype.slice.call(args);\n switch (args.length) {\n case 0: throw { type: 'Argument', message: 'one or more arguments required' };\n }\n let i; // key is the unit.toString() for unified Dimension values,\n let j;\n let current;\n let currentUnified;\n let referenceUnified;\n let unit;\n let unitStatic;\n let unitClone;\n\n const // elems only contains original argument values.\n order = [];\n\n const values = {};\n // value is the index into the order array.\n for (i = 0; i < args.length; i++) {\n current = args[i];\n if (!(current instanceof Dimension)) {\n if (Array.isArray(args[i].value)) {\n Array.prototype.push.apply(args, Array.prototype.slice.call(args[i].value));\n }\n continue;\n }\n currentUnified = current.unit.toString() === '' && unitClone !== undefined ? new Dimension(current.value, unitClone).unify() : current.unify();\n unit = currentUnified.unit.toString() === '' && unitStatic !== undefined ? unitStatic : currentUnified.unit.toString();\n unitStatic = unit !== '' && unitStatic === undefined || unit !== '' && order[0].unify().unit.toString() === '' ? unit : unitStatic;\n unitClone = unit !== '' && unitClone === undefined ? current.unit.toString() : unitClone;\n j = values[''] !== undefined && unit !== '' && unit === unitStatic ? values[''] : values[unit];\n if (j === undefined) {\n if (unitStatic !== undefined && unit !== unitStatic) {\n throw { type: 'Argument', message: 'incompatible types' };\n }\n values[unit] = order.length;\n order.push(current);\n continue;\n }\n referenceUnified = order[j].unit.toString() === '' && unitClone !== undefined ? new Dimension(order[j].value, unitClone).unify() : order[j].unify();\n if ( isMin && currentUnified.value < referenceUnified.value ||\n !isMin && currentUnified.value > referenceUnified.value) {\n order[j] = current;\n }\n }\n if (order.length == 1) {\n return order[0];\n }\n args = order.map(function (a) { return a.toCSS(this.context); }).join(this.context.compress ? ',' : ', ');\n return new Anonymous(`${isMin ? 'min' : 'max'}(${args})`);\n};\n\nexport default {\n min: function(...args) {\n try {\n return minMax(true, args);\n } catch (e) {}\n },\n max: function(...args) {\n try {\n return minMax(false, args);\n } catch (e) {}\n },\n convert: function (val, unit) {\n return val.convertTo(unit.value);\n },\n pi: function () {\n return new Dimension(Math.PI);\n },\n mod: function(a, b) {\n return new Dimension(a.value % b.value, a.unit);\n },\n pow: function(x, y) {\n if (typeof x === 'number' && typeof y === 'number') {\n x = new Dimension(x);\n y = new Dimension(y);\n } else if (!(x instanceof Dimension) || !(y instanceof Dimension)) {\n throw { type: 'Argument', message: 'arguments must be numbers' };\n }\n\n return new Dimension(Math.pow(x.value, y.value), x.unit);\n },\n percentage: function (n) {\n const result = mathHelper(num => num * 100, '%', n);\n\n return result;\n }\n};\n","import Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport JavaScript from '../tree/javascript';\n\nexport default {\n e: function (str) {\n return new Quoted('\"', str instanceof JavaScript ? str.evaluated : str.value, true);\n },\n escape: function (str) {\n return new Anonymous(\n encodeURI(str.value).replace(/=/g, '%3D').replace(/:/g, '%3A').replace(/#/g, '%23').replace(/;/g, '%3B')\n .replace(/\\(/g, '%28').replace(/\\)/g, '%29'));\n },\n replace: function (string, pattern, replacement, flags) {\n let result = string.value;\n replacement = (replacement.type === 'Quoted') ?\n replacement.value : replacement.toCSS();\n result = result.replace(new RegExp(pattern.value, flags ? flags.value : ''), replacement);\n return new Quoted(string.quote || '', result, string.escaped);\n },\n '%': function (string /* arg, arg, ... */) {\n const args = Array.prototype.slice.call(arguments, 1);\n let result = string.value;\n\n for (let i = 0; i < args.length; i++) {\n /* jshint loopfunc:true */\n result = result.replace(/%[sda]/i, token => {\n const value = ((args[i].type === 'Quoted') &&\n token.match(/s/i)) ? args[i].value : args[i].toCSS();\n return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value;\n });\n }\n result = result.replace(/%%/g, '%');\n return new Quoted(string.quote || '', result, string.escaped);\n }\n};\n","import Keyword from '../tree/keyword';\nimport DetachedRuleset from '../tree/detached-ruleset';\nimport Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport URL from '../tree/url';\nimport Operation from '../tree/operation';\n\nconst isa = (n, Type) => (n instanceof Type) ? Keyword.True : Keyword.False;\nconst isunit = (n, unit) => {\n if (unit === undefined) {\n throw { type: 'Argument', message: 'missing the required second argument to isunit.' };\n }\n unit = typeof unit.value === 'string' ? unit.value : unit;\n if (typeof unit !== 'string') {\n throw { type: 'Argument', message: 'Second argument to isunit should be a unit or a string.' };\n }\n return (n instanceof Dimension) && n.unit.is(unit) ? Keyword.True : Keyword.False;\n};\n\nexport default {\n isruleset: function (n) {\n return isa(n, DetachedRuleset);\n },\n iscolor: function (n) {\n return isa(n, Color);\n },\n isnumber: function (n) {\n return isa(n, Dimension);\n },\n isstring: function (n) {\n return isa(n, Quoted);\n },\n iskeyword: function (n) {\n return isa(n, Keyword);\n },\n isurl: function (n) {\n return isa(n, URL);\n },\n ispixel: function (n) {\n return isunit(n, 'px');\n },\n ispercentage: function (n) {\n return isunit(n, '%');\n },\n isem: function (n) {\n return isunit(n, 'em');\n },\n isunit,\n unit: function (val, unit) {\n if (!(val instanceof Dimension)) {\n throw { type: 'Argument',\n message: `the first argument to unit must be a number${val instanceof Operation ? '. Have you forgotten parenthesis?' : ''}` };\n }\n if (unit) {\n if (unit instanceof Keyword) {\n unit = unit.value;\n } else {\n unit = unit.toCSS();\n }\n } else {\n unit = '';\n }\n return new Dimension(val.value, unit);\n },\n 'get-unit': function (n) {\n return new Anonymous(n.unit);\n }\n};\n","import functionRegistry from './function-registry';\nimport functionCaller from './function-caller';\n\nimport boolean from './boolean';\nimport defaultFunc from './default';\nimport color from './color';\nimport colorBlending from './color-blending';\nimport dataUri from './data-uri';\nimport list from './list';\nimport math from './math';\nimport number from './number';\nimport string from './string';\nimport svg from './svg';\nimport types from './types';\n\nexport default environment => {\n const functions = { functionRegistry, functionCaller };\n\n // register functions\n functionRegistry.addMultiple(boolean);\n functionRegistry.add('default', defaultFunc.eval.bind(defaultFunc));\n functionRegistry.addMultiple(color);\n functionRegistry.addMultiple(colorBlending);\n functionRegistry.addMultiple(dataUri(environment));\n functionRegistry.addMultiple(list);\n functionRegistry.addMultiple(math);\n functionRegistry.addMultiple(number);\n functionRegistry.addMultiple(string);\n functionRegistry.addMultiple(svg(environment));\n functionRegistry.addMultiple(types);\n\n return functions;\n};\n","import Quoted from '../tree/quoted';\nimport URL from '../tree/url';\nimport * as utils from '../utils';\nimport logger from '../logger';\n\nexport default environment => {\n \n const fallback = (functionThis, node) => new URL(node, functionThis.index, functionThis.currentFileInfo).eval(functionThis.context); \n\n return { 'data-uri': function(mimetypeNode, filePathNode) {\n\n if (!filePathNode) {\n filePathNode = mimetypeNode;\n mimetypeNode = null;\n }\n\n let mimetype = mimetypeNode && mimetypeNode.value;\n let filePath = filePathNode.value;\n const currentFileInfo = this.currentFileInfo;\n const currentDirectory = currentFileInfo.rewriteUrls ?\n currentFileInfo.currentDirectory : currentFileInfo.entryPath;\n\n const fragmentStart = filePath.indexOf('#');\n let fragment = '';\n if (fragmentStart !== -1) {\n fragment = filePath.slice(fragmentStart);\n filePath = filePath.slice(0, fragmentStart);\n }\n const context = utils.clone(this.context);\n context.rawBuffer = true;\n\n const fileManager = environment.getFileManager(filePath, currentDirectory, context, environment, true);\n\n if (!fileManager) {\n return fallback(this, filePathNode);\n }\n\n let useBase64 = false;\n\n // detect the mimetype if not given\n if (!mimetypeNode) {\n\n mimetype = environment.mimeLookup(filePath);\n\n if (mimetype === 'image/svg+xml') {\n useBase64 = false;\n } else {\n // use base 64 unless it's an ASCII or UTF-8 format\n const charset = environment.charsetLookup(mimetype);\n useBase64 = ['US-ASCII', 'UTF-8'].indexOf(charset) < 0;\n }\n if (useBase64) { mimetype += ';base64'; }\n }\n else {\n useBase64 = /;base64$/.test(mimetype);\n }\n\n const fileSync = fileManager.loadFileSync(filePath, currentDirectory, context, environment);\n if (!fileSync.contents) {\n logger.warn(`Skipped data-uri embedding of ${filePath} because file not found`);\n return fallback(this, filePathNode || mimetypeNode);\n }\n let buf = fileSync.contents;\n if (useBase64 && !environment.encodeBase64) {\n return fallback(this, filePathNode);\n }\n\n buf = useBase64 ? environment.encodeBase64(buf) : encodeURIComponent(buf);\n\n const uri = `data:${mimetype},${buf}${fragment}`;\n\n return new URL(new Quoted(`\"${uri}\"`, uri, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n }};\n};\n","import Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Expression from '../tree/expression';\nimport Quoted from '../tree/quoted';\nimport URL from '../tree/url';\n\nexport default environment => {\n return { 'svg-gradient': function(direction) {\n let stops;\n let gradientDirectionSvg;\n let gradientType = 'linear';\n let rectangleDimension = 'x=\"0\" y=\"0\" width=\"1\" height=\"1\"';\n const renderEnv = {compress: false};\n let returner;\n const directionValue = direction.toCSS(renderEnv);\n let i;\n let color;\n let position;\n let positionValue;\n let alpha;\n\n function throwArgumentDescriptor() {\n throw { type: 'Argument',\n message: 'svg-gradient expects direction, start_color [start_position], [color position,]...,' +\n ' end_color [end_position] or direction, color list' };\n }\n\n if (arguments.length == 2) {\n if (arguments[1].value.length < 2) {\n throwArgumentDescriptor();\n }\n stops = arguments[1].value;\n } else if (arguments.length < 3) {\n throwArgumentDescriptor();\n } else {\n stops = Array.prototype.slice.call(arguments, 1);\n }\n\n switch (directionValue) {\n case 'to bottom':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\"';\n break;\n case 'to right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'to bottom right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\"';\n break;\n case 'to top right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"100%\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'ellipse':\n case 'ellipse at center':\n gradientType = 'radial';\n gradientDirectionSvg = 'cx=\"50%\" cy=\"50%\" r=\"75%\"';\n rectangleDimension = 'x=\"-50\" y=\"-50\" width=\"101\" height=\"101\"';\n break;\n default:\n throw { type: 'Argument', message: 'svg-gradient direction must be \\'to bottom\\', \\'to right\\',' +\n ' \\'to bottom right\\', \\'to top right\\' or \\'ellipse at center\\'' };\n }\n returner = `<${gradientType}Gradient id=\"g\" ${gradientDirectionSvg}>`;\n\n for (i = 0; i < stops.length; i += 1) {\n if (stops[i] instanceof Expression) {\n color = stops[i].value[0];\n position = stops[i].value[1];\n } else {\n color = stops[i];\n position = undefined;\n }\n\n if (!(color instanceof Color) || (!((i === 0 || i + 1 === stops.length) && position === undefined) && !(position instanceof Dimension))) {\n throwArgumentDescriptor();\n }\n positionValue = position ? position.toCSS(renderEnv) : i === 0 ? '0%' : '100%';\n alpha = color.alpha;\n returner += ``;\n }\n returner += ``;\n\n returner = encodeURIComponent(returner);\n\n returner = `data:image/svg+xml,${returner}`;\n return new URL(new Quoted(`'${returner}'`, returner, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n }};\n};\n","import contexts from './contexts';\nimport visitor from './visitors';\nimport tree from './tree';\n\nexport default function(root, options) {\n options = options || {};\n let evaldRoot;\n let variables = options.variables;\n const evalEnv = new contexts.Eval(options);\n\n //\n // Allows setting variables with a hash, so:\n //\n // `{ color: new tree.Color('#f01') }` will become:\n //\n // new tree.Declaration('@color',\n // new tree.Value([\n // new tree.Expression([\n // new tree.Color('#f01')\n // ])\n // ])\n // )\n //\n if (typeof variables === 'object' && !Array.isArray(variables)) {\n variables = Object.keys(variables).map(function (k) {\n let value = variables[k];\n\n if (!(value instanceof tree.Value)) {\n if (!(value instanceof tree.Expression)) {\n value = new tree.Expression([value]);\n }\n value = new tree.Value([value]);\n }\n return new tree.Declaration(`@${k}`, value, false, null, 0);\n });\n evalEnv.frames = [new tree.Ruleset(null, variables)];\n }\n\n const visitors = [\n new visitor.JoinSelectorVisitor(),\n new visitor.MarkVisibleSelectorsVisitor(true),\n new visitor.ExtendVisitor(),\n new visitor.ToCSSVisitor({compress: Boolean(options.compress)})\n ];\n\n const preEvalVisitors = [];\n let v;\n let visitorIterator;\n\n /**\n * first() / get() allows visitors to be added while visiting\n * \n * @todo Add scoping for visitors just like functions for @plugin; right now they're global\n */\n if (options.pluginManager) {\n visitorIterator = options.pluginManager.visitor();\n for (var i = 0; i < 2; i++) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (v.isPreEvalVisitor) {\n if (i === 0 || preEvalVisitors.indexOf(v) === -1) {\n preEvalVisitors.push(v);\n v.run(root);\n }\n }\n else {\n if (i === 0 || visitors.indexOf(v) === -1) {\n if (v.isPreVisitor) {\n visitors.unshift(v);\n }\n else {\n visitors.push(v);\n }\n }\n }\n }\n }\n }\n\n evaldRoot = root.eval(evalEnv);\n\n for (var i = 0; i < visitors.length; i++) {\n visitors[i].run(evaldRoot);\n }\n\n // Run any remaining visitors added after eval pass\n if (options.pluginManager) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (visitors.indexOf(v) === -1 && preEvalVisitors.indexOf(v) === -1) {\n v.run(evaldRoot);\n }\n }\n }\n\n return evaldRoot;\n};\n","/**\n * Plugin Manager\n */\nclass PluginManager {\n constructor(less) {\n this.less = less;\n this.visitors = [];\n this.preProcessors = [];\n this.postProcessors = [];\n this.installedPlugins = [];\n this.fileManagers = [];\n this.iterator = -1;\n this.pluginCache = {};\n this.Loader = new less.PluginLoader(less);\n }\n\n /**\n * Adds all the plugins in the array\n * @param {Array} plugins\n */\n addPlugins(plugins) {\n if (plugins) {\n for (let i = 0; i < plugins.length; i++) {\n this.addPlugin(plugins[i]);\n }\n }\n }\n\n /**\n *\n * @param plugin\n * @param {String} filename\n */\n addPlugin(plugin, filename, functionRegistry) {\n this.installedPlugins.push(plugin);\n if (filename) {\n this.pluginCache[filename] = plugin;\n }\n if (plugin.install) {\n plugin.install(this.less, this, functionRegistry || this.less.functions.functionRegistry);\n }\n }\n\n /**\n *\n * @param filename\n */\n get(filename) {\n return this.pluginCache[filename];\n }\n\n /**\n * Adds a visitor. The visitor object has options on itself to determine\n * when it should run.\n * @param visitor\n */\n addVisitor(visitor) {\n this.visitors.push(visitor);\n }\n\n /**\n * Adds a pre processor object\n * @param {object} preProcessor\n * @param {number} priority - guidelines 1 = before import, 1000 = import, 2000 = after import\n */\n addPreProcessor(preProcessor, priority) {\n let indexToInsertAt;\n for (indexToInsertAt = 0; indexToInsertAt < this.preProcessors.length; indexToInsertAt++) {\n if (this.preProcessors[indexToInsertAt].priority >= priority) {\n break;\n }\n }\n this.preProcessors.splice(indexToInsertAt, 0, {preProcessor, priority});\n }\n\n /**\n * Adds a post processor object\n * @param {object} postProcessor\n * @param {number} priority - guidelines 1 = before compression, 1000 = compression, 2000 = after compression\n */\n addPostProcessor(postProcessor, priority) {\n let indexToInsertAt;\n for (indexToInsertAt = 0; indexToInsertAt < this.postProcessors.length; indexToInsertAt++) {\n if (this.postProcessors[indexToInsertAt].priority >= priority) {\n break;\n }\n }\n this.postProcessors.splice(indexToInsertAt, 0, {postProcessor, priority});\n }\n\n /**\n *\n * @param manager\n */\n addFileManager(manager) {\n this.fileManagers.push(manager);\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getPreProcessors() {\n const preProcessors = [];\n for (let i = 0; i < this.preProcessors.length; i++) {\n preProcessors.push(this.preProcessors[i].preProcessor);\n }\n return preProcessors;\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getPostProcessors() {\n const postProcessors = [];\n for (let i = 0; i < this.postProcessors.length; i++) {\n postProcessors.push(this.postProcessors[i].postProcessor);\n }\n return postProcessors;\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getVisitors() {\n return this.visitors;\n }\n\n visitor() {\n const self = this;\n return {\n first: function() {\n self.iterator = -1;\n return self.visitors[self.iterator];\n },\n get: function() {\n self.iterator += 1;\n return self.visitors[self.iterator];\n }\n };\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getFileManagers() {\n return this.fileManagers;\n }\n}\n\nlet pm;\n\nconst PluginManagerFactory = function(less, newFactory) {\n if (newFactory || !pm) {\n pm = new PluginManager(less);\n }\n return pm;\n};\n\n//\nexport default PluginManagerFactory;\n","/* global window, XMLHttpRequest */\n\nimport AbstractFileManager from '../less/environment/abstract-file-manager.js';\n\nlet options;\nlet logger;\nlet fileCache = {};\n\n// TODOS - move log somewhere. pathDiff and doing something similar in node. use pathDiff in the other browser file for the initial load\nclass FileManager extends AbstractFileManager {\n alwaysMakePathsAbsolute() {\n return true;\n }\n\n join(basePath, laterPath) {\n if (!basePath) {\n return laterPath;\n }\n return this.extractUrlParts(laterPath, basePath).path;\n }\n\n doXHR(url, type, callback, errback) {\n const xhr = new XMLHttpRequest();\n const async = options.isFileProtocol ? options.fileAsync : true;\n\n if (typeof xhr.overrideMimeType === 'function') {\n xhr.overrideMimeType('text/css');\n }\n logger.debug(`XHR: Getting '${url}'`);\n xhr.open('GET', url, async);\n xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5');\n xhr.send(null);\n\n function handleResponse(xhr, callback, errback) {\n if (xhr.status >= 200 && xhr.status < 300) {\n callback(xhr.responseText,\n xhr.getResponseHeader('Last-Modified'));\n } else if (typeof errback === 'function') {\n errback(xhr.status, url);\n }\n }\n\n if (options.isFileProtocol && !options.fileAsync) {\n if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) {\n callback(xhr.responseText);\n } else {\n errback(xhr.status, url);\n }\n } else if (async) {\n xhr.onreadystatechange = () => {\n if (xhr.readyState == 4) {\n handleResponse(xhr, callback, errback);\n }\n };\n } else {\n handleResponse(xhr, callback, errback);\n }\n }\n\n supports() {\n return true;\n }\n\n clearFileCache() {\n fileCache = {};\n }\n\n loadFile(filename, currentDirectory, options, environment) {\n // TODO: Add prefix support like less-node?\n // What about multiple paths?\n\n if (currentDirectory && !this.isPathAbsolute(filename)) {\n filename = currentDirectory + filename;\n }\n\n filename = options.ext ? this.tryAppendExtension(filename, options.ext) : filename;\n\n options = options || {};\n\n // sheet may be set to the stylesheet for the initial load or a collection of properties including\n // some context variables for imports\n const hrefParts = this.extractUrlParts(filename, window.location.href);\n const href = hrefParts.url;\n const self = this;\n \n return new Promise((resolve, reject) => {\n if (options.useFileCache && fileCache[href]) {\n try {\n const lessText = fileCache[href];\n return resolve({ contents: lessText, filename: href, webInfo: { lastModified: new Date() }});\n } catch (e) {\n return reject({ filename: href, message: `Error loading file ${href} error was ${e.message}` });\n }\n }\n\n self.doXHR(href, options.mime, function doXHRCallback(data, lastModified) {\n // per file cache\n fileCache[href] = data;\n\n // Use remote copy (re-parse)\n resolve({ contents: data, filename: href, webInfo: { lastModified }});\n }, function doXHRError(status, url) {\n reject({ type: 'File', message: `'${url}' wasn't found (${status})`, href });\n });\n });\n }\n}\n\nexport default (opts, log) => {\n options = opts;\n logger = log;\n return FileManager;\n}\n","import Environment from './environment/environment';\nimport data from './data';\nimport tree from './tree';\nimport AbstractFileManager from './environment/abstract-file-manager';\nimport AbstractPluginLoader from './environment/abstract-plugin-loader';\nimport visitors from './visitors';\nimport Parser from './parser/parser';\nimport functions from './functions';\nimport contexts from './contexts';\nimport LessError from './less-error';\nimport transformTree from './transform-tree';\nimport * as utils from './utils';\nimport PluginManager from './plugin-manager';\nimport logger from './logger';\nimport SourceMapOutput from './source-map-output';\nimport SourceMapBuilder from './source-map-builder';\nimport ParseTree from './parse-tree';\nimport ImportManager from './import-manager';\nimport Parse from './parse';\nimport Render from './render';\n\nexport default function(environment, fileManagers) {\n let sourceMapOutput, sourceMapBuilder, parseTree, importManager;\n\n environment = new Environment(environment, fileManagers);\n sourceMapOutput = SourceMapOutput(environment);\n sourceMapBuilder = SourceMapBuilder(sourceMapOutput, environment);\n parseTree = ParseTree(sourceMapBuilder);\n importManager = ImportManager(environment);\n\n const render = Render(environment, parseTree, importManager);\n const parse = Parse(environment, parseTree, importManager);\n\n const initial = {\n version: [4, 0, 0],\n data,\n tree,\n Environment,\n AbstractFileManager,\n AbstractPluginLoader,\n environment,\n visitors,\n Parser,\n functions: functions(environment),\n contexts,\n SourceMapOutput: sourceMapOutput,\n SourceMapBuilder: sourceMapBuilder,\n ParseTree: parseTree,\n ImportManager: importManager,\n render,\n parse,\n LessError,\n transformTree,\n utils,\n PluginManager,\n logger\n };\n\n // Create a public API\n\n const ctor = function(t) {\n return function() {\n const obj = Object.create(t.prototype);\n t.apply(obj, Array.prototype.slice.call(arguments, 0));\n return obj;\n };\n };\n let t;\n const api = Object.create(initial);\n for (const n in initial.tree) {\n /* eslint guard-for-in: 0 */\n t = initial.tree[n];\n if (typeof t === 'function') {\n api[n.toLowerCase()] = ctor(t);\n }\n else {\n api[n] = Object.create(null);\n for (const o in t) {\n /* eslint guard-for-in: 0 */\n api[n][o.toLowerCase()] = ctor(t[o]);\n }\n }\n }\n\n /**\n * Some of the functions assume a `this` context of the API object,\n * which causes it to fail when wrapped for ES6 imports.\n * \n * An assumed `this` should be removed in the future.\n */\n initial.parse = initial.parse.bind(api);\n initial.render = initial.render.bind(api);\n\n return api;\n};\n","import LessError from './less-error';\nimport transformTree from './transform-tree';\nimport logger from './logger';\n\nexport default function(SourceMapBuilder) {\n class ParseTree {\n constructor(root, imports) {\n this.root = root;\n this.imports = imports;\n }\n\n toCSS(options) {\n let evaldRoot;\n const result = {};\n let sourceMapBuilder;\n try {\n evaldRoot = transformTree(this.root, options);\n } catch (e) {\n throw new LessError(e, this.imports);\n }\n\n try {\n const compress = Boolean(options.compress);\n if (compress) {\n logger.warn('The compress option has been deprecated. ' + \n 'We recommend you use a dedicated css minifier, for instance see less-plugin-clean-css.');\n }\n\n const toCSSOptions = {\n compress,\n dumpLineNumbers: options.dumpLineNumbers,\n strictUnits: Boolean(options.strictUnits),\n numPrecision: 8};\n\n if (options.sourceMap) {\n sourceMapBuilder = new SourceMapBuilder(options.sourceMap);\n result.css = sourceMapBuilder.toCSS(evaldRoot, toCSSOptions, this.imports);\n } else {\n result.css = evaldRoot.toCSS(toCSSOptions);\n }\n } catch (e) {\n throw new LessError(e, this.imports);\n }\n\n if (options.pluginManager) {\n const postProcessors = options.pluginManager.getPostProcessors();\n for (let i = 0; i < postProcessors.length; i++) {\n result.css = postProcessors[i].process(result.css, { sourceMap: sourceMapBuilder, options, imports: this.imports });\n }\n }\n if (options.sourceMap) {\n result.map = sourceMapBuilder.getExternalSourceMap();\n }\n\n result.imports = [];\n for (const file in this.imports.files) {\n if (this.imports.files.hasOwnProperty(file) && file !== this.imports.rootFilename) {\n result.imports.push(file);\n }\n }\n return result;\n }\n }\n\n return ParseTree;\n};\n","export default function (SourceMapOutput, environment) {\n class SourceMapBuilder {\n constructor(options) {\n this.options = options;\n }\n\n toCSS(rootNode, options, imports) {\n const sourceMapOutput = new SourceMapOutput(\n {\n contentsIgnoredCharsMap: imports.contentsIgnoredChars,\n rootNode,\n contentsMap: imports.contents,\n sourceMapFilename: this.options.sourceMapFilename,\n sourceMapURL: this.options.sourceMapURL,\n outputFilename: this.options.sourceMapOutputFilename,\n sourceMapBasepath: this.options.sourceMapBasepath,\n sourceMapRootpath: this.options.sourceMapRootpath,\n outputSourceFiles: this.options.outputSourceFiles,\n sourceMapGenerator: this.options.sourceMapGenerator,\n sourceMapFileInline: this.options.sourceMapFileInline, \n disableSourcemapAnnotation: this.options.disableSourcemapAnnotation\n });\n\n const css = sourceMapOutput.toCSS(options);\n this.sourceMap = sourceMapOutput.sourceMap;\n this.sourceMapURL = sourceMapOutput.sourceMapURL;\n if (this.options.sourceMapInputFilename) {\n this.sourceMapInputFilename = sourceMapOutput.normalizeFilename(this.options.sourceMapInputFilename);\n }\n if (this.options.sourceMapBasepath !== undefined && this.sourceMapURL !== undefined) {\n this.sourceMapURL = sourceMapOutput.removeBasepath(this.sourceMapURL);\n }\n return css + this.getCSSAppendage();\n }\n\n getCSSAppendage() {\n\n let sourceMapURL = this.sourceMapURL;\n if (this.options.sourceMapFileInline) {\n if (this.sourceMap === undefined) {\n return '';\n }\n sourceMapURL = `data:application/json;base64,${environment.encodeBase64(this.sourceMap)}`;\n }\n\n if (this.options.disableSourcemapAnnotation) {\n return '';\n }\n\n if (sourceMapURL) {\n return `/*# sourceMappingURL=${sourceMapURL} */`;\n }\n return '';\n }\n\n getExternalSourceMap() {\n return this.sourceMap;\n }\n\n setExternalSourceMap(sourceMap) {\n this.sourceMap = sourceMap;\n }\n\n isInline() {\n return this.options.sourceMapFileInline;\n }\n\n getSourceMapURL() {\n return this.sourceMapURL;\n }\n\n getOutputFilename() {\n return this.options.sourceMapOutputFilename;\n }\n\n getInputFilename() {\n return this.sourceMapInputFilename;\n }\n }\n\n return SourceMapBuilder;\n};\n","export default function (environment) {\n class SourceMapOutput {\n constructor(options) {\n this._css = [];\n this._rootNode = options.rootNode;\n this._contentsMap = options.contentsMap;\n this._contentsIgnoredCharsMap = options.contentsIgnoredCharsMap;\n if (options.sourceMapFilename) {\n this._sourceMapFilename = options.sourceMapFilename.replace(/\\\\/g, '/');\n }\n this._outputFilename = options.outputFilename;\n this.sourceMapURL = options.sourceMapURL;\n if (options.sourceMapBasepath) {\n this._sourceMapBasepath = options.sourceMapBasepath.replace(/\\\\/g, '/');\n }\n if (options.sourceMapRootpath) {\n this._sourceMapRootpath = options.sourceMapRootpath.replace(/\\\\/g, '/');\n if (this._sourceMapRootpath.charAt(this._sourceMapRootpath.length - 1) !== '/') {\n this._sourceMapRootpath += '/';\n }\n } else {\n this._sourceMapRootpath = '';\n }\n this._outputSourceFiles = options.outputSourceFiles;\n this._sourceMapGeneratorConstructor = environment.getSourceMapGenerator();\n\n this._lineNumber = 0;\n this._column = 0;\n }\n\n removeBasepath(path) {\n if (this._sourceMapBasepath && path.indexOf(this._sourceMapBasepath) === 0) {\n path = path.substring(this._sourceMapBasepath.length);\n if (path.charAt(0) === '\\\\' || path.charAt(0) === '/') {\n path = path.substring(1);\n }\n }\n\n return path;\n }\n\n normalizeFilename(filename) {\n filename = filename.replace(/\\\\/g, '/');\n filename = this.removeBasepath(filename);\n return (this._sourceMapRootpath || '') + filename;\n }\n\n add(chunk, fileInfo, index, mapLines) {\n\n // ignore adding empty strings\n if (!chunk) {\n return;\n }\n\n let lines, sourceLines, columns, sourceColumns, i;\n\n if (fileInfo && fileInfo.filename) {\n let inputSource = this._contentsMap[fileInfo.filename];\n\n // remove vars/banner added to the top of the file\n if (this._contentsIgnoredCharsMap[fileInfo.filename]) {\n // adjust the index\n index -= this._contentsIgnoredCharsMap[fileInfo.filename];\n if (index < 0) { index = 0; }\n // adjust the source\n inputSource = inputSource.slice(this._contentsIgnoredCharsMap[fileInfo.filename]);\n }\n\n // ignore empty content\n if (inputSource === undefined) {\n return;\n }\n\n inputSource = inputSource.substring(0, index);\n sourceLines = inputSource.split('\\n');\n sourceColumns = sourceLines[sourceLines.length - 1];\n }\n\n lines = chunk.split('\\n');\n columns = lines[lines.length - 1];\n\n if (fileInfo && fileInfo.filename) {\n if (!mapLines) {\n this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + 1, column: this._column},\n original: { line: sourceLines.length, column: sourceColumns.length},\n source: this.normalizeFilename(fileInfo.filename)});\n } else {\n for (i = 0; i < lines.length; i++) {\n this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + i + 1, column: i === 0 ? this._column : 0},\n original: { line: sourceLines.length + i, column: i === 0 ? sourceColumns.length : 0},\n source: this.normalizeFilename(fileInfo.filename)});\n }\n }\n }\n\n if (lines.length === 1) {\n this._column += columns.length;\n } else {\n this._lineNumber += lines.length - 1;\n this._column = columns.length;\n }\n\n this._css.push(chunk);\n }\n\n isEmpty() {\n return this._css.length === 0;\n }\n\n toCSS(context) {\n this._sourceMapGenerator = new this._sourceMapGeneratorConstructor({ file: this._outputFilename, sourceRoot: null });\n\n if (this._outputSourceFiles) {\n for (const filename in this._contentsMap) {\n if (this._contentsMap.hasOwnProperty(filename)) {\n let source = this._contentsMap[filename];\n if (this._contentsIgnoredCharsMap[filename]) {\n source = source.slice(this._contentsIgnoredCharsMap[filename]);\n }\n this._sourceMapGenerator.setSourceContent(this.normalizeFilename(filename), source);\n }\n }\n }\n\n this._rootNode.genCSS(context, this);\n\n if (this._css.length > 0) {\n let sourceMapURL;\n const sourceMapContent = JSON.stringify(this._sourceMapGenerator.toJSON());\n\n if (this.sourceMapURL) {\n sourceMapURL = this.sourceMapURL;\n } else if (this._sourceMapFilename) {\n sourceMapURL = this._sourceMapFilename;\n }\n this.sourceMapURL = sourceMapURL;\n\n this.sourceMap = sourceMapContent;\n }\n\n return this._css.join('');\n }\n }\n\n return SourceMapOutput;\n};\n","import contexts from './contexts';\nimport Parser from './parser/parser';\nimport LessError from './less-error';\nimport * as utils from './utils';\nimport logger from './logger';\n\nexport default function(environment) {\n // FileInfo = {\n // 'rewriteUrls' - option - whether to adjust URL's to be relative\n // 'filename' - full resolved filename of current file\n // 'rootpath' - path to append to normal URLs for this node\n // 'currentDirectory' - path to the current file, absolute\n // 'rootFilename' - filename of the base file\n // 'entryPath' - absolute path to the entry file\n // 'reference' - whether the file should not be output and only output parts that are referenced\n\n class ImportManager {\n constructor(less, context, rootFileInfo) {\n this.less = less;\n this.rootFilename = rootFileInfo.filename;\n this.paths = context.paths || []; // Search paths, when importing\n this.contents = {}; // map - filename to contents of all the files\n this.contentsIgnoredChars = {}; // map - filename to lines at the beginning of each file to ignore\n this.mime = context.mime;\n this.error = null;\n this.context = context;\n // Deprecated? Unused outside of here, could be useful.\n this.queue = []; // Files which haven't been imported yet\n this.files = {}; // Holds the imported parse trees.\n }\n\n /**\n * Add an import to be imported\n * @param path - the raw path\n * @param tryAppendExtension - whether to try appending a file extension (.less or .js if the path has no extension)\n * @param currentFileInfo - the current file info (used for instance to work out relative paths)\n * @param importOptions - import options\n * @param callback - callback for when it is imported\n */\n push(path, tryAppendExtension, currentFileInfo, importOptions, callback) {\n const importManager = this, pluginLoader = this.context.pluginManager.Loader;\n\n this.queue.push(path);\n\n const fileParsedFunc = function (e, root, fullPath) {\n importManager.queue.splice(importManager.queue.indexOf(path), 1); // Remove the path from the queue\n\n const importedEqualsRoot = fullPath === importManager.rootFilename;\n if (importOptions.optional && e) {\n callback(null, {rules:[]}, false, null);\n logger.info(`The file ${fullPath} was skipped because it was not found and the import was marked optional.`);\n }\n else {\n // Inline imports aren't cached here.\n // If we start to cache them, please make sure they won't conflict with non-inline imports of the\n // same name as they used to do before this comment and the condition below have been added.\n if (!importManager.files[fullPath] && !importOptions.inline) {\n importManager.files[fullPath] = { root, options: importOptions };\n }\n if (e && !importManager.error) { importManager.error = e; }\n callback(e, root, importedEqualsRoot, fullPath);\n }\n };\n\n const newFileInfo = {\n rewriteUrls: this.context.rewriteUrls,\n entryPath: currentFileInfo.entryPath,\n rootpath: currentFileInfo.rootpath,\n rootFilename: currentFileInfo.rootFilename\n };\n\n const fileManager = environment.getFileManager(path, currentFileInfo.currentDirectory, this.context, environment);\n\n if (!fileManager) {\n fileParsedFunc({ message: `Could not find a file-manager for ${path}` });\n return;\n }\n\n const loadFileCallback = function(loadedFile) {\n let plugin;\n const resolvedFilename = loadedFile.filename;\n const contents = loadedFile.contents.replace(/^\\uFEFF/, '');\n\n // Pass on an updated rootpath if path of imported file is relative and file\n // is in a (sub|sup) directory\n //\n // Examples:\n // - If path of imported file is 'module/nav/nav.less' and rootpath is 'less/',\n // then rootpath should become 'less/module/nav/'\n // - If path of imported file is '../mixins.less' and rootpath is 'less/',\n // then rootpath should become 'less/../'\n newFileInfo.currentDirectory = fileManager.getPath(resolvedFilename);\n if (newFileInfo.rewriteUrls) {\n newFileInfo.rootpath = fileManager.join(\n (importManager.context.rootpath || ''),\n fileManager.pathDiff(newFileInfo.currentDirectory, newFileInfo.entryPath));\n\n if (!fileManager.isPathAbsolute(newFileInfo.rootpath) && fileManager.alwaysMakePathsAbsolute()) {\n newFileInfo.rootpath = fileManager.join(newFileInfo.entryPath, newFileInfo.rootpath);\n }\n }\n newFileInfo.filename = resolvedFilename;\n\n const newEnv = new contexts.Parse(importManager.context);\n\n newEnv.processImports = false;\n importManager.contents[resolvedFilename] = contents;\n\n if (currentFileInfo.reference || importOptions.reference) {\n newFileInfo.reference = true;\n }\n\n if (importOptions.isPlugin) {\n plugin = pluginLoader.evalPlugin(contents, newEnv, importManager, importOptions.pluginArgs, newFileInfo);\n if (plugin instanceof LessError) {\n fileParsedFunc(plugin, null, resolvedFilename);\n }\n else {\n fileParsedFunc(null, plugin, resolvedFilename);\n }\n } else if (importOptions.inline) {\n fileParsedFunc(null, contents, resolvedFilename);\n } else {\n\n // import (multiple) parse trees apparently get altered and can't be cached.\n // TODO: investigate why this is\n if (importManager.files[resolvedFilename]\n && !importManager.files[resolvedFilename].options.multiple\n && !importOptions.multiple) {\n\n fileParsedFunc(null, importManager.files[resolvedFilename].root, resolvedFilename);\n }\n else {\n new Parser(newEnv, importManager, newFileInfo).parse(contents, function (e, root) {\n fileParsedFunc(e, root, resolvedFilename);\n });\n }\n }\n };\n let loadedFile;\n let promise;\n const context = utils.clone(this.context);\n\n if (tryAppendExtension) {\n context.ext = importOptions.isPlugin ? '.js' : '.less';\n }\n\n if (importOptions.isPlugin) {\n context.mime = 'application/javascript';\n\n if (context.syncImport) {\n loadedFile = pluginLoader.loadPluginSync(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n } else {\n promise = pluginLoader.loadPlugin(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n }\n }\n else {\n if (context.syncImport) {\n loadedFile = fileManager.loadFileSync(path, currentFileInfo.currentDirectory, context, environment);\n } else {\n promise = fileManager.loadFile(path, currentFileInfo.currentDirectory, context, environment,\n (err, loadedFile) => {\n if (err) {\n fileParsedFunc(err);\n } else {\n loadFileCallback(loadedFile);\n }\n });\n }\n }\n if (loadedFile) {\n if (!loadedFile.filename) {\n fileParsedFunc(loadedFile);\n } else {\n loadFileCallback(loadedFile);\n }\n } else if (promise) {\n promise.then(loadFileCallback, fileParsedFunc);\n }\n }\n }\n\n return ImportManager;\n};\n","import * as utils from './utils';\n\nexport default function(environment, ParseTree, ImportManager) {\n const render = function (input, options, callback) {\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(this.options, {});\n }\n else {\n options = utils.copyOptions(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n return new Promise(function (resolve, reject) {\n render.call(self, input, options, function(err, output) {\n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n this.parse(input, options, function(err, root, imports, options) {\n if (err) { return callback(err); }\n\n let result;\n try {\n const parseTree = new ParseTree(root, imports);\n result = parseTree.toCSS(options);\n }\n catch (err) { return callback(err); }\n\n callback(null, result);\n });\n }\n };\n\n return render;\n};\n","import contexts from './contexts';\nimport Parser from './parser/parser';\nimport PluginManager from './plugin-manager';\nimport LessError from './less-error';\nimport * as utils from './utils';\n\nexport default function(environment, ParseTree, ImportManager) {\n const parse = function (input, options, callback) {\n\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(this.options, {});\n }\n else {\n options = utils.copyOptions(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n return new Promise(function (resolve, reject) {\n parse.call(self, input, options, function(err, output) {\n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n let context;\n let rootFileInfo;\n const pluginManager = new PluginManager(this, !options.reUsePluginManager);\n\n options.pluginManager = pluginManager;\n\n context = new contexts.Parse(options);\n\n if (options.rootFileInfo) {\n rootFileInfo = options.rootFileInfo;\n } else {\n const filename = options.filename || 'input';\n const entryPath = filename.replace(/[^\\/\\\\]*$/, '');\n rootFileInfo = {\n filename,\n rewriteUrls: context.rewriteUrls,\n rootpath: context.rootpath || '',\n currentDirectory: entryPath,\n entryPath,\n rootFilename: filename\n };\n // add in a missing trailing slash\n if (rootFileInfo.rootpath && rootFileInfo.rootpath.slice(-1) !== '/') {\n rootFileInfo.rootpath += '/';\n }\n }\n\n const imports = new ImportManager(this, context, rootFileInfo);\n this.importManager = imports;\n\n // TODO: allow the plugins to be just a list of paths or names\n // Do an async plugin queue like lessc\n\n if (options.plugins) {\n options.plugins.forEach(function(plugin) {\n let evalResult, contents;\n if (plugin.fileContent) {\n contents = plugin.fileContent.replace(/^\\uFEFF/, '');\n evalResult = pluginManager.Loader.evalPlugin(contents, context, imports, plugin.options, plugin.filename);\n if (evalResult instanceof LessError) {\n return callback(evalResult);\n }\n }\n else {\n pluginManager.addPlugin(plugin);\n }\n });\n }\n\n new Parser(context, imports, rootFileInfo)\n .parse(input, function (e, root) {\n if (e) { return callback(e); }\n callback(null, root, imports, options);\n }, options);\n }\n };\n return parse;\n};\n","// TODO: Add tests for browser @plugin\n/* global window */\n\nimport AbstractPluginLoader from '../less/environment/abstract-plugin-loader.js';\n\n/**\n * Browser Plugin Loader\n */\nclass PluginLoader extends AbstractPluginLoader {\n constructor(less) {\n super();\n\n this.less = less;\n // Should we shim this.require for browser? Probably not?\n }\n\n loadPlugin(filename, basePath, context, environment, fileManager) {\n return new Promise((fulfill, reject) => {\n fileManager.loadFile(filename, basePath, context, environment)\n .then(fulfill).catch(reject);\n });\n }\n}\n\nexport default PluginLoader;\n\n","import * as utils from './utils';\nimport browser from './browser';\n\nexport default (window, less, options) => {\n\n function errorHTML(e, rootHref) {\n const id = `less-error-message:${utils.extractId(rootHref || '')}`;\n const template = '
  • {content}
  • ';\n const elem = window.document.createElement('div');\n let timer;\n let content;\n const errors = [];\n const filename = e.filename || rootHref;\n const filenameNoPath = filename.match(/([^\\/]+(\\?.*)?)$/)[1];\n\n elem.id = id;\n elem.className = 'less-error-message';\n\n content = `

    ${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'}` + \n `

    in ${filenameNoPath} `;\n\n const errorline = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\{content\\}/, e.extract[i]));\n }\n };\n\n if (e.line) {\n errorline(e, 0, '');\n errorline(e, 1, 'line');\n errorline(e, 2, '');\n content += `on line ${e.line}, column ${e.column + 1}:

      ${errors.join('')}
    `;\n }\n if (e.stack && (e.extract || options.logLevel >= 4)) {\n content += `
    Stack Trace
    ${e.stack.split('\\n').slice(1).join('
    ')}`;\n }\n elem.innerHTML = content;\n\n // CSS for error messages\n browser.createCSS(window.document, [\n '.less-error-message ul, .less-error-message li {',\n 'list-style-type: none;',\n 'margin-right: 15px;',\n 'padding: 4px 0;',\n 'margin: 0;',\n '}',\n '.less-error-message label {',\n 'font-size: 12px;',\n 'margin-right: 15px;',\n 'padding: 4px 0;',\n 'color: #cc7777;',\n '}',\n '.less-error-message pre {',\n 'color: #dd6666;',\n 'padding: 4px 0;',\n 'margin: 0;',\n 'display: inline-block;',\n '}',\n '.less-error-message pre.line {',\n 'color: #ff0000;',\n '}',\n '.less-error-message h3 {',\n 'font-size: 20px;',\n 'font-weight: bold;',\n 'padding: 15px 0 5px 0;',\n 'margin: 0;',\n '}',\n '.less-error-message a {',\n 'color: #10a',\n '}',\n '.less-error-message .error {',\n 'color: red;',\n 'font-weight: bold;',\n 'padding-bottom: 2px;',\n 'border-bottom: 1px dashed red;',\n '}'\n ].join('\\n'), { title: 'error-message' });\n\n elem.style.cssText = [\n 'font-family: Arial, sans-serif',\n 'border: 1px solid #e00',\n 'background-color: #eee',\n 'border-radius: 5px',\n '-webkit-border-radius: 5px',\n '-moz-border-radius: 5px',\n 'color: #e00',\n 'padding: 15px',\n 'margin-bottom: 15px'\n ].join(';');\n\n if (options.env === 'development') {\n timer = setInterval(() => {\n const document = window.document;\n const body = document.body;\n if (body) {\n if (document.getElementById(id)) {\n body.replaceChild(elem, document.getElementById(id));\n } else {\n body.insertBefore(elem, body.firstChild);\n }\n clearInterval(timer);\n }\n }, 10);\n }\n }\n\n function removeErrorHTML(path) {\n const node = window.document.getElementById(`less-error-message:${utils.extractId(path)}`);\n if (node) {\n node.parentNode.removeChild(node);\n }\n }\n\n function removeErrorConsole(path) {\n // no action\n }\n\n function removeError(path) {\n if (!options.errorReporting || options.errorReporting === 'html') {\n removeErrorHTML(path);\n } else if (options.errorReporting === 'console') {\n removeErrorConsole(path);\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('remove', path);\n }\n }\n\n function errorConsole(e, rootHref) {\n const template = '{line} {content}';\n const filename = e.filename || rootHref;\n const errors = [];\n let content = `${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'} in ${filename}`;\n\n const errorline = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\{content\\}/, e.extract[i]));\n }\n };\n\n if (e.line) {\n errorline(e, 0, '');\n errorline(e, 1, 'line');\n errorline(e, 2, '');\n content += ` on line ${e.line}, column ${e.column + 1}:\\n${errors.join('\\n')}`;\n }\n if (e.stack && (e.extract || options.logLevel >= 4)) {\n content += `\\nStack Trace\\n${e.stack}`;\n }\n less.logger.error(content);\n }\n\n function error(e, rootHref) {\n if (!options.errorReporting || options.errorReporting === 'html') {\n errorHTML(e, rootHref);\n } else if (options.errorReporting === 'console') {\n errorConsole(e, rootHref);\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('add', e, rootHref);\n }\n }\n\n return {\n add: error,\n remove: removeError\n };\n};\n","/**\n * Kicks off less and compiles any stylesheets\n * used in the browser distributed version of less\n * to kick-start less using the browser api\n */\n/* global window, document */\n\nimport defaultOptions from '../less/default-options';\nimport addDefaultOptions from './add-default-options';\nimport root from './index';\n\nconst options = defaultOptions();\n\nif (window.less) {\n for (const key in window.less) {\n if (window.less.hasOwnProperty(key)) {\n options[key] = window.less[key];\n }\n }\n}\naddDefaultOptions(window, options);\n\noptions.plugins = options.plugins || [];\n\nif (window.LESS_PLUGINS) {\n options.plugins = options.plugins.concat(window.LESS_PLUGINS);\n}\n\nconst less = root(window, options);\nexport default less;\n\nwindow.less = less;\n\nlet css;\nlet head;\nlet style;\n\n// Always restore page visibility\nfunction resolveOrReject(data) {\n if (data.filename) {\n console.warn(data);\n }\n if (!options.async) {\n head.removeChild(style);\n }\n}\n\nif (options.onReady) {\n if (/!watch/.test(window.location.hash)) {\n less.watch();\n }\n // Simulate synchronous stylesheet loading by hiding page rendering\n if (!options.async) {\n css = 'body { display: none !important }';\n head = document.head || document.getElementsByTagName('head')[0];\n style = document.createElement('style');\n\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n\n head.appendChild(style);\n }\n less.registerStylesheetsImmediately();\n less.pageLoadFinished = less.refresh(less.env === 'development').then(resolveOrReject, resolveOrReject);\n}\n","// Export a new default each time\nexport default function() {\n return {\n /* Inline Javascript - @plugin still allowed */\n javascriptEnabled: false,\n\n /* Outputs a makefile import dependency list to stdout. */\n depends: false,\n\n /* (DEPRECATED) Compress using less built-in compression. \n * This does an okay job but does not utilise all the tricks of \n * dedicated css compression. */\n compress: false,\n\n /* Runs the less parser and just reports errors without any output. */\n lint: false,\n\n /* Sets available include paths.\n * If the file in an @import rule does not exist at that exact location, \n * less will look for it at the location(s) passed to this option. \n * You might use this for instance to specify a path to a library which \n * you want to be referenced simply and relatively in the less files. */\n paths: [],\n\n /* color output in the terminal */\n color: true,\n\n /* The strictImports controls whether the compiler will allow an @import inside of either \n * @media blocks or (a later addition) other selector blocks.\n * See: https://github.com/less/less.js/issues/656 */\n strictImports: false,\n\n /* Allow Imports from Insecure HTTPS Hosts */\n insecure: false,\n\n /* Allows you to add a path to every generated import and url in your css. \n * This does not affect less import statements that are processed, just ones \n * that are left in the output css. */\n rootpath: '',\n\n /* By default URLs are kept as-is, so if you import a file in a sub-directory \n * that references an image, exactly the same URL will be output in the css. \n * This option allows you to re-write URL's in imported files so that the \n * URL is always relative to the base imported file */\n rewriteUrls: false,\n\n /* How to process math \n * 0 always - eagerly try to solve all operations\n * 1 parens-division - require parens for division \"/\"\n * 2 parens | strict - require parens for all operations\n * 3 strict-legacy - legacy strict behavior (super-strict)\n */\n math: 1,\n\n /* Without this option, less attempts to guess at the output unit when it does maths. */\n strictUnits: false,\n\n /* Effectively the declaration is put at the top of your base Less file, \n * meaning it can be used but it also can be overridden if this variable \n * is defined in the file. */\n globalVars: null,\n\n /* As opposed to the global variable option, this puts the declaration at the\n * end of your base file, meaning it will override anything defined in your Less file. */\n modifyVars: null,\n\n /* This option allows you to specify a argument to go on to every URL. */\n urlArgs: ''\n }\n};","import {addDataAttr} from './utils';\nimport browser from './browser';\n\nexport default (window, options) => {\n\n // use options from the current script tag data attribues\n addDataAttr(options, browser.currentScript(window));\n\n if (options.isFileProtocol === undefined) {\n options.isFileProtocol = /^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(window.location.protocol);\n }\n\n // Load styles asynchronously (default: false)\n //\n // This is set to `false` by default, so that the body\n // doesn't start loading before the stylesheets are parsed.\n // Setting this to `true` can result in flickering.\n //\n options.async = options.async || false;\n options.fileAsync = options.fileAsync || false;\n\n // Interval between watch polls\n options.poll = options.poll || (options.isFileProtocol ? 1000 : 1500);\n\n options.env = options.env || (window.location.hostname == '127.0.0.1' ||\n window.location.hostname == '0.0.0.0' ||\n window.location.hostname == 'localhost' ||\n (window.location.port &&\n window.location.port.length > 0) ||\n options.isFileProtocol ? 'development'\n : 'production');\n\n const dumpLineNumbers = /!dumpLineNumbers:(comments|mediaquery|all)/.exec(window.location.hash);\n if (dumpLineNumbers) {\n options.dumpLineNumbers = dumpLineNumbers[1];\n }\n\n if (options.useFileCache === undefined) {\n options.useFileCache = true;\n }\n\n if (options.onReady === undefined) {\n options.onReady = true;\n }\n\n if (options.relativeUrls) {\n options.rewriteUrls = 'all';\n }\n};\n","//\n// index.js\n// Should expose the additional browser functions on to the less object\n//\nimport {addDataAttr} from './utils';\nimport lessRoot from '../less';\nimport browser from './browser';\nimport FM from './file-manager';\nimport PluginLoader from './plugin-loader';\nimport LogListener from './log-listener';\nimport ErrorReporting from './error-reporting';\nimport Cache from './cache';\nimport ImageSize from './image-size';\n\nexport default (window, options) => {\n const document = window.document;\n const less = lessRoot();\n\n less.options = options;\n const environment = less.environment;\n const FileManager = FM(options, less.logger);\n const fileManager = new FileManager();\n environment.addFileManager(fileManager);\n less.FileManager = FileManager;\n less.PluginLoader = PluginLoader;\n\n LogListener(less, options);\n const errors = ErrorReporting(window, less, options);\n const cache = less.cache = options.cache || Cache(window, options, less.logger);\n ImageSize(less.environment);\n\n // Setup user functions - Deprecate?\n if (options.functions) {\n less.functions.functionRegistry.addMultiple(options.functions);\n }\n\n const typePattern = /^text\\/(x-)?less$/;\n\n function clone(obj) {\n const cloned = {};\n for (const prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n cloned[prop] = obj[prop];\n }\n }\n return cloned;\n }\n\n // only really needed for phantom\n function bind(func, thisArg) {\n const curryArgs = Array.prototype.slice.call(arguments, 2);\n return function() {\n const args = curryArgs.concat(Array.prototype.slice.call(arguments, 0));\n return func.apply(thisArg, args);\n };\n }\n\n function loadStyles(modifyVars) {\n const styles = document.getElementsByTagName('style');\n let style;\n\n for (let i = 0; i < styles.length; i++) {\n style = styles[i];\n if (style.type.match(typePattern)) {\n const instanceOptions = clone(options);\n instanceOptions.modifyVars = modifyVars;\n const lessText = style.innerHTML || '';\n instanceOptions.filename = document.location.href.replace(/#.*$/, '');\n\n /* jshint loopfunc:true */\n // use closure to store current style\n less.render(lessText, instanceOptions,\n bind((style, e, result) => {\n if (e) {\n errors.add(e, 'inline');\n } else {\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = result.css;\n } else {\n style.innerHTML = result.css;\n }\n }\n }, null, style));\n }\n }\n }\n\n function loadStyleSheet(sheet, callback, reload, remaining, modifyVars) {\n\n const instanceOptions = clone(options);\n addDataAttr(instanceOptions, sheet);\n instanceOptions.mime = sheet.type;\n\n if (modifyVars) {\n instanceOptions.modifyVars = modifyVars;\n }\n\n function loadInitialFileCallback(loadedFile) {\n const data = loadedFile.contents;\n const path = loadedFile.filename;\n const webInfo = loadedFile.webInfo;\n\n const newFileInfo = {\n currentDirectory: fileManager.getPath(path),\n filename: path,\n rootFilename: path,\n rewriteUrls: instanceOptions.rewriteUrls\n };\n\n newFileInfo.entryPath = newFileInfo.currentDirectory;\n newFileInfo.rootpath = instanceOptions.rootpath || newFileInfo.currentDirectory;\n\n if (webInfo) {\n webInfo.remaining = remaining;\n\n const css = cache.getCSS(path, webInfo, instanceOptions.modifyVars);\n if (!reload && css) {\n webInfo.local = true;\n callback(null, css, data, sheet, webInfo, path);\n return;\n }\n\n }\n\n // TODO add tests around how this behaves when reloading\n errors.remove(path);\n\n instanceOptions.rootFileInfo = newFileInfo;\n less.render(data, instanceOptions, (e, result) => {\n if (e) {\n e.href = path;\n callback(e);\n } else {\n cache.setCSS(sheet.href, webInfo.lastModified, instanceOptions.modifyVars, result.css);\n callback(null, result.css, data, sheet, webInfo, path);\n }\n });\n }\n\n fileManager.loadFile(sheet.href, null, instanceOptions, environment)\n .then(loadedFile => {\n loadInitialFileCallback(loadedFile);\n }).catch(err => {\n console.log(err);\n callback(err);\n });\n\n }\n\n function loadStyleSheets(callback, reload, modifyVars) {\n for (let i = 0; i < less.sheets.length; i++) {\n loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1), modifyVars);\n }\n }\n\n function initRunningMode() {\n if (less.env === 'development') {\n less.watchTimer = setInterval(() => {\n if (less.watchMode) {\n fileManager.clearFileCache();\n loadStyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n } else if (css) {\n browser.createCSS(window.document, css, sheet);\n }\n });\n }\n }, options.poll);\n }\n }\n\n //\n // Watch mode\n //\n less.watch = function () {\n if (!less.watchMode ) {\n less.env = 'development';\n initRunningMode();\n }\n this.watchMode = true;\n return true;\n };\n\n less.unwatch = function () {clearInterval(less.watchTimer); this.watchMode = false; return false; };\n\n //\n // Synchronously get all tags with the 'rel' attribute set to\n // \"stylesheet/less\".\n //\n less.registerStylesheetsImmediately = () => {\n const links = document.getElementsByTagName('link');\n less.sheets = [];\n\n for (let i = 0; i < links.length; i++) {\n if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) &&\n (links[i].type.match(typePattern)))) {\n less.sheets.push(links[i]);\n }\n }\n };\n\n //\n // Asynchronously get all tags with the 'rel' attribute set to\n // \"stylesheet/less\", returning a Promise.\n //\n less.registerStylesheets = () => new Promise((resolve, reject) => {\n less.registerStylesheetsImmediately();\n resolve();\n });\n\n //\n // With this function, it's possible to alter variables and re-render\n // CSS without reloading less-files\n //\n less.modifyVars = record => less.refresh(true, record, false);\n\n less.refresh = (reload, modifyVars, clearFileCache) => {\n if ((reload || clearFileCache) && clearFileCache !== false) {\n fileManager.clearFileCache();\n }\n return new Promise((resolve, reject) => {\n let startTime;\n let endTime;\n let totalMilliseconds;\n let remainingSheets;\n startTime = endTime = new Date();\n\n // Set counter for remaining unprocessed sheets\n remainingSheets = less.sheets.length;\n\n if (remainingSheets === 0) {\n\n endTime = new Date();\n totalMilliseconds = endTime - startTime;\n less.logger.info('Less has finished and no sheets were loaded.');\n resolve({\n startTime,\n endTime,\n totalMilliseconds,\n sheets: less.sheets.length\n });\n\n } else {\n // Relies on less.sheets array, callback seems to be guaranteed to be called for every element of the array\n loadStyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n reject(e);\n return;\n }\n if (webInfo.local) {\n less.logger.info(`Loading ${sheet.href} from cache.`);\n } else {\n less.logger.info(`Rendered ${sheet.href} successfully.`);\n }\n browser.createCSS(window.document, css, sheet);\n less.logger.info(`CSS for ${sheet.href} generated in ${new Date() - endTime}ms`);\n\n // Count completed sheet\n remainingSheets--;\n\n // Check if the last remaining sheet was processed and then call the promise\n if (remainingSheets === 0) {\n totalMilliseconds = new Date() - startTime;\n less.logger.info(`Less has finished. CSS generated in ${totalMilliseconds}ms`);\n resolve({\n startTime,\n endTime,\n totalMilliseconds,\n sheets: less.sheets.length\n });\n }\n endTime = new Date();\n }, reload, modifyVars);\n }\n\n loadStyles(modifyVars);\n });\n };\n\n less.refreshStyles = loadStyles;\n return less;\n};\n","export default (less, options) => {\n const logLevel_debug = 4;\n const logLevel_info = 3;\n const logLevel_warn = 2;\n const logLevel_error = 1;\n\n // The amount of logging in the javascript console.\n // 3 - Debug, information and errors\n // 2 - Information and errors\n // 1 - Errors\n // 0 - None\n // Defaults to 2\n options.logLevel = typeof options.logLevel !== 'undefined' ? options.logLevel : (options.env === 'development' ? logLevel_info : logLevel_error);\n\n if (!options.loggers) {\n options.loggers = [{\n debug: function(msg) {\n if (options.logLevel >= logLevel_debug) {\n console.log(msg);\n }\n },\n info: function(msg) {\n if (options.logLevel >= logLevel_info) {\n console.log(msg);\n }\n },\n warn: function(msg) {\n if (options.logLevel >= logLevel_warn) {\n console.warn(msg);\n }\n },\n error: function(msg) {\n if (options.logLevel >= logLevel_error) {\n console.error(msg);\n }\n }\n }];\n }\n for (let i = 0; i < options.loggers.length; i++) {\n less.logger.addListener(options.loggers[i]);\n }\n};\n","// Cache system is a bit outdated and could do with work\n\nexport default (window, options, logger) => {\n let cache = null;\n if (options.env !== 'development') {\n try {\n cache = (typeof window.localStorage === 'undefined') ? null : window.localStorage;\n } catch (_) {}\n }\n return {\n setCSS: function(path, lastModified, modifyVars, styles) {\n if (cache) {\n logger.info(`saving ${path} to cache.`);\n try {\n cache.setItem(path, styles);\n cache.setItem(`${path}:timestamp`, lastModified);\n if (modifyVars) {\n cache.setItem(`${path}:vars`, JSON.stringify(modifyVars));\n }\n } catch (e) {\n // TODO - could do with adding more robust error handling\n logger.error(`failed to save \"${path}\" to local storage for caching.`);\n }\n }\n },\n getCSS: function(path, webInfo, modifyVars) {\n const css = cache && cache.getItem(path);\n const timestamp = cache && cache.getItem(`${path}:timestamp`);\n let vars = cache && cache.getItem(`${path}:vars`);\n\n modifyVars = modifyVars || {};\n vars = vars || \"{}\"; // if not set, treat as the JSON representation of an empty object\n\n if (timestamp && webInfo.lastModified &&\n (new Date(webInfo.lastModified).valueOf() ===\n new Date(timestamp).valueOf()) &&\n JSON.stringify(modifyVars) === vars) {\n // Use local copy\n return css;\n }\n }\n };\n};\n","\nimport functionRegistry from './../less/functions/function-registry';\n\nexport default () => {\n function imageSize() {\n throw {\n type: 'Runtime',\n message: 'Image size functions are not supported in browser version of less'\n };\n }\n\n const imageFunctions = {\n 'image-size': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n },\n 'image-width': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n },\n 'image-height': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n }\n };\n\n functionRegistry.addMultiple(imageFunctions);\n};\n"],"names":["extractId","href","replace","addDataAttr","options","tag","opt","dataset","hasOwnProperty","JSON","parse","_","document","styles","sheet","id","title","utils.extractId","oldStyleNode","getElementById","keepOldStyleNode","styleNode","createElement","setAttribute","media","styleSheet","appendChild","createTextNode","childNodes","length","firstChild","nodeValue","head","getElementsByTagName","nextEl","nextSibling","parentNode","insertBefore","removeChild","cssText","e","Error","window","scripts","currentScript","error","msg","this","_fireEvent","warn","info","debug","addListener","listener","_listeners","push","removeListener","i","splice","type","logFunction","externalEnvironment","fileManagers","requiredFunctions","functions","concat","propName","environmentFunc","bind","Environment","filename","currentDirectory","environment","isSync","logger","pluginManager","getFileManagers","fileManager","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","darkgrey","darkgreen","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","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","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","m","cm","mm","in","px","pt","pc","duration","s","ms","angle","rad","Math","PI","deg","grad","turn","colors","unitConversions","parent","visibilityBlocks","undefined","nodeVisible","rootNode","parsed","self","Object","defineProperty","get","fileInfo","getIndex","Node","nodes","set","node","Array","isArray","forEach","_index","_fileInfo","context","strs","genCSS","add","chunk","index","isEmpty","join","output","value","visitor","visit","op","a","b","precision","numPrecision","Number","toFixed","compare","extendStatics","d","setPrototypeOf","__proto__","p","__extends","__","constructor","prototype","create","__assign","assign","t","n","arguments","call","apply","rgb","originalForm","_super","_this","match","map","c","parseInt","alpha","split","Color","r","g","pow","toCSS","doNotCompress","color","colorFunction","compress","args","fround","indexOf","clamp","round","toHSL","h","l","toRGB","splitcolor","other","_operate","toHex","max","min","v","x","keyword","key","toLowerCase","slice","toString","Paren","eval","_noSpaceCombinators"," ","|","emptyOrWhitespace","trim","Combinator","spaceOrEmpty","combinator","isVariable","currentFileInfo","visibilityInfo","copyVisibilityInfo","setParent","Element","firstSelector","charAt","ALWAYS","PARENS_DIVISION","PARENS","RewriteUrls","getLocation","inputStream","line","column","copyArray","arr","copy","clone","obj","cloned","prop","defaults","obj1","obj2","newObj","_defaults","defaults_1","copyOptions","opts","strictMath","math","Constants.Math","relativeUrls","rewriteUrls","Constants.RewriteUrls","flattenArray","result","length_1","anonymousFunc","LessError","fileContentMap","currentFilename","message","stack","input","contents","loc","utils.getLocation","col","callLine","lines","found","func","Function","lineAdjust","callExtract","extract","F","stylize","str","errorTxt","substr","elements","extendList","condition","evaldCondition","getElements","mixinElements_","Selector","visitArray","newSelector","mediaEmpty","els","parseNode","err","imports","sels","olen","len","mixinElements","shift","extend","createDerived","Value","Keyword","True","False","mapLines","rulesetLike","allowRoot","Anonymous","Boolean","MATH","name","important","merge","inline","variable","Declaration","lastRule","prevMath","evaldValue","mathBypass","evalName","importantScope","importantResult","pop","ctx","lineSeparator","dumpLineNumbers","debugInfo","asComment","asMediaQuery","lineNumber","fileName","filenameWithProtocol","test","isLineComment","Comment","getDebugInfo","isCompressed","contexts","copyFromOriginal","original","destination","propertiesToCopy","parseCopyProperties","Parse","paths","evalCopyProperties","isPathRelative","path","isPathLocalRelative","Eval","frames","enterCalc","calcStack","inCalc","exitCalc","inParenthesis","parensStack","outOfParenthesis","mathOn","isMathOn","pathRequiresRewrite","rewritePath","rootpath","newPath","normalizePath","segment","segments","reverse","makeRegistry","base","_data","addMultiple","keys","getLocalFunctions","inherit","defaultFunc","value_","error_","reset","selectors","rules","strictImports","_lookups","_variables","_properties","Ruleset","selCnt","selector","hasVariable","hasOnePassingSelector","j","toParseSelectors","utils.flattenArray","rule","subRule","utils.copyArray","ruleset","originalRuleset","root","firstRoot","allowImports","functionRegistry","globalFunctionRegistry","ctxFrames","unshift","ctxSelectors","evalImports","rsRules","evalFirst","mediaBlockCount","mediaBlocks","filter","resetCache","isJustParentSelector","bubbleSelectors","importRules","makeImportant","lastSelector","_rulesets","reduce","hash","variables","vars","name_1","name_2","decl","parseValue","properties","toParse","transformDeclaration","nodes_1","filtRules","isRuleset","foundMixins","rulesets","find","ruleNodes","tabLevel","sep","tabRuleStr","tabSetStr","charsetNodeIndex","importNodeIndex","isCharset","pathCnt","pathSubCnt","currentLastRule","isRulesetLike","isVisible","joinSelector","createParenthesis","elementsToPak","originalElement","replacementParen","insideParent","createSelector","containedElement","element","addReplacementIntoPath","beginningPath","addPath","replacedElement","originalSelector","newSelectorPath","newJoinedSelector","parentEl","restOfPath","addAllReplacementsIntoPath","addPaths","mergeElementsOnToSelectors","sel","deriveSelector","deriveFrom","newPaths","replaceParentSelector","inSelector","k","currentElements","newSelectors","selectorsMultiplied","el","maybeSelector","hadParentSelector","nestedSelector","replaced","nestedPaths","replacedNewSelectors","concatenated","isRooted","createEmptySelectors","AtRule","outputRuleset","mediaPathBackup","mediaBlocksBackup","mediaPath","ruleCnt","DetachedRuleset","numerator","denominator","backupUnit","sort","Unit","strictUnits","returnStr","is","unitString","toUpperCase","RegExp","callback","group","mapUnit","groupName","atomicUnit","counter","count","unit","parseFloat","isNaN","Dimension","isSingular","strValue","String","isLength","convertTo","usedUnits","cancel","unify","numericCompare","conversions","targetUnit","applyUnit","derivedConversions","operands","isSpaced","Operation","toColor","operate","noSpacing","Expression","returnValue","parens","doubleParen","parensInOp","functionCaller","evalArgs","commentFilter","item","subNodes","il","jl","calc","Call","currentMathContext","funcCaller","FunctionCaller","isValid","columnNumber","Variable","evaluating","frame","fun","Property","property","mergeRules","less","visitors","ToCSSVisitor","_mergeRules","vArr","Attribute","content","escaped","quote","variableRegex","propRegex","Quoted","that","iterativeReplace","regexp","replacementFnc","evaluatedValue","val","isEvald","URL","urlArgs","features","Media","evalTop","evalNested","multiMedia","permute","fragment","rest","css","pathValue","getPath","Import","isPlugin","reference","containsVariables","doEval","blocksVisibility","addVisibilityBlock","registry","skip","importedFilename","newImport","evalPath","string","expression","JavaScript","evaluateJavaScript","JsEvalNode","evalContext","javascriptEnabled","jsify","toJS","Assignment","negate","lvalue","rvalue","Condition","UnicodeDescriptor","Negative","option","object_id","Extend","next_id","parent_ids","allowBefore","allowAfter","selectorElements","selfElements","selfSelectors","VariableCall","detachedRuleset","callEval","ruleCall","lookups","NamespaceValue","lastDeclaration","substring","params","variadic","arity","optionalParameters","required","Definition","mixinEnv","evaldArguments","varargs","arg","isNamedFound","argIndex","argsLength","prependRule","_arguments","mixinFrames","evalParams","allArgsCnt","requiredArgsCnt","MixinCall","mixins","mixin","mixinPath","argValue","f","isRecursive","isOneFound","candidate","defaultResult","noArgumentsFilter","candidates","conditionResult","calcDefGroup","namespace","matchCondition","expand","matchArgs","MixinDefinition","format","newRules","evalCall","_setVisibilityToReplacement","replacement","AbstractFileManager","lastIndexOf","ext","tryAppendExtension","basePath","laterPath","url","baseUrl","urlDirectories","baseUrlDirectories","urlParts","extractUrlParts","baseUrlParts","diff","hostPart","directories","urlPartsRegex","returner","rawDirectories","rawPath","fileUrl","require","AbstractPluginLoader","pluginOptions","pluginObj","localModule","shortname","FileManager","trySetOptions","use","exports","loader","tree","validatePlugin","minVersion","compareVersion","addPlugin","plugin","setOptions","version","versionToString","aVersion","bVersion","versionString","plugins","printUsage","_visitArgs","visitDeeper","_hasIndexed","_noop","implementation","_implementation","_visitInCache","_visitOutCache","indexNodeTypes","ticker","child","typeIndex","Visitor","nodeTypeIndex","fnName","impl","funcOut","visitArgs","newNode","isReplacing","cnt","accept","nonReplacing","out","evald","flatten","nestedCnt","nestedItem","onSequencerEmpty","variableImports","_onSequencerEmpty","_currentDepth","ImportSequencer","importSequencer","importItem","isReady","tryRun","variableImport","ImportVisitor","importer","finish","_visitor","_importer","_finish","importCount","onceFileDetectionMap","recursionDetector","_sequencer","run","isFinished","visitImport","importNode","inlineCSS","importParent","isVariableImport","addVariableImport","processImportNode","evaldImportNode","evalForImport","multiple","importMultiple","tryAppendLessExtension","onImported","sequencedOnImported","addImport","importedAtRoot","fullPath","importVisitor","isOptional","optional","duplicateImport","oldContext","visitDeclaration","declNode","visitDeclarationOut","visitAtRule","atRuleNode","visitAtRuleOut","visitMixinDefinition","mixinDefinitionNode","visitMixinDefinitionOut","visitRuleset","rulesetNode","visitRulesetOut","visitMedia","mediaNode","visitMediaOut","visible","SetTreeVisibilityVisitor","ensureVisibility","ensureInvisibility","allExtendsStack","ExtendFinderVisitor","allExtends","allSelectorsExtendList","extendOnEveryPath","selectorPath","selExtendList","allSelectorsExtend","foundExtends","findSelfSelectors","firstExtendOnThisSelectorPath","ProcessExtendsVisitor","extendFinder","extendIndices","doExtendChaining","newRoot","checkExtendsForNonMatched","indices","hasFoundMatches","extendsList","extendsListTarget","iterationCount","extendIndex","targetExtendIndex","matches","targetExtend","newExtend","extendsToAdd","extendVisitor","findMatch","selfSelector","extendSelector","extendChainCount","selectorOne","selectorTwo","ruleNode","selectorNode","pathIndex","selectorsToAdd","extendedSelectors","haystackSelectorPath","haystackSelectorIndex","hackstackSelector","hackstackElementIndex","haystackElement","targetCombinator","potentialMatch","needleElements","potentialMatches","matched","initialCombinator","isElementValuesEqual","finished","endPathIndex","endPathElementIndex","elementValue1","elementValue2","replacementSelector","matchIndex","firstElement","newElements","currentSelectorPathIndex","currentSelectorPathElementIndex","currentValue","derived","newAllExtends","lastIndex","JoinSelectorVisitor","getIsOutput","joinSelectors","_context","CSSVisitorUtils","bodyRules","isSilent","owner","thing","originalRules","containsSilentNonBlockedChild","compiledRulesBody","keepOnlyVisibleChilds","removeVisibilityBlock","hasVisibleSelector","utils","mixinNode","visitExtend","extendNode","visitComment","commentNode","resolveVisibility","visitAtRuleWithBody","visitAtRuleWithoutBody","visitAnonymous","anonymousNode","nodeRules","hasFakeRuleset","getBodyRules","charset","comment","checkValidNodes","isRoot","_compileRulesetPaths","nodeRuleCnt","_removeDuplicateRules","isVisibleRuleset","ruleList","ruleCache","ruleCSS","groups","groupsArr","result_1","space_1","comma_1","MarkVisibleSelectorsVisitor","ExtendVisitor","furthest","furthestPossibleErrorMessage","chunks","current","currentPos","saveStack","parserInput","skipWhitespace","nextChar","oldi","oldj","curr","endIndex","mem","inp","charCodeAt","autoCommentAbsorb","nextNewLine","text","commentStore","nextStarSlash","save","restore","possibleErrorMessage","state","forget","isWhitespace","offset","pos","code","$re","tok","exec","$char","$str","tokLength","$quoted","startChar","currentPosition","$parseUntil","testChar","returnVal","inComment","blockDepth","blockStack","parseGroups","startPos","lastPos","loop","char","expected","peek","peekChar","currentChar","prevChar","getInput","peekNotNumeric","start","chunkInput","failFunction","fail","lastOpening","lastOpeningParen","lastMultiComment","lastMultiCommentEndBrace","chunkerCurrentIndex","currentChunkStartIndex","cc","cc2","level","parenLevel","emitFrom","emitChunk","force","fromCharCode","chunker","end","furthestReachedEnd","furthestChar","Parser","parsers","getParserInput","expect","expectChar","parseList","currentIndex","returnNodes","parser","additionalData","globalVars","modifyVars","ignored","preText","serializeVars","preProcessors","getPreProcessors","process","banner","contentsIgnoredChars","primary","endInfo","processImports","extendRule","definition","declaration","variableCall","entities","atrule","foundSemiColon","mixinLookup","quoted","forceEscaped","isEscaped","fromKeyword","customFuncCall","stop","ieAlpha","boolean","if","prevArgs","isSemiColonSeparated","argsComma","argsSemiColon","assignment","literal","dimension","unicodeDescriptor","entity","ch","variableCurly","curly","propertyCurly","colorKeyword","ud","javascript","js","escape","parsedName","inValue","ruleLookups","isRule","getLookup","hasParens","elem","elemIndex","re","isCall","expressionContainsNamed","nameLoop","expressions","hasSep","throwAwayComments","cond","argInfo","conditions","block","lookupValue","attribute","slashedCombinator","isLess","when","blockRuleset","hasDR","ruleProperty","permissiveValue","anonymousValue","untilTokens","done","testCurrentChar","import","dir","importOptions","mediaFeatures","o","optionName","importOption","mediaFeature","pluginArgs","nonVendorSpecificName","hasIdentifier","hasExpression","hasUnknown","hasBlock","sub","addition","multiplication","operation","operand","needsParens","logical","next","conditionAnd","negatedCondition","parenthesisCondition","atomicCondition","body","me","tryConditionFollowedByParenthesis","delim","simpleProperty","If","trueValue","falseValue","colorFunctions","hsla","origColor","hsl","toHSV","number","rgba","size","m1_1","m2_1","hue","hsv","hsva","vs","floor","perm","saturation","lightness","hsvhue","hsvsaturation","hsvvalue","luma","luminance","saturate","amount","method","desaturate","lighten","darken","fadein","fadeout","fade","spin","mix","color1","color2","weight","w","w1","w2","greyscale","contrast","dark","light","threshold","argb","toARGB","tint","shade","colorBlend","mode","cb","cs","ar","cr","ab","as","colorBlendModeFunctions","multiply","screen","overlay","softlight","sqrt","hardlight","difference","abs","exclusion","average","negation","getItemsFromNode","_SELF","~","_i","expr","values","range","step","from","to","stepValue","list","each","rs","iterator","tryEval","Quote","valueName","keyName","indexName","MathHelper","fn","mathFunctions","ceil","sin","cos","atan","asin","acos","mathHelper","fraction","num","minMax","isMin","currentUnified","referenceUnified","unitStatic","unitClone","order","convert","pi","mod","y","percentage","evaluated","encodeURI","pattern","flags","%","token","encodeURIComponent","isa","Type","isunit","isruleset","iscolor","isnumber","isstring","iskeyword","isurl","ispixel","ispercentage","isem","get-unit","colorBlending","fallback","functionThis","data-uri","mimetypeNode","filePathNode","mimetype","filePath","entryPath","fragmentStart","utils.clone","rawBuffer","getFileManager","useBase64","mimeLookup","charsetLookup","fileSync","loadFileSync","buf","encodeBase64","uri","dataUri","svg-gradient","direction","stops","gradientDirectionSvg","position","positionValue","gradientType","rectangleDimension","renderEnv","directionValue","throwArgumentDescriptor","types","evaldRoot","evalEnv","visitorIterator","preEvalVisitors","first","isPreEvalVisitor","isPreVisitor","pm","postProcessors","installedPlugins","pluginCache","Loader","PluginLoader","PluginManager","install","preProcessor","priority","indexToInsertAt","postProcessor","manager","PluginManagerFactory","newFactory","sourceMapOutput","sourceMapBuilder","parseTree","importManager","SourceMapBuilder","ParseTree","transformTree","toCSSOptions","sourceMap","getPostProcessors","file","getExternalSourceMap","files","rootFilename","SourceMapOutput","contentsIgnoredCharsMap","contentsMap","sourceMapFilename","sourceMapURL","outputFilename","sourceMapOutputFilename","sourceMapBasepath","sourceMapRootpath","outputSourceFiles","sourceMapGenerator","sourceMapFileInline","disableSourcemapAnnotation","sourceMapInputFilename","normalizeFilename","removeBasepath","getCSSAppendage","_css","_rootNode","_contentsMap","_contentsIgnoredCharsMap","_sourceMapFilename","_outputFilename","_sourceMapBasepath","_sourceMapRootpath","_outputSourceFiles","_sourceMapGeneratorConstructor","getSourceMapGenerator","_lineNumber","_column","sourceLines","columns","sourceColumns","inputSource","_sourceMapGenerator","addMapping","generated","source","sourceRoot","setSourceContent","sourceMapContent","stringify","toJSON","rootFileInfo","mime","queue","ImportManager","pluginLoader","fileParsedFunc","importedEqualsRoot","newFileInfo","loadedFile","promise","loadFileCallback","resolvedFilename","pathDiff","isPathAbsolute","alwaysMakePathsAbsolute","newEnv","evalPlugin","syncImport","loadPluginSync","loadPlugin","loadFile","then","render","utils.copyOptions","self_1","Promise","resolve","reject","Render","context_1","pluginManager_1","reUsePluginManager","imports_1","evalResult","fileContent","initial","data","ctor","api","fileCache","errback","xhr","XMLHttpRequest","async","isFileProtocol","fileAsync","handleResponse","status","responseText","getResponseHeader","overrideMimeType","open","setRequestHeader","send","onreadystatechange","readyState","location","useFileCache","lessText","webInfo","lastModified","Date","doXHR","log","fulfill","catch","rootHref","errorReporting","errors","errorline","classname","logLevel","errorConsole","timer","filenameNoPath","className","innerHTML","browser","style","env","setInterval","replaceChild","clearInterval","errorHTML","remove","removeErrorHTML","depends","lint","insecure","protocol","poll","hostname","port","onReady","addDefaultOptions","LESS_PLUGINS","lessRoot","FM","addFileManager","loggers","console","LogListener","ErrorReporting","cache","localStorage","setCSS","setItem","getCSS","getItem","timestamp","valueOf","Cache","imageSize","imageFunctions","image-size","image-width","image-height","ImageSize","typePattern","thisArg","curryArgs","loadStyles","instanceOptions","loadStyleSheet","reload","remaining","local","loadInitialFileCallback","loadStyleSheets","sheets","watch","watchMode","watchTimer","clearFileCache","unwatch","registerStylesheetsImmediately","links","rel","registerStylesheets","record","refresh","startTime","endTime","totalMilliseconds","remainingSheets","refreshStyles","resolveOrReject","pageLoadFinished"],"mappings":"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"} \ No newline at end of file diff --git a/packages/less/dist/less.js b/packages/less/dist/less.js index 06749c853..3d7366530 100644 --- a/packages/less/dist/less.js +++ b/packages/less/dist/less.js @@ -1,5 +1,5 @@ /** - * Less - Leaner CSS v3.12.1-alpha.13+ed734098 + * Less - Leaner CSS v4.0.1-alpha.0+70e242c5 * http://lesscss.org * * Copyright (c) 2009-2020, Alexis Sellier @@ -1674,7 +1674,6 @@ var evalCopyProperties = [ 'paths', 'compress', - 'ieCompat', 'math', 'strictUnits', 'sourceMap', diff --git a/packages/less/dist/less.min.js b/packages/less/dist/less.min.js index 302041fa6..34348cf92 100644 --- a/packages/less/dist/less.min.js +++ b/packages/less/dist/less.min.js @@ -1,5 +1,5 @@ /** - * Less - Leaner CSS v3.12.1-alpha.13+ed734098 + * Less - Leaner CSS v4.0.1-alpha.0+70e242c5 * http://lesscss.org * * Copyright (c) 2009-2020, Alexis Sellier @@ -7,5 +7,5 @@ * * @license Apache-2.0 */ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).less=t()}(this,(function(){"use strict";function e(e){return e.replace(/^[a-z-]+:\/+?[^\/]+/,"").replace(/[\?\&]livereload=\w+/,"").replace(/^\//,"").replace(/\.[a-zA-Z]+$/,"").replace(/[^\.\w-]+/g,"-").replace(/\./g,":")}function t(e,t){for(var n in t.dataset)if(t.dataset.hasOwnProperty(n))if("env"===n||"dumpLineNumbers"===n||"rootpath"===n||"errorReporting"===n)e[n]=t.dataset[n];else try{e[n]=JSON.parse(t.dataset[n])}catch(e){}}var n=function(t,n,i){var r=i.href||"",o="less:"+(i.title||e(r)),s=t.getElementById(o),a=!1,l=t.createElement("style");l.setAttribute("type","text/css"),i.media&&l.setAttribute("media",i.media),l.id=o,l.styleSheet||(l.appendChild(t.createTextNode(n)),a=null!==s&&s.childNodes.length>0&&l.childNodes.length>0&&s.firstChild.nodeValue===l.firstChild.nodeValue);var u=t.getElementsByTagName("head")[0];if(null===s||!1===a){var c=i&&i.nextSibling||null;c?c.parentNode.insertBefore(l,c):u.appendChild(l)}if(s&&!1===a&&s.parentNode.removeChild(s),l.styleSheet)try{l.styleSheet.cssText=n}catch(e){throw new Error("Couldn't reassign styleSheet.cssText.")}},i=function(e){var t,n=e.document;return n.currentScript||(t=n.getElementsByTagName("script"))[t.length-1]},r={error:function(e){this._fireEvent("error",e)},warn:function(e){this._fireEvent("warn",e)},info:function(e){this._fireEvent("info",e)},debug:function(e){this._fireEvent("debug",e)},addListener:function(e){this._listeners.push(e)},removeListener:function(e){for(var t=0;t=0;a--){var l=s[a];if(l[o?"supportsSync":"supports"](e,t,n,i))return l}return null},e.prototype.addFileManager=function(e){this.fileManagers.push(e)},e.prototype.clearFileManagers=function(){this.fileManagers=[]},e}(),s={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",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:"#ff00ff",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:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",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:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",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:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},a={length:{m:1,cm:.01,mm:.001,in:.0254,px:.0254/96,pt:.0254/72,pc:.0254/72*12},duration:{s:1,ms:.001},angle:{rad:1/(2*Math.PI),deg:1/360,grad:1/400,turn:1}},l={colors:s,unitConversions:a},u=function(){function e(){this.parent=null,this.visibilityBlocks=void 0,this.nodeVisible=void 0,this.rootNode=null,this.parsed=null;var e=this;Object.defineProperty(this,"currentFileInfo",{get:function(){return e.fileInfo()}}),Object.defineProperty(this,"index",{get:function(){return e.getIndex()}})}return e.prototype.setParent=function(t,n){function i(t){t&&t instanceof e&&(t.parent=n)}Array.isArray(t)?t.forEach(i):i(t)},e.prototype.getIndex=function(){return this._index||this.parent&&this.parent.getIndex()||0},e.prototype.fileInfo=function(){return this._fileInfo||this.parent&&this.parent.fileInfo()||{}},e.prototype.isRulesetLike=function(){return!1},e.prototype.toCSS=function(e){var t=[];return this.genCSS(e,{add:function(e,n,i){t.push(e)},isEmpty:function(){return 0===t.length}}),t.join("")},e.prototype.genCSS=function(e,t){t.add(this.value)},e.prototype.accept=function(e){this.value=e.visit(this.value)},e.prototype.eval=function(){return this},e.prototype._operate=function(e,t,n,i){switch(t){case"+":return n+i;case"-":return n-i;case"*":return n*i;case"/":return n/i}},e.prototype.fround=function(e,t){var n=e&&e.numPrecision;return n?Number((t+2e-16).toFixed(n)):t},e.compare=function(t,n){if(t.compare&&"Quoted"!==n.type&&"Anonymous"!==n.type)return t.compare(n);if(n.compare)return-n.compare(t);if(t.type===n.type){if(t=t.value,n=n.value,!Array.isArray(t))return t===n?0:void 0;if(t.length===n.length){for(var i=0;it?1:void 0},e.prototype.blocksVisibility=function(){return null==this.visibilityBlocks&&(this.visibilityBlocks=0),0!==this.visibilityBlocks},e.prototype.addVisibilityBlock=function(){null==this.visibilityBlocks&&(this.visibilityBlocks=0),this.visibilityBlocks=this.visibilityBlocks+1},e.prototype.removeVisibilityBlock=function(){null==this.visibilityBlocks&&(this.visibilityBlocks=0),this.visibilityBlocks=this.visibilityBlocks-1},e.prototype.ensureVisibility=function(){this.nodeVisible=!0},e.prototype.ensureInvisibility=function(){this.nodeVisible=!1},e.prototype.isVisible=function(){return this.nodeVisible},e.prototype.visibilityInfo=function(){return{visibilityBlocks:this.visibilityBlocks,nodeVisible:this.nodeVisible}},e.prototype.copyVisibilityInfo=function(e){e&&(this.visibilityBlocks=e.visibilityBlocks,this.nodeVisible=e.nodeVisible)},e}(),c=function(e,t){return(c=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};function h(e,t){function n(){this.constructor=e}c(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var f=function(){return(f=Object.assign||function(e){for(var t,n=1,i=arguments.length;n=6?(r.rgb=[],t.match(/.{2}/g).map((function(e,t){t<3?o.rgb.push(parseInt(e,16)):o.alpha=parseInt(e,16)/255}))):(r.rgb=[],t.split("").map((function(e,t){t<3?o.rgb.push(parseInt(e+e,16)):o.alpha=parseInt(e+e,16)/255}))),r.alpha=r.alpha||("number"==typeof n?n:1),void 0!==i&&(r.value=i),r}return h(t,e),t.prototype.luma=function(){var e=this.rgb[0]/255,t=this.rgb[1]/255,n=this.rgb[2]/255;return.2126*(e=e<=.03928?e/12.92:Math.pow((e+.055)/1.055,2.4))+.7152*(t=t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4))+.0722*(n=n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4))},t.prototype.genCSS=function(e,t){t.add(this.toCSS(e))},t.prototype.toCSS=function(e,t){var n,i,r,o=e&&e.compress&&!t,s=[];if(i=this.fround(e,this.alpha),this.value)if(0===this.value.indexOf("rgb"))i<1&&(r="rgba");else{if(0!==this.value.indexOf("hsl"))return this.value;r=i<1?"hsla":"hsl"}else i<1&&(r="rgba");switch(r){case"rgba":s=this.rgb.map((function(e){return v(Math.round(e),255)})).concat(v(i,1));break;case"hsla":s.push(v(i,1));case"hsl":n=this.toHSL(),s=[this.fround(e,n.h),this.fround(e,100*n.s)+"%",this.fround(e,100*n.l)+"%"].concat(s)}if(r)return r+"("+s.join(","+(o?"":" "))+")";if(n=this.toRGB(),o){var a=n.split("");a[1]===a[2]&&a[3]===a[4]&&a[5]===a[6]&&(n="#"+a[1]+a[3]+a[5])}return n},t.prototype.operate=function(e,n,i){for(var r=new Array(3),o=this.alpha*(1-i.alpha)+i.alpha,s=0;s<3;s++)r[s]=this._operate(e,n,this.rgb[s],i.rgb[s]);return new t(r,o)},t.prototype.toRGB=function(){return d(this.rgb)},t.prototype.toHSL=function(){var e,t,n=this.rgb[0]/255,i=this.rgb[1]/255,r=this.rgb[2]/255,o=this.alpha,s=Math.max(n,i,r),a=Math.min(n,i,r),l=(s+a)/2,u=s-a;if(s===a)e=t=0;else{switch(t=l>.5?u/(2-s-a):u/(s+a),s){case n:e=(i-r)/u+(i=0&&"\n"!==t.charAt(n);)r++;return"number"==typeof e&&(i=(t.slice(0,e).match(/\n/g)||"").length),{line:i,column:r}}function k(e){var t,n=e.length,i=new Array(n);for(t=0;t|Function):(\d+):(\d+)/,V=function(e,t,n){Error.call(this);var i=e.filename||n;if(this.message=e.message,this.stack=e.stack,t&&i){var r=t.contents[i],o=C(e.index,r),s=o.line,a=o.column,l=e.call&&C(e.call,r).line,u=r?r.split("\n"):"";if(this.type=e.type||"Syntax",this.filename=i,this.index=e.index,this.line="number"==typeof s?s+1:null,this.column=a,!this.line&&this.stack){var c=this.stack.match(R),h=new Function("a","throw new Error()"),f=0;try{h()}catch(e){var p=e.stack.match(R);f=1-(s=parseInt(p[2]))}c&&(c[2]&&(this.line=parseInt(c[2])+f),c[3]&&(this.column=parseInt(c[3])))}this.callLine=l+1,this.callExtract=u[l],this.extract=[u[this.line-2],u[this.line-1],u[this.line]]}};if(void 0===Object.create){var F=function(){};F.prototype=Error.prototype,V.prototype=new F}else V.prototype=Object.create(Error.prototype);V.prototype.constructor=V,V.prototype.toString=function(e){e=e||{};var t="",n=this.extract||[],i=[],r=function(e){return e};if(e.stylize){var o=typeof e.stylize;if("function"!==o)throw Error("options.stylize should be a function, got a "+o+"!");r=e.stylize}if(null!==this.line){if("string"==typeof n[0]&&i.push(r(this.line-1+" "+n[0],"grey")),"string"==typeof n[1]){var s=this.line+" ";n[1]&&(s+=n[1].slice(0,this.column)+r(r(r(n[1].substr(this.column,1),"bold")+n[1].slice(this.column+1),"red"),"inverse")),i.push(s)}"string"==typeof n[2]&&i.push(r(this.line+1+" "+n[2],"grey")),i=i.join("\n")+r("","reset")+"\n"}return t+=r(this.type+"Error: "+this.message,"red"),this.filename&&(t+=r(" in ","red")+this.filename),this.line&&(t+=r(" on line "+this.line+", column "+(this.column+1)+":","grey")),t+="\n"+i,this.callLine&&(t+=r("from ","red")+(this.filename||"")+"/n",t+=r(this.callLine,"grey")+" "+this.callExtract+"/n"),t};var $=function(e){function t(t,n,i,r,o,s){var a=e.call(this)||this;return a.extendList=n,a.condition=i,a.evaldCondition=!i,a._index=r,a._fileInfo=o,a.elements=a.getElements(t),a.mixinElements_=void 0,a.copyVisibilityInfo(s),a.setParent(a.elements,a),a}return h(t,e),t.prototype.accept=function(e){this.elements&&(this.elements=e.visitArray(this.elements)),this.extendList&&(this.extendList=e.visitArray(this.extendList)),this.condition&&(this.condition=e.visit(this.condition))},t.prototype.createDerived=function(e,n,i){var r=new t(e=this.getElements(e),n||this.extendList,null,this.getIndex(),this.fileInfo(),this.visibilityInfo());return r.evaldCondition=null!=i?i:this.evaldCondition,r.mediaEmpty=this.mediaEmpty,r},t.prototype.getElements=function(e){return e?("string"==typeof e&&this.parse.parseNode(e,["selector"],this._index,this._fileInfo,(function(t,n){if(t)throw new V({index:t.index,message:t.message},this.parse.imports,this._fileInfo.filename);e=n[0].elements})),e):[new b("","&",!1,this._index,this._fileInfo)]},t.prototype.createEmptySelectors=function(){var e=[new t([new b("","&",!1,this._index,this._fileInfo)],null,null,this._index,this._fileInfo)];return e[0].mediaEmpty=!0,e},t.prototype.match=function(e){var t,n,i=this.elements,r=i.length;if(0===(t=(e=e.mixinElements()).length)||rw.PARENS_DIVISION)||this.parensStack&&this.parensStack.length))},j.Eval.prototype.pathRequiresRewrite=function(e){return(this.rewriteUrls===S?J:W)(e)},j.Eval.prototype.rewritePath=function(e,t){var n;return t=t||"",n=this.normalizePath(t+e),J(e)&&W(t)&&!1===J(n)&&(n="./"+n),n},j.Eval.prototype.normalizePath=function(e){var t,n=e.split("/").reverse();for(e=[];0!==n.length;)switch(t=n.pop()){case".":break;case"..":0===e.length||".."===e[e.length-1]?e.push(t):e.pop();break;default:e.push(t)}return e.join("/")};var H=function e(t){return{_data:{},add:function(e,t){e=e.toLowerCase(),this._data.hasOwnProperty(e),this._data[e]=t},addMultiple:function(e){var t=this;Object.keys(e).forEach((function(n){t.add(n,e[n])}))},get:function(e){return this._data[e]||t&&t.get(e)},getLocalFunctions:function(){return this._data},inherit:function(){return e(this)},create:function(t){return e(t)}}}(null),Q={eval:function(){var e=this.value_,t=this.error_;if(t)throw t;if(null!=e)return e?L.True:L.False},value:function(e){this.value_=e},error:function(e){this.error_=e},reset:function(){this.value_=this.error_=null}},K=function(e){function t(t,n,i,r){var o=e.call(this)||this;return o.selectors=t,o.rules=n,o._lookups={},o._variables=null,o._properties=null,o.strictImports=i,o.copyVisibilityInfo(r),o.allowRoot=!0,o.setParent(o.selectors,o),o.setParent(o.rules,o),o}return h(t,e),t.prototype.isRulesetLike=function(){return!0},t.prototype.accept=function(e){this.paths?this.paths=e.visitArray(this.paths,!0):this.selectors&&(this.selectors=e.visitArray(this.selectors)),this.rules&&this.rules.length&&(this.rules=e.visitArray(this.rules))},t.prototype.eval=function(e){var n,i,r,o,s,a=!1;if(this.selectors&&(i=this.selectors.length)){for(n=new Array(i),Q.error({type:"Syntax",message:"it is currently only allowed in parametric mixin guards,"}),o=0;o0;e--){var t=this.rules[e-1];if(t instanceof B)return this.parseValue(t)}},t.prototype.parseValue=function(e){var t=this;function n(e){return e.value instanceof N&&!e.parsed?("string"==typeof e.value.value?this.parse.parseNode(e.value.value,["value","important"],e.value.getIndex(),e.fileInfo(),(function(t,n){t&&(e.parsed=!0),n&&(e.value=n[0],e.important=n[1]||"",e.parsed=!0)})):e.parsed=!0,e):e}if(Array.isArray(e)){var i=[];return e.forEach((function(e){i.push(n.call(t,e))})),i}return n.call(t,e)},t.prototype.rulesets=function(){if(!this.rules)return[];var e,t,n=[],i=this.rules;for(e=0;t=i[e];e++)t.isRuleset&&n.push(t);return n},t.prototype.prependRule=function(e){var t=this.rules;t?t.unshift(e):this.rules=[e],this.setParent(e,this)},t.prototype.find=function(e,t,n){t=t||this;var i,r,o=[],s=e.toCSS();return s in this._lookups?this._lookups[s]:(this.rulesets().forEach((function(s){if(s!==t)for(var a=0;ai){if(!n||n(s)){r=s.find(new $(e.elements.slice(i)),t,n);for(var l=0;l0&&t.add(l),e.firstSelector=!0,s[0].genCSS(e,t),e.firstSelector=!1,i=1;i0?(o=(r=k(e)).pop(),s=i.createDerived(k(o.elements))):s=i.createDerived([]),t.length>0){var a=n.combinator,l=t[0].elements[0];a.emptyOrWhitespace&&!l.combinator.emptyOrWhitespace&&(a=l.combinator),s.elements.push(new b(a,l.value,n.isVariable,n._index,n._fileInfo)),s.elements=s.elements.concat(t[0].elements.slice(1))}if(0!==s.elements.length&&r.push(s),t.length>1){var u=t.slice(1);u=u.map((function(e){return e.createDerived(e.elements,[])})),r=r.concat(u)}return r}function s(e,t,n,i,r){var s;for(s=0;s0?i[i.length-1]=i[i.length-1].createDerived(i[i.length-1].elements.concat(e)):i.push(new $(e));else t.push([new $(e)])}function l(e,t){var n=t.createDerived(t.elements,t.extendList,t.evaldCondition);return n.copyVisibilityInfo(e),n}var u,c;if(!function e(t,n,l){var u,c,h,f,p,v,d,g,y,w,x,S,I=!1;for(f=[],p=[[]],u=0;g=l.elements[u];u++)if("&"!==g.value){var C=(S=void 0,(x=g).value instanceof m&&(S=x.value.value)instanceof $?S:null);if(null!=C){a(f,p);var k,_=[],A=[];for(k=e(_,n,C),I=I||k,h=0;h<_.length;h++){s(p,[r(i(_[h],g),g)],g,l,A)}p=A,f=[]}else f.push(g)}else{for(I=!0,v=[],a(f,p),c=0;c0&&d[0].elements.push(new b(g.combinator,"",g.isVariable,g._index,g._fileInfo)),v.push(d);else for(h=0;h0&&(t.push(p[u]),w=p[u][y-1],p[u][y-1]=w.createDerived(w.elements,l.extendList));return I}(c=[],t,n))if(t.length>0)for(c=[],u=0;u0)for(t=0;t-1e-6&&(i=n.toFixed(20).replace(/0+$/,"")),e&&e.compress){if(0===n&&this.unit.isLength())return void t.add(i);n>0&&n<1&&(i=i.substr(1))}t.add(i),this.unit.genCSS(e,t)},t.prototype.operate=function(e,n,i){var r=this._operate(e,n,this.value,i.value),o=this.unit.clone();if("+"===n||"-"===n)if(0===o.numerator.length&&0===o.denominator.length)o=i.unit.clone(),this.unit.backupUnit&&(o.backupUnit=this.unit.backupUnit);else if(0===i.unit.numerator.length&&0===o.denominator.length);else{if(i=i.convertTo(this.unit.usedUnits()),e.strictUnits&&i.unit.toString()!==o.toString())throw new Error("Incompatible units. Change the units or use the unit function. Bad units: '"+o.toString()+"' and '"+i.unit.toString()+"'.");r=this._operate(e,n,this.value,i.value)}else"*"===n?(o.numerator=o.numerator.concat(i.unit.numerator).sort(),o.denominator=o.denominator.concat(i.unit.denominator).sort(),o.cancel()):"/"===n&&(o.numerator=o.numerator.concat(i.unit.denominator).sort(),o.denominator=o.denominator.concat(i.unit.numerator).sort(),o.cancel());return new t(r,o)},t.prototype.compare=function(e){var n,i;if(e instanceof t){if(this.unit.isEmpty()||e.unit.isEmpty())n=this,i=e;else if(n=this.unify(),i=e.unify(),0!==n.unit.compare(i.unit))return;return u.numericCompare(n.value,i.value)}},t.prototype.unify=function(){return this.convertTo({length:"px",duration:"s",angle:"rad"})},t.prototype.convertTo=function(e){var n,i,r,o,s,l=this.value,u=this.unit.clone(),c={};if("string"==typeof e){for(n in a)a[n].hasOwnProperty(e)&&((c={})[n]=e);e=c}for(i in s=function(e,t){return r.hasOwnProperty(e)?(t?l/=r[e]/r[o]:l*=r[e]/r[o],o):e},e)e.hasOwnProperty(i)&&(o=e[i],r=a[i],u.map(s));return u.cancel(),new t(l,u)},t}(u);ee.prototype.type="Dimension";var te=w,ne=function(e){function t(t,n,i){var r=e.call(this)||this;return r.op=t.trim(),r.operands=n,r.isSpaced=i,r}return h(t,e),t.prototype.accept=function(e){this.operands=e.visitArray(this.operands)},t.prototype.eval=function(e){var n,i=this.operands[0].eval(e),r=this.operands[1].eval(e);if(e.isMathOn(this.op)){if(n="./"===this.op?"/":this.op,i instanceof ee&&r instanceof p&&(i=i.toColor()),r instanceof ee&&i instanceof p&&(r=r.toColor()),!i.operate){if(i instanceof t&&"/"===i.op&&e.math===te.PARENS_DIVISION)return new t(this.op,[i,r],this.isSpaced);throw{type:"Operation",message:"Operation on an invalid type"}}return i.operate(e,n,r)}return new t(this.op,[i,r],this.isSpaced)},t.prototype.genCSS=function(e,t){this.operands[0].genCSS(e,t),this.isSpaced&&t.add(" "),t.add(this.op),this.isSpaced&&t.add(" "),this.operands[1].genCSS(e,t)},t}(u);ne.prototype.type="Operation";var ie=function(e){function t(t,n){var i=e.call(this)||this;if(i.value=t,i.noSpacing=n,!t)throw new Error("Expression requires an array parameter");return i}return h(t,e),t.prototype.accept=function(e){this.value=e.visitArray(this.value)},t.prototype.eval=function(e){var n,i=e.isMathOn(),r=this.parens,o=!1;return r&&e.inParenthesis(),this.value.length>1?n=new t(this.value.map((function(t){return t.eval?t.eval(e):t})),this.noSpacing):1===this.value.length?(!this.value[0].parens||this.value[0].parensInOp||e.inCalc||(o=!0),n=this.value[0].eval(e)):n=this,r&&e.outOfParenthesis(),!this.parens||!this.parensInOp||i||o||n instanceof ee||(n=new m(n)),n},t.prototype.genCSS=function(e,t){for(var n=0;n1){var n=new $([],null,null,this.getIndex(),this.fileInfo()).createEmptySelectors();(t=new K(n,e.mediaBlocks)).multiMedia=!0,t.copyVisibilityInfo(this.visibilityInfo()),this.setParent(t,this)}return delete e.mediaBlocks,delete e.mediaPath,t},t.prototype.evalNested=function(e){var t,n,i=e.mediaPath.concat([this]);for(t=0;t0;t--)e.splice(t,0,new N("and"));return new ie(e)}))),this.setParent(this.features,this),new K([],[])},t.prototype.permute=function(e){if(0===e.length)return[];if(1===e.length)return e[0];for(var t=[],n=this.permute(e.slice(1)),i=0;i1?"["+e.value.map((function(e){return e.toCSS()})).join(", ")+"]":e.toCSS()},t}(u));pe.prototype.type="JavaScript";var ve=function(e){function t(t,n){var i=e.call(this)||this;return i.key=t,i.value=n,i}return h(t,e),t.prototype.accept=function(e){this.value=e.visit(this.value)},t.prototype.eval=function(e){return this.value.eval?new t(this.key,this.value.eval(e)):this},t.prototype.genCSS=function(e,t){t.add(this.key+"="),this.value.genCSS?this.value.genCSS(e,t):t.add(this.value)},t}(u);ve.prototype.type="Assignment";var de=function(e){function t(t,n,i,r,o){var s=e.call(this)||this;return s.op=t.trim(),s.lvalue=n,s.rvalue=i,s._index=r,s.negate=o,s}return h(t,e),t.prototype.accept=function(e){this.lvalue=e.visit(this.lvalue),this.rvalue=e.visit(this.rvalue)},t.prototype.eval=function(e){var t=function(e,t,n){switch(e){case"and":return t&&n;case"or":return t||n;default:switch(u.compare(t,n)){case-1:return"<"===e||"=<"===e||"<="===e;case 0:return"="===e||">="===e||"=<"===e||"<="===e;case 1:return">"===e||">="===e;default:return!1}}}(this.op,this.lvalue.eval(e),this.rvalue.eval(e));return this.negate?!t:t},t}(u);de.prototype.type="Condition";var me=function(e){function t(t){var n=e.call(this)||this;return n.value=t,n}return h(t,e),t}(u);me.prototype.type="UnicodeDescriptor";var ge=function(e){function t(t){var n=e.call(this)||this;return n.value=t,n}return h(t,e),t.prototype.genCSS=function(e,t){t.add("-"),this.value.genCSS(e,t)},t.prototype.eval=function(e){return e.isMathOn()?new ne("*",[new ee(-1),this.value]).eval(e):new t(this.value.eval(e))},t}(u);ge.prototype.type="Negative";var ye=function(e){function t(n,i,r,o,s){var a=e.call(this)||this;switch(a.selector=n,a.option=i,a.object_id=t.next_id++,a.parent_ids=[a.object_id],a._index=r,a._fileInfo=o,a.copyVisibilityInfo(s),a.allowRoot=!0,i){case"all":a.allowBefore=!0,a.allowAfter=!0;break;default:a.allowBefore=!1,a.allowAfter=!1}return a.setParent(a.selector,a),a}return h(t,e),t.prototype.accept=function(e){this.selector=e.visit(this.selector)},t.prototype.eval=function(e){return new t(this.selector.eval(e),this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},t.prototype.clone=function(e){return new t(this.selector,this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},t.prototype.findSelfSelectors=function(e){var t,n,i=[];for(t=0;t0&&n.length&&""===n[0].combinator.value&&(n[0].combinator.value=" "),i=i.concat(e[t].elements);this.selfSelectors=[new $(i)],this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo())},t}(u);ye.next_id=0,ye.prototype.type="Extend";var be=function(e){function t(t,n,i){var r=e.call(this)||this;return r.variable=t,r._index=n,r._fileInfo=i,r.allowRoot=!0,r}return h(t,e),t.prototype.eval=function(e){var t,n=new se(this.variable,this.getIndex(),this.fileInfo()).eval(e),i=new V({message:"Could not evaluate variable call "+this.variable});if(!n.ruleset){if(n.rules)t=n;else if(Array.isArray(n))t=new K("",n);else{if(!Array.isArray(n.value))throw i;t=new K("",n.value)}n=new X(t)}if(n.ruleset)return n.callEval(e);throw i},t}(u);be.prototype.type="VariableCall";var we=function(e){function t(t,n,i,r){var o=e.call(this)||this;return o.value=t,o.lookups=n,o._index=i,o._fileInfo=r,o}return h(t,e),t.prototype.eval=function(e){var t,n,i=this.value.eval(e);for(t=0;tthis.params.length)return!1}n=Math.min(o,this.arity);for(var s=0;s0){for(c=!0,a=0;a0)f=2;else if(f=1,p[1]+p[2]>1)throw{type:"Runtime",message:"Ambiguous use of `default()` found when matching for `"+this.format(m)+"`",index:this.getIndex(),filename:this.fileInfo().filename};for(a=0;a0&&(e=e.slice(0,t)),(t=e.lastIndexOf("/"))<0&&(t=e.lastIndexOf("\\")),t<0?"":e.slice(0,t+1)},e.prototype.tryAppendExtension=function(e,t){return/(\.[a-z]*$)|([\?;].*)$/.test(e)?e:e+t},e.prototype.tryAppendLessExtension=function(e){return this.tryAppendExtension(e,".less")},e.prototype.supportsSync=function(){return!1},e.prototype.alwaysMakePathsAbsolute=function(){return!1},e.prototype.isPathAbsolute=function(e){return/^(?:[a-z-]+:|\/|\\|#)/i.test(e)},e.prototype.join=function(e,t){return e?e+t:t},e.prototype.pathDiff=function(e,t){var n,i,r,o,s=this.extractUrlParts(e),a=this.extractUrlParts(t),l="";if(s.hostPart!==a.hostPart)return"";for(i=Math.max(a.directories.length,s.directories.length),n=0;nparseInt(t[n])?-1:1;return 0},e.prototype.versionToString=function(e){for(var t="",n=0;n0;){var e=this.imports[0];if(!e.isReady)return;this.imports=this.imports.slice(1),e.callback.apply(null,e.args)}if(0===this.variableImports.length)break;var t=this.variableImports[0];this.variableImports=this.variableImports.slice(1),t()}}finally{this._currentDepth--}0===this._currentDepth&&this._onSequencerEmpty&&this._onSequencerEmpty()},e}(),Re=function(e,t){this._visitor=new Ee(this),this._importer=e,this._finish=t,this.context=new j.Eval,this.importCount=0,this.onceFileDetectionMap={},this.recursionDetector={},this._sequencer=new Pe(this._onSequencerEmpty.bind(this))};Re.prototype={isReplacing:!1,run:function(e){try{this._visitor.visit(e)}catch(e){this.error=e}this.isFinished=!0,this._sequencer.tryRun()},_onSequencerEmpty:function(){this.isFinished&&this._finish(this.error)},visitImport:function(e,t){var n=e.options.inline;if(!e.css||n){var i=new j.Eval(this.context,k(this.context.frames)),r=i.frames[0];this.importCount++,e.isVariableImport()?this._sequencer.addVariableImport(this.processImportNode.bind(this,e,i,r)):this.processImportNode(e,i,r)}t.visitDeeper=!1},processImportNode:function(e,t,n){var i,r=e.options.inline;try{i=e.evalForImport(t)}catch(t){t.filename||(t.index=e.getIndex(),t.filename=e.fileInfo().filename),e.css=!0,e.error=t}if(!i||i.css&&!r)this.importCount--,this.isFinished&&this._sequencer.tryRun();else{i.options.multiple&&(t.importMultiple=!0);for(var o=void 0===i.css,s=0;s=0||(a=[u.selfSelectors[0]],(o=f.findMatch(l,a)).length&&(l.hasFoundMatches=!0,l.selfSelectors.forEach((function(e){var t=u.visibilityInfo();s=f.extendSelector(o,a,e,l.isVisible()),(c=new Ie.Extend(u.selector,u.option,0,u.fileInfo(),t)).selfSelectors=s,s[s.length-1].extendList=[c],h.push(c),c.ruleset=u.ruleset,c.parent_ids=c.parent_ids.concat(u.parent_ids,l.parent_ids),u.firstExtendOnThisSelectorPath&&(c.firstExtendOnThisSelectorPath=!0,u.ruleset.paths.push(s))}))));if(h.length){if(this.extendChainCount++,n>100){var p="{unable to calculate}",v="{unable to calculate}";try{p=h[0].selfSelectors[0].toCSS(),v=h[0].selector.toCSS()}catch(e){}throw{message:"extend circular reference detected. One of the circular extends is currently:"+p+":extend("+v+")"}}return h.concat(f.doExtendChaining(h,t,n+1))}return h},e.prototype.visitDeclaration=function(e,t){t.visitDeeper=!1},e.prototype.visitMixinDefinition=function(e,t){t.visitDeeper=!1},e.prototype.visitSelector=function(e,t){t.visitDeeper=!1},e.prototype.visitRuleset=function(e,t){if(!e.root){var n,i,r,o,s=this.allExtendsStack[this.allExtendsStack.length-1],a=[],l=this;for(r=0;r0&&u[l.matched].combinator.value!==s?l=null:l.matched++,l&&(l.finished=l.matched===u.length,l.finished&&!e.allowAfter&&(r+1u&&c>0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[u].elements.slice(c)),c=0,u++),l=o.elements.slice(c,a.index).concat([s]).concat(n.elements.slice(1)),u===a.pathIndex&&r>0?h[h.length-1].elements=h[h.length-1].elements.concat(l):(h=h.concat(t.slice(u,a.pathIndex))).push(new Ie.Selector(l)),u=a.endPathIndex,(c=a.endPathElementIndex)>=t[u].elements.length&&(c=0,u++);return u0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[u].elements.slice(c)),u++),h=(h=h.concat(t.slice(u,t.length))).map((function(e){var t=e.createDerived(e.elements);return i?t.ensureVisibility():t.ensureInvisibility(),t}))},e.prototype.visitMedia=function(e,t){var n=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);n=n.concat(this.doExtendChaining(n,e.allExtends)),this.allExtendsStack.push(n)},e.prototype.visitMediaOut=function(e){var t=this.allExtendsStack.length-1;this.allExtendsStack.length=t},e.prototype.visitAtRule=function(e,t){var n=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);n=n.concat(this.doExtendChaining(n,e.allExtends)),this.allExtendsStack.push(n)},e.prototype.visitAtRuleOut=function(e){var t=this.allExtendsStack.length-1;this.allExtendsStack.length=t},e}(),Oe=function(){function e(){this.contexts=[[]],this._visitor=new Ee(this)}return e.prototype.run=function(e){return this._visitor.visit(e)},e.prototype.visitDeclaration=function(e,t){t.visitDeeper=!1},e.prototype.visitMixinDefinition=function(e,t){t.visitDeeper=!1},e.prototype.visitRuleset=function(e,t){var n,i=this.contexts[this.contexts.length-1],r=[];this.contexts.push(r),e.root||((n=e.selectors)&&(n=n.filter((function(e){return e.getIsOutput()})),e.selectors=n.length?n:n=null,n&&e.joinSelectors(r,i,n)),n||(e.rules=null),e.paths=r)},e.prototype.visitRulesetOut=function(e){this.contexts.length=this.contexts.length-1},e.prototype.visitMedia=function(e,t){var n=this.contexts[this.contexts.length-1];e.rules[0].root=0===n.length||n[0].multiMedia},e.prototype.visitAtRule=function(e,t){var n=this.contexts[this.contexts.length-1];e.rules&&e.rules.length&&(e.rules[0].root=e.isRooted||0===n.length||null)},e}(),Le=function(){function e(e){this._visitor=new Ee(this),this._context=e}return e.prototype.containsSilentNonBlockedChild=function(e){var t;if(!e)return!1;for(var n=0;n0},e.prototype.resolveVisibility=function(e,t){if(!e.blocksVisibility()){if(this.isEmpty(e)&&!this.containsSilentNonBlockedChild(t))return;return e}var n=e.rules[0];if(this.keepOnlyVisibleChilds(n),!this.isEmpty(n))return e.ensureVisibility(),e.removeVisibilityBlock(),e},e.prototype.isVisibleRuleset=function(e){return!!e.firstRoot||!this.isEmpty(e)&&!(!e.root&&!this.hasVisibleSelector(e))},e}(),Ne=function(e){this._visitor=new Ee(this),this._context=e,this.utils=new Le(e)};Ne.prototype={isReplacing:!0,run:function(e){return this._visitor.visit(e)},visitDeclaration:function(e,t){if(!e.blocksVisibility()&&!e.variable)return e},visitMixinDefinition:function(e,t){e.frames=[]},visitExtend:function(e,t){},visitComment:function(e,t){if(!e.blocksVisibility()&&!e.isSilent(this._context))return e},visitMedia:function(e,t){var n=e.rules[0].rules;return e.accept(this._visitor),t.visitDeeper=!1,this.utils.resolveVisibility(e,n)},visitImport:function(e,t){if(!e.blocksVisibility())return e},visitAtRule:function(e,t){return e.rules&&e.rules.length?this.visitAtRuleWithBody(e,t):this.visitAtRuleWithoutBody(e,t)},visitAnonymous:function(e,t){if(!e.blocksVisibility())return e.accept(this._visitor),e},visitAtRuleWithBody:function(e,t){var n=function(e){var t=e.rules;return function(e){var t=e.rules;return 1===t.length&&(!t[0].paths||0===t[0].paths.length)}(e)?t[0].rules:t}(e);return e.accept(this._visitor),t.visitDeeper=!1,this.utils.isEmpty(e)||this._mergeRules(e.rules[0].rules),this.utils.resolveVisibility(e,n)},visitAtRuleWithoutBody:function(e,t){if(!e.blocksVisibility()){if("@charset"===e.name){if(this.charset){if(e.debugInfo){var n=new Ie.Comment("/* "+e.toCSS(this._context).replace(/\n/g,"")+" */\n");return n.debugInfo=e.debugInfo,this._visitor.visit(n)}return}this.charset=!0}return e}},checkValidNodes:function(e,t){if(e)for(var n=0;n0?e.accept(this._visitor):e.rules=null,t.visitDeeper=!1}return e.rules&&(this._mergeRules(e.rules),this._removeDuplicateRules(e.rules)),this.utils.isVisibleRuleset(e)&&(e.ensureVisibility(),i.splice(0,0,e)),1===i.length?i[0]:i},_compileRulesetPaths:function(e){e.paths&&(e.paths=e.paths.filter((function(e){var t;for(" "===e[0].elements[0].combinator.value&&(e[0].elements[0].combinator=new Ie.Combinator("")),t=0;t=0;i--)if((n=e[i])instanceof Ie.Declaration)if(r[n.name]){(t=r[n.name])instanceof Ie.Declaration&&(t=r[n.name]=[r[n.name].toCSS(this._context)]);var o=n.toCSS(this._context);-1!==t.indexOf(o)?e.splice(i,1):t.push(o)}else r[n.name]=n}},_mergeRules:function(e){if(e){for(var t={},n=[],i=0;i0){var t=e[0],n=[],i=[new Ie.Expression(n)];e.forEach((function(e){"+"===e.merge&&n.length>0&&i.push(new Ie.Expression(n=[])),n.push(e.value),t.important=t.important||e.important})),t.value=new Ie.Value(i)}}))}}};var De={Visitor:Ee,ImportVisitor:Re,MarkVisibleSelectorsVisitor:Ve,ExtendVisitor:$e,JoinSelectorVisitor:Oe,ToCSSVisitor:Ne};var Be=function(){var e,t,n,i,r,o,s,a=[],l={};function u(n){for(var i,a,c,h=l.i,f=t,p=l.i-s,v=l.i+o.length-p,d=l.i+=n,m=e;l.i=0){c={index:l.i,text:m.substr(l.i,y+2-l.i),isLineComment:!1},l.i+=c.text.length-1,l.commentStore.push(c);continue}}break}if(32!==i&&10!==i&&9!==i&&13!==i)break}if(o=o.slice(n+l.i-d+p),s=l.i,!o.length){if(tn||l.i===n&&e&&!i)&&(n=l.i,i=e);var r=a.pop();o=r.current,s=l.i=r.i,t=r.j},l.forget=function(){a.pop()},l.isWhitespace=function(t){var n=l.i+(t||0),i=e.charCodeAt(n);return 32===i||13===i||9===i||10===i},l.$re=function(e){l.i>s&&(o=o.slice(l.i-s),s=l.i);var t=e.exec(o);return t?(u(t[0].length),"string"==typeof t?t:1===t.length?t[0]:t):null},l.$char=function(t){return e.charAt(l.i)!==t?null:(u(1),t)},l.$str=function(t){for(var n=t.length,i=0;ih&&(d=!1)}}while(d);return r||null},l.autoCommentAbsorb=!0,l.commentStore=[],l.finished=!1,l.peek=function(t){if("string"==typeof t){for(var n=0;n57||t<43||47===t||44===t},l.start=function(i,a,c){e=i,l.i=t=s=n=0,r=a?function(e,t){var n,i,r,o,s,a,l,u,c,h=e.length,f=0,p=0,v=[],d=0;function m(t){var n=s-d;n<512&&!t||!n||(v.push(e.slice(d,s+1)),d=s+1)}for(s=0;s=97&&l<=122||l<34))switch(l){case 40:p++,i=s;continue;case 41:if(--p<0)return t("missing opening `(`",s);continue;case 59:p||m();continue;case 123:f++,n=s;continue;case 125:if(--f<0)return t("missing opening `{`",s);f||p||m();continue;case 92:if(s96)){if(u==l){c=1;break}if(92==u){if(s==h-1)return t("unescaped `\\`",s);s++}}if(c)continue;return t("unmatched `"+String.fromCharCode(l)+"`",a);case 47:if(p||s==h-1)continue;if(47==(u=e.charCodeAt(s+1)))for(s+=2;sn&&o>r?"missing closing `}` or `*/`":"missing closing `}`",n):0!==p?t("missing closing `)`",i):(m(!0),v)}(i,c):[i],o=r[0],u(0)},l.end=function(){var t,r=l.i>=e.length;return l.i=e.length-1,furthestChar:e[l.i]}},l},Ue=function e(t,n,i){var r,o=Be();function s(e,t){throw new V({index:o.i,filename:i.filename,type:t||"Syntax",message:e},n)}function a(e,t){var n=e instanceof Function?e.call(r):o.$re(e);if(n)return n;s(t||("string"==typeof e?"expected '"+e+"' got '"+o.currentChar()+"'":"unexpected token"))}function l(e,t){if(o.$char(e))return e;s(t||"expected '"+e+"' got '"+o.currentChar()+"'")}function u(e){var t=i.filename;return{lineNumber:C(e,o.getInput()).line+1,fileName:t}}return{parserInput:o,imports:n,fileInfo:i,parseNode:function(e,t,i,s,a){var l,u=[],c=o;try{c.start(e,!1,(function(e,t){a({message:e,index:t+i})}));for(var h=0,f=void 0,p=void 0;f=t[h];h++)if(p=c.i,l=r[f]()){try{l._index=p+i,l._fileInfo=s}catch(e){}u.push(l)}else u.push(null);c.end().isFinished?a(null,u):a(!0,null)}catch(e){throw new V({index:e.index+i,message:e.message},n,s.filename)}},parse:function(r,s,a){var l,u,c,h,f=null,p="";if(u=a&&a.globalVars?e.serializeVars(a.globalVars)+"\n":"",c=a&&a.modifyVars?"\n"+e.serializeVars(a.modifyVars):"",t.pluginManager)for(var v=t.pluginManager.getPreProcessors(),d=0;d");return e},args:function(e){var t,n,i,a,l,u,c,h=r.entities,f={args:null,variadic:!1},p=[],v=[],d=[],m=!0;for(o.save();;){if(e)u=r.detachedRuleset()||r.expression();else{if(o.commentStore.length=0,o.$str("...")){f.variadic=!0,o.$char(";")&&!t&&(t=!0),(t?v:d).push({variadic:!0});break}u=h.variable()||h.property()||h.literal()||h.keyword()||this.call(!0)}if(!u||!m)break;a=null,u.throwAwayComments&&u.throwAwayComments(),l=u;var g=null;if(e?u.value&&1==u.value.length&&(g=u.value[0]):g=u,g&&(g instanceof Ie.Variable||g instanceof Ie.Property))if(o.$char(":")){if(p.length>0&&(t&&s("Cannot mix ; and , as delimiter types"),n=!0),!(l=r.detachedRuleset()||r.expression())){if(!e)return o.restore(),f.args=[],f;s("could not understand value for named argument")}a=i=g.name}else if(o.$str("...")){if(!e){f.variadic=!0,o.$char(";")&&!t&&(t=!0),(t?v:d).push({name:u.name,variadic:!0});break}c=!0}else e||(i=a=g.name,l=null);l&&p.push(l),d.push({name:a,value:l,expand:c}),o.$char(",")?m=!0:((m=";"===o.$char(";"))||t)&&(n&&s("Cannot mix ; and , as delimiter types"),t=!0,p.length>1&&(l=new Ie.Value(p)),v.push({name:i,value:l,expand:c}),i=null,p=[],n=!1)}return o.forget(),f.args=t?v:d,f},definition:function(){var e,t,n,i,s=[],l=!1;if(!("."!==o.currentChar()&&"#"!==o.currentChar()||o.peek(/^[^{]*\}/)))if(o.save(),t=o.$re(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/)){e=t[1];var u=this.args(!1);if(s=u.args,l=u.variadic,!o.$char(")"))return void o.restore("Missing closing ')'");if(o.commentStore.length=0,o.$str("when")&&(i=a(r.conditions,"expected condition")),n=r.block())return o.forget(),new Ie.mixin.Definition(e,s,n,i,l);o.restore()}else o.restore()},ruleLookups:function(){var e,t=[];if("["===o.currentChar()){for(;;){if(o.save(),!(e=this.lookupValue())&&""!==e){o.restore();break}t.push(e),o.forget()}return t.length>0?t:void 0}},lookupValue:function(){if(o.save(),o.$char("[")){var e=o.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);if(o.$char("]"))return e||""===e?(o.forget(),e):void o.restore();o.restore()}else o.restore()}},entity:function(){var e=this.entities;return this.comment()||e.literal()||e.variable()||e.url()||e.property()||e.call()||e.keyword()||this.mixin.call(!0)||e.javascript()},end:function(){return o.$char(";")||o.peek("}")},ieAlpha:function(){var e;if(o.$re(/^opacity=/i))return(e=o.$re(/^\d+/))||(e="@{"+(e=a(r.entities.variable,"Could not parse alpha")).name.slice(1)+"}"),l(")"),new Ie.Quoted("","alpha(opacity="+e+")")},element:function(){var e,t,n,r=o.i;if(t=this.combinator(),(e=o.$re(/^(?:\d+\.\d+|\d+)%/)||o.$re(/^(?:[.#]?|:*)(?:[\w-]|[^\x00-\x9f]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/)||o.$char("*")||o.$char("&")||this.attribute()||o.$re(/^\([^&()@]+\)/)||o.$re(/^[\.#:](?=@)/)||this.entities.variableCurly())||(o.save(),o.$char("(")?(n=this.selector(!1))&&o.$char(")")?(e=new Ie.Paren(n),o.forget()):o.restore("Missing closing ')'"):o.forget()),e)return new Ie.Element(t,e,e instanceof Ie.Variable,r,i)},combinator:function(){var e=o.currentChar();if("/"===e){o.save();var t=o.$re(/^\/[a-z]+\//i);if(t)return o.forget(),new Ie.Combinator(t);o.restore()}if(">"===e||"+"===e||"~"===e||"|"===e||"^"===e){for(o.i++,"^"===e&&"^"===o.currentChar()&&(e="^^",o.i++);o.isWhitespace();)o.i++;return new Ie.Combinator(e)}return o.isWhitespace(-1)?new Ie.Combinator(" "):new Ie.Combinator(null)},selector:function(e){var t,n,r,l,u,c,h,f=o.i;for(e=!1!==e;(e&&(n=this.extend())||e&&(c=o.$str("when"))||(l=this.element()))&&(c?h=a(this.conditions,"expected condition"):h?s("CSS guard can only be used at the end of selector"):n?u=u?u.concat(n):n:(u&&s("Extend can only be used at the end of selector"),r=o.currentChar(),t?t.push(l):t=[l],l=null),"{"!==r&&"}"!==r&&";"!==r&&","!==r&&")"!==r););if(t)return new Ie.Selector(t,u,h,f,i);u&&s("Extend must be used to extend a selector, it cannot be used on its own")},selectors:function(){for(var e,t;(e=this.selector())&&(t?t.push(e):t=[e],o.commentStore.length=0,e.condition&&t.length>1&&s("Guards are only currently allowed on a single selector."),o.$char(","));)e.condition&&s("Guards are only currently allowed on a single selector."),o.commentStore.length=0;return t},attribute:function(){if(o.$char("[")){var e,t,n,i=this.entities;return(e=i.variableCurly())||(e=a(/^(?:[_A-Za-z0-9-\*]*\|)?(?:[_A-Za-z0-9-]|\\.)+/)),(n=o.$re(/^[|~*$^]?=/))&&(t=i.quoted()||o.$re(/^[0-9]+%/)||o.$re(/^[\w-]+/)||i.variableCurly()),l("]"),new Ie.Attribute(e,n,t)}},block:function(){var e;if(o.$char("{")&&(e=this.primary())&&o.$char("}"))return e},blockRuleset:function(){var e=this.block();return e&&(e=new Ie.Ruleset(null,e)),e},detachedRuleset:function(){var e,t,n;if(o.save(),!o.$re(/^[.#]\(/)||(t=(e=this.mixin.args(!1)).args,n=e.variadic,o.$char(")"))){var i=this.blockRuleset();if(i)return o.forget(),t?new Ie.mixin.Definition(null,t,i,null,n):new Ie.DetachedRuleset(i);o.restore()}else o.restore()},ruleset:function(){var e,n,i;if(o.save(),t.dumpLineNumbers&&(i=u(o.i)),(e=this.selectors())&&(n=this.block())){o.forget();var r=new Ie.Ruleset(e,n,t.strictImports);return t.dumpLineNumbers&&(r.debugInfo=i),r}o.restore()},declaration:function(){var e,t,n,r,s,a,l=o.i,u=o.currentChar();if("."!==u&&"#"!==u&&"&"!==u&&":"!==u)if(o.save(),e=this.variable()||this.ruleProperty()){if((a="string"==typeof e)&&(t=this.detachedRuleset())&&(n=!0),o.commentStore.length=0,!t){if(s=!a&&e.length>1&&e.pop().value,t=e[0].value&&"--"===e[0].value.slice(0,2)?this.permissiveValue():this.anonymousValue())return o.forget(),new Ie.Declaration(e,t,!1,s,l,i);t||(t=this.value()),t?r=this.important():a&&(t=this.permissiveValue())}if(t&&(this.end()||n))return o.forget(),new Ie.Declaration(e,t,r,s,l,i);o.restore()}else o.restore()},anonymousValue:function(){var e=o.i,t=o.$re(/^([^.#@\$+\/'"*`(;{}-]*);/);if(t)return new Ie.Anonymous(t[1],e)},permissiveValue:function(e){var t,n,r,a,l=e||";",u=o.i,c=[];function h(){var e=o.currentChar();return"string"==typeof l?e===l:l.test(e)}if(!h()){a=[];do{((n=this.comment())||(n=this.entity()))&&a.push(n)}while(n);if(r=h(),a.length>0){if(a=new Ie.Expression(a),r)return a;c.push(a)," "===o.prevChar()&&c.push(new Ie.Anonymous(" ",u))}if(o.save(),a=o.$parseUntil(l)){if("string"==typeof a&&s("Expected '"+a+"'","Parse"),1===a.length&&" "===a[0])return o.forget(),new Ie.Anonymous("",u);var f=void 0;for(t=0;t0)return new Ie.Expression(r)},mediaFeatures:function(){var e,t=this.entities,n=[];do{if(e=this.mediaFeature()){if(n.push(e),!o.$char(","))break}else if((e=t.variable()||t.mixinLookup())&&(n.push(e),!o.$char(",")))break}while(e);return n.length>0?n:null},media:function(){var e,n,r,a,l=o.i;if(t.dumpLineNumbers&&(a=u(l)),o.save(),o.$str("@media"))return e=this.mediaFeatures(),(n=this.block())||s("media definitions require block statements after any features"),o.forget(),r=new Ie.Media(n,e,l,i),t.dumpLineNumbers&&(r.debugInfo=a),r;o.restore()},plugin:function(){var e,t,n,r=o.i;if(o.$re(/^@plugin?\s+/)){if(n=(t=this.pluginArgs())?{pluginArgs:t,isPlugin:!0}:{isPlugin:!0},e=this.entities.quoted()||this.entities.url())return o.$char(";")||(o.i=r,s("missing semi-colon on @plugin")),new Ie.Import(e,null,n,r,i);o.i=r,s("malformed @plugin statement")}},pluginArgs:function(){if(o.save(),!o.$char("("))return o.restore(),null;var e=o.$re(/^\s*([^\);]+)\)\s*/);return e[1]?(o.forget(),e[1].trim()):(o.restore(),null)},atrule:function(){var e,n,r,a,l,c,h,f=o.i,p=!0,v=!0;if("@"===o.currentChar()){if(n=this.import()||this.plugin()||this.media())return n;if(o.save(),e=o.$re(/^@[a-z-]+/)){switch(a=e,"-"==e.charAt(1)&&e.indexOf("-",2)>0&&(a="@"+e.slice(e.indexOf("-",2)+1)),a){case"@charset":l=!0,p=!1;break;case"@namespace":c=!0,p=!1;break;case"@keyframes":case"@counter-style":l=!0;break;case"@document":case"@supports":h=!0,v=!1;break;default:h=!0}if(o.commentStore.length=0,l?(n=this.entity())||s("expected "+e+" identifier"):c?(n=this.expression())||s("expected "+e+" expression"):h&&(n=this.permissiveValue(/^[{;]/),p="{"===o.currentChar(),n?n.value||(n=null):p||";"===o.currentChar()||s(e+" rule is missing block or ending semi-colon")),p&&(r=this.blockRuleset()),r||!p&&n&&o.$char(";"))return o.forget(),new Ie.AtRule(e,n,r,f,i,t.dumpLineNumbers?u(f):null,v);o.restore("at-rule options not recognised")}}},value:function(){var e,t=[],n=o.i;do{if((e=this.expression())&&(t.push(e),!o.$char(",")))break}while(e);if(t.length>0)return new Ie.Value(t,n)},important:function(){if("!"===o.currentChar())return o.$re(/^! *important/)},sub:function(){var e,t;if(o.save(),o.$char("("))return(e=this.addition())&&o.$char(")")?(o.forget(),(t=new Ie.Expression([e])).parens=!0,t):void o.restore("Expected ')'");o.restore()},multiplication:function(){var e,t,n,i,r;if(e=this.operand()){for(r=o.isWhitespace(-1);!o.peek(/^\/[*\/]/);){if(o.save(),!(n=o.$char("/")||o.$char("*")||o.$str("./"))){o.forget();break}if(!(t=this.operand())){o.restore();break}o.forget(),e.parensInOp=!0,t.parensInOp=!0,i=new Ie.Operation(n,[i||e,t],r),r=o.isWhitespace(-1)}return i||e}},addition:function(){var e,t,n,i,r;if(e=this.multiplication()){for(r=o.isWhitespace(-1);(n=o.$re(/^[-+]\s+/)||!r&&(o.$char("+")||o.$char("-")))&&(t=this.multiplication());)e.parensInOp=!0,t.parensInOp=!0,i=new Ie.Operation(n,[i||e,t],r),r=o.isWhitespace(-1);return i||e}},conditions:function(){var e,t,n,i=o.i;if(e=this.condition(!0)){for(;o.peek(/^,\s*(not\s*)?\(/)&&o.$char(",")&&(t=this.condition(!0));)n=new Ie.Condition("or",n||e,t,i);return n||e}},condition:function(e){var t,n,i;if(t=this.conditionAnd(e)){if(n=o.$str("or")){if(!(i=this.condition(e)))return;t=new Ie.Condition(n,t,i)}return t}},conditionAnd:function(e){var t,n,i,r,s=this;if(t=(r=s.negatedCondition(e)||s.parenthesisCondition(e))||e?r:s.atomicCondition(e)){if(n=o.$str("and")){if(!(i=this.conditionAnd(e)))return;t=new Ie.Condition(n,t,i)}return t}},negatedCondition:function(e){if(o.$str("not")){var t=this.parenthesisCondition(e);return t&&(t.negate=!t.negate),t}},parenthesisCondition:function(e){var t;if(o.save(),o.$str("(")){if(t=function(t){var n;if(o.save(),n=t.condition(e)){if(o.$char(")"))return o.forget(),n;o.restore()}else o.restore()}(this))return o.forget(),t;if(t=this.atomicCondition(e)){if(o.$char(")"))return o.forget(),t;o.restore("expected ')' got '"+o.currentChar()+"'")}else o.restore()}else o.restore()},atomicCondition:function(e){var t,n,i,r,a=this.entities,l=o.i;function u(){return this.addition()||a.keyword()||a.quoted()||a.mixinLookup()}if(t=(u=u.bind(this))())return o.$char(">")?r=o.$char("=")?">=":">":o.$char("<")?r=o.$char("=")?"<=":"<":o.$char("=")&&(r=o.$char(">")?"=>":o.$char("<")?"=<":"="),r?(n=u())?i=new Ie.Condition(r,t,n,l,!1):s("expected expression"):i=new Ie.Condition("=",t,new Ie.Keyword("true"),l,!1),i},operand:function(){var e,t=this.entities;o.peek(/^-[@\$\(]/)&&(e=o.$char("-"));var n=this.sub()||t.dimension()||t.color()||t.variable()||t.property()||t.call()||t.quoted(!0)||t.colorKeyword()||t.mixinLookup();return e&&(n.parensInOp=!0,n=new Ie.Negative(n)),n},expression:function(){var e,t,n=[],i=o.i;do{(e=this.comment())?n.push(e):((e=this.addition()||this.entity())instanceof Ie.Comment&&(e=null),e&&(n.push(e),o.peek(/^\/[\/*]/)||(t=o.$char("/"))&&n.push(new Ie.Anonymous(t,i))))}while(e);if(n.length>0)return new Ie.Expression(n)},property:function(){var e=o.$re(/^(\*?-?[_a-zA-Z0-9-]+)\s*:/);if(e)return e[1]},ruleProperty:function(){var e,t,n=[],r=[];o.save();var s=o.$re(/^([_a-zA-Z0-9-]+)\s*:/);if(s)return n=[new Ie.Keyword(s[1])],o.forget(),n;function a(e){var t=o.i,i=o.$re(e);if(i)return r.push(t),n.push(i[1])}for(a(/^(\*?)/);a(/^((?:[\w-]+)|(?:[@\$]\{[\w-]+\}))/););if(n.length>1&&a(/^((?:\+_|\+)?)\s*:/)){for(o.forget(),""===n[0]&&(n.shift(),r.shift()),t=0;t1?e-1:e)<1?r+(o-r)*e*6:2*e<1?o:3*e<2?r+(o-r)*(2/3-e)*6:r}e=He(e)%360/360,t=ze(He(t)),n=ze(He(n)),i=ze(He(i)),r=2*n-(o=n<=.5?n*(t+1):n+t-n*t);var a=[255*s(e+1/3),255*s(e),255*s(e-1/3)];return i=He(i),new p(a,i,"hsla")}catch(e){}},hsv:function(e,t,n){return je.hsva(e,t,n,1)},hsva:function(e,t,n,i){var r,o;e=He(e)%360/360*360,t=He(t),n=He(n),i=He(i);var s=[n,n*(1-t),n*(1-(o=e/60-(r=Math.floor(e/60%6)))*t),n*(1-(1-o)*t)],a=[[0,3,1],[2,0,1],[1,0,3],[1,2,0],[3,1,0],[0,1,2]];return je.rgba(255*s[a[r][0]],255*s[a[r][1]],255*s[a[r][2]],i)},hue:function(e){return new ee(We(e).h)},saturation:function(e){return new ee(100*We(e).s,"%")},lightness:function(e){return new ee(100*We(e).l,"%")},hsvhue:function(e){return new ee(Je(e).h)},hsvsaturation:function(e){return new ee(100*Je(e).s,"%")},hsvvalue:function(e){return new ee(100*Je(e).v,"%")},red:function(e){return new ee(e.rgb[0])},green:function(e){return new ee(e.rgb[1])},blue:function(e){return new ee(e.rgb[2])},alpha:function(e){return new ee(We(e).a)},luma:function(e){return new ee(e.luma()*e.alpha*100,"%")},luminance:function(e){var t=.2126*e.rgb[0]/255+.7152*e.rgb[1]/255+.0722*e.rgb[2]/255;return new ee(t*e.alpha*100,"%")},saturate:function(e,t,n){if(!e.rgb)return null;var i=We(e);return void 0!==n&&"relative"===n.value?i.s+=i.s*t.value/100:i.s+=t.value/100,i.s=ze(i.s),Ge(e,i)},desaturate:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.s-=i.s*t.value/100:i.s-=t.value/100,i.s=ze(i.s),Ge(e,i)},lighten:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.l+=i.l*t.value/100:i.l+=t.value/100,i.l=ze(i.l),Ge(e,i)},darken:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.l-=i.l*t.value/100:i.l-=t.value/100,i.l=ze(i.l),Ge(e,i)},fadein:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.a+=i.a*t.value/100:i.a+=t.value/100,i.a=ze(i.a),Ge(e,i)},fadeout:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.a-=i.a*t.value/100:i.a-=t.value/100,i.a=ze(i.a),Ge(e,i)},fade:function(e,t){var n=We(e);return n.a=t.value/100,n.a=ze(n.a),Ge(e,n)},spin:function(e,t){var n=We(e),i=(n.h+t.value)%360;return n.h=i<0?360+i:i,Ge(e,n)},mix:function(e,t,n){n||(n=new ee(50));var i=n.value/100,r=2*i-1,o=We(e).a-We(t).a,s=((r*o==-1?r:(r+o)/(1+r*o))+1)/2,a=1-s,l=[e.rgb[0]*s+t.rgb[0]*a,e.rgb[1]*s+t.rgb[1]*a,e.rgb[2]*s+t.rgb[2]*a],u=e.alpha*i+t.alpha*(1-i);return new p(l,u)},greyscale:function(e){return je.desaturate(e,new ee(100))},contrast:function(e,t,n,i){if(!e.rgb)return null;if(void 0===n&&(n=je.rgba(255,255,255,1)),void 0===t&&(t=je.rgba(0,0,0,1)),t.luma()>n.luma()){var r=n;n=t,t=r}return i=void 0===i?.43:He(i),e.luma().5&&(i=1,n=e>.25?Math.sqrt(e):((16*e-12)*e+4)*e),e-(1-2*t)*i*(n-e)},hardlight:function(e,t){return Ze.overlay(t,e)},difference:function(e,t){return Math.abs(e-t)},exclusion:function(e,t){return e+t-2*e*t},average:function(e,t){return(e+t)/2},negation:function(e,t){return 1-Math.abs(e+t-1)}};for(var Xe in Ze)Ze.hasOwnProperty(Xe)&&(Ke[Xe]=Ke.bind(null,Ze[Xe]));var Ye=function(e){return Array.isArray(e.value)?e.value:Array(e)},et={_SELF:function(e){return e},"~":function(){for(var e=[],t=0;ts.value)&&(c[i]=r);else{if(void 0!==l&&a!==l)throw{type:"Argument",message:"incompatible types"};h[a]=c.length,c.push(r)}else Array.isArray(t[n].value)&&Array.prototype.push.apply(t,Array.prototype.slice.call(t[n].value));return 1==c.length?c[0]:(t=c.map((function(e){return e.toCSS(this.context)})).join(this.context.compress?",":", "),new N((e?"min":"max")+"("+t+")"))},ot={min:function(){for(var e=[],t=0;t",r=0;r";return i+="',i=encodeURIComponent(i),new ce(new ue("'"+(i="data:image/svg+xml,"+i)+"'",i,!1,this.index,this.currentFileInfo),this.index,this.currentFileInfo)}}),H.addMultiple(ut),t};function ht(e,t){var n,i=(t=t||{}).variables,r=new j.Eval(t);"object"!=typeof i||Array.isArray(i)||(i=Object.keys(i).map((function(e){var t=i[e];return t instanceof Ie.Value||(t instanceof Ie.Expression||(t=new Ie.Expression([t])),t=new Ie.Value([t])),new Ie.Declaration("@"+e,t,!1,null,0)})),r.frames=[new Ie.Ruleset(null,i)]);var o,s,a=[new De.JoinSelectorVisitor,new De.MarkVisibleSelectorsVisitor(!0),new De.ExtendVisitor,new De.ToCSSVisitor({compress:Boolean(t.compress)})],l=[];if(t.pluginManager){s=t.pluginManager.visitor();for(var u=0;u<2;u++)for(s.first();o=s.get();)o.isPreEvalVisitor?0!==u&&-1!==l.indexOf(o)||(l.push(o),o.run(e)):0!==u&&-1!==a.indexOf(o)||(o.isPreVisitor?a.unshift(o):a.push(o))}n=e.eval(r);for(u=0;u=t);n++);this.preProcessors.splice(n,0,{preProcessor:e,priority:t})},e.prototype.addPostProcessor=function(e,t){var n;for(n=0;n=t);n++);this.postProcessors.splice(n,0,{postProcessor:e,priority:t})},e.prototype.addFileManager=function(e){this.fileManagers.push(e)},e.prototype.getPreProcessors=function(){for(var e=[],t=0;t0){var i=void 0,r=JSON.stringify(this._sourceMapGenerator.toJSON());this.sourceMapURL?i=this.sourceMapURL:this._sourceMapFilename&&(i=this._sourceMapFilename),this.sourceMapURL=i,this.sourceMap=r}return this._css.join("")},t}()}(e=new o(e,t)),e)),a=function(e){return function(){function t(e,t,n){this.less=e,this.rootFilename=n.filename,this.paths=t.paths||[],this.contents={},this.contentsIgnoredChars={},this.mime=t.mime,this.error=null,this.context=t,this.queue=[],this.files={}}return t.prototype.push=function(t,n,i,o,s){var a=this,l=this.context.pluginManager.Loader;this.queue.push(t);var u=function(e,n,i){a.queue.splice(a.queue.indexOf(t),1);var l=i===a.rootFilename;o.optional&&e?(s(null,{rules:[]},!1,null),r.info("The file "+i+" was skipped because it was not found and the import was marked optional.")):(a.files[i]||o.inline||(a.files[i]={root:n,options:o}),e&&!a.error&&(a.error=e),s(e,n,l,i))},c={rewriteUrls:this.context.rewriteUrls,entryPath:i.entryPath,rootpath:i.rootpath,rootFilename:i.rootFilename},h=e.getFileManager(t,i.currentDirectory,this.context,e);if(h){var f,p,v=function(e){var t,n=e.filename,r=e.contents.replace(/^\uFEFF/,"");c.currentDirectory=h.getPath(n),c.rewriteUrls&&(c.rootpath=h.join(a.context.rootpath||"",h.pathDiff(c.currentDirectory,c.entryPath)),!h.isPathAbsolute(c.rootpath)&&h.alwaysMakePathsAbsolute()&&(c.rootpath=h.join(c.entryPath,c.rootpath))),c.filename=n;var s=new j.Parse(a.context);s.processImports=!1,a.contents[n]=r,(i.reference||o.reference)&&(c.reference=!0),o.isPlugin?(t=l.evalPlugin(r,s,a,o.pluginArgs,c))instanceof V?u(t,null,n):u(null,t,n):o.inline?u(null,r,n):!a.files[n]||a.files[n].options.multiple||o.multiple?new Ue(s,a,c).parse(r,(function(e,t){u(e,t,n)})):u(null,a.files[n].root,n)},d=_(this.context);n&&(d.ext=o.isPlugin?".js":".less"),o.isPlugin?(d.mime="application/javascript",d.syncImport?f=l.loadPluginSync(t,i.currentDirectory,d,e,h):p=l.loadPlugin(t,i.currentDirectory,d,e,h)):d.syncImport?f=h.loadFileSync(t,i.currentDirectory,d,e):p=h.loadFile(t,i.currentDirectory,d,e,(function(e,t){e?u(e):v(t)})),f?f.filename?v(f):u(f):p&&p.then(v,u)}else u({message:"Could not find a file-manager for "+t})},t}()}(e);var u,c=function(e,t,n){var i=function(e,n,r){if("function"==typeof n?(r=n,n=M(this.options,{})):n=M(this.options,n||{}),!r){var o=this;return new Promise((function(t,r){i.call(o,e,n,(function(e,n){e?r(e):t(n)}))}))}this.parse(e,n,(function(e,n,i,o){if(e)return r(e);var s;try{s=new t(n,i).toCSS(o)}catch(e){return r(e)}r(null,s)}))};return i}(0,s),h=function(e,t,n){var i=function(e,t,r){if("function"==typeof t?(r=t,t=M(this.options,{})):t=M(this.options,t||{}),!r){var o=this;return new Promise((function(n,r){i.call(o,e,t,(function(e,t){e?r(e):n(t)}))}))}var s,a=void 0,l=new mt(this,!t.reUsePluginManager);if(t.pluginManager=l,s=new j.Parse(t),t.rootFileInfo)a=t.rootFileInfo;else{var u=t.filename||"input",c=u.replace(/[^\/\\]*$/,"");(a={filename:u,rewriteUrls:s.rewriteUrls,rootpath:s.rootpath||"",currentDirectory:c,entryPath:c,rootFilename:u}).rootpath&&"/"!==a.rootpath.slice(-1)&&(a.rootpath+="/")}var h=new n(this,s,a);this.importManager=h,t.plugins&&t.plugins.forEach((function(e){var t,n;if(e.fileContent){if(n=e.fileContent.replace(/^\uFEFF/,""),(t=l.Loader.evalPlugin(n,s,h,e.options,e.filename))instanceof V)return r(t)}else l.addPlugin(e)})),new Ue(s,h,a).parse(e,(function(e,n){if(e)return r(e);r(null,n,h,t)}),t)};return i}(0,0,a),f={version:[4,0,0],data:l,tree:Ie,Environment:o,AbstractFileManager:Ce,AbstractPluginLoader:ke,environment:e,visitors:De,Parser:Ue,functions:ct(e),contexts:j,SourceMapOutput:n,SourceMapBuilder:i,ParseTree:s,ImportManager:a,render:c,parse:h,LessError:V,transformTree:ht,utils:P,PluginManager:mt,logger:r},p=function(e){return function(){var t=Object.create(e.prototype);return e.apply(t,Array.prototype.slice.call(arguments,0)),t}},v=Object.create(f);for(var d in f.tree)if("function"==typeof(u=f.tree[d]))v[d.toLowerCase()]=p(u);else for(var m in v[d]=Object.create(null),u)v[d][m.toLowerCase()]=p(u[m]);return f.parse=f.parse.bind(v),f.render=f.render.bind(v),v}var yt={},bt=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return h(t,e),t.prototype.alwaysMakePathsAbsolute=function(){return!0},t.prototype.join=function(e,t){return e?this.extractUrlParts(t,e).path:t},t.prototype.doXHR=function(e,t,n,i){var r=new XMLHttpRequest,o=!pt.isFileProtocol||pt.fileAsync;function s(t,n,i){t.status>=200&&t.status<300?n(t.responseText,t.getResponseHeader("Last-Modified")):"function"==typeof i&&i(t.status,e)}"function"==typeof r.overrideMimeType&&r.overrideMimeType("text/css"),vt.debug("XHR: Getting '"+e+"'"),r.open("GET",e,o),r.setRequestHeader("Accept",t||"text/x-less, text/css; q=0.9, */*; q=0.5"),r.send(null),pt.isFileProtocol&&!pt.fileAsync?0===r.status||r.status>=200&&r.status<300?n(r.responseText):i(r.status,e):o?r.onreadystatechange=function(){4==r.readyState&&s(r,n,i)}:s(r,n,i)},t.prototype.supports=function(){return!0},t.prototype.clearFileCache=function(){yt={}},t.prototype.loadFile=function(e,t,n,i){t&&!this.isPathAbsolute(e)&&(e=t+e),e=n.ext?this.tryAppendExtension(e,n.ext):e,n=n||{};var r=this.extractUrlParts(e,window.location.href).url,o=this;return new Promise((function(e,t){if(n.useFileCache&&yt[r])try{var i=yt[r];return e({contents:i,filename:r,webInfo:{lastModified:new Date}})}catch(e){return t({filename:r,message:"Error loading file "+r+" error was "+e.message})}o.doXHR(r,n.mime,(function(t,n){yt[r]=t,e({contents:t,filename:r,webInfo:{lastModified:n}})}),(function(e,n){t({type:"File",message:"'"+n+"' wasn't found ("+e+")",href:r})}))}))},t}(Ce),wt=function(e,t){return pt=e,vt=t,bt},xt=function(e){function t(t){var n=e.call(this)||this;return n.less=t,n}return h(t,e),t.prototype.loadPlugin=function(e,t,n,i,r){return new Promise((function(o,s){r.loadFile(e,t,n,i).then(o).catch(s)}))},t}(ke),St=function(t,i,r){return{add:function(o,s){r.errorReporting&&"html"!==r.errorReporting?"console"===r.errorReporting?function(e,t){var n=e.filename||t,o=[],s=(e.type||"Syntax")+"Error: "+(e.message||"There is an error in your .less file")+" in "+n,a=function(e,t,n){void 0!==e.extract[t]&&o.push("{line} {content}".replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,n).replace(/\{content\}/,e.extract[t]))};e.line&&(a(e,0,""),a(e,1,"line"),a(e,2,""),s+=" on line "+e.line+", column "+(e.column+1)+":\n"+o.join("\n")),e.stack&&(e.extract||r.logLevel>=4)&&(s+="\nStack Trace\n"+e.stack),i.logger.error(s)}(o,s):"function"==typeof r.errorReporting&&r.errorReporting("add",o,s):function(i,o){var s,a,l="less-error-message:"+e(o||""),u=t.document.createElement("div"),c=[],h=i.filename||o,f=h.match(/([^\/]+(\?.*)?)$/)[1];u.id=l,u.className="less-error-message",a="

    "+(i.type||"Syntax")+"Error: "+(i.message||"There is an error in your .less file")+'

    in '+f+" ";var p=function(e,t,n){void 0!==e.extract[t]&&c.push('

  • {content}
  • '.replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,n).replace(/\{content\}/,e.extract[t]))};i.line&&(p(i,0,""),p(i,1,"line"),p(i,2,""),a+="on line "+i.line+", column "+(i.column+1)+":

      "+c.join("")+"
    "),i.stack&&(i.extract||r.logLevel>=4)&&(a+="
    Stack Trace
    "+i.stack.split("\n").slice(1).join("
    ")),u.innerHTML=a,n(t.document,[".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #dd6666;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.line {","color: #ff0000;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),u.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),"development"===r.env&&(s=setInterval((function(){var e=t.document,n=e.body;n&&(e.getElementById(l)?n.replaceChild(u,e.getElementById(l)):n.insertBefore(u,n.firstChild),clearInterval(s))}),10))}(o,s)},remove:function(n){r.errorReporting&&"html"!==r.errorReporting?"console"===r.errorReporting||"function"==typeof r.errorReporting&&r.errorReporting("remove",n):function(n){var i=t.document.getElementById("less-error-message:"+e(n));i&&i.parentNode.removeChild(i)}(n)}}},It={javascriptEnabled:!1,depends:!1,compress:!1,lint:!1,paths:[],color:!0,strictImports:!1,insecure:!1,rootpath:"",rewriteUrls:!1,math:1,strictUnits:!1,globalVars:null,modifyVars:null,urlArgs:""};if(window.less)for(var Ct in window.less)window.less.hasOwnProperty(Ct)&&(It[Ct]=window.less[Ct]);!function(e,n){t(n,i(e)),void 0===n.isFileProtocol&&(n.isFileProtocol=/^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(e.location.protocol)),n.async=n.async||!1,n.fileAsync=n.fileAsync||!1,n.poll=n.poll||(n.isFileProtocol?1e3:1500),n.env=n.env||("127.0.0.1"==e.location.hostname||"0.0.0.0"==e.location.hostname||"localhost"==e.location.hostname||e.location.port&&e.location.port.length>0||n.isFileProtocol?"development":"production");var r=/!dumpLineNumbers:(comments|mediaquery|all)/.exec(e.location.hash);r&&(n.dumpLineNumbers=r[1]),void 0===n.useFileCache&&(n.useFileCache=!0),void 0===n.onReady&&(n.onReady=!0),n.relativeUrls&&(n.rewriteUrls="all")}(window,It),It.plugins=It.plugins||[],window.LESS_PLUGINS&&(It.plugins=It.plugins.concat(window.LESS_PLUGINS));var kt,_t,At,Mt=function(e,i){var r=e.document,o=gt();o.options=i;var s=o.environment,a=wt(i,o.logger),l=new a;s.addFileManager(l),o.FileManager=a,o.PluginLoader=xt,function(e,t){t.logLevel=void 0!==t.logLevel?t.logLevel:"development"===t.env?3:1,t.loggers||(t.loggers=[{debug:function(e){t.logLevel>=4&&console.log(e)},info:function(e){t.logLevel>=3&&console.log(e)},warn:function(e){t.logLevel>=2&&console.warn(e)},error:function(e){t.logLevel>=1&&console.error(e)}}]);for(var n=0;n0&&l.childNodes.length>0&&s.firstChild.nodeValue===l.firstChild.nodeValue);var u=t.getElementsByTagName("head")[0];if(null===s||!1===a){var c=i&&i.nextSibling||null;c?c.parentNode.insertBefore(l,c):u.appendChild(l)}if(s&&!1===a&&s.parentNode.removeChild(s),l.styleSheet)try{l.styleSheet.cssText=n}catch(e){throw new Error("Couldn't reassign styleSheet.cssText.")}},i=function(e){var t,n=e.document;return n.currentScript||(t=n.getElementsByTagName("script"))[t.length-1]},r={error:function(e){this._fireEvent("error",e)},warn:function(e){this._fireEvent("warn",e)},info:function(e){this._fireEvent("info",e)},debug:function(e){this._fireEvent("debug",e)},addListener:function(e){this._listeners.push(e)},removeListener:function(e){for(var t=0;t=0;a--){var l=s[a];if(l[o?"supportsSync":"supports"](e,t,n,i))return l}return null},e.prototype.addFileManager=function(e){this.fileManagers.push(e)},e.prototype.clearFileManagers=function(){this.fileManagers=[]},e}(),s={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",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:"#ff00ff",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:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",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:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",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:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},a={length:{m:1,cm:.01,mm:.001,in:.0254,px:.0254/96,pt:.0254/72,pc:.0254/72*12},duration:{s:1,ms:.001},angle:{rad:1/(2*Math.PI),deg:1/360,grad:1/400,turn:1}},l={colors:s,unitConversions:a},u=function(){function e(){this.parent=null,this.visibilityBlocks=void 0,this.nodeVisible=void 0,this.rootNode=null,this.parsed=null;var e=this;Object.defineProperty(this,"currentFileInfo",{get:function(){return e.fileInfo()}}),Object.defineProperty(this,"index",{get:function(){return e.getIndex()}})}return e.prototype.setParent=function(t,n){function i(t){t&&t instanceof e&&(t.parent=n)}Array.isArray(t)?t.forEach(i):i(t)},e.prototype.getIndex=function(){return this._index||this.parent&&this.parent.getIndex()||0},e.prototype.fileInfo=function(){return this._fileInfo||this.parent&&this.parent.fileInfo()||{}},e.prototype.isRulesetLike=function(){return!1},e.prototype.toCSS=function(e){var t=[];return this.genCSS(e,{add:function(e,n,i){t.push(e)},isEmpty:function(){return 0===t.length}}),t.join("")},e.prototype.genCSS=function(e,t){t.add(this.value)},e.prototype.accept=function(e){this.value=e.visit(this.value)},e.prototype.eval=function(){return this},e.prototype._operate=function(e,t,n,i){switch(t){case"+":return n+i;case"-":return n-i;case"*":return n*i;case"/":return n/i}},e.prototype.fround=function(e,t){var n=e&&e.numPrecision;return n?Number((t+2e-16).toFixed(n)):t},e.compare=function(t,n){if(t.compare&&"Quoted"!==n.type&&"Anonymous"!==n.type)return t.compare(n);if(n.compare)return-n.compare(t);if(t.type===n.type){if(t=t.value,n=n.value,!Array.isArray(t))return t===n?0:void 0;if(t.length===n.length){for(var i=0;it?1:void 0},e.prototype.blocksVisibility=function(){return null==this.visibilityBlocks&&(this.visibilityBlocks=0),0!==this.visibilityBlocks},e.prototype.addVisibilityBlock=function(){null==this.visibilityBlocks&&(this.visibilityBlocks=0),this.visibilityBlocks=this.visibilityBlocks+1},e.prototype.removeVisibilityBlock=function(){null==this.visibilityBlocks&&(this.visibilityBlocks=0),this.visibilityBlocks=this.visibilityBlocks-1},e.prototype.ensureVisibility=function(){this.nodeVisible=!0},e.prototype.ensureInvisibility=function(){this.nodeVisible=!1},e.prototype.isVisible=function(){return this.nodeVisible},e.prototype.visibilityInfo=function(){return{visibilityBlocks:this.visibilityBlocks,nodeVisible:this.nodeVisible}},e.prototype.copyVisibilityInfo=function(e){e&&(this.visibilityBlocks=e.visibilityBlocks,this.nodeVisible=e.nodeVisible)},e}(),c=function(e,t){return(c=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};function h(e,t){function n(){this.constructor=e}c(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var f=function(){return(f=Object.assign||function(e){for(var t,n=1,i=arguments.length;n=6?(r.rgb=[],t.match(/.{2}/g).map((function(e,t){t<3?o.rgb.push(parseInt(e,16)):o.alpha=parseInt(e,16)/255}))):(r.rgb=[],t.split("").map((function(e,t){t<3?o.rgb.push(parseInt(e+e,16)):o.alpha=parseInt(e+e,16)/255}))),r.alpha=r.alpha||("number"==typeof n?n:1),void 0!==i&&(r.value=i),r}return h(t,e),t.prototype.luma=function(){var e=this.rgb[0]/255,t=this.rgb[1]/255,n=this.rgb[2]/255;return.2126*(e=e<=.03928?e/12.92:Math.pow((e+.055)/1.055,2.4))+.7152*(t=t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4))+.0722*(n=n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4))},t.prototype.genCSS=function(e,t){t.add(this.toCSS(e))},t.prototype.toCSS=function(e,t){var n,i,r,o=e&&e.compress&&!t,s=[];if(i=this.fround(e,this.alpha),this.value)if(0===this.value.indexOf("rgb"))i<1&&(r="rgba");else{if(0!==this.value.indexOf("hsl"))return this.value;r=i<1?"hsla":"hsl"}else i<1&&(r="rgba");switch(r){case"rgba":s=this.rgb.map((function(e){return v(Math.round(e),255)})).concat(v(i,1));break;case"hsla":s.push(v(i,1));case"hsl":n=this.toHSL(),s=[this.fround(e,n.h),this.fround(e,100*n.s)+"%",this.fround(e,100*n.l)+"%"].concat(s)}if(r)return r+"("+s.join(","+(o?"":" "))+")";if(n=this.toRGB(),o){var a=n.split("");a[1]===a[2]&&a[3]===a[4]&&a[5]===a[6]&&(n="#"+a[1]+a[3]+a[5])}return n},t.prototype.operate=function(e,n,i){for(var r=new Array(3),o=this.alpha*(1-i.alpha)+i.alpha,s=0;s<3;s++)r[s]=this._operate(e,n,this.rgb[s],i.rgb[s]);return new t(r,o)},t.prototype.toRGB=function(){return d(this.rgb)},t.prototype.toHSL=function(){var e,t,n=this.rgb[0]/255,i=this.rgb[1]/255,r=this.rgb[2]/255,o=this.alpha,s=Math.max(n,i,r),a=Math.min(n,i,r),l=(s+a)/2,u=s-a;if(s===a)e=t=0;else{switch(t=l>.5?u/(2-s-a):u/(s+a),s){case n:e=(i-r)/u+(i=0&&"\n"!==t.charAt(n);)r++;return"number"==typeof e&&(i=(t.slice(0,e).match(/\n/g)||"").length),{line:i,column:r}}function k(e){var t,n=e.length,i=new Array(n);for(t=0;t|Function):(\d+):(\d+)/,V=function(e,t,n){Error.call(this);var i=e.filename||n;if(this.message=e.message,this.stack=e.stack,t&&i){var r=t.contents[i],o=C(e.index,r),s=o.line,a=o.column,l=e.call&&C(e.call,r).line,u=r?r.split("\n"):"";if(this.type=e.type||"Syntax",this.filename=i,this.index=e.index,this.line="number"==typeof s?s+1:null,this.column=a,!this.line&&this.stack){var c=this.stack.match(R),h=new Function("a","throw new Error()"),f=0;try{h()}catch(e){var p=e.stack.match(R);f=1-(s=parseInt(p[2]))}c&&(c[2]&&(this.line=parseInt(c[2])+f),c[3]&&(this.column=parseInt(c[3])))}this.callLine=l+1,this.callExtract=u[l],this.extract=[u[this.line-2],u[this.line-1],u[this.line]]}};if(void 0===Object.create){var F=function(){};F.prototype=Error.prototype,V.prototype=new F}else V.prototype=Object.create(Error.prototype);V.prototype.constructor=V,V.prototype.toString=function(e){e=e||{};var t="",n=this.extract||[],i=[],r=function(e){return e};if(e.stylize){var o=typeof e.stylize;if("function"!==o)throw Error("options.stylize should be a function, got a "+o+"!");r=e.stylize}if(null!==this.line){if("string"==typeof n[0]&&i.push(r(this.line-1+" "+n[0],"grey")),"string"==typeof n[1]){var s=this.line+" ";n[1]&&(s+=n[1].slice(0,this.column)+r(r(r(n[1].substr(this.column,1),"bold")+n[1].slice(this.column+1),"red"),"inverse")),i.push(s)}"string"==typeof n[2]&&i.push(r(this.line+1+" "+n[2],"grey")),i=i.join("\n")+r("","reset")+"\n"}return t+=r(this.type+"Error: "+this.message,"red"),this.filename&&(t+=r(" in ","red")+this.filename),this.line&&(t+=r(" on line "+this.line+", column "+(this.column+1)+":","grey")),t+="\n"+i,this.callLine&&(t+=r("from ","red")+(this.filename||"")+"/n",t+=r(this.callLine,"grey")+" "+this.callExtract+"/n"),t};var $=function(e){function t(t,n,i,r,o,s){var a=e.call(this)||this;return a.extendList=n,a.condition=i,a.evaldCondition=!i,a._index=r,a._fileInfo=o,a.elements=a.getElements(t),a.mixinElements_=void 0,a.copyVisibilityInfo(s),a.setParent(a.elements,a),a}return h(t,e),t.prototype.accept=function(e){this.elements&&(this.elements=e.visitArray(this.elements)),this.extendList&&(this.extendList=e.visitArray(this.extendList)),this.condition&&(this.condition=e.visit(this.condition))},t.prototype.createDerived=function(e,n,i){var r=new t(e=this.getElements(e),n||this.extendList,null,this.getIndex(),this.fileInfo(),this.visibilityInfo());return r.evaldCondition=null!=i?i:this.evaldCondition,r.mediaEmpty=this.mediaEmpty,r},t.prototype.getElements=function(e){return e?("string"==typeof e&&this.parse.parseNode(e,["selector"],this._index,this._fileInfo,(function(t,n){if(t)throw new V({index:t.index,message:t.message},this.parse.imports,this._fileInfo.filename);e=n[0].elements})),e):[new b("","&",!1,this._index,this._fileInfo)]},t.prototype.createEmptySelectors=function(){var e=[new t([new b("","&",!1,this._index,this._fileInfo)],null,null,this._index,this._fileInfo)];return e[0].mediaEmpty=!0,e},t.prototype.match=function(e){var t,n,i=this.elements,r=i.length;if(0===(t=(e=e.mixinElements()).length)||rw.PARENS_DIVISION)||this.parensStack&&this.parensStack.length))},j.Eval.prototype.pathRequiresRewrite=function(e){return(this.rewriteUrls===S?J:W)(e)},j.Eval.prototype.rewritePath=function(e,t){var n;return t=t||"",n=this.normalizePath(t+e),J(e)&&W(t)&&!1===J(n)&&(n="./"+n),n},j.Eval.prototype.normalizePath=function(e){var t,n=e.split("/").reverse();for(e=[];0!==n.length;)switch(t=n.pop()){case".":break;case"..":0===e.length||".."===e[e.length-1]?e.push(t):e.pop();break;default:e.push(t)}return e.join("/")};var H=function e(t){return{_data:{},add:function(e,t){e=e.toLowerCase(),this._data.hasOwnProperty(e),this._data[e]=t},addMultiple:function(e){var t=this;Object.keys(e).forEach((function(n){t.add(n,e[n])}))},get:function(e){return this._data[e]||t&&t.get(e)},getLocalFunctions:function(){return this._data},inherit:function(){return e(this)},create:function(t){return e(t)}}}(null),Q={eval:function(){var e=this.value_,t=this.error_;if(t)throw t;if(null!=e)return e?L.True:L.False},value:function(e){this.value_=e},error:function(e){this.error_=e},reset:function(){this.value_=this.error_=null}},K=function(e){function t(t,n,i,r){var o=e.call(this)||this;return o.selectors=t,o.rules=n,o._lookups={},o._variables=null,o._properties=null,o.strictImports=i,o.copyVisibilityInfo(r),o.allowRoot=!0,o.setParent(o.selectors,o),o.setParent(o.rules,o),o}return h(t,e),t.prototype.isRulesetLike=function(){return!0},t.prototype.accept=function(e){this.paths?this.paths=e.visitArray(this.paths,!0):this.selectors&&(this.selectors=e.visitArray(this.selectors)),this.rules&&this.rules.length&&(this.rules=e.visitArray(this.rules))},t.prototype.eval=function(e){var n,i,r,o,s,a=!1;if(this.selectors&&(i=this.selectors.length)){for(n=new Array(i),Q.error({type:"Syntax",message:"it is currently only allowed in parametric mixin guards,"}),o=0;o0;e--){var t=this.rules[e-1];if(t instanceof B)return this.parseValue(t)}},t.prototype.parseValue=function(e){var t=this;function n(e){return e.value instanceof N&&!e.parsed?("string"==typeof e.value.value?this.parse.parseNode(e.value.value,["value","important"],e.value.getIndex(),e.fileInfo(),(function(t,n){t&&(e.parsed=!0),n&&(e.value=n[0],e.important=n[1]||"",e.parsed=!0)})):e.parsed=!0,e):e}if(Array.isArray(e)){var i=[];return e.forEach((function(e){i.push(n.call(t,e))})),i}return n.call(t,e)},t.prototype.rulesets=function(){if(!this.rules)return[];var e,t,n=[],i=this.rules;for(e=0;t=i[e];e++)t.isRuleset&&n.push(t);return n},t.prototype.prependRule=function(e){var t=this.rules;t?t.unshift(e):this.rules=[e],this.setParent(e,this)},t.prototype.find=function(e,t,n){t=t||this;var i,r,o=[],s=e.toCSS();return s in this._lookups?this._lookups[s]:(this.rulesets().forEach((function(s){if(s!==t)for(var a=0;ai){if(!n||n(s)){r=s.find(new $(e.elements.slice(i)),t,n);for(var l=0;l0&&t.add(l),e.firstSelector=!0,s[0].genCSS(e,t),e.firstSelector=!1,i=1;i0?(o=(r=k(e)).pop(),s=i.createDerived(k(o.elements))):s=i.createDerived([]),t.length>0){var a=n.combinator,l=t[0].elements[0];a.emptyOrWhitespace&&!l.combinator.emptyOrWhitespace&&(a=l.combinator),s.elements.push(new b(a,l.value,n.isVariable,n._index,n._fileInfo)),s.elements=s.elements.concat(t[0].elements.slice(1))}if(0!==s.elements.length&&r.push(s),t.length>1){var u=t.slice(1);u=u.map((function(e){return e.createDerived(e.elements,[])})),r=r.concat(u)}return r}function s(e,t,n,i,r){var s;for(s=0;s0?i[i.length-1]=i[i.length-1].createDerived(i[i.length-1].elements.concat(e)):i.push(new $(e));else t.push([new $(e)])}function l(e,t){var n=t.createDerived(t.elements,t.extendList,t.evaldCondition);return n.copyVisibilityInfo(e),n}var u,c;if(!function e(t,n,l){var u,c,h,f,p,v,d,g,y,w,x,S,I=!1;for(f=[],p=[[]],u=0;g=l.elements[u];u++)if("&"!==g.value){var C=(S=void 0,(x=g).value instanceof m&&(S=x.value.value)instanceof $?S:null);if(null!=C){a(f,p);var k,_=[],A=[];for(k=e(_,n,C),I=I||k,h=0;h<_.length;h++){s(p,[r(i(_[h],g),g)],g,l,A)}p=A,f=[]}else f.push(g)}else{for(I=!0,v=[],a(f,p),c=0;c0&&d[0].elements.push(new b(g.combinator,"",g.isVariable,g._index,g._fileInfo)),v.push(d);else for(h=0;h0&&(t.push(p[u]),w=p[u][y-1],p[u][y-1]=w.createDerived(w.elements,l.extendList));return I}(c=[],t,n))if(t.length>0)for(c=[],u=0;u0)for(t=0;t-1e-6&&(i=n.toFixed(20).replace(/0+$/,"")),e&&e.compress){if(0===n&&this.unit.isLength())return void t.add(i);n>0&&n<1&&(i=i.substr(1))}t.add(i),this.unit.genCSS(e,t)},t.prototype.operate=function(e,n,i){var r=this._operate(e,n,this.value,i.value),o=this.unit.clone();if("+"===n||"-"===n)if(0===o.numerator.length&&0===o.denominator.length)o=i.unit.clone(),this.unit.backupUnit&&(o.backupUnit=this.unit.backupUnit);else if(0===i.unit.numerator.length&&0===o.denominator.length);else{if(i=i.convertTo(this.unit.usedUnits()),e.strictUnits&&i.unit.toString()!==o.toString())throw new Error("Incompatible units. Change the units or use the unit function. Bad units: '"+o.toString()+"' and '"+i.unit.toString()+"'.");r=this._operate(e,n,this.value,i.value)}else"*"===n?(o.numerator=o.numerator.concat(i.unit.numerator).sort(),o.denominator=o.denominator.concat(i.unit.denominator).sort(),o.cancel()):"/"===n&&(o.numerator=o.numerator.concat(i.unit.denominator).sort(),o.denominator=o.denominator.concat(i.unit.numerator).sort(),o.cancel());return new t(r,o)},t.prototype.compare=function(e){var n,i;if(e instanceof t){if(this.unit.isEmpty()||e.unit.isEmpty())n=this,i=e;else if(n=this.unify(),i=e.unify(),0!==n.unit.compare(i.unit))return;return u.numericCompare(n.value,i.value)}},t.prototype.unify=function(){return this.convertTo({length:"px",duration:"s",angle:"rad"})},t.prototype.convertTo=function(e){var n,i,r,o,s,l=this.value,u=this.unit.clone(),c={};if("string"==typeof e){for(n in a)a[n].hasOwnProperty(e)&&((c={})[n]=e);e=c}for(i in s=function(e,t){return r.hasOwnProperty(e)?(t?l/=r[e]/r[o]:l*=r[e]/r[o],o):e},e)e.hasOwnProperty(i)&&(o=e[i],r=a[i],u.map(s));return u.cancel(),new t(l,u)},t}(u);ee.prototype.type="Dimension";var te=w,ne=function(e){function t(t,n,i){var r=e.call(this)||this;return r.op=t.trim(),r.operands=n,r.isSpaced=i,r}return h(t,e),t.prototype.accept=function(e){this.operands=e.visitArray(this.operands)},t.prototype.eval=function(e){var n,i=this.operands[0].eval(e),r=this.operands[1].eval(e);if(e.isMathOn(this.op)){if(n="./"===this.op?"/":this.op,i instanceof ee&&r instanceof p&&(i=i.toColor()),r instanceof ee&&i instanceof p&&(r=r.toColor()),!i.operate){if(i instanceof t&&"/"===i.op&&e.math===te.PARENS_DIVISION)return new t(this.op,[i,r],this.isSpaced);throw{type:"Operation",message:"Operation on an invalid type"}}return i.operate(e,n,r)}return new t(this.op,[i,r],this.isSpaced)},t.prototype.genCSS=function(e,t){this.operands[0].genCSS(e,t),this.isSpaced&&t.add(" "),t.add(this.op),this.isSpaced&&t.add(" "),this.operands[1].genCSS(e,t)},t}(u);ne.prototype.type="Operation";var ie=function(e){function t(t,n){var i=e.call(this)||this;if(i.value=t,i.noSpacing=n,!t)throw new Error("Expression requires an array parameter");return i}return h(t,e),t.prototype.accept=function(e){this.value=e.visitArray(this.value)},t.prototype.eval=function(e){var n,i=e.isMathOn(),r=this.parens,o=!1;return r&&e.inParenthesis(),this.value.length>1?n=new t(this.value.map((function(t){return t.eval?t.eval(e):t})),this.noSpacing):1===this.value.length?(!this.value[0].parens||this.value[0].parensInOp||e.inCalc||(o=!0),n=this.value[0].eval(e)):n=this,r&&e.outOfParenthesis(),!this.parens||!this.parensInOp||i||o||n instanceof ee||(n=new m(n)),n},t.prototype.genCSS=function(e,t){for(var n=0;n1){var n=new $([],null,null,this.getIndex(),this.fileInfo()).createEmptySelectors();(t=new K(n,e.mediaBlocks)).multiMedia=!0,t.copyVisibilityInfo(this.visibilityInfo()),this.setParent(t,this)}return delete e.mediaBlocks,delete e.mediaPath,t},t.prototype.evalNested=function(e){var t,n,i=e.mediaPath.concat([this]);for(t=0;t0;t--)e.splice(t,0,new N("and"));return new ie(e)}))),this.setParent(this.features,this),new K([],[])},t.prototype.permute=function(e){if(0===e.length)return[];if(1===e.length)return e[0];for(var t=[],n=this.permute(e.slice(1)),i=0;i1?"["+e.value.map((function(e){return e.toCSS()})).join(", ")+"]":e.toCSS()},t}(u));pe.prototype.type="JavaScript";var ve=function(e){function t(t,n){var i=e.call(this)||this;return i.key=t,i.value=n,i}return h(t,e),t.prototype.accept=function(e){this.value=e.visit(this.value)},t.prototype.eval=function(e){return this.value.eval?new t(this.key,this.value.eval(e)):this},t.prototype.genCSS=function(e,t){t.add(this.key+"="),this.value.genCSS?this.value.genCSS(e,t):t.add(this.value)},t}(u);ve.prototype.type="Assignment";var de=function(e){function t(t,n,i,r,o){var s=e.call(this)||this;return s.op=t.trim(),s.lvalue=n,s.rvalue=i,s._index=r,s.negate=o,s}return h(t,e),t.prototype.accept=function(e){this.lvalue=e.visit(this.lvalue),this.rvalue=e.visit(this.rvalue)},t.prototype.eval=function(e){var t=function(e,t,n){switch(e){case"and":return t&&n;case"or":return t||n;default:switch(u.compare(t,n)){case-1:return"<"===e||"=<"===e||"<="===e;case 0:return"="===e||">="===e||"=<"===e||"<="===e;case 1:return">"===e||">="===e;default:return!1}}}(this.op,this.lvalue.eval(e),this.rvalue.eval(e));return this.negate?!t:t},t}(u);de.prototype.type="Condition";var me=function(e){function t(t){var n=e.call(this)||this;return n.value=t,n}return h(t,e),t}(u);me.prototype.type="UnicodeDescriptor";var ge=function(e){function t(t){var n=e.call(this)||this;return n.value=t,n}return h(t,e),t.prototype.genCSS=function(e,t){t.add("-"),this.value.genCSS(e,t)},t.prototype.eval=function(e){return e.isMathOn()?new ne("*",[new ee(-1),this.value]).eval(e):new t(this.value.eval(e))},t}(u);ge.prototype.type="Negative";var ye=function(e){function t(n,i,r,o,s){var a=e.call(this)||this;switch(a.selector=n,a.option=i,a.object_id=t.next_id++,a.parent_ids=[a.object_id],a._index=r,a._fileInfo=o,a.copyVisibilityInfo(s),a.allowRoot=!0,i){case"all":a.allowBefore=!0,a.allowAfter=!0;break;default:a.allowBefore=!1,a.allowAfter=!1}return a.setParent(a.selector,a),a}return h(t,e),t.prototype.accept=function(e){this.selector=e.visit(this.selector)},t.prototype.eval=function(e){return new t(this.selector.eval(e),this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},t.prototype.clone=function(e){return new t(this.selector,this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},t.prototype.findSelfSelectors=function(e){var t,n,i=[];for(t=0;t0&&n.length&&""===n[0].combinator.value&&(n[0].combinator.value=" "),i=i.concat(e[t].elements);this.selfSelectors=[new $(i)],this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo())},t}(u);ye.next_id=0,ye.prototype.type="Extend";var be=function(e){function t(t,n,i){var r=e.call(this)||this;return r.variable=t,r._index=n,r._fileInfo=i,r.allowRoot=!0,r}return h(t,e),t.prototype.eval=function(e){var t,n=new se(this.variable,this.getIndex(),this.fileInfo()).eval(e),i=new V({message:"Could not evaluate variable call "+this.variable});if(!n.ruleset){if(n.rules)t=n;else if(Array.isArray(n))t=new K("",n);else{if(!Array.isArray(n.value))throw i;t=new K("",n.value)}n=new X(t)}if(n.ruleset)return n.callEval(e);throw i},t}(u);be.prototype.type="VariableCall";var we=function(e){function t(t,n,i,r){var o=e.call(this)||this;return o.value=t,o.lookups=n,o._index=i,o._fileInfo=r,o}return h(t,e),t.prototype.eval=function(e){var t,n,i=this.value.eval(e);for(t=0;tthis.params.length)return!1}n=Math.min(o,this.arity);for(var s=0;s0){for(c=!0,a=0;a0)f=2;else if(f=1,p[1]+p[2]>1)throw{type:"Runtime",message:"Ambiguous use of `default()` found when matching for `"+this.format(m)+"`",index:this.getIndex(),filename:this.fileInfo().filename};for(a=0;a0&&(e=e.slice(0,t)),(t=e.lastIndexOf("/"))<0&&(t=e.lastIndexOf("\\")),t<0?"":e.slice(0,t+1)},e.prototype.tryAppendExtension=function(e,t){return/(\.[a-z]*$)|([\?;].*)$/.test(e)?e:e+t},e.prototype.tryAppendLessExtension=function(e){return this.tryAppendExtension(e,".less")},e.prototype.supportsSync=function(){return!1},e.prototype.alwaysMakePathsAbsolute=function(){return!1},e.prototype.isPathAbsolute=function(e){return/^(?:[a-z-]+:|\/|\\|#)/i.test(e)},e.prototype.join=function(e,t){return e?e+t:t},e.prototype.pathDiff=function(e,t){var n,i,r,o,s=this.extractUrlParts(e),a=this.extractUrlParts(t),l="";if(s.hostPart!==a.hostPart)return"";for(i=Math.max(a.directories.length,s.directories.length),n=0;nparseInt(t[n])?-1:1;return 0},e.prototype.versionToString=function(e){for(var t="",n=0;n0;){var e=this.imports[0];if(!e.isReady)return;this.imports=this.imports.slice(1),e.callback.apply(null,e.args)}if(0===this.variableImports.length)break;var t=this.variableImports[0];this.variableImports=this.variableImports.slice(1),t()}}finally{this._currentDepth--}0===this._currentDepth&&this._onSequencerEmpty&&this._onSequencerEmpty()},e}(),Re=function(e,t){this._visitor=new Ee(this),this._importer=e,this._finish=t,this.context=new j.Eval,this.importCount=0,this.onceFileDetectionMap={},this.recursionDetector={},this._sequencer=new Pe(this._onSequencerEmpty.bind(this))};Re.prototype={isReplacing:!1,run:function(e){try{this._visitor.visit(e)}catch(e){this.error=e}this.isFinished=!0,this._sequencer.tryRun()},_onSequencerEmpty:function(){this.isFinished&&this._finish(this.error)},visitImport:function(e,t){var n=e.options.inline;if(!e.css||n){var i=new j.Eval(this.context,k(this.context.frames)),r=i.frames[0];this.importCount++,e.isVariableImport()?this._sequencer.addVariableImport(this.processImportNode.bind(this,e,i,r)):this.processImportNode(e,i,r)}t.visitDeeper=!1},processImportNode:function(e,t,n){var i,r=e.options.inline;try{i=e.evalForImport(t)}catch(t){t.filename||(t.index=e.getIndex(),t.filename=e.fileInfo().filename),e.css=!0,e.error=t}if(!i||i.css&&!r)this.importCount--,this.isFinished&&this._sequencer.tryRun();else{i.options.multiple&&(t.importMultiple=!0);for(var o=void 0===i.css,s=0;s=0||(a=[u.selfSelectors[0]],(o=f.findMatch(l,a)).length&&(l.hasFoundMatches=!0,l.selfSelectors.forEach((function(e){var t=u.visibilityInfo();s=f.extendSelector(o,a,e,l.isVisible()),(c=new Ie.Extend(u.selector,u.option,0,u.fileInfo(),t)).selfSelectors=s,s[s.length-1].extendList=[c],h.push(c),c.ruleset=u.ruleset,c.parent_ids=c.parent_ids.concat(u.parent_ids,l.parent_ids),u.firstExtendOnThisSelectorPath&&(c.firstExtendOnThisSelectorPath=!0,u.ruleset.paths.push(s))}))));if(h.length){if(this.extendChainCount++,n>100){var p="{unable to calculate}",v="{unable to calculate}";try{p=h[0].selfSelectors[0].toCSS(),v=h[0].selector.toCSS()}catch(e){}throw{message:"extend circular reference detected. One of the circular extends is currently:"+p+":extend("+v+")"}}return h.concat(f.doExtendChaining(h,t,n+1))}return h},e.prototype.visitDeclaration=function(e,t){t.visitDeeper=!1},e.prototype.visitMixinDefinition=function(e,t){t.visitDeeper=!1},e.prototype.visitSelector=function(e,t){t.visitDeeper=!1},e.prototype.visitRuleset=function(e,t){if(!e.root){var n,i,r,o,s=this.allExtendsStack[this.allExtendsStack.length-1],a=[],l=this;for(r=0;r0&&u[l.matched].combinator.value!==s?l=null:l.matched++,l&&(l.finished=l.matched===u.length,l.finished&&!e.allowAfter&&(r+1u&&c>0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[u].elements.slice(c)),c=0,u++),l=o.elements.slice(c,a.index).concat([s]).concat(n.elements.slice(1)),u===a.pathIndex&&r>0?h[h.length-1].elements=h[h.length-1].elements.concat(l):(h=h.concat(t.slice(u,a.pathIndex))).push(new Ie.Selector(l)),u=a.endPathIndex,(c=a.endPathElementIndex)>=t[u].elements.length&&(c=0,u++);return u0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[u].elements.slice(c)),u++),h=(h=h.concat(t.slice(u,t.length))).map((function(e){var t=e.createDerived(e.elements);return i?t.ensureVisibility():t.ensureInvisibility(),t}))},e.prototype.visitMedia=function(e,t){var n=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);n=n.concat(this.doExtendChaining(n,e.allExtends)),this.allExtendsStack.push(n)},e.prototype.visitMediaOut=function(e){var t=this.allExtendsStack.length-1;this.allExtendsStack.length=t},e.prototype.visitAtRule=function(e,t){var n=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);n=n.concat(this.doExtendChaining(n,e.allExtends)),this.allExtendsStack.push(n)},e.prototype.visitAtRuleOut=function(e){var t=this.allExtendsStack.length-1;this.allExtendsStack.length=t},e}(),Oe=function(){function e(){this.contexts=[[]],this._visitor=new Ee(this)}return e.prototype.run=function(e){return this._visitor.visit(e)},e.prototype.visitDeclaration=function(e,t){t.visitDeeper=!1},e.prototype.visitMixinDefinition=function(e,t){t.visitDeeper=!1},e.prototype.visitRuleset=function(e,t){var n,i=this.contexts[this.contexts.length-1],r=[];this.contexts.push(r),e.root||((n=e.selectors)&&(n=n.filter((function(e){return e.getIsOutput()})),e.selectors=n.length?n:n=null,n&&e.joinSelectors(r,i,n)),n||(e.rules=null),e.paths=r)},e.prototype.visitRulesetOut=function(e){this.contexts.length=this.contexts.length-1},e.prototype.visitMedia=function(e,t){var n=this.contexts[this.contexts.length-1];e.rules[0].root=0===n.length||n[0].multiMedia},e.prototype.visitAtRule=function(e,t){var n=this.contexts[this.contexts.length-1];e.rules&&e.rules.length&&(e.rules[0].root=e.isRooted||0===n.length||null)},e}(),Le=function(){function e(e){this._visitor=new Ee(this),this._context=e}return e.prototype.containsSilentNonBlockedChild=function(e){var t;if(!e)return!1;for(var n=0;n0},e.prototype.resolveVisibility=function(e,t){if(!e.blocksVisibility()){if(this.isEmpty(e)&&!this.containsSilentNonBlockedChild(t))return;return e}var n=e.rules[0];if(this.keepOnlyVisibleChilds(n),!this.isEmpty(n))return e.ensureVisibility(),e.removeVisibilityBlock(),e},e.prototype.isVisibleRuleset=function(e){return!!e.firstRoot||!this.isEmpty(e)&&!(!e.root&&!this.hasVisibleSelector(e))},e}(),Ne=function(e){this._visitor=new Ee(this),this._context=e,this.utils=new Le(e)};Ne.prototype={isReplacing:!0,run:function(e){return this._visitor.visit(e)},visitDeclaration:function(e,t){if(!e.blocksVisibility()&&!e.variable)return e},visitMixinDefinition:function(e,t){e.frames=[]},visitExtend:function(e,t){},visitComment:function(e,t){if(!e.blocksVisibility()&&!e.isSilent(this._context))return e},visitMedia:function(e,t){var n=e.rules[0].rules;return e.accept(this._visitor),t.visitDeeper=!1,this.utils.resolveVisibility(e,n)},visitImport:function(e,t){if(!e.blocksVisibility())return e},visitAtRule:function(e,t){return e.rules&&e.rules.length?this.visitAtRuleWithBody(e,t):this.visitAtRuleWithoutBody(e,t)},visitAnonymous:function(e,t){if(!e.blocksVisibility())return e.accept(this._visitor),e},visitAtRuleWithBody:function(e,t){var n=function(e){var t=e.rules;return function(e){var t=e.rules;return 1===t.length&&(!t[0].paths||0===t[0].paths.length)}(e)?t[0].rules:t}(e);return e.accept(this._visitor),t.visitDeeper=!1,this.utils.isEmpty(e)||this._mergeRules(e.rules[0].rules),this.utils.resolveVisibility(e,n)},visitAtRuleWithoutBody:function(e,t){if(!e.blocksVisibility()){if("@charset"===e.name){if(this.charset){if(e.debugInfo){var n=new Ie.Comment("/* "+e.toCSS(this._context).replace(/\n/g,"")+" */\n");return n.debugInfo=e.debugInfo,this._visitor.visit(n)}return}this.charset=!0}return e}},checkValidNodes:function(e,t){if(e)for(var n=0;n0?e.accept(this._visitor):e.rules=null,t.visitDeeper=!1}return e.rules&&(this._mergeRules(e.rules),this._removeDuplicateRules(e.rules)),this.utils.isVisibleRuleset(e)&&(e.ensureVisibility(),i.splice(0,0,e)),1===i.length?i[0]:i},_compileRulesetPaths:function(e){e.paths&&(e.paths=e.paths.filter((function(e){var t;for(" "===e[0].elements[0].combinator.value&&(e[0].elements[0].combinator=new Ie.Combinator("")),t=0;t=0;i--)if((n=e[i])instanceof Ie.Declaration)if(r[n.name]){(t=r[n.name])instanceof Ie.Declaration&&(t=r[n.name]=[r[n.name].toCSS(this._context)]);var o=n.toCSS(this._context);-1!==t.indexOf(o)?e.splice(i,1):t.push(o)}else r[n.name]=n}},_mergeRules:function(e){if(e){for(var t={},n=[],i=0;i0){var t=e[0],n=[],i=[new Ie.Expression(n)];e.forEach((function(e){"+"===e.merge&&n.length>0&&i.push(new Ie.Expression(n=[])),n.push(e.value),t.important=t.important||e.important})),t.value=new Ie.Value(i)}}))}}};var De={Visitor:Ee,ImportVisitor:Re,MarkVisibleSelectorsVisitor:Ve,ExtendVisitor:$e,JoinSelectorVisitor:Oe,ToCSSVisitor:Ne};var Be=function(){var e,t,n,i,r,o,s,a=[],l={};function u(n){for(var i,a,c,h=l.i,f=t,p=l.i-s,v=l.i+o.length-p,d=l.i+=n,m=e;l.i=0){c={index:l.i,text:m.substr(l.i,y+2-l.i),isLineComment:!1},l.i+=c.text.length-1,l.commentStore.push(c);continue}}break}if(32!==i&&10!==i&&9!==i&&13!==i)break}if(o=o.slice(n+l.i-d+p),s=l.i,!o.length){if(tn||l.i===n&&e&&!i)&&(n=l.i,i=e);var r=a.pop();o=r.current,s=l.i=r.i,t=r.j},l.forget=function(){a.pop()},l.isWhitespace=function(t){var n=l.i+(t||0),i=e.charCodeAt(n);return 32===i||13===i||9===i||10===i},l.$re=function(e){l.i>s&&(o=o.slice(l.i-s),s=l.i);var t=e.exec(o);return t?(u(t[0].length),"string"==typeof t?t:1===t.length?t[0]:t):null},l.$char=function(t){return e.charAt(l.i)!==t?null:(u(1),t)},l.$str=function(t){for(var n=t.length,i=0;ih&&(d=!1)}}while(d);return r||null},l.autoCommentAbsorb=!0,l.commentStore=[],l.finished=!1,l.peek=function(t){if("string"==typeof t){for(var n=0;n57||t<43||47===t||44===t},l.start=function(i,a,c){e=i,l.i=t=s=n=0,r=a?function(e,t){var n,i,r,o,s,a,l,u,c,h=e.length,f=0,p=0,v=[],d=0;function m(t){var n=s-d;n<512&&!t||!n||(v.push(e.slice(d,s+1)),d=s+1)}for(s=0;s=97&&l<=122||l<34))switch(l){case 40:p++,i=s;continue;case 41:if(--p<0)return t("missing opening `(`",s);continue;case 59:p||m();continue;case 123:f++,n=s;continue;case 125:if(--f<0)return t("missing opening `{`",s);f||p||m();continue;case 92:if(s96)){if(u==l){c=1;break}if(92==u){if(s==h-1)return t("unescaped `\\`",s);s++}}if(c)continue;return t("unmatched `"+String.fromCharCode(l)+"`",a);case 47:if(p||s==h-1)continue;if(47==(u=e.charCodeAt(s+1)))for(s+=2;sn&&o>r?"missing closing `}` or `*/`":"missing closing `}`",n):0!==p?t("missing closing `)`",i):(m(!0),v)}(i,c):[i],o=r[0],u(0)},l.end=function(){var t,r=l.i>=e.length;return l.i=e.length-1,furthestChar:e[l.i]}},l},Ue=function e(t,n,i){var r,o=Be();function s(e,t){throw new V({index:o.i,filename:i.filename,type:t||"Syntax",message:e},n)}function a(e,t){var n=e instanceof Function?e.call(r):o.$re(e);if(n)return n;s(t||("string"==typeof e?"expected '"+e+"' got '"+o.currentChar()+"'":"unexpected token"))}function l(e,t){if(o.$char(e))return e;s(t||"expected '"+e+"' got '"+o.currentChar()+"'")}function u(e){var t=i.filename;return{lineNumber:C(e,o.getInput()).line+1,fileName:t}}return{parserInput:o,imports:n,fileInfo:i,parseNode:function(e,t,i,s,a){var l,u=[],c=o;try{c.start(e,!1,(function(e,t){a({message:e,index:t+i})}));for(var h=0,f=void 0,p=void 0;f=t[h];h++)if(p=c.i,l=r[f]()){try{l._index=p+i,l._fileInfo=s}catch(e){}u.push(l)}else u.push(null);c.end().isFinished?a(null,u):a(!0,null)}catch(e){throw new V({index:e.index+i,message:e.message},n,s.filename)}},parse:function(r,s,a){var l,u,c,h,f=null,p="";if(u=a&&a.globalVars?e.serializeVars(a.globalVars)+"\n":"",c=a&&a.modifyVars?"\n"+e.serializeVars(a.modifyVars):"",t.pluginManager)for(var v=t.pluginManager.getPreProcessors(),d=0;d");return e},args:function(e){var t,n,i,a,l,u,c,h=r.entities,f={args:null,variadic:!1},p=[],v=[],d=[],m=!0;for(o.save();;){if(e)u=r.detachedRuleset()||r.expression();else{if(o.commentStore.length=0,o.$str("...")){f.variadic=!0,o.$char(";")&&!t&&(t=!0),(t?v:d).push({variadic:!0});break}u=h.variable()||h.property()||h.literal()||h.keyword()||this.call(!0)}if(!u||!m)break;a=null,u.throwAwayComments&&u.throwAwayComments(),l=u;var g=null;if(e?u.value&&1==u.value.length&&(g=u.value[0]):g=u,g&&(g instanceof Ie.Variable||g instanceof Ie.Property))if(o.$char(":")){if(p.length>0&&(t&&s("Cannot mix ; and , as delimiter types"),n=!0),!(l=r.detachedRuleset()||r.expression())){if(!e)return o.restore(),f.args=[],f;s("could not understand value for named argument")}a=i=g.name}else if(o.$str("...")){if(!e){f.variadic=!0,o.$char(";")&&!t&&(t=!0),(t?v:d).push({name:u.name,variadic:!0});break}c=!0}else e||(i=a=g.name,l=null);l&&p.push(l),d.push({name:a,value:l,expand:c}),o.$char(",")?m=!0:((m=";"===o.$char(";"))||t)&&(n&&s("Cannot mix ; and , as delimiter types"),t=!0,p.length>1&&(l=new Ie.Value(p)),v.push({name:i,value:l,expand:c}),i=null,p=[],n=!1)}return o.forget(),f.args=t?v:d,f},definition:function(){var e,t,n,i,s=[],l=!1;if(!("."!==o.currentChar()&&"#"!==o.currentChar()||o.peek(/^[^{]*\}/)))if(o.save(),t=o.$re(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/)){e=t[1];var u=this.args(!1);if(s=u.args,l=u.variadic,!o.$char(")"))return void o.restore("Missing closing ')'");if(o.commentStore.length=0,o.$str("when")&&(i=a(r.conditions,"expected condition")),n=r.block())return o.forget(),new Ie.mixin.Definition(e,s,n,i,l);o.restore()}else o.restore()},ruleLookups:function(){var e,t=[];if("["===o.currentChar()){for(;;){if(o.save(),!(e=this.lookupValue())&&""!==e){o.restore();break}t.push(e),o.forget()}return t.length>0?t:void 0}},lookupValue:function(){if(o.save(),o.$char("[")){var e=o.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);if(o.$char("]"))return e||""===e?(o.forget(),e):void o.restore();o.restore()}else o.restore()}},entity:function(){var e=this.entities;return this.comment()||e.literal()||e.variable()||e.url()||e.property()||e.call()||e.keyword()||this.mixin.call(!0)||e.javascript()},end:function(){return o.$char(";")||o.peek("}")},ieAlpha:function(){var e;if(o.$re(/^opacity=/i))return(e=o.$re(/^\d+/))||(e="@{"+(e=a(r.entities.variable,"Could not parse alpha")).name.slice(1)+"}"),l(")"),new Ie.Quoted("","alpha(opacity="+e+")")},element:function(){var e,t,n,r=o.i;if(t=this.combinator(),(e=o.$re(/^(?:\d+\.\d+|\d+)%/)||o.$re(/^(?:[.#]?|:*)(?:[\w-]|[^\x00-\x9f]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/)||o.$char("*")||o.$char("&")||this.attribute()||o.$re(/^\([^&()@]+\)/)||o.$re(/^[\.#:](?=@)/)||this.entities.variableCurly())||(o.save(),o.$char("(")?(n=this.selector(!1))&&o.$char(")")?(e=new Ie.Paren(n),o.forget()):o.restore("Missing closing ')'"):o.forget()),e)return new Ie.Element(t,e,e instanceof Ie.Variable,r,i)},combinator:function(){var e=o.currentChar();if("/"===e){o.save();var t=o.$re(/^\/[a-z]+\//i);if(t)return o.forget(),new Ie.Combinator(t);o.restore()}if(">"===e||"+"===e||"~"===e||"|"===e||"^"===e){for(o.i++,"^"===e&&"^"===o.currentChar()&&(e="^^",o.i++);o.isWhitespace();)o.i++;return new Ie.Combinator(e)}return o.isWhitespace(-1)?new Ie.Combinator(" "):new Ie.Combinator(null)},selector:function(e){var t,n,r,l,u,c,h,f=o.i;for(e=!1!==e;(e&&(n=this.extend())||e&&(c=o.$str("when"))||(l=this.element()))&&(c?h=a(this.conditions,"expected condition"):h?s("CSS guard can only be used at the end of selector"):n?u=u?u.concat(n):n:(u&&s("Extend can only be used at the end of selector"),r=o.currentChar(),t?t.push(l):t=[l],l=null),"{"!==r&&"}"!==r&&";"!==r&&","!==r&&")"!==r););if(t)return new Ie.Selector(t,u,h,f,i);u&&s("Extend must be used to extend a selector, it cannot be used on its own")},selectors:function(){for(var e,t;(e=this.selector())&&(t?t.push(e):t=[e],o.commentStore.length=0,e.condition&&t.length>1&&s("Guards are only currently allowed on a single selector."),o.$char(","));)e.condition&&s("Guards are only currently allowed on a single selector."),o.commentStore.length=0;return t},attribute:function(){if(o.$char("[")){var e,t,n,i=this.entities;return(e=i.variableCurly())||(e=a(/^(?:[_A-Za-z0-9-\*]*\|)?(?:[_A-Za-z0-9-]|\\.)+/)),(n=o.$re(/^[|~*$^]?=/))&&(t=i.quoted()||o.$re(/^[0-9]+%/)||o.$re(/^[\w-]+/)||i.variableCurly()),l("]"),new Ie.Attribute(e,n,t)}},block:function(){var e;if(o.$char("{")&&(e=this.primary())&&o.$char("}"))return e},blockRuleset:function(){var e=this.block();return e&&(e=new Ie.Ruleset(null,e)),e},detachedRuleset:function(){var e,t,n;if(o.save(),!o.$re(/^[.#]\(/)||(t=(e=this.mixin.args(!1)).args,n=e.variadic,o.$char(")"))){var i=this.blockRuleset();if(i)return o.forget(),t?new Ie.mixin.Definition(null,t,i,null,n):new Ie.DetachedRuleset(i);o.restore()}else o.restore()},ruleset:function(){var e,n,i;if(o.save(),t.dumpLineNumbers&&(i=u(o.i)),(e=this.selectors())&&(n=this.block())){o.forget();var r=new Ie.Ruleset(e,n,t.strictImports);return t.dumpLineNumbers&&(r.debugInfo=i),r}o.restore()},declaration:function(){var e,t,n,r,s,a,l=o.i,u=o.currentChar();if("."!==u&&"#"!==u&&"&"!==u&&":"!==u)if(o.save(),e=this.variable()||this.ruleProperty()){if((a="string"==typeof e)&&(t=this.detachedRuleset())&&(n=!0),o.commentStore.length=0,!t){if(s=!a&&e.length>1&&e.pop().value,t=e[0].value&&"--"===e[0].value.slice(0,2)?this.permissiveValue():this.anonymousValue())return o.forget(),new Ie.Declaration(e,t,!1,s,l,i);t||(t=this.value()),t?r=this.important():a&&(t=this.permissiveValue())}if(t&&(this.end()||n))return o.forget(),new Ie.Declaration(e,t,r,s,l,i);o.restore()}else o.restore()},anonymousValue:function(){var e=o.i,t=o.$re(/^([^.#@\$+\/'"*`(;{}-]*);/);if(t)return new Ie.Anonymous(t[1],e)},permissiveValue:function(e){var t,n,r,a,l=e||";",u=o.i,c=[];function h(){var e=o.currentChar();return"string"==typeof l?e===l:l.test(e)}if(!h()){a=[];do{((n=this.comment())||(n=this.entity()))&&a.push(n)}while(n);if(r=h(),a.length>0){if(a=new Ie.Expression(a),r)return a;c.push(a)," "===o.prevChar()&&c.push(new Ie.Anonymous(" ",u))}if(o.save(),a=o.$parseUntil(l)){if("string"==typeof a&&s("Expected '"+a+"'","Parse"),1===a.length&&" "===a[0])return o.forget(),new Ie.Anonymous("",u);var f=void 0;for(t=0;t0)return new Ie.Expression(r)},mediaFeatures:function(){var e,t=this.entities,n=[];do{if(e=this.mediaFeature()){if(n.push(e),!o.$char(","))break}else if((e=t.variable()||t.mixinLookup())&&(n.push(e),!o.$char(",")))break}while(e);return n.length>0?n:null},media:function(){var e,n,r,a,l=o.i;if(t.dumpLineNumbers&&(a=u(l)),o.save(),o.$str("@media"))return e=this.mediaFeatures(),(n=this.block())||s("media definitions require block statements after any features"),o.forget(),r=new Ie.Media(n,e,l,i),t.dumpLineNumbers&&(r.debugInfo=a),r;o.restore()},plugin:function(){var e,t,n,r=o.i;if(o.$re(/^@plugin?\s+/)){if(n=(t=this.pluginArgs())?{pluginArgs:t,isPlugin:!0}:{isPlugin:!0},e=this.entities.quoted()||this.entities.url())return o.$char(";")||(o.i=r,s("missing semi-colon on @plugin")),new Ie.Import(e,null,n,r,i);o.i=r,s("malformed @plugin statement")}},pluginArgs:function(){if(o.save(),!o.$char("("))return o.restore(),null;var e=o.$re(/^\s*([^\);]+)\)\s*/);return e[1]?(o.forget(),e[1].trim()):(o.restore(),null)},atrule:function(){var e,n,r,a,l,c,h,f=o.i,p=!0,v=!0;if("@"===o.currentChar()){if(n=this.import()||this.plugin()||this.media())return n;if(o.save(),e=o.$re(/^@[a-z-]+/)){switch(a=e,"-"==e.charAt(1)&&e.indexOf("-",2)>0&&(a="@"+e.slice(e.indexOf("-",2)+1)),a){case"@charset":l=!0,p=!1;break;case"@namespace":c=!0,p=!1;break;case"@keyframes":case"@counter-style":l=!0;break;case"@document":case"@supports":h=!0,v=!1;break;default:h=!0}if(o.commentStore.length=0,l?(n=this.entity())||s("expected "+e+" identifier"):c?(n=this.expression())||s("expected "+e+" expression"):h&&(n=this.permissiveValue(/^[{;]/),p="{"===o.currentChar(),n?n.value||(n=null):p||";"===o.currentChar()||s(e+" rule is missing block or ending semi-colon")),p&&(r=this.blockRuleset()),r||!p&&n&&o.$char(";"))return o.forget(),new Ie.AtRule(e,n,r,f,i,t.dumpLineNumbers?u(f):null,v);o.restore("at-rule options not recognised")}}},value:function(){var e,t=[],n=o.i;do{if((e=this.expression())&&(t.push(e),!o.$char(",")))break}while(e);if(t.length>0)return new Ie.Value(t,n)},important:function(){if("!"===o.currentChar())return o.$re(/^! *important/)},sub:function(){var e,t;if(o.save(),o.$char("("))return(e=this.addition())&&o.$char(")")?(o.forget(),(t=new Ie.Expression([e])).parens=!0,t):void o.restore("Expected ')'");o.restore()},multiplication:function(){var e,t,n,i,r;if(e=this.operand()){for(r=o.isWhitespace(-1);!o.peek(/^\/[*\/]/);){if(o.save(),!(n=o.$char("/")||o.$char("*")||o.$str("./"))){o.forget();break}if(!(t=this.operand())){o.restore();break}o.forget(),e.parensInOp=!0,t.parensInOp=!0,i=new Ie.Operation(n,[i||e,t],r),r=o.isWhitespace(-1)}return i||e}},addition:function(){var e,t,n,i,r;if(e=this.multiplication()){for(r=o.isWhitespace(-1);(n=o.$re(/^[-+]\s+/)||!r&&(o.$char("+")||o.$char("-")))&&(t=this.multiplication());)e.parensInOp=!0,t.parensInOp=!0,i=new Ie.Operation(n,[i||e,t],r),r=o.isWhitespace(-1);return i||e}},conditions:function(){var e,t,n,i=o.i;if(e=this.condition(!0)){for(;o.peek(/^,\s*(not\s*)?\(/)&&o.$char(",")&&(t=this.condition(!0));)n=new Ie.Condition("or",n||e,t,i);return n||e}},condition:function(e){var t,n,i;if(t=this.conditionAnd(e)){if(n=o.$str("or")){if(!(i=this.condition(e)))return;t=new Ie.Condition(n,t,i)}return t}},conditionAnd:function(e){var t,n,i,r,s=this;if(t=(r=s.negatedCondition(e)||s.parenthesisCondition(e))||e?r:s.atomicCondition(e)){if(n=o.$str("and")){if(!(i=this.conditionAnd(e)))return;t=new Ie.Condition(n,t,i)}return t}},negatedCondition:function(e){if(o.$str("not")){var t=this.parenthesisCondition(e);return t&&(t.negate=!t.negate),t}},parenthesisCondition:function(e){var t;if(o.save(),o.$str("(")){if(t=function(t){var n;if(o.save(),n=t.condition(e)){if(o.$char(")"))return o.forget(),n;o.restore()}else o.restore()}(this))return o.forget(),t;if(t=this.atomicCondition(e)){if(o.$char(")"))return o.forget(),t;o.restore("expected ')' got '"+o.currentChar()+"'")}else o.restore()}else o.restore()},atomicCondition:function(e){var t,n,i,r,a=this.entities,l=o.i;function u(){return this.addition()||a.keyword()||a.quoted()||a.mixinLookup()}if(t=(u=u.bind(this))())return o.$char(">")?r=o.$char("=")?">=":">":o.$char("<")?r=o.$char("=")?"<=":"<":o.$char("=")&&(r=o.$char(">")?"=>":o.$char("<")?"=<":"="),r?(n=u())?i=new Ie.Condition(r,t,n,l,!1):s("expected expression"):i=new Ie.Condition("=",t,new Ie.Keyword("true"),l,!1),i},operand:function(){var e,t=this.entities;o.peek(/^-[@\$\(]/)&&(e=o.$char("-"));var n=this.sub()||t.dimension()||t.color()||t.variable()||t.property()||t.call()||t.quoted(!0)||t.colorKeyword()||t.mixinLookup();return e&&(n.parensInOp=!0,n=new Ie.Negative(n)),n},expression:function(){var e,t,n=[],i=o.i;do{(e=this.comment())?n.push(e):((e=this.addition()||this.entity())instanceof Ie.Comment&&(e=null),e&&(n.push(e),o.peek(/^\/[\/*]/)||(t=o.$char("/"))&&n.push(new Ie.Anonymous(t,i))))}while(e);if(n.length>0)return new Ie.Expression(n)},property:function(){var e=o.$re(/^(\*?-?[_a-zA-Z0-9-]+)\s*:/);if(e)return e[1]},ruleProperty:function(){var e,t,n=[],r=[];o.save();var s=o.$re(/^([_a-zA-Z0-9-]+)\s*:/);if(s)return n=[new Ie.Keyword(s[1])],o.forget(),n;function a(e){var t=o.i,i=o.$re(e);if(i)return r.push(t),n.push(i[1])}for(a(/^(\*?)/);a(/^((?:[\w-]+)|(?:[@\$]\{[\w-]+\}))/););if(n.length>1&&a(/^((?:\+_|\+)?)\s*:/)){for(o.forget(),""===n[0]&&(n.shift(),r.shift()),t=0;t1?e-1:e)<1?r+(o-r)*e*6:2*e<1?o:3*e<2?r+(o-r)*(2/3-e)*6:r}e=He(e)%360/360,t=ze(He(t)),n=ze(He(n)),i=ze(He(i)),r=2*n-(o=n<=.5?n*(t+1):n+t-n*t);var a=[255*s(e+1/3),255*s(e),255*s(e-1/3)];return i=He(i),new p(a,i,"hsla")}catch(e){}},hsv:function(e,t,n){return je.hsva(e,t,n,1)},hsva:function(e,t,n,i){var r,o;e=He(e)%360/360*360,t=He(t),n=He(n),i=He(i);var s=[n,n*(1-t),n*(1-(o=e/60-(r=Math.floor(e/60%6)))*t),n*(1-(1-o)*t)],a=[[0,3,1],[2,0,1],[1,0,3],[1,2,0],[3,1,0],[0,1,2]];return je.rgba(255*s[a[r][0]],255*s[a[r][1]],255*s[a[r][2]],i)},hue:function(e){return new ee(We(e).h)},saturation:function(e){return new ee(100*We(e).s,"%")},lightness:function(e){return new ee(100*We(e).l,"%")},hsvhue:function(e){return new ee(Je(e).h)},hsvsaturation:function(e){return new ee(100*Je(e).s,"%")},hsvvalue:function(e){return new ee(100*Je(e).v,"%")},red:function(e){return new ee(e.rgb[0])},green:function(e){return new ee(e.rgb[1])},blue:function(e){return new ee(e.rgb[2])},alpha:function(e){return new ee(We(e).a)},luma:function(e){return new ee(e.luma()*e.alpha*100,"%")},luminance:function(e){var t=.2126*e.rgb[0]/255+.7152*e.rgb[1]/255+.0722*e.rgb[2]/255;return new ee(t*e.alpha*100,"%")},saturate:function(e,t,n){if(!e.rgb)return null;var i=We(e);return void 0!==n&&"relative"===n.value?i.s+=i.s*t.value/100:i.s+=t.value/100,i.s=ze(i.s),Ge(e,i)},desaturate:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.s-=i.s*t.value/100:i.s-=t.value/100,i.s=ze(i.s),Ge(e,i)},lighten:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.l+=i.l*t.value/100:i.l+=t.value/100,i.l=ze(i.l),Ge(e,i)},darken:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.l-=i.l*t.value/100:i.l-=t.value/100,i.l=ze(i.l),Ge(e,i)},fadein:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.a+=i.a*t.value/100:i.a+=t.value/100,i.a=ze(i.a),Ge(e,i)},fadeout:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.a-=i.a*t.value/100:i.a-=t.value/100,i.a=ze(i.a),Ge(e,i)},fade:function(e,t){var n=We(e);return n.a=t.value/100,n.a=ze(n.a),Ge(e,n)},spin:function(e,t){var n=We(e),i=(n.h+t.value)%360;return n.h=i<0?360+i:i,Ge(e,n)},mix:function(e,t,n){n||(n=new ee(50));var i=n.value/100,r=2*i-1,o=We(e).a-We(t).a,s=((r*o==-1?r:(r+o)/(1+r*o))+1)/2,a=1-s,l=[e.rgb[0]*s+t.rgb[0]*a,e.rgb[1]*s+t.rgb[1]*a,e.rgb[2]*s+t.rgb[2]*a],u=e.alpha*i+t.alpha*(1-i);return new p(l,u)},greyscale:function(e){return je.desaturate(e,new ee(100))},contrast:function(e,t,n,i){if(!e.rgb)return null;if(void 0===n&&(n=je.rgba(255,255,255,1)),void 0===t&&(t=je.rgba(0,0,0,1)),t.luma()>n.luma()){var r=n;n=t,t=r}return i=void 0===i?.43:He(i),e.luma().5&&(i=1,n=e>.25?Math.sqrt(e):((16*e-12)*e+4)*e),e-(1-2*t)*i*(n-e)},hardlight:function(e,t){return Ze.overlay(t,e)},difference:function(e,t){return Math.abs(e-t)},exclusion:function(e,t){return e+t-2*e*t},average:function(e,t){return(e+t)/2},negation:function(e,t){return 1-Math.abs(e+t-1)}};for(var Xe in Ze)Ze.hasOwnProperty(Xe)&&(Ke[Xe]=Ke.bind(null,Ze[Xe]));var Ye=function(e){return Array.isArray(e.value)?e.value:Array(e)},et={_SELF:function(e){return e},"~":function(){for(var e=[],t=0;ts.value)&&(c[i]=r);else{if(void 0!==l&&a!==l)throw{type:"Argument",message:"incompatible types"};h[a]=c.length,c.push(r)}else Array.isArray(t[n].value)&&Array.prototype.push.apply(t,Array.prototype.slice.call(t[n].value));return 1==c.length?c[0]:(t=c.map((function(e){return e.toCSS(this.context)})).join(this.context.compress?",":", "),new N((e?"min":"max")+"("+t+")"))},ot={min:function(){for(var e=[],t=0;t",r=0;r";return i+="',i=encodeURIComponent(i),new ce(new ue("'"+(i="data:image/svg+xml,"+i)+"'",i,!1,this.index,this.currentFileInfo),this.index,this.currentFileInfo)}}),H.addMultiple(ut),t};function ht(e,t){var n,i=(t=t||{}).variables,r=new j.Eval(t);"object"!=typeof i||Array.isArray(i)||(i=Object.keys(i).map((function(e){var t=i[e];return t instanceof Ie.Value||(t instanceof Ie.Expression||(t=new Ie.Expression([t])),t=new Ie.Value([t])),new Ie.Declaration("@"+e,t,!1,null,0)})),r.frames=[new Ie.Ruleset(null,i)]);var o,s,a=[new De.JoinSelectorVisitor,new De.MarkVisibleSelectorsVisitor(!0),new De.ExtendVisitor,new De.ToCSSVisitor({compress:Boolean(t.compress)})],l=[];if(t.pluginManager){s=t.pluginManager.visitor();for(var u=0;u<2;u++)for(s.first();o=s.get();)o.isPreEvalVisitor?0!==u&&-1!==l.indexOf(o)||(l.push(o),o.run(e)):0!==u&&-1!==a.indexOf(o)||(o.isPreVisitor?a.unshift(o):a.push(o))}n=e.eval(r);for(u=0;u=t);n++);this.preProcessors.splice(n,0,{preProcessor:e,priority:t})},e.prototype.addPostProcessor=function(e,t){var n;for(n=0;n=t);n++);this.postProcessors.splice(n,0,{postProcessor:e,priority:t})},e.prototype.addFileManager=function(e){this.fileManagers.push(e)},e.prototype.getPreProcessors=function(){for(var e=[],t=0;t0){var i=void 0,r=JSON.stringify(this._sourceMapGenerator.toJSON());this.sourceMapURL?i=this.sourceMapURL:this._sourceMapFilename&&(i=this._sourceMapFilename),this.sourceMapURL=i,this.sourceMap=r}return this._css.join("")},t}()}(e=new o(e,t)),e)),a=function(e){return function(){function t(e,t,n){this.less=e,this.rootFilename=n.filename,this.paths=t.paths||[],this.contents={},this.contentsIgnoredChars={},this.mime=t.mime,this.error=null,this.context=t,this.queue=[],this.files={}}return t.prototype.push=function(t,n,i,o,s){var a=this,l=this.context.pluginManager.Loader;this.queue.push(t);var u=function(e,n,i){a.queue.splice(a.queue.indexOf(t),1);var l=i===a.rootFilename;o.optional&&e?(s(null,{rules:[]},!1,null),r.info("The file "+i+" was skipped because it was not found and the import was marked optional.")):(a.files[i]||o.inline||(a.files[i]={root:n,options:o}),e&&!a.error&&(a.error=e),s(e,n,l,i))},c={rewriteUrls:this.context.rewriteUrls,entryPath:i.entryPath,rootpath:i.rootpath,rootFilename:i.rootFilename},h=e.getFileManager(t,i.currentDirectory,this.context,e);if(h){var f,p,v=function(e){var t,n=e.filename,r=e.contents.replace(/^\uFEFF/,"");c.currentDirectory=h.getPath(n),c.rewriteUrls&&(c.rootpath=h.join(a.context.rootpath||"",h.pathDiff(c.currentDirectory,c.entryPath)),!h.isPathAbsolute(c.rootpath)&&h.alwaysMakePathsAbsolute()&&(c.rootpath=h.join(c.entryPath,c.rootpath))),c.filename=n;var s=new j.Parse(a.context);s.processImports=!1,a.contents[n]=r,(i.reference||o.reference)&&(c.reference=!0),o.isPlugin?(t=l.evalPlugin(r,s,a,o.pluginArgs,c))instanceof V?u(t,null,n):u(null,t,n):o.inline?u(null,r,n):!a.files[n]||a.files[n].options.multiple||o.multiple?new Ue(s,a,c).parse(r,(function(e,t){u(e,t,n)})):u(null,a.files[n].root,n)},d=_(this.context);n&&(d.ext=o.isPlugin?".js":".less"),o.isPlugin?(d.mime="application/javascript",d.syncImport?f=l.loadPluginSync(t,i.currentDirectory,d,e,h):p=l.loadPlugin(t,i.currentDirectory,d,e,h)):d.syncImport?f=h.loadFileSync(t,i.currentDirectory,d,e):p=h.loadFile(t,i.currentDirectory,d,e,(function(e,t){e?u(e):v(t)})),f?f.filename?v(f):u(f):p&&p.then(v,u)}else u({message:"Could not find a file-manager for "+t})},t}()}(e);var u,c=function(e,t,n){var i=function(e,n,r){if("function"==typeof n?(r=n,n=M(this.options,{})):n=M(this.options,n||{}),!r){var o=this;return new Promise((function(t,r){i.call(o,e,n,(function(e,n){e?r(e):t(n)}))}))}this.parse(e,n,(function(e,n,i,o){if(e)return r(e);var s;try{s=new t(n,i).toCSS(o)}catch(e){return r(e)}r(null,s)}))};return i}(0,s),h=function(e,t,n){var i=function(e,t,r){if("function"==typeof t?(r=t,t=M(this.options,{})):t=M(this.options,t||{}),!r){var o=this;return new Promise((function(n,r){i.call(o,e,t,(function(e,t){e?r(e):n(t)}))}))}var s,a=void 0,l=new mt(this,!t.reUsePluginManager);if(t.pluginManager=l,s=new j.Parse(t),t.rootFileInfo)a=t.rootFileInfo;else{var u=t.filename||"input",c=u.replace(/[^\/\\]*$/,"");(a={filename:u,rewriteUrls:s.rewriteUrls,rootpath:s.rootpath||"",currentDirectory:c,entryPath:c,rootFilename:u}).rootpath&&"/"!==a.rootpath.slice(-1)&&(a.rootpath+="/")}var h=new n(this,s,a);this.importManager=h,t.plugins&&t.plugins.forEach((function(e){var t,n;if(e.fileContent){if(n=e.fileContent.replace(/^\uFEFF/,""),(t=l.Loader.evalPlugin(n,s,h,e.options,e.filename))instanceof V)return r(t)}else l.addPlugin(e)})),new Ue(s,h,a).parse(e,(function(e,n){if(e)return r(e);r(null,n,h,t)}),t)};return i}(0,0,a),f={version:[4,0,0],data:l,tree:Ie,Environment:o,AbstractFileManager:Ce,AbstractPluginLoader:ke,environment:e,visitors:De,Parser:Ue,functions:ct(e),contexts:j,SourceMapOutput:n,SourceMapBuilder:i,ParseTree:s,ImportManager:a,render:c,parse:h,LessError:V,transformTree:ht,utils:P,PluginManager:mt,logger:r},p=function(e){return function(){var t=Object.create(e.prototype);return e.apply(t,Array.prototype.slice.call(arguments,0)),t}},v=Object.create(f);for(var d in f.tree)if("function"==typeof(u=f.tree[d]))v[d.toLowerCase()]=p(u);else for(var m in v[d]=Object.create(null),u)v[d][m.toLowerCase()]=p(u[m]);return f.parse=f.parse.bind(v),f.render=f.render.bind(v),v}var yt={},bt=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return h(t,e),t.prototype.alwaysMakePathsAbsolute=function(){return!0},t.prototype.join=function(e,t){return e?this.extractUrlParts(t,e).path:t},t.prototype.doXHR=function(e,t,n,i){var r=new XMLHttpRequest,o=!pt.isFileProtocol||pt.fileAsync;function s(t,n,i){t.status>=200&&t.status<300?n(t.responseText,t.getResponseHeader("Last-Modified")):"function"==typeof i&&i(t.status,e)}"function"==typeof r.overrideMimeType&&r.overrideMimeType("text/css"),vt.debug("XHR: Getting '"+e+"'"),r.open("GET",e,o),r.setRequestHeader("Accept",t||"text/x-less, text/css; q=0.9, */*; q=0.5"),r.send(null),pt.isFileProtocol&&!pt.fileAsync?0===r.status||r.status>=200&&r.status<300?n(r.responseText):i(r.status,e):o?r.onreadystatechange=function(){4==r.readyState&&s(r,n,i)}:s(r,n,i)},t.prototype.supports=function(){return!0},t.prototype.clearFileCache=function(){yt={}},t.prototype.loadFile=function(e,t,n,i){t&&!this.isPathAbsolute(e)&&(e=t+e),e=n.ext?this.tryAppendExtension(e,n.ext):e,n=n||{};var r=this.extractUrlParts(e,window.location.href).url,o=this;return new Promise((function(e,t){if(n.useFileCache&&yt[r])try{var i=yt[r];return e({contents:i,filename:r,webInfo:{lastModified:new Date}})}catch(e){return t({filename:r,message:"Error loading file "+r+" error was "+e.message})}o.doXHR(r,n.mime,(function(t,n){yt[r]=t,e({contents:t,filename:r,webInfo:{lastModified:n}})}),(function(e,n){t({type:"File",message:"'"+n+"' wasn't found ("+e+")",href:r})}))}))},t}(Ce),wt=function(e,t){return pt=e,vt=t,bt},xt=function(e){function t(t){var n=e.call(this)||this;return n.less=t,n}return h(t,e),t.prototype.loadPlugin=function(e,t,n,i,r){return new Promise((function(o,s){r.loadFile(e,t,n,i).then(o).catch(s)}))},t}(ke),St=function(t,i,r){return{add:function(o,s){r.errorReporting&&"html"!==r.errorReporting?"console"===r.errorReporting?function(e,t){var n=e.filename||t,o=[],s=(e.type||"Syntax")+"Error: "+(e.message||"There is an error in your .less file")+" in "+n,a=function(e,t,n){void 0!==e.extract[t]&&o.push("{line} {content}".replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,n).replace(/\{content\}/,e.extract[t]))};e.line&&(a(e,0,""),a(e,1,"line"),a(e,2,""),s+=" on line "+e.line+", column "+(e.column+1)+":\n"+o.join("\n")),e.stack&&(e.extract||r.logLevel>=4)&&(s+="\nStack Trace\n"+e.stack),i.logger.error(s)}(o,s):"function"==typeof r.errorReporting&&r.errorReporting("add",o,s):function(i,o){var s,a,l="less-error-message:"+e(o||""),u=t.document.createElement("div"),c=[],h=i.filename||o,f=h.match(/([^\/]+(\?.*)?)$/)[1];u.id=l,u.className="less-error-message",a="

    "+(i.type||"Syntax")+"Error: "+(i.message||"There is an error in your .less file")+'

    in '+f+" ";var p=function(e,t,n){void 0!==e.extract[t]&&c.push('

  • {content}
  • '.replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,n).replace(/\{content\}/,e.extract[t]))};i.line&&(p(i,0,""),p(i,1,"line"),p(i,2,""),a+="on line "+i.line+", column "+(i.column+1)+":

      "+c.join("")+"
    "),i.stack&&(i.extract||r.logLevel>=4)&&(a+="
    Stack Trace
    "+i.stack.split("\n").slice(1).join("
    ")),u.innerHTML=a,n(t.document,[".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #dd6666;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.line {","color: #ff0000;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),u.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),"development"===r.env&&(s=setInterval((function(){var e=t.document,n=e.body;n&&(e.getElementById(l)?n.replaceChild(u,e.getElementById(l)):n.insertBefore(u,n.firstChild),clearInterval(s))}),10))}(o,s)},remove:function(n){r.errorReporting&&"html"!==r.errorReporting?"console"===r.errorReporting||"function"==typeof r.errorReporting&&r.errorReporting("remove",n):function(n){var i=t.document.getElementById("less-error-message:"+e(n));i&&i.parentNode.removeChild(i)}(n)}}},It={javascriptEnabled:!1,depends:!1,compress:!1,lint:!1,paths:[],color:!0,strictImports:!1,insecure:!1,rootpath:"",rewriteUrls:!1,math:1,strictUnits:!1,globalVars:null,modifyVars:null,urlArgs:""};if(window.less)for(var Ct in window.less)window.less.hasOwnProperty(Ct)&&(It[Ct]=window.less[Ct]);!function(e,n){t(n,i(e)),void 0===n.isFileProtocol&&(n.isFileProtocol=/^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(e.location.protocol)),n.async=n.async||!1,n.fileAsync=n.fileAsync||!1,n.poll=n.poll||(n.isFileProtocol?1e3:1500),n.env=n.env||("127.0.0.1"==e.location.hostname||"0.0.0.0"==e.location.hostname||"localhost"==e.location.hostname||e.location.port&&e.location.port.length>0||n.isFileProtocol?"development":"production");var r=/!dumpLineNumbers:(comments|mediaquery|all)/.exec(e.location.hash);r&&(n.dumpLineNumbers=r[1]),void 0===n.useFileCache&&(n.useFileCache=!0),void 0===n.onReady&&(n.onReady=!0),n.relativeUrls&&(n.rewriteUrls="all")}(window,It),It.plugins=It.plugins||[],window.LESS_PLUGINS&&(It.plugins=It.plugins.concat(window.LESS_PLUGINS));var kt,_t,At,Mt=function(e,i){var r=e.document,o=gt();o.options=i;var s=o.environment,a=wt(i,o.logger),l=new a;s.addFileManager(l),o.FileManager=a,o.PluginLoader=xt,function(e,t){t.logLevel=void 0!==t.logLevel?t.logLevel:"development"===t.env?3:1,t.loggers||(t.loggers=[{debug:function(e){t.logLevel>=4&&console.log(e)},info:function(e){t.logLevel>=3&&console.log(e)},warn:function(e){t.logLevel>=2&&console.warn(e)},error:function(e){t.logLevel>=1&&console.error(e)}}]);for(var n=0;n 0 && styleNode.childNodes.length > 0 &&\n oldStyleNode.firstChild.nodeValue === styleNode.firstChild.nodeValue);\n }\n\n const head = document.getElementsByTagName('head')[0];\n\n // If there is no oldStyleNode, just append; otherwise, only append if we need\n // to replace oldStyleNode with an updated stylesheet\n if (oldStyleNode === null || keepOldStyleNode === false) {\n const nextEl = sheet && sheet.nextSibling || null;\n if (nextEl) {\n nextEl.parentNode.insertBefore(styleNode, nextEl);\n } else {\n head.appendChild(styleNode);\n }\n }\n if (oldStyleNode && keepOldStyleNode === false) {\n oldStyleNode.parentNode.removeChild(oldStyleNode);\n }\n\n // For IE.\n // This needs to happen *after* the style element is added to the DOM, otherwise IE 7 and 8 may crash.\n // See http://social.msdn.microsoft.com/Forums/en-US/7e081b65-878a-4c22-8e68-c10d39c2ed32/internet-explorer-crashes-appending-style-element-to-head\n if (styleNode.styleSheet) {\n try {\n styleNode.styleSheet.cssText = styles;\n } catch (e) {\n throw new Error('Couldn\\'t reassign styleSheet.cssText.');\n }\n }\n },\n currentScript: function(window) {\n const document = window.document;\n return document.currentScript || (() => {\n const scripts = document.getElementsByTagName('script');\n return scripts[scripts.length - 1];\n })();\n }\n};\n","export default {\n error: function(msg) {\n this._fireEvent('error', msg);\n },\n warn: function(msg) {\n this._fireEvent('warn', msg);\n },\n info: function(msg) {\n this._fireEvent('info', msg);\n },\n debug: function(msg) {\n this._fireEvent('debug', msg);\n },\n addListener: function(listener) {\n this._listeners.push(listener);\n },\n removeListener: function(listener) {\n for (let i = 0; i < this._listeners.length; i++) {\n if (this._listeners[i] === listener) {\n this._listeners.splice(i, 1);\n return;\n }\n }\n },\n _fireEvent: function(type, msg) {\n for (let i = 0; i < this._listeners.length; i++) {\n const logFunction = this._listeners[i][type];\n if (logFunction) {\n logFunction(msg);\n }\n }\n },\n _listeners: []\n};\n","/**\n * @todo Document why this abstraction exists, and the relationship between\n * environment, file managers, and plugin manager\n */\n\nimport logger from '../logger';\n\nclass Environment {\n constructor(externalEnvironment, fileManagers) {\n this.fileManagers = fileManagers || [];\n externalEnvironment = externalEnvironment || {};\n\n const optionalFunctions = ['encodeBase64', 'mimeLookup', 'charsetLookup', 'getSourceMapGenerator'];\n const requiredFunctions = [];\n const functions = requiredFunctions.concat(optionalFunctions);\n\n for (let i = 0; i < functions.length; i++) {\n const propName = functions[i];\n const environmentFunc = externalEnvironment[propName];\n if (environmentFunc) {\n this[propName] = environmentFunc.bind(externalEnvironment);\n } else if (i < requiredFunctions.length) {\n this.warn(`missing required function in environment - ${propName}`);\n }\n }\n }\n\n getFileManager(filename, currentDirectory, options, environment, isSync) {\n\n if (!filename) {\n logger.warn('getFileManager called with no filename.. Please report this issue. continuing.');\n }\n if (currentDirectory == null) {\n logger.warn('getFileManager called with null directory.. Please report this issue. continuing.');\n }\n\n let fileManagers = this.fileManagers;\n if (options.pluginManager) {\n fileManagers = [].concat(fileManagers).concat(options.pluginManager.getFileManagers());\n }\n for (let i = fileManagers.length - 1; i >= 0 ; i--) {\n const fileManager = fileManagers[i];\n if (fileManager[isSync ? 'supportsSync' : 'supports'](filename, currentDirectory, options, environment)) {\n return fileManager;\n }\n }\n return null;\n }\n\n addFileManager(fileManager) {\n this.fileManagers.push(fileManager);\n }\n\n clearFileManagers() {\n this.fileManagers = [];\n }\n}\n\nexport default Environment;\n","export default {\n 'aliceblue':'#f0f8ff',\n 'antiquewhite':'#faebd7',\n 'aqua':'#00ffff',\n 'aquamarine':'#7fffd4',\n 'azure':'#f0ffff',\n 'beige':'#f5f5dc',\n 'bisque':'#ffe4c4',\n 'black':'#000000',\n 'blanchedalmond':'#ffebcd',\n 'blue':'#0000ff',\n 'blueviolet':'#8a2be2',\n 'brown':'#a52a2a',\n 'burlywood':'#deb887',\n 'cadetblue':'#5f9ea0',\n 'chartreuse':'#7fff00',\n 'chocolate':'#d2691e',\n 'coral':'#ff7f50',\n 'cornflowerblue':'#6495ed',\n 'cornsilk':'#fff8dc',\n 'crimson':'#dc143c',\n 'cyan':'#00ffff',\n 'darkblue':'#00008b',\n 'darkcyan':'#008b8b',\n 'darkgoldenrod':'#b8860b',\n 'darkgray':'#a9a9a9',\n 'darkgrey':'#a9a9a9',\n 'darkgreen':'#006400',\n 'darkkhaki':'#bdb76b',\n 'darkmagenta':'#8b008b',\n 'darkolivegreen':'#556b2f',\n 'darkorange':'#ff8c00',\n 'darkorchid':'#9932cc',\n 'darkred':'#8b0000',\n 'darksalmon':'#e9967a',\n 'darkseagreen':'#8fbc8f',\n 'darkslateblue':'#483d8b',\n 'darkslategray':'#2f4f4f',\n 'darkslategrey':'#2f4f4f',\n 'darkturquoise':'#00ced1',\n 'darkviolet':'#9400d3',\n 'deeppink':'#ff1493',\n 'deepskyblue':'#00bfff',\n 'dimgray':'#696969',\n 'dimgrey':'#696969',\n 'dodgerblue':'#1e90ff',\n 'firebrick':'#b22222',\n 'floralwhite':'#fffaf0',\n 'forestgreen':'#228b22',\n 'fuchsia':'#ff00ff',\n 'gainsboro':'#dcdcdc',\n 'ghostwhite':'#f8f8ff',\n 'gold':'#ffd700',\n 'goldenrod':'#daa520',\n 'gray':'#808080',\n 'grey':'#808080',\n 'green':'#008000',\n 'greenyellow':'#adff2f',\n 'honeydew':'#f0fff0',\n 'hotpink':'#ff69b4',\n 'indianred':'#cd5c5c',\n 'indigo':'#4b0082',\n 'ivory':'#fffff0',\n 'khaki':'#f0e68c',\n 'lavender':'#e6e6fa',\n 'lavenderblush':'#fff0f5',\n 'lawngreen':'#7cfc00',\n 'lemonchiffon':'#fffacd',\n 'lightblue':'#add8e6',\n 'lightcoral':'#f08080',\n 'lightcyan':'#e0ffff',\n 'lightgoldenrodyellow':'#fafad2',\n 'lightgray':'#d3d3d3',\n 'lightgrey':'#d3d3d3',\n 'lightgreen':'#90ee90',\n 'lightpink':'#ffb6c1',\n 'lightsalmon':'#ffa07a',\n 'lightseagreen':'#20b2aa',\n 'lightskyblue':'#87cefa',\n 'lightslategray':'#778899',\n 'lightslategrey':'#778899',\n 'lightsteelblue':'#b0c4de',\n 'lightyellow':'#ffffe0',\n 'lime':'#00ff00',\n 'limegreen':'#32cd32',\n 'linen':'#faf0e6',\n 'magenta':'#ff00ff',\n 'maroon':'#800000',\n 'mediumaquamarine':'#66cdaa',\n 'mediumblue':'#0000cd',\n 'mediumorchid':'#ba55d3',\n 'mediumpurple':'#9370d8',\n 'mediumseagreen':'#3cb371',\n 'mediumslateblue':'#7b68ee',\n 'mediumspringgreen':'#00fa9a',\n 'mediumturquoise':'#48d1cc',\n 'mediumvioletred':'#c71585',\n 'midnightblue':'#191970',\n 'mintcream':'#f5fffa',\n 'mistyrose':'#ffe4e1',\n 'moccasin':'#ffe4b5',\n 'navajowhite':'#ffdead',\n 'navy':'#000080',\n 'oldlace':'#fdf5e6',\n 'olive':'#808000',\n 'olivedrab':'#6b8e23',\n 'orange':'#ffa500',\n 'orangered':'#ff4500',\n 'orchid':'#da70d6',\n 'palegoldenrod':'#eee8aa',\n 'palegreen':'#98fb98',\n 'paleturquoise':'#afeeee',\n 'palevioletred':'#d87093',\n 'papayawhip':'#ffefd5',\n 'peachpuff':'#ffdab9',\n 'peru':'#cd853f',\n 'pink':'#ffc0cb',\n 'plum':'#dda0dd',\n 'powderblue':'#b0e0e6',\n 'purple':'#800080',\n 'rebeccapurple':'#663399',\n 'red':'#ff0000',\n 'rosybrown':'#bc8f8f',\n 'royalblue':'#4169e1',\n 'saddlebrown':'#8b4513',\n 'salmon':'#fa8072',\n 'sandybrown':'#f4a460',\n 'seagreen':'#2e8b57',\n 'seashell':'#fff5ee',\n 'sienna':'#a0522d',\n 'silver':'#c0c0c0',\n 'skyblue':'#87ceeb',\n 'slateblue':'#6a5acd',\n 'slategray':'#708090',\n 'slategrey':'#708090',\n 'snow':'#fffafa',\n 'springgreen':'#00ff7f',\n 'steelblue':'#4682b4',\n 'tan':'#d2b48c',\n 'teal':'#008080',\n 'thistle':'#d8bfd8',\n 'tomato':'#ff6347',\n 'turquoise':'#40e0d0',\n 'violet':'#ee82ee',\n 'wheat':'#f5deb3',\n 'white':'#ffffff',\n 'whitesmoke':'#f5f5f5',\n 'yellow':'#ffff00',\n 'yellowgreen':'#9acd32'\n};","export default {\n length: {\n 'm': 1,\n 'cm': 0.01,\n 'mm': 0.001,\n 'in': 0.0254,\n 'px': 0.0254 / 96,\n 'pt': 0.0254 / 72,\n 'pc': 0.0254 / 72 * 12\n },\n duration: {\n 's': 1,\n 'ms': 0.001\n },\n angle: {\n 'rad': 1 / (2 * Math.PI),\n 'deg': 1 / 360,\n 'grad': 1 / 400,\n 'turn': 1\n }\n};","import colors from './colors';\nimport unitConversions from './unit-conversions';\n\nexport default { colors, unitConversions };\n","class Node {\n constructor() {\n this.parent = null;\n this.visibilityBlocks = undefined;\n this.nodeVisible = undefined;\n this.rootNode = null;\n this.parsed = null;\n\n const self = this;\n Object.defineProperty(this, 'currentFileInfo', {\n get: function() { return self.fileInfo(); }\n });\n Object.defineProperty(this, 'index', {\n get: function() { return self.getIndex(); }\n });\n\n }\n\n setParent(nodes, parent) {\n function set(node) {\n if (node && node instanceof Node) {\n node.parent = parent;\n }\n }\n if (Array.isArray(nodes)) {\n nodes.forEach(set);\n }\n else {\n set(nodes);\n }\n }\n\n getIndex() {\n return this._index || (this.parent && this.parent.getIndex()) || 0;\n }\n\n fileInfo() {\n return this._fileInfo || (this.parent && this.parent.fileInfo()) || {};\n }\n\n isRulesetLike() { return false; }\n\n toCSS(context) {\n const strs = [];\n this.genCSS(context, {\n add: function(chunk, fileInfo, index) {\n strs.push(chunk);\n },\n isEmpty: function () {\n return strs.length === 0;\n }\n });\n return strs.join('');\n }\n\n genCSS(context, output) {\n output.add(this.value);\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n eval() { return this; }\n\n _operate(context, op, a, b) {\n switch (op) {\n case '+': return a + b;\n case '-': return a - b;\n case '*': return a * b;\n case '/': return a / b;\n }\n }\n\n fround(context, value) {\n const precision = context && context.numPrecision;\n // add \"epsilon\" to ensure numbers like 1.000000005 (represented as 1.000000004999...) are properly rounded:\n return (precision) ? Number((value + 2e-16).toFixed(precision)) : value;\n }\n\n static compare(a, b) {\n /* returns:\n -1: a < b\n 0: a = b\n 1: a > b\n and *any* other value for a != b (e.g. undefined, NaN, -2 etc.) */\n\n if ((a.compare) &&\n // for \"symmetric results\" force toCSS-based comparison\n // of Quoted or Anonymous if either value is one of those\n !(b.type === 'Quoted' || b.type === 'Anonymous')) {\n return a.compare(b);\n } else if (b.compare) {\n return -b.compare(a);\n } else if (a.type !== b.type) {\n return undefined;\n }\n\n a = a.value;\n b = b.value;\n if (!Array.isArray(a)) {\n return a === b ? 0 : undefined;\n }\n if (a.length !== b.length) {\n return undefined;\n }\n for (let i = 0; i < a.length; i++) {\n if (Node.compare(a[i], b[i]) !== 0) {\n return undefined;\n }\n }\n return 0;\n }\n\n static numericCompare(a, b) {\n return a < b ? -1\n : a === b ? 0\n : a > b ? 1 : undefined;\n }\n\n // Returns true if this node represents root of ast imported by reference\n blocksVisibility() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n return this.visibilityBlocks !== 0;\n }\n\n addVisibilityBlock() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks + 1;\n }\n\n removeVisibilityBlock() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks - 1;\n }\n\n // Turns on node visibility - if called node will be shown in output regardless\n // of whether it comes from import by reference or not\n ensureVisibility() {\n this.nodeVisible = true;\n }\n\n // Turns off node visibility - if called node will NOT be shown in output regardless\n // of whether it comes from import by reference or not\n ensureInvisibility() {\n this.nodeVisible = false;\n }\n\n // return values:\n // false - the node must not be visible\n // true - the node must be visible\n // undefined or null - the node has the same visibility as its parent\n isVisible() {\n return this.nodeVisible;\n }\n\n visibilityInfo() {\n return {\n visibilityBlocks: this.visibilityBlocks,\n nodeVisible: this.nodeVisible\n };\n }\n\n copyVisibilityInfo(info) {\n if (!info) {\n return;\n }\n this.visibilityBlocks = info.visibilityBlocks;\n this.nodeVisible = info.nodeVisible;\n }\n}\n\nexport default Node;\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import Node from './node';\nimport colors from '../data/colors';\n\n//\n// RGB Colors - #ff0014, #eee\n//\nclass Color extends Node {\n constructor(rgb, a, originalForm) {\n super();\n\n const self = this;\n //\n // The end goal here, is to parse the arguments\n // into an integer triplet, such as `128, 255, 0`\n //\n // This facilitates operations and conversions.\n //\n if (Array.isArray(rgb)) {\n this.rgb = rgb;\n } else if (rgb.length >= 6) {\n this.rgb = [];\n rgb.match(/.{2}/g).map(function (c, i) {\n if (i < 3) {\n self.rgb.push(parseInt(c, 16));\n } else {\n self.alpha = (parseInt(c, 16)) / 255;\n }\n });\n } else {\n this.rgb = [];\n rgb.split('').map(function (c, i) {\n if (i < 3) {\n self.rgb.push(parseInt(c + c, 16));\n } else {\n self.alpha = (parseInt(c + c, 16)) / 255;\n }\n });\n }\n this.alpha = this.alpha || (typeof a === 'number' ? a : 1);\n if (typeof originalForm !== 'undefined') {\n this.value = originalForm;\n }\n }\n\n luma() {\n let r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255;\n\n r = (r <= 0.03928) ? r / 12.92 : Math.pow(((r + 0.055) / 1.055), 2.4);\n g = (g <= 0.03928) ? g / 12.92 : Math.pow(((g + 0.055) / 1.055), 2.4);\n b = (b <= 0.03928) ? b / 12.92 : Math.pow(((b + 0.055) / 1.055), 2.4);\n\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n }\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n }\n\n toCSS(context, doNotCompress) {\n const compress = context && context.compress && !doNotCompress;\n let color;\n let alpha;\n let colorFunction;\n let args = [];\n\n // `value` is set if this color was originally\n // converted from a named color string so we need\n // to respect this and try to output named color too.\n alpha = this.fround(context, this.alpha);\n\n if (this.value) {\n if (this.value.indexOf('rgb') === 0) {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n } else if (this.value.indexOf('hsl') === 0) {\n if (alpha < 1) {\n colorFunction = 'hsla';\n } else {\n colorFunction = 'hsl';\n }\n } else {\n return this.value;\n }\n } else {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n }\n\n switch (colorFunction) {\n case 'rgba':\n args = this.rgb.map(function (c) {\n return clamp(Math.round(c), 255);\n }).concat(clamp(alpha, 1));\n break;\n case 'hsla':\n args.push(clamp(alpha, 1));\n case 'hsl':\n color = this.toHSL();\n args = [\n this.fround(context, color.h),\n `${this.fround(context, color.s * 100)}%`,\n `${this.fround(context, color.l * 100)}%`\n ].concat(args);\n }\n\n if (colorFunction) {\n // Values are capped between `0` and `255`, rounded and zero-padded.\n return `${colorFunction}(${args.join(`,${compress ? '' : ' '}`)})`;\n }\n\n color = this.toRGB();\n\n if (compress) {\n const splitcolor = color.split('');\n\n // Convert color to short format\n if (splitcolor[1] === splitcolor[2] && splitcolor[3] === splitcolor[4] && splitcolor[5] === splitcolor[6]) {\n color = `#${splitcolor[1]}${splitcolor[3]}${splitcolor[5]}`;\n }\n }\n\n return color;\n }\n\n //\n // Operations have to be done per-channel, if not,\n // channels will spill onto each other. Once we have\n // our result, in the form of an integer triplet,\n // we create a new Color node to hold the result.\n //\n operate(context, op, other) {\n const rgb = new Array(3);\n const alpha = this.alpha * (1 - other.alpha) + other.alpha;\n for (let c = 0; c < 3; c++) {\n rgb[c] = this._operate(context, op, this.rgb[c], other.rgb[c]);\n }\n return new Color(rgb, alpha);\n }\n\n toRGB() {\n return toHex(this.rgb);\n }\n\n toHSL() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h;\n let s;\n const l = (max + min) / 2;\n const d = max - min;\n\n if (max === min) {\n h = s = 0;\n } else {\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, l, a };\n }\n\n // Adapted from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript\n toHSV() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h;\n let s;\n const v = max;\n\n const d = max - min;\n if (max === 0) {\n s = 0;\n } else {\n s = d / max;\n }\n\n if (max === min) {\n h = 0;\n } else {\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, v, a };\n }\n\n toARGB() {\n return toHex([this.alpha * 255].concat(this.rgb));\n }\n\n compare(x) {\n return (x.rgb &&\n x.rgb[0] === this.rgb[0] &&\n x.rgb[1] === this.rgb[1] &&\n x.rgb[2] === this.rgb[2] &&\n x.alpha === this.alpha) ? 0 : undefined;\n }\n\n static fromKeyword(keyword) {\n let c;\n const key = keyword.toLowerCase();\n if (colors.hasOwnProperty(key)) {\n c = new Color(colors[key].slice(1));\n }\n else if (key === 'transparent') {\n c = new Color([0, 0, 0], 0);\n }\n\n if (c) {\n c.value = keyword;\n return c;\n }\n }\n}\n\nColor.prototype.type = 'Color';\n\nfunction clamp(v, max) {\n return Math.min(Math.max(v, 0), max);\n}\n\nfunction toHex(v) {\n return `#${v.map(function (c) {\n c = clamp(Math.round(c), 255);\n return (c < 16 ? '0' : '') + c.toString(16);\n}).join('')}`;\n}\n\nexport default Color;\n","import Node from './node';\n\nclass Paren extends Node {\n constructor(node) {\n super();\n\n this.value = node;\n }\n\n genCSS(context, output) {\n output.add('(');\n this.value.genCSS(context, output);\n output.add(')');\n }\n\n eval(context) {\n return new Paren(this.value.eval(context));\n }\n}\n\nParen.prototype.type = 'Paren';\nexport default Paren;\n","import Node from './node';\nconst _noSpaceCombinators = {\n '': true,\n ' ': true,\n '|': true\n};\n\nclass Combinator extends Node {\n constructor(value) {\n super();\n\n if (value === ' ') {\n this.value = ' ';\n this.emptyOrWhitespace = true;\n } else {\n this.value = value ? value.trim() : '';\n this.emptyOrWhitespace = this.value === '';\n }\n }\n\n genCSS(context, output) {\n const spaceOrEmpty = (context.compress || _noSpaceCombinators[this.value]) ? '' : ' ';\n output.add(spaceOrEmpty + this.value + spaceOrEmpty);\n }\n}\n\nCombinator.prototype.type = 'Combinator';\n\nexport default Combinator;\n","import Node from './node';\nimport Paren from './paren';\nimport Combinator from './combinator';\n\nclass Element extends Node {\n constructor(combinator, value, isVariable, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.combinator = combinator instanceof Combinator ?\n combinator : new Combinator(combinator);\n\n if (typeof value === 'string') {\n this.value = value.trim();\n } else if (value) {\n this.value = value;\n } else {\n this.value = '';\n }\n this.isVariable = isVariable;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.combinator, this);\n }\n\n accept(visitor) {\n const value = this.value;\n this.combinator = visitor.visit(this.combinator);\n if (typeof value === 'object') {\n this.value = visitor.visit(value);\n }\n }\n\n eval(context) {\n return new Element(this.combinator,\n this.value.eval ? this.value.eval(context) : this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n }\n\n clone() {\n return new Element(this.combinator,\n this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n }\n\n genCSS(context, output) {\n output.add(this.toCSS(context), this.fileInfo(), this.getIndex());\n }\n\n toCSS(context) {\n context = context || {};\n let value = this.value;\n const firstSelector = context.firstSelector;\n if (value instanceof Paren) {\n // selector in parens should not be affected by outer selector\n // flags (breaks only interpolated selectors - see #1973)\n context.firstSelector = true;\n }\n value = value.toCSS ? value.toCSS(context) : value;\n context.firstSelector = firstSelector;\n if (value === '' && this.combinator.value.charAt(0) === '&') {\n return '';\n } else {\n return this.combinator.toCSS(context) + value;\n }\n }\n}\n\nElement.prototype.type = 'Element';\nexport default Element;\n","\nexport const Math = {\n ALWAYS: 0,\n PARENS_DIVISION: 1,\n PARENS: 2,\n // removed - STRICT_LEGACY: 3\n};\n\nexport const RewriteUrls = {\n OFF: 0,\n LOCAL: 1,\n ALL: 2\n};","/* jshint proto: true */\nimport * as Constants from './constants';\n\nexport function getLocation(index, inputStream) {\n let n = index + 1;\n let line = null;\n let column = -1;\n\n while (--n >= 0 && inputStream.charAt(n) !== '\\n') {\n column++;\n }\n\n if (typeof index === 'number') {\n line = (inputStream.slice(0, index).match(/\\n/g) || '').length;\n }\n\n return {\n line,\n column\n };\n}\n\nexport function copyArray(arr) {\n let i;\n const length = arr.length;\n const copy = new Array(length);\n\n for (i = 0; i < length; i++) {\n copy[i] = arr[i];\n }\n return copy;\n}\n\nexport function clone(obj) {\n const cloned = {};\n for (const prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n cloned[prop] = obj[prop];\n }\n }\n return cloned;\n}\n\nexport function defaults(obj1, obj2) {\n let newObj = obj2 || {};\n if (!obj2._defaults) {\n newObj = {};\n const defaults = {...obj1};\n newObj._defaults = defaults;\n const cloned = obj2 ? {...obj2} : {};\n Object.assign(newObj, defaults, cloned);\n }\n return newObj;\n}\n\nexport function copyOptions(obj1, obj2) {\n if (obj2 && obj2._defaults) {\n return obj2;\n }\n const opts = defaults(obj1, obj2);\n if (opts.strictMath) {\n opts.math = Constants.Math.PARENS;\n }\n // Back compat with changed relativeUrls option\n if (opts.relativeUrls) {\n opts.rewriteUrls = Constants.RewriteUrls.ALL;\n }\n if (typeof opts.math === 'string') {\n switch (opts.math.toLowerCase()) {\n case 'always':\n opts.math = Constants.Math.ALWAYS;\n break;\n case 'parens-division':\n opts.math = Constants.Math.PARENS_DIVISION;\n break;\n case 'strict':\n case 'parens':\n opts.math = Constants.Math.PARENS;\n break;\n default:\n opts.math = Constants.Math.PARENS;\n }\n }\n if (typeof opts.rewriteUrls === 'string') {\n switch (opts.rewriteUrls.toLowerCase()) {\n case 'off':\n opts.rewriteUrls = Constants.RewriteUrls.OFF;\n break;\n case 'local':\n opts.rewriteUrls = Constants.RewriteUrls.LOCAL;\n break;\n case 'all':\n opts.rewriteUrls = Constants.RewriteUrls.ALL;\n break;\n }\n }\n return opts;\n}\n\nexport function merge(obj1, obj2) {\n for (const prop in obj2) {\n if (obj2.hasOwnProperty(prop)) {\n obj1[prop] = obj2[prop];\n }\n }\n return obj1;\n}\n\nexport function flattenArray(arr, result = []) {\n for (let i = 0, length = arr.length; i < length; i++) {\n const value = arr[i];\n if (Array.isArray(value)) {\n flattenArray(value, result);\n } else {\n if (value !== undefined) {\n result.push(value);\n }\n }\n }\n return result;\n}","import * as utils from './utils';\n\nconst anonymousFunc = /(|Function):(\\d+):(\\d+)/;\n\n/**\n * This is a centralized class of any error that could be thrown internally (mostly by the parser).\n * Besides standard .message it keeps some additional data like a path to the file where the error\n * occurred along with line and column numbers.\n *\n * @class\n * @extends Error\n * @type {module.LessError}\n *\n * @prop {string} type\n * @prop {string} filename\n * @prop {number} index\n * @prop {number} line\n * @prop {number} column\n * @prop {number} callLine\n * @prop {number} callExtract\n * @prop {string[]} extract\n *\n * @param {Object} e - An error object to wrap around or just a descriptive object\n * @param {Object} fileContentMap - An object with file contents in 'contents' property (like importManager) @todo - move to fileManager?\n * @param {string} [currentFilename]\n */\nconst LessError = function(e, fileContentMap, currentFilename) {\n Error.call(this);\n\n const filename = e.filename || currentFilename;\n\n this.message = e.message;\n this.stack = e.stack;\n\n if (fileContentMap && filename) {\n const input = fileContentMap.contents[filename];\n const loc = utils.getLocation(e.index, input);\n var line = loc.line;\n const col = loc.column;\n const callLine = e.call && utils.getLocation(e.call, input).line;\n const lines = input ? input.split('\\n') : '';\n\n this.type = e.type || 'Syntax';\n this.filename = filename;\n this.index = e.index;\n this.line = typeof line === 'number' ? line + 1 : null;\n this.column = col;\n\n if (!this.line && this.stack) {\n const found = this.stack.match(anonymousFunc);\n\n /**\n * We have to figure out how this environment stringifies anonymous functions\n * so we can correctly map plugin errors.\n * \n * Note, in Node 8, the output of anonymous funcs varied based on parameters\n * being present or not, so we inject dummy params.\n */\n const func = new Function('a', 'throw new Error()');\n let lineAdjust = 0;\n try {\n func();\n } catch (e) {\n const match = e.stack.match(anonymousFunc);\n var line = parseInt(match[2]);\n lineAdjust = 1 - line;\n }\n\n if (found) {\n if (found[2]) {\n this.line = parseInt(found[2]) + lineAdjust;\n }\n if (found[3]) {\n this.column = parseInt(found[3]);\n }\n }\n }\n\n this.callLine = callLine + 1;\n this.callExtract = lines[callLine];\n\n this.extract = [\n lines[this.line - 2],\n lines[this.line - 1],\n lines[this.line]\n ];\n }\n\n};\n\nif (typeof Object.create === 'undefined') {\n const F = function () {};\n F.prototype = Error.prototype;\n LessError.prototype = new F();\n} else {\n LessError.prototype = Object.create(Error.prototype);\n}\n\nLessError.prototype.constructor = LessError;\n\n/**\n * An overridden version of the default Object.prototype.toString\n * which uses additional information to create a helpful message.\n *\n * @param {Object} options\n * @returns {string}\n */\nLessError.prototype.toString = function(options) {\n options = options || {};\n\n let message = '';\n const extract = this.extract || [];\n let error = [];\n let stylize = function (str) { return str; };\n if (options.stylize) {\n const type = typeof options.stylize;\n if (type !== 'function') {\n throw Error(`options.stylize should be a function, got a ${type}!`);\n }\n stylize = options.stylize;\n }\n\n if (this.line !== null) {\n if (typeof extract[0] === 'string') {\n error.push(stylize(`${this.line - 1} ${extract[0]}`, 'grey'));\n }\n\n if (typeof extract[1] === 'string') {\n let errorTxt = `${this.line} `;\n if (extract[1]) {\n errorTxt += extract[1].slice(0, this.column) +\n stylize(stylize(stylize(extract[1].substr(this.column, 1), 'bold') +\n extract[1].slice(this.column + 1), 'red'), 'inverse');\n }\n error.push(errorTxt);\n }\n\n if (typeof extract[2] === 'string') {\n error.push(stylize(`${this.line + 1} ${extract[2]}`, 'grey'));\n }\n error = `${error.join('\\n') + stylize('', 'reset')}\\n`;\n }\n\n message += stylize(`${this.type}Error: ${this.message}`, 'red');\n if (this.filename) {\n message += stylize(' in ', 'red') + this.filename;\n }\n if (this.line) {\n message += stylize(` on line ${this.line}, column ${this.column + 1}:`, 'grey');\n }\n\n message += `\\n${error}`;\n\n if (this.callLine) {\n message += `${stylize('from ', 'red') + (this.filename || '')}/n`;\n message += `${stylize(this.callLine, 'grey')} ${this.callExtract}/n`;\n }\n\n return message;\n};\n\nexport default LessError;","import Node from './node';\nimport Element from './element';\nimport LessError from '../less-error';\n\nclass Selector extends Node {\n constructor(elements, extendList, condition, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.extendList = extendList;\n this.condition = condition;\n this.evaldCondition = !condition;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.elements = this.getElements(elements);\n this.mixinElements_ = undefined;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.elements, this);\n }\n\n accept(visitor) {\n if (this.elements) {\n this.elements = visitor.visitArray(this.elements);\n }\n if (this.extendList) {\n this.extendList = visitor.visitArray(this.extendList);\n }\n if (this.condition) {\n this.condition = visitor.visit(this.condition);\n }\n }\n\n createDerived(elements, extendList, evaldCondition) {\n elements = this.getElements(elements);\n const newSelector = new Selector(elements, extendList || this.extendList,\n null, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n newSelector.evaldCondition = (evaldCondition != null) ? evaldCondition : this.evaldCondition;\n newSelector.mediaEmpty = this.mediaEmpty;\n return newSelector;\n }\n\n getElements(els) {\n if (!els) {\n return [new Element('', '&', false, this._index, this._fileInfo)];\n }\n if (typeof els === 'string') {\n this.parse.parseNode(\n els, \n ['selector'],\n this._index, \n this._fileInfo, \n function(err, result) {\n if (err) {\n throw new LessError({\n index: err.index,\n message: err.message\n }, this.parse.imports, this._fileInfo.filename);\n }\n els = result[0].elements;\n });\n }\n return els;\n }\n\n createEmptySelectors() {\n const el = new Element('', '&', false, this._index, this._fileInfo), sels = [new Selector([el], null, null, this._index, this._fileInfo)];\n sels[0].mediaEmpty = true;\n return sels;\n }\n\n match(other) {\n const elements = this.elements;\n const len = elements.length;\n let olen;\n let i;\n\n other = other.mixinElements();\n olen = other.length;\n if (olen === 0 || len < olen) {\n return 0;\n } else {\n for (i = 0; i < olen; i++) {\n if (elements[i].value !== other[i]) {\n return 0;\n }\n }\n }\n\n return olen; // return number of matched elements\n }\n\n mixinElements() {\n if (this.mixinElements_) {\n return this.mixinElements_;\n }\n\n let elements = this.elements.map( function(v) {\n return v.combinator.value + (v.value.value || v.value);\n }).join('').match(/[,&#\\*\\.\\w-]([\\w-]|(\\\\.))*/g);\n\n if (elements) {\n if (elements[0] === '&') {\n elements.shift();\n }\n } else {\n elements = [];\n }\n\n return (this.mixinElements_ = elements);\n }\n\n isJustParentSelector() {\n return !this.mediaEmpty &&\n this.elements.length === 1 &&\n this.elements[0].value === '&' &&\n (this.elements[0].combinator.value === ' ' || this.elements[0].combinator.value === '');\n }\n\n eval(context) {\n const evaldCondition = this.condition && this.condition.eval(context);\n let elements = this.elements;\n let extendList = this.extendList;\n\n elements = elements && elements.map(function (e) { return e.eval(context); });\n extendList = extendList && extendList.map(function(extend) { return extend.eval(context); });\n\n return this.createDerived(elements, extendList, evaldCondition);\n }\n\n genCSS(context, output) {\n let i, element;\n if ((!context || !context.firstSelector) && this.elements[0].combinator.value === '') {\n output.add(' ', this.fileInfo(), this.getIndex());\n }\n for (i = 0; i < this.elements.length; i++) {\n element = this.elements[i];\n element.genCSS(context, output);\n }\n }\n\n getIsOutput() {\n return this.evaldCondition;\n }\n}\n\nSelector.prototype.type = 'Selector';\nexport default Selector;\n","import Node from './node';\n\nclass Value extends Node {\n constructor(value) {\n super();\n\n if (!value) {\n throw new Error('Value requires an array argument');\n }\n if (!Array.isArray(value)) {\n this.value = [ value ];\n }\n else {\n this.value = value;\n }\n }\n\n accept(visitor) {\n if (this.value) {\n this.value = visitor.visitArray(this.value);\n }\n }\n\n eval(context) {\n if (this.value.length === 1) {\n return this.value[0].eval(context);\n } else {\n return new Value(this.value.map(function (v) {\n return v.eval(context);\n }));\n }\n }\n\n genCSS(context, output) {\n let i;\n for (i = 0; i < this.value.length; i++) {\n this.value[i].genCSS(context, output);\n if (i + 1 < this.value.length) {\n output.add((context && context.compress) ? ',' : ', ');\n }\n }\n }\n}\n\nValue.prototype.type = 'Value';\nexport default Value;\n","import Node from './node';\n\nclass Keyword extends Node {\n constructor(value) {\n super();\n\n this.value = value;\n }\n\n genCSS(context, output) {\n if (this.value === '%') { throw { type: 'Syntax', message: 'Invalid % without number' }; }\n output.add(this.value);\n }\n}\n\nKeyword.prototype.type = 'Keyword';\n\nKeyword.True = new Keyword('true');\nKeyword.False = new Keyword('false');\n\nexport default Keyword;\n","import Node from './node';\n\nclass Anonymous extends Node {\n constructor(value, index, currentFileInfo, mapLines, rulesetLike, visibilityInfo) {\n super();\n\n this.value = value;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.mapLines = mapLines;\n this.rulesetLike = (typeof rulesetLike === 'undefined') ? false : rulesetLike;\n this.allowRoot = true;\n this.copyVisibilityInfo(visibilityInfo);\n }\n\n eval() {\n return new Anonymous(this.value, this._index, this._fileInfo, this.mapLines, this.rulesetLike, this.visibilityInfo());\n }\n\n compare(other) {\n return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n }\n\n isRulesetLike() {\n return this.rulesetLike;\n }\n\n genCSS(context, output) {\n this.nodeVisible = Boolean(this.value);\n if (this.nodeVisible) {\n output.add(this.value, this._fileInfo, this._index, this.mapLines);\n }\n }\n}\n\nAnonymous.prototype.type = 'Anonymous';\nexport default Anonymous;\n","import Node from './node';\nimport Value from './value';\nimport Keyword from './keyword';\nimport Anonymous from './anonymous';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\nclass Declaration extends Node {\n constructor(name, value, important, merge, index, currentFileInfo, inline, variable) {\n super();\n\n this.name = name;\n this.value = (value instanceof Node) ? value : new Value([value ? new Anonymous(value) : null]);\n this.important = important ? ` ${important.trim()}` : '';\n this.merge = merge;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.inline = inline || false;\n this.variable = (variable !== undefined) ? variable\n : (name.charAt && (name.charAt(0) === '@'));\n this.allowRoot = true;\n this.setParent(this.value, this);\n }\n\n genCSS(context, output) {\n output.add(this.name + (context.compress ? ':' : ': '), this.fileInfo(), this.getIndex());\n try {\n this.value.genCSS(context, output);\n }\n catch (e) {\n e.index = this._index;\n e.filename = this._fileInfo.filename;\n throw e;\n }\n output.add(this.important + ((this.inline || (context.lastRule && context.compress)) ? '' : ';'), this._fileInfo, this._index);\n }\n\n eval(context) {\n let mathBypass = false, prevMath, name = this.name, evaldValue, variable = this.variable;\n if (typeof name !== 'string') {\n // expand 'primitive' name directly to get\n // things faster (~10% for benchmark.less):\n name = (name.length === 1) && (name[0] instanceof Keyword) ?\n name[0].value : evalName(context, name);\n variable = false; // never treat expanded interpolation as new variable name\n }\n\n // @todo remove when parens-division is default\n if (name === 'font' && context.math === MATH.ALWAYS) {\n mathBypass = true;\n prevMath = context.math;\n context.math = MATH.PARENS_DIVISION;\n }\n try {\n context.importantScope.push({});\n evaldValue = this.value.eval(context);\n\n if (!this.variable && evaldValue.type === 'DetachedRuleset') {\n throw { message: 'Rulesets cannot be evaluated on a property.',\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n let important = this.important;\n const importantResult = context.importantScope.pop();\n if (!important && importantResult.important) {\n important = importantResult.important;\n }\n\n return new Declaration(name,\n evaldValue,\n important,\n this.merge,\n this.getIndex(), this.fileInfo(), this.inline,\n variable);\n }\n catch (e) {\n if (typeof e.index !== 'number') {\n e.index = this.getIndex();\n e.filename = this.fileInfo().filename;\n }\n throw e;\n }\n finally {\n if (mathBypass) {\n context.math = prevMath;\n }\n }\n }\n\n makeImportant() {\n return new Declaration(this.name,\n this.value,\n '!important',\n this.merge,\n this.getIndex(), this.fileInfo(), this.inline);\n }\n}\n\nfunction evalName(context, name) {\n let value = '';\n let i;\n const n = name.length;\n const output = {add: function (s) {value += s;}};\n for (i = 0; i < n; i++) {\n name[i].eval(context).genCSS(context, output);\n }\n return value;\n}\n\nDeclaration.prototype.type = 'Declaration';\nexport default Declaration;","class debugInfo {\n constructor(context, ctx, lineSeparator) {\n let result = '';\n if (context.dumpLineNumbers && !context.compress) {\n switch (context.dumpLineNumbers) {\n case 'comments':\n result = debugInfo.asComment(ctx);\n break;\n case 'mediaquery':\n result = debugInfo.asMediaQuery(ctx);\n break;\n case 'all':\n result = debugInfo.asComment(ctx) + (lineSeparator || '') + debugInfo.asMediaQuery(ctx);\n break;\n }\n }\n return result;\n }\n\n static asComment(ctx) {\n return `/* line ${ctx.debugInfo.lineNumber}, ${ctx.debugInfo.fileName} */\\n`;\n }\n\n static asMediaQuery(ctx) {\n let filenameWithProtocol = ctx.debugInfo.fileName;\n if (!/^[a-z]+:\\/\\//i.test(filenameWithProtocol)) {\n filenameWithProtocol = `file://${filenameWithProtocol}`;\n }\n return `@media -sass-debug-info{filename{font-family:${filenameWithProtocol.replace(/([.:\\/\\\\])/g, function (a) {\n if (a == '\\\\') {\n a = '\\/';\n }\n return `\\\\${a}`;\n})}}line{font-family:\\\\00003${ctx.debugInfo.lineNumber}}}\\n`;\n }\n}\n\nexport default debugInfo;\n","import Node from './node';\nimport getDebugInfo from './debug-info';\n\nclass Comment extends Node {\n constructor(value, isLineComment, index, currentFileInfo) {\n super();\n\n this.value = value;\n this.isLineComment = isLineComment;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.allowRoot = true;\n }\n\n genCSS(context, output) {\n if (this.debugInfo) {\n output.add(getDebugInfo(context, this), this.fileInfo(), this.getIndex());\n }\n output.add(this.value);\n }\n\n isSilent(context) {\n const isCompressed = context.compress && this.value[2] !== '!';\n return this.isLineComment || isCompressed;\n }\n}\n\nComment.prototype.type = 'Comment';\nexport default Comment;\n","const contexts = {};\nexport default contexts;\nimport * as Constants from './constants';\n\nconst copyFromOriginal = function copyFromOriginal(original, destination, propertiesToCopy) {\n if (!original) { return; }\n\n for (let i = 0; i < propertiesToCopy.length; i++) {\n if (original.hasOwnProperty(propertiesToCopy[i])) {\n destination[propertiesToCopy[i]] = original[propertiesToCopy[i]];\n }\n }\n};\n\n/*\n parse is used whilst parsing\n */\nconst parseCopyProperties = [\n // options\n 'paths', // option - unmodified - paths to search for imports on\n 'rewriteUrls', // option - whether to adjust URL's to be relative\n 'rootpath', // option - rootpath to append to URL's\n 'strictImports', // option -\n 'insecure', // option - whether to allow imports from insecure ssl hosts\n 'dumpLineNumbers', // option - whether to dump line numbers\n 'compress', // option - whether to compress\n 'syncImport', // option - whether to import synchronously\n 'chunkInput', // option - whether to chunk input. more performant but causes parse issues.\n 'mime', // browser only - mime type for sheet import\n 'useFileCache', // browser only - whether to use the per file session cache\n // context\n 'processImports', // option & context - whether to process imports. if false then imports will not be imported.\n // Used by the import manager to stop multiple import visitors being created.\n 'pluginManager' // Used as the plugin manager for the session\n];\n\ncontexts.Parse = function(options) {\n copyFromOriginal(options, this, parseCopyProperties);\n\n if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n};\n\nconst evalCopyProperties = [\n 'paths', // additional include paths\n 'compress', // whether to compress\n 'ieCompat', // whether to enforce IE compatibility (IE8 data-uri)\n 'math', // whether math has to be within parenthesis\n 'strictUnits', // whether units need to evaluate correctly\n 'sourceMap', // whether to output a source map\n 'importMultiple', // whether we are currently importing multiple copies\n 'urlArgs', // whether to add args into url tokens\n 'javascriptEnabled', // option - whether Inline JavaScript is enabled. if undefined, defaults to false\n 'pluginManager', // Used as the plugin manager for the session\n 'importantScope', // used to bubble up !important statements\n 'rewriteUrls' // option - whether to adjust URL's to be relative\n];\n\ncontexts.Eval = function(options, frames) {\n copyFromOriginal(options, this, evalCopyProperties);\n\n if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n\n this.frames = frames || [];\n this.importantScope = this.importantScope || [];\n};\n\ncontexts.Eval.prototype.enterCalc = function () {\n if (!this.calcStack) {\n this.calcStack = [];\n }\n this.calcStack.push(true);\n this.inCalc = true;\n};\n\ncontexts.Eval.prototype.exitCalc = function () {\n this.calcStack.pop();\n if (!this.calcStack.length) {\n this.inCalc = false;\n }\n};\n\ncontexts.Eval.prototype.inParenthesis = function () {\n if (!this.parensStack) {\n this.parensStack = [];\n }\n this.parensStack.push(true);\n};\n\ncontexts.Eval.prototype.outOfParenthesis = function () {\n this.parensStack.pop();\n};\n\ncontexts.Eval.prototype.inCalc = false;\ncontexts.Eval.prototype.mathOn = true;\ncontexts.Eval.prototype.isMathOn = function (op) {\n if (!this.mathOn) {\n return false;\n }\n if (op === '/' && this.math !== Constants.Math.ALWAYS && (!this.parensStack || !this.parensStack.length)) {\n return false;\n }\n if (this.math > Constants.Math.PARENS_DIVISION) {\n return this.parensStack && this.parensStack.length;\n }\n return true;\n};\n\ncontexts.Eval.prototype.pathRequiresRewrite = function (path) {\n const isRelative = this.rewriteUrls === Constants.RewriteUrls.LOCAL ? isPathLocalRelative : isPathRelative;\n\n return isRelative(path);\n};\n\ncontexts.Eval.prototype.rewritePath = function (path, rootpath) {\n let newPath;\n\n rootpath = rootpath || '';\n newPath = this.normalizePath(rootpath + path);\n\n // If a path was explicit relative and the rootpath was not an absolute path\n // we must ensure that the new path is also explicit relative.\n if (isPathLocalRelative(path) &&\n isPathRelative(rootpath) &&\n isPathLocalRelative(newPath) === false) {\n newPath = `./${newPath}`;\n }\n\n return newPath;\n};\n\ncontexts.Eval.prototype.normalizePath = function (path) {\n const segments = path.split('/').reverse();\n let segment;\n\n path = [];\n while (segments.length !== 0) {\n segment = segments.pop();\n switch ( segment ) {\n case '.':\n break;\n case '..':\n if ((path.length === 0) || (path[path.length - 1] === '..')) {\n path.push( segment );\n } else {\n path.pop();\n }\n break;\n default:\n path.push(segment);\n break;\n }\n }\n\n return path.join('/');\n};\n\nfunction isPathRelative(path) {\n return !/^(?:[a-z-]+:|\\/|#)/i.test(path);\n}\n\nfunction isPathLocalRelative(path) {\n return path.charAt(0) === '.';\n}\n\n// todo - do the same for the toCSS ?\n","function makeRegistry( base ) {\n return {\n _data: {},\n add: function(name, func) {\n // precautionary case conversion, as later querying of\n // the registry by function-caller uses lower case as well.\n name = name.toLowerCase();\n\n if (this._data.hasOwnProperty(name)) {\n // TODO warn\n }\n this._data[name] = func;\n },\n addMultiple: function(functions) {\n Object.keys(functions).forEach(\n name => {\n this.add(name, functions[name]);\n });\n },\n get: function(name) {\n return this._data[name] || ( base && base.get( name ));\n },\n getLocalFunctions: function() {\n return this._data;\n },\n inherit: function() {\n return makeRegistry( this );\n },\n create: function(base) {\n return makeRegistry(base);\n }\n };\n}\n\nexport default makeRegistry( null );","import Keyword from '../tree/keyword';\n\nconst defaultFunc = {\n eval: function () {\n const v = this.value_;\n const e = this.error_;\n if (e) {\n throw e;\n }\n if (v != null) {\n return v ? Keyword.True : Keyword.False;\n }\n },\n value: function (v) {\n this.value_ = v;\n },\n error: function (e) {\n this.error_ = e;\n },\n reset: function () {\n this.value_ = this.error_ = null;\n }\n};\n\nexport default defaultFunc;\n","import Node from './node';\nimport Declaration from './declaration';\nimport Keyword from './keyword';\nimport Comment from './comment';\nimport Paren from './paren';\nimport Selector from './selector';\nimport Element from './element';\nimport Anonymous from './anonymous';\nimport contexts from '../contexts';\nimport globalFunctionRegistry from '../functions/function-registry';\nimport defaultFunc from '../functions/default';\nimport getDebugInfo from './debug-info';\nimport * as utils from '../utils';\n\nclass Ruleset extends Node {\n constructor(selectors, rules, strictImports, visibilityInfo) {\n super();\n\n this.selectors = selectors;\n this.rules = rules;\n this._lookups = {};\n this._variables = null;\n this._properties = null;\n this.strictImports = strictImports;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n\n this.setParent(this.selectors, this);\n this.setParent(this.rules, this);\n\n }\n\n isRulesetLike() { return true; }\n\n accept(visitor) {\n if (this.paths) {\n this.paths = visitor.visitArray(this.paths, true);\n } else if (this.selectors) {\n this.selectors = visitor.visitArray(this.selectors);\n }\n if (this.rules && this.rules.length) {\n this.rules = visitor.visitArray(this.rules);\n }\n }\n\n eval(context) {\n const that = this;\n let selectors;\n let selCnt;\n let selector;\n let i;\n let hasVariable;\n let hasOnePassingSelector = false;\n\n if (this.selectors && (selCnt = this.selectors.length)) {\n selectors = new Array(selCnt);\n defaultFunc.error({\n type: 'Syntax',\n message: 'it is currently only allowed in parametric mixin guards,'\n });\n\n for (i = 0; i < selCnt; i++) {\n selector = this.selectors[i].eval(context);\n for (var j = 0; j < selector.elements.length; j++) {\n if (selector.elements[j].isVariable) {\n hasVariable = true;\n break;\n }\n }\n selectors[i] = selector;\n if (selector.evaldCondition) {\n hasOnePassingSelector = true;\n }\n }\n\n if (hasVariable) {\n const toParseSelectors = new Array(selCnt);\n for (i = 0; i < selCnt; i++) {\n selector = selectors[i];\n toParseSelectors[i] = selector.toCSS(context);\n }\n this.parse.parseNode(\n toParseSelectors.join(','),\n [\"selectors\"], \n selectors[0].getIndex(), \n selectors[0].fileInfo(), \n function(err, result) {\n if (result) {\n selectors = utils.flattenArray(result);\n }\n });\n }\n\n defaultFunc.reset();\n } else {\n hasOnePassingSelector = true;\n }\n\n let rules = this.rules ? utils.copyArray(this.rules) : null;\n const ruleset = new Ruleset(selectors, rules, this.strictImports, this.visibilityInfo());\n let rule;\n let subRule;\n\n ruleset.originalRuleset = this;\n ruleset.root = this.root;\n ruleset.firstRoot = this.firstRoot;\n ruleset.allowImports = this.allowImports;\n\n if (this.debugInfo) {\n ruleset.debugInfo = this.debugInfo;\n }\n\n if (!hasOnePassingSelector) {\n rules.length = 0;\n }\n\n // inherit a function registry from the frames stack when possible;\n // otherwise from the global registry\n ruleset.functionRegistry = (function (frames) {\n let i = 0;\n const n = frames.length;\n let found;\n for ( ; i !== n ; ++i ) {\n found = frames[ i ].functionRegistry;\n if ( found ) { return found; }\n }\n return globalFunctionRegistry;\n }(context.frames)).inherit();\n\n // push the current ruleset to the frames stack\n const ctxFrames = context.frames;\n ctxFrames.unshift(ruleset);\n\n // currrent selectors\n let ctxSelectors = context.selectors;\n if (!ctxSelectors) {\n context.selectors = ctxSelectors = [];\n }\n ctxSelectors.unshift(this.selectors);\n\n // Evaluate imports\n if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) {\n ruleset.evalImports(context);\n }\n\n // Store the frames around mixin definitions,\n // so they can be evaluated like closures when the time comes.\n const rsRules = ruleset.rules;\n for (i = 0; (rule = rsRules[i]); i++) {\n if (rule.evalFirst) {\n rsRules[i] = rule.eval(context);\n }\n }\n\n const mediaBlockCount = (context.mediaBlocks && context.mediaBlocks.length) || 0;\n\n // Evaluate mixin calls.\n for (i = 0; (rule = rsRules[i]); i++) {\n if (rule.type === 'MixinCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).filter(function(r) {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope if the variable is\n // already there. consider returning false here\n // but we need a way to \"return\" variable from mixins\n return !(ruleset.variable(r.name));\n }\n return true;\n });\n rsRules.splice.apply(rsRules, [i, 1].concat(rules));\n i += rules.length - 1;\n ruleset.resetCache();\n } else if (rule.type === 'VariableCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).rules.filter(function(r) {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope at all\n return false;\n }\n return true;\n });\n rsRules.splice.apply(rsRules, [i, 1].concat(rules));\n i += rules.length - 1;\n ruleset.resetCache();\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n if (!rule.evalFirst) {\n rsRules[i] = rule = rule.eval ? rule.eval(context) : rule;\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n // for rulesets, check if it is a css guard and can be removed\n if (rule instanceof Ruleset && rule.selectors && rule.selectors.length === 1) {\n // check if it can be folded in (e.g. & where)\n if (rule.selectors[0] && rule.selectors[0].isJustParentSelector()) {\n rsRules.splice(i--, 1);\n\n for (var j = 0; (subRule = rule.rules[j]); j++) {\n if (subRule instanceof Node) {\n subRule.copyVisibilityInfo(rule.visibilityInfo());\n if (!(subRule instanceof Declaration) || !subRule.variable) {\n rsRules.splice(++i, 0, subRule);\n }\n }\n }\n }\n }\n }\n\n // Pop the stack\n ctxFrames.shift();\n ctxSelectors.shift();\n\n if (context.mediaBlocks) {\n for (i = mediaBlockCount; i < context.mediaBlocks.length; i++) {\n context.mediaBlocks[i].bubbleSelectors(selectors);\n }\n }\n\n return ruleset;\n }\n\n evalImports(context) {\n const rules = this.rules;\n let i;\n let importRules;\n if (!rules) { return; }\n\n for (i = 0; i < rules.length; i++) {\n if (rules[i].type === 'Import') {\n importRules = rules[i].eval(context);\n if (importRules && (importRules.length || importRules.length === 0)) {\n rules.splice.apply(rules, [i, 1].concat(importRules));\n i += importRules.length - 1;\n } else {\n rules.splice(i, 1, importRules);\n }\n this.resetCache();\n }\n }\n }\n\n makeImportant() {\n const result = new Ruleset(this.selectors, this.rules.map(function (r) {\n if (r.makeImportant) {\n return r.makeImportant();\n } else {\n return r;\n }\n }), this.strictImports, this.visibilityInfo());\n\n return result;\n }\n\n matchArgs(args) {\n return !args || args.length === 0;\n }\n\n // lets you call a css selector with a guard\n matchCondition(args, context) {\n const lastSelector = this.selectors[this.selectors.length - 1];\n if (!lastSelector.evaldCondition) {\n return false;\n }\n if (lastSelector.condition &&\n !lastSelector.condition.eval(\n new contexts.Eval(context,\n context.frames))) {\n return false;\n }\n return true;\n }\n\n resetCache() {\n this._rulesets = null;\n this._variables = null;\n this._properties = null;\n this._lookups = {};\n }\n\n variables() {\n if (!this._variables) {\n this._variables = !this.rules ? {} : this.rules.reduce(function (hash, r) {\n if (r instanceof Declaration && r.variable === true) {\n hash[r.name] = r;\n }\n // when evaluating variables in an import statement, imports have not been eval'd\n // so we need to go inside import statements.\n // guard against root being a string (in the case of inlined less)\n if (r.type === 'Import' && r.root && r.root.variables) {\n const vars = r.root.variables();\n for (const name in vars) {\n if (vars.hasOwnProperty(name)) {\n hash[name] = r.root.variable(name);\n }\n }\n }\n return hash;\n }, {});\n }\n return this._variables;\n }\n\n properties() {\n if (!this._properties) {\n this._properties = !this.rules ? {} : this.rules.reduce(function (hash, r) {\n if (r instanceof Declaration && r.variable !== true) {\n const name = (r.name.length === 1) && (r.name[0] instanceof Keyword) ?\n r.name[0].value : r.name;\n // Properties don't overwrite as they can merge\n if (!hash[`$${name}`]) {\n hash[`$${name}`] = [ r ];\n }\n else {\n hash[`$${name}`].push(r);\n }\n }\n return hash;\n }, {});\n }\n return this._properties;\n }\n\n variable(name) {\n const decl = this.variables()[name];\n if (decl) {\n return this.parseValue(decl);\n }\n }\n\n property(name) {\n const decl = this.properties()[name];\n if (decl) {\n return this.parseValue(decl);\n }\n }\n\n lastDeclaration() {\n for (let i = this.rules.length; i > 0; i--) {\n const decl = this.rules[i - 1];\n if (decl instanceof Declaration) {\n return this.parseValue(decl);\n }\n }\n }\n\n parseValue(toParse) {\n const self = this;\n function transformDeclaration(decl) {\n if (decl.value instanceof Anonymous && !decl.parsed) {\n if (typeof decl.value.value === 'string') {\n this.parse.parseNode(\n decl.value.value,\n ['value', 'important'], \n decl.value.getIndex(), \n decl.fileInfo(), \n function(err, result) {\n if (err) {\n decl.parsed = true;\n }\n if (result) {\n decl.value = result[0];\n decl.important = result[1] || '';\n decl.parsed = true;\n }\n });\n } else {\n decl.parsed = true;\n }\n\n return decl;\n }\n else {\n return decl;\n }\n }\n if (!Array.isArray(toParse)) {\n return transformDeclaration.call(self, toParse);\n }\n else {\n const nodes = [];\n toParse.forEach(function(n) {\n nodes.push(transformDeclaration.call(self, n));\n });\n return nodes;\n }\n }\n\n rulesets() {\n if (!this.rules) { return []; }\n\n const filtRules = [];\n const rules = this.rules;\n let i;\n let rule;\n\n for (i = 0; (rule = rules[i]); i++) {\n if (rule.isRuleset) {\n filtRules.push(rule);\n }\n }\n\n return filtRules;\n }\n\n prependRule(rule) {\n const rules = this.rules;\n if (rules) {\n rules.unshift(rule);\n } else {\n this.rules = [ rule ];\n }\n this.setParent(rule, this);\n }\n\n find(selector, self, filter) {\n self = self || this;\n const rules = [];\n let match;\n let foundMixins;\n const key = selector.toCSS();\n\n if (key in this._lookups) { return this._lookups[key]; }\n\n this.rulesets().forEach(function (rule) {\n if (rule !== self) {\n for (let j = 0; j < rule.selectors.length; j++) {\n match = selector.match(rule.selectors[j]);\n if (match) {\n if (selector.elements.length > match) {\n if (!filter || filter(rule)) {\n foundMixins = rule.find(new Selector(selector.elements.slice(match)), self, filter);\n for (let i = 0; i < foundMixins.length; ++i) {\n foundMixins[i].path.push(rule);\n }\n Array.prototype.push.apply(rules, foundMixins);\n }\n } else {\n rules.push({ rule, path: []});\n }\n break;\n }\n }\n }\n });\n this._lookups[key] = rules;\n return rules;\n }\n\n genCSS(context, output) {\n let i;\n let j;\n const charsetRuleNodes = [];\n let ruleNodes = [];\n\n let // Line number debugging\n debugInfo;\n\n let rule;\n let path;\n\n context.tabLevel = (context.tabLevel || 0);\n\n if (!this.root) {\n context.tabLevel++;\n }\n\n const tabRuleStr = context.compress ? '' : Array(context.tabLevel + 1).join(' ');\n const tabSetStr = context.compress ? '' : Array(context.tabLevel).join(' ');\n let sep;\n\n let charsetNodeIndex = 0;\n let importNodeIndex = 0;\n for (i = 0; (rule = this.rules[i]); i++) {\n if (rule instanceof Comment) {\n if (importNodeIndex === i) {\n importNodeIndex++;\n }\n ruleNodes.push(rule);\n } else if (rule.isCharset && rule.isCharset()) {\n ruleNodes.splice(charsetNodeIndex, 0, rule);\n charsetNodeIndex++;\n importNodeIndex++;\n } else if (rule.type === 'Import') {\n ruleNodes.splice(importNodeIndex, 0, rule);\n importNodeIndex++;\n } else {\n ruleNodes.push(rule);\n }\n }\n ruleNodes = charsetRuleNodes.concat(ruleNodes);\n\n // If this is the root node, we don't render\n // a selector, or {}.\n if (!this.root) {\n debugInfo = getDebugInfo(context, this, tabSetStr);\n\n if (debugInfo) {\n output.add(debugInfo);\n output.add(tabSetStr);\n }\n\n const paths = this.paths;\n const pathCnt = paths.length;\n let pathSubCnt;\n\n sep = context.compress ? ',' : (`,\\n${tabSetStr}`);\n\n for (i = 0; i < pathCnt; i++) {\n path = paths[i];\n if (!(pathSubCnt = path.length)) { continue; }\n if (i > 0) { output.add(sep); }\n\n context.firstSelector = true;\n path[0].genCSS(context, output);\n\n context.firstSelector = false;\n for (j = 1; j < pathSubCnt; j++) {\n path[j].genCSS(context, output);\n }\n }\n\n output.add((context.compress ? '{' : ' {\\n') + tabRuleStr);\n }\n\n // Compile rules and rulesets\n for (i = 0; (rule = ruleNodes[i]); i++) {\n\n if (i + 1 === ruleNodes.length) {\n context.lastRule = true;\n }\n\n const currentLastRule = context.lastRule;\n if (rule.isRulesetLike(rule)) {\n context.lastRule = false;\n }\n\n if (rule.genCSS) {\n rule.genCSS(context, output);\n } else if (rule.value) {\n output.add(rule.value.toString());\n }\n\n context.lastRule = currentLastRule;\n\n if (!context.lastRule && rule.isVisible()) {\n output.add(context.compress ? '' : (`\\n${tabRuleStr}`));\n } else {\n context.lastRule = false;\n }\n }\n\n if (!this.root) {\n output.add((context.compress ? '}' : `\\n${tabSetStr}}`));\n context.tabLevel--;\n }\n\n if (!output.isEmpty() && !context.compress && this.firstRoot) {\n output.add('\\n');\n }\n }\n\n joinSelectors(paths, context, selectors) {\n for (let s = 0; s < selectors.length; s++) {\n this.joinSelector(paths, context, selectors[s]);\n }\n }\n\n joinSelector(paths, context, selector) {\n\n function createParenthesis(elementsToPak, originalElement) {\n let replacementParen, j;\n if (elementsToPak.length === 0) {\n replacementParen = new Paren(elementsToPak[0]);\n } else {\n const insideParent = new Array(elementsToPak.length);\n for (j = 0; j < elementsToPak.length; j++) {\n insideParent[j] = new Element(\n null,\n elementsToPak[j],\n originalElement.isVariable,\n originalElement._index,\n originalElement._fileInfo\n );\n }\n replacementParen = new Paren(new Selector(insideParent));\n }\n return replacementParen;\n }\n\n function createSelector(containedElement, originalElement) {\n let element, selector;\n element = new Element(null, containedElement, originalElement.isVariable, originalElement._index, originalElement._fileInfo);\n selector = new Selector([element]);\n return selector;\n }\n\n // joins selector path from `beginningPath` with selector path in `addPath`\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns concatenated path\n function addReplacementIntoPath(beginningPath, addPath, replacedElement, originalSelector) {\n let newSelectorPath, lastSelector, newJoinedSelector;\n // our new selector path\n newSelectorPath = [];\n\n // construct the joined selector - if & is the first thing this will be empty,\n // if not newJoinedSelector will be the last set of elements in the selector\n if (beginningPath.length > 0) {\n newSelectorPath = utils.copyArray(beginningPath);\n lastSelector = newSelectorPath.pop();\n newJoinedSelector = originalSelector.createDerived(utils.copyArray(lastSelector.elements));\n }\n else {\n newJoinedSelector = originalSelector.createDerived([]);\n }\n\n if (addPath.length > 0) {\n // /deep/ is a CSS4 selector - (removed, so should deprecate)\n // that is valid without anything in front of it\n // so if the & does not have a combinator that is \"\" or \" \" then\n // and there is a combinator on the parent, then grab that.\n // this also allows + a { & .b { .a & { ... though not sure why you would want to do that\n let combinator = replacedElement.combinator;\n\n const parentEl = addPath[0].elements[0];\n if (combinator.emptyOrWhitespace && !parentEl.combinator.emptyOrWhitespace) {\n combinator = parentEl.combinator;\n }\n // join the elements so far with the first part of the parent\n newJoinedSelector.elements.push(new Element(\n combinator,\n parentEl.value,\n replacedElement.isVariable,\n replacedElement._index,\n replacedElement._fileInfo\n ));\n newJoinedSelector.elements = newJoinedSelector.elements.concat(addPath[0].elements.slice(1));\n }\n\n // now add the joined selector - but only if it is not empty\n if (newJoinedSelector.elements.length !== 0) {\n newSelectorPath.push(newJoinedSelector);\n }\n\n // put together the parent selectors after the join (e.g. the rest of the parent)\n if (addPath.length > 1) {\n let restOfPath = addPath.slice(1);\n restOfPath = restOfPath.map(function (selector) {\n return selector.createDerived(selector.elements, []);\n });\n newSelectorPath = newSelectorPath.concat(restOfPath);\n }\n return newSelectorPath;\n }\n\n // joins selector path from `beginningPath` with every selector path in `addPaths` array\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns array with all concatenated paths\n function addAllReplacementsIntoPath( beginningPath, addPaths, replacedElement, originalSelector, result) {\n let j;\n for (j = 0; j < beginningPath.length; j++) {\n const newSelectorPath = addReplacementIntoPath(beginningPath[j], addPaths, replacedElement, originalSelector);\n result.push(newSelectorPath);\n }\n return result;\n }\n\n function mergeElementsOnToSelectors(elements, selectors) {\n let i, sel;\n\n if (elements.length === 0) {\n return ;\n }\n if (selectors.length === 0) {\n selectors.push([ new Selector(elements) ]);\n return;\n }\n\n for (i = 0; (sel = selectors[i]); i++) {\n // if the previous thing in sel is a parent this needs to join on to it\n if (sel.length > 0) {\n sel[sel.length - 1] = sel[sel.length - 1].createDerived(sel[sel.length - 1].elements.concat(elements));\n }\n else {\n sel.push(new Selector(elements));\n }\n }\n }\n\n // replace all parent selectors inside `inSelector` by content of `context` array\n // resulting selectors are returned inside `paths` array\n // returns true if `inSelector` contained at least one parent selector\n function replaceParentSelector(paths, context, inSelector) {\n // The paths are [[Selector]]\n // The first list is a list of comma separated selectors\n // The inner list is a list of inheritance separated selectors\n // e.g.\n // .a, .b {\n // .c {\n // }\n // }\n // == [[.a] [.c]] [[.b] [.c]]\n //\n let i, j, k, currentElements, newSelectors, selectorsMultiplied, sel, el, hadParentSelector = false, length, lastSelector;\n function findNestedSelector(element) {\n let maybeSelector;\n if (!(element.value instanceof Paren)) {\n return null;\n }\n\n maybeSelector = element.value.value;\n if (!(maybeSelector instanceof Selector)) {\n return null;\n }\n\n return maybeSelector;\n }\n\n // the elements from the current selector so far\n currentElements = [];\n // the current list of new selectors to add to the path.\n // We will build it up. We initiate it with one empty selector as we \"multiply\" the new selectors\n // by the parents\n newSelectors = [\n []\n ];\n\n for (i = 0; (el = inSelector.elements[i]); i++) {\n // non parent reference elements just get added\n if (el.value !== '&') {\n const nestedSelector = findNestedSelector(el);\n if (nestedSelector != null) {\n // merge the current list of non parent selector elements\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n const nestedPaths = [];\n let replaced;\n const replacedNewSelectors = [];\n replaced = replaceParentSelector(nestedPaths, context, nestedSelector);\n hadParentSelector = hadParentSelector || replaced;\n // the nestedPaths array should have only one member - replaceParentSelector does not multiply selectors\n for (k = 0; k < nestedPaths.length; k++) {\n const replacementSelector = createSelector(createParenthesis(nestedPaths[k], el), el);\n addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors);\n }\n newSelectors = replacedNewSelectors;\n currentElements = [];\n } else {\n currentElements.push(el);\n }\n\n } else {\n hadParentSelector = true;\n // the new list of selectors to add\n selectorsMultiplied = [];\n\n // merge the current list of non parent selector elements\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n // loop through our current selectors\n for (j = 0; j < newSelectors.length; j++) {\n sel = newSelectors[j];\n // if we don't have any parent paths, the & might be in a mixin so that it can be used\n // whether there are parents or not\n if (context.length === 0) {\n // the combinator used on el should now be applied to the next element instead so that\n // it is not lost\n if (sel.length > 0) {\n sel[0].elements.push(new Element(el.combinator, '', el.isVariable, el._index, el._fileInfo));\n }\n selectorsMultiplied.push(sel);\n }\n else {\n // and the parent selectors\n for (k = 0; k < context.length; k++) {\n // We need to put the current selectors\n // then join the last selector's elements on to the parents selectors\n const newSelectorPath = addReplacementIntoPath(sel, context[k], el, inSelector);\n // add that to our new set of selectors\n selectorsMultiplied.push(newSelectorPath);\n }\n }\n }\n\n // our new selectors has been multiplied, so reset the state\n newSelectors = selectorsMultiplied;\n currentElements = [];\n }\n }\n\n // if we have any elements left over (e.g. .a& .b == .b)\n // add them on to all the current selectors\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n for (i = 0; i < newSelectors.length; i++) {\n length = newSelectors[i].length;\n if (length > 0) {\n paths.push(newSelectors[i]);\n lastSelector = newSelectors[i][length - 1];\n newSelectors[i][length - 1] = lastSelector.createDerived(lastSelector.elements, inSelector.extendList);\n }\n }\n\n return hadParentSelector;\n }\n\n function deriveSelector(visibilityInfo, deriveFrom) {\n const newSelector = deriveFrom.createDerived(deriveFrom.elements, deriveFrom.extendList, deriveFrom.evaldCondition);\n newSelector.copyVisibilityInfo(visibilityInfo);\n return newSelector;\n }\n\n // joinSelector code follows\n let i, newPaths, hadParentSelector;\n\n newPaths = [];\n hadParentSelector = replaceParentSelector(newPaths, context, selector);\n\n if (!hadParentSelector) {\n if (context.length > 0) {\n newPaths = [];\n for (i = 0; i < context.length; i++) {\n\n const concatenated = context[i].map(deriveSelector.bind(this, selector.visibilityInfo()));\n\n concatenated.push(selector);\n newPaths.push(concatenated);\n }\n }\n else {\n newPaths = [[selector]];\n }\n }\n\n for (i = 0; i < newPaths.length; i++) {\n paths.push(newPaths[i]);\n }\n\n }\n}\n\nRuleset.prototype.type = 'Ruleset';\nRuleset.prototype.isRuleset = true;\nexport default Ruleset;\n","import Node from './node';\nimport Selector from './selector';\nimport Ruleset from './ruleset';\nimport Anonymous from './anonymous';\n\nclass AtRule extends Node {\n constructor(\n name,\n value,\n rules,\n index,\n currentFileInfo,\n debugInfo,\n isRooted,\n visibilityInfo\n ) {\n super();\n\n let i;\n\n this.name = name;\n this.value = (value instanceof Node) ? value : (value ? new Anonymous(value) : value);\n if (rules) {\n if (Array.isArray(rules)) {\n this.rules = rules;\n } else {\n this.rules = [rules];\n this.rules[0].selectors = (new Selector([], null, null, index, currentFileInfo)).createEmptySelectors();\n }\n for (i = 0; i < this.rules.length; i++) {\n this.rules[i].allowImports = true;\n }\n this.setParent(this.rules, this);\n }\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.debugInfo = debugInfo;\n this.isRooted = isRooted || false;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n }\n\n accept(visitor) {\n const value = this.value, rules = this.rules;\n if (rules) {\n this.rules = visitor.visitArray(rules);\n }\n if (value) {\n this.value = visitor.visit(value);\n }\n }\n\n isRulesetLike() {\n return this.rules || !this.isCharset();\n }\n\n isCharset() {\n return '@charset' === this.name;\n }\n\n genCSS(context, output) {\n const value = this.value, rules = this.rules;\n output.add(this.name, this.fileInfo(), this.getIndex());\n if (value) {\n output.add(' ');\n value.genCSS(context, output);\n }\n if (rules) {\n this.outputRuleset(context, output, rules);\n } else {\n output.add(';');\n }\n }\n\n eval(context) {\n let mediaPathBackup, mediaBlocksBackup, value = this.value, rules = this.rules;\n\n // media stored inside other atrule should not bubble over it\n // backpup media bubbling information\n mediaPathBackup = context.mediaPath;\n mediaBlocksBackup = context.mediaBlocks;\n // deleted media bubbling information\n context.mediaPath = [];\n context.mediaBlocks = [];\n\n if (value) {\n value = value.eval(context);\n }\n if (rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n rules = [rules[0].eval(context)];\n rules[0].root = true;\n }\n // restore media bubbling information\n context.mediaPath = mediaPathBackup;\n context.mediaBlocks = mediaBlocksBackup;\n\n return new AtRule(this.name, value, rules,\n this.getIndex(), this.fileInfo(), this.debugInfo, this.isRooted, this.visibilityInfo());\n }\n\n variable(name) {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.variable.call(this.rules[0], name);\n }\n }\n\n find() {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.find.apply(this.rules[0], arguments);\n }\n }\n\n rulesets() {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.rulesets.apply(this.rules[0]);\n }\n }\n\n outputRuleset(context, output, rules) {\n const ruleCnt = rules.length;\n let i;\n context.tabLevel = (context.tabLevel | 0) + 1;\n\n // Compressed\n if (context.compress) {\n output.add('{');\n for (i = 0; i < ruleCnt; i++) {\n rules[i].genCSS(context, output);\n }\n output.add('}');\n context.tabLevel--;\n return;\n }\n\n // Non-compressed\n const tabSetStr = `\\n${Array(context.tabLevel).join(' ')}`, tabRuleStr = `${tabSetStr} `;\n if (!ruleCnt) {\n output.add(` {${tabSetStr}}`);\n } else {\n output.add(` {${tabRuleStr}`);\n rules[0].genCSS(context, output);\n for (i = 1; i < ruleCnt; i++) {\n output.add(tabRuleStr);\n rules[i].genCSS(context, output);\n }\n output.add(`${tabSetStr}}`);\n }\n\n context.tabLevel--;\n }\n}\n\nAtRule.prototype.type = 'AtRule';\nexport default AtRule;\n","import Node from './node';\nimport contexts from '../contexts';\nimport * as utils from '../utils';\n\nclass DetachedRuleset extends Node {\n constructor(ruleset, frames) {\n super();\n\n this.ruleset = ruleset;\n this.frames = frames;\n this.setParent(this.ruleset, this);\n }\n\n accept(visitor) {\n this.ruleset = visitor.visit(this.ruleset);\n }\n\n eval(context) {\n const frames = this.frames || utils.copyArray(context.frames);\n return new DetachedRuleset(this.ruleset, frames);\n }\n\n callEval(context) {\n return this.ruleset.eval(this.frames ? new contexts.Eval(context, this.frames.concat(context.frames)) : context);\n }\n}\n\nDetachedRuleset.prototype.type = 'DetachedRuleset';\nDetachedRuleset.prototype.evalFirst = true;\nexport default DetachedRuleset;\n","import Node from './node';\nimport unitConversions from '../data/unit-conversions';\nimport * as utils from '../utils';\n\nclass Unit extends Node {\n constructor(numerator, denominator, backupUnit) {\n super();\n\n this.numerator = numerator ? utils.copyArray(numerator).sort() : [];\n this.denominator = denominator ? utils.copyArray(denominator).sort() : [];\n if (backupUnit) {\n this.backupUnit = backupUnit;\n } else if (numerator && numerator.length) {\n this.backupUnit = numerator[0];\n }\n }\n\n clone() {\n return new Unit(utils.copyArray(this.numerator), utils.copyArray(this.denominator), this.backupUnit);\n }\n\n genCSS(context, output) {\n // Dimension checks the unit is singular and throws an error if in strict math mode.\n const strictUnits = context && context.strictUnits;\n if (this.numerator.length === 1) {\n output.add(this.numerator[0]); // the ideal situation\n } else if (!strictUnits && this.backupUnit) {\n output.add(this.backupUnit);\n } else if (!strictUnits && this.denominator.length) {\n output.add(this.denominator[0]);\n }\n }\n\n toString() {\n let i, returnStr = this.numerator.join('*');\n for (i = 0; i < this.denominator.length; i++) {\n returnStr += `/${this.denominator[i]}`;\n }\n return returnStr;\n }\n\n compare(other) {\n return this.is(other.toString()) ? 0 : undefined;\n }\n\n is(unitString) {\n return this.toString().toUpperCase() === unitString.toUpperCase();\n }\n\n isLength() {\n return RegExp('^(px|em|ex|ch|rem|in|cm|mm|pc|pt|ex|vw|vh|vmin|vmax)$', 'gi').test(this.toCSS());\n }\n\n isEmpty() {\n return this.numerator.length === 0 && this.denominator.length === 0;\n }\n\n isSingular() {\n return this.numerator.length <= 1 && this.denominator.length === 0;\n }\n\n map(callback) {\n let i;\n\n for (i = 0; i < this.numerator.length; i++) {\n this.numerator[i] = callback(this.numerator[i], false);\n }\n\n for (i = 0; i < this.denominator.length; i++) {\n this.denominator[i] = callback(this.denominator[i], true);\n }\n }\n\n usedUnits() {\n let group;\n const result = {};\n let mapUnit;\n let groupName;\n\n mapUnit = function (atomicUnit) {\n /* jshint loopfunc:true */\n if (group.hasOwnProperty(atomicUnit) && !result[groupName]) {\n result[groupName] = atomicUnit;\n }\n\n return atomicUnit;\n };\n\n for (groupName in unitConversions) {\n if (unitConversions.hasOwnProperty(groupName)) {\n group = unitConversions[groupName];\n\n this.map(mapUnit);\n }\n }\n\n return result;\n }\n\n cancel() {\n const counter = {};\n let atomicUnit;\n let i;\n\n for (i = 0; i < this.numerator.length; i++) {\n atomicUnit = this.numerator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) + 1;\n }\n\n for (i = 0; i < this.denominator.length; i++) {\n atomicUnit = this.denominator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) - 1;\n }\n\n this.numerator = [];\n this.denominator = [];\n\n for (atomicUnit in counter) {\n if (counter.hasOwnProperty(atomicUnit)) {\n const count = counter[atomicUnit];\n\n if (count > 0) {\n for (i = 0; i < count; i++) {\n this.numerator.push(atomicUnit);\n }\n } else if (count < 0) {\n for (i = 0; i < -count; i++) {\n this.denominator.push(atomicUnit);\n }\n }\n }\n }\n\n this.numerator.sort();\n this.denominator.sort();\n }\n}\n\nUnit.prototype.type = 'Unit';\nexport default Unit;\n","import Node from './node';\nimport unitConversions from '../data/unit-conversions';\nimport Unit from './unit';\nimport Color from './color';\n\n//\n// A number with a unit\n//\nclass Dimension extends Node {\n constructor(value, unit) {\n super();\n\n this.value = parseFloat(value);\n if (isNaN(this.value)) {\n throw new Error('Dimension is not a number.');\n }\n this.unit = (unit && unit instanceof Unit) ? unit :\n new Unit(unit ? [unit] : undefined);\n this.setParent(this.unit, this);\n }\n\n accept(visitor) {\n this.unit = visitor.visit(this.unit);\n }\n\n eval(context) {\n return this;\n }\n\n toColor() {\n return new Color([this.value, this.value, this.value]);\n }\n\n genCSS(context, output) {\n if ((context && context.strictUnits) && !this.unit.isSingular()) {\n throw new Error(`Multiple units in dimension. Correct the units or use the unit function. Bad unit: ${this.unit.toString()}`);\n }\n\n const value = this.fround(context, this.value);\n let strValue = String(value);\n\n if (value !== 0 && value < 0.000001 && value > -0.000001) {\n // would be output 1e-6 etc.\n strValue = value.toFixed(20).replace(/0+$/, '');\n }\n\n if (context && context.compress) {\n // Zero values doesn't need a unit\n if (value === 0 && this.unit.isLength()) {\n output.add(strValue);\n return;\n }\n\n // Float values doesn't need a leading zero\n if (value > 0 && value < 1) {\n strValue = (strValue).substr(1);\n }\n }\n\n output.add(strValue);\n this.unit.genCSS(context, output);\n }\n\n // In an operation between two Dimensions,\n // we default to the first Dimension's unit,\n // so `1px + 2` will yield `3px`.\n operate(context, op, other) {\n /* jshint noempty:false */\n let value = this._operate(context, op, this.value, other.value), unit = this.unit.clone();\n\n if (op === '+' || op === '-') {\n if (unit.numerator.length === 0 && unit.denominator.length === 0) {\n unit = other.unit.clone();\n if (this.unit.backupUnit) {\n unit.backupUnit = this.unit.backupUnit;\n }\n } else if (other.unit.numerator.length === 0 && unit.denominator.length === 0) {\n // do nothing\n } else {\n other = other.convertTo(this.unit.usedUnits());\n\n if (context.strictUnits && other.unit.toString() !== unit.toString()) {\n throw new Error(`Incompatible units. Change the units or use the unit function. Bad units: '${unit.toString()}' and '${other.unit.toString()}'.`);\n }\n\n value = this._operate(context, op, this.value, other.value);\n }\n } else if (op === '*') {\n unit.numerator = unit.numerator.concat(other.unit.numerator).sort();\n unit.denominator = unit.denominator.concat(other.unit.denominator).sort();\n unit.cancel();\n } else if (op === '/') {\n unit.numerator = unit.numerator.concat(other.unit.denominator).sort();\n unit.denominator = unit.denominator.concat(other.unit.numerator).sort();\n unit.cancel();\n }\n return new Dimension(value, unit);\n }\n\n compare(other) {\n let a, b;\n\n if (!(other instanceof Dimension)) {\n return undefined;\n }\n\n if (this.unit.isEmpty() || other.unit.isEmpty()) {\n a = this;\n b = other;\n } else {\n a = this.unify();\n b = other.unify();\n if (a.unit.compare(b.unit) !== 0) {\n return undefined;\n }\n }\n\n return Node.numericCompare(a.value, b.value);\n }\n\n unify() {\n return this.convertTo({ length: 'px', duration: 's', angle: 'rad' });\n }\n\n convertTo(conversions) {\n let value = this.value;\n const unit = this.unit.clone();\n let i;\n let groupName;\n let group;\n let targetUnit;\n let derivedConversions = {};\n let applyUnit;\n\n if (typeof conversions === 'string') {\n for (i in unitConversions) {\n if (unitConversions[i].hasOwnProperty(conversions)) {\n derivedConversions = {};\n derivedConversions[i] = conversions;\n }\n }\n conversions = derivedConversions;\n }\n applyUnit = function (atomicUnit, denominator) {\n /* jshint loopfunc:true */\n if (group.hasOwnProperty(atomicUnit)) {\n if (denominator) {\n value = value / (group[atomicUnit] / group[targetUnit]);\n } else {\n value = value * (group[atomicUnit] / group[targetUnit]);\n }\n\n return targetUnit;\n }\n\n return atomicUnit;\n };\n\n for (groupName in conversions) {\n if (conversions.hasOwnProperty(groupName)) {\n targetUnit = conversions[groupName];\n group = unitConversions[groupName];\n\n unit.map(applyUnit);\n }\n }\n\n unit.cancel();\n\n return new Dimension(value, unit);\n }\n}\n\nDimension.prototype.type = 'Dimension';\nexport default Dimension;\n","import Node from './node';\nimport Color from './color';\nimport Dimension from './dimension';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\n\nclass Operation extends Node {\n constructor(op, operands, isSpaced) {\n super();\n\n this.op = op.trim();\n this.operands = operands;\n this.isSpaced = isSpaced;\n }\n\n accept(visitor) {\n this.operands = visitor.visitArray(this.operands);\n }\n\n eval(context) {\n let a = this.operands[0].eval(context), b = this.operands[1].eval(context), op;\n\n if (context.isMathOn(this.op)) {\n op = this.op === './' ? '/' : this.op;\n if (a instanceof Dimension && b instanceof Color) {\n a = a.toColor();\n }\n if (b instanceof Dimension && a instanceof Color) {\n b = b.toColor();\n }\n if (!a.operate) {\n if (a instanceof Operation && a.op === '/' && context.math === MATH.PARENS_DIVISION) {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n throw { type: 'Operation',\n message: 'Operation on an invalid type' };\n }\n\n return a.operate(context, op, b);\n } else {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n }\n\n genCSS(context, output) {\n this.operands[0].genCSS(context, output);\n if (this.isSpaced) {\n output.add(' ');\n }\n output.add(this.op);\n if (this.isSpaced) {\n output.add(' ');\n }\n this.operands[1].genCSS(context, output);\n }\n}\n\nOperation.prototype.type = 'Operation';\nexport default Operation;\n","import Node from './node';\nimport Paren from './paren';\nimport Comment from './comment';\nimport Dimension from './dimension';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\nclass Expression extends Node {\n constructor(value, noSpacing) {\n super();\n\n this.value = value;\n this.noSpacing = noSpacing;\n if (!value) {\n throw new Error('Expression requires an array parameter');\n }\n }\n\n accept(visitor) {\n this.value = visitor.visitArray(this.value);\n }\n\n eval(context) {\n let returnValue;\n const mathOn = context.isMathOn();\n const inParenthesis = this.parens;\n\n let doubleParen = false;\n if (inParenthesis) {\n context.inParenthesis();\n }\n if (this.value.length > 1) {\n returnValue = new Expression(this.value.map(function (e) {\n if (!e.eval) {\n return e;\n }\n return e.eval(context);\n }), this.noSpacing);\n } else if (this.value.length === 1) {\n if (this.value[0].parens && !this.value[0].parensInOp && !context.inCalc) {\n doubleParen = true;\n }\n returnValue = this.value[0].eval(context);\n } else {\n returnValue = this;\n }\n if (inParenthesis) {\n context.outOfParenthesis();\n }\n if (this.parens && this.parensInOp && !mathOn && !doubleParen \n && (!(returnValue instanceof Dimension))) {\n returnValue = new Paren(returnValue);\n }\n return returnValue;\n }\n\n genCSS(context, output) {\n for (let i = 0; i < this.value.length; i++) {\n this.value[i].genCSS(context, output);\n if (!this.noSpacing && i + 1 < this.value.length) {\n output.add(' ');\n }\n }\n }\n\n throwAwayComments() {\n this.value = this.value.filter(function(v) {\n return !(v instanceof Comment);\n });\n }\n}\n\nExpression.prototype.type = 'Expression';\nexport default Expression;\n","import Expression from '../tree/expression';\n\nclass functionCaller {\n constructor(name, context, index, currentFileInfo) {\n this.name = name.toLowerCase();\n this.index = index;\n this.context = context;\n this.currentFileInfo = currentFileInfo;\n\n this.func = context.frames[0].functionRegistry.get(this.name);\n }\n\n isValid() {\n return Boolean(this.func);\n }\n\n call(args) {\n if (!(Array.isArray(args))) {\n args = [args];\n }\n const evalArgs = this.func.evalArgs;\n if (evalArgs !== false) {\n args = args.map(a => a.eval(this.context));\n }\n const commentFilter = item => !(item.type === 'Comment');\n\n // This code is terrible and should be replaced as per this issue...\n // https://github.com/less/less.js/issues/2477\n args = args\n .filter(commentFilter)\n .map(item => {\n if (item.type === 'Expression') {\n const subNodes = item.value.filter(commentFilter);\n if (subNodes.length === 1) {\n return subNodes[0];\n } else {\n return new Expression(subNodes);\n }\n }\n return item;\n });\n\n if (evalArgs === false) {\n return this.func(this.context, ...args);\n }\n\n return this.func(...args);\n }\n}\n\nexport default functionCaller;\n","import Node from './node';\nimport Anonymous from './anonymous';\nimport FunctionCaller from '../functions/function-caller';\nimport logger from '../logger';\n\n//\n// A function call node.\n//\nclass Call extends Node {\n constructor(name, args, index, currentFileInfo) {\n super();\n\n this.name = name;\n this.args = args;\n this.calc = name === 'calc';\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n accept(visitor) {\n if (this.args) {\n this.args = visitor.visitArray(this.args);\n }\n }\n\n //\n // When evaluating a function call,\n // we either find the function in the functionRegistry,\n // in which case we call it, passing the evaluated arguments,\n // if this returns null or we cannot find the function, we\n // simply print it out as it appeared originally [2].\n //\n // The reason why we evaluate the arguments, is in the case where\n // we try to pass a variable to a function, like: `saturate(@color)`.\n // The function should receive the value, not the variable.\n //\n eval(context) {\n /**\n * Turn off math for calc(), and switch back on for evaluating nested functions\n */\n const currentMathContext = context.mathOn;\n context.mathOn = !this.calc;\n if (this.calc || context.inCalc) {\n context.enterCalc();\n }\n\n const exitCalc = () => {\n if (this.calc || context.inCalc) {\n context.exitCalc();\n }\n context.mathOn = currentMathContext;\n };\n\n let result;\n const funcCaller = new FunctionCaller(this.name, context, this.getIndex(), this.fileInfo());\n\n if (funcCaller.isValid()) {\n try {\n result = funcCaller.call(this.args);\n exitCalc();\n } catch (e) {\n if (e.hasOwnProperty('line') && e.hasOwnProperty('column')) {\n throw e;\n }\n throw { \n type: e.type || 'Runtime',\n message: `Error evaluating function \\`${this.name}\\`${e.message ? `: ${e.message}` : ''}`,\n index: this.getIndex(), \n filename: this.fileInfo().filename,\n line: e.lineNumber,\n column: e.columnNumber\n };\n }\n }\n\n if (result !== null && result !== undefined) {\n // Results that that are not nodes are cast as Anonymous nodes\n // Falsy values or booleans are returned as empty nodes\n if (!(result instanceof Node)) {\n if (!result || result === true) {\n result = new Anonymous(null); \n }\n else {\n result = new Anonymous(result.toString()); \n }\n \n }\n result._index = this._index;\n result._fileInfo = this._fileInfo;\n return result;\n }\n\n const args = this.args.map(a => a.eval(context));\n exitCalc();\n\n return new Call(this.name, args, this.getIndex(), this.fileInfo());\n }\n\n genCSS(context, output) {\n output.add(`${this.name}(`, this.fileInfo(), this.getIndex());\n\n for (let i = 0; i < this.args.length; i++) {\n this.args[i].genCSS(context, output);\n if (i + 1 < this.args.length) {\n output.add(', ');\n }\n }\n\n output.add(')');\n }\n}\n\nCall.prototype.type = 'Call';\nexport default Call;\n","import Node from './node';\nimport Call from './call';\n\nclass Variable extends Node {\n constructor(name, index, currentFileInfo) {\n super();\n\n this.name = name;\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n eval(context) {\n let variable, name = this.name;\n\n if (name.indexOf('@@') === 0) {\n name = `@${new Variable(name.slice(1), this.getIndex(), this.fileInfo()).eval(context).value}`;\n }\n\n if (this.evaluating) {\n throw { type: 'Name',\n message: `Recursive variable definition for ${name}`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n variable = this.find(context.frames, function (frame) {\n const v = frame.variable(name);\n if (v) {\n if (v.important) {\n const importantScope = context.importantScope[context.importantScope.length - 1];\n importantScope.important = v.important;\n }\n // If in calc, wrap vars in a function call to cascade evaluate args first\n if (context.inCalc) {\n return (new Call('_SELF', [v.value])).eval(context);\n }\n else {\n return v.value.eval(context);\n }\n }\n });\n if (variable) {\n this.evaluating = false;\n return variable;\n } else {\n throw { type: 'Name',\n message: `variable ${name} is undefined`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n }\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n}\n\nVariable.prototype.type = 'Variable';\nexport default Variable;\n","import Node from './node';\nimport Declaration from './declaration';\n\nclass Property extends Node {\n constructor(name, index, currentFileInfo) {\n super();\n\n this.name = name;\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n eval(context) {\n let property;\n const name = this.name;\n // TODO: shorten this reference\n const mergeRules = context.pluginManager.less.visitors.ToCSSVisitor.prototype._mergeRules;\n\n if (this.evaluating) {\n throw { type: 'Name',\n message: `Recursive property reference for ${name}`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n property = this.find(context.frames, function (frame) {\n let v;\n const vArr = frame.property(name);\n if (vArr) {\n for (let i = 0; i < vArr.length; i++) {\n v = vArr[i];\n\n vArr[i] = new Declaration(v.name,\n v.value,\n v.important,\n v.merge,\n v.index,\n v.currentFileInfo,\n v.inline,\n v.variable\n );\n }\n mergeRules(vArr);\n\n v = vArr[vArr.length - 1];\n if (v.important) {\n const importantScope = context.importantScope[context.importantScope.length - 1];\n importantScope.important = v.important;\n }\n v = v.value.eval(context);\n return v;\n }\n });\n if (property) {\n this.evaluating = false;\n return property;\n } else {\n throw { type: 'Name',\n message: `Property '${name}' is undefined`,\n filename: this.currentFileInfo.filename,\n index: this.index };\n }\n }\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n}\n\nProperty.prototype.type = 'Property';\nexport default Property;\n","import Node from './node';\n\nclass Attribute extends Node {\n constructor(key, op, value) {\n super();\n\n this.key = key;\n this.op = op;\n this.value = value;\n }\n\n eval(context) {\n return new Attribute(this.key.eval ? this.key.eval(context) : this.key,\n this.op, (this.value && this.value.eval) ? this.value.eval(context) : this.value);\n }\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n }\n\n toCSS(context) {\n let value = this.key.toCSS ? this.key.toCSS(context) : this.key;\n\n if (this.op) {\n value += this.op;\n value += (this.value.toCSS ? this.value.toCSS(context) : this.value);\n }\n\n return `[${value}]`;\n }\n}\n\nAttribute.prototype.type = 'Attribute';\nexport default Attribute;\n","import Node from './node';\nimport Variable from './variable';\nimport Property from './property';\n\n\nclass Quoted extends Node {\n constructor(str, content, escaped, index, currentFileInfo) {\n super();\n\n this.escaped = (escaped == null) ? true : escaped;\n this.value = content || '';\n this.quote = str.charAt(0);\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.variableRegex = /@\\{([\\w-]+)\\}/g;\n this.propRegex = /\\$\\{([\\w-]+)\\}/g;\n this.allowRoot = escaped;\n }\n\n genCSS(context, output) {\n if (!this.escaped) {\n output.add(this.quote, this.fileInfo(), this.getIndex());\n }\n output.add(this.value);\n if (!this.escaped) {\n output.add(this.quote);\n }\n }\n\n containsVariables() {\n return this.value.match(this.variableRegex);\n }\n\n eval(context) {\n const that = this;\n let value = this.value;\n const variableReplacement = function (_, name) {\n const v = new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v.value : v.toCSS();\n };\n const propertyReplacement = function (_, name) {\n const v = new Property(`$${name}`, that.getIndex(), that.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v.value : v.toCSS();\n };\n function iterativeReplace(value, regexp, replacementFnc) {\n let evaluatedValue = value;\n do {\n value = evaluatedValue.toString();\n evaluatedValue = value.replace(regexp, replacementFnc);\n } while (value !== evaluatedValue);\n return evaluatedValue;\n }\n value = iterativeReplace(value, this.variableRegex, variableReplacement);\n value = iterativeReplace(value, this.propRegex, propertyReplacement);\n return new Quoted(this.quote + value + this.quote, value, this.escaped, this.getIndex(), this.fileInfo());\n }\n\n compare(other) {\n // when comparing quoted strings allow the quote to differ\n if (other.type === 'Quoted' && !this.escaped && !other.escaped) {\n return Node.numericCompare(this.value, other.value);\n } else {\n return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n }\n }\n}\n\nQuoted.prototype.type = 'Quoted';\nexport default Quoted;\n","import Node from './node';\n\nclass URL extends Node {\n constructor(val, index, currentFileInfo, isEvald) {\n super();\n\n this.value = val;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.isEvald = isEvald;\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n genCSS(context, output) {\n output.add('url(');\n this.value.genCSS(context, output);\n output.add(')');\n }\n\n eval(context) {\n const val = this.value.eval(context);\n let rootpath;\n\n if (!this.isEvald) {\n // Add the rootpath if the URL requires a rewrite\n rootpath = this.fileInfo() && this.fileInfo().rootpath;\n if (typeof rootpath === 'string' &&\n typeof val.value === 'string' &&\n context.pathRequiresRewrite(val.value)) {\n if (!val.quote) {\n rootpath = escapePath(rootpath);\n }\n val.value = context.rewritePath(val.value, rootpath);\n } else {\n val.value = context.normalizePath(val.value);\n }\n\n // Add url args if enabled\n if (context.urlArgs) {\n if (!val.value.match(/^\\s*data:/)) {\n const delimiter = val.value.indexOf('?') === -1 ? '?' : '&';\n const urlArgs = delimiter + context.urlArgs;\n if (val.value.indexOf('#') !== -1) {\n val.value = val.value.replace('#', `${urlArgs}#`);\n } else {\n val.value += urlArgs;\n }\n }\n }\n }\n\n return new URL(val, this.getIndex(), this.fileInfo(), true);\n }\n}\n\nURL.prototype.type = 'Url';\n\nfunction escapePath(path) {\n return path.replace(/[\\(\\)'\"\\s]/g, function(match) { return `\\\\${match}`; });\n}\n\nexport default URL;\n","import Ruleset from './ruleset';\nimport Value from './value';\nimport Selector from './selector';\nimport Anonymous from './anonymous';\nimport Expression from './expression';\nimport AtRule from './atrule';\nimport * as utils from '../utils';\n\nclass Media extends AtRule {\n constructor(value, features, index, currentFileInfo, visibilityInfo) {\n super();\n\n this._index = index;\n this._fileInfo = currentFileInfo;\n\n const selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors();\n\n this.features = new Value(features);\n this.rules = [new Ruleset(selectors, value)];\n this.rules[0].allowImports = true;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n this.setParent(selectors, this);\n this.setParent(this.features, this);\n this.setParent(this.rules, this);\n }\n\n isRulesetLike() {\n return true;\n }\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this.features);\n }\n if (this.rules) {\n this.rules = visitor.visitArray(this.rules);\n }\n }\n\n genCSS(context, output) {\n output.add('@media ', this._fileInfo, this._index);\n this.features.genCSS(context, output);\n this.outputRuleset(context, output, this.rules);\n }\n\n eval(context) {\n if (!context.mediaBlocks) {\n context.mediaBlocks = [];\n context.mediaPath = [];\n }\n\n const media = new Media(null, [], this._index, this._fileInfo, this.visibilityInfo());\n if (this.debugInfo) {\n this.rules[0].debugInfo = this.debugInfo;\n media.debugInfo = this.debugInfo;\n }\n \n media.features = this.features.eval(context);\n\n context.mediaPath.push(media);\n context.mediaBlocks.push(media);\n\n this.rules[0].functionRegistry = context.frames[0].functionRegistry.inherit();\n context.frames.unshift(this.rules[0]);\n media.rules = [this.rules[0].eval(context)];\n context.frames.shift();\n\n context.mediaPath.pop();\n\n return context.mediaPath.length === 0 ? media.evalTop(context) :\n media.evalNested(context);\n }\n\n evalTop(context) {\n let result = this;\n\n // Render all dependent Media blocks.\n if (context.mediaBlocks.length > 1) {\n const selectors = (new Selector([], null, null, this.getIndex(), this.fileInfo())).createEmptySelectors();\n result = new Ruleset(selectors, context.mediaBlocks);\n result.multiMedia = true;\n result.copyVisibilityInfo(this.visibilityInfo());\n this.setParent(result, this);\n }\n\n delete context.mediaBlocks;\n delete context.mediaPath;\n\n return result;\n }\n\n evalNested(context) {\n let i;\n let value;\n const path = context.mediaPath.concat([this]);\n\n // Extract the media-query conditions separated with `,` (OR).\n for (i = 0; i < path.length; i++) {\n value = path[i].features instanceof Value ?\n path[i].features.value : path[i].features;\n path[i] = Array.isArray(value) ? value : [value];\n }\n\n // Trace all permutations to generate the resulting media-query.\n //\n // (a, b and c) with nested (d, e) ->\n // a and d\n // a and e\n // b and c and d\n // b and c and e\n this.features = new Value(this.permute(path).map(path => {\n path = path.map(fragment => fragment.toCSS ? fragment : new Anonymous(fragment));\n\n for (i = path.length - 1; i > 0; i--) {\n path.splice(i, 0, new Anonymous('and'));\n }\n\n return new Expression(path);\n }));\n this.setParent(this.features, this);\n\n // Fake a tree-node that doesn't output anything.\n return new Ruleset([], []);\n }\n\n permute(arr) {\n if (arr.length === 0) {\n return [];\n } else if (arr.length === 1) {\n return arr[0];\n } else {\n const result = [];\n const rest = this.permute(arr.slice(1));\n for (let i = 0; i < rest.length; i++) {\n for (let j = 0; j < arr[0].length; j++) {\n result.push([arr[0][j]].concat(rest[i]));\n }\n }\n return result;\n }\n }\n\n bubbleSelectors(selectors) {\n if (!selectors) {\n return;\n }\n this.rules = [new Ruleset(utils.copyArray(selectors), [this.rules[0]])];\n this.setParent(this.rules, this);\n }\n}\n\nMedia.prototype.type = 'Media';\nexport default Media;\n","import Node from './node';\nimport Media from './media';\nimport URL from './url';\nimport Quoted from './quoted';\nimport Ruleset from './ruleset';\nimport Anonymous from './anonymous';\nimport * as utils from '../utils';\nimport LessError from '../less-error';\n\n//\n// CSS @import node\n//\n// The general strategy here is that we don't want to wait\n// for the parsing to be completed, before we start importing\n// the file. That's because in the context of a browser,\n// most of the time will be spent waiting for the server to respond.\n//\n// On creation, we push the import path to our import queue, though\n// `import,push`, we also pass it a callback, which it'll call once\n// the file has been fetched, and parsed.\n//\nclass Import extends Node {\n constructor(path, features, options, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.options = options;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.path = path;\n this.features = features;\n this.allowRoot = true;\n\n if (this.options.less !== undefined || this.options.inline) {\n this.css = !this.options.less || this.options.inline;\n } else {\n const pathValue = this.getPath();\n if (pathValue && /[#\\.\\&\\?]css([\\?;].*)?$/.test(pathValue)) {\n this.css = true;\n }\n }\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.features, this);\n this.setParent(this.path, this);\n }\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this.features);\n }\n this.path = visitor.visit(this.path);\n if (!this.options.isPlugin && !this.options.inline && this.root) {\n this.root = visitor.visit(this.root);\n }\n }\n\n genCSS(context, output) {\n if (this.css && this.path._fileInfo.reference === undefined) {\n output.add('@import ', this._fileInfo, this._index);\n this.path.genCSS(context, output);\n if (this.features) {\n output.add(' ');\n this.features.genCSS(context, output);\n }\n output.add(';');\n }\n }\n\n getPath() {\n return (this.path instanceof URL) ?\n this.path.value.value : this.path.value;\n }\n\n isVariableImport() {\n let path = this.path;\n if (path instanceof URL) {\n path = path.value;\n }\n if (path instanceof Quoted) {\n return path.containsVariables();\n }\n\n return true;\n }\n\n evalForImport(context) {\n let path = this.path;\n\n if (path instanceof URL) {\n path = path.value;\n }\n\n return new Import(path.eval(context), this.features, this.options, this._index, this._fileInfo, this.visibilityInfo());\n }\n\n evalPath(context) {\n const path = this.path.eval(context);\n const fileInfo = this._fileInfo;\n\n if (!(path instanceof URL)) {\n // Add the rootpath if the URL requires a rewrite\n const pathValue = path.value;\n if (fileInfo &&\n pathValue &&\n context.pathRequiresRewrite(pathValue)) {\n path.value = context.rewritePath(pathValue, fileInfo.rootpath);\n } else {\n path.value = context.normalizePath(path.value);\n }\n }\n\n return path;\n }\n\n eval(context) {\n const result = this.doEval(context);\n if (this.options.reference || this.blocksVisibility()) {\n if (result.length || result.length === 0) {\n result.forEach(function (node) {\n node.addVisibilityBlock();\n }\n );\n } else {\n result.addVisibilityBlock();\n }\n }\n return result;\n }\n\n doEval(context) {\n let ruleset;\n let registry;\n const features = this.features && this.features.eval(context);\n\n if (this.options.isPlugin) {\n if (this.root && this.root.eval) {\n try {\n this.root.eval(context);\n }\n catch (e) {\n e.message = 'Plugin error during evaluation';\n throw new LessError(e, this.root.imports, this.root.filename);\n }\n }\n registry = context.frames[0] && context.frames[0].functionRegistry;\n if ( registry && this.root && this.root.functions ) {\n registry.addMultiple( this.root.functions );\n }\n\n return [];\n }\n\n if (this.skip) {\n if (typeof this.skip === 'function') {\n this.skip = this.skip();\n }\n if (this.skip) {\n return [];\n }\n }\n if (this.options.inline) {\n const contents = new Anonymous(this.root, 0,\n {\n filename: this.importedFilename,\n reference: this.path._fileInfo && this.path._fileInfo.reference\n }, true, true);\n\n return this.features ? new Media([contents], this.features.value) : [contents];\n } else if (this.css) {\n const newImport = new Import(this.evalPath(context), features, this.options, this._index);\n if (!newImport.css && this.error) {\n throw this.error;\n }\n return newImport;\n } else if (this.root) {\n ruleset = new Ruleset(null, utils.copyArray(this.root.rules));\n ruleset.evalImports(context);\n\n return this.features ? new Media(ruleset.rules, this.features.value) : ruleset.rules;\n } else {\n return [];\n }\n }\n}\n\nImport.prototype.type = 'Import';\nexport default Import;\n","import Node from './node';\nimport Variable from './variable';\n\nclass JsEvalNode extends Node {\n evaluateJavaScript(expression, context) {\n let result;\n const that = this;\n const evalContext = {};\n\n if (!context.javascriptEnabled) {\n throw { message: 'Inline JavaScript is not enabled. Is it set in your options?',\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n expression = expression.replace(/@\\{([\\w-]+)\\}/g, function (_, name) {\n return that.jsify(new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context));\n });\n\n try {\n expression = new Function(`return (${expression})`);\n } catch (e) {\n throw { message: `JavaScript evaluation error: ${e.message} from \\`${expression}\\`` ,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n const variables = context.frames[0].variables();\n for (const k in variables) {\n if (variables.hasOwnProperty(k)) {\n /* jshint loopfunc:true */\n evalContext[k.slice(1)] = {\n value: variables[k].value,\n toJS: function () {\n return this.value.eval(context).toCSS();\n }\n };\n }\n }\n\n try {\n result = expression.call(evalContext);\n } catch (e) {\n throw { message: `JavaScript evaluation error: '${e.name}: ${e.message.replace(/[\"]/g, '\\'')}'` ,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n return result;\n }\n\n jsify(obj) {\n if (Array.isArray(obj.value) && (obj.value.length > 1)) {\n return `[${obj.value.map(function (v) { return v.toCSS(); }).join(', ')}]`;\n } else {\n return obj.toCSS();\n }\n }\n}\n\nexport default JsEvalNode;\n","import JsEvalNode from './js-eval-node';\nimport Dimension from './dimension';\nimport Quoted from './quoted';\nimport Anonymous from './anonymous';\n\nclass JavaScript extends JsEvalNode {\n constructor(string, escaped, index, currentFileInfo) {\n super();\n\n this.escaped = escaped;\n this.expression = string;\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n eval(context) {\n const result = this.evaluateJavaScript(this.expression, context);\n const type = typeof result;\n\n if (type === 'number' && !isNaN(result)) {\n return new Dimension(result);\n } else if (type === 'string') {\n return new Quoted(`\"${result}\"`, result, this.escaped, this._index);\n } else if (Array.isArray(result)) {\n return new Anonymous(result.join(', '));\n } else {\n return new Anonymous(result);\n }\n }\n}\n\nJavaScript.prototype.type = 'JavaScript';\nexport default JavaScript;\n","import Node from './node';\n\nclass Assignment extends Node {\n constructor(key, val) {\n super();\n\n this.key = key;\n this.value = val;\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n eval(context) {\n if (this.value.eval) {\n return new Assignment(this.key, this.value.eval(context));\n }\n return this;\n }\n\n genCSS(context, output) {\n output.add(`${this.key}=`);\n if (this.value.genCSS) {\n this.value.genCSS(context, output);\n } else {\n output.add(this.value);\n }\n }\n}\n\nAssignment.prototype.type = 'Assignment';\nexport default Assignment;\n","import Node from './node';\n\nclass Condition extends Node {\n constructor(op, l, r, i, negate) {\n super();\n\n this.op = op.trim();\n this.lvalue = l;\n this.rvalue = r;\n this._index = i;\n this.negate = negate;\n }\n\n accept(visitor) {\n this.lvalue = visitor.visit(this.lvalue);\n this.rvalue = visitor.visit(this.rvalue);\n }\n\n eval(context) {\n const result = (function (op, a, b) {\n switch (op) {\n case 'and': return a && b;\n case 'or': return a || b;\n default:\n switch (Node.compare(a, b)) {\n case -1:\n return op === '<' || op === '=<' || op === '<=';\n case 0:\n return op === '=' || op === '>=' || op === '=<' || op === '<=';\n case 1:\n return op === '>' || op === '>=';\n default:\n return false;\n }\n }\n })(this.op, this.lvalue.eval(context), this.rvalue.eval(context));\n\n return this.negate ? !result : result;\n }\n}\n\nCondition.prototype.type = 'Condition';\nexport default Condition;\n","import Node from './node';\n\nclass UnicodeDescriptor extends Node {\n constructor(value) {\n super();\n\n this.value = value;\n }\n}\n\nUnicodeDescriptor.prototype.type = 'UnicodeDescriptor';\n\nexport default UnicodeDescriptor;\n","import Node from './node';\nimport Operation from './operation';\nimport Dimension from './dimension';\n\nclass Negative extends Node {\n constructor(node) {\n super();\n\n this.value = node;\n }\n\n genCSS(context, output) {\n output.add('-');\n this.value.genCSS(context, output);\n }\n\n eval(context) {\n if (context.isMathOn()) {\n return (new Operation('*', [new Dimension(-1), this.value])).eval(context);\n }\n return new Negative(this.value.eval(context));\n }\n}\n\nNegative.prototype.type = 'Negative';\nexport default Negative;\n","import Node from './node';\nimport Selector from './selector';\n\nclass Extend extends Node {\n constructor(selector, option, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.selector = selector;\n this.option = option;\n this.object_id = Extend.next_id++;\n this.parent_ids = [this.object_id];\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n\n switch (option) {\n case 'all':\n this.allowBefore = true;\n this.allowAfter = true;\n break;\n default:\n this.allowBefore = false;\n this.allowAfter = false;\n break;\n }\n this.setParent(this.selector, this);\n }\n\n accept(visitor) {\n this.selector = visitor.visit(this.selector);\n }\n\n eval(context) {\n return new Extend(this.selector.eval(context), this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n }\n\n clone(context) {\n return new Extend(this.selector, this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n }\n\n // it concatenates (joins) all selectors in selector array\n findSelfSelectors(selectors) {\n let selfElements = [], i, selectorElements;\n\n for (i = 0; i < selectors.length; i++) {\n selectorElements = selectors[i].elements;\n // duplicate the logic in genCSS function inside the selector node.\n // future TODO - move both logics into the selector joiner visitor\n if (i > 0 && selectorElements.length && selectorElements[0].combinator.value === '') {\n selectorElements[0].combinator.value = ' ';\n }\n selfElements = selfElements.concat(selectors[i].elements);\n }\n\n this.selfSelectors = [new Selector(selfElements)];\n this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo());\n }\n}\n\nExtend.next_id = 0;\n\nExtend.prototype.type = 'Extend';\nexport default Extend;\n","import Node from './node';\nimport Variable from './variable';\nimport Ruleset from './ruleset';\nimport DetachedRuleset from './detached-ruleset';\nimport LessError from '../less-error';\n\nclass VariableCall extends Node {\n constructor(variable, index, currentFileInfo) {\n super();\n\n this.variable = variable;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.allowRoot = true;\n }\n\n eval(context) {\n let rules;\n let detachedRuleset = new Variable(this.variable, this.getIndex(), this.fileInfo()).eval(context);\n const error = new LessError({message: `Could not evaluate variable call ${this.variable}`});\n\n if (!detachedRuleset.ruleset) {\n if (detachedRuleset.rules) {\n rules = detachedRuleset;\n }\n else if (Array.isArray(detachedRuleset)) {\n rules = new Ruleset('', detachedRuleset);\n }\n else if (Array.isArray(detachedRuleset.value)) {\n rules = new Ruleset('', detachedRuleset.value);\n }\n else {\n throw error;\n }\n detachedRuleset = new DetachedRuleset(rules);\n }\n\n if (detachedRuleset.ruleset) {\n return detachedRuleset.callEval(context);\n }\n throw error;\n }\n}\n\nVariableCall.prototype.type = 'VariableCall';\nexport default VariableCall;\n","import Node from './node';\nimport Variable from './variable';\nimport Ruleset from './ruleset';\nimport Selector from './selector';\n\nclass NamespaceValue extends Node {\n constructor(ruleCall, lookups, index, fileInfo) {\n super();\n\n this.value = ruleCall;\n this.lookups = lookups;\n this._index = index;\n this._fileInfo = fileInfo;\n }\n\n eval(context) {\n let i, j, name, rules = this.value.eval(context);\n \n for (i = 0; i < this.lookups.length; i++) {\n name = this.lookups[i];\n\n /**\n * Eval'd DRs return rulesets.\n * Eval'd mixins return rules, so let's make a ruleset if we need it.\n * We need to do this because of late parsing of values\n */\n if (Array.isArray(rules)) {\n rules = new Ruleset([new Selector()], rules);\n }\n\n if (name === '') {\n rules = rules.lastDeclaration();\n }\n else if (name.charAt(0) === '@') {\n if (name.charAt(1) === '@') {\n name = `@${new Variable(name.substr(1)).eval(context).value}`;\n }\n if (rules.variables) {\n rules = rules.variable(name);\n }\n \n if (!rules) {\n throw { type: 'Name',\n message: `variable ${name} not found`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n }\n else {\n if (name.substring(0, 2) === '$@') {\n name = `$${new Variable(name.substr(1)).eval(context).value}`;\n }\n else {\n name = name.charAt(0) === '$' ? name : `$${name}`;\n }\n if (rules.properties) {\n rules = rules.property(name);\n }\n \n if (!rules) {\n throw { type: 'Name',\n message: `property \"${name.substr(1)}\" not found`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n // Properties are an array of values, since a ruleset can have multiple props.\n // We pick the last one (the \"cascaded\" value)\n rules = rules[rules.length - 1];\n }\n\n if (rules.value) {\n rules = rules.eval(context).value;\n }\n if (rules.ruleset) {\n rules = rules.ruleset.eval(context);\n }\n }\n return rules;\n }\n}\n\nNamespaceValue.prototype.type = 'NamespaceValue';\nexport default NamespaceValue;\n","import Selector from './selector';\nimport Element from './element';\nimport Ruleset from './ruleset';\nimport Declaration from './declaration';\nimport DetachedRuleset from './detached-ruleset';\nimport Expression from './expression';\nimport contexts from '../contexts';\nimport * as utils from '../utils';\n\nclass Definition extends Ruleset {\n constructor(name, params, rules, condition, variadic, frames, visibilityInfo) {\n super();\n\n this.name = name || 'anonymous mixin';\n this.selectors = [new Selector([new Element(null, name, false, this._index, this._fileInfo)])];\n this.params = params;\n this.condition = condition;\n this.variadic = variadic;\n this.arity = params.length;\n this.rules = rules;\n this._lookups = {};\n const optionalParameters = [];\n this.required = params.reduce(function (count, p) {\n if (!p.name || (p.name && !p.value)) {\n return count + 1;\n }\n else {\n optionalParameters.push(p.name);\n return count;\n }\n }, 0);\n this.optionalParameters = optionalParameters;\n this.frames = frames;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n }\n\n accept(visitor) {\n if (this.params && this.params.length) {\n this.params = visitor.visitArray(this.params);\n }\n this.rules = visitor.visitArray(this.rules);\n if (this.condition) {\n this.condition = visitor.visit(this.condition);\n }\n }\n\n evalParams(context, mixinEnv, args, evaldArguments) {\n /* jshint boss:true */\n const frame = new Ruleset(null, null);\n\n let varargs;\n let arg;\n const params = utils.copyArray(this.params);\n let i;\n let j;\n let val;\n let name;\n let isNamedFound;\n let argIndex;\n let argsLength = 0;\n\n if (mixinEnv.frames && mixinEnv.frames[0] && mixinEnv.frames[0].functionRegistry) {\n frame.functionRegistry = mixinEnv.frames[0].functionRegistry.inherit();\n }\n mixinEnv = new contexts.Eval(mixinEnv, [frame].concat(mixinEnv.frames));\n\n if (args) {\n args = utils.copyArray(args);\n argsLength = args.length;\n\n for (i = 0; i < argsLength; i++) {\n arg = args[i];\n if (name = (arg && arg.name)) {\n isNamedFound = false;\n for (j = 0; j < params.length; j++) {\n if (!evaldArguments[j] && name === params[j].name) {\n evaldArguments[j] = arg.value.eval(context);\n frame.prependRule(new Declaration(name, arg.value.eval(context)));\n isNamedFound = true;\n break;\n }\n }\n if (isNamedFound) {\n args.splice(i, 1);\n i--;\n continue;\n } else {\n throw { type: 'Runtime', message: `Named argument for ${this.name} ${args[i].name} not found` };\n }\n }\n }\n }\n argIndex = 0;\n for (i = 0; i < params.length; i++) {\n if (evaldArguments[i]) { continue; }\n\n arg = args && args[argIndex];\n\n if (name = params[i].name) {\n if (params[i].variadic) {\n varargs = [];\n for (j = argIndex; j < argsLength; j++) {\n varargs.push(args[j].value.eval(context));\n }\n frame.prependRule(new Declaration(name, new Expression(varargs).eval(context)));\n } else {\n val = arg && arg.value;\n if (val) {\n // This was a mixin call, pass in a detached ruleset of it's eval'd rules\n if (Array.isArray(val)) {\n val = new DetachedRuleset(new Ruleset('', val));\n }\n else {\n val = val.eval(context);\n }\n } else if (params[i].value) {\n val = params[i].value.eval(mixinEnv);\n frame.resetCache();\n } else {\n throw { type: 'Runtime', message: `wrong number of arguments for ${this.name} (${argsLength} for ${this.arity})` };\n }\n\n frame.prependRule(new Declaration(name, val));\n evaldArguments[i] = val;\n }\n }\n\n if (params[i].variadic && args) {\n for (j = argIndex; j < argsLength; j++) {\n evaldArguments[j] = args[j].value.eval(context);\n }\n }\n argIndex++;\n }\n\n return frame;\n }\n\n makeImportant() {\n const rules = !this.rules ? this.rules : this.rules.map(function (r) {\n if (r.makeImportant) {\n return r.makeImportant(true);\n } else {\n return r;\n }\n });\n const result = new Definition(this.name, this.params, rules, this.condition, this.variadic, this.frames);\n return result;\n }\n\n eval(context) {\n return new Definition(this.name, this.params, this.rules, this.condition, this.variadic, this.frames || utils.copyArray(context.frames));\n }\n\n evalCall(context, args, important) {\n const _arguments = [];\n const mixinFrames = this.frames ? this.frames.concat(context.frames) : context.frames;\n const frame = this.evalParams(context, new contexts.Eval(context, mixinFrames), args, _arguments);\n let rules;\n let ruleset;\n\n frame.prependRule(new Declaration('@arguments', new Expression(_arguments).eval(context)));\n\n rules = utils.copyArray(this.rules);\n\n ruleset = new Ruleset(null, rules);\n ruleset.originalRuleset = this;\n ruleset = ruleset.eval(new contexts.Eval(context, [this, frame].concat(mixinFrames)));\n if (important) {\n ruleset = ruleset.makeImportant();\n }\n return ruleset;\n }\n\n matchCondition(args, context) {\n if (this.condition && !this.condition.eval(\n new contexts.Eval(context,\n [this.evalParams(context, /* the parameter variables */\n new contexts.Eval(context, this.frames ? this.frames.concat(context.frames) : context.frames), args, [])]\n .concat(this.frames || []) // the parent namespace/mixin frames\n .concat(context.frames)))) { // the current environment frames\n return false;\n }\n return true;\n }\n\n matchArgs(args, context) {\n const allArgsCnt = (args && args.length) || 0;\n let len;\n const optionalParameters = this.optionalParameters;\n const requiredArgsCnt = !args ? 0 : args.reduce(function (count, p) {\n if (optionalParameters.indexOf(p.name) < 0) {\n return count + 1;\n } else {\n return count;\n }\n }, 0);\n\n if (!this.variadic) {\n if (requiredArgsCnt < this.required) {\n return false;\n }\n if (allArgsCnt > this.params.length) {\n return false;\n }\n } else {\n if (requiredArgsCnt < (this.required - 1)) {\n return false;\n }\n }\n\n // check patterns\n len = Math.min(requiredArgsCnt, this.arity);\n\n for (let i = 0; i < len; i++) {\n if (!this.params[i].name && !this.params[i].variadic) {\n if (args[i].value.eval(context).toCSS() != this.params[i].value.eval(context).toCSS()) {\n return false;\n }\n }\n }\n return true;\n }\n}\n\nDefinition.prototype.type = 'MixinDefinition';\nDefinition.prototype.evalFirst = true;\nexport default Definition;\n","import Node from './node';\nimport Selector from './selector';\nimport MixinDefinition from './mixin-definition';\nimport defaultFunc from '../functions/default';\n\nclass MixinCall extends Node {\n constructor(elements, args, index, currentFileInfo, important) {\n super();\n\n this.selector = new Selector(elements);\n this.arguments = args || [];\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.important = important;\n this.allowRoot = true;\n this.setParent(this.selector, this);\n }\n\n accept(visitor) {\n if (this.selector) {\n this.selector = visitor.visit(this.selector);\n }\n if (this.arguments.length) {\n this.arguments = visitor.visitArray(this.arguments);\n }\n }\n\n eval(context) {\n let mixins;\n let mixin;\n let mixinPath;\n const args = [];\n let arg;\n let argValue;\n const rules = [];\n let match = false;\n let i;\n let m;\n let f;\n let isRecursive;\n let isOneFound;\n const candidates = [];\n let candidate;\n const conditionResult = [];\n let defaultResult;\n const defFalseEitherCase = -1;\n const defNone = 0;\n const defTrue = 1;\n const defFalse = 2;\n let count;\n let originalRuleset;\n let noArgumentsFilter;\n\n this.selector = this.selector.eval(context);\n\n function calcDefGroup(mixin, mixinPath) {\n let f, p, namespace;\n\n for (f = 0; f < 2; f++) {\n conditionResult[f] = true;\n defaultFunc.value(f);\n for (p = 0; p < mixinPath.length && conditionResult[f]; p++) {\n namespace = mixinPath[p];\n if (namespace.matchCondition) {\n conditionResult[f] = conditionResult[f] && namespace.matchCondition(null, context);\n }\n }\n if (mixin.matchCondition) {\n conditionResult[f] = conditionResult[f] && mixin.matchCondition(args, context);\n }\n }\n if (conditionResult[0] || conditionResult[1]) {\n if (conditionResult[0] != conditionResult[1]) {\n return conditionResult[1] ?\n defTrue : defFalse;\n }\n\n return defNone;\n }\n return defFalseEitherCase;\n }\n\n for (i = 0; i < this.arguments.length; i++) {\n arg = this.arguments[i];\n argValue = arg.value.eval(context);\n if (arg.expand && Array.isArray(argValue.value)) {\n argValue = argValue.value;\n for (m = 0; m < argValue.length; m++) {\n args.push({value: argValue[m]});\n }\n } else {\n args.push({name: arg.name, value: argValue});\n }\n }\n\n noArgumentsFilter = function(rule) {return rule.matchArgs(null, context);};\n\n for (i = 0; i < context.frames.length; i++) {\n if ((mixins = context.frames[i].find(this.selector, null, noArgumentsFilter)).length > 0) {\n isOneFound = true;\n\n // To make `default()` function independent of definition order we have two \"subpasses\" here.\n // At first we evaluate each guard *twice* (with `default() == true` and `default() == false`),\n // and build candidate list with corresponding flags. Then, when we know all possible matches,\n // we make a final decision.\n\n for (m = 0; m < mixins.length; m++) {\n mixin = mixins[m].rule;\n mixinPath = mixins[m].path;\n isRecursive = false;\n for (f = 0; f < context.frames.length; f++) {\n if ((!(mixin instanceof MixinDefinition)) && mixin === (context.frames[f].originalRuleset || context.frames[f])) {\n isRecursive = true;\n break;\n }\n }\n if (isRecursive) {\n continue;\n }\n\n if (mixin.matchArgs(args, context)) {\n candidate = {mixin, group: calcDefGroup(mixin, mixinPath)};\n\n if (candidate.group !== defFalseEitherCase) {\n candidates.push(candidate);\n }\n\n match = true;\n }\n }\n\n defaultFunc.reset();\n\n count = [0, 0, 0];\n for (m = 0; m < candidates.length; m++) {\n count[candidates[m].group]++;\n }\n\n if (count[defNone] > 0) {\n defaultResult = defFalse;\n } else {\n defaultResult = defTrue;\n if ((count[defTrue] + count[defFalse]) > 1) {\n throw { type: 'Runtime',\n message: `Ambiguous use of \\`default()\\` found when matching for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n }\n\n for (m = 0; m < candidates.length; m++) {\n candidate = candidates[m].group;\n if ((candidate === defNone) || (candidate === defaultResult)) {\n try {\n mixin = candidates[m].mixin;\n if (!(mixin instanceof MixinDefinition)) {\n originalRuleset = mixin.originalRuleset || mixin;\n mixin = new MixinDefinition('', [], mixin.rules, null, false, null, originalRuleset.visibilityInfo());\n mixin.originalRuleset = originalRuleset;\n }\n const newRules = mixin.evalCall(context, args, this.important).rules;\n this._setVisibilityToReplacement(newRules);\n Array.prototype.push.apply(rules, newRules);\n } catch (e) {\n throw { message: e.message, index: this.getIndex(), filename: this.fileInfo().filename, stack: e.stack };\n }\n }\n }\n\n if (match) {\n return rules;\n }\n }\n }\n if (isOneFound) {\n throw { type: 'Runtime',\n message: `No matching definition was found for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n } else {\n throw { type: 'Name',\n message: `${this.selector.toCSS().trim()} is undefined`,\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n }\n\n _setVisibilityToReplacement(replacement) {\n let i, rule;\n if (this.blocksVisibility()) {\n for (i = 0; i < replacement.length; i++) {\n rule = replacement[i];\n rule.addVisibilityBlock();\n }\n }\n }\n\n format(args) {\n return `${this.selector.toCSS().trim()}(${args ? args.map(function (a) {\n let argValue = '';\n if (a.name) {\n argValue += `${a.name}:`;\n }\n if (a.value.toCSS) {\n argValue += a.value.toCSS();\n } else {\n argValue += '???';\n }\n return argValue;\n }).join(', ') : ''})`;\n }\n}\n\nMixinCall.prototype.type = 'MixinCall';\nexport default MixinCall;\n","import Node from './node';\nimport Color from './color';\nimport AtRule from './atrule';\nimport DetachedRuleset from './detached-ruleset';\nimport Operation from './operation';\nimport Dimension from './dimension';\nimport Unit from './unit';\nimport Keyword from './keyword';\nimport Variable from './variable';\nimport Property from './property';\nimport Ruleset from './ruleset';\nimport Element from './element';\nimport Attribute from './attribute';\nimport Combinator from './combinator';\nimport Selector from './selector';\nimport Quoted from './quoted';\nimport Expression from './expression';\nimport Declaration from './declaration';\nimport Call from './call';\nimport URL from './url';\nimport Import from './import';\nimport Comment from './comment';\nimport Anonymous from './anonymous';\nimport Value from './value';\nimport JavaScript from './javascript';\nimport Assignment from './assignment';\nimport Condition from './condition';\nimport Paren from './paren';\nimport Media from './media';\nimport UnicodeDescriptor from './unicode-descriptor';\nimport Negative from './negative';\nimport Extend from './extend';\nimport VariableCall from './variable-call';\nimport NamespaceValue from './namespace-value';\n\n// mixins\nimport MixinCall from './mixin-call';\nimport MixinDefinition from './mixin-definition';\n\nexport default {\n Node, Color, AtRule, DetachedRuleset, Operation,\n Dimension, Unit, Keyword, Variable, Property,\n Ruleset, Element, Attribute, Combinator, Selector,\n Quoted, Expression, Declaration, Call, URL, Import,\n Comment, Anonymous, Value, JavaScript, Assignment,\n Condition, Paren, Media, UnicodeDescriptor, Negative,\n Extend, VariableCall, NamespaceValue,\n mixin: {\n Call: MixinCall,\n Definition: MixinDefinition\n }\n};","class AbstractFileManager {\n getPath(filename) {\n let j = filename.lastIndexOf('?');\n if (j > 0) {\n filename = filename.slice(0, j);\n }\n j = filename.lastIndexOf('/');\n if (j < 0) {\n j = filename.lastIndexOf('\\\\');\n }\n if (j < 0) {\n return '';\n }\n return filename.slice(0, j + 1);\n }\n\n tryAppendExtension(path, ext) {\n return /(\\.[a-z]*$)|([\\?;].*)$/.test(path) ? path : path + ext;\n }\n\n tryAppendLessExtension(path) {\n return this.tryAppendExtension(path, '.less');\n }\n\n supportsSync() {\n return false;\n }\n\n alwaysMakePathsAbsolute() {\n return false;\n }\n\n isPathAbsolute(filename) {\n return (/^(?:[a-z-]+:|\\/|\\\\|#)/i).test(filename);\n }\n\n // TODO: pull out / replace?\n join(basePath, laterPath) {\n if (!basePath) {\n return laterPath;\n }\n return basePath + laterPath;\n }\n\n pathDiff(url, baseUrl) {\n // diff between two paths to create a relative path\n\n const urlParts = this.extractUrlParts(url);\n\n const baseUrlParts = this.extractUrlParts(baseUrl);\n let i;\n let max;\n let urlDirectories;\n let baseUrlDirectories;\n let diff = '';\n if (urlParts.hostPart !== baseUrlParts.hostPart) {\n return '';\n }\n max = Math.max(baseUrlParts.directories.length, urlParts.directories.length);\n for (i = 0; i < max; i++) {\n if (baseUrlParts.directories[i] !== urlParts.directories[i]) { break; }\n }\n baseUrlDirectories = baseUrlParts.directories.slice(i);\n urlDirectories = urlParts.directories.slice(i);\n for (i = 0; i < baseUrlDirectories.length - 1; i++) {\n diff += '../';\n }\n for (i = 0; i < urlDirectories.length - 1; i++) {\n diff += `${urlDirectories[i]}/`;\n }\n return diff;\n }\n\n // helper function, not part of API\n extractUrlParts(url, baseUrl) {\n // urlParts[1] = protocol://hostname/ OR /\n // urlParts[2] = / if path relative to host base\n // urlParts[3] = directories\n // urlParts[4] = filename\n // urlParts[5] = parameters\n\n const urlPartsRegex = /^((?:[a-z-]+:)?\\/{2}(?:[^\\/\\?#]*\\/)|([\\/\\\\]))?((?:[^\\/\\\\\\?#]*[\\/\\\\])*)([^\\/\\\\\\?#]*)([#\\?].*)?$/i;\n\n const urlParts = url.match(urlPartsRegex);\n const returner = {};\n let rawDirectories = [];\n const directories = [];\n let i;\n let baseUrlParts;\n\n if (!urlParts) {\n throw new Error(`Could not parse sheet href - '${url}'`);\n }\n\n // Stylesheets in IE don't always return the full path\n if (baseUrl && (!urlParts[1] || urlParts[2])) {\n baseUrlParts = baseUrl.match(urlPartsRegex);\n if (!baseUrlParts) {\n throw new Error(`Could not parse page url - '${baseUrl}'`);\n }\n urlParts[1] = urlParts[1] || baseUrlParts[1] || '';\n if (!urlParts[2]) {\n urlParts[3] = baseUrlParts[3] + urlParts[3];\n }\n }\n\n if (urlParts[3]) {\n rawDirectories = urlParts[3].replace(/\\\\/g, '/').split('/');\n\n // collapse '..' and skip '.'\n for (i = 0; i < rawDirectories.length; i++) {\n\n if (rawDirectories[i] === '..') {\n directories.pop();\n }\n else if (rawDirectories[i] !== '.') {\n directories.push(rawDirectories[i]);\n }\n \n }\n }\n\n returner.hostPart = urlParts[1];\n returner.directories = directories;\n returner.rawPath = (urlParts[1] || '') + rawDirectories.join('/');\n returner.path = (urlParts[1] || '') + directories.join('/');\n returner.filename = urlParts[4];\n returner.fileUrl = returner.path + (urlParts[4] || '');\n returner.url = returner.fileUrl + (urlParts[5] || '');\n return returner;\n }\n}\n\nexport default AbstractFileManager;\n","import functionRegistry from '../functions/function-registry';\nimport LessError from '../less-error';\n\nclass AbstractPluginLoader {\n constructor() {\n // Implemented by Node.js plugin loader\n this.require = function() {\n return null;\n }\n }\n\n evalPlugin(contents, context, imports, pluginOptions, fileInfo) {\n\n let loader, registry, pluginObj, localModule, pluginManager, filename, result;\n\n pluginManager = context.pluginManager;\n\n if (fileInfo) {\n if (typeof fileInfo === 'string') {\n filename = fileInfo;\n }\n else {\n filename = fileInfo.filename;\n }\n }\n const shortname = (new this.less.FileManager()).extractUrlParts(filename).filename;\n\n if (filename) {\n pluginObj = pluginManager.get(filename);\n\n if (pluginObj) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imports, filename);\n }\n return pluginObj;\n }\n }\n localModule = {\n exports: {},\n pluginManager,\n fileInfo\n };\n registry = functionRegistry.create();\n\n const registerPlugin = function(obj) {\n pluginObj = obj;\n };\n\n try {\n loader = new Function('module', 'require', 'registerPlugin', 'functions', 'tree', 'less', 'fileInfo', contents);\n loader(localModule, this.require(filename), registerPlugin, registry, this.less.tree, this.less, fileInfo);\n }\n catch (e) {\n return new LessError(e, imports, filename);\n }\n\n if (!pluginObj) {\n pluginObj = localModule.exports;\n }\n pluginObj = this.validatePlugin(pluginObj, filename, shortname);\n\n if (pluginObj instanceof LessError) {\n return pluginObj;\n }\n\n if (pluginObj) {\n pluginObj.imports = imports;\n pluginObj.filename = filename;\n\n // For < 3.x (or unspecified minVersion) - setOptions() before install()\n if (!pluginObj.minVersion || this.compareVersion('3.0.0', pluginObj.minVersion) < 0) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n\n if (result) {\n return result;\n }\n }\n\n // Run on first load\n pluginManager.addPlugin(pluginObj, fileInfo.filename, registry);\n pluginObj.functions = registry.getLocalFunctions();\n\n // Need to call setOptions again because the pluginObj might have functions\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n\n // Run every @plugin call\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imports, filename);\n }\n\n }\n else {\n return new LessError({ message: 'Not a valid plugin' }, imports, filename);\n }\n\n return pluginObj;\n\n }\n\n trySetOptions(plugin, filename, name, options) {\n if (options && !plugin.setOptions) {\n return new LessError({\n message: `Options have been provided but the plugin ${name} does not support any options.`\n });\n }\n try {\n plugin.setOptions && plugin.setOptions(options);\n }\n catch (e) {\n return new LessError(e);\n }\n }\n\n validatePlugin(plugin, filename, name) {\n if (plugin) {\n // support plugins being a function\n // so that the plugin can be more usable programmatically\n if (typeof plugin === 'function') {\n plugin = new plugin();\n }\n\n if (plugin.minVersion) {\n if (this.compareVersion(plugin.minVersion, this.less.version) < 0) {\n return new LessError({\n message: `Plugin ${name} requires version ${this.versionToString(plugin.minVersion)}`\n });\n }\n }\n return plugin;\n }\n return null;\n }\n\n compareVersion(aVersion, bVersion) {\n if (typeof aVersion === 'string') {\n aVersion = aVersion.match(/^(\\d+)\\.?(\\d+)?\\.?(\\d+)?/);\n aVersion.shift();\n }\n for (let i = 0; i < aVersion.length; i++) {\n if (aVersion[i] !== bVersion[i]) {\n return parseInt(aVersion[i]) > parseInt(bVersion[i]) ? -1 : 1;\n }\n }\n return 0;\n }\n\n versionToString(version) {\n let versionString = '';\n for (let i = 0; i < version.length; i++) {\n versionString += (versionString ? '.' : '') + version[i];\n }\n return versionString;\n }\n\n printUsage(plugins) {\n for (let i = 0; i < plugins.length; i++) {\n const plugin = plugins[i];\n if (plugin.printUsage) {\n plugin.printUsage();\n }\n }\n }\n}\n\nexport default AbstractPluginLoader;\n\n","import tree from '../tree';\n\nconst _visitArgs = { visitDeeper: true };\nlet _hasIndexed = false;\n\nfunction _noop(node) {\n return node;\n}\n\nfunction indexNodeTypes(parent, ticker) {\n // add .typeIndex to tree node types for lookup table\n let key, child;\n for (key in parent) { \n /* eslint guard-for-in: 0 */\n child = parent[key];\n switch (typeof child) {\n case 'function':\n // ignore bound functions directly on tree which do not have a prototype\n // or aren't nodes\n if (child.prototype && child.prototype.type) {\n child.prototype.typeIndex = ticker++;\n }\n break;\n case 'object':\n ticker = indexNodeTypes(child, ticker);\n break;\n \n }\n }\n return ticker;\n}\n\nclass Visitor {\n constructor(implementation) {\n this._implementation = implementation;\n this._visitInCache = {};\n this._visitOutCache = {};\n\n if (!_hasIndexed) {\n indexNodeTypes(tree, 1);\n _hasIndexed = true;\n }\n }\n\n visit(node) {\n if (!node) {\n return node;\n }\n\n const nodeTypeIndex = node.typeIndex;\n if (!nodeTypeIndex) {\n // MixinCall args aren't a node type?\n if (node.value && node.value.typeIndex) {\n this.visit(node.value);\n }\n return node;\n }\n\n const impl = this._implementation;\n let func = this._visitInCache[nodeTypeIndex];\n let funcOut = this._visitOutCache[nodeTypeIndex];\n const visitArgs = _visitArgs;\n let fnName;\n\n visitArgs.visitDeeper = true;\n\n if (!func) {\n fnName = `visit${node.type}`;\n func = impl[fnName] || _noop;\n funcOut = impl[`${fnName}Out`] || _noop;\n this._visitInCache[nodeTypeIndex] = func;\n this._visitOutCache[nodeTypeIndex] = funcOut;\n }\n\n if (func !== _noop) {\n const newNode = func.call(impl, node, visitArgs);\n if (node && impl.isReplacing) {\n node = newNode;\n }\n }\n\n if (visitArgs.visitDeeper && node) {\n if (node.length) {\n for (let i = 0, cnt = node.length; i < cnt; i++) {\n if (node[i].accept) {\n node[i].accept(this);\n }\n }\n } else if (node.accept) {\n node.accept(this);\n }\n }\n\n if (funcOut != _noop) {\n funcOut.call(impl, node);\n }\n\n return node;\n }\n\n visitArray(nodes, nonReplacing) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.length;\n let i;\n\n // Non-replacing\n if (nonReplacing || !this._implementation.isReplacing) {\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n // Replacing\n const out = [];\n for (i = 0; i < cnt; i++) {\n const evald = this.visit(nodes[i]);\n if (evald === undefined) { continue; }\n if (!evald.splice) {\n out.push(evald);\n } else if (evald.length) {\n this.flatten(evald, out);\n }\n }\n return out;\n }\n\n flatten(arr, out) {\n if (!out) {\n out = [];\n }\n\n let cnt, i, item, nestedCnt, j, nestedItem;\n\n for (i = 0, cnt = arr.length; i < cnt; i++) {\n item = arr[i];\n if (item === undefined) {\n continue;\n }\n if (!item.splice) {\n out.push(item);\n continue;\n }\n\n for (j = 0, nestedCnt = item.length; j < nestedCnt; j++) {\n nestedItem = item[j];\n if (nestedItem === undefined) {\n continue;\n }\n if (!nestedItem.splice) {\n out.push(nestedItem);\n } else if (nestedItem.length) {\n this.flatten(nestedItem, out);\n }\n }\n }\n\n return out;\n }\n}\n\nexport default Visitor;\n","class ImportSequencer {\n constructor(onSequencerEmpty) {\n this.imports = [];\n this.variableImports = [];\n this._onSequencerEmpty = onSequencerEmpty;\n this._currentDepth = 0;\n }\n\n addImport(callback) {\n const importSequencer = this,\n importItem = {\n callback,\n args: null,\n isReady: false\n };\n this.imports.push(importItem);\n return function() {\n importItem.args = Array.prototype.slice.call(arguments, 0);\n importItem.isReady = true;\n importSequencer.tryRun();\n };\n }\n\n addVariableImport(callback) {\n this.variableImports.push(callback);\n }\n\n tryRun() {\n this._currentDepth++;\n try {\n while (true) {\n while (this.imports.length > 0) {\n const importItem = this.imports[0];\n if (!importItem.isReady) {\n return;\n }\n this.imports = this.imports.slice(1);\n importItem.callback.apply(null, importItem.args);\n }\n if (this.variableImports.length === 0) {\n break;\n }\n const variableImport = this.variableImports[0];\n this.variableImports = this.variableImports.slice(1);\n variableImport();\n }\n } finally {\n this._currentDepth--;\n }\n if (this._currentDepth === 0 && this._onSequencerEmpty) {\n this._onSequencerEmpty();\n }\n }\n}\n\nexport default ImportSequencer;\n","import contexts from '../contexts';\nimport Visitor from './visitor';\nimport ImportSequencer from './import-sequencer';\nimport * as utils from '../utils';\n\nconst ImportVisitor = function(importer, finish) {\n\n this._visitor = new Visitor(this);\n this._importer = importer;\n this._finish = finish;\n this.context = new contexts.Eval();\n this.importCount = 0;\n this.onceFileDetectionMap = {};\n this.recursionDetector = {};\n this._sequencer = new ImportSequencer(this._onSequencerEmpty.bind(this));\n};\n\nImportVisitor.prototype = {\n isReplacing: false,\n run: function (root) {\n try {\n // process the contents\n this._visitor.visit(root);\n }\n catch (e) {\n this.error = e;\n }\n\n this.isFinished = true;\n this._sequencer.tryRun();\n },\n _onSequencerEmpty: function() {\n if (!this.isFinished) {\n return;\n }\n this._finish(this.error);\n },\n visitImport: function (importNode, visitArgs) {\n const inlineCSS = importNode.options.inline;\n\n if (!importNode.css || inlineCSS) {\n\n const context = new contexts.Eval(this.context, utils.copyArray(this.context.frames));\n const importParent = context.frames[0];\n\n this.importCount++;\n if (importNode.isVariableImport()) {\n this._sequencer.addVariableImport(this.processImportNode.bind(this, importNode, context, importParent));\n } else {\n this.processImportNode(importNode, context, importParent);\n }\n }\n visitArgs.visitDeeper = false;\n },\n processImportNode: function(importNode, context, importParent) {\n let evaldImportNode;\n const inlineCSS = importNode.options.inline;\n\n try {\n evaldImportNode = importNode.evalForImport(context);\n } catch (e) {\n if (!e.filename) { e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename; }\n // attempt to eval properly and treat as css\n importNode.css = true;\n // if that fails, this error will be thrown\n importNode.error = e;\n }\n\n if (evaldImportNode && (!evaldImportNode.css || inlineCSS)) {\n\n if (evaldImportNode.options.multiple) {\n context.importMultiple = true;\n }\n\n // try appending if we haven't determined if it is css or not\n const tryAppendLessExtension = evaldImportNode.css === undefined;\n\n for (let i = 0; i < importParent.rules.length; i++) {\n if (importParent.rules[i] === importNode) {\n importParent.rules[i] = evaldImportNode;\n break;\n }\n }\n\n const onImported = this.onImported.bind(this, evaldImportNode, context), sequencedOnImported = this._sequencer.addImport(onImported);\n\n this._importer.push(evaldImportNode.getPath(), tryAppendLessExtension, evaldImportNode.fileInfo(),\n evaldImportNode.options, sequencedOnImported);\n } else {\n this.importCount--;\n if (this.isFinished) {\n this._sequencer.tryRun();\n }\n }\n },\n onImported: function (importNode, context, e, root, importedAtRoot, fullPath) {\n if (e) {\n if (!e.filename) {\n e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename;\n }\n this.error = e;\n }\n\n const importVisitor = this, inlineCSS = importNode.options.inline, isPlugin = importNode.options.isPlugin, isOptional = importNode.options.optional, duplicateImport = importedAtRoot || fullPath in importVisitor.recursionDetector;\n\n if (!context.importMultiple) {\n if (duplicateImport) {\n importNode.skip = true;\n } else {\n importNode.skip = function() {\n if (fullPath in importVisitor.onceFileDetectionMap) {\n return true;\n }\n importVisitor.onceFileDetectionMap[fullPath] = true;\n return false;\n };\n }\n }\n\n if (!fullPath && isOptional) {\n importNode.skip = true;\n }\n\n if (root) {\n importNode.root = root;\n importNode.importedFilename = fullPath;\n\n if (!inlineCSS && !isPlugin && (context.importMultiple || !duplicateImport)) {\n importVisitor.recursionDetector[fullPath] = true;\n\n const oldContext = this.context;\n this.context = context;\n try {\n this._visitor.visit(root);\n } catch (e) {\n this.error = e;\n }\n this.context = oldContext;\n }\n }\n\n importVisitor.importCount--;\n\n if (importVisitor.isFinished) {\n importVisitor._sequencer.tryRun();\n }\n },\n visitDeclaration: function (declNode, visitArgs) {\n if (declNode.value.type === 'DetachedRuleset') {\n this.context.frames.unshift(declNode);\n } else {\n visitArgs.visitDeeper = false;\n }\n },\n visitDeclarationOut: function(declNode) {\n if (declNode.value.type === 'DetachedRuleset') {\n this.context.frames.shift();\n }\n },\n visitAtRule: function (atRuleNode, visitArgs) {\n this.context.frames.unshift(atRuleNode);\n },\n visitAtRuleOut: function (atRuleNode) {\n this.context.frames.shift();\n },\n visitMixinDefinition: function (mixinDefinitionNode, visitArgs) {\n this.context.frames.unshift(mixinDefinitionNode);\n },\n visitMixinDefinitionOut: function (mixinDefinitionNode) {\n this.context.frames.shift();\n },\n visitRuleset: function (rulesetNode, visitArgs) {\n this.context.frames.unshift(rulesetNode);\n },\n visitRulesetOut: function (rulesetNode) {\n this.context.frames.shift();\n },\n visitMedia: function (mediaNode, visitArgs) {\n this.context.frames.unshift(mediaNode.rules[0]);\n },\n visitMediaOut: function (mediaNode) {\n this.context.frames.shift();\n }\n};\nexport default ImportVisitor;\n","class SetTreeVisibilityVisitor {\n constructor(visible) {\n this.visible = visible;\n }\n\n run(root) {\n this.visit(root);\n }\n\n visitArray(nodes) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.length;\n let i;\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n visit(node) {\n if (!node) {\n return node;\n }\n if (node.constructor === Array) {\n return this.visitArray(node);\n }\n\n if (!node.blocksVisibility || node.blocksVisibility()) {\n return node;\n }\n if (this.visible) {\n node.ensureVisibility();\n } else {\n node.ensureInvisibility();\n }\n\n node.accept(this);\n return node;\n }\n}\n\nexport default SetTreeVisibilityVisitor;","import tree from '../tree';\nimport Visitor from './visitor';\nimport logger from '../logger';\nimport * as utils from '../utils';\n\n/* jshint loopfunc:true */\n\nclass ExtendFinderVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n this.contexts = [];\n this.allExtendsStack = [[]];\n }\n\n run(root) {\n root = this._visitor.visit(root);\n root.allExtends = this.allExtendsStack[0];\n return root;\n }\n\n visitDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n\n let i;\n let j;\n let extend;\n const allSelectorsExtendList = [];\n let extendList;\n\n // get &:extend(.a); rules which apply to all selectors in this ruleset\n const rules = rulesetNode.rules, ruleCnt = rules ? rules.length : 0;\n for (i = 0; i < ruleCnt; i++) {\n if (rulesetNode.rules[i] instanceof tree.Extend) {\n allSelectorsExtendList.push(rules[i]);\n rulesetNode.extendOnEveryPath = true;\n }\n }\n\n // now find every selector and apply the extends that apply to all extends\n // and the ones which apply to an individual extend\n const paths = rulesetNode.paths;\n for (i = 0; i < paths.length; i++) {\n const selectorPath = paths[i], selector = selectorPath[selectorPath.length - 1], selExtendList = selector.extendList;\n\n extendList = selExtendList ? utils.copyArray(selExtendList).concat(allSelectorsExtendList)\n : allSelectorsExtendList;\n\n if (extendList) {\n extendList = extendList.map(function(allSelectorsExtend) {\n return allSelectorsExtend.clone();\n });\n }\n\n for (j = 0; j < extendList.length; j++) {\n this.foundExtends = true;\n extend = extendList[j];\n extend.findSelfSelectors(selectorPath);\n extend.ruleset = rulesetNode;\n if (j === 0) { extend.firstExtendOnThisSelectorPath = true; }\n this.allExtendsStack[this.allExtendsStack.length - 1].push(extend);\n }\n }\n\n this.contexts.push(rulesetNode.selectors);\n }\n\n visitRulesetOut(rulesetNode) {\n if (!rulesetNode.root) {\n this.contexts.length = this.contexts.length - 1;\n }\n }\n\n visitMedia(mediaNode, visitArgs) {\n mediaNode.allExtends = [];\n this.allExtendsStack.push(mediaNode.allExtends);\n }\n\n visitMediaOut(mediaNode) {\n this.allExtendsStack.length = this.allExtendsStack.length - 1;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n atRuleNode.allExtends = [];\n this.allExtendsStack.push(atRuleNode.allExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n this.allExtendsStack.length = this.allExtendsStack.length - 1;\n }\n}\n\nclass ProcessExtendsVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n }\n\n run(root) {\n const extendFinder = new ExtendFinderVisitor();\n this.extendIndices = {};\n extendFinder.run(root);\n if (!extendFinder.foundExtends) { return root; }\n root.allExtends = root.allExtends.concat(this.doExtendChaining(root.allExtends, root.allExtends));\n this.allExtendsStack = [root.allExtends];\n const newRoot = this._visitor.visit(root);\n this.checkExtendsForNonMatched(root.allExtends);\n return newRoot;\n }\n\n checkExtendsForNonMatched(extendList) {\n const indices = this.extendIndices;\n extendList.filter(function(extend) {\n return !extend.hasFoundMatches && extend.parent_ids.length == 1;\n }).forEach(function(extend) {\n let selector = '_unknown_';\n try {\n selector = extend.selector.toCSS({});\n }\n catch (_) {}\n\n if (!indices[`${extend.index} ${selector}`]) {\n indices[`${extend.index} ${selector}`] = true;\n logger.warn(`extend '${selector}' has no matches`);\n }\n });\n }\n\n doExtendChaining(extendsList, extendsListTarget, iterationCount) {\n //\n // chaining is different from normal extension.. if we extend an extend then we are not just copying, altering\n // and pasting the selector we would do normally, but we are also adding an extend with the same target selector\n // this means this new extend can then go and alter other extends\n //\n // this method deals with all the chaining work - without it, extend is flat and doesn't work on other extend selectors\n // this is also the most expensive.. and a match on one selector can cause an extension of a selector we had already\n // processed if we look at each selector at a time, as is done in visitRuleset\n\n let extendIndex;\n\n let targetExtendIndex;\n let matches;\n const extendsToAdd = [];\n let newSelector;\n const extendVisitor = this;\n let selectorPath;\n let extend;\n let targetExtend;\n let newExtend;\n\n iterationCount = iterationCount || 0;\n\n // loop through comparing every extend with every target extend.\n // a target extend is the one on the ruleset we are looking at copy/edit/pasting in place\n // e.g. .a:extend(.b) {} and .b:extend(.c) {} then the first extend extends the second one\n // and the second is the target.\n // the separation into two lists allows us to process a subset of chains with a bigger set, as is the\n // case when processing media queries\n for (extendIndex = 0; extendIndex < extendsList.length; extendIndex++) {\n for (targetExtendIndex = 0; targetExtendIndex < extendsListTarget.length; targetExtendIndex++) {\n\n extend = extendsList[extendIndex];\n targetExtend = extendsListTarget[targetExtendIndex];\n\n // look for circular references\n if ( extend.parent_ids.indexOf( targetExtend.object_id ) >= 0 ) { continue; }\n\n // find a match in the target extends self selector (the bit before :extend)\n selectorPath = [targetExtend.selfSelectors[0]];\n matches = extendVisitor.findMatch(extend, selectorPath);\n\n if (matches.length) {\n extend.hasFoundMatches = true;\n\n // we found a match, so for each self selector..\n extend.selfSelectors.forEach(function(selfSelector) {\n const info = targetExtend.visibilityInfo();\n\n // process the extend as usual\n newSelector = extendVisitor.extendSelector(matches, selectorPath, selfSelector, extend.isVisible());\n\n // but now we create a new extend from it\n newExtend = new(tree.Extend)(targetExtend.selector, targetExtend.option, 0, targetExtend.fileInfo(), info);\n newExtend.selfSelectors = newSelector;\n\n // add the extend onto the list of extends for that selector\n newSelector[newSelector.length - 1].extendList = [newExtend];\n\n // record that we need to add it.\n extendsToAdd.push(newExtend);\n newExtend.ruleset = targetExtend.ruleset;\n\n // remember its parents for circular references\n newExtend.parent_ids = newExtend.parent_ids.concat(targetExtend.parent_ids, extend.parent_ids);\n\n // only process the selector once.. if we have :extend(.a,.b) then multiple\n // extends will look at the same selector path, so when extending\n // we know that any others will be duplicates in terms of what is added to the css\n if (targetExtend.firstExtendOnThisSelectorPath) {\n newExtend.firstExtendOnThisSelectorPath = true;\n targetExtend.ruleset.paths.push(newSelector);\n }\n });\n }\n }\n }\n\n if (extendsToAdd.length) {\n // try to detect circular references to stop a stack overflow.\n // may no longer be needed.\n this.extendChainCount++;\n if (iterationCount > 100) {\n let selectorOne = '{unable to calculate}';\n let selectorTwo = '{unable to calculate}';\n try {\n selectorOne = extendsToAdd[0].selfSelectors[0].toCSS();\n selectorTwo = extendsToAdd[0].selector.toCSS();\n }\n catch (e) {}\n throw { message: `extend circular reference detected. One of the circular extends is currently:${selectorOne}:extend(${selectorTwo})`};\n }\n\n // now process the new extends on the existing rules so that we can handle a extending b extending c extending\n // d extending e...\n return extendsToAdd.concat(extendVisitor.doExtendChaining(extendsToAdd, extendsListTarget, iterationCount + 1));\n } else {\n return extendsToAdd;\n }\n }\n\n visitDeclaration(ruleNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitSelector(selectorNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n let matches;\n let pathIndex;\n let extendIndex;\n const allExtends = this.allExtendsStack[this.allExtendsStack.length - 1];\n const selectorsToAdd = [];\n const extendVisitor = this;\n let selectorPath;\n\n // look at each selector path in the ruleset, find any extend matches and then copy, find and replace\n\n for (extendIndex = 0; extendIndex < allExtends.length; extendIndex++) {\n for (pathIndex = 0; pathIndex < rulesetNode.paths.length; pathIndex++) {\n selectorPath = rulesetNode.paths[pathIndex];\n\n // extending extends happens initially, before the main pass\n if (rulesetNode.extendOnEveryPath) { continue; }\n const extendList = selectorPath[selectorPath.length - 1].extendList;\n if (extendList && extendList.length) { continue; }\n\n matches = this.findMatch(allExtends[extendIndex], selectorPath);\n\n if (matches.length) {\n allExtends[extendIndex].hasFoundMatches = true;\n\n allExtends[extendIndex].selfSelectors.forEach(function(selfSelector) {\n let extendedSelectors;\n extendedSelectors = extendVisitor.extendSelector(matches, selectorPath, selfSelector, allExtends[extendIndex].isVisible());\n selectorsToAdd.push(extendedSelectors);\n });\n }\n }\n }\n rulesetNode.paths = rulesetNode.paths.concat(selectorsToAdd);\n }\n\n findMatch(extend, haystackSelectorPath) {\n //\n // look through the haystack selector path to try and find the needle - extend.selector\n // returns an array of selector matches that can then be replaced\n //\n let haystackSelectorIndex;\n\n let hackstackSelector;\n let hackstackElementIndex;\n let haystackElement;\n let targetCombinator;\n let i;\n const extendVisitor = this;\n const needleElements = extend.selector.elements;\n const potentialMatches = [];\n let potentialMatch;\n const matches = [];\n\n // loop through the haystack elements\n for (haystackSelectorIndex = 0; haystackSelectorIndex < haystackSelectorPath.length; haystackSelectorIndex++) {\n hackstackSelector = haystackSelectorPath[haystackSelectorIndex];\n\n for (hackstackElementIndex = 0; hackstackElementIndex < hackstackSelector.elements.length; hackstackElementIndex++) {\n\n haystackElement = hackstackSelector.elements[hackstackElementIndex];\n\n // if we allow elements before our match we can add a potential match every time. otherwise only at the first element.\n if (extend.allowBefore || (haystackSelectorIndex === 0 && hackstackElementIndex === 0)) {\n potentialMatches.push({pathIndex: haystackSelectorIndex, index: hackstackElementIndex, matched: 0,\n initialCombinator: haystackElement.combinator});\n }\n\n for (i = 0; i < potentialMatches.length; i++) {\n potentialMatch = potentialMatches[i];\n\n // selectors add \" \" onto the first element. When we use & it joins the selectors together, but if we don't\n // then each selector in haystackSelectorPath has a space before it added in the toCSS phase. so we need to\n // work out what the resulting combinator will be\n targetCombinator = haystackElement.combinator.value;\n if (targetCombinator === '' && hackstackElementIndex === 0) {\n targetCombinator = ' ';\n }\n\n // if we don't match, null our match to indicate failure\n if (!extendVisitor.isElementValuesEqual(needleElements[potentialMatch.matched].value, haystackElement.value) ||\n (potentialMatch.matched > 0 && needleElements[potentialMatch.matched].combinator.value !== targetCombinator)) {\n potentialMatch = null;\n } else {\n potentialMatch.matched++;\n }\n\n // if we are still valid and have finished, test whether we have elements after and whether these are allowed\n if (potentialMatch) {\n potentialMatch.finished = potentialMatch.matched === needleElements.length;\n if (potentialMatch.finished &&\n (!extend.allowAfter &&\n (hackstackElementIndex + 1 < hackstackSelector.elements.length || haystackSelectorIndex + 1 < haystackSelectorPath.length))) {\n potentialMatch = null;\n }\n }\n // if null we remove, if not, we are still valid, so either push as a valid match or continue\n if (potentialMatch) {\n if (potentialMatch.finished) {\n potentialMatch.length = needleElements.length;\n potentialMatch.endPathIndex = haystackSelectorIndex;\n potentialMatch.endPathElementIndex = hackstackElementIndex + 1; // index after end of match\n potentialMatches.length = 0; // we don't allow matches to overlap, so start matching again\n matches.push(potentialMatch);\n }\n } else {\n potentialMatches.splice(i, 1);\n i--;\n }\n }\n }\n }\n return matches;\n }\n\n isElementValuesEqual(elementValue1, elementValue2) {\n if (typeof elementValue1 === 'string' || typeof elementValue2 === 'string') {\n return elementValue1 === elementValue2;\n }\n if (elementValue1 instanceof tree.Attribute) {\n if (elementValue1.op !== elementValue2.op || elementValue1.key !== elementValue2.key) {\n return false;\n }\n if (!elementValue1.value || !elementValue2.value) {\n if (elementValue1.value || elementValue2.value) {\n return false;\n }\n return true;\n }\n elementValue1 = elementValue1.value.value || elementValue1.value;\n elementValue2 = elementValue2.value.value || elementValue2.value;\n return elementValue1 === elementValue2;\n }\n elementValue1 = elementValue1.value;\n elementValue2 = elementValue2.value;\n if (elementValue1 instanceof tree.Selector) {\n if (!(elementValue2 instanceof tree.Selector) || elementValue1.elements.length !== elementValue2.elements.length) {\n return false;\n }\n for (let i = 0; i < elementValue1.elements.length; i++) {\n if (elementValue1.elements[i].combinator.value !== elementValue2.elements[i].combinator.value) {\n if (i !== 0 || (elementValue1.elements[i].combinator.value || ' ') !== (elementValue2.elements[i].combinator.value || ' ')) {\n return false;\n }\n }\n if (!this.isElementValuesEqual(elementValue1.elements[i].value, elementValue2.elements[i].value)) {\n return false;\n }\n }\n return true;\n }\n return false;\n }\n\n extendSelector(matches, selectorPath, replacementSelector, isVisible) {\n\n // for a set of matches, replace each match with the replacement selector\n\n let currentSelectorPathIndex = 0, currentSelectorPathElementIndex = 0, path = [], matchIndex, selector, firstElement, match, newElements;\n\n for (matchIndex = 0; matchIndex < matches.length; matchIndex++) {\n match = matches[matchIndex];\n selector = selectorPath[match.pathIndex];\n firstElement = new tree.Element(\n match.initialCombinator,\n replacementSelector.elements[0].value,\n replacementSelector.elements[0].isVariable,\n replacementSelector.elements[0].getIndex(),\n replacementSelector.elements[0].fileInfo()\n );\n\n if (match.pathIndex > currentSelectorPathIndex && currentSelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n\n newElements = selector.elements\n .slice(currentSelectorPathElementIndex, match.index)\n .concat([firstElement])\n .concat(replacementSelector.elements.slice(1));\n\n if (currentSelectorPathIndex === match.pathIndex && matchIndex > 0) {\n path[path.length - 1].elements =\n path[path.length - 1].elements.concat(newElements);\n } else {\n path = path.concat(selectorPath.slice(currentSelectorPathIndex, match.pathIndex));\n\n path.push(new tree.Selector(\n newElements\n ));\n }\n currentSelectorPathIndex = match.endPathIndex;\n currentSelectorPathElementIndex = match.endPathElementIndex;\n if (currentSelectorPathElementIndex >= selectorPath[currentSelectorPathIndex].elements.length) {\n currentSelectorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n }\n\n if (currentSelectorPathIndex < selectorPath.length && currentSelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathIndex++;\n }\n\n path = path.concat(selectorPath.slice(currentSelectorPathIndex, selectorPath.length));\n path = path.map(function (currentValue) {\n // we can re-use elements here, because the visibility property matters only for selectors\n const derived = currentValue.createDerived(currentValue.elements);\n if (isVisible) {\n derived.ensureVisibility();\n } else {\n derived.ensureInvisibility();\n }\n return derived;\n });\n return path;\n }\n\n visitMedia(mediaNode, visitArgs) {\n let newAllExtends = mediaNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, mediaNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitMediaOut(mediaNode) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStack.length = lastIndex;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n let newAllExtends = atRuleNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, atRuleNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStack.length = lastIndex;\n }\n}\n\nexport default ProcessExtendsVisitor;\n","import Visitor from './visitor';\n\nclass JoinSelectorVisitor {\n constructor() {\n this.contexts = [[]];\n this._visitor = new Visitor(this);\n }\n\n run(root) {\n return this._visitor.visit(root);\n }\n\n visitDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n const paths = [];\n let selectors;\n\n this.contexts.push(paths);\n\n if (!rulesetNode.root) {\n selectors = rulesetNode.selectors;\n if (selectors) {\n selectors = selectors.filter(function(selector) { return selector.getIsOutput(); });\n rulesetNode.selectors = selectors.length ? selectors : (selectors = null);\n if (selectors) { rulesetNode.joinSelectors(paths, context, selectors); }\n }\n if (!selectors) { rulesetNode.rules = null; }\n rulesetNode.paths = paths;\n }\n }\n\n visitRulesetOut(rulesetNode) {\n this.contexts.length = this.contexts.length - 1;\n }\n\n visitMedia(mediaNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n mediaNode.rules[0].root = (context.length === 0 || context[0].multiMedia);\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n if (atRuleNode.rules && atRuleNode.rules.length) {\n atRuleNode.rules[0].root = (atRuleNode.isRooted || context.length === 0 || null);\n }\n }\n}\n\nexport default JoinSelectorVisitor;\n","import tree from '../tree';\nimport Visitor from './visitor';\n\nclass CSSVisitorUtils {\n constructor(context) {\n this._visitor = new Visitor(this);\n this._context = context;\n }\n\n containsSilentNonBlockedChild(bodyRules) {\n let rule;\n if (!bodyRules) {\n return false;\n }\n for (let r = 0; r < bodyRules.length; r++) {\n rule = bodyRules[r];\n if (rule.isSilent && rule.isSilent(this._context) && !rule.blocksVisibility()) {\n // the atrule contains something that was referenced (likely by extend)\n // therefore it needs to be shown in output too\n return true;\n }\n }\n return false;\n }\n\n keepOnlyVisibleChilds(owner) {\n if (owner && owner.rules) {\n owner.rules = owner.rules.filter(thing => thing.isVisible());\n }\n }\n\n isEmpty(owner) {\n return (owner && owner.rules) \n ? (owner.rules.length === 0) : true;\n }\n\n hasVisibleSelector(rulesetNode) {\n return (rulesetNode && rulesetNode.paths)\n ? (rulesetNode.paths.length > 0) : false;\n }\n\n resolveVisibility(node, originalRules) {\n if (!node.blocksVisibility()) {\n if (this.isEmpty(node) && !this.containsSilentNonBlockedChild(originalRules)) {\n return ;\n }\n\n return node;\n }\n\n const compiledRulesBody = node.rules[0];\n this.keepOnlyVisibleChilds(compiledRulesBody);\n\n if (this.isEmpty(compiledRulesBody)) {\n return ;\n }\n\n node.ensureVisibility();\n node.removeVisibilityBlock();\n\n return node;\n }\n\n isVisibleRuleset(rulesetNode) {\n if (rulesetNode.firstRoot) {\n return true;\n }\n\n if (this.isEmpty(rulesetNode)) {\n return false;\n }\n\n if (!rulesetNode.root && !this.hasVisibleSelector(rulesetNode)) {\n return false;\n }\n\n return true;\n }\n}\n\nconst ToCSSVisitor = function(context) {\n this._visitor = new Visitor(this);\n this._context = context;\n this.utils = new CSSVisitorUtils(context);\n};\n\nToCSSVisitor.prototype = {\n isReplacing: true,\n run: function (root) {\n return this._visitor.visit(root);\n },\n\n visitDeclaration: function (declNode, visitArgs) {\n if (declNode.blocksVisibility() || declNode.variable) {\n return;\n }\n return declNode;\n },\n\n visitMixinDefinition: function (mixinNode, visitArgs) {\n // mixin definitions do not get eval'd - this means they keep state\n // so we have to clear that state here so it isn't used if toCSS is called twice\n mixinNode.frames = [];\n },\n\n visitExtend: function (extendNode, visitArgs) {\n },\n\n visitComment: function (commentNode, visitArgs) {\n if (commentNode.blocksVisibility() || commentNode.isSilent(this._context)) {\n return;\n }\n return commentNode;\n },\n\n visitMedia: function(mediaNode, visitArgs) {\n const originalRules = mediaNode.rules[0].rules;\n mediaNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n\n return this.utils.resolveVisibility(mediaNode, originalRules);\n },\n\n visitImport: function (importNode, visitArgs) {\n if (importNode.blocksVisibility()) {\n return ;\n }\n return importNode;\n },\n\n visitAtRule: function(atRuleNode, visitArgs) {\n if (atRuleNode.rules && atRuleNode.rules.length) {\n return this.visitAtRuleWithBody(atRuleNode, visitArgs);\n } else {\n return this.visitAtRuleWithoutBody(atRuleNode, visitArgs);\n }\n },\n\n visitAnonymous: function(anonymousNode, visitArgs) {\n if (!anonymousNode.blocksVisibility()) {\n anonymousNode.accept(this._visitor);\n return anonymousNode;\n }\n },\n\n visitAtRuleWithBody: function(atRuleNode, visitArgs) {\n // if there is only one nested ruleset and that one has no path, then it is\n // just fake ruleset\n function hasFakeRuleset(atRuleNode) {\n const bodyRules = atRuleNode.rules;\n return bodyRules.length === 1 && (!bodyRules[0].paths || bodyRules[0].paths.length === 0);\n }\n function getBodyRules(atRuleNode) {\n const nodeRules = atRuleNode.rules;\n if (hasFakeRuleset(atRuleNode)) {\n return nodeRules[0].rules;\n }\n\n return nodeRules;\n }\n // it is still true that it is only one ruleset in array\n // this is last such moment\n // process childs\n const originalRules = getBodyRules(atRuleNode);\n atRuleNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n\n if (!this.utils.isEmpty(atRuleNode)) {\n this._mergeRules(atRuleNode.rules[0].rules);\n }\n\n return this.utils.resolveVisibility(atRuleNode, originalRules);\n },\n\n visitAtRuleWithoutBody: function(atRuleNode, visitArgs) {\n if (atRuleNode.blocksVisibility()) {\n return;\n }\n\n if (atRuleNode.name === '@charset') {\n // Only output the debug info together with subsequent @charset definitions\n // a comment (or @media statement) before the actual @charset atrule would\n // be considered illegal css as it has to be on the first line\n if (this.charset) {\n if (atRuleNode.debugInfo) {\n const comment = new tree.Comment(`/* ${atRuleNode.toCSS(this._context).replace(/\\n/g, '')} */\\n`);\n comment.debugInfo = atRuleNode.debugInfo;\n return this._visitor.visit(comment);\n }\n return;\n }\n this.charset = true;\n }\n\n return atRuleNode;\n },\n\n checkValidNodes: function(rules, isRoot) {\n if (!rules) {\n return;\n }\n\n for (let i = 0; i < rules.length; i++) {\n const ruleNode = rules[i];\n if (isRoot && ruleNode instanceof tree.Declaration && !ruleNode.variable) {\n throw { message: 'Properties must be inside selector blocks. They cannot be in the root',\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n if (ruleNode instanceof tree.Call) {\n throw { message: `Function '${ruleNode.name}' did not return a root node`,\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n if (ruleNode.type && !ruleNode.allowRoot) {\n throw { message: `${ruleNode.type} node returned by a function is not valid here`,\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n }\n },\n\n visitRuleset: function (rulesetNode, visitArgs) {\n // at this point rulesets are nested into each other\n let rule;\n\n const rulesets = [];\n\n this.checkValidNodes(rulesetNode.rules, rulesetNode.firstRoot);\n\n if (!rulesetNode.root) {\n // remove invisible paths\n this._compileRulesetPaths(rulesetNode);\n\n // remove rulesets from this ruleset body and compile them separately\n const nodeRules = rulesetNode.rules;\n\n let nodeRuleCnt = nodeRules ? nodeRules.length : 0;\n for (let i = 0; i < nodeRuleCnt; ) {\n rule = nodeRules[i];\n if (rule && rule.rules) {\n // visit because we are moving them out from being a child\n rulesets.push(this._visitor.visit(rule));\n nodeRules.splice(i, 1);\n nodeRuleCnt--;\n continue;\n }\n i++;\n }\n // accept the visitor to remove rules and refactor itself\n // then we can decide nogw whether we want it or not\n // compile body\n if (nodeRuleCnt > 0) {\n rulesetNode.accept(this._visitor);\n } else {\n rulesetNode.rules = null;\n }\n visitArgs.visitDeeper = false;\n } else { // if (! rulesetNode.root) {\n rulesetNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n }\n\n if (rulesetNode.rules) {\n this._mergeRules(rulesetNode.rules);\n this._removeDuplicateRules(rulesetNode.rules);\n }\n\n // now decide whether we keep the ruleset\n if (this.utils.isVisibleRuleset(rulesetNode)) {\n rulesetNode.ensureVisibility();\n rulesets.splice(0, 0, rulesetNode);\n }\n\n if (rulesets.length === 1) {\n return rulesets[0];\n }\n return rulesets;\n },\n\n _compileRulesetPaths: function(rulesetNode) {\n if (rulesetNode.paths) {\n rulesetNode.paths = rulesetNode.paths\n .filter(p => {\n let i;\n if (p[0].elements[0].combinator.value === ' ') {\n p[0].elements[0].combinator = new(tree.Combinator)('');\n }\n for (i = 0; i < p.length; i++) {\n if (p[i].isVisible() && p[i].getIsOutput()) {\n return true;\n }\n }\n return false;\n });\n }\n },\n\n _removeDuplicateRules: function(rules) {\n if (!rules) { return; }\n\n // remove duplicates\n const ruleCache = {};\n\n let ruleList;\n let rule;\n let i;\n\n for (i = rules.length - 1; i >= 0 ; i--) {\n rule = rules[i];\n if (rule instanceof tree.Declaration) {\n if (!ruleCache[rule.name]) {\n ruleCache[rule.name] = rule;\n } else {\n ruleList = ruleCache[rule.name];\n if (ruleList instanceof tree.Declaration) {\n ruleList = ruleCache[rule.name] = [ruleCache[rule.name].toCSS(this._context)];\n }\n const ruleCSS = rule.toCSS(this._context);\n if (ruleList.indexOf(ruleCSS) !== -1) {\n rules.splice(i, 1);\n } else {\n ruleList.push(ruleCSS);\n }\n }\n }\n }\n },\n\n _mergeRules: function(rules) {\n if (!rules) {\n return; \n }\n\n const groups = {};\n const groupsArr = [];\n\n for (let i = 0; i < rules.length; i++) {\n const rule = rules[i];\n if (rule.merge) {\n const key = rule.name;\n groups[key] ? rules.splice(i--, 1) : \n groupsArr.push(groups[key] = []);\n groups[key].push(rule);\n }\n }\n\n groupsArr.forEach(group => {\n if (group.length > 0) {\n const result = group[0];\n let space = [];\n const comma = [new tree.Expression(space)];\n group.forEach(rule => {\n if ((rule.merge === '+') && (space.length > 0)) {\n comma.push(new tree.Expression(space = []));\n }\n space.push(rule.value);\n result.important = result.important || rule.important;\n });\n result.value = new tree.Value(comma);\n }\n });\n }\n};\n\nexport default ToCSSVisitor;\n","import Visitor from './visitor';\nimport ImportVisitor from './import-visitor';\nimport MarkVisibleSelectorsVisitor from './set-tree-visibility-visitor';\nimport ExtendVisitor from './extend-visitor';\nimport JoinSelectorVisitor from './join-selector-visitor';\nimport ToCSSVisitor from './to-css-visitor';\n\nexport default {\n Visitor,\n ImportVisitor,\n MarkVisibleSelectorsVisitor,\n ExtendVisitor,\n JoinSelectorVisitor,\n ToCSSVisitor\n};\n","import chunker from './chunker';\n\nexport default () => {\n let // Less input string\n input;\n\n let // current chunk\n j;\n\n const // holds state for backtracking\n saveStack = [];\n\n let // furthest index the parser has gone to\n furthest;\n\n let // if this is furthest we got to, this is the probably cause\n furthestPossibleErrorMessage;\n\n let // chunkified input\n chunks;\n\n let // current chunk\n current;\n\n let // index of current chunk, in `input`\n currentPos;\n\n const parserInput = {};\n const CHARCODE_SPACE = 32;\n const CHARCODE_TAB = 9;\n const CHARCODE_LF = 10;\n const CHARCODE_CR = 13;\n const CHARCODE_PLUS = 43;\n const CHARCODE_COMMA = 44;\n const CHARCODE_FORWARD_SLASH = 47;\n const CHARCODE_9 = 57;\n\n function skipWhitespace(length) {\n const oldi = parserInput.i;\n const oldj = j;\n const curr = parserInput.i - currentPos;\n const endIndex = parserInput.i + current.length - curr;\n const mem = (parserInput.i += length);\n const inp = input;\n let c;\n let nextChar;\n let comment;\n\n for (; parserInput.i < endIndex; parserInput.i++) {\n c = inp.charCodeAt(parserInput.i);\n\n if (parserInput.autoCommentAbsorb && c === CHARCODE_FORWARD_SLASH) {\n nextChar = inp.charAt(parserInput.i + 1);\n if (nextChar === '/') {\n comment = {index: parserInput.i, isLineComment: true};\n let nextNewLine = inp.indexOf('\\n', parserInput.i + 2);\n if (nextNewLine < 0) {\n nextNewLine = endIndex;\n }\n parserInput.i = nextNewLine;\n comment.text = inp.substr(comment.index, parserInput.i - comment.index);\n parserInput.commentStore.push(comment);\n continue;\n } else if (nextChar === '*') {\n const nextStarSlash = inp.indexOf('*/', parserInput.i + 2);\n if (nextStarSlash >= 0) {\n comment = {\n index: parserInput.i,\n text: inp.substr(parserInput.i, nextStarSlash + 2 - parserInput.i),\n isLineComment: false\n };\n parserInput.i += comment.text.length - 1;\n parserInput.commentStore.push(comment);\n continue;\n }\n }\n break;\n }\n\n if ((c !== CHARCODE_SPACE) && (c !== CHARCODE_LF) && (c !== CHARCODE_TAB) && (c !== CHARCODE_CR)) {\n break;\n }\n }\n\n current = current.slice(length + parserInput.i - mem + curr);\n currentPos = parserInput.i;\n\n if (!current.length) {\n if (j < chunks.length - 1) {\n current = chunks[++j];\n skipWhitespace(0); // skip space at the beginning of a chunk\n return true; // things changed\n }\n parserInput.finished = true;\n }\n\n return oldi !== parserInput.i || oldj !== j;\n }\n\n parserInput.save = () => {\n currentPos = parserInput.i;\n saveStack.push( { current, i: parserInput.i, j });\n };\n parserInput.restore = possibleErrorMessage => {\n\n if (parserInput.i > furthest || (parserInput.i === furthest && possibleErrorMessage && !furthestPossibleErrorMessage)) {\n furthest = parserInput.i;\n furthestPossibleErrorMessage = possibleErrorMessage;\n }\n const state = saveStack.pop();\n current = state.current;\n currentPos = parserInput.i = state.i;\n j = state.j;\n };\n parserInput.forget = () => {\n saveStack.pop();\n };\n parserInput.isWhitespace = offset => {\n const pos = parserInput.i + (offset || 0);\n const code = input.charCodeAt(pos);\n return (code === CHARCODE_SPACE || code === CHARCODE_CR || code === CHARCODE_TAB || code === CHARCODE_LF);\n };\n\n // Specialization of $(tok)\n parserInput.$re = tok => {\n if (parserInput.i > currentPos) {\n current = current.slice(parserInput.i - currentPos);\n currentPos = parserInput.i;\n }\n\n const m = tok.exec(current);\n if (!m) {\n return null;\n }\n\n skipWhitespace(m[0].length);\n if (typeof m === 'string') {\n return m;\n }\n\n return m.length === 1 ? m[0] : m;\n };\n\n parserInput.$char = tok => {\n if (input.charAt(parserInput.i) !== tok) {\n return null;\n }\n skipWhitespace(1);\n return tok;\n };\n\n parserInput.$str = tok => {\n const tokLength = tok.length;\n\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tokLength; i++) {\n if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n return null;\n }\n }\n\n skipWhitespace(tokLength);\n return tok;\n };\n\n parserInput.$quoted = loc => {\n const pos = loc || parserInput.i;\n const startChar = input.charAt(pos);\n\n if (startChar !== '\\'' && startChar !== '\"') {\n return;\n }\n const length = input.length;\n const currentPosition = pos;\n\n for (let i = 1; i + currentPosition < length; i++) {\n const nextChar = input.charAt(i + currentPosition);\n switch (nextChar) {\n case '\\\\':\n i++;\n continue;\n case '\\r':\n case '\\n':\n break;\n case startChar:\n const str = input.substr(currentPosition, i + 1);\n if (!loc && loc !== 0) {\n skipWhitespace(i + 1);\n return str\n }\n return [startChar, str];\n default:\n }\n }\n return null;\n };\n\n /**\n * Permissive parsing. Ignores everything except matching {} [] () and quotes\n * until matching token (outside of blocks)\n */\n parserInput.$parseUntil = tok => {\n let quote = '';\n let returnVal = null;\n let inComment = false;\n let blockDepth = 0;\n const blockStack = [];\n const parseGroups = [];\n const length = input.length;\n const startPos = parserInput.i;\n let lastPos = parserInput.i;\n let i = parserInput.i;\n let loop = true;\n let testChar;\n\n if (typeof tok === 'string') {\n testChar = char => char === tok\n } else {\n testChar = char => tok.test(char)\n }\n\n do {\n let prevChar;\n let nextChar = input.charAt(i);\n if (blockDepth === 0 && testChar(nextChar)) {\n returnVal = input.substr(lastPos, i - lastPos);\n if (returnVal) {\n parseGroups.push(returnVal);\n }\n else {\n parseGroups.push(' ');\n }\n returnVal = parseGroups;\n skipWhitespace(i - startPos);\n loop = false\n } else {\n if (inComment) {\n if (nextChar === '*' && \n input.charAt(i + 1) === '/') {\n i++;\n blockDepth--;\n inComment = false;\n }\n i++;\n continue;\n }\n switch (nextChar) {\n case '\\\\':\n i++;\n nextChar = input.charAt(i);\n parseGroups.push(input.substr(lastPos, i - lastPos + 1));\n lastPos = i + 1;\n break;\n case '/':\n if (input.charAt(i + 1) === '*') {\n i++;\n inComment = true;\n blockDepth++;\n }\n break;\n case '\\'':\n case '\"':\n quote = parserInput.$quoted(i);\n if (quote) {\n parseGroups.push(input.substr(lastPos, i - lastPos), quote);\n i += quote[1].length - 1;\n lastPos = i + 1;\n }\n else {\n skipWhitespace(i - startPos);\n returnVal = nextChar;\n loop = false;\n }\n break;\n case '{':\n blockStack.push('}');\n blockDepth++;\n break;\n case '(':\n blockStack.push(')');\n blockDepth++;\n break;\n case '[':\n blockStack.push(']');\n blockDepth++;\n break;\n case '}':\n case ')':\n case ']':\n const expected = blockStack.pop();\n if (nextChar === expected) {\n blockDepth--;\n } else {\n // move the parser to the error and return expected\n skipWhitespace(i - startPos);\n returnVal = expected;\n loop = false;\n }\n }\n i++;\n if (i > length) {\n loop = false;\n }\n }\n prevChar = nextChar;\n } while (loop);\n\n return returnVal ? returnVal : null;\n }\n\n parserInput.autoCommentAbsorb = true;\n parserInput.commentStore = [];\n parserInput.finished = false;\n\n // Same as $(), but don't change the state of the parser,\n // just return the match.\n parserInput.peek = tok => {\n if (typeof tok === 'string') {\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tok.length; i++) {\n if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n return false;\n }\n }\n return true;\n } else {\n return tok.test(current);\n }\n };\n\n // Specialization of peek()\n // TODO remove or change some currentChar calls to peekChar\n parserInput.peekChar = tok => input.charAt(parserInput.i) === tok;\n\n parserInput.currentChar = () => input.charAt(parserInput.i);\n\n parserInput.prevChar = () => input.charAt(parserInput.i - 1);\n\n parserInput.getInput = () => input;\n\n parserInput.peekNotNumeric = () => {\n const c = input.charCodeAt(parserInput.i);\n // Is the first char of the dimension 0-9, '.', '+' or '-'\n return (c > CHARCODE_9 || c < CHARCODE_PLUS) || c === CHARCODE_FORWARD_SLASH || c === CHARCODE_COMMA;\n };\n\n parserInput.start = (str, chunkInput, failFunction) => {\n input = str;\n parserInput.i = j = currentPos = furthest = 0;\n\n // chunking apparently makes things quicker (but my tests indicate\n // it might actually make things slower in node at least)\n // and it is a non-perfect parse - it can't recognise\n // unquoted urls, meaning it can't distinguish comments\n // meaning comments with quotes or {}() in them get 'counted'\n // and then lead to parse errors.\n // In addition if the chunking chunks in the wrong place we might\n // not be able to parse a parser statement in one go\n // this is officially deprecated but can be switched on via an option\n // in the case it causes too much performance issues.\n if (chunkInput) {\n chunks = chunker(str, failFunction);\n } else {\n chunks = [str];\n }\n\n current = chunks[0];\n\n skipWhitespace(0);\n };\n\n parserInput.end = () => {\n let message;\n const isFinished = parserInput.i >= input.length;\n\n if (parserInput.i < furthest) {\n message = furthestPossibleErrorMessage;\n parserInput.i = furthest;\n }\n return {\n isFinished,\n furthest: parserInput.i,\n furthestPossibleErrorMessage: message,\n furthestReachedEnd: parserInput.i >= input.length - 1,\n furthestChar: input[parserInput.i]\n };\n };\n\n return parserInput;\n};\n","// Split the input into chunks.\nexport default function (input, fail) {\n const len = input.length;\n let level = 0;\n let parenLevel = 0;\n let lastOpening;\n let lastOpeningParen;\n let lastMultiComment;\n let lastMultiCommentEndBrace;\n const chunks = [];\n let emitFrom = 0;\n let chunkerCurrentIndex;\n let currentChunkStartIndex;\n let cc;\n let cc2;\n let matched;\n\n function emitChunk(force) {\n const len = chunkerCurrentIndex - emitFrom;\n if (((len < 512) && !force) || !len) {\n return;\n }\n chunks.push(input.slice(emitFrom, chunkerCurrentIndex + 1));\n emitFrom = chunkerCurrentIndex + 1;\n }\n\n for (chunkerCurrentIndex = 0; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc = input.charCodeAt(chunkerCurrentIndex);\n if (((cc >= 97) && (cc <= 122)) || (cc < 34)) {\n // a-z or whitespace\n continue;\n }\n\n switch (cc) {\n case 40: // (\n parenLevel++;\n lastOpeningParen = chunkerCurrentIndex;\n continue;\n case 41: // )\n if (--parenLevel < 0) {\n return fail('missing opening `(`', chunkerCurrentIndex);\n }\n continue;\n case 59: // ;\n if (!parenLevel) { emitChunk(); }\n continue;\n case 123: // {\n level++;\n lastOpening = chunkerCurrentIndex;\n continue;\n case 125: // }\n if (--level < 0) {\n return fail('missing opening `{`', chunkerCurrentIndex);\n }\n if (!level && !parenLevel) { emitChunk(); }\n continue;\n case 92: // \\\n if (chunkerCurrentIndex < len - 1) { chunkerCurrentIndex++; continue; }\n return fail('unescaped `\\\\`', chunkerCurrentIndex);\n case 34:\n case 39:\n case 96: // \", ' and `\n matched = 0;\n currentChunkStartIndex = chunkerCurrentIndex;\n for (chunkerCurrentIndex = chunkerCurrentIndex + 1; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if (cc2 > 96) { continue; }\n if (cc2 == cc) { matched = 1; break; }\n if (cc2 == 92) { // \\\n if (chunkerCurrentIndex == len - 1) {\n return fail('unescaped `\\\\`', chunkerCurrentIndex);\n }\n chunkerCurrentIndex++;\n }\n }\n if (matched) { continue; }\n return fail(`unmatched \\`${String.fromCharCode(cc)}\\``, currentChunkStartIndex);\n case 47: // /, check for comment\n if (parenLevel || (chunkerCurrentIndex == len - 1)) { continue; }\n cc2 = input.charCodeAt(chunkerCurrentIndex + 1);\n if (cc2 == 47) {\n // //, find lnfeed\n for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if ((cc2 <= 13) && ((cc2 == 10) || (cc2 == 13))) { break; }\n }\n } else if (cc2 == 42) {\n // /*, find */\n lastMultiComment = currentChunkStartIndex = chunkerCurrentIndex;\n for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len - 1; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if (cc2 == 125) { lastMultiCommentEndBrace = chunkerCurrentIndex; }\n if (cc2 != 42) { continue; }\n if (input.charCodeAt(chunkerCurrentIndex + 1) == 47) { break; }\n }\n if (chunkerCurrentIndex == len - 1) {\n return fail('missing closing `*/`', currentChunkStartIndex);\n }\n chunkerCurrentIndex++;\n }\n continue;\n case 42: // *, check for unmatched */\n if ((chunkerCurrentIndex < len - 1) && (input.charCodeAt(chunkerCurrentIndex + 1) == 47)) {\n return fail('unmatched `/*`', chunkerCurrentIndex);\n }\n continue;\n }\n }\n\n if (level !== 0) {\n if ((lastMultiComment > lastOpening) && (lastMultiCommentEndBrace > lastMultiComment)) {\n return fail('missing closing `}` or `*/`', lastOpening);\n } else {\n return fail('missing closing `}`', lastOpening);\n }\n } else if (parenLevel !== 0) {\n return fail('missing closing `)`', lastOpeningParen);\n }\n\n emitChunk(true);\n return chunks;\n};\n","import LessError from '../less-error';\nimport tree from '../tree';\nimport visitors from '../visitors';\nimport getParserInput from './parser-input';\nimport * as utils from '../utils';\nimport functionRegistry from '../functions/function-registry';\n\n//\n// less.js - parser\n//\n// A relatively straight-forward predictive parser.\n// There is no tokenization/lexing stage, the input is parsed\n// in one sweep.\n//\n// To make the parser fast enough to run in the browser, several\n// optimization had to be made:\n//\n// - Matching and slicing on a huge input is often cause of slowdowns.\n// The solution is to chunkify the input into smaller strings.\n// The chunks are stored in the `chunks` var,\n// `j` holds the current chunk index, and `currentPos` holds\n// the index of the current chunk in relation to `input`.\n// This gives us an almost 4x speed-up.\n//\n// - In many cases, we don't need to match individual tokens;\n// for example, if a value doesn't hold any variables, operations\n// or dynamic references, the parser can effectively 'skip' it,\n// treating it as a literal.\n// An example would be '1px solid #000' - which evaluates to itself,\n// we don't need to know what the individual components are.\n// The drawback, of course is that you don't get the benefits of\n// syntax-checking on the CSS. This gives us a 50% speed-up in the parser,\n// and a smaller speed-up in the code-gen.\n//\n//\n// Token matching is done with the `$` function, which either takes\n// a terminal string or regexp, or a non-terminal function to call.\n// It also takes care of moving all the indices forwards.\n//\n\nconst Parser = function Parser(context, imports, fileInfo) {\n let parsers;\n const parserInput = getParserInput();\n\n function error(msg, type) {\n throw new LessError(\n {\n index: parserInput.i,\n filename: fileInfo.filename,\n type: type || 'Syntax',\n message: msg\n },\n imports\n );\n }\n\n function expect(arg, msg) {\n // some older browsers return typeof 'function' for RegExp\n const result = (arg instanceof Function) ? arg.call(parsers) : parserInput.$re(arg);\n if (result) {\n return result;\n }\n \n error(msg || (typeof arg === 'string'\n ? `expected '${arg}' got '${parserInput.currentChar()}'`\n : 'unexpected token'));\n }\n\n // Specialization of expect()\n function expectChar(arg, msg) {\n if (parserInput.$char(arg)) {\n return arg;\n }\n error(msg || `expected '${arg}' got '${parserInput.currentChar()}'`);\n }\n\n function getDebugInfo(index) {\n const filename = fileInfo.filename;\n\n return {\n lineNumber: utils.getLocation(index, parserInput.getInput()).line + 1,\n fileName: filename\n };\n }\n\n /**\n * Used after initial parsing to create nodes on the fly\n * \n * @param {String} str - string to parse \n * @param {Array} parseList - array of parsers to run input through e.g. [\"value\", \"important\"]\n * @param {Number} currentIndex - start number to begin indexing\n * @param {Object} fileInfo - fileInfo to attach to created nodes\n */\n function parseNode(str, parseList, currentIndex, fileInfo, callback) {\n let result;\n const returnNodes = [];\n const parser = parserInput;\n\n try {\n parser.start(str, false, function fail(msg, index) {\n callback({\n message: msg,\n index: index + currentIndex\n });\n });\n for (let x = 0, p, i; (p = parseList[x]); x++) {\n i = parser.i;\n result = parsers[p]();\n if (result) {\n try {\n result._index = i + currentIndex;\n result._fileInfo = fileInfo;\n } catch (e) {}\n returnNodes.push(result);\n }\n else {\n returnNodes.push(null);\n }\n }\n\n const endInfo = parser.end();\n if (endInfo.isFinished) {\n callback(null, returnNodes);\n }\n else {\n callback(true, null);\n }\n } catch (e) {\n throw new LessError({\n index: e.index + currentIndex,\n message: e.message\n }, imports, fileInfo.filename);\n }\n }\n\n //\n // The Parser\n //\n return {\n parserInput,\n imports,\n fileInfo,\n parseNode,\n //\n // Parse an input string into an abstract syntax tree,\n // @param str A string containing 'less' markup\n // @param callback call `callback` when done.\n // @param [additionalData] An optional map which can contains vars - a map (key, value) of variables to apply\n //\n parse: function (str, callback, additionalData) {\n let root;\n let error = null;\n let globalVars;\n let modifyVars;\n let ignored;\n let preText = '';\n\n globalVars = (additionalData && additionalData.globalVars) ? `${Parser.serializeVars(additionalData.globalVars)}\\n` : '';\n modifyVars = (additionalData && additionalData.modifyVars) ? `\\n${Parser.serializeVars(additionalData.modifyVars)}` : '';\n\n if (context.pluginManager) {\n const preProcessors = context.pluginManager.getPreProcessors();\n for (let i = 0; i < preProcessors.length; i++) {\n str = preProcessors[i].process(str, { context, imports, fileInfo });\n }\n }\n\n if (globalVars || (additionalData && additionalData.banner)) {\n preText = ((additionalData && additionalData.banner) ? additionalData.banner : '') + globalVars;\n ignored = imports.contentsIgnoredChars;\n ignored[fileInfo.filename] = ignored[fileInfo.filename] || 0;\n ignored[fileInfo.filename] += preText.length;\n }\n\n str = str.replace(/\\r\\n?/g, '\\n');\n // Remove potential UTF Byte Order Mark\n str = preText + str.replace(/^\\uFEFF/, '') + modifyVars;\n imports.contents[fileInfo.filename] = str;\n\n // Start with the primary rule.\n // The whole syntax tree is held under a Ruleset node,\n // with the `root` property set to true, so no `{}` are\n // output. The callback is called when the input is parsed.\n try {\n parserInput.start(str, context.chunkInput, function fail(msg, index) {\n throw new LessError({\n index,\n type: 'Parse',\n message: msg,\n filename: fileInfo.filename\n }, imports);\n });\n\n tree.Node.prototype.parse = this;\n root = new tree.Ruleset(null, this.parsers.primary());\n tree.Node.prototype.rootNode = root;\n root.root = true;\n root.firstRoot = true;\n root.functionRegistry = functionRegistry.inherit();\n \n } catch (e) {\n return callback(new LessError(e, imports, fileInfo.filename));\n }\n\n // If `i` is smaller than the `input.length - 1`,\n // it means the parser wasn't able to parse the whole\n // string, so we've got a parsing error.\n //\n // We try to extract a \\n delimited string,\n // showing the line where the parse error occurred.\n // We split it up into two parts (the part which parsed,\n // and the part which didn't), so we can color them differently.\n const endInfo = parserInput.end();\n if (!endInfo.isFinished) {\n\n let message = endInfo.furthestPossibleErrorMessage;\n\n if (!message) {\n message = 'Unrecognised input';\n if (endInfo.furthestChar === '}') {\n message += '. Possibly missing opening \\'{\\'';\n } else if (endInfo.furthestChar === ')') {\n message += '. Possibly missing opening \\'(\\'';\n } else if (endInfo.furthestReachedEnd) {\n message += '. Possibly missing something';\n }\n }\n\n error = new LessError({\n type: 'Parse',\n message,\n index: endInfo.furthest,\n filename: fileInfo.filename\n }, imports);\n }\n\n const finish = e => {\n e = error || e || imports.error;\n\n if (e) {\n if (!(e instanceof LessError)) {\n e = new LessError(e, imports, fileInfo.filename);\n }\n\n return callback(e);\n }\n else {\n return callback(null, root);\n }\n };\n\n if (context.processImports !== false) {\n new visitors.ImportVisitor(imports, finish)\n .run(root);\n } else {\n return finish();\n }\n },\n\n //\n // Here in, the parsing rules/functions\n //\n // The basic structure of the syntax tree generated is as follows:\n //\n // Ruleset -> Declaration -> Value -> Expression -> Entity\n //\n // Here's some Less code:\n //\n // .class {\n // color: #fff;\n // border: 1px solid #000;\n // width: @w + 4px;\n // > .child {...}\n // }\n //\n // And here's what the parse tree might look like:\n //\n // Ruleset (Selector '.class', [\n // Declaration (\"color\", Value ([Expression [Color #fff]]))\n // Declaration (\"border\", Value ([Expression [Dimension 1px][Keyword \"solid\"][Color #000]]))\n // Declaration (\"width\", Value ([Expression [Operation \" + \" [Variable \"@w\"][Dimension 4px]]]))\n // Ruleset (Selector [Element '>', '.child'], [...])\n // ])\n //\n // In general, most rules will try to parse a token with the `$re()` function, and if the return\n // value is truly, will return a new node, of the relevant type. Sometimes, we need to check\n // first, before parsing, that's when we use `peek()`.\n //\n parsers: parsers = {\n //\n // The `primary` rule is the *entry* and *exit* point of the parser.\n // The rules here can appear at any level of the parse tree.\n //\n // The recursive nature of the grammar is an interplay between the `block`\n // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule,\n // as represented by this simplified grammar:\n //\n // primary → (ruleset | declaration)+\n // ruleset → selector+ block\n // block → '{' primary '}'\n //\n // Only at one point is the primary rule not called from the\n // block rule: at the root level.\n //\n primary: function () {\n const mixin = this.mixin;\n let root = [];\n let node;\n\n while (true) {\n while (true) {\n node = this.comment();\n if (!node) { break; }\n root.push(node);\n }\n // always process comments before deciding if finished\n if (parserInput.finished) {\n break;\n }\n if (parserInput.peek('}')) {\n break;\n }\n\n node = this.extendRule();\n if (node) {\n root = root.concat(node);\n continue;\n }\n\n node = mixin.definition() || this.declaration() || mixin.call(false, false) || \n this.ruleset() || this.variableCall() || this.entities.call() || this.atrule();\n if (node) {\n root.push(node);\n } else {\n let foundSemiColon = false;\n while (parserInput.$char(';')) {\n foundSemiColon = true;\n }\n if (!foundSemiColon) {\n break;\n }\n }\n }\n\n return root;\n },\n\n // comments are collected by the main parsing mechanism and then assigned to nodes\n // where the current structure allows it\n comment: function () {\n if (parserInput.commentStore.length) {\n const comment = parserInput.commentStore.shift();\n return new(tree.Comment)(comment.text, comment.isLineComment, comment.index, fileInfo);\n }\n },\n\n //\n // Entities are tokens which can be found inside an Expression\n //\n entities: {\n mixinLookup: function() {\n return parsers.mixin.call(true, true);\n },\n //\n // A string, which supports escaping \" and '\n //\n // \"milky way\" 'he\\'s the one!'\n //\n quoted: function (forceEscaped) {\n let str;\n const index = parserInput.i;\n let isEscaped = false;\n\n parserInput.save();\n if (parserInput.$char('~')) {\n isEscaped = true;\n } else if (forceEscaped) {\n parserInput.restore();\n return;\n }\n\n str = parserInput.$quoted();\n if (!str) {\n parserInput.restore();\n return;\n }\n parserInput.forget();\n\n return new(tree.Quoted)(str.charAt(0), str.substr(1, str.length - 2), isEscaped, index, fileInfo);\n },\n\n //\n // A catch-all word, such as:\n //\n // black border-collapse\n //\n keyword: function () {\n const k = parserInput.$char('%') || parserInput.$re(/^\\[?(?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+\\]?/);\n if (k) {\n return tree.Color.fromKeyword(k) || new(tree.Keyword)(k);\n }\n },\n\n //\n // A function call\n //\n // rgb(255, 0, 255)\n //\n // The arguments are parsed with the `entities.arguments` parser.\n //\n call: function () {\n let name;\n let args;\n let func;\n const index = parserInput.i;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (parserInput.peek(/^url\\(/i)) {\n return;\n }\n\n parserInput.save();\n\n name = parserInput.$re(/^([\\w-]+|%|~|progid:[\\w\\.]+)\\(/);\n if (!name) {\n parserInput.forget(); \n return;\n }\n\n name = name[1];\n func = this.customFuncCall(name);\n if (func) {\n args = func.parse();\n if (args && func.stop) {\n parserInput.forget();\n return args;\n }\n }\n\n args = this.arguments(args);\n\n if (!parserInput.$char(')')) {\n parserInput.restore('Could not parse call arguments or missing \\')\\'');\n return;\n }\n\n parserInput.forget();\n\n return new(tree.Call)(name, args, index, fileInfo);\n },\n \n //\n // Parsing rules for functions with non-standard args, e.g.:\n //\n // boolean(not(2 > 1))\n //\n // This is a quick prototype, to be modified/improved when\n // more custom-parsed funcs come (e.g. `selector(...)`)\n //\n\n customFuncCall: function (name) {\n /* Ideally the table is to be moved out of here for faster perf.,\n but it's quite tricky since it relies on all these `parsers`\n and `expect` available only here */\n return {\n alpha: f(parsers.ieAlpha, true),\n boolean: f(condition),\n 'if': f(condition)\n }[name.toLowerCase()];\n\n function f(parse, stop) {\n return {\n parse, // parsing function\n stop // when true - stop after parse() and return its result, \n // otherwise continue for plain args\n };\n }\n \n function condition() {\n return [expect(parsers.condition, 'expected condition')];\n }\n },\n\n arguments: function (prevArgs) {\n let argsComma = prevArgs || [];\n const argsSemiColon = [];\n let isSemiColonSeparated;\n let value;\n\n parserInput.save();\n\n while (true) {\n if (prevArgs) {\n prevArgs = false;\n } else {\n value = parsers.detachedRuleset() || this.assignment() || parsers.expression();\n if (!value) {\n break;\n }\n\n if (value.value && value.value.length == 1) {\n value = value.value[0];\n }\n\n argsComma.push(value);\n }\n\n if (parserInput.$char(',')) {\n continue;\n }\n\n if (parserInput.$char(';') || isSemiColonSeparated) {\n isSemiColonSeparated = true;\n value = (argsComma.length < 1) ? argsComma[0]\n : new tree.Value(argsComma);\n argsSemiColon.push(value);\n argsComma = [];\n }\n }\n\n parserInput.forget();\n return isSemiColonSeparated ? argsSemiColon : argsComma;\n },\n literal: function () {\n return this.dimension() ||\n this.color() ||\n this.quoted() ||\n this.unicodeDescriptor();\n },\n\n // Assignments are argument entities for calls.\n // They are present in ie filter properties as shown below.\n //\n // filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* )\n //\n\n assignment: function () {\n let key;\n let value;\n parserInput.save();\n key = parserInput.$re(/^\\w+(?=\\s?=)/i);\n if (!key) {\n parserInput.restore();\n return;\n }\n if (!parserInput.$char('=')) {\n parserInput.restore();\n return;\n }\n value = parsers.entity();\n if (value) {\n parserInput.forget();\n return new(tree.Assignment)(key, value);\n } else {\n parserInput.restore();\n }\n },\n\n //\n // Parse url() tokens\n //\n // We use a specific rule for urls, because they don't really behave like\n // standard function calls. The difference is that the argument doesn't have\n // to be enclosed within a string, so it can't be parsed as an Expression.\n //\n url: function () {\n let value;\n const index = parserInput.i;\n\n parserInput.autoCommentAbsorb = false;\n\n if (!parserInput.$str('url(')) {\n parserInput.autoCommentAbsorb = true;\n return;\n }\n\n value = this.quoted() || this.variable() || this.property() ||\n parserInput.$re(/^(?:(?:\\\\[\\(\\)'\"])|[^\\(\\)'\"])+/) || '';\n\n parserInput.autoCommentAbsorb = true;\n\n expectChar(')');\n\n return new(tree.URL)((value.value != null || \n value instanceof tree.Variable || \n value instanceof tree.Property) ?\n value : new(tree.Anonymous)(value, index), index, fileInfo);\n },\n\n //\n // A Variable entity, such as `@fink`, in\n //\n // width: @fink + 2px\n //\n // We use a different parser for variable definitions,\n // see `parsers.variable`.\n //\n variable: function () {\n let ch;\n let name;\n const index = parserInput.i;\n\n parserInput.save();\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^@@?[\\w-]+/))) {\n ch = parserInput.currentChar();\n if (ch === '(' || ch === '[' && !parserInput.prevChar().match(/^\\s/)) {\n // this may be a VariableCall lookup\n const result = parsers.variableCall(name);\n if (result) {\n parserInput.forget();\n return result;\n }\n }\n parserInput.forget();\n return new(tree.Variable)(name, index, fileInfo);\n }\n parserInput.restore();\n },\n\n // A variable entity using the protective {} e.g. @{var}\n variableCurly: function () {\n let curly;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '@' && (curly = parserInput.$re(/^@\\{([\\w-]+)\\}/))) {\n return new(tree.Variable)(`@${curly[1]}`, index, fileInfo);\n }\n },\n //\n // A Property accessor, such as `$color`, in\n //\n // background-color: $color\n //\n property: function () {\n let name;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' && (name = parserInput.$re(/^\\$[\\w-]+/))) {\n return new(tree.Property)(name, index, fileInfo);\n }\n },\n\n // A property entity useing the protective {} e.g. ${prop}\n propertyCurly: function () {\n let curly;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' && (curly = parserInput.$re(/^\\$\\{([\\w-]+)\\}/))) {\n return new(tree.Property)(`$${curly[1]}`, index, fileInfo);\n }\n },\n //\n // A Hexadecimal color\n //\n // #4F3C2F\n //\n // `rgb` and `hsl` colors are parsed through the `entities.call` parser.\n //\n color: function () {\n let rgb;\n parserInput.save();\n\n if (parserInput.currentChar() === '#' && (rgb = parserInput.$re(/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})([\\w.#\\[])?/))) {\n if (!rgb[2]) {\n parserInput.forget();\n return new(tree.Color)(rgb[1], undefined, rgb[0]);\n } \n }\n parserInput.restore();\n },\n\n colorKeyword: function () {\n parserInput.save();\n const autoCommentAbsorb = parserInput.autoCommentAbsorb;\n parserInput.autoCommentAbsorb = false;\n const k = parserInput.$re(/^[_A-Za-z-][_A-Za-z0-9-]+/);\n parserInput.autoCommentAbsorb = autoCommentAbsorb;\n if (!k) {\n parserInput.forget();\n return;\n }\n parserInput.restore();\n const color = tree.Color.fromKeyword(k);\n if (color) {\n parserInput.$str(k);\n return color;\n }\n },\n\n //\n // A Dimension, that is, a number and a unit\n //\n // 0.5em 95%\n //\n dimension: function () {\n if (parserInput.peekNotNumeric()) {\n return;\n }\n\n const value = parserInput.$re(/^([+-]?\\d*\\.?\\d+)(%|[a-z_]+)?/i);\n if (value) {\n return new(tree.Dimension)(value[1], value[2]);\n }\n },\n\n //\n // A unicode descriptor, as is used in unicode-range\n //\n // U+0?? or U+00A1-00A9\n //\n unicodeDescriptor: function () {\n let ud;\n\n ud = parserInput.$re(/^U\\+[0-9a-fA-F?]+(\\-[0-9a-fA-F?]+)?/);\n if (ud) {\n return new(tree.UnicodeDescriptor)(ud[0]);\n }\n },\n\n //\n // JavaScript code to be evaluated\n //\n // `window.location.href`\n //\n javascript: function () {\n let js;\n const index = parserInput.i;\n\n parserInput.save();\n\n const escape = parserInput.$char('~');\n const jsQuote = parserInput.$char('`');\n\n if (!jsQuote) {\n parserInput.restore();\n return;\n }\n\n js = parserInput.$re(/^[^`]*`/);\n if (js) {\n parserInput.forget();\n return new(tree.JavaScript)(js.substr(0, js.length - 1), Boolean(escape), index, fileInfo);\n }\n parserInput.restore('invalid javascript definition');\n }\n },\n\n //\n // The variable part of a variable definition. Used in the `rule` parser\n //\n // @fink:\n //\n variable: function () {\n let name;\n\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^(@[\\w-]+)\\s*:/))) { return name[1]; }\n },\n\n //\n // Call a variable value to retrieve a detached ruleset\n // or a value from a detached ruleset's rules.\n //\n // @fink();\n // @fink;\n // color: @fink[@color];\n //\n variableCall: function (parsedName) {\n let lookups;\n const i = parserInput.i;\n const inValue = !!parsedName;\n let name = parsedName;\n\n parserInput.save();\n\n if (name || (parserInput.currentChar() === '@'\n && (name = parserInput.$re(/^(@[\\w-]+)(\\(\\s*\\))?/)))) {\n\n lookups = this.mixin.ruleLookups();\n\n if (!lookups && ((inValue && parserInput.$str('()') !== '()') || (name[2] !== '()'))) {\n parserInput.restore('Missing \\'[...]\\' lookup in variable call');\n return;\n }\n\n if (!inValue) {\n name = name[1];\n }\n\n const call = new tree.VariableCall(name, i, fileInfo);\n if (!inValue && parsers.end()) {\n parserInput.forget();\n return call;\n }\n else {\n parserInput.forget();\n return new tree.NamespaceValue(call, lookups, i, fileInfo);\n }\n }\n\n parserInput.restore();\n },\n\n //\n // extend syntax - used to extend selectors\n //\n extend: function(isRule) {\n let elements;\n let e;\n const index = parserInput.i;\n let option;\n let extendList;\n let extend;\n\n if (!parserInput.$str(isRule ? '&:extend(' : ':extend(')) {\n return;\n }\n\n do {\n option = null;\n elements = null;\n while (!(option = parserInput.$re(/^(all)(?=\\s*(\\)|,))/))) {\n e = this.element();\n if (!e) {\n break;\n }\n if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n }\n\n option = option && option[1];\n if (!elements) {\n error('Missing target selector for :extend().');\n }\n extend = new(tree.Extend)(new(tree.Selector)(elements), option, index, fileInfo);\n if (extendList) {\n extendList.push(extend);\n } else {\n extendList = [ extend ];\n }\n } while (parserInput.$char(','));\n\n expect(/^\\)/);\n\n if (isRule) {\n expect(/^;/);\n }\n\n return extendList;\n },\n\n //\n // extendRule - used in a rule to extend all the parent selectors\n //\n extendRule: function() {\n return this.extend(true);\n },\n\n //\n // Mixins\n //\n mixin: {\n //\n // A Mixin call, with an optional argument list\n //\n // #mixins > .square(#fff);\n // #mixins.square(#fff);\n // .rounded(4px, black);\n // .button;\n //\n // We can lookup / return a value using the lookup syntax:\n //\n // color: #mixin.square(#fff)[@color];\n //\n // The `while` loop is there because mixins can be\n // namespaced, but we only support the child and descendant\n // selector for now.\n //\n call: function (inValue, getLookup) {\n const s = parserInput.currentChar();\n let important = false;\n let lookups;\n const index = parserInput.i;\n let elements;\n let args;\n let hasParens;\n\n if (s !== '.' && s !== '#') { return; }\n\n parserInput.save(); // stop us absorbing part of an invalid selector\n\n elements = this.elements();\n\n if (elements) {\n if (parserInput.$char('(')) {\n args = this.args(true).args;\n expectChar(')');\n hasParens = true;\n }\n\n if (getLookup !== false) {\n lookups = this.ruleLookups();\n }\n if (getLookup === true && !lookups) {\n parserInput.restore();\n return;\n }\n\n if (!lookups && !hasParens) {\n // This isn't a valid mixin call\n parserInput.restore('Unrecognized input. Possibly missing \\'(\\' in mixin call.');\n return;\n }\n\n if (!inValue && parsers.important()) {\n important = true;\n }\n\n if (inValue || parsers.end()) {\n parserInput.forget();\n const mixin = new(tree.mixin.Call)(elements, args, index, fileInfo, !lookups && important);\n if (lookups) {\n return new tree.NamespaceValue(mixin, lookups);\n }\n else {\n return mixin;\n }\n }\n }\n\n parserInput.restore();\n },\n /**\n * Matching elements for mixins\n * (Start with . or # and can have > )\n */\n elements: function() {\n let elements;\n let e;\n let c;\n let elem;\n let elemIndex;\n const re = /^[#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/;\n while (true) {\n elemIndex = parserInput.i;\n e = parserInput.$re(re);\n \n if (!e) {\n break;\n }\n elem = new(tree.Element)(c, e, false, elemIndex, fileInfo);\n if (elements) {\n elements.push(elem);\n } else {\n elements = [ elem ];\n }\n c = parserInput.$char('>');\n }\n return elements;\n },\n args: function (isCall) {\n const entities = parsers.entities;\n const returner = { args:null, variadic: false };\n let expressions = [];\n const argsSemiColon = [];\n const argsComma = [];\n let isSemiColonSeparated;\n let expressionContainsNamed;\n let name;\n let nameLoop;\n let value;\n let arg;\n let expand;\n let hasSep = true;\n\n parserInput.save();\n\n while (true) {\n if (isCall) {\n arg = parsers.detachedRuleset() || parsers.expression();\n } else {\n parserInput.commentStore.length = 0;\n if (parserInput.$str('...')) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ variadic: true });\n break;\n }\n arg = entities.variable() || entities.property() || entities.literal() || entities.keyword() || this.call(true);\n }\n\n if (!arg || !hasSep) {\n break;\n }\n\n nameLoop = null;\n if (arg.throwAwayComments) {\n arg.throwAwayComments();\n }\n value = arg;\n let val = null;\n\n if (isCall) {\n // Variable\n if (arg.value && arg.value.length == 1) {\n val = arg.value[0];\n }\n } else {\n val = arg;\n }\n\n if (val && (val instanceof tree.Variable || val instanceof tree.Property)) {\n if (parserInput.$char(':')) {\n if (expressions.length > 0) {\n if (isSemiColonSeparated) {\n error('Cannot mix ; and , as delimiter types');\n }\n expressionContainsNamed = true;\n }\n\n value = parsers.detachedRuleset() || parsers.expression();\n\n if (!value) {\n if (isCall) {\n error('could not understand value for named argument');\n } else {\n parserInput.restore();\n returner.args = [];\n return returner;\n }\n }\n nameLoop = (name = val.name);\n } else if (parserInput.$str('...')) {\n if (!isCall) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ name: arg.name, variadic: true });\n break;\n } else {\n expand = true;\n }\n } else if (!isCall) {\n name = nameLoop = val.name;\n value = null;\n }\n }\n\n if (value) {\n expressions.push(value);\n }\n\n argsComma.push({ name:nameLoop, value, expand });\n\n if (parserInput.$char(',')) {\n hasSep = true;\n continue;\n }\n hasSep = parserInput.$char(';') === ';';\n\n if (hasSep || isSemiColonSeparated) {\n\n if (expressionContainsNamed) {\n error('Cannot mix ; and , as delimiter types');\n }\n\n isSemiColonSeparated = true;\n\n if (expressions.length > 1) {\n value = new(tree.Value)(expressions);\n }\n argsSemiColon.push({ name, value, expand });\n\n name = null;\n expressions = [];\n expressionContainsNamed = false;\n }\n }\n\n parserInput.forget();\n returner.args = isSemiColonSeparated ? argsSemiColon : argsComma;\n return returner;\n },\n //\n // A Mixin definition, with a list of parameters\n //\n // .rounded (@radius: 2px, @color) {\n // ...\n // }\n //\n // Until we have a finer grained state-machine, we have to\n // do a look-ahead, to make sure we don't have a mixin call.\n // See the `rule` function for more information.\n //\n // We start by matching `.rounded (`, and then proceed on to\n // the argument list, which has optional default values.\n // We store the parameters in `params`, with a `value` key,\n // if there is a value, such as in the case of `@radius`.\n //\n // Once we've got our params list, and a closing `)`, we parse\n // the `{...}` block.\n //\n definition: function () {\n let name;\n let params = [];\n let match;\n let ruleset;\n let cond;\n let variadic = false;\n if ((parserInput.currentChar() !== '.' && parserInput.currentChar() !== '#') ||\n parserInput.peek(/^[^{]*\\}/)) {\n return;\n }\n\n parserInput.save();\n\n match = parserInput.$re(/^([#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\\s*\\(/);\n if (match) {\n name = match[1];\n\n const argInfo = this.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n\n // .mixincall(\"@{a}\");\n // looks a bit like a mixin definition..\n // also\n // .mixincall(@a: {rule: set;});\n // so we have to be nice and restore\n if (!parserInput.$char(')')) {\n parserInput.restore('Missing closing \\')\\'');\n return;\n }\n\n parserInput.commentStore.length = 0;\n\n if (parserInput.$str('when')) { // Guard\n cond = expect(parsers.conditions, 'expected condition');\n }\n\n ruleset = parsers.block();\n\n if (ruleset) {\n parserInput.forget();\n return new(tree.mixin.Definition)(name, params, ruleset, cond, variadic);\n } else {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n }\n },\n \n ruleLookups: function() {\n let rule;\n let args;\n const lookups = [];\n\n if (parserInput.currentChar() !== '[') { \n return;\n }\n\n while (true) {\n parserInput.save();\n args = null;\n rule = this.lookupValue();\n if (!rule && rule !== '') {\n parserInput.restore();\n break;\n }\n lookups.push(rule);\n parserInput.forget();\n }\n if (lookups.length > 0) {\n return lookups;\n }\n },\n \n lookupValue: function() {\n parserInput.save();\n \n if (!parserInput.$char('[')) { \n parserInput.restore();\n return;\n }\n \n const name = parserInput.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);\n \n if (!parserInput.$char(']')) {\n parserInput.restore();\n return;\n } \n\n if (name || name === '') {\n parserInput.forget();\n return name;\n }\n \n parserInput.restore();\n }\n },\n //\n // Entities are the smallest recognized token,\n // and can be found inside a rule's value.\n //\n entity: function () {\n const entities = this.entities;\n\n return this.comment() || entities.literal() || entities.variable() || entities.url() ||\n entities.property() || entities.call() || entities.keyword() || this.mixin.call(true) ||\n entities.javascript();\n },\n\n //\n // A Declaration terminator. Note that we use `peek()` to check for '}',\n // because the `block` rule will be expecting it, but we still need to make sure\n // it's there, if ';' was omitted.\n //\n end: function () {\n return parserInput.$char(';') || parserInput.peek('}');\n },\n\n //\n // IE's alpha function\n //\n // alpha(opacity=88)\n //\n ieAlpha: function () {\n let value;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (!parserInput.$re(/^opacity=/i)) { return; }\n value = parserInput.$re(/^\\d+/);\n if (!value) {\n value = expect(parsers.entities.variable, 'Could not parse alpha');\n value = `@{${value.name.slice(1)}}`;\n }\n expectChar(')');\n return new tree.Quoted('', `alpha(opacity=${value})`);\n },\n\n //\n // A Selector Element\n //\n // div\n // + h1\n // #socks\n // input[type=\"text\"]\n //\n // Elements are the building blocks for Selectors,\n // they are made out of a `Combinator` (see combinator rule),\n // and an element name, such as a tag a class, or `*`.\n //\n element: function () {\n let e;\n let c;\n let v;\n const index = parserInput.i;\n\n c = this.combinator();\n\n e = parserInput.$re(/^(?:\\d+\\.\\d+|\\d+)%/) ||\n parserInput.$re(/^(?:[.#]?|:*)(?:[\\w-]|[^\\x00-\\x9f]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/) ||\n parserInput.$char('*') || parserInput.$char('&') || this.attribute() ||\n parserInput.$re(/^\\([^&()@]+\\)/) || parserInput.$re(/^[\\.#:](?=@)/) ||\n this.entities.variableCurly();\n\n if (!e) {\n parserInput.save();\n if (parserInput.$char('(')) {\n if ((v = this.selector(false)) && parserInput.$char(')')) {\n e = new(tree.Paren)(v);\n parserInput.forget();\n } else {\n parserInput.restore('Missing closing \\')\\'');\n }\n } else {\n parserInput.forget();\n }\n }\n\n if (e) { return new(tree.Element)(c, e, e instanceof tree.Variable, index, fileInfo); }\n },\n\n //\n // Combinators combine elements together, in a Selector.\n //\n // Because our parser isn't white-space sensitive, special care\n // has to be taken, when parsing the descendant combinator, ` `,\n // as it's an empty space. We have to check the previous character\n // in the input, to see if it's a ` ` character. More info on how\n // we deal with this in *combinator.js*.\n //\n combinator: function () {\n let c = parserInput.currentChar();\n\n if (c === '/') {\n parserInput.save();\n const slashedCombinator = parserInput.$re(/^\\/[a-z]+\\//i);\n if (slashedCombinator) {\n parserInput.forget();\n return new(tree.Combinator)(slashedCombinator);\n }\n parserInput.restore();\n }\n\n if (c === '>' || c === '+' || c === '~' || c === '|' || c === '^') {\n parserInput.i++;\n if (c === '^' && parserInput.currentChar() === '^') {\n c = '^^';\n parserInput.i++;\n }\n while (parserInput.isWhitespace()) { parserInput.i++; }\n return new(tree.Combinator)(c);\n } else if (parserInput.isWhitespace(-1)) {\n return new(tree.Combinator)(' ');\n } else {\n return new(tree.Combinator)(null);\n }\n },\n //\n // A CSS Selector\n // with less extensions e.g. the ability to extend and guard\n //\n // .class > div + h1\n // li a:hover\n //\n // Selectors are made out of one or more Elements, see above.\n //\n selector: function (isLess) {\n const index = parserInput.i;\n let elements;\n let extendList;\n let c;\n let e;\n let allExtends;\n let when;\n let condition;\n isLess = isLess !== false;\n while ((isLess && (extendList = this.extend())) || (isLess && (when = parserInput.$str('when'))) || (e = this.element())) {\n if (when) {\n condition = expect(this.conditions, 'expected condition');\n } else if (condition) {\n error('CSS guard can only be used at the end of selector');\n } else if (extendList) {\n if (allExtends) {\n allExtends = allExtends.concat(extendList);\n } else {\n allExtends = extendList;\n }\n } else {\n if (allExtends) { error('Extend can only be used at the end of selector'); }\n c = parserInput.currentChar();\n if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n e = null;\n }\n if (c === '{' || c === '}' || c === ';' || c === ',' || c === ')') {\n break;\n }\n }\n\n if (elements) { return new(tree.Selector)(elements, allExtends, condition, index, fileInfo); }\n if (allExtends) { error('Extend must be used to extend a selector, it cannot be used on its own'); }\n },\n selectors: function () {\n let s;\n let selectors;\n while (true) {\n s = this.selector();\n if (!s) {\n break;\n }\n if (selectors) {\n selectors.push(s);\n } else {\n selectors = [ s ];\n }\n parserInput.commentStore.length = 0;\n if (s.condition && selectors.length > 1) {\n error(\"Guards are only currently allowed on a single selector.\");\n }\n if (!parserInput.$char(',')) { break; }\n if (s.condition) {\n error(\"Guards are only currently allowed on a single selector.\");\n }\n parserInput.commentStore.length = 0;\n }\n return selectors;\n },\n attribute: function () {\n if (!parserInput.$char('[')) { return; }\n\n const entities = this.entities;\n let key;\n let val;\n let op;\n\n if (!(key = entities.variableCurly())) {\n key = expect(/^(?:[_A-Za-z0-9-\\*]*\\|)?(?:[_A-Za-z0-9-]|\\\\.)+/);\n }\n\n op = parserInput.$re(/^[|~*$^]?=/);\n if (op) {\n val = entities.quoted() || parserInput.$re(/^[0-9]+%/) || parserInput.$re(/^[\\w-]+/) || entities.variableCurly();\n }\n\n expectChar(']');\n\n return new(tree.Attribute)(key, op, val);\n },\n\n //\n // The `block` rule is used by `ruleset` and `mixin.definition`.\n // It's a wrapper around the `primary` rule, with added `{}`.\n //\n block: function () {\n let content;\n if (parserInput.$char('{') && (content = this.primary()) && parserInput.$char('}')) {\n return content;\n }\n },\n\n blockRuleset: function() {\n let block = this.block();\n\n if (block) {\n block = new tree.Ruleset(null, block);\n }\n return block;\n },\n\n detachedRuleset: function() {\n let argInfo;\n let params;\n let variadic;\n\n parserInput.save();\n if (parserInput.$re(/^[.#]\\(/)) {\n /**\n * DR args currently only implemented for each() function, and not \n * yet settable as `@dr: #(@arg) {}`\n * This should be done when DRs are merged with mixins.\n * See: https://github.com/less/less-meta/issues/16\n */\n argInfo = this.mixin.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n if (!parserInput.$char(')')) {\n parserInput.restore();\n return;\n }\n }\n const blockRuleset = this.blockRuleset();\n if (blockRuleset) {\n parserInput.forget();\n if (params) {\n return new tree.mixin.Definition(null, params, blockRuleset, null, variadic);\n }\n return new tree.DetachedRuleset(blockRuleset);\n }\n parserInput.restore();\n },\n\n //\n // div, .class, body > p {...}\n //\n ruleset: function () {\n let selectors;\n let rules;\n let debugInfo;\n\n parserInput.save();\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(parserInput.i);\n }\n\n selectors = this.selectors();\n\n if (selectors && (rules = this.block())) {\n parserInput.forget();\n const ruleset = new(tree.Ruleset)(selectors, rules, context.strictImports);\n if (context.dumpLineNumbers) {\n ruleset.debugInfo = debugInfo;\n }\n return ruleset;\n } else {\n parserInput.restore();\n }\n },\n declaration: function () {\n let name;\n let value;\n const index = parserInput.i;\n let hasDR;\n const c = parserInput.currentChar();\n let important;\n let merge;\n let isVariable;\n\n if (c === '.' || c === '#' || c === '&' || c === ':') { return; }\n\n parserInput.save();\n\n name = this.variable() || this.ruleProperty();\n if (name) {\n isVariable = typeof name === 'string';\n\n if (isVariable) {\n value = this.detachedRuleset();\n if (value) {\n hasDR = true;\n }\n }\n\n parserInput.commentStore.length = 0;\n if (!value) {\n // a name returned by this.ruleProperty() is always an array of the form:\n // [string-1, ..., string-n, \"\"] or [string-1, ..., string-n, \"+\"]\n // where each item is a tree.Keyword or tree.Variable\n merge = !isVariable && name.length > 1 && name.pop().value;\n\n // Custom property values get permissive parsing\n if (name[0].value && name[0].value.slice(0, 2) === '--') {\n value = this.permissiveValue();\n }\n // Try to store values as anonymous\n // If we need the value later we'll re-parse it in ruleset.parseValue\n else {\n value = this.anonymousValue();\n }\n if (value) {\n parserInput.forget();\n // anonymous values absorb the end ';' which is required for them to work\n return new(tree.Declaration)(name, value, false, merge, index, fileInfo);\n }\n\n if (!value) {\n value = this.value();\n }\n\n if (value) {\n important = this.important();\n } else if (isVariable) {\n // As a last resort, try permissiveValue\n value = this.permissiveValue();\n }\n }\n\n if (value && (this.end() || hasDR)) {\n parserInput.forget();\n return new(tree.Declaration)(name, value, important, merge, index, fileInfo);\n }\n else {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n }\n },\n anonymousValue: function () {\n const index = parserInput.i;\n const match = parserInput.$re(/^([^.#@\\$+\\/'\"*`(;{}-]*);/);\n if (match) {\n return new(tree.Anonymous)(match[1], index);\n }\n },\n /**\n * Used for custom properties, at-rules, and variables (as fallback)\n * Parses almost anything inside of {} [] () \"\" blocks\n * until it reaches outer-most tokens.\n * \n * First, it will try to parse comments and entities to reach\n * the end. This is mostly like the Expression parser except no\n * math is allowed.\n */\n permissiveValue: function (untilTokens) {\n let i;\n let e;\n let done;\n let value;\n const tok = untilTokens || ';';\n const index = parserInput.i;\n const result = [];\n\n function testCurrentChar() {\n const char = parserInput.currentChar();\n if (typeof tok === 'string') {\n return char === tok;\n } else {\n return tok.test(char);\n }\n }\n if (testCurrentChar()) {\n return;\n }\n value = [];\n do {\n e = this.comment();\n if (e) {\n value.push(e);\n continue;\n }\n e = this.entity();\n if (e) {\n value.push(e);\n }\n } while (e);\n\n done = testCurrentChar();\n\n if (value.length > 0) {\n value = new(tree.Expression)(value);\n if (done) {\n return value;\n }\n else {\n result.push(value);\n }\n // Preserve space before $parseUntil as it will not\n if (parserInput.prevChar() === ' ') {\n result.push(new tree.Anonymous(' ', index));\n }\n }\n parserInput.save();\n\n value = parserInput.$parseUntil(tok);\n\n if (value) {\n if (typeof value === 'string') {\n error(`Expected '${value}'`, 'Parse');\n }\n if (value.length === 1 && value[0] === ' ') {\n parserInput.forget();\n return new tree.Anonymous('', index);\n }\n let item;\n for (i = 0; i < value.length; i++) {\n item = value[i];\n if (Array.isArray(item)) {\n // Treat actual quotes as normal quoted values\n result.push(new tree.Quoted(item[0], item[1], true, index, fileInfo));\n }\n else {\n if (i === value.length - 1) {\n item = item.trim();\n }\n // Treat like quoted values, but replace vars like unquoted expressions\n const quote = new tree.Quoted('\\'', item, true, index, fileInfo);\n quote.variableRegex = /@([\\w-]+)/g;\n quote.propRegex = /\\$([\\w-]+)/g;\n result.push(quote);\n }\n }\n parserInput.forget();\n return new tree.Expression(result, true);\n }\n parserInput.restore();\n },\n\n //\n // An @import atrule\n //\n // @import \"lib\";\n //\n // Depending on our environment, importing is done differently:\n // In the browser, it's an XHR request, in Node, it would be a\n // file-system operation. The function used for importing is\n // stored in `import`, which we pass to the Import constructor.\n //\n 'import': function () {\n let path;\n let features;\n const index = parserInput.i;\n\n const dir = parserInput.$re(/^@import?\\s+/);\n\n if (dir) {\n const options = (dir ? this.importOptions() : null) || {};\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n features = this.mediaFeatures();\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon or unrecognised media features on import');\n }\n features = features && new(tree.Value)(features);\n return new(tree.Import)(path, features, options, index, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed import statement');\n }\n }\n },\n\n importOptions: function() {\n let o;\n const options = {};\n let optionName;\n let value;\n\n // list of options, surrounded by parens\n if (!parserInput.$char('(')) { return null; }\n do {\n o = this.importOption();\n if (o) {\n optionName = o;\n value = true;\n switch (optionName) {\n case 'css':\n optionName = 'less';\n value = false;\n break;\n case 'once':\n optionName = 'multiple';\n value = false;\n break;\n }\n options[optionName] = value;\n if (!parserInput.$char(',')) { break; }\n }\n } while (o);\n expectChar(')');\n return options;\n },\n\n importOption: function() {\n const opt = parserInput.$re(/^(less|css|multiple|once|inline|reference|optional)/);\n if (opt) {\n return opt[1];\n }\n },\n\n mediaFeature: function () {\n const entities = this.entities;\n const nodes = [];\n let e;\n let p;\n parserInput.save();\n do {\n e = entities.keyword() || entities.variable() || entities.mixinLookup();\n if (e) {\n nodes.push(e);\n } else if (parserInput.$char('(')) {\n p = this.property();\n e = this.value();\n if (parserInput.$char(')')) {\n if (p && e) {\n nodes.push(new(tree.Paren)(new(tree.Declaration)(p, e, null, null, parserInput.i, fileInfo, true)));\n } else if (e) {\n nodes.push(new(tree.Paren)(e));\n } else {\n error('badly formed media feature definition');\n }\n } else {\n error('Missing closing \\')\\'', 'Parse');\n }\n }\n } while (e);\n\n parserInput.forget();\n if (nodes.length > 0) {\n return new(tree.Expression)(nodes);\n }\n },\n\n mediaFeatures: function () {\n const entities = this.entities;\n const features = [];\n let e;\n do {\n e = this.mediaFeature();\n if (e) {\n features.push(e);\n if (!parserInput.$char(',')) { break; }\n } else {\n e = entities.variable() || entities.mixinLookup();\n if (e) {\n features.push(e);\n if (!parserInput.$char(',')) { break; }\n }\n }\n } while (e);\n\n return features.length > 0 ? features : null;\n },\n\n media: function () {\n let features;\n let rules;\n let media;\n let debugInfo;\n const index = parserInput.i;\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(index);\n }\n\n parserInput.save();\n\n if (parserInput.$str('@media')) {\n features = this.mediaFeatures();\n\n rules = this.block();\n\n if (!rules) {\n error('media definitions require block statements after any features');\n }\n\n parserInput.forget();\n\n media = new(tree.Media)(rules, features, index, fileInfo);\n if (context.dumpLineNumbers) {\n media.debugInfo = debugInfo;\n }\n\n return media;\n }\n\n parserInput.restore();\n },\n\n //\n\n // A @plugin directive, used to import plugins dynamically.\n //\n // @plugin (args) \"lib\";\n //\n plugin: function () {\n let path;\n let args;\n let options;\n const index = parserInput.i;\n const dir = parserInput.$re(/^@plugin?\\s+/);\n\n if (dir) {\n args = this.pluginArgs();\n\n if (args) {\n options = {\n pluginArgs: args,\n isPlugin: true\n };\n }\n else {\n options = { isPlugin: true };\n }\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon on @plugin');\n }\n return new(tree.Import)(path, null, options, index, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed @plugin statement');\n }\n }\n },\n\n pluginArgs: function() {\n // list of options, surrounded by parens\n parserInput.save();\n if (!parserInput.$char('(')) {\n parserInput.restore();\n return null;\n }\n const args = parserInput.$re(/^\\s*([^\\);]+)\\)\\s*/);\n if (args[1]) {\n parserInput.forget();\n return args[1].trim();\n }\n else { \n parserInput.restore();\n return null;\n }\n },\n\n //\n // A CSS AtRule\n //\n // @charset \"utf-8\";\n //\n atrule: function () {\n const index = parserInput.i;\n let name;\n let value;\n let rules;\n let nonVendorSpecificName;\n let hasIdentifier;\n let hasExpression;\n let hasUnknown;\n let hasBlock = true;\n let isRooted = true;\n\n if (parserInput.currentChar() !== '@') { return; }\n\n value = this['import']() || this.plugin() || this.media();\n if (value) {\n return value;\n }\n\n parserInput.save();\n\n name = parserInput.$re(/^@[a-z-]+/);\n\n if (!name) { return; }\n\n nonVendorSpecificName = name;\n if (name.charAt(1) == '-' && name.indexOf('-', 2) > 0) {\n nonVendorSpecificName = `@${name.slice(name.indexOf('-', 2) + 1)}`;\n }\n\n switch (nonVendorSpecificName) {\n case '@charset':\n hasIdentifier = true;\n hasBlock = false;\n break;\n case '@namespace':\n hasExpression = true;\n hasBlock = false;\n break;\n case '@keyframes':\n case '@counter-style':\n hasIdentifier = true;\n break;\n case '@document':\n case '@supports':\n hasUnknown = true;\n isRooted = false;\n break;\n default:\n hasUnknown = true;\n break;\n }\n\n parserInput.commentStore.length = 0;\n\n if (hasIdentifier) {\n value = this.entity();\n if (!value) {\n error(`expected ${name} identifier`);\n }\n } else if (hasExpression) {\n value = this.expression();\n if (!value) {\n error(`expected ${name} expression`);\n }\n } else if (hasUnknown) {\n value = this.permissiveValue(/^[{;]/);\n hasBlock = (parserInput.currentChar() === '{');\n if (!value) {\n if (!hasBlock && parserInput.currentChar() !== ';') {\n error(`${name} rule is missing block or ending semi-colon`);\n }\n }\n else if (!value.value) {\n value = null;\n }\n }\n\n if (hasBlock) {\n rules = this.blockRuleset();\n }\n\n if (rules || (!hasBlock && value && parserInput.$char(';'))) {\n parserInput.forget();\n return new(tree.AtRule)(name, value, rules, index, fileInfo,\n context.dumpLineNumbers ? getDebugInfo(index) : null,\n isRooted\n );\n }\n\n parserInput.restore('at-rule options not recognised');\n },\n\n //\n // A Value is a comma-delimited list of Expressions\n //\n // font-family: Baskerville, Georgia, serif;\n //\n // In a Rule, a Value represents everything after the `:`,\n // and before the `;`.\n //\n value: function () {\n let e;\n const expressions = [];\n const index = parserInput.i;\n\n do {\n e = this.expression();\n if (e) {\n expressions.push(e);\n if (!parserInput.$char(',')) { break; }\n }\n } while (e);\n\n if (expressions.length > 0) {\n return new(tree.Value)(expressions, index);\n }\n },\n important: function () {\n if (parserInput.currentChar() === '!') {\n return parserInput.$re(/^! *important/);\n }\n },\n sub: function () {\n let a;\n let e;\n\n parserInput.save();\n if (parserInput.$char('(')) {\n a = this.addition();\n if (a && parserInput.$char(')')) {\n parserInput.forget();\n e = new(tree.Expression)([a]);\n e.parens = true;\n return e;\n }\n parserInput.restore('Expected \\')\\'');\n return;\n }\n parserInput.restore();\n },\n multiplication: function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.operand();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1);\n while (true) {\n if (parserInput.peek(/^\\/[*\\/]/)) {\n break;\n }\n\n parserInput.save();\n\n op = parserInput.$char('/') || parserInput.$char('*') || parserInput.$str('./');\n\n if (!op) { parserInput.forget(); break; }\n\n a = this.operand();\n\n if (!a) { parserInput.restore(); break; }\n parserInput.forget();\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n isSpaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n addition: function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.multiplication();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1);\n while (true) {\n op = parserInput.$re(/^[-+]\\s+/) || (!isSpaced && (parserInput.$char('+') || parserInput.$char('-')));\n if (!op) {\n break;\n }\n a = this.multiplication();\n if (!a) {\n break;\n }\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n isSpaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n conditions: function () {\n let a;\n let b;\n const index = parserInput.i;\n let condition;\n\n a = this.condition(true);\n if (a) {\n while (true) {\n if (!parserInput.peek(/^,\\s*(not\\s*)?\\(/) || !parserInput.$char(',')) {\n break;\n }\n b = this.condition(true);\n if (!b) {\n break;\n }\n condition = new(tree.Condition)('or', condition || a, b, index);\n }\n return condition || a;\n }\n },\n condition: function (needsParens) {\n let result;\n let logical;\n let next;\n function or() {\n return parserInput.$str('or');\n }\n\n result = this.conditionAnd(needsParens);\n if (!result) {\n return ;\n }\n logical = or();\n if (logical) {\n next = this.condition(needsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n }\n }\n return result;\n },\n conditionAnd: function (needsParens) {\n let result;\n let logical;\n let next;\n const self = this;\n function insideCondition() {\n const cond = self.negatedCondition(needsParens) || self.parenthesisCondition(needsParens);\n if (!cond && !needsParens) {\n return self.atomicCondition(needsParens);\n }\n return cond;\n }\n function and() {\n return parserInput.$str('and');\n }\n\n result = insideCondition();\n if (!result) {\n return ;\n }\n logical = and();\n if (logical) {\n next = this.conditionAnd(needsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n }\n }\n return result;\n },\n negatedCondition: function (needsParens) {\n if (parserInput.$str('not')) {\n const result = this.parenthesisCondition(needsParens);\n if (result) {\n result.negate = !result.negate;\n }\n return result;\n }\n },\n parenthesisCondition: function (needsParens) {\n function tryConditionFollowedByParenthesis(me) {\n let body;\n parserInput.save();\n body = me.condition(needsParens);\n if (!body) {\n parserInput.restore();\n return ;\n }\n if (!parserInput.$char(')')) {\n parserInput.restore();\n return ;\n }\n parserInput.forget();\n return body;\n }\n\n let body;\n parserInput.save();\n if (!parserInput.$str('(')) {\n parserInput.restore();\n return ;\n }\n body = tryConditionFollowedByParenthesis(this);\n if (body) {\n parserInput.forget();\n return body;\n }\n\n body = this.atomicCondition(needsParens);\n if (!body) {\n parserInput.restore();\n return ;\n }\n if (!parserInput.$char(')')) {\n parserInput.restore(`expected ')' got '${parserInput.currentChar()}'`);\n return ;\n }\n parserInput.forget();\n return body;\n },\n atomicCondition: function (needsParens) {\n const entities = this.entities;\n const index = parserInput.i;\n let a;\n let b;\n let c;\n let op;\n\n function cond() {\n return this.addition() || entities.keyword() || entities.quoted() || entities.mixinLookup();\n }\n cond = cond.bind(this);\n\n a = cond();\n if (a) {\n if (parserInput.$char('>')) {\n if (parserInput.$char('=')) {\n op = '>=';\n } else {\n op = '>';\n }\n } else\n if (parserInput.$char('<')) {\n if (parserInput.$char('=')) {\n op = '<=';\n } else {\n op = '<';\n }\n } else\n if (parserInput.$char('=')) {\n if (parserInput.$char('>')) {\n op = '=>';\n } else if (parserInput.$char('<')) {\n op = '=<';\n } else {\n op = '=';\n }\n }\n if (op) {\n b = cond();\n if (b) {\n c = new(tree.Condition)(op, a, b, index, false);\n } else {\n error('expected expression');\n }\n } else {\n c = new(tree.Condition)('=', a, new(tree.Keyword)('true'), index, false);\n }\n return c;\n }\n },\n\n //\n // An operand is anything that can be part of an operation,\n // such as a Color, or a Variable\n //\n operand: function () {\n const entities = this.entities;\n let negate;\n\n if (parserInput.peek(/^-[@\\$\\(]/)) {\n negate = parserInput.$char('-');\n }\n\n let o = this.sub() || entities.dimension() ||\n entities.color() || entities.variable() ||\n entities.property() || entities.call() ||\n entities.quoted(true) || entities.colorKeyword() ||\n entities.mixinLookup();\n\n if (negate) {\n o.parensInOp = true;\n o = new(tree.Negative)(o);\n }\n\n return o;\n },\n\n //\n // Expressions either represent mathematical operations,\n // or white-space delimited Entities.\n //\n // 1px solid black\n // @var * 2\n //\n expression: function () {\n const entities = [];\n let e;\n let delim;\n const index = parserInput.i;\n\n do {\n e = this.comment();\n if (e) {\n entities.push(e);\n continue;\n }\n e = this.addition() || this.entity();\n\n if (e instanceof tree.Comment) {\n e = null;\n }\n\n if (e) {\n entities.push(e);\n // operations do not allow keyword \"/\" dimension (e.g. small/20px) so we support that here\n if (!parserInput.peek(/^\\/[\\/*]/)) {\n delim = parserInput.$char('/');\n if (delim) {\n entities.push(new(tree.Anonymous)(delim, index));\n }\n }\n }\n } while (e);\n if (entities.length > 0) {\n return new(tree.Expression)(entities);\n }\n },\n property: function () {\n const name = parserInput.$re(/^(\\*?-?[_a-zA-Z0-9-]+)\\s*:/);\n if (name) {\n return name[1];\n }\n },\n ruleProperty: function () {\n let name = [];\n const index = [];\n let s;\n let k;\n\n parserInput.save();\n\n const simpleProperty = parserInput.$re(/^([_a-zA-Z0-9-]+)\\s*:/);\n if (simpleProperty) {\n name = [new(tree.Keyword)(simpleProperty[1])];\n parserInput.forget();\n return name;\n }\n\n function match(re) {\n const i = parserInput.i;\n const chunk = parserInput.$re(re);\n if (chunk) {\n index.push(i);\n return name.push(chunk[1]);\n }\n }\n\n match(/^(\\*?)/);\n while (true) {\n if (!match(/^((?:[\\w-]+)|(?:[@\\$]\\{[\\w-]+\\}))/)) {\n break;\n }\n }\n\n if ((name.length > 1) && match(/^((?:\\+_|\\+)?)\\s*:/)) {\n parserInput.forget();\n\n // at last, we have the complete match now. move forward,\n // convert name particles to tree objects and return:\n if (name[0] === '') {\n name.shift();\n index.shift();\n }\n for (k = 0; k < name.length; k++) {\n s = name[k];\n name[k] = (s.charAt(0) !== '@' && s.charAt(0) !== '$') ?\n new(tree.Keyword)(s) :\n (s.charAt(0) === '@' ?\n new(tree.Variable)(`@${s.slice(2, -1)}`, index[k], fileInfo) :\n new(tree.Property)(`$${s.slice(2, -1)}`, index[k], fileInfo));\n }\n return name;\n }\n parserInput.restore();\n }\n }\n };\n};\nParser.serializeVars = vars => {\n let s = '';\n\n for (const name in vars) {\n if (Object.hasOwnProperty.call(vars, name)) {\n const value = vars[name];\n s += `${((name[0] === '@') ? '' : '@') + name}: ${value}${(String(value).slice(-1) === ';') ? '' : ';'}`;\n }\n }\n\n return s;\n};\n\nexport default Parser;\n","import Anonymous from '../tree/anonymous';\nimport Keyword from '../tree/keyword';\n\nfunction boolean(condition) {\n return condition ? Keyword.True : Keyword.False;\n}\n\n/**\n * Functions with evalArgs set to false are sent context\n * as the first argument.\n */\nfunction If(context, condition, trueValue, falseValue) {\n return condition.eval(context) ? trueValue.eval(context)\n : (falseValue ? falseValue.eval(context) : new Anonymous);\n}\nIf.evalArgs = false\n\nexport default { boolean, 'if': If };\n","import Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport Expression from '../tree/expression';\nimport Operation from '../tree/operation';\nlet colorFunctions;\n\nfunction clamp(val) {\n return Math.min(1, Math.max(0, val));\n}\nfunction hsla(origColor, hsl) {\n const color = colorFunctions.hsla(hsl.h, hsl.s, hsl.l, hsl.a);\n if (color) {\n if (origColor.value && \n /^(rgb|hsl)/.test(origColor.value)) {\n color.value = origColor.value;\n } else {\n color.value = 'rgb';\n }\n return color;\n }\n}\nfunction toHSL(color) {\n if (color.toHSL) {\n return color.toHSL();\n } else {\n throw new Error('Argument cannot be evaluated to a color');\n }\n}\n\nfunction toHSV(color) {\n if (color.toHSV) {\n return color.toHSV();\n } else {\n throw new Error('Argument cannot be evaluated to a color');\n }\n}\n\nfunction number(n) {\n if (n instanceof Dimension) {\n return parseFloat(n.unit.is('%') ? n.value / 100 : n.value);\n } else if (typeof n === 'number') {\n return n;\n } else {\n throw {\n type: 'Argument',\n message: 'color functions take numbers as parameters'\n };\n }\n}\nfunction scaled(n, size) {\n if (n instanceof Dimension && n.unit.is('%')) {\n return parseFloat(n.value * size / 100);\n } else {\n return number(n);\n }\n}\ncolorFunctions = {\n rgb: function (r, g, b) {\n let a = 1\n /**\n * Comma-less syntax\n * e.g. rgb(0 128 255 / 50%)\n */\n if (r instanceof Expression) {\n const val = r.value\n r = val[0]\n g = val[1]\n b = val[2]\n /** \n * @todo - should this be normalized in\n * function caller? Or parsed differently?\n */\n if (b instanceof Operation) {\n const op = b\n b = op.operands[0]\n a = op.operands[1]\n }\n }\n const color = colorFunctions.rgba(r, g, b, a);\n if (color) {\n color.value = 'rgb';\n return color;\n }\n },\n rgba: function (r, g, b, a) {\n try {\n if (r instanceof Color) {\n if (g) {\n a = number(g);\n } else {\n a = r.alpha;\n }\n return new Color(r.rgb, a, 'rgba');\n }\n const rgb = [r, g, b].map(c => scaled(c, 255));\n a = number(a);\n return new Color(rgb, a, 'rgba');\n }\n catch (e) {}\n },\n hsl: function (h, s, l) {\n let a = 1\n if (h instanceof Expression) {\n const val = h.value\n h = val[0]\n s = val[1]\n l = val[2]\n\n if (l instanceof Operation) {\n const op = l\n l = op.operands[0]\n a = op.operands[1]\n }\n }\n const color = colorFunctions.hsla(h, s, l, a);\n if (color) {\n color.value = 'hsl';\n return color;\n }\n },\n hsla: function (h, s, l, a) {\n try {\n if (h instanceof Color) {\n if (s) {\n a = number(s);\n } else {\n a = h.alpha;\n }\n return new Color(h.rgb, a, 'hsla');\n }\n\n let m1;\n let m2;\n\n function hue(h) {\n h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h);\n if (h * 6 < 1) {\n return m1 + (m2 - m1) * h * 6;\n }\n else if (h * 2 < 1) {\n return m2;\n }\n else if (h * 3 < 2) {\n return m1 + (m2 - m1) * (2 / 3 - h) * 6;\n }\n else {\n return m1;\n }\n }\n\n h = (number(h) % 360) / 360;\n s = clamp(number(s));l = clamp(number(l));a = clamp(number(a));\n\n m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n m1 = l * 2 - m2;\n\n const rgb = [\n hue(h + 1 / 3) * 255,\n hue(h) * 255,\n hue(h - 1 / 3) * 255\n ];\n a = number(a);\n return new Color(rgb, a, 'hsla');\n }\n catch (e) {}\n },\n\n hsv: function(h, s, v) {\n return colorFunctions.hsva(h, s, v, 1.0);\n },\n\n hsva: function(h, s, v, a) {\n h = ((number(h) % 360) / 360) * 360;\n s = number(s);v = number(v);a = number(a);\n\n let i;\n let f;\n i = Math.floor((h / 60) % 6);\n f = (h / 60) - i;\n\n const vs = [v,\n v * (1 - s),\n v * (1 - f * s),\n v * (1 - (1 - f) * s)];\n const perm = [[0, 3, 1],\n [2, 0, 1],\n [1, 0, 3],\n [1, 2, 0],\n [3, 1, 0],\n [0, 1, 2]];\n\n return colorFunctions.rgba(vs[perm[i][0]] * 255,\n vs[perm[i][1]] * 255,\n vs[perm[i][2]] * 255,\n a);\n },\n\n hue: function (color) {\n return new Dimension(toHSL(color).h);\n },\n saturation: function (color) {\n return new Dimension(toHSL(color).s * 100, '%');\n },\n lightness: function (color) {\n return new Dimension(toHSL(color).l * 100, '%');\n },\n hsvhue: function(color) {\n return new Dimension(toHSV(color).h);\n },\n hsvsaturation: function (color) {\n return new Dimension(toHSV(color).s * 100, '%');\n },\n hsvvalue: function (color) {\n return new Dimension(toHSV(color).v * 100, '%');\n },\n red: function (color) {\n return new Dimension(color.rgb[0]);\n },\n green: function (color) {\n return new Dimension(color.rgb[1]);\n },\n blue: function (color) {\n return new Dimension(color.rgb[2]);\n },\n alpha: function (color) {\n return new Dimension(toHSL(color).a);\n },\n luma: function (color) {\n return new Dimension(color.luma() * color.alpha * 100, '%');\n },\n luminance: function (color) {\n const luminance =\n (0.2126 * color.rgb[0] / 255) +\n (0.7152 * color.rgb[1] / 255) +\n (0.0722 * color.rgb[2] / 255);\n\n return new Dimension(luminance * color.alpha * 100, '%');\n },\n saturate: function (color, amount, method) {\n // filter: saturate(3.2);\n // should be kept as is, so check for color\n if (!color.rgb) {\n return null;\n }\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.s += hsl.s * amount.value / 100;\n }\n else {\n hsl.s += amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n return hsla(color, hsl);\n },\n desaturate: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.s -= hsl.s * amount.value / 100;\n }\n else {\n hsl.s -= amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n return hsla(color, hsl);\n },\n lighten: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.l += hsl.l * amount.value / 100;\n }\n else {\n hsl.l += amount.value / 100;\n }\n hsl.l = clamp(hsl.l);\n return hsla(color, hsl);\n },\n darken: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.l -= hsl.l * amount.value / 100;\n }\n else {\n hsl.l -= amount.value / 100;\n }\n hsl.l = clamp(hsl.l);\n return hsla(color, hsl);\n },\n fadein: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.a += hsl.a * amount.value / 100;\n }\n else {\n hsl.a += amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fadeout: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.a -= hsl.a * amount.value / 100;\n }\n else {\n hsl.a -= amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fade: function (color, amount) {\n const hsl = toHSL(color);\n\n hsl.a = amount.value / 100;\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n spin: function (color, amount) {\n const hsl = toHSL(color);\n const hue = (hsl.h + amount.value) % 360;\n\n hsl.h = hue < 0 ? 360 + hue : hue;\n\n return hsla(color, hsl);\n },\n //\n // Copyright (c) 2006-2009 Hampton Catlin, Natalie Weizenbaum, and Chris Eppstein\n // http://sass-lang.com\n //\n mix: function (color1, color2, weight) {\n if (!weight) {\n weight = new Dimension(50);\n }\n const p = weight.value / 100.0;\n const w = p * 2 - 1;\n const a = toHSL(color1).a - toHSL(color2).a;\n\n const w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n const w2 = 1 - w1;\n\n const rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2,\n color1.rgb[1] * w1 + color2.rgb[1] * w2,\n color1.rgb[2] * w1 + color2.rgb[2] * w2];\n\n const alpha = color1.alpha * p + color2.alpha * (1 - p);\n\n return new Color(rgb, alpha);\n },\n greyscale: function (color) {\n return colorFunctions.desaturate(color, new Dimension(100));\n },\n contrast: function (color, dark, light, threshold) {\n // filter: contrast(3.2);\n // should be kept as is, so check for color\n if (!color.rgb) {\n return null;\n }\n if (typeof light === 'undefined') {\n light = colorFunctions.rgba(255, 255, 255, 1.0);\n }\n if (typeof dark === 'undefined') {\n dark = colorFunctions.rgba(0, 0, 0, 1.0);\n }\n // Figure out which is actually light and dark:\n if (dark.luma() > light.luma()) {\n const t = light;\n light = dark;\n dark = t;\n }\n if (typeof threshold === 'undefined') {\n threshold = 0.43;\n } else {\n threshold = number(threshold);\n }\n if (color.luma() < threshold) {\n return light;\n } else {\n return dark;\n }\n },\n // Changes made in 2.7.0 - Reverted in 3.0.0\n // contrast: function (color, color1, color2, threshold) {\n // // Return which of `color1` and `color2` has the greatest contrast with `color`\n // // according to the standard WCAG contrast ratio calculation.\n // // http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n // // The threshold param is no longer used, in line with SASS.\n // // filter: contrast(3.2);\n // // should be kept as is, so check for color\n // if (!color.rgb) {\n // return null;\n // }\n // if (typeof color1 === 'undefined') {\n // color1 = colorFunctions.rgba(0, 0, 0, 1.0);\n // }\n // if (typeof color2 === 'undefined') {\n // color2 = colorFunctions.rgba(255, 255, 255, 1.0);\n // }\n // var contrast1, contrast2;\n // var luma = color.luma();\n // var luma1 = color1.luma();\n // var luma2 = color2.luma();\n // // Calculate contrast ratios for each color\n // if (luma > luma1) {\n // contrast1 = (luma + 0.05) / (luma1 + 0.05);\n // } else {\n // contrast1 = (luma1 + 0.05) / (luma + 0.05);\n // }\n // if (luma > luma2) {\n // contrast2 = (luma + 0.05) / (luma2 + 0.05);\n // } else {\n // contrast2 = (luma2 + 0.05) / (luma + 0.05);\n // }\n // if (contrast1 > contrast2) {\n // return color1;\n // } else {\n // return color2;\n // }\n // },\n argb: function (color) {\n return new Anonymous(color.toARGB());\n },\n color: function(c) {\n if ((c instanceof Quoted) &&\n (/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})$/i.test(c.value))) {\n const val = c.value.slice(1);\n return new Color(val, undefined, `#${val}`);\n }\n if ((c instanceof Color) || (c = Color.fromKeyword(c.value))) {\n c.value = undefined;\n return c;\n }\n throw {\n type: 'Argument',\n message: 'argument must be a color keyword or 3|4|6|8 digit hex e.g. #FFF'\n };\n },\n tint: function(color, amount) {\n return colorFunctions.mix(colorFunctions.rgb(255, 255, 255), color, amount);\n },\n shade: function(color, amount) {\n return colorFunctions.mix(colorFunctions.rgb(0, 0, 0), color, amount);\n }\n};\n\nexport default colorFunctions;\n","import Color from '../tree/color';\n\n// Color Blending\n// ref: http://www.w3.org/TR/compositing-1\n\nfunction colorBlend(mode, color1, color2) {\n const ab = color1.alpha; // result\n\n let // backdrop\n cb;\n\n const as = color2.alpha;\n\n let // source\n cs;\n\n let ar;\n let cr;\n const r = [];\n\n ar = as + ab * (1 - as);\n for (let i = 0; i < 3; i++) {\n cb = color1.rgb[i] / 255;\n cs = color2.rgb[i] / 255;\n cr = mode(cb, cs);\n if (ar) {\n cr = (as * cs + ab * (cb -\n as * (cb + cs - cr))) / ar;\n }\n r[i] = cr * 255;\n }\n\n return new Color(r, ar);\n}\n\nconst colorBlendModeFunctions = {\n multiply: function(cb, cs) {\n return cb * cs;\n },\n screen: function(cb, cs) {\n return cb + cs - cb * cs;\n },\n overlay: function(cb, cs) {\n cb *= 2;\n return (cb <= 1) ?\n colorBlendModeFunctions.multiply(cb, cs) :\n colorBlendModeFunctions.screen(cb - 1, cs);\n },\n softlight: function(cb, cs) {\n let d = 1;\n let e = cb;\n if (cs > 0.5) {\n e = 1;\n d = (cb > 0.25) ? Math.sqrt(cb)\n : ((16 * cb - 12) * cb + 4) * cb;\n }\n return cb - (1 - 2 * cs) * e * (d - cb);\n },\n hardlight: function(cb, cs) {\n return colorBlendModeFunctions.overlay(cs, cb);\n },\n difference: function(cb, cs) {\n return Math.abs(cb - cs);\n },\n exclusion: function(cb, cs) {\n return cb + cs - 2 * cb * cs;\n },\n\n // non-w3c functions:\n average: function(cb, cs) {\n return (cb + cs) / 2;\n },\n negation: function(cb, cs) {\n return 1 - Math.abs(cb + cs - 1);\n }\n};\n\nfor (const f in colorBlendModeFunctions) {\n if (colorBlendModeFunctions.hasOwnProperty(f)) {\n colorBlend[f] = colorBlend.bind(null, colorBlendModeFunctions[f]);\n }\n}\n\nexport default colorBlend;\n","import Comment from '../tree/comment';\nimport Node from '../tree/node';\nimport Dimension from '../tree/dimension';\nimport Declaration from '../tree/declaration';\nimport Expression from '../tree/expression';\nimport Ruleset from '../tree/ruleset';\nimport Selector from '../tree/selector';\nimport Element from '../tree/element';\nimport Quote from '../tree/quoted';\nimport Value from '../tree/value';\n\nconst getItemsFromNode = node => {\n // handle non-array values as an array of length 1\n // return 'undefined' if index is invalid\n const items = Array.isArray(node.value) ?\n node.value : Array(node);\n\n return items;\n};\n\nexport default {\n _SELF: function(n) {\n return n;\n },\n '~': function(...expr) {\n if (expr.length === 1) {\n return expr[0];\n }\n return new Value(expr);\n },\n extract: function(values, index) {\n // (1-based index)\n index = index.value - 1;\n\n return getItemsFromNode(values)[index];\n },\n length: function(values) {\n return new Dimension(getItemsFromNode(values).length);\n },\n /**\n * Creates a Less list of incremental values.\n * Modeled after Lodash's range function, also exists natively in PHP\n * \n * @param {Dimension} [start=1]\n * @param {Dimension} end - e.g. 10 or 10px - unit is added to output\n * @param {Dimension} [step=1] \n */\n range: function(start, end, step) {\n let from;\n let to;\n let stepValue = 1;\n const list = [];\n if (end) {\n to = end;\n from = start.value;\n if (step) {\n stepValue = step.value;\n }\n }\n else {\n from = 1;\n to = start;\n }\n\n for (let i = from; i <= to.value; i += stepValue) {\n list.push(new Dimension(i, to.unit));\n }\n\n return new Expression(list);\n },\n each: function(list, rs) {\n const rules = [];\n let newRules;\n let iterator;\n\n const tryEval = val => {\n if (val instanceof Node) {\n return val.eval(this.context);\n }\n return val;\n };\n\n if (list.value && !(list instanceof Quote)) {\n if (Array.isArray(list.value)) {\n iterator = list.value.map(tryEval);\n } else {\n iterator = [tryEval(list.value)];\n }\n } else if (list.ruleset) {\n iterator = tryEval(list.ruleset).rules;\n } else if (list.rules) {\n iterator = list.rules.map(tryEval);\n } else if (Array.isArray(list)) {\n iterator = list.map(tryEval);\n } else {\n iterator = [tryEval(list)];\n }\n\n let valueName = '@value';\n let keyName = '@key';\n let indexName = '@index';\n\n if (rs.params) {\n valueName = rs.params[0] && rs.params[0].name;\n keyName = rs.params[1] && rs.params[1].name;\n indexName = rs.params[2] && rs.params[2].name;\n rs = rs.rules;\n } else {\n rs = rs.ruleset;\n }\n\n for (let i = 0; i < iterator.length; i++) {\n let key;\n let value;\n const item = iterator[i];\n if (item instanceof Declaration) {\n key = typeof item.name === 'string' ? item.name : item.name[0].value;\n value = item.value;\n } else {\n key = new Dimension(i + 1);\n value = item;\n }\n\n if (item instanceof Comment) {\n continue;\n }\n\n newRules = rs.rules.slice(0);\n if (valueName) {\n newRules.push(new Declaration(valueName,\n value,\n false, false, this.index, this.currentFileInfo));\n }\n if (indexName) {\n newRules.push(new Declaration(indexName,\n new Dimension(i + 1),\n false, false, this.index, this.currentFileInfo));\n }\n if (keyName) {\n newRules.push(new Declaration(keyName,\n key,\n false, false, this.index, this.currentFileInfo));\n }\n\n rules.push(new Ruleset([ new(Selector)([ new Element(\"\", '&') ]) ],\n newRules,\n rs.strictImports,\n rs.visibilityInfo()\n ));\n }\n\n return new Ruleset([ new(Selector)([ new Element(\"\", '&') ]) ],\n rules,\n rs.strictImports,\n rs.visibilityInfo()\n ).eval(this.context);\n }\n};\n","import Dimension from '../tree/dimension';\n\nconst MathHelper = (fn, unit, n) => {\n if (!(n instanceof Dimension)) {\n throw { type: 'Argument', message: 'argument must be a number' };\n }\n if (unit == null) {\n unit = n.unit;\n } else {\n n = n.unify();\n }\n return new Dimension(fn(parseFloat(n.value)), unit);\n};\n\nexport default MathHelper;","import mathHelper from './math-helper.js';\n\nconst mathFunctions = {\n // name, unit\n ceil: null,\n floor: null,\n sqrt: null,\n abs: null,\n tan: '',\n sin: '',\n cos: '',\n atan: 'rad',\n asin: 'rad',\n acos: 'rad'\n};\n\nfor (const f in mathFunctions) {\n if (mathFunctions.hasOwnProperty(f)) {\n mathFunctions[f] = mathHelper.bind(null, Math[f], mathFunctions[f]);\n }\n}\n\nmathFunctions.round = (n, f) => {\n const fraction = typeof f === 'undefined' ? 0 : f.value;\n return mathHelper(num => num.toFixed(fraction), null, n);\n};\n\nexport default mathFunctions;\n","import Dimension from '../tree/dimension';\nimport Anonymous from '../tree/anonymous';\nimport mathHelper from './math-helper.js';\n\nconst minMax = function (isMin, args) {\n args = Array.prototype.slice.call(args);\n switch (args.length) {\n case 0: throw { type: 'Argument', message: 'one or more arguments required' };\n }\n let i; // key is the unit.toString() for unified Dimension values,\n let j;\n let current;\n let currentUnified;\n let referenceUnified;\n let unit;\n let unitStatic;\n let unitClone;\n\n const // elems only contains original argument values.\n order = [];\n\n const values = {};\n // value is the index into the order array.\n for (i = 0; i < args.length; i++) {\n current = args[i];\n if (!(current instanceof Dimension)) {\n if (Array.isArray(args[i].value)) {\n Array.prototype.push.apply(args, Array.prototype.slice.call(args[i].value));\n }\n continue;\n }\n currentUnified = current.unit.toString() === '' && unitClone !== undefined ? new Dimension(current.value, unitClone).unify() : current.unify();\n unit = currentUnified.unit.toString() === '' && unitStatic !== undefined ? unitStatic : currentUnified.unit.toString();\n unitStatic = unit !== '' && unitStatic === undefined || unit !== '' && order[0].unify().unit.toString() === '' ? unit : unitStatic;\n unitClone = unit !== '' && unitClone === undefined ? current.unit.toString() : unitClone;\n j = values[''] !== undefined && unit !== '' && unit === unitStatic ? values[''] : values[unit];\n if (j === undefined) {\n if (unitStatic !== undefined && unit !== unitStatic) {\n throw { type: 'Argument', message: 'incompatible types' };\n }\n values[unit] = order.length;\n order.push(current);\n continue;\n }\n referenceUnified = order[j].unit.toString() === '' && unitClone !== undefined ? new Dimension(order[j].value, unitClone).unify() : order[j].unify();\n if ( isMin && currentUnified.value < referenceUnified.value ||\n !isMin && currentUnified.value > referenceUnified.value) {\n order[j] = current;\n }\n }\n if (order.length == 1) {\n return order[0];\n }\n args = order.map(function (a) { return a.toCSS(this.context); }).join(this.context.compress ? ',' : ', ');\n return new Anonymous(`${isMin ? 'min' : 'max'}(${args})`);\n};\n\nexport default {\n min: function(...args) {\n try {\n return minMax(true, args);\n } catch (e) {}\n },\n max: function(...args) {\n try {\n return minMax(false, args);\n } catch (e) {}\n },\n convert: function (val, unit) {\n return val.convertTo(unit.value);\n },\n pi: function () {\n return new Dimension(Math.PI);\n },\n mod: function(a, b) {\n return new Dimension(a.value % b.value, a.unit);\n },\n pow: function(x, y) {\n if (typeof x === 'number' && typeof y === 'number') {\n x = new Dimension(x);\n y = new Dimension(y);\n } else if (!(x instanceof Dimension) || !(y instanceof Dimension)) {\n throw { type: 'Argument', message: 'arguments must be numbers' };\n }\n\n return new Dimension(Math.pow(x.value, y.value), x.unit);\n },\n percentage: function (n) {\n const result = mathHelper(num => num * 100, '%', n);\n\n return result;\n }\n};\n","import Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport JavaScript from '../tree/javascript';\n\nexport default {\n e: function (str) {\n return new Quoted('\"', str instanceof JavaScript ? str.evaluated : str.value, true);\n },\n escape: function (str) {\n return new Anonymous(\n encodeURI(str.value).replace(/=/g, '%3D').replace(/:/g, '%3A').replace(/#/g, '%23').replace(/;/g, '%3B')\n .replace(/\\(/g, '%28').replace(/\\)/g, '%29'));\n },\n replace: function (string, pattern, replacement, flags) {\n let result = string.value;\n replacement = (replacement.type === 'Quoted') ?\n replacement.value : replacement.toCSS();\n result = result.replace(new RegExp(pattern.value, flags ? flags.value : ''), replacement);\n return new Quoted(string.quote || '', result, string.escaped);\n },\n '%': function (string /* arg, arg, ... */) {\n const args = Array.prototype.slice.call(arguments, 1);\n let result = string.value;\n\n for (let i = 0; i < args.length; i++) {\n /* jshint loopfunc:true */\n result = result.replace(/%[sda]/i, token => {\n const value = ((args[i].type === 'Quoted') &&\n token.match(/s/i)) ? args[i].value : args[i].toCSS();\n return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value;\n });\n }\n result = result.replace(/%%/g, '%');\n return new Quoted(string.quote || '', result, string.escaped);\n }\n};\n","import Keyword from '../tree/keyword';\nimport DetachedRuleset from '../tree/detached-ruleset';\nimport Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport URL from '../tree/url';\nimport Operation from '../tree/operation';\n\nconst isa = (n, Type) => (n instanceof Type) ? Keyword.True : Keyword.False;\nconst isunit = (n, unit) => {\n if (unit === undefined) {\n throw { type: 'Argument', message: 'missing the required second argument to isunit.' };\n }\n unit = typeof unit.value === 'string' ? unit.value : unit;\n if (typeof unit !== 'string') {\n throw { type: 'Argument', message: 'Second argument to isunit should be a unit or a string.' };\n }\n return (n instanceof Dimension) && n.unit.is(unit) ? Keyword.True : Keyword.False;\n};\n\nexport default {\n isruleset: function (n) {\n return isa(n, DetachedRuleset);\n },\n iscolor: function (n) {\n return isa(n, Color);\n },\n isnumber: function (n) {\n return isa(n, Dimension);\n },\n isstring: function (n) {\n return isa(n, Quoted);\n },\n iskeyword: function (n) {\n return isa(n, Keyword);\n },\n isurl: function (n) {\n return isa(n, URL);\n },\n ispixel: function (n) {\n return isunit(n, 'px');\n },\n ispercentage: function (n) {\n return isunit(n, '%');\n },\n isem: function (n) {\n return isunit(n, 'em');\n },\n isunit,\n unit: function (val, unit) {\n if (!(val instanceof Dimension)) {\n throw { type: 'Argument',\n message: `the first argument to unit must be a number${val instanceof Operation ? '. Have you forgotten parenthesis?' : ''}` };\n }\n if (unit) {\n if (unit instanceof Keyword) {\n unit = unit.value;\n } else {\n unit = unit.toCSS();\n }\n } else {\n unit = '';\n }\n return new Dimension(val.value, unit);\n },\n 'get-unit': function (n) {\n return new Anonymous(n.unit);\n }\n};\n","import functionRegistry from './function-registry';\nimport functionCaller from './function-caller';\n\nimport boolean from './boolean';\nimport defaultFunc from './default';\nimport color from './color';\nimport colorBlending from './color-blending';\nimport dataUri from './data-uri';\nimport list from './list';\nimport math from './math';\nimport number from './number';\nimport string from './string';\nimport svg from './svg';\nimport types from './types';\n\nexport default environment => {\n const functions = { functionRegistry, functionCaller };\n\n // register functions\n functionRegistry.addMultiple(boolean);\n functionRegistry.add('default', defaultFunc.eval.bind(defaultFunc));\n functionRegistry.addMultiple(color);\n functionRegistry.addMultiple(colorBlending);\n functionRegistry.addMultiple(dataUri(environment));\n functionRegistry.addMultiple(list);\n functionRegistry.addMultiple(math);\n functionRegistry.addMultiple(number);\n functionRegistry.addMultiple(string);\n functionRegistry.addMultiple(svg(environment));\n functionRegistry.addMultiple(types);\n\n return functions;\n};\n","import Quoted from '../tree/quoted';\nimport URL from '../tree/url';\nimport * as utils from '../utils';\nimport logger from '../logger';\n\nexport default environment => {\n \n const fallback = (functionThis, node) => new URL(node, functionThis.index, functionThis.currentFileInfo).eval(functionThis.context); \n\n return { 'data-uri': function(mimetypeNode, filePathNode) {\n\n if (!filePathNode) {\n filePathNode = mimetypeNode;\n mimetypeNode = null;\n }\n\n let mimetype = mimetypeNode && mimetypeNode.value;\n let filePath = filePathNode.value;\n const currentFileInfo = this.currentFileInfo;\n const currentDirectory = currentFileInfo.rewriteUrls ?\n currentFileInfo.currentDirectory : currentFileInfo.entryPath;\n\n const fragmentStart = filePath.indexOf('#');\n let fragment = '';\n if (fragmentStart !== -1) {\n fragment = filePath.slice(fragmentStart);\n filePath = filePath.slice(0, fragmentStart);\n }\n const context = utils.clone(this.context);\n context.rawBuffer = true;\n\n const fileManager = environment.getFileManager(filePath, currentDirectory, context, environment, true);\n\n if (!fileManager) {\n return fallback(this, filePathNode);\n }\n\n let useBase64 = false;\n\n // detect the mimetype if not given\n if (!mimetypeNode) {\n\n mimetype = environment.mimeLookup(filePath);\n\n if (mimetype === 'image/svg+xml') {\n useBase64 = false;\n } else {\n // use base 64 unless it's an ASCII or UTF-8 format\n const charset = environment.charsetLookup(mimetype);\n useBase64 = ['US-ASCII', 'UTF-8'].indexOf(charset) < 0;\n }\n if (useBase64) { mimetype += ';base64'; }\n }\n else {\n useBase64 = /;base64$/.test(mimetype);\n }\n\n const fileSync = fileManager.loadFileSync(filePath, currentDirectory, context, environment);\n if (!fileSync.contents) {\n logger.warn(`Skipped data-uri embedding of ${filePath} because file not found`);\n return fallback(this, filePathNode || mimetypeNode);\n }\n let buf = fileSync.contents;\n if (useBase64 && !environment.encodeBase64) {\n return fallback(this, filePathNode);\n }\n\n buf = useBase64 ? environment.encodeBase64(buf) : encodeURIComponent(buf);\n\n const uri = `data:${mimetype},${buf}${fragment}`;\n\n return new URL(new Quoted(`\"${uri}\"`, uri, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n }};\n};\n","import Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Expression from '../tree/expression';\nimport Quoted from '../tree/quoted';\nimport URL from '../tree/url';\n\nexport default environment => {\n return { 'svg-gradient': function(direction) {\n let stops;\n let gradientDirectionSvg;\n let gradientType = 'linear';\n let rectangleDimension = 'x=\"0\" y=\"0\" width=\"1\" height=\"1\"';\n const renderEnv = {compress: false};\n let returner;\n const directionValue = direction.toCSS(renderEnv);\n let i;\n let color;\n let position;\n let positionValue;\n let alpha;\n\n function throwArgumentDescriptor() {\n throw { type: 'Argument',\n message: 'svg-gradient expects direction, start_color [start_position], [color position,]...,' +\n ' end_color [end_position] or direction, color list' };\n }\n\n if (arguments.length == 2) {\n if (arguments[1].value.length < 2) {\n throwArgumentDescriptor();\n }\n stops = arguments[1].value;\n } else if (arguments.length < 3) {\n throwArgumentDescriptor();\n } else {\n stops = Array.prototype.slice.call(arguments, 1);\n }\n\n switch (directionValue) {\n case 'to bottom':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\"';\n break;\n case 'to right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'to bottom right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\"';\n break;\n case 'to top right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"100%\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'ellipse':\n case 'ellipse at center':\n gradientType = 'radial';\n gradientDirectionSvg = 'cx=\"50%\" cy=\"50%\" r=\"75%\"';\n rectangleDimension = 'x=\"-50\" y=\"-50\" width=\"101\" height=\"101\"';\n break;\n default:\n throw { type: 'Argument', message: 'svg-gradient direction must be \\'to bottom\\', \\'to right\\',' +\n ' \\'to bottom right\\', \\'to top right\\' or \\'ellipse at center\\'' };\n }\n returner = `<${gradientType}Gradient id=\"g\" ${gradientDirectionSvg}>`;\n\n for (i = 0; i < stops.length; i += 1) {\n if (stops[i] instanceof Expression) {\n color = stops[i].value[0];\n position = stops[i].value[1];\n } else {\n color = stops[i];\n position = undefined;\n }\n\n if (!(color instanceof Color) || (!((i === 0 || i + 1 === stops.length) && position === undefined) && !(position instanceof Dimension))) {\n throwArgumentDescriptor();\n }\n positionValue = position ? position.toCSS(renderEnv) : i === 0 ? '0%' : '100%';\n alpha = color.alpha;\n returner += ``;\n }\n returner += ``;\n\n returner = encodeURIComponent(returner);\n\n returner = `data:image/svg+xml,${returner}`;\n return new URL(new Quoted(`'${returner}'`, returner, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n }};\n};\n","import contexts from './contexts';\nimport visitor from './visitors';\nimport tree from './tree';\n\nexport default function(root, options) {\n options = options || {};\n let evaldRoot;\n let variables = options.variables;\n const evalEnv = new contexts.Eval(options);\n\n //\n // Allows setting variables with a hash, so:\n //\n // `{ color: new tree.Color('#f01') }` will become:\n //\n // new tree.Declaration('@color',\n // new tree.Value([\n // new tree.Expression([\n // new tree.Color('#f01')\n // ])\n // ])\n // )\n //\n if (typeof variables === 'object' && !Array.isArray(variables)) {\n variables = Object.keys(variables).map(function (k) {\n let value = variables[k];\n\n if (!(value instanceof tree.Value)) {\n if (!(value instanceof tree.Expression)) {\n value = new tree.Expression([value]);\n }\n value = new tree.Value([value]);\n }\n return new tree.Declaration(`@${k}`, value, false, null, 0);\n });\n evalEnv.frames = [new tree.Ruleset(null, variables)];\n }\n\n const visitors = [\n new visitor.JoinSelectorVisitor(),\n new visitor.MarkVisibleSelectorsVisitor(true),\n new visitor.ExtendVisitor(),\n new visitor.ToCSSVisitor({compress: Boolean(options.compress)})\n ];\n\n const preEvalVisitors = [];\n let v;\n let visitorIterator;\n\n /**\n * first() / get() allows visitors to be added while visiting\n * \n * @todo Add scoping for visitors just like functions for @plugin; right now they're global\n */\n if (options.pluginManager) {\n visitorIterator = options.pluginManager.visitor();\n for (var i = 0; i < 2; i++) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (v.isPreEvalVisitor) {\n if (i === 0 || preEvalVisitors.indexOf(v) === -1) {\n preEvalVisitors.push(v);\n v.run(root);\n }\n }\n else {\n if (i === 0 || visitors.indexOf(v) === -1) {\n if (v.isPreVisitor) {\n visitors.unshift(v);\n }\n else {\n visitors.push(v);\n }\n }\n }\n }\n }\n }\n\n evaldRoot = root.eval(evalEnv);\n\n for (var i = 0; i < visitors.length; i++) {\n visitors[i].run(evaldRoot);\n }\n\n // Run any remaining visitors added after eval pass\n if (options.pluginManager) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (visitors.indexOf(v) === -1 && preEvalVisitors.indexOf(v) === -1) {\n v.run(evaldRoot);\n }\n }\n }\n\n return evaldRoot;\n};\n","/**\n * Plugin Manager\n */\nclass PluginManager {\n constructor(less) {\n this.less = less;\n this.visitors = [];\n this.preProcessors = [];\n this.postProcessors = [];\n this.installedPlugins = [];\n this.fileManagers = [];\n this.iterator = -1;\n this.pluginCache = {};\n this.Loader = new less.PluginLoader(less);\n }\n\n /**\n * Adds all the plugins in the array\n * @param {Array} plugins\n */\n addPlugins(plugins) {\n if (plugins) {\n for (let i = 0; i < plugins.length; i++) {\n this.addPlugin(plugins[i]);\n }\n }\n }\n\n /**\n *\n * @param plugin\n * @param {String} filename\n */\n addPlugin(plugin, filename, functionRegistry) {\n this.installedPlugins.push(plugin);\n if (filename) {\n this.pluginCache[filename] = plugin;\n }\n if (plugin.install) {\n plugin.install(this.less, this, functionRegistry || this.less.functions.functionRegistry);\n }\n }\n\n /**\n *\n * @param filename\n */\n get(filename) {\n return this.pluginCache[filename];\n }\n\n /**\n * Adds a visitor. The visitor object has options on itself to determine\n * when it should run.\n * @param visitor\n */\n addVisitor(visitor) {\n this.visitors.push(visitor);\n }\n\n /**\n * Adds a pre processor object\n * @param {object} preProcessor\n * @param {number} priority - guidelines 1 = before import, 1000 = import, 2000 = after import\n */\n addPreProcessor(preProcessor, priority) {\n let indexToInsertAt;\n for (indexToInsertAt = 0; indexToInsertAt < this.preProcessors.length; indexToInsertAt++) {\n if (this.preProcessors[indexToInsertAt].priority >= priority) {\n break;\n }\n }\n this.preProcessors.splice(indexToInsertAt, 0, {preProcessor, priority});\n }\n\n /**\n * Adds a post processor object\n * @param {object} postProcessor\n * @param {number} priority - guidelines 1 = before compression, 1000 = compression, 2000 = after compression\n */\n addPostProcessor(postProcessor, priority) {\n let indexToInsertAt;\n for (indexToInsertAt = 0; indexToInsertAt < this.postProcessors.length; indexToInsertAt++) {\n if (this.postProcessors[indexToInsertAt].priority >= priority) {\n break;\n }\n }\n this.postProcessors.splice(indexToInsertAt, 0, {postProcessor, priority});\n }\n\n /**\n *\n * @param manager\n */\n addFileManager(manager) {\n this.fileManagers.push(manager);\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getPreProcessors() {\n const preProcessors = [];\n for (let i = 0; i < this.preProcessors.length; i++) {\n preProcessors.push(this.preProcessors[i].preProcessor);\n }\n return preProcessors;\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getPostProcessors() {\n const postProcessors = [];\n for (let i = 0; i < this.postProcessors.length; i++) {\n postProcessors.push(this.postProcessors[i].postProcessor);\n }\n return postProcessors;\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getVisitors() {\n return this.visitors;\n }\n\n visitor() {\n const self = this;\n return {\n first: function() {\n self.iterator = -1;\n return self.visitors[self.iterator];\n },\n get: function() {\n self.iterator += 1;\n return self.visitors[self.iterator];\n }\n };\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getFileManagers() {\n return this.fileManagers;\n }\n}\n\nlet pm;\n\nconst PluginManagerFactory = function(less, newFactory) {\n if (newFactory || !pm) {\n pm = new PluginManager(less);\n }\n return pm;\n};\n\n//\nexport default PluginManagerFactory;\n","/* global window, XMLHttpRequest */\n\nimport AbstractFileManager from '../less/environment/abstract-file-manager.js';\n\nlet options;\nlet logger;\nlet fileCache = {};\n\n// TODOS - move log somewhere. pathDiff and doing something similar in node. use pathDiff in the other browser file for the initial load\nclass FileManager extends AbstractFileManager {\n alwaysMakePathsAbsolute() {\n return true;\n }\n\n join(basePath, laterPath) {\n if (!basePath) {\n return laterPath;\n }\n return this.extractUrlParts(laterPath, basePath).path;\n }\n\n doXHR(url, type, callback, errback) {\n const xhr = new XMLHttpRequest();\n const async = options.isFileProtocol ? options.fileAsync : true;\n\n if (typeof xhr.overrideMimeType === 'function') {\n xhr.overrideMimeType('text/css');\n }\n logger.debug(`XHR: Getting '${url}'`);\n xhr.open('GET', url, async);\n xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5');\n xhr.send(null);\n\n function handleResponse(xhr, callback, errback) {\n if (xhr.status >= 200 && xhr.status < 300) {\n callback(xhr.responseText,\n xhr.getResponseHeader('Last-Modified'));\n } else if (typeof errback === 'function') {\n errback(xhr.status, url);\n }\n }\n\n if (options.isFileProtocol && !options.fileAsync) {\n if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) {\n callback(xhr.responseText);\n } else {\n errback(xhr.status, url);\n }\n } else if (async) {\n xhr.onreadystatechange = () => {\n if (xhr.readyState == 4) {\n handleResponse(xhr, callback, errback);\n }\n };\n } else {\n handleResponse(xhr, callback, errback);\n }\n }\n\n supports() {\n return true;\n }\n\n clearFileCache() {\n fileCache = {};\n }\n\n loadFile(filename, currentDirectory, options, environment) {\n // TODO: Add prefix support like less-node?\n // What about multiple paths?\n\n if (currentDirectory && !this.isPathAbsolute(filename)) {\n filename = currentDirectory + filename;\n }\n\n filename = options.ext ? this.tryAppendExtension(filename, options.ext) : filename;\n\n options = options || {};\n\n // sheet may be set to the stylesheet for the initial load or a collection of properties including\n // some context variables for imports\n const hrefParts = this.extractUrlParts(filename, window.location.href);\n const href = hrefParts.url;\n const self = this;\n \n return new Promise((resolve, reject) => {\n if (options.useFileCache && fileCache[href]) {\n try {\n const lessText = fileCache[href];\n return resolve({ contents: lessText, filename: href, webInfo: { lastModified: new Date() }});\n } catch (e) {\n return reject({ filename: href, message: `Error loading file ${href} error was ${e.message}` });\n }\n }\n\n self.doXHR(href, options.mime, function doXHRCallback(data, lastModified) {\n // per file cache\n fileCache[href] = data;\n\n // Use remote copy (re-parse)\n resolve({ contents: data, filename: href, webInfo: { lastModified }});\n }, function doXHRError(status, url) {\n reject({ type: 'File', message: `'${url}' wasn't found (${status})`, href });\n });\n });\n }\n}\n\nexport default (opts, log) => {\n options = opts;\n logger = log;\n return FileManager;\n}\n","import Environment from './environment/environment';\nimport data from './data';\nimport tree from './tree';\nimport AbstractFileManager from './environment/abstract-file-manager';\nimport AbstractPluginLoader from './environment/abstract-plugin-loader';\nimport visitors from './visitors';\nimport Parser from './parser/parser';\nimport functions from './functions';\nimport contexts from './contexts';\nimport LessError from './less-error';\nimport transformTree from './transform-tree';\nimport * as utils from './utils';\nimport PluginManager from './plugin-manager';\nimport logger from './logger';\nimport SourceMapOutput from './source-map-output';\nimport SourceMapBuilder from './source-map-builder';\nimport ParseTree from './parse-tree';\nimport ImportManager from './import-manager';\nimport Parse from './parse';\nimport Render from './render';\n\nexport default function(environment, fileManagers) {\n let sourceMapOutput, sourceMapBuilder, parseTree, importManager;\n\n environment = new Environment(environment, fileManagers);\n sourceMapOutput = SourceMapOutput(environment);\n sourceMapBuilder = SourceMapBuilder(sourceMapOutput, environment);\n parseTree = ParseTree(sourceMapBuilder);\n importManager = ImportManager(environment);\n\n const render = Render(environment, parseTree, importManager);\n const parse = Parse(environment, parseTree, importManager);\n\n const initial = {\n version: [4, 0, 0],\n data,\n tree,\n Environment,\n AbstractFileManager,\n AbstractPluginLoader,\n environment,\n visitors,\n Parser,\n functions: functions(environment),\n contexts,\n SourceMapOutput: sourceMapOutput,\n SourceMapBuilder: sourceMapBuilder,\n ParseTree: parseTree,\n ImportManager: importManager,\n render,\n parse,\n LessError,\n transformTree,\n utils,\n PluginManager,\n logger\n };\n\n // Create a public API\n\n const ctor = function(t) {\n return function() {\n const obj = Object.create(t.prototype);\n t.apply(obj, Array.prototype.slice.call(arguments, 0));\n return obj;\n };\n };\n let t;\n const api = Object.create(initial);\n for (const n in initial.tree) {\n /* eslint guard-for-in: 0 */\n t = initial.tree[n];\n if (typeof t === 'function') {\n api[n.toLowerCase()] = ctor(t);\n }\n else {\n api[n] = Object.create(null);\n for (const o in t) {\n /* eslint guard-for-in: 0 */\n api[n][o.toLowerCase()] = ctor(t[o]);\n }\n }\n }\n\n /**\n * Some of the functions assume a `this` context of the API object,\n * which causes it to fail when wrapped for ES6 imports.\n * \n * An assumed `this` should be removed in the future.\n */\n initial.parse = initial.parse.bind(api);\n initial.render = initial.render.bind(api);\n\n return api;\n};\n","import LessError from './less-error';\nimport transformTree from './transform-tree';\nimport logger from './logger';\n\nexport default function(SourceMapBuilder) {\n class ParseTree {\n constructor(root, imports) {\n this.root = root;\n this.imports = imports;\n }\n\n toCSS(options) {\n let evaldRoot;\n const result = {};\n let sourceMapBuilder;\n try {\n evaldRoot = transformTree(this.root, options);\n } catch (e) {\n throw new LessError(e, this.imports);\n }\n\n try {\n const compress = Boolean(options.compress);\n if (compress) {\n logger.warn('The compress option has been deprecated. ' + \n 'We recommend you use a dedicated css minifier, for instance see less-plugin-clean-css.');\n }\n\n const toCSSOptions = {\n compress,\n dumpLineNumbers: options.dumpLineNumbers,\n strictUnits: Boolean(options.strictUnits),\n numPrecision: 8};\n\n if (options.sourceMap) {\n sourceMapBuilder = new SourceMapBuilder(options.sourceMap);\n result.css = sourceMapBuilder.toCSS(evaldRoot, toCSSOptions, this.imports);\n } else {\n result.css = evaldRoot.toCSS(toCSSOptions);\n }\n } catch (e) {\n throw new LessError(e, this.imports);\n }\n\n if (options.pluginManager) {\n const postProcessors = options.pluginManager.getPostProcessors();\n for (let i = 0; i < postProcessors.length; i++) {\n result.css = postProcessors[i].process(result.css, { sourceMap: sourceMapBuilder, options, imports: this.imports });\n }\n }\n if (options.sourceMap) {\n result.map = sourceMapBuilder.getExternalSourceMap();\n }\n\n result.imports = [];\n for (const file in this.imports.files) {\n if (this.imports.files.hasOwnProperty(file) && file !== this.imports.rootFilename) {\n result.imports.push(file);\n }\n }\n return result;\n }\n }\n\n return ParseTree;\n};\n","export default function (SourceMapOutput, environment) {\n class SourceMapBuilder {\n constructor(options) {\n this.options = options;\n }\n\n toCSS(rootNode, options, imports) {\n const sourceMapOutput = new SourceMapOutput(\n {\n contentsIgnoredCharsMap: imports.contentsIgnoredChars,\n rootNode,\n contentsMap: imports.contents,\n sourceMapFilename: this.options.sourceMapFilename,\n sourceMapURL: this.options.sourceMapURL,\n outputFilename: this.options.sourceMapOutputFilename,\n sourceMapBasepath: this.options.sourceMapBasepath,\n sourceMapRootpath: this.options.sourceMapRootpath,\n outputSourceFiles: this.options.outputSourceFiles,\n sourceMapGenerator: this.options.sourceMapGenerator,\n sourceMapFileInline: this.options.sourceMapFileInline, \n disableSourcemapAnnotation: this.options.disableSourcemapAnnotation\n });\n\n const css = sourceMapOutput.toCSS(options);\n this.sourceMap = sourceMapOutput.sourceMap;\n this.sourceMapURL = sourceMapOutput.sourceMapURL;\n if (this.options.sourceMapInputFilename) {\n this.sourceMapInputFilename = sourceMapOutput.normalizeFilename(this.options.sourceMapInputFilename);\n }\n if (this.options.sourceMapBasepath !== undefined && this.sourceMapURL !== undefined) {\n this.sourceMapURL = sourceMapOutput.removeBasepath(this.sourceMapURL);\n }\n return css + this.getCSSAppendage();\n }\n\n getCSSAppendage() {\n\n let sourceMapURL = this.sourceMapURL;\n if (this.options.sourceMapFileInline) {\n if (this.sourceMap === undefined) {\n return '';\n }\n sourceMapURL = `data:application/json;base64,${environment.encodeBase64(this.sourceMap)}`;\n }\n\n if (this.options.disableSourcemapAnnotation) {\n return '';\n }\n\n if (sourceMapURL) {\n return `/*# sourceMappingURL=${sourceMapURL} */`;\n }\n return '';\n }\n\n getExternalSourceMap() {\n return this.sourceMap;\n }\n\n setExternalSourceMap(sourceMap) {\n this.sourceMap = sourceMap;\n }\n\n isInline() {\n return this.options.sourceMapFileInline;\n }\n\n getSourceMapURL() {\n return this.sourceMapURL;\n }\n\n getOutputFilename() {\n return this.options.sourceMapOutputFilename;\n }\n\n getInputFilename() {\n return this.sourceMapInputFilename;\n }\n }\n\n return SourceMapBuilder;\n};\n","export default function (environment) {\n class SourceMapOutput {\n constructor(options) {\n this._css = [];\n this._rootNode = options.rootNode;\n this._contentsMap = options.contentsMap;\n this._contentsIgnoredCharsMap = options.contentsIgnoredCharsMap;\n if (options.sourceMapFilename) {\n this._sourceMapFilename = options.sourceMapFilename.replace(/\\\\/g, '/');\n }\n this._outputFilename = options.outputFilename;\n this.sourceMapURL = options.sourceMapURL;\n if (options.sourceMapBasepath) {\n this._sourceMapBasepath = options.sourceMapBasepath.replace(/\\\\/g, '/');\n }\n if (options.sourceMapRootpath) {\n this._sourceMapRootpath = options.sourceMapRootpath.replace(/\\\\/g, '/');\n if (this._sourceMapRootpath.charAt(this._sourceMapRootpath.length - 1) !== '/') {\n this._sourceMapRootpath += '/';\n }\n } else {\n this._sourceMapRootpath = '';\n }\n this._outputSourceFiles = options.outputSourceFiles;\n this._sourceMapGeneratorConstructor = environment.getSourceMapGenerator();\n\n this._lineNumber = 0;\n this._column = 0;\n }\n\n removeBasepath(path) {\n if (this._sourceMapBasepath && path.indexOf(this._sourceMapBasepath) === 0) {\n path = path.substring(this._sourceMapBasepath.length);\n if (path.charAt(0) === '\\\\' || path.charAt(0) === '/') {\n path = path.substring(1);\n }\n }\n\n return path;\n }\n\n normalizeFilename(filename) {\n filename = filename.replace(/\\\\/g, '/');\n filename = this.removeBasepath(filename);\n return (this._sourceMapRootpath || '') + filename;\n }\n\n add(chunk, fileInfo, index, mapLines) {\n\n // ignore adding empty strings\n if (!chunk) {\n return;\n }\n\n let lines, sourceLines, columns, sourceColumns, i;\n\n if (fileInfo && fileInfo.filename) {\n let inputSource = this._contentsMap[fileInfo.filename];\n\n // remove vars/banner added to the top of the file\n if (this._contentsIgnoredCharsMap[fileInfo.filename]) {\n // adjust the index\n index -= this._contentsIgnoredCharsMap[fileInfo.filename];\n if (index < 0) { index = 0; }\n // adjust the source\n inputSource = inputSource.slice(this._contentsIgnoredCharsMap[fileInfo.filename]);\n }\n\n // ignore empty content\n if (inputSource === undefined) {\n return;\n }\n\n inputSource = inputSource.substring(0, index);\n sourceLines = inputSource.split('\\n');\n sourceColumns = sourceLines[sourceLines.length - 1];\n }\n\n lines = chunk.split('\\n');\n columns = lines[lines.length - 1];\n\n if (fileInfo && fileInfo.filename) {\n if (!mapLines) {\n this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + 1, column: this._column},\n original: { line: sourceLines.length, column: sourceColumns.length},\n source: this.normalizeFilename(fileInfo.filename)});\n } else {\n for (i = 0; i < lines.length; i++) {\n this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + i + 1, column: i === 0 ? this._column : 0},\n original: { line: sourceLines.length + i, column: i === 0 ? sourceColumns.length : 0},\n source: this.normalizeFilename(fileInfo.filename)});\n }\n }\n }\n\n if (lines.length === 1) {\n this._column += columns.length;\n } else {\n this._lineNumber += lines.length - 1;\n this._column = columns.length;\n }\n\n this._css.push(chunk);\n }\n\n isEmpty() {\n return this._css.length === 0;\n }\n\n toCSS(context) {\n this._sourceMapGenerator = new this._sourceMapGeneratorConstructor({ file: this._outputFilename, sourceRoot: null });\n\n if (this._outputSourceFiles) {\n for (const filename in this._contentsMap) {\n if (this._contentsMap.hasOwnProperty(filename)) {\n let source = this._contentsMap[filename];\n if (this._contentsIgnoredCharsMap[filename]) {\n source = source.slice(this._contentsIgnoredCharsMap[filename]);\n }\n this._sourceMapGenerator.setSourceContent(this.normalizeFilename(filename), source);\n }\n }\n }\n\n this._rootNode.genCSS(context, this);\n\n if (this._css.length > 0) {\n let sourceMapURL;\n const sourceMapContent = JSON.stringify(this._sourceMapGenerator.toJSON());\n\n if (this.sourceMapURL) {\n sourceMapURL = this.sourceMapURL;\n } else if (this._sourceMapFilename) {\n sourceMapURL = this._sourceMapFilename;\n }\n this.sourceMapURL = sourceMapURL;\n\n this.sourceMap = sourceMapContent;\n }\n\n return this._css.join('');\n }\n }\n\n return SourceMapOutput;\n};\n","import contexts from './contexts';\nimport Parser from './parser/parser';\nimport LessError from './less-error';\nimport * as utils from './utils';\nimport logger from './logger';\n\nexport default function(environment) {\n // FileInfo = {\n // 'rewriteUrls' - option - whether to adjust URL's to be relative\n // 'filename' - full resolved filename of current file\n // 'rootpath' - path to append to normal URLs for this node\n // 'currentDirectory' - path to the current file, absolute\n // 'rootFilename' - filename of the base file\n // 'entryPath' - absolute path to the entry file\n // 'reference' - whether the file should not be output and only output parts that are referenced\n\n class ImportManager {\n constructor(less, context, rootFileInfo) {\n this.less = less;\n this.rootFilename = rootFileInfo.filename;\n this.paths = context.paths || []; // Search paths, when importing\n this.contents = {}; // map - filename to contents of all the files\n this.contentsIgnoredChars = {}; // map - filename to lines at the beginning of each file to ignore\n this.mime = context.mime;\n this.error = null;\n this.context = context;\n // Deprecated? Unused outside of here, could be useful.\n this.queue = []; // Files which haven't been imported yet\n this.files = {}; // Holds the imported parse trees.\n }\n\n /**\n * Add an import to be imported\n * @param path - the raw path\n * @param tryAppendExtension - whether to try appending a file extension (.less or .js if the path has no extension)\n * @param currentFileInfo - the current file info (used for instance to work out relative paths)\n * @param importOptions - import options\n * @param callback - callback for when it is imported\n */\n push(path, tryAppendExtension, currentFileInfo, importOptions, callback) {\n const importManager = this, pluginLoader = this.context.pluginManager.Loader;\n\n this.queue.push(path);\n\n const fileParsedFunc = function (e, root, fullPath) {\n importManager.queue.splice(importManager.queue.indexOf(path), 1); // Remove the path from the queue\n\n const importedEqualsRoot = fullPath === importManager.rootFilename;\n if (importOptions.optional && e) {\n callback(null, {rules:[]}, false, null);\n logger.info(`The file ${fullPath} was skipped because it was not found and the import was marked optional.`);\n }\n else {\n // Inline imports aren't cached here.\n // If we start to cache them, please make sure they won't conflict with non-inline imports of the\n // same name as they used to do before this comment and the condition below have been added.\n if (!importManager.files[fullPath] && !importOptions.inline) {\n importManager.files[fullPath] = { root, options: importOptions };\n }\n if (e && !importManager.error) { importManager.error = e; }\n callback(e, root, importedEqualsRoot, fullPath);\n }\n };\n\n const newFileInfo = {\n rewriteUrls: this.context.rewriteUrls,\n entryPath: currentFileInfo.entryPath,\n rootpath: currentFileInfo.rootpath,\n rootFilename: currentFileInfo.rootFilename\n };\n\n const fileManager = environment.getFileManager(path, currentFileInfo.currentDirectory, this.context, environment);\n\n if (!fileManager) {\n fileParsedFunc({ message: `Could not find a file-manager for ${path}` });\n return;\n }\n\n const loadFileCallback = function(loadedFile) {\n let plugin;\n const resolvedFilename = loadedFile.filename;\n const contents = loadedFile.contents.replace(/^\\uFEFF/, '');\n\n // Pass on an updated rootpath if path of imported file is relative and file\n // is in a (sub|sup) directory\n //\n // Examples:\n // - If path of imported file is 'module/nav/nav.less' and rootpath is 'less/',\n // then rootpath should become 'less/module/nav/'\n // - If path of imported file is '../mixins.less' and rootpath is 'less/',\n // then rootpath should become 'less/../'\n newFileInfo.currentDirectory = fileManager.getPath(resolvedFilename);\n if (newFileInfo.rewriteUrls) {\n newFileInfo.rootpath = fileManager.join(\n (importManager.context.rootpath || ''),\n fileManager.pathDiff(newFileInfo.currentDirectory, newFileInfo.entryPath));\n\n if (!fileManager.isPathAbsolute(newFileInfo.rootpath) && fileManager.alwaysMakePathsAbsolute()) {\n newFileInfo.rootpath = fileManager.join(newFileInfo.entryPath, newFileInfo.rootpath);\n }\n }\n newFileInfo.filename = resolvedFilename;\n\n const newEnv = new contexts.Parse(importManager.context);\n\n newEnv.processImports = false;\n importManager.contents[resolvedFilename] = contents;\n\n if (currentFileInfo.reference || importOptions.reference) {\n newFileInfo.reference = true;\n }\n\n if (importOptions.isPlugin) {\n plugin = pluginLoader.evalPlugin(contents, newEnv, importManager, importOptions.pluginArgs, newFileInfo);\n if (plugin instanceof LessError) {\n fileParsedFunc(plugin, null, resolvedFilename);\n }\n else {\n fileParsedFunc(null, plugin, resolvedFilename);\n }\n } else if (importOptions.inline) {\n fileParsedFunc(null, contents, resolvedFilename);\n } else {\n\n // import (multiple) parse trees apparently get altered and can't be cached.\n // TODO: investigate why this is\n if (importManager.files[resolvedFilename]\n && !importManager.files[resolvedFilename].options.multiple\n && !importOptions.multiple) {\n\n fileParsedFunc(null, importManager.files[resolvedFilename].root, resolvedFilename);\n }\n else {\n new Parser(newEnv, importManager, newFileInfo).parse(contents, function (e, root) {\n fileParsedFunc(e, root, resolvedFilename);\n });\n }\n }\n };\n let loadedFile;\n let promise;\n const context = utils.clone(this.context);\n\n if (tryAppendExtension) {\n context.ext = importOptions.isPlugin ? '.js' : '.less';\n }\n\n if (importOptions.isPlugin) {\n context.mime = 'application/javascript';\n\n if (context.syncImport) {\n loadedFile = pluginLoader.loadPluginSync(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n } else {\n promise = pluginLoader.loadPlugin(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n }\n }\n else {\n if (context.syncImport) {\n loadedFile = fileManager.loadFileSync(path, currentFileInfo.currentDirectory, context, environment);\n } else {\n promise = fileManager.loadFile(path, currentFileInfo.currentDirectory, context, environment,\n (err, loadedFile) => {\n if (err) {\n fileParsedFunc(err);\n } else {\n loadFileCallback(loadedFile);\n }\n });\n }\n }\n if (loadedFile) {\n if (!loadedFile.filename) {\n fileParsedFunc(loadedFile);\n } else {\n loadFileCallback(loadedFile);\n }\n } else if (promise) {\n promise.then(loadFileCallback, fileParsedFunc);\n }\n }\n }\n\n return ImportManager;\n};\n","import * as utils from './utils';\n\nexport default function(environment, ParseTree, ImportManager) {\n const render = function (input, options, callback) {\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(this.options, {});\n }\n else {\n options = utils.copyOptions(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n return new Promise(function (resolve, reject) {\n render.call(self, input, options, function(err, output) {\n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n this.parse(input, options, function(err, root, imports, options) {\n if (err) { return callback(err); }\n\n let result;\n try {\n const parseTree = new ParseTree(root, imports);\n result = parseTree.toCSS(options);\n }\n catch (err) { return callback(err); }\n\n callback(null, result);\n });\n }\n };\n\n return render;\n};\n","import contexts from './contexts';\nimport Parser from './parser/parser';\nimport PluginManager from './plugin-manager';\nimport LessError from './less-error';\nimport * as utils from './utils';\n\nexport default function(environment, ParseTree, ImportManager) {\n const parse = function (input, options, callback) {\n\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(this.options, {});\n }\n else {\n options = utils.copyOptions(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n return new Promise(function (resolve, reject) {\n parse.call(self, input, options, function(err, output) {\n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n let context;\n let rootFileInfo;\n const pluginManager = new PluginManager(this, !options.reUsePluginManager);\n\n options.pluginManager = pluginManager;\n\n context = new contexts.Parse(options);\n\n if (options.rootFileInfo) {\n rootFileInfo = options.rootFileInfo;\n } else {\n const filename = options.filename || 'input';\n const entryPath = filename.replace(/[^\\/\\\\]*$/, '');\n rootFileInfo = {\n filename,\n rewriteUrls: context.rewriteUrls,\n rootpath: context.rootpath || '',\n currentDirectory: entryPath,\n entryPath,\n rootFilename: filename\n };\n // add in a missing trailing slash\n if (rootFileInfo.rootpath && rootFileInfo.rootpath.slice(-1) !== '/') {\n rootFileInfo.rootpath += '/';\n }\n }\n\n const imports = new ImportManager(this, context, rootFileInfo);\n this.importManager = imports;\n\n // TODO: allow the plugins to be just a list of paths or names\n // Do an async plugin queue like lessc\n\n if (options.plugins) {\n options.plugins.forEach(function(plugin) {\n let evalResult, contents;\n if (plugin.fileContent) {\n contents = plugin.fileContent.replace(/^\\uFEFF/, '');\n evalResult = pluginManager.Loader.evalPlugin(contents, context, imports, plugin.options, plugin.filename);\n if (evalResult instanceof LessError) {\n return callback(evalResult);\n }\n }\n else {\n pluginManager.addPlugin(plugin);\n }\n });\n }\n\n new Parser(context, imports, rootFileInfo)\n .parse(input, function (e, root) {\n if (e) { return callback(e); }\n callback(null, root, imports, options);\n }, options);\n }\n };\n return parse;\n};\n","// TODO: Add tests for browser @plugin\n/* global window */\n\nimport AbstractPluginLoader from '../less/environment/abstract-plugin-loader.js';\n\n/**\n * Browser Plugin Loader\n */\nclass PluginLoader extends AbstractPluginLoader {\n constructor(less) {\n super();\n\n this.less = less;\n // Should we shim this.require for browser? Probably not?\n }\n\n loadPlugin(filename, basePath, context, environment, fileManager) {\n return new Promise((fulfill, reject) => {\n fileManager.loadFile(filename, basePath, context, environment)\n .then(fulfill).catch(reject);\n });\n }\n}\n\nexport default PluginLoader;\n\n","import * as utils from './utils';\nimport browser from './browser';\n\nexport default (window, less, options) => {\n\n function errorHTML(e, rootHref) {\n const id = `less-error-message:${utils.extractId(rootHref || '')}`;\n const template = '
  • {content}
  • ';\n const elem = window.document.createElement('div');\n let timer;\n let content;\n const errors = [];\n const filename = e.filename || rootHref;\n const filenameNoPath = filename.match(/([^\\/]+(\\?.*)?)$/)[1];\n\n elem.id = id;\n elem.className = 'less-error-message';\n\n content = `

    ${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'}` + \n `

    in ${filenameNoPath} `;\n\n const errorline = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\{content\\}/, e.extract[i]));\n }\n };\n\n if (e.line) {\n errorline(e, 0, '');\n errorline(e, 1, 'line');\n errorline(e, 2, '');\n content += `on line ${e.line}, column ${e.column + 1}:

      ${errors.join('')}
    `;\n }\n if (e.stack && (e.extract || options.logLevel >= 4)) {\n content += `
    Stack Trace
    ${e.stack.split('\\n').slice(1).join('
    ')}`;\n }\n elem.innerHTML = content;\n\n // CSS for error messages\n browser.createCSS(window.document, [\n '.less-error-message ul, .less-error-message li {',\n 'list-style-type: none;',\n 'margin-right: 15px;',\n 'padding: 4px 0;',\n 'margin: 0;',\n '}',\n '.less-error-message label {',\n 'font-size: 12px;',\n 'margin-right: 15px;',\n 'padding: 4px 0;',\n 'color: #cc7777;',\n '}',\n '.less-error-message pre {',\n 'color: #dd6666;',\n 'padding: 4px 0;',\n 'margin: 0;',\n 'display: inline-block;',\n '}',\n '.less-error-message pre.line {',\n 'color: #ff0000;',\n '}',\n '.less-error-message h3 {',\n 'font-size: 20px;',\n 'font-weight: bold;',\n 'padding: 15px 0 5px 0;',\n 'margin: 0;',\n '}',\n '.less-error-message a {',\n 'color: #10a',\n '}',\n '.less-error-message .error {',\n 'color: red;',\n 'font-weight: bold;',\n 'padding-bottom: 2px;',\n 'border-bottom: 1px dashed red;',\n '}'\n ].join('\\n'), { title: 'error-message' });\n\n elem.style.cssText = [\n 'font-family: Arial, sans-serif',\n 'border: 1px solid #e00',\n 'background-color: #eee',\n 'border-radius: 5px',\n '-webkit-border-radius: 5px',\n '-moz-border-radius: 5px',\n 'color: #e00',\n 'padding: 15px',\n 'margin-bottom: 15px'\n ].join(';');\n\n if (options.env === 'development') {\n timer = setInterval(() => {\n const document = window.document;\n const body = document.body;\n if (body) {\n if (document.getElementById(id)) {\n body.replaceChild(elem, document.getElementById(id));\n } else {\n body.insertBefore(elem, body.firstChild);\n }\n clearInterval(timer);\n }\n }, 10);\n }\n }\n\n function removeErrorHTML(path) {\n const node = window.document.getElementById(`less-error-message:${utils.extractId(path)}`);\n if (node) {\n node.parentNode.removeChild(node);\n }\n }\n\n function removeErrorConsole(path) {\n // no action\n }\n\n function removeError(path) {\n if (!options.errorReporting || options.errorReporting === 'html') {\n removeErrorHTML(path);\n } else if (options.errorReporting === 'console') {\n removeErrorConsole(path);\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('remove', path);\n }\n }\n\n function errorConsole(e, rootHref) {\n const template = '{line} {content}';\n const filename = e.filename || rootHref;\n const errors = [];\n let content = `${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'} in ${filename}`;\n\n const errorline = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\{content\\}/, e.extract[i]));\n }\n };\n\n if (e.line) {\n errorline(e, 0, '');\n errorline(e, 1, 'line');\n errorline(e, 2, '');\n content += ` on line ${e.line}, column ${e.column + 1}:\\n${errors.join('\\n')}`;\n }\n if (e.stack && (e.extract || options.logLevel >= 4)) {\n content += `\\nStack Trace\\n${e.stack}`;\n }\n less.logger.error(content);\n }\n\n function error(e, rootHref) {\n if (!options.errorReporting || options.errorReporting === 'html') {\n errorHTML(e, rootHref);\n } else if (options.errorReporting === 'console') {\n errorConsole(e, rootHref);\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('add', e, rootHref);\n }\n }\n\n return {\n add: error,\n remove: removeError\n };\n};\n","/**\n * Kicks off less and compiles any stylesheets\n * used in the browser distributed version of less\n * to kick-start less using the browser api\n */\n/* global window, document */\n\nimport defaultOptions from '../less/default-options';\nimport addDefaultOptions from './add-default-options';\nimport root from './index';\n\nconst options = defaultOptions();\n\nif (window.less) {\n for (const key in window.less) {\n if (window.less.hasOwnProperty(key)) {\n options[key] = window.less[key];\n }\n }\n}\naddDefaultOptions(window, options);\n\noptions.plugins = options.plugins || [];\n\nif (window.LESS_PLUGINS) {\n options.plugins = options.plugins.concat(window.LESS_PLUGINS);\n}\n\nconst less = root(window, options);\nexport default less;\n\nwindow.less = less;\n\nlet css;\nlet head;\nlet style;\n\n// Always restore page visibility\nfunction resolveOrReject(data) {\n if (data.filename) {\n console.warn(data);\n }\n if (!options.async) {\n head.removeChild(style);\n }\n}\n\nif (options.onReady) {\n if (/!watch/.test(window.location.hash)) {\n less.watch();\n }\n // Simulate synchronous stylesheet loading by hiding page rendering\n if (!options.async) {\n css = 'body { display: none !important }';\n head = document.head || document.getElementsByTagName('head')[0];\n style = document.createElement('style');\n\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n\n head.appendChild(style);\n }\n less.registerStylesheetsImmediately();\n less.pageLoadFinished = less.refresh(less.env === 'development').then(resolveOrReject, resolveOrReject);\n}\n","// Export a new default each time\nexport default function() {\n return {\n /* Inline Javascript - @plugin still allowed */\n javascriptEnabled: false,\n\n /* Outputs a makefile import dependency list to stdout. */\n depends: false,\n\n /* (DEPRECATED) Compress using less built-in compression. \n * This does an okay job but does not utilise all the tricks of \n * dedicated css compression. */\n compress: false,\n\n /* Runs the less parser and just reports errors without any output. */\n lint: false,\n\n /* Sets available include paths.\n * If the file in an @import rule does not exist at that exact location, \n * less will look for it at the location(s) passed to this option. \n * You might use this for instance to specify a path to a library which \n * you want to be referenced simply and relatively in the less files. */\n paths: [],\n\n /* color output in the terminal */\n color: true,\n\n /* The strictImports controls whether the compiler will allow an @import inside of either \n * @media blocks or (a later addition) other selector blocks.\n * See: https://github.com/less/less.js/issues/656 */\n strictImports: false,\n\n /* Allow Imports from Insecure HTTPS Hosts */\n insecure: false,\n\n /* Allows you to add a path to every generated import and url in your css. \n * This does not affect less import statements that are processed, just ones \n * that are left in the output css. */\n rootpath: '',\n\n /* By default URLs are kept as-is, so if you import a file in a sub-directory \n * that references an image, exactly the same URL will be output in the css. \n * This option allows you to re-write URL's in imported files so that the \n * URL is always relative to the base imported file */\n rewriteUrls: false,\n\n /* How to process math \n * 0 always - eagerly try to solve all operations\n * 1 parens-division - require parens for division \"/\"\n * 2 parens | strict - require parens for all operations\n * 3 strict-legacy - legacy strict behavior (super-strict)\n */\n math: 1,\n\n /* Without this option, less attempts to guess at the output unit when it does maths. */\n strictUnits: false,\n\n /* Effectively the declaration is put at the top of your base Less file, \n * meaning it can be used but it also can be overridden if this variable \n * is defined in the file. */\n globalVars: null,\n\n /* As opposed to the global variable option, this puts the declaration at the\n * end of your base file, meaning it will override anything defined in your Less file. */\n modifyVars: null,\n\n /* This option allows you to specify a argument to go on to every URL. */\n urlArgs: ''\n }\n};","import {addDataAttr} from './utils';\nimport browser from './browser';\n\nexport default (window, options) => {\n\n // use options from the current script tag data attribues\n addDataAttr(options, browser.currentScript(window));\n\n if (options.isFileProtocol === undefined) {\n options.isFileProtocol = /^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(window.location.protocol);\n }\n\n // Load styles asynchronously (default: false)\n //\n // This is set to `false` by default, so that the body\n // doesn't start loading before the stylesheets are parsed.\n // Setting this to `true` can result in flickering.\n //\n options.async = options.async || false;\n options.fileAsync = options.fileAsync || false;\n\n // Interval between watch polls\n options.poll = options.poll || (options.isFileProtocol ? 1000 : 1500);\n\n options.env = options.env || (window.location.hostname == '127.0.0.1' ||\n window.location.hostname == '0.0.0.0' ||\n window.location.hostname == 'localhost' ||\n (window.location.port &&\n window.location.port.length > 0) ||\n options.isFileProtocol ? 'development'\n : 'production');\n\n const dumpLineNumbers = /!dumpLineNumbers:(comments|mediaquery|all)/.exec(window.location.hash);\n if (dumpLineNumbers) {\n options.dumpLineNumbers = dumpLineNumbers[1];\n }\n\n if (options.useFileCache === undefined) {\n options.useFileCache = true;\n }\n\n if (options.onReady === undefined) {\n options.onReady = true;\n }\n\n if (options.relativeUrls) {\n options.rewriteUrls = 'all';\n }\n};\n","//\n// index.js\n// Should expose the additional browser functions on to the less object\n//\nimport {addDataAttr} from './utils';\nimport lessRoot from '../less';\nimport browser from './browser';\nimport FM from './file-manager';\nimport PluginLoader from './plugin-loader';\nimport LogListener from './log-listener';\nimport ErrorReporting from './error-reporting';\nimport Cache from './cache';\nimport ImageSize from './image-size';\n\nexport default (window, options) => {\n const document = window.document;\n const less = lessRoot();\n\n less.options = options;\n const environment = less.environment;\n const FileManager = FM(options, less.logger);\n const fileManager = new FileManager();\n environment.addFileManager(fileManager);\n less.FileManager = FileManager;\n less.PluginLoader = PluginLoader;\n\n LogListener(less, options);\n const errors = ErrorReporting(window, less, options);\n const cache = less.cache = options.cache || Cache(window, options, less.logger);\n ImageSize(less.environment);\n\n // Setup user functions - Deprecate?\n if (options.functions) {\n less.functions.functionRegistry.addMultiple(options.functions);\n }\n\n const typePattern = /^text\\/(x-)?less$/;\n\n function clone(obj) {\n const cloned = {};\n for (const prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n cloned[prop] = obj[prop];\n }\n }\n return cloned;\n }\n\n // only really needed for phantom\n function bind(func, thisArg) {\n const curryArgs = Array.prototype.slice.call(arguments, 2);\n return function() {\n const args = curryArgs.concat(Array.prototype.slice.call(arguments, 0));\n return func.apply(thisArg, args);\n };\n }\n\n function loadStyles(modifyVars) {\n const styles = document.getElementsByTagName('style');\n let style;\n\n for (let i = 0; i < styles.length; i++) {\n style = styles[i];\n if (style.type.match(typePattern)) {\n const instanceOptions = clone(options);\n instanceOptions.modifyVars = modifyVars;\n const lessText = style.innerHTML || '';\n instanceOptions.filename = document.location.href.replace(/#.*$/, '');\n\n /* jshint loopfunc:true */\n // use closure to store current style\n less.render(lessText, instanceOptions,\n bind((style, e, result) => {\n if (e) {\n errors.add(e, 'inline');\n } else {\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = result.css;\n } else {\n style.innerHTML = result.css;\n }\n }\n }, null, style));\n }\n }\n }\n\n function loadStyleSheet(sheet, callback, reload, remaining, modifyVars) {\n\n const instanceOptions = clone(options);\n addDataAttr(instanceOptions, sheet);\n instanceOptions.mime = sheet.type;\n\n if (modifyVars) {\n instanceOptions.modifyVars = modifyVars;\n }\n\n function loadInitialFileCallback(loadedFile) {\n const data = loadedFile.contents;\n const path = loadedFile.filename;\n const webInfo = loadedFile.webInfo;\n\n const newFileInfo = {\n currentDirectory: fileManager.getPath(path),\n filename: path,\n rootFilename: path,\n rewriteUrls: instanceOptions.rewriteUrls\n };\n\n newFileInfo.entryPath = newFileInfo.currentDirectory;\n newFileInfo.rootpath = instanceOptions.rootpath || newFileInfo.currentDirectory;\n\n if (webInfo) {\n webInfo.remaining = remaining;\n\n const css = cache.getCSS(path, webInfo, instanceOptions.modifyVars);\n if (!reload && css) {\n webInfo.local = true;\n callback(null, css, data, sheet, webInfo, path);\n return;\n }\n\n }\n\n // TODO add tests around how this behaves when reloading\n errors.remove(path);\n\n instanceOptions.rootFileInfo = newFileInfo;\n less.render(data, instanceOptions, (e, result) => {\n if (e) {\n e.href = path;\n callback(e);\n } else {\n cache.setCSS(sheet.href, webInfo.lastModified, instanceOptions.modifyVars, result.css);\n callback(null, result.css, data, sheet, webInfo, path);\n }\n });\n }\n\n fileManager.loadFile(sheet.href, null, instanceOptions, environment)\n .then(loadedFile => {\n loadInitialFileCallback(loadedFile);\n }).catch(err => {\n console.log(err);\n callback(err);\n });\n\n }\n\n function loadStyleSheets(callback, reload, modifyVars) {\n for (let i = 0; i < less.sheets.length; i++) {\n loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1), modifyVars);\n }\n }\n\n function initRunningMode() {\n if (less.env === 'development') {\n less.watchTimer = setInterval(() => {\n if (less.watchMode) {\n fileManager.clearFileCache();\n loadStyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n } else if (css) {\n browser.createCSS(window.document, css, sheet);\n }\n });\n }\n }, options.poll);\n }\n }\n\n //\n // Watch mode\n //\n less.watch = function () {\n if (!less.watchMode ) {\n less.env = 'development';\n initRunningMode();\n }\n this.watchMode = true;\n return true;\n };\n\n less.unwatch = function () {clearInterval(less.watchTimer); this.watchMode = false; return false; };\n\n //\n // Synchronously get all tags with the 'rel' attribute set to\n // \"stylesheet/less\".\n //\n less.registerStylesheetsImmediately = () => {\n const links = document.getElementsByTagName('link');\n less.sheets = [];\n\n for (let i = 0; i < links.length; i++) {\n if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) &&\n (links[i].type.match(typePattern)))) {\n less.sheets.push(links[i]);\n }\n }\n };\n\n //\n // Asynchronously get all tags with the 'rel' attribute set to\n // \"stylesheet/less\", returning a Promise.\n //\n less.registerStylesheets = () => new Promise((resolve, reject) => {\n less.registerStylesheetsImmediately();\n resolve();\n });\n\n //\n // With this function, it's possible to alter variables and re-render\n // CSS without reloading less-files\n //\n less.modifyVars = record => less.refresh(true, record, false);\n\n less.refresh = (reload, modifyVars, clearFileCache) => {\n if ((reload || clearFileCache) && clearFileCache !== false) {\n fileManager.clearFileCache();\n }\n return new Promise((resolve, reject) => {\n let startTime;\n let endTime;\n let totalMilliseconds;\n let remainingSheets;\n startTime = endTime = new Date();\n\n // Set counter for remaining unprocessed sheets\n remainingSheets = less.sheets.length;\n\n if (remainingSheets === 0) {\n\n endTime = new Date();\n totalMilliseconds = endTime - startTime;\n less.logger.info('Less has finished and no sheets were loaded.');\n resolve({\n startTime,\n endTime,\n totalMilliseconds,\n sheets: less.sheets.length\n });\n\n } else {\n // Relies on less.sheets array, callback seems to be guaranteed to be called for every element of the array\n loadStyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n reject(e);\n return;\n }\n if (webInfo.local) {\n less.logger.info(`Loading ${sheet.href} from cache.`);\n } else {\n less.logger.info(`Rendered ${sheet.href} successfully.`);\n }\n browser.createCSS(window.document, css, sheet);\n less.logger.info(`CSS for ${sheet.href} generated in ${new Date() - endTime}ms`);\n\n // Count completed sheet\n remainingSheets--;\n\n // Check if the last remaining sheet was processed and then call the promise\n if (remainingSheets === 0) {\n totalMilliseconds = new Date() - startTime;\n less.logger.info(`Less has finished. CSS generated in ${totalMilliseconds}ms`);\n resolve({\n startTime,\n endTime,\n totalMilliseconds,\n sheets: less.sheets.length\n });\n }\n endTime = new Date();\n }, reload, modifyVars);\n }\n\n loadStyles(modifyVars);\n });\n };\n\n less.refreshStyles = loadStyles;\n return less;\n};\n","export default (less, options) => {\n const logLevel_debug = 4;\n const logLevel_info = 3;\n const logLevel_warn = 2;\n const logLevel_error = 1;\n\n // The amount of logging in the javascript console.\n // 3 - Debug, information and errors\n // 2 - Information and errors\n // 1 - Errors\n // 0 - None\n // Defaults to 2\n options.logLevel = typeof options.logLevel !== 'undefined' ? options.logLevel : (options.env === 'development' ? logLevel_info : logLevel_error);\n\n if (!options.loggers) {\n options.loggers = [{\n debug: function(msg) {\n if (options.logLevel >= logLevel_debug) {\n console.log(msg);\n }\n },\n info: function(msg) {\n if (options.logLevel >= logLevel_info) {\n console.log(msg);\n }\n },\n warn: function(msg) {\n if (options.logLevel >= logLevel_warn) {\n console.warn(msg);\n }\n },\n error: function(msg) {\n if (options.logLevel >= logLevel_error) {\n console.error(msg);\n }\n }\n }];\n }\n for (let i = 0; i < options.loggers.length; i++) {\n less.logger.addListener(options.loggers[i]);\n }\n};\n","// Cache system is a bit outdated and could do with work\n\nexport default (window, options, logger) => {\n let cache = null;\n if (options.env !== 'development') {\n try {\n cache = (typeof window.localStorage === 'undefined') ? null : window.localStorage;\n } catch (_) {}\n }\n return {\n setCSS: function(path, lastModified, modifyVars, styles) {\n if (cache) {\n logger.info(`saving ${path} to cache.`);\n try {\n cache.setItem(path, styles);\n cache.setItem(`${path}:timestamp`, lastModified);\n if (modifyVars) {\n cache.setItem(`${path}:vars`, JSON.stringify(modifyVars));\n }\n } catch (e) {\n // TODO - could do with adding more robust error handling\n logger.error(`failed to save \"${path}\" to local storage for caching.`);\n }\n }\n },\n getCSS: function(path, webInfo, modifyVars) {\n const css = cache && cache.getItem(path);\n const timestamp = cache && cache.getItem(`${path}:timestamp`);\n let vars = cache && cache.getItem(`${path}:vars`);\n\n modifyVars = modifyVars || {};\n vars = vars || \"{}\"; // if not set, treat as the JSON representation of an empty object\n\n if (timestamp && webInfo.lastModified &&\n (new Date(webInfo.lastModified).valueOf() ===\n new Date(timestamp).valueOf()) &&\n JSON.stringify(modifyVars) === vars) {\n // Use local copy\n return css;\n }\n }\n };\n};\n","\nimport functionRegistry from './../less/functions/function-registry';\n\nexport default () => {\n function imageSize() {\n throw {\n type: 'Runtime',\n message: 'Image size functions are not supported in browser version of less'\n };\n }\n\n const imageFunctions = {\n 'image-size': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n },\n 'image-width': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n },\n 'image-height': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n }\n };\n\n functionRegistry.addMultiple(imageFunctions);\n};\n"],"names":["extractId","href","replace","addDataAttr","options","tag","opt","dataset","hasOwnProperty","JSON","parse","_","document","styles","sheet","id","title","utils.extractId","oldStyleNode","getElementById","keepOldStyleNode","styleNode","createElement","setAttribute","media","styleSheet","appendChild","createTextNode","childNodes","length","firstChild","nodeValue","head","getElementsByTagName","nextEl","nextSibling","parentNode","insertBefore","removeChild","cssText","e","Error","window","scripts","currentScript","error","msg","this","_fireEvent","warn","info","debug","addListener","listener","_listeners","push","removeListener","i","splice","type","logFunction","externalEnvironment","fileManagers","requiredFunctions","functions","concat","propName","environmentFunc","bind","Environment","filename","currentDirectory","environment","isSync","logger","pluginManager","getFileManagers","fileManager","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","darkgrey","darkgreen","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","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","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","m","cm","mm","in","px","pt","pc","duration","s","ms","angle","rad","Math","PI","deg","grad","turn","colors","unitConversions","parent","visibilityBlocks","undefined","nodeVisible","rootNode","parsed","self","Object","defineProperty","get","fileInfo","getIndex","Node","nodes","set","node","Array","isArray","forEach","_index","_fileInfo","context","strs","genCSS","add","chunk","index","isEmpty","join","output","value","visitor","visit","op","a","b","precision","numPrecision","Number","toFixed","compare","extendStatics","d","setPrototypeOf","__proto__","p","__extends","__","constructor","prototype","create","__assign","assign","t","n","arguments","call","apply","rgb","originalForm","_super","_this","match","map","c","parseInt","alpha","split","Color","r","g","pow","toCSS","doNotCompress","color","colorFunction","compress","args","fround","indexOf","clamp","round","toHSL","h","l","toRGB","splitcolor","other","_operate","toHex","max","min","v","x","keyword","key","toLowerCase","slice","toString","Paren","eval","_noSpaceCombinators"," ","|","emptyOrWhitespace","trim","Combinator","spaceOrEmpty","combinator","isVariable","currentFileInfo","visibilityInfo","copyVisibilityInfo","setParent","Element","firstSelector","charAt","ALWAYS","PARENS_DIVISION","PARENS","RewriteUrls","getLocation","inputStream","line","column","copyArray","arr","copy","clone","obj","cloned","prop","defaults","obj1","obj2","newObj","_defaults","defaults_1","copyOptions","opts","strictMath","math","Constants.Math","relativeUrls","rewriteUrls","Constants.RewriteUrls","flattenArray","result","length_1","anonymousFunc","LessError","fileContentMap","currentFilename","message","stack","input","contents","loc","utils.getLocation","col","callLine","lines","found","func","Function","lineAdjust","callExtract","extract","F","stylize","str","errorTxt","substr","elements","extendList","condition","evaldCondition","getElements","mixinElements_","Selector","visitArray","newSelector","mediaEmpty","els","parseNode","err","imports","sels","olen","len","mixinElements","shift","extend","createDerived","Value","Keyword","True","False","mapLines","rulesetLike","allowRoot","Anonymous","Boolean","MATH","name","important","merge","inline","variable","Declaration","lastRule","prevMath","evaldValue","mathBypass","evalName","importantScope","importantResult","pop","ctx","lineSeparator","dumpLineNumbers","debugInfo","asComment","asMediaQuery","lineNumber","fileName","filenameWithProtocol","test","isLineComment","Comment","getDebugInfo","isCompressed","contexts","copyFromOriginal","original","destination","propertiesToCopy","parseCopyProperties","Parse","paths","evalCopyProperties","isPathRelative","path","isPathLocalRelative","Eval","frames","enterCalc","calcStack","inCalc","exitCalc","inParenthesis","parensStack","outOfParenthesis","mathOn","isMathOn","pathRequiresRewrite","rewritePath","rootpath","newPath","normalizePath","segment","segments","reverse","makeRegistry","base","_data","addMultiple","keys","getLocalFunctions","inherit","defaultFunc","value_","error_","reset","selectors","rules","strictImports","_lookups","_variables","_properties","Ruleset","selCnt","selector","hasVariable","hasOnePassingSelector","j","toParseSelectors","utils.flattenArray","rule","subRule","utils.copyArray","ruleset","originalRuleset","root","firstRoot","allowImports","functionRegistry","globalFunctionRegistry","ctxFrames","unshift","ctxSelectors","evalImports","rsRules","evalFirst","mediaBlockCount","mediaBlocks","filter","resetCache","isJustParentSelector","bubbleSelectors","importRules","makeImportant","lastSelector","_rulesets","reduce","hash","variables","vars","name_1","name_2","decl","parseValue","properties","toParse","transformDeclaration","nodes_1","filtRules","isRuleset","foundMixins","rulesets","find","ruleNodes","tabLevel","sep","tabRuleStr","tabSetStr","charsetNodeIndex","importNodeIndex","isCharset","pathCnt","pathSubCnt","currentLastRule","isRulesetLike","isVisible","joinSelector","createParenthesis","elementsToPak","originalElement","replacementParen","insideParent","createSelector","containedElement","element","addReplacementIntoPath","beginningPath","addPath","replacedElement","originalSelector","newSelectorPath","newJoinedSelector","parentEl","restOfPath","addAllReplacementsIntoPath","addPaths","mergeElementsOnToSelectors","sel","deriveSelector","deriveFrom","newPaths","replaceParentSelector","inSelector","k","currentElements","newSelectors","selectorsMultiplied","el","maybeSelector","hadParentSelector","nestedSelector","replaced","nestedPaths","replacedNewSelectors","concatenated","isRooted","createEmptySelectors","AtRule","outputRuleset","mediaPathBackup","mediaBlocksBackup","mediaPath","ruleCnt","DetachedRuleset","numerator","denominator","backupUnit","sort","Unit","strictUnits","returnStr","is","unitString","toUpperCase","RegExp","callback","group","mapUnit","groupName","atomicUnit","counter","count","unit","parseFloat","isNaN","Dimension","isSingular","strValue","String","isLength","convertTo","usedUnits","cancel","unify","numericCompare","conversions","targetUnit","applyUnit","derivedConversions","operands","isSpaced","Operation","toColor","operate","noSpacing","Expression","returnValue","parens","doubleParen","parensInOp","functionCaller","evalArgs","commentFilter","item","subNodes","il","jl","calc","Call","currentMathContext","funcCaller","FunctionCaller","isValid","columnNumber","Variable","evaluating","frame","fun","Property","property","mergeRules","less","visitors","ToCSSVisitor","_mergeRules","vArr","Attribute","content","escaped","quote","variableRegex","propRegex","Quoted","that","iterativeReplace","regexp","replacementFnc","evaluatedValue","val","isEvald","URL","urlArgs","features","Media","evalTop","evalNested","multiMedia","permute","fragment","rest","css","pathValue","getPath","Import","isPlugin","reference","containsVariables","doEval","blocksVisibility","addVisibilityBlock","registry","skip","importedFilename","newImport","evalPath","string","expression","JavaScript","evaluateJavaScript","JsEvalNode","evalContext","javascriptEnabled","jsify","toJS","Assignment","negate","lvalue","rvalue","Condition","UnicodeDescriptor","Negative","option","object_id","Extend","next_id","parent_ids","allowBefore","allowAfter","selectorElements","selfElements","selfSelectors","VariableCall","detachedRuleset","callEval","ruleCall","lookups","NamespaceValue","lastDeclaration","substring","params","variadic","arity","optionalParameters","required","Definition","mixinEnv","evaldArguments","varargs","arg","isNamedFound","argIndex","argsLength","prependRule","_arguments","mixinFrames","evalParams","allArgsCnt","requiredArgsCnt","MixinCall","mixins","mixin","mixinPath","argValue","f","isRecursive","isOneFound","candidate","defaultResult","noArgumentsFilter","candidates","conditionResult","calcDefGroup","namespace","matchCondition","expand","matchArgs","MixinDefinition","format","newRules","evalCall","_setVisibilityToReplacement","replacement","AbstractFileManager","lastIndexOf","ext","tryAppendExtension","basePath","laterPath","url","baseUrl","urlDirectories","baseUrlDirectories","urlParts","extractUrlParts","baseUrlParts","diff","hostPart","directories","urlPartsRegex","returner","rawDirectories","rawPath","fileUrl","require","AbstractPluginLoader","pluginOptions","pluginObj","localModule","shortname","FileManager","trySetOptions","use","exports","loader","tree","validatePlugin","minVersion","compareVersion","addPlugin","plugin","setOptions","version","versionToString","aVersion","bVersion","versionString","plugins","printUsage","_visitArgs","visitDeeper","_hasIndexed","_noop","implementation","_implementation","_visitInCache","_visitOutCache","indexNodeTypes","ticker","child","typeIndex","Visitor","nodeTypeIndex","fnName","impl","funcOut","visitArgs","newNode","isReplacing","cnt","accept","nonReplacing","out","evald","flatten","nestedCnt","nestedItem","onSequencerEmpty","variableImports","_onSequencerEmpty","_currentDepth","ImportSequencer","importSequencer","importItem","isReady","tryRun","variableImport","ImportVisitor","importer","finish","_visitor","_importer","_finish","importCount","onceFileDetectionMap","recursionDetector","_sequencer","run","isFinished","visitImport","importNode","inlineCSS","importParent","isVariableImport","addVariableImport","processImportNode","evaldImportNode","evalForImport","multiple","importMultiple","tryAppendLessExtension","onImported","sequencedOnImported","addImport","importedAtRoot","fullPath","importVisitor","isOptional","optional","duplicateImport","oldContext","visitDeclaration","declNode","visitDeclarationOut","visitAtRule","atRuleNode","visitAtRuleOut","visitMixinDefinition","mixinDefinitionNode","visitMixinDefinitionOut","visitRuleset","rulesetNode","visitRulesetOut","visitMedia","mediaNode","visitMediaOut","visible","SetTreeVisibilityVisitor","ensureVisibility","ensureInvisibility","allExtendsStack","ExtendFinderVisitor","allExtends","allSelectorsExtendList","extendOnEveryPath","selectorPath","selExtendList","allSelectorsExtend","foundExtends","findSelfSelectors","firstExtendOnThisSelectorPath","ProcessExtendsVisitor","extendFinder","extendIndices","doExtendChaining","newRoot","checkExtendsForNonMatched","indices","hasFoundMatches","extendsList","extendsListTarget","iterationCount","extendIndex","targetExtendIndex","matches","targetExtend","newExtend","extendsToAdd","extendVisitor","findMatch","selfSelector","extendSelector","extendChainCount","selectorOne","selectorTwo","ruleNode","selectorNode","pathIndex","selectorsToAdd","extendedSelectors","haystackSelectorPath","haystackSelectorIndex","hackstackSelector","hackstackElementIndex","haystackElement","targetCombinator","potentialMatch","needleElements","potentialMatches","matched","initialCombinator","isElementValuesEqual","finished","endPathIndex","endPathElementIndex","elementValue1","elementValue2","replacementSelector","matchIndex","firstElement","newElements","currentSelectorPathIndex","currentSelectorPathElementIndex","currentValue","derived","newAllExtends","lastIndex","JoinSelectorVisitor","getIsOutput","joinSelectors","_context","CSSVisitorUtils","bodyRules","isSilent","owner","thing","originalRules","containsSilentNonBlockedChild","compiledRulesBody","keepOnlyVisibleChilds","removeVisibilityBlock","hasVisibleSelector","utils","mixinNode","visitExtend","extendNode","visitComment","commentNode","resolveVisibility","visitAtRuleWithBody","visitAtRuleWithoutBody","visitAnonymous","anonymousNode","nodeRules","hasFakeRuleset","getBodyRules","charset","comment","checkValidNodes","isRoot","_compileRulesetPaths","nodeRuleCnt","_removeDuplicateRules","isVisibleRuleset","ruleList","ruleCache","ruleCSS","groups","groupsArr","result_1","space_1","comma_1","MarkVisibleSelectorsVisitor","ExtendVisitor","furthest","furthestPossibleErrorMessage","chunks","current","currentPos","saveStack","parserInput","skipWhitespace","nextChar","oldi","oldj","curr","endIndex","mem","inp","charCodeAt","autoCommentAbsorb","nextNewLine","text","commentStore","nextStarSlash","save","restore","possibleErrorMessage","state","forget","isWhitespace","offset","pos","code","$re","tok","exec","$char","$str","tokLength","$quoted","startChar","currentPosition","$parseUntil","testChar","returnVal","inComment","blockDepth","blockStack","parseGroups","startPos","lastPos","loop","char","expected","peek","peekChar","currentChar","prevChar","getInput","peekNotNumeric","start","chunkInput","failFunction","fail","lastOpening","lastOpeningParen","lastMultiComment","lastMultiCommentEndBrace","chunkerCurrentIndex","currentChunkStartIndex","cc","cc2","level","parenLevel","emitFrom","emitChunk","force","fromCharCode","chunker","end","furthestReachedEnd","furthestChar","Parser","parsers","getParserInput","expect","expectChar","parseList","currentIndex","returnNodes","parser","additionalData","globalVars","modifyVars","ignored","preText","serializeVars","preProcessors","getPreProcessors","process","banner","contentsIgnoredChars","primary","endInfo","processImports","extendRule","definition","declaration","variableCall","entities","atrule","foundSemiColon","mixinLookup","quoted","forceEscaped","isEscaped","fromKeyword","customFuncCall","stop","ieAlpha","boolean","if","prevArgs","isSemiColonSeparated","argsComma","argsSemiColon","assignment","literal","dimension","unicodeDescriptor","entity","ch","variableCurly","curly","propertyCurly","colorKeyword","ud","javascript","js","escape","parsedName","inValue","ruleLookups","isRule","getLookup","hasParens","elem","elemIndex","re","isCall","expressionContainsNamed","nameLoop","expressions","hasSep","throwAwayComments","cond","argInfo","conditions","block","lookupValue","attribute","slashedCombinator","isLess","when","blockRuleset","hasDR","ruleProperty","permissiveValue","anonymousValue","untilTokens","done","testCurrentChar","import","dir","importOptions","mediaFeatures","o","optionName","importOption","mediaFeature","pluginArgs","nonVendorSpecificName","hasIdentifier","hasExpression","hasUnknown","hasBlock","sub","addition","multiplication","operation","operand","needsParens","logical","next","conditionAnd","negatedCondition","parenthesisCondition","atomicCondition","body","me","tryConditionFollowedByParenthesis","delim","simpleProperty","If","trueValue","falseValue","colorFunctions","hsla","origColor","hsl","toHSV","number","rgba","size","m1_1","m2_1","hue","hsv","hsva","vs","floor","perm","saturation","lightness","hsvhue","hsvsaturation","hsvvalue","luma","luminance","saturate","amount","method","desaturate","lighten","darken","fadein","fadeout","fade","spin","mix","color1","color2","weight","w","w1","w2","greyscale","contrast","dark","light","threshold","argb","toARGB","tint","shade","colorBlend","mode","cb","cs","ar","cr","ab","as","colorBlendModeFunctions","multiply","screen","overlay","softlight","sqrt","hardlight","difference","abs","exclusion","average","negation","getItemsFromNode","_SELF","~","_i","expr","values","range","step","from","to","stepValue","list","each","rs","iterator","tryEval","Quote","valueName","keyName","indexName","MathHelper","fn","mathFunctions","ceil","sin","cos","atan","asin","acos","mathHelper","fraction","num","minMax","isMin","currentUnified","referenceUnified","unitStatic","unitClone","order","convert","pi","mod","y","percentage","evaluated","encodeURI","pattern","flags","%","token","encodeURIComponent","isa","Type","isunit","isruleset","iscolor","isnumber","isstring","iskeyword","isurl","ispixel","ispercentage","isem","get-unit","colorBlending","fallback","functionThis","data-uri","mimetypeNode","filePathNode","mimetype","filePath","entryPath","fragmentStart","utils.clone","rawBuffer","getFileManager","useBase64","mimeLookup","charsetLookup","fileSync","loadFileSync","buf","encodeBase64","uri","dataUri","svg-gradient","direction","stops","gradientDirectionSvg","position","positionValue","gradientType","rectangleDimension","renderEnv","directionValue","throwArgumentDescriptor","types","evaldRoot","evalEnv","visitorIterator","preEvalVisitors","first","isPreEvalVisitor","isPreVisitor","pm","postProcessors","installedPlugins","pluginCache","Loader","PluginLoader","PluginManager","install","preProcessor","priority","indexToInsertAt","postProcessor","manager","PluginManagerFactory","newFactory","sourceMapOutput","sourceMapBuilder","parseTree","importManager","SourceMapBuilder","ParseTree","transformTree","toCSSOptions","sourceMap","getPostProcessors","file","getExternalSourceMap","files","rootFilename","SourceMapOutput","contentsIgnoredCharsMap","contentsMap","sourceMapFilename","sourceMapURL","outputFilename","sourceMapOutputFilename","sourceMapBasepath","sourceMapRootpath","outputSourceFiles","sourceMapGenerator","sourceMapFileInline","disableSourcemapAnnotation","sourceMapInputFilename","normalizeFilename","removeBasepath","getCSSAppendage","_css","_rootNode","_contentsMap","_contentsIgnoredCharsMap","_sourceMapFilename","_outputFilename","_sourceMapBasepath","_sourceMapRootpath","_outputSourceFiles","_sourceMapGeneratorConstructor","getSourceMapGenerator","_lineNumber","_column","sourceLines","columns","sourceColumns","inputSource","_sourceMapGenerator","addMapping","generated","source","sourceRoot","setSourceContent","sourceMapContent","stringify","toJSON","rootFileInfo","mime","queue","ImportManager","pluginLoader","fileParsedFunc","importedEqualsRoot","newFileInfo","loadedFile","promise","loadFileCallback","resolvedFilename","pathDiff","isPathAbsolute","alwaysMakePathsAbsolute","newEnv","evalPlugin","syncImport","loadPluginSync","loadPlugin","loadFile","then","render","utils.copyOptions","self_1","Promise","resolve","reject","Render","context_1","pluginManager_1","reUsePluginManager","imports_1","evalResult","fileContent","initial","data","ctor","api","fileCache","errback","xhr","XMLHttpRequest","async","isFileProtocol","fileAsync","handleResponse","status","responseText","getResponseHeader","overrideMimeType","open","setRequestHeader","send","onreadystatechange","readyState","location","useFileCache","lessText","webInfo","lastModified","Date","doXHR","log","fulfill","catch","rootHref","errorReporting","errors","errorline","classname","logLevel","errorConsole","timer","filenameNoPath","className","innerHTML","browser","style","env","setInterval","replaceChild","clearInterval","errorHTML","remove","removeErrorHTML","depends","lint","insecure","protocol","poll","hostname","port","onReady","addDefaultOptions","LESS_PLUGINS","lessRoot","FM","addFileManager","loggers","console","LogListener","ErrorReporting","cache","localStorage","setCSS","setItem","getCSS","getItem","timestamp","valueOf","Cache","imageSize","imageFunctions","image-size","image-width","image-height","ImageSize","typePattern","thisArg","curryArgs","loadStyles","instanceOptions","loadStyleSheet","reload","remaining","local","loadInitialFileCallback","loadStyleSheets","sheets","watch","watchMode","watchTimer","clearFileCache","unwatch","registerStylesheetsImmediately","links","rel","registerStylesheets","record","refresh","startTime","endTime","totalMilliseconds","remainingSheets","refreshStyles","resolveOrReject","pageLoadFinished"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"less.min.js","sources":["../src/less-browser/utils.js","../src/less-browser/browser.js","../src/less/logger.js","../src/less/environment/environment.js","../src/less/data/colors.js","../src/less/data/unit-conversions.js","../src/less/data/index.js","../src/less/tree/node.js","../node_modules/tslib/tslib.es6.js","../src/less/tree/color.js","../src/less/tree/paren.js","../src/less/tree/combinator.js","../src/less/tree/element.js","../src/less/constants.js","../src/less/utils.js","../src/less/less-error.js","../src/less/tree/selector.js","../src/less/tree/value.js","../src/less/tree/keyword.js","../src/less/tree/anonymous.js","../src/less/tree/declaration.js","../src/less/tree/debug-info.js","../src/less/tree/comment.js","../src/less/contexts.js","../src/less/functions/function-registry.js","../src/less/functions/default.js","../src/less/tree/ruleset.js","../src/less/tree/atrule.js","../src/less/tree/detached-ruleset.js","../src/less/tree/unit.js","../src/less/tree/dimension.js","../src/less/tree/operation.js","../src/less/tree/expression.js","../src/less/functions/function-caller.js","../src/less/tree/call.js","../src/less/tree/variable.js","../src/less/tree/property.js","../src/less/tree/attribute.js","../src/less/tree/quoted.js","../src/less/tree/url.js","../src/less/tree/media.js","../src/less/tree/import.js","../src/less/tree/js-eval-node.js","../src/less/tree/javascript.js","../src/less/tree/assignment.js","../src/less/tree/condition.js","../src/less/tree/unicode-descriptor.js","../src/less/tree/negative.js","../src/less/tree/extend.js","../src/less/tree/variable-call.js","../src/less/tree/namespace-value.js","../src/less/tree/mixin-definition.js","../src/less/tree/mixin-call.js","../src/less/tree/index.js","../src/less/environment/abstract-file-manager.js","../src/less/environment/abstract-plugin-loader.js","../src/less/visitors/visitor.js","../src/less/visitors/import-sequencer.js","../src/less/visitors/import-visitor.js","../src/less/visitors/set-tree-visibility-visitor.js","../src/less/visitors/extend-visitor.js","../src/less/visitors/join-selector-visitor.js","../src/less/visitors/to-css-visitor.js","../src/less/visitors/index.js","../src/less/parser/parser-input.js","../src/less/parser/chunker.js","../src/less/parser/parser.js","../src/less/functions/boolean.js","../src/less/functions/color.js","../src/less/functions/color-blending.js","../src/less/functions/list.js","../src/less/functions/math-helper.js","../src/less/functions/math.js","../src/less/functions/number.js","../src/less/functions/string.js","../src/less/functions/types.js","../src/less/functions/index.js","../src/less/functions/data-uri.js","../src/less/functions/svg.js","../src/less/transform-tree.js","../src/less/plugin-manager.js","../src/less-browser/file-manager.js","../src/less/index.js","../src/less/parse-tree.js","../src/less/source-map-builder.js","../src/less/source-map-output.js","../src/less/import-manager.js","../src/less/render.js","../src/less/parse.js","../src/less-browser/plugin-loader.js","../src/less-browser/error-reporting.js","../src/less-browser/bootstrap.js","../src/less/default-options.js","../src/less-browser/add-default-options.js","../src/less-browser/index.js","../src/less-browser/log-listener.js","../src/less-browser/cache.js","../src/less-browser/image-size.js"],"sourcesContent":["\nexport function extractId(href) {\n return href.replace(/^[a-z-]+:\\/+?[^\\/]+/, '') // Remove protocol & domain\n .replace(/[\\?\\&]livereload=\\w+/, '') // Remove LiveReload cachebuster\n .replace(/^\\//, '') // Remove root /\n .replace(/\\.[a-zA-Z]+$/, '') // Remove simple extension\n .replace(/[^\\.\\w-]+/g, '-') // Replace illegal characters\n .replace(/\\./g, ':'); // Replace dots with colons(for valid id)\n}\n\nexport function addDataAttr(options, tag) {\n for (const opt in tag.dataset) {\n if (tag.dataset.hasOwnProperty(opt)) {\n if (opt === 'env' || opt === 'dumpLineNumbers' || opt === 'rootpath' || opt === 'errorReporting') {\n options[opt] = tag.dataset[opt];\n } else {\n try {\n options[opt] = JSON.parse(tag.dataset[opt]);\n }\n catch (_) {}\n }\n }\n }\n}\n","import * as utils from './utils';\n\nexport default {\n createCSS: function (document, styles, sheet) {\n // Strip the query-string\n const href = sheet.href || '';\n\n // If there is no title set, use the filename, minus the extension\n const id = `less:${sheet.title || utils.extractId(href)}`;\n\n // If this has already been inserted into the DOM, we may need to replace it\n const oldStyleNode = document.getElementById(id);\n let keepOldStyleNode = false;\n\n // Create a new stylesheet node for insertion or (if necessary) replacement\n const styleNode = document.createElement('style');\n styleNode.setAttribute('type', 'text/css');\n if (sheet.media) {\n styleNode.setAttribute('media', sheet.media);\n }\n styleNode.id = id;\n\n if (!styleNode.styleSheet) {\n styleNode.appendChild(document.createTextNode(styles));\n\n // If new contents match contents of oldStyleNode, don't replace oldStyleNode\n keepOldStyleNode = (oldStyleNode !== null && oldStyleNode.childNodes.length > 0 && styleNode.childNodes.length > 0 &&\n oldStyleNode.firstChild.nodeValue === styleNode.firstChild.nodeValue);\n }\n\n const head = document.getElementsByTagName('head')[0];\n\n // If there is no oldStyleNode, just append; otherwise, only append if we need\n // to replace oldStyleNode with an updated stylesheet\n if (oldStyleNode === null || keepOldStyleNode === false) {\n const nextEl = sheet && sheet.nextSibling || null;\n if (nextEl) {\n nextEl.parentNode.insertBefore(styleNode, nextEl);\n } else {\n head.appendChild(styleNode);\n }\n }\n if (oldStyleNode && keepOldStyleNode === false) {\n oldStyleNode.parentNode.removeChild(oldStyleNode);\n }\n\n // For IE.\n // This needs to happen *after* the style element is added to the DOM, otherwise IE 7 and 8 may crash.\n // See http://social.msdn.microsoft.com/Forums/en-US/7e081b65-878a-4c22-8e68-c10d39c2ed32/internet-explorer-crashes-appending-style-element-to-head\n if (styleNode.styleSheet) {\n try {\n styleNode.styleSheet.cssText = styles;\n } catch (e) {\n throw new Error('Couldn\\'t reassign styleSheet.cssText.');\n }\n }\n },\n currentScript: function(window) {\n const document = window.document;\n return document.currentScript || (() => {\n const scripts = document.getElementsByTagName('script');\n return scripts[scripts.length - 1];\n })();\n }\n};\n","export default {\n error: function(msg) {\n this._fireEvent('error', msg);\n },\n warn: function(msg) {\n this._fireEvent('warn', msg);\n },\n info: function(msg) {\n this._fireEvent('info', msg);\n },\n debug: function(msg) {\n this._fireEvent('debug', msg);\n },\n addListener: function(listener) {\n this._listeners.push(listener);\n },\n removeListener: function(listener) {\n for (let i = 0; i < this._listeners.length; i++) {\n if (this._listeners[i] === listener) {\n this._listeners.splice(i, 1);\n return;\n }\n }\n },\n _fireEvent: function(type, msg) {\n for (let i = 0; i < this._listeners.length; i++) {\n const logFunction = this._listeners[i][type];\n if (logFunction) {\n logFunction(msg);\n }\n }\n },\n _listeners: []\n};\n","/**\n * @todo Document why this abstraction exists, and the relationship between\n * environment, file managers, and plugin manager\n */\n\nimport logger from '../logger';\n\nclass Environment {\n constructor(externalEnvironment, fileManagers) {\n this.fileManagers = fileManagers || [];\n externalEnvironment = externalEnvironment || {};\n\n const optionalFunctions = ['encodeBase64', 'mimeLookup', 'charsetLookup', 'getSourceMapGenerator'];\n const requiredFunctions = [];\n const functions = requiredFunctions.concat(optionalFunctions);\n\n for (let i = 0; i < functions.length; i++) {\n const propName = functions[i];\n const environmentFunc = externalEnvironment[propName];\n if (environmentFunc) {\n this[propName] = environmentFunc.bind(externalEnvironment);\n } else if (i < requiredFunctions.length) {\n this.warn(`missing required function in environment - ${propName}`);\n }\n }\n }\n\n getFileManager(filename, currentDirectory, options, environment, isSync) {\n\n if (!filename) {\n logger.warn('getFileManager called with no filename.. Please report this issue. continuing.');\n }\n if (currentDirectory == null) {\n logger.warn('getFileManager called with null directory.. Please report this issue. continuing.');\n }\n\n let fileManagers = this.fileManagers;\n if (options.pluginManager) {\n fileManagers = [].concat(fileManagers).concat(options.pluginManager.getFileManagers());\n }\n for (let i = fileManagers.length - 1; i >= 0 ; i--) {\n const fileManager = fileManagers[i];\n if (fileManager[isSync ? 'supportsSync' : 'supports'](filename, currentDirectory, options, environment)) {\n return fileManager;\n }\n }\n return null;\n }\n\n addFileManager(fileManager) {\n this.fileManagers.push(fileManager);\n }\n\n clearFileManagers() {\n this.fileManagers = [];\n }\n}\n\nexport default Environment;\n","export default {\n 'aliceblue':'#f0f8ff',\n 'antiquewhite':'#faebd7',\n 'aqua':'#00ffff',\n 'aquamarine':'#7fffd4',\n 'azure':'#f0ffff',\n 'beige':'#f5f5dc',\n 'bisque':'#ffe4c4',\n 'black':'#000000',\n 'blanchedalmond':'#ffebcd',\n 'blue':'#0000ff',\n 'blueviolet':'#8a2be2',\n 'brown':'#a52a2a',\n 'burlywood':'#deb887',\n 'cadetblue':'#5f9ea0',\n 'chartreuse':'#7fff00',\n 'chocolate':'#d2691e',\n 'coral':'#ff7f50',\n 'cornflowerblue':'#6495ed',\n 'cornsilk':'#fff8dc',\n 'crimson':'#dc143c',\n 'cyan':'#00ffff',\n 'darkblue':'#00008b',\n 'darkcyan':'#008b8b',\n 'darkgoldenrod':'#b8860b',\n 'darkgray':'#a9a9a9',\n 'darkgrey':'#a9a9a9',\n 'darkgreen':'#006400',\n 'darkkhaki':'#bdb76b',\n 'darkmagenta':'#8b008b',\n 'darkolivegreen':'#556b2f',\n 'darkorange':'#ff8c00',\n 'darkorchid':'#9932cc',\n 'darkred':'#8b0000',\n 'darksalmon':'#e9967a',\n 'darkseagreen':'#8fbc8f',\n 'darkslateblue':'#483d8b',\n 'darkslategray':'#2f4f4f',\n 'darkslategrey':'#2f4f4f',\n 'darkturquoise':'#00ced1',\n 'darkviolet':'#9400d3',\n 'deeppink':'#ff1493',\n 'deepskyblue':'#00bfff',\n 'dimgray':'#696969',\n 'dimgrey':'#696969',\n 'dodgerblue':'#1e90ff',\n 'firebrick':'#b22222',\n 'floralwhite':'#fffaf0',\n 'forestgreen':'#228b22',\n 'fuchsia':'#ff00ff',\n 'gainsboro':'#dcdcdc',\n 'ghostwhite':'#f8f8ff',\n 'gold':'#ffd700',\n 'goldenrod':'#daa520',\n 'gray':'#808080',\n 'grey':'#808080',\n 'green':'#008000',\n 'greenyellow':'#adff2f',\n 'honeydew':'#f0fff0',\n 'hotpink':'#ff69b4',\n 'indianred':'#cd5c5c',\n 'indigo':'#4b0082',\n 'ivory':'#fffff0',\n 'khaki':'#f0e68c',\n 'lavender':'#e6e6fa',\n 'lavenderblush':'#fff0f5',\n 'lawngreen':'#7cfc00',\n 'lemonchiffon':'#fffacd',\n 'lightblue':'#add8e6',\n 'lightcoral':'#f08080',\n 'lightcyan':'#e0ffff',\n 'lightgoldenrodyellow':'#fafad2',\n 'lightgray':'#d3d3d3',\n 'lightgrey':'#d3d3d3',\n 'lightgreen':'#90ee90',\n 'lightpink':'#ffb6c1',\n 'lightsalmon':'#ffa07a',\n 'lightseagreen':'#20b2aa',\n 'lightskyblue':'#87cefa',\n 'lightslategray':'#778899',\n 'lightslategrey':'#778899',\n 'lightsteelblue':'#b0c4de',\n 'lightyellow':'#ffffe0',\n 'lime':'#00ff00',\n 'limegreen':'#32cd32',\n 'linen':'#faf0e6',\n 'magenta':'#ff00ff',\n 'maroon':'#800000',\n 'mediumaquamarine':'#66cdaa',\n 'mediumblue':'#0000cd',\n 'mediumorchid':'#ba55d3',\n 'mediumpurple':'#9370d8',\n 'mediumseagreen':'#3cb371',\n 'mediumslateblue':'#7b68ee',\n 'mediumspringgreen':'#00fa9a',\n 'mediumturquoise':'#48d1cc',\n 'mediumvioletred':'#c71585',\n 'midnightblue':'#191970',\n 'mintcream':'#f5fffa',\n 'mistyrose':'#ffe4e1',\n 'moccasin':'#ffe4b5',\n 'navajowhite':'#ffdead',\n 'navy':'#000080',\n 'oldlace':'#fdf5e6',\n 'olive':'#808000',\n 'olivedrab':'#6b8e23',\n 'orange':'#ffa500',\n 'orangered':'#ff4500',\n 'orchid':'#da70d6',\n 'palegoldenrod':'#eee8aa',\n 'palegreen':'#98fb98',\n 'paleturquoise':'#afeeee',\n 'palevioletred':'#d87093',\n 'papayawhip':'#ffefd5',\n 'peachpuff':'#ffdab9',\n 'peru':'#cd853f',\n 'pink':'#ffc0cb',\n 'plum':'#dda0dd',\n 'powderblue':'#b0e0e6',\n 'purple':'#800080',\n 'rebeccapurple':'#663399',\n 'red':'#ff0000',\n 'rosybrown':'#bc8f8f',\n 'royalblue':'#4169e1',\n 'saddlebrown':'#8b4513',\n 'salmon':'#fa8072',\n 'sandybrown':'#f4a460',\n 'seagreen':'#2e8b57',\n 'seashell':'#fff5ee',\n 'sienna':'#a0522d',\n 'silver':'#c0c0c0',\n 'skyblue':'#87ceeb',\n 'slateblue':'#6a5acd',\n 'slategray':'#708090',\n 'slategrey':'#708090',\n 'snow':'#fffafa',\n 'springgreen':'#00ff7f',\n 'steelblue':'#4682b4',\n 'tan':'#d2b48c',\n 'teal':'#008080',\n 'thistle':'#d8bfd8',\n 'tomato':'#ff6347',\n 'turquoise':'#40e0d0',\n 'violet':'#ee82ee',\n 'wheat':'#f5deb3',\n 'white':'#ffffff',\n 'whitesmoke':'#f5f5f5',\n 'yellow':'#ffff00',\n 'yellowgreen':'#9acd32'\n};","export default {\n length: {\n 'm': 1,\n 'cm': 0.01,\n 'mm': 0.001,\n 'in': 0.0254,\n 'px': 0.0254 / 96,\n 'pt': 0.0254 / 72,\n 'pc': 0.0254 / 72 * 12\n },\n duration: {\n 's': 1,\n 'ms': 0.001\n },\n angle: {\n 'rad': 1 / (2 * Math.PI),\n 'deg': 1 / 360,\n 'grad': 1 / 400,\n 'turn': 1\n }\n};","import colors from './colors';\nimport unitConversions from './unit-conversions';\n\nexport default { colors, unitConversions };\n","class Node {\n constructor() {\n this.parent = null;\n this.visibilityBlocks = undefined;\n this.nodeVisible = undefined;\n this.rootNode = null;\n this.parsed = null;\n\n const self = this;\n Object.defineProperty(this, 'currentFileInfo', {\n get: function() { return self.fileInfo(); }\n });\n Object.defineProperty(this, 'index', {\n get: function() { return self.getIndex(); }\n });\n\n }\n\n setParent(nodes, parent) {\n function set(node) {\n if (node && node instanceof Node) {\n node.parent = parent;\n }\n }\n if (Array.isArray(nodes)) {\n nodes.forEach(set);\n }\n else {\n set(nodes);\n }\n }\n\n getIndex() {\n return this._index || (this.parent && this.parent.getIndex()) || 0;\n }\n\n fileInfo() {\n return this._fileInfo || (this.parent && this.parent.fileInfo()) || {};\n }\n\n isRulesetLike() { return false; }\n\n toCSS(context) {\n const strs = [];\n this.genCSS(context, {\n add: function(chunk, fileInfo, index) {\n strs.push(chunk);\n },\n isEmpty: function () {\n return strs.length === 0;\n }\n });\n return strs.join('');\n }\n\n genCSS(context, output) {\n output.add(this.value);\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n eval() { return this; }\n\n _operate(context, op, a, b) {\n switch (op) {\n case '+': return a + b;\n case '-': return a - b;\n case '*': return a * b;\n case '/': return a / b;\n }\n }\n\n fround(context, value) {\n const precision = context && context.numPrecision;\n // add \"epsilon\" to ensure numbers like 1.000000005 (represented as 1.000000004999...) are properly rounded:\n return (precision) ? Number((value + 2e-16).toFixed(precision)) : value;\n }\n\n static compare(a, b) {\n /* returns:\n -1: a < b\n 0: a = b\n 1: a > b\n and *any* other value for a != b (e.g. undefined, NaN, -2 etc.) */\n\n if ((a.compare) &&\n // for \"symmetric results\" force toCSS-based comparison\n // of Quoted or Anonymous if either value is one of those\n !(b.type === 'Quoted' || b.type === 'Anonymous')) {\n return a.compare(b);\n } else if (b.compare) {\n return -b.compare(a);\n } else if (a.type !== b.type) {\n return undefined;\n }\n\n a = a.value;\n b = b.value;\n if (!Array.isArray(a)) {\n return a === b ? 0 : undefined;\n }\n if (a.length !== b.length) {\n return undefined;\n }\n for (let i = 0; i < a.length; i++) {\n if (Node.compare(a[i], b[i]) !== 0) {\n return undefined;\n }\n }\n return 0;\n }\n\n static numericCompare(a, b) {\n return a < b ? -1\n : a === b ? 0\n : a > b ? 1 : undefined;\n }\n\n // Returns true if this node represents root of ast imported by reference\n blocksVisibility() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n return this.visibilityBlocks !== 0;\n }\n\n addVisibilityBlock() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks + 1;\n }\n\n removeVisibilityBlock() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks - 1;\n }\n\n // Turns on node visibility - if called node will be shown in output regardless\n // of whether it comes from import by reference or not\n ensureVisibility() {\n this.nodeVisible = true;\n }\n\n // Turns off node visibility - if called node will NOT be shown in output regardless\n // of whether it comes from import by reference or not\n ensureInvisibility() {\n this.nodeVisible = false;\n }\n\n // return values:\n // false - the node must not be visible\n // true - the node must be visible\n // undefined or null - the node has the same visibility as its parent\n isVisible() {\n return this.nodeVisible;\n }\n\n visibilityInfo() {\n return {\n visibilityBlocks: this.visibilityBlocks,\n nodeVisible: this.nodeVisible\n };\n }\n\n copyVisibilityInfo(info) {\n if (!info) {\n return;\n }\n this.visibilityBlocks = info.visibilityBlocks;\n this.nodeVisible = info.nodeVisible;\n }\n}\n\nexport default Node;\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import Node from './node';\nimport colors from '../data/colors';\n\n//\n// RGB Colors - #ff0014, #eee\n//\nclass Color extends Node {\n constructor(rgb, a, originalForm) {\n super();\n\n const self = this;\n //\n // The end goal here, is to parse the arguments\n // into an integer triplet, such as `128, 255, 0`\n //\n // This facilitates operations and conversions.\n //\n if (Array.isArray(rgb)) {\n this.rgb = rgb;\n } else if (rgb.length >= 6) {\n this.rgb = [];\n rgb.match(/.{2}/g).map(function (c, i) {\n if (i < 3) {\n self.rgb.push(parseInt(c, 16));\n } else {\n self.alpha = (parseInt(c, 16)) / 255;\n }\n });\n } else {\n this.rgb = [];\n rgb.split('').map(function (c, i) {\n if (i < 3) {\n self.rgb.push(parseInt(c + c, 16));\n } else {\n self.alpha = (parseInt(c + c, 16)) / 255;\n }\n });\n }\n this.alpha = this.alpha || (typeof a === 'number' ? a : 1);\n if (typeof originalForm !== 'undefined') {\n this.value = originalForm;\n }\n }\n\n luma() {\n let r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255;\n\n r = (r <= 0.03928) ? r / 12.92 : Math.pow(((r + 0.055) / 1.055), 2.4);\n g = (g <= 0.03928) ? g / 12.92 : Math.pow(((g + 0.055) / 1.055), 2.4);\n b = (b <= 0.03928) ? b / 12.92 : Math.pow(((b + 0.055) / 1.055), 2.4);\n\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n }\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n }\n\n toCSS(context, doNotCompress) {\n const compress = context && context.compress && !doNotCompress;\n let color;\n let alpha;\n let colorFunction;\n let args = [];\n\n // `value` is set if this color was originally\n // converted from a named color string so we need\n // to respect this and try to output named color too.\n alpha = this.fround(context, this.alpha);\n\n if (this.value) {\n if (this.value.indexOf('rgb') === 0) {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n } else if (this.value.indexOf('hsl') === 0) {\n if (alpha < 1) {\n colorFunction = 'hsla';\n } else {\n colorFunction = 'hsl';\n }\n } else {\n return this.value;\n }\n } else {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n }\n\n switch (colorFunction) {\n case 'rgba':\n args = this.rgb.map(function (c) {\n return clamp(Math.round(c), 255);\n }).concat(clamp(alpha, 1));\n break;\n case 'hsla':\n args.push(clamp(alpha, 1));\n case 'hsl':\n color = this.toHSL();\n args = [\n this.fround(context, color.h),\n `${this.fround(context, color.s * 100)}%`,\n `${this.fround(context, color.l * 100)}%`\n ].concat(args);\n }\n\n if (colorFunction) {\n // Values are capped between `0` and `255`, rounded and zero-padded.\n return `${colorFunction}(${args.join(`,${compress ? '' : ' '}`)})`;\n }\n\n color = this.toRGB();\n\n if (compress) {\n const splitcolor = color.split('');\n\n // Convert color to short format\n if (splitcolor[1] === splitcolor[2] && splitcolor[3] === splitcolor[4] && splitcolor[5] === splitcolor[6]) {\n color = `#${splitcolor[1]}${splitcolor[3]}${splitcolor[5]}`;\n }\n }\n\n return color;\n }\n\n //\n // Operations have to be done per-channel, if not,\n // channels will spill onto each other. Once we have\n // our result, in the form of an integer triplet,\n // we create a new Color node to hold the result.\n //\n operate(context, op, other) {\n const rgb = new Array(3);\n const alpha = this.alpha * (1 - other.alpha) + other.alpha;\n for (let c = 0; c < 3; c++) {\n rgb[c] = this._operate(context, op, this.rgb[c], other.rgb[c]);\n }\n return new Color(rgb, alpha);\n }\n\n toRGB() {\n return toHex(this.rgb);\n }\n\n toHSL() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h;\n let s;\n const l = (max + min) / 2;\n const d = max - min;\n\n if (max === min) {\n h = s = 0;\n } else {\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, l, a };\n }\n\n // Adapted from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript\n toHSV() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h;\n let s;\n const v = max;\n\n const d = max - min;\n if (max === 0) {\n s = 0;\n } else {\n s = d / max;\n }\n\n if (max === min) {\n h = 0;\n } else {\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, v, a };\n }\n\n toARGB() {\n return toHex([this.alpha * 255].concat(this.rgb));\n }\n\n compare(x) {\n return (x.rgb &&\n x.rgb[0] === this.rgb[0] &&\n x.rgb[1] === this.rgb[1] &&\n x.rgb[2] === this.rgb[2] &&\n x.alpha === this.alpha) ? 0 : undefined;\n }\n\n static fromKeyword(keyword) {\n let c;\n const key = keyword.toLowerCase();\n if (colors.hasOwnProperty(key)) {\n c = new Color(colors[key].slice(1));\n }\n else if (key === 'transparent') {\n c = new Color([0, 0, 0], 0);\n }\n\n if (c) {\n c.value = keyword;\n return c;\n }\n }\n}\n\nColor.prototype.type = 'Color';\n\nfunction clamp(v, max) {\n return Math.min(Math.max(v, 0), max);\n}\n\nfunction toHex(v) {\n return `#${v.map(function (c) {\n c = clamp(Math.round(c), 255);\n return (c < 16 ? '0' : '') + c.toString(16);\n}).join('')}`;\n}\n\nexport default Color;\n","import Node from './node';\n\nclass Paren extends Node {\n constructor(node) {\n super();\n\n this.value = node;\n }\n\n genCSS(context, output) {\n output.add('(');\n this.value.genCSS(context, output);\n output.add(')');\n }\n\n eval(context) {\n return new Paren(this.value.eval(context));\n }\n}\n\nParen.prototype.type = 'Paren';\nexport default Paren;\n","import Node from './node';\nconst _noSpaceCombinators = {\n '': true,\n ' ': true,\n '|': true\n};\n\nclass Combinator extends Node {\n constructor(value) {\n super();\n\n if (value === ' ') {\n this.value = ' ';\n this.emptyOrWhitespace = true;\n } else {\n this.value = value ? value.trim() : '';\n this.emptyOrWhitespace = this.value === '';\n }\n }\n\n genCSS(context, output) {\n const spaceOrEmpty = (context.compress || _noSpaceCombinators[this.value]) ? '' : ' ';\n output.add(spaceOrEmpty + this.value + spaceOrEmpty);\n }\n}\n\nCombinator.prototype.type = 'Combinator';\n\nexport default Combinator;\n","import Node from './node';\nimport Paren from './paren';\nimport Combinator from './combinator';\n\nclass Element extends Node {\n constructor(combinator, value, isVariable, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.combinator = combinator instanceof Combinator ?\n combinator : new Combinator(combinator);\n\n if (typeof value === 'string') {\n this.value = value.trim();\n } else if (value) {\n this.value = value;\n } else {\n this.value = '';\n }\n this.isVariable = isVariable;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.combinator, this);\n }\n\n accept(visitor) {\n const value = this.value;\n this.combinator = visitor.visit(this.combinator);\n if (typeof value === 'object') {\n this.value = visitor.visit(value);\n }\n }\n\n eval(context) {\n return new Element(this.combinator,\n this.value.eval ? this.value.eval(context) : this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n }\n\n clone() {\n return new Element(this.combinator,\n this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n }\n\n genCSS(context, output) {\n output.add(this.toCSS(context), this.fileInfo(), this.getIndex());\n }\n\n toCSS(context) {\n context = context || {};\n let value = this.value;\n const firstSelector = context.firstSelector;\n if (value instanceof Paren) {\n // selector in parens should not be affected by outer selector\n // flags (breaks only interpolated selectors - see #1973)\n context.firstSelector = true;\n }\n value = value.toCSS ? value.toCSS(context) : value;\n context.firstSelector = firstSelector;\n if (value === '' && this.combinator.value.charAt(0) === '&') {\n return '';\n } else {\n return this.combinator.toCSS(context) + value;\n }\n }\n}\n\nElement.prototype.type = 'Element';\nexport default Element;\n","\nexport const Math = {\n ALWAYS: 0,\n PARENS_DIVISION: 1,\n PARENS: 2,\n // removed - STRICT_LEGACY: 3\n};\n\nexport const RewriteUrls = {\n OFF: 0,\n LOCAL: 1,\n ALL: 2\n};","/* jshint proto: true */\nimport * as Constants from './constants';\n\nexport function getLocation(index, inputStream) {\n let n = index + 1;\n let line = null;\n let column = -1;\n\n while (--n >= 0 && inputStream.charAt(n) !== '\\n') {\n column++;\n }\n\n if (typeof index === 'number') {\n line = (inputStream.slice(0, index).match(/\\n/g) || '').length;\n }\n\n return {\n line,\n column\n };\n}\n\nexport function copyArray(arr) {\n let i;\n const length = arr.length;\n const copy = new Array(length);\n\n for (i = 0; i < length; i++) {\n copy[i] = arr[i];\n }\n return copy;\n}\n\nexport function clone(obj) {\n const cloned = {};\n for (const prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n cloned[prop] = obj[prop];\n }\n }\n return cloned;\n}\n\nexport function defaults(obj1, obj2) {\n let newObj = obj2 || {};\n if (!obj2._defaults) {\n newObj = {};\n const defaults = {...obj1};\n newObj._defaults = defaults;\n const cloned = obj2 ? {...obj2} : {};\n Object.assign(newObj, defaults, cloned);\n }\n return newObj;\n}\n\nexport function copyOptions(obj1, obj2) {\n if (obj2 && obj2._defaults) {\n return obj2;\n }\n const opts = defaults(obj1, obj2);\n if (opts.strictMath) {\n opts.math = Constants.Math.PARENS;\n }\n // Back compat with changed relativeUrls option\n if (opts.relativeUrls) {\n opts.rewriteUrls = Constants.RewriteUrls.ALL;\n }\n if (typeof opts.math === 'string') {\n switch (opts.math.toLowerCase()) {\n case 'always':\n opts.math = Constants.Math.ALWAYS;\n break;\n case 'parens-division':\n opts.math = Constants.Math.PARENS_DIVISION;\n break;\n case 'strict':\n case 'parens':\n opts.math = Constants.Math.PARENS;\n break;\n default:\n opts.math = Constants.Math.PARENS;\n }\n }\n if (typeof opts.rewriteUrls === 'string') {\n switch (opts.rewriteUrls.toLowerCase()) {\n case 'off':\n opts.rewriteUrls = Constants.RewriteUrls.OFF;\n break;\n case 'local':\n opts.rewriteUrls = Constants.RewriteUrls.LOCAL;\n break;\n case 'all':\n opts.rewriteUrls = Constants.RewriteUrls.ALL;\n break;\n }\n }\n return opts;\n}\n\nexport function merge(obj1, obj2) {\n for (const prop in obj2) {\n if (obj2.hasOwnProperty(prop)) {\n obj1[prop] = obj2[prop];\n }\n }\n return obj1;\n}\n\nexport function flattenArray(arr, result = []) {\n for (let i = 0, length = arr.length; i < length; i++) {\n const value = arr[i];\n if (Array.isArray(value)) {\n flattenArray(value, result);\n } else {\n if (value !== undefined) {\n result.push(value);\n }\n }\n }\n return result;\n}","import * as utils from './utils';\n\nconst anonymousFunc = /(|Function):(\\d+):(\\d+)/;\n\n/**\n * This is a centralized class of any error that could be thrown internally (mostly by the parser).\n * Besides standard .message it keeps some additional data like a path to the file where the error\n * occurred along with line and column numbers.\n *\n * @class\n * @extends Error\n * @type {module.LessError}\n *\n * @prop {string} type\n * @prop {string} filename\n * @prop {number} index\n * @prop {number} line\n * @prop {number} column\n * @prop {number} callLine\n * @prop {number} callExtract\n * @prop {string[]} extract\n *\n * @param {Object} e - An error object to wrap around or just a descriptive object\n * @param {Object} fileContentMap - An object with file contents in 'contents' property (like importManager) @todo - move to fileManager?\n * @param {string} [currentFilename]\n */\nconst LessError = function(e, fileContentMap, currentFilename) {\n Error.call(this);\n\n const filename = e.filename || currentFilename;\n\n this.message = e.message;\n this.stack = e.stack;\n\n if (fileContentMap && filename) {\n const input = fileContentMap.contents[filename];\n const loc = utils.getLocation(e.index, input);\n var line = loc.line;\n const col = loc.column;\n const callLine = e.call && utils.getLocation(e.call, input).line;\n const lines = input ? input.split('\\n') : '';\n\n this.type = e.type || 'Syntax';\n this.filename = filename;\n this.index = e.index;\n this.line = typeof line === 'number' ? line + 1 : null;\n this.column = col;\n\n if (!this.line && this.stack) {\n const found = this.stack.match(anonymousFunc);\n\n /**\n * We have to figure out how this environment stringifies anonymous functions\n * so we can correctly map plugin errors.\n * \n * Note, in Node 8, the output of anonymous funcs varied based on parameters\n * being present or not, so we inject dummy params.\n */\n const func = new Function('a', 'throw new Error()');\n let lineAdjust = 0;\n try {\n func();\n } catch (e) {\n const match = e.stack.match(anonymousFunc);\n var line = parseInt(match[2]);\n lineAdjust = 1 - line;\n }\n\n if (found) {\n if (found[2]) {\n this.line = parseInt(found[2]) + lineAdjust;\n }\n if (found[3]) {\n this.column = parseInt(found[3]);\n }\n }\n }\n\n this.callLine = callLine + 1;\n this.callExtract = lines[callLine];\n\n this.extract = [\n lines[this.line - 2],\n lines[this.line - 1],\n lines[this.line]\n ];\n }\n\n};\n\nif (typeof Object.create === 'undefined') {\n const F = function () {};\n F.prototype = Error.prototype;\n LessError.prototype = new F();\n} else {\n LessError.prototype = Object.create(Error.prototype);\n}\n\nLessError.prototype.constructor = LessError;\n\n/**\n * An overridden version of the default Object.prototype.toString\n * which uses additional information to create a helpful message.\n *\n * @param {Object} options\n * @returns {string}\n */\nLessError.prototype.toString = function(options) {\n options = options || {};\n\n let message = '';\n const extract = this.extract || [];\n let error = [];\n let stylize = function (str) { return str; };\n if (options.stylize) {\n const type = typeof options.stylize;\n if (type !== 'function') {\n throw Error(`options.stylize should be a function, got a ${type}!`);\n }\n stylize = options.stylize;\n }\n\n if (this.line !== null) {\n if (typeof extract[0] === 'string') {\n error.push(stylize(`${this.line - 1} ${extract[0]}`, 'grey'));\n }\n\n if (typeof extract[1] === 'string') {\n let errorTxt = `${this.line} `;\n if (extract[1]) {\n errorTxt += extract[1].slice(0, this.column) +\n stylize(stylize(stylize(extract[1].substr(this.column, 1), 'bold') +\n extract[1].slice(this.column + 1), 'red'), 'inverse');\n }\n error.push(errorTxt);\n }\n\n if (typeof extract[2] === 'string') {\n error.push(stylize(`${this.line + 1} ${extract[2]}`, 'grey'));\n }\n error = `${error.join('\\n') + stylize('', 'reset')}\\n`;\n }\n\n message += stylize(`${this.type}Error: ${this.message}`, 'red');\n if (this.filename) {\n message += stylize(' in ', 'red') + this.filename;\n }\n if (this.line) {\n message += stylize(` on line ${this.line}, column ${this.column + 1}:`, 'grey');\n }\n\n message += `\\n${error}`;\n\n if (this.callLine) {\n message += `${stylize('from ', 'red') + (this.filename || '')}/n`;\n message += `${stylize(this.callLine, 'grey')} ${this.callExtract}/n`;\n }\n\n return message;\n};\n\nexport default LessError;","import Node from './node';\nimport Element from './element';\nimport LessError from '../less-error';\n\nclass Selector extends Node {\n constructor(elements, extendList, condition, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.extendList = extendList;\n this.condition = condition;\n this.evaldCondition = !condition;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.elements = this.getElements(elements);\n this.mixinElements_ = undefined;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.elements, this);\n }\n\n accept(visitor) {\n if (this.elements) {\n this.elements = visitor.visitArray(this.elements);\n }\n if (this.extendList) {\n this.extendList = visitor.visitArray(this.extendList);\n }\n if (this.condition) {\n this.condition = visitor.visit(this.condition);\n }\n }\n\n createDerived(elements, extendList, evaldCondition) {\n elements = this.getElements(elements);\n const newSelector = new Selector(elements, extendList || this.extendList,\n null, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n newSelector.evaldCondition = (evaldCondition != null) ? evaldCondition : this.evaldCondition;\n newSelector.mediaEmpty = this.mediaEmpty;\n return newSelector;\n }\n\n getElements(els) {\n if (!els) {\n return [new Element('', '&', false, this._index, this._fileInfo)];\n }\n if (typeof els === 'string') {\n this.parse.parseNode(\n els, \n ['selector'],\n this._index, \n this._fileInfo, \n function(err, result) {\n if (err) {\n throw new LessError({\n index: err.index,\n message: err.message\n }, this.parse.imports, this._fileInfo.filename);\n }\n els = result[0].elements;\n });\n }\n return els;\n }\n\n createEmptySelectors() {\n const el = new Element('', '&', false, this._index, this._fileInfo), sels = [new Selector([el], null, null, this._index, this._fileInfo)];\n sels[0].mediaEmpty = true;\n return sels;\n }\n\n match(other) {\n const elements = this.elements;\n const len = elements.length;\n let olen;\n let i;\n\n other = other.mixinElements();\n olen = other.length;\n if (olen === 0 || len < olen) {\n return 0;\n } else {\n for (i = 0; i < olen; i++) {\n if (elements[i].value !== other[i]) {\n return 0;\n }\n }\n }\n\n return olen; // return number of matched elements\n }\n\n mixinElements() {\n if (this.mixinElements_) {\n return this.mixinElements_;\n }\n\n let elements = this.elements.map( function(v) {\n return v.combinator.value + (v.value.value || v.value);\n }).join('').match(/[,&#\\*\\.\\w-]([\\w-]|(\\\\.))*/g);\n\n if (elements) {\n if (elements[0] === '&') {\n elements.shift();\n }\n } else {\n elements = [];\n }\n\n return (this.mixinElements_ = elements);\n }\n\n isJustParentSelector() {\n return !this.mediaEmpty &&\n this.elements.length === 1 &&\n this.elements[0].value === '&' &&\n (this.elements[0].combinator.value === ' ' || this.elements[0].combinator.value === '');\n }\n\n eval(context) {\n const evaldCondition = this.condition && this.condition.eval(context);\n let elements = this.elements;\n let extendList = this.extendList;\n\n elements = elements && elements.map(function (e) { return e.eval(context); });\n extendList = extendList && extendList.map(function(extend) { return extend.eval(context); });\n\n return this.createDerived(elements, extendList, evaldCondition);\n }\n\n genCSS(context, output) {\n let i, element;\n if ((!context || !context.firstSelector) && this.elements[0].combinator.value === '') {\n output.add(' ', this.fileInfo(), this.getIndex());\n }\n for (i = 0; i < this.elements.length; i++) {\n element = this.elements[i];\n element.genCSS(context, output);\n }\n }\n\n getIsOutput() {\n return this.evaldCondition;\n }\n}\n\nSelector.prototype.type = 'Selector';\nexport default Selector;\n","import Node from './node';\n\nclass Value extends Node {\n constructor(value) {\n super();\n\n if (!value) {\n throw new Error('Value requires an array argument');\n }\n if (!Array.isArray(value)) {\n this.value = [ value ];\n }\n else {\n this.value = value;\n }\n }\n\n accept(visitor) {\n if (this.value) {\n this.value = visitor.visitArray(this.value);\n }\n }\n\n eval(context) {\n if (this.value.length === 1) {\n return this.value[0].eval(context);\n } else {\n return new Value(this.value.map(function (v) {\n return v.eval(context);\n }));\n }\n }\n\n genCSS(context, output) {\n let i;\n for (i = 0; i < this.value.length; i++) {\n this.value[i].genCSS(context, output);\n if (i + 1 < this.value.length) {\n output.add((context && context.compress) ? ',' : ', ');\n }\n }\n }\n}\n\nValue.prototype.type = 'Value';\nexport default Value;\n","import Node from './node';\n\nclass Keyword extends Node {\n constructor(value) {\n super();\n\n this.value = value;\n }\n\n genCSS(context, output) {\n if (this.value === '%') { throw { type: 'Syntax', message: 'Invalid % without number' }; }\n output.add(this.value);\n }\n}\n\nKeyword.prototype.type = 'Keyword';\n\nKeyword.True = new Keyword('true');\nKeyword.False = new Keyword('false');\n\nexport default Keyword;\n","import Node from './node';\n\nclass Anonymous extends Node {\n constructor(value, index, currentFileInfo, mapLines, rulesetLike, visibilityInfo) {\n super();\n\n this.value = value;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.mapLines = mapLines;\n this.rulesetLike = (typeof rulesetLike === 'undefined') ? false : rulesetLike;\n this.allowRoot = true;\n this.copyVisibilityInfo(visibilityInfo);\n }\n\n eval() {\n return new Anonymous(this.value, this._index, this._fileInfo, this.mapLines, this.rulesetLike, this.visibilityInfo());\n }\n\n compare(other) {\n return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n }\n\n isRulesetLike() {\n return this.rulesetLike;\n }\n\n genCSS(context, output) {\n this.nodeVisible = Boolean(this.value);\n if (this.nodeVisible) {\n output.add(this.value, this._fileInfo, this._index, this.mapLines);\n }\n }\n}\n\nAnonymous.prototype.type = 'Anonymous';\nexport default Anonymous;\n","import Node from './node';\nimport Value from './value';\nimport Keyword from './keyword';\nimport Anonymous from './anonymous';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\nclass Declaration extends Node {\n constructor(name, value, important, merge, index, currentFileInfo, inline, variable) {\n super();\n\n this.name = name;\n this.value = (value instanceof Node) ? value : new Value([value ? new Anonymous(value) : null]);\n this.important = important ? ` ${important.trim()}` : '';\n this.merge = merge;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.inline = inline || false;\n this.variable = (variable !== undefined) ? variable\n : (name.charAt && (name.charAt(0) === '@'));\n this.allowRoot = true;\n this.setParent(this.value, this);\n }\n\n genCSS(context, output) {\n output.add(this.name + (context.compress ? ':' : ': '), this.fileInfo(), this.getIndex());\n try {\n this.value.genCSS(context, output);\n }\n catch (e) {\n e.index = this._index;\n e.filename = this._fileInfo.filename;\n throw e;\n }\n output.add(this.important + ((this.inline || (context.lastRule && context.compress)) ? '' : ';'), this._fileInfo, this._index);\n }\n\n eval(context) {\n let mathBypass = false, prevMath, name = this.name, evaldValue, variable = this.variable;\n if (typeof name !== 'string') {\n // expand 'primitive' name directly to get\n // things faster (~10% for benchmark.less):\n name = (name.length === 1) && (name[0] instanceof Keyword) ?\n name[0].value : evalName(context, name);\n variable = false; // never treat expanded interpolation as new variable name\n }\n\n // @todo remove when parens-division is default\n if (name === 'font' && context.math === MATH.ALWAYS) {\n mathBypass = true;\n prevMath = context.math;\n context.math = MATH.PARENS_DIVISION;\n }\n try {\n context.importantScope.push({});\n evaldValue = this.value.eval(context);\n\n if (!this.variable && evaldValue.type === 'DetachedRuleset') {\n throw { message: 'Rulesets cannot be evaluated on a property.',\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n let important = this.important;\n const importantResult = context.importantScope.pop();\n if (!important && importantResult.important) {\n important = importantResult.important;\n }\n\n return new Declaration(name,\n evaldValue,\n important,\n this.merge,\n this.getIndex(), this.fileInfo(), this.inline,\n variable);\n }\n catch (e) {\n if (typeof e.index !== 'number') {\n e.index = this.getIndex();\n e.filename = this.fileInfo().filename;\n }\n throw e;\n }\n finally {\n if (mathBypass) {\n context.math = prevMath;\n }\n }\n }\n\n makeImportant() {\n return new Declaration(this.name,\n this.value,\n '!important',\n this.merge,\n this.getIndex(), this.fileInfo(), this.inline);\n }\n}\n\nfunction evalName(context, name) {\n let value = '';\n let i;\n const n = name.length;\n const output = {add: function (s) {value += s;}};\n for (i = 0; i < n; i++) {\n name[i].eval(context).genCSS(context, output);\n }\n return value;\n}\n\nDeclaration.prototype.type = 'Declaration';\nexport default Declaration;","class debugInfo {\n constructor(context, ctx, lineSeparator) {\n let result = '';\n if (context.dumpLineNumbers && !context.compress) {\n switch (context.dumpLineNumbers) {\n case 'comments':\n result = debugInfo.asComment(ctx);\n break;\n case 'mediaquery':\n result = debugInfo.asMediaQuery(ctx);\n break;\n case 'all':\n result = debugInfo.asComment(ctx) + (lineSeparator || '') + debugInfo.asMediaQuery(ctx);\n break;\n }\n }\n return result;\n }\n\n static asComment(ctx) {\n return `/* line ${ctx.debugInfo.lineNumber}, ${ctx.debugInfo.fileName} */\\n`;\n }\n\n static asMediaQuery(ctx) {\n let filenameWithProtocol = ctx.debugInfo.fileName;\n if (!/^[a-z]+:\\/\\//i.test(filenameWithProtocol)) {\n filenameWithProtocol = `file://${filenameWithProtocol}`;\n }\n return `@media -sass-debug-info{filename{font-family:${filenameWithProtocol.replace(/([.:\\/\\\\])/g, function (a) {\n if (a == '\\\\') {\n a = '\\/';\n }\n return `\\\\${a}`;\n})}}line{font-family:\\\\00003${ctx.debugInfo.lineNumber}}}\\n`;\n }\n}\n\nexport default debugInfo;\n","import Node from './node';\nimport getDebugInfo from './debug-info';\n\nclass Comment extends Node {\n constructor(value, isLineComment, index, currentFileInfo) {\n super();\n\n this.value = value;\n this.isLineComment = isLineComment;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.allowRoot = true;\n }\n\n genCSS(context, output) {\n if (this.debugInfo) {\n output.add(getDebugInfo(context, this), this.fileInfo(), this.getIndex());\n }\n output.add(this.value);\n }\n\n isSilent(context) {\n const isCompressed = context.compress && this.value[2] !== '!';\n return this.isLineComment || isCompressed;\n }\n}\n\nComment.prototype.type = 'Comment';\nexport default Comment;\n","const contexts = {};\nexport default contexts;\nimport * as Constants from './constants';\n\nconst copyFromOriginal = function copyFromOriginal(original, destination, propertiesToCopy) {\n if (!original) { return; }\n\n for (let i = 0; i < propertiesToCopy.length; i++) {\n if (original.hasOwnProperty(propertiesToCopy[i])) {\n destination[propertiesToCopy[i]] = original[propertiesToCopy[i]];\n }\n }\n};\n\n/*\n parse is used whilst parsing\n */\nconst parseCopyProperties = [\n // options\n 'paths', // option - unmodified - paths to search for imports on\n 'rewriteUrls', // option - whether to adjust URL's to be relative\n 'rootpath', // option - rootpath to append to URL's\n 'strictImports', // option -\n 'insecure', // option - whether to allow imports from insecure ssl hosts\n 'dumpLineNumbers', // option - whether to dump line numbers\n 'compress', // option - whether to compress\n 'syncImport', // option - whether to import synchronously\n 'chunkInput', // option - whether to chunk input. more performant but causes parse issues.\n 'mime', // browser only - mime type for sheet import\n 'useFileCache', // browser only - whether to use the per file session cache\n // context\n 'processImports', // option & context - whether to process imports. if false then imports will not be imported.\n // Used by the import manager to stop multiple import visitors being created.\n 'pluginManager' // Used as the plugin manager for the session\n];\n\ncontexts.Parse = function(options) {\n copyFromOriginal(options, this, parseCopyProperties);\n\n if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n};\n\nconst evalCopyProperties = [\n 'paths', // additional include paths\n 'compress', // whether to compress\n 'math', // whether math has to be within parenthesis\n 'strictUnits', // whether units need to evaluate correctly\n 'sourceMap', // whether to output a source map\n 'importMultiple', // whether we are currently importing multiple copies\n 'urlArgs', // whether to add args into url tokens\n 'javascriptEnabled', // option - whether Inline JavaScript is enabled. if undefined, defaults to false\n 'pluginManager', // Used as the plugin manager for the session\n 'importantScope', // used to bubble up !important statements\n 'rewriteUrls' // option - whether to adjust URL's to be relative\n];\n\ncontexts.Eval = function(options, frames) {\n copyFromOriginal(options, this, evalCopyProperties);\n\n if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n\n this.frames = frames || [];\n this.importantScope = this.importantScope || [];\n};\n\ncontexts.Eval.prototype.enterCalc = function () {\n if (!this.calcStack) {\n this.calcStack = [];\n }\n this.calcStack.push(true);\n this.inCalc = true;\n};\n\ncontexts.Eval.prototype.exitCalc = function () {\n this.calcStack.pop();\n if (!this.calcStack.length) {\n this.inCalc = false;\n }\n};\n\ncontexts.Eval.prototype.inParenthesis = function () {\n if (!this.parensStack) {\n this.parensStack = [];\n }\n this.parensStack.push(true);\n};\n\ncontexts.Eval.prototype.outOfParenthesis = function () {\n this.parensStack.pop();\n};\n\ncontexts.Eval.prototype.inCalc = false;\ncontexts.Eval.prototype.mathOn = true;\ncontexts.Eval.prototype.isMathOn = function (op) {\n if (!this.mathOn) {\n return false;\n }\n if (op === '/' && this.math !== Constants.Math.ALWAYS && (!this.parensStack || !this.parensStack.length)) {\n return false;\n }\n if (this.math > Constants.Math.PARENS_DIVISION) {\n return this.parensStack && this.parensStack.length;\n }\n return true;\n};\n\ncontexts.Eval.prototype.pathRequiresRewrite = function (path) {\n const isRelative = this.rewriteUrls === Constants.RewriteUrls.LOCAL ? isPathLocalRelative : isPathRelative;\n\n return isRelative(path);\n};\n\ncontexts.Eval.prototype.rewritePath = function (path, rootpath) {\n let newPath;\n\n rootpath = rootpath || '';\n newPath = this.normalizePath(rootpath + path);\n\n // If a path was explicit relative and the rootpath was not an absolute path\n // we must ensure that the new path is also explicit relative.\n if (isPathLocalRelative(path) &&\n isPathRelative(rootpath) &&\n isPathLocalRelative(newPath) === false) {\n newPath = `./${newPath}`;\n }\n\n return newPath;\n};\n\ncontexts.Eval.prototype.normalizePath = function (path) {\n const segments = path.split('/').reverse();\n let segment;\n\n path = [];\n while (segments.length !== 0) {\n segment = segments.pop();\n switch ( segment ) {\n case '.':\n break;\n case '..':\n if ((path.length === 0) || (path[path.length - 1] === '..')) {\n path.push( segment );\n } else {\n path.pop();\n }\n break;\n default:\n path.push(segment);\n break;\n }\n }\n\n return path.join('/');\n};\n\nfunction isPathRelative(path) {\n return !/^(?:[a-z-]+:|\\/|#)/i.test(path);\n}\n\nfunction isPathLocalRelative(path) {\n return path.charAt(0) === '.';\n}\n\n// todo - do the same for the toCSS ?\n","function makeRegistry( base ) {\n return {\n _data: {},\n add: function(name, func) {\n // precautionary case conversion, as later querying of\n // the registry by function-caller uses lower case as well.\n name = name.toLowerCase();\n\n if (this._data.hasOwnProperty(name)) {\n // TODO warn\n }\n this._data[name] = func;\n },\n addMultiple: function(functions) {\n Object.keys(functions).forEach(\n name => {\n this.add(name, functions[name]);\n });\n },\n get: function(name) {\n return this._data[name] || ( base && base.get( name ));\n },\n getLocalFunctions: function() {\n return this._data;\n },\n inherit: function() {\n return makeRegistry( this );\n },\n create: function(base) {\n return makeRegistry(base);\n }\n };\n}\n\nexport default makeRegistry( null );","import Keyword from '../tree/keyword';\n\nconst defaultFunc = {\n eval: function () {\n const v = this.value_;\n const e = this.error_;\n if (e) {\n throw e;\n }\n if (v != null) {\n return v ? Keyword.True : Keyword.False;\n }\n },\n value: function (v) {\n this.value_ = v;\n },\n error: function (e) {\n this.error_ = e;\n },\n reset: function () {\n this.value_ = this.error_ = null;\n }\n};\n\nexport default defaultFunc;\n","import Node from './node';\nimport Declaration from './declaration';\nimport Keyword from './keyword';\nimport Comment from './comment';\nimport Paren from './paren';\nimport Selector from './selector';\nimport Element from './element';\nimport Anonymous from './anonymous';\nimport contexts from '../contexts';\nimport globalFunctionRegistry from '../functions/function-registry';\nimport defaultFunc from '../functions/default';\nimport getDebugInfo from './debug-info';\nimport * as utils from '../utils';\n\nclass Ruleset extends Node {\n constructor(selectors, rules, strictImports, visibilityInfo) {\n super();\n\n this.selectors = selectors;\n this.rules = rules;\n this._lookups = {};\n this._variables = null;\n this._properties = null;\n this.strictImports = strictImports;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n\n this.setParent(this.selectors, this);\n this.setParent(this.rules, this);\n\n }\n\n isRulesetLike() { return true; }\n\n accept(visitor) {\n if (this.paths) {\n this.paths = visitor.visitArray(this.paths, true);\n } else if (this.selectors) {\n this.selectors = visitor.visitArray(this.selectors);\n }\n if (this.rules && this.rules.length) {\n this.rules = visitor.visitArray(this.rules);\n }\n }\n\n eval(context) {\n const that = this;\n let selectors;\n let selCnt;\n let selector;\n let i;\n let hasVariable;\n let hasOnePassingSelector = false;\n\n if (this.selectors && (selCnt = this.selectors.length)) {\n selectors = new Array(selCnt);\n defaultFunc.error({\n type: 'Syntax',\n message: 'it is currently only allowed in parametric mixin guards,'\n });\n\n for (i = 0; i < selCnt; i++) {\n selector = this.selectors[i].eval(context);\n for (var j = 0; j < selector.elements.length; j++) {\n if (selector.elements[j].isVariable) {\n hasVariable = true;\n break;\n }\n }\n selectors[i] = selector;\n if (selector.evaldCondition) {\n hasOnePassingSelector = true;\n }\n }\n\n if (hasVariable) {\n const toParseSelectors = new Array(selCnt);\n for (i = 0; i < selCnt; i++) {\n selector = selectors[i];\n toParseSelectors[i] = selector.toCSS(context);\n }\n this.parse.parseNode(\n toParseSelectors.join(','),\n [\"selectors\"], \n selectors[0].getIndex(), \n selectors[0].fileInfo(), \n function(err, result) {\n if (result) {\n selectors = utils.flattenArray(result);\n }\n });\n }\n\n defaultFunc.reset();\n } else {\n hasOnePassingSelector = true;\n }\n\n let rules = this.rules ? utils.copyArray(this.rules) : null;\n const ruleset = new Ruleset(selectors, rules, this.strictImports, this.visibilityInfo());\n let rule;\n let subRule;\n\n ruleset.originalRuleset = this;\n ruleset.root = this.root;\n ruleset.firstRoot = this.firstRoot;\n ruleset.allowImports = this.allowImports;\n\n if (this.debugInfo) {\n ruleset.debugInfo = this.debugInfo;\n }\n\n if (!hasOnePassingSelector) {\n rules.length = 0;\n }\n\n // inherit a function registry from the frames stack when possible;\n // otherwise from the global registry\n ruleset.functionRegistry = (function (frames) {\n let i = 0;\n const n = frames.length;\n let found;\n for ( ; i !== n ; ++i ) {\n found = frames[ i ].functionRegistry;\n if ( found ) { return found; }\n }\n return globalFunctionRegistry;\n }(context.frames)).inherit();\n\n // push the current ruleset to the frames stack\n const ctxFrames = context.frames;\n ctxFrames.unshift(ruleset);\n\n // currrent selectors\n let ctxSelectors = context.selectors;\n if (!ctxSelectors) {\n context.selectors = ctxSelectors = [];\n }\n ctxSelectors.unshift(this.selectors);\n\n // Evaluate imports\n if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) {\n ruleset.evalImports(context);\n }\n\n // Store the frames around mixin definitions,\n // so they can be evaluated like closures when the time comes.\n const rsRules = ruleset.rules;\n for (i = 0; (rule = rsRules[i]); i++) {\n if (rule.evalFirst) {\n rsRules[i] = rule.eval(context);\n }\n }\n\n const mediaBlockCount = (context.mediaBlocks && context.mediaBlocks.length) || 0;\n\n // Evaluate mixin calls.\n for (i = 0; (rule = rsRules[i]); i++) {\n if (rule.type === 'MixinCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).filter(function(r) {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope if the variable is\n // already there. consider returning false here\n // but we need a way to \"return\" variable from mixins\n return !(ruleset.variable(r.name));\n }\n return true;\n });\n rsRules.splice.apply(rsRules, [i, 1].concat(rules));\n i += rules.length - 1;\n ruleset.resetCache();\n } else if (rule.type === 'VariableCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).rules.filter(function(r) {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope at all\n return false;\n }\n return true;\n });\n rsRules.splice.apply(rsRules, [i, 1].concat(rules));\n i += rules.length - 1;\n ruleset.resetCache();\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n if (!rule.evalFirst) {\n rsRules[i] = rule = rule.eval ? rule.eval(context) : rule;\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n // for rulesets, check if it is a css guard and can be removed\n if (rule instanceof Ruleset && rule.selectors && rule.selectors.length === 1) {\n // check if it can be folded in (e.g. & where)\n if (rule.selectors[0] && rule.selectors[0].isJustParentSelector()) {\n rsRules.splice(i--, 1);\n\n for (var j = 0; (subRule = rule.rules[j]); j++) {\n if (subRule instanceof Node) {\n subRule.copyVisibilityInfo(rule.visibilityInfo());\n if (!(subRule instanceof Declaration) || !subRule.variable) {\n rsRules.splice(++i, 0, subRule);\n }\n }\n }\n }\n }\n }\n\n // Pop the stack\n ctxFrames.shift();\n ctxSelectors.shift();\n\n if (context.mediaBlocks) {\n for (i = mediaBlockCount; i < context.mediaBlocks.length; i++) {\n context.mediaBlocks[i].bubbleSelectors(selectors);\n }\n }\n\n return ruleset;\n }\n\n evalImports(context) {\n const rules = this.rules;\n let i;\n let importRules;\n if (!rules) { return; }\n\n for (i = 0; i < rules.length; i++) {\n if (rules[i].type === 'Import') {\n importRules = rules[i].eval(context);\n if (importRules && (importRules.length || importRules.length === 0)) {\n rules.splice.apply(rules, [i, 1].concat(importRules));\n i += importRules.length - 1;\n } else {\n rules.splice(i, 1, importRules);\n }\n this.resetCache();\n }\n }\n }\n\n makeImportant() {\n const result = new Ruleset(this.selectors, this.rules.map(function (r) {\n if (r.makeImportant) {\n return r.makeImportant();\n } else {\n return r;\n }\n }), this.strictImports, this.visibilityInfo());\n\n return result;\n }\n\n matchArgs(args) {\n return !args || args.length === 0;\n }\n\n // lets you call a css selector with a guard\n matchCondition(args, context) {\n const lastSelector = this.selectors[this.selectors.length - 1];\n if (!lastSelector.evaldCondition) {\n return false;\n }\n if (lastSelector.condition &&\n !lastSelector.condition.eval(\n new contexts.Eval(context,\n context.frames))) {\n return false;\n }\n return true;\n }\n\n resetCache() {\n this._rulesets = null;\n this._variables = null;\n this._properties = null;\n this._lookups = {};\n }\n\n variables() {\n if (!this._variables) {\n this._variables = !this.rules ? {} : this.rules.reduce(function (hash, r) {\n if (r instanceof Declaration && r.variable === true) {\n hash[r.name] = r;\n }\n // when evaluating variables in an import statement, imports have not been eval'd\n // so we need to go inside import statements.\n // guard against root being a string (in the case of inlined less)\n if (r.type === 'Import' && r.root && r.root.variables) {\n const vars = r.root.variables();\n for (const name in vars) {\n if (vars.hasOwnProperty(name)) {\n hash[name] = r.root.variable(name);\n }\n }\n }\n return hash;\n }, {});\n }\n return this._variables;\n }\n\n properties() {\n if (!this._properties) {\n this._properties = !this.rules ? {} : this.rules.reduce(function (hash, r) {\n if (r instanceof Declaration && r.variable !== true) {\n const name = (r.name.length === 1) && (r.name[0] instanceof Keyword) ?\n r.name[0].value : r.name;\n // Properties don't overwrite as they can merge\n if (!hash[`$${name}`]) {\n hash[`$${name}`] = [ r ];\n }\n else {\n hash[`$${name}`].push(r);\n }\n }\n return hash;\n }, {});\n }\n return this._properties;\n }\n\n variable(name) {\n const decl = this.variables()[name];\n if (decl) {\n return this.parseValue(decl);\n }\n }\n\n property(name) {\n const decl = this.properties()[name];\n if (decl) {\n return this.parseValue(decl);\n }\n }\n\n lastDeclaration() {\n for (let i = this.rules.length; i > 0; i--) {\n const decl = this.rules[i - 1];\n if (decl instanceof Declaration) {\n return this.parseValue(decl);\n }\n }\n }\n\n parseValue(toParse) {\n const self = this;\n function transformDeclaration(decl) {\n if (decl.value instanceof Anonymous && !decl.parsed) {\n if (typeof decl.value.value === 'string') {\n this.parse.parseNode(\n decl.value.value,\n ['value', 'important'], \n decl.value.getIndex(), \n decl.fileInfo(), \n function(err, result) {\n if (err) {\n decl.parsed = true;\n }\n if (result) {\n decl.value = result[0];\n decl.important = result[1] || '';\n decl.parsed = true;\n }\n });\n } else {\n decl.parsed = true;\n }\n\n return decl;\n }\n else {\n return decl;\n }\n }\n if (!Array.isArray(toParse)) {\n return transformDeclaration.call(self, toParse);\n }\n else {\n const nodes = [];\n toParse.forEach(function(n) {\n nodes.push(transformDeclaration.call(self, n));\n });\n return nodes;\n }\n }\n\n rulesets() {\n if (!this.rules) { return []; }\n\n const filtRules = [];\n const rules = this.rules;\n let i;\n let rule;\n\n for (i = 0; (rule = rules[i]); i++) {\n if (rule.isRuleset) {\n filtRules.push(rule);\n }\n }\n\n return filtRules;\n }\n\n prependRule(rule) {\n const rules = this.rules;\n if (rules) {\n rules.unshift(rule);\n } else {\n this.rules = [ rule ];\n }\n this.setParent(rule, this);\n }\n\n find(selector, self, filter) {\n self = self || this;\n const rules = [];\n let match;\n let foundMixins;\n const key = selector.toCSS();\n\n if (key in this._lookups) { return this._lookups[key]; }\n\n this.rulesets().forEach(function (rule) {\n if (rule !== self) {\n for (let j = 0; j < rule.selectors.length; j++) {\n match = selector.match(rule.selectors[j]);\n if (match) {\n if (selector.elements.length > match) {\n if (!filter || filter(rule)) {\n foundMixins = rule.find(new Selector(selector.elements.slice(match)), self, filter);\n for (let i = 0; i < foundMixins.length; ++i) {\n foundMixins[i].path.push(rule);\n }\n Array.prototype.push.apply(rules, foundMixins);\n }\n } else {\n rules.push({ rule, path: []});\n }\n break;\n }\n }\n }\n });\n this._lookups[key] = rules;\n return rules;\n }\n\n genCSS(context, output) {\n let i;\n let j;\n const charsetRuleNodes = [];\n let ruleNodes = [];\n\n let // Line number debugging\n debugInfo;\n\n let rule;\n let path;\n\n context.tabLevel = (context.tabLevel || 0);\n\n if (!this.root) {\n context.tabLevel++;\n }\n\n const tabRuleStr = context.compress ? '' : Array(context.tabLevel + 1).join(' ');\n const tabSetStr = context.compress ? '' : Array(context.tabLevel).join(' ');\n let sep;\n\n let charsetNodeIndex = 0;\n let importNodeIndex = 0;\n for (i = 0; (rule = this.rules[i]); i++) {\n if (rule instanceof Comment) {\n if (importNodeIndex === i) {\n importNodeIndex++;\n }\n ruleNodes.push(rule);\n } else if (rule.isCharset && rule.isCharset()) {\n ruleNodes.splice(charsetNodeIndex, 0, rule);\n charsetNodeIndex++;\n importNodeIndex++;\n } else if (rule.type === 'Import') {\n ruleNodes.splice(importNodeIndex, 0, rule);\n importNodeIndex++;\n } else {\n ruleNodes.push(rule);\n }\n }\n ruleNodes = charsetRuleNodes.concat(ruleNodes);\n\n // If this is the root node, we don't render\n // a selector, or {}.\n if (!this.root) {\n debugInfo = getDebugInfo(context, this, tabSetStr);\n\n if (debugInfo) {\n output.add(debugInfo);\n output.add(tabSetStr);\n }\n\n const paths = this.paths;\n const pathCnt = paths.length;\n let pathSubCnt;\n\n sep = context.compress ? ',' : (`,\\n${tabSetStr}`);\n\n for (i = 0; i < pathCnt; i++) {\n path = paths[i];\n if (!(pathSubCnt = path.length)) { continue; }\n if (i > 0) { output.add(sep); }\n\n context.firstSelector = true;\n path[0].genCSS(context, output);\n\n context.firstSelector = false;\n for (j = 1; j < pathSubCnt; j++) {\n path[j].genCSS(context, output);\n }\n }\n\n output.add((context.compress ? '{' : ' {\\n') + tabRuleStr);\n }\n\n // Compile rules and rulesets\n for (i = 0; (rule = ruleNodes[i]); i++) {\n\n if (i + 1 === ruleNodes.length) {\n context.lastRule = true;\n }\n\n const currentLastRule = context.lastRule;\n if (rule.isRulesetLike(rule)) {\n context.lastRule = false;\n }\n\n if (rule.genCSS) {\n rule.genCSS(context, output);\n } else if (rule.value) {\n output.add(rule.value.toString());\n }\n\n context.lastRule = currentLastRule;\n\n if (!context.lastRule && rule.isVisible()) {\n output.add(context.compress ? '' : (`\\n${tabRuleStr}`));\n } else {\n context.lastRule = false;\n }\n }\n\n if (!this.root) {\n output.add((context.compress ? '}' : `\\n${tabSetStr}}`));\n context.tabLevel--;\n }\n\n if (!output.isEmpty() && !context.compress && this.firstRoot) {\n output.add('\\n');\n }\n }\n\n joinSelectors(paths, context, selectors) {\n for (let s = 0; s < selectors.length; s++) {\n this.joinSelector(paths, context, selectors[s]);\n }\n }\n\n joinSelector(paths, context, selector) {\n\n function createParenthesis(elementsToPak, originalElement) {\n let replacementParen, j;\n if (elementsToPak.length === 0) {\n replacementParen = new Paren(elementsToPak[0]);\n } else {\n const insideParent = new Array(elementsToPak.length);\n for (j = 0; j < elementsToPak.length; j++) {\n insideParent[j] = new Element(\n null,\n elementsToPak[j],\n originalElement.isVariable,\n originalElement._index,\n originalElement._fileInfo\n );\n }\n replacementParen = new Paren(new Selector(insideParent));\n }\n return replacementParen;\n }\n\n function createSelector(containedElement, originalElement) {\n let element, selector;\n element = new Element(null, containedElement, originalElement.isVariable, originalElement._index, originalElement._fileInfo);\n selector = new Selector([element]);\n return selector;\n }\n\n // joins selector path from `beginningPath` with selector path in `addPath`\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns concatenated path\n function addReplacementIntoPath(beginningPath, addPath, replacedElement, originalSelector) {\n let newSelectorPath, lastSelector, newJoinedSelector;\n // our new selector path\n newSelectorPath = [];\n\n // construct the joined selector - if & is the first thing this will be empty,\n // if not newJoinedSelector will be the last set of elements in the selector\n if (beginningPath.length > 0) {\n newSelectorPath = utils.copyArray(beginningPath);\n lastSelector = newSelectorPath.pop();\n newJoinedSelector = originalSelector.createDerived(utils.copyArray(lastSelector.elements));\n }\n else {\n newJoinedSelector = originalSelector.createDerived([]);\n }\n\n if (addPath.length > 0) {\n // /deep/ is a CSS4 selector - (removed, so should deprecate)\n // that is valid without anything in front of it\n // so if the & does not have a combinator that is \"\" or \" \" then\n // and there is a combinator on the parent, then grab that.\n // this also allows + a { & .b { .a & { ... though not sure why you would want to do that\n let combinator = replacedElement.combinator;\n\n const parentEl = addPath[0].elements[0];\n if (combinator.emptyOrWhitespace && !parentEl.combinator.emptyOrWhitespace) {\n combinator = parentEl.combinator;\n }\n // join the elements so far with the first part of the parent\n newJoinedSelector.elements.push(new Element(\n combinator,\n parentEl.value,\n replacedElement.isVariable,\n replacedElement._index,\n replacedElement._fileInfo\n ));\n newJoinedSelector.elements = newJoinedSelector.elements.concat(addPath[0].elements.slice(1));\n }\n\n // now add the joined selector - but only if it is not empty\n if (newJoinedSelector.elements.length !== 0) {\n newSelectorPath.push(newJoinedSelector);\n }\n\n // put together the parent selectors after the join (e.g. the rest of the parent)\n if (addPath.length > 1) {\n let restOfPath = addPath.slice(1);\n restOfPath = restOfPath.map(function (selector) {\n return selector.createDerived(selector.elements, []);\n });\n newSelectorPath = newSelectorPath.concat(restOfPath);\n }\n return newSelectorPath;\n }\n\n // joins selector path from `beginningPath` with every selector path in `addPaths` array\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns array with all concatenated paths\n function addAllReplacementsIntoPath( beginningPath, addPaths, replacedElement, originalSelector, result) {\n let j;\n for (j = 0; j < beginningPath.length; j++) {\n const newSelectorPath = addReplacementIntoPath(beginningPath[j], addPaths, replacedElement, originalSelector);\n result.push(newSelectorPath);\n }\n return result;\n }\n\n function mergeElementsOnToSelectors(elements, selectors) {\n let i, sel;\n\n if (elements.length === 0) {\n return ;\n }\n if (selectors.length === 0) {\n selectors.push([ new Selector(elements) ]);\n return;\n }\n\n for (i = 0; (sel = selectors[i]); i++) {\n // if the previous thing in sel is a parent this needs to join on to it\n if (sel.length > 0) {\n sel[sel.length - 1] = sel[sel.length - 1].createDerived(sel[sel.length - 1].elements.concat(elements));\n }\n else {\n sel.push(new Selector(elements));\n }\n }\n }\n\n // replace all parent selectors inside `inSelector` by content of `context` array\n // resulting selectors are returned inside `paths` array\n // returns true if `inSelector` contained at least one parent selector\n function replaceParentSelector(paths, context, inSelector) {\n // The paths are [[Selector]]\n // The first list is a list of comma separated selectors\n // The inner list is a list of inheritance separated selectors\n // e.g.\n // .a, .b {\n // .c {\n // }\n // }\n // == [[.a] [.c]] [[.b] [.c]]\n //\n let i, j, k, currentElements, newSelectors, selectorsMultiplied, sel, el, hadParentSelector = false, length, lastSelector;\n function findNestedSelector(element) {\n let maybeSelector;\n if (!(element.value instanceof Paren)) {\n return null;\n }\n\n maybeSelector = element.value.value;\n if (!(maybeSelector instanceof Selector)) {\n return null;\n }\n\n return maybeSelector;\n }\n\n // the elements from the current selector so far\n currentElements = [];\n // the current list of new selectors to add to the path.\n // We will build it up. We initiate it with one empty selector as we \"multiply\" the new selectors\n // by the parents\n newSelectors = [\n []\n ];\n\n for (i = 0; (el = inSelector.elements[i]); i++) {\n // non parent reference elements just get added\n if (el.value !== '&') {\n const nestedSelector = findNestedSelector(el);\n if (nestedSelector != null) {\n // merge the current list of non parent selector elements\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n const nestedPaths = [];\n let replaced;\n const replacedNewSelectors = [];\n replaced = replaceParentSelector(nestedPaths, context, nestedSelector);\n hadParentSelector = hadParentSelector || replaced;\n // the nestedPaths array should have only one member - replaceParentSelector does not multiply selectors\n for (k = 0; k < nestedPaths.length; k++) {\n const replacementSelector = createSelector(createParenthesis(nestedPaths[k], el), el);\n addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors);\n }\n newSelectors = replacedNewSelectors;\n currentElements = [];\n } else {\n currentElements.push(el);\n }\n\n } else {\n hadParentSelector = true;\n // the new list of selectors to add\n selectorsMultiplied = [];\n\n // merge the current list of non parent selector elements\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n // loop through our current selectors\n for (j = 0; j < newSelectors.length; j++) {\n sel = newSelectors[j];\n // if we don't have any parent paths, the & might be in a mixin so that it can be used\n // whether there are parents or not\n if (context.length === 0) {\n // the combinator used on el should now be applied to the next element instead so that\n // it is not lost\n if (sel.length > 0) {\n sel[0].elements.push(new Element(el.combinator, '', el.isVariable, el._index, el._fileInfo));\n }\n selectorsMultiplied.push(sel);\n }\n else {\n // and the parent selectors\n for (k = 0; k < context.length; k++) {\n // We need to put the current selectors\n // then join the last selector's elements on to the parents selectors\n const newSelectorPath = addReplacementIntoPath(sel, context[k], el, inSelector);\n // add that to our new set of selectors\n selectorsMultiplied.push(newSelectorPath);\n }\n }\n }\n\n // our new selectors has been multiplied, so reset the state\n newSelectors = selectorsMultiplied;\n currentElements = [];\n }\n }\n\n // if we have any elements left over (e.g. .a& .b == .b)\n // add them on to all the current selectors\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n for (i = 0; i < newSelectors.length; i++) {\n length = newSelectors[i].length;\n if (length > 0) {\n paths.push(newSelectors[i]);\n lastSelector = newSelectors[i][length - 1];\n newSelectors[i][length - 1] = lastSelector.createDerived(lastSelector.elements, inSelector.extendList);\n }\n }\n\n return hadParentSelector;\n }\n\n function deriveSelector(visibilityInfo, deriveFrom) {\n const newSelector = deriveFrom.createDerived(deriveFrom.elements, deriveFrom.extendList, deriveFrom.evaldCondition);\n newSelector.copyVisibilityInfo(visibilityInfo);\n return newSelector;\n }\n\n // joinSelector code follows\n let i, newPaths, hadParentSelector;\n\n newPaths = [];\n hadParentSelector = replaceParentSelector(newPaths, context, selector);\n\n if (!hadParentSelector) {\n if (context.length > 0) {\n newPaths = [];\n for (i = 0; i < context.length; i++) {\n\n const concatenated = context[i].map(deriveSelector.bind(this, selector.visibilityInfo()));\n\n concatenated.push(selector);\n newPaths.push(concatenated);\n }\n }\n else {\n newPaths = [[selector]];\n }\n }\n\n for (i = 0; i < newPaths.length; i++) {\n paths.push(newPaths[i]);\n }\n\n }\n}\n\nRuleset.prototype.type = 'Ruleset';\nRuleset.prototype.isRuleset = true;\nexport default Ruleset;\n","import Node from './node';\nimport Selector from './selector';\nimport Ruleset from './ruleset';\nimport Anonymous from './anonymous';\n\nclass AtRule extends Node {\n constructor(\n name,\n value,\n rules,\n index,\n currentFileInfo,\n debugInfo,\n isRooted,\n visibilityInfo\n ) {\n super();\n\n let i;\n\n this.name = name;\n this.value = (value instanceof Node) ? value : (value ? new Anonymous(value) : value);\n if (rules) {\n if (Array.isArray(rules)) {\n this.rules = rules;\n } else {\n this.rules = [rules];\n this.rules[0].selectors = (new Selector([], null, null, index, currentFileInfo)).createEmptySelectors();\n }\n for (i = 0; i < this.rules.length; i++) {\n this.rules[i].allowImports = true;\n }\n this.setParent(this.rules, this);\n }\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.debugInfo = debugInfo;\n this.isRooted = isRooted || false;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n }\n\n accept(visitor) {\n const value = this.value, rules = this.rules;\n if (rules) {\n this.rules = visitor.visitArray(rules);\n }\n if (value) {\n this.value = visitor.visit(value);\n }\n }\n\n isRulesetLike() {\n return this.rules || !this.isCharset();\n }\n\n isCharset() {\n return '@charset' === this.name;\n }\n\n genCSS(context, output) {\n const value = this.value, rules = this.rules;\n output.add(this.name, this.fileInfo(), this.getIndex());\n if (value) {\n output.add(' ');\n value.genCSS(context, output);\n }\n if (rules) {\n this.outputRuleset(context, output, rules);\n } else {\n output.add(';');\n }\n }\n\n eval(context) {\n let mediaPathBackup, mediaBlocksBackup, value = this.value, rules = this.rules;\n\n // media stored inside other atrule should not bubble over it\n // backpup media bubbling information\n mediaPathBackup = context.mediaPath;\n mediaBlocksBackup = context.mediaBlocks;\n // deleted media bubbling information\n context.mediaPath = [];\n context.mediaBlocks = [];\n\n if (value) {\n value = value.eval(context);\n }\n if (rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n rules = [rules[0].eval(context)];\n rules[0].root = true;\n }\n // restore media bubbling information\n context.mediaPath = mediaPathBackup;\n context.mediaBlocks = mediaBlocksBackup;\n\n return new AtRule(this.name, value, rules,\n this.getIndex(), this.fileInfo(), this.debugInfo, this.isRooted, this.visibilityInfo());\n }\n\n variable(name) {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.variable.call(this.rules[0], name);\n }\n }\n\n find() {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.find.apply(this.rules[0], arguments);\n }\n }\n\n rulesets() {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.rulesets.apply(this.rules[0]);\n }\n }\n\n outputRuleset(context, output, rules) {\n const ruleCnt = rules.length;\n let i;\n context.tabLevel = (context.tabLevel | 0) + 1;\n\n // Compressed\n if (context.compress) {\n output.add('{');\n for (i = 0; i < ruleCnt; i++) {\n rules[i].genCSS(context, output);\n }\n output.add('}');\n context.tabLevel--;\n return;\n }\n\n // Non-compressed\n const tabSetStr = `\\n${Array(context.tabLevel).join(' ')}`, tabRuleStr = `${tabSetStr} `;\n if (!ruleCnt) {\n output.add(` {${tabSetStr}}`);\n } else {\n output.add(` {${tabRuleStr}`);\n rules[0].genCSS(context, output);\n for (i = 1; i < ruleCnt; i++) {\n output.add(tabRuleStr);\n rules[i].genCSS(context, output);\n }\n output.add(`${tabSetStr}}`);\n }\n\n context.tabLevel--;\n }\n}\n\nAtRule.prototype.type = 'AtRule';\nexport default AtRule;\n","import Node from './node';\nimport contexts from '../contexts';\nimport * as utils from '../utils';\n\nclass DetachedRuleset extends Node {\n constructor(ruleset, frames) {\n super();\n\n this.ruleset = ruleset;\n this.frames = frames;\n this.setParent(this.ruleset, this);\n }\n\n accept(visitor) {\n this.ruleset = visitor.visit(this.ruleset);\n }\n\n eval(context) {\n const frames = this.frames || utils.copyArray(context.frames);\n return new DetachedRuleset(this.ruleset, frames);\n }\n\n callEval(context) {\n return this.ruleset.eval(this.frames ? new contexts.Eval(context, this.frames.concat(context.frames)) : context);\n }\n}\n\nDetachedRuleset.prototype.type = 'DetachedRuleset';\nDetachedRuleset.prototype.evalFirst = true;\nexport default DetachedRuleset;\n","import Node from './node';\nimport unitConversions from '../data/unit-conversions';\nimport * as utils from '../utils';\n\nclass Unit extends Node {\n constructor(numerator, denominator, backupUnit) {\n super();\n\n this.numerator = numerator ? utils.copyArray(numerator).sort() : [];\n this.denominator = denominator ? utils.copyArray(denominator).sort() : [];\n if (backupUnit) {\n this.backupUnit = backupUnit;\n } else if (numerator && numerator.length) {\n this.backupUnit = numerator[0];\n }\n }\n\n clone() {\n return new Unit(utils.copyArray(this.numerator), utils.copyArray(this.denominator), this.backupUnit);\n }\n\n genCSS(context, output) {\n // Dimension checks the unit is singular and throws an error if in strict math mode.\n const strictUnits = context && context.strictUnits;\n if (this.numerator.length === 1) {\n output.add(this.numerator[0]); // the ideal situation\n } else if (!strictUnits && this.backupUnit) {\n output.add(this.backupUnit);\n } else if (!strictUnits && this.denominator.length) {\n output.add(this.denominator[0]);\n }\n }\n\n toString() {\n let i, returnStr = this.numerator.join('*');\n for (i = 0; i < this.denominator.length; i++) {\n returnStr += `/${this.denominator[i]}`;\n }\n return returnStr;\n }\n\n compare(other) {\n return this.is(other.toString()) ? 0 : undefined;\n }\n\n is(unitString) {\n return this.toString().toUpperCase() === unitString.toUpperCase();\n }\n\n isLength() {\n return RegExp('^(px|em|ex|ch|rem|in|cm|mm|pc|pt|ex|vw|vh|vmin|vmax)$', 'gi').test(this.toCSS());\n }\n\n isEmpty() {\n return this.numerator.length === 0 && this.denominator.length === 0;\n }\n\n isSingular() {\n return this.numerator.length <= 1 && this.denominator.length === 0;\n }\n\n map(callback) {\n let i;\n\n for (i = 0; i < this.numerator.length; i++) {\n this.numerator[i] = callback(this.numerator[i], false);\n }\n\n for (i = 0; i < this.denominator.length; i++) {\n this.denominator[i] = callback(this.denominator[i], true);\n }\n }\n\n usedUnits() {\n let group;\n const result = {};\n let mapUnit;\n let groupName;\n\n mapUnit = function (atomicUnit) {\n /* jshint loopfunc:true */\n if (group.hasOwnProperty(atomicUnit) && !result[groupName]) {\n result[groupName] = atomicUnit;\n }\n\n return atomicUnit;\n };\n\n for (groupName in unitConversions) {\n if (unitConversions.hasOwnProperty(groupName)) {\n group = unitConversions[groupName];\n\n this.map(mapUnit);\n }\n }\n\n return result;\n }\n\n cancel() {\n const counter = {};\n let atomicUnit;\n let i;\n\n for (i = 0; i < this.numerator.length; i++) {\n atomicUnit = this.numerator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) + 1;\n }\n\n for (i = 0; i < this.denominator.length; i++) {\n atomicUnit = this.denominator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) - 1;\n }\n\n this.numerator = [];\n this.denominator = [];\n\n for (atomicUnit in counter) {\n if (counter.hasOwnProperty(atomicUnit)) {\n const count = counter[atomicUnit];\n\n if (count > 0) {\n for (i = 0; i < count; i++) {\n this.numerator.push(atomicUnit);\n }\n } else if (count < 0) {\n for (i = 0; i < -count; i++) {\n this.denominator.push(atomicUnit);\n }\n }\n }\n }\n\n this.numerator.sort();\n this.denominator.sort();\n }\n}\n\nUnit.prototype.type = 'Unit';\nexport default Unit;\n","import Node from './node';\nimport unitConversions from '../data/unit-conversions';\nimport Unit from './unit';\nimport Color from './color';\n\n//\n// A number with a unit\n//\nclass Dimension extends Node {\n constructor(value, unit) {\n super();\n\n this.value = parseFloat(value);\n if (isNaN(this.value)) {\n throw new Error('Dimension is not a number.');\n }\n this.unit = (unit && unit instanceof Unit) ? unit :\n new Unit(unit ? [unit] : undefined);\n this.setParent(this.unit, this);\n }\n\n accept(visitor) {\n this.unit = visitor.visit(this.unit);\n }\n\n eval(context) {\n return this;\n }\n\n toColor() {\n return new Color([this.value, this.value, this.value]);\n }\n\n genCSS(context, output) {\n if ((context && context.strictUnits) && !this.unit.isSingular()) {\n throw new Error(`Multiple units in dimension. Correct the units or use the unit function. Bad unit: ${this.unit.toString()}`);\n }\n\n const value = this.fround(context, this.value);\n let strValue = String(value);\n\n if (value !== 0 && value < 0.000001 && value > -0.000001) {\n // would be output 1e-6 etc.\n strValue = value.toFixed(20).replace(/0+$/, '');\n }\n\n if (context && context.compress) {\n // Zero values doesn't need a unit\n if (value === 0 && this.unit.isLength()) {\n output.add(strValue);\n return;\n }\n\n // Float values doesn't need a leading zero\n if (value > 0 && value < 1) {\n strValue = (strValue).substr(1);\n }\n }\n\n output.add(strValue);\n this.unit.genCSS(context, output);\n }\n\n // In an operation between two Dimensions,\n // we default to the first Dimension's unit,\n // so `1px + 2` will yield `3px`.\n operate(context, op, other) {\n /* jshint noempty:false */\n let value = this._operate(context, op, this.value, other.value), unit = this.unit.clone();\n\n if (op === '+' || op === '-') {\n if (unit.numerator.length === 0 && unit.denominator.length === 0) {\n unit = other.unit.clone();\n if (this.unit.backupUnit) {\n unit.backupUnit = this.unit.backupUnit;\n }\n } else if (other.unit.numerator.length === 0 && unit.denominator.length === 0) {\n // do nothing\n } else {\n other = other.convertTo(this.unit.usedUnits());\n\n if (context.strictUnits && other.unit.toString() !== unit.toString()) {\n throw new Error(`Incompatible units. Change the units or use the unit function. Bad units: '${unit.toString()}' and '${other.unit.toString()}'.`);\n }\n\n value = this._operate(context, op, this.value, other.value);\n }\n } else if (op === '*') {\n unit.numerator = unit.numerator.concat(other.unit.numerator).sort();\n unit.denominator = unit.denominator.concat(other.unit.denominator).sort();\n unit.cancel();\n } else if (op === '/') {\n unit.numerator = unit.numerator.concat(other.unit.denominator).sort();\n unit.denominator = unit.denominator.concat(other.unit.numerator).sort();\n unit.cancel();\n }\n return new Dimension(value, unit);\n }\n\n compare(other) {\n let a, b;\n\n if (!(other instanceof Dimension)) {\n return undefined;\n }\n\n if (this.unit.isEmpty() || other.unit.isEmpty()) {\n a = this;\n b = other;\n } else {\n a = this.unify();\n b = other.unify();\n if (a.unit.compare(b.unit) !== 0) {\n return undefined;\n }\n }\n\n return Node.numericCompare(a.value, b.value);\n }\n\n unify() {\n return this.convertTo({ length: 'px', duration: 's', angle: 'rad' });\n }\n\n convertTo(conversions) {\n let value = this.value;\n const unit = this.unit.clone();\n let i;\n let groupName;\n let group;\n let targetUnit;\n let derivedConversions = {};\n let applyUnit;\n\n if (typeof conversions === 'string') {\n for (i in unitConversions) {\n if (unitConversions[i].hasOwnProperty(conversions)) {\n derivedConversions = {};\n derivedConversions[i] = conversions;\n }\n }\n conversions = derivedConversions;\n }\n applyUnit = function (atomicUnit, denominator) {\n /* jshint loopfunc:true */\n if (group.hasOwnProperty(atomicUnit)) {\n if (denominator) {\n value = value / (group[atomicUnit] / group[targetUnit]);\n } else {\n value = value * (group[atomicUnit] / group[targetUnit]);\n }\n\n return targetUnit;\n }\n\n return atomicUnit;\n };\n\n for (groupName in conversions) {\n if (conversions.hasOwnProperty(groupName)) {\n targetUnit = conversions[groupName];\n group = unitConversions[groupName];\n\n unit.map(applyUnit);\n }\n }\n\n unit.cancel();\n\n return new Dimension(value, unit);\n }\n}\n\nDimension.prototype.type = 'Dimension';\nexport default Dimension;\n","import Node from './node';\nimport Color from './color';\nimport Dimension from './dimension';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\n\nclass Operation extends Node {\n constructor(op, operands, isSpaced) {\n super();\n\n this.op = op.trim();\n this.operands = operands;\n this.isSpaced = isSpaced;\n }\n\n accept(visitor) {\n this.operands = visitor.visitArray(this.operands);\n }\n\n eval(context) {\n let a = this.operands[0].eval(context), b = this.operands[1].eval(context), op;\n\n if (context.isMathOn(this.op)) {\n op = this.op === './' ? '/' : this.op;\n if (a instanceof Dimension && b instanceof Color) {\n a = a.toColor();\n }\n if (b instanceof Dimension && a instanceof Color) {\n b = b.toColor();\n }\n if (!a.operate) {\n if (a instanceof Operation && a.op === '/' && context.math === MATH.PARENS_DIVISION) {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n throw { type: 'Operation',\n message: 'Operation on an invalid type' };\n }\n\n return a.operate(context, op, b);\n } else {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n }\n\n genCSS(context, output) {\n this.operands[0].genCSS(context, output);\n if (this.isSpaced) {\n output.add(' ');\n }\n output.add(this.op);\n if (this.isSpaced) {\n output.add(' ');\n }\n this.operands[1].genCSS(context, output);\n }\n}\n\nOperation.prototype.type = 'Operation';\nexport default Operation;\n","import Node from './node';\nimport Paren from './paren';\nimport Comment from './comment';\nimport Dimension from './dimension';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\nclass Expression extends Node {\n constructor(value, noSpacing) {\n super();\n\n this.value = value;\n this.noSpacing = noSpacing;\n if (!value) {\n throw new Error('Expression requires an array parameter');\n }\n }\n\n accept(visitor) {\n this.value = visitor.visitArray(this.value);\n }\n\n eval(context) {\n let returnValue;\n const mathOn = context.isMathOn();\n const inParenthesis = this.parens;\n\n let doubleParen = false;\n if (inParenthesis) {\n context.inParenthesis();\n }\n if (this.value.length > 1) {\n returnValue = new Expression(this.value.map(function (e) {\n if (!e.eval) {\n return e;\n }\n return e.eval(context);\n }), this.noSpacing);\n } else if (this.value.length === 1) {\n if (this.value[0].parens && !this.value[0].parensInOp && !context.inCalc) {\n doubleParen = true;\n }\n returnValue = this.value[0].eval(context);\n } else {\n returnValue = this;\n }\n if (inParenthesis) {\n context.outOfParenthesis();\n }\n if (this.parens && this.parensInOp && !mathOn && !doubleParen \n && (!(returnValue instanceof Dimension))) {\n returnValue = new Paren(returnValue);\n }\n return returnValue;\n }\n\n genCSS(context, output) {\n for (let i = 0; i < this.value.length; i++) {\n this.value[i].genCSS(context, output);\n if (!this.noSpacing && i + 1 < this.value.length) {\n output.add(' ');\n }\n }\n }\n\n throwAwayComments() {\n this.value = this.value.filter(function(v) {\n return !(v instanceof Comment);\n });\n }\n}\n\nExpression.prototype.type = 'Expression';\nexport default Expression;\n","import Expression from '../tree/expression';\n\nclass functionCaller {\n constructor(name, context, index, currentFileInfo) {\n this.name = name.toLowerCase();\n this.index = index;\n this.context = context;\n this.currentFileInfo = currentFileInfo;\n\n this.func = context.frames[0].functionRegistry.get(this.name);\n }\n\n isValid() {\n return Boolean(this.func);\n }\n\n call(args) {\n if (!(Array.isArray(args))) {\n args = [args];\n }\n const evalArgs = this.func.evalArgs;\n if (evalArgs !== false) {\n args = args.map(a => a.eval(this.context));\n }\n const commentFilter = item => !(item.type === 'Comment');\n\n // This code is terrible and should be replaced as per this issue...\n // https://github.com/less/less.js/issues/2477\n args = args\n .filter(commentFilter)\n .map(item => {\n if (item.type === 'Expression') {\n const subNodes = item.value.filter(commentFilter);\n if (subNodes.length === 1) {\n return subNodes[0];\n } else {\n return new Expression(subNodes);\n }\n }\n return item;\n });\n\n if (evalArgs === false) {\n return this.func(this.context, ...args);\n }\n\n return this.func(...args);\n }\n}\n\nexport default functionCaller;\n","import Node from './node';\nimport Anonymous from './anonymous';\nimport FunctionCaller from '../functions/function-caller';\nimport logger from '../logger';\n\n//\n// A function call node.\n//\nclass Call extends Node {\n constructor(name, args, index, currentFileInfo) {\n super();\n\n this.name = name;\n this.args = args;\n this.calc = name === 'calc';\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n accept(visitor) {\n if (this.args) {\n this.args = visitor.visitArray(this.args);\n }\n }\n\n //\n // When evaluating a function call,\n // we either find the function in the functionRegistry,\n // in which case we call it, passing the evaluated arguments,\n // if this returns null or we cannot find the function, we\n // simply print it out as it appeared originally [2].\n //\n // The reason why we evaluate the arguments, is in the case where\n // we try to pass a variable to a function, like: `saturate(@color)`.\n // The function should receive the value, not the variable.\n //\n eval(context) {\n /**\n * Turn off math for calc(), and switch back on for evaluating nested functions\n */\n const currentMathContext = context.mathOn;\n context.mathOn = !this.calc;\n if (this.calc || context.inCalc) {\n context.enterCalc();\n }\n\n const exitCalc = () => {\n if (this.calc || context.inCalc) {\n context.exitCalc();\n }\n context.mathOn = currentMathContext;\n };\n\n let result;\n const funcCaller = new FunctionCaller(this.name, context, this.getIndex(), this.fileInfo());\n\n if (funcCaller.isValid()) {\n try {\n result = funcCaller.call(this.args);\n exitCalc();\n } catch (e) {\n if (e.hasOwnProperty('line') && e.hasOwnProperty('column')) {\n throw e;\n }\n throw { \n type: e.type || 'Runtime',\n message: `Error evaluating function \\`${this.name}\\`${e.message ? `: ${e.message}` : ''}`,\n index: this.getIndex(), \n filename: this.fileInfo().filename,\n line: e.lineNumber,\n column: e.columnNumber\n };\n }\n }\n\n if (result !== null && result !== undefined) {\n // Results that that are not nodes are cast as Anonymous nodes\n // Falsy values or booleans are returned as empty nodes\n if (!(result instanceof Node)) {\n if (!result || result === true) {\n result = new Anonymous(null); \n }\n else {\n result = new Anonymous(result.toString()); \n }\n \n }\n result._index = this._index;\n result._fileInfo = this._fileInfo;\n return result;\n }\n\n const args = this.args.map(a => a.eval(context));\n exitCalc();\n\n return new Call(this.name, args, this.getIndex(), this.fileInfo());\n }\n\n genCSS(context, output) {\n output.add(`${this.name}(`, this.fileInfo(), this.getIndex());\n\n for (let i = 0; i < this.args.length; i++) {\n this.args[i].genCSS(context, output);\n if (i + 1 < this.args.length) {\n output.add(', ');\n }\n }\n\n output.add(')');\n }\n}\n\nCall.prototype.type = 'Call';\nexport default Call;\n","import Node from './node';\nimport Call from './call';\n\nclass Variable extends Node {\n constructor(name, index, currentFileInfo) {\n super();\n\n this.name = name;\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n eval(context) {\n let variable, name = this.name;\n\n if (name.indexOf('@@') === 0) {\n name = `@${new Variable(name.slice(1), this.getIndex(), this.fileInfo()).eval(context).value}`;\n }\n\n if (this.evaluating) {\n throw { type: 'Name',\n message: `Recursive variable definition for ${name}`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n variable = this.find(context.frames, function (frame) {\n const v = frame.variable(name);\n if (v) {\n if (v.important) {\n const importantScope = context.importantScope[context.importantScope.length - 1];\n importantScope.important = v.important;\n }\n // If in calc, wrap vars in a function call to cascade evaluate args first\n if (context.inCalc) {\n return (new Call('_SELF', [v.value])).eval(context);\n }\n else {\n return v.value.eval(context);\n }\n }\n });\n if (variable) {\n this.evaluating = false;\n return variable;\n } else {\n throw { type: 'Name',\n message: `variable ${name} is undefined`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n }\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n}\n\nVariable.prototype.type = 'Variable';\nexport default Variable;\n","import Node from './node';\nimport Declaration from './declaration';\n\nclass Property extends Node {\n constructor(name, index, currentFileInfo) {\n super();\n\n this.name = name;\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n eval(context) {\n let property;\n const name = this.name;\n // TODO: shorten this reference\n const mergeRules = context.pluginManager.less.visitors.ToCSSVisitor.prototype._mergeRules;\n\n if (this.evaluating) {\n throw { type: 'Name',\n message: `Recursive property reference for ${name}`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n property = this.find(context.frames, function (frame) {\n let v;\n const vArr = frame.property(name);\n if (vArr) {\n for (let i = 0; i < vArr.length; i++) {\n v = vArr[i];\n\n vArr[i] = new Declaration(v.name,\n v.value,\n v.important,\n v.merge,\n v.index,\n v.currentFileInfo,\n v.inline,\n v.variable\n );\n }\n mergeRules(vArr);\n\n v = vArr[vArr.length - 1];\n if (v.important) {\n const importantScope = context.importantScope[context.importantScope.length - 1];\n importantScope.important = v.important;\n }\n v = v.value.eval(context);\n return v;\n }\n });\n if (property) {\n this.evaluating = false;\n return property;\n } else {\n throw { type: 'Name',\n message: `Property '${name}' is undefined`,\n filename: this.currentFileInfo.filename,\n index: this.index };\n }\n }\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n}\n\nProperty.prototype.type = 'Property';\nexport default Property;\n","import Node from './node';\n\nclass Attribute extends Node {\n constructor(key, op, value) {\n super();\n\n this.key = key;\n this.op = op;\n this.value = value;\n }\n\n eval(context) {\n return new Attribute(this.key.eval ? this.key.eval(context) : this.key,\n this.op, (this.value && this.value.eval) ? this.value.eval(context) : this.value);\n }\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n }\n\n toCSS(context) {\n let value = this.key.toCSS ? this.key.toCSS(context) : this.key;\n\n if (this.op) {\n value += this.op;\n value += (this.value.toCSS ? this.value.toCSS(context) : this.value);\n }\n\n return `[${value}]`;\n }\n}\n\nAttribute.prototype.type = 'Attribute';\nexport default Attribute;\n","import Node from './node';\nimport Variable from './variable';\nimport Property from './property';\n\n\nclass Quoted extends Node {\n constructor(str, content, escaped, index, currentFileInfo) {\n super();\n\n this.escaped = (escaped == null) ? true : escaped;\n this.value = content || '';\n this.quote = str.charAt(0);\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.variableRegex = /@\\{([\\w-]+)\\}/g;\n this.propRegex = /\\$\\{([\\w-]+)\\}/g;\n this.allowRoot = escaped;\n }\n\n genCSS(context, output) {\n if (!this.escaped) {\n output.add(this.quote, this.fileInfo(), this.getIndex());\n }\n output.add(this.value);\n if (!this.escaped) {\n output.add(this.quote);\n }\n }\n\n containsVariables() {\n return this.value.match(this.variableRegex);\n }\n\n eval(context) {\n const that = this;\n let value = this.value;\n const variableReplacement = function (_, name) {\n const v = new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v.value : v.toCSS();\n };\n const propertyReplacement = function (_, name) {\n const v = new Property(`$${name}`, that.getIndex(), that.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v.value : v.toCSS();\n };\n function iterativeReplace(value, regexp, replacementFnc) {\n let evaluatedValue = value;\n do {\n value = evaluatedValue.toString();\n evaluatedValue = value.replace(regexp, replacementFnc);\n } while (value !== evaluatedValue);\n return evaluatedValue;\n }\n value = iterativeReplace(value, this.variableRegex, variableReplacement);\n value = iterativeReplace(value, this.propRegex, propertyReplacement);\n return new Quoted(this.quote + value + this.quote, value, this.escaped, this.getIndex(), this.fileInfo());\n }\n\n compare(other) {\n // when comparing quoted strings allow the quote to differ\n if (other.type === 'Quoted' && !this.escaped && !other.escaped) {\n return Node.numericCompare(this.value, other.value);\n } else {\n return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n }\n }\n}\n\nQuoted.prototype.type = 'Quoted';\nexport default Quoted;\n","import Node from './node';\n\nclass URL extends Node {\n constructor(val, index, currentFileInfo, isEvald) {\n super();\n\n this.value = val;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.isEvald = isEvald;\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n genCSS(context, output) {\n output.add('url(');\n this.value.genCSS(context, output);\n output.add(')');\n }\n\n eval(context) {\n const val = this.value.eval(context);\n let rootpath;\n\n if (!this.isEvald) {\n // Add the rootpath if the URL requires a rewrite\n rootpath = this.fileInfo() && this.fileInfo().rootpath;\n if (typeof rootpath === 'string' &&\n typeof val.value === 'string' &&\n context.pathRequiresRewrite(val.value)) {\n if (!val.quote) {\n rootpath = escapePath(rootpath);\n }\n val.value = context.rewritePath(val.value, rootpath);\n } else {\n val.value = context.normalizePath(val.value);\n }\n\n // Add url args if enabled\n if (context.urlArgs) {\n if (!val.value.match(/^\\s*data:/)) {\n const delimiter = val.value.indexOf('?') === -1 ? '?' : '&';\n const urlArgs = delimiter + context.urlArgs;\n if (val.value.indexOf('#') !== -1) {\n val.value = val.value.replace('#', `${urlArgs}#`);\n } else {\n val.value += urlArgs;\n }\n }\n }\n }\n\n return new URL(val, this.getIndex(), this.fileInfo(), true);\n }\n}\n\nURL.prototype.type = 'Url';\n\nfunction escapePath(path) {\n return path.replace(/[\\(\\)'\"\\s]/g, function(match) { return `\\\\${match}`; });\n}\n\nexport default URL;\n","import Ruleset from './ruleset';\nimport Value from './value';\nimport Selector from './selector';\nimport Anonymous from './anonymous';\nimport Expression from './expression';\nimport AtRule from './atrule';\nimport * as utils from '../utils';\n\nclass Media extends AtRule {\n constructor(value, features, index, currentFileInfo, visibilityInfo) {\n super();\n\n this._index = index;\n this._fileInfo = currentFileInfo;\n\n const selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors();\n\n this.features = new Value(features);\n this.rules = [new Ruleset(selectors, value)];\n this.rules[0].allowImports = true;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n this.setParent(selectors, this);\n this.setParent(this.features, this);\n this.setParent(this.rules, this);\n }\n\n isRulesetLike() {\n return true;\n }\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this.features);\n }\n if (this.rules) {\n this.rules = visitor.visitArray(this.rules);\n }\n }\n\n genCSS(context, output) {\n output.add('@media ', this._fileInfo, this._index);\n this.features.genCSS(context, output);\n this.outputRuleset(context, output, this.rules);\n }\n\n eval(context) {\n if (!context.mediaBlocks) {\n context.mediaBlocks = [];\n context.mediaPath = [];\n }\n\n const media = new Media(null, [], this._index, this._fileInfo, this.visibilityInfo());\n if (this.debugInfo) {\n this.rules[0].debugInfo = this.debugInfo;\n media.debugInfo = this.debugInfo;\n }\n \n media.features = this.features.eval(context);\n\n context.mediaPath.push(media);\n context.mediaBlocks.push(media);\n\n this.rules[0].functionRegistry = context.frames[0].functionRegistry.inherit();\n context.frames.unshift(this.rules[0]);\n media.rules = [this.rules[0].eval(context)];\n context.frames.shift();\n\n context.mediaPath.pop();\n\n return context.mediaPath.length === 0 ? media.evalTop(context) :\n media.evalNested(context);\n }\n\n evalTop(context) {\n let result = this;\n\n // Render all dependent Media blocks.\n if (context.mediaBlocks.length > 1) {\n const selectors = (new Selector([], null, null, this.getIndex(), this.fileInfo())).createEmptySelectors();\n result = new Ruleset(selectors, context.mediaBlocks);\n result.multiMedia = true;\n result.copyVisibilityInfo(this.visibilityInfo());\n this.setParent(result, this);\n }\n\n delete context.mediaBlocks;\n delete context.mediaPath;\n\n return result;\n }\n\n evalNested(context) {\n let i;\n let value;\n const path = context.mediaPath.concat([this]);\n\n // Extract the media-query conditions separated with `,` (OR).\n for (i = 0; i < path.length; i++) {\n value = path[i].features instanceof Value ?\n path[i].features.value : path[i].features;\n path[i] = Array.isArray(value) ? value : [value];\n }\n\n // Trace all permutations to generate the resulting media-query.\n //\n // (a, b and c) with nested (d, e) ->\n // a and d\n // a and e\n // b and c and d\n // b and c and e\n this.features = new Value(this.permute(path).map(path => {\n path = path.map(fragment => fragment.toCSS ? fragment : new Anonymous(fragment));\n\n for (i = path.length - 1; i > 0; i--) {\n path.splice(i, 0, new Anonymous('and'));\n }\n\n return new Expression(path);\n }));\n this.setParent(this.features, this);\n\n // Fake a tree-node that doesn't output anything.\n return new Ruleset([], []);\n }\n\n permute(arr) {\n if (arr.length === 0) {\n return [];\n } else if (arr.length === 1) {\n return arr[0];\n } else {\n const result = [];\n const rest = this.permute(arr.slice(1));\n for (let i = 0; i < rest.length; i++) {\n for (let j = 0; j < arr[0].length; j++) {\n result.push([arr[0][j]].concat(rest[i]));\n }\n }\n return result;\n }\n }\n\n bubbleSelectors(selectors) {\n if (!selectors) {\n return;\n }\n this.rules = [new Ruleset(utils.copyArray(selectors), [this.rules[0]])];\n this.setParent(this.rules, this);\n }\n}\n\nMedia.prototype.type = 'Media';\nexport default Media;\n","import Node from './node';\nimport Media from './media';\nimport URL from './url';\nimport Quoted from './quoted';\nimport Ruleset from './ruleset';\nimport Anonymous from './anonymous';\nimport * as utils from '../utils';\nimport LessError from '../less-error';\n\n//\n// CSS @import node\n//\n// The general strategy here is that we don't want to wait\n// for the parsing to be completed, before we start importing\n// the file. That's because in the context of a browser,\n// most of the time will be spent waiting for the server to respond.\n//\n// On creation, we push the import path to our import queue, though\n// `import,push`, we also pass it a callback, which it'll call once\n// the file has been fetched, and parsed.\n//\nclass Import extends Node {\n constructor(path, features, options, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.options = options;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.path = path;\n this.features = features;\n this.allowRoot = true;\n\n if (this.options.less !== undefined || this.options.inline) {\n this.css = !this.options.less || this.options.inline;\n } else {\n const pathValue = this.getPath();\n if (pathValue && /[#\\.\\&\\?]css([\\?;].*)?$/.test(pathValue)) {\n this.css = true;\n }\n }\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.features, this);\n this.setParent(this.path, this);\n }\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this.features);\n }\n this.path = visitor.visit(this.path);\n if (!this.options.isPlugin && !this.options.inline && this.root) {\n this.root = visitor.visit(this.root);\n }\n }\n\n genCSS(context, output) {\n if (this.css && this.path._fileInfo.reference === undefined) {\n output.add('@import ', this._fileInfo, this._index);\n this.path.genCSS(context, output);\n if (this.features) {\n output.add(' ');\n this.features.genCSS(context, output);\n }\n output.add(';');\n }\n }\n\n getPath() {\n return (this.path instanceof URL) ?\n this.path.value.value : this.path.value;\n }\n\n isVariableImport() {\n let path = this.path;\n if (path instanceof URL) {\n path = path.value;\n }\n if (path instanceof Quoted) {\n return path.containsVariables();\n }\n\n return true;\n }\n\n evalForImport(context) {\n let path = this.path;\n\n if (path instanceof URL) {\n path = path.value;\n }\n\n return new Import(path.eval(context), this.features, this.options, this._index, this._fileInfo, this.visibilityInfo());\n }\n\n evalPath(context) {\n const path = this.path.eval(context);\n const fileInfo = this._fileInfo;\n\n if (!(path instanceof URL)) {\n // Add the rootpath if the URL requires a rewrite\n const pathValue = path.value;\n if (fileInfo &&\n pathValue &&\n context.pathRequiresRewrite(pathValue)) {\n path.value = context.rewritePath(pathValue, fileInfo.rootpath);\n } else {\n path.value = context.normalizePath(path.value);\n }\n }\n\n return path;\n }\n\n eval(context) {\n const result = this.doEval(context);\n if (this.options.reference || this.blocksVisibility()) {\n if (result.length || result.length === 0) {\n result.forEach(function (node) {\n node.addVisibilityBlock();\n }\n );\n } else {\n result.addVisibilityBlock();\n }\n }\n return result;\n }\n\n doEval(context) {\n let ruleset;\n let registry;\n const features = this.features && this.features.eval(context);\n\n if (this.options.isPlugin) {\n if (this.root && this.root.eval) {\n try {\n this.root.eval(context);\n }\n catch (e) {\n e.message = 'Plugin error during evaluation';\n throw new LessError(e, this.root.imports, this.root.filename);\n }\n }\n registry = context.frames[0] && context.frames[0].functionRegistry;\n if ( registry && this.root && this.root.functions ) {\n registry.addMultiple( this.root.functions );\n }\n\n return [];\n }\n\n if (this.skip) {\n if (typeof this.skip === 'function') {\n this.skip = this.skip();\n }\n if (this.skip) {\n return [];\n }\n }\n if (this.options.inline) {\n const contents = new Anonymous(this.root, 0,\n {\n filename: this.importedFilename,\n reference: this.path._fileInfo && this.path._fileInfo.reference\n }, true, true);\n\n return this.features ? new Media([contents], this.features.value) : [contents];\n } else if (this.css) {\n const newImport = new Import(this.evalPath(context), features, this.options, this._index);\n if (!newImport.css && this.error) {\n throw this.error;\n }\n return newImport;\n } else if (this.root) {\n ruleset = new Ruleset(null, utils.copyArray(this.root.rules));\n ruleset.evalImports(context);\n\n return this.features ? new Media(ruleset.rules, this.features.value) : ruleset.rules;\n } else {\n return [];\n }\n }\n}\n\nImport.prototype.type = 'Import';\nexport default Import;\n","import Node from './node';\nimport Variable from './variable';\n\nclass JsEvalNode extends Node {\n evaluateJavaScript(expression, context) {\n let result;\n const that = this;\n const evalContext = {};\n\n if (!context.javascriptEnabled) {\n throw { message: 'Inline JavaScript is not enabled. Is it set in your options?',\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n expression = expression.replace(/@\\{([\\w-]+)\\}/g, function (_, name) {\n return that.jsify(new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context));\n });\n\n try {\n expression = new Function(`return (${expression})`);\n } catch (e) {\n throw { message: `JavaScript evaluation error: ${e.message} from \\`${expression}\\`` ,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n const variables = context.frames[0].variables();\n for (const k in variables) {\n if (variables.hasOwnProperty(k)) {\n /* jshint loopfunc:true */\n evalContext[k.slice(1)] = {\n value: variables[k].value,\n toJS: function () {\n return this.value.eval(context).toCSS();\n }\n };\n }\n }\n\n try {\n result = expression.call(evalContext);\n } catch (e) {\n throw { message: `JavaScript evaluation error: '${e.name}: ${e.message.replace(/[\"]/g, '\\'')}'` ,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n return result;\n }\n\n jsify(obj) {\n if (Array.isArray(obj.value) && (obj.value.length > 1)) {\n return `[${obj.value.map(function (v) { return v.toCSS(); }).join(', ')}]`;\n } else {\n return obj.toCSS();\n }\n }\n}\n\nexport default JsEvalNode;\n","import JsEvalNode from './js-eval-node';\nimport Dimension from './dimension';\nimport Quoted from './quoted';\nimport Anonymous from './anonymous';\n\nclass JavaScript extends JsEvalNode {\n constructor(string, escaped, index, currentFileInfo) {\n super();\n\n this.escaped = escaped;\n this.expression = string;\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n eval(context) {\n const result = this.evaluateJavaScript(this.expression, context);\n const type = typeof result;\n\n if (type === 'number' && !isNaN(result)) {\n return new Dimension(result);\n } else if (type === 'string') {\n return new Quoted(`\"${result}\"`, result, this.escaped, this._index);\n } else if (Array.isArray(result)) {\n return new Anonymous(result.join(', '));\n } else {\n return new Anonymous(result);\n }\n }\n}\n\nJavaScript.prototype.type = 'JavaScript';\nexport default JavaScript;\n","import Node from './node';\n\nclass Assignment extends Node {\n constructor(key, val) {\n super();\n\n this.key = key;\n this.value = val;\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n eval(context) {\n if (this.value.eval) {\n return new Assignment(this.key, this.value.eval(context));\n }\n return this;\n }\n\n genCSS(context, output) {\n output.add(`${this.key}=`);\n if (this.value.genCSS) {\n this.value.genCSS(context, output);\n } else {\n output.add(this.value);\n }\n }\n}\n\nAssignment.prototype.type = 'Assignment';\nexport default Assignment;\n","import Node from './node';\n\nclass Condition extends Node {\n constructor(op, l, r, i, negate) {\n super();\n\n this.op = op.trim();\n this.lvalue = l;\n this.rvalue = r;\n this._index = i;\n this.negate = negate;\n }\n\n accept(visitor) {\n this.lvalue = visitor.visit(this.lvalue);\n this.rvalue = visitor.visit(this.rvalue);\n }\n\n eval(context) {\n const result = (function (op, a, b) {\n switch (op) {\n case 'and': return a && b;\n case 'or': return a || b;\n default:\n switch (Node.compare(a, b)) {\n case -1:\n return op === '<' || op === '=<' || op === '<=';\n case 0:\n return op === '=' || op === '>=' || op === '=<' || op === '<=';\n case 1:\n return op === '>' || op === '>=';\n default:\n return false;\n }\n }\n })(this.op, this.lvalue.eval(context), this.rvalue.eval(context));\n\n return this.negate ? !result : result;\n }\n}\n\nCondition.prototype.type = 'Condition';\nexport default Condition;\n","import Node from './node';\n\nclass UnicodeDescriptor extends Node {\n constructor(value) {\n super();\n\n this.value = value;\n }\n}\n\nUnicodeDescriptor.prototype.type = 'UnicodeDescriptor';\n\nexport default UnicodeDescriptor;\n","import Node from './node';\nimport Operation from './operation';\nimport Dimension from './dimension';\n\nclass Negative extends Node {\n constructor(node) {\n super();\n\n this.value = node;\n }\n\n genCSS(context, output) {\n output.add('-');\n this.value.genCSS(context, output);\n }\n\n eval(context) {\n if (context.isMathOn()) {\n return (new Operation('*', [new Dimension(-1), this.value])).eval(context);\n }\n return new Negative(this.value.eval(context));\n }\n}\n\nNegative.prototype.type = 'Negative';\nexport default Negative;\n","import Node from './node';\nimport Selector from './selector';\n\nclass Extend extends Node {\n constructor(selector, option, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.selector = selector;\n this.option = option;\n this.object_id = Extend.next_id++;\n this.parent_ids = [this.object_id];\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n\n switch (option) {\n case 'all':\n this.allowBefore = true;\n this.allowAfter = true;\n break;\n default:\n this.allowBefore = false;\n this.allowAfter = false;\n break;\n }\n this.setParent(this.selector, this);\n }\n\n accept(visitor) {\n this.selector = visitor.visit(this.selector);\n }\n\n eval(context) {\n return new Extend(this.selector.eval(context), this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n }\n\n clone(context) {\n return new Extend(this.selector, this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n }\n\n // it concatenates (joins) all selectors in selector array\n findSelfSelectors(selectors) {\n let selfElements = [], i, selectorElements;\n\n for (i = 0; i < selectors.length; i++) {\n selectorElements = selectors[i].elements;\n // duplicate the logic in genCSS function inside the selector node.\n // future TODO - move both logics into the selector joiner visitor\n if (i > 0 && selectorElements.length && selectorElements[0].combinator.value === '') {\n selectorElements[0].combinator.value = ' ';\n }\n selfElements = selfElements.concat(selectors[i].elements);\n }\n\n this.selfSelectors = [new Selector(selfElements)];\n this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo());\n }\n}\n\nExtend.next_id = 0;\n\nExtend.prototype.type = 'Extend';\nexport default Extend;\n","import Node from './node';\nimport Variable from './variable';\nimport Ruleset from './ruleset';\nimport DetachedRuleset from './detached-ruleset';\nimport LessError from '../less-error';\n\nclass VariableCall extends Node {\n constructor(variable, index, currentFileInfo) {\n super();\n\n this.variable = variable;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.allowRoot = true;\n }\n\n eval(context) {\n let rules;\n let detachedRuleset = new Variable(this.variable, this.getIndex(), this.fileInfo()).eval(context);\n const error = new LessError({message: `Could not evaluate variable call ${this.variable}`});\n\n if (!detachedRuleset.ruleset) {\n if (detachedRuleset.rules) {\n rules = detachedRuleset;\n }\n else if (Array.isArray(detachedRuleset)) {\n rules = new Ruleset('', detachedRuleset);\n }\n else if (Array.isArray(detachedRuleset.value)) {\n rules = new Ruleset('', detachedRuleset.value);\n }\n else {\n throw error;\n }\n detachedRuleset = new DetachedRuleset(rules);\n }\n\n if (detachedRuleset.ruleset) {\n return detachedRuleset.callEval(context);\n }\n throw error;\n }\n}\n\nVariableCall.prototype.type = 'VariableCall';\nexport default VariableCall;\n","import Node from './node';\nimport Variable from './variable';\nimport Ruleset from './ruleset';\nimport Selector from './selector';\n\nclass NamespaceValue extends Node {\n constructor(ruleCall, lookups, index, fileInfo) {\n super();\n\n this.value = ruleCall;\n this.lookups = lookups;\n this._index = index;\n this._fileInfo = fileInfo;\n }\n\n eval(context) {\n let i, j, name, rules = this.value.eval(context);\n \n for (i = 0; i < this.lookups.length; i++) {\n name = this.lookups[i];\n\n /**\n * Eval'd DRs return rulesets.\n * Eval'd mixins return rules, so let's make a ruleset if we need it.\n * We need to do this because of late parsing of values\n */\n if (Array.isArray(rules)) {\n rules = new Ruleset([new Selector()], rules);\n }\n\n if (name === '') {\n rules = rules.lastDeclaration();\n }\n else if (name.charAt(0) === '@') {\n if (name.charAt(1) === '@') {\n name = `@${new Variable(name.substr(1)).eval(context).value}`;\n }\n if (rules.variables) {\n rules = rules.variable(name);\n }\n \n if (!rules) {\n throw { type: 'Name',\n message: `variable ${name} not found`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n }\n else {\n if (name.substring(0, 2) === '$@') {\n name = `$${new Variable(name.substr(1)).eval(context).value}`;\n }\n else {\n name = name.charAt(0) === '$' ? name : `$${name}`;\n }\n if (rules.properties) {\n rules = rules.property(name);\n }\n \n if (!rules) {\n throw { type: 'Name',\n message: `property \"${name.substr(1)}\" not found`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n // Properties are an array of values, since a ruleset can have multiple props.\n // We pick the last one (the \"cascaded\" value)\n rules = rules[rules.length - 1];\n }\n\n if (rules.value) {\n rules = rules.eval(context).value;\n }\n if (rules.ruleset) {\n rules = rules.ruleset.eval(context);\n }\n }\n return rules;\n }\n}\n\nNamespaceValue.prototype.type = 'NamespaceValue';\nexport default NamespaceValue;\n","import Selector from './selector';\nimport Element from './element';\nimport Ruleset from './ruleset';\nimport Declaration from './declaration';\nimport DetachedRuleset from './detached-ruleset';\nimport Expression from './expression';\nimport contexts from '../contexts';\nimport * as utils from '../utils';\n\nclass Definition extends Ruleset {\n constructor(name, params, rules, condition, variadic, frames, visibilityInfo) {\n super();\n\n this.name = name || 'anonymous mixin';\n this.selectors = [new Selector([new Element(null, name, false, this._index, this._fileInfo)])];\n this.params = params;\n this.condition = condition;\n this.variadic = variadic;\n this.arity = params.length;\n this.rules = rules;\n this._lookups = {};\n const optionalParameters = [];\n this.required = params.reduce(function (count, p) {\n if (!p.name || (p.name && !p.value)) {\n return count + 1;\n }\n else {\n optionalParameters.push(p.name);\n return count;\n }\n }, 0);\n this.optionalParameters = optionalParameters;\n this.frames = frames;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n }\n\n accept(visitor) {\n if (this.params && this.params.length) {\n this.params = visitor.visitArray(this.params);\n }\n this.rules = visitor.visitArray(this.rules);\n if (this.condition) {\n this.condition = visitor.visit(this.condition);\n }\n }\n\n evalParams(context, mixinEnv, args, evaldArguments) {\n /* jshint boss:true */\n const frame = new Ruleset(null, null);\n\n let varargs;\n let arg;\n const params = utils.copyArray(this.params);\n let i;\n let j;\n let val;\n let name;\n let isNamedFound;\n let argIndex;\n let argsLength = 0;\n\n if (mixinEnv.frames && mixinEnv.frames[0] && mixinEnv.frames[0].functionRegistry) {\n frame.functionRegistry = mixinEnv.frames[0].functionRegistry.inherit();\n }\n mixinEnv = new contexts.Eval(mixinEnv, [frame].concat(mixinEnv.frames));\n\n if (args) {\n args = utils.copyArray(args);\n argsLength = args.length;\n\n for (i = 0; i < argsLength; i++) {\n arg = args[i];\n if (name = (arg && arg.name)) {\n isNamedFound = false;\n for (j = 0; j < params.length; j++) {\n if (!evaldArguments[j] && name === params[j].name) {\n evaldArguments[j] = arg.value.eval(context);\n frame.prependRule(new Declaration(name, arg.value.eval(context)));\n isNamedFound = true;\n break;\n }\n }\n if (isNamedFound) {\n args.splice(i, 1);\n i--;\n continue;\n } else {\n throw { type: 'Runtime', message: `Named argument for ${this.name} ${args[i].name} not found` };\n }\n }\n }\n }\n argIndex = 0;\n for (i = 0; i < params.length; i++) {\n if (evaldArguments[i]) { continue; }\n\n arg = args && args[argIndex];\n\n if (name = params[i].name) {\n if (params[i].variadic) {\n varargs = [];\n for (j = argIndex; j < argsLength; j++) {\n varargs.push(args[j].value.eval(context));\n }\n frame.prependRule(new Declaration(name, new Expression(varargs).eval(context)));\n } else {\n val = arg && arg.value;\n if (val) {\n // This was a mixin call, pass in a detached ruleset of it's eval'd rules\n if (Array.isArray(val)) {\n val = new DetachedRuleset(new Ruleset('', val));\n }\n else {\n val = val.eval(context);\n }\n } else if (params[i].value) {\n val = params[i].value.eval(mixinEnv);\n frame.resetCache();\n } else {\n throw { type: 'Runtime', message: `wrong number of arguments for ${this.name} (${argsLength} for ${this.arity})` };\n }\n\n frame.prependRule(new Declaration(name, val));\n evaldArguments[i] = val;\n }\n }\n\n if (params[i].variadic && args) {\n for (j = argIndex; j < argsLength; j++) {\n evaldArguments[j] = args[j].value.eval(context);\n }\n }\n argIndex++;\n }\n\n return frame;\n }\n\n makeImportant() {\n const rules = !this.rules ? this.rules : this.rules.map(function (r) {\n if (r.makeImportant) {\n return r.makeImportant(true);\n } else {\n return r;\n }\n });\n const result = new Definition(this.name, this.params, rules, this.condition, this.variadic, this.frames);\n return result;\n }\n\n eval(context) {\n return new Definition(this.name, this.params, this.rules, this.condition, this.variadic, this.frames || utils.copyArray(context.frames));\n }\n\n evalCall(context, args, important) {\n const _arguments = [];\n const mixinFrames = this.frames ? this.frames.concat(context.frames) : context.frames;\n const frame = this.evalParams(context, new contexts.Eval(context, mixinFrames), args, _arguments);\n let rules;\n let ruleset;\n\n frame.prependRule(new Declaration('@arguments', new Expression(_arguments).eval(context)));\n\n rules = utils.copyArray(this.rules);\n\n ruleset = new Ruleset(null, rules);\n ruleset.originalRuleset = this;\n ruleset = ruleset.eval(new contexts.Eval(context, [this, frame].concat(mixinFrames)));\n if (important) {\n ruleset = ruleset.makeImportant();\n }\n return ruleset;\n }\n\n matchCondition(args, context) {\n if (this.condition && !this.condition.eval(\n new contexts.Eval(context,\n [this.evalParams(context, /* the parameter variables */\n new contexts.Eval(context, this.frames ? this.frames.concat(context.frames) : context.frames), args, [])]\n .concat(this.frames || []) // the parent namespace/mixin frames\n .concat(context.frames)))) { // the current environment frames\n return false;\n }\n return true;\n }\n\n matchArgs(args, context) {\n const allArgsCnt = (args && args.length) || 0;\n let len;\n const optionalParameters = this.optionalParameters;\n const requiredArgsCnt = !args ? 0 : args.reduce(function (count, p) {\n if (optionalParameters.indexOf(p.name) < 0) {\n return count + 1;\n } else {\n return count;\n }\n }, 0);\n\n if (!this.variadic) {\n if (requiredArgsCnt < this.required) {\n return false;\n }\n if (allArgsCnt > this.params.length) {\n return false;\n }\n } else {\n if (requiredArgsCnt < (this.required - 1)) {\n return false;\n }\n }\n\n // check patterns\n len = Math.min(requiredArgsCnt, this.arity);\n\n for (let i = 0; i < len; i++) {\n if (!this.params[i].name && !this.params[i].variadic) {\n if (args[i].value.eval(context).toCSS() != this.params[i].value.eval(context).toCSS()) {\n return false;\n }\n }\n }\n return true;\n }\n}\n\nDefinition.prototype.type = 'MixinDefinition';\nDefinition.prototype.evalFirst = true;\nexport default Definition;\n","import Node from './node';\nimport Selector from './selector';\nimport MixinDefinition from './mixin-definition';\nimport defaultFunc from '../functions/default';\n\nclass MixinCall extends Node {\n constructor(elements, args, index, currentFileInfo, important) {\n super();\n\n this.selector = new Selector(elements);\n this.arguments = args || [];\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.important = important;\n this.allowRoot = true;\n this.setParent(this.selector, this);\n }\n\n accept(visitor) {\n if (this.selector) {\n this.selector = visitor.visit(this.selector);\n }\n if (this.arguments.length) {\n this.arguments = visitor.visitArray(this.arguments);\n }\n }\n\n eval(context) {\n let mixins;\n let mixin;\n let mixinPath;\n const args = [];\n let arg;\n let argValue;\n const rules = [];\n let match = false;\n let i;\n let m;\n let f;\n let isRecursive;\n let isOneFound;\n const candidates = [];\n let candidate;\n const conditionResult = [];\n let defaultResult;\n const defFalseEitherCase = -1;\n const defNone = 0;\n const defTrue = 1;\n const defFalse = 2;\n let count;\n let originalRuleset;\n let noArgumentsFilter;\n\n this.selector = this.selector.eval(context);\n\n function calcDefGroup(mixin, mixinPath) {\n let f, p, namespace;\n\n for (f = 0; f < 2; f++) {\n conditionResult[f] = true;\n defaultFunc.value(f);\n for (p = 0; p < mixinPath.length && conditionResult[f]; p++) {\n namespace = mixinPath[p];\n if (namespace.matchCondition) {\n conditionResult[f] = conditionResult[f] && namespace.matchCondition(null, context);\n }\n }\n if (mixin.matchCondition) {\n conditionResult[f] = conditionResult[f] && mixin.matchCondition(args, context);\n }\n }\n if (conditionResult[0] || conditionResult[1]) {\n if (conditionResult[0] != conditionResult[1]) {\n return conditionResult[1] ?\n defTrue : defFalse;\n }\n\n return defNone;\n }\n return defFalseEitherCase;\n }\n\n for (i = 0; i < this.arguments.length; i++) {\n arg = this.arguments[i];\n argValue = arg.value.eval(context);\n if (arg.expand && Array.isArray(argValue.value)) {\n argValue = argValue.value;\n for (m = 0; m < argValue.length; m++) {\n args.push({value: argValue[m]});\n }\n } else {\n args.push({name: arg.name, value: argValue});\n }\n }\n\n noArgumentsFilter = function(rule) {return rule.matchArgs(null, context);};\n\n for (i = 0; i < context.frames.length; i++) {\n if ((mixins = context.frames[i].find(this.selector, null, noArgumentsFilter)).length > 0) {\n isOneFound = true;\n\n // To make `default()` function independent of definition order we have two \"subpasses\" here.\n // At first we evaluate each guard *twice* (with `default() == true` and `default() == false`),\n // and build candidate list with corresponding flags. Then, when we know all possible matches,\n // we make a final decision.\n\n for (m = 0; m < mixins.length; m++) {\n mixin = mixins[m].rule;\n mixinPath = mixins[m].path;\n isRecursive = false;\n for (f = 0; f < context.frames.length; f++) {\n if ((!(mixin instanceof MixinDefinition)) && mixin === (context.frames[f].originalRuleset || context.frames[f])) {\n isRecursive = true;\n break;\n }\n }\n if (isRecursive) {\n continue;\n }\n\n if (mixin.matchArgs(args, context)) {\n candidate = {mixin, group: calcDefGroup(mixin, mixinPath)};\n\n if (candidate.group !== defFalseEitherCase) {\n candidates.push(candidate);\n }\n\n match = true;\n }\n }\n\n defaultFunc.reset();\n\n count = [0, 0, 0];\n for (m = 0; m < candidates.length; m++) {\n count[candidates[m].group]++;\n }\n\n if (count[defNone] > 0) {\n defaultResult = defFalse;\n } else {\n defaultResult = defTrue;\n if ((count[defTrue] + count[defFalse]) > 1) {\n throw { type: 'Runtime',\n message: `Ambiguous use of \\`default()\\` found when matching for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n }\n\n for (m = 0; m < candidates.length; m++) {\n candidate = candidates[m].group;\n if ((candidate === defNone) || (candidate === defaultResult)) {\n try {\n mixin = candidates[m].mixin;\n if (!(mixin instanceof MixinDefinition)) {\n originalRuleset = mixin.originalRuleset || mixin;\n mixin = new MixinDefinition('', [], mixin.rules, null, false, null, originalRuleset.visibilityInfo());\n mixin.originalRuleset = originalRuleset;\n }\n const newRules = mixin.evalCall(context, args, this.important).rules;\n this._setVisibilityToReplacement(newRules);\n Array.prototype.push.apply(rules, newRules);\n } catch (e) {\n throw { message: e.message, index: this.getIndex(), filename: this.fileInfo().filename, stack: e.stack };\n }\n }\n }\n\n if (match) {\n return rules;\n }\n }\n }\n if (isOneFound) {\n throw { type: 'Runtime',\n message: `No matching definition was found for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n } else {\n throw { type: 'Name',\n message: `${this.selector.toCSS().trim()} is undefined`,\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n }\n\n _setVisibilityToReplacement(replacement) {\n let i, rule;\n if (this.blocksVisibility()) {\n for (i = 0; i < replacement.length; i++) {\n rule = replacement[i];\n rule.addVisibilityBlock();\n }\n }\n }\n\n format(args) {\n return `${this.selector.toCSS().trim()}(${args ? args.map(function (a) {\n let argValue = '';\n if (a.name) {\n argValue += `${a.name}:`;\n }\n if (a.value.toCSS) {\n argValue += a.value.toCSS();\n } else {\n argValue += '???';\n }\n return argValue;\n }).join(', ') : ''})`;\n }\n}\n\nMixinCall.prototype.type = 'MixinCall';\nexport default MixinCall;\n","import Node from './node';\nimport Color from './color';\nimport AtRule from './atrule';\nimport DetachedRuleset from './detached-ruleset';\nimport Operation from './operation';\nimport Dimension from './dimension';\nimport Unit from './unit';\nimport Keyword from './keyword';\nimport Variable from './variable';\nimport Property from './property';\nimport Ruleset from './ruleset';\nimport Element from './element';\nimport Attribute from './attribute';\nimport Combinator from './combinator';\nimport Selector from './selector';\nimport Quoted from './quoted';\nimport Expression from './expression';\nimport Declaration from './declaration';\nimport Call from './call';\nimport URL from './url';\nimport Import from './import';\nimport Comment from './comment';\nimport Anonymous from './anonymous';\nimport Value from './value';\nimport JavaScript from './javascript';\nimport Assignment from './assignment';\nimport Condition from './condition';\nimport Paren from './paren';\nimport Media from './media';\nimport UnicodeDescriptor from './unicode-descriptor';\nimport Negative from './negative';\nimport Extend from './extend';\nimport VariableCall from './variable-call';\nimport NamespaceValue from './namespace-value';\n\n// mixins\nimport MixinCall from './mixin-call';\nimport MixinDefinition from './mixin-definition';\n\nexport default {\n Node, Color, AtRule, DetachedRuleset, Operation,\n Dimension, Unit, Keyword, Variable, Property,\n Ruleset, Element, Attribute, Combinator, Selector,\n Quoted, Expression, Declaration, Call, URL, Import,\n Comment, Anonymous, Value, JavaScript, Assignment,\n Condition, Paren, Media, UnicodeDescriptor, Negative,\n Extend, VariableCall, NamespaceValue,\n mixin: {\n Call: MixinCall,\n Definition: MixinDefinition\n }\n};","class AbstractFileManager {\n getPath(filename) {\n let j = filename.lastIndexOf('?');\n if (j > 0) {\n filename = filename.slice(0, j);\n }\n j = filename.lastIndexOf('/');\n if (j < 0) {\n j = filename.lastIndexOf('\\\\');\n }\n if (j < 0) {\n return '';\n }\n return filename.slice(0, j + 1);\n }\n\n tryAppendExtension(path, ext) {\n return /(\\.[a-z]*$)|([\\?;].*)$/.test(path) ? path : path + ext;\n }\n\n tryAppendLessExtension(path) {\n return this.tryAppendExtension(path, '.less');\n }\n\n supportsSync() {\n return false;\n }\n\n alwaysMakePathsAbsolute() {\n return false;\n }\n\n isPathAbsolute(filename) {\n return (/^(?:[a-z-]+:|\\/|\\\\|#)/i).test(filename);\n }\n\n // TODO: pull out / replace?\n join(basePath, laterPath) {\n if (!basePath) {\n return laterPath;\n }\n return basePath + laterPath;\n }\n\n pathDiff(url, baseUrl) {\n // diff between two paths to create a relative path\n\n const urlParts = this.extractUrlParts(url);\n\n const baseUrlParts = this.extractUrlParts(baseUrl);\n let i;\n let max;\n let urlDirectories;\n let baseUrlDirectories;\n let diff = '';\n if (urlParts.hostPart !== baseUrlParts.hostPart) {\n return '';\n }\n max = Math.max(baseUrlParts.directories.length, urlParts.directories.length);\n for (i = 0; i < max; i++) {\n if (baseUrlParts.directories[i] !== urlParts.directories[i]) { break; }\n }\n baseUrlDirectories = baseUrlParts.directories.slice(i);\n urlDirectories = urlParts.directories.slice(i);\n for (i = 0; i < baseUrlDirectories.length - 1; i++) {\n diff += '../';\n }\n for (i = 0; i < urlDirectories.length - 1; i++) {\n diff += `${urlDirectories[i]}/`;\n }\n return diff;\n }\n\n // helper function, not part of API\n extractUrlParts(url, baseUrl) {\n // urlParts[1] = protocol://hostname/ OR /\n // urlParts[2] = / if path relative to host base\n // urlParts[3] = directories\n // urlParts[4] = filename\n // urlParts[5] = parameters\n\n const urlPartsRegex = /^((?:[a-z-]+:)?\\/{2}(?:[^\\/\\?#]*\\/)|([\\/\\\\]))?((?:[^\\/\\\\\\?#]*[\\/\\\\])*)([^\\/\\\\\\?#]*)([#\\?].*)?$/i;\n\n const urlParts = url.match(urlPartsRegex);\n const returner = {};\n let rawDirectories = [];\n const directories = [];\n let i;\n let baseUrlParts;\n\n if (!urlParts) {\n throw new Error(`Could not parse sheet href - '${url}'`);\n }\n\n // Stylesheets in IE don't always return the full path\n if (baseUrl && (!urlParts[1] || urlParts[2])) {\n baseUrlParts = baseUrl.match(urlPartsRegex);\n if (!baseUrlParts) {\n throw new Error(`Could not parse page url - '${baseUrl}'`);\n }\n urlParts[1] = urlParts[1] || baseUrlParts[1] || '';\n if (!urlParts[2]) {\n urlParts[3] = baseUrlParts[3] + urlParts[3];\n }\n }\n\n if (urlParts[3]) {\n rawDirectories = urlParts[3].replace(/\\\\/g, '/').split('/');\n\n // collapse '..' and skip '.'\n for (i = 0; i < rawDirectories.length; i++) {\n\n if (rawDirectories[i] === '..') {\n directories.pop();\n }\n else if (rawDirectories[i] !== '.') {\n directories.push(rawDirectories[i]);\n }\n \n }\n }\n\n returner.hostPart = urlParts[1];\n returner.directories = directories;\n returner.rawPath = (urlParts[1] || '') + rawDirectories.join('/');\n returner.path = (urlParts[1] || '') + directories.join('/');\n returner.filename = urlParts[4];\n returner.fileUrl = returner.path + (urlParts[4] || '');\n returner.url = returner.fileUrl + (urlParts[5] || '');\n return returner;\n }\n}\n\nexport default AbstractFileManager;\n","import functionRegistry from '../functions/function-registry';\nimport LessError from '../less-error';\n\nclass AbstractPluginLoader {\n constructor() {\n // Implemented by Node.js plugin loader\n this.require = function() {\n return null;\n }\n }\n\n evalPlugin(contents, context, imports, pluginOptions, fileInfo) {\n\n let loader, registry, pluginObj, localModule, pluginManager, filename, result;\n\n pluginManager = context.pluginManager;\n\n if (fileInfo) {\n if (typeof fileInfo === 'string') {\n filename = fileInfo;\n }\n else {\n filename = fileInfo.filename;\n }\n }\n const shortname = (new this.less.FileManager()).extractUrlParts(filename).filename;\n\n if (filename) {\n pluginObj = pluginManager.get(filename);\n\n if (pluginObj) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imports, filename);\n }\n return pluginObj;\n }\n }\n localModule = {\n exports: {},\n pluginManager,\n fileInfo\n };\n registry = functionRegistry.create();\n\n const registerPlugin = function(obj) {\n pluginObj = obj;\n };\n\n try {\n loader = new Function('module', 'require', 'registerPlugin', 'functions', 'tree', 'less', 'fileInfo', contents);\n loader(localModule, this.require(filename), registerPlugin, registry, this.less.tree, this.less, fileInfo);\n }\n catch (e) {\n return new LessError(e, imports, filename);\n }\n\n if (!pluginObj) {\n pluginObj = localModule.exports;\n }\n pluginObj = this.validatePlugin(pluginObj, filename, shortname);\n\n if (pluginObj instanceof LessError) {\n return pluginObj;\n }\n\n if (pluginObj) {\n pluginObj.imports = imports;\n pluginObj.filename = filename;\n\n // For < 3.x (or unspecified minVersion) - setOptions() before install()\n if (!pluginObj.minVersion || this.compareVersion('3.0.0', pluginObj.minVersion) < 0) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n\n if (result) {\n return result;\n }\n }\n\n // Run on first load\n pluginManager.addPlugin(pluginObj, fileInfo.filename, registry);\n pluginObj.functions = registry.getLocalFunctions();\n\n // Need to call setOptions again because the pluginObj might have functions\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n\n // Run every @plugin call\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imports, filename);\n }\n\n }\n else {\n return new LessError({ message: 'Not a valid plugin' }, imports, filename);\n }\n\n return pluginObj;\n\n }\n\n trySetOptions(plugin, filename, name, options) {\n if (options && !plugin.setOptions) {\n return new LessError({\n message: `Options have been provided but the plugin ${name} does not support any options.`\n });\n }\n try {\n plugin.setOptions && plugin.setOptions(options);\n }\n catch (e) {\n return new LessError(e);\n }\n }\n\n validatePlugin(plugin, filename, name) {\n if (plugin) {\n // support plugins being a function\n // so that the plugin can be more usable programmatically\n if (typeof plugin === 'function') {\n plugin = new plugin();\n }\n\n if (plugin.minVersion) {\n if (this.compareVersion(plugin.minVersion, this.less.version) < 0) {\n return new LessError({\n message: `Plugin ${name} requires version ${this.versionToString(plugin.minVersion)}`\n });\n }\n }\n return plugin;\n }\n return null;\n }\n\n compareVersion(aVersion, bVersion) {\n if (typeof aVersion === 'string') {\n aVersion = aVersion.match(/^(\\d+)\\.?(\\d+)?\\.?(\\d+)?/);\n aVersion.shift();\n }\n for (let i = 0; i < aVersion.length; i++) {\n if (aVersion[i] !== bVersion[i]) {\n return parseInt(aVersion[i]) > parseInt(bVersion[i]) ? -1 : 1;\n }\n }\n return 0;\n }\n\n versionToString(version) {\n let versionString = '';\n for (let i = 0; i < version.length; i++) {\n versionString += (versionString ? '.' : '') + version[i];\n }\n return versionString;\n }\n\n printUsage(plugins) {\n for (let i = 0; i < plugins.length; i++) {\n const plugin = plugins[i];\n if (plugin.printUsage) {\n plugin.printUsage();\n }\n }\n }\n}\n\nexport default AbstractPluginLoader;\n\n","import tree from '../tree';\n\nconst _visitArgs = { visitDeeper: true };\nlet _hasIndexed = false;\n\nfunction _noop(node) {\n return node;\n}\n\nfunction indexNodeTypes(parent, ticker) {\n // add .typeIndex to tree node types for lookup table\n let key, child;\n for (key in parent) { \n /* eslint guard-for-in: 0 */\n child = parent[key];\n switch (typeof child) {\n case 'function':\n // ignore bound functions directly on tree which do not have a prototype\n // or aren't nodes\n if (child.prototype && child.prototype.type) {\n child.prototype.typeIndex = ticker++;\n }\n break;\n case 'object':\n ticker = indexNodeTypes(child, ticker);\n break;\n \n }\n }\n return ticker;\n}\n\nclass Visitor {\n constructor(implementation) {\n this._implementation = implementation;\n this._visitInCache = {};\n this._visitOutCache = {};\n\n if (!_hasIndexed) {\n indexNodeTypes(tree, 1);\n _hasIndexed = true;\n }\n }\n\n visit(node) {\n if (!node) {\n return node;\n }\n\n const nodeTypeIndex = node.typeIndex;\n if (!nodeTypeIndex) {\n // MixinCall args aren't a node type?\n if (node.value && node.value.typeIndex) {\n this.visit(node.value);\n }\n return node;\n }\n\n const impl = this._implementation;\n let func = this._visitInCache[nodeTypeIndex];\n let funcOut = this._visitOutCache[nodeTypeIndex];\n const visitArgs = _visitArgs;\n let fnName;\n\n visitArgs.visitDeeper = true;\n\n if (!func) {\n fnName = `visit${node.type}`;\n func = impl[fnName] || _noop;\n funcOut = impl[`${fnName}Out`] || _noop;\n this._visitInCache[nodeTypeIndex] = func;\n this._visitOutCache[nodeTypeIndex] = funcOut;\n }\n\n if (func !== _noop) {\n const newNode = func.call(impl, node, visitArgs);\n if (node && impl.isReplacing) {\n node = newNode;\n }\n }\n\n if (visitArgs.visitDeeper && node) {\n if (node.length) {\n for (let i = 0, cnt = node.length; i < cnt; i++) {\n if (node[i].accept) {\n node[i].accept(this);\n }\n }\n } else if (node.accept) {\n node.accept(this);\n }\n }\n\n if (funcOut != _noop) {\n funcOut.call(impl, node);\n }\n\n return node;\n }\n\n visitArray(nodes, nonReplacing) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.length;\n let i;\n\n // Non-replacing\n if (nonReplacing || !this._implementation.isReplacing) {\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n // Replacing\n const out = [];\n for (i = 0; i < cnt; i++) {\n const evald = this.visit(nodes[i]);\n if (evald === undefined) { continue; }\n if (!evald.splice) {\n out.push(evald);\n } else if (evald.length) {\n this.flatten(evald, out);\n }\n }\n return out;\n }\n\n flatten(arr, out) {\n if (!out) {\n out = [];\n }\n\n let cnt, i, item, nestedCnt, j, nestedItem;\n\n for (i = 0, cnt = arr.length; i < cnt; i++) {\n item = arr[i];\n if (item === undefined) {\n continue;\n }\n if (!item.splice) {\n out.push(item);\n continue;\n }\n\n for (j = 0, nestedCnt = item.length; j < nestedCnt; j++) {\n nestedItem = item[j];\n if (nestedItem === undefined) {\n continue;\n }\n if (!nestedItem.splice) {\n out.push(nestedItem);\n } else if (nestedItem.length) {\n this.flatten(nestedItem, out);\n }\n }\n }\n\n return out;\n }\n}\n\nexport default Visitor;\n","class ImportSequencer {\n constructor(onSequencerEmpty) {\n this.imports = [];\n this.variableImports = [];\n this._onSequencerEmpty = onSequencerEmpty;\n this._currentDepth = 0;\n }\n\n addImport(callback) {\n const importSequencer = this,\n importItem = {\n callback,\n args: null,\n isReady: false\n };\n this.imports.push(importItem);\n return function() {\n importItem.args = Array.prototype.slice.call(arguments, 0);\n importItem.isReady = true;\n importSequencer.tryRun();\n };\n }\n\n addVariableImport(callback) {\n this.variableImports.push(callback);\n }\n\n tryRun() {\n this._currentDepth++;\n try {\n while (true) {\n while (this.imports.length > 0) {\n const importItem = this.imports[0];\n if (!importItem.isReady) {\n return;\n }\n this.imports = this.imports.slice(1);\n importItem.callback.apply(null, importItem.args);\n }\n if (this.variableImports.length === 0) {\n break;\n }\n const variableImport = this.variableImports[0];\n this.variableImports = this.variableImports.slice(1);\n variableImport();\n }\n } finally {\n this._currentDepth--;\n }\n if (this._currentDepth === 0 && this._onSequencerEmpty) {\n this._onSequencerEmpty();\n }\n }\n}\n\nexport default ImportSequencer;\n","import contexts from '../contexts';\nimport Visitor from './visitor';\nimport ImportSequencer from './import-sequencer';\nimport * as utils from '../utils';\n\nconst ImportVisitor = function(importer, finish) {\n\n this._visitor = new Visitor(this);\n this._importer = importer;\n this._finish = finish;\n this.context = new contexts.Eval();\n this.importCount = 0;\n this.onceFileDetectionMap = {};\n this.recursionDetector = {};\n this._sequencer = new ImportSequencer(this._onSequencerEmpty.bind(this));\n};\n\nImportVisitor.prototype = {\n isReplacing: false,\n run: function (root) {\n try {\n // process the contents\n this._visitor.visit(root);\n }\n catch (e) {\n this.error = e;\n }\n\n this.isFinished = true;\n this._sequencer.tryRun();\n },\n _onSequencerEmpty: function() {\n if (!this.isFinished) {\n return;\n }\n this._finish(this.error);\n },\n visitImport: function (importNode, visitArgs) {\n const inlineCSS = importNode.options.inline;\n\n if (!importNode.css || inlineCSS) {\n\n const context = new contexts.Eval(this.context, utils.copyArray(this.context.frames));\n const importParent = context.frames[0];\n\n this.importCount++;\n if (importNode.isVariableImport()) {\n this._sequencer.addVariableImport(this.processImportNode.bind(this, importNode, context, importParent));\n } else {\n this.processImportNode(importNode, context, importParent);\n }\n }\n visitArgs.visitDeeper = false;\n },\n processImportNode: function(importNode, context, importParent) {\n let evaldImportNode;\n const inlineCSS = importNode.options.inline;\n\n try {\n evaldImportNode = importNode.evalForImport(context);\n } catch (e) {\n if (!e.filename) { e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename; }\n // attempt to eval properly and treat as css\n importNode.css = true;\n // if that fails, this error will be thrown\n importNode.error = e;\n }\n\n if (evaldImportNode && (!evaldImportNode.css || inlineCSS)) {\n\n if (evaldImportNode.options.multiple) {\n context.importMultiple = true;\n }\n\n // try appending if we haven't determined if it is css or not\n const tryAppendLessExtension = evaldImportNode.css === undefined;\n\n for (let i = 0; i < importParent.rules.length; i++) {\n if (importParent.rules[i] === importNode) {\n importParent.rules[i] = evaldImportNode;\n break;\n }\n }\n\n const onImported = this.onImported.bind(this, evaldImportNode, context), sequencedOnImported = this._sequencer.addImport(onImported);\n\n this._importer.push(evaldImportNode.getPath(), tryAppendLessExtension, evaldImportNode.fileInfo(),\n evaldImportNode.options, sequencedOnImported);\n } else {\n this.importCount--;\n if (this.isFinished) {\n this._sequencer.tryRun();\n }\n }\n },\n onImported: function (importNode, context, e, root, importedAtRoot, fullPath) {\n if (e) {\n if (!e.filename) {\n e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename;\n }\n this.error = e;\n }\n\n const importVisitor = this, inlineCSS = importNode.options.inline, isPlugin = importNode.options.isPlugin, isOptional = importNode.options.optional, duplicateImport = importedAtRoot || fullPath in importVisitor.recursionDetector;\n\n if (!context.importMultiple) {\n if (duplicateImport) {\n importNode.skip = true;\n } else {\n importNode.skip = function() {\n if (fullPath in importVisitor.onceFileDetectionMap) {\n return true;\n }\n importVisitor.onceFileDetectionMap[fullPath] = true;\n return false;\n };\n }\n }\n\n if (!fullPath && isOptional) {\n importNode.skip = true;\n }\n\n if (root) {\n importNode.root = root;\n importNode.importedFilename = fullPath;\n\n if (!inlineCSS && !isPlugin && (context.importMultiple || !duplicateImport)) {\n importVisitor.recursionDetector[fullPath] = true;\n\n const oldContext = this.context;\n this.context = context;\n try {\n this._visitor.visit(root);\n } catch (e) {\n this.error = e;\n }\n this.context = oldContext;\n }\n }\n\n importVisitor.importCount--;\n\n if (importVisitor.isFinished) {\n importVisitor._sequencer.tryRun();\n }\n },\n visitDeclaration: function (declNode, visitArgs) {\n if (declNode.value.type === 'DetachedRuleset') {\n this.context.frames.unshift(declNode);\n } else {\n visitArgs.visitDeeper = false;\n }\n },\n visitDeclarationOut: function(declNode) {\n if (declNode.value.type === 'DetachedRuleset') {\n this.context.frames.shift();\n }\n },\n visitAtRule: function (atRuleNode, visitArgs) {\n this.context.frames.unshift(atRuleNode);\n },\n visitAtRuleOut: function (atRuleNode) {\n this.context.frames.shift();\n },\n visitMixinDefinition: function (mixinDefinitionNode, visitArgs) {\n this.context.frames.unshift(mixinDefinitionNode);\n },\n visitMixinDefinitionOut: function (mixinDefinitionNode) {\n this.context.frames.shift();\n },\n visitRuleset: function (rulesetNode, visitArgs) {\n this.context.frames.unshift(rulesetNode);\n },\n visitRulesetOut: function (rulesetNode) {\n this.context.frames.shift();\n },\n visitMedia: function (mediaNode, visitArgs) {\n this.context.frames.unshift(mediaNode.rules[0]);\n },\n visitMediaOut: function (mediaNode) {\n this.context.frames.shift();\n }\n};\nexport default ImportVisitor;\n","class SetTreeVisibilityVisitor {\n constructor(visible) {\n this.visible = visible;\n }\n\n run(root) {\n this.visit(root);\n }\n\n visitArray(nodes) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.length;\n let i;\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n visit(node) {\n if (!node) {\n return node;\n }\n if (node.constructor === Array) {\n return this.visitArray(node);\n }\n\n if (!node.blocksVisibility || node.blocksVisibility()) {\n return node;\n }\n if (this.visible) {\n node.ensureVisibility();\n } else {\n node.ensureInvisibility();\n }\n\n node.accept(this);\n return node;\n }\n}\n\nexport default SetTreeVisibilityVisitor;","import tree from '../tree';\nimport Visitor from './visitor';\nimport logger from '../logger';\nimport * as utils from '../utils';\n\n/* jshint loopfunc:true */\n\nclass ExtendFinderVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n this.contexts = [];\n this.allExtendsStack = [[]];\n }\n\n run(root) {\n root = this._visitor.visit(root);\n root.allExtends = this.allExtendsStack[0];\n return root;\n }\n\n visitDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n\n let i;\n let j;\n let extend;\n const allSelectorsExtendList = [];\n let extendList;\n\n // get &:extend(.a); rules which apply to all selectors in this ruleset\n const rules = rulesetNode.rules, ruleCnt = rules ? rules.length : 0;\n for (i = 0; i < ruleCnt; i++) {\n if (rulesetNode.rules[i] instanceof tree.Extend) {\n allSelectorsExtendList.push(rules[i]);\n rulesetNode.extendOnEveryPath = true;\n }\n }\n\n // now find every selector and apply the extends that apply to all extends\n // and the ones which apply to an individual extend\n const paths = rulesetNode.paths;\n for (i = 0; i < paths.length; i++) {\n const selectorPath = paths[i], selector = selectorPath[selectorPath.length - 1], selExtendList = selector.extendList;\n\n extendList = selExtendList ? utils.copyArray(selExtendList).concat(allSelectorsExtendList)\n : allSelectorsExtendList;\n\n if (extendList) {\n extendList = extendList.map(function(allSelectorsExtend) {\n return allSelectorsExtend.clone();\n });\n }\n\n for (j = 0; j < extendList.length; j++) {\n this.foundExtends = true;\n extend = extendList[j];\n extend.findSelfSelectors(selectorPath);\n extend.ruleset = rulesetNode;\n if (j === 0) { extend.firstExtendOnThisSelectorPath = true; }\n this.allExtendsStack[this.allExtendsStack.length - 1].push(extend);\n }\n }\n\n this.contexts.push(rulesetNode.selectors);\n }\n\n visitRulesetOut(rulesetNode) {\n if (!rulesetNode.root) {\n this.contexts.length = this.contexts.length - 1;\n }\n }\n\n visitMedia(mediaNode, visitArgs) {\n mediaNode.allExtends = [];\n this.allExtendsStack.push(mediaNode.allExtends);\n }\n\n visitMediaOut(mediaNode) {\n this.allExtendsStack.length = this.allExtendsStack.length - 1;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n atRuleNode.allExtends = [];\n this.allExtendsStack.push(atRuleNode.allExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n this.allExtendsStack.length = this.allExtendsStack.length - 1;\n }\n}\n\nclass ProcessExtendsVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n }\n\n run(root) {\n const extendFinder = new ExtendFinderVisitor();\n this.extendIndices = {};\n extendFinder.run(root);\n if (!extendFinder.foundExtends) { return root; }\n root.allExtends = root.allExtends.concat(this.doExtendChaining(root.allExtends, root.allExtends));\n this.allExtendsStack = [root.allExtends];\n const newRoot = this._visitor.visit(root);\n this.checkExtendsForNonMatched(root.allExtends);\n return newRoot;\n }\n\n checkExtendsForNonMatched(extendList) {\n const indices = this.extendIndices;\n extendList.filter(function(extend) {\n return !extend.hasFoundMatches && extend.parent_ids.length == 1;\n }).forEach(function(extend) {\n let selector = '_unknown_';\n try {\n selector = extend.selector.toCSS({});\n }\n catch (_) {}\n\n if (!indices[`${extend.index} ${selector}`]) {\n indices[`${extend.index} ${selector}`] = true;\n logger.warn(`extend '${selector}' has no matches`);\n }\n });\n }\n\n doExtendChaining(extendsList, extendsListTarget, iterationCount) {\n //\n // chaining is different from normal extension.. if we extend an extend then we are not just copying, altering\n // and pasting the selector we would do normally, but we are also adding an extend with the same target selector\n // this means this new extend can then go and alter other extends\n //\n // this method deals with all the chaining work - without it, extend is flat and doesn't work on other extend selectors\n // this is also the most expensive.. and a match on one selector can cause an extension of a selector we had already\n // processed if we look at each selector at a time, as is done in visitRuleset\n\n let extendIndex;\n\n let targetExtendIndex;\n let matches;\n const extendsToAdd = [];\n let newSelector;\n const extendVisitor = this;\n let selectorPath;\n let extend;\n let targetExtend;\n let newExtend;\n\n iterationCount = iterationCount || 0;\n\n // loop through comparing every extend with every target extend.\n // a target extend is the one on the ruleset we are looking at copy/edit/pasting in place\n // e.g. .a:extend(.b) {} and .b:extend(.c) {} then the first extend extends the second one\n // and the second is the target.\n // the separation into two lists allows us to process a subset of chains with a bigger set, as is the\n // case when processing media queries\n for (extendIndex = 0; extendIndex < extendsList.length; extendIndex++) {\n for (targetExtendIndex = 0; targetExtendIndex < extendsListTarget.length; targetExtendIndex++) {\n\n extend = extendsList[extendIndex];\n targetExtend = extendsListTarget[targetExtendIndex];\n\n // look for circular references\n if ( extend.parent_ids.indexOf( targetExtend.object_id ) >= 0 ) { continue; }\n\n // find a match in the target extends self selector (the bit before :extend)\n selectorPath = [targetExtend.selfSelectors[0]];\n matches = extendVisitor.findMatch(extend, selectorPath);\n\n if (matches.length) {\n extend.hasFoundMatches = true;\n\n // we found a match, so for each self selector..\n extend.selfSelectors.forEach(function(selfSelector) {\n const info = targetExtend.visibilityInfo();\n\n // process the extend as usual\n newSelector = extendVisitor.extendSelector(matches, selectorPath, selfSelector, extend.isVisible());\n\n // but now we create a new extend from it\n newExtend = new(tree.Extend)(targetExtend.selector, targetExtend.option, 0, targetExtend.fileInfo(), info);\n newExtend.selfSelectors = newSelector;\n\n // add the extend onto the list of extends for that selector\n newSelector[newSelector.length - 1].extendList = [newExtend];\n\n // record that we need to add it.\n extendsToAdd.push(newExtend);\n newExtend.ruleset = targetExtend.ruleset;\n\n // remember its parents for circular references\n newExtend.parent_ids = newExtend.parent_ids.concat(targetExtend.parent_ids, extend.parent_ids);\n\n // only process the selector once.. if we have :extend(.a,.b) then multiple\n // extends will look at the same selector path, so when extending\n // we know that any others will be duplicates in terms of what is added to the css\n if (targetExtend.firstExtendOnThisSelectorPath) {\n newExtend.firstExtendOnThisSelectorPath = true;\n targetExtend.ruleset.paths.push(newSelector);\n }\n });\n }\n }\n }\n\n if (extendsToAdd.length) {\n // try to detect circular references to stop a stack overflow.\n // may no longer be needed.\n this.extendChainCount++;\n if (iterationCount > 100) {\n let selectorOne = '{unable to calculate}';\n let selectorTwo = '{unable to calculate}';\n try {\n selectorOne = extendsToAdd[0].selfSelectors[0].toCSS();\n selectorTwo = extendsToAdd[0].selector.toCSS();\n }\n catch (e) {}\n throw { message: `extend circular reference detected. One of the circular extends is currently:${selectorOne}:extend(${selectorTwo})`};\n }\n\n // now process the new extends on the existing rules so that we can handle a extending b extending c extending\n // d extending e...\n return extendsToAdd.concat(extendVisitor.doExtendChaining(extendsToAdd, extendsListTarget, iterationCount + 1));\n } else {\n return extendsToAdd;\n }\n }\n\n visitDeclaration(ruleNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitSelector(selectorNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n let matches;\n let pathIndex;\n let extendIndex;\n const allExtends = this.allExtendsStack[this.allExtendsStack.length - 1];\n const selectorsToAdd = [];\n const extendVisitor = this;\n let selectorPath;\n\n // look at each selector path in the ruleset, find any extend matches and then copy, find and replace\n\n for (extendIndex = 0; extendIndex < allExtends.length; extendIndex++) {\n for (pathIndex = 0; pathIndex < rulesetNode.paths.length; pathIndex++) {\n selectorPath = rulesetNode.paths[pathIndex];\n\n // extending extends happens initially, before the main pass\n if (rulesetNode.extendOnEveryPath) { continue; }\n const extendList = selectorPath[selectorPath.length - 1].extendList;\n if (extendList && extendList.length) { continue; }\n\n matches = this.findMatch(allExtends[extendIndex], selectorPath);\n\n if (matches.length) {\n allExtends[extendIndex].hasFoundMatches = true;\n\n allExtends[extendIndex].selfSelectors.forEach(function(selfSelector) {\n let extendedSelectors;\n extendedSelectors = extendVisitor.extendSelector(matches, selectorPath, selfSelector, allExtends[extendIndex].isVisible());\n selectorsToAdd.push(extendedSelectors);\n });\n }\n }\n }\n rulesetNode.paths = rulesetNode.paths.concat(selectorsToAdd);\n }\n\n findMatch(extend, haystackSelectorPath) {\n //\n // look through the haystack selector path to try and find the needle - extend.selector\n // returns an array of selector matches that can then be replaced\n //\n let haystackSelectorIndex;\n\n let hackstackSelector;\n let hackstackElementIndex;\n let haystackElement;\n let targetCombinator;\n let i;\n const extendVisitor = this;\n const needleElements = extend.selector.elements;\n const potentialMatches = [];\n let potentialMatch;\n const matches = [];\n\n // loop through the haystack elements\n for (haystackSelectorIndex = 0; haystackSelectorIndex < haystackSelectorPath.length; haystackSelectorIndex++) {\n hackstackSelector = haystackSelectorPath[haystackSelectorIndex];\n\n for (hackstackElementIndex = 0; hackstackElementIndex < hackstackSelector.elements.length; hackstackElementIndex++) {\n\n haystackElement = hackstackSelector.elements[hackstackElementIndex];\n\n // if we allow elements before our match we can add a potential match every time. otherwise only at the first element.\n if (extend.allowBefore || (haystackSelectorIndex === 0 && hackstackElementIndex === 0)) {\n potentialMatches.push({pathIndex: haystackSelectorIndex, index: hackstackElementIndex, matched: 0,\n initialCombinator: haystackElement.combinator});\n }\n\n for (i = 0; i < potentialMatches.length; i++) {\n potentialMatch = potentialMatches[i];\n\n // selectors add \" \" onto the first element. When we use & it joins the selectors together, but if we don't\n // then each selector in haystackSelectorPath has a space before it added in the toCSS phase. so we need to\n // work out what the resulting combinator will be\n targetCombinator = haystackElement.combinator.value;\n if (targetCombinator === '' && hackstackElementIndex === 0) {\n targetCombinator = ' ';\n }\n\n // if we don't match, null our match to indicate failure\n if (!extendVisitor.isElementValuesEqual(needleElements[potentialMatch.matched].value, haystackElement.value) ||\n (potentialMatch.matched > 0 && needleElements[potentialMatch.matched].combinator.value !== targetCombinator)) {\n potentialMatch = null;\n } else {\n potentialMatch.matched++;\n }\n\n // if we are still valid and have finished, test whether we have elements after and whether these are allowed\n if (potentialMatch) {\n potentialMatch.finished = potentialMatch.matched === needleElements.length;\n if (potentialMatch.finished &&\n (!extend.allowAfter &&\n (hackstackElementIndex + 1 < hackstackSelector.elements.length || haystackSelectorIndex + 1 < haystackSelectorPath.length))) {\n potentialMatch = null;\n }\n }\n // if null we remove, if not, we are still valid, so either push as a valid match or continue\n if (potentialMatch) {\n if (potentialMatch.finished) {\n potentialMatch.length = needleElements.length;\n potentialMatch.endPathIndex = haystackSelectorIndex;\n potentialMatch.endPathElementIndex = hackstackElementIndex + 1; // index after end of match\n potentialMatches.length = 0; // we don't allow matches to overlap, so start matching again\n matches.push(potentialMatch);\n }\n } else {\n potentialMatches.splice(i, 1);\n i--;\n }\n }\n }\n }\n return matches;\n }\n\n isElementValuesEqual(elementValue1, elementValue2) {\n if (typeof elementValue1 === 'string' || typeof elementValue2 === 'string') {\n return elementValue1 === elementValue2;\n }\n if (elementValue1 instanceof tree.Attribute) {\n if (elementValue1.op !== elementValue2.op || elementValue1.key !== elementValue2.key) {\n return false;\n }\n if (!elementValue1.value || !elementValue2.value) {\n if (elementValue1.value || elementValue2.value) {\n return false;\n }\n return true;\n }\n elementValue1 = elementValue1.value.value || elementValue1.value;\n elementValue2 = elementValue2.value.value || elementValue2.value;\n return elementValue1 === elementValue2;\n }\n elementValue1 = elementValue1.value;\n elementValue2 = elementValue2.value;\n if (elementValue1 instanceof tree.Selector) {\n if (!(elementValue2 instanceof tree.Selector) || elementValue1.elements.length !== elementValue2.elements.length) {\n return false;\n }\n for (let i = 0; i < elementValue1.elements.length; i++) {\n if (elementValue1.elements[i].combinator.value !== elementValue2.elements[i].combinator.value) {\n if (i !== 0 || (elementValue1.elements[i].combinator.value || ' ') !== (elementValue2.elements[i].combinator.value || ' ')) {\n return false;\n }\n }\n if (!this.isElementValuesEqual(elementValue1.elements[i].value, elementValue2.elements[i].value)) {\n return false;\n }\n }\n return true;\n }\n return false;\n }\n\n extendSelector(matches, selectorPath, replacementSelector, isVisible) {\n\n // for a set of matches, replace each match with the replacement selector\n\n let currentSelectorPathIndex = 0, currentSelectorPathElementIndex = 0, path = [], matchIndex, selector, firstElement, match, newElements;\n\n for (matchIndex = 0; matchIndex < matches.length; matchIndex++) {\n match = matches[matchIndex];\n selector = selectorPath[match.pathIndex];\n firstElement = new tree.Element(\n match.initialCombinator,\n replacementSelector.elements[0].value,\n replacementSelector.elements[0].isVariable,\n replacementSelector.elements[0].getIndex(),\n replacementSelector.elements[0].fileInfo()\n );\n\n if (match.pathIndex > currentSelectorPathIndex && currentSelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n\n newElements = selector.elements\n .slice(currentSelectorPathElementIndex, match.index)\n .concat([firstElement])\n .concat(replacementSelector.elements.slice(1));\n\n if (currentSelectorPathIndex === match.pathIndex && matchIndex > 0) {\n path[path.length - 1].elements =\n path[path.length - 1].elements.concat(newElements);\n } else {\n path = path.concat(selectorPath.slice(currentSelectorPathIndex, match.pathIndex));\n\n path.push(new tree.Selector(\n newElements\n ));\n }\n currentSelectorPathIndex = match.endPathIndex;\n currentSelectorPathElementIndex = match.endPathElementIndex;\n if (currentSelectorPathElementIndex >= selectorPath[currentSelectorPathIndex].elements.length) {\n currentSelectorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n }\n\n if (currentSelectorPathIndex < selectorPath.length && currentSelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathIndex++;\n }\n\n path = path.concat(selectorPath.slice(currentSelectorPathIndex, selectorPath.length));\n path = path.map(function (currentValue) {\n // we can re-use elements here, because the visibility property matters only for selectors\n const derived = currentValue.createDerived(currentValue.elements);\n if (isVisible) {\n derived.ensureVisibility();\n } else {\n derived.ensureInvisibility();\n }\n return derived;\n });\n return path;\n }\n\n visitMedia(mediaNode, visitArgs) {\n let newAllExtends = mediaNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, mediaNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitMediaOut(mediaNode) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStack.length = lastIndex;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n let newAllExtends = atRuleNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, atRuleNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStack.length = lastIndex;\n }\n}\n\nexport default ProcessExtendsVisitor;\n","import Visitor from './visitor';\n\nclass JoinSelectorVisitor {\n constructor() {\n this.contexts = [[]];\n this._visitor = new Visitor(this);\n }\n\n run(root) {\n return this._visitor.visit(root);\n }\n\n visitDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n const paths = [];\n let selectors;\n\n this.contexts.push(paths);\n\n if (!rulesetNode.root) {\n selectors = rulesetNode.selectors;\n if (selectors) {\n selectors = selectors.filter(function(selector) { return selector.getIsOutput(); });\n rulesetNode.selectors = selectors.length ? selectors : (selectors = null);\n if (selectors) { rulesetNode.joinSelectors(paths, context, selectors); }\n }\n if (!selectors) { rulesetNode.rules = null; }\n rulesetNode.paths = paths;\n }\n }\n\n visitRulesetOut(rulesetNode) {\n this.contexts.length = this.contexts.length - 1;\n }\n\n visitMedia(mediaNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n mediaNode.rules[0].root = (context.length === 0 || context[0].multiMedia);\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n if (atRuleNode.rules && atRuleNode.rules.length) {\n atRuleNode.rules[0].root = (atRuleNode.isRooted || context.length === 0 || null);\n }\n }\n}\n\nexport default JoinSelectorVisitor;\n","import tree from '../tree';\nimport Visitor from './visitor';\n\nclass CSSVisitorUtils {\n constructor(context) {\n this._visitor = new Visitor(this);\n this._context = context;\n }\n\n containsSilentNonBlockedChild(bodyRules) {\n let rule;\n if (!bodyRules) {\n return false;\n }\n for (let r = 0; r < bodyRules.length; r++) {\n rule = bodyRules[r];\n if (rule.isSilent && rule.isSilent(this._context) && !rule.blocksVisibility()) {\n // the atrule contains something that was referenced (likely by extend)\n // therefore it needs to be shown in output too\n return true;\n }\n }\n return false;\n }\n\n keepOnlyVisibleChilds(owner) {\n if (owner && owner.rules) {\n owner.rules = owner.rules.filter(thing => thing.isVisible());\n }\n }\n\n isEmpty(owner) {\n return (owner && owner.rules) \n ? (owner.rules.length === 0) : true;\n }\n\n hasVisibleSelector(rulesetNode) {\n return (rulesetNode && rulesetNode.paths)\n ? (rulesetNode.paths.length > 0) : false;\n }\n\n resolveVisibility(node, originalRules) {\n if (!node.blocksVisibility()) {\n if (this.isEmpty(node) && !this.containsSilentNonBlockedChild(originalRules)) {\n return ;\n }\n\n return node;\n }\n\n const compiledRulesBody = node.rules[0];\n this.keepOnlyVisibleChilds(compiledRulesBody);\n\n if (this.isEmpty(compiledRulesBody)) {\n return ;\n }\n\n node.ensureVisibility();\n node.removeVisibilityBlock();\n\n return node;\n }\n\n isVisibleRuleset(rulesetNode) {\n if (rulesetNode.firstRoot) {\n return true;\n }\n\n if (this.isEmpty(rulesetNode)) {\n return false;\n }\n\n if (!rulesetNode.root && !this.hasVisibleSelector(rulesetNode)) {\n return false;\n }\n\n return true;\n }\n}\n\nconst ToCSSVisitor = function(context) {\n this._visitor = new Visitor(this);\n this._context = context;\n this.utils = new CSSVisitorUtils(context);\n};\n\nToCSSVisitor.prototype = {\n isReplacing: true,\n run: function (root) {\n return this._visitor.visit(root);\n },\n\n visitDeclaration: function (declNode, visitArgs) {\n if (declNode.blocksVisibility() || declNode.variable) {\n return;\n }\n return declNode;\n },\n\n visitMixinDefinition: function (mixinNode, visitArgs) {\n // mixin definitions do not get eval'd - this means they keep state\n // so we have to clear that state here so it isn't used if toCSS is called twice\n mixinNode.frames = [];\n },\n\n visitExtend: function (extendNode, visitArgs) {\n },\n\n visitComment: function (commentNode, visitArgs) {\n if (commentNode.blocksVisibility() || commentNode.isSilent(this._context)) {\n return;\n }\n return commentNode;\n },\n\n visitMedia: function(mediaNode, visitArgs) {\n const originalRules = mediaNode.rules[0].rules;\n mediaNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n\n return this.utils.resolveVisibility(mediaNode, originalRules);\n },\n\n visitImport: function (importNode, visitArgs) {\n if (importNode.blocksVisibility()) {\n return ;\n }\n return importNode;\n },\n\n visitAtRule: function(atRuleNode, visitArgs) {\n if (atRuleNode.rules && atRuleNode.rules.length) {\n return this.visitAtRuleWithBody(atRuleNode, visitArgs);\n } else {\n return this.visitAtRuleWithoutBody(atRuleNode, visitArgs);\n }\n },\n\n visitAnonymous: function(anonymousNode, visitArgs) {\n if (!anonymousNode.blocksVisibility()) {\n anonymousNode.accept(this._visitor);\n return anonymousNode;\n }\n },\n\n visitAtRuleWithBody: function(atRuleNode, visitArgs) {\n // if there is only one nested ruleset and that one has no path, then it is\n // just fake ruleset\n function hasFakeRuleset(atRuleNode) {\n const bodyRules = atRuleNode.rules;\n return bodyRules.length === 1 && (!bodyRules[0].paths || bodyRules[0].paths.length === 0);\n }\n function getBodyRules(atRuleNode) {\n const nodeRules = atRuleNode.rules;\n if (hasFakeRuleset(atRuleNode)) {\n return nodeRules[0].rules;\n }\n\n return nodeRules;\n }\n // it is still true that it is only one ruleset in array\n // this is last such moment\n // process childs\n const originalRules = getBodyRules(atRuleNode);\n atRuleNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n\n if (!this.utils.isEmpty(atRuleNode)) {\n this._mergeRules(atRuleNode.rules[0].rules);\n }\n\n return this.utils.resolveVisibility(atRuleNode, originalRules);\n },\n\n visitAtRuleWithoutBody: function(atRuleNode, visitArgs) {\n if (atRuleNode.blocksVisibility()) {\n return;\n }\n\n if (atRuleNode.name === '@charset') {\n // Only output the debug info together with subsequent @charset definitions\n // a comment (or @media statement) before the actual @charset atrule would\n // be considered illegal css as it has to be on the first line\n if (this.charset) {\n if (atRuleNode.debugInfo) {\n const comment = new tree.Comment(`/* ${atRuleNode.toCSS(this._context).replace(/\\n/g, '')} */\\n`);\n comment.debugInfo = atRuleNode.debugInfo;\n return this._visitor.visit(comment);\n }\n return;\n }\n this.charset = true;\n }\n\n return atRuleNode;\n },\n\n checkValidNodes: function(rules, isRoot) {\n if (!rules) {\n return;\n }\n\n for (let i = 0; i < rules.length; i++) {\n const ruleNode = rules[i];\n if (isRoot && ruleNode instanceof tree.Declaration && !ruleNode.variable) {\n throw { message: 'Properties must be inside selector blocks. They cannot be in the root',\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n if (ruleNode instanceof tree.Call) {\n throw { message: `Function '${ruleNode.name}' did not return a root node`,\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n if (ruleNode.type && !ruleNode.allowRoot) {\n throw { message: `${ruleNode.type} node returned by a function is not valid here`,\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n }\n },\n\n visitRuleset: function (rulesetNode, visitArgs) {\n // at this point rulesets are nested into each other\n let rule;\n\n const rulesets = [];\n\n this.checkValidNodes(rulesetNode.rules, rulesetNode.firstRoot);\n\n if (!rulesetNode.root) {\n // remove invisible paths\n this._compileRulesetPaths(rulesetNode);\n\n // remove rulesets from this ruleset body and compile them separately\n const nodeRules = rulesetNode.rules;\n\n let nodeRuleCnt = nodeRules ? nodeRules.length : 0;\n for (let i = 0; i < nodeRuleCnt; ) {\n rule = nodeRules[i];\n if (rule && rule.rules) {\n // visit because we are moving them out from being a child\n rulesets.push(this._visitor.visit(rule));\n nodeRules.splice(i, 1);\n nodeRuleCnt--;\n continue;\n }\n i++;\n }\n // accept the visitor to remove rules and refactor itself\n // then we can decide nogw whether we want it or not\n // compile body\n if (nodeRuleCnt > 0) {\n rulesetNode.accept(this._visitor);\n } else {\n rulesetNode.rules = null;\n }\n visitArgs.visitDeeper = false;\n } else { // if (! rulesetNode.root) {\n rulesetNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n }\n\n if (rulesetNode.rules) {\n this._mergeRules(rulesetNode.rules);\n this._removeDuplicateRules(rulesetNode.rules);\n }\n\n // now decide whether we keep the ruleset\n if (this.utils.isVisibleRuleset(rulesetNode)) {\n rulesetNode.ensureVisibility();\n rulesets.splice(0, 0, rulesetNode);\n }\n\n if (rulesets.length === 1) {\n return rulesets[0];\n }\n return rulesets;\n },\n\n _compileRulesetPaths: function(rulesetNode) {\n if (rulesetNode.paths) {\n rulesetNode.paths = rulesetNode.paths\n .filter(p => {\n let i;\n if (p[0].elements[0].combinator.value === ' ') {\n p[0].elements[0].combinator = new(tree.Combinator)('');\n }\n for (i = 0; i < p.length; i++) {\n if (p[i].isVisible() && p[i].getIsOutput()) {\n return true;\n }\n }\n return false;\n });\n }\n },\n\n _removeDuplicateRules: function(rules) {\n if (!rules) { return; }\n\n // remove duplicates\n const ruleCache = {};\n\n let ruleList;\n let rule;\n let i;\n\n for (i = rules.length - 1; i >= 0 ; i--) {\n rule = rules[i];\n if (rule instanceof tree.Declaration) {\n if (!ruleCache[rule.name]) {\n ruleCache[rule.name] = rule;\n } else {\n ruleList = ruleCache[rule.name];\n if (ruleList instanceof tree.Declaration) {\n ruleList = ruleCache[rule.name] = [ruleCache[rule.name].toCSS(this._context)];\n }\n const ruleCSS = rule.toCSS(this._context);\n if (ruleList.indexOf(ruleCSS) !== -1) {\n rules.splice(i, 1);\n } else {\n ruleList.push(ruleCSS);\n }\n }\n }\n }\n },\n\n _mergeRules: function(rules) {\n if (!rules) {\n return; \n }\n\n const groups = {};\n const groupsArr = [];\n\n for (let i = 0; i < rules.length; i++) {\n const rule = rules[i];\n if (rule.merge) {\n const key = rule.name;\n groups[key] ? rules.splice(i--, 1) : \n groupsArr.push(groups[key] = []);\n groups[key].push(rule);\n }\n }\n\n groupsArr.forEach(group => {\n if (group.length > 0) {\n const result = group[0];\n let space = [];\n const comma = [new tree.Expression(space)];\n group.forEach(rule => {\n if ((rule.merge === '+') && (space.length > 0)) {\n comma.push(new tree.Expression(space = []));\n }\n space.push(rule.value);\n result.important = result.important || rule.important;\n });\n result.value = new tree.Value(comma);\n }\n });\n }\n};\n\nexport default ToCSSVisitor;\n","import Visitor from './visitor';\nimport ImportVisitor from './import-visitor';\nimport MarkVisibleSelectorsVisitor from './set-tree-visibility-visitor';\nimport ExtendVisitor from './extend-visitor';\nimport JoinSelectorVisitor from './join-selector-visitor';\nimport ToCSSVisitor from './to-css-visitor';\n\nexport default {\n Visitor,\n ImportVisitor,\n MarkVisibleSelectorsVisitor,\n ExtendVisitor,\n JoinSelectorVisitor,\n ToCSSVisitor\n};\n","import chunker from './chunker';\n\nexport default () => {\n let // Less input string\n input;\n\n let // current chunk\n j;\n\n const // holds state for backtracking\n saveStack = [];\n\n let // furthest index the parser has gone to\n furthest;\n\n let // if this is furthest we got to, this is the probably cause\n furthestPossibleErrorMessage;\n\n let // chunkified input\n chunks;\n\n let // current chunk\n current;\n\n let // index of current chunk, in `input`\n currentPos;\n\n const parserInput = {};\n const CHARCODE_SPACE = 32;\n const CHARCODE_TAB = 9;\n const CHARCODE_LF = 10;\n const CHARCODE_CR = 13;\n const CHARCODE_PLUS = 43;\n const CHARCODE_COMMA = 44;\n const CHARCODE_FORWARD_SLASH = 47;\n const CHARCODE_9 = 57;\n\n function skipWhitespace(length) {\n const oldi = parserInput.i;\n const oldj = j;\n const curr = parserInput.i - currentPos;\n const endIndex = parserInput.i + current.length - curr;\n const mem = (parserInput.i += length);\n const inp = input;\n let c;\n let nextChar;\n let comment;\n\n for (; parserInput.i < endIndex; parserInput.i++) {\n c = inp.charCodeAt(parserInput.i);\n\n if (parserInput.autoCommentAbsorb && c === CHARCODE_FORWARD_SLASH) {\n nextChar = inp.charAt(parserInput.i + 1);\n if (nextChar === '/') {\n comment = {index: parserInput.i, isLineComment: true};\n let nextNewLine = inp.indexOf('\\n', parserInput.i + 2);\n if (nextNewLine < 0) {\n nextNewLine = endIndex;\n }\n parserInput.i = nextNewLine;\n comment.text = inp.substr(comment.index, parserInput.i - comment.index);\n parserInput.commentStore.push(comment);\n continue;\n } else if (nextChar === '*') {\n const nextStarSlash = inp.indexOf('*/', parserInput.i + 2);\n if (nextStarSlash >= 0) {\n comment = {\n index: parserInput.i,\n text: inp.substr(parserInput.i, nextStarSlash + 2 - parserInput.i),\n isLineComment: false\n };\n parserInput.i += comment.text.length - 1;\n parserInput.commentStore.push(comment);\n continue;\n }\n }\n break;\n }\n\n if ((c !== CHARCODE_SPACE) && (c !== CHARCODE_LF) && (c !== CHARCODE_TAB) && (c !== CHARCODE_CR)) {\n break;\n }\n }\n\n current = current.slice(length + parserInput.i - mem + curr);\n currentPos = parserInput.i;\n\n if (!current.length) {\n if (j < chunks.length - 1) {\n current = chunks[++j];\n skipWhitespace(0); // skip space at the beginning of a chunk\n return true; // things changed\n }\n parserInput.finished = true;\n }\n\n return oldi !== parserInput.i || oldj !== j;\n }\n\n parserInput.save = () => {\n currentPos = parserInput.i;\n saveStack.push( { current, i: parserInput.i, j });\n };\n parserInput.restore = possibleErrorMessage => {\n\n if (parserInput.i > furthest || (parserInput.i === furthest && possibleErrorMessage && !furthestPossibleErrorMessage)) {\n furthest = parserInput.i;\n furthestPossibleErrorMessage = possibleErrorMessage;\n }\n const state = saveStack.pop();\n current = state.current;\n currentPos = parserInput.i = state.i;\n j = state.j;\n };\n parserInput.forget = () => {\n saveStack.pop();\n };\n parserInput.isWhitespace = offset => {\n const pos = parserInput.i + (offset || 0);\n const code = input.charCodeAt(pos);\n return (code === CHARCODE_SPACE || code === CHARCODE_CR || code === CHARCODE_TAB || code === CHARCODE_LF);\n };\n\n // Specialization of $(tok)\n parserInput.$re = tok => {\n if (parserInput.i > currentPos) {\n current = current.slice(parserInput.i - currentPos);\n currentPos = parserInput.i;\n }\n\n const m = tok.exec(current);\n if (!m) {\n return null;\n }\n\n skipWhitespace(m[0].length);\n if (typeof m === 'string') {\n return m;\n }\n\n return m.length === 1 ? m[0] : m;\n };\n\n parserInput.$char = tok => {\n if (input.charAt(parserInput.i) !== tok) {\n return null;\n }\n skipWhitespace(1);\n return tok;\n };\n\n parserInput.$str = tok => {\n const tokLength = tok.length;\n\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tokLength; i++) {\n if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n return null;\n }\n }\n\n skipWhitespace(tokLength);\n return tok;\n };\n\n parserInput.$quoted = loc => {\n const pos = loc || parserInput.i;\n const startChar = input.charAt(pos);\n\n if (startChar !== '\\'' && startChar !== '\"') {\n return;\n }\n const length = input.length;\n const currentPosition = pos;\n\n for (let i = 1; i + currentPosition < length; i++) {\n const nextChar = input.charAt(i + currentPosition);\n switch (nextChar) {\n case '\\\\':\n i++;\n continue;\n case '\\r':\n case '\\n':\n break;\n case startChar:\n const str = input.substr(currentPosition, i + 1);\n if (!loc && loc !== 0) {\n skipWhitespace(i + 1);\n return str\n }\n return [startChar, str];\n default:\n }\n }\n return null;\n };\n\n /**\n * Permissive parsing. Ignores everything except matching {} [] () and quotes\n * until matching token (outside of blocks)\n */\n parserInput.$parseUntil = tok => {\n let quote = '';\n let returnVal = null;\n let inComment = false;\n let blockDepth = 0;\n const blockStack = [];\n const parseGroups = [];\n const length = input.length;\n const startPos = parserInput.i;\n let lastPos = parserInput.i;\n let i = parserInput.i;\n let loop = true;\n let testChar;\n\n if (typeof tok === 'string') {\n testChar = char => char === tok\n } else {\n testChar = char => tok.test(char)\n }\n\n do {\n let prevChar;\n let nextChar = input.charAt(i);\n if (blockDepth === 0 && testChar(nextChar)) {\n returnVal = input.substr(lastPos, i - lastPos);\n if (returnVal) {\n parseGroups.push(returnVal);\n }\n else {\n parseGroups.push(' ');\n }\n returnVal = parseGroups;\n skipWhitespace(i - startPos);\n loop = false\n } else {\n if (inComment) {\n if (nextChar === '*' && \n input.charAt(i + 1) === '/') {\n i++;\n blockDepth--;\n inComment = false;\n }\n i++;\n continue;\n }\n switch (nextChar) {\n case '\\\\':\n i++;\n nextChar = input.charAt(i);\n parseGroups.push(input.substr(lastPos, i - lastPos + 1));\n lastPos = i + 1;\n break;\n case '/':\n if (input.charAt(i + 1) === '*') {\n i++;\n inComment = true;\n blockDepth++;\n }\n break;\n case '\\'':\n case '\"':\n quote = parserInput.$quoted(i);\n if (quote) {\n parseGroups.push(input.substr(lastPos, i - lastPos), quote);\n i += quote[1].length - 1;\n lastPos = i + 1;\n }\n else {\n skipWhitespace(i - startPos);\n returnVal = nextChar;\n loop = false;\n }\n break;\n case '{':\n blockStack.push('}');\n blockDepth++;\n break;\n case '(':\n blockStack.push(')');\n blockDepth++;\n break;\n case '[':\n blockStack.push(']');\n blockDepth++;\n break;\n case '}':\n case ')':\n case ']':\n const expected = blockStack.pop();\n if (nextChar === expected) {\n blockDepth--;\n } else {\n // move the parser to the error and return expected\n skipWhitespace(i - startPos);\n returnVal = expected;\n loop = false;\n }\n }\n i++;\n if (i > length) {\n loop = false;\n }\n }\n prevChar = nextChar;\n } while (loop);\n\n return returnVal ? returnVal : null;\n }\n\n parserInput.autoCommentAbsorb = true;\n parserInput.commentStore = [];\n parserInput.finished = false;\n\n // Same as $(), but don't change the state of the parser,\n // just return the match.\n parserInput.peek = tok => {\n if (typeof tok === 'string') {\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tok.length; i++) {\n if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n return false;\n }\n }\n return true;\n } else {\n return tok.test(current);\n }\n };\n\n // Specialization of peek()\n // TODO remove or change some currentChar calls to peekChar\n parserInput.peekChar = tok => input.charAt(parserInput.i) === tok;\n\n parserInput.currentChar = () => input.charAt(parserInput.i);\n\n parserInput.prevChar = () => input.charAt(parserInput.i - 1);\n\n parserInput.getInput = () => input;\n\n parserInput.peekNotNumeric = () => {\n const c = input.charCodeAt(parserInput.i);\n // Is the first char of the dimension 0-9, '.', '+' or '-'\n return (c > CHARCODE_9 || c < CHARCODE_PLUS) || c === CHARCODE_FORWARD_SLASH || c === CHARCODE_COMMA;\n };\n\n parserInput.start = (str, chunkInput, failFunction) => {\n input = str;\n parserInput.i = j = currentPos = furthest = 0;\n\n // chunking apparently makes things quicker (but my tests indicate\n // it might actually make things slower in node at least)\n // and it is a non-perfect parse - it can't recognise\n // unquoted urls, meaning it can't distinguish comments\n // meaning comments with quotes or {}() in them get 'counted'\n // and then lead to parse errors.\n // In addition if the chunking chunks in the wrong place we might\n // not be able to parse a parser statement in one go\n // this is officially deprecated but can be switched on via an option\n // in the case it causes too much performance issues.\n if (chunkInput) {\n chunks = chunker(str, failFunction);\n } else {\n chunks = [str];\n }\n\n current = chunks[0];\n\n skipWhitespace(0);\n };\n\n parserInput.end = () => {\n let message;\n const isFinished = parserInput.i >= input.length;\n\n if (parserInput.i < furthest) {\n message = furthestPossibleErrorMessage;\n parserInput.i = furthest;\n }\n return {\n isFinished,\n furthest: parserInput.i,\n furthestPossibleErrorMessage: message,\n furthestReachedEnd: parserInput.i >= input.length - 1,\n furthestChar: input[parserInput.i]\n };\n };\n\n return parserInput;\n};\n","// Split the input into chunks.\nexport default function (input, fail) {\n const len = input.length;\n let level = 0;\n let parenLevel = 0;\n let lastOpening;\n let lastOpeningParen;\n let lastMultiComment;\n let lastMultiCommentEndBrace;\n const chunks = [];\n let emitFrom = 0;\n let chunkerCurrentIndex;\n let currentChunkStartIndex;\n let cc;\n let cc2;\n let matched;\n\n function emitChunk(force) {\n const len = chunkerCurrentIndex - emitFrom;\n if (((len < 512) && !force) || !len) {\n return;\n }\n chunks.push(input.slice(emitFrom, chunkerCurrentIndex + 1));\n emitFrom = chunkerCurrentIndex + 1;\n }\n\n for (chunkerCurrentIndex = 0; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc = input.charCodeAt(chunkerCurrentIndex);\n if (((cc >= 97) && (cc <= 122)) || (cc < 34)) {\n // a-z or whitespace\n continue;\n }\n\n switch (cc) {\n case 40: // (\n parenLevel++;\n lastOpeningParen = chunkerCurrentIndex;\n continue;\n case 41: // )\n if (--parenLevel < 0) {\n return fail('missing opening `(`', chunkerCurrentIndex);\n }\n continue;\n case 59: // ;\n if (!parenLevel) { emitChunk(); }\n continue;\n case 123: // {\n level++;\n lastOpening = chunkerCurrentIndex;\n continue;\n case 125: // }\n if (--level < 0) {\n return fail('missing opening `{`', chunkerCurrentIndex);\n }\n if (!level && !parenLevel) { emitChunk(); }\n continue;\n case 92: // \\\n if (chunkerCurrentIndex < len - 1) { chunkerCurrentIndex++; continue; }\n return fail('unescaped `\\\\`', chunkerCurrentIndex);\n case 34:\n case 39:\n case 96: // \", ' and `\n matched = 0;\n currentChunkStartIndex = chunkerCurrentIndex;\n for (chunkerCurrentIndex = chunkerCurrentIndex + 1; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if (cc2 > 96) { continue; }\n if (cc2 == cc) { matched = 1; break; }\n if (cc2 == 92) { // \\\n if (chunkerCurrentIndex == len - 1) {\n return fail('unescaped `\\\\`', chunkerCurrentIndex);\n }\n chunkerCurrentIndex++;\n }\n }\n if (matched) { continue; }\n return fail(`unmatched \\`${String.fromCharCode(cc)}\\``, currentChunkStartIndex);\n case 47: // /, check for comment\n if (parenLevel || (chunkerCurrentIndex == len - 1)) { continue; }\n cc2 = input.charCodeAt(chunkerCurrentIndex + 1);\n if (cc2 == 47) {\n // //, find lnfeed\n for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if ((cc2 <= 13) && ((cc2 == 10) || (cc2 == 13))) { break; }\n }\n } else if (cc2 == 42) {\n // /*, find */\n lastMultiComment = currentChunkStartIndex = chunkerCurrentIndex;\n for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len - 1; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if (cc2 == 125) { lastMultiCommentEndBrace = chunkerCurrentIndex; }\n if (cc2 != 42) { continue; }\n if (input.charCodeAt(chunkerCurrentIndex + 1) == 47) { break; }\n }\n if (chunkerCurrentIndex == len - 1) {\n return fail('missing closing `*/`', currentChunkStartIndex);\n }\n chunkerCurrentIndex++;\n }\n continue;\n case 42: // *, check for unmatched */\n if ((chunkerCurrentIndex < len - 1) && (input.charCodeAt(chunkerCurrentIndex + 1) == 47)) {\n return fail('unmatched `/*`', chunkerCurrentIndex);\n }\n continue;\n }\n }\n\n if (level !== 0) {\n if ((lastMultiComment > lastOpening) && (lastMultiCommentEndBrace > lastMultiComment)) {\n return fail('missing closing `}` or `*/`', lastOpening);\n } else {\n return fail('missing closing `}`', lastOpening);\n }\n } else if (parenLevel !== 0) {\n return fail('missing closing `)`', lastOpeningParen);\n }\n\n emitChunk(true);\n return chunks;\n};\n","import LessError from '../less-error';\nimport tree from '../tree';\nimport visitors from '../visitors';\nimport getParserInput from './parser-input';\nimport * as utils from '../utils';\nimport functionRegistry from '../functions/function-registry';\n\n//\n// less.js - parser\n//\n// A relatively straight-forward predictive parser.\n// There is no tokenization/lexing stage, the input is parsed\n// in one sweep.\n//\n// To make the parser fast enough to run in the browser, several\n// optimization had to be made:\n//\n// - Matching and slicing on a huge input is often cause of slowdowns.\n// The solution is to chunkify the input into smaller strings.\n// The chunks are stored in the `chunks` var,\n// `j` holds the current chunk index, and `currentPos` holds\n// the index of the current chunk in relation to `input`.\n// This gives us an almost 4x speed-up.\n//\n// - In many cases, we don't need to match individual tokens;\n// for example, if a value doesn't hold any variables, operations\n// or dynamic references, the parser can effectively 'skip' it,\n// treating it as a literal.\n// An example would be '1px solid #000' - which evaluates to itself,\n// we don't need to know what the individual components are.\n// The drawback, of course is that you don't get the benefits of\n// syntax-checking on the CSS. This gives us a 50% speed-up in the parser,\n// and a smaller speed-up in the code-gen.\n//\n//\n// Token matching is done with the `$` function, which either takes\n// a terminal string or regexp, or a non-terminal function to call.\n// It also takes care of moving all the indices forwards.\n//\n\nconst Parser = function Parser(context, imports, fileInfo) {\n let parsers;\n const parserInput = getParserInput();\n\n function error(msg, type) {\n throw new LessError(\n {\n index: parserInput.i,\n filename: fileInfo.filename,\n type: type || 'Syntax',\n message: msg\n },\n imports\n );\n }\n\n function expect(arg, msg) {\n // some older browsers return typeof 'function' for RegExp\n const result = (arg instanceof Function) ? arg.call(parsers) : parserInput.$re(arg);\n if (result) {\n return result;\n }\n \n error(msg || (typeof arg === 'string'\n ? `expected '${arg}' got '${parserInput.currentChar()}'`\n : 'unexpected token'));\n }\n\n // Specialization of expect()\n function expectChar(arg, msg) {\n if (parserInput.$char(arg)) {\n return arg;\n }\n error(msg || `expected '${arg}' got '${parserInput.currentChar()}'`);\n }\n\n function getDebugInfo(index) {\n const filename = fileInfo.filename;\n\n return {\n lineNumber: utils.getLocation(index, parserInput.getInput()).line + 1,\n fileName: filename\n };\n }\n\n /**\n * Used after initial parsing to create nodes on the fly\n * \n * @param {String} str - string to parse \n * @param {Array} parseList - array of parsers to run input through e.g. [\"value\", \"important\"]\n * @param {Number} currentIndex - start number to begin indexing\n * @param {Object} fileInfo - fileInfo to attach to created nodes\n */\n function parseNode(str, parseList, currentIndex, fileInfo, callback) {\n let result;\n const returnNodes = [];\n const parser = parserInput;\n\n try {\n parser.start(str, false, function fail(msg, index) {\n callback({\n message: msg,\n index: index + currentIndex\n });\n });\n for (let x = 0, p, i; (p = parseList[x]); x++) {\n i = parser.i;\n result = parsers[p]();\n if (result) {\n try {\n result._index = i + currentIndex;\n result._fileInfo = fileInfo;\n } catch (e) {}\n returnNodes.push(result);\n }\n else {\n returnNodes.push(null);\n }\n }\n\n const endInfo = parser.end();\n if (endInfo.isFinished) {\n callback(null, returnNodes);\n }\n else {\n callback(true, null);\n }\n } catch (e) {\n throw new LessError({\n index: e.index + currentIndex,\n message: e.message\n }, imports, fileInfo.filename);\n }\n }\n\n //\n // The Parser\n //\n return {\n parserInput,\n imports,\n fileInfo,\n parseNode,\n //\n // Parse an input string into an abstract syntax tree,\n // @param str A string containing 'less' markup\n // @param callback call `callback` when done.\n // @param [additionalData] An optional map which can contains vars - a map (key, value) of variables to apply\n //\n parse: function (str, callback, additionalData) {\n let root;\n let error = null;\n let globalVars;\n let modifyVars;\n let ignored;\n let preText = '';\n\n globalVars = (additionalData && additionalData.globalVars) ? `${Parser.serializeVars(additionalData.globalVars)}\\n` : '';\n modifyVars = (additionalData && additionalData.modifyVars) ? `\\n${Parser.serializeVars(additionalData.modifyVars)}` : '';\n\n if (context.pluginManager) {\n const preProcessors = context.pluginManager.getPreProcessors();\n for (let i = 0; i < preProcessors.length; i++) {\n str = preProcessors[i].process(str, { context, imports, fileInfo });\n }\n }\n\n if (globalVars || (additionalData && additionalData.banner)) {\n preText = ((additionalData && additionalData.banner) ? additionalData.banner : '') + globalVars;\n ignored = imports.contentsIgnoredChars;\n ignored[fileInfo.filename] = ignored[fileInfo.filename] || 0;\n ignored[fileInfo.filename] += preText.length;\n }\n\n str = str.replace(/\\r\\n?/g, '\\n');\n // Remove potential UTF Byte Order Mark\n str = preText + str.replace(/^\\uFEFF/, '') + modifyVars;\n imports.contents[fileInfo.filename] = str;\n\n // Start with the primary rule.\n // The whole syntax tree is held under a Ruleset node,\n // with the `root` property set to true, so no `{}` are\n // output. The callback is called when the input is parsed.\n try {\n parserInput.start(str, context.chunkInput, function fail(msg, index) {\n throw new LessError({\n index,\n type: 'Parse',\n message: msg,\n filename: fileInfo.filename\n }, imports);\n });\n\n tree.Node.prototype.parse = this;\n root = new tree.Ruleset(null, this.parsers.primary());\n tree.Node.prototype.rootNode = root;\n root.root = true;\n root.firstRoot = true;\n root.functionRegistry = functionRegistry.inherit();\n \n } catch (e) {\n return callback(new LessError(e, imports, fileInfo.filename));\n }\n\n // If `i` is smaller than the `input.length - 1`,\n // it means the parser wasn't able to parse the whole\n // string, so we've got a parsing error.\n //\n // We try to extract a \\n delimited string,\n // showing the line where the parse error occurred.\n // We split it up into two parts (the part which parsed,\n // and the part which didn't), so we can color them differently.\n const endInfo = parserInput.end();\n if (!endInfo.isFinished) {\n\n let message = endInfo.furthestPossibleErrorMessage;\n\n if (!message) {\n message = 'Unrecognised input';\n if (endInfo.furthestChar === '}') {\n message += '. Possibly missing opening \\'{\\'';\n } else if (endInfo.furthestChar === ')') {\n message += '. Possibly missing opening \\'(\\'';\n } else if (endInfo.furthestReachedEnd) {\n message += '. Possibly missing something';\n }\n }\n\n error = new LessError({\n type: 'Parse',\n message,\n index: endInfo.furthest,\n filename: fileInfo.filename\n }, imports);\n }\n\n const finish = e => {\n e = error || e || imports.error;\n\n if (e) {\n if (!(e instanceof LessError)) {\n e = new LessError(e, imports, fileInfo.filename);\n }\n\n return callback(e);\n }\n else {\n return callback(null, root);\n }\n };\n\n if (context.processImports !== false) {\n new visitors.ImportVisitor(imports, finish)\n .run(root);\n } else {\n return finish();\n }\n },\n\n //\n // Here in, the parsing rules/functions\n //\n // The basic structure of the syntax tree generated is as follows:\n //\n // Ruleset -> Declaration -> Value -> Expression -> Entity\n //\n // Here's some Less code:\n //\n // .class {\n // color: #fff;\n // border: 1px solid #000;\n // width: @w + 4px;\n // > .child {...}\n // }\n //\n // And here's what the parse tree might look like:\n //\n // Ruleset (Selector '.class', [\n // Declaration (\"color\", Value ([Expression [Color #fff]]))\n // Declaration (\"border\", Value ([Expression [Dimension 1px][Keyword \"solid\"][Color #000]]))\n // Declaration (\"width\", Value ([Expression [Operation \" + \" [Variable \"@w\"][Dimension 4px]]]))\n // Ruleset (Selector [Element '>', '.child'], [...])\n // ])\n //\n // In general, most rules will try to parse a token with the `$re()` function, and if the return\n // value is truly, will return a new node, of the relevant type. Sometimes, we need to check\n // first, before parsing, that's when we use `peek()`.\n //\n parsers: parsers = {\n //\n // The `primary` rule is the *entry* and *exit* point of the parser.\n // The rules here can appear at any level of the parse tree.\n //\n // The recursive nature of the grammar is an interplay between the `block`\n // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule,\n // as represented by this simplified grammar:\n //\n // primary → (ruleset | declaration)+\n // ruleset → selector+ block\n // block → '{' primary '}'\n //\n // Only at one point is the primary rule not called from the\n // block rule: at the root level.\n //\n primary: function () {\n const mixin = this.mixin;\n let root = [];\n let node;\n\n while (true) {\n while (true) {\n node = this.comment();\n if (!node) { break; }\n root.push(node);\n }\n // always process comments before deciding if finished\n if (parserInput.finished) {\n break;\n }\n if (parserInput.peek('}')) {\n break;\n }\n\n node = this.extendRule();\n if (node) {\n root = root.concat(node);\n continue;\n }\n\n node = mixin.definition() || this.declaration() || mixin.call(false, false) || \n this.ruleset() || this.variableCall() || this.entities.call() || this.atrule();\n if (node) {\n root.push(node);\n } else {\n let foundSemiColon = false;\n while (parserInput.$char(';')) {\n foundSemiColon = true;\n }\n if (!foundSemiColon) {\n break;\n }\n }\n }\n\n return root;\n },\n\n // comments are collected by the main parsing mechanism and then assigned to nodes\n // where the current structure allows it\n comment: function () {\n if (parserInput.commentStore.length) {\n const comment = parserInput.commentStore.shift();\n return new(tree.Comment)(comment.text, comment.isLineComment, comment.index, fileInfo);\n }\n },\n\n //\n // Entities are tokens which can be found inside an Expression\n //\n entities: {\n mixinLookup: function() {\n return parsers.mixin.call(true, true);\n },\n //\n // A string, which supports escaping \" and '\n //\n // \"milky way\" 'he\\'s the one!'\n //\n quoted: function (forceEscaped) {\n let str;\n const index = parserInput.i;\n let isEscaped = false;\n\n parserInput.save();\n if (parserInput.$char('~')) {\n isEscaped = true;\n } else if (forceEscaped) {\n parserInput.restore();\n return;\n }\n\n str = parserInput.$quoted();\n if (!str) {\n parserInput.restore();\n return;\n }\n parserInput.forget();\n\n return new(tree.Quoted)(str.charAt(0), str.substr(1, str.length - 2), isEscaped, index, fileInfo);\n },\n\n //\n // A catch-all word, such as:\n //\n // black border-collapse\n //\n keyword: function () {\n const k = parserInput.$char('%') || parserInput.$re(/^\\[?(?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+\\]?/);\n if (k) {\n return tree.Color.fromKeyword(k) || new(tree.Keyword)(k);\n }\n },\n\n //\n // A function call\n //\n // rgb(255, 0, 255)\n //\n // The arguments are parsed with the `entities.arguments` parser.\n //\n call: function () {\n let name;\n let args;\n let func;\n const index = parserInput.i;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (parserInput.peek(/^url\\(/i)) {\n return;\n }\n\n parserInput.save();\n\n name = parserInput.$re(/^([\\w-]+|%|~|progid:[\\w\\.]+)\\(/);\n if (!name) {\n parserInput.forget(); \n return;\n }\n\n name = name[1];\n func = this.customFuncCall(name);\n if (func) {\n args = func.parse();\n if (args && func.stop) {\n parserInput.forget();\n return args;\n }\n }\n\n args = this.arguments(args);\n\n if (!parserInput.$char(')')) {\n parserInput.restore('Could not parse call arguments or missing \\')\\'');\n return;\n }\n\n parserInput.forget();\n\n return new(tree.Call)(name, args, index, fileInfo);\n },\n \n //\n // Parsing rules for functions with non-standard args, e.g.:\n //\n // boolean(not(2 > 1))\n //\n // This is a quick prototype, to be modified/improved when\n // more custom-parsed funcs come (e.g. `selector(...)`)\n //\n\n customFuncCall: function (name) {\n /* Ideally the table is to be moved out of here for faster perf.,\n but it's quite tricky since it relies on all these `parsers`\n and `expect` available only here */\n return {\n alpha: f(parsers.ieAlpha, true),\n boolean: f(condition),\n 'if': f(condition)\n }[name.toLowerCase()];\n\n function f(parse, stop) {\n return {\n parse, // parsing function\n stop // when true - stop after parse() and return its result, \n // otherwise continue for plain args\n };\n }\n \n function condition() {\n return [expect(parsers.condition, 'expected condition')];\n }\n },\n\n arguments: function (prevArgs) {\n let argsComma = prevArgs || [];\n const argsSemiColon = [];\n let isSemiColonSeparated;\n let value;\n\n parserInput.save();\n\n while (true) {\n if (prevArgs) {\n prevArgs = false;\n } else {\n value = parsers.detachedRuleset() || this.assignment() || parsers.expression();\n if (!value) {\n break;\n }\n\n if (value.value && value.value.length == 1) {\n value = value.value[0];\n }\n\n argsComma.push(value);\n }\n\n if (parserInput.$char(',')) {\n continue;\n }\n\n if (parserInput.$char(';') || isSemiColonSeparated) {\n isSemiColonSeparated = true;\n value = (argsComma.length < 1) ? argsComma[0]\n : new tree.Value(argsComma);\n argsSemiColon.push(value);\n argsComma = [];\n }\n }\n\n parserInput.forget();\n return isSemiColonSeparated ? argsSemiColon : argsComma;\n },\n literal: function () {\n return this.dimension() ||\n this.color() ||\n this.quoted() ||\n this.unicodeDescriptor();\n },\n\n // Assignments are argument entities for calls.\n // They are present in ie filter properties as shown below.\n //\n // filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* )\n //\n\n assignment: function () {\n let key;\n let value;\n parserInput.save();\n key = parserInput.$re(/^\\w+(?=\\s?=)/i);\n if (!key) {\n parserInput.restore();\n return;\n }\n if (!parserInput.$char('=')) {\n parserInput.restore();\n return;\n }\n value = parsers.entity();\n if (value) {\n parserInput.forget();\n return new(tree.Assignment)(key, value);\n } else {\n parserInput.restore();\n }\n },\n\n //\n // Parse url() tokens\n //\n // We use a specific rule for urls, because they don't really behave like\n // standard function calls. The difference is that the argument doesn't have\n // to be enclosed within a string, so it can't be parsed as an Expression.\n //\n url: function () {\n let value;\n const index = parserInput.i;\n\n parserInput.autoCommentAbsorb = false;\n\n if (!parserInput.$str('url(')) {\n parserInput.autoCommentAbsorb = true;\n return;\n }\n\n value = this.quoted() || this.variable() || this.property() ||\n parserInput.$re(/^(?:(?:\\\\[\\(\\)'\"])|[^\\(\\)'\"])+/) || '';\n\n parserInput.autoCommentAbsorb = true;\n\n expectChar(')');\n\n return new(tree.URL)((value.value != null || \n value instanceof tree.Variable || \n value instanceof tree.Property) ?\n value : new(tree.Anonymous)(value, index), index, fileInfo);\n },\n\n //\n // A Variable entity, such as `@fink`, in\n //\n // width: @fink + 2px\n //\n // We use a different parser for variable definitions,\n // see `parsers.variable`.\n //\n variable: function () {\n let ch;\n let name;\n const index = parserInput.i;\n\n parserInput.save();\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^@@?[\\w-]+/))) {\n ch = parserInput.currentChar();\n if (ch === '(' || ch === '[' && !parserInput.prevChar().match(/^\\s/)) {\n // this may be a VariableCall lookup\n const result = parsers.variableCall(name);\n if (result) {\n parserInput.forget();\n return result;\n }\n }\n parserInput.forget();\n return new(tree.Variable)(name, index, fileInfo);\n }\n parserInput.restore();\n },\n\n // A variable entity using the protective {} e.g. @{var}\n variableCurly: function () {\n let curly;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '@' && (curly = parserInput.$re(/^@\\{([\\w-]+)\\}/))) {\n return new(tree.Variable)(`@${curly[1]}`, index, fileInfo);\n }\n },\n //\n // A Property accessor, such as `$color`, in\n //\n // background-color: $color\n //\n property: function () {\n let name;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' && (name = parserInput.$re(/^\\$[\\w-]+/))) {\n return new(tree.Property)(name, index, fileInfo);\n }\n },\n\n // A property entity useing the protective {} e.g. ${prop}\n propertyCurly: function () {\n let curly;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' && (curly = parserInput.$re(/^\\$\\{([\\w-]+)\\}/))) {\n return new(tree.Property)(`$${curly[1]}`, index, fileInfo);\n }\n },\n //\n // A Hexadecimal color\n //\n // #4F3C2F\n //\n // `rgb` and `hsl` colors are parsed through the `entities.call` parser.\n //\n color: function () {\n let rgb;\n parserInput.save();\n\n if (parserInput.currentChar() === '#' && (rgb = parserInput.$re(/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})([\\w.#\\[])?/))) {\n if (!rgb[2]) {\n parserInput.forget();\n return new(tree.Color)(rgb[1], undefined, rgb[0]);\n } \n }\n parserInput.restore();\n },\n\n colorKeyword: function () {\n parserInput.save();\n const autoCommentAbsorb = parserInput.autoCommentAbsorb;\n parserInput.autoCommentAbsorb = false;\n const k = parserInput.$re(/^[_A-Za-z-][_A-Za-z0-9-]+/);\n parserInput.autoCommentAbsorb = autoCommentAbsorb;\n if (!k) {\n parserInput.forget();\n return;\n }\n parserInput.restore();\n const color = tree.Color.fromKeyword(k);\n if (color) {\n parserInput.$str(k);\n return color;\n }\n },\n\n //\n // A Dimension, that is, a number and a unit\n //\n // 0.5em 95%\n //\n dimension: function () {\n if (parserInput.peekNotNumeric()) {\n return;\n }\n\n const value = parserInput.$re(/^([+-]?\\d*\\.?\\d+)(%|[a-z_]+)?/i);\n if (value) {\n return new(tree.Dimension)(value[1], value[2]);\n }\n },\n\n //\n // A unicode descriptor, as is used in unicode-range\n //\n // U+0?? or U+00A1-00A9\n //\n unicodeDescriptor: function () {\n let ud;\n\n ud = parserInput.$re(/^U\\+[0-9a-fA-F?]+(\\-[0-9a-fA-F?]+)?/);\n if (ud) {\n return new(tree.UnicodeDescriptor)(ud[0]);\n }\n },\n\n //\n // JavaScript code to be evaluated\n //\n // `window.location.href`\n //\n javascript: function () {\n let js;\n const index = parserInput.i;\n\n parserInput.save();\n\n const escape = parserInput.$char('~');\n const jsQuote = parserInput.$char('`');\n\n if (!jsQuote) {\n parserInput.restore();\n return;\n }\n\n js = parserInput.$re(/^[^`]*`/);\n if (js) {\n parserInput.forget();\n return new(tree.JavaScript)(js.substr(0, js.length - 1), Boolean(escape), index, fileInfo);\n }\n parserInput.restore('invalid javascript definition');\n }\n },\n\n //\n // The variable part of a variable definition. Used in the `rule` parser\n //\n // @fink:\n //\n variable: function () {\n let name;\n\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^(@[\\w-]+)\\s*:/))) { return name[1]; }\n },\n\n //\n // Call a variable value to retrieve a detached ruleset\n // or a value from a detached ruleset's rules.\n //\n // @fink();\n // @fink;\n // color: @fink[@color];\n //\n variableCall: function (parsedName) {\n let lookups;\n const i = parserInput.i;\n const inValue = !!parsedName;\n let name = parsedName;\n\n parserInput.save();\n\n if (name || (parserInput.currentChar() === '@'\n && (name = parserInput.$re(/^(@[\\w-]+)(\\(\\s*\\))?/)))) {\n\n lookups = this.mixin.ruleLookups();\n\n if (!lookups && ((inValue && parserInput.$str('()') !== '()') || (name[2] !== '()'))) {\n parserInput.restore('Missing \\'[...]\\' lookup in variable call');\n return;\n }\n\n if (!inValue) {\n name = name[1];\n }\n\n const call = new tree.VariableCall(name, i, fileInfo);\n if (!inValue && parsers.end()) {\n parserInput.forget();\n return call;\n }\n else {\n parserInput.forget();\n return new tree.NamespaceValue(call, lookups, i, fileInfo);\n }\n }\n\n parserInput.restore();\n },\n\n //\n // extend syntax - used to extend selectors\n //\n extend: function(isRule) {\n let elements;\n let e;\n const index = parserInput.i;\n let option;\n let extendList;\n let extend;\n\n if (!parserInput.$str(isRule ? '&:extend(' : ':extend(')) {\n return;\n }\n\n do {\n option = null;\n elements = null;\n while (!(option = parserInput.$re(/^(all)(?=\\s*(\\)|,))/))) {\n e = this.element();\n if (!e) {\n break;\n }\n if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n }\n\n option = option && option[1];\n if (!elements) {\n error('Missing target selector for :extend().');\n }\n extend = new(tree.Extend)(new(tree.Selector)(elements), option, index, fileInfo);\n if (extendList) {\n extendList.push(extend);\n } else {\n extendList = [ extend ];\n }\n } while (parserInput.$char(','));\n\n expect(/^\\)/);\n\n if (isRule) {\n expect(/^;/);\n }\n\n return extendList;\n },\n\n //\n // extendRule - used in a rule to extend all the parent selectors\n //\n extendRule: function() {\n return this.extend(true);\n },\n\n //\n // Mixins\n //\n mixin: {\n //\n // A Mixin call, with an optional argument list\n //\n // #mixins > .square(#fff);\n // #mixins.square(#fff);\n // .rounded(4px, black);\n // .button;\n //\n // We can lookup / return a value using the lookup syntax:\n //\n // color: #mixin.square(#fff)[@color];\n //\n // The `while` loop is there because mixins can be\n // namespaced, but we only support the child and descendant\n // selector for now.\n //\n call: function (inValue, getLookup) {\n const s = parserInput.currentChar();\n let important = false;\n let lookups;\n const index = parserInput.i;\n let elements;\n let args;\n let hasParens;\n\n if (s !== '.' && s !== '#') { return; }\n\n parserInput.save(); // stop us absorbing part of an invalid selector\n\n elements = this.elements();\n\n if (elements) {\n if (parserInput.$char('(')) {\n args = this.args(true).args;\n expectChar(')');\n hasParens = true;\n }\n\n if (getLookup !== false) {\n lookups = this.ruleLookups();\n }\n if (getLookup === true && !lookups) {\n parserInput.restore();\n return;\n }\n\n if (!lookups && !hasParens) {\n // This isn't a valid mixin call\n parserInput.restore('Unrecognized input. Possibly missing \\'(\\' in mixin call.');\n return;\n }\n\n if (!inValue && parsers.important()) {\n important = true;\n }\n\n if (inValue || parsers.end()) {\n parserInput.forget();\n const mixin = new(tree.mixin.Call)(elements, args, index, fileInfo, !lookups && important);\n if (lookups) {\n return new tree.NamespaceValue(mixin, lookups);\n }\n else {\n return mixin;\n }\n }\n }\n\n parserInput.restore();\n },\n /**\n * Matching elements for mixins\n * (Start with . or # and can have > )\n */\n elements: function() {\n let elements;\n let e;\n let c;\n let elem;\n let elemIndex;\n const re = /^[#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/;\n while (true) {\n elemIndex = parserInput.i;\n e = parserInput.$re(re);\n \n if (!e) {\n break;\n }\n elem = new(tree.Element)(c, e, false, elemIndex, fileInfo);\n if (elements) {\n elements.push(elem);\n } else {\n elements = [ elem ];\n }\n c = parserInput.$char('>');\n }\n return elements;\n },\n args: function (isCall) {\n const entities = parsers.entities;\n const returner = { args:null, variadic: false };\n let expressions = [];\n const argsSemiColon = [];\n const argsComma = [];\n let isSemiColonSeparated;\n let expressionContainsNamed;\n let name;\n let nameLoop;\n let value;\n let arg;\n let expand;\n let hasSep = true;\n\n parserInput.save();\n\n while (true) {\n if (isCall) {\n arg = parsers.detachedRuleset() || parsers.expression();\n } else {\n parserInput.commentStore.length = 0;\n if (parserInput.$str('...')) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ variadic: true });\n break;\n }\n arg = entities.variable() || entities.property() || entities.literal() || entities.keyword() || this.call(true);\n }\n\n if (!arg || !hasSep) {\n break;\n }\n\n nameLoop = null;\n if (arg.throwAwayComments) {\n arg.throwAwayComments();\n }\n value = arg;\n let val = null;\n\n if (isCall) {\n // Variable\n if (arg.value && arg.value.length == 1) {\n val = arg.value[0];\n }\n } else {\n val = arg;\n }\n\n if (val && (val instanceof tree.Variable || val instanceof tree.Property)) {\n if (parserInput.$char(':')) {\n if (expressions.length > 0) {\n if (isSemiColonSeparated) {\n error('Cannot mix ; and , as delimiter types');\n }\n expressionContainsNamed = true;\n }\n\n value = parsers.detachedRuleset() || parsers.expression();\n\n if (!value) {\n if (isCall) {\n error('could not understand value for named argument');\n } else {\n parserInput.restore();\n returner.args = [];\n return returner;\n }\n }\n nameLoop = (name = val.name);\n } else if (parserInput.$str('...')) {\n if (!isCall) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ name: arg.name, variadic: true });\n break;\n } else {\n expand = true;\n }\n } else if (!isCall) {\n name = nameLoop = val.name;\n value = null;\n }\n }\n\n if (value) {\n expressions.push(value);\n }\n\n argsComma.push({ name:nameLoop, value, expand });\n\n if (parserInput.$char(',')) {\n hasSep = true;\n continue;\n }\n hasSep = parserInput.$char(';') === ';';\n\n if (hasSep || isSemiColonSeparated) {\n\n if (expressionContainsNamed) {\n error('Cannot mix ; and , as delimiter types');\n }\n\n isSemiColonSeparated = true;\n\n if (expressions.length > 1) {\n value = new(tree.Value)(expressions);\n }\n argsSemiColon.push({ name, value, expand });\n\n name = null;\n expressions = [];\n expressionContainsNamed = false;\n }\n }\n\n parserInput.forget();\n returner.args = isSemiColonSeparated ? argsSemiColon : argsComma;\n return returner;\n },\n //\n // A Mixin definition, with a list of parameters\n //\n // .rounded (@radius: 2px, @color) {\n // ...\n // }\n //\n // Until we have a finer grained state-machine, we have to\n // do a look-ahead, to make sure we don't have a mixin call.\n // See the `rule` function for more information.\n //\n // We start by matching `.rounded (`, and then proceed on to\n // the argument list, which has optional default values.\n // We store the parameters in `params`, with a `value` key,\n // if there is a value, such as in the case of `@radius`.\n //\n // Once we've got our params list, and a closing `)`, we parse\n // the `{...}` block.\n //\n definition: function () {\n let name;\n let params = [];\n let match;\n let ruleset;\n let cond;\n let variadic = false;\n if ((parserInput.currentChar() !== '.' && parserInput.currentChar() !== '#') ||\n parserInput.peek(/^[^{]*\\}/)) {\n return;\n }\n\n parserInput.save();\n\n match = parserInput.$re(/^([#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\\s*\\(/);\n if (match) {\n name = match[1];\n\n const argInfo = this.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n\n // .mixincall(\"@{a}\");\n // looks a bit like a mixin definition..\n // also\n // .mixincall(@a: {rule: set;});\n // so we have to be nice and restore\n if (!parserInput.$char(')')) {\n parserInput.restore('Missing closing \\')\\'');\n return;\n }\n\n parserInput.commentStore.length = 0;\n\n if (parserInput.$str('when')) { // Guard\n cond = expect(parsers.conditions, 'expected condition');\n }\n\n ruleset = parsers.block();\n\n if (ruleset) {\n parserInput.forget();\n return new(tree.mixin.Definition)(name, params, ruleset, cond, variadic);\n } else {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n }\n },\n \n ruleLookups: function() {\n let rule;\n let args;\n const lookups = [];\n\n if (parserInput.currentChar() !== '[') { \n return;\n }\n\n while (true) {\n parserInput.save();\n args = null;\n rule = this.lookupValue();\n if (!rule && rule !== '') {\n parserInput.restore();\n break;\n }\n lookups.push(rule);\n parserInput.forget();\n }\n if (lookups.length > 0) {\n return lookups;\n }\n },\n \n lookupValue: function() {\n parserInput.save();\n \n if (!parserInput.$char('[')) { \n parserInput.restore();\n return;\n }\n \n const name = parserInput.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);\n \n if (!parserInput.$char(']')) {\n parserInput.restore();\n return;\n } \n\n if (name || name === '') {\n parserInput.forget();\n return name;\n }\n \n parserInput.restore();\n }\n },\n //\n // Entities are the smallest recognized token,\n // and can be found inside a rule's value.\n //\n entity: function () {\n const entities = this.entities;\n\n return this.comment() || entities.literal() || entities.variable() || entities.url() ||\n entities.property() || entities.call() || entities.keyword() || this.mixin.call(true) ||\n entities.javascript();\n },\n\n //\n // A Declaration terminator. Note that we use `peek()` to check for '}',\n // because the `block` rule will be expecting it, but we still need to make sure\n // it's there, if ';' was omitted.\n //\n end: function () {\n return parserInput.$char(';') || parserInput.peek('}');\n },\n\n //\n // IE's alpha function\n //\n // alpha(opacity=88)\n //\n ieAlpha: function () {\n let value;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (!parserInput.$re(/^opacity=/i)) { return; }\n value = parserInput.$re(/^\\d+/);\n if (!value) {\n value = expect(parsers.entities.variable, 'Could not parse alpha');\n value = `@{${value.name.slice(1)}}`;\n }\n expectChar(')');\n return new tree.Quoted('', `alpha(opacity=${value})`);\n },\n\n //\n // A Selector Element\n //\n // div\n // + h1\n // #socks\n // input[type=\"text\"]\n //\n // Elements are the building blocks for Selectors,\n // they are made out of a `Combinator` (see combinator rule),\n // and an element name, such as a tag a class, or `*`.\n //\n element: function () {\n let e;\n let c;\n let v;\n const index = parserInput.i;\n\n c = this.combinator();\n\n e = parserInput.$re(/^(?:\\d+\\.\\d+|\\d+)%/) ||\n parserInput.$re(/^(?:[.#]?|:*)(?:[\\w-]|[^\\x00-\\x9f]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/) ||\n parserInput.$char('*') || parserInput.$char('&') || this.attribute() ||\n parserInput.$re(/^\\([^&()@]+\\)/) || parserInput.$re(/^[\\.#:](?=@)/) ||\n this.entities.variableCurly();\n\n if (!e) {\n parserInput.save();\n if (parserInput.$char('(')) {\n if ((v = this.selector(false)) && parserInput.$char(')')) {\n e = new(tree.Paren)(v);\n parserInput.forget();\n } else {\n parserInput.restore('Missing closing \\')\\'');\n }\n } else {\n parserInput.forget();\n }\n }\n\n if (e) { return new(tree.Element)(c, e, e instanceof tree.Variable, index, fileInfo); }\n },\n\n //\n // Combinators combine elements together, in a Selector.\n //\n // Because our parser isn't white-space sensitive, special care\n // has to be taken, when parsing the descendant combinator, ` `,\n // as it's an empty space. We have to check the previous character\n // in the input, to see if it's a ` ` character. More info on how\n // we deal with this in *combinator.js*.\n //\n combinator: function () {\n let c = parserInput.currentChar();\n\n if (c === '/') {\n parserInput.save();\n const slashedCombinator = parserInput.$re(/^\\/[a-z]+\\//i);\n if (slashedCombinator) {\n parserInput.forget();\n return new(tree.Combinator)(slashedCombinator);\n }\n parserInput.restore();\n }\n\n if (c === '>' || c === '+' || c === '~' || c === '|' || c === '^') {\n parserInput.i++;\n if (c === '^' && parserInput.currentChar() === '^') {\n c = '^^';\n parserInput.i++;\n }\n while (parserInput.isWhitespace()) { parserInput.i++; }\n return new(tree.Combinator)(c);\n } else if (parserInput.isWhitespace(-1)) {\n return new(tree.Combinator)(' ');\n } else {\n return new(tree.Combinator)(null);\n }\n },\n //\n // A CSS Selector\n // with less extensions e.g. the ability to extend and guard\n //\n // .class > div + h1\n // li a:hover\n //\n // Selectors are made out of one or more Elements, see above.\n //\n selector: function (isLess) {\n const index = parserInput.i;\n let elements;\n let extendList;\n let c;\n let e;\n let allExtends;\n let when;\n let condition;\n isLess = isLess !== false;\n while ((isLess && (extendList = this.extend())) || (isLess && (when = parserInput.$str('when'))) || (e = this.element())) {\n if (when) {\n condition = expect(this.conditions, 'expected condition');\n } else if (condition) {\n error('CSS guard can only be used at the end of selector');\n } else if (extendList) {\n if (allExtends) {\n allExtends = allExtends.concat(extendList);\n } else {\n allExtends = extendList;\n }\n } else {\n if (allExtends) { error('Extend can only be used at the end of selector'); }\n c = parserInput.currentChar();\n if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n e = null;\n }\n if (c === '{' || c === '}' || c === ';' || c === ',' || c === ')') {\n break;\n }\n }\n\n if (elements) { return new(tree.Selector)(elements, allExtends, condition, index, fileInfo); }\n if (allExtends) { error('Extend must be used to extend a selector, it cannot be used on its own'); }\n },\n selectors: function () {\n let s;\n let selectors;\n while (true) {\n s = this.selector();\n if (!s) {\n break;\n }\n if (selectors) {\n selectors.push(s);\n } else {\n selectors = [ s ];\n }\n parserInput.commentStore.length = 0;\n if (s.condition && selectors.length > 1) {\n error(\"Guards are only currently allowed on a single selector.\");\n }\n if (!parserInput.$char(',')) { break; }\n if (s.condition) {\n error(\"Guards are only currently allowed on a single selector.\");\n }\n parserInput.commentStore.length = 0;\n }\n return selectors;\n },\n attribute: function () {\n if (!parserInput.$char('[')) { return; }\n\n const entities = this.entities;\n let key;\n let val;\n let op;\n\n if (!(key = entities.variableCurly())) {\n key = expect(/^(?:[_A-Za-z0-9-\\*]*\\|)?(?:[_A-Za-z0-9-]|\\\\.)+/);\n }\n\n op = parserInput.$re(/^[|~*$^]?=/);\n if (op) {\n val = entities.quoted() || parserInput.$re(/^[0-9]+%/) || parserInput.$re(/^[\\w-]+/) || entities.variableCurly();\n }\n\n expectChar(']');\n\n return new(tree.Attribute)(key, op, val);\n },\n\n //\n // The `block` rule is used by `ruleset` and `mixin.definition`.\n // It's a wrapper around the `primary` rule, with added `{}`.\n //\n block: function () {\n let content;\n if (parserInput.$char('{') && (content = this.primary()) && parserInput.$char('}')) {\n return content;\n }\n },\n\n blockRuleset: function() {\n let block = this.block();\n\n if (block) {\n block = new tree.Ruleset(null, block);\n }\n return block;\n },\n\n detachedRuleset: function() {\n let argInfo;\n let params;\n let variadic;\n\n parserInput.save();\n if (parserInput.$re(/^[.#]\\(/)) {\n /**\n * DR args currently only implemented for each() function, and not \n * yet settable as `@dr: #(@arg) {}`\n * This should be done when DRs are merged with mixins.\n * See: https://github.com/less/less-meta/issues/16\n */\n argInfo = this.mixin.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n if (!parserInput.$char(')')) {\n parserInput.restore();\n return;\n }\n }\n const blockRuleset = this.blockRuleset();\n if (blockRuleset) {\n parserInput.forget();\n if (params) {\n return new tree.mixin.Definition(null, params, blockRuleset, null, variadic);\n }\n return new tree.DetachedRuleset(blockRuleset);\n }\n parserInput.restore();\n },\n\n //\n // div, .class, body > p {...}\n //\n ruleset: function () {\n let selectors;\n let rules;\n let debugInfo;\n\n parserInput.save();\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(parserInput.i);\n }\n\n selectors = this.selectors();\n\n if (selectors && (rules = this.block())) {\n parserInput.forget();\n const ruleset = new(tree.Ruleset)(selectors, rules, context.strictImports);\n if (context.dumpLineNumbers) {\n ruleset.debugInfo = debugInfo;\n }\n return ruleset;\n } else {\n parserInput.restore();\n }\n },\n declaration: function () {\n let name;\n let value;\n const index = parserInput.i;\n let hasDR;\n const c = parserInput.currentChar();\n let important;\n let merge;\n let isVariable;\n\n if (c === '.' || c === '#' || c === '&' || c === ':') { return; }\n\n parserInput.save();\n\n name = this.variable() || this.ruleProperty();\n if (name) {\n isVariable = typeof name === 'string';\n\n if (isVariable) {\n value = this.detachedRuleset();\n if (value) {\n hasDR = true;\n }\n }\n\n parserInput.commentStore.length = 0;\n if (!value) {\n // a name returned by this.ruleProperty() is always an array of the form:\n // [string-1, ..., string-n, \"\"] or [string-1, ..., string-n, \"+\"]\n // where each item is a tree.Keyword or tree.Variable\n merge = !isVariable && name.length > 1 && name.pop().value;\n\n // Custom property values get permissive parsing\n if (name[0].value && name[0].value.slice(0, 2) === '--') {\n value = this.permissiveValue();\n }\n // Try to store values as anonymous\n // If we need the value later we'll re-parse it in ruleset.parseValue\n else {\n value = this.anonymousValue();\n }\n if (value) {\n parserInput.forget();\n // anonymous values absorb the end ';' which is required for them to work\n return new(tree.Declaration)(name, value, false, merge, index, fileInfo);\n }\n\n if (!value) {\n value = this.value();\n }\n\n if (value) {\n important = this.important();\n } else if (isVariable) {\n // As a last resort, try permissiveValue\n value = this.permissiveValue();\n }\n }\n\n if (value && (this.end() || hasDR)) {\n parserInput.forget();\n return new(tree.Declaration)(name, value, important, merge, index, fileInfo);\n }\n else {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n }\n },\n anonymousValue: function () {\n const index = parserInput.i;\n const match = parserInput.$re(/^([^.#@\\$+\\/'\"*`(;{}-]*);/);\n if (match) {\n return new(tree.Anonymous)(match[1], index);\n }\n },\n /**\n * Used for custom properties, at-rules, and variables (as fallback)\n * Parses almost anything inside of {} [] () \"\" blocks\n * until it reaches outer-most tokens.\n * \n * First, it will try to parse comments and entities to reach\n * the end. This is mostly like the Expression parser except no\n * math is allowed.\n */\n permissiveValue: function (untilTokens) {\n let i;\n let e;\n let done;\n let value;\n const tok = untilTokens || ';';\n const index = parserInput.i;\n const result = [];\n\n function testCurrentChar() {\n const char = parserInput.currentChar();\n if (typeof tok === 'string') {\n return char === tok;\n } else {\n return tok.test(char);\n }\n }\n if (testCurrentChar()) {\n return;\n }\n value = [];\n do {\n e = this.comment();\n if (e) {\n value.push(e);\n continue;\n }\n e = this.entity();\n if (e) {\n value.push(e);\n }\n } while (e);\n\n done = testCurrentChar();\n\n if (value.length > 0) {\n value = new(tree.Expression)(value);\n if (done) {\n return value;\n }\n else {\n result.push(value);\n }\n // Preserve space before $parseUntil as it will not\n if (parserInput.prevChar() === ' ') {\n result.push(new tree.Anonymous(' ', index));\n }\n }\n parserInput.save();\n\n value = parserInput.$parseUntil(tok);\n\n if (value) {\n if (typeof value === 'string') {\n error(`Expected '${value}'`, 'Parse');\n }\n if (value.length === 1 && value[0] === ' ') {\n parserInput.forget();\n return new tree.Anonymous('', index);\n }\n let item;\n for (i = 0; i < value.length; i++) {\n item = value[i];\n if (Array.isArray(item)) {\n // Treat actual quotes as normal quoted values\n result.push(new tree.Quoted(item[0], item[1], true, index, fileInfo));\n }\n else {\n if (i === value.length - 1) {\n item = item.trim();\n }\n // Treat like quoted values, but replace vars like unquoted expressions\n const quote = new tree.Quoted('\\'', item, true, index, fileInfo);\n quote.variableRegex = /@([\\w-]+)/g;\n quote.propRegex = /\\$([\\w-]+)/g;\n result.push(quote);\n }\n }\n parserInput.forget();\n return new tree.Expression(result, true);\n }\n parserInput.restore();\n },\n\n //\n // An @import atrule\n //\n // @import \"lib\";\n //\n // Depending on our environment, importing is done differently:\n // In the browser, it's an XHR request, in Node, it would be a\n // file-system operation. The function used for importing is\n // stored in `import`, which we pass to the Import constructor.\n //\n 'import': function () {\n let path;\n let features;\n const index = parserInput.i;\n\n const dir = parserInput.$re(/^@import?\\s+/);\n\n if (dir) {\n const options = (dir ? this.importOptions() : null) || {};\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n features = this.mediaFeatures();\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon or unrecognised media features on import');\n }\n features = features && new(tree.Value)(features);\n return new(tree.Import)(path, features, options, index, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed import statement');\n }\n }\n },\n\n importOptions: function() {\n let o;\n const options = {};\n let optionName;\n let value;\n\n // list of options, surrounded by parens\n if (!parserInput.$char('(')) { return null; }\n do {\n o = this.importOption();\n if (o) {\n optionName = o;\n value = true;\n switch (optionName) {\n case 'css':\n optionName = 'less';\n value = false;\n break;\n case 'once':\n optionName = 'multiple';\n value = false;\n break;\n }\n options[optionName] = value;\n if (!parserInput.$char(',')) { break; }\n }\n } while (o);\n expectChar(')');\n return options;\n },\n\n importOption: function() {\n const opt = parserInput.$re(/^(less|css|multiple|once|inline|reference|optional)/);\n if (opt) {\n return opt[1];\n }\n },\n\n mediaFeature: function () {\n const entities = this.entities;\n const nodes = [];\n let e;\n let p;\n parserInput.save();\n do {\n e = entities.keyword() || entities.variable() || entities.mixinLookup();\n if (e) {\n nodes.push(e);\n } else if (parserInput.$char('(')) {\n p = this.property();\n e = this.value();\n if (parserInput.$char(')')) {\n if (p && e) {\n nodes.push(new(tree.Paren)(new(tree.Declaration)(p, e, null, null, parserInput.i, fileInfo, true)));\n } else if (e) {\n nodes.push(new(tree.Paren)(e));\n } else {\n error('badly formed media feature definition');\n }\n } else {\n error('Missing closing \\')\\'', 'Parse');\n }\n }\n } while (e);\n\n parserInput.forget();\n if (nodes.length > 0) {\n return new(tree.Expression)(nodes);\n }\n },\n\n mediaFeatures: function () {\n const entities = this.entities;\n const features = [];\n let e;\n do {\n e = this.mediaFeature();\n if (e) {\n features.push(e);\n if (!parserInput.$char(',')) { break; }\n } else {\n e = entities.variable() || entities.mixinLookup();\n if (e) {\n features.push(e);\n if (!parserInput.$char(',')) { break; }\n }\n }\n } while (e);\n\n return features.length > 0 ? features : null;\n },\n\n media: function () {\n let features;\n let rules;\n let media;\n let debugInfo;\n const index = parserInput.i;\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(index);\n }\n\n parserInput.save();\n\n if (parserInput.$str('@media')) {\n features = this.mediaFeatures();\n\n rules = this.block();\n\n if (!rules) {\n error('media definitions require block statements after any features');\n }\n\n parserInput.forget();\n\n media = new(tree.Media)(rules, features, index, fileInfo);\n if (context.dumpLineNumbers) {\n media.debugInfo = debugInfo;\n }\n\n return media;\n }\n\n parserInput.restore();\n },\n\n //\n\n // A @plugin directive, used to import plugins dynamically.\n //\n // @plugin (args) \"lib\";\n //\n plugin: function () {\n let path;\n let args;\n let options;\n const index = parserInput.i;\n const dir = parserInput.$re(/^@plugin?\\s+/);\n\n if (dir) {\n args = this.pluginArgs();\n\n if (args) {\n options = {\n pluginArgs: args,\n isPlugin: true\n };\n }\n else {\n options = { isPlugin: true };\n }\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon on @plugin');\n }\n return new(tree.Import)(path, null, options, index, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed @plugin statement');\n }\n }\n },\n\n pluginArgs: function() {\n // list of options, surrounded by parens\n parserInput.save();\n if (!parserInput.$char('(')) {\n parserInput.restore();\n return null;\n }\n const args = parserInput.$re(/^\\s*([^\\);]+)\\)\\s*/);\n if (args[1]) {\n parserInput.forget();\n return args[1].trim();\n }\n else { \n parserInput.restore();\n return null;\n }\n },\n\n //\n // A CSS AtRule\n //\n // @charset \"utf-8\";\n //\n atrule: function () {\n const index = parserInput.i;\n let name;\n let value;\n let rules;\n let nonVendorSpecificName;\n let hasIdentifier;\n let hasExpression;\n let hasUnknown;\n let hasBlock = true;\n let isRooted = true;\n\n if (parserInput.currentChar() !== '@') { return; }\n\n value = this['import']() || this.plugin() || this.media();\n if (value) {\n return value;\n }\n\n parserInput.save();\n\n name = parserInput.$re(/^@[a-z-]+/);\n\n if (!name) { return; }\n\n nonVendorSpecificName = name;\n if (name.charAt(1) == '-' && name.indexOf('-', 2) > 0) {\n nonVendorSpecificName = `@${name.slice(name.indexOf('-', 2) + 1)}`;\n }\n\n switch (nonVendorSpecificName) {\n case '@charset':\n hasIdentifier = true;\n hasBlock = false;\n break;\n case '@namespace':\n hasExpression = true;\n hasBlock = false;\n break;\n case '@keyframes':\n case '@counter-style':\n hasIdentifier = true;\n break;\n case '@document':\n case '@supports':\n hasUnknown = true;\n isRooted = false;\n break;\n default:\n hasUnknown = true;\n break;\n }\n\n parserInput.commentStore.length = 0;\n\n if (hasIdentifier) {\n value = this.entity();\n if (!value) {\n error(`expected ${name} identifier`);\n }\n } else if (hasExpression) {\n value = this.expression();\n if (!value) {\n error(`expected ${name} expression`);\n }\n } else if (hasUnknown) {\n value = this.permissiveValue(/^[{;]/);\n hasBlock = (parserInput.currentChar() === '{');\n if (!value) {\n if (!hasBlock && parserInput.currentChar() !== ';') {\n error(`${name} rule is missing block or ending semi-colon`);\n }\n }\n else if (!value.value) {\n value = null;\n }\n }\n\n if (hasBlock) {\n rules = this.blockRuleset();\n }\n\n if (rules || (!hasBlock && value && parserInput.$char(';'))) {\n parserInput.forget();\n return new(tree.AtRule)(name, value, rules, index, fileInfo,\n context.dumpLineNumbers ? getDebugInfo(index) : null,\n isRooted\n );\n }\n\n parserInput.restore('at-rule options not recognised');\n },\n\n //\n // A Value is a comma-delimited list of Expressions\n //\n // font-family: Baskerville, Georgia, serif;\n //\n // In a Rule, a Value represents everything after the `:`,\n // and before the `;`.\n //\n value: function () {\n let e;\n const expressions = [];\n const index = parserInput.i;\n\n do {\n e = this.expression();\n if (e) {\n expressions.push(e);\n if (!parserInput.$char(',')) { break; }\n }\n } while (e);\n\n if (expressions.length > 0) {\n return new(tree.Value)(expressions, index);\n }\n },\n important: function () {\n if (parserInput.currentChar() === '!') {\n return parserInput.$re(/^! *important/);\n }\n },\n sub: function () {\n let a;\n let e;\n\n parserInput.save();\n if (parserInput.$char('(')) {\n a = this.addition();\n if (a && parserInput.$char(')')) {\n parserInput.forget();\n e = new(tree.Expression)([a]);\n e.parens = true;\n return e;\n }\n parserInput.restore('Expected \\')\\'');\n return;\n }\n parserInput.restore();\n },\n multiplication: function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.operand();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1);\n while (true) {\n if (parserInput.peek(/^\\/[*\\/]/)) {\n break;\n }\n\n parserInput.save();\n\n op = parserInput.$char('/') || parserInput.$char('*') || parserInput.$str('./');\n\n if (!op) { parserInput.forget(); break; }\n\n a = this.operand();\n\n if (!a) { parserInput.restore(); break; }\n parserInput.forget();\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n isSpaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n addition: function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.multiplication();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1);\n while (true) {\n op = parserInput.$re(/^[-+]\\s+/) || (!isSpaced && (parserInput.$char('+') || parserInput.$char('-')));\n if (!op) {\n break;\n }\n a = this.multiplication();\n if (!a) {\n break;\n }\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n isSpaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n conditions: function () {\n let a;\n let b;\n const index = parserInput.i;\n let condition;\n\n a = this.condition(true);\n if (a) {\n while (true) {\n if (!parserInput.peek(/^,\\s*(not\\s*)?\\(/) || !parserInput.$char(',')) {\n break;\n }\n b = this.condition(true);\n if (!b) {\n break;\n }\n condition = new(tree.Condition)('or', condition || a, b, index);\n }\n return condition || a;\n }\n },\n condition: function (needsParens) {\n let result;\n let logical;\n let next;\n function or() {\n return parserInput.$str('or');\n }\n\n result = this.conditionAnd(needsParens);\n if (!result) {\n return ;\n }\n logical = or();\n if (logical) {\n next = this.condition(needsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n }\n }\n return result;\n },\n conditionAnd: function (needsParens) {\n let result;\n let logical;\n let next;\n const self = this;\n function insideCondition() {\n const cond = self.negatedCondition(needsParens) || self.parenthesisCondition(needsParens);\n if (!cond && !needsParens) {\n return self.atomicCondition(needsParens);\n }\n return cond;\n }\n function and() {\n return parserInput.$str('and');\n }\n\n result = insideCondition();\n if (!result) {\n return ;\n }\n logical = and();\n if (logical) {\n next = this.conditionAnd(needsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n }\n }\n return result;\n },\n negatedCondition: function (needsParens) {\n if (parserInput.$str('not')) {\n const result = this.parenthesisCondition(needsParens);\n if (result) {\n result.negate = !result.negate;\n }\n return result;\n }\n },\n parenthesisCondition: function (needsParens) {\n function tryConditionFollowedByParenthesis(me) {\n let body;\n parserInput.save();\n body = me.condition(needsParens);\n if (!body) {\n parserInput.restore();\n return ;\n }\n if (!parserInput.$char(')')) {\n parserInput.restore();\n return ;\n }\n parserInput.forget();\n return body;\n }\n\n let body;\n parserInput.save();\n if (!parserInput.$str('(')) {\n parserInput.restore();\n return ;\n }\n body = tryConditionFollowedByParenthesis(this);\n if (body) {\n parserInput.forget();\n return body;\n }\n\n body = this.atomicCondition(needsParens);\n if (!body) {\n parserInput.restore();\n return ;\n }\n if (!parserInput.$char(')')) {\n parserInput.restore(`expected ')' got '${parserInput.currentChar()}'`);\n return ;\n }\n parserInput.forget();\n return body;\n },\n atomicCondition: function (needsParens) {\n const entities = this.entities;\n const index = parserInput.i;\n let a;\n let b;\n let c;\n let op;\n\n function cond() {\n return this.addition() || entities.keyword() || entities.quoted() || entities.mixinLookup();\n }\n cond = cond.bind(this);\n\n a = cond();\n if (a) {\n if (parserInput.$char('>')) {\n if (parserInput.$char('=')) {\n op = '>=';\n } else {\n op = '>';\n }\n } else\n if (parserInput.$char('<')) {\n if (parserInput.$char('=')) {\n op = '<=';\n } else {\n op = '<';\n }\n } else\n if (parserInput.$char('=')) {\n if (parserInput.$char('>')) {\n op = '=>';\n } else if (parserInput.$char('<')) {\n op = '=<';\n } else {\n op = '=';\n }\n }\n if (op) {\n b = cond();\n if (b) {\n c = new(tree.Condition)(op, a, b, index, false);\n } else {\n error('expected expression');\n }\n } else {\n c = new(tree.Condition)('=', a, new(tree.Keyword)('true'), index, false);\n }\n return c;\n }\n },\n\n //\n // An operand is anything that can be part of an operation,\n // such as a Color, or a Variable\n //\n operand: function () {\n const entities = this.entities;\n let negate;\n\n if (parserInput.peek(/^-[@\\$\\(]/)) {\n negate = parserInput.$char('-');\n }\n\n let o = this.sub() || entities.dimension() ||\n entities.color() || entities.variable() ||\n entities.property() || entities.call() ||\n entities.quoted(true) || entities.colorKeyword() ||\n entities.mixinLookup();\n\n if (negate) {\n o.parensInOp = true;\n o = new(tree.Negative)(o);\n }\n\n return o;\n },\n\n //\n // Expressions either represent mathematical operations,\n // or white-space delimited Entities.\n //\n // 1px solid black\n // @var * 2\n //\n expression: function () {\n const entities = [];\n let e;\n let delim;\n const index = parserInput.i;\n\n do {\n e = this.comment();\n if (e) {\n entities.push(e);\n continue;\n }\n e = this.addition() || this.entity();\n\n if (e instanceof tree.Comment) {\n e = null;\n }\n\n if (e) {\n entities.push(e);\n // operations do not allow keyword \"/\" dimension (e.g. small/20px) so we support that here\n if (!parserInput.peek(/^\\/[\\/*]/)) {\n delim = parserInput.$char('/');\n if (delim) {\n entities.push(new(tree.Anonymous)(delim, index));\n }\n }\n }\n } while (e);\n if (entities.length > 0) {\n return new(tree.Expression)(entities);\n }\n },\n property: function () {\n const name = parserInput.$re(/^(\\*?-?[_a-zA-Z0-9-]+)\\s*:/);\n if (name) {\n return name[1];\n }\n },\n ruleProperty: function () {\n let name = [];\n const index = [];\n let s;\n let k;\n\n parserInput.save();\n\n const simpleProperty = parserInput.$re(/^([_a-zA-Z0-9-]+)\\s*:/);\n if (simpleProperty) {\n name = [new(tree.Keyword)(simpleProperty[1])];\n parserInput.forget();\n return name;\n }\n\n function match(re) {\n const i = parserInput.i;\n const chunk = parserInput.$re(re);\n if (chunk) {\n index.push(i);\n return name.push(chunk[1]);\n }\n }\n\n match(/^(\\*?)/);\n while (true) {\n if (!match(/^((?:[\\w-]+)|(?:[@\\$]\\{[\\w-]+\\}))/)) {\n break;\n }\n }\n\n if ((name.length > 1) && match(/^((?:\\+_|\\+)?)\\s*:/)) {\n parserInput.forget();\n\n // at last, we have the complete match now. move forward,\n // convert name particles to tree objects and return:\n if (name[0] === '') {\n name.shift();\n index.shift();\n }\n for (k = 0; k < name.length; k++) {\n s = name[k];\n name[k] = (s.charAt(0) !== '@' && s.charAt(0) !== '$') ?\n new(tree.Keyword)(s) :\n (s.charAt(0) === '@' ?\n new(tree.Variable)(`@${s.slice(2, -1)}`, index[k], fileInfo) :\n new(tree.Property)(`$${s.slice(2, -1)}`, index[k], fileInfo));\n }\n return name;\n }\n parserInput.restore();\n }\n }\n };\n};\nParser.serializeVars = vars => {\n let s = '';\n\n for (const name in vars) {\n if (Object.hasOwnProperty.call(vars, name)) {\n const value = vars[name];\n s += `${((name[0] === '@') ? '' : '@') + name}: ${value}${(String(value).slice(-1) === ';') ? '' : ';'}`;\n }\n }\n\n return s;\n};\n\nexport default Parser;\n","import Anonymous from '../tree/anonymous';\nimport Keyword from '../tree/keyword';\n\nfunction boolean(condition) {\n return condition ? Keyword.True : Keyword.False;\n}\n\n/**\n * Functions with evalArgs set to false are sent context\n * as the first argument.\n */\nfunction If(context, condition, trueValue, falseValue) {\n return condition.eval(context) ? trueValue.eval(context)\n : (falseValue ? falseValue.eval(context) : new Anonymous);\n}\nIf.evalArgs = false\n\nexport default { boolean, 'if': If };\n","import Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport Expression from '../tree/expression';\nimport Operation from '../tree/operation';\nlet colorFunctions;\n\nfunction clamp(val) {\n return Math.min(1, Math.max(0, val));\n}\nfunction hsla(origColor, hsl) {\n const color = colorFunctions.hsla(hsl.h, hsl.s, hsl.l, hsl.a);\n if (color) {\n if (origColor.value && \n /^(rgb|hsl)/.test(origColor.value)) {\n color.value = origColor.value;\n } else {\n color.value = 'rgb';\n }\n return color;\n }\n}\nfunction toHSL(color) {\n if (color.toHSL) {\n return color.toHSL();\n } else {\n throw new Error('Argument cannot be evaluated to a color');\n }\n}\n\nfunction toHSV(color) {\n if (color.toHSV) {\n return color.toHSV();\n } else {\n throw new Error('Argument cannot be evaluated to a color');\n }\n}\n\nfunction number(n) {\n if (n instanceof Dimension) {\n return parseFloat(n.unit.is('%') ? n.value / 100 : n.value);\n } else if (typeof n === 'number') {\n return n;\n } else {\n throw {\n type: 'Argument',\n message: 'color functions take numbers as parameters'\n };\n }\n}\nfunction scaled(n, size) {\n if (n instanceof Dimension && n.unit.is('%')) {\n return parseFloat(n.value * size / 100);\n } else {\n return number(n);\n }\n}\ncolorFunctions = {\n rgb: function (r, g, b) {\n let a = 1\n /**\n * Comma-less syntax\n * e.g. rgb(0 128 255 / 50%)\n */\n if (r instanceof Expression) {\n const val = r.value\n r = val[0]\n g = val[1]\n b = val[2]\n /** \n * @todo - should this be normalized in\n * function caller? Or parsed differently?\n */\n if (b instanceof Operation) {\n const op = b\n b = op.operands[0]\n a = op.operands[1]\n }\n }\n const color = colorFunctions.rgba(r, g, b, a);\n if (color) {\n color.value = 'rgb';\n return color;\n }\n },\n rgba: function (r, g, b, a) {\n try {\n if (r instanceof Color) {\n if (g) {\n a = number(g);\n } else {\n a = r.alpha;\n }\n return new Color(r.rgb, a, 'rgba');\n }\n const rgb = [r, g, b].map(c => scaled(c, 255));\n a = number(a);\n return new Color(rgb, a, 'rgba');\n }\n catch (e) {}\n },\n hsl: function (h, s, l) {\n let a = 1\n if (h instanceof Expression) {\n const val = h.value\n h = val[0]\n s = val[1]\n l = val[2]\n\n if (l instanceof Operation) {\n const op = l\n l = op.operands[0]\n a = op.operands[1]\n }\n }\n const color = colorFunctions.hsla(h, s, l, a);\n if (color) {\n color.value = 'hsl';\n return color;\n }\n },\n hsla: function (h, s, l, a) {\n try {\n if (h instanceof Color) {\n if (s) {\n a = number(s);\n } else {\n a = h.alpha;\n }\n return new Color(h.rgb, a, 'hsla');\n }\n\n let m1;\n let m2;\n\n function hue(h) {\n h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h);\n if (h * 6 < 1) {\n return m1 + (m2 - m1) * h * 6;\n }\n else if (h * 2 < 1) {\n return m2;\n }\n else if (h * 3 < 2) {\n return m1 + (m2 - m1) * (2 / 3 - h) * 6;\n }\n else {\n return m1;\n }\n }\n\n h = (number(h) % 360) / 360;\n s = clamp(number(s));l = clamp(number(l));a = clamp(number(a));\n\n m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n m1 = l * 2 - m2;\n\n const rgb = [\n hue(h + 1 / 3) * 255,\n hue(h) * 255,\n hue(h - 1 / 3) * 255\n ];\n a = number(a);\n return new Color(rgb, a, 'hsla');\n }\n catch (e) {}\n },\n\n hsv: function(h, s, v) {\n return colorFunctions.hsva(h, s, v, 1.0);\n },\n\n hsva: function(h, s, v, a) {\n h = ((number(h) % 360) / 360) * 360;\n s = number(s);v = number(v);a = number(a);\n\n let i;\n let f;\n i = Math.floor((h / 60) % 6);\n f = (h / 60) - i;\n\n const vs = [v,\n v * (1 - s),\n v * (1 - f * s),\n v * (1 - (1 - f) * s)];\n const perm = [[0, 3, 1],\n [2, 0, 1],\n [1, 0, 3],\n [1, 2, 0],\n [3, 1, 0],\n [0, 1, 2]];\n\n return colorFunctions.rgba(vs[perm[i][0]] * 255,\n vs[perm[i][1]] * 255,\n vs[perm[i][2]] * 255,\n a);\n },\n\n hue: function (color) {\n return new Dimension(toHSL(color).h);\n },\n saturation: function (color) {\n return new Dimension(toHSL(color).s * 100, '%');\n },\n lightness: function (color) {\n return new Dimension(toHSL(color).l * 100, '%');\n },\n hsvhue: function(color) {\n return new Dimension(toHSV(color).h);\n },\n hsvsaturation: function (color) {\n return new Dimension(toHSV(color).s * 100, '%');\n },\n hsvvalue: function (color) {\n return new Dimension(toHSV(color).v * 100, '%');\n },\n red: function (color) {\n return new Dimension(color.rgb[0]);\n },\n green: function (color) {\n return new Dimension(color.rgb[1]);\n },\n blue: function (color) {\n return new Dimension(color.rgb[2]);\n },\n alpha: function (color) {\n return new Dimension(toHSL(color).a);\n },\n luma: function (color) {\n return new Dimension(color.luma() * color.alpha * 100, '%');\n },\n luminance: function (color) {\n const luminance =\n (0.2126 * color.rgb[0] / 255) +\n (0.7152 * color.rgb[1] / 255) +\n (0.0722 * color.rgb[2] / 255);\n\n return new Dimension(luminance * color.alpha * 100, '%');\n },\n saturate: function (color, amount, method) {\n // filter: saturate(3.2);\n // should be kept as is, so check for color\n if (!color.rgb) {\n return null;\n }\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.s += hsl.s * amount.value / 100;\n }\n else {\n hsl.s += amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n return hsla(color, hsl);\n },\n desaturate: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.s -= hsl.s * amount.value / 100;\n }\n else {\n hsl.s -= amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n return hsla(color, hsl);\n },\n lighten: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.l += hsl.l * amount.value / 100;\n }\n else {\n hsl.l += amount.value / 100;\n }\n hsl.l = clamp(hsl.l);\n return hsla(color, hsl);\n },\n darken: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.l -= hsl.l * amount.value / 100;\n }\n else {\n hsl.l -= amount.value / 100;\n }\n hsl.l = clamp(hsl.l);\n return hsla(color, hsl);\n },\n fadein: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.a += hsl.a * amount.value / 100;\n }\n else {\n hsl.a += amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fadeout: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.a -= hsl.a * amount.value / 100;\n }\n else {\n hsl.a -= amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fade: function (color, amount) {\n const hsl = toHSL(color);\n\n hsl.a = amount.value / 100;\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n spin: function (color, amount) {\n const hsl = toHSL(color);\n const hue = (hsl.h + amount.value) % 360;\n\n hsl.h = hue < 0 ? 360 + hue : hue;\n\n return hsla(color, hsl);\n },\n //\n // Copyright (c) 2006-2009 Hampton Catlin, Natalie Weizenbaum, and Chris Eppstein\n // http://sass-lang.com\n //\n mix: function (color1, color2, weight) {\n if (!weight) {\n weight = new Dimension(50);\n }\n const p = weight.value / 100.0;\n const w = p * 2 - 1;\n const a = toHSL(color1).a - toHSL(color2).a;\n\n const w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n const w2 = 1 - w1;\n\n const rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2,\n color1.rgb[1] * w1 + color2.rgb[1] * w2,\n color1.rgb[2] * w1 + color2.rgb[2] * w2];\n\n const alpha = color1.alpha * p + color2.alpha * (1 - p);\n\n return new Color(rgb, alpha);\n },\n greyscale: function (color) {\n return colorFunctions.desaturate(color, new Dimension(100));\n },\n contrast: function (color, dark, light, threshold) {\n // filter: contrast(3.2);\n // should be kept as is, so check for color\n if (!color.rgb) {\n return null;\n }\n if (typeof light === 'undefined') {\n light = colorFunctions.rgba(255, 255, 255, 1.0);\n }\n if (typeof dark === 'undefined') {\n dark = colorFunctions.rgba(0, 0, 0, 1.0);\n }\n // Figure out which is actually light and dark:\n if (dark.luma() > light.luma()) {\n const t = light;\n light = dark;\n dark = t;\n }\n if (typeof threshold === 'undefined') {\n threshold = 0.43;\n } else {\n threshold = number(threshold);\n }\n if (color.luma() < threshold) {\n return light;\n } else {\n return dark;\n }\n },\n // Changes made in 2.7.0 - Reverted in 3.0.0\n // contrast: function (color, color1, color2, threshold) {\n // // Return which of `color1` and `color2` has the greatest contrast with `color`\n // // according to the standard WCAG contrast ratio calculation.\n // // http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n // // The threshold param is no longer used, in line with SASS.\n // // filter: contrast(3.2);\n // // should be kept as is, so check for color\n // if (!color.rgb) {\n // return null;\n // }\n // if (typeof color1 === 'undefined') {\n // color1 = colorFunctions.rgba(0, 0, 0, 1.0);\n // }\n // if (typeof color2 === 'undefined') {\n // color2 = colorFunctions.rgba(255, 255, 255, 1.0);\n // }\n // var contrast1, contrast2;\n // var luma = color.luma();\n // var luma1 = color1.luma();\n // var luma2 = color2.luma();\n // // Calculate contrast ratios for each color\n // if (luma > luma1) {\n // contrast1 = (luma + 0.05) / (luma1 + 0.05);\n // } else {\n // contrast1 = (luma1 + 0.05) / (luma + 0.05);\n // }\n // if (luma > luma2) {\n // contrast2 = (luma + 0.05) / (luma2 + 0.05);\n // } else {\n // contrast2 = (luma2 + 0.05) / (luma + 0.05);\n // }\n // if (contrast1 > contrast2) {\n // return color1;\n // } else {\n // return color2;\n // }\n // },\n argb: function (color) {\n return new Anonymous(color.toARGB());\n },\n color: function(c) {\n if ((c instanceof Quoted) &&\n (/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})$/i.test(c.value))) {\n const val = c.value.slice(1);\n return new Color(val, undefined, `#${val}`);\n }\n if ((c instanceof Color) || (c = Color.fromKeyword(c.value))) {\n c.value = undefined;\n return c;\n }\n throw {\n type: 'Argument',\n message: 'argument must be a color keyword or 3|4|6|8 digit hex e.g. #FFF'\n };\n },\n tint: function(color, amount) {\n return colorFunctions.mix(colorFunctions.rgb(255, 255, 255), color, amount);\n },\n shade: function(color, amount) {\n return colorFunctions.mix(colorFunctions.rgb(0, 0, 0), color, amount);\n }\n};\n\nexport default colorFunctions;\n","import Color from '../tree/color';\n\n// Color Blending\n// ref: http://www.w3.org/TR/compositing-1\n\nfunction colorBlend(mode, color1, color2) {\n const ab = color1.alpha; // result\n\n let // backdrop\n cb;\n\n const as = color2.alpha;\n\n let // source\n cs;\n\n let ar;\n let cr;\n const r = [];\n\n ar = as + ab * (1 - as);\n for (let i = 0; i < 3; i++) {\n cb = color1.rgb[i] / 255;\n cs = color2.rgb[i] / 255;\n cr = mode(cb, cs);\n if (ar) {\n cr = (as * cs + ab * (cb -\n as * (cb + cs - cr))) / ar;\n }\n r[i] = cr * 255;\n }\n\n return new Color(r, ar);\n}\n\nconst colorBlendModeFunctions = {\n multiply: function(cb, cs) {\n return cb * cs;\n },\n screen: function(cb, cs) {\n return cb + cs - cb * cs;\n },\n overlay: function(cb, cs) {\n cb *= 2;\n return (cb <= 1) ?\n colorBlendModeFunctions.multiply(cb, cs) :\n colorBlendModeFunctions.screen(cb - 1, cs);\n },\n softlight: function(cb, cs) {\n let d = 1;\n let e = cb;\n if (cs > 0.5) {\n e = 1;\n d = (cb > 0.25) ? Math.sqrt(cb)\n : ((16 * cb - 12) * cb + 4) * cb;\n }\n return cb - (1 - 2 * cs) * e * (d - cb);\n },\n hardlight: function(cb, cs) {\n return colorBlendModeFunctions.overlay(cs, cb);\n },\n difference: function(cb, cs) {\n return Math.abs(cb - cs);\n },\n exclusion: function(cb, cs) {\n return cb + cs - 2 * cb * cs;\n },\n\n // non-w3c functions:\n average: function(cb, cs) {\n return (cb + cs) / 2;\n },\n negation: function(cb, cs) {\n return 1 - Math.abs(cb + cs - 1);\n }\n};\n\nfor (const f in colorBlendModeFunctions) {\n if (colorBlendModeFunctions.hasOwnProperty(f)) {\n colorBlend[f] = colorBlend.bind(null, colorBlendModeFunctions[f]);\n }\n}\n\nexport default colorBlend;\n","import Comment from '../tree/comment';\nimport Node from '../tree/node';\nimport Dimension from '../tree/dimension';\nimport Declaration from '../tree/declaration';\nimport Expression from '../tree/expression';\nimport Ruleset from '../tree/ruleset';\nimport Selector from '../tree/selector';\nimport Element from '../tree/element';\nimport Quote from '../tree/quoted';\nimport Value from '../tree/value';\n\nconst getItemsFromNode = node => {\n // handle non-array values as an array of length 1\n // return 'undefined' if index is invalid\n const items = Array.isArray(node.value) ?\n node.value : Array(node);\n\n return items;\n};\n\nexport default {\n _SELF: function(n) {\n return n;\n },\n '~': function(...expr) {\n if (expr.length === 1) {\n return expr[0];\n }\n return new Value(expr);\n },\n extract: function(values, index) {\n // (1-based index)\n index = index.value - 1;\n\n return getItemsFromNode(values)[index];\n },\n length: function(values) {\n return new Dimension(getItemsFromNode(values).length);\n },\n /**\n * Creates a Less list of incremental values.\n * Modeled after Lodash's range function, also exists natively in PHP\n * \n * @param {Dimension} [start=1]\n * @param {Dimension} end - e.g. 10 or 10px - unit is added to output\n * @param {Dimension} [step=1] \n */\n range: function(start, end, step) {\n let from;\n let to;\n let stepValue = 1;\n const list = [];\n if (end) {\n to = end;\n from = start.value;\n if (step) {\n stepValue = step.value;\n }\n }\n else {\n from = 1;\n to = start;\n }\n\n for (let i = from; i <= to.value; i += stepValue) {\n list.push(new Dimension(i, to.unit));\n }\n\n return new Expression(list);\n },\n each: function(list, rs) {\n const rules = [];\n let newRules;\n let iterator;\n\n const tryEval = val => {\n if (val instanceof Node) {\n return val.eval(this.context);\n }\n return val;\n };\n\n if (list.value && !(list instanceof Quote)) {\n if (Array.isArray(list.value)) {\n iterator = list.value.map(tryEval);\n } else {\n iterator = [tryEval(list.value)];\n }\n } else if (list.ruleset) {\n iterator = tryEval(list.ruleset).rules;\n } else if (list.rules) {\n iterator = list.rules.map(tryEval);\n } else if (Array.isArray(list)) {\n iterator = list.map(tryEval);\n } else {\n iterator = [tryEval(list)];\n }\n\n let valueName = '@value';\n let keyName = '@key';\n let indexName = '@index';\n\n if (rs.params) {\n valueName = rs.params[0] && rs.params[0].name;\n keyName = rs.params[1] && rs.params[1].name;\n indexName = rs.params[2] && rs.params[2].name;\n rs = rs.rules;\n } else {\n rs = rs.ruleset;\n }\n\n for (let i = 0; i < iterator.length; i++) {\n let key;\n let value;\n const item = iterator[i];\n if (item instanceof Declaration) {\n key = typeof item.name === 'string' ? item.name : item.name[0].value;\n value = item.value;\n } else {\n key = new Dimension(i + 1);\n value = item;\n }\n\n if (item instanceof Comment) {\n continue;\n }\n\n newRules = rs.rules.slice(0);\n if (valueName) {\n newRules.push(new Declaration(valueName,\n value,\n false, false, this.index, this.currentFileInfo));\n }\n if (indexName) {\n newRules.push(new Declaration(indexName,\n new Dimension(i + 1),\n false, false, this.index, this.currentFileInfo));\n }\n if (keyName) {\n newRules.push(new Declaration(keyName,\n key,\n false, false, this.index, this.currentFileInfo));\n }\n\n rules.push(new Ruleset([ new(Selector)([ new Element(\"\", '&') ]) ],\n newRules,\n rs.strictImports,\n rs.visibilityInfo()\n ));\n }\n\n return new Ruleset([ new(Selector)([ new Element(\"\", '&') ]) ],\n rules,\n rs.strictImports,\n rs.visibilityInfo()\n ).eval(this.context);\n }\n};\n","import Dimension from '../tree/dimension';\n\nconst MathHelper = (fn, unit, n) => {\n if (!(n instanceof Dimension)) {\n throw { type: 'Argument', message: 'argument must be a number' };\n }\n if (unit == null) {\n unit = n.unit;\n } else {\n n = n.unify();\n }\n return new Dimension(fn(parseFloat(n.value)), unit);\n};\n\nexport default MathHelper;","import mathHelper from './math-helper.js';\n\nconst mathFunctions = {\n // name, unit\n ceil: null,\n floor: null,\n sqrt: null,\n abs: null,\n tan: '',\n sin: '',\n cos: '',\n atan: 'rad',\n asin: 'rad',\n acos: 'rad'\n};\n\nfor (const f in mathFunctions) {\n if (mathFunctions.hasOwnProperty(f)) {\n mathFunctions[f] = mathHelper.bind(null, Math[f], mathFunctions[f]);\n }\n}\n\nmathFunctions.round = (n, f) => {\n const fraction = typeof f === 'undefined' ? 0 : f.value;\n return mathHelper(num => num.toFixed(fraction), null, n);\n};\n\nexport default mathFunctions;\n","import Dimension from '../tree/dimension';\nimport Anonymous from '../tree/anonymous';\nimport mathHelper from './math-helper.js';\n\nconst minMax = function (isMin, args) {\n args = Array.prototype.slice.call(args);\n switch (args.length) {\n case 0: throw { type: 'Argument', message: 'one or more arguments required' };\n }\n let i; // key is the unit.toString() for unified Dimension values,\n let j;\n let current;\n let currentUnified;\n let referenceUnified;\n let unit;\n let unitStatic;\n let unitClone;\n\n const // elems only contains original argument values.\n order = [];\n\n const values = {};\n // value is the index into the order array.\n for (i = 0; i < args.length; i++) {\n current = args[i];\n if (!(current instanceof Dimension)) {\n if (Array.isArray(args[i].value)) {\n Array.prototype.push.apply(args, Array.prototype.slice.call(args[i].value));\n }\n continue;\n }\n currentUnified = current.unit.toString() === '' && unitClone !== undefined ? new Dimension(current.value, unitClone).unify() : current.unify();\n unit = currentUnified.unit.toString() === '' && unitStatic !== undefined ? unitStatic : currentUnified.unit.toString();\n unitStatic = unit !== '' && unitStatic === undefined || unit !== '' && order[0].unify().unit.toString() === '' ? unit : unitStatic;\n unitClone = unit !== '' && unitClone === undefined ? current.unit.toString() : unitClone;\n j = values[''] !== undefined && unit !== '' && unit === unitStatic ? values[''] : values[unit];\n if (j === undefined) {\n if (unitStatic !== undefined && unit !== unitStatic) {\n throw { type: 'Argument', message: 'incompatible types' };\n }\n values[unit] = order.length;\n order.push(current);\n continue;\n }\n referenceUnified = order[j].unit.toString() === '' && unitClone !== undefined ? new Dimension(order[j].value, unitClone).unify() : order[j].unify();\n if ( isMin && currentUnified.value < referenceUnified.value ||\n !isMin && currentUnified.value > referenceUnified.value) {\n order[j] = current;\n }\n }\n if (order.length == 1) {\n return order[0];\n }\n args = order.map(function (a) { return a.toCSS(this.context); }).join(this.context.compress ? ',' : ', ');\n return new Anonymous(`${isMin ? 'min' : 'max'}(${args})`);\n};\n\nexport default {\n min: function(...args) {\n try {\n return minMax(true, args);\n } catch (e) {}\n },\n max: function(...args) {\n try {\n return minMax(false, args);\n } catch (e) {}\n },\n convert: function (val, unit) {\n return val.convertTo(unit.value);\n },\n pi: function () {\n return new Dimension(Math.PI);\n },\n mod: function(a, b) {\n return new Dimension(a.value % b.value, a.unit);\n },\n pow: function(x, y) {\n if (typeof x === 'number' && typeof y === 'number') {\n x = new Dimension(x);\n y = new Dimension(y);\n } else if (!(x instanceof Dimension) || !(y instanceof Dimension)) {\n throw { type: 'Argument', message: 'arguments must be numbers' };\n }\n\n return new Dimension(Math.pow(x.value, y.value), x.unit);\n },\n percentage: function (n) {\n const result = mathHelper(num => num * 100, '%', n);\n\n return result;\n }\n};\n","import Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport JavaScript from '../tree/javascript';\n\nexport default {\n e: function (str) {\n return new Quoted('\"', str instanceof JavaScript ? str.evaluated : str.value, true);\n },\n escape: function (str) {\n return new Anonymous(\n encodeURI(str.value).replace(/=/g, '%3D').replace(/:/g, '%3A').replace(/#/g, '%23').replace(/;/g, '%3B')\n .replace(/\\(/g, '%28').replace(/\\)/g, '%29'));\n },\n replace: function (string, pattern, replacement, flags) {\n let result = string.value;\n replacement = (replacement.type === 'Quoted') ?\n replacement.value : replacement.toCSS();\n result = result.replace(new RegExp(pattern.value, flags ? flags.value : ''), replacement);\n return new Quoted(string.quote || '', result, string.escaped);\n },\n '%': function (string /* arg, arg, ... */) {\n const args = Array.prototype.slice.call(arguments, 1);\n let result = string.value;\n\n for (let i = 0; i < args.length; i++) {\n /* jshint loopfunc:true */\n result = result.replace(/%[sda]/i, token => {\n const value = ((args[i].type === 'Quoted') &&\n token.match(/s/i)) ? args[i].value : args[i].toCSS();\n return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value;\n });\n }\n result = result.replace(/%%/g, '%');\n return new Quoted(string.quote || '', result, string.escaped);\n }\n};\n","import Keyword from '../tree/keyword';\nimport DetachedRuleset from '../tree/detached-ruleset';\nimport Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport URL from '../tree/url';\nimport Operation from '../tree/operation';\n\nconst isa = (n, Type) => (n instanceof Type) ? Keyword.True : Keyword.False;\nconst isunit = (n, unit) => {\n if (unit === undefined) {\n throw { type: 'Argument', message: 'missing the required second argument to isunit.' };\n }\n unit = typeof unit.value === 'string' ? unit.value : unit;\n if (typeof unit !== 'string') {\n throw { type: 'Argument', message: 'Second argument to isunit should be a unit or a string.' };\n }\n return (n instanceof Dimension) && n.unit.is(unit) ? Keyword.True : Keyword.False;\n};\n\nexport default {\n isruleset: function (n) {\n return isa(n, DetachedRuleset);\n },\n iscolor: function (n) {\n return isa(n, Color);\n },\n isnumber: function (n) {\n return isa(n, Dimension);\n },\n isstring: function (n) {\n return isa(n, Quoted);\n },\n iskeyword: function (n) {\n return isa(n, Keyword);\n },\n isurl: function (n) {\n return isa(n, URL);\n },\n ispixel: function (n) {\n return isunit(n, 'px');\n },\n ispercentage: function (n) {\n return isunit(n, '%');\n },\n isem: function (n) {\n return isunit(n, 'em');\n },\n isunit,\n unit: function (val, unit) {\n if (!(val instanceof Dimension)) {\n throw { type: 'Argument',\n message: `the first argument to unit must be a number${val instanceof Operation ? '. Have you forgotten parenthesis?' : ''}` };\n }\n if (unit) {\n if (unit instanceof Keyword) {\n unit = unit.value;\n } else {\n unit = unit.toCSS();\n }\n } else {\n unit = '';\n }\n return new Dimension(val.value, unit);\n },\n 'get-unit': function (n) {\n return new Anonymous(n.unit);\n }\n};\n","import functionRegistry from './function-registry';\nimport functionCaller from './function-caller';\n\nimport boolean from './boolean';\nimport defaultFunc from './default';\nimport color from './color';\nimport colorBlending from './color-blending';\nimport dataUri from './data-uri';\nimport list from './list';\nimport math from './math';\nimport number from './number';\nimport string from './string';\nimport svg from './svg';\nimport types from './types';\n\nexport default environment => {\n const functions = { functionRegistry, functionCaller };\n\n // register functions\n functionRegistry.addMultiple(boolean);\n functionRegistry.add('default', defaultFunc.eval.bind(defaultFunc));\n functionRegistry.addMultiple(color);\n functionRegistry.addMultiple(colorBlending);\n functionRegistry.addMultiple(dataUri(environment));\n functionRegistry.addMultiple(list);\n functionRegistry.addMultiple(math);\n functionRegistry.addMultiple(number);\n functionRegistry.addMultiple(string);\n functionRegistry.addMultiple(svg(environment));\n functionRegistry.addMultiple(types);\n\n return functions;\n};\n","import Quoted from '../tree/quoted';\nimport URL from '../tree/url';\nimport * as utils from '../utils';\nimport logger from '../logger';\n\nexport default environment => {\n \n const fallback = (functionThis, node) => new URL(node, functionThis.index, functionThis.currentFileInfo).eval(functionThis.context); \n\n return { 'data-uri': function(mimetypeNode, filePathNode) {\n\n if (!filePathNode) {\n filePathNode = mimetypeNode;\n mimetypeNode = null;\n }\n\n let mimetype = mimetypeNode && mimetypeNode.value;\n let filePath = filePathNode.value;\n const currentFileInfo = this.currentFileInfo;\n const currentDirectory = currentFileInfo.rewriteUrls ?\n currentFileInfo.currentDirectory : currentFileInfo.entryPath;\n\n const fragmentStart = filePath.indexOf('#');\n let fragment = '';\n if (fragmentStart !== -1) {\n fragment = filePath.slice(fragmentStart);\n filePath = filePath.slice(0, fragmentStart);\n }\n const context = utils.clone(this.context);\n context.rawBuffer = true;\n\n const fileManager = environment.getFileManager(filePath, currentDirectory, context, environment, true);\n\n if (!fileManager) {\n return fallback(this, filePathNode);\n }\n\n let useBase64 = false;\n\n // detect the mimetype if not given\n if (!mimetypeNode) {\n\n mimetype = environment.mimeLookup(filePath);\n\n if (mimetype === 'image/svg+xml') {\n useBase64 = false;\n } else {\n // use base 64 unless it's an ASCII or UTF-8 format\n const charset = environment.charsetLookup(mimetype);\n useBase64 = ['US-ASCII', 'UTF-8'].indexOf(charset) < 0;\n }\n if (useBase64) { mimetype += ';base64'; }\n }\n else {\n useBase64 = /;base64$/.test(mimetype);\n }\n\n const fileSync = fileManager.loadFileSync(filePath, currentDirectory, context, environment);\n if (!fileSync.contents) {\n logger.warn(`Skipped data-uri embedding of ${filePath} because file not found`);\n return fallback(this, filePathNode || mimetypeNode);\n }\n let buf = fileSync.contents;\n if (useBase64 && !environment.encodeBase64) {\n return fallback(this, filePathNode);\n }\n\n buf = useBase64 ? environment.encodeBase64(buf) : encodeURIComponent(buf);\n\n const uri = `data:${mimetype},${buf}${fragment}`;\n\n return new URL(new Quoted(`\"${uri}\"`, uri, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n }};\n};\n","import Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Expression from '../tree/expression';\nimport Quoted from '../tree/quoted';\nimport URL from '../tree/url';\n\nexport default environment => {\n return { 'svg-gradient': function(direction) {\n let stops;\n let gradientDirectionSvg;\n let gradientType = 'linear';\n let rectangleDimension = 'x=\"0\" y=\"0\" width=\"1\" height=\"1\"';\n const renderEnv = {compress: false};\n let returner;\n const directionValue = direction.toCSS(renderEnv);\n let i;\n let color;\n let position;\n let positionValue;\n let alpha;\n\n function throwArgumentDescriptor() {\n throw { type: 'Argument',\n message: 'svg-gradient expects direction, start_color [start_position], [color position,]...,' +\n ' end_color [end_position] or direction, color list' };\n }\n\n if (arguments.length == 2) {\n if (arguments[1].value.length < 2) {\n throwArgumentDescriptor();\n }\n stops = arguments[1].value;\n } else if (arguments.length < 3) {\n throwArgumentDescriptor();\n } else {\n stops = Array.prototype.slice.call(arguments, 1);\n }\n\n switch (directionValue) {\n case 'to bottom':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\"';\n break;\n case 'to right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'to bottom right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\"';\n break;\n case 'to top right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"100%\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'ellipse':\n case 'ellipse at center':\n gradientType = 'radial';\n gradientDirectionSvg = 'cx=\"50%\" cy=\"50%\" r=\"75%\"';\n rectangleDimension = 'x=\"-50\" y=\"-50\" width=\"101\" height=\"101\"';\n break;\n default:\n throw { type: 'Argument', message: 'svg-gradient direction must be \\'to bottom\\', \\'to right\\',' +\n ' \\'to bottom right\\', \\'to top right\\' or \\'ellipse at center\\'' };\n }\n returner = `<${gradientType}Gradient id=\"g\" ${gradientDirectionSvg}>`;\n\n for (i = 0; i < stops.length; i += 1) {\n if (stops[i] instanceof Expression) {\n color = stops[i].value[0];\n position = stops[i].value[1];\n } else {\n color = stops[i];\n position = undefined;\n }\n\n if (!(color instanceof Color) || (!((i === 0 || i + 1 === stops.length) && position === undefined) && !(position instanceof Dimension))) {\n throwArgumentDescriptor();\n }\n positionValue = position ? position.toCSS(renderEnv) : i === 0 ? '0%' : '100%';\n alpha = color.alpha;\n returner += ``;\n }\n returner += ``;\n\n returner = encodeURIComponent(returner);\n\n returner = `data:image/svg+xml,${returner}`;\n return new URL(new Quoted(`'${returner}'`, returner, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n }};\n};\n","import contexts from './contexts';\nimport visitor from './visitors';\nimport tree from './tree';\n\nexport default function(root, options) {\n options = options || {};\n let evaldRoot;\n let variables = options.variables;\n const evalEnv = new contexts.Eval(options);\n\n //\n // Allows setting variables with a hash, so:\n //\n // `{ color: new tree.Color('#f01') }` will become:\n //\n // new tree.Declaration('@color',\n // new tree.Value([\n // new tree.Expression([\n // new tree.Color('#f01')\n // ])\n // ])\n // )\n //\n if (typeof variables === 'object' && !Array.isArray(variables)) {\n variables = Object.keys(variables).map(function (k) {\n let value = variables[k];\n\n if (!(value instanceof tree.Value)) {\n if (!(value instanceof tree.Expression)) {\n value = new tree.Expression([value]);\n }\n value = new tree.Value([value]);\n }\n return new tree.Declaration(`@${k}`, value, false, null, 0);\n });\n evalEnv.frames = [new tree.Ruleset(null, variables)];\n }\n\n const visitors = [\n new visitor.JoinSelectorVisitor(),\n new visitor.MarkVisibleSelectorsVisitor(true),\n new visitor.ExtendVisitor(),\n new visitor.ToCSSVisitor({compress: Boolean(options.compress)})\n ];\n\n const preEvalVisitors = [];\n let v;\n let visitorIterator;\n\n /**\n * first() / get() allows visitors to be added while visiting\n * \n * @todo Add scoping for visitors just like functions for @plugin; right now they're global\n */\n if (options.pluginManager) {\n visitorIterator = options.pluginManager.visitor();\n for (var i = 0; i < 2; i++) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (v.isPreEvalVisitor) {\n if (i === 0 || preEvalVisitors.indexOf(v) === -1) {\n preEvalVisitors.push(v);\n v.run(root);\n }\n }\n else {\n if (i === 0 || visitors.indexOf(v) === -1) {\n if (v.isPreVisitor) {\n visitors.unshift(v);\n }\n else {\n visitors.push(v);\n }\n }\n }\n }\n }\n }\n\n evaldRoot = root.eval(evalEnv);\n\n for (var i = 0; i < visitors.length; i++) {\n visitors[i].run(evaldRoot);\n }\n\n // Run any remaining visitors added after eval pass\n if (options.pluginManager) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (visitors.indexOf(v) === -1 && preEvalVisitors.indexOf(v) === -1) {\n v.run(evaldRoot);\n }\n }\n }\n\n return evaldRoot;\n};\n","/**\n * Plugin Manager\n */\nclass PluginManager {\n constructor(less) {\n this.less = less;\n this.visitors = [];\n this.preProcessors = [];\n this.postProcessors = [];\n this.installedPlugins = [];\n this.fileManagers = [];\n this.iterator = -1;\n this.pluginCache = {};\n this.Loader = new less.PluginLoader(less);\n }\n\n /**\n * Adds all the plugins in the array\n * @param {Array} plugins\n */\n addPlugins(plugins) {\n if (plugins) {\n for (let i = 0; i < plugins.length; i++) {\n this.addPlugin(plugins[i]);\n }\n }\n }\n\n /**\n *\n * @param plugin\n * @param {String} filename\n */\n addPlugin(plugin, filename, functionRegistry) {\n this.installedPlugins.push(plugin);\n if (filename) {\n this.pluginCache[filename] = plugin;\n }\n if (plugin.install) {\n plugin.install(this.less, this, functionRegistry || this.less.functions.functionRegistry);\n }\n }\n\n /**\n *\n * @param filename\n */\n get(filename) {\n return this.pluginCache[filename];\n }\n\n /**\n * Adds a visitor. The visitor object has options on itself to determine\n * when it should run.\n * @param visitor\n */\n addVisitor(visitor) {\n this.visitors.push(visitor);\n }\n\n /**\n * Adds a pre processor object\n * @param {object} preProcessor\n * @param {number} priority - guidelines 1 = before import, 1000 = import, 2000 = after import\n */\n addPreProcessor(preProcessor, priority) {\n let indexToInsertAt;\n for (indexToInsertAt = 0; indexToInsertAt < this.preProcessors.length; indexToInsertAt++) {\n if (this.preProcessors[indexToInsertAt].priority >= priority) {\n break;\n }\n }\n this.preProcessors.splice(indexToInsertAt, 0, {preProcessor, priority});\n }\n\n /**\n * Adds a post processor object\n * @param {object} postProcessor\n * @param {number} priority - guidelines 1 = before compression, 1000 = compression, 2000 = after compression\n */\n addPostProcessor(postProcessor, priority) {\n let indexToInsertAt;\n for (indexToInsertAt = 0; indexToInsertAt < this.postProcessors.length; indexToInsertAt++) {\n if (this.postProcessors[indexToInsertAt].priority >= priority) {\n break;\n }\n }\n this.postProcessors.splice(indexToInsertAt, 0, {postProcessor, priority});\n }\n\n /**\n *\n * @param manager\n */\n addFileManager(manager) {\n this.fileManagers.push(manager);\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getPreProcessors() {\n const preProcessors = [];\n for (let i = 0; i < this.preProcessors.length; i++) {\n preProcessors.push(this.preProcessors[i].preProcessor);\n }\n return preProcessors;\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getPostProcessors() {\n const postProcessors = [];\n for (let i = 0; i < this.postProcessors.length; i++) {\n postProcessors.push(this.postProcessors[i].postProcessor);\n }\n return postProcessors;\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getVisitors() {\n return this.visitors;\n }\n\n visitor() {\n const self = this;\n return {\n first: function() {\n self.iterator = -1;\n return self.visitors[self.iterator];\n },\n get: function() {\n self.iterator += 1;\n return self.visitors[self.iterator];\n }\n };\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getFileManagers() {\n return this.fileManagers;\n }\n}\n\nlet pm;\n\nconst PluginManagerFactory = function(less, newFactory) {\n if (newFactory || !pm) {\n pm = new PluginManager(less);\n }\n return pm;\n};\n\n//\nexport default PluginManagerFactory;\n","/* global window, XMLHttpRequest */\n\nimport AbstractFileManager from '../less/environment/abstract-file-manager.js';\n\nlet options;\nlet logger;\nlet fileCache = {};\n\n// TODOS - move log somewhere. pathDiff and doing something similar in node. use pathDiff in the other browser file for the initial load\nclass FileManager extends AbstractFileManager {\n alwaysMakePathsAbsolute() {\n return true;\n }\n\n join(basePath, laterPath) {\n if (!basePath) {\n return laterPath;\n }\n return this.extractUrlParts(laterPath, basePath).path;\n }\n\n doXHR(url, type, callback, errback) {\n const xhr = new XMLHttpRequest();\n const async = options.isFileProtocol ? options.fileAsync : true;\n\n if (typeof xhr.overrideMimeType === 'function') {\n xhr.overrideMimeType('text/css');\n }\n logger.debug(`XHR: Getting '${url}'`);\n xhr.open('GET', url, async);\n xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5');\n xhr.send(null);\n\n function handleResponse(xhr, callback, errback) {\n if (xhr.status >= 200 && xhr.status < 300) {\n callback(xhr.responseText,\n xhr.getResponseHeader('Last-Modified'));\n } else if (typeof errback === 'function') {\n errback(xhr.status, url);\n }\n }\n\n if (options.isFileProtocol && !options.fileAsync) {\n if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) {\n callback(xhr.responseText);\n } else {\n errback(xhr.status, url);\n }\n } else if (async) {\n xhr.onreadystatechange = () => {\n if (xhr.readyState == 4) {\n handleResponse(xhr, callback, errback);\n }\n };\n } else {\n handleResponse(xhr, callback, errback);\n }\n }\n\n supports() {\n return true;\n }\n\n clearFileCache() {\n fileCache = {};\n }\n\n loadFile(filename, currentDirectory, options, environment) {\n // TODO: Add prefix support like less-node?\n // What about multiple paths?\n\n if (currentDirectory && !this.isPathAbsolute(filename)) {\n filename = currentDirectory + filename;\n }\n\n filename = options.ext ? this.tryAppendExtension(filename, options.ext) : filename;\n\n options = options || {};\n\n // sheet may be set to the stylesheet for the initial load or a collection of properties including\n // some context variables for imports\n const hrefParts = this.extractUrlParts(filename, window.location.href);\n const href = hrefParts.url;\n const self = this;\n \n return new Promise((resolve, reject) => {\n if (options.useFileCache && fileCache[href]) {\n try {\n const lessText = fileCache[href];\n return resolve({ contents: lessText, filename: href, webInfo: { lastModified: new Date() }});\n } catch (e) {\n return reject({ filename: href, message: `Error loading file ${href} error was ${e.message}` });\n }\n }\n\n self.doXHR(href, options.mime, function doXHRCallback(data, lastModified) {\n // per file cache\n fileCache[href] = data;\n\n // Use remote copy (re-parse)\n resolve({ contents: data, filename: href, webInfo: { lastModified }});\n }, function doXHRError(status, url) {\n reject({ type: 'File', message: `'${url}' wasn't found (${status})`, href });\n });\n });\n }\n}\n\nexport default (opts, log) => {\n options = opts;\n logger = log;\n return FileManager;\n}\n","import Environment from './environment/environment';\nimport data from './data';\nimport tree from './tree';\nimport AbstractFileManager from './environment/abstract-file-manager';\nimport AbstractPluginLoader from './environment/abstract-plugin-loader';\nimport visitors from './visitors';\nimport Parser from './parser/parser';\nimport functions from './functions';\nimport contexts from './contexts';\nimport LessError from './less-error';\nimport transformTree from './transform-tree';\nimport * as utils from './utils';\nimport PluginManager from './plugin-manager';\nimport logger from './logger';\nimport SourceMapOutput from './source-map-output';\nimport SourceMapBuilder from './source-map-builder';\nimport ParseTree from './parse-tree';\nimport ImportManager from './import-manager';\nimport Parse from './parse';\nimport Render from './render';\n\nexport default function(environment, fileManagers) {\n let sourceMapOutput, sourceMapBuilder, parseTree, importManager;\n\n environment = new Environment(environment, fileManagers);\n sourceMapOutput = SourceMapOutput(environment);\n sourceMapBuilder = SourceMapBuilder(sourceMapOutput, environment);\n parseTree = ParseTree(sourceMapBuilder);\n importManager = ImportManager(environment);\n\n const render = Render(environment, parseTree, importManager);\n const parse = Parse(environment, parseTree, importManager);\n\n const initial = {\n version: [4, 0, 0],\n data,\n tree,\n Environment,\n AbstractFileManager,\n AbstractPluginLoader,\n environment,\n visitors,\n Parser,\n functions: functions(environment),\n contexts,\n SourceMapOutput: sourceMapOutput,\n SourceMapBuilder: sourceMapBuilder,\n ParseTree: parseTree,\n ImportManager: importManager,\n render,\n parse,\n LessError,\n transformTree,\n utils,\n PluginManager,\n logger\n };\n\n // Create a public API\n\n const ctor = function(t) {\n return function() {\n const obj = Object.create(t.prototype);\n t.apply(obj, Array.prototype.slice.call(arguments, 0));\n return obj;\n };\n };\n let t;\n const api = Object.create(initial);\n for (const n in initial.tree) {\n /* eslint guard-for-in: 0 */\n t = initial.tree[n];\n if (typeof t === 'function') {\n api[n.toLowerCase()] = ctor(t);\n }\n else {\n api[n] = Object.create(null);\n for (const o in t) {\n /* eslint guard-for-in: 0 */\n api[n][o.toLowerCase()] = ctor(t[o]);\n }\n }\n }\n\n /**\n * Some of the functions assume a `this` context of the API object,\n * which causes it to fail when wrapped for ES6 imports.\n * \n * An assumed `this` should be removed in the future.\n */\n initial.parse = initial.parse.bind(api);\n initial.render = initial.render.bind(api);\n\n return api;\n};\n","import LessError from './less-error';\nimport transformTree from './transform-tree';\nimport logger from './logger';\n\nexport default function(SourceMapBuilder) {\n class ParseTree {\n constructor(root, imports) {\n this.root = root;\n this.imports = imports;\n }\n\n toCSS(options) {\n let evaldRoot;\n const result = {};\n let sourceMapBuilder;\n try {\n evaldRoot = transformTree(this.root, options);\n } catch (e) {\n throw new LessError(e, this.imports);\n }\n\n try {\n const compress = Boolean(options.compress);\n if (compress) {\n logger.warn('The compress option has been deprecated. ' + \n 'We recommend you use a dedicated css minifier, for instance see less-plugin-clean-css.');\n }\n\n const toCSSOptions = {\n compress,\n dumpLineNumbers: options.dumpLineNumbers,\n strictUnits: Boolean(options.strictUnits),\n numPrecision: 8};\n\n if (options.sourceMap) {\n sourceMapBuilder = new SourceMapBuilder(options.sourceMap);\n result.css = sourceMapBuilder.toCSS(evaldRoot, toCSSOptions, this.imports);\n } else {\n result.css = evaldRoot.toCSS(toCSSOptions);\n }\n } catch (e) {\n throw new LessError(e, this.imports);\n }\n\n if (options.pluginManager) {\n const postProcessors = options.pluginManager.getPostProcessors();\n for (let i = 0; i < postProcessors.length; i++) {\n result.css = postProcessors[i].process(result.css, { sourceMap: sourceMapBuilder, options, imports: this.imports });\n }\n }\n if (options.sourceMap) {\n result.map = sourceMapBuilder.getExternalSourceMap();\n }\n\n result.imports = [];\n for (const file in this.imports.files) {\n if (this.imports.files.hasOwnProperty(file) && file !== this.imports.rootFilename) {\n result.imports.push(file);\n }\n }\n return result;\n }\n }\n\n return ParseTree;\n};\n","export default function (SourceMapOutput, environment) {\n class SourceMapBuilder {\n constructor(options) {\n this.options = options;\n }\n\n toCSS(rootNode, options, imports) {\n const sourceMapOutput = new SourceMapOutput(\n {\n contentsIgnoredCharsMap: imports.contentsIgnoredChars,\n rootNode,\n contentsMap: imports.contents,\n sourceMapFilename: this.options.sourceMapFilename,\n sourceMapURL: this.options.sourceMapURL,\n outputFilename: this.options.sourceMapOutputFilename,\n sourceMapBasepath: this.options.sourceMapBasepath,\n sourceMapRootpath: this.options.sourceMapRootpath,\n outputSourceFiles: this.options.outputSourceFiles,\n sourceMapGenerator: this.options.sourceMapGenerator,\n sourceMapFileInline: this.options.sourceMapFileInline, \n disableSourcemapAnnotation: this.options.disableSourcemapAnnotation\n });\n\n const css = sourceMapOutput.toCSS(options);\n this.sourceMap = sourceMapOutput.sourceMap;\n this.sourceMapURL = sourceMapOutput.sourceMapURL;\n if (this.options.sourceMapInputFilename) {\n this.sourceMapInputFilename = sourceMapOutput.normalizeFilename(this.options.sourceMapInputFilename);\n }\n if (this.options.sourceMapBasepath !== undefined && this.sourceMapURL !== undefined) {\n this.sourceMapURL = sourceMapOutput.removeBasepath(this.sourceMapURL);\n }\n return css + this.getCSSAppendage();\n }\n\n getCSSAppendage() {\n\n let sourceMapURL = this.sourceMapURL;\n if (this.options.sourceMapFileInline) {\n if (this.sourceMap === undefined) {\n return '';\n }\n sourceMapURL = `data:application/json;base64,${environment.encodeBase64(this.sourceMap)}`;\n }\n\n if (this.options.disableSourcemapAnnotation) {\n return '';\n }\n\n if (sourceMapURL) {\n return `/*# sourceMappingURL=${sourceMapURL} */`;\n }\n return '';\n }\n\n getExternalSourceMap() {\n return this.sourceMap;\n }\n\n setExternalSourceMap(sourceMap) {\n this.sourceMap = sourceMap;\n }\n\n isInline() {\n return this.options.sourceMapFileInline;\n }\n\n getSourceMapURL() {\n return this.sourceMapURL;\n }\n\n getOutputFilename() {\n return this.options.sourceMapOutputFilename;\n }\n\n getInputFilename() {\n return this.sourceMapInputFilename;\n }\n }\n\n return SourceMapBuilder;\n};\n","export default function (environment) {\n class SourceMapOutput {\n constructor(options) {\n this._css = [];\n this._rootNode = options.rootNode;\n this._contentsMap = options.contentsMap;\n this._contentsIgnoredCharsMap = options.contentsIgnoredCharsMap;\n if (options.sourceMapFilename) {\n this._sourceMapFilename = options.sourceMapFilename.replace(/\\\\/g, '/');\n }\n this._outputFilename = options.outputFilename;\n this.sourceMapURL = options.sourceMapURL;\n if (options.sourceMapBasepath) {\n this._sourceMapBasepath = options.sourceMapBasepath.replace(/\\\\/g, '/');\n }\n if (options.sourceMapRootpath) {\n this._sourceMapRootpath = options.sourceMapRootpath.replace(/\\\\/g, '/');\n if (this._sourceMapRootpath.charAt(this._sourceMapRootpath.length - 1) !== '/') {\n this._sourceMapRootpath += '/';\n }\n } else {\n this._sourceMapRootpath = '';\n }\n this._outputSourceFiles = options.outputSourceFiles;\n this._sourceMapGeneratorConstructor = environment.getSourceMapGenerator();\n\n this._lineNumber = 0;\n this._column = 0;\n }\n\n removeBasepath(path) {\n if (this._sourceMapBasepath && path.indexOf(this._sourceMapBasepath) === 0) {\n path = path.substring(this._sourceMapBasepath.length);\n if (path.charAt(0) === '\\\\' || path.charAt(0) === '/') {\n path = path.substring(1);\n }\n }\n\n return path;\n }\n\n normalizeFilename(filename) {\n filename = filename.replace(/\\\\/g, '/');\n filename = this.removeBasepath(filename);\n return (this._sourceMapRootpath || '') + filename;\n }\n\n add(chunk, fileInfo, index, mapLines) {\n\n // ignore adding empty strings\n if (!chunk) {\n return;\n }\n\n let lines, sourceLines, columns, sourceColumns, i;\n\n if (fileInfo && fileInfo.filename) {\n let inputSource = this._contentsMap[fileInfo.filename];\n\n // remove vars/banner added to the top of the file\n if (this._contentsIgnoredCharsMap[fileInfo.filename]) {\n // adjust the index\n index -= this._contentsIgnoredCharsMap[fileInfo.filename];\n if (index < 0) { index = 0; }\n // adjust the source\n inputSource = inputSource.slice(this._contentsIgnoredCharsMap[fileInfo.filename]);\n }\n\n // ignore empty content\n if (inputSource === undefined) {\n return;\n }\n\n inputSource = inputSource.substring(0, index);\n sourceLines = inputSource.split('\\n');\n sourceColumns = sourceLines[sourceLines.length - 1];\n }\n\n lines = chunk.split('\\n');\n columns = lines[lines.length - 1];\n\n if (fileInfo && fileInfo.filename) {\n if (!mapLines) {\n this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + 1, column: this._column},\n original: { line: sourceLines.length, column: sourceColumns.length},\n source: this.normalizeFilename(fileInfo.filename)});\n } else {\n for (i = 0; i < lines.length; i++) {\n this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + i + 1, column: i === 0 ? this._column : 0},\n original: { line: sourceLines.length + i, column: i === 0 ? sourceColumns.length : 0},\n source: this.normalizeFilename(fileInfo.filename)});\n }\n }\n }\n\n if (lines.length === 1) {\n this._column += columns.length;\n } else {\n this._lineNumber += lines.length - 1;\n this._column = columns.length;\n }\n\n this._css.push(chunk);\n }\n\n isEmpty() {\n return this._css.length === 0;\n }\n\n toCSS(context) {\n this._sourceMapGenerator = new this._sourceMapGeneratorConstructor({ file: this._outputFilename, sourceRoot: null });\n\n if (this._outputSourceFiles) {\n for (const filename in this._contentsMap) {\n if (this._contentsMap.hasOwnProperty(filename)) {\n let source = this._contentsMap[filename];\n if (this._contentsIgnoredCharsMap[filename]) {\n source = source.slice(this._contentsIgnoredCharsMap[filename]);\n }\n this._sourceMapGenerator.setSourceContent(this.normalizeFilename(filename), source);\n }\n }\n }\n\n this._rootNode.genCSS(context, this);\n\n if (this._css.length > 0) {\n let sourceMapURL;\n const sourceMapContent = JSON.stringify(this._sourceMapGenerator.toJSON());\n\n if (this.sourceMapURL) {\n sourceMapURL = this.sourceMapURL;\n } else if (this._sourceMapFilename) {\n sourceMapURL = this._sourceMapFilename;\n }\n this.sourceMapURL = sourceMapURL;\n\n this.sourceMap = sourceMapContent;\n }\n\n return this._css.join('');\n }\n }\n\n return SourceMapOutput;\n};\n","import contexts from './contexts';\nimport Parser from './parser/parser';\nimport LessError from './less-error';\nimport * as utils from './utils';\nimport logger from './logger';\n\nexport default function(environment) {\n // FileInfo = {\n // 'rewriteUrls' - option - whether to adjust URL's to be relative\n // 'filename' - full resolved filename of current file\n // 'rootpath' - path to append to normal URLs for this node\n // 'currentDirectory' - path to the current file, absolute\n // 'rootFilename' - filename of the base file\n // 'entryPath' - absolute path to the entry file\n // 'reference' - whether the file should not be output and only output parts that are referenced\n\n class ImportManager {\n constructor(less, context, rootFileInfo) {\n this.less = less;\n this.rootFilename = rootFileInfo.filename;\n this.paths = context.paths || []; // Search paths, when importing\n this.contents = {}; // map - filename to contents of all the files\n this.contentsIgnoredChars = {}; // map - filename to lines at the beginning of each file to ignore\n this.mime = context.mime;\n this.error = null;\n this.context = context;\n // Deprecated? Unused outside of here, could be useful.\n this.queue = []; // Files which haven't been imported yet\n this.files = {}; // Holds the imported parse trees.\n }\n\n /**\n * Add an import to be imported\n * @param path - the raw path\n * @param tryAppendExtension - whether to try appending a file extension (.less or .js if the path has no extension)\n * @param currentFileInfo - the current file info (used for instance to work out relative paths)\n * @param importOptions - import options\n * @param callback - callback for when it is imported\n */\n push(path, tryAppendExtension, currentFileInfo, importOptions, callback) {\n const importManager = this, pluginLoader = this.context.pluginManager.Loader;\n\n this.queue.push(path);\n\n const fileParsedFunc = function (e, root, fullPath) {\n importManager.queue.splice(importManager.queue.indexOf(path), 1); // Remove the path from the queue\n\n const importedEqualsRoot = fullPath === importManager.rootFilename;\n if (importOptions.optional && e) {\n callback(null, {rules:[]}, false, null);\n logger.info(`The file ${fullPath} was skipped because it was not found and the import was marked optional.`);\n }\n else {\n // Inline imports aren't cached here.\n // If we start to cache them, please make sure they won't conflict with non-inline imports of the\n // same name as they used to do before this comment and the condition below have been added.\n if (!importManager.files[fullPath] && !importOptions.inline) {\n importManager.files[fullPath] = { root, options: importOptions };\n }\n if (e && !importManager.error) { importManager.error = e; }\n callback(e, root, importedEqualsRoot, fullPath);\n }\n };\n\n const newFileInfo = {\n rewriteUrls: this.context.rewriteUrls,\n entryPath: currentFileInfo.entryPath,\n rootpath: currentFileInfo.rootpath,\n rootFilename: currentFileInfo.rootFilename\n };\n\n const fileManager = environment.getFileManager(path, currentFileInfo.currentDirectory, this.context, environment);\n\n if (!fileManager) {\n fileParsedFunc({ message: `Could not find a file-manager for ${path}` });\n return;\n }\n\n const loadFileCallback = function(loadedFile) {\n let plugin;\n const resolvedFilename = loadedFile.filename;\n const contents = loadedFile.contents.replace(/^\\uFEFF/, '');\n\n // Pass on an updated rootpath if path of imported file is relative and file\n // is in a (sub|sup) directory\n //\n // Examples:\n // - If path of imported file is 'module/nav/nav.less' and rootpath is 'less/',\n // then rootpath should become 'less/module/nav/'\n // - If path of imported file is '../mixins.less' and rootpath is 'less/',\n // then rootpath should become 'less/../'\n newFileInfo.currentDirectory = fileManager.getPath(resolvedFilename);\n if (newFileInfo.rewriteUrls) {\n newFileInfo.rootpath = fileManager.join(\n (importManager.context.rootpath || ''),\n fileManager.pathDiff(newFileInfo.currentDirectory, newFileInfo.entryPath));\n\n if (!fileManager.isPathAbsolute(newFileInfo.rootpath) && fileManager.alwaysMakePathsAbsolute()) {\n newFileInfo.rootpath = fileManager.join(newFileInfo.entryPath, newFileInfo.rootpath);\n }\n }\n newFileInfo.filename = resolvedFilename;\n\n const newEnv = new contexts.Parse(importManager.context);\n\n newEnv.processImports = false;\n importManager.contents[resolvedFilename] = contents;\n\n if (currentFileInfo.reference || importOptions.reference) {\n newFileInfo.reference = true;\n }\n\n if (importOptions.isPlugin) {\n plugin = pluginLoader.evalPlugin(contents, newEnv, importManager, importOptions.pluginArgs, newFileInfo);\n if (plugin instanceof LessError) {\n fileParsedFunc(plugin, null, resolvedFilename);\n }\n else {\n fileParsedFunc(null, plugin, resolvedFilename);\n }\n } else if (importOptions.inline) {\n fileParsedFunc(null, contents, resolvedFilename);\n } else {\n\n // import (multiple) parse trees apparently get altered and can't be cached.\n // TODO: investigate why this is\n if (importManager.files[resolvedFilename]\n && !importManager.files[resolvedFilename].options.multiple\n && !importOptions.multiple) {\n\n fileParsedFunc(null, importManager.files[resolvedFilename].root, resolvedFilename);\n }\n else {\n new Parser(newEnv, importManager, newFileInfo).parse(contents, function (e, root) {\n fileParsedFunc(e, root, resolvedFilename);\n });\n }\n }\n };\n let loadedFile;\n let promise;\n const context = utils.clone(this.context);\n\n if (tryAppendExtension) {\n context.ext = importOptions.isPlugin ? '.js' : '.less';\n }\n\n if (importOptions.isPlugin) {\n context.mime = 'application/javascript';\n\n if (context.syncImport) {\n loadedFile = pluginLoader.loadPluginSync(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n } else {\n promise = pluginLoader.loadPlugin(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n }\n }\n else {\n if (context.syncImport) {\n loadedFile = fileManager.loadFileSync(path, currentFileInfo.currentDirectory, context, environment);\n } else {\n promise = fileManager.loadFile(path, currentFileInfo.currentDirectory, context, environment,\n (err, loadedFile) => {\n if (err) {\n fileParsedFunc(err);\n } else {\n loadFileCallback(loadedFile);\n }\n });\n }\n }\n if (loadedFile) {\n if (!loadedFile.filename) {\n fileParsedFunc(loadedFile);\n } else {\n loadFileCallback(loadedFile);\n }\n } else if (promise) {\n promise.then(loadFileCallback, fileParsedFunc);\n }\n }\n }\n\n return ImportManager;\n};\n","import * as utils from './utils';\n\nexport default function(environment, ParseTree, ImportManager) {\n const render = function (input, options, callback) {\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(this.options, {});\n }\n else {\n options = utils.copyOptions(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n return new Promise(function (resolve, reject) {\n render.call(self, input, options, function(err, output) {\n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n this.parse(input, options, function(err, root, imports, options) {\n if (err) { return callback(err); }\n\n let result;\n try {\n const parseTree = new ParseTree(root, imports);\n result = parseTree.toCSS(options);\n }\n catch (err) { return callback(err); }\n\n callback(null, result);\n });\n }\n };\n\n return render;\n};\n","import contexts from './contexts';\nimport Parser from './parser/parser';\nimport PluginManager from './plugin-manager';\nimport LessError from './less-error';\nimport * as utils from './utils';\n\nexport default function(environment, ParseTree, ImportManager) {\n const parse = function (input, options, callback) {\n\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(this.options, {});\n }\n else {\n options = utils.copyOptions(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n return new Promise(function (resolve, reject) {\n parse.call(self, input, options, function(err, output) {\n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n let context;\n let rootFileInfo;\n const pluginManager = new PluginManager(this, !options.reUsePluginManager);\n\n options.pluginManager = pluginManager;\n\n context = new contexts.Parse(options);\n\n if (options.rootFileInfo) {\n rootFileInfo = options.rootFileInfo;\n } else {\n const filename = options.filename || 'input';\n const entryPath = filename.replace(/[^\\/\\\\]*$/, '');\n rootFileInfo = {\n filename,\n rewriteUrls: context.rewriteUrls,\n rootpath: context.rootpath || '',\n currentDirectory: entryPath,\n entryPath,\n rootFilename: filename\n };\n // add in a missing trailing slash\n if (rootFileInfo.rootpath && rootFileInfo.rootpath.slice(-1) !== '/') {\n rootFileInfo.rootpath += '/';\n }\n }\n\n const imports = new ImportManager(this, context, rootFileInfo);\n this.importManager = imports;\n\n // TODO: allow the plugins to be just a list of paths or names\n // Do an async plugin queue like lessc\n\n if (options.plugins) {\n options.plugins.forEach(function(plugin) {\n let evalResult, contents;\n if (plugin.fileContent) {\n contents = plugin.fileContent.replace(/^\\uFEFF/, '');\n evalResult = pluginManager.Loader.evalPlugin(contents, context, imports, plugin.options, plugin.filename);\n if (evalResult instanceof LessError) {\n return callback(evalResult);\n }\n }\n else {\n pluginManager.addPlugin(plugin);\n }\n });\n }\n\n new Parser(context, imports, rootFileInfo)\n .parse(input, function (e, root) {\n if (e) { return callback(e); }\n callback(null, root, imports, options);\n }, options);\n }\n };\n return parse;\n};\n","// TODO: Add tests for browser @plugin\n/* global window */\n\nimport AbstractPluginLoader from '../less/environment/abstract-plugin-loader.js';\n\n/**\n * Browser Plugin Loader\n */\nclass PluginLoader extends AbstractPluginLoader {\n constructor(less) {\n super();\n\n this.less = less;\n // Should we shim this.require for browser? Probably not?\n }\n\n loadPlugin(filename, basePath, context, environment, fileManager) {\n return new Promise((fulfill, reject) => {\n fileManager.loadFile(filename, basePath, context, environment)\n .then(fulfill).catch(reject);\n });\n }\n}\n\nexport default PluginLoader;\n\n","import * as utils from './utils';\nimport browser from './browser';\n\nexport default (window, less, options) => {\n\n function errorHTML(e, rootHref) {\n const id = `less-error-message:${utils.extractId(rootHref || '')}`;\n const template = '
  • {content}
  • ';\n const elem = window.document.createElement('div');\n let timer;\n let content;\n const errors = [];\n const filename = e.filename || rootHref;\n const filenameNoPath = filename.match(/([^\\/]+(\\?.*)?)$/)[1];\n\n elem.id = id;\n elem.className = 'less-error-message';\n\n content = `

    ${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'}` + \n `

    in ${filenameNoPath} `;\n\n const errorline = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\{content\\}/, e.extract[i]));\n }\n };\n\n if (e.line) {\n errorline(e, 0, '');\n errorline(e, 1, 'line');\n errorline(e, 2, '');\n content += `on line ${e.line}, column ${e.column + 1}:

      ${errors.join('')}
    `;\n }\n if (e.stack && (e.extract || options.logLevel >= 4)) {\n content += `
    Stack Trace
    ${e.stack.split('\\n').slice(1).join('
    ')}`;\n }\n elem.innerHTML = content;\n\n // CSS for error messages\n browser.createCSS(window.document, [\n '.less-error-message ul, .less-error-message li {',\n 'list-style-type: none;',\n 'margin-right: 15px;',\n 'padding: 4px 0;',\n 'margin: 0;',\n '}',\n '.less-error-message label {',\n 'font-size: 12px;',\n 'margin-right: 15px;',\n 'padding: 4px 0;',\n 'color: #cc7777;',\n '}',\n '.less-error-message pre {',\n 'color: #dd6666;',\n 'padding: 4px 0;',\n 'margin: 0;',\n 'display: inline-block;',\n '}',\n '.less-error-message pre.line {',\n 'color: #ff0000;',\n '}',\n '.less-error-message h3 {',\n 'font-size: 20px;',\n 'font-weight: bold;',\n 'padding: 15px 0 5px 0;',\n 'margin: 0;',\n '}',\n '.less-error-message a {',\n 'color: #10a',\n '}',\n '.less-error-message .error {',\n 'color: red;',\n 'font-weight: bold;',\n 'padding-bottom: 2px;',\n 'border-bottom: 1px dashed red;',\n '}'\n ].join('\\n'), { title: 'error-message' });\n\n elem.style.cssText = [\n 'font-family: Arial, sans-serif',\n 'border: 1px solid #e00',\n 'background-color: #eee',\n 'border-radius: 5px',\n '-webkit-border-radius: 5px',\n '-moz-border-radius: 5px',\n 'color: #e00',\n 'padding: 15px',\n 'margin-bottom: 15px'\n ].join(';');\n\n if (options.env === 'development') {\n timer = setInterval(() => {\n const document = window.document;\n const body = document.body;\n if (body) {\n if (document.getElementById(id)) {\n body.replaceChild(elem, document.getElementById(id));\n } else {\n body.insertBefore(elem, body.firstChild);\n }\n clearInterval(timer);\n }\n }, 10);\n }\n }\n\n function removeErrorHTML(path) {\n const node = window.document.getElementById(`less-error-message:${utils.extractId(path)}`);\n if (node) {\n node.parentNode.removeChild(node);\n }\n }\n\n function removeErrorConsole(path) {\n // no action\n }\n\n function removeError(path) {\n if (!options.errorReporting || options.errorReporting === 'html') {\n removeErrorHTML(path);\n } else if (options.errorReporting === 'console') {\n removeErrorConsole(path);\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('remove', path);\n }\n }\n\n function errorConsole(e, rootHref) {\n const template = '{line} {content}';\n const filename = e.filename || rootHref;\n const errors = [];\n let content = `${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'} in ${filename}`;\n\n const errorline = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\{content\\}/, e.extract[i]));\n }\n };\n\n if (e.line) {\n errorline(e, 0, '');\n errorline(e, 1, 'line');\n errorline(e, 2, '');\n content += ` on line ${e.line}, column ${e.column + 1}:\\n${errors.join('\\n')}`;\n }\n if (e.stack && (e.extract || options.logLevel >= 4)) {\n content += `\\nStack Trace\\n${e.stack}`;\n }\n less.logger.error(content);\n }\n\n function error(e, rootHref) {\n if (!options.errorReporting || options.errorReporting === 'html') {\n errorHTML(e, rootHref);\n } else if (options.errorReporting === 'console') {\n errorConsole(e, rootHref);\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('add', e, rootHref);\n }\n }\n\n return {\n add: error,\n remove: removeError\n };\n};\n","/**\n * Kicks off less and compiles any stylesheets\n * used in the browser distributed version of less\n * to kick-start less using the browser api\n */\n/* global window, document */\n\nimport defaultOptions from '../less/default-options';\nimport addDefaultOptions from './add-default-options';\nimport root from './index';\n\nconst options = defaultOptions();\n\nif (window.less) {\n for (const key in window.less) {\n if (window.less.hasOwnProperty(key)) {\n options[key] = window.less[key];\n }\n }\n}\naddDefaultOptions(window, options);\n\noptions.plugins = options.plugins || [];\n\nif (window.LESS_PLUGINS) {\n options.plugins = options.plugins.concat(window.LESS_PLUGINS);\n}\n\nconst less = root(window, options);\nexport default less;\n\nwindow.less = less;\n\nlet css;\nlet head;\nlet style;\n\n// Always restore page visibility\nfunction resolveOrReject(data) {\n if (data.filename) {\n console.warn(data);\n }\n if (!options.async) {\n head.removeChild(style);\n }\n}\n\nif (options.onReady) {\n if (/!watch/.test(window.location.hash)) {\n less.watch();\n }\n // Simulate synchronous stylesheet loading by hiding page rendering\n if (!options.async) {\n css = 'body { display: none !important }';\n head = document.head || document.getElementsByTagName('head')[0];\n style = document.createElement('style');\n\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n\n head.appendChild(style);\n }\n less.registerStylesheetsImmediately();\n less.pageLoadFinished = less.refresh(less.env === 'development').then(resolveOrReject, resolveOrReject);\n}\n","// Export a new default each time\nexport default function() {\n return {\n /* Inline Javascript - @plugin still allowed */\n javascriptEnabled: false,\n\n /* Outputs a makefile import dependency list to stdout. */\n depends: false,\n\n /* (DEPRECATED) Compress using less built-in compression. \n * This does an okay job but does not utilise all the tricks of \n * dedicated css compression. */\n compress: false,\n\n /* Runs the less parser and just reports errors without any output. */\n lint: false,\n\n /* Sets available include paths.\n * If the file in an @import rule does not exist at that exact location, \n * less will look for it at the location(s) passed to this option. \n * You might use this for instance to specify a path to a library which \n * you want to be referenced simply and relatively in the less files. */\n paths: [],\n\n /* color output in the terminal */\n color: true,\n\n /* The strictImports controls whether the compiler will allow an @import inside of either \n * @media blocks or (a later addition) other selector blocks.\n * See: https://github.com/less/less.js/issues/656 */\n strictImports: false,\n\n /* Allow Imports from Insecure HTTPS Hosts */\n insecure: false,\n\n /* Allows you to add a path to every generated import and url in your css. \n * This does not affect less import statements that are processed, just ones \n * that are left in the output css. */\n rootpath: '',\n\n /* By default URLs are kept as-is, so if you import a file in a sub-directory \n * that references an image, exactly the same URL will be output in the css. \n * This option allows you to re-write URL's in imported files so that the \n * URL is always relative to the base imported file */\n rewriteUrls: false,\n\n /* How to process math \n * 0 always - eagerly try to solve all operations\n * 1 parens-division - require parens for division \"/\"\n * 2 parens | strict - require parens for all operations\n * 3 strict-legacy - legacy strict behavior (super-strict)\n */\n math: 1,\n\n /* Without this option, less attempts to guess at the output unit when it does maths. */\n strictUnits: false,\n\n /* Effectively the declaration is put at the top of your base Less file, \n * meaning it can be used but it also can be overridden if this variable \n * is defined in the file. */\n globalVars: null,\n\n /* As opposed to the global variable option, this puts the declaration at the\n * end of your base file, meaning it will override anything defined in your Less file. */\n modifyVars: null,\n\n /* This option allows you to specify a argument to go on to every URL. */\n urlArgs: ''\n }\n};","import {addDataAttr} from './utils';\nimport browser from './browser';\n\nexport default (window, options) => {\n\n // use options from the current script tag data attribues\n addDataAttr(options, browser.currentScript(window));\n\n if (options.isFileProtocol === undefined) {\n options.isFileProtocol = /^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(window.location.protocol);\n }\n\n // Load styles asynchronously (default: false)\n //\n // This is set to `false` by default, so that the body\n // doesn't start loading before the stylesheets are parsed.\n // Setting this to `true` can result in flickering.\n //\n options.async = options.async || false;\n options.fileAsync = options.fileAsync || false;\n\n // Interval between watch polls\n options.poll = options.poll || (options.isFileProtocol ? 1000 : 1500);\n\n options.env = options.env || (window.location.hostname == '127.0.0.1' ||\n window.location.hostname == '0.0.0.0' ||\n window.location.hostname == 'localhost' ||\n (window.location.port &&\n window.location.port.length > 0) ||\n options.isFileProtocol ? 'development'\n : 'production');\n\n const dumpLineNumbers = /!dumpLineNumbers:(comments|mediaquery|all)/.exec(window.location.hash);\n if (dumpLineNumbers) {\n options.dumpLineNumbers = dumpLineNumbers[1];\n }\n\n if (options.useFileCache === undefined) {\n options.useFileCache = true;\n }\n\n if (options.onReady === undefined) {\n options.onReady = true;\n }\n\n if (options.relativeUrls) {\n options.rewriteUrls = 'all';\n }\n};\n","//\n// index.js\n// Should expose the additional browser functions on to the less object\n//\nimport {addDataAttr} from './utils';\nimport lessRoot from '../less';\nimport browser from './browser';\nimport FM from './file-manager';\nimport PluginLoader from './plugin-loader';\nimport LogListener from './log-listener';\nimport ErrorReporting from './error-reporting';\nimport Cache from './cache';\nimport ImageSize from './image-size';\n\nexport default (window, options) => {\n const document = window.document;\n const less = lessRoot();\n\n less.options = options;\n const environment = less.environment;\n const FileManager = FM(options, less.logger);\n const fileManager = new FileManager();\n environment.addFileManager(fileManager);\n less.FileManager = FileManager;\n less.PluginLoader = PluginLoader;\n\n LogListener(less, options);\n const errors = ErrorReporting(window, less, options);\n const cache = less.cache = options.cache || Cache(window, options, less.logger);\n ImageSize(less.environment);\n\n // Setup user functions - Deprecate?\n if (options.functions) {\n less.functions.functionRegistry.addMultiple(options.functions);\n }\n\n const typePattern = /^text\\/(x-)?less$/;\n\n function clone(obj) {\n const cloned = {};\n for (const prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n cloned[prop] = obj[prop];\n }\n }\n return cloned;\n }\n\n // only really needed for phantom\n function bind(func, thisArg) {\n const curryArgs = Array.prototype.slice.call(arguments, 2);\n return function() {\n const args = curryArgs.concat(Array.prototype.slice.call(arguments, 0));\n return func.apply(thisArg, args);\n };\n }\n\n function loadStyles(modifyVars) {\n const styles = document.getElementsByTagName('style');\n let style;\n\n for (let i = 0; i < styles.length; i++) {\n style = styles[i];\n if (style.type.match(typePattern)) {\n const instanceOptions = clone(options);\n instanceOptions.modifyVars = modifyVars;\n const lessText = style.innerHTML || '';\n instanceOptions.filename = document.location.href.replace(/#.*$/, '');\n\n /* jshint loopfunc:true */\n // use closure to store current style\n less.render(lessText, instanceOptions,\n bind((style, e, result) => {\n if (e) {\n errors.add(e, 'inline');\n } else {\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = result.css;\n } else {\n style.innerHTML = result.css;\n }\n }\n }, null, style));\n }\n }\n }\n\n function loadStyleSheet(sheet, callback, reload, remaining, modifyVars) {\n\n const instanceOptions = clone(options);\n addDataAttr(instanceOptions, sheet);\n instanceOptions.mime = sheet.type;\n\n if (modifyVars) {\n instanceOptions.modifyVars = modifyVars;\n }\n\n function loadInitialFileCallback(loadedFile) {\n const data = loadedFile.contents;\n const path = loadedFile.filename;\n const webInfo = loadedFile.webInfo;\n\n const newFileInfo = {\n currentDirectory: fileManager.getPath(path),\n filename: path,\n rootFilename: path,\n rewriteUrls: instanceOptions.rewriteUrls\n };\n\n newFileInfo.entryPath = newFileInfo.currentDirectory;\n newFileInfo.rootpath = instanceOptions.rootpath || newFileInfo.currentDirectory;\n\n if (webInfo) {\n webInfo.remaining = remaining;\n\n const css = cache.getCSS(path, webInfo, instanceOptions.modifyVars);\n if (!reload && css) {\n webInfo.local = true;\n callback(null, css, data, sheet, webInfo, path);\n return;\n }\n\n }\n\n // TODO add tests around how this behaves when reloading\n errors.remove(path);\n\n instanceOptions.rootFileInfo = newFileInfo;\n less.render(data, instanceOptions, (e, result) => {\n if (e) {\n e.href = path;\n callback(e);\n } else {\n cache.setCSS(sheet.href, webInfo.lastModified, instanceOptions.modifyVars, result.css);\n callback(null, result.css, data, sheet, webInfo, path);\n }\n });\n }\n\n fileManager.loadFile(sheet.href, null, instanceOptions, environment)\n .then(loadedFile => {\n loadInitialFileCallback(loadedFile);\n }).catch(err => {\n console.log(err);\n callback(err);\n });\n\n }\n\n function loadStyleSheets(callback, reload, modifyVars) {\n for (let i = 0; i < less.sheets.length; i++) {\n loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1), modifyVars);\n }\n }\n\n function initRunningMode() {\n if (less.env === 'development') {\n less.watchTimer = setInterval(() => {\n if (less.watchMode) {\n fileManager.clearFileCache();\n loadStyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n } else if (css) {\n browser.createCSS(window.document, css, sheet);\n }\n });\n }\n }, options.poll);\n }\n }\n\n //\n // Watch mode\n //\n less.watch = function () {\n if (!less.watchMode ) {\n less.env = 'development';\n initRunningMode();\n }\n this.watchMode = true;\n return true;\n };\n\n less.unwatch = function () {clearInterval(less.watchTimer); this.watchMode = false; return false; };\n\n //\n // Synchronously get all tags with the 'rel' attribute set to\n // \"stylesheet/less\".\n //\n less.registerStylesheetsImmediately = () => {\n const links = document.getElementsByTagName('link');\n less.sheets = [];\n\n for (let i = 0; i < links.length; i++) {\n if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) &&\n (links[i].type.match(typePattern)))) {\n less.sheets.push(links[i]);\n }\n }\n };\n\n //\n // Asynchronously get all tags with the 'rel' attribute set to\n // \"stylesheet/less\", returning a Promise.\n //\n less.registerStylesheets = () => new Promise((resolve, reject) => {\n less.registerStylesheetsImmediately();\n resolve();\n });\n\n //\n // With this function, it's possible to alter variables and re-render\n // CSS without reloading less-files\n //\n less.modifyVars = record => less.refresh(true, record, false);\n\n less.refresh = (reload, modifyVars, clearFileCache) => {\n if ((reload || clearFileCache) && clearFileCache !== false) {\n fileManager.clearFileCache();\n }\n return new Promise((resolve, reject) => {\n let startTime;\n let endTime;\n let totalMilliseconds;\n let remainingSheets;\n startTime = endTime = new Date();\n\n // Set counter for remaining unprocessed sheets\n remainingSheets = less.sheets.length;\n\n if (remainingSheets === 0) {\n\n endTime = new Date();\n totalMilliseconds = endTime - startTime;\n less.logger.info('Less has finished and no sheets were loaded.');\n resolve({\n startTime,\n endTime,\n totalMilliseconds,\n sheets: less.sheets.length\n });\n\n } else {\n // Relies on less.sheets array, callback seems to be guaranteed to be called for every element of the array\n loadStyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n reject(e);\n return;\n }\n if (webInfo.local) {\n less.logger.info(`Loading ${sheet.href} from cache.`);\n } else {\n less.logger.info(`Rendered ${sheet.href} successfully.`);\n }\n browser.createCSS(window.document, css, sheet);\n less.logger.info(`CSS for ${sheet.href} generated in ${new Date() - endTime}ms`);\n\n // Count completed sheet\n remainingSheets--;\n\n // Check if the last remaining sheet was processed and then call the promise\n if (remainingSheets === 0) {\n totalMilliseconds = new Date() - startTime;\n less.logger.info(`Less has finished. CSS generated in ${totalMilliseconds}ms`);\n resolve({\n startTime,\n endTime,\n totalMilliseconds,\n sheets: less.sheets.length\n });\n }\n endTime = new Date();\n }, reload, modifyVars);\n }\n\n loadStyles(modifyVars);\n });\n };\n\n less.refreshStyles = loadStyles;\n return less;\n};\n","export default (less, options) => {\n const logLevel_debug = 4;\n const logLevel_info = 3;\n const logLevel_warn = 2;\n const logLevel_error = 1;\n\n // The amount of logging in the javascript console.\n // 3 - Debug, information and errors\n // 2 - Information and errors\n // 1 - Errors\n // 0 - None\n // Defaults to 2\n options.logLevel = typeof options.logLevel !== 'undefined' ? options.logLevel : (options.env === 'development' ? logLevel_info : logLevel_error);\n\n if (!options.loggers) {\n options.loggers = [{\n debug: function(msg) {\n if (options.logLevel >= logLevel_debug) {\n console.log(msg);\n }\n },\n info: function(msg) {\n if (options.logLevel >= logLevel_info) {\n console.log(msg);\n }\n },\n warn: function(msg) {\n if (options.logLevel >= logLevel_warn) {\n console.warn(msg);\n }\n },\n error: function(msg) {\n if (options.logLevel >= logLevel_error) {\n console.error(msg);\n }\n }\n }];\n }\n for (let i = 0; i < options.loggers.length; i++) {\n less.logger.addListener(options.loggers[i]);\n }\n};\n","// Cache system is a bit outdated and could do with work\n\nexport default (window, options, logger) => {\n let cache = null;\n if (options.env !== 'development') {\n try {\n cache = (typeof window.localStorage === 'undefined') ? null : window.localStorage;\n } catch (_) {}\n }\n return {\n setCSS: function(path, lastModified, modifyVars, styles) {\n if (cache) {\n logger.info(`saving ${path} to cache.`);\n try {\n cache.setItem(path, styles);\n cache.setItem(`${path}:timestamp`, lastModified);\n if (modifyVars) {\n cache.setItem(`${path}:vars`, JSON.stringify(modifyVars));\n }\n } catch (e) {\n // TODO - could do with adding more robust error handling\n logger.error(`failed to save \"${path}\" to local storage for caching.`);\n }\n }\n },\n getCSS: function(path, webInfo, modifyVars) {\n const css = cache && cache.getItem(path);\n const timestamp = cache && cache.getItem(`${path}:timestamp`);\n let vars = cache && cache.getItem(`${path}:vars`);\n\n modifyVars = modifyVars || {};\n vars = vars || \"{}\"; // if not set, treat as the JSON representation of an empty object\n\n if (timestamp && webInfo.lastModified &&\n (new Date(webInfo.lastModified).valueOf() ===\n new Date(timestamp).valueOf()) &&\n JSON.stringify(modifyVars) === vars) {\n // Use local copy\n return css;\n }\n }\n };\n};\n","\nimport functionRegistry from './../less/functions/function-registry';\n\nexport default () => {\n function imageSize() {\n throw {\n type: 'Runtime',\n message: 'Image size functions are not supported in browser version of less'\n };\n }\n\n const imageFunctions = {\n 'image-size': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n },\n 'image-width': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n },\n 'image-height': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n }\n };\n\n functionRegistry.addMultiple(imageFunctions);\n};\n"],"names":["extractId","href","replace","addDataAttr","options","tag","opt","dataset","hasOwnProperty","JSON","parse","_","document","styles","sheet","id","title","utils.extractId","oldStyleNode","getElementById","keepOldStyleNode","styleNode","createElement","setAttribute","media","styleSheet","appendChild","createTextNode","childNodes","length","firstChild","nodeValue","head","getElementsByTagName","nextEl","nextSibling","parentNode","insertBefore","removeChild","cssText","e","Error","window","scripts","currentScript","error","msg","this","_fireEvent","warn","info","debug","addListener","listener","_listeners","push","removeListener","i","splice","type","logFunction","externalEnvironment","fileManagers","requiredFunctions","functions","concat","propName","environmentFunc","bind","Environment","filename","currentDirectory","environment","isSync","logger","pluginManager","getFileManagers","fileManager","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","darkgrey","darkgreen","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","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","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","m","cm","mm","in","px","pt","pc","duration","s","ms","angle","rad","Math","PI","deg","grad","turn","colors","unitConversions","parent","visibilityBlocks","undefined","nodeVisible","rootNode","parsed","self","Object","defineProperty","get","fileInfo","getIndex","Node","nodes","set","node","Array","isArray","forEach","_index","_fileInfo","context","strs","genCSS","add","chunk","index","isEmpty","join","output","value","visitor","visit","op","a","b","precision","numPrecision","Number","toFixed","compare","extendStatics","d","setPrototypeOf","__proto__","p","__extends","__","constructor","prototype","create","__assign","assign","t","n","arguments","call","apply","rgb","originalForm","_super","_this","match","map","c","parseInt","alpha","split","Color","r","g","pow","toCSS","doNotCompress","color","colorFunction","compress","args","fround","indexOf","clamp","round","toHSL","h","l","toRGB","splitcolor","other","_operate","toHex","max","min","v","x","keyword","key","toLowerCase","slice","toString","Paren","eval","_noSpaceCombinators"," ","|","emptyOrWhitespace","trim","Combinator","spaceOrEmpty","combinator","isVariable","currentFileInfo","visibilityInfo","copyVisibilityInfo","setParent","Element","firstSelector","charAt","ALWAYS","PARENS_DIVISION","PARENS","RewriteUrls","getLocation","inputStream","line","column","copyArray","arr","copy","clone","obj","cloned","prop","defaults","obj1","obj2","newObj","_defaults","defaults_1","copyOptions","opts","strictMath","math","Constants.Math","relativeUrls","rewriteUrls","Constants.RewriteUrls","flattenArray","result","length_1","anonymousFunc","LessError","fileContentMap","currentFilename","message","stack","input","contents","loc","utils.getLocation","col","callLine","lines","found","func","Function","lineAdjust","callExtract","extract","F","stylize","str","errorTxt","substr","elements","extendList","condition","evaldCondition","getElements","mixinElements_","Selector","visitArray","newSelector","mediaEmpty","els","parseNode","err","imports","sels","olen","len","mixinElements","shift","extend","createDerived","Value","Keyword","True","False","mapLines","rulesetLike","allowRoot","Anonymous","Boolean","MATH","name","important","merge","inline","variable","Declaration","lastRule","prevMath","evaldValue","mathBypass","evalName","importantScope","importantResult","pop","ctx","lineSeparator","dumpLineNumbers","debugInfo","asComment","asMediaQuery","lineNumber","fileName","filenameWithProtocol","test","isLineComment","Comment","getDebugInfo","isCompressed","contexts","copyFromOriginal","original","destination","propertiesToCopy","parseCopyProperties","Parse","paths","evalCopyProperties","isPathRelative","path","isPathLocalRelative","Eval","frames","enterCalc","calcStack","inCalc","exitCalc","inParenthesis","parensStack","outOfParenthesis","mathOn","isMathOn","pathRequiresRewrite","rewritePath","rootpath","newPath","normalizePath","segment","segments","reverse","makeRegistry","base","_data","addMultiple","keys","getLocalFunctions","inherit","defaultFunc","value_","error_","reset","selectors","rules","strictImports","_lookups","_variables","_properties","Ruleset","selCnt","selector","hasVariable","hasOnePassingSelector","j","toParseSelectors","utils.flattenArray","rule","subRule","utils.copyArray","ruleset","originalRuleset","root","firstRoot","allowImports","functionRegistry","globalFunctionRegistry","ctxFrames","unshift","ctxSelectors","evalImports","rsRules","evalFirst","mediaBlockCount","mediaBlocks","filter","resetCache","isJustParentSelector","bubbleSelectors","importRules","makeImportant","lastSelector","_rulesets","reduce","hash","variables","vars","name_1","name_2","decl","parseValue","properties","toParse","transformDeclaration","nodes_1","filtRules","isRuleset","foundMixins","rulesets","find","ruleNodes","tabLevel","sep","tabRuleStr","tabSetStr","charsetNodeIndex","importNodeIndex","isCharset","pathCnt","pathSubCnt","currentLastRule","isRulesetLike","isVisible","joinSelector","createParenthesis","elementsToPak","originalElement","replacementParen","insideParent","createSelector","containedElement","element","addReplacementIntoPath","beginningPath","addPath","replacedElement","originalSelector","newSelectorPath","newJoinedSelector","parentEl","restOfPath","addAllReplacementsIntoPath","addPaths","mergeElementsOnToSelectors","sel","deriveSelector","deriveFrom","newPaths","replaceParentSelector","inSelector","k","currentElements","newSelectors","selectorsMultiplied","el","maybeSelector","hadParentSelector","nestedSelector","replaced","nestedPaths","replacedNewSelectors","concatenated","isRooted","createEmptySelectors","AtRule","outputRuleset","mediaPathBackup","mediaBlocksBackup","mediaPath","ruleCnt","DetachedRuleset","numerator","denominator","backupUnit","sort","Unit","strictUnits","returnStr","is","unitString","toUpperCase","RegExp","callback","group","mapUnit","groupName","atomicUnit","counter","count","unit","parseFloat","isNaN","Dimension","isSingular","strValue","String","isLength","convertTo","usedUnits","cancel","unify","numericCompare","conversions","targetUnit","applyUnit","derivedConversions","operands","isSpaced","Operation","toColor","operate","noSpacing","Expression","returnValue","parens","doubleParen","parensInOp","functionCaller","evalArgs","commentFilter","item","subNodes","il","jl","calc","Call","currentMathContext","funcCaller","FunctionCaller","isValid","columnNumber","Variable","evaluating","frame","fun","Property","property","mergeRules","less","visitors","ToCSSVisitor","_mergeRules","vArr","Attribute","content","escaped","quote","variableRegex","propRegex","Quoted","that","iterativeReplace","regexp","replacementFnc","evaluatedValue","val","isEvald","URL","urlArgs","features","Media","evalTop","evalNested","multiMedia","permute","fragment","rest","css","pathValue","getPath","Import","isPlugin","reference","containsVariables","doEval","blocksVisibility","addVisibilityBlock","registry","skip","importedFilename","newImport","evalPath","string","expression","JavaScript","evaluateJavaScript","JsEvalNode","evalContext","javascriptEnabled","jsify","toJS","Assignment","negate","lvalue","rvalue","Condition","UnicodeDescriptor","Negative","option","object_id","Extend","next_id","parent_ids","allowBefore","allowAfter","selectorElements","selfElements","selfSelectors","VariableCall","detachedRuleset","callEval","ruleCall","lookups","NamespaceValue","lastDeclaration","substring","params","variadic","arity","optionalParameters","required","Definition","mixinEnv","evaldArguments","varargs","arg","isNamedFound","argIndex","argsLength","prependRule","_arguments","mixinFrames","evalParams","allArgsCnt","requiredArgsCnt","MixinCall","mixins","mixin","mixinPath","argValue","f","isRecursive","isOneFound","candidate","defaultResult","noArgumentsFilter","candidates","conditionResult","calcDefGroup","namespace","matchCondition","expand","matchArgs","MixinDefinition","format","newRules","evalCall","_setVisibilityToReplacement","replacement","AbstractFileManager","lastIndexOf","ext","tryAppendExtension","basePath","laterPath","url","baseUrl","urlDirectories","baseUrlDirectories","urlParts","extractUrlParts","baseUrlParts","diff","hostPart","directories","urlPartsRegex","returner","rawDirectories","rawPath","fileUrl","require","AbstractPluginLoader","pluginOptions","pluginObj","localModule","shortname","FileManager","trySetOptions","use","exports","loader","tree","validatePlugin","minVersion","compareVersion","addPlugin","plugin","setOptions","version","versionToString","aVersion","bVersion","versionString","plugins","printUsage","_visitArgs","visitDeeper","_hasIndexed","_noop","implementation","_implementation","_visitInCache","_visitOutCache","indexNodeTypes","ticker","child","typeIndex","Visitor","nodeTypeIndex","fnName","impl","funcOut","visitArgs","newNode","isReplacing","cnt","accept","nonReplacing","out","evald","flatten","nestedCnt","nestedItem","onSequencerEmpty","variableImports","_onSequencerEmpty","_currentDepth","ImportSequencer","importSequencer","importItem","isReady","tryRun","variableImport","ImportVisitor","importer","finish","_visitor","_importer","_finish","importCount","onceFileDetectionMap","recursionDetector","_sequencer","run","isFinished","visitImport","importNode","inlineCSS","importParent","isVariableImport","addVariableImport","processImportNode","evaldImportNode","evalForImport","multiple","importMultiple","tryAppendLessExtension","onImported","sequencedOnImported","addImport","importedAtRoot","fullPath","importVisitor","isOptional","optional","duplicateImport","oldContext","visitDeclaration","declNode","visitDeclarationOut","visitAtRule","atRuleNode","visitAtRuleOut","visitMixinDefinition","mixinDefinitionNode","visitMixinDefinitionOut","visitRuleset","rulesetNode","visitRulesetOut","visitMedia","mediaNode","visitMediaOut","visible","SetTreeVisibilityVisitor","ensureVisibility","ensureInvisibility","allExtendsStack","ExtendFinderVisitor","allExtends","allSelectorsExtendList","extendOnEveryPath","selectorPath","selExtendList","allSelectorsExtend","foundExtends","findSelfSelectors","firstExtendOnThisSelectorPath","ProcessExtendsVisitor","extendFinder","extendIndices","doExtendChaining","newRoot","checkExtendsForNonMatched","indices","hasFoundMatches","extendsList","extendsListTarget","iterationCount","extendIndex","targetExtendIndex","matches","targetExtend","newExtend","extendsToAdd","extendVisitor","findMatch","selfSelector","extendSelector","extendChainCount","selectorOne","selectorTwo","ruleNode","selectorNode","pathIndex","selectorsToAdd","extendedSelectors","haystackSelectorPath","haystackSelectorIndex","hackstackSelector","hackstackElementIndex","haystackElement","targetCombinator","potentialMatch","needleElements","potentialMatches","matched","initialCombinator","isElementValuesEqual","finished","endPathIndex","endPathElementIndex","elementValue1","elementValue2","replacementSelector","matchIndex","firstElement","newElements","currentSelectorPathIndex","currentSelectorPathElementIndex","currentValue","derived","newAllExtends","lastIndex","JoinSelectorVisitor","getIsOutput","joinSelectors","_context","CSSVisitorUtils","bodyRules","isSilent","owner","thing","originalRules","containsSilentNonBlockedChild","compiledRulesBody","keepOnlyVisibleChilds","removeVisibilityBlock","hasVisibleSelector","utils","mixinNode","visitExtend","extendNode","visitComment","commentNode","resolveVisibility","visitAtRuleWithBody","visitAtRuleWithoutBody","visitAnonymous","anonymousNode","nodeRules","hasFakeRuleset","getBodyRules","charset","comment","checkValidNodes","isRoot","_compileRulesetPaths","nodeRuleCnt","_removeDuplicateRules","isVisibleRuleset","ruleList","ruleCache","ruleCSS","groups","groupsArr","result_1","space_1","comma_1","MarkVisibleSelectorsVisitor","ExtendVisitor","furthest","furthestPossibleErrorMessage","chunks","current","currentPos","saveStack","parserInput","skipWhitespace","nextChar","oldi","oldj","curr","endIndex","mem","inp","charCodeAt","autoCommentAbsorb","nextNewLine","text","commentStore","nextStarSlash","save","restore","possibleErrorMessage","state","forget","isWhitespace","offset","pos","code","$re","tok","exec","$char","$str","tokLength","$quoted","startChar","currentPosition","$parseUntil","testChar","returnVal","inComment","blockDepth","blockStack","parseGroups","startPos","lastPos","loop","char","expected","peek","peekChar","currentChar","prevChar","getInput","peekNotNumeric","start","chunkInput","failFunction","fail","lastOpening","lastOpeningParen","lastMultiComment","lastMultiCommentEndBrace","chunkerCurrentIndex","currentChunkStartIndex","cc","cc2","level","parenLevel","emitFrom","emitChunk","force","fromCharCode","chunker","end","furthestReachedEnd","furthestChar","Parser","parsers","getParserInput","expect","expectChar","parseList","currentIndex","returnNodes","parser","additionalData","globalVars","modifyVars","ignored","preText","serializeVars","preProcessors","getPreProcessors","process","banner","contentsIgnoredChars","primary","endInfo","processImports","extendRule","definition","declaration","variableCall","entities","atrule","foundSemiColon","mixinLookup","quoted","forceEscaped","isEscaped","fromKeyword","customFuncCall","stop","ieAlpha","boolean","if","prevArgs","isSemiColonSeparated","argsComma","argsSemiColon","assignment","literal","dimension","unicodeDescriptor","entity","ch","variableCurly","curly","propertyCurly","colorKeyword","ud","javascript","js","escape","parsedName","inValue","ruleLookups","isRule","getLookup","hasParens","elem","elemIndex","re","isCall","expressionContainsNamed","nameLoop","expressions","hasSep","throwAwayComments","cond","argInfo","conditions","block","lookupValue","attribute","slashedCombinator","isLess","when","blockRuleset","hasDR","ruleProperty","permissiveValue","anonymousValue","untilTokens","done","testCurrentChar","import","dir","importOptions","mediaFeatures","o","optionName","importOption","mediaFeature","pluginArgs","nonVendorSpecificName","hasIdentifier","hasExpression","hasUnknown","hasBlock","sub","addition","multiplication","operation","operand","needsParens","logical","next","conditionAnd","negatedCondition","parenthesisCondition","atomicCondition","body","me","tryConditionFollowedByParenthesis","delim","simpleProperty","If","trueValue","falseValue","colorFunctions","hsla","origColor","hsl","toHSV","number","rgba","size","m1_1","m2_1","hue","hsv","hsva","vs","floor","perm","saturation","lightness","hsvhue","hsvsaturation","hsvvalue","luma","luminance","saturate","amount","method","desaturate","lighten","darken","fadein","fadeout","fade","spin","mix","color1","color2","weight","w","w1","w2","greyscale","contrast","dark","light","threshold","argb","toARGB","tint","shade","colorBlend","mode","cb","cs","ar","cr","ab","as","colorBlendModeFunctions","multiply","screen","overlay","softlight","sqrt","hardlight","difference","abs","exclusion","average","negation","getItemsFromNode","_SELF","~","_i","expr","values","range","step","from","to","stepValue","list","each","rs","iterator","tryEval","Quote","valueName","keyName","indexName","MathHelper","fn","mathFunctions","ceil","sin","cos","atan","asin","acos","mathHelper","fraction","num","minMax","isMin","currentUnified","referenceUnified","unitStatic","unitClone","order","convert","pi","mod","y","percentage","evaluated","encodeURI","pattern","flags","%","token","encodeURIComponent","isa","Type","isunit","isruleset","iscolor","isnumber","isstring","iskeyword","isurl","ispixel","ispercentage","isem","get-unit","colorBlending","fallback","functionThis","data-uri","mimetypeNode","filePathNode","mimetype","filePath","entryPath","fragmentStart","utils.clone","rawBuffer","getFileManager","useBase64","mimeLookup","charsetLookup","fileSync","loadFileSync","buf","encodeBase64","uri","dataUri","svg-gradient","direction","stops","gradientDirectionSvg","position","positionValue","gradientType","rectangleDimension","renderEnv","directionValue","throwArgumentDescriptor","types","evaldRoot","evalEnv","visitorIterator","preEvalVisitors","first","isPreEvalVisitor","isPreVisitor","pm","postProcessors","installedPlugins","pluginCache","Loader","PluginLoader","PluginManager","install","preProcessor","priority","indexToInsertAt","postProcessor","manager","PluginManagerFactory","newFactory","sourceMapOutput","sourceMapBuilder","parseTree","importManager","SourceMapBuilder","ParseTree","transformTree","toCSSOptions","sourceMap","getPostProcessors","file","getExternalSourceMap","files","rootFilename","SourceMapOutput","contentsIgnoredCharsMap","contentsMap","sourceMapFilename","sourceMapURL","outputFilename","sourceMapOutputFilename","sourceMapBasepath","sourceMapRootpath","outputSourceFiles","sourceMapGenerator","sourceMapFileInline","disableSourcemapAnnotation","sourceMapInputFilename","normalizeFilename","removeBasepath","getCSSAppendage","_css","_rootNode","_contentsMap","_contentsIgnoredCharsMap","_sourceMapFilename","_outputFilename","_sourceMapBasepath","_sourceMapRootpath","_outputSourceFiles","_sourceMapGeneratorConstructor","getSourceMapGenerator","_lineNumber","_column","sourceLines","columns","sourceColumns","inputSource","_sourceMapGenerator","addMapping","generated","source","sourceRoot","setSourceContent","sourceMapContent","stringify","toJSON","rootFileInfo","mime","queue","ImportManager","pluginLoader","fileParsedFunc","importedEqualsRoot","newFileInfo","loadedFile","promise","loadFileCallback","resolvedFilename","pathDiff","isPathAbsolute","alwaysMakePathsAbsolute","newEnv","evalPlugin","syncImport","loadPluginSync","loadPlugin","loadFile","then","render","utils.copyOptions","self_1","Promise","resolve","reject","Render","context_1","pluginManager_1","reUsePluginManager","imports_1","evalResult","fileContent","initial","data","ctor","api","fileCache","errback","xhr","XMLHttpRequest","async","isFileProtocol","fileAsync","handleResponse","status","responseText","getResponseHeader","overrideMimeType","open","setRequestHeader","send","onreadystatechange","readyState","location","useFileCache","lessText","webInfo","lastModified","Date","doXHR","log","fulfill","catch","rootHref","errorReporting","errors","errorline","classname","logLevel","errorConsole","timer","filenameNoPath","className","innerHTML","browser","style","env","setInterval","replaceChild","clearInterval","errorHTML","remove","removeErrorHTML","depends","lint","insecure","protocol","poll","hostname","port","onReady","addDefaultOptions","LESS_PLUGINS","lessRoot","FM","addFileManager","loggers","console","LogListener","ErrorReporting","cache","localStorage","setCSS","setItem","getCSS","getItem","timestamp","valueOf","Cache","imageSize","imageFunctions","image-size","image-width","image-height","ImageSize","typePattern","thisArg","curryArgs","loadStyles","instanceOptions","loadStyleSheet","reload","remaining","local","loadInitialFileCallback","loadStyleSheets","sheets","watch","watchMode","watchTimer","clearFileCache","unwatch","registerStylesheetsImmediately","links","rel","registerStylesheets","record","refresh","startTime","endTime","totalMilliseconds","remainingSheets","refreshStyles","resolveOrReject","pageLoadFinished"],"mappings":"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"} \ No newline at end of file From b2049010b387ae69abf4e656a415b1affb2e89d7 Mon Sep 17 00:00:00 2001 From: Matthew Dean Date: Sat, 5 Dec 2020 14:31:26 -0800 Subject: [PATCH 14/19] Remove non-performant class pattern --- .vscode/launch.json | 10 +- dist/less.js | 1878 ++++++++--------- dist/less.min.js | 4 +- dist/less.min.js.map | 2 +- packages/less/benchmark/benchmark.less | 64 +- packages/less/benchmark/index.js | 4 +- packages/less/dist/less.js | 1878 ++++++++--------- packages/less/dist/less.min.js | 4 +- packages/less/dist/less.min.js.map | 2 +- .../less/src/less-browser/file-manager.js | 15 +- .../less/src/less-browser/plugin-loader.js | 14 +- packages/less/src/less-node/file-manager.js | 11 +- packages/less/src/less-node/plugin-loader.js | 36 +- .../less/src/less-node/url-file-manager.js | 7 +- packages/less/src/less/tree/anonymous.js | 35 +- packages/less/src/less/tree/assignment.js | 19 +- packages/less/src/less/tree/atrule.js | 86 +- packages/less/src/less/tree/attribute.js | 21 +- packages/less/src/less/tree/call.js | 26 +- packages/less/src/less/tree/color.js | 118 +- packages/less/src/less/tree/combinator.js | 26 +- packages/less/src/less/tree/comment.js | 23 +- packages/less/src/less/tree/condition.js | 23 +- packages/less/src/less/tree/declaration.js | 59 +- .../less/src/less/tree/detached-ruleset.js | 23 +- packages/less/src/less/tree/dimension.js | 39 +- packages/less/src/less/tree/element.js | 47 +- packages/less/src/less/tree/expression.js | 27 +- packages/less/src/less/tree/extend.js | 58 +- packages/less/src/less/tree/import.js | 59 +- packages/less/src/less/tree/javascript.js | 19 +- packages/less/src/less/tree/js-eval-node.js | 8 +- packages/less/src/less/tree/keyword.js | 14 +- packages/less/src/less/tree/media.js | 47 +- packages/less/src/less/tree/mixin-call.js | 33 +- .../less/src/less/tree/mixin-definition.js | 71 +- .../less/src/less/tree/namespace-value.js | 19 +- packages/less/src/less/tree/negative.js | 15 +- packages/less/src/less/tree/operation.js | 21 +- packages/less/src/less/tree/paren.js | 15 +- packages/less/src/less/tree/property.js | 19 +- packages/less/src/less/tree/quoted.js | 33 +- packages/less/src/less/tree/ruleset.js | 74 +- packages/less/src/less/tree/selector.js | 49 +- .../less/src/less/tree/unicode-descriptor.js | 12 +- packages/less/src/less/tree/unit.js | 45 +- packages/less/src/less/tree/url.js | 32 +- packages/less/src/less/tree/value.js | 33 +- packages/less/src/less/tree/variable-call.js | 19 +- packages/less/src/less/tree/variable.js | 19 +- packages/less/tsconfig.json | 1 + 51 files changed, 2423 insertions(+), 2793 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index eb8e414cf..ffba4697a 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -3,7 +3,7 @@ // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", - "configurations": [ + "configurations": [ { "type": "node", "request": "launch", @@ -11,6 +11,14 @@ "program": "${workspaceFolder}/packages/less/test/index.js", "cwd": "${workspaceFolder}/packages/less", "console": "integratedTerminal" + }, + { + "type": "node", + "request": "launch", + "name": "Benchmark test", + "program": "${workspaceFolder}/packages/less/benchmark/index.js", + "cwd": "${workspaceFolder}/packages/less", + "console": "integratedTerminal" } ] } \ No newline at end of file diff --git a/dist/less.js b/dist/less.js index 3d7366530..f5e33a44c 100644 --- a/dist/less.js +++ b/dist/less.js @@ -1,5 +1,5 @@ /** - * Less - Leaner CSS v4.0.1-alpha.0+70e242c5 + * Less - Leaner CSS v4.0.0 * http://lesscss.org * * Copyright (c) 2009-2020, Alexis Sellier @@ -608,111 +608,60 @@ return Node; }()); - /*! ***************************************************************************** - Copyright (c) Microsoft Corporation. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, - INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR - OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. - ***************************************************************************** */ - /* global Reflect, Promise */ - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) - if (b.hasOwnProperty(p)) - d[p] = b[p]; }; - return extendStatics(d, b); - }; - function __extends(d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - } - var __assign = function () { - __assign = Object.assign || function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) - if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); - }; - function __spreadArrays() { - for (var s = 0, i = 0, il = arguments.length; i < il; i++) - s += arguments[i].length; - for (var r = Array(s), k = 0, i = 0; i < il; i++) - for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) - r[k] = a[j]; - return r; - } - // // RGB Colors - #ff0014, #eee // - var Color = /** @class */ (function (_super) { - __extends(Color, _super); - function Color(rgb, a, originalForm) { - var _this = _super.call(this) || this; - var self = _this; - // - // The end goal here, is to parse the arguments - // into an integer triplet, such as `128, 255, 0` - // - // This facilitates operations and conversions. - // - if (Array.isArray(rgb)) { - _this.rgb = rgb; - } - else if (rgb.length >= 6) { - _this.rgb = []; - rgb.match(/.{2}/g).map(function (c, i) { - if (i < 3) { - self.rgb.push(parseInt(c, 16)); - } - else { - self.alpha = (parseInt(c, 16)) / 255; - } - }); - } - else { - _this.rgb = []; - rgb.split('').map(function (c, i) { - if (i < 3) { - self.rgb.push(parseInt(c + c, 16)); - } - else { - self.alpha = (parseInt(c + c, 16)) / 255; - } - }); - } - _this.alpha = _this.alpha || (typeof a === 'number' ? a : 1); - if (typeof originalForm !== 'undefined') { - _this.value = originalForm; - } - return _this; + var Color = function (rgb, a, originalForm) { + var self = this; + // + // The end goal here, is to parse the arguments + // into an integer triplet, such as `128, 255, 0` + // + // This facilitates operations and conversions. + // + if (Array.isArray(rgb)) { + this.rgb = rgb; + } + else if (rgb.length >= 6) { + this.rgb = []; + rgb.match(/.{2}/g).map(function (c, i) { + if (i < 3) { + self.rgb.push(parseInt(c, 16)); + } + else { + self.alpha = (parseInt(c, 16)) / 255; + } + }); + } + else { + this.rgb = []; + rgb.split('').map(function (c, i) { + if (i < 3) { + self.rgb.push(parseInt(c + c, 16)); + } + else { + self.alpha = (parseInt(c + c, 16)) / 255; + } + }); } - Color.prototype.luma = function () { + this.alpha = this.alpha || (typeof a === 'number' ? a : 1); + if (typeof originalForm !== 'undefined') { + this.value = originalForm; + } + }; + Color.prototype = Object.assign(new Node(), { + type: 'Color', + luma: function () { var r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255; r = (r <= 0.03928) ? r / 12.92 : Math.pow(((r + 0.055) / 1.055), 2.4); g = (g <= 0.03928) ? g / 12.92 : Math.pow(((g + 0.055) / 1.055), 2.4); b = (b <= 0.03928) ? b / 12.92 : Math.pow(((b + 0.055) / 1.055), 2.4); return 0.2126 * r + 0.7152 * g + 0.0722 * b; - }; - Color.prototype.genCSS = function (context, output) { + }, + genCSS: function (context, output) { output.add(this.toCSS(context)); - }; - Color.prototype.toCSS = function (context, doNotCompress) { + }, + toCSS: function (context, doNotCompress) { var compress = context && context.compress && !doNotCompress; var color; var alpha; @@ -774,25 +723,25 @@ } } return color; - }; + }, // // Operations have to be done per-channel, if not, // channels will spill onto each other. Once we have // our result, in the form of an integer triplet, // we create a new Color node to hold the result. // - Color.prototype.operate = function (context, op, other) { + operate: function (context, op, other) { var rgb = new Array(3); var alpha = this.alpha * (1 - other.alpha) + other.alpha; for (var c = 0; c < 3; c++) { rgb[c] = this._operate(context, op, this.rgb[c], other.rgb[c]); } return new Color(rgb, alpha); - }; - Color.prototype.toRGB = function () { + }, + toRGB: function () { return toHex(this.rgb); - }; - Color.prototype.toHSL = function () { + }, + toHSL: function () { var r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha; var max = Math.max(r, g, b), min = Math.min(r, g, b); var h; @@ -818,9 +767,9 @@ h /= 6; } return { h: h * 360, s: s, l: l, a: a }; - }; + }, // Adapted from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript - Color.prototype.toHSV = function () { + toHSV: function () { var r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha; var max = Math.max(r, g, b), min = Math.min(r, g, b); var h; @@ -851,34 +800,32 @@ h /= 6; } return { h: h * 360, s: s, v: v, a: a }; - }; - Color.prototype.toARGB = function () { + }, + toARGB: function () { return toHex([this.alpha * 255].concat(this.rgb)); - }; - Color.prototype.compare = function (x) { + }, + compare: function (x) { return (x.rgb && x.rgb[0] === this.rgb[0] && x.rgb[1] === this.rgb[1] && x.rgb[2] === this.rgb[2] && x.alpha === this.alpha) ? 0 : undefined; - }; - Color.fromKeyword = function (keyword) { - var c; - var key = keyword.toLowerCase(); - if (colors.hasOwnProperty(key)) { - c = new Color(colors[key].slice(1)); - } - else if (key === 'transparent') { - c = new Color([0, 0, 0], 0); - } - if (c) { - c.value = keyword; - return c; - } - }; - return Color; - }(Node)); - Color.prototype.type = 'Color'; + } + }); + Color.fromKeyword = function (keyword) { + var c; + var key = keyword.toLowerCase(); + if (colors.hasOwnProperty(key)) { + c = new Color(colors[key].slice(1)); + } + else if (key === 'transparent') { + c = new Color([0, 0, 0], 0); + } + if (c) { + c.value = keyword; + return c; + } + }; function clamp(v, max) { return Math.min(Math.max(v, 0), max); } @@ -889,91 +836,81 @@ }).join(''); } - var Paren = /** @class */ (function (_super) { - __extends(Paren, _super); - function Paren(node) { - var _this = _super.call(this) || this; - _this.value = node; - return _this; - } - Paren.prototype.genCSS = function (context, output) { + var Paren = function (node) { + this.value = node; + }; + Paren.prototype = Object.assign(new Node(), { + type: 'Paren', + genCSS: function (context, output) { output.add('('); this.value.genCSS(context, output); output.add(')'); - }; - Paren.prototype.eval = function (context) { + }, + eval: function (context) { return new Paren(this.value.eval(context)); - }; - return Paren; - }(Node)); - Paren.prototype.type = 'Paren'; + } + }); var _noSpaceCombinators = { '': true, ' ': true, '|': true }; - var Combinator = /** @class */ (function (_super) { - __extends(Combinator, _super); - function Combinator(value) { - var _this = _super.call(this) || this; - if (value === ' ') { - _this.value = ' '; - _this.emptyOrWhitespace = true; - } - else { - _this.value = value ? value.trim() : ''; - _this.emptyOrWhitespace = _this.value === ''; - } - return _this; + var Combinator = function (value) { + if (value === ' ') { + this.value = ' '; + this.emptyOrWhitespace = true; } - Combinator.prototype.genCSS = function (context, output) { + else { + this.value = value ? value.trim() : ''; + this.emptyOrWhitespace = this.value === ''; + } + }; + Combinator.prototype = Object.assign(new Node(), { + type: 'Combinator', + genCSS: function (context, output) { var spaceOrEmpty = (context.compress || _noSpaceCombinators[this.value]) ? '' : ' '; output.add(spaceOrEmpty + this.value + spaceOrEmpty); - }; - return Combinator; - }(Node)); - Combinator.prototype.type = 'Combinator'; + } + }); - var Element = /** @class */ (function (_super) { - __extends(Element, _super); - function Element(combinator, value, isVariable, index, currentFileInfo, visibilityInfo) { - var _this = _super.call(this) || this; - _this.combinator = combinator instanceof Combinator ? - combinator : new Combinator(combinator); - if (typeof value === 'string') { - _this.value = value.trim(); - } - else if (value) { - _this.value = value; - } - else { - _this.value = ''; - } - _this.isVariable = isVariable; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.copyVisibilityInfo(visibilityInfo); - _this.setParent(_this.combinator, _this); - return _this; + var Element = function (combinator, value, isVariable, index, currentFileInfo, visibilityInfo) { + this.combinator = combinator instanceof Combinator ? + combinator : new Combinator(combinator); + if (typeof value === 'string') { + this.value = value.trim(); } - Element.prototype.accept = function (visitor) { + else if (value) { + this.value = value; + } + else { + this.value = ''; + } + this.isVariable = isVariable; + this._index = index; + this._fileInfo = currentFileInfo; + this.copyVisibilityInfo(visibilityInfo); + this.setParent(this.combinator, this); + }; + Element.prototype = Object.assign(new Node(), { + type: 'Element', + accept: function (visitor) { var value = this.value; this.combinator = visitor.visit(this.combinator); if (typeof value === 'object') { this.value = visitor.visit(value); } - }; - Element.prototype.eval = function (context) { + }, + eval: function (context) { return new Element(this.combinator, this.value.eval ? this.value.eval(context) : this.value, this.isVariable, this.getIndex(), this.fileInfo(), this.visibilityInfo()); - }; - Element.prototype.clone = function () { + }, + clone: function () { return new Element(this.combinator, this.value, this.isVariable, this.getIndex(), this.fileInfo(), this.visibilityInfo()); - }; - Element.prototype.genCSS = function (context, output) { + }, + genCSS: function (context, output) { output.add(this.toCSS(context), this.fileInfo(), this.getIndex()); - }; - Element.prototype.toCSS = function (context) { + }, + toCSS: function (context) { context = context || {}; var value = this.value; var firstSelector = context.firstSelector; @@ -990,10 +927,43 @@ else { return this.combinator.toCSS(context) + value; } + } + }); + + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + ***************************************************************************** */ + var __assign = function () { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; }; - return Element; - }(Node)); - Element.prototype.type = 'Element'; + return __assign.apply(this, arguments); + }; + function __spreadArrays() { + for (var s = 0, i = 0, il = arguments.length; i < il; i++) + s += arguments[i].length; + for (var r = Array(s), k = 0, i = 0; i < il; i++) + for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) + r[k] = a[j]; + return r; + } var Math$1 = { ALWAYS: 0, @@ -1267,22 +1237,20 @@ return message; }; - var Selector = /** @class */ (function (_super) { - __extends(Selector, _super); - function Selector(elements, extendList, condition, index, currentFileInfo, visibilityInfo) { - var _this = _super.call(this) || this; - _this.extendList = extendList; - _this.condition = condition; - _this.evaldCondition = !condition; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.elements = _this.getElements(elements); - _this.mixinElements_ = undefined; - _this.copyVisibilityInfo(visibilityInfo); - _this.setParent(_this.elements, _this); - return _this; - } - Selector.prototype.accept = function (visitor) { + var Selector = function (elements, extendList, condition, index, currentFileInfo, visibilityInfo) { + this.extendList = extendList; + this.condition = condition; + this.evaldCondition = !condition; + this._index = index; + this._fileInfo = currentFileInfo; + this.elements = this.getElements(elements); + this.mixinElements_ = undefined; + this.copyVisibilityInfo(visibilityInfo); + this.setParent(this.elements, this); + }; + Selector.prototype = Object.assign(new Node(), { + type: 'Selector', + accept: function (visitor) { if (this.elements) { this.elements = visitor.visitArray(this.elements); } @@ -1292,15 +1260,15 @@ if (this.condition) { this.condition = visitor.visit(this.condition); } - }; - Selector.prototype.createDerived = function (elements, extendList, evaldCondition) { + }, + createDerived: function (elements, extendList, evaldCondition) { elements = this.getElements(elements); var newSelector = new Selector(elements, extendList || this.extendList, null, this.getIndex(), this.fileInfo(), this.visibilityInfo()); newSelector.evaldCondition = (evaldCondition != null) ? evaldCondition : this.evaldCondition; newSelector.mediaEmpty = this.mediaEmpty; return newSelector; - }; - Selector.prototype.getElements = function (els) { + }, + getElements: function (els) { if (!els) { return [new Element('', '&', false, this._index, this._fileInfo)]; } @@ -1316,13 +1284,13 @@ }); } return els; - }; - Selector.prototype.createEmptySelectors = function () { + }, + createEmptySelectors: function () { var el = new Element('', '&', false, this._index, this._fileInfo), sels = [new Selector([el], null, null, this._index, this._fileInfo)]; sels[0].mediaEmpty = true; return sels; - }; - Selector.prototype.match = function (other) { + }, + match: function (other) { var elements = this.elements; var len = elements.length; var olen; @@ -1340,8 +1308,8 @@ } } return olen; // return number of matched elements - }; - Selector.prototype.mixinElements = function () { + }, + mixinElements: function () { if (this.mixinElements_) { return this.mixinElements_; } @@ -1357,22 +1325,22 @@ elements = []; } return (this.mixinElements_ = elements); - }; - Selector.prototype.isJustParentSelector = function () { + }, + isJustParentSelector: function () { return !this.mediaEmpty && this.elements.length === 1 && this.elements[0].value === '&' && (this.elements[0].combinator.value === ' ' || this.elements[0].combinator.value === ''); - }; - Selector.prototype.eval = function (context) { + }, + eval: function (context) { var evaldCondition = this.condition && this.condition.eval(context); var elements = this.elements; var extendList = this.extendList; elements = elements && elements.map(function (e) { return e.eval(context); }); extendList = extendList && extendList.map(function (extend) { return extend.eval(context); }); return this.createDerived(elements, extendList, evaldCondition); - }; - Selector.prototype.genCSS = function (context, output) { + }, + genCSS: function (context, output) { var i, element; if ((!context || !context.firstSelector) && this.elements[0].combinator.value === '') { output.add(' ', this.fileInfo(), this.getIndex()); @@ -1381,35 +1349,31 @@ element = this.elements[i]; element.genCSS(context, output); } - }; - Selector.prototype.getIsOutput = function () { + }, + getIsOutput: function () { return this.evaldCondition; - }; - return Selector; - }(Node)); - Selector.prototype.type = 'Selector'; + } + }); - var Value = /** @class */ (function (_super) { - __extends(Value, _super); - function Value(value) { - var _this = _super.call(this) || this; - if (!value) { - throw new Error('Value requires an array argument'); - } - if (!Array.isArray(value)) { - _this.value = [value]; - } - else { - _this.value = value; - } - return _this; + var Value = function (value) { + if (!value) { + throw new Error('Value requires an array argument'); } - Value.prototype.accept = function (visitor) { + if (!Array.isArray(value)) { + this.value = [value]; + } + else { + this.value = value; + } + }; + Value.prototype = Object.assign(new Node(), { + type: 'Value', + accept: function (visitor) { if (this.value) { this.value = visitor.visitArray(this.value); } - }; - Value.prototype.eval = function (context) { + }, + eval: function (context) { if (this.value.length === 1) { return this.value[0].eval(context); } @@ -1418,8 +1382,8 @@ return v.eval(context); })); } - }; - Value.prototype.genCSS = function (context, output) { + }, + genCSS: function (context, output) { var i; for (i = 0; i < this.value.length; i++) { this.value[i].genCSS(context, output); @@ -1427,81 +1391,79 @@ output.add((context && context.compress) ? ',' : ', '); } } - }; - return Value; - }(Node)); - Value.prototype.type = 'Value'; + } + }); - var Keyword = /** @class */ (function (_super) { - __extends(Keyword, _super); - function Keyword(value) { - var _this = _super.call(this) || this; - _this.value = value; - return _this; - } - Keyword.prototype.genCSS = function (context, output) { + var Keyword = function (value) { + this.value = value; + }; + Keyword.prototype = Object.assign(new Node(), { + type: 'Keyword', + genCSS: function (context, output) { if (this.value === '%') { throw { type: 'Syntax', message: 'Invalid % without number' }; } output.add(this.value); - }; - return Keyword; - }(Node)); - Keyword.prototype.type = 'Keyword'; + } + }); Keyword.True = new Keyword('true'); Keyword.False = new Keyword('false'); - var Anonymous = /** @class */ (function (_super) { - __extends(Anonymous, _super); - function Anonymous(value, index, currentFileInfo, mapLines, rulesetLike, visibilityInfo) { - var _this = _super.call(this) || this; - _this.value = value; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.mapLines = mapLines; - _this.rulesetLike = (typeof rulesetLike === 'undefined') ? false : rulesetLike; - _this.allowRoot = true; - _this.copyVisibilityInfo(visibilityInfo); - return _this; - } - Anonymous.prototype.eval = function () { + var Anonymous = function (value, index, currentFileInfo, mapLines, rulesetLike, visibilityInfo) { + this.value = value; + this._index = index; + this._fileInfo = currentFileInfo; + this.mapLines = mapLines; + this.rulesetLike = (typeof rulesetLike === 'undefined') ? false : rulesetLike; + this.allowRoot = true; + this.copyVisibilityInfo(visibilityInfo); + }; + Anonymous.prototype = Object.assign(new Node(), { + type: 'Anonymous', + eval: function () { return new Anonymous(this.value, this._index, this._fileInfo, this.mapLines, this.rulesetLike, this.visibilityInfo()); - }; - Anonymous.prototype.compare = function (other) { + }, + compare: function (other) { return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined; - }; - Anonymous.prototype.isRulesetLike = function () { + }, + isRulesetLike: function () { return this.rulesetLike; - }; - Anonymous.prototype.genCSS = function (context, output) { + }, + genCSS: function (context, output) { this.nodeVisible = Boolean(this.value); if (this.nodeVisible) { output.add(this.value, this._fileInfo, this._index, this.mapLines); } - }; - return Anonymous; - }(Node)); - Anonymous.prototype.type = 'Anonymous'; + } + }); var MATH = Math$1; - var Declaration = /** @class */ (function (_super) { - __extends(Declaration, _super); - function Declaration(name, value, important, merge, index, currentFileInfo, inline, variable) { - var _this = _super.call(this) || this; - _this.name = name; - _this.value = (value instanceof Node) ? value : new Value([value ? new Anonymous(value) : null]); - _this.important = important ? " " + important.trim() : ''; - _this.merge = merge; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.inline = inline || false; - _this.variable = (variable !== undefined) ? variable - : (name.charAt && (name.charAt(0) === '@')); - _this.allowRoot = true; - _this.setParent(_this.value, _this); - return _this; - } - Declaration.prototype.genCSS = function (context, output) { + function evalName(context, name) { + var value = ''; + var i; + var n = name.length; + var output = { add: function (s) { value += s; } }; + for (i = 0; i < n; i++) { + name[i].eval(context).genCSS(context, output); + } + return value; + } + var Declaration = function (name, value, important, merge, index, currentFileInfo, inline, variable) { + this.name = name; + this.value = (value instanceof Node) ? value : new Value([value ? new Anonymous(value) : null]); + this.important = important ? " " + important.trim() : ''; + this.merge = merge; + this._index = index; + this._fileInfo = currentFileInfo; + this.inline = inline || false; + this.variable = (variable !== undefined) ? variable + : (name.charAt && (name.charAt(0) === '@')); + this.allowRoot = true; + this.setParent(this.value, this); + }; + Declaration.prototype = Object.assign(new Node(), { + type: 'Declaration', + genCSS: function (context, output) { output.add(this.name + (context.compress ? ':' : ': '), this.fileInfo(), this.getIndex()); try { this.value.genCSS(context, output); @@ -1512,8 +1474,8 @@ throw e; } output.add(this.important + ((this.inline || (context.lastRule && context.compress)) ? '' : ';'), this._fileInfo, this._index); - }; - Declaration.prototype.eval = function (context) { + }, + eval: function (context) { var mathBypass = false, prevMath, name = this.name, evaldValue, variable = this.variable; if (typeof name !== 'string') { // expand 'primitive' name directly to get @@ -1554,23 +1516,11 @@ context.math = prevMath; } } - }; - Declaration.prototype.makeImportant = function () { + }, + makeImportant: function () { return new Declaration(this.name, this.value, '!important', this.merge, this.getIndex(), this.fileInfo(), this.inline); - }; - return Declaration; - }(Node)); - function evalName(context, name) { - var value = ''; - var i; - var n = name.length; - var output = { add: function (s) { value += s; } }; - for (i = 0; i < n; i++) { - name[i].eval(context).genCSS(context, output); } - return value; - } - Declaration.prototype.type = 'Declaration'; + }); var debugInfo = /** @class */ (function () { function debugInfo(context, ctx, lineSeparator) { @@ -1608,30 +1558,26 @@ return debugInfo; }()); - var Comment = /** @class */ (function (_super) { - __extends(Comment, _super); - function Comment(value, isLineComment, index, currentFileInfo) { - var _this = _super.call(this) || this; - _this.value = value; - _this.isLineComment = isLineComment; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.allowRoot = true; - return _this; - } - Comment.prototype.genCSS = function (context, output) { + var Comment = function (value, isLineComment, index, currentFileInfo) { + this.value = value; + this.isLineComment = isLineComment; + this._index = index; + this._fileInfo = currentFileInfo; + this.allowRoot = true; + }; + Comment.prototype = Object.assign(new Node(), { + type: 'Comment', + genCSS: function (context, output) { if (this.debugInfo) { output.add(debugInfo(context, this), this.fileInfo(), this.getIndex()); } output.add(this.value); - }; - Comment.prototype.isSilent = function (context) { + }, + isSilent: function (context) { var isCompressed = context.compress && this.value[2] !== '!'; return this.isLineComment || isCompressed; - }; - return Comment; - }(Node)); - Comment.prototype.type = 'Comment'; + } + }); var contexts = {}; var copyFromOriginal = function copyFromOriginal(original, destination, propertiesToCopy) { @@ -1831,24 +1777,23 @@ } }; - var Ruleset = /** @class */ (function (_super) { - __extends(Ruleset, _super); - function Ruleset(selectors, rules, strictImports, visibilityInfo) { - var _this = _super.call(this) || this; - _this.selectors = selectors; - _this.rules = rules; - _this._lookups = {}; - _this._variables = null; - _this._properties = null; - _this.strictImports = strictImports; - _this.copyVisibilityInfo(visibilityInfo); - _this.allowRoot = true; - _this.setParent(_this.selectors, _this); - _this.setParent(_this.rules, _this); - return _this; - } - Ruleset.prototype.isRulesetLike = function () { return true; }; - Ruleset.prototype.accept = function (visitor) { + var Ruleset = function (selectors, rules, strictImports, visibilityInfo) { + this.selectors = selectors; + this.rules = rules; + this._lookups = {}; + this._variables = null; + this._properties = null; + this.strictImports = strictImports; + this.copyVisibilityInfo(visibilityInfo); + this.allowRoot = true; + this.setParent(this.selectors, this); + this.setParent(this.rules, this); + }; + Ruleset.prototype = Object.assign(new Node(), { + type: 'Ruleset', + isRuleset: true, + isRulesetLike: function () { return true; }, + accept: function (visitor) { if (this.paths) { this.paths = visitor.visitArray(this.paths, true); } @@ -1858,8 +1803,8 @@ if (this.rules && this.rules.length) { this.rules = visitor.visitArray(this.rules); } - }; - Ruleset.prototype.eval = function (context) { + }, + eval: function (context) { var selectors; var selCnt; var selector; @@ -2016,8 +1961,8 @@ } } return ruleset; - }; - Ruleset.prototype.evalImports = function (context) { + }, + evalImports: function (context) { var rules = this.rules; var i; var importRules; @@ -2037,8 +1982,8 @@ this.resetCache(); } } - }; - Ruleset.prototype.makeImportant = function () { + }, + makeImportant: function () { var result = new Ruleset(this.selectors, this.rules.map(function (r) { if (r.makeImportant) { return r.makeImportant(); @@ -2048,12 +1993,12 @@ } }), this.strictImports, this.visibilityInfo()); return result; - }; - Ruleset.prototype.matchArgs = function (args) { + }, + matchArgs: function (args) { return !args || args.length === 0; - }; + }, // lets you call a css selector with a guard - Ruleset.prototype.matchCondition = function (args, context) { + matchCondition: function (args, context) { var lastSelector = this.selectors[this.selectors.length - 1]; if (!lastSelector.evaldCondition) { return false; @@ -2063,14 +2008,14 @@ return false; } return true; - }; - Ruleset.prototype.resetCache = function () { + }, + resetCache: function () { this._rulesets = null; this._variables = null; this._properties = null; this._lookups = {}; - }; - Ruleset.prototype.variables = function () { + }, + variables: function () { if (!this._variables) { this._variables = !this.rules ? {} : this.rules.reduce(function (hash, r) { if (r instanceof Declaration && r.variable === true) { @@ -2091,8 +2036,8 @@ }, {}); } return this._variables; - }; - Ruleset.prototype.properties = function () { + }, + properties: function () { if (!this._properties) { this._properties = !this.rules ? {} : this.rules.reduce(function (hash, r) { if (r instanceof Declaration && r.variable !== true) { @@ -2110,28 +2055,28 @@ }, {}); } return this._properties; - }; - Ruleset.prototype.variable = function (name) { + }, + variable: function (name) { var decl = this.variables()[name]; if (decl) { return this.parseValue(decl); } - }; - Ruleset.prototype.property = function (name) { + }, + property: function (name) { var decl = this.properties()[name]; if (decl) { return this.parseValue(decl); } - }; - Ruleset.prototype.lastDeclaration = function () { + }, + lastDeclaration: function () { for (var i = this.rules.length; i > 0; i--) { var decl = this.rules[i - 1]; if (decl instanceof Declaration) { return this.parseValue(decl); } } - }; - Ruleset.prototype.parseValue = function (toParse) { + }, + parseValue: function (toParse) { var self = this; function transformDeclaration(decl) { if (decl.value instanceof Anonymous && !decl.parsed) { @@ -2166,8 +2111,8 @@ }); return nodes_1; } - }; - Ruleset.prototype.rulesets = function () { + }, + rulesets: function () { if (!this.rules) { return []; } @@ -2181,8 +2126,8 @@ } } return filtRules; - }; - Ruleset.prototype.prependRule = function (rule) { + }, + prependRule: function (rule) { var rules = this.rules; if (rules) { rules.unshift(rule); @@ -2191,8 +2136,8 @@ this.rules = [rule]; } this.setParent(rule, this); - }; - Ruleset.prototype.find = function (selector, self, filter) { + }, + find: function (selector, self, filter) { self = self || this; var rules = []; var match; @@ -2225,8 +2170,8 @@ }); this._lookups[key] = rules; return rules; - }; - Ruleset.prototype.genCSS = function (context, output) { + }, + genCSS: function (context, output) { var i; var j; var charsetRuleNodes = []; @@ -2324,13 +2269,13 @@ if (!output.isEmpty() && !context.compress && this.firstRoot) { output.add('\n'); } - }; - Ruleset.prototype.joinSelectors = function (paths, context, selectors) { + }, + joinSelectors: function (paths, context, selectors) { for (var s = 0; s < selectors.length; s++) { this.joinSelector(paths, context, selectors[s]); } - }; - Ruleset.prototype.joinSelector = function (paths, context, selector) { + }, + joinSelector: function (paths, context, selector) { function createParenthesis(elementsToPak, originalElement) { var replacementParen, j; if (elementsToPak.length === 0) { @@ -2560,41 +2505,36 @@ for (i = 0; i < newPaths.length; i++) { paths.push(newPaths[i]); } - }; - return Ruleset; - }(Node)); - Ruleset.prototype.type = 'Ruleset'; - Ruleset.prototype.isRuleset = true; + } + }); - var AtRule = /** @class */ (function (_super) { - __extends(AtRule, _super); - function AtRule(name, value, rules, index, currentFileInfo, debugInfo, isRooted, visibilityInfo) { - var _this = _super.call(this) || this; - var i; - _this.name = name; - _this.value = (value instanceof Node) ? value : (value ? new Anonymous(value) : value); - if (rules) { - if (Array.isArray(rules)) { - _this.rules = rules; - } - else { - _this.rules = [rules]; - _this.rules[0].selectors = (new Selector([], null, null, index, currentFileInfo)).createEmptySelectors(); - } - for (i = 0; i < _this.rules.length; i++) { - _this.rules[i].allowImports = true; - } - _this.setParent(_this.rules, _this); + var AtRule = function (name, value, rules, index, currentFileInfo, debugInfo, isRooted, visibilityInfo) { + var i; + this.name = name; + this.value = (value instanceof Node) ? value : (value ? new Anonymous(value) : value); + if (rules) { + if (Array.isArray(rules)) { + this.rules = rules; + } + else { + this.rules = [rules]; + this.rules[0].selectors = (new Selector([], null, null, index, currentFileInfo)).createEmptySelectors(); + } + for (i = 0; i < this.rules.length; i++) { + this.rules[i].allowImports = true; } - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.debugInfo = debugInfo; - _this.isRooted = isRooted || false; - _this.copyVisibilityInfo(visibilityInfo); - _this.allowRoot = true; - return _this; + this.setParent(this.rules, this); } - AtRule.prototype.accept = function (visitor) { + this._index = index; + this._fileInfo = currentFileInfo; + this.debugInfo = debugInfo; + this.isRooted = isRooted || false; + this.copyVisibilityInfo(visibilityInfo); + this.allowRoot = true; + }; + AtRule.prototype = Object.assign(new Node(), { + type: 'AtRule', + accept: function (visitor) { var value = this.value, rules = this.rules; if (rules) { this.rules = visitor.visitArray(rules); @@ -2602,14 +2542,14 @@ if (value) { this.value = visitor.visit(value); } - }; - AtRule.prototype.isRulesetLike = function () { + }, + isRulesetLike: function () { return this.rules || !this.isCharset(); - }; - AtRule.prototype.isCharset = function () { + }, + isCharset: function () { return '@charset' === this.name; - }; - AtRule.prototype.genCSS = function (context, output) { + }, + genCSS: function (context, output) { var value = this.value, rules = this.rules; output.add(this.name, this.fileInfo(), this.getIndex()); if (value) { @@ -2622,8 +2562,8 @@ else { output.add(';'); } - }; - AtRule.prototype.eval = function (context) { + }, + eval: function (context) { var mediaPathBackup, mediaBlocksBackup, value = this.value, rules = this.rules; // media stored inside other atrule should not bubble over it // backpup media bubbling information @@ -2644,26 +2584,26 @@ context.mediaPath = mediaPathBackup; context.mediaBlocks = mediaBlocksBackup; return new AtRule(this.name, value, rules, this.getIndex(), this.fileInfo(), this.debugInfo, this.isRooted, this.visibilityInfo()); - }; - AtRule.prototype.variable = function (name) { + }, + variable: function (name) { if (this.rules) { // assuming that there is only one rule at this point - that is how parser constructs the rule return Ruleset.prototype.variable.call(this.rules[0], name); } - }; - AtRule.prototype.find = function () { + }, + find: function () { if (this.rules) { // assuming that there is only one rule at this point - that is how parser constructs the rule return Ruleset.prototype.find.apply(this.rules[0], arguments); } - }; - AtRule.prototype.rulesets = function () { + }, + rulesets: function () { if (this.rules) { // assuming that there is only one rule at this point - that is how parser constructs the rule return Ruleset.prototype.rulesets.apply(this.rules[0]); } - }; - AtRule.prototype.outputRuleset = function (context, output, rules) { + }, + outputRuleset: function (context, output, rules) { var ruleCnt = rules.length; var i; context.tabLevel = (context.tabLevel | 0) + 1; @@ -2692,53 +2632,45 @@ output.add(tabSetStr + "}"); } context.tabLevel--; - }; - return AtRule; - }(Node)); - AtRule.prototype.type = 'AtRule'; + } + }); - var DetachedRuleset = /** @class */ (function (_super) { - __extends(DetachedRuleset, _super); - function DetachedRuleset(ruleset, frames) { - var _this = _super.call(this) || this; - _this.ruleset = ruleset; - _this.frames = frames; - _this.setParent(_this.ruleset, _this); - return _this; - } - DetachedRuleset.prototype.accept = function (visitor) { + var DetachedRuleset = function (ruleset, frames) { + this.ruleset = ruleset; + this.frames = frames; + this.setParent(this.ruleset, this); + }; + DetachedRuleset.prototype = Object.assign(new Node(), { + type: 'DetachedRuleset', + evalFirst: true, + accept: function (visitor) { this.ruleset = visitor.visit(this.ruleset); - }; - DetachedRuleset.prototype.eval = function (context) { + }, + eval: function (context) { var frames = this.frames || copyArray(context.frames); return new DetachedRuleset(this.ruleset, frames); - }; - DetachedRuleset.prototype.callEval = function (context) { + }, + callEval: function (context) { return this.ruleset.eval(this.frames ? new contexts.Eval(context, this.frames.concat(context.frames)) : context); - }; - return DetachedRuleset; - }(Node)); - DetachedRuleset.prototype.type = 'DetachedRuleset'; - DetachedRuleset.prototype.evalFirst = true; + } + }); - var Unit = /** @class */ (function (_super) { - __extends(Unit, _super); - function Unit(numerator, denominator, backupUnit) { - var _this = _super.call(this) || this; - _this.numerator = numerator ? copyArray(numerator).sort() : []; - _this.denominator = denominator ? copyArray(denominator).sort() : []; - if (backupUnit) { - _this.backupUnit = backupUnit; - } - else if (numerator && numerator.length) { - _this.backupUnit = numerator[0]; - } - return _this; + var Unit = function (numerator, denominator, backupUnit) { + this.numerator = numerator ? copyArray(numerator).sort() : []; + this.denominator = denominator ? copyArray(denominator).sort() : []; + if (backupUnit) { + this.backupUnit = backupUnit; + } + else if (numerator && numerator.length) { + this.backupUnit = numerator[0]; } - Unit.prototype.clone = function () { + }; + Unit.prototype = Object.assign(new Node(), { + type: 'Unit', + clone: function () { return new Unit(copyArray(this.numerator), copyArray(this.denominator), this.backupUnit); - }; - Unit.prototype.genCSS = function (context, output) { + }, + genCSS: function (context, output) { // Dimension checks the unit is singular and throws an error if in strict math mode. var strictUnits = context && context.strictUnits; if (this.numerator.length === 1) { @@ -2750,30 +2682,30 @@ else if (!strictUnits && this.denominator.length) { output.add(this.denominator[0]); } - }; - Unit.prototype.toString = function () { + }, + toString: function () { var i, returnStr = this.numerator.join('*'); for (i = 0; i < this.denominator.length; i++) { returnStr += "/" + this.denominator[i]; } return returnStr; - }; - Unit.prototype.compare = function (other) { + }, + compare: function (other) { return this.is(other.toString()) ? 0 : undefined; - }; - Unit.prototype.is = function (unitString) { + }, + is: function (unitString) { return this.toString().toUpperCase() === unitString.toUpperCase(); - }; - Unit.prototype.isLength = function () { + }, + isLength: function () { return RegExp('^(px|em|ex|ch|rem|in|cm|mm|pc|pt|ex|vw|vh|vmin|vmax)$', 'gi').test(this.toCSS()); - }; - Unit.prototype.isEmpty = function () { + }, + isEmpty: function () { return this.numerator.length === 0 && this.denominator.length === 0; - }; - Unit.prototype.isSingular = function () { + }, + isSingular: function () { return this.numerator.length <= 1 && this.denominator.length === 0; - }; - Unit.prototype.map = function (callback) { + }, + map: function (callback) { var i; for (i = 0; i < this.numerator.length; i++) { this.numerator[i] = callback(this.numerator[i], false); @@ -2781,8 +2713,8 @@ for (i = 0; i < this.denominator.length; i++) { this.denominator[i] = callback(this.denominator[i], true); } - }; - Unit.prototype.usedUnits = function () { + }, + usedUnits: function () { var group; var result = {}; var mapUnit; @@ -2801,8 +2733,8 @@ } } return result; - }; - Unit.prototype.cancel = function () { + }, + cancel: function () { var counter = {}; var atomicUnit; var i; @@ -2833,37 +2765,33 @@ } this.numerator.sort(); this.denominator.sort(); - }; - return Unit; - }(Node)); - Unit.prototype.type = 'Unit'; + } + }); // // A number with a unit // - var Dimension = /** @class */ (function (_super) { - __extends(Dimension, _super); - function Dimension(value, unit) { - var _this = _super.call(this) || this; - _this.value = parseFloat(value); - if (isNaN(_this.value)) { - throw new Error('Dimension is not a number.'); - } - _this.unit = (unit && unit instanceof Unit) ? unit : - new Unit(unit ? [unit] : undefined); - _this.setParent(_this.unit, _this); - return _this; - } - Dimension.prototype.accept = function (visitor) { + var Dimension = function (value, unit) { + this.value = parseFloat(value); + if (isNaN(this.value)) { + throw new Error('Dimension is not a number.'); + } + this.unit = (unit && unit instanceof Unit) ? unit : + new Unit(unit ? [unit] : undefined); + this.setParent(this.unit, this); + }; + Dimension.prototype = Object.assign(new Node(), { + type: 'Dimension', + accept: function (visitor) { this.unit = visitor.visit(this.unit); - }; - Dimension.prototype.eval = function (context) { + }, + eval: function (context) { return this; - }; - Dimension.prototype.toColor = function () { + }, + toColor: function () { return new Color([this.value, this.value, this.value]); - }; - Dimension.prototype.genCSS = function (context, output) { + }, + genCSS: function (context, output) { if ((context && context.strictUnits) && !this.unit.isSingular()) { throw new Error("Multiple units in dimension. Correct the units or use the unit function. Bad unit: " + this.unit.toString()); } @@ -2886,11 +2814,11 @@ } output.add(strValue); this.unit.genCSS(context, output); - }; + }, // In an operation between two Dimensions, // we default to the first Dimension's unit, // so `1px + 2` will yield `3px`. - Dimension.prototype.operate = function (context, op, other) { + operate: function (context, op, other) { /* jshint noempty:false */ var value = this._operate(context, op, this.value, other.value), unit = this.unit.clone(); if (op === '+' || op === '-') { @@ -2920,8 +2848,8 @@ unit.cancel(); } return new Dimension(value, unit); - }; - Dimension.prototype.compare = function (other) { + }, + compare: function (other) { var a, b; if (!(other instanceof Dimension)) { return undefined; @@ -2938,11 +2866,11 @@ } } return Node.numericCompare(a.value, b.value); - }; - Dimension.prototype.unify = function () { + }, + unify: function () { return this.convertTo({ length: 'px', duration: 's', angle: 'rad' }); - }; - Dimension.prototype.convertTo = function (conversions) { + }, + convertTo: function (conversions) { var value = this.value; var unit = this.unit.clone(); var i; @@ -2982,25 +2910,21 @@ } unit.cancel(); return new Dimension(value, unit); - }; - return Dimension; - }(Node)); - Dimension.prototype.type = 'Dimension'; + } + }); var MATH$1 = Math$1; - var Operation = /** @class */ (function (_super) { - __extends(Operation, _super); - function Operation(op, operands, isSpaced) { - var _this = _super.call(this) || this; - _this.op = op.trim(); - _this.operands = operands; - _this.isSpaced = isSpaced; - return _this; - } - Operation.prototype.accept = function (visitor) { + var Operation = function (op, operands, isSpaced) { + this.op = op.trim(); + this.operands = operands; + this.isSpaced = isSpaced; + }; + Operation.prototype = Object.assign(new Node(), { + type: 'Operation', + accept: function (visitor) { this.operands = visitor.visitArray(this.operands); - }; - Operation.prototype.eval = function (context) { + }, + eval: function (context) { var a = this.operands[0].eval(context), b = this.operands[1].eval(context), op; if (context.isMathOn(this.op)) { op = this.op === './' ? '/' : this.op; @@ -3022,8 +2946,8 @@ else { return new Operation(this.op, [a, b], this.isSpaced); } - }; - Operation.prototype.genCSS = function (context, output) { + }, + genCSS: function (context, output) { this.operands[0].genCSS(context, output); if (this.isSpaced) { output.add(' '); @@ -3033,26 +2957,22 @@ output.add(' '); } this.operands[1].genCSS(context, output); - }; - return Operation; - }(Node)); - Operation.prototype.type = 'Operation'; + } + }); - var Expression = /** @class */ (function (_super) { - __extends(Expression, _super); - function Expression(value, noSpacing) { - var _this = _super.call(this) || this; - _this.value = value; - _this.noSpacing = noSpacing; - if (!value) { - throw new Error('Expression requires an array parameter'); - } - return _this; - } - Expression.prototype.accept = function (visitor) { + var Expression = function (value, noSpacing) { + this.value = value; + this.noSpacing = noSpacing; + if (!value) { + throw new Error('Expression requires an array parameter'); + } + }; + Expression.prototype = Object.assign(new Node(), { + type: 'Expression', + accept: function (visitor) { this.value = visitor.visitArray(this.value); - }; - Expression.prototype.eval = function (context) { + }, + eval: function (context) { var returnValue; var mathOn = context.isMathOn(); var inParenthesis = this.parens; @@ -3085,23 +3005,21 @@ returnValue = new Paren(returnValue); } return returnValue; - }; - Expression.prototype.genCSS = function (context, output) { + }, + genCSS: function (context, output) { for (var i = 0; i < this.value.length; i++) { this.value[i].genCSS(context, output); if (!this.noSpacing && i + 1 < this.value.length) { output.add(' '); } } - }; - Expression.prototype.throwAwayComments = function () { + }, + throwAwayComments: function () { this.value = this.value.filter(function (v) { return !(v instanceof Comment); }); - }; - return Expression; - }(Node)); - Expression.prototype.type = 'Expression'; + } + }); var functionCaller = /** @class */ (function () { function functionCaller(name, context, index, currentFileInfo) { @@ -3151,22 +3069,20 @@ // // A function call node. // - var Call = /** @class */ (function (_super) { - __extends(Call, _super); - function Call(name, args, index, currentFileInfo) { - var _this = _super.call(this) || this; - _this.name = name; - _this.args = args; - _this.calc = name === 'calc'; - _this._index = index; - _this._fileInfo = currentFileInfo; - return _this; - } - Call.prototype.accept = function (visitor) { + var Call = function (name, args, index, currentFileInfo) { + this.name = name; + this.args = args; + this.calc = name === 'calc'; + this._index = index; + this._fileInfo = currentFileInfo; + }; + Call.prototype = Object.assign(new Node(), { + type: 'Call', + accept: function (visitor) { if (this.args) { this.args = visitor.visitArray(this.args); } - }; + }, // // When evaluating a function call, // we either find the function in the functionRegistry, @@ -3178,7 +3094,7 @@ // we try to pass a variable to a function, like: `saturate(@color)`. // The function should receive the value, not the variable. // - Call.prototype.eval = function (context) { + eval: function (context) { var _this = this; /** * Turn off math for calc(), and switch back on for evaluating nested functions @@ -3233,8 +3149,8 @@ var args = this.args.map(function (a) { return a.eval(context); }); exitCalc(); return new Call(this.name, args, this.getIndex(), this.fileInfo()); - }; - Call.prototype.genCSS = function (context, output) { + }, + genCSS: function (context, output) { output.add(this.name + "(", this.fileInfo(), this.getIndex()); for (var i = 0; i < this.args.length; i++) { this.args[i].genCSS(context, output); @@ -3243,21 +3159,17 @@ } } output.add(')'); - }; - return Call; - }(Node)); - Call.prototype.type = 'Call'; + } + }); - var Variable = /** @class */ (function (_super) { - __extends(Variable, _super); - function Variable(name, index, currentFileInfo) { - var _this = _super.call(this) || this; - _this.name = name; - _this._index = index; - _this._fileInfo = currentFileInfo; - return _this; - } - Variable.prototype.eval = function (context) { + var Variable = function (name, index, currentFileInfo) { + this.name = name; + this._index = index; + this._fileInfo = currentFileInfo; + }; + Variable.prototype = Object.assign(new Node(), { + type: 'Variable', + eval: function (context) { var variable, name = this.name; if (name.indexOf('@@') === 0) { name = "@" + new Variable(name.slice(1), this.getIndex(), this.fileInfo()).eval(context).value; @@ -3291,8 +3203,8 @@ throw { type: 'Name', message: "variable " + name + " is undefined", filename: this.fileInfo().filename, index: this.getIndex() }; } - }; - Variable.prototype.find = function (obj, fun) { + }, + find: function (obj, fun) { for (var i = 0, r = void 0; i < obj.length; i++) { r = fun.call(obj, obj[i]); if (r) { @@ -3300,21 +3212,17 @@ } } return null; - }; - return Variable; - }(Node)); - Variable.prototype.type = 'Variable'; + } + }); - var Property = /** @class */ (function (_super) { - __extends(Property, _super); - function Property(name, index, currentFileInfo) { - var _this = _super.call(this) || this; - _this.name = name; - _this._index = index; - _this._fileInfo = currentFileInfo; - return _this; - } - Property.prototype.eval = function (context) { + var Property = function (name, index, currentFileInfo) { + this.name = name; + this._index = index; + this._fileInfo = currentFileInfo; + }; + Property.prototype = Object.assign(new Node(), { + type: 'Property', + eval: function (context) { var property; var name = this.name; // TODO: shorten this reference @@ -3350,8 +3258,8 @@ throw { type: 'Name', message: "Property '" + name + "' is undefined", filename: this.currentFileInfo.filename, index: this.index }; } - }; - Property.prototype.find = function (obj, fun) { + }, + find: function (obj, fun) { for (var i = 0, r = void 0; i < obj.length; i++) { r = fun.call(obj, obj[i]); if (r) { @@ -3359,53 +3267,45 @@ } } return null; - }; - return Property; - }(Node)); - Property.prototype.type = 'Property'; + } + }); - var Attribute = /** @class */ (function (_super) { - __extends(Attribute, _super); - function Attribute(key, op, value) { - var _this = _super.call(this) || this; - _this.key = key; - _this.op = op; - _this.value = value; - return _this; - } - Attribute.prototype.eval = function (context) { + var Attribute = function (key, op, value) { + this.key = key; + this.op = op; + this.value = value; + }; + Attribute.prototype = Object.assign(new Node(), { + type: 'Attribute', + eval: function (context) { return new Attribute(this.key.eval ? this.key.eval(context) : this.key, this.op, (this.value && this.value.eval) ? this.value.eval(context) : this.value); - }; - Attribute.prototype.genCSS = function (context, output) { + }, + genCSS: function (context, output) { output.add(this.toCSS(context)); - }; - Attribute.prototype.toCSS = function (context) { + }, + toCSS: function (context) { var value = this.key.toCSS ? this.key.toCSS(context) : this.key; if (this.op) { value += this.op; value += (this.value.toCSS ? this.value.toCSS(context) : this.value); } return "[" + value + "]"; - }; - return Attribute; - }(Node)); - Attribute.prototype.type = 'Attribute'; + } + }); - var Quoted = /** @class */ (function (_super) { - __extends(Quoted, _super); - function Quoted(str, content, escaped, index, currentFileInfo) { - var _this = _super.call(this) || this; - _this.escaped = (escaped == null) ? true : escaped; - _this.value = content || ''; - _this.quote = str.charAt(0); - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.variableRegex = /@\{([\w-]+)\}/g; - _this.propRegex = /\$\{([\w-]+)\}/g; - _this.allowRoot = escaped; - return _this; - } - Quoted.prototype.genCSS = function (context, output) { + var Quoted = function (str, content, escaped, index, currentFileInfo) { + this.escaped = (escaped == null) ? true : escaped; + this.value = content || ''; + this.quote = str.charAt(0); + this._index = index; + this._fileInfo = currentFileInfo; + this.variableRegex = /@\{([\w-]+)\}/g; + this.propRegex = /\$\{([\w-]+)\}/g; + this.allowRoot = escaped; + }; + Quoted.prototype = Object.assign(new Node(), { + type: 'Quoted', + genCSS: function (context, output) { if (!this.escaped) { output.add(this.quote, this.fileInfo(), this.getIndex()); } @@ -3413,11 +3313,11 @@ if (!this.escaped) { output.add(this.quote); } - }; - Quoted.prototype.containsVariables = function () { + }, + containsVariables: function () { return this.value.match(this.variableRegex); - }; - Quoted.prototype.eval = function (context) { + }, + eval: function (context) { var that = this; var value = this.value; var variableReplacement = function (_, name) { @@ -3439,8 +3339,8 @@ value = iterativeReplace(value, this.variableRegex, variableReplacement); value = iterativeReplace(value, this.propRegex, propertyReplacement); return new Quoted(this.quote + value + this.quote, value, this.escaped, this.getIndex(), this.fileInfo()); - }; - Quoted.prototype.compare = function (other) { + }, + compare: function (other) { // when comparing quoted strings allow the quote to differ if (other.type === 'Quoted' && !this.escaped && !other.escaped) { return Node.numericCompare(this.value, other.value); @@ -3448,30 +3348,29 @@ else { return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined; } - }; - return Quoted; - }(Node)); - Quoted.prototype.type = 'Quoted'; + } + }); - var URL = /** @class */ (function (_super) { - __extends(URL, _super); - function URL(val, index, currentFileInfo, isEvald) { - var _this = _super.call(this) || this; - _this.value = val; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.isEvald = isEvald; - return _this; - } - URL.prototype.accept = function (visitor) { + function escapePath(path) { + return path.replace(/[\(\)'"\s]/g, function (match) { return "\\" + match; }); + } + var URL = function (val, index, currentFileInfo, isEvald) { + this.value = val; + this._index = index; + this._fileInfo = currentFileInfo; + this.isEvald = isEvald; + }; + URL.prototype = Object.assign(new Node(), { + type: 'URL', + accept: function (visitor) { this.value = visitor.visit(this.value); - }; - URL.prototype.genCSS = function (context, output) { + }, + genCSS: function (context, output) { output.add('url('); this.value.genCSS(context, output); output.add(')'); - }; - URL.prototype.eval = function (context) { + }, + eval: function (context) { var val = this.value.eval(context); var rootpath; if (!this.isEvald) { @@ -3503,48 +3402,41 @@ } } return new URL(val, this.getIndex(), this.fileInfo(), true); - }; - return URL; - }(Node)); - URL.prototype.type = 'Url'; - function escapePath(path) { - return path.replace(/[\(\)'"\s]/g, function (match) { return "\\" + match; }); - } + } + }); - var Media = /** @class */ (function (_super) { - __extends(Media, _super); - function Media(value, features, index, currentFileInfo, visibilityInfo) { - var _this = _super.call(this) || this; - _this._index = index; - _this._fileInfo = currentFileInfo; - var selectors = (new Selector([], null, null, _this._index, _this._fileInfo)).createEmptySelectors(); - _this.features = new Value(features); - _this.rules = [new Ruleset(selectors, value)]; - _this.rules[0].allowImports = true; - _this.copyVisibilityInfo(visibilityInfo); - _this.allowRoot = true; - _this.setParent(selectors, _this); - _this.setParent(_this.features, _this); - _this.setParent(_this.rules, _this); - return _this; - } - Media.prototype.isRulesetLike = function () { + var Media = function (value, features, index, currentFileInfo, visibilityInfo) { + this._index = index; + this._fileInfo = currentFileInfo; + var selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors(); + this.features = new Value(features); + this.rules = [new Ruleset(selectors, value)]; + this.rules[0].allowImports = true; + this.copyVisibilityInfo(visibilityInfo); + this.allowRoot = true; + this.setParent(selectors, this); + this.setParent(this.features, this); + this.setParent(this.rules, this); + }; + Media.prototype = Object.assign(new AtRule(), { + type: 'Media', + isRulesetLike: function () { return true; - }; - Media.prototype.accept = function (visitor) { + }, + accept: function (visitor) { if (this.features) { this.features = visitor.visit(this.features); } if (this.rules) { this.rules = visitor.visitArray(this.rules); } - }; - Media.prototype.genCSS = function (context, output) { + }, + genCSS: function (context, output) { output.add('@media ', this._fileInfo, this._index); this.features.genCSS(context, output); this.outputRuleset(context, output, this.rules); - }; - Media.prototype.eval = function (context) { + }, + eval: function (context) { if (!context.mediaBlocks) { context.mediaBlocks = []; context.mediaPath = []; @@ -3564,8 +3456,8 @@ context.mediaPath.pop(); return context.mediaPath.length === 0 ? media.evalTop(context) : media.evalNested(context); - }; - Media.prototype.evalTop = function (context) { + }, + evalTop: function (context) { var result = this; // Render all dependent Media blocks. if (context.mediaBlocks.length > 1) { @@ -3578,8 +3470,8 @@ delete context.mediaBlocks; delete context.mediaPath; return result; - }; - Media.prototype.evalNested = function (context) { + }, + evalNested: function (context) { var i; var value; var path = context.mediaPath.concat([this]); @@ -3606,8 +3498,8 @@ this.setParent(this.features, this); // Fake a tree-node that doesn't output anything. return new Ruleset([], []); - }; - Media.prototype.permute = function (arr) { + }, + permute: function (arr) { if (arr.length === 0) { return []; } @@ -3624,17 +3516,15 @@ } return result; } - }; - Media.prototype.bubbleSelectors = function (selectors) { + }, + bubbleSelectors: function (selectors) { if (!selectors) { return; } this.rules = [new Ruleset(copyArray(selectors), [this.rules[0]])]; this.setParent(this.rules, this); - }; - return Media; - }(AtRule)); - Media.prototype.type = 'Media'; + } + }); // // CSS @import node @@ -3648,31 +3538,29 @@ // `import,push`, we also pass it a callback, which it'll call once // the file has been fetched, and parsed. // - var Import = /** @class */ (function (_super) { - __extends(Import, _super); - function Import(path, features, options, index, currentFileInfo, visibilityInfo) { - var _this = _super.call(this) || this; - _this.options = options; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.path = path; - _this.features = features; - _this.allowRoot = true; - if (_this.options.less !== undefined || _this.options.inline) { - _this.css = !_this.options.less || _this.options.inline; - } - else { - var pathValue = _this.getPath(); - if (pathValue && /[#\.\&\?]css([\?;].*)?$/.test(pathValue)) { - _this.css = true; - } + var Import = function (path, features, options, index, currentFileInfo, visibilityInfo) { + this.options = options; + this._index = index; + this._fileInfo = currentFileInfo; + this.path = path; + this.features = features; + this.allowRoot = true; + if (this.options.less !== undefined || this.options.inline) { + this.css = !this.options.less || this.options.inline; + } + else { + var pathValue = this.getPath(); + if (pathValue && /[#\.\&\?]css([\?;].*)?$/.test(pathValue)) { + this.css = true; } - _this.copyVisibilityInfo(visibilityInfo); - _this.setParent(_this.features, _this); - _this.setParent(_this.path, _this); - return _this; } - Import.prototype.accept = function (visitor) { + this.copyVisibilityInfo(visibilityInfo); + this.setParent(this.features, this); + this.setParent(this.path, this); + }; + Import.prototype = Object.assign(new Node(), { + type: 'Import', + accept: function (visitor) { if (this.features) { this.features = visitor.visit(this.features); } @@ -3680,8 +3568,8 @@ if (!this.options.isPlugin && !this.options.inline && this.root) { this.root = visitor.visit(this.root); } - }; - Import.prototype.genCSS = function (context, output) { + }, + genCSS: function (context, output) { if (this.css && this.path._fileInfo.reference === undefined) { output.add('@import ', this._fileInfo, this._index); this.path.genCSS(context, output); @@ -3691,12 +3579,12 @@ } output.add(';'); } - }; - Import.prototype.getPath = function () { + }, + getPath: function () { return (this.path instanceof URL) ? this.path.value.value : this.path.value; - }; - Import.prototype.isVariableImport = function () { + }, + isVariableImport: function () { var path = this.path; if (path instanceof URL) { path = path.value; @@ -3705,15 +3593,15 @@ return path.containsVariables(); } return true; - }; - Import.prototype.evalForImport = function (context) { + }, + evalForImport: function (context) { var path = this.path; if (path instanceof URL) { path = path.value; } return new Import(path.eval(context), this.features, this.options, this._index, this._fileInfo, this.visibilityInfo()); - }; - Import.prototype.evalPath = function (context) { + }, + evalPath: function (context) { var path = this.path.eval(context); var fileInfo = this._fileInfo; if (!(path instanceof URL)) { @@ -3729,8 +3617,8 @@ } } return path; - }; - Import.prototype.eval = function (context) { + }, + eval: function (context) { var result = this.doEval(context); if (this.options.reference || this.blocksVisibility()) { if (result.length || result.length === 0) { @@ -3743,8 +3631,8 @@ } } return result; - }; - Import.prototype.doEval = function (context) { + }, + doEval: function (context) { var ruleset; var registry; var features = this.features && this.features.eval(context); @@ -3794,17 +3682,12 @@ else { return []; } - }; - return Import; - }(Node)); - Import.prototype.type = 'Import'; - - var JsEvalNode = /** @class */ (function (_super) { - __extends(JsEvalNode, _super); - function JsEvalNode() { - return _super !== null && _super.apply(this, arguments) || this; } - JsEvalNode.prototype.evaluateJavaScript = function (expression, context) { + }); + + var JsEvalNode = function () { }; + JsEvalNode.prototype = Object.assign(new Node(), { + evaluateJavaScript: function (expression, context) { var result; var that = this; var evalContext = {}; @@ -3843,29 +3726,26 @@ index: this.getIndex() }; } return result; - }; - JsEvalNode.prototype.jsify = function (obj) { + }, + jsify: function (obj) { if (Array.isArray(obj.value) && (obj.value.length > 1)) { return "[" + obj.value.map(function (v) { return v.toCSS(); }).join(', ') + "]"; } else { return obj.toCSS(); } - }; - return JsEvalNode; - }(Node)); + } + }); - var JavaScript = /** @class */ (function (_super) { - __extends(JavaScript, _super); - function JavaScript(string, escaped, index, currentFileInfo) { - var _this = _super.call(this) || this; - _this.escaped = escaped; - _this.expression = string; - _this._index = index; - _this._fileInfo = currentFileInfo; - return _this; - } - JavaScript.prototype.eval = function (context) { + var JavaScript = function (string, escaped, index, currentFileInfo) { + this.escaped = escaped; + this.expression = string; + this._index = index; + this._fileInfo = currentFileInfo; + }; + JavaScript.prototype = Object.assign(new JsEvalNode(), { + type: 'JavaScript', + eval: function (context) { var result = this.evaluateJavaScript(this.expression, context); var type = typeof result; if (type === 'number' && !isNaN(result)) { @@ -3880,29 +3760,25 @@ else { return new Anonymous(result); } - }; - return JavaScript; - }(JsEvalNode)); - JavaScript.prototype.type = 'JavaScript'; + } + }); - var Assignment = /** @class */ (function (_super) { - __extends(Assignment, _super); - function Assignment(key, val) { - var _this = _super.call(this) || this; - _this.key = key; - _this.value = val; - return _this; - } - Assignment.prototype.accept = function (visitor) { + var Assignment = function (key, val) { + this.key = key; + this.value = val; + }; + Assignment.prototype = Object.assign(new Node(), { + type: 'Assignment', + accept: function (visitor) { this.value = visitor.visit(this.value); - }; - Assignment.prototype.eval = function (context) { + }, + eval: function (context) { if (this.value.eval) { return new Assignment(this.key, this.value.eval(context)); } return this; - }; - Assignment.prototype.genCSS = function (context, output) { + }, + genCSS: function (context, output) { output.add(this.key + "="); if (this.value.genCSS) { this.value.genCSS(context, output); @@ -3910,27 +3786,23 @@ else { output.add(this.value); } - }; - return Assignment; - }(Node)); - Assignment.prototype.type = 'Assignment'; + } + }); - var Condition = /** @class */ (function (_super) { - __extends(Condition, _super); - function Condition(op, l, r, i, negate) { - var _this = _super.call(this) || this; - _this.op = op.trim(); - _this.lvalue = l; - _this.rvalue = r; - _this._index = i; - _this.negate = negate; - return _this; - } - Condition.prototype.accept = function (visitor) { + var Condition = function (op, l, r, i, negate) { + this.op = op.trim(); + this.lvalue = l; + this.rvalue = r; + this._index = i; + this.negate = negate; + }; + Condition.prototype = Object.assign(new Node(), { + type: 'Condition', + accept: function (visitor) { this.lvalue = visitor.visit(this.lvalue); this.rvalue = visitor.visit(this.rvalue); - }; - Condition.prototype.eval = function (context) { + }, + eval: function (context) { var result = (function (op, a, b) { switch (op) { case 'and': return a && b; @@ -3949,79 +3821,67 @@ } })(this.op, this.lvalue.eval(context), this.rvalue.eval(context)); return this.negate ? !result : result; - }; - return Condition; - }(Node)); - Condition.prototype.type = 'Condition'; + } + }); - var UnicodeDescriptor = /** @class */ (function (_super) { - __extends(UnicodeDescriptor, _super); - function UnicodeDescriptor(value) { - var _this = _super.call(this) || this; - _this.value = value; - return _this; - } - return UnicodeDescriptor; - }(Node)); - UnicodeDescriptor.prototype.type = 'UnicodeDescriptor'; + var UnicodeDescriptor = function (value) { + this.value = value; + }; + UnicodeDescriptor.prototype = Object.assign(new Node(), { + type: 'UnicodeDescriptor' + }); - var Negative = /** @class */ (function (_super) { - __extends(Negative, _super); - function Negative(node) { - var _this = _super.call(this) || this; - _this.value = node; - return _this; - } - Negative.prototype.genCSS = function (context, output) { + var Negative = function (node) { + this.value = node; + }; + Negative.prototype = Object.assign(new Node(), { + type: 'Negative', + genCSS: function (context, output) { output.add('-'); this.value.genCSS(context, output); - }; - Negative.prototype.eval = function (context) { + }, + eval: function (context) { if (context.isMathOn()) { return (new Operation('*', [new Dimension(-1), this.value])).eval(context); } return new Negative(this.value.eval(context)); - }; - return Negative; - }(Node)); - Negative.prototype.type = 'Negative'; - - var Extend = /** @class */ (function (_super) { - __extends(Extend, _super); - function Extend(selector, option, index, currentFileInfo, visibilityInfo) { - var _this = _super.call(this) || this; - _this.selector = selector; - _this.option = option; - _this.object_id = Extend.next_id++; - _this.parent_ids = [_this.object_id]; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.copyVisibilityInfo(visibilityInfo); - _this.allowRoot = true; - switch (option) { - case 'all': - _this.allowBefore = true; - _this.allowAfter = true; - break; - default: - _this.allowBefore = false; - _this.allowAfter = false; - break; - } - _this.setParent(_this.selector, _this); - return _this; } - Extend.prototype.accept = function (visitor) { + }); + + var Extend = function (selector, option, index, currentFileInfo, visibilityInfo) { + this.selector = selector; + this.option = option; + this.object_id = Extend.next_id++; + this.parent_ids = [this.object_id]; + this._index = index; + this._fileInfo = currentFileInfo; + this.copyVisibilityInfo(visibilityInfo); + this.allowRoot = true; + switch (option) { + case 'all': + this.allowBefore = true; + this.allowAfter = true; + break; + default: + this.allowBefore = false; + this.allowAfter = false; + break; + } + this.setParent(this.selector, this); + }; + Extend.prototype = Object.assign(new Node(), { + type: 'Extend', + accept: function (visitor) { this.selector = visitor.visit(this.selector); - }; - Extend.prototype.eval = function (context) { + }, + eval: function (context) { return new Extend(this.selector.eval(context), this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo()); - }; - Extend.prototype.clone = function (context) { + }, + clone: function (context) { return new Extend(this.selector, this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo()); - }; + }, // it concatenates (joins) all selectors in selector array - Extend.prototype.findSelfSelectors = function (selectors) { + findSelfSelectors: function (selectors) { var selfElements = [], i, selectorElements; for (i = 0; i < selectors.length; i++) { selectorElements = selectors[i].elements; @@ -4034,23 +3894,19 @@ } this.selfSelectors = [new Selector(selfElements)]; this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo()); - }; - return Extend; - }(Node)); + } + }); Extend.next_id = 0; - Extend.prototype.type = 'Extend'; - var VariableCall = /** @class */ (function (_super) { - __extends(VariableCall, _super); - function VariableCall(variable, index, currentFileInfo) { - var _this = _super.call(this) || this; - _this.variable = variable; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.allowRoot = true; - return _this; - } - VariableCall.prototype.eval = function (context) { + var VariableCall = function (variable, index, currentFileInfo) { + this.variable = variable; + this._index = index; + this._fileInfo = currentFileInfo; + this.allowRoot = true; + }; + VariableCall.prototype = Object.assign(new Node(), { + type: 'VariableCall', + eval: function (context) { var rules; var detachedRuleset = new Variable(this.variable, this.getIndex(), this.fileInfo()).eval(context); var error = new LessError({ message: "Could not evaluate variable call " + this.variable }); @@ -4073,22 +3929,18 @@ return detachedRuleset.callEval(context); } throw error; - }; - return VariableCall; - }(Node)); - VariableCall.prototype.type = 'VariableCall'; + } + }); - var NamespaceValue = /** @class */ (function (_super) { - __extends(NamespaceValue, _super); - function NamespaceValue(ruleCall, lookups, index, fileInfo) { - var _this = _super.call(this) || this; - _this.value = ruleCall; - _this.lookups = lookups; - _this._index = index; - _this._fileInfo = fileInfo; - return _this; - } - NamespaceValue.prototype.eval = function (context) { + var NamespaceValue = function (ruleCall, lookups, index, fileInfo) { + this.value = ruleCall; + this.lookups = lookups; + this._index = index; + this._fileInfo = fileInfo; + }; + NamespaceValue.prototype = Object.assign(new Node(), { + type: 'NamespaceValue', + eval: function (context) { var i, name, rules = this.value.eval(context); for (i = 0; i < this.lookups.length; i++) { name = this.lookups[i]; @@ -4141,40 +3993,37 @@ } } return rules; - }; - return NamespaceValue; - }(Node)); - NamespaceValue.prototype.type = 'NamespaceValue'; - - var Definition = /** @class */ (function (_super) { - __extends(Definition, _super); - function Definition(name, params, rules, condition, variadic, frames, visibilityInfo) { - var _this = _super.call(this) || this; - _this.name = name || 'anonymous mixin'; - _this.selectors = [new Selector([new Element(null, name, false, _this._index, _this._fileInfo)])]; - _this.params = params; - _this.condition = condition; - _this.variadic = variadic; - _this.arity = params.length; - _this.rules = rules; - _this._lookups = {}; - var optionalParameters = []; - _this.required = params.reduce(function (count, p) { - if (!p.name || (p.name && !p.value)) { - return count + 1; - } - else { - optionalParameters.push(p.name); - return count; - } - }, 0); - _this.optionalParameters = optionalParameters; - _this.frames = frames; - _this.copyVisibilityInfo(visibilityInfo); - _this.allowRoot = true; - return _this; } - Definition.prototype.accept = function (visitor) { + }); + + var Definition = function (name, params, rules, condition, variadic, frames, visibilityInfo) { + this.name = name || 'anonymous mixin'; + this.selectors = [new Selector([new Element(null, name, false, this._index, this._fileInfo)])]; + this.params = params; + this.condition = condition; + this.variadic = variadic; + this.arity = params.length; + this.rules = rules; + this._lookups = {}; + var optionalParameters = []; + this.required = params.reduce(function (count, p) { + if (!p.name || (p.name && !p.value)) { + return count + 1; + } + else { + optionalParameters.push(p.name); + return count; + } + }, 0); + this.optionalParameters = optionalParameters; + this.frames = frames; + this.copyVisibilityInfo(visibilityInfo); + this.allowRoot = true; + }; + Definition.prototype = Object.assign(new Ruleset(), { + type: 'MixinDefinition', + evalFirst: true, + accept: function (visitor) { if (this.params && this.params.length) { this.params = visitor.visitArray(this.params); } @@ -4182,8 +4031,8 @@ if (this.condition) { this.condition = visitor.visit(this.condition); } - }; - Definition.prototype.evalParams = function (context, mixinEnv, args, evaldArguments) { + }, + evalParams: function (context, mixinEnv, args, evaldArguments) { /* jshint boss:true */ var frame = new Ruleset(null, null); var varargs; @@ -4270,8 +4119,8 @@ argIndex++; } return frame; - }; - Definition.prototype.makeImportant = function () { + }, + makeImportant: function () { var rules = !this.rules ? this.rules : this.rules.map(function (r) { if (r.makeImportant) { return r.makeImportant(true); @@ -4282,11 +4131,11 @@ }); var result = new Definition(this.name, this.params, rules, this.condition, this.variadic, this.frames); return result; - }; - Definition.prototype.eval = function (context) { + }, + eval: function (context) { return new Definition(this.name, this.params, this.rules, this.condition, this.variadic, this.frames || copyArray(context.frames)); - }; - Definition.prototype.evalCall = function (context, args, important) { + }, + evalCall: function (context, args, important) { var _arguments = []; var mixinFrames = this.frames ? this.frames.concat(context.frames) : context.frames; var frame = this.evalParams(context, new contexts.Eval(context, mixinFrames), args, _arguments); @@ -4301,16 +4150,16 @@ ruleset = ruleset.makeImportant(); } return ruleset; - }; - Definition.prototype.matchCondition = function (args, context) { + }, + matchCondition: function (args, context) { if (this.condition && !this.condition.eval(new contexts.Eval(context, [this.evalParams(context, /* the parameter variables */ new contexts.Eval(context, this.frames ? this.frames.concat(context.frames) : context.frames), args, [])] .concat(this.frames || []) // the parent namespace/mixin frames .concat(context.frames)))) { // the current environment frames return false; } return true; - }; - Definition.prototype.matchArgs = function (args, context) { + }, + matchArgs: function (args, context) { var allArgsCnt = (args && args.length) || 0; var len; var optionalParameters = this.optionalParameters; @@ -4345,34 +4194,29 @@ } } return true; - }; - return Definition; - }(Ruleset)); - Definition.prototype.type = 'MixinDefinition'; - Definition.prototype.evalFirst = true; + } + }); - var MixinCall = /** @class */ (function (_super) { - __extends(MixinCall, _super); - function MixinCall(elements, args, index, currentFileInfo, important) { - var _this = _super.call(this) || this; - _this.selector = new Selector(elements); - _this.arguments = args || []; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.important = important; - _this.allowRoot = true; - _this.setParent(_this.selector, _this); - return _this; - } - MixinCall.prototype.accept = function (visitor) { + var MixinCall = function (elements, args, index, currentFileInfo, important) { + this.selector = new Selector(elements); + this.arguments = args || []; + this._index = index; + this._fileInfo = currentFileInfo; + this.important = important; + this.allowRoot = true; + this.setParent(this.selector, this); + }; + MixinCall.prototype = Object.assign(new Node(), { + type: 'MixinCall', + accept: function (visitor) { if (this.selector) { this.selector = visitor.visit(this.selector); } if (this.arguments.length) { this.arguments = visitor.visitArray(this.arguments); } - }; - MixinCall.prototype.eval = function (context) { + }, + eval: function (context) { var mixins; var mixin; var mixinPath; @@ -4508,8 +4352,8 @@ else { throw { type: 'Name', message: this.selector.toCSS().trim() + " is undefined", index: this.getIndex(), filename: this.fileInfo().filename }; } - }; - MixinCall.prototype._setVisibilityToReplacement = function (replacement) { + }, + _setVisibilityToReplacement: function (replacement) { var i, rule; if (this.blocksVisibility()) { for (i = 0; i < replacement.length; i++) { @@ -4517,8 +4361,8 @@ rule.addVisibilityBlock(); } } - }; - MixinCall.prototype.format = function (args) { + }, + format: function (args) { return this.selector.toCSS().trim() + "(" + (args ? args.map(function (a) { var argValue = ''; if (a.name) { @@ -4532,10 +4376,8 @@ } return argValue; }).join(', ') : '') + ")"; - }; - return MixinCall; - }(Node)); - MixinCall.prototype.type = 'MixinCall'; + } + }); var tree = { Node: Node, Color: Color, AtRule: AtRule, DetachedRuleset: DetachedRuleset, Operation: Operation, @@ -10633,21 +10475,18 @@ var logger$1; var fileCache = {}; // TODOS - move log somewhere. pathDiff and doing something similar in node. use pathDiff in the other browser file for the initial load - var FileManager = /** @class */ (function (_super) { - __extends(FileManager, _super); - function FileManager() { - return _super !== null && _super.apply(this, arguments) || this; - } - FileManager.prototype.alwaysMakePathsAbsolute = function () { + var FileManager = function () { }; + FileManager.prototype = Object.assign(new AbstractFileManager(), { + alwaysMakePathsAbsolute: function () { return true; - }; - FileManager.prototype.join = function (basePath, laterPath) { + }, + join: function (basePath, laterPath) { if (!basePath) { return laterPath; } return this.extractUrlParts(laterPath, basePath).path; - }; - FileManager.prototype.doXHR = function (url, type, callback, errback) { + }, + doXHR: function (url, type, callback, errback) { var xhr = new XMLHttpRequest(); var async = options.isFileProtocol ? options.fileAsync : true; if (typeof xhr.overrideMimeType === 'function') { @@ -10683,14 +10522,14 @@ else { handleResponse(xhr, callback, errback); } - }; - FileManager.prototype.supports = function () { + }, + supports: function () { return true; - }; - FileManager.prototype.clearFileCache = function () { + }, + clearFileCache: function () { fileCache = {}; - }; - FileManager.prototype.loadFile = function (filename, currentDirectory, options, environment) { + }, + loadFile: function (filename, currentDirectory, options, environment) { // TODO: Add prefix support like less-node? // What about multiple paths? if (currentDirectory && !this.isPathAbsolute(filename)) { @@ -10722,9 +10561,8 @@ reject({ type: 'File', message: "'" + url + "' wasn't found (" + status + ")", href: href }); }); }); - }; - return FileManager; - }(AbstractFileManager)); + } + }); var FM = (function (opts, log) { options = opts; logger$1 = log; @@ -10735,22 +10573,18 @@ /** * Browser Plugin Loader */ - var PluginLoader = /** @class */ (function (_super) { - __extends(PluginLoader, _super); - function PluginLoader(less) { - var _this = _super.call(this) || this; - _this.less = less; - return _this; - // Should we shim this.require for browser? Probably not? - } - PluginLoader.prototype.loadPlugin = function (filename, basePath, context, environment, fileManager) { + var PluginLoader = function (less) { + this.less = less; + // Should we shim this.require for browser? Probably not? + }; + PluginLoader.prototype = Object.assign(new AbstractPluginLoader(), { + loadPlugin: function (filename, basePath, context, environment, fileManager) { return new Promise(function (fulfill, reject) { fileManager.loadFile(filename, basePath, context, environment) .then(fulfill).catch(reject); }); - }; - return PluginLoader; - }(AbstractPluginLoader)); + } + }); var LogListener = (function (less, options) { var logLevel_debug = 4; diff --git a/dist/less.min.js b/dist/less.min.js index 34348cf92..c54c1d6f4 100644 --- a/dist/less.min.js +++ b/dist/less.min.js @@ -1,5 +1,5 @@ /** - * Less - Leaner CSS v4.0.1-alpha.0+70e242c5 + * Less - Leaner CSS v4.0.0 * http://lesscss.org * * Copyright (c) 2009-2020, Alexis Sellier @@ -7,5 +7,5 @@ * * @license Apache-2.0 */ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).less=t()}(this,(function(){"use strict";function e(e){return e.replace(/^[a-z-]+:\/+?[^\/]+/,"").replace(/[\?\&]livereload=\w+/,"").replace(/^\//,"").replace(/\.[a-zA-Z]+$/,"").replace(/[^\.\w-]+/g,"-").replace(/\./g,":")}function t(e,t){for(var n in t.dataset)if(t.dataset.hasOwnProperty(n))if("env"===n||"dumpLineNumbers"===n||"rootpath"===n||"errorReporting"===n)e[n]=t.dataset[n];else try{e[n]=JSON.parse(t.dataset[n])}catch(e){}}var n=function(t,n,i){var r=i.href||"",o="less:"+(i.title||e(r)),s=t.getElementById(o),a=!1,l=t.createElement("style");l.setAttribute("type","text/css"),i.media&&l.setAttribute("media",i.media),l.id=o,l.styleSheet||(l.appendChild(t.createTextNode(n)),a=null!==s&&s.childNodes.length>0&&l.childNodes.length>0&&s.firstChild.nodeValue===l.firstChild.nodeValue);var u=t.getElementsByTagName("head")[0];if(null===s||!1===a){var c=i&&i.nextSibling||null;c?c.parentNode.insertBefore(l,c):u.appendChild(l)}if(s&&!1===a&&s.parentNode.removeChild(s),l.styleSheet)try{l.styleSheet.cssText=n}catch(e){throw new Error("Couldn't reassign styleSheet.cssText.")}},i=function(e){var t,n=e.document;return n.currentScript||(t=n.getElementsByTagName("script"))[t.length-1]},r={error:function(e){this._fireEvent("error",e)},warn:function(e){this._fireEvent("warn",e)},info:function(e){this._fireEvent("info",e)},debug:function(e){this._fireEvent("debug",e)},addListener:function(e){this._listeners.push(e)},removeListener:function(e){for(var t=0;t=0;a--){var l=s[a];if(l[o?"supportsSync":"supports"](e,t,n,i))return l}return null},e.prototype.addFileManager=function(e){this.fileManagers.push(e)},e.prototype.clearFileManagers=function(){this.fileManagers=[]},e}(),s={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",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:"#ff00ff",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:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",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:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",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:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},a={length:{m:1,cm:.01,mm:.001,in:.0254,px:.0254/96,pt:.0254/72,pc:.0254/72*12},duration:{s:1,ms:.001},angle:{rad:1/(2*Math.PI),deg:1/360,grad:1/400,turn:1}},l={colors:s,unitConversions:a},u=function(){function e(){this.parent=null,this.visibilityBlocks=void 0,this.nodeVisible=void 0,this.rootNode=null,this.parsed=null;var e=this;Object.defineProperty(this,"currentFileInfo",{get:function(){return e.fileInfo()}}),Object.defineProperty(this,"index",{get:function(){return e.getIndex()}})}return e.prototype.setParent=function(t,n){function i(t){t&&t instanceof e&&(t.parent=n)}Array.isArray(t)?t.forEach(i):i(t)},e.prototype.getIndex=function(){return this._index||this.parent&&this.parent.getIndex()||0},e.prototype.fileInfo=function(){return this._fileInfo||this.parent&&this.parent.fileInfo()||{}},e.prototype.isRulesetLike=function(){return!1},e.prototype.toCSS=function(e){var t=[];return this.genCSS(e,{add:function(e,n,i){t.push(e)},isEmpty:function(){return 0===t.length}}),t.join("")},e.prototype.genCSS=function(e,t){t.add(this.value)},e.prototype.accept=function(e){this.value=e.visit(this.value)},e.prototype.eval=function(){return this},e.prototype._operate=function(e,t,n,i){switch(t){case"+":return n+i;case"-":return n-i;case"*":return n*i;case"/":return n/i}},e.prototype.fround=function(e,t){var n=e&&e.numPrecision;return n?Number((t+2e-16).toFixed(n)):t},e.compare=function(t,n){if(t.compare&&"Quoted"!==n.type&&"Anonymous"!==n.type)return t.compare(n);if(n.compare)return-n.compare(t);if(t.type===n.type){if(t=t.value,n=n.value,!Array.isArray(t))return t===n?0:void 0;if(t.length===n.length){for(var i=0;it?1:void 0},e.prototype.blocksVisibility=function(){return null==this.visibilityBlocks&&(this.visibilityBlocks=0),0!==this.visibilityBlocks},e.prototype.addVisibilityBlock=function(){null==this.visibilityBlocks&&(this.visibilityBlocks=0),this.visibilityBlocks=this.visibilityBlocks+1},e.prototype.removeVisibilityBlock=function(){null==this.visibilityBlocks&&(this.visibilityBlocks=0),this.visibilityBlocks=this.visibilityBlocks-1},e.prototype.ensureVisibility=function(){this.nodeVisible=!0},e.prototype.ensureInvisibility=function(){this.nodeVisible=!1},e.prototype.isVisible=function(){return this.nodeVisible},e.prototype.visibilityInfo=function(){return{visibilityBlocks:this.visibilityBlocks,nodeVisible:this.nodeVisible}},e.prototype.copyVisibilityInfo=function(e){e&&(this.visibilityBlocks=e.visibilityBlocks,this.nodeVisible=e.nodeVisible)},e}(),c=function(e,t){return(c=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};function h(e,t){function n(){this.constructor=e}c(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var f=function(){return(f=Object.assign||function(e){for(var t,n=1,i=arguments.length;n=6?(r.rgb=[],t.match(/.{2}/g).map((function(e,t){t<3?o.rgb.push(parseInt(e,16)):o.alpha=parseInt(e,16)/255}))):(r.rgb=[],t.split("").map((function(e,t){t<3?o.rgb.push(parseInt(e+e,16)):o.alpha=parseInt(e+e,16)/255}))),r.alpha=r.alpha||("number"==typeof n?n:1),void 0!==i&&(r.value=i),r}return h(t,e),t.prototype.luma=function(){var e=this.rgb[0]/255,t=this.rgb[1]/255,n=this.rgb[2]/255;return.2126*(e=e<=.03928?e/12.92:Math.pow((e+.055)/1.055,2.4))+.7152*(t=t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4))+.0722*(n=n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4))},t.prototype.genCSS=function(e,t){t.add(this.toCSS(e))},t.prototype.toCSS=function(e,t){var n,i,r,o=e&&e.compress&&!t,s=[];if(i=this.fround(e,this.alpha),this.value)if(0===this.value.indexOf("rgb"))i<1&&(r="rgba");else{if(0!==this.value.indexOf("hsl"))return this.value;r=i<1?"hsla":"hsl"}else i<1&&(r="rgba");switch(r){case"rgba":s=this.rgb.map((function(e){return v(Math.round(e),255)})).concat(v(i,1));break;case"hsla":s.push(v(i,1));case"hsl":n=this.toHSL(),s=[this.fround(e,n.h),this.fround(e,100*n.s)+"%",this.fround(e,100*n.l)+"%"].concat(s)}if(r)return r+"("+s.join(","+(o?"":" "))+")";if(n=this.toRGB(),o){var a=n.split("");a[1]===a[2]&&a[3]===a[4]&&a[5]===a[6]&&(n="#"+a[1]+a[3]+a[5])}return n},t.prototype.operate=function(e,n,i){for(var r=new Array(3),o=this.alpha*(1-i.alpha)+i.alpha,s=0;s<3;s++)r[s]=this._operate(e,n,this.rgb[s],i.rgb[s]);return new t(r,o)},t.prototype.toRGB=function(){return d(this.rgb)},t.prototype.toHSL=function(){var e,t,n=this.rgb[0]/255,i=this.rgb[1]/255,r=this.rgb[2]/255,o=this.alpha,s=Math.max(n,i,r),a=Math.min(n,i,r),l=(s+a)/2,u=s-a;if(s===a)e=t=0;else{switch(t=l>.5?u/(2-s-a):u/(s+a),s){case n:e=(i-r)/u+(i=0&&"\n"!==t.charAt(n);)r++;return"number"==typeof e&&(i=(t.slice(0,e).match(/\n/g)||"").length),{line:i,column:r}}function k(e){var t,n=e.length,i=new Array(n);for(t=0;t|Function):(\d+):(\d+)/,V=function(e,t,n){Error.call(this);var i=e.filename||n;if(this.message=e.message,this.stack=e.stack,t&&i){var r=t.contents[i],o=C(e.index,r),s=o.line,a=o.column,l=e.call&&C(e.call,r).line,u=r?r.split("\n"):"";if(this.type=e.type||"Syntax",this.filename=i,this.index=e.index,this.line="number"==typeof s?s+1:null,this.column=a,!this.line&&this.stack){var c=this.stack.match(R),h=new Function("a","throw new Error()"),f=0;try{h()}catch(e){var p=e.stack.match(R);f=1-(s=parseInt(p[2]))}c&&(c[2]&&(this.line=parseInt(c[2])+f),c[3]&&(this.column=parseInt(c[3])))}this.callLine=l+1,this.callExtract=u[l],this.extract=[u[this.line-2],u[this.line-1],u[this.line]]}};if(void 0===Object.create){var F=function(){};F.prototype=Error.prototype,V.prototype=new F}else V.prototype=Object.create(Error.prototype);V.prototype.constructor=V,V.prototype.toString=function(e){e=e||{};var t="",n=this.extract||[],i=[],r=function(e){return e};if(e.stylize){var o=typeof e.stylize;if("function"!==o)throw Error("options.stylize should be a function, got a "+o+"!");r=e.stylize}if(null!==this.line){if("string"==typeof n[0]&&i.push(r(this.line-1+" "+n[0],"grey")),"string"==typeof n[1]){var s=this.line+" ";n[1]&&(s+=n[1].slice(0,this.column)+r(r(r(n[1].substr(this.column,1),"bold")+n[1].slice(this.column+1),"red"),"inverse")),i.push(s)}"string"==typeof n[2]&&i.push(r(this.line+1+" "+n[2],"grey")),i=i.join("\n")+r("","reset")+"\n"}return t+=r(this.type+"Error: "+this.message,"red"),this.filename&&(t+=r(" in ","red")+this.filename),this.line&&(t+=r(" on line "+this.line+", column "+(this.column+1)+":","grey")),t+="\n"+i,this.callLine&&(t+=r("from ","red")+(this.filename||"")+"/n",t+=r(this.callLine,"grey")+" "+this.callExtract+"/n"),t};var $=function(e){function t(t,n,i,r,o,s){var a=e.call(this)||this;return a.extendList=n,a.condition=i,a.evaldCondition=!i,a._index=r,a._fileInfo=o,a.elements=a.getElements(t),a.mixinElements_=void 0,a.copyVisibilityInfo(s),a.setParent(a.elements,a),a}return h(t,e),t.prototype.accept=function(e){this.elements&&(this.elements=e.visitArray(this.elements)),this.extendList&&(this.extendList=e.visitArray(this.extendList)),this.condition&&(this.condition=e.visit(this.condition))},t.prototype.createDerived=function(e,n,i){var r=new t(e=this.getElements(e),n||this.extendList,null,this.getIndex(),this.fileInfo(),this.visibilityInfo());return r.evaldCondition=null!=i?i:this.evaldCondition,r.mediaEmpty=this.mediaEmpty,r},t.prototype.getElements=function(e){return e?("string"==typeof e&&this.parse.parseNode(e,["selector"],this._index,this._fileInfo,(function(t,n){if(t)throw new V({index:t.index,message:t.message},this.parse.imports,this._fileInfo.filename);e=n[0].elements})),e):[new b("","&",!1,this._index,this._fileInfo)]},t.prototype.createEmptySelectors=function(){var e=[new t([new b("","&",!1,this._index,this._fileInfo)],null,null,this._index,this._fileInfo)];return e[0].mediaEmpty=!0,e},t.prototype.match=function(e){var t,n,i=this.elements,r=i.length;if(0===(t=(e=e.mixinElements()).length)||rw.PARENS_DIVISION)||this.parensStack&&this.parensStack.length))},j.Eval.prototype.pathRequiresRewrite=function(e){return(this.rewriteUrls===S?J:W)(e)},j.Eval.prototype.rewritePath=function(e,t){var n;return t=t||"",n=this.normalizePath(t+e),J(e)&&W(t)&&!1===J(n)&&(n="./"+n),n},j.Eval.prototype.normalizePath=function(e){var t,n=e.split("/").reverse();for(e=[];0!==n.length;)switch(t=n.pop()){case".":break;case"..":0===e.length||".."===e[e.length-1]?e.push(t):e.pop();break;default:e.push(t)}return e.join("/")};var H=function e(t){return{_data:{},add:function(e,t){e=e.toLowerCase(),this._data.hasOwnProperty(e),this._data[e]=t},addMultiple:function(e){var t=this;Object.keys(e).forEach((function(n){t.add(n,e[n])}))},get:function(e){return this._data[e]||t&&t.get(e)},getLocalFunctions:function(){return this._data},inherit:function(){return e(this)},create:function(t){return e(t)}}}(null),Q={eval:function(){var e=this.value_,t=this.error_;if(t)throw t;if(null!=e)return e?L.True:L.False},value:function(e){this.value_=e},error:function(e){this.error_=e},reset:function(){this.value_=this.error_=null}},K=function(e){function t(t,n,i,r){var o=e.call(this)||this;return o.selectors=t,o.rules=n,o._lookups={},o._variables=null,o._properties=null,o.strictImports=i,o.copyVisibilityInfo(r),o.allowRoot=!0,o.setParent(o.selectors,o),o.setParent(o.rules,o),o}return h(t,e),t.prototype.isRulesetLike=function(){return!0},t.prototype.accept=function(e){this.paths?this.paths=e.visitArray(this.paths,!0):this.selectors&&(this.selectors=e.visitArray(this.selectors)),this.rules&&this.rules.length&&(this.rules=e.visitArray(this.rules))},t.prototype.eval=function(e){var n,i,r,o,s,a=!1;if(this.selectors&&(i=this.selectors.length)){for(n=new Array(i),Q.error({type:"Syntax",message:"it is currently only allowed in parametric mixin guards,"}),o=0;o0;e--){var t=this.rules[e-1];if(t instanceof B)return this.parseValue(t)}},t.prototype.parseValue=function(e){var t=this;function n(e){return e.value instanceof N&&!e.parsed?("string"==typeof e.value.value?this.parse.parseNode(e.value.value,["value","important"],e.value.getIndex(),e.fileInfo(),(function(t,n){t&&(e.parsed=!0),n&&(e.value=n[0],e.important=n[1]||"",e.parsed=!0)})):e.parsed=!0,e):e}if(Array.isArray(e)){var i=[];return e.forEach((function(e){i.push(n.call(t,e))})),i}return n.call(t,e)},t.prototype.rulesets=function(){if(!this.rules)return[];var e,t,n=[],i=this.rules;for(e=0;t=i[e];e++)t.isRuleset&&n.push(t);return n},t.prototype.prependRule=function(e){var t=this.rules;t?t.unshift(e):this.rules=[e],this.setParent(e,this)},t.prototype.find=function(e,t,n){t=t||this;var i,r,o=[],s=e.toCSS();return s in this._lookups?this._lookups[s]:(this.rulesets().forEach((function(s){if(s!==t)for(var a=0;ai){if(!n||n(s)){r=s.find(new $(e.elements.slice(i)),t,n);for(var l=0;l0&&t.add(l),e.firstSelector=!0,s[0].genCSS(e,t),e.firstSelector=!1,i=1;i0?(o=(r=k(e)).pop(),s=i.createDerived(k(o.elements))):s=i.createDerived([]),t.length>0){var a=n.combinator,l=t[0].elements[0];a.emptyOrWhitespace&&!l.combinator.emptyOrWhitespace&&(a=l.combinator),s.elements.push(new b(a,l.value,n.isVariable,n._index,n._fileInfo)),s.elements=s.elements.concat(t[0].elements.slice(1))}if(0!==s.elements.length&&r.push(s),t.length>1){var u=t.slice(1);u=u.map((function(e){return e.createDerived(e.elements,[])})),r=r.concat(u)}return r}function s(e,t,n,i,r){var s;for(s=0;s0?i[i.length-1]=i[i.length-1].createDerived(i[i.length-1].elements.concat(e)):i.push(new $(e));else t.push([new $(e)])}function l(e,t){var n=t.createDerived(t.elements,t.extendList,t.evaldCondition);return n.copyVisibilityInfo(e),n}var u,c;if(!function e(t,n,l){var u,c,h,f,p,v,d,g,y,w,x,S,I=!1;for(f=[],p=[[]],u=0;g=l.elements[u];u++)if("&"!==g.value){var C=(S=void 0,(x=g).value instanceof m&&(S=x.value.value)instanceof $?S:null);if(null!=C){a(f,p);var k,_=[],A=[];for(k=e(_,n,C),I=I||k,h=0;h<_.length;h++){s(p,[r(i(_[h],g),g)],g,l,A)}p=A,f=[]}else f.push(g)}else{for(I=!0,v=[],a(f,p),c=0;c0&&d[0].elements.push(new b(g.combinator,"",g.isVariable,g._index,g._fileInfo)),v.push(d);else for(h=0;h0&&(t.push(p[u]),w=p[u][y-1],p[u][y-1]=w.createDerived(w.elements,l.extendList));return I}(c=[],t,n))if(t.length>0)for(c=[],u=0;u0)for(t=0;t-1e-6&&(i=n.toFixed(20).replace(/0+$/,"")),e&&e.compress){if(0===n&&this.unit.isLength())return void t.add(i);n>0&&n<1&&(i=i.substr(1))}t.add(i),this.unit.genCSS(e,t)},t.prototype.operate=function(e,n,i){var r=this._operate(e,n,this.value,i.value),o=this.unit.clone();if("+"===n||"-"===n)if(0===o.numerator.length&&0===o.denominator.length)o=i.unit.clone(),this.unit.backupUnit&&(o.backupUnit=this.unit.backupUnit);else if(0===i.unit.numerator.length&&0===o.denominator.length);else{if(i=i.convertTo(this.unit.usedUnits()),e.strictUnits&&i.unit.toString()!==o.toString())throw new Error("Incompatible units. Change the units or use the unit function. Bad units: '"+o.toString()+"' and '"+i.unit.toString()+"'.");r=this._operate(e,n,this.value,i.value)}else"*"===n?(o.numerator=o.numerator.concat(i.unit.numerator).sort(),o.denominator=o.denominator.concat(i.unit.denominator).sort(),o.cancel()):"/"===n&&(o.numerator=o.numerator.concat(i.unit.denominator).sort(),o.denominator=o.denominator.concat(i.unit.numerator).sort(),o.cancel());return new t(r,o)},t.prototype.compare=function(e){var n,i;if(e instanceof t){if(this.unit.isEmpty()||e.unit.isEmpty())n=this,i=e;else if(n=this.unify(),i=e.unify(),0!==n.unit.compare(i.unit))return;return u.numericCompare(n.value,i.value)}},t.prototype.unify=function(){return this.convertTo({length:"px",duration:"s",angle:"rad"})},t.prototype.convertTo=function(e){var n,i,r,o,s,l=this.value,u=this.unit.clone(),c={};if("string"==typeof e){for(n in a)a[n].hasOwnProperty(e)&&((c={})[n]=e);e=c}for(i in s=function(e,t){return r.hasOwnProperty(e)?(t?l/=r[e]/r[o]:l*=r[e]/r[o],o):e},e)e.hasOwnProperty(i)&&(o=e[i],r=a[i],u.map(s));return u.cancel(),new t(l,u)},t}(u);ee.prototype.type="Dimension";var te=w,ne=function(e){function t(t,n,i){var r=e.call(this)||this;return r.op=t.trim(),r.operands=n,r.isSpaced=i,r}return h(t,e),t.prototype.accept=function(e){this.operands=e.visitArray(this.operands)},t.prototype.eval=function(e){var n,i=this.operands[0].eval(e),r=this.operands[1].eval(e);if(e.isMathOn(this.op)){if(n="./"===this.op?"/":this.op,i instanceof ee&&r instanceof p&&(i=i.toColor()),r instanceof ee&&i instanceof p&&(r=r.toColor()),!i.operate){if(i instanceof t&&"/"===i.op&&e.math===te.PARENS_DIVISION)return new t(this.op,[i,r],this.isSpaced);throw{type:"Operation",message:"Operation on an invalid type"}}return i.operate(e,n,r)}return new t(this.op,[i,r],this.isSpaced)},t.prototype.genCSS=function(e,t){this.operands[0].genCSS(e,t),this.isSpaced&&t.add(" "),t.add(this.op),this.isSpaced&&t.add(" "),this.operands[1].genCSS(e,t)},t}(u);ne.prototype.type="Operation";var ie=function(e){function t(t,n){var i=e.call(this)||this;if(i.value=t,i.noSpacing=n,!t)throw new Error("Expression requires an array parameter");return i}return h(t,e),t.prototype.accept=function(e){this.value=e.visitArray(this.value)},t.prototype.eval=function(e){var n,i=e.isMathOn(),r=this.parens,o=!1;return r&&e.inParenthesis(),this.value.length>1?n=new t(this.value.map((function(t){return t.eval?t.eval(e):t})),this.noSpacing):1===this.value.length?(!this.value[0].parens||this.value[0].parensInOp||e.inCalc||(o=!0),n=this.value[0].eval(e)):n=this,r&&e.outOfParenthesis(),!this.parens||!this.parensInOp||i||o||n instanceof ee||(n=new m(n)),n},t.prototype.genCSS=function(e,t){for(var n=0;n1){var n=new $([],null,null,this.getIndex(),this.fileInfo()).createEmptySelectors();(t=new K(n,e.mediaBlocks)).multiMedia=!0,t.copyVisibilityInfo(this.visibilityInfo()),this.setParent(t,this)}return delete e.mediaBlocks,delete e.mediaPath,t},t.prototype.evalNested=function(e){var t,n,i=e.mediaPath.concat([this]);for(t=0;t0;t--)e.splice(t,0,new N("and"));return new ie(e)}))),this.setParent(this.features,this),new K([],[])},t.prototype.permute=function(e){if(0===e.length)return[];if(1===e.length)return e[0];for(var t=[],n=this.permute(e.slice(1)),i=0;i1?"["+e.value.map((function(e){return e.toCSS()})).join(", ")+"]":e.toCSS()},t}(u));pe.prototype.type="JavaScript";var ve=function(e){function t(t,n){var i=e.call(this)||this;return i.key=t,i.value=n,i}return h(t,e),t.prototype.accept=function(e){this.value=e.visit(this.value)},t.prototype.eval=function(e){return this.value.eval?new t(this.key,this.value.eval(e)):this},t.prototype.genCSS=function(e,t){t.add(this.key+"="),this.value.genCSS?this.value.genCSS(e,t):t.add(this.value)},t}(u);ve.prototype.type="Assignment";var de=function(e){function t(t,n,i,r,o){var s=e.call(this)||this;return s.op=t.trim(),s.lvalue=n,s.rvalue=i,s._index=r,s.negate=o,s}return h(t,e),t.prototype.accept=function(e){this.lvalue=e.visit(this.lvalue),this.rvalue=e.visit(this.rvalue)},t.prototype.eval=function(e){var t=function(e,t,n){switch(e){case"and":return t&&n;case"or":return t||n;default:switch(u.compare(t,n)){case-1:return"<"===e||"=<"===e||"<="===e;case 0:return"="===e||">="===e||"=<"===e||"<="===e;case 1:return">"===e||">="===e;default:return!1}}}(this.op,this.lvalue.eval(e),this.rvalue.eval(e));return this.negate?!t:t},t}(u);de.prototype.type="Condition";var me=function(e){function t(t){var n=e.call(this)||this;return n.value=t,n}return h(t,e),t}(u);me.prototype.type="UnicodeDescriptor";var ge=function(e){function t(t){var n=e.call(this)||this;return n.value=t,n}return h(t,e),t.prototype.genCSS=function(e,t){t.add("-"),this.value.genCSS(e,t)},t.prototype.eval=function(e){return e.isMathOn()?new ne("*",[new ee(-1),this.value]).eval(e):new t(this.value.eval(e))},t}(u);ge.prototype.type="Negative";var ye=function(e){function t(n,i,r,o,s){var a=e.call(this)||this;switch(a.selector=n,a.option=i,a.object_id=t.next_id++,a.parent_ids=[a.object_id],a._index=r,a._fileInfo=o,a.copyVisibilityInfo(s),a.allowRoot=!0,i){case"all":a.allowBefore=!0,a.allowAfter=!0;break;default:a.allowBefore=!1,a.allowAfter=!1}return a.setParent(a.selector,a),a}return h(t,e),t.prototype.accept=function(e){this.selector=e.visit(this.selector)},t.prototype.eval=function(e){return new t(this.selector.eval(e),this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},t.prototype.clone=function(e){return new t(this.selector,this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},t.prototype.findSelfSelectors=function(e){var t,n,i=[];for(t=0;t0&&n.length&&""===n[0].combinator.value&&(n[0].combinator.value=" "),i=i.concat(e[t].elements);this.selfSelectors=[new $(i)],this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo())},t}(u);ye.next_id=0,ye.prototype.type="Extend";var be=function(e){function t(t,n,i){var r=e.call(this)||this;return r.variable=t,r._index=n,r._fileInfo=i,r.allowRoot=!0,r}return h(t,e),t.prototype.eval=function(e){var t,n=new se(this.variable,this.getIndex(),this.fileInfo()).eval(e),i=new V({message:"Could not evaluate variable call "+this.variable});if(!n.ruleset){if(n.rules)t=n;else if(Array.isArray(n))t=new K("",n);else{if(!Array.isArray(n.value))throw i;t=new K("",n.value)}n=new X(t)}if(n.ruleset)return n.callEval(e);throw i},t}(u);be.prototype.type="VariableCall";var we=function(e){function t(t,n,i,r){var o=e.call(this)||this;return o.value=t,o.lookups=n,o._index=i,o._fileInfo=r,o}return h(t,e),t.prototype.eval=function(e){var t,n,i=this.value.eval(e);for(t=0;tthis.params.length)return!1}n=Math.min(o,this.arity);for(var s=0;s0){for(c=!0,a=0;a0)f=2;else if(f=1,p[1]+p[2]>1)throw{type:"Runtime",message:"Ambiguous use of `default()` found when matching for `"+this.format(m)+"`",index:this.getIndex(),filename:this.fileInfo().filename};for(a=0;a0&&(e=e.slice(0,t)),(t=e.lastIndexOf("/"))<0&&(t=e.lastIndexOf("\\")),t<0?"":e.slice(0,t+1)},e.prototype.tryAppendExtension=function(e,t){return/(\.[a-z]*$)|([\?;].*)$/.test(e)?e:e+t},e.prototype.tryAppendLessExtension=function(e){return this.tryAppendExtension(e,".less")},e.prototype.supportsSync=function(){return!1},e.prototype.alwaysMakePathsAbsolute=function(){return!1},e.prototype.isPathAbsolute=function(e){return/^(?:[a-z-]+:|\/|\\|#)/i.test(e)},e.prototype.join=function(e,t){return e?e+t:t},e.prototype.pathDiff=function(e,t){var n,i,r,o,s=this.extractUrlParts(e),a=this.extractUrlParts(t),l="";if(s.hostPart!==a.hostPart)return"";for(i=Math.max(a.directories.length,s.directories.length),n=0;nparseInt(t[n])?-1:1;return 0},e.prototype.versionToString=function(e){for(var t="",n=0;n0;){var e=this.imports[0];if(!e.isReady)return;this.imports=this.imports.slice(1),e.callback.apply(null,e.args)}if(0===this.variableImports.length)break;var t=this.variableImports[0];this.variableImports=this.variableImports.slice(1),t()}}finally{this._currentDepth--}0===this._currentDepth&&this._onSequencerEmpty&&this._onSequencerEmpty()},e}(),Re=function(e,t){this._visitor=new Ee(this),this._importer=e,this._finish=t,this.context=new j.Eval,this.importCount=0,this.onceFileDetectionMap={},this.recursionDetector={},this._sequencer=new Pe(this._onSequencerEmpty.bind(this))};Re.prototype={isReplacing:!1,run:function(e){try{this._visitor.visit(e)}catch(e){this.error=e}this.isFinished=!0,this._sequencer.tryRun()},_onSequencerEmpty:function(){this.isFinished&&this._finish(this.error)},visitImport:function(e,t){var n=e.options.inline;if(!e.css||n){var i=new j.Eval(this.context,k(this.context.frames)),r=i.frames[0];this.importCount++,e.isVariableImport()?this._sequencer.addVariableImport(this.processImportNode.bind(this,e,i,r)):this.processImportNode(e,i,r)}t.visitDeeper=!1},processImportNode:function(e,t,n){var i,r=e.options.inline;try{i=e.evalForImport(t)}catch(t){t.filename||(t.index=e.getIndex(),t.filename=e.fileInfo().filename),e.css=!0,e.error=t}if(!i||i.css&&!r)this.importCount--,this.isFinished&&this._sequencer.tryRun();else{i.options.multiple&&(t.importMultiple=!0);for(var o=void 0===i.css,s=0;s=0||(a=[u.selfSelectors[0]],(o=f.findMatch(l,a)).length&&(l.hasFoundMatches=!0,l.selfSelectors.forEach((function(e){var t=u.visibilityInfo();s=f.extendSelector(o,a,e,l.isVisible()),(c=new Ie.Extend(u.selector,u.option,0,u.fileInfo(),t)).selfSelectors=s,s[s.length-1].extendList=[c],h.push(c),c.ruleset=u.ruleset,c.parent_ids=c.parent_ids.concat(u.parent_ids,l.parent_ids),u.firstExtendOnThisSelectorPath&&(c.firstExtendOnThisSelectorPath=!0,u.ruleset.paths.push(s))}))));if(h.length){if(this.extendChainCount++,n>100){var p="{unable to calculate}",v="{unable to calculate}";try{p=h[0].selfSelectors[0].toCSS(),v=h[0].selector.toCSS()}catch(e){}throw{message:"extend circular reference detected. One of the circular extends is currently:"+p+":extend("+v+")"}}return h.concat(f.doExtendChaining(h,t,n+1))}return h},e.prototype.visitDeclaration=function(e,t){t.visitDeeper=!1},e.prototype.visitMixinDefinition=function(e,t){t.visitDeeper=!1},e.prototype.visitSelector=function(e,t){t.visitDeeper=!1},e.prototype.visitRuleset=function(e,t){if(!e.root){var n,i,r,o,s=this.allExtendsStack[this.allExtendsStack.length-1],a=[],l=this;for(r=0;r0&&u[l.matched].combinator.value!==s?l=null:l.matched++,l&&(l.finished=l.matched===u.length,l.finished&&!e.allowAfter&&(r+1u&&c>0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[u].elements.slice(c)),c=0,u++),l=o.elements.slice(c,a.index).concat([s]).concat(n.elements.slice(1)),u===a.pathIndex&&r>0?h[h.length-1].elements=h[h.length-1].elements.concat(l):(h=h.concat(t.slice(u,a.pathIndex))).push(new Ie.Selector(l)),u=a.endPathIndex,(c=a.endPathElementIndex)>=t[u].elements.length&&(c=0,u++);return u0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[u].elements.slice(c)),u++),h=(h=h.concat(t.slice(u,t.length))).map((function(e){var t=e.createDerived(e.elements);return i?t.ensureVisibility():t.ensureInvisibility(),t}))},e.prototype.visitMedia=function(e,t){var n=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);n=n.concat(this.doExtendChaining(n,e.allExtends)),this.allExtendsStack.push(n)},e.prototype.visitMediaOut=function(e){var t=this.allExtendsStack.length-1;this.allExtendsStack.length=t},e.prototype.visitAtRule=function(e,t){var n=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);n=n.concat(this.doExtendChaining(n,e.allExtends)),this.allExtendsStack.push(n)},e.prototype.visitAtRuleOut=function(e){var t=this.allExtendsStack.length-1;this.allExtendsStack.length=t},e}(),Oe=function(){function e(){this.contexts=[[]],this._visitor=new Ee(this)}return e.prototype.run=function(e){return this._visitor.visit(e)},e.prototype.visitDeclaration=function(e,t){t.visitDeeper=!1},e.prototype.visitMixinDefinition=function(e,t){t.visitDeeper=!1},e.prototype.visitRuleset=function(e,t){var n,i=this.contexts[this.contexts.length-1],r=[];this.contexts.push(r),e.root||((n=e.selectors)&&(n=n.filter((function(e){return e.getIsOutput()})),e.selectors=n.length?n:n=null,n&&e.joinSelectors(r,i,n)),n||(e.rules=null),e.paths=r)},e.prototype.visitRulesetOut=function(e){this.contexts.length=this.contexts.length-1},e.prototype.visitMedia=function(e,t){var n=this.contexts[this.contexts.length-1];e.rules[0].root=0===n.length||n[0].multiMedia},e.prototype.visitAtRule=function(e,t){var n=this.contexts[this.contexts.length-1];e.rules&&e.rules.length&&(e.rules[0].root=e.isRooted||0===n.length||null)},e}(),Le=function(){function e(e){this._visitor=new Ee(this),this._context=e}return e.prototype.containsSilentNonBlockedChild=function(e){var t;if(!e)return!1;for(var n=0;n0},e.prototype.resolveVisibility=function(e,t){if(!e.blocksVisibility()){if(this.isEmpty(e)&&!this.containsSilentNonBlockedChild(t))return;return e}var n=e.rules[0];if(this.keepOnlyVisibleChilds(n),!this.isEmpty(n))return e.ensureVisibility(),e.removeVisibilityBlock(),e},e.prototype.isVisibleRuleset=function(e){return!!e.firstRoot||!this.isEmpty(e)&&!(!e.root&&!this.hasVisibleSelector(e))},e}(),Ne=function(e){this._visitor=new Ee(this),this._context=e,this.utils=new Le(e)};Ne.prototype={isReplacing:!0,run:function(e){return this._visitor.visit(e)},visitDeclaration:function(e,t){if(!e.blocksVisibility()&&!e.variable)return e},visitMixinDefinition:function(e,t){e.frames=[]},visitExtend:function(e,t){},visitComment:function(e,t){if(!e.blocksVisibility()&&!e.isSilent(this._context))return e},visitMedia:function(e,t){var n=e.rules[0].rules;return e.accept(this._visitor),t.visitDeeper=!1,this.utils.resolveVisibility(e,n)},visitImport:function(e,t){if(!e.blocksVisibility())return e},visitAtRule:function(e,t){return e.rules&&e.rules.length?this.visitAtRuleWithBody(e,t):this.visitAtRuleWithoutBody(e,t)},visitAnonymous:function(e,t){if(!e.blocksVisibility())return e.accept(this._visitor),e},visitAtRuleWithBody:function(e,t){var n=function(e){var t=e.rules;return function(e){var t=e.rules;return 1===t.length&&(!t[0].paths||0===t[0].paths.length)}(e)?t[0].rules:t}(e);return e.accept(this._visitor),t.visitDeeper=!1,this.utils.isEmpty(e)||this._mergeRules(e.rules[0].rules),this.utils.resolveVisibility(e,n)},visitAtRuleWithoutBody:function(e,t){if(!e.blocksVisibility()){if("@charset"===e.name){if(this.charset){if(e.debugInfo){var n=new Ie.Comment("/* "+e.toCSS(this._context).replace(/\n/g,"")+" */\n");return n.debugInfo=e.debugInfo,this._visitor.visit(n)}return}this.charset=!0}return e}},checkValidNodes:function(e,t){if(e)for(var n=0;n0?e.accept(this._visitor):e.rules=null,t.visitDeeper=!1}return e.rules&&(this._mergeRules(e.rules),this._removeDuplicateRules(e.rules)),this.utils.isVisibleRuleset(e)&&(e.ensureVisibility(),i.splice(0,0,e)),1===i.length?i[0]:i},_compileRulesetPaths:function(e){e.paths&&(e.paths=e.paths.filter((function(e){var t;for(" "===e[0].elements[0].combinator.value&&(e[0].elements[0].combinator=new Ie.Combinator("")),t=0;t=0;i--)if((n=e[i])instanceof Ie.Declaration)if(r[n.name]){(t=r[n.name])instanceof Ie.Declaration&&(t=r[n.name]=[r[n.name].toCSS(this._context)]);var o=n.toCSS(this._context);-1!==t.indexOf(o)?e.splice(i,1):t.push(o)}else r[n.name]=n}},_mergeRules:function(e){if(e){for(var t={},n=[],i=0;i0){var t=e[0],n=[],i=[new Ie.Expression(n)];e.forEach((function(e){"+"===e.merge&&n.length>0&&i.push(new Ie.Expression(n=[])),n.push(e.value),t.important=t.important||e.important})),t.value=new Ie.Value(i)}}))}}};var De={Visitor:Ee,ImportVisitor:Re,MarkVisibleSelectorsVisitor:Ve,ExtendVisitor:$e,JoinSelectorVisitor:Oe,ToCSSVisitor:Ne};var Be=function(){var e,t,n,i,r,o,s,a=[],l={};function u(n){for(var i,a,c,h=l.i,f=t,p=l.i-s,v=l.i+o.length-p,d=l.i+=n,m=e;l.i=0){c={index:l.i,text:m.substr(l.i,y+2-l.i),isLineComment:!1},l.i+=c.text.length-1,l.commentStore.push(c);continue}}break}if(32!==i&&10!==i&&9!==i&&13!==i)break}if(o=o.slice(n+l.i-d+p),s=l.i,!o.length){if(tn||l.i===n&&e&&!i)&&(n=l.i,i=e);var r=a.pop();o=r.current,s=l.i=r.i,t=r.j},l.forget=function(){a.pop()},l.isWhitespace=function(t){var n=l.i+(t||0),i=e.charCodeAt(n);return 32===i||13===i||9===i||10===i},l.$re=function(e){l.i>s&&(o=o.slice(l.i-s),s=l.i);var t=e.exec(o);return t?(u(t[0].length),"string"==typeof t?t:1===t.length?t[0]:t):null},l.$char=function(t){return e.charAt(l.i)!==t?null:(u(1),t)},l.$str=function(t){for(var n=t.length,i=0;ih&&(d=!1)}}while(d);return r||null},l.autoCommentAbsorb=!0,l.commentStore=[],l.finished=!1,l.peek=function(t){if("string"==typeof t){for(var n=0;n57||t<43||47===t||44===t},l.start=function(i,a,c){e=i,l.i=t=s=n=0,r=a?function(e,t){var n,i,r,o,s,a,l,u,c,h=e.length,f=0,p=0,v=[],d=0;function m(t){var n=s-d;n<512&&!t||!n||(v.push(e.slice(d,s+1)),d=s+1)}for(s=0;s=97&&l<=122||l<34))switch(l){case 40:p++,i=s;continue;case 41:if(--p<0)return t("missing opening `(`",s);continue;case 59:p||m();continue;case 123:f++,n=s;continue;case 125:if(--f<0)return t("missing opening `{`",s);f||p||m();continue;case 92:if(s96)){if(u==l){c=1;break}if(92==u){if(s==h-1)return t("unescaped `\\`",s);s++}}if(c)continue;return t("unmatched `"+String.fromCharCode(l)+"`",a);case 47:if(p||s==h-1)continue;if(47==(u=e.charCodeAt(s+1)))for(s+=2;sn&&o>r?"missing closing `}` or `*/`":"missing closing `}`",n):0!==p?t("missing closing `)`",i):(m(!0),v)}(i,c):[i],o=r[0],u(0)},l.end=function(){var t,r=l.i>=e.length;return l.i=e.length-1,furthestChar:e[l.i]}},l},Ue=function e(t,n,i){var r,o=Be();function s(e,t){throw new V({index:o.i,filename:i.filename,type:t||"Syntax",message:e},n)}function a(e,t){var n=e instanceof Function?e.call(r):o.$re(e);if(n)return n;s(t||("string"==typeof e?"expected '"+e+"' got '"+o.currentChar()+"'":"unexpected token"))}function l(e,t){if(o.$char(e))return e;s(t||"expected '"+e+"' got '"+o.currentChar()+"'")}function u(e){var t=i.filename;return{lineNumber:C(e,o.getInput()).line+1,fileName:t}}return{parserInput:o,imports:n,fileInfo:i,parseNode:function(e,t,i,s,a){var l,u=[],c=o;try{c.start(e,!1,(function(e,t){a({message:e,index:t+i})}));for(var h=0,f=void 0,p=void 0;f=t[h];h++)if(p=c.i,l=r[f]()){try{l._index=p+i,l._fileInfo=s}catch(e){}u.push(l)}else u.push(null);c.end().isFinished?a(null,u):a(!0,null)}catch(e){throw new V({index:e.index+i,message:e.message},n,s.filename)}},parse:function(r,s,a){var l,u,c,h,f=null,p="";if(u=a&&a.globalVars?e.serializeVars(a.globalVars)+"\n":"",c=a&&a.modifyVars?"\n"+e.serializeVars(a.modifyVars):"",t.pluginManager)for(var v=t.pluginManager.getPreProcessors(),d=0;d");return e},args:function(e){var t,n,i,a,l,u,c,h=r.entities,f={args:null,variadic:!1},p=[],v=[],d=[],m=!0;for(o.save();;){if(e)u=r.detachedRuleset()||r.expression();else{if(o.commentStore.length=0,o.$str("...")){f.variadic=!0,o.$char(";")&&!t&&(t=!0),(t?v:d).push({variadic:!0});break}u=h.variable()||h.property()||h.literal()||h.keyword()||this.call(!0)}if(!u||!m)break;a=null,u.throwAwayComments&&u.throwAwayComments(),l=u;var g=null;if(e?u.value&&1==u.value.length&&(g=u.value[0]):g=u,g&&(g instanceof Ie.Variable||g instanceof Ie.Property))if(o.$char(":")){if(p.length>0&&(t&&s("Cannot mix ; and , as delimiter types"),n=!0),!(l=r.detachedRuleset()||r.expression())){if(!e)return o.restore(),f.args=[],f;s("could not understand value for named argument")}a=i=g.name}else if(o.$str("...")){if(!e){f.variadic=!0,o.$char(";")&&!t&&(t=!0),(t?v:d).push({name:u.name,variadic:!0});break}c=!0}else e||(i=a=g.name,l=null);l&&p.push(l),d.push({name:a,value:l,expand:c}),o.$char(",")?m=!0:((m=";"===o.$char(";"))||t)&&(n&&s("Cannot mix ; and , as delimiter types"),t=!0,p.length>1&&(l=new Ie.Value(p)),v.push({name:i,value:l,expand:c}),i=null,p=[],n=!1)}return o.forget(),f.args=t?v:d,f},definition:function(){var e,t,n,i,s=[],l=!1;if(!("."!==o.currentChar()&&"#"!==o.currentChar()||o.peek(/^[^{]*\}/)))if(o.save(),t=o.$re(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/)){e=t[1];var u=this.args(!1);if(s=u.args,l=u.variadic,!o.$char(")"))return void o.restore("Missing closing ')'");if(o.commentStore.length=0,o.$str("when")&&(i=a(r.conditions,"expected condition")),n=r.block())return o.forget(),new Ie.mixin.Definition(e,s,n,i,l);o.restore()}else o.restore()},ruleLookups:function(){var e,t=[];if("["===o.currentChar()){for(;;){if(o.save(),!(e=this.lookupValue())&&""!==e){o.restore();break}t.push(e),o.forget()}return t.length>0?t:void 0}},lookupValue:function(){if(o.save(),o.$char("[")){var e=o.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);if(o.$char("]"))return e||""===e?(o.forget(),e):void o.restore();o.restore()}else o.restore()}},entity:function(){var e=this.entities;return this.comment()||e.literal()||e.variable()||e.url()||e.property()||e.call()||e.keyword()||this.mixin.call(!0)||e.javascript()},end:function(){return o.$char(";")||o.peek("}")},ieAlpha:function(){var e;if(o.$re(/^opacity=/i))return(e=o.$re(/^\d+/))||(e="@{"+(e=a(r.entities.variable,"Could not parse alpha")).name.slice(1)+"}"),l(")"),new Ie.Quoted("","alpha(opacity="+e+")")},element:function(){var e,t,n,r=o.i;if(t=this.combinator(),(e=o.$re(/^(?:\d+\.\d+|\d+)%/)||o.$re(/^(?:[.#]?|:*)(?:[\w-]|[^\x00-\x9f]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/)||o.$char("*")||o.$char("&")||this.attribute()||o.$re(/^\([^&()@]+\)/)||o.$re(/^[\.#:](?=@)/)||this.entities.variableCurly())||(o.save(),o.$char("(")?(n=this.selector(!1))&&o.$char(")")?(e=new Ie.Paren(n),o.forget()):o.restore("Missing closing ')'"):o.forget()),e)return new Ie.Element(t,e,e instanceof Ie.Variable,r,i)},combinator:function(){var e=o.currentChar();if("/"===e){o.save();var t=o.$re(/^\/[a-z]+\//i);if(t)return o.forget(),new Ie.Combinator(t);o.restore()}if(">"===e||"+"===e||"~"===e||"|"===e||"^"===e){for(o.i++,"^"===e&&"^"===o.currentChar()&&(e="^^",o.i++);o.isWhitespace();)o.i++;return new Ie.Combinator(e)}return o.isWhitespace(-1)?new Ie.Combinator(" "):new Ie.Combinator(null)},selector:function(e){var t,n,r,l,u,c,h,f=o.i;for(e=!1!==e;(e&&(n=this.extend())||e&&(c=o.$str("when"))||(l=this.element()))&&(c?h=a(this.conditions,"expected condition"):h?s("CSS guard can only be used at the end of selector"):n?u=u?u.concat(n):n:(u&&s("Extend can only be used at the end of selector"),r=o.currentChar(),t?t.push(l):t=[l],l=null),"{"!==r&&"}"!==r&&";"!==r&&","!==r&&")"!==r););if(t)return new Ie.Selector(t,u,h,f,i);u&&s("Extend must be used to extend a selector, it cannot be used on its own")},selectors:function(){for(var e,t;(e=this.selector())&&(t?t.push(e):t=[e],o.commentStore.length=0,e.condition&&t.length>1&&s("Guards are only currently allowed on a single selector."),o.$char(","));)e.condition&&s("Guards are only currently allowed on a single selector."),o.commentStore.length=0;return t},attribute:function(){if(o.$char("[")){var e,t,n,i=this.entities;return(e=i.variableCurly())||(e=a(/^(?:[_A-Za-z0-9-\*]*\|)?(?:[_A-Za-z0-9-]|\\.)+/)),(n=o.$re(/^[|~*$^]?=/))&&(t=i.quoted()||o.$re(/^[0-9]+%/)||o.$re(/^[\w-]+/)||i.variableCurly()),l("]"),new Ie.Attribute(e,n,t)}},block:function(){var e;if(o.$char("{")&&(e=this.primary())&&o.$char("}"))return e},blockRuleset:function(){var e=this.block();return e&&(e=new Ie.Ruleset(null,e)),e},detachedRuleset:function(){var e,t,n;if(o.save(),!o.$re(/^[.#]\(/)||(t=(e=this.mixin.args(!1)).args,n=e.variadic,o.$char(")"))){var i=this.blockRuleset();if(i)return o.forget(),t?new Ie.mixin.Definition(null,t,i,null,n):new Ie.DetachedRuleset(i);o.restore()}else o.restore()},ruleset:function(){var e,n,i;if(o.save(),t.dumpLineNumbers&&(i=u(o.i)),(e=this.selectors())&&(n=this.block())){o.forget();var r=new Ie.Ruleset(e,n,t.strictImports);return t.dumpLineNumbers&&(r.debugInfo=i),r}o.restore()},declaration:function(){var e,t,n,r,s,a,l=o.i,u=o.currentChar();if("."!==u&&"#"!==u&&"&"!==u&&":"!==u)if(o.save(),e=this.variable()||this.ruleProperty()){if((a="string"==typeof e)&&(t=this.detachedRuleset())&&(n=!0),o.commentStore.length=0,!t){if(s=!a&&e.length>1&&e.pop().value,t=e[0].value&&"--"===e[0].value.slice(0,2)?this.permissiveValue():this.anonymousValue())return o.forget(),new Ie.Declaration(e,t,!1,s,l,i);t||(t=this.value()),t?r=this.important():a&&(t=this.permissiveValue())}if(t&&(this.end()||n))return o.forget(),new Ie.Declaration(e,t,r,s,l,i);o.restore()}else o.restore()},anonymousValue:function(){var e=o.i,t=o.$re(/^([^.#@\$+\/'"*`(;{}-]*);/);if(t)return new Ie.Anonymous(t[1],e)},permissiveValue:function(e){var t,n,r,a,l=e||";",u=o.i,c=[];function h(){var e=o.currentChar();return"string"==typeof l?e===l:l.test(e)}if(!h()){a=[];do{((n=this.comment())||(n=this.entity()))&&a.push(n)}while(n);if(r=h(),a.length>0){if(a=new Ie.Expression(a),r)return a;c.push(a)," "===o.prevChar()&&c.push(new Ie.Anonymous(" ",u))}if(o.save(),a=o.$parseUntil(l)){if("string"==typeof a&&s("Expected '"+a+"'","Parse"),1===a.length&&" "===a[0])return o.forget(),new Ie.Anonymous("",u);var f=void 0;for(t=0;t0)return new Ie.Expression(r)},mediaFeatures:function(){var e,t=this.entities,n=[];do{if(e=this.mediaFeature()){if(n.push(e),!o.$char(","))break}else if((e=t.variable()||t.mixinLookup())&&(n.push(e),!o.$char(",")))break}while(e);return n.length>0?n:null},media:function(){var e,n,r,a,l=o.i;if(t.dumpLineNumbers&&(a=u(l)),o.save(),o.$str("@media"))return e=this.mediaFeatures(),(n=this.block())||s("media definitions require block statements after any features"),o.forget(),r=new Ie.Media(n,e,l,i),t.dumpLineNumbers&&(r.debugInfo=a),r;o.restore()},plugin:function(){var e,t,n,r=o.i;if(o.$re(/^@plugin?\s+/)){if(n=(t=this.pluginArgs())?{pluginArgs:t,isPlugin:!0}:{isPlugin:!0},e=this.entities.quoted()||this.entities.url())return o.$char(";")||(o.i=r,s("missing semi-colon on @plugin")),new Ie.Import(e,null,n,r,i);o.i=r,s("malformed @plugin statement")}},pluginArgs:function(){if(o.save(),!o.$char("("))return o.restore(),null;var e=o.$re(/^\s*([^\);]+)\)\s*/);return e[1]?(o.forget(),e[1].trim()):(o.restore(),null)},atrule:function(){var e,n,r,a,l,c,h,f=o.i,p=!0,v=!0;if("@"===o.currentChar()){if(n=this.import()||this.plugin()||this.media())return n;if(o.save(),e=o.$re(/^@[a-z-]+/)){switch(a=e,"-"==e.charAt(1)&&e.indexOf("-",2)>0&&(a="@"+e.slice(e.indexOf("-",2)+1)),a){case"@charset":l=!0,p=!1;break;case"@namespace":c=!0,p=!1;break;case"@keyframes":case"@counter-style":l=!0;break;case"@document":case"@supports":h=!0,v=!1;break;default:h=!0}if(o.commentStore.length=0,l?(n=this.entity())||s("expected "+e+" identifier"):c?(n=this.expression())||s("expected "+e+" expression"):h&&(n=this.permissiveValue(/^[{;]/),p="{"===o.currentChar(),n?n.value||(n=null):p||";"===o.currentChar()||s(e+" rule is missing block or ending semi-colon")),p&&(r=this.blockRuleset()),r||!p&&n&&o.$char(";"))return o.forget(),new Ie.AtRule(e,n,r,f,i,t.dumpLineNumbers?u(f):null,v);o.restore("at-rule options not recognised")}}},value:function(){var e,t=[],n=o.i;do{if((e=this.expression())&&(t.push(e),!o.$char(",")))break}while(e);if(t.length>0)return new Ie.Value(t,n)},important:function(){if("!"===o.currentChar())return o.$re(/^! *important/)},sub:function(){var e,t;if(o.save(),o.$char("("))return(e=this.addition())&&o.$char(")")?(o.forget(),(t=new Ie.Expression([e])).parens=!0,t):void o.restore("Expected ')'");o.restore()},multiplication:function(){var e,t,n,i,r;if(e=this.operand()){for(r=o.isWhitespace(-1);!o.peek(/^\/[*\/]/);){if(o.save(),!(n=o.$char("/")||o.$char("*")||o.$str("./"))){o.forget();break}if(!(t=this.operand())){o.restore();break}o.forget(),e.parensInOp=!0,t.parensInOp=!0,i=new Ie.Operation(n,[i||e,t],r),r=o.isWhitespace(-1)}return i||e}},addition:function(){var e,t,n,i,r;if(e=this.multiplication()){for(r=o.isWhitespace(-1);(n=o.$re(/^[-+]\s+/)||!r&&(o.$char("+")||o.$char("-")))&&(t=this.multiplication());)e.parensInOp=!0,t.parensInOp=!0,i=new Ie.Operation(n,[i||e,t],r),r=o.isWhitespace(-1);return i||e}},conditions:function(){var e,t,n,i=o.i;if(e=this.condition(!0)){for(;o.peek(/^,\s*(not\s*)?\(/)&&o.$char(",")&&(t=this.condition(!0));)n=new Ie.Condition("or",n||e,t,i);return n||e}},condition:function(e){var t,n,i;if(t=this.conditionAnd(e)){if(n=o.$str("or")){if(!(i=this.condition(e)))return;t=new Ie.Condition(n,t,i)}return t}},conditionAnd:function(e){var t,n,i,r,s=this;if(t=(r=s.negatedCondition(e)||s.parenthesisCondition(e))||e?r:s.atomicCondition(e)){if(n=o.$str("and")){if(!(i=this.conditionAnd(e)))return;t=new Ie.Condition(n,t,i)}return t}},negatedCondition:function(e){if(o.$str("not")){var t=this.parenthesisCondition(e);return t&&(t.negate=!t.negate),t}},parenthesisCondition:function(e){var t;if(o.save(),o.$str("(")){if(t=function(t){var n;if(o.save(),n=t.condition(e)){if(o.$char(")"))return o.forget(),n;o.restore()}else o.restore()}(this))return o.forget(),t;if(t=this.atomicCondition(e)){if(o.$char(")"))return o.forget(),t;o.restore("expected ')' got '"+o.currentChar()+"'")}else o.restore()}else o.restore()},atomicCondition:function(e){var t,n,i,r,a=this.entities,l=o.i;function u(){return this.addition()||a.keyword()||a.quoted()||a.mixinLookup()}if(t=(u=u.bind(this))())return o.$char(">")?r=o.$char("=")?">=":">":o.$char("<")?r=o.$char("=")?"<=":"<":o.$char("=")&&(r=o.$char(">")?"=>":o.$char("<")?"=<":"="),r?(n=u())?i=new Ie.Condition(r,t,n,l,!1):s("expected expression"):i=new Ie.Condition("=",t,new Ie.Keyword("true"),l,!1),i},operand:function(){var e,t=this.entities;o.peek(/^-[@\$\(]/)&&(e=o.$char("-"));var n=this.sub()||t.dimension()||t.color()||t.variable()||t.property()||t.call()||t.quoted(!0)||t.colorKeyword()||t.mixinLookup();return e&&(n.parensInOp=!0,n=new Ie.Negative(n)),n},expression:function(){var e,t,n=[],i=o.i;do{(e=this.comment())?n.push(e):((e=this.addition()||this.entity())instanceof Ie.Comment&&(e=null),e&&(n.push(e),o.peek(/^\/[\/*]/)||(t=o.$char("/"))&&n.push(new Ie.Anonymous(t,i))))}while(e);if(n.length>0)return new Ie.Expression(n)},property:function(){var e=o.$re(/^(\*?-?[_a-zA-Z0-9-]+)\s*:/);if(e)return e[1]},ruleProperty:function(){var e,t,n=[],r=[];o.save();var s=o.$re(/^([_a-zA-Z0-9-]+)\s*:/);if(s)return n=[new Ie.Keyword(s[1])],o.forget(),n;function a(e){var t=o.i,i=o.$re(e);if(i)return r.push(t),n.push(i[1])}for(a(/^(\*?)/);a(/^((?:[\w-]+)|(?:[@\$]\{[\w-]+\}))/););if(n.length>1&&a(/^((?:\+_|\+)?)\s*:/)){for(o.forget(),""===n[0]&&(n.shift(),r.shift()),t=0;t1?e-1:e)<1?r+(o-r)*e*6:2*e<1?o:3*e<2?r+(o-r)*(2/3-e)*6:r}e=He(e)%360/360,t=ze(He(t)),n=ze(He(n)),i=ze(He(i)),r=2*n-(o=n<=.5?n*(t+1):n+t-n*t);var a=[255*s(e+1/3),255*s(e),255*s(e-1/3)];return i=He(i),new p(a,i,"hsla")}catch(e){}},hsv:function(e,t,n){return je.hsva(e,t,n,1)},hsva:function(e,t,n,i){var r,o;e=He(e)%360/360*360,t=He(t),n=He(n),i=He(i);var s=[n,n*(1-t),n*(1-(o=e/60-(r=Math.floor(e/60%6)))*t),n*(1-(1-o)*t)],a=[[0,3,1],[2,0,1],[1,0,3],[1,2,0],[3,1,0],[0,1,2]];return je.rgba(255*s[a[r][0]],255*s[a[r][1]],255*s[a[r][2]],i)},hue:function(e){return new ee(We(e).h)},saturation:function(e){return new ee(100*We(e).s,"%")},lightness:function(e){return new ee(100*We(e).l,"%")},hsvhue:function(e){return new ee(Je(e).h)},hsvsaturation:function(e){return new ee(100*Je(e).s,"%")},hsvvalue:function(e){return new ee(100*Je(e).v,"%")},red:function(e){return new ee(e.rgb[0])},green:function(e){return new ee(e.rgb[1])},blue:function(e){return new ee(e.rgb[2])},alpha:function(e){return new ee(We(e).a)},luma:function(e){return new ee(e.luma()*e.alpha*100,"%")},luminance:function(e){var t=.2126*e.rgb[0]/255+.7152*e.rgb[1]/255+.0722*e.rgb[2]/255;return new ee(t*e.alpha*100,"%")},saturate:function(e,t,n){if(!e.rgb)return null;var i=We(e);return void 0!==n&&"relative"===n.value?i.s+=i.s*t.value/100:i.s+=t.value/100,i.s=ze(i.s),Ge(e,i)},desaturate:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.s-=i.s*t.value/100:i.s-=t.value/100,i.s=ze(i.s),Ge(e,i)},lighten:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.l+=i.l*t.value/100:i.l+=t.value/100,i.l=ze(i.l),Ge(e,i)},darken:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.l-=i.l*t.value/100:i.l-=t.value/100,i.l=ze(i.l),Ge(e,i)},fadein:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.a+=i.a*t.value/100:i.a+=t.value/100,i.a=ze(i.a),Ge(e,i)},fadeout:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.a-=i.a*t.value/100:i.a-=t.value/100,i.a=ze(i.a),Ge(e,i)},fade:function(e,t){var n=We(e);return n.a=t.value/100,n.a=ze(n.a),Ge(e,n)},spin:function(e,t){var n=We(e),i=(n.h+t.value)%360;return n.h=i<0?360+i:i,Ge(e,n)},mix:function(e,t,n){n||(n=new ee(50));var i=n.value/100,r=2*i-1,o=We(e).a-We(t).a,s=((r*o==-1?r:(r+o)/(1+r*o))+1)/2,a=1-s,l=[e.rgb[0]*s+t.rgb[0]*a,e.rgb[1]*s+t.rgb[1]*a,e.rgb[2]*s+t.rgb[2]*a],u=e.alpha*i+t.alpha*(1-i);return new p(l,u)},greyscale:function(e){return je.desaturate(e,new ee(100))},contrast:function(e,t,n,i){if(!e.rgb)return null;if(void 0===n&&(n=je.rgba(255,255,255,1)),void 0===t&&(t=je.rgba(0,0,0,1)),t.luma()>n.luma()){var r=n;n=t,t=r}return i=void 0===i?.43:He(i),e.luma().5&&(i=1,n=e>.25?Math.sqrt(e):((16*e-12)*e+4)*e),e-(1-2*t)*i*(n-e)},hardlight:function(e,t){return Ze.overlay(t,e)},difference:function(e,t){return Math.abs(e-t)},exclusion:function(e,t){return e+t-2*e*t},average:function(e,t){return(e+t)/2},negation:function(e,t){return 1-Math.abs(e+t-1)}};for(var Xe in Ze)Ze.hasOwnProperty(Xe)&&(Ke[Xe]=Ke.bind(null,Ze[Xe]));var Ye=function(e){return Array.isArray(e.value)?e.value:Array(e)},et={_SELF:function(e){return e},"~":function(){for(var e=[],t=0;ts.value)&&(c[i]=r);else{if(void 0!==l&&a!==l)throw{type:"Argument",message:"incompatible types"};h[a]=c.length,c.push(r)}else Array.isArray(t[n].value)&&Array.prototype.push.apply(t,Array.prototype.slice.call(t[n].value));return 1==c.length?c[0]:(t=c.map((function(e){return e.toCSS(this.context)})).join(this.context.compress?",":", "),new N((e?"min":"max")+"("+t+")"))},ot={min:function(){for(var e=[],t=0;t",r=0;r";return i+="',i=encodeURIComponent(i),new ce(new ue("'"+(i="data:image/svg+xml,"+i)+"'",i,!1,this.index,this.currentFileInfo),this.index,this.currentFileInfo)}}),H.addMultiple(ut),t};function ht(e,t){var n,i=(t=t||{}).variables,r=new j.Eval(t);"object"!=typeof i||Array.isArray(i)||(i=Object.keys(i).map((function(e){var t=i[e];return t instanceof Ie.Value||(t instanceof Ie.Expression||(t=new Ie.Expression([t])),t=new Ie.Value([t])),new Ie.Declaration("@"+e,t,!1,null,0)})),r.frames=[new Ie.Ruleset(null,i)]);var o,s,a=[new De.JoinSelectorVisitor,new De.MarkVisibleSelectorsVisitor(!0),new De.ExtendVisitor,new De.ToCSSVisitor({compress:Boolean(t.compress)})],l=[];if(t.pluginManager){s=t.pluginManager.visitor();for(var u=0;u<2;u++)for(s.first();o=s.get();)o.isPreEvalVisitor?0!==u&&-1!==l.indexOf(o)||(l.push(o),o.run(e)):0!==u&&-1!==a.indexOf(o)||(o.isPreVisitor?a.unshift(o):a.push(o))}n=e.eval(r);for(u=0;u=t);n++);this.preProcessors.splice(n,0,{preProcessor:e,priority:t})},e.prototype.addPostProcessor=function(e,t){var n;for(n=0;n=t);n++);this.postProcessors.splice(n,0,{postProcessor:e,priority:t})},e.prototype.addFileManager=function(e){this.fileManagers.push(e)},e.prototype.getPreProcessors=function(){for(var e=[],t=0;t0){var i=void 0,r=JSON.stringify(this._sourceMapGenerator.toJSON());this.sourceMapURL?i=this.sourceMapURL:this._sourceMapFilename&&(i=this._sourceMapFilename),this.sourceMapURL=i,this.sourceMap=r}return this._css.join("")},t}()}(e=new o(e,t)),e)),a=function(e){return function(){function t(e,t,n){this.less=e,this.rootFilename=n.filename,this.paths=t.paths||[],this.contents={},this.contentsIgnoredChars={},this.mime=t.mime,this.error=null,this.context=t,this.queue=[],this.files={}}return t.prototype.push=function(t,n,i,o,s){var a=this,l=this.context.pluginManager.Loader;this.queue.push(t);var u=function(e,n,i){a.queue.splice(a.queue.indexOf(t),1);var l=i===a.rootFilename;o.optional&&e?(s(null,{rules:[]},!1,null),r.info("The file "+i+" was skipped because it was not found and the import was marked optional.")):(a.files[i]||o.inline||(a.files[i]={root:n,options:o}),e&&!a.error&&(a.error=e),s(e,n,l,i))},c={rewriteUrls:this.context.rewriteUrls,entryPath:i.entryPath,rootpath:i.rootpath,rootFilename:i.rootFilename},h=e.getFileManager(t,i.currentDirectory,this.context,e);if(h){var f,p,v=function(e){var t,n=e.filename,r=e.contents.replace(/^\uFEFF/,"");c.currentDirectory=h.getPath(n),c.rewriteUrls&&(c.rootpath=h.join(a.context.rootpath||"",h.pathDiff(c.currentDirectory,c.entryPath)),!h.isPathAbsolute(c.rootpath)&&h.alwaysMakePathsAbsolute()&&(c.rootpath=h.join(c.entryPath,c.rootpath))),c.filename=n;var s=new j.Parse(a.context);s.processImports=!1,a.contents[n]=r,(i.reference||o.reference)&&(c.reference=!0),o.isPlugin?(t=l.evalPlugin(r,s,a,o.pluginArgs,c))instanceof V?u(t,null,n):u(null,t,n):o.inline?u(null,r,n):!a.files[n]||a.files[n].options.multiple||o.multiple?new Ue(s,a,c).parse(r,(function(e,t){u(e,t,n)})):u(null,a.files[n].root,n)},d=_(this.context);n&&(d.ext=o.isPlugin?".js":".less"),o.isPlugin?(d.mime="application/javascript",d.syncImport?f=l.loadPluginSync(t,i.currentDirectory,d,e,h):p=l.loadPlugin(t,i.currentDirectory,d,e,h)):d.syncImport?f=h.loadFileSync(t,i.currentDirectory,d,e):p=h.loadFile(t,i.currentDirectory,d,e,(function(e,t){e?u(e):v(t)})),f?f.filename?v(f):u(f):p&&p.then(v,u)}else u({message:"Could not find a file-manager for "+t})},t}()}(e);var u,c=function(e,t,n){var i=function(e,n,r){if("function"==typeof n?(r=n,n=M(this.options,{})):n=M(this.options,n||{}),!r){var o=this;return new Promise((function(t,r){i.call(o,e,n,(function(e,n){e?r(e):t(n)}))}))}this.parse(e,n,(function(e,n,i,o){if(e)return r(e);var s;try{s=new t(n,i).toCSS(o)}catch(e){return r(e)}r(null,s)}))};return i}(0,s),h=function(e,t,n){var i=function(e,t,r){if("function"==typeof t?(r=t,t=M(this.options,{})):t=M(this.options,t||{}),!r){var o=this;return new Promise((function(n,r){i.call(o,e,t,(function(e,t){e?r(e):n(t)}))}))}var s,a=void 0,l=new mt(this,!t.reUsePluginManager);if(t.pluginManager=l,s=new j.Parse(t),t.rootFileInfo)a=t.rootFileInfo;else{var u=t.filename||"input",c=u.replace(/[^\/\\]*$/,"");(a={filename:u,rewriteUrls:s.rewriteUrls,rootpath:s.rootpath||"",currentDirectory:c,entryPath:c,rootFilename:u}).rootpath&&"/"!==a.rootpath.slice(-1)&&(a.rootpath+="/")}var h=new n(this,s,a);this.importManager=h,t.plugins&&t.plugins.forEach((function(e){var t,n;if(e.fileContent){if(n=e.fileContent.replace(/^\uFEFF/,""),(t=l.Loader.evalPlugin(n,s,h,e.options,e.filename))instanceof V)return r(t)}else l.addPlugin(e)})),new Ue(s,h,a).parse(e,(function(e,n){if(e)return r(e);r(null,n,h,t)}),t)};return i}(0,0,a),f={version:[4,0,0],data:l,tree:Ie,Environment:o,AbstractFileManager:Ce,AbstractPluginLoader:ke,environment:e,visitors:De,Parser:Ue,functions:ct(e),contexts:j,SourceMapOutput:n,SourceMapBuilder:i,ParseTree:s,ImportManager:a,render:c,parse:h,LessError:V,transformTree:ht,utils:P,PluginManager:mt,logger:r},p=function(e){return function(){var t=Object.create(e.prototype);return e.apply(t,Array.prototype.slice.call(arguments,0)),t}},v=Object.create(f);for(var d in f.tree)if("function"==typeof(u=f.tree[d]))v[d.toLowerCase()]=p(u);else for(var m in v[d]=Object.create(null),u)v[d][m.toLowerCase()]=p(u[m]);return f.parse=f.parse.bind(v),f.render=f.render.bind(v),v}var yt={},bt=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return h(t,e),t.prototype.alwaysMakePathsAbsolute=function(){return!0},t.prototype.join=function(e,t){return e?this.extractUrlParts(t,e).path:t},t.prototype.doXHR=function(e,t,n,i){var r=new XMLHttpRequest,o=!pt.isFileProtocol||pt.fileAsync;function s(t,n,i){t.status>=200&&t.status<300?n(t.responseText,t.getResponseHeader("Last-Modified")):"function"==typeof i&&i(t.status,e)}"function"==typeof r.overrideMimeType&&r.overrideMimeType("text/css"),vt.debug("XHR: Getting '"+e+"'"),r.open("GET",e,o),r.setRequestHeader("Accept",t||"text/x-less, text/css; q=0.9, */*; q=0.5"),r.send(null),pt.isFileProtocol&&!pt.fileAsync?0===r.status||r.status>=200&&r.status<300?n(r.responseText):i(r.status,e):o?r.onreadystatechange=function(){4==r.readyState&&s(r,n,i)}:s(r,n,i)},t.prototype.supports=function(){return!0},t.prototype.clearFileCache=function(){yt={}},t.prototype.loadFile=function(e,t,n,i){t&&!this.isPathAbsolute(e)&&(e=t+e),e=n.ext?this.tryAppendExtension(e,n.ext):e,n=n||{};var r=this.extractUrlParts(e,window.location.href).url,o=this;return new Promise((function(e,t){if(n.useFileCache&&yt[r])try{var i=yt[r];return e({contents:i,filename:r,webInfo:{lastModified:new Date}})}catch(e){return t({filename:r,message:"Error loading file "+r+" error was "+e.message})}o.doXHR(r,n.mime,(function(t,n){yt[r]=t,e({contents:t,filename:r,webInfo:{lastModified:n}})}),(function(e,n){t({type:"File",message:"'"+n+"' wasn't found ("+e+")",href:r})}))}))},t}(Ce),wt=function(e,t){return pt=e,vt=t,bt},xt=function(e){function t(t){var n=e.call(this)||this;return n.less=t,n}return h(t,e),t.prototype.loadPlugin=function(e,t,n,i,r){return new Promise((function(o,s){r.loadFile(e,t,n,i).then(o).catch(s)}))},t}(ke),St=function(t,i,r){return{add:function(o,s){r.errorReporting&&"html"!==r.errorReporting?"console"===r.errorReporting?function(e,t){var n=e.filename||t,o=[],s=(e.type||"Syntax")+"Error: "+(e.message||"There is an error in your .less file")+" in "+n,a=function(e,t,n){void 0!==e.extract[t]&&o.push("{line} {content}".replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,n).replace(/\{content\}/,e.extract[t]))};e.line&&(a(e,0,""),a(e,1,"line"),a(e,2,""),s+=" on line "+e.line+", column "+(e.column+1)+":\n"+o.join("\n")),e.stack&&(e.extract||r.logLevel>=4)&&(s+="\nStack Trace\n"+e.stack),i.logger.error(s)}(o,s):"function"==typeof r.errorReporting&&r.errorReporting("add",o,s):function(i,o){var s,a,l="less-error-message:"+e(o||""),u=t.document.createElement("div"),c=[],h=i.filename||o,f=h.match(/([^\/]+(\?.*)?)$/)[1];u.id=l,u.className="less-error-message",a="

    "+(i.type||"Syntax")+"Error: "+(i.message||"There is an error in your .less file")+'

    in '+f+" ";var p=function(e,t,n){void 0!==e.extract[t]&&c.push('

  • {content}
  • '.replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,n).replace(/\{content\}/,e.extract[t]))};i.line&&(p(i,0,""),p(i,1,"line"),p(i,2,""),a+="on line "+i.line+", column "+(i.column+1)+":

      "+c.join("")+"
    "),i.stack&&(i.extract||r.logLevel>=4)&&(a+="
    Stack Trace
    "+i.stack.split("\n").slice(1).join("
    ")),u.innerHTML=a,n(t.document,[".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #dd6666;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.line {","color: #ff0000;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),u.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),"development"===r.env&&(s=setInterval((function(){var e=t.document,n=e.body;n&&(e.getElementById(l)?n.replaceChild(u,e.getElementById(l)):n.insertBefore(u,n.firstChild),clearInterval(s))}),10))}(o,s)},remove:function(n){r.errorReporting&&"html"!==r.errorReporting?"console"===r.errorReporting||"function"==typeof r.errorReporting&&r.errorReporting("remove",n):function(n){var i=t.document.getElementById("less-error-message:"+e(n));i&&i.parentNode.removeChild(i)}(n)}}},It={javascriptEnabled:!1,depends:!1,compress:!1,lint:!1,paths:[],color:!0,strictImports:!1,insecure:!1,rootpath:"",rewriteUrls:!1,math:1,strictUnits:!1,globalVars:null,modifyVars:null,urlArgs:""};if(window.less)for(var Ct in window.less)window.less.hasOwnProperty(Ct)&&(It[Ct]=window.less[Ct]);!function(e,n){t(n,i(e)),void 0===n.isFileProtocol&&(n.isFileProtocol=/^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(e.location.protocol)),n.async=n.async||!1,n.fileAsync=n.fileAsync||!1,n.poll=n.poll||(n.isFileProtocol?1e3:1500),n.env=n.env||("127.0.0.1"==e.location.hostname||"0.0.0.0"==e.location.hostname||"localhost"==e.location.hostname||e.location.port&&e.location.port.length>0||n.isFileProtocol?"development":"production");var r=/!dumpLineNumbers:(comments|mediaquery|all)/.exec(e.location.hash);r&&(n.dumpLineNumbers=r[1]),void 0===n.useFileCache&&(n.useFileCache=!0),void 0===n.onReady&&(n.onReady=!0),n.relativeUrls&&(n.rewriteUrls="all")}(window,It),It.plugins=It.plugins||[],window.LESS_PLUGINS&&(It.plugins=It.plugins.concat(window.LESS_PLUGINS));var kt,_t,At,Mt=function(e,i){var r=e.document,o=gt();o.options=i;var s=o.environment,a=wt(i,o.logger),l=new a;s.addFileManager(l),o.FileManager=a,o.PluginLoader=xt,function(e,t){t.logLevel=void 0!==t.logLevel?t.logLevel:"development"===t.env?3:1,t.loggers||(t.loggers=[{debug:function(e){t.logLevel>=4&&console.log(e)},info:function(e){t.logLevel>=3&&console.log(e)},warn:function(e){t.logLevel>=2&&console.warn(e)},error:function(e){t.logLevel>=1&&console.error(e)}}]);for(var n=0;n0&&l.childNodes.length>0&&o.firstChild.nodeValue===l.firstChild.nodeValue);var u=t.getElementsByTagName("head")[0];if(null===o||!1===a){var c=n&&n.nextSibling||null;c?c.parentNode.insertBefore(l,c):u.appendChild(l)}if(o&&!1===a&&o.parentNode.removeChild(o),l.styleSheet)try{l.styleSheet.cssText=i}catch(e){throw new Error("Couldn't reassign styleSheet.cssText.")}},n=function(e){var t,i=e.document;return i.currentScript||(t=i.getElementsByTagName("script"))[t.length-1]},r={error:function(e){this._fireEvent("error",e)},warn:function(e){this._fireEvent("warn",e)},info:function(e){this._fireEvent("info",e)},debug:function(e){this._fireEvent("debug",e)},addListener:function(e){this._listeners.push(e)},removeListener:function(e){for(var t=0;t=0;a--){var l=o[a];if(l[s?"supportsSync":"supports"](e,t,i,n))return l}return null},e.prototype.addFileManager=function(e){this.fileManagers.push(e)},e.prototype.clearFileManagers=function(){this.fileManagers=[]},e}(),o={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",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:"#ff00ff",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:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",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:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",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:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},a={length:{m:1,cm:.01,mm:.001,in:.0254,px:.0254/96,pt:.0254/72,pc:.0254/72*12},duration:{s:1,ms:.001},angle:{rad:1/(2*Math.PI),deg:1/360,grad:1/400,turn:1}},l={colors:o,unitConversions:a},u=function(){function e(){this.parent=null,this.visibilityBlocks=void 0,this.nodeVisible=void 0,this.rootNode=null,this.parsed=null;var e=this;Object.defineProperty(this,"currentFileInfo",{get:function(){return e.fileInfo()}}),Object.defineProperty(this,"index",{get:function(){return e.getIndex()}})}return e.prototype.setParent=function(t,i){function n(t){t&&t instanceof e&&(t.parent=i)}Array.isArray(t)?t.forEach(n):n(t)},e.prototype.getIndex=function(){return this._index||this.parent&&this.parent.getIndex()||0},e.prototype.fileInfo=function(){return this._fileInfo||this.parent&&this.parent.fileInfo()||{}},e.prototype.isRulesetLike=function(){return!1},e.prototype.toCSS=function(e){var t=[];return this.genCSS(e,{add:function(e,i,n){t.push(e)},isEmpty:function(){return 0===t.length}}),t.join("")},e.prototype.genCSS=function(e,t){t.add(this.value)},e.prototype.accept=function(e){this.value=e.visit(this.value)},e.prototype.eval=function(){return this},e.prototype._operate=function(e,t,i,n){switch(t){case"+":return i+n;case"-":return i-n;case"*":return i*n;case"/":return i/n}},e.prototype.fround=function(e,t){var i=e&&e.numPrecision;return i?Number((t+2e-16).toFixed(i)):t},e.compare=function(t,i){if(t.compare&&"Quoted"!==i.type&&"Anonymous"!==i.type)return t.compare(i);if(i.compare)return-i.compare(t);if(t.type===i.type){if(t=t.value,i=i.value,!Array.isArray(t))return t===i?0:void 0;if(t.length===i.length){for(var n=0;nt?1:void 0},e.prototype.blocksVisibility=function(){return null==this.visibilityBlocks&&(this.visibilityBlocks=0),0!==this.visibilityBlocks},e.prototype.addVisibilityBlock=function(){null==this.visibilityBlocks&&(this.visibilityBlocks=0),this.visibilityBlocks=this.visibilityBlocks+1},e.prototype.removeVisibilityBlock=function(){null==this.visibilityBlocks&&(this.visibilityBlocks=0),this.visibilityBlocks=this.visibilityBlocks-1},e.prototype.ensureVisibility=function(){this.nodeVisible=!0},e.prototype.ensureInvisibility=function(){this.nodeVisible=!1},e.prototype.isVisible=function(){return this.nodeVisible},e.prototype.visibilityInfo=function(){return{visibilityBlocks:this.visibilityBlocks,nodeVisible:this.nodeVisible}},e.prototype.copyVisibilityInfo=function(e){e&&(this.visibilityBlocks=e.visibilityBlocks,this.nodeVisible=e.nodeVisible)},e}(),c=function(e,t,i){var n=this;Array.isArray(e)?this.rgb=e:e.length>=6?(this.rgb=[],e.match(/.{2}/g).map((function(e,t){t<3?n.rgb.push(parseInt(e,16)):n.alpha=parseInt(e,16)/255}))):(this.rgb=[],e.split("").map((function(e,t){t<3?n.rgb.push(parseInt(e+e,16)):n.alpha=parseInt(e+e,16)/255}))),this.alpha=this.alpha||("number"==typeof t?t:1),void 0!==i&&(this.value=i)};function h(e,t){return Math.min(Math.max(e,0),t)}function f(e){return"#"+e.map((function(e){return((e=h(Math.round(e),255))<16?"0":"")+e.toString(16)})).join("")}c.prototype=Object.assign(new u,{type:"Color",luma:function(){var e=this.rgb[0]/255,t=this.rgb[1]/255,i=this.rgb[2]/255;return.2126*(e=e<=.03928?e/12.92:Math.pow((e+.055)/1.055,2.4))+.7152*(t=t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4))+.0722*(i=i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4))},genCSS:function(e,t){t.add(this.toCSS(e))},toCSS:function(e,t){var i,n,r,s=e&&e.compress&&!t,o=[];if(n=this.fround(e,this.alpha),this.value)if(0===this.value.indexOf("rgb"))n<1&&(r="rgba");else{if(0!==this.value.indexOf("hsl"))return this.value;r=n<1?"hsla":"hsl"}else n<1&&(r="rgba");switch(r){case"rgba":o=this.rgb.map((function(e){return h(Math.round(e),255)})).concat(h(n,1));break;case"hsla":o.push(h(n,1));case"hsl":i=this.toHSL(),o=[this.fround(e,i.h),this.fround(e,100*i.s)+"%",this.fround(e,100*i.l)+"%"].concat(o)}if(r)return r+"("+o.join(","+(s?"":" "))+")";if(i=this.toRGB(),s){var a=i.split("");a[1]===a[2]&&a[3]===a[4]&&a[5]===a[6]&&(i="#"+a[1]+a[3]+a[5])}return i},operate:function(e,t,i){for(var n=new Array(3),r=this.alpha*(1-i.alpha)+i.alpha,s=0;s<3;s++)n[s]=this._operate(e,t,this.rgb[s],i.rgb[s]);return new c(n,r)},toRGB:function(){return f(this.rgb)},toHSL:function(){var e,t,i=this.rgb[0]/255,n=this.rgb[1]/255,r=this.rgb[2]/255,s=this.alpha,o=Math.max(i,n,r),a=Math.min(i,n,r),l=(o+a)/2,u=o-a;if(o===a)e=t=0;else{switch(t=l>.5?u/(2-o-a):u/(o+a),o){case i:e=(n-r)/u+(n=0&&"\n"!==t.charAt(i);)r++;return"number"==typeof e&&(n=(t.slice(0,e).match(/\n/g)||"").length),{line:n,column:r}}function I(e){var t,i=e.length,n=new Array(i);for(t=0;t|Function):(\d+):(\d+)/,P=function(e,t,i){Error.call(this);var n=e.filename||i;if(this.message=e.message,this.stack=e.stack,t&&n){var r=t.contents[n],s=S(e.index,r),o=s.line,a=s.column,l=e.call&&S(e.call,r).line,u=r?r.split("\n"):"";if(this.type=e.type||"Syntax",this.filename=n,this.index=e.index,this.line="number"==typeof o?o+1:null,this.column=a,!this.line&&this.stack){var c=this.stack.match(E),h=new Function("a","throw new Error()"),f=0;try{h()}catch(e){var p=e.stack.match(E);f=1-(o=parseInt(p[2]))}c&&(c[2]&&(this.line=parseInt(c[2])+f),c[3]&&(this.column=parseInt(c[3])))}this.callLine=l+1,this.callExtract=u[l],this.extract=[u[this.line-2],u[this.line-1],u[this.line]]}};if(void 0===Object.create){var R=function(){};R.prototype=Error.prototype,P.prototype=new R}else P.prototype=Object.create(Error.prototype);P.prototype.constructor=P,P.prototype.toString=function(e){e=e||{};var t="",i=this.extract||[],n=[],r=function(e){return e};if(e.stylize){var s=typeof e.stylize;if("function"!==s)throw Error("options.stylize should be a function, got a "+s+"!");r=e.stylize}if(null!==this.line){if("string"==typeof i[0]&&n.push(r(this.line-1+" "+i[0],"grey")),"string"==typeof i[1]){var o=this.line+" ";i[1]&&(o+=i[1].slice(0,this.column)+r(r(r(i[1].substr(this.column,1),"bold")+i[1].slice(this.column+1),"red"),"inverse")),n.push(o)}"string"==typeof i[2]&&n.push(r(this.line+1+" "+i[2],"grey")),n=n.join("\n")+r("","reset")+"\n"}return t+=r(this.type+"Error: "+this.message,"red"),this.filename&&(t+=r(" in ","red")+this.filename),this.line&&(t+=r(" on line "+this.line+", column "+(this.column+1)+":","grey")),t+="\n"+n,this.callLine&&(t+=r("from ","red")+(this.filename||"")+"/n",t+=r(this.callLine,"grey")+" "+this.callExtract+"/n"),t};var O=function(e,t,i,n,r,s){this.extendList=t,this.condition=i,this.evaldCondition=!i,this._index=n,this._fileInfo=r,this.elements=this.getElements(e),this.mixinElements_=void 0,this.copyVisibilityInfo(s),this.setParent(this.elements,this)};O.prototype=Object.assign(new u,{type:"Selector",accept:function(e){this.elements&&(this.elements=e.visitArray(this.elements)),this.extendList&&(this.extendList=e.visitArray(this.extendList)),this.condition&&(this.condition=e.visit(this.condition))},createDerived:function(e,t,i){e=this.getElements(e);var n=new O(e,t||this.extendList,null,this.getIndex(),this.fileInfo(),this.visibilityInfo());return n.evaldCondition=null!=i?i:this.evaldCondition,n.mediaEmpty=this.mediaEmpty,n},getElements:function(e){return e?("string"==typeof e&&this.parse.parseNode(e,["selector"],this._index,this._fileInfo,(function(t,i){if(t)throw new P({index:t.index,message:t.message},this.parse.imports,this._fileInfo.filename);e=i[0].elements})),e):[new m("","&",!1,this._index,this._fileInfo)]},createEmptySelectors:function(){var e=new m("","&",!1,this._index,this._fileInfo),t=[new O([e],null,null,this._index,this._fileInfo)];return t[0].mediaEmpty=!0,t},match:function(e){var t,i,n=this.elements,r=n.length;if(0===(t=(e=e.mixinElements()).length)||ry.PARENS_DIVISION)||this.parensStack&&this.parensStack.length))},B.Eval.prototype.pathRequiresRewrite=function(e){return(this.rewriteUrls===w?G:z)(e)},B.Eval.prototype.rewritePath=function(e,t){var i;return t=t||"",i=this.normalizePath(t+e),G(e)&&z(t)&&!1===G(i)&&(i="./"+i),i},B.Eval.prototype.normalizePath=function(e){var t,i=e.split("/").reverse();for(e=[];0!==i.length;)switch(t=i.pop()){case".":break;case"..":0===e.length||".."===e[e.length-1]?e.push(t):e.pop();break;default:e.push(t)}return e.join("/")};var W=function e(t){return{_data:{},add:function(e,t){e=e.toLowerCase(),this._data.hasOwnProperty(e),this._data[e]=t},addMultiple:function(e){var t=this;Object.keys(e).forEach((function(i){t.add(i,e[i])}))},get:function(e){return this._data[e]||t&&t.get(e)},getLocalFunctions:function(){return this._data},inherit:function(){return e(this)},create:function(t){return e(t)}}}(null),J={eval:function(){var e=this.value_,t=this.error_;if(t)throw t;if(null!=e)return e?F.True:F.False},value:function(e){this.value_=e},error:function(e){this.error_=e},reset:function(){this.value_=this.error_=null}},H=function(e,t,i,n){this.selectors=e,this.rules=t,this._lookups={},this._variables=null,this._properties=null,this.strictImports=i,this.copyVisibilityInfo(n),this.allowRoot=!0,this.setParent(this.selectors,this),this.setParent(this.rules,this)};H.prototype=Object.assign(new u,{type:"Ruleset",isRuleset:!0,isRulesetLike:function(){return!0},accept:function(e){this.paths?this.paths=e.visitArray(this.paths,!0):this.selectors&&(this.selectors=e.visitArray(this.selectors)),this.rules&&this.rules.length&&(this.rules=e.visitArray(this.rules))},eval:function(e){var t,i,n,r,s,o=!1;if(this.selectors&&(i=this.selectors.length)){for(t=new Array(i),J.error({type:"Syntax",message:"it is currently only allowed in parametric mixin guards,"}),r=0;r0;e--){var t=this.rules[e-1];if(t instanceof N)return this.parseValue(t)}},parseValue:function(e){var t=this;function i(e){return e.value instanceof $&&!e.parsed?("string"==typeof e.value.value?this.parse.parseNode(e.value.value,["value","important"],e.value.getIndex(),e.fileInfo(),(function(t,i){t&&(e.parsed=!0),i&&(e.value=i[0],e.important=i[1]||"",e.parsed=!0)})):e.parsed=!0,e):e}if(Array.isArray(e)){var n=[];return e.forEach((function(e){n.push(i.call(t,e))})),n}return i.call(t,e)},rulesets:function(){if(!this.rules)return[];var e,t,i=[],n=this.rules;for(e=0;t=n[e];e++)t.isRuleset&&i.push(t);return i},prependRule:function(e){var t=this.rules;t?t.unshift(e):this.rules=[e],this.setParent(e,this)},find:function(e,t,i){t=t||this;var n,r,s=[],o=e.toCSS();return o in this._lookups?this._lookups[o]:(this.rulesets().forEach((function(o){if(o!==t)for(var a=0;an){if(!i||i(o)){r=o.find(new O(e.elements.slice(n)),t,i);for(var l=0;l0&&t.add(l),e.firstSelector=!0,o[0].genCSS(e,t),e.firstSelector=!1,n=1;n0?(s=(r=I(e)).pop(),o=n.createDerived(I(s.elements))):o=n.createDerived([]),t.length>0){var a=i.combinator,l=t[0].elements[0];a.emptyOrWhitespace&&!l.combinator.emptyOrWhitespace&&(a=l.combinator),o.elements.push(new m(a,l.value,i.isVariable,i._index,i._fileInfo)),o.elements=o.elements.concat(t[0].elements.slice(1))}if(0!==o.elements.length&&r.push(o),t.length>1){var u=t.slice(1);u=u.map((function(e){return e.createDerived(e.elements,[])})),r=r.concat(u)}return r}function o(e,t,i,n,r){var o;for(o=0;o0?n[n.length-1]=n[n.length-1].createDerived(n[n.length-1].elements.concat(e)):n.push(new O(e));else t.push([new O(e)])}function l(e,t){var i=t.createDerived(t.elements,t.extendList,t.evaldCondition);return i.copyVisibilityInfo(e),i}var u,c;if(!function e(t,i,l){var u,c,h,f,v,d,g,y,b,w,x,S,I=!1;for(f=[],v=[[]],u=0;y=l.elements[u];u++)if("&"!==y.value){var C=(S=void 0,(x=y).value instanceof p&&(S=x.value.value)instanceof O?S:null);if(null!=C){a(f,v);var k,_=[],A=[];for(k=e(_,i,C),I=I||k,h=0;h<_.length;h++){o(v,[r(n(_[h],y),y)],y,l,A)}v=A,f=[]}else f.push(y)}else{for(I=!0,d=[],a(f,v),c=0;c0&&g[0].elements.push(new m(y.combinator,"",y.isVariable,y._index,y._fileInfo)),d.push(g);else for(h=0;h0&&(t.push(v[u]),w=v[u][b-1],v[u][b-1]=w.createDerived(w.elements,l.extendList));return I}(c=[],t,i))if(t.length>0)for(c=[],u=0;u0)for(t=0;t-1e-6&&(n=i.toFixed(20).replace(/0+$/,"")),e&&e.compress){if(0===i&&this.unit.isLength())return void t.add(n);i>0&&i<1&&(n=n.substr(1))}t.add(n),this.unit.genCSS(e,t)},operate:function(e,t,i){var n=this._operate(e,t,this.value,i.value),r=this.unit.clone();if("+"===t||"-"===t)if(0===r.numerator.length&&0===r.denominator.length)r=i.unit.clone(),this.unit.backupUnit&&(r.backupUnit=this.unit.backupUnit);else if(0===i.unit.numerator.length&&0===r.denominator.length);else{if(i=i.convertTo(this.unit.usedUnits()),e.strictUnits&&i.unit.toString()!==r.toString())throw new Error("Incompatible units. Change the units or use the unit function. Bad units: '"+r.toString()+"' and '"+i.unit.toString()+"'.");n=this._operate(e,t,this.value,i.value)}else"*"===t?(r.numerator=r.numerator.concat(i.unit.numerator).sort(),r.denominator=r.denominator.concat(i.unit.denominator).sort(),r.cancel()):"/"===t&&(r.numerator=r.numerator.concat(i.unit.denominator).sort(),r.denominator=r.denominator.concat(i.unit.numerator).sort(),r.cancel());return new X(n,r)},compare:function(e){var t,i;if(e instanceof X){if(this.unit.isEmpty()||e.unit.isEmpty())t=this,i=e;else if(t=this.unify(),i=e.unify(),0!==t.unit.compare(i.unit))return;return u.numericCompare(t.value,i.value)}},unify:function(){return this.convertTo({length:"px",duration:"s",angle:"rad"})},convertTo:function(e){var t,i,n,r,s,o=this.value,l=this.unit.clone(),u={};if("string"==typeof e){for(t in a)a[t].hasOwnProperty(e)&&((u={})[t]=e);e=u}for(i in s=function(e,t){return n.hasOwnProperty(e)?(t?o/=n[e]/n[r]:o*=n[e]/n[r],r):e},e)e.hasOwnProperty(i)&&(r=e[i],n=a[i],l.map(s));return l.cancel(),new X(o,l)}});var Y=y,ee=function(e,t,i){this.op=e.trim(),this.operands=t,this.isSpaced=i};ee.prototype=Object.assign(new u,{type:"Operation",accept:function(e){this.operands=e.visitArray(this.operands)},eval:function(e){var t,i=this.operands[0].eval(e),n=this.operands[1].eval(e);if(e.isMathOn(this.op)){if(t="./"===this.op?"/":this.op,i instanceof X&&n instanceof c&&(i=i.toColor()),n instanceof X&&i instanceof c&&(n=n.toColor()),!i.operate){if(i instanceof ee&&"/"===i.op&&e.math===Y.PARENS_DIVISION)return new ee(this.op,[i,n],this.isSpaced);throw{type:"Operation",message:"Operation on an invalid type"}}return i.operate(e,t,n)}return new ee(this.op,[i,n],this.isSpaced)},genCSS:function(e,t){this.operands[0].genCSS(e,t),this.isSpaced&&t.add(" "),t.add(this.op),this.isSpaced&&t.add(" "),this.operands[1].genCSS(e,t)}});var te=function(e,t){if(this.value=e,this.noSpacing=t,!e)throw new Error("Expression requires an array parameter")};te.prototype=Object.assign(new u,{type:"Expression",accept:function(e){this.value=e.visitArray(this.value)},eval:function(e){var t,i=e.isMathOn(),n=this.parens,r=!1;return n&&e.inParenthesis(),this.value.length>1?t=new te(this.value.map((function(t){return t.eval?t.eval(e):t})),this.noSpacing):1===this.value.length?(!this.value[0].parens||this.value[0].parensInOp||e.inCalc||(r=!0),t=this.value[0].eval(e)):t=this,n&&e.outOfParenthesis(),!this.parens||!this.parensInOp||i||r||t instanceof X||(t=new p(t)),t},genCSS:function(e,t){for(var i=0;i1){var i=new O([],null,null,this.getIndex(),this.fileInfo()).createEmptySelectors();(t=new H(i,e.mediaBlocks)).multiMedia=!0,t.copyVisibilityInfo(this.visibilityInfo()),this.setParent(t,this)}return delete e.mediaBlocks,delete e.mediaPath,t},evalNested:function(e){var t,i,n=e.mediaPath.concat([this]);for(t=0;t0;t--)e.splice(t,0,new $("and"));return new te(e)}))),this.setParent(this.features,this),new H([],[])},permute:function(e){if(0===e.length)return[];if(1===e.length)return e[0];for(var t=[],i=this.permute(e.slice(1)),n=0;n1?"["+e.value.map((function(e){return e.toCSS()})).join(", ")+"]":e.toCSS()}});var fe=function(e,t,i,n){this.escaped=t,this.expression=e,this._index=i,this._fileInfo=n};fe.prototype=Object.assign(new he,{type:"JavaScript",eval:function(e){var t=this.evaluateJavaScript(this.expression,e),i=typeof t;return"number"!==i||isNaN(t)?"string"===i?new ae('"'+t+'"',t,this.escaped,this._index):Array.isArray(t)?new $(t.join(", ")):new $(t):new X(t)}});var pe=function(e,t){this.key=e,this.value=t};pe.prototype=Object.assign(new u,{type:"Assignment",accept:function(e){this.value=e.visit(this.value)},eval:function(e){return this.value.eval?new pe(this.key,this.value.eval(e)):this},genCSS:function(e,t){t.add(this.key+"="),this.value.genCSS?this.value.genCSS(e,t):t.add(this.value)}});var ve=function(e,t,i,n,r){this.op=e.trim(),this.lvalue=t,this.rvalue=i,this._index=n,this.negate=r};ve.prototype=Object.assign(new u,{type:"Condition",accept:function(e){this.lvalue=e.visit(this.lvalue),this.rvalue=e.visit(this.rvalue)},eval:function(e){var t=function(e,t,i){switch(e){case"and":return t&&i;case"or":return t||i;default:switch(u.compare(t,i)){case-1:return"<"===e||"=<"===e||"<="===e;case 0:return"="===e||">="===e||"=<"===e||"<="===e;case 1:return">"===e||">="===e;default:return!1}}}(this.op,this.lvalue.eval(e),this.rvalue.eval(e));return this.negate?!t:t}});var de=function(e){this.value=e};de.prototype=Object.assign(new u,{type:"UnicodeDescriptor"});var me=function(e){this.value=e};me.prototype=Object.assign(new u,{type:"Negative",genCSS:function(e,t){t.add("-"),this.value.genCSS(e,t)},eval:function(e){return e.isMathOn()?new ee("*",[new X(-1),this.value]).eval(e):new me(this.value.eval(e))}});var ge=function(e,t,i,n,r){switch(this.selector=e,this.option=t,this.object_id=ge.next_id++,this.parent_ids=[this.object_id],this._index=i,this._fileInfo=n,this.copyVisibilityInfo(r),this.allowRoot=!0,t){case"all":this.allowBefore=!0,this.allowAfter=!0;break;default:this.allowBefore=!1,this.allowAfter=!1}this.setParent(this.selector,this)};ge.prototype=Object.assign(new u,{type:"Extend",accept:function(e){this.selector=e.visit(this.selector)},eval:function(e){return new ge(this.selector.eval(e),this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},clone:function(e){return new ge(this.selector,this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},findSelfSelectors:function(e){var t,i,n=[];for(t=0;t0&&i.length&&""===i[0].combinator.value&&(i[0].combinator.value=" "),n=n.concat(e[t].elements);this.selfSelectors=[new O(n)],this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo())}}),ge.next_id=0;var ye=function(e,t,i){this.variable=e,this._index=t,this._fileInfo=i,this.allowRoot=!0};ye.prototype=Object.assign(new u,{type:"VariableCall",eval:function(e){var t,i=new re(this.variable,this.getIndex(),this.fileInfo()).eval(e),n=new P({message:"Could not evaluate variable call "+this.variable});if(!i.ruleset){if(i.rules)t=i;else if(Array.isArray(i))t=new H("",i);else{if(!Array.isArray(i.value))throw n;t=new H("",i.value)}i=new K(t)}if(i.ruleset)return i.callEval(e);throw n}});var be=function(e,t,i,n){this.value=e,this.lookups=t,this._index=i,this._fileInfo=n};be.prototype=Object.assign(new u,{type:"NamespaceValue",eval:function(e){var t,i,n=this.value.eval(e);for(t=0;tthis.params.length)return!1}i=Math.min(s,this.arity);for(var o=0;o0){for(c=!0,a=0;a0)f=2;else if(f=1,p[1]+p[2]>1)throw{type:"Runtime",message:"Ambiguous use of `default()` found when matching for `"+this.format(m)+"`",index:this.getIndex(),filename:this.fileInfo().filename};for(a=0;a0&&(e=e.slice(0,t)),(t=e.lastIndexOf("/"))<0&&(t=e.lastIndexOf("\\")),t<0?"":e.slice(0,t+1)},e.prototype.tryAppendExtension=function(e,t){return/(\.[a-z]*$)|([\?;].*)$/.test(e)?e:e+t},e.prototype.tryAppendLessExtension=function(e){return this.tryAppendExtension(e,".less")},e.prototype.supportsSync=function(){return!1},e.prototype.alwaysMakePathsAbsolute=function(){return!1},e.prototype.isPathAbsolute=function(e){return/^(?:[a-z-]+:|\/|\\|#)/i.test(e)},e.prototype.join=function(e,t){return e?e+t:t},e.prototype.pathDiff=function(e,t){var i,n,r,s,o=this.extractUrlParts(e),a=this.extractUrlParts(t),l="";if(o.hostPart!==a.hostPart)return"";for(n=Math.max(a.directories.length,o.directories.length),i=0;iparseInt(t[i])?-1:1;return 0},e.prototype.versionToString=function(e){for(var t="",i=0;i0;){var e=this.imports[0];if(!e.isReady)return;this.imports=this.imports.slice(1),e.callback.apply(null,e.args)}if(0===this.variableImports.length)break;var t=this.variableImports[0];this.variableImports=this.variableImports.slice(1),t()}}finally{this._currentDepth--}0===this._currentDepth&&this._onSequencerEmpty&&this._onSequencerEmpty()},e}(),Pe=function(e,t){this._visitor=new Me(this),this._importer=e,this._finish=t,this.context=new B.Eval,this.importCount=0,this.onceFileDetectionMap={},this.recursionDetector={},this._sequencer=new Ee(this._onSequencerEmpty.bind(this))};Pe.prototype={isReplacing:!1,run:function(e){try{this._visitor.visit(e)}catch(e){this.error=e}this.isFinished=!0,this._sequencer.tryRun()},_onSequencerEmpty:function(){this.isFinished&&this._finish(this.error)},visitImport:function(e,t){var i=e.options.inline;if(!e.css||i){var n=new B.Eval(this.context,I(this.context.frames)),r=n.frames[0];this.importCount++,e.isVariableImport()?this._sequencer.addVariableImport(this.processImportNode.bind(this,e,n,r)):this.processImportNode(e,n,r)}t.visitDeeper=!1},processImportNode:function(e,t,i){var n,r=e.options.inline;try{n=e.evalForImport(t)}catch(t){t.filename||(t.index=e.getIndex(),t.filename=e.fileInfo().filename),e.css=!0,e.error=t}if(!n||n.css&&!r)this.importCount--,this.isFinished&&this._sequencer.tryRun();else{n.options.multiple&&(t.importMultiple=!0);for(var s=void 0===n.css,o=0;o=0||(a=[u.selfSelectors[0]],(s=f.findMatch(l,a)).length&&(l.hasFoundMatches=!0,l.selfSelectors.forEach((function(e){var t=u.visibilityInfo();o=f.extendSelector(s,a,e,l.isVisible()),(c=new Se.Extend(u.selector,u.option,0,u.fileInfo(),t)).selfSelectors=o,o[o.length-1].extendList=[c],h.push(c),c.ruleset=u.ruleset,c.parent_ids=c.parent_ids.concat(u.parent_ids,l.parent_ids),u.firstExtendOnThisSelectorPath&&(c.firstExtendOnThisSelectorPath=!0,u.ruleset.paths.push(o))}))));if(h.length){if(this.extendChainCount++,i>100){var p="{unable to calculate}",v="{unable to calculate}";try{p=h[0].selfSelectors[0].toCSS(),v=h[0].selector.toCSS()}catch(e){}throw{message:"extend circular reference detected. One of the circular extends is currently:"+p+":extend("+v+")"}}return h.concat(f.doExtendChaining(h,t,i+1))}return h},e.prototype.visitDeclaration=function(e,t){t.visitDeeper=!1},e.prototype.visitMixinDefinition=function(e,t){t.visitDeeper=!1},e.prototype.visitSelector=function(e,t){t.visitDeeper=!1},e.prototype.visitRuleset=function(e,t){if(!e.root){var i,n,r,s,o=this.allExtendsStack[this.allExtendsStack.length-1],a=[],l=this;for(r=0;r0&&u[l.matched].combinator.value!==o?l=null:l.matched++,l&&(l.finished=l.matched===u.length,l.finished&&!e.allowAfter&&(r+1u&&c>0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[u].elements.slice(c)),c=0,u++),l=s.elements.slice(c,a.index).concat([o]).concat(i.elements.slice(1)),u===a.pathIndex&&r>0?h[h.length-1].elements=h[h.length-1].elements.concat(l):(h=h.concat(t.slice(u,a.pathIndex))).push(new Se.Selector(l)),u=a.endPathIndex,(c=a.endPathElementIndex)>=t[u].elements.length&&(c=0,u++);return u0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[u].elements.slice(c)),u++),h=(h=h.concat(t.slice(u,t.length))).map((function(e){var t=e.createDerived(e.elements);return n?t.ensureVisibility():t.ensureInvisibility(),t}))},e.prototype.visitMedia=function(e,t){var i=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);i=i.concat(this.doExtendChaining(i,e.allExtends)),this.allExtendsStack.push(i)},e.prototype.visitMediaOut=function(e){var t=this.allExtendsStack.length-1;this.allExtendsStack.length=t},e.prototype.visitAtRule=function(e,t){var i=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);i=i.concat(this.doExtendChaining(i,e.allExtends)),this.allExtendsStack.push(i)},e.prototype.visitAtRuleOut=function(e){var t=this.allExtendsStack.length-1;this.allExtendsStack.length=t},e}(),Fe=function(){function e(){this.contexts=[[]],this._visitor=new Me(this)}return e.prototype.run=function(e){return this._visitor.visit(e)},e.prototype.visitDeclaration=function(e,t){t.visitDeeper=!1},e.prototype.visitMixinDefinition=function(e,t){t.visitDeeper=!1},e.prototype.visitRuleset=function(e,t){var i,n=this.contexts[this.contexts.length-1],r=[];this.contexts.push(r),e.root||((i=e.selectors)&&(i=i.filter((function(e){return e.getIsOutput()})),e.selectors=i.length?i:i=null,i&&e.joinSelectors(r,n,i)),i||(e.rules=null),e.paths=r)},e.prototype.visitRulesetOut=function(e){this.contexts.length=this.contexts.length-1},e.prototype.visitMedia=function(e,t){var i=this.contexts[this.contexts.length-1];e.rules[0].root=0===i.length||i[0].multiMedia},e.prototype.visitAtRule=function(e,t){var i=this.contexts[this.contexts.length-1];e.rules&&e.rules.length&&(e.rules[0].root=e.isRooted||0===i.length||null)},e}(),$e=function(){function e(e){this._visitor=new Me(this),this._context=e}return e.prototype.containsSilentNonBlockedChild=function(e){var t;if(!e)return!1;for(var i=0;i0},e.prototype.resolveVisibility=function(e,t){if(!e.blocksVisibility()){if(this.isEmpty(e)&&!this.containsSilentNonBlockedChild(t))return;return e}var i=e.rules[0];if(this.keepOnlyVisibleChilds(i),!this.isEmpty(i))return e.ensureVisibility(),e.removeVisibilityBlock(),e},e.prototype.isVisibleRuleset=function(e){return!!e.firstRoot||!this.isEmpty(e)&&!(!e.root&&!this.hasVisibleSelector(e))},e}(),Le=function(e){this._visitor=new Me(this),this._context=e,this.utils=new $e(e)};Le.prototype={isReplacing:!0,run:function(e){return this._visitor.visit(e)},visitDeclaration:function(e,t){if(!e.blocksVisibility()&&!e.variable)return e},visitMixinDefinition:function(e,t){e.frames=[]},visitExtend:function(e,t){},visitComment:function(e,t){if(!e.blocksVisibility()&&!e.isSilent(this._context))return e},visitMedia:function(e,t){var i=e.rules[0].rules;return e.accept(this._visitor),t.visitDeeper=!1,this.utils.resolveVisibility(e,i)},visitImport:function(e,t){if(!e.blocksVisibility())return e},visitAtRule:function(e,t){return e.rules&&e.rules.length?this.visitAtRuleWithBody(e,t):this.visitAtRuleWithoutBody(e,t)},visitAnonymous:function(e,t){if(!e.blocksVisibility())return e.accept(this._visitor),e},visitAtRuleWithBody:function(e,t){var i=function(e){var t=e.rules;return function(e){var t=e.rules;return 1===t.length&&(!t[0].paths||0===t[0].paths.length)}(e)?t[0].rules:t}(e);return e.accept(this._visitor),t.visitDeeper=!1,this.utils.isEmpty(e)||this._mergeRules(e.rules[0].rules),this.utils.resolveVisibility(e,i)},visitAtRuleWithoutBody:function(e,t){if(!e.blocksVisibility()){if("@charset"===e.name){if(this.charset){if(e.debugInfo){var i=new Se.Comment("/* "+e.toCSS(this._context).replace(/\n/g,"")+" */\n");return i.debugInfo=e.debugInfo,this._visitor.visit(i)}return}this.charset=!0}return e}},checkValidNodes:function(e,t){if(e)for(var i=0;i0?e.accept(this._visitor):e.rules=null,t.visitDeeper=!1}return e.rules&&(this._mergeRules(e.rules),this._removeDuplicateRules(e.rules)),this.utils.isVisibleRuleset(e)&&(e.ensureVisibility(),n.splice(0,0,e)),1===n.length?n[0]:n},_compileRulesetPaths:function(e){e.paths&&(e.paths=e.paths.filter((function(e){var t;for(" "===e[0].elements[0].combinator.value&&(e[0].elements[0].combinator=new Se.Combinator("")),t=0;t=0;n--)if((i=e[n])instanceof Se.Declaration)if(r[i.name]){(t=r[i.name])instanceof Se.Declaration&&(t=r[i.name]=[r[i.name].toCSS(this._context)]);var s=i.toCSS(this._context);-1!==t.indexOf(s)?e.splice(n,1):t.push(s)}else r[i.name]=i}},_mergeRules:function(e){if(e){for(var t={},i=[],n=0;n0){var t=e[0],i=[],n=[new Se.Expression(i)];e.forEach((function(e){"+"===e.merge&&i.length>0&&n.push(new Se.Expression(i=[])),i.push(e.value),t.important=t.important||e.important})),t.value=new Se.Value(n)}}))}}};var Ne={Visitor:Me,ImportVisitor:Pe,MarkVisibleSelectorsVisitor:Re,ExtendVisitor:Ve,JoinSelectorVisitor:Fe,ToCSSVisitor:Le};var De=function(){var e,t,i,n,r,s,o,a=[],l={};function u(i){for(var n,a,c,h=l.i,f=t,p=l.i-o,v=l.i+s.length-p,d=l.i+=i,m=e;l.i=0){c={index:l.i,text:m.substr(l.i,y+2-l.i),isLineComment:!1},l.i+=c.text.length-1,l.commentStore.push(c);continue}}break}if(32!==n&&10!==n&&9!==n&&13!==n)break}if(s=s.slice(i+l.i-d+p),o=l.i,!s.length){if(ti||l.i===i&&e&&!n)&&(i=l.i,n=e);var r=a.pop();s=r.current,o=l.i=r.i,t=r.j},l.forget=function(){a.pop()},l.isWhitespace=function(t){var i=l.i+(t||0),n=e.charCodeAt(i);return 32===n||13===n||9===n||10===n},l.$re=function(e){l.i>o&&(s=s.slice(l.i-o),o=l.i);var t=e.exec(s);return t?(u(t[0].length),"string"==typeof t?t:1===t.length?t[0]:t):null},l.$char=function(t){return e.charAt(l.i)!==t?null:(u(1),t)},l.$str=function(t){for(var i=t.length,n=0;nh&&(d=!1)}}while(d);return r||null},l.autoCommentAbsorb=!0,l.commentStore=[],l.finished=!1,l.peek=function(t){if("string"==typeof t){for(var i=0;i57||t<43||47===t||44===t},l.start=function(n,a,c){e=n,l.i=t=o=i=0,r=a?function(e,t){var i,n,r,s,o,a,l,u,c,h=e.length,f=0,p=0,v=[],d=0;function m(t){var i=o-d;i<512&&!t||!i||(v.push(e.slice(d,o+1)),d=o+1)}for(o=0;o=97&&l<=122||l<34))switch(l){case 40:p++,n=o;continue;case 41:if(--p<0)return t("missing opening `(`",o);continue;case 59:p||m();continue;case 123:f++,i=o;continue;case 125:if(--f<0)return t("missing opening `{`",o);f||p||m();continue;case 92:if(o96)){if(u==l){c=1;break}if(92==u){if(o==h-1)return t("unescaped `\\`",o);o++}}if(c)continue;return t("unmatched `"+String.fromCharCode(l)+"`",a);case 47:if(p||o==h-1)continue;if(47==(u=e.charCodeAt(o+1)))for(o+=2;oi&&s>r?"missing closing `}` or `*/`":"missing closing `}`",i):0!==p?t("missing closing `)`",n):(m(!0),v)}(n,c):[n],s=r[0],u(0)},l.end=function(){var t,r=l.i>=e.length;return l.i=e.length-1,furthestChar:e[l.i]}},l},je=function e(t,i,n){var r,s=De();function o(e,t){throw new P({index:s.i,filename:n.filename,type:t||"Syntax",message:e},i)}function a(e,t){var i=e instanceof Function?e.call(r):s.$re(e);if(i)return i;o(t||("string"==typeof e?"expected '"+e+"' got '"+s.currentChar()+"'":"unexpected token"))}function l(e,t){if(s.$char(e))return e;o(t||"expected '"+e+"' got '"+s.currentChar()+"'")}function u(e){var t=n.filename;return{lineNumber:S(e,s.getInput()).line+1,fileName:t}}return{parserInput:s,imports:i,fileInfo:n,parseNode:function(e,t,n,o,a){var l,u=[],c=s;try{c.start(e,!1,(function(e,t){a({message:e,index:t+n})}));for(var h=0,f=void 0,p=void 0;f=t[h];h++)if(p=c.i,l=r[f]()){try{l._index=p+n,l._fileInfo=o}catch(e){}u.push(l)}else u.push(null);c.end().isFinished?a(null,u):a(!0,null)}catch(e){throw new P({index:e.index+n,message:e.message},i,o.filename)}},parse:function(r,o,a){var l,u,c,h,f=null,p="";if(u=a&&a.globalVars?e.serializeVars(a.globalVars)+"\n":"",c=a&&a.modifyVars?"\n"+e.serializeVars(a.modifyVars):"",t.pluginManager)for(var v=t.pluginManager.getPreProcessors(),d=0;d");return e},args:function(e){var t,i,n,a,l,u,c,h=r.entities,f={args:null,variadic:!1},p=[],v=[],d=[],m=!0;for(s.save();;){if(e)u=r.detachedRuleset()||r.expression();else{if(s.commentStore.length=0,s.$str("...")){f.variadic=!0,s.$char(";")&&!t&&(t=!0),(t?v:d).push({variadic:!0});break}u=h.variable()||h.property()||h.literal()||h.keyword()||this.call(!0)}if(!u||!m)break;a=null,u.throwAwayComments&&u.throwAwayComments(),l=u;var g=null;if(e?u.value&&1==u.value.length&&(g=u.value[0]):g=u,g&&(g instanceof Se.Variable||g instanceof Se.Property))if(s.$char(":")){if(p.length>0&&(t&&o("Cannot mix ; and , as delimiter types"),i=!0),!(l=r.detachedRuleset()||r.expression())){if(!e)return s.restore(),f.args=[],f;o("could not understand value for named argument")}a=n=g.name}else if(s.$str("...")){if(!e){f.variadic=!0,s.$char(";")&&!t&&(t=!0),(t?v:d).push({name:u.name,variadic:!0});break}c=!0}else e||(n=a=g.name,l=null);l&&p.push(l),d.push({name:a,value:l,expand:c}),s.$char(",")?m=!0:((m=";"===s.$char(";"))||t)&&(i&&o("Cannot mix ; and , as delimiter types"),t=!0,p.length>1&&(l=new Se.Value(p)),v.push({name:n,value:l,expand:c}),n=null,p=[],i=!1)}return s.forget(),f.args=t?v:d,f},definition:function(){var e,t,i,n,o=[],l=!1;if(!("."!==s.currentChar()&&"#"!==s.currentChar()||s.peek(/^[^{]*\}/)))if(s.save(),t=s.$re(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/)){e=t[1];var u=this.args(!1);if(o=u.args,l=u.variadic,!s.$char(")"))return void s.restore("Missing closing ')'");if(s.commentStore.length=0,s.$str("when")&&(n=a(r.conditions,"expected condition")),i=r.block())return s.forget(),new Se.mixin.Definition(e,o,i,n,l);s.restore()}else s.restore()},ruleLookups:function(){var e,t=[];if("["===s.currentChar()){for(;;){if(s.save(),!(e=this.lookupValue())&&""!==e){s.restore();break}t.push(e),s.forget()}return t.length>0?t:void 0}},lookupValue:function(){if(s.save(),s.$char("[")){var e=s.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);if(s.$char("]"))return e||""===e?(s.forget(),e):void s.restore();s.restore()}else s.restore()}},entity:function(){var e=this.entities;return this.comment()||e.literal()||e.variable()||e.url()||e.property()||e.call()||e.keyword()||this.mixin.call(!0)||e.javascript()},end:function(){return s.$char(";")||s.peek("}")},ieAlpha:function(){var e;if(s.$re(/^opacity=/i))return(e=s.$re(/^\d+/))||(e="@{"+(e=a(r.entities.variable,"Could not parse alpha")).name.slice(1)+"}"),l(")"),new Se.Quoted("","alpha(opacity="+e+")")},element:function(){var e,t,i,r=s.i;if(t=this.combinator(),(e=s.$re(/^(?:\d+\.\d+|\d+)%/)||s.$re(/^(?:[.#]?|:*)(?:[\w-]|[^\x00-\x9f]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/)||s.$char("*")||s.$char("&")||this.attribute()||s.$re(/^\([^&()@]+\)/)||s.$re(/^[\.#:](?=@)/)||this.entities.variableCurly())||(s.save(),s.$char("(")?(i=this.selector(!1))&&s.$char(")")?(e=new Se.Paren(i),s.forget()):s.restore("Missing closing ')'"):s.forget()),e)return new Se.Element(t,e,e instanceof Se.Variable,r,n)},combinator:function(){var e=s.currentChar();if("/"===e){s.save();var t=s.$re(/^\/[a-z]+\//i);if(t)return s.forget(),new Se.Combinator(t);s.restore()}if(">"===e||"+"===e||"~"===e||"|"===e||"^"===e){for(s.i++,"^"===e&&"^"===s.currentChar()&&(e="^^",s.i++);s.isWhitespace();)s.i++;return new Se.Combinator(e)}return s.isWhitespace(-1)?new Se.Combinator(" "):new Se.Combinator(null)},selector:function(e){var t,i,r,l,u,c,h,f=s.i;for(e=!1!==e;(e&&(i=this.extend())||e&&(c=s.$str("when"))||(l=this.element()))&&(c?h=a(this.conditions,"expected condition"):h?o("CSS guard can only be used at the end of selector"):i?u=u?u.concat(i):i:(u&&o("Extend can only be used at the end of selector"),r=s.currentChar(),t?t.push(l):t=[l],l=null),"{"!==r&&"}"!==r&&";"!==r&&","!==r&&")"!==r););if(t)return new Se.Selector(t,u,h,f,n);u&&o("Extend must be used to extend a selector, it cannot be used on its own")},selectors:function(){for(var e,t;(e=this.selector())&&(t?t.push(e):t=[e],s.commentStore.length=0,e.condition&&t.length>1&&o("Guards are only currently allowed on a single selector."),s.$char(","));)e.condition&&o("Guards are only currently allowed on a single selector."),s.commentStore.length=0;return t},attribute:function(){if(s.$char("[")){var e,t,i,n=this.entities;return(e=n.variableCurly())||(e=a(/^(?:[_A-Za-z0-9-\*]*\|)?(?:[_A-Za-z0-9-]|\\.)+/)),(i=s.$re(/^[|~*$^]?=/))&&(t=n.quoted()||s.$re(/^[0-9]+%/)||s.$re(/^[\w-]+/)||n.variableCurly()),l("]"),new Se.Attribute(e,i,t)}},block:function(){var e;if(s.$char("{")&&(e=this.primary())&&s.$char("}"))return e},blockRuleset:function(){var e=this.block();return e&&(e=new Se.Ruleset(null,e)),e},detachedRuleset:function(){var e,t,i;if(s.save(),!s.$re(/^[.#]\(/)||(t=(e=this.mixin.args(!1)).args,i=e.variadic,s.$char(")"))){var n=this.blockRuleset();if(n)return s.forget(),t?new Se.mixin.Definition(null,t,n,null,i):new Se.DetachedRuleset(n);s.restore()}else s.restore()},ruleset:function(){var e,i,n;if(s.save(),t.dumpLineNumbers&&(n=u(s.i)),(e=this.selectors())&&(i=this.block())){s.forget();var r=new Se.Ruleset(e,i,t.strictImports);return t.dumpLineNumbers&&(r.debugInfo=n),r}s.restore()},declaration:function(){var e,t,i,r,o,a,l=s.i,u=s.currentChar();if("."!==u&&"#"!==u&&"&"!==u&&":"!==u)if(s.save(),e=this.variable()||this.ruleProperty()){if((a="string"==typeof e)&&(t=this.detachedRuleset())&&(i=!0),s.commentStore.length=0,!t){if(o=!a&&e.length>1&&e.pop().value,t=e[0].value&&"--"===e[0].value.slice(0,2)?this.permissiveValue():this.anonymousValue())return s.forget(),new Se.Declaration(e,t,!1,o,l,n);t||(t=this.value()),t?r=this.important():a&&(t=this.permissiveValue())}if(t&&(this.end()||i))return s.forget(),new Se.Declaration(e,t,r,o,l,n);s.restore()}else s.restore()},anonymousValue:function(){var e=s.i,t=s.$re(/^([^.#@\$+\/'"*`(;{}-]*);/);if(t)return new Se.Anonymous(t[1],e)},permissiveValue:function(e){var t,i,r,a,l=e||";",u=s.i,c=[];function h(){var e=s.currentChar();return"string"==typeof l?e===l:l.test(e)}if(!h()){a=[];do{((i=this.comment())||(i=this.entity()))&&a.push(i)}while(i);if(r=h(),a.length>0){if(a=new Se.Expression(a),r)return a;c.push(a)," "===s.prevChar()&&c.push(new Se.Anonymous(" ",u))}if(s.save(),a=s.$parseUntil(l)){if("string"==typeof a&&o("Expected '"+a+"'","Parse"),1===a.length&&" "===a[0])return s.forget(),new Se.Anonymous("",u);var f=void 0;for(t=0;t0)return new Se.Expression(r)},mediaFeatures:function(){var e,t=this.entities,i=[];do{if(e=this.mediaFeature()){if(i.push(e),!s.$char(","))break}else if((e=t.variable()||t.mixinLookup())&&(i.push(e),!s.$char(",")))break}while(e);return i.length>0?i:null},media:function(){var e,i,r,a,l=s.i;if(t.dumpLineNumbers&&(a=u(l)),s.save(),s.$str("@media"))return e=this.mediaFeatures(),(i=this.block())||o("media definitions require block statements after any features"),s.forget(),r=new Se.Media(i,e,l,n),t.dumpLineNumbers&&(r.debugInfo=a),r;s.restore()},plugin:function(){var e,t,i,r=s.i;if(s.$re(/^@plugin?\s+/)){if(i=(t=this.pluginArgs())?{pluginArgs:t,isPlugin:!0}:{isPlugin:!0},e=this.entities.quoted()||this.entities.url())return s.$char(";")||(s.i=r,o("missing semi-colon on @plugin")),new Se.Import(e,null,i,r,n);s.i=r,o("malformed @plugin statement")}},pluginArgs:function(){if(s.save(),!s.$char("("))return s.restore(),null;var e=s.$re(/^\s*([^\);]+)\)\s*/);return e[1]?(s.forget(),e[1].trim()):(s.restore(),null)},atrule:function(){var e,i,r,a,l,c,h,f=s.i,p=!0,v=!0;if("@"===s.currentChar()){if(i=this.import()||this.plugin()||this.media())return i;if(s.save(),e=s.$re(/^@[a-z-]+/)){switch(a=e,"-"==e.charAt(1)&&e.indexOf("-",2)>0&&(a="@"+e.slice(e.indexOf("-",2)+1)),a){case"@charset":l=!0,p=!1;break;case"@namespace":c=!0,p=!1;break;case"@keyframes":case"@counter-style":l=!0;break;case"@document":case"@supports":h=!0,v=!1;break;default:h=!0}if(s.commentStore.length=0,l?(i=this.entity())||o("expected "+e+" identifier"):c?(i=this.expression())||o("expected "+e+" expression"):h&&(i=this.permissiveValue(/^[{;]/),p="{"===s.currentChar(),i?i.value||(i=null):p||";"===s.currentChar()||o(e+" rule is missing block or ending semi-colon")),p&&(r=this.blockRuleset()),r||!p&&i&&s.$char(";"))return s.forget(),new Se.AtRule(e,i,r,f,n,t.dumpLineNumbers?u(f):null,v);s.restore("at-rule options not recognised")}}},value:function(){var e,t=[],i=s.i;do{if((e=this.expression())&&(t.push(e),!s.$char(",")))break}while(e);if(t.length>0)return new Se.Value(t,i)},important:function(){if("!"===s.currentChar())return s.$re(/^! *important/)},sub:function(){var e,t;if(s.save(),s.$char("("))return(e=this.addition())&&s.$char(")")?(s.forget(),(t=new Se.Expression([e])).parens=!0,t):void s.restore("Expected ')'");s.restore()},multiplication:function(){var e,t,i,n,r;if(e=this.operand()){for(r=s.isWhitespace(-1);!s.peek(/^\/[*\/]/);){if(s.save(),!(i=s.$char("/")||s.$char("*")||s.$str("./"))){s.forget();break}if(!(t=this.operand())){s.restore();break}s.forget(),e.parensInOp=!0,t.parensInOp=!0,n=new Se.Operation(i,[n||e,t],r),r=s.isWhitespace(-1)}return n||e}},addition:function(){var e,t,i,n,r;if(e=this.multiplication()){for(r=s.isWhitespace(-1);(i=s.$re(/^[-+]\s+/)||!r&&(s.$char("+")||s.$char("-")))&&(t=this.multiplication());)e.parensInOp=!0,t.parensInOp=!0,n=new Se.Operation(i,[n||e,t],r),r=s.isWhitespace(-1);return n||e}},conditions:function(){var e,t,i,n=s.i;if(e=this.condition(!0)){for(;s.peek(/^,\s*(not\s*)?\(/)&&s.$char(",")&&(t=this.condition(!0));)i=new Se.Condition("or",i||e,t,n);return i||e}},condition:function(e){var t,i,n;if(t=this.conditionAnd(e)){if(i=s.$str("or")){if(!(n=this.condition(e)))return;t=new Se.Condition(i,t,n)}return t}},conditionAnd:function(e){var t,i,n,r,o=this;if(t=(r=o.negatedCondition(e)||o.parenthesisCondition(e))||e?r:o.atomicCondition(e)){if(i=s.$str("and")){if(!(n=this.conditionAnd(e)))return;t=new Se.Condition(i,t,n)}return t}},negatedCondition:function(e){if(s.$str("not")){var t=this.parenthesisCondition(e);return t&&(t.negate=!t.negate),t}},parenthesisCondition:function(e){var t;if(s.save(),s.$str("(")){if(t=function(t){var i;if(s.save(),i=t.condition(e)){if(s.$char(")"))return s.forget(),i;s.restore()}else s.restore()}(this))return s.forget(),t;if(t=this.atomicCondition(e)){if(s.$char(")"))return s.forget(),t;s.restore("expected ')' got '"+s.currentChar()+"'")}else s.restore()}else s.restore()},atomicCondition:function(e){var t,i,n,r,a=this.entities,l=s.i;function u(){return this.addition()||a.keyword()||a.quoted()||a.mixinLookup()}if(t=(u=u.bind(this))())return s.$char(">")?r=s.$char("=")?">=":">":s.$char("<")?r=s.$char("=")?"<=":"<":s.$char("=")&&(r=s.$char(">")?"=>":s.$char("<")?"=<":"="),r?(i=u())?n=new Se.Condition(r,t,i,l,!1):o("expected expression"):n=new Se.Condition("=",t,new Se.Keyword("true"),l,!1),n},operand:function(){var e,t=this.entities;s.peek(/^-[@\$\(]/)&&(e=s.$char("-"));var i=this.sub()||t.dimension()||t.color()||t.variable()||t.property()||t.call()||t.quoted(!0)||t.colorKeyword()||t.mixinLookup();return e&&(i.parensInOp=!0,i=new Se.Negative(i)),i},expression:function(){var e,t,i=[],n=s.i;do{(e=this.comment())?i.push(e):((e=this.addition()||this.entity())instanceof Se.Comment&&(e=null),e&&(i.push(e),s.peek(/^\/[\/*]/)||(t=s.$char("/"))&&i.push(new Se.Anonymous(t,n))))}while(e);if(i.length>0)return new Se.Expression(i)},property:function(){var e=s.$re(/^(\*?-?[_a-zA-Z0-9-]+)\s*:/);if(e)return e[1]},ruleProperty:function(){var e,t,i=[],r=[];s.save();var o=s.$re(/^([_a-zA-Z0-9-]+)\s*:/);if(o)return i=[new Se.Keyword(o[1])],s.forget(),i;function a(e){var t=s.i,n=s.$re(e);if(n)return r.push(t),i.push(n[1])}for(a(/^(\*?)/);a(/^((?:[\w-]+)|(?:[@\$]\{[\w-]+\}))/););if(i.length>1&&a(/^((?:\+_|\+)?)\s*:/)){for(s.forget(),""===i[0]&&(i.shift(),r.shift()),t=0;t1?e-1:e)<1?r+(s-r)*e*6:2*e<1?s:3*e<2?r+(s-r)*(2/3-e)*6:r}e=Je(e)%360/360,t=Te(Je(t)),i=Te(Je(i)),n=Te(Je(n)),r=2*i-(s=i<=.5?i*(t+1):i+t-i*t);var a=[255*o(e+1/3),255*o(e),255*o(e-1/3)];return n=Je(n),new c(a,n,"hsla")}catch(e){}},hsv:function(e,t,i){return Ue.hsva(e,t,i,1)},hsva:function(e,t,i,n){var r,s;e=Je(e)%360/360*360,t=Je(t),i=Je(i),n=Je(n);var o=[i,i*(1-t),i*(1-(s=e/60-(r=Math.floor(e/60%6)))*t),i*(1-(1-s)*t)],a=[[0,3,1],[2,0,1],[1,0,3],[1,2,0],[3,1,0],[0,1,2]];return Ue.rgba(255*o[a[r][0]],255*o[a[r][1]],255*o[a[r][2]],n)},hue:function(e){return new X(Ge(e).h)},saturation:function(e){return new X(100*Ge(e).s,"%")},lightness:function(e){return new X(100*Ge(e).l,"%")},hsvhue:function(e){return new X(We(e).h)},hsvsaturation:function(e){return new X(100*We(e).s,"%")},hsvvalue:function(e){return new X(100*We(e).v,"%")},red:function(e){return new X(e.rgb[0])},green:function(e){return new X(e.rgb[1])},blue:function(e){return new X(e.rgb[2])},alpha:function(e){return new X(Ge(e).a)},luma:function(e){return new X(e.luma()*e.alpha*100,"%")},luminance:function(e){var t=.2126*e.rgb[0]/255+.7152*e.rgb[1]/255+.0722*e.rgb[2]/255;return new X(t*e.alpha*100,"%")},saturate:function(e,t,i){if(!e.rgb)return null;var n=Ge(e);return void 0!==i&&"relative"===i.value?n.s+=n.s*t.value/100:n.s+=t.value/100,n.s=Te(n.s),ze(e,n)},desaturate:function(e,t,i){var n=Ge(e);return void 0!==i&&"relative"===i.value?n.s-=n.s*t.value/100:n.s-=t.value/100,n.s=Te(n.s),ze(e,n)},lighten:function(e,t,i){var n=Ge(e);return void 0!==i&&"relative"===i.value?n.l+=n.l*t.value/100:n.l+=t.value/100,n.l=Te(n.l),ze(e,n)},darken:function(e,t,i){var n=Ge(e);return void 0!==i&&"relative"===i.value?n.l-=n.l*t.value/100:n.l-=t.value/100,n.l=Te(n.l),ze(e,n)},fadein:function(e,t,i){var n=Ge(e);return void 0!==i&&"relative"===i.value?n.a+=n.a*t.value/100:n.a+=t.value/100,n.a=Te(n.a),ze(e,n)},fadeout:function(e,t,i){var n=Ge(e);return void 0!==i&&"relative"===i.value?n.a-=n.a*t.value/100:n.a-=t.value/100,n.a=Te(n.a),ze(e,n)},fade:function(e,t){var i=Ge(e);return i.a=t.value/100,i.a=Te(i.a),ze(e,i)},spin:function(e,t){var i=Ge(e),n=(i.h+t.value)%360;return i.h=n<0?360+n:n,ze(e,i)},mix:function(e,t,i){i||(i=new X(50));var n=i.value/100,r=2*n-1,s=Ge(e).a-Ge(t).a,o=((r*s==-1?r:(r+s)/(1+r*s))+1)/2,a=1-o,l=[e.rgb[0]*o+t.rgb[0]*a,e.rgb[1]*o+t.rgb[1]*a,e.rgb[2]*o+t.rgb[2]*a],u=e.alpha*n+t.alpha*(1-n);return new c(l,u)},greyscale:function(e){return Ue.desaturate(e,new X(100))},contrast:function(e,t,i,n){if(!e.rgb)return null;if(void 0===i&&(i=Ue.rgba(255,255,255,1)),void 0===t&&(t=Ue.rgba(0,0,0,1)),t.luma()>i.luma()){var r=i;i=t,t=r}return n=void 0===n?.43:Je(n),e.luma().5&&(n=1,i=e>.25?Math.sqrt(e):((16*e-12)*e+4)*e),e-(1-2*t)*n*(i-e)},hardlight:function(e,t){return Ke.overlay(t,e)},difference:function(e,t){return Math.abs(e-t)},exclusion:function(e,t){return e+t-2*e*t},average:function(e,t){return(e+t)/2},negation:function(e,t){return 1-Math.abs(e+t-1)}};for(var Ze in Ke)Ke.hasOwnProperty(Ze)&&(Qe[Ze]=Qe.bind(null,Ke[Ze]));var Xe=function(e){return Array.isArray(e.value)?e.value:Array(e)},Ye={_SELF:function(e){return e},"~":function(){for(var e=[],t=0;to.value)&&(c[n]=r);else{if(void 0!==l&&a!==l)throw{type:"Argument",message:"incompatible types"};h[a]=c.length,c.push(r)}else Array.isArray(t[i].value)&&Array.prototype.push.apply(t,Array.prototype.slice.call(t[i].value));return 1==c.length?c[0]:(t=c.map((function(e){return e.toCSS(this.context)})).join(this.context.compress?",":", "),new $((e?"min":"max")+"("+t+")"))},rt={min:function(){for(var e=[],t=0;t",r=0;r";return n+="',n=encodeURIComponent(n),new le(new ae("'"+(n="data:image/svg+xml,"+n)+"'",n,!1,this.index,this.currentFileInfo),this.index,this.currentFileInfo)}}),W.addMultiple(lt),t};function ct(e,t){var i,n=(t=t||{}).variables,r=new B.Eval(t);"object"!=typeof n||Array.isArray(n)||(n=Object.keys(n).map((function(e){var t=n[e];return t instanceof Se.Value||(t instanceof Se.Expression||(t=new Se.Expression([t])),t=new Se.Value([t])),new Se.Declaration("@"+e,t,!1,null,0)})),r.frames=[new Se.Ruleset(null,n)]);var s,o,a=[new Ne.JoinSelectorVisitor,new Ne.MarkVisibleSelectorsVisitor(!0),new Ne.ExtendVisitor,new Ne.ToCSSVisitor({compress:Boolean(t.compress)})],l=[];if(t.pluginManager){o=t.pluginManager.visitor();for(var u=0;u<2;u++)for(o.first();s=o.get();)s.isPreEvalVisitor?0!==u&&-1!==l.indexOf(s)||(l.push(s),s.run(e)):0!==u&&-1!==a.indexOf(s)||(s.isPreVisitor?a.unshift(s):a.push(s))}i=e.eval(r);for(u=0;u=t);i++);this.preProcessors.splice(i,0,{preProcessor:e,priority:t})},e.prototype.addPostProcessor=function(e,t){var i;for(i=0;i=t);i++);this.postProcessors.splice(i,0,{postProcessor:e,priority:t})},e.prototype.addFileManager=function(e){this.fileManagers.push(e)},e.prototype.getPreProcessors=function(){for(var e=[],t=0;t0){var n=void 0,r=JSON.stringify(this._sourceMapGenerator.toJSON());this.sourceMapURL?n=this.sourceMapURL:this._sourceMapFilename&&(n=this._sourceMapFilename),this.sourceMapURL=n,this.sourceMap=r}return this._css.join("")},t}()}(e=new s(e,t)),e)),a=function(e){return function(){function t(e,t,i){this.less=e,this.rootFilename=i.filename,this.paths=t.paths||[],this.contents={},this.contentsIgnoredChars={},this.mime=t.mime,this.error=null,this.context=t,this.queue=[],this.files={}}return t.prototype.push=function(t,i,n,s,o){var a=this,l=this.context.pluginManager.Loader;this.queue.push(t);var u=function(e,i,n){a.queue.splice(a.queue.indexOf(t),1);var l=n===a.rootFilename;s.optional&&e?(o(null,{rules:[]},!1,null),r.info("The file "+n+" was skipped because it was not found and the import was marked optional.")):(a.files[n]||s.inline||(a.files[n]={root:i,options:s}),e&&!a.error&&(a.error=e),o(e,i,l,n))},c={rewriteUrls:this.context.rewriteUrls,entryPath:n.entryPath,rootpath:n.rootpath,rootFilename:n.rootFilename},h=e.getFileManager(t,n.currentDirectory,this.context,e);if(h){var f,p,v=function(e){var t,i=e.filename,r=e.contents.replace(/^\uFEFF/,"");c.currentDirectory=h.getPath(i),c.rewriteUrls&&(c.rootpath=h.join(a.context.rootpath||"",h.pathDiff(c.currentDirectory,c.entryPath)),!h.isPathAbsolute(c.rootpath)&&h.alwaysMakePathsAbsolute()&&(c.rootpath=h.join(c.entryPath,c.rootpath))),c.filename=i;var o=new B.Parse(a.context);o.processImports=!1,a.contents[i]=r,(n.reference||s.reference)&&(c.reference=!0),s.isPlugin?(t=l.evalPlugin(r,o,a,s.pluginArgs,c))instanceof P?u(t,null,i):u(null,t,i):s.inline?u(null,r,i):!a.files[i]||a.files[i].options.multiple||s.multiple?new je(o,a,c).parse(r,(function(e,t){u(e,t,i)})):u(null,a.files[i].root,i)},d=C(this.context);i&&(d.ext=s.isPlugin?".js":".less"),s.isPlugin?(d.mime="application/javascript",d.syncImport?f=l.loadPluginSync(t,n.currentDirectory,d,e,h):p=l.loadPlugin(t,n.currentDirectory,d,e,h)):d.syncImport?f=h.loadFileSync(t,n.currentDirectory,d,e):p=h.loadFile(t,n.currentDirectory,d,e,(function(e,t){e?u(e):v(t)})),f?f.filename?v(f):u(f):p&&p.then(v,u)}else u({message:"Could not find a file-manager for "+t})},t}()}(e);var u,c=function(e,t,i){var n=function(e,i,r){if("function"==typeof i?(r=i,i=_(this.options,{})):i=_(this.options,i||{}),!r){var s=this;return new Promise((function(t,r){n.call(s,e,i,(function(e,i){e?r(e):t(i)}))}))}this.parse(e,i,(function(e,i,n,s){if(e)return r(e);var o;try{o=new t(i,n).toCSS(s)}catch(e){return r(e)}r(null,o)}))};return n}(0,o),h=function(e,t,i){var n=function(e,t,r){if("function"==typeof t?(r=t,t=_(this.options,{})):t=_(this.options,t||{}),!r){var s=this;return new Promise((function(i,r){n.call(s,e,t,(function(e,t){e?r(e):i(t)}))}))}var o,a=void 0,l=new dt(this,!t.reUsePluginManager);if(t.pluginManager=l,o=new B.Parse(t),t.rootFileInfo)a=t.rootFileInfo;else{var u=t.filename||"input",c=u.replace(/[^\/\\]*$/,"");(a={filename:u,rewriteUrls:o.rewriteUrls,rootpath:o.rootpath||"",currentDirectory:c,entryPath:c,rootFilename:u}).rootpath&&"/"!==a.rootpath.slice(-1)&&(a.rootpath+="/")}var h=new i(this,o,a);this.importManager=h,t.plugins&&t.plugins.forEach((function(e){var t,i;if(e.fileContent){if(i=e.fileContent.replace(/^\uFEFF/,""),(t=l.Loader.evalPlugin(i,o,h,e.options,e.filename))instanceof P)return r(t)}else l.addPlugin(e)})),new je(o,h,a).parse(e,(function(e,i){if(e)return r(e);r(null,i,h,t)}),t)};return n}(0,0,a),f={version:[4,0,0],data:l,tree:Se,Environment:s,AbstractFileManager:Ie,AbstractPluginLoader:Ce,environment:e,visitors:Ne,Parser:je,functions:ut(e),contexts:B,SourceMapOutput:i,SourceMapBuilder:n,ParseTree:o,ImportManager:a,render:c,parse:h,LessError:P,transformTree:ct,utils:M,PluginManager:dt,logger:r},p=function(e){return function(){var t=Object.create(e.prototype);return e.apply(t,Array.prototype.slice.call(arguments,0)),t}},v=Object.create(f);for(var d in f.tree)if("function"==typeof(u=f.tree[d]))v[d.toLowerCase()]=p(u);else for(var m in v[d]=Object.create(null),u)v[d][m.toLowerCase()]=p(u[m]);return f.parse=f.parse.bind(v),f.render=f.render.bind(v),v}var gt={},yt=function(){};yt.prototype=Object.assign(new Ie,{alwaysMakePathsAbsolute:function(){return!0},join:function(e,t){return e?this.extractUrlParts(t,e).path:t},doXHR:function(e,t,i,n){var r=new XMLHttpRequest,s=!ft.isFileProtocol||ft.fileAsync;function o(t,i,n){t.status>=200&&t.status<300?i(t.responseText,t.getResponseHeader("Last-Modified")):"function"==typeof n&&n(t.status,e)}"function"==typeof r.overrideMimeType&&r.overrideMimeType("text/css"),pt.debug("XHR: Getting '"+e+"'"),r.open("GET",e,s),r.setRequestHeader("Accept",t||"text/x-less, text/css; q=0.9, */*; q=0.5"),r.send(null),ft.isFileProtocol&&!ft.fileAsync?0===r.status||r.status>=200&&r.status<300?i(r.responseText):n(r.status,e):s?r.onreadystatechange=function(){4==r.readyState&&o(r,i,n)}:o(r,i,n)},supports:function(){return!0},clearFileCache:function(){gt={}},loadFile:function(e,t,i,n){t&&!this.isPathAbsolute(e)&&(e=t+e),e=i.ext?this.tryAppendExtension(e,i.ext):e,i=i||{};var r=this.extractUrlParts(e,window.location.href).url,s=this;return new Promise((function(e,t){if(i.useFileCache&>[r])try{var n=gt[r];return e({contents:n,filename:r,webInfo:{lastModified:new Date}})}catch(e){return t({filename:r,message:"Error loading file "+r+" error was "+e.message})}s.doXHR(r,i.mime,(function(t,i){gt[r]=t,e({contents:t,filename:r,webInfo:{lastModified:i}})}),(function(e,i){t({type:"File",message:"'"+i+"' wasn't found ("+e+")",href:r})}))}))}});var bt=function(e,t){return ft=e,pt=t,yt},wt=function(e){this.less=e};wt.prototype=Object.assign(new Ce,{loadPlugin:function(e,t,i,n,r){return new Promise((function(s,o){r.loadFile(e,t,i,n).then(s).catch(o)}))}});var xt=function(t,n,r){return{add:function(s,o){r.errorReporting&&"html"!==r.errorReporting?"console"===r.errorReporting?function(e,t){var i=e.filename||t,s=[],o=(e.type||"Syntax")+"Error: "+(e.message||"There is an error in your .less file")+" in "+i,a=function(e,t,i){void 0!==e.extract[t]&&s.push("{line} {content}".replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,i).replace(/\{content\}/,e.extract[t]))};e.line&&(a(e,0,""),a(e,1,"line"),a(e,2,""),o+=" on line "+e.line+", column "+(e.column+1)+":\n"+s.join("\n")),e.stack&&(e.extract||r.logLevel>=4)&&(o+="\nStack Trace\n"+e.stack),n.logger.error(o)}(s,o):"function"==typeof r.errorReporting&&r.errorReporting("add",s,o):function(n,s){var o,a,l="less-error-message:"+e(s||""),u=t.document.createElement("div"),c=[],h=n.filename||s,f=h.match(/([^\/]+(\?.*)?)$/)[1];u.id=l,u.className="less-error-message",a="

    "+(n.type||"Syntax")+"Error: "+(n.message||"There is an error in your .less file")+'

    in '+f+" ";var p=function(e,t,i){void 0!==e.extract[t]&&c.push('

  • {content}
  • '.replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,i).replace(/\{content\}/,e.extract[t]))};n.line&&(p(n,0,""),p(n,1,"line"),p(n,2,""),a+="on line "+n.line+", column "+(n.column+1)+":

      "+c.join("")+"
    "),n.stack&&(n.extract||r.logLevel>=4)&&(a+="
    Stack Trace
    "+n.stack.split("\n").slice(1).join("
    ")),u.innerHTML=a,i(t.document,[".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #dd6666;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.line {","color: #ff0000;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),u.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),"development"===r.env&&(o=setInterval((function(){var e=t.document,i=e.body;i&&(e.getElementById(l)?i.replaceChild(u,e.getElementById(l)):i.insertBefore(u,i.firstChild),clearInterval(o))}),10))}(s,o)},remove:function(i){r.errorReporting&&"html"!==r.errorReporting?"console"===r.errorReporting||"function"==typeof r.errorReporting&&r.errorReporting("remove",i):function(i){var n=t.document.getElementById("less-error-message:"+e(i));n&&n.parentNode.removeChild(n)}(i)}}},St={javascriptEnabled:!1,depends:!1,compress:!1,lint:!1,paths:[],color:!0,strictImports:!1,insecure:!1,rootpath:"",rewriteUrls:!1,math:1,strictUnits:!1,globalVars:null,modifyVars:null,urlArgs:""};if(window.less)for(var It in window.less)window.less.hasOwnProperty(It)&&(St[It]=window.less[It]);!function(e,i){t(i,n(e)),void 0===i.isFileProtocol&&(i.isFileProtocol=/^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(e.location.protocol)),i.async=i.async||!1,i.fileAsync=i.fileAsync||!1,i.poll=i.poll||(i.isFileProtocol?1e3:1500),i.env=i.env||("127.0.0.1"==e.location.hostname||"0.0.0.0"==e.location.hostname||"localhost"==e.location.hostname||e.location.port&&e.location.port.length>0||i.isFileProtocol?"development":"production");var r=/!dumpLineNumbers:(comments|mediaquery|all)/.exec(e.location.hash);r&&(i.dumpLineNumbers=r[1]),void 0===i.useFileCache&&(i.useFileCache=!0),void 0===i.onReady&&(i.onReady=!0),i.relativeUrls&&(i.rewriteUrls="all")}(window,St),St.plugins=St.plugins||[],window.LESS_PLUGINS&&(St.plugins=St.plugins.concat(window.LESS_PLUGINS));var Ct,kt,_t,At=function(e,n){var r=e.document,s=mt();s.options=n;var o=s.environment,a=bt(n,s.logger),l=new a;o.addFileManager(l),s.FileManager=a,s.PluginLoader=wt,function(e,t){t.logLevel=void 0!==t.logLevel?t.logLevel:"development"===t.env?3:1,t.loggers||(t.loggers=[{debug:function(e){t.logLevel>=4&&console.log(e)},info:function(e){t.logLevel>=3&&console.log(e)},warn:function(e){t.logLevel>=2&&console.warn(e)},error:function(e){t.logLevel>=1&&console.error(e)}}]);for(var i=0;i 0 && styleNode.childNodes.length > 0 &&\n oldStyleNode.firstChild.nodeValue === styleNode.firstChild.nodeValue);\n }\n\n const head = document.getElementsByTagName('head')[0];\n\n // If there is no oldStyleNode, just append; otherwise, only append if we need\n // to replace oldStyleNode with an updated stylesheet\n if (oldStyleNode === null || keepOldStyleNode === false) {\n const nextEl = sheet && sheet.nextSibling || null;\n if (nextEl) {\n nextEl.parentNode.insertBefore(styleNode, nextEl);\n } else {\n head.appendChild(styleNode);\n }\n }\n if (oldStyleNode && keepOldStyleNode === false) {\n oldStyleNode.parentNode.removeChild(oldStyleNode);\n }\n\n // For IE.\n // This needs to happen *after* the style element is added to the DOM, otherwise IE 7 and 8 may crash.\n // See http://social.msdn.microsoft.com/Forums/en-US/7e081b65-878a-4c22-8e68-c10d39c2ed32/internet-explorer-crashes-appending-style-element-to-head\n if (styleNode.styleSheet) {\n try {\n styleNode.styleSheet.cssText = styles;\n } catch (e) {\n throw new Error('Couldn\\'t reassign styleSheet.cssText.');\n }\n }\n },\n currentScript: function(window) {\n const document = window.document;\n return document.currentScript || (() => {\n const scripts = document.getElementsByTagName('script');\n return scripts[scripts.length - 1];\n })();\n }\n};\n","export default {\n error: function(msg) {\n this._fireEvent('error', msg);\n },\n warn: function(msg) {\n this._fireEvent('warn', msg);\n },\n info: function(msg) {\n this._fireEvent('info', msg);\n },\n debug: function(msg) {\n this._fireEvent('debug', msg);\n },\n addListener: function(listener) {\n this._listeners.push(listener);\n },\n removeListener: function(listener) {\n for (let i = 0; i < this._listeners.length; i++) {\n if (this._listeners[i] === listener) {\n this._listeners.splice(i, 1);\n return;\n }\n }\n },\n _fireEvent: function(type, msg) {\n for (let i = 0; i < this._listeners.length; i++) {\n const logFunction = this._listeners[i][type];\n if (logFunction) {\n logFunction(msg);\n }\n }\n },\n _listeners: []\n};\n","/**\n * @todo Document why this abstraction exists, and the relationship between\n * environment, file managers, and plugin manager\n */\n\nimport logger from '../logger';\n\nclass Environment {\n constructor(externalEnvironment, fileManagers) {\n this.fileManagers = fileManagers || [];\n externalEnvironment = externalEnvironment || {};\n\n const optionalFunctions = ['encodeBase64', 'mimeLookup', 'charsetLookup', 'getSourceMapGenerator'];\n const requiredFunctions = [];\n const functions = requiredFunctions.concat(optionalFunctions);\n\n for (let i = 0; i < functions.length; i++) {\n const propName = functions[i];\n const environmentFunc = externalEnvironment[propName];\n if (environmentFunc) {\n this[propName] = environmentFunc.bind(externalEnvironment);\n } else if (i < requiredFunctions.length) {\n this.warn(`missing required function in environment - ${propName}`);\n }\n }\n }\n\n getFileManager(filename, currentDirectory, options, environment, isSync) {\n\n if (!filename) {\n logger.warn('getFileManager called with no filename.. Please report this issue. continuing.');\n }\n if (currentDirectory == null) {\n logger.warn('getFileManager called with null directory.. Please report this issue. continuing.');\n }\n\n let fileManagers = this.fileManagers;\n if (options.pluginManager) {\n fileManagers = [].concat(fileManagers).concat(options.pluginManager.getFileManagers());\n }\n for (let i = fileManagers.length - 1; i >= 0 ; i--) {\n const fileManager = fileManagers[i];\n if (fileManager[isSync ? 'supportsSync' : 'supports'](filename, currentDirectory, options, environment)) {\n return fileManager;\n }\n }\n return null;\n }\n\n addFileManager(fileManager) {\n this.fileManagers.push(fileManager);\n }\n\n clearFileManagers() {\n this.fileManagers = [];\n }\n}\n\nexport default Environment;\n","export default {\n 'aliceblue':'#f0f8ff',\n 'antiquewhite':'#faebd7',\n 'aqua':'#00ffff',\n 'aquamarine':'#7fffd4',\n 'azure':'#f0ffff',\n 'beige':'#f5f5dc',\n 'bisque':'#ffe4c4',\n 'black':'#000000',\n 'blanchedalmond':'#ffebcd',\n 'blue':'#0000ff',\n 'blueviolet':'#8a2be2',\n 'brown':'#a52a2a',\n 'burlywood':'#deb887',\n 'cadetblue':'#5f9ea0',\n 'chartreuse':'#7fff00',\n 'chocolate':'#d2691e',\n 'coral':'#ff7f50',\n 'cornflowerblue':'#6495ed',\n 'cornsilk':'#fff8dc',\n 'crimson':'#dc143c',\n 'cyan':'#00ffff',\n 'darkblue':'#00008b',\n 'darkcyan':'#008b8b',\n 'darkgoldenrod':'#b8860b',\n 'darkgray':'#a9a9a9',\n 'darkgrey':'#a9a9a9',\n 'darkgreen':'#006400',\n 'darkkhaki':'#bdb76b',\n 'darkmagenta':'#8b008b',\n 'darkolivegreen':'#556b2f',\n 'darkorange':'#ff8c00',\n 'darkorchid':'#9932cc',\n 'darkred':'#8b0000',\n 'darksalmon':'#e9967a',\n 'darkseagreen':'#8fbc8f',\n 'darkslateblue':'#483d8b',\n 'darkslategray':'#2f4f4f',\n 'darkslategrey':'#2f4f4f',\n 'darkturquoise':'#00ced1',\n 'darkviolet':'#9400d3',\n 'deeppink':'#ff1493',\n 'deepskyblue':'#00bfff',\n 'dimgray':'#696969',\n 'dimgrey':'#696969',\n 'dodgerblue':'#1e90ff',\n 'firebrick':'#b22222',\n 'floralwhite':'#fffaf0',\n 'forestgreen':'#228b22',\n 'fuchsia':'#ff00ff',\n 'gainsboro':'#dcdcdc',\n 'ghostwhite':'#f8f8ff',\n 'gold':'#ffd700',\n 'goldenrod':'#daa520',\n 'gray':'#808080',\n 'grey':'#808080',\n 'green':'#008000',\n 'greenyellow':'#adff2f',\n 'honeydew':'#f0fff0',\n 'hotpink':'#ff69b4',\n 'indianred':'#cd5c5c',\n 'indigo':'#4b0082',\n 'ivory':'#fffff0',\n 'khaki':'#f0e68c',\n 'lavender':'#e6e6fa',\n 'lavenderblush':'#fff0f5',\n 'lawngreen':'#7cfc00',\n 'lemonchiffon':'#fffacd',\n 'lightblue':'#add8e6',\n 'lightcoral':'#f08080',\n 'lightcyan':'#e0ffff',\n 'lightgoldenrodyellow':'#fafad2',\n 'lightgray':'#d3d3d3',\n 'lightgrey':'#d3d3d3',\n 'lightgreen':'#90ee90',\n 'lightpink':'#ffb6c1',\n 'lightsalmon':'#ffa07a',\n 'lightseagreen':'#20b2aa',\n 'lightskyblue':'#87cefa',\n 'lightslategray':'#778899',\n 'lightslategrey':'#778899',\n 'lightsteelblue':'#b0c4de',\n 'lightyellow':'#ffffe0',\n 'lime':'#00ff00',\n 'limegreen':'#32cd32',\n 'linen':'#faf0e6',\n 'magenta':'#ff00ff',\n 'maroon':'#800000',\n 'mediumaquamarine':'#66cdaa',\n 'mediumblue':'#0000cd',\n 'mediumorchid':'#ba55d3',\n 'mediumpurple':'#9370d8',\n 'mediumseagreen':'#3cb371',\n 'mediumslateblue':'#7b68ee',\n 'mediumspringgreen':'#00fa9a',\n 'mediumturquoise':'#48d1cc',\n 'mediumvioletred':'#c71585',\n 'midnightblue':'#191970',\n 'mintcream':'#f5fffa',\n 'mistyrose':'#ffe4e1',\n 'moccasin':'#ffe4b5',\n 'navajowhite':'#ffdead',\n 'navy':'#000080',\n 'oldlace':'#fdf5e6',\n 'olive':'#808000',\n 'olivedrab':'#6b8e23',\n 'orange':'#ffa500',\n 'orangered':'#ff4500',\n 'orchid':'#da70d6',\n 'palegoldenrod':'#eee8aa',\n 'palegreen':'#98fb98',\n 'paleturquoise':'#afeeee',\n 'palevioletred':'#d87093',\n 'papayawhip':'#ffefd5',\n 'peachpuff':'#ffdab9',\n 'peru':'#cd853f',\n 'pink':'#ffc0cb',\n 'plum':'#dda0dd',\n 'powderblue':'#b0e0e6',\n 'purple':'#800080',\n 'rebeccapurple':'#663399',\n 'red':'#ff0000',\n 'rosybrown':'#bc8f8f',\n 'royalblue':'#4169e1',\n 'saddlebrown':'#8b4513',\n 'salmon':'#fa8072',\n 'sandybrown':'#f4a460',\n 'seagreen':'#2e8b57',\n 'seashell':'#fff5ee',\n 'sienna':'#a0522d',\n 'silver':'#c0c0c0',\n 'skyblue':'#87ceeb',\n 'slateblue':'#6a5acd',\n 'slategray':'#708090',\n 'slategrey':'#708090',\n 'snow':'#fffafa',\n 'springgreen':'#00ff7f',\n 'steelblue':'#4682b4',\n 'tan':'#d2b48c',\n 'teal':'#008080',\n 'thistle':'#d8bfd8',\n 'tomato':'#ff6347',\n 'turquoise':'#40e0d0',\n 'violet':'#ee82ee',\n 'wheat':'#f5deb3',\n 'white':'#ffffff',\n 'whitesmoke':'#f5f5f5',\n 'yellow':'#ffff00',\n 'yellowgreen':'#9acd32'\n};","export default {\n length: {\n 'm': 1,\n 'cm': 0.01,\n 'mm': 0.001,\n 'in': 0.0254,\n 'px': 0.0254 / 96,\n 'pt': 0.0254 / 72,\n 'pc': 0.0254 / 72 * 12\n },\n duration: {\n 's': 1,\n 'ms': 0.001\n },\n angle: {\n 'rad': 1 / (2 * Math.PI),\n 'deg': 1 / 360,\n 'grad': 1 / 400,\n 'turn': 1\n }\n};","import colors from './colors';\nimport unitConversions from './unit-conversions';\n\nexport default { colors, unitConversions };\n","class Node {\n constructor() {\n this.parent = null;\n this.visibilityBlocks = undefined;\n this.nodeVisible = undefined;\n this.rootNode = null;\n this.parsed = null;\n\n const self = this;\n Object.defineProperty(this, 'currentFileInfo', {\n get: function() { return self.fileInfo(); }\n });\n Object.defineProperty(this, 'index', {\n get: function() { return self.getIndex(); }\n });\n\n }\n\n setParent(nodes, parent) {\n function set(node) {\n if (node && node instanceof Node) {\n node.parent = parent;\n }\n }\n if (Array.isArray(nodes)) {\n nodes.forEach(set);\n }\n else {\n set(nodes);\n }\n }\n\n getIndex() {\n return this._index || (this.parent && this.parent.getIndex()) || 0;\n }\n\n fileInfo() {\n return this._fileInfo || (this.parent && this.parent.fileInfo()) || {};\n }\n\n isRulesetLike() { return false; }\n\n toCSS(context) {\n const strs = [];\n this.genCSS(context, {\n add: function(chunk, fileInfo, index) {\n strs.push(chunk);\n },\n isEmpty: function () {\n return strs.length === 0;\n }\n });\n return strs.join('');\n }\n\n genCSS(context, output) {\n output.add(this.value);\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n eval() { return this; }\n\n _operate(context, op, a, b) {\n switch (op) {\n case '+': return a + b;\n case '-': return a - b;\n case '*': return a * b;\n case '/': return a / b;\n }\n }\n\n fround(context, value) {\n const precision = context && context.numPrecision;\n // add \"epsilon\" to ensure numbers like 1.000000005 (represented as 1.000000004999...) are properly rounded:\n return (precision) ? Number((value + 2e-16).toFixed(precision)) : value;\n }\n\n static compare(a, b) {\n /* returns:\n -1: a < b\n 0: a = b\n 1: a > b\n and *any* other value for a != b (e.g. undefined, NaN, -2 etc.) */\n\n if ((a.compare) &&\n // for \"symmetric results\" force toCSS-based comparison\n // of Quoted or Anonymous if either value is one of those\n !(b.type === 'Quoted' || b.type === 'Anonymous')) {\n return a.compare(b);\n } else if (b.compare) {\n return -b.compare(a);\n } else if (a.type !== b.type) {\n return undefined;\n }\n\n a = a.value;\n b = b.value;\n if (!Array.isArray(a)) {\n return a === b ? 0 : undefined;\n }\n if (a.length !== b.length) {\n return undefined;\n }\n for (let i = 0; i < a.length; i++) {\n if (Node.compare(a[i], b[i]) !== 0) {\n return undefined;\n }\n }\n return 0;\n }\n\n static numericCompare(a, b) {\n return a < b ? -1\n : a === b ? 0\n : a > b ? 1 : undefined;\n }\n\n // Returns true if this node represents root of ast imported by reference\n blocksVisibility() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n return this.visibilityBlocks !== 0;\n }\n\n addVisibilityBlock() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks + 1;\n }\n\n removeVisibilityBlock() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks - 1;\n }\n\n // Turns on node visibility - if called node will be shown in output regardless\n // of whether it comes from import by reference or not\n ensureVisibility() {\n this.nodeVisible = true;\n }\n\n // Turns off node visibility - if called node will NOT be shown in output regardless\n // of whether it comes from import by reference or not\n ensureInvisibility() {\n this.nodeVisible = false;\n }\n\n // return values:\n // false - the node must not be visible\n // true - the node must be visible\n // undefined or null - the node has the same visibility as its parent\n isVisible() {\n return this.nodeVisible;\n }\n\n visibilityInfo() {\n return {\n visibilityBlocks: this.visibilityBlocks,\n nodeVisible: this.nodeVisible\n };\n }\n\n copyVisibilityInfo(info) {\n if (!info) {\n return;\n }\n this.visibilityBlocks = info.visibilityBlocks;\n this.nodeVisible = info.nodeVisible;\n }\n}\n\nexport default Node;\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import Node from './node';\nimport colors from '../data/colors';\n\n//\n// RGB Colors - #ff0014, #eee\n//\nclass Color extends Node {\n constructor(rgb, a, originalForm) {\n super();\n\n const self = this;\n //\n // The end goal here, is to parse the arguments\n // into an integer triplet, such as `128, 255, 0`\n //\n // This facilitates operations and conversions.\n //\n if (Array.isArray(rgb)) {\n this.rgb = rgb;\n } else if (rgb.length >= 6) {\n this.rgb = [];\n rgb.match(/.{2}/g).map(function (c, i) {\n if (i < 3) {\n self.rgb.push(parseInt(c, 16));\n } else {\n self.alpha = (parseInt(c, 16)) / 255;\n }\n });\n } else {\n this.rgb = [];\n rgb.split('').map(function (c, i) {\n if (i < 3) {\n self.rgb.push(parseInt(c + c, 16));\n } else {\n self.alpha = (parseInt(c + c, 16)) / 255;\n }\n });\n }\n this.alpha = this.alpha || (typeof a === 'number' ? a : 1);\n if (typeof originalForm !== 'undefined') {\n this.value = originalForm;\n }\n }\n\n luma() {\n let r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255;\n\n r = (r <= 0.03928) ? r / 12.92 : Math.pow(((r + 0.055) / 1.055), 2.4);\n g = (g <= 0.03928) ? g / 12.92 : Math.pow(((g + 0.055) / 1.055), 2.4);\n b = (b <= 0.03928) ? b / 12.92 : Math.pow(((b + 0.055) / 1.055), 2.4);\n\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n }\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n }\n\n toCSS(context, doNotCompress) {\n const compress = context && context.compress && !doNotCompress;\n let color;\n let alpha;\n let colorFunction;\n let args = [];\n\n // `value` is set if this color was originally\n // converted from a named color string so we need\n // to respect this and try to output named color too.\n alpha = this.fround(context, this.alpha);\n\n if (this.value) {\n if (this.value.indexOf('rgb') === 0) {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n } else if (this.value.indexOf('hsl') === 0) {\n if (alpha < 1) {\n colorFunction = 'hsla';\n } else {\n colorFunction = 'hsl';\n }\n } else {\n return this.value;\n }\n } else {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n }\n\n switch (colorFunction) {\n case 'rgba':\n args = this.rgb.map(function (c) {\n return clamp(Math.round(c), 255);\n }).concat(clamp(alpha, 1));\n break;\n case 'hsla':\n args.push(clamp(alpha, 1));\n case 'hsl':\n color = this.toHSL();\n args = [\n this.fround(context, color.h),\n `${this.fround(context, color.s * 100)}%`,\n `${this.fround(context, color.l * 100)}%`\n ].concat(args);\n }\n\n if (colorFunction) {\n // Values are capped between `0` and `255`, rounded and zero-padded.\n return `${colorFunction}(${args.join(`,${compress ? '' : ' '}`)})`;\n }\n\n color = this.toRGB();\n\n if (compress) {\n const splitcolor = color.split('');\n\n // Convert color to short format\n if (splitcolor[1] === splitcolor[2] && splitcolor[3] === splitcolor[4] && splitcolor[5] === splitcolor[6]) {\n color = `#${splitcolor[1]}${splitcolor[3]}${splitcolor[5]}`;\n }\n }\n\n return color;\n }\n\n //\n // Operations have to be done per-channel, if not,\n // channels will spill onto each other. Once we have\n // our result, in the form of an integer triplet,\n // we create a new Color node to hold the result.\n //\n operate(context, op, other) {\n const rgb = new Array(3);\n const alpha = this.alpha * (1 - other.alpha) + other.alpha;\n for (let c = 0; c < 3; c++) {\n rgb[c] = this._operate(context, op, this.rgb[c], other.rgb[c]);\n }\n return new Color(rgb, alpha);\n }\n\n toRGB() {\n return toHex(this.rgb);\n }\n\n toHSL() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h;\n let s;\n const l = (max + min) / 2;\n const d = max - min;\n\n if (max === min) {\n h = s = 0;\n } else {\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, l, a };\n }\n\n // Adapted from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript\n toHSV() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h;\n let s;\n const v = max;\n\n const d = max - min;\n if (max === 0) {\n s = 0;\n } else {\n s = d / max;\n }\n\n if (max === min) {\n h = 0;\n } else {\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, v, a };\n }\n\n toARGB() {\n return toHex([this.alpha * 255].concat(this.rgb));\n }\n\n compare(x) {\n return (x.rgb &&\n x.rgb[0] === this.rgb[0] &&\n x.rgb[1] === this.rgb[1] &&\n x.rgb[2] === this.rgb[2] &&\n x.alpha === this.alpha) ? 0 : undefined;\n }\n\n static fromKeyword(keyword) {\n let c;\n const key = keyword.toLowerCase();\n if (colors.hasOwnProperty(key)) {\n c = new Color(colors[key].slice(1));\n }\n else if (key === 'transparent') {\n c = new Color([0, 0, 0], 0);\n }\n\n if (c) {\n c.value = keyword;\n return c;\n }\n }\n}\n\nColor.prototype.type = 'Color';\n\nfunction clamp(v, max) {\n return Math.min(Math.max(v, 0), max);\n}\n\nfunction toHex(v) {\n return `#${v.map(function (c) {\n c = clamp(Math.round(c), 255);\n return (c < 16 ? '0' : '') + c.toString(16);\n}).join('')}`;\n}\n\nexport default Color;\n","import Node from './node';\n\nclass Paren extends Node {\n constructor(node) {\n super();\n\n this.value = node;\n }\n\n genCSS(context, output) {\n output.add('(');\n this.value.genCSS(context, output);\n output.add(')');\n }\n\n eval(context) {\n return new Paren(this.value.eval(context));\n }\n}\n\nParen.prototype.type = 'Paren';\nexport default Paren;\n","import Node from './node';\nconst _noSpaceCombinators = {\n '': true,\n ' ': true,\n '|': true\n};\n\nclass Combinator extends Node {\n constructor(value) {\n super();\n\n if (value === ' ') {\n this.value = ' ';\n this.emptyOrWhitespace = true;\n } else {\n this.value = value ? value.trim() : '';\n this.emptyOrWhitespace = this.value === '';\n }\n }\n\n genCSS(context, output) {\n const spaceOrEmpty = (context.compress || _noSpaceCombinators[this.value]) ? '' : ' ';\n output.add(spaceOrEmpty + this.value + spaceOrEmpty);\n }\n}\n\nCombinator.prototype.type = 'Combinator';\n\nexport default Combinator;\n","import Node from './node';\nimport Paren from './paren';\nimport Combinator from './combinator';\n\nclass Element extends Node {\n constructor(combinator, value, isVariable, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.combinator = combinator instanceof Combinator ?\n combinator : new Combinator(combinator);\n\n if (typeof value === 'string') {\n this.value = value.trim();\n } else if (value) {\n this.value = value;\n } else {\n this.value = '';\n }\n this.isVariable = isVariable;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.combinator, this);\n }\n\n accept(visitor) {\n const value = this.value;\n this.combinator = visitor.visit(this.combinator);\n if (typeof value === 'object') {\n this.value = visitor.visit(value);\n }\n }\n\n eval(context) {\n return new Element(this.combinator,\n this.value.eval ? this.value.eval(context) : this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n }\n\n clone() {\n return new Element(this.combinator,\n this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n }\n\n genCSS(context, output) {\n output.add(this.toCSS(context), this.fileInfo(), this.getIndex());\n }\n\n toCSS(context) {\n context = context || {};\n let value = this.value;\n const firstSelector = context.firstSelector;\n if (value instanceof Paren) {\n // selector in parens should not be affected by outer selector\n // flags (breaks only interpolated selectors - see #1973)\n context.firstSelector = true;\n }\n value = value.toCSS ? value.toCSS(context) : value;\n context.firstSelector = firstSelector;\n if (value === '' && this.combinator.value.charAt(0) === '&') {\n return '';\n } else {\n return this.combinator.toCSS(context) + value;\n }\n }\n}\n\nElement.prototype.type = 'Element';\nexport default Element;\n","\nexport const Math = {\n ALWAYS: 0,\n PARENS_DIVISION: 1,\n PARENS: 2,\n // removed - STRICT_LEGACY: 3\n};\n\nexport const RewriteUrls = {\n OFF: 0,\n LOCAL: 1,\n ALL: 2\n};","/* jshint proto: true */\nimport * as Constants from './constants';\n\nexport function getLocation(index, inputStream) {\n let n = index + 1;\n let line = null;\n let column = -1;\n\n while (--n >= 0 && inputStream.charAt(n) !== '\\n') {\n column++;\n }\n\n if (typeof index === 'number') {\n line = (inputStream.slice(0, index).match(/\\n/g) || '').length;\n }\n\n return {\n line,\n column\n };\n}\n\nexport function copyArray(arr) {\n let i;\n const length = arr.length;\n const copy = new Array(length);\n\n for (i = 0; i < length; i++) {\n copy[i] = arr[i];\n }\n return copy;\n}\n\nexport function clone(obj) {\n const cloned = {};\n for (const prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n cloned[prop] = obj[prop];\n }\n }\n return cloned;\n}\n\nexport function defaults(obj1, obj2) {\n let newObj = obj2 || {};\n if (!obj2._defaults) {\n newObj = {};\n const defaults = {...obj1};\n newObj._defaults = defaults;\n const cloned = obj2 ? {...obj2} : {};\n Object.assign(newObj, defaults, cloned);\n }\n return newObj;\n}\n\nexport function copyOptions(obj1, obj2) {\n if (obj2 && obj2._defaults) {\n return obj2;\n }\n const opts = defaults(obj1, obj2);\n if (opts.strictMath) {\n opts.math = Constants.Math.PARENS;\n }\n // Back compat with changed relativeUrls option\n if (opts.relativeUrls) {\n opts.rewriteUrls = Constants.RewriteUrls.ALL;\n }\n if (typeof opts.math === 'string') {\n switch (opts.math.toLowerCase()) {\n case 'always':\n opts.math = Constants.Math.ALWAYS;\n break;\n case 'parens-division':\n opts.math = Constants.Math.PARENS_DIVISION;\n break;\n case 'strict':\n case 'parens':\n opts.math = Constants.Math.PARENS;\n break;\n default:\n opts.math = Constants.Math.PARENS;\n }\n }\n if (typeof opts.rewriteUrls === 'string') {\n switch (opts.rewriteUrls.toLowerCase()) {\n case 'off':\n opts.rewriteUrls = Constants.RewriteUrls.OFF;\n break;\n case 'local':\n opts.rewriteUrls = Constants.RewriteUrls.LOCAL;\n break;\n case 'all':\n opts.rewriteUrls = Constants.RewriteUrls.ALL;\n break;\n }\n }\n return opts;\n}\n\nexport function merge(obj1, obj2) {\n for (const prop in obj2) {\n if (obj2.hasOwnProperty(prop)) {\n obj1[prop] = obj2[prop];\n }\n }\n return obj1;\n}\n\nexport function flattenArray(arr, result = []) {\n for (let i = 0, length = arr.length; i < length; i++) {\n const value = arr[i];\n if (Array.isArray(value)) {\n flattenArray(value, result);\n } else {\n if (value !== undefined) {\n result.push(value);\n }\n }\n }\n return result;\n}","import * as utils from './utils';\n\nconst anonymousFunc = /(|Function):(\\d+):(\\d+)/;\n\n/**\n * This is a centralized class of any error that could be thrown internally (mostly by the parser).\n * Besides standard .message it keeps some additional data like a path to the file where the error\n * occurred along with line and column numbers.\n *\n * @class\n * @extends Error\n * @type {module.LessError}\n *\n * @prop {string} type\n * @prop {string} filename\n * @prop {number} index\n * @prop {number} line\n * @prop {number} column\n * @prop {number} callLine\n * @prop {number} callExtract\n * @prop {string[]} extract\n *\n * @param {Object} e - An error object to wrap around or just a descriptive object\n * @param {Object} fileContentMap - An object with file contents in 'contents' property (like importManager) @todo - move to fileManager?\n * @param {string} [currentFilename]\n */\nconst LessError = function(e, fileContentMap, currentFilename) {\n Error.call(this);\n\n const filename = e.filename || currentFilename;\n\n this.message = e.message;\n this.stack = e.stack;\n\n if (fileContentMap && filename) {\n const input = fileContentMap.contents[filename];\n const loc = utils.getLocation(e.index, input);\n var line = loc.line;\n const col = loc.column;\n const callLine = e.call && utils.getLocation(e.call, input).line;\n const lines = input ? input.split('\\n') : '';\n\n this.type = e.type || 'Syntax';\n this.filename = filename;\n this.index = e.index;\n this.line = typeof line === 'number' ? line + 1 : null;\n this.column = col;\n\n if (!this.line && this.stack) {\n const found = this.stack.match(anonymousFunc);\n\n /**\n * We have to figure out how this environment stringifies anonymous functions\n * so we can correctly map plugin errors.\n * \n * Note, in Node 8, the output of anonymous funcs varied based on parameters\n * being present or not, so we inject dummy params.\n */\n const func = new Function('a', 'throw new Error()');\n let lineAdjust = 0;\n try {\n func();\n } catch (e) {\n const match = e.stack.match(anonymousFunc);\n var line = parseInt(match[2]);\n lineAdjust = 1 - line;\n }\n\n if (found) {\n if (found[2]) {\n this.line = parseInt(found[2]) + lineAdjust;\n }\n if (found[3]) {\n this.column = parseInt(found[3]);\n }\n }\n }\n\n this.callLine = callLine + 1;\n this.callExtract = lines[callLine];\n\n this.extract = [\n lines[this.line - 2],\n lines[this.line - 1],\n lines[this.line]\n ];\n }\n\n};\n\nif (typeof Object.create === 'undefined') {\n const F = function () {};\n F.prototype = Error.prototype;\n LessError.prototype = new F();\n} else {\n LessError.prototype = Object.create(Error.prototype);\n}\n\nLessError.prototype.constructor = LessError;\n\n/**\n * An overridden version of the default Object.prototype.toString\n * which uses additional information to create a helpful message.\n *\n * @param {Object} options\n * @returns {string}\n */\nLessError.prototype.toString = function(options) {\n options = options || {};\n\n let message = '';\n const extract = this.extract || [];\n let error = [];\n let stylize = function (str) { return str; };\n if (options.stylize) {\n const type = typeof options.stylize;\n if (type !== 'function') {\n throw Error(`options.stylize should be a function, got a ${type}!`);\n }\n stylize = options.stylize;\n }\n\n if (this.line !== null) {\n if (typeof extract[0] === 'string') {\n error.push(stylize(`${this.line - 1} ${extract[0]}`, 'grey'));\n }\n\n if (typeof extract[1] === 'string') {\n let errorTxt = `${this.line} `;\n if (extract[1]) {\n errorTxt += extract[1].slice(0, this.column) +\n stylize(stylize(stylize(extract[1].substr(this.column, 1), 'bold') +\n extract[1].slice(this.column + 1), 'red'), 'inverse');\n }\n error.push(errorTxt);\n }\n\n if (typeof extract[2] === 'string') {\n error.push(stylize(`${this.line + 1} ${extract[2]}`, 'grey'));\n }\n error = `${error.join('\\n') + stylize('', 'reset')}\\n`;\n }\n\n message += stylize(`${this.type}Error: ${this.message}`, 'red');\n if (this.filename) {\n message += stylize(' in ', 'red') + this.filename;\n }\n if (this.line) {\n message += stylize(` on line ${this.line}, column ${this.column + 1}:`, 'grey');\n }\n\n message += `\\n${error}`;\n\n if (this.callLine) {\n message += `${stylize('from ', 'red') + (this.filename || '')}/n`;\n message += `${stylize(this.callLine, 'grey')} ${this.callExtract}/n`;\n }\n\n return message;\n};\n\nexport default LessError;","import Node from './node';\nimport Element from './element';\nimport LessError from '../less-error';\n\nclass Selector extends Node {\n constructor(elements, extendList, condition, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.extendList = extendList;\n this.condition = condition;\n this.evaldCondition = !condition;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.elements = this.getElements(elements);\n this.mixinElements_ = undefined;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.elements, this);\n }\n\n accept(visitor) {\n if (this.elements) {\n this.elements = visitor.visitArray(this.elements);\n }\n if (this.extendList) {\n this.extendList = visitor.visitArray(this.extendList);\n }\n if (this.condition) {\n this.condition = visitor.visit(this.condition);\n }\n }\n\n createDerived(elements, extendList, evaldCondition) {\n elements = this.getElements(elements);\n const newSelector = new Selector(elements, extendList || this.extendList,\n null, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n newSelector.evaldCondition = (evaldCondition != null) ? evaldCondition : this.evaldCondition;\n newSelector.mediaEmpty = this.mediaEmpty;\n return newSelector;\n }\n\n getElements(els) {\n if (!els) {\n return [new Element('', '&', false, this._index, this._fileInfo)];\n }\n if (typeof els === 'string') {\n this.parse.parseNode(\n els, \n ['selector'],\n this._index, \n this._fileInfo, \n function(err, result) {\n if (err) {\n throw new LessError({\n index: err.index,\n message: err.message\n }, this.parse.imports, this._fileInfo.filename);\n }\n els = result[0].elements;\n });\n }\n return els;\n }\n\n createEmptySelectors() {\n const el = new Element('', '&', false, this._index, this._fileInfo), sels = [new Selector([el], null, null, this._index, this._fileInfo)];\n sels[0].mediaEmpty = true;\n return sels;\n }\n\n match(other) {\n const elements = this.elements;\n const len = elements.length;\n let olen;\n let i;\n\n other = other.mixinElements();\n olen = other.length;\n if (olen === 0 || len < olen) {\n return 0;\n } else {\n for (i = 0; i < olen; i++) {\n if (elements[i].value !== other[i]) {\n return 0;\n }\n }\n }\n\n return olen; // return number of matched elements\n }\n\n mixinElements() {\n if (this.mixinElements_) {\n return this.mixinElements_;\n }\n\n let elements = this.elements.map( function(v) {\n return v.combinator.value + (v.value.value || v.value);\n }).join('').match(/[,&#\\*\\.\\w-]([\\w-]|(\\\\.))*/g);\n\n if (elements) {\n if (elements[0] === '&') {\n elements.shift();\n }\n } else {\n elements = [];\n }\n\n return (this.mixinElements_ = elements);\n }\n\n isJustParentSelector() {\n return !this.mediaEmpty &&\n this.elements.length === 1 &&\n this.elements[0].value === '&' &&\n (this.elements[0].combinator.value === ' ' || this.elements[0].combinator.value === '');\n }\n\n eval(context) {\n const evaldCondition = this.condition && this.condition.eval(context);\n let elements = this.elements;\n let extendList = this.extendList;\n\n elements = elements && elements.map(function (e) { return e.eval(context); });\n extendList = extendList && extendList.map(function(extend) { return extend.eval(context); });\n\n return this.createDerived(elements, extendList, evaldCondition);\n }\n\n genCSS(context, output) {\n let i, element;\n if ((!context || !context.firstSelector) && this.elements[0].combinator.value === '') {\n output.add(' ', this.fileInfo(), this.getIndex());\n }\n for (i = 0; i < this.elements.length; i++) {\n element = this.elements[i];\n element.genCSS(context, output);\n }\n }\n\n getIsOutput() {\n return this.evaldCondition;\n }\n}\n\nSelector.prototype.type = 'Selector';\nexport default Selector;\n","import Node from './node';\n\nclass Value extends Node {\n constructor(value) {\n super();\n\n if (!value) {\n throw new Error('Value requires an array argument');\n }\n if (!Array.isArray(value)) {\n this.value = [ value ];\n }\n else {\n this.value = value;\n }\n }\n\n accept(visitor) {\n if (this.value) {\n this.value = visitor.visitArray(this.value);\n }\n }\n\n eval(context) {\n if (this.value.length === 1) {\n return this.value[0].eval(context);\n } else {\n return new Value(this.value.map(function (v) {\n return v.eval(context);\n }));\n }\n }\n\n genCSS(context, output) {\n let i;\n for (i = 0; i < this.value.length; i++) {\n this.value[i].genCSS(context, output);\n if (i + 1 < this.value.length) {\n output.add((context && context.compress) ? ',' : ', ');\n }\n }\n }\n}\n\nValue.prototype.type = 'Value';\nexport default Value;\n","import Node from './node';\n\nclass Keyword extends Node {\n constructor(value) {\n super();\n\n this.value = value;\n }\n\n genCSS(context, output) {\n if (this.value === '%') { throw { type: 'Syntax', message: 'Invalid % without number' }; }\n output.add(this.value);\n }\n}\n\nKeyword.prototype.type = 'Keyword';\n\nKeyword.True = new Keyword('true');\nKeyword.False = new Keyword('false');\n\nexport default Keyword;\n","import Node from './node';\n\nclass Anonymous extends Node {\n constructor(value, index, currentFileInfo, mapLines, rulesetLike, visibilityInfo) {\n super();\n\n this.value = value;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.mapLines = mapLines;\n this.rulesetLike = (typeof rulesetLike === 'undefined') ? false : rulesetLike;\n this.allowRoot = true;\n this.copyVisibilityInfo(visibilityInfo);\n }\n\n eval() {\n return new Anonymous(this.value, this._index, this._fileInfo, this.mapLines, this.rulesetLike, this.visibilityInfo());\n }\n\n compare(other) {\n return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n }\n\n isRulesetLike() {\n return this.rulesetLike;\n }\n\n genCSS(context, output) {\n this.nodeVisible = Boolean(this.value);\n if (this.nodeVisible) {\n output.add(this.value, this._fileInfo, this._index, this.mapLines);\n }\n }\n}\n\nAnonymous.prototype.type = 'Anonymous';\nexport default Anonymous;\n","import Node from './node';\nimport Value from './value';\nimport Keyword from './keyword';\nimport Anonymous from './anonymous';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\nclass Declaration extends Node {\n constructor(name, value, important, merge, index, currentFileInfo, inline, variable) {\n super();\n\n this.name = name;\n this.value = (value instanceof Node) ? value : new Value([value ? new Anonymous(value) : null]);\n this.important = important ? ` ${important.trim()}` : '';\n this.merge = merge;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.inline = inline || false;\n this.variable = (variable !== undefined) ? variable\n : (name.charAt && (name.charAt(0) === '@'));\n this.allowRoot = true;\n this.setParent(this.value, this);\n }\n\n genCSS(context, output) {\n output.add(this.name + (context.compress ? ':' : ': '), this.fileInfo(), this.getIndex());\n try {\n this.value.genCSS(context, output);\n }\n catch (e) {\n e.index = this._index;\n e.filename = this._fileInfo.filename;\n throw e;\n }\n output.add(this.important + ((this.inline || (context.lastRule && context.compress)) ? '' : ';'), this._fileInfo, this._index);\n }\n\n eval(context) {\n let mathBypass = false, prevMath, name = this.name, evaldValue, variable = this.variable;\n if (typeof name !== 'string') {\n // expand 'primitive' name directly to get\n // things faster (~10% for benchmark.less):\n name = (name.length === 1) && (name[0] instanceof Keyword) ?\n name[0].value : evalName(context, name);\n variable = false; // never treat expanded interpolation as new variable name\n }\n\n // @todo remove when parens-division is default\n if (name === 'font' && context.math === MATH.ALWAYS) {\n mathBypass = true;\n prevMath = context.math;\n context.math = MATH.PARENS_DIVISION;\n }\n try {\n context.importantScope.push({});\n evaldValue = this.value.eval(context);\n\n if (!this.variable && evaldValue.type === 'DetachedRuleset') {\n throw { message: 'Rulesets cannot be evaluated on a property.',\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n let important = this.important;\n const importantResult = context.importantScope.pop();\n if (!important && importantResult.important) {\n important = importantResult.important;\n }\n\n return new Declaration(name,\n evaldValue,\n important,\n this.merge,\n this.getIndex(), this.fileInfo(), this.inline,\n variable);\n }\n catch (e) {\n if (typeof e.index !== 'number') {\n e.index = this.getIndex();\n e.filename = this.fileInfo().filename;\n }\n throw e;\n }\n finally {\n if (mathBypass) {\n context.math = prevMath;\n }\n }\n }\n\n makeImportant() {\n return new Declaration(this.name,\n this.value,\n '!important',\n this.merge,\n this.getIndex(), this.fileInfo(), this.inline);\n }\n}\n\nfunction evalName(context, name) {\n let value = '';\n let i;\n const n = name.length;\n const output = {add: function (s) {value += s;}};\n for (i = 0; i < n; i++) {\n name[i].eval(context).genCSS(context, output);\n }\n return value;\n}\n\nDeclaration.prototype.type = 'Declaration';\nexport default Declaration;","class debugInfo {\n constructor(context, ctx, lineSeparator) {\n let result = '';\n if (context.dumpLineNumbers && !context.compress) {\n switch (context.dumpLineNumbers) {\n case 'comments':\n result = debugInfo.asComment(ctx);\n break;\n case 'mediaquery':\n result = debugInfo.asMediaQuery(ctx);\n break;\n case 'all':\n result = debugInfo.asComment(ctx) + (lineSeparator || '') + debugInfo.asMediaQuery(ctx);\n break;\n }\n }\n return result;\n }\n\n static asComment(ctx) {\n return `/* line ${ctx.debugInfo.lineNumber}, ${ctx.debugInfo.fileName} */\\n`;\n }\n\n static asMediaQuery(ctx) {\n let filenameWithProtocol = ctx.debugInfo.fileName;\n if (!/^[a-z]+:\\/\\//i.test(filenameWithProtocol)) {\n filenameWithProtocol = `file://${filenameWithProtocol}`;\n }\n return `@media -sass-debug-info{filename{font-family:${filenameWithProtocol.replace(/([.:\\/\\\\])/g, function (a) {\n if (a == '\\\\') {\n a = '\\/';\n }\n return `\\\\${a}`;\n})}}line{font-family:\\\\00003${ctx.debugInfo.lineNumber}}}\\n`;\n }\n}\n\nexport default debugInfo;\n","import Node from './node';\nimport getDebugInfo from './debug-info';\n\nclass Comment extends Node {\n constructor(value, isLineComment, index, currentFileInfo) {\n super();\n\n this.value = value;\n this.isLineComment = isLineComment;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.allowRoot = true;\n }\n\n genCSS(context, output) {\n if (this.debugInfo) {\n output.add(getDebugInfo(context, this), this.fileInfo(), this.getIndex());\n }\n output.add(this.value);\n }\n\n isSilent(context) {\n const isCompressed = context.compress && this.value[2] !== '!';\n return this.isLineComment || isCompressed;\n }\n}\n\nComment.prototype.type = 'Comment';\nexport default Comment;\n","const contexts = {};\nexport default contexts;\nimport * as Constants from './constants';\n\nconst copyFromOriginal = function copyFromOriginal(original, destination, propertiesToCopy) {\n if (!original) { return; }\n\n for (let i = 0; i < propertiesToCopy.length; i++) {\n if (original.hasOwnProperty(propertiesToCopy[i])) {\n destination[propertiesToCopy[i]] = original[propertiesToCopy[i]];\n }\n }\n};\n\n/*\n parse is used whilst parsing\n */\nconst parseCopyProperties = [\n // options\n 'paths', // option - unmodified - paths to search for imports on\n 'rewriteUrls', // option - whether to adjust URL's to be relative\n 'rootpath', // option - rootpath to append to URL's\n 'strictImports', // option -\n 'insecure', // option - whether to allow imports from insecure ssl hosts\n 'dumpLineNumbers', // option - whether to dump line numbers\n 'compress', // option - whether to compress\n 'syncImport', // option - whether to import synchronously\n 'chunkInput', // option - whether to chunk input. more performant but causes parse issues.\n 'mime', // browser only - mime type for sheet import\n 'useFileCache', // browser only - whether to use the per file session cache\n // context\n 'processImports', // option & context - whether to process imports. if false then imports will not be imported.\n // Used by the import manager to stop multiple import visitors being created.\n 'pluginManager' // Used as the plugin manager for the session\n];\n\ncontexts.Parse = function(options) {\n copyFromOriginal(options, this, parseCopyProperties);\n\n if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n};\n\nconst evalCopyProperties = [\n 'paths', // additional include paths\n 'compress', // whether to compress\n 'math', // whether math has to be within parenthesis\n 'strictUnits', // whether units need to evaluate correctly\n 'sourceMap', // whether to output a source map\n 'importMultiple', // whether we are currently importing multiple copies\n 'urlArgs', // whether to add args into url tokens\n 'javascriptEnabled', // option - whether Inline JavaScript is enabled. if undefined, defaults to false\n 'pluginManager', // Used as the plugin manager for the session\n 'importantScope', // used to bubble up !important statements\n 'rewriteUrls' // option - whether to adjust URL's to be relative\n];\n\ncontexts.Eval = function(options, frames) {\n copyFromOriginal(options, this, evalCopyProperties);\n\n if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n\n this.frames = frames || [];\n this.importantScope = this.importantScope || [];\n};\n\ncontexts.Eval.prototype.enterCalc = function () {\n if (!this.calcStack) {\n this.calcStack = [];\n }\n this.calcStack.push(true);\n this.inCalc = true;\n};\n\ncontexts.Eval.prototype.exitCalc = function () {\n this.calcStack.pop();\n if (!this.calcStack.length) {\n this.inCalc = false;\n }\n};\n\ncontexts.Eval.prototype.inParenthesis = function () {\n if (!this.parensStack) {\n this.parensStack = [];\n }\n this.parensStack.push(true);\n};\n\ncontexts.Eval.prototype.outOfParenthesis = function () {\n this.parensStack.pop();\n};\n\ncontexts.Eval.prototype.inCalc = false;\ncontexts.Eval.prototype.mathOn = true;\ncontexts.Eval.prototype.isMathOn = function (op) {\n if (!this.mathOn) {\n return false;\n }\n if (op === '/' && this.math !== Constants.Math.ALWAYS && (!this.parensStack || !this.parensStack.length)) {\n return false;\n }\n if (this.math > Constants.Math.PARENS_DIVISION) {\n return this.parensStack && this.parensStack.length;\n }\n return true;\n};\n\ncontexts.Eval.prototype.pathRequiresRewrite = function (path) {\n const isRelative = this.rewriteUrls === Constants.RewriteUrls.LOCAL ? isPathLocalRelative : isPathRelative;\n\n return isRelative(path);\n};\n\ncontexts.Eval.prototype.rewritePath = function (path, rootpath) {\n let newPath;\n\n rootpath = rootpath || '';\n newPath = this.normalizePath(rootpath + path);\n\n // If a path was explicit relative and the rootpath was not an absolute path\n // we must ensure that the new path is also explicit relative.\n if (isPathLocalRelative(path) &&\n isPathRelative(rootpath) &&\n isPathLocalRelative(newPath) === false) {\n newPath = `./${newPath}`;\n }\n\n return newPath;\n};\n\ncontexts.Eval.prototype.normalizePath = function (path) {\n const segments = path.split('/').reverse();\n let segment;\n\n path = [];\n while (segments.length !== 0) {\n segment = segments.pop();\n switch ( segment ) {\n case '.':\n break;\n case '..':\n if ((path.length === 0) || (path[path.length - 1] === '..')) {\n path.push( segment );\n } else {\n path.pop();\n }\n break;\n default:\n path.push(segment);\n break;\n }\n }\n\n return path.join('/');\n};\n\nfunction isPathRelative(path) {\n return !/^(?:[a-z-]+:|\\/|#)/i.test(path);\n}\n\nfunction isPathLocalRelative(path) {\n return path.charAt(0) === '.';\n}\n\n// todo - do the same for the toCSS ?\n","function makeRegistry( base ) {\n return {\n _data: {},\n add: function(name, func) {\n // precautionary case conversion, as later querying of\n // the registry by function-caller uses lower case as well.\n name = name.toLowerCase();\n\n if (this._data.hasOwnProperty(name)) {\n // TODO warn\n }\n this._data[name] = func;\n },\n addMultiple: function(functions) {\n Object.keys(functions).forEach(\n name => {\n this.add(name, functions[name]);\n });\n },\n get: function(name) {\n return this._data[name] || ( base && base.get( name ));\n },\n getLocalFunctions: function() {\n return this._data;\n },\n inherit: function() {\n return makeRegistry( this );\n },\n create: function(base) {\n return makeRegistry(base);\n }\n };\n}\n\nexport default makeRegistry( null );","import Keyword from '../tree/keyword';\n\nconst defaultFunc = {\n eval: function () {\n const v = this.value_;\n const e = this.error_;\n if (e) {\n throw e;\n }\n if (v != null) {\n return v ? Keyword.True : Keyword.False;\n }\n },\n value: function (v) {\n this.value_ = v;\n },\n error: function (e) {\n this.error_ = e;\n },\n reset: function () {\n this.value_ = this.error_ = null;\n }\n};\n\nexport default defaultFunc;\n","import Node from './node';\nimport Declaration from './declaration';\nimport Keyword from './keyword';\nimport Comment from './comment';\nimport Paren from './paren';\nimport Selector from './selector';\nimport Element from './element';\nimport Anonymous from './anonymous';\nimport contexts from '../contexts';\nimport globalFunctionRegistry from '../functions/function-registry';\nimport defaultFunc from '../functions/default';\nimport getDebugInfo from './debug-info';\nimport * as utils from '../utils';\n\nclass Ruleset extends Node {\n constructor(selectors, rules, strictImports, visibilityInfo) {\n super();\n\n this.selectors = selectors;\n this.rules = rules;\n this._lookups = {};\n this._variables = null;\n this._properties = null;\n this.strictImports = strictImports;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n\n this.setParent(this.selectors, this);\n this.setParent(this.rules, this);\n\n }\n\n isRulesetLike() { return true; }\n\n accept(visitor) {\n if (this.paths) {\n this.paths = visitor.visitArray(this.paths, true);\n } else if (this.selectors) {\n this.selectors = visitor.visitArray(this.selectors);\n }\n if (this.rules && this.rules.length) {\n this.rules = visitor.visitArray(this.rules);\n }\n }\n\n eval(context) {\n const that = this;\n let selectors;\n let selCnt;\n let selector;\n let i;\n let hasVariable;\n let hasOnePassingSelector = false;\n\n if (this.selectors && (selCnt = this.selectors.length)) {\n selectors = new Array(selCnt);\n defaultFunc.error({\n type: 'Syntax',\n message: 'it is currently only allowed in parametric mixin guards,'\n });\n\n for (i = 0; i < selCnt; i++) {\n selector = this.selectors[i].eval(context);\n for (var j = 0; j < selector.elements.length; j++) {\n if (selector.elements[j].isVariable) {\n hasVariable = true;\n break;\n }\n }\n selectors[i] = selector;\n if (selector.evaldCondition) {\n hasOnePassingSelector = true;\n }\n }\n\n if (hasVariable) {\n const toParseSelectors = new Array(selCnt);\n for (i = 0; i < selCnt; i++) {\n selector = selectors[i];\n toParseSelectors[i] = selector.toCSS(context);\n }\n this.parse.parseNode(\n toParseSelectors.join(','),\n [\"selectors\"], \n selectors[0].getIndex(), \n selectors[0].fileInfo(), \n function(err, result) {\n if (result) {\n selectors = utils.flattenArray(result);\n }\n });\n }\n\n defaultFunc.reset();\n } else {\n hasOnePassingSelector = true;\n }\n\n let rules = this.rules ? utils.copyArray(this.rules) : null;\n const ruleset = new Ruleset(selectors, rules, this.strictImports, this.visibilityInfo());\n let rule;\n let subRule;\n\n ruleset.originalRuleset = this;\n ruleset.root = this.root;\n ruleset.firstRoot = this.firstRoot;\n ruleset.allowImports = this.allowImports;\n\n if (this.debugInfo) {\n ruleset.debugInfo = this.debugInfo;\n }\n\n if (!hasOnePassingSelector) {\n rules.length = 0;\n }\n\n // inherit a function registry from the frames stack when possible;\n // otherwise from the global registry\n ruleset.functionRegistry = (function (frames) {\n let i = 0;\n const n = frames.length;\n let found;\n for ( ; i !== n ; ++i ) {\n found = frames[ i ].functionRegistry;\n if ( found ) { return found; }\n }\n return globalFunctionRegistry;\n }(context.frames)).inherit();\n\n // push the current ruleset to the frames stack\n const ctxFrames = context.frames;\n ctxFrames.unshift(ruleset);\n\n // currrent selectors\n let ctxSelectors = context.selectors;\n if (!ctxSelectors) {\n context.selectors = ctxSelectors = [];\n }\n ctxSelectors.unshift(this.selectors);\n\n // Evaluate imports\n if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) {\n ruleset.evalImports(context);\n }\n\n // Store the frames around mixin definitions,\n // so they can be evaluated like closures when the time comes.\n const rsRules = ruleset.rules;\n for (i = 0; (rule = rsRules[i]); i++) {\n if (rule.evalFirst) {\n rsRules[i] = rule.eval(context);\n }\n }\n\n const mediaBlockCount = (context.mediaBlocks && context.mediaBlocks.length) || 0;\n\n // Evaluate mixin calls.\n for (i = 0; (rule = rsRules[i]); i++) {\n if (rule.type === 'MixinCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).filter(function(r) {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope if the variable is\n // already there. consider returning false here\n // but we need a way to \"return\" variable from mixins\n return !(ruleset.variable(r.name));\n }\n return true;\n });\n rsRules.splice.apply(rsRules, [i, 1].concat(rules));\n i += rules.length - 1;\n ruleset.resetCache();\n } else if (rule.type === 'VariableCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).rules.filter(function(r) {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope at all\n return false;\n }\n return true;\n });\n rsRules.splice.apply(rsRules, [i, 1].concat(rules));\n i += rules.length - 1;\n ruleset.resetCache();\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n if (!rule.evalFirst) {\n rsRules[i] = rule = rule.eval ? rule.eval(context) : rule;\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n // for rulesets, check if it is a css guard and can be removed\n if (rule instanceof Ruleset && rule.selectors && rule.selectors.length === 1) {\n // check if it can be folded in (e.g. & where)\n if (rule.selectors[0] && rule.selectors[0].isJustParentSelector()) {\n rsRules.splice(i--, 1);\n\n for (var j = 0; (subRule = rule.rules[j]); j++) {\n if (subRule instanceof Node) {\n subRule.copyVisibilityInfo(rule.visibilityInfo());\n if (!(subRule instanceof Declaration) || !subRule.variable) {\n rsRules.splice(++i, 0, subRule);\n }\n }\n }\n }\n }\n }\n\n // Pop the stack\n ctxFrames.shift();\n ctxSelectors.shift();\n\n if (context.mediaBlocks) {\n for (i = mediaBlockCount; i < context.mediaBlocks.length; i++) {\n context.mediaBlocks[i].bubbleSelectors(selectors);\n }\n }\n\n return ruleset;\n }\n\n evalImports(context) {\n const rules = this.rules;\n let i;\n let importRules;\n if (!rules) { return; }\n\n for (i = 0; i < rules.length; i++) {\n if (rules[i].type === 'Import') {\n importRules = rules[i].eval(context);\n if (importRules && (importRules.length || importRules.length === 0)) {\n rules.splice.apply(rules, [i, 1].concat(importRules));\n i += importRules.length - 1;\n } else {\n rules.splice(i, 1, importRules);\n }\n this.resetCache();\n }\n }\n }\n\n makeImportant() {\n const result = new Ruleset(this.selectors, this.rules.map(function (r) {\n if (r.makeImportant) {\n return r.makeImportant();\n } else {\n return r;\n }\n }), this.strictImports, this.visibilityInfo());\n\n return result;\n }\n\n matchArgs(args) {\n return !args || args.length === 0;\n }\n\n // lets you call a css selector with a guard\n matchCondition(args, context) {\n const lastSelector = this.selectors[this.selectors.length - 1];\n if (!lastSelector.evaldCondition) {\n return false;\n }\n if (lastSelector.condition &&\n !lastSelector.condition.eval(\n new contexts.Eval(context,\n context.frames))) {\n return false;\n }\n return true;\n }\n\n resetCache() {\n this._rulesets = null;\n this._variables = null;\n this._properties = null;\n this._lookups = {};\n }\n\n variables() {\n if (!this._variables) {\n this._variables = !this.rules ? {} : this.rules.reduce(function (hash, r) {\n if (r instanceof Declaration && r.variable === true) {\n hash[r.name] = r;\n }\n // when evaluating variables in an import statement, imports have not been eval'd\n // so we need to go inside import statements.\n // guard against root being a string (in the case of inlined less)\n if (r.type === 'Import' && r.root && r.root.variables) {\n const vars = r.root.variables();\n for (const name in vars) {\n if (vars.hasOwnProperty(name)) {\n hash[name] = r.root.variable(name);\n }\n }\n }\n return hash;\n }, {});\n }\n return this._variables;\n }\n\n properties() {\n if (!this._properties) {\n this._properties = !this.rules ? {} : this.rules.reduce(function (hash, r) {\n if (r instanceof Declaration && r.variable !== true) {\n const name = (r.name.length === 1) && (r.name[0] instanceof Keyword) ?\n r.name[0].value : r.name;\n // Properties don't overwrite as they can merge\n if (!hash[`$${name}`]) {\n hash[`$${name}`] = [ r ];\n }\n else {\n hash[`$${name}`].push(r);\n }\n }\n return hash;\n }, {});\n }\n return this._properties;\n }\n\n variable(name) {\n const decl = this.variables()[name];\n if (decl) {\n return this.parseValue(decl);\n }\n }\n\n property(name) {\n const decl = this.properties()[name];\n if (decl) {\n return this.parseValue(decl);\n }\n }\n\n lastDeclaration() {\n for (let i = this.rules.length; i > 0; i--) {\n const decl = this.rules[i - 1];\n if (decl instanceof Declaration) {\n return this.parseValue(decl);\n }\n }\n }\n\n parseValue(toParse) {\n const self = this;\n function transformDeclaration(decl) {\n if (decl.value instanceof Anonymous && !decl.parsed) {\n if (typeof decl.value.value === 'string') {\n this.parse.parseNode(\n decl.value.value,\n ['value', 'important'], \n decl.value.getIndex(), \n decl.fileInfo(), \n function(err, result) {\n if (err) {\n decl.parsed = true;\n }\n if (result) {\n decl.value = result[0];\n decl.important = result[1] || '';\n decl.parsed = true;\n }\n });\n } else {\n decl.parsed = true;\n }\n\n return decl;\n }\n else {\n return decl;\n }\n }\n if (!Array.isArray(toParse)) {\n return transformDeclaration.call(self, toParse);\n }\n else {\n const nodes = [];\n toParse.forEach(function(n) {\n nodes.push(transformDeclaration.call(self, n));\n });\n return nodes;\n }\n }\n\n rulesets() {\n if (!this.rules) { return []; }\n\n const filtRules = [];\n const rules = this.rules;\n let i;\n let rule;\n\n for (i = 0; (rule = rules[i]); i++) {\n if (rule.isRuleset) {\n filtRules.push(rule);\n }\n }\n\n return filtRules;\n }\n\n prependRule(rule) {\n const rules = this.rules;\n if (rules) {\n rules.unshift(rule);\n } else {\n this.rules = [ rule ];\n }\n this.setParent(rule, this);\n }\n\n find(selector, self, filter) {\n self = self || this;\n const rules = [];\n let match;\n let foundMixins;\n const key = selector.toCSS();\n\n if (key in this._lookups) { return this._lookups[key]; }\n\n this.rulesets().forEach(function (rule) {\n if (rule !== self) {\n for (let j = 0; j < rule.selectors.length; j++) {\n match = selector.match(rule.selectors[j]);\n if (match) {\n if (selector.elements.length > match) {\n if (!filter || filter(rule)) {\n foundMixins = rule.find(new Selector(selector.elements.slice(match)), self, filter);\n for (let i = 0; i < foundMixins.length; ++i) {\n foundMixins[i].path.push(rule);\n }\n Array.prototype.push.apply(rules, foundMixins);\n }\n } else {\n rules.push({ rule, path: []});\n }\n break;\n }\n }\n }\n });\n this._lookups[key] = rules;\n return rules;\n }\n\n genCSS(context, output) {\n let i;\n let j;\n const charsetRuleNodes = [];\n let ruleNodes = [];\n\n let // Line number debugging\n debugInfo;\n\n let rule;\n let path;\n\n context.tabLevel = (context.tabLevel || 0);\n\n if (!this.root) {\n context.tabLevel++;\n }\n\n const tabRuleStr = context.compress ? '' : Array(context.tabLevel + 1).join(' ');\n const tabSetStr = context.compress ? '' : Array(context.tabLevel).join(' ');\n let sep;\n\n let charsetNodeIndex = 0;\n let importNodeIndex = 0;\n for (i = 0; (rule = this.rules[i]); i++) {\n if (rule instanceof Comment) {\n if (importNodeIndex === i) {\n importNodeIndex++;\n }\n ruleNodes.push(rule);\n } else if (rule.isCharset && rule.isCharset()) {\n ruleNodes.splice(charsetNodeIndex, 0, rule);\n charsetNodeIndex++;\n importNodeIndex++;\n } else if (rule.type === 'Import') {\n ruleNodes.splice(importNodeIndex, 0, rule);\n importNodeIndex++;\n } else {\n ruleNodes.push(rule);\n }\n }\n ruleNodes = charsetRuleNodes.concat(ruleNodes);\n\n // If this is the root node, we don't render\n // a selector, or {}.\n if (!this.root) {\n debugInfo = getDebugInfo(context, this, tabSetStr);\n\n if (debugInfo) {\n output.add(debugInfo);\n output.add(tabSetStr);\n }\n\n const paths = this.paths;\n const pathCnt = paths.length;\n let pathSubCnt;\n\n sep = context.compress ? ',' : (`,\\n${tabSetStr}`);\n\n for (i = 0; i < pathCnt; i++) {\n path = paths[i];\n if (!(pathSubCnt = path.length)) { continue; }\n if (i > 0) { output.add(sep); }\n\n context.firstSelector = true;\n path[0].genCSS(context, output);\n\n context.firstSelector = false;\n for (j = 1; j < pathSubCnt; j++) {\n path[j].genCSS(context, output);\n }\n }\n\n output.add((context.compress ? '{' : ' {\\n') + tabRuleStr);\n }\n\n // Compile rules and rulesets\n for (i = 0; (rule = ruleNodes[i]); i++) {\n\n if (i + 1 === ruleNodes.length) {\n context.lastRule = true;\n }\n\n const currentLastRule = context.lastRule;\n if (rule.isRulesetLike(rule)) {\n context.lastRule = false;\n }\n\n if (rule.genCSS) {\n rule.genCSS(context, output);\n } else if (rule.value) {\n output.add(rule.value.toString());\n }\n\n context.lastRule = currentLastRule;\n\n if (!context.lastRule && rule.isVisible()) {\n output.add(context.compress ? '' : (`\\n${tabRuleStr}`));\n } else {\n context.lastRule = false;\n }\n }\n\n if (!this.root) {\n output.add((context.compress ? '}' : `\\n${tabSetStr}}`));\n context.tabLevel--;\n }\n\n if (!output.isEmpty() && !context.compress && this.firstRoot) {\n output.add('\\n');\n }\n }\n\n joinSelectors(paths, context, selectors) {\n for (let s = 0; s < selectors.length; s++) {\n this.joinSelector(paths, context, selectors[s]);\n }\n }\n\n joinSelector(paths, context, selector) {\n\n function createParenthesis(elementsToPak, originalElement) {\n let replacementParen, j;\n if (elementsToPak.length === 0) {\n replacementParen = new Paren(elementsToPak[0]);\n } else {\n const insideParent = new Array(elementsToPak.length);\n for (j = 0; j < elementsToPak.length; j++) {\n insideParent[j] = new Element(\n null,\n elementsToPak[j],\n originalElement.isVariable,\n originalElement._index,\n originalElement._fileInfo\n );\n }\n replacementParen = new Paren(new Selector(insideParent));\n }\n return replacementParen;\n }\n\n function createSelector(containedElement, originalElement) {\n let element, selector;\n element = new Element(null, containedElement, originalElement.isVariable, originalElement._index, originalElement._fileInfo);\n selector = new Selector([element]);\n return selector;\n }\n\n // joins selector path from `beginningPath` with selector path in `addPath`\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns concatenated path\n function addReplacementIntoPath(beginningPath, addPath, replacedElement, originalSelector) {\n let newSelectorPath, lastSelector, newJoinedSelector;\n // our new selector path\n newSelectorPath = [];\n\n // construct the joined selector - if & is the first thing this will be empty,\n // if not newJoinedSelector will be the last set of elements in the selector\n if (beginningPath.length > 0) {\n newSelectorPath = utils.copyArray(beginningPath);\n lastSelector = newSelectorPath.pop();\n newJoinedSelector = originalSelector.createDerived(utils.copyArray(lastSelector.elements));\n }\n else {\n newJoinedSelector = originalSelector.createDerived([]);\n }\n\n if (addPath.length > 0) {\n // /deep/ is a CSS4 selector - (removed, so should deprecate)\n // that is valid without anything in front of it\n // so if the & does not have a combinator that is \"\" or \" \" then\n // and there is a combinator on the parent, then grab that.\n // this also allows + a { & .b { .a & { ... though not sure why you would want to do that\n let combinator = replacedElement.combinator;\n\n const parentEl = addPath[0].elements[0];\n if (combinator.emptyOrWhitespace && !parentEl.combinator.emptyOrWhitespace) {\n combinator = parentEl.combinator;\n }\n // join the elements so far with the first part of the parent\n newJoinedSelector.elements.push(new Element(\n combinator,\n parentEl.value,\n replacedElement.isVariable,\n replacedElement._index,\n replacedElement._fileInfo\n ));\n newJoinedSelector.elements = newJoinedSelector.elements.concat(addPath[0].elements.slice(1));\n }\n\n // now add the joined selector - but only if it is not empty\n if (newJoinedSelector.elements.length !== 0) {\n newSelectorPath.push(newJoinedSelector);\n }\n\n // put together the parent selectors after the join (e.g. the rest of the parent)\n if (addPath.length > 1) {\n let restOfPath = addPath.slice(1);\n restOfPath = restOfPath.map(function (selector) {\n return selector.createDerived(selector.elements, []);\n });\n newSelectorPath = newSelectorPath.concat(restOfPath);\n }\n return newSelectorPath;\n }\n\n // joins selector path from `beginningPath` with every selector path in `addPaths` array\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns array with all concatenated paths\n function addAllReplacementsIntoPath( beginningPath, addPaths, replacedElement, originalSelector, result) {\n let j;\n for (j = 0; j < beginningPath.length; j++) {\n const newSelectorPath = addReplacementIntoPath(beginningPath[j], addPaths, replacedElement, originalSelector);\n result.push(newSelectorPath);\n }\n return result;\n }\n\n function mergeElementsOnToSelectors(elements, selectors) {\n let i, sel;\n\n if (elements.length === 0) {\n return ;\n }\n if (selectors.length === 0) {\n selectors.push([ new Selector(elements) ]);\n return;\n }\n\n for (i = 0; (sel = selectors[i]); i++) {\n // if the previous thing in sel is a parent this needs to join on to it\n if (sel.length > 0) {\n sel[sel.length - 1] = sel[sel.length - 1].createDerived(sel[sel.length - 1].elements.concat(elements));\n }\n else {\n sel.push(new Selector(elements));\n }\n }\n }\n\n // replace all parent selectors inside `inSelector` by content of `context` array\n // resulting selectors are returned inside `paths` array\n // returns true if `inSelector` contained at least one parent selector\n function replaceParentSelector(paths, context, inSelector) {\n // The paths are [[Selector]]\n // The first list is a list of comma separated selectors\n // The inner list is a list of inheritance separated selectors\n // e.g.\n // .a, .b {\n // .c {\n // }\n // }\n // == [[.a] [.c]] [[.b] [.c]]\n //\n let i, j, k, currentElements, newSelectors, selectorsMultiplied, sel, el, hadParentSelector = false, length, lastSelector;\n function findNestedSelector(element) {\n let maybeSelector;\n if (!(element.value instanceof Paren)) {\n return null;\n }\n\n maybeSelector = element.value.value;\n if (!(maybeSelector instanceof Selector)) {\n return null;\n }\n\n return maybeSelector;\n }\n\n // the elements from the current selector so far\n currentElements = [];\n // the current list of new selectors to add to the path.\n // We will build it up. We initiate it with one empty selector as we \"multiply\" the new selectors\n // by the parents\n newSelectors = [\n []\n ];\n\n for (i = 0; (el = inSelector.elements[i]); i++) {\n // non parent reference elements just get added\n if (el.value !== '&') {\n const nestedSelector = findNestedSelector(el);\n if (nestedSelector != null) {\n // merge the current list of non parent selector elements\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n const nestedPaths = [];\n let replaced;\n const replacedNewSelectors = [];\n replaced = replaceParentSelector(nestedPaths, context, nestedSelector);\n hadParentSelector = hadParentSelector || replaced;\n // the nestedPaths array should have only one member - replaceParentSelector does not multiply selectors\n for (k = 0; k < nestedPaths.length; k++) {\n const replacementSelector = createSelector(createParenthesis(nestedPaths[k], el), el);\n addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors);\n }\n newSelectors = replacedNewSelectors;\n currentElements = [];\n } else {\n currentElements.push(el);\n }\n\n } else {\n hadParentSelector = true;\n // the new list of selectors to add\n selectorsMultiplied = [];\n\n // merge the current list of non parent selector elements\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n // loop through our current selectors\n for (j = 0; j < newSelectors.length; j++) {\n sel = newSelectors[j];\n // if we don't have any parent paths, the & might be in a mixin so that it can be used\n // whether there are parents or not\n if (context.length === 0) {\n // the combinator used on el should now be applied to the next element instead so that\n // it is not lost\n if (sel.length > 0) {\n sel[0].elements.push(new Element(el.combinator, '', el.isVariable, el._index, el._fileInfo));\n }\n selectorsMultiplied.push(sel);\n }\n else {\n // and the parent selectors\n for (k = 0; k < context.length; k++) {\n // We need to put the current selectors\n // then join the last selector's elements on to the parents selectors\n const newSelectorPath = addReplacementIntoPath(sel, context[k], el, inSelector);\n // add that to our new set of selectors\n selectorsMultiplied.push(newSelectorPath);\n }\n }\n }\n\n // our new selectors has been multiplied, so reset the state\n newSelectors = selectorsMultiplied;\n currentElements = [];\n }\n }\n\n // if we have any elements left over (e.g. .a& .b == .b)\n // add them on to all the current selectors\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n for (i = 0; i < newSelectors.length; i++) {\n length = newSelectors[i].length;\n if (length > 0) {\n paths.push(newSelectors[i]);\n lastSelector = newSelectors[i][length - 1];\n newSelectors[i][length - 1] = lastSelector.createDerived(lastSelector.elements, inSelector.extendList);\n }\n }\n\n return hadParentSelector;\n }\n\n function deriveSelector(visibilityInfo, deriveFrom) {\n const newSelector = deriveFrom.createDerived(deriveFrom.elements, deriveFrom.extendList, deriveFrom.evaldCondition);\n newSelector.copyVisibilityInfo(visibilityInfo);\n return newSelector;\n }\n\n // joinSelector code follows\n let i, newPaths, hadParentSelector;\n\n newPaths = [];\n hadParentSelector = replaceParentSelector(newPaths, context, selector);\n\n if (!hadParentSelector) {\n if (context.length > 0) {\n newPaths = [];\n for (i = 0; i < context.length; i++) {\n\n const concatenated = context[i].map(deriveSelector.bind(this, selector.visibilityInfo()));\n\n concatenated.push(selector);\n newPaths.push(concatenated);\n }\n }\n else {\n newPaths = [[selector]];\n }\n }\n\n for (i = 0; i < newPaths.length; i++) {\n paths.push(newPaths[i]);\n }\n\n }\n}\n\nRuleset.prototype.type = 'Ruleset';\nRuleset.prototype.isRuleset = true;\nexport default Ruleset;\n","import Node from './node';\nimport Selector from './selector';\nimport Ruleset from './ruleset';\nimport Anonymous from './anonymous';\n\nclass AtRule extends Node {\n constructor(\n name,\n value,\n rules,\n index,\n currentFileInfo,\n debugInfo,\n isRooted,\n visibilityInfo\n ) {\n super();\n\n let i;\n\n this.name = name;\n this.value = (value instanceof Node) ? value : (value ? new Anonymous(value) : value);\n if (rules) {\n if (Array.isArray(rules)) {\n this.rules = rules;\n } else {\n this.rules = [rules];\n this.rules[0].selectors = (new Selector([], null, null, index, currentFileInfo)).createEmptySelectors();\n }\n for (i = 0; i < this.rules.length; i++) {\n this.rules[i].allowImports = true;\n }\n this.setParent(this.rules, this);\n }\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.debugInfo = debugInfo;\n this.isRooted = isRooted || false;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n }\n\n accept(visitor) {\n const value = this.value, rules = this.rules;\n if (rules) {\n this.rules = visitor.visitArray(rules);\n }\n if (value) {\n this.value = visitor.visit(value);\n }\n }\n\n isRulesetLike() {\n return this.rules || !this.isCharset();\n }\n\n isCharset() {\n return '@charset' === this.name;\n }\n\n genCSS(context, output) {\n const value = this.value, rules = this.rules;\n output.add(this.name, this.fileInfo(), this.getIndex());\n if (value) {\n output.add(' ');\n value.genCSS(context, output);\n }\n if (rules) {\n this.outputRuleset(context, output, rules);\n } else {\n output.add(';');\n }\n }\n\n eval(context) {\n let mediaPathBackup, mediaBlocksBackup, value = this.value, rules = this.rules;\n\n // media stored inside other atrule should not bubble over it\n // backpup media bubbling information\n mediaPathBackup = context.mediaPath;\n mediaBlocksBackup = context.mediaBlocks;\n // deleted media bubbling information\n context.mediaPath = [];\n context.mediaBlocks = [];\n\n if (value) {\n value = value.eval(context);\n }\n if (rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n rules = [rules[0].eval(context)];\n rules[0].root = true;\n }\n // restore media bubbling information\n context.mediaPath = mediaPathBackup;\n context.mediaBlocks = mediaBlocksBackup;\n\n return new AtRule(this.name, value, rules,\n this.getIndex(), this.fileInfo(), this.debugInfo, this.isRooted, this.visibilityInfo());\n }\n\n variable(name) {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.variable.call(this.rules[0], name);\n }\n }\n\n find() {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.find.apply(this.rules[0], arguments);\n }\n }\n\n rulesets() {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.rulesets.apply(this.rules[0]);\n }\n }\n\n outputRuleset(context, output, rules) {\n const ruleCnt = rules.length;\n let i;\n context.tabLevel = (context.tabLevel | 0) + 1;\n\n // Compressed\n if (context.compress) {\n output.add('{');\n for (i = 0; i < ruleCnt; i++) {\n rules[i].genCSS(context, output);\n }\n output.add('}');\n context.tabLevel--;\n return;\n }\n\n // Non-compressed\n const tabSetStr = `\\n${Array(context.tabLevel).join(' ')}`, tabRuleStr = `${tabSetStr} `;\n if (!ruleCnt) {\n output.add(` {${tabSetStr}}`);\n } else {\n output.add(` {${tabRuleStr}`);\n rules[0].genCSS(context, output);\n for (i = 1; i < ruleCnt; i++) {\n output.add(tabRuleStr);\n rules[i].genCSS(context, output);\n }\n output.add(`${tabSetStr}}`);\n }\n\n context.tabLevel--;\n }\n}\n\nAtRule.prototype.type = 'AtRule';\nexport default AtRule;\n","import Node from './node';\nimport contexts from '../contexts';\nimport * as utils from '../utils';\n\nclass DetachedRuleset extends Node {\n constructor(ruleset, frames) {\n super();\n\n this.ruleset = ruleset;\n this.frames = frames;\n this.setParent(this.ruleset, this);\n }\n\n accept(visitor) {\n this.ruleset = visitor.visit(this.ruleset);\n }\n\n eval(context) {\n const frames = this.frames || utils.copyArray(context.frames);\n return new DetachedRuleset(this.ruleset, frames);\n }\n\n callEval(context) {\n return this.ruleset.eval(this.frames ? new contexts.Eval(context, this.frames.concat(context.frames)) : context);\n }\n}\n\nDetachedRuleset.prototype.type = 'DetachedRuleset';\nDetachedRuleset.prototype.evalFirst = true;\nexport default DetachedRuleset;\n","import Node from './node';\nimport unitConversions from '../data/unit-conversions';\nimport * as utils from '../utils';\n\nclass Unit extends Node {\n constructor(numerator, denominator, backupUnit) {\n super();\n\n this.numerator = numerator ? utils.copyArray(numerator).sort() : [];\n this.denominator = denominator ? utils.copyArray(denominator).sort() : [];\n if (backupUnit) {\n this.backupUnit = backupUnit;\n } else if (numerator && numerator.length) {\n this.backupUnit = numerator[0];\n }\n }\n\n clone() {\n return new Unit(utils.copyArray(this.numerator), utils.copyArray(this.denominator), this.backupUnit);\n }\n\n genCSS(context, output) {\n // Dimension checks the unit is singular and throws an error if in strict math mode.\n const strictUnits = context && context.strictUnits;\n if (this.numerator.length === 1) {\n output.add(this.numerator[0]); // the ideal situation\n } else if (!strictUnits && this.backupUnit) {\n output.add(this.backupUnit);\n } else if (!strictUnits && this.denominator.length) {\n output.add(this.denominator[0]);\n }\n }\n\n toString() {\n let i, returnStr = this.numerator.join('*');\n for (i = 0; i < this.denominator.length; i++) {\n returnStr += `/${this.denominator[i]}`;\n }\n return returnStr;\n }\n\n compare(other) {\n return this.is(other.toString()) ? 0 : undefined;\n }\n\n is(unitString) {\n return this.toString().toUpperCase() === unitString.toUpperCase();\n }\n\n isLength() {\n return RegExp('^(px|em|ex|ch|rem|in|cm|mm|pc|pt|ex|vw|vh|vmin|vmax)$', 'gi').test(this.toCSS());\n }\n\n isEmpty() {\n return this.numerator.length === 0 && this.denominator.length === 0;\n }\n\n isSingular() {\n return this.numerator.length <= 1 && this.denominator.length === 0;\n }\n\n map(callback) {\n let i;\n\n for (i = 0; i < this.numerator.length; i++) {\n this.numerator[i] = callback(this.numerator[i], false);\n }\n\n for (i = 0; i < this.denominator.length; i++) {\n this.denominator[i] = callback(this.denominator[i], true);\n }\n }\n\n usedUnits() {\n let group;\n const result = {};\n let mapUnit;\n let groupName;\n\n mapUnit = function (atomicUnit) {\n /* jshint loopfunc:true */\n if (group.hasOwnProperty(atomicUnit) && !result[groupName]) {\n result[groupName] = atomicUnit;\n }\n\n return atomicUnit;\n };\n\n for (groupName in unitConversions) {\n if (unitConversions.hasOwnProperty(groupName)) {\n group = unitConversions[groupName];\n\n this.map(mapUnit);\n }\n }\n\n return result;\n }\n\n cancel() {\n const counter = {};\n let atomicUnit;\n let i;\n\n for (i = 0; i < this.numerator.length; i++) {\n atomicUnit = this.numerator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) + 1;\n }\n\n for (i = 0; i < this.denominator.length; i++) {\n atomicUnit = this.denominator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) - 1;\n }\n\n this.numerator = [];\n this.denominator = [];\n\n for (atomicUnit in counter) {\n if (counter.hasOwnProperty(atomicUnit)) {\n const count = counter[atomicUnit];\n\n if (count > 0) {\n for (i = 0; i < count; i++) {\n this.numerator.push(atomicUnit);\n }\n } else if (count < 0) {\n for (i = 0; i < -count; i++) {\n this.denominator.push(atomicUnit);\n }\n }\n }\n }\n\n this.numerator.sort();\n this.denominator.sort();\n }\n}\n\nUnit.prototype.type = 'Unit';\nexport default Unit;\n","import Node from './node';\nimport unitConversions from '../data/unit-conversions';\nimport Unit from './unit';\nimport Color from './color';\n\n//\n// A number with a unit\n//\nclass Dimension extends Node {\n constructor(value, unit) {\n super();\n\n this.value = parseFloat(value);\n if (isNaN(this.value)) {\n throw new Error('Dimension is not a number.');\n }\n this.unit = (unit && unit instanceof Unit) ? unit :\n new Unit(unit ? [unit] : undefined);\n this.setParent(this.unit, this);\n }\n\n accept(visitor) {\n this.unit = visitor.visit(this.unit);\n }\n\n eval(context) {\n return this;\n }\n\n toColor() {\n return new Color([this.value, this.value, this.value]);\n }\n\n genCSS(context, output) {\n if ((context && context.strictUnits) && !this.unit.isSingular()) {\n throw new Error(`Multiple units in dimension. Correct the units or use the unit function. Bad unit: ${this.unit.toString()}`);\n }\n\n const value = this.fround(context, this.value);\n let strValue = String(value);\n\n if (value !== 0 && value < 0.000001 && value > -0.000001) {\n // would be output 1e-6 etc.\n strValue = value.toFixed(20).replace(/0+$/, '');\n }\n\n if (context && context.compress) {\n // Zero values doesn't need a unit\n if (value === 0 && this.unit.isLength()) {\n output.add(strValue);\n return;\n }\n\n // Float values doesn't need a leading zero\n if (value > 0 && value < 1) {\n strValue = (strValue).substr(1);\n }\n }\n\n output.add(strValue);\n this.unit.genCSS(context, output);\n }\n\n // In an operation between two Dimensions,\n // we default to the first Dimension's unit,\n // so `1px + 2` will yield `3px`.\n operate(context, op, other) {\n /* jshint noempty:false */\n let value = this._operate(context, op, this.value, other.value), unit = this.unit.clone();\n\n if (op === '+' || op === '-') {\n if (unit.numerator.length === 0 && unit.denominator.length === 0) {\n unit = other.unit.clone();\n if (this.unit.backupUnit) {\n unit.backupUnit = this.unit.backupUnit;\n }\n } else if (other.unit.numerator.length === 0 && unit.denominator.length === 0) {\n // do nothing\n } else {\n other = other.convertTo(this.unit.usedUnits());\n\n if (context.strictUnits && other.unit.toString() !== unit.toString()) {\n throw new Error(`Incompatible units. Change the units or use the unit function. Bad units: '${unit.toString()}' and '${other.unit.toString()}'.`);\n }\n\n value = this._operate(context, op, this.value, other.value);\n }\n } else if (op === '*') {\n unit.numerator = unit.numerator.concat(other.unit.numerator).sort();\n unit.denominator = unit.denominator.concat(other.unit.denominator).sort();\n unit.cancel();\n } else if (op === '/') {\n unit.numerator = unit.numerator.concat(other.unit.denominator).sort();\n unit.denominator = unit.denominator.concat(other.unit.numerator).sort();\n unit.cancel();\n }\n return new Dimension(value, unit);\n }\n\n compare(other) {\n let a, b;\n\n if (!(other instanceof Dimension)) {\n return undefined;\n }\n\n if (this.unit.isEmpty() || other.unit.isEmpty()) {\n a = this;\n b = other;\n } else {\n a = this.unify();\n b = other.unify();\n if (a.unit.compare(b.unit) !== 0) {\n return undefined;\n }\n }\n\n return Node.numericCompare(a.value, b.value);\n }\n\n unify() {\n return this.convertTo({ length: 'px', duration: 's', angle: 'rad' });\n }\n\n convertTo(conversions) {\n let value = this.value;\n const unit = this.unit.clone();\n let i;\n let groupName;\n let group;\n let targetUnit;\n let derivedConversions = {};\n let applyUnit;\n\n if (typeof conversions === 'string') {\n for (i in unitConversions) {\n if (unitConversions[i].hasOwnProperty(conversions)) {\n derivedConversions = {};\n derivedConversions[i] = conversions;\n }\n }\n conversions = derivedConversions;\n }\n applyUnit = function (atomicUnit, denominator) {\n /* jshint loopfunc:true */\n if (group.hasOwnProperty(atomicUnit)) {\n if (denominator) {\n value = value / (group[atomicUnit] / group[targetUnit]);\n } else {\n value = value * (group[atomicUnit] / group[targetUnit]);\n }\n\n return targetUnit;\n }\n\n return atomicUnit;\n };\n\n for (groupName in conversions) {\n if (conversions.hasOwnProperty(groupName)) {\n targetUnit = conversions[groupName];\n group = unitConversions[groupName];\n\n unit.map(applyUnit);\n }\n }\n\n unit.cancel();\n\n return new Dimension(value, unit);\n }\n}\n\nDimension.prototype.type = 'Dimension';\nexport default Dimension;\n","import Node from './node';\nimport Color from './color';\nimport Dimension from './dimension';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\n\nclass Operation extends Node {\n constructor(op, operands, isSpaced) {\n super();\n\n this.op = op.trim();\n this.operands = operands;\n this.isSpaced = isSpaced;\n }\n\n accept(visitor) {\n this.operands = visitor.visitArray(this.operands);\n }\n\n eval(context) {\n let a = this.operands[0].eval(context), b = this.operands[1].eval(context), op;\n\n if (context.isMathOn(this.op)) {\n op = this.op === './' ? '/' : this.op;\n if (a instanceof Dimension && b instanceof Color) {\n a = a.toColor();\n }\n if (b instanceof Dimension && a instanceof Color) {\n b = b.toColor();\n }\n if (!a.operate) {\n if (a instanceof Operation && a.op === '/' && context.math === MATH.PARENS_DIVISION) {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n throw { type: 'Operation',\n message: 'Operation on an invalid type' };\n }\n\n return a.operate(context, op, b);\n } else {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n }\n\n genCSS(context, output) {\n this.operands[0].genCSS(context, output);\n if (this.isSpaced) {\n output.add(' ');\n }\n output.add(this.op);\n if (this.isSpaced) {\n output.add(' ');\n }\n this.operands[1].genCSS(context, output);\n }\n}\n\nOperation.prototype.type = 'Operation';\nexport default Operation;\n","import Node from './node';\nimport Paren from './paren';\nimport Comment from './comment';\nimport Dimension from './dimension';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\nclass Expression extends Node {\n constructor(value, noSpacing) {\n super();\n\n this.value = value;\n this.noSpacing = noSpacing;\n if (!value) {\n throw new Error('Expression requires an array parameter');\n }\n }\n\n accept(visitor) {\n this.value = visitor.visitArray(this.value);\n }\n\n eval(context) {\n let returnValue;\n const mathOn = context.isMathOn();\n const inParenthesis = this.parens;\n\n let doubleParen = false;\n if (inParenthesis) {\n context.inParenthesis();\n }\n if (this.value.length > 1) {\n returnValue = new Expression(this.value.map(function (e) {\n if (!e.eval) {\n return e;\n }\n return e.eval(context);\n }), this.noSpacing);\n } else if (this.value.length === 1) {\n if (this.value[0].parens && !this.value[0].parensInOp && !context.inCalc) {\n doubleParen = true;\n }\n returnValue = this.value[0].eval(context);\n } else {\n returnValue = this;\n }\n if (inParenthesis) {\n context.outOfParenthesis();\n }\n if (this.parens && this.parensInOp && !mathOn && !doubleParen \n && (!(returnValue instanceof Dimension))) {\n returnValue = new Paren(returnValue);\n }\n return returnValue;\n }\n\n genCSS(context, output) {\n for (let i = 0; i < this.value.length; i++) {\n this.value[i].genCSS(context, output);\n if (!this.noSpacing && i + 1 < this.value.length) {\n output.add(' ');\n }\n }\n }\n\n throwAwayComments() {\n this.value = this.value.filter(function(v) {\n return !(v instanceof Comment);\n });\n }\n}\n\nExpression.prototype.type = 'Expression';\nexport default Expression;\n","import Expression from '../tree/expression';\n\nclass functionCaller {\n constructor(name, context, index, currentFileInfo) {\n this.name = name.toLowerCase();\n this.index = index;\n this.context = context;\n this.currentFileInfo = currentFileInfo;\n\n this.func = context.frames[0].functionRegistry.get(this.name);\n }\n\n isValid() {\n return Boolean(this.func);\n }\n\n call(args) {\n if (!(Array.isArray(args))) {\n args = [args];\n }\n const evalArgs = this.func.evalArgs;\n if (evalArgs !== false) {\n args = args.map(a => a.eval(this.context));\n }\n const commentFilter = item => !(item.type === 'Comment');\n\n // This code is terrible and should be replaced as per this issue...\n // https://github.com/less/less.js/issues/2477\n args = args\n .filter(commentFilter)\n .map(item => {\n if (item.type === 'Expression') {\n const subNodes = item.value.filter(commentFilter);\n if (subNodes.length === 1) {\n return subNodes[0];\n } else {\n return new Expression(subNodes);\n }\n }\n return item;\n });\n\n if (evalArgs === false) {\n return this.func(this.context, ...args);\n }\n\n return this.func(...args);\n }\n}\n\nexport default functionCaller;\n","import Node from './node';\nimport Anonymous from './anonymous';\nimport FunctionCaller from '../functions/function-caller';\nimport logger from '../logger';\n\n//\n// A function call node.\n//\nclass Call extends Node {\n constructor(name, args, index, currentFileInfo) {\n super();\n\n this.name = name;\n this.args = args;\n this.calc = name === 'calc';\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n accept(visitor) {\n if (this.args) {\n this.args = visitor.visitArray(this.args);\n }\n }\n\n //\n // When evaluating a function call,\n // we either find the function in the functionRegistry,\n // in which case we call it, passing the evaluated arguments,\n // if this returns null or we cannot find the function, we\n // simply print it out as it appeared originally [2].\n //\n // The reason why we evaluate the arguments, is in the case where\n // we try to pass a variable to a function, like: `saturate(@color)`.\n // The function should receive the value, not the variable.\n //\n eval(context) {\n /**\n * Turn off math for calc(), and switch back on for evaluating nested functions\n */\n const currentMathContext = context.mathOn;\n context.mathOn = !this.calc;\n if (this.calc || context.inCalc) {\n context.enterCalc();\n }\n\n const exitCalc = () => {\n if (this.calc || context.inCalc) {\n context.exitCalc();\n }\n context.mathOn = currentMathContext;\n };\n\n let result;\n const funcCaller = new FunctionCaller(this.name, context, this.getIndex(), this.fileInfo());\n\n if (funcCaller.isValid()) {\n try {\n result = funcCaller.call(this.args);\n exitCalc();\n } catch (e) {\n if (e.hasOwnProperty('line') && e.hasOwnProperty('column')) {\n throw e;\n }\n throw { \n type: e.type || 'Runtime',\n message: `Error evaluating function \\`${this.name}\\`${e.message ? `: ${e.message}` : ''}`,\n index: this.getIndex(), \n filename: this.fileInfo().filename,\n line: e.lineNumber,\n column: e.columnNumber\n };\n }\n }\n\n if (result !== null && result !== undefined) {\n // Results that that are not nodes are cast as Anonymous nodes\n // Falsy values or booleans are returned as empty nodes\n if (!(result instanceof Node)) {\n if (!result || result === true) {\n result = new Anonymous(null); \n }\n else {\n result = new Anonymous(result.toString()); \n }\n \n }\n result._index = this._index;\n result._fileInfo = this._fileInfo;\n return result;\n }\n\n const args = this.args.map(a => a.eval(context));\n exitCalc();\n\n return new Call(this.name, args, this.getIndex(), this.fileInfo());\n }\n\n genCSS(context, output) {\n output.add(`${this.name}(`, this.fileInfo(), this.getIndex());\n\n for (let i = 0; i < this.args.length; i++) {\n this.args[i].genCSS(context, output);\n if (i + 1 < this.args.length) {\n output.add(', ');\n }\n }\n\n output.add(')');\n }\n}\n\nCall.prototype.type = 'Call';\nexport default Call;\n","import Node from './node';\nimport Call from './call';\n\nclass Variable extends Node {\n constructor(name, index, currentFileInfo) {\n super();\n\n this.name = name;\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n eval(context) {\n let variable, name = this.name;\n\n if (name.indexOf('@@') === 0) {\n name = `@${new Variable(name.slice(1), this.getIndex(), this.fileInfo()).eval(context).value}`;\n }\n\n if (this.evaluating) {\n throw { type: 'Name',\n message: `Recursive variable definition for ${name}`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n variable = this.find(context.frames, function (frame) {\n const v = frame.variable(name);\n if (v) {\n if (v.important) {\n const importantScope = context.importantScope[context.importantScope.length - 1];\n importantScope.important = v.important;\n }\n // If in calc, wrap vars in a function call to cascade evaluate args first\n if (context.inCalc) {\n return (new Call('_SELF', [v.value])).eval(context);\n }\n else {\n return v.value.eval(context);\n }\n }\n });\n if (variable) {\n this.evaluating = false;\n return variable;\n } else {\n throw { type: 'Name',\n message: `variable ${name} is undefined`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n }\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n}\n\nVariable.prototype.type = 'Variable';\nexport default Variable;\n","import Node from './node';\nimport Declaration from './declaration';\n\nclass Property extends Node {\n constructor(name, index, currentFileInfo) {\n super();\n\n this.name = name;\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n eval(context) {\n let property;\n const name = this.name;\n // TODO: shorten this reference\n const mergeRules = context.pluginManager.less.visitors.ToCSSVisitor.prototype._mergeRules;\n\n if (this.evaluating) {\n throw { type: 'Name',\n message: `Recursive property reference for ${name}`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n property = this.find(context.frames, function (frame) {\n let v;\n const vArr = frame.property(name);\n if (vArr) {\n for (let i = 0; i < vArr.length; i++) {\n v = vArr[i];\n\n vArr[i] = new Declaration(v.name,\n v.value,\n v.important,\n v.merge,\n v.index,\n v.currentFileInfo,\n v.inline,\n v.variable\n );\n }\n mergeRules(vArr);\n\n v = vArr[vArr.length - 1];\n if (v.important) {\n const importantScope = context.importantScope[context.importantScope.length - 1];\n importantScope.important = v.important;\n }\n v = v.value.eval(context);\n return v;\n }\n });\n if (property) {\n this.evaluating = false;\n return property;\n } else {\n throw { type: 'Name',\n message: `Property '${name}' is undefined`,\n filename: this.currentFileInfo.filename,\n index: this.index };\n }\n }\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n}\n\nProperty.prototype.type = 'Property';\nexport default Property;\n","import Node from './node';\n\nclass Attribute extends Node {\n constructor(key, op, value) {\n super();\n\n this.key = key;\n this.op = op;\n this.value = value;\n }\n\n eval(context) {\n return new Attribute(this.key.eval ? this.key.eval(context) : this.key,\n this.op, (this.value && this.value.eval) ? this.value.eval(context) : this.value);\n }\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n }\n\n toCSS(context) {\n let value = this.key.toCSS ? this.key.toCSS(context) : this.key;\n\n if (this.op) {\n value += this.op;\n value += (this.value.toCSS ? this.value.toCSS(context) : this.value);\n }\n\n return `[${value}]`;\n }\n}\n\nAttribute.prototype.type = 'Attribute';\nexport default Attribute;\n","import Node from './node';\nimport Variable from './variable';\nimport Property from './property';\n\n\nclass Quoted extends Node {\n constructor(str, content, escaped, index, currentFileInfo) {\n super();\n\n this.escaped = (escaped == null) ? true : escaped;\n this.value = content || '';\n this.quote = str.charAt(0);\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.variableRegex = /@\\{([\\w-]+)\\}/g;\n this.propRegex = /\\$\\{([\\w-]+)\\}/g;\n this.allowRoot = escaped;\n }\n\n genCSS(context, output) {\n if (!this.escaped) {\n output.add(this.quote, this.fileInfo(), this.getIndex());\n }\n output.add(this.value);\n if (!this.escaped) {\n output.add(this.quote);\n }\n }\n\n containsVariables() {\n return this.value.match(this.variableRegex);\n }\n\n eval(context) {\n const that = this;\n let value = this.value;\n const variableReplacement = function (_, name) {\n const v = new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v.value : v.toCSS();\n };\n const propertyReplacement = function (_, name) {\n const v = new Property(`$${name}`, that.getIndex(), that.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v.value : v.toCSS();\n };\n function iterativeReplace(value, regexp, replacementFnc) {\n let evaluatedValue = value;\n do {\n value = evaluatedValue.toString();\n evaluatedValue = value.replace(regexp, replacementFnc);\n } while (value !== evaluatedValue);\n return evaluatedValue;\n }\n value = iterativeReplace(value, this.variableRegex, variableReplacement);\n value = iterativeReplace(value, this.propRegex, propertyReplacement);\n return new Quoted(this.quote + value + this.quote, value, this.escaped, this.getIndex(), this.fileInfo());\n }\n\n compare(other) {\n // when comparing quoted strings allow the quote to differ\n if (other.type === 'Quoted' && !this.escaped && !other.escaped) {\n return Node.numericCompare(this.value, other.value);\n } else {\n return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n }\n }\n}\n\nQuoted.prototype.type = 'Quoted';\nexport default Quoted;\n","import Node from './node';\n\nclass URL extends Node {\n constructor(val, index, currentFileInfo, isEvald) {\n super();\n\n this.value = val;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.isEvald = isEvald;\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n genCSS(context, output) {\n output.add('url(');\n this.value.genCSS(context, output);\n output.add(')');\n }\n\n eval(context) {\n const val = this.value.eval(context);\n let rootpath;\n\n if (!this.isEvald) {\n // Add the rootpath if the URL requires a rewrite\n rootpath = this.fileInfo() && this.fileInfo().rootpath;\n if (typeof rootpath === 'string' &&\n typeof val.value === 'string' &&\n context.pathRequiresRewrite(val.value)) {\n if (!val.quote) {\n rootpath = escapePath(rootpath);\n }\n val.value = context.rewritePath(val.value, rootpath);\n } else {\n val.value = context.normalizePath(val.value);\n }\n\n // Add url args if enabled\n if (context.urlArgs) {\n if (!val.value.match(/^\\s*data:/)) {\n const delimiter = val.value.indexOf('?') === -1 ? '?' : '&';\n const urlArgs = delimiter + context.urlArgs;\n if (val.value.indexOf('#') !== -1) {\n val.value = val.value.replace('#', `${urlArgs}#`);\n } else {\n val.value += urlArgs;\n }\n }\n }\n }\n\n return new URL(val, this.getIndex(), this.fileInfo(), true);\n }\n}\n\nURL.prototype.type = 'Url';\n\nfunction escapePath(path) {\n return path.replace(/[\\(\\)'\"\\s]/g, function(match) { return `\\\\${match}`; });\n}\n\nexport default URL;\n","import Ruleset from './ruleset';\nimport Value from './value';\nimport Selector from './selector';\nimport Anonymous from './anonymous';\nimport Expression from './expression';\nimport AtRule from './atrule';\nimport * as utils from '../utils';\n\nclass Media extends AtRule {\n constructor(value, features, index, currentFileInfo, visibilityInfo) {\n super();\n\n this._index = index;\n this._fileInfo = currentFileInfo;\n\n const selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors();\n\n this.features = new Value(features);\n this.rules = [new Ruleset(selectors, value)];\n this.rules[0].allowImports = true;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n this.setParent(selectors, this);\n this.setParent(this.features, this);\n this.setParent(this.rules, this);\n }\n\n isRulesetLike() {\n return true;\n }\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this.features);\n }\n if (this.rules) {\n this.rules = visitor.visitArray(this.rules);\n }\n }\n\n genCSS(context, output) {\n output.add('@media ', this._fileInfo, this._index);\n this.features.genCSS(context, output);\n this.outputRuleset(context, output, this.rules);\n }\n\n eval(context) {\n if (!context.mediaBlocks) {\n context.mediaBlocks = [];\n context.mediaPath = [];\n }\n\n const media = new Media(null, [], this._index, this._fileInfo, this.visibilityInfo());\n if (this.debugInfo) {\n this.rules[0].debugInfo = this.debugInfo;\n media.debugInfo = this.debugInfo;\n }\n \n media.features = this.features.eval(context);\n\n context.mediaPath.push(media);\n context.mediaBlocks.push(media);\n\n this.rules[0].functionRegistry = context.frames[0].functionRegistry.inherit();\n context.frames.unshift(this.rules[0]);\n media.rules = [this.rules[0].eval(context)];\n context.frames.shift();\n\n context.mediaPath.pop();\n\n return context.mediaPath.length === 0 ? media.evalTop(context) :\n media.evalNested(context);\n }\n\n evalTop(context) {\n let result = this;\n\n // Render all dependent Media blocks.\n if (context.mediaBlocks.length > 1) {\n const selectors = (new Selector([], null, null, this.getIndex(), this.fileInfo())).createEmptySelectors();\n result = new Ruleset(selectors, context.mediaBlocks);\n result.multiMedia = true;\n result.copyVisibilityInfo(this.visibilityInfo());\n this.setParent(result, this);\n }\n\n delete context.mediaBlocks;\n delete context.mediaPath;\n\n return result;\n }\n\n evalNested(context) {\n let i;\n let value;\n const path = context.mediaPath.concat([this]);\n\n // Extract the media-query conditions separated with `,` (OR).\n for (i = 0; i < path.length; i++) {\n value = path[i].features instanceof Value ?\n path[i].features.value : path[i].features;\n path[i] = Array.isArray(value) ? value : [value];\n }\n\n // Trace all permutations to generate the resulting media-query.\n //\n // (a, b and c) with nested (d, e) ->\n // a and d\n // a and e\n // b and c and d\n // b and c and e\n this.features = new Value(this.permute(path).map(path => {\n path = path.map(fragment => fragment.toCSS ? fragment : new Anonymous(fragment));\n\n for (i = path.length - 1; i > 0; i--) {\n path.splice(i, 0, new Anonymous('and'));\n }\n\n return new Expression(path);\n }));\n this.setParent(this.features, this);\n\n // Fake a tree-node that doesn't output anything.\n return new Ruleset([], []);\n }\n\n permute(arr) {\n if (arr.length === 0) {\n return [];\n } else if (arr.length === 1) {\n return arr[0];\n } else {\n const result = [];\n const rest = this.permute(arr.slice(1));\n for (let i = 0; i < rest.length; i++) {\n for (let j = 0; j < arr[0].length; j++) {\n result.push([arr[0][j]].concat(rest[i]));\n }\n }\n return result;\n }\n }\n\n bubbleSelectors(selectors) {\n if (!selectors) {\n return;\n }\n this.rules = [new Ruleset(utils.copyArray(selectors), [this.rules[0]])];\n this.setParent(this.rules, this);\n }\n}\n\nMedia.prototype.type = 'Media';\nexport default Media;\n","import Node from './node';\nimport Media from './media';\nimport URL from './url';\nimport Quoted from './quoted';\nimport Ruleset from './ruleset';\nimport Anonymous from './anonymous';\nimport * as utils from '../utils';\nimport LessError from '../less-error';\n\n//\n// CSS @import node\n//\n// The general strategy here is that we don't want to wait\n// for the parsing to be completed, before we start importing\n// the file. That's because in the context of a browser,\n// most of the time will be spent waiting for the server to respond.\n//\n// On creation, we push the import path to our import queue, though\n// `import,push`, we also pass it a callback, which it'll call once\n// the file has been fetched, and parsed.\n//\nclass Import extends Node {\n constructor(path, features, options, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.options = options;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.path = path;\n this.features = features;\n this.allowRoot = true;\n\n if (this.options.less !== undefined || this.options.inline) {\n this.css = !this.options.less || this.options.inline;\n } else {\n const pathValue = this.getPath();\n if (pathValue && /[#\\.\\&\\?]css([\\?;].*)?$/.test(pathValue)) {\n this.css = true;\n }\n }\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.features, this);\n this.setParent(this.path, this);\n }\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this.features);\n }\n this.path = visitor.visit(this.path);\n if (!this.options.isPlugin && !this.options.inline && this.root) {\n this.root = visitor.visit(this.root);\n }\n }\n\n genCSS(context, output) {\n if (this.css && this.path._fileInfo.reference === undefined) {\n output.add('@import ', this._fileInfo, this._index);\n this.path.genCSS(context, output);\n if (this.features) {\n output.add(' ');\n this.features.genCSS(context, output);\n }\n output.add(';');\n }\n }\n\n getPath() {\n return (this.path instanceof URL) ?\n this.path.value.value : this.path.value;\n }\n\n isVariableImport() {\n let path = this.path;\n if (path instanceof URL) {\n path = path.value;\n }\n if (path instanceof Quoted) {\n return path.containsVariables();\n }\n\n return true;\n }\n\n evalForImport(context) {\n let path = this.path;\n\n if (path instanceof URL) {\n path = path.value;\n }\n\n return new Import(path.eval(context), this.features, this.options, this._index, this._fileInfo, this.visibilityInfo());\n }\n\n evalPath(context) {\n const path = this.path.eval(context);\n const fileInfo = this._fileInfo;\n\n if (!(path instanceof URL)) {\n // Add the rootpath if the URL requires a rewrite\n const pathValue = path.value;\n if (fileInfo &&\n pathValue &&\n context.pathRequiresRewrite(pathValue)) {\n path.value = context.rewritePath(pathValue, fileInfo.rootpath);\n } else {\n path.value = context.normalizePath(path.value);\n }\n }\n\n return path;\n }\n\n eval(context) {\n const result = this.doEval(context);\n if (this.options.reference || this.blocksVisibility()) {\n if (result.length || result.length === 0) {\n result.forEach(function (node) {\n node.addVisibilityBlock();\n }\n );\n } else {\n result.addVisibilityBlock();\n }\n }\n return result;\n }\n\n doEval(context) {\n let ruleset;\n let registry;\n const features = this.features && this.features.eval(context);\n\n if (this.options.isPlugin) {\n if (this.root && this.root.eval) {\n try {\n this.root.eval(context);\n }\n catch (e) {\n e.message = 'Plugin error during evaluation';\n throw new LessError(e, this.root.imports, this.root.filename);\n }\n }\n registry = context.frames[0] && context.frames[0].functionRegistry;\n if ( registry && this.root && this.root.functions ) {\n registry.addMultiple( this.root.functions );\n }\n\n return [];\n }\n\n if (this.skip) {\n if (typeof this.skip === 'function') {\n this.skip = this.skip();\n }\n if (this.skip) {\n return [];\n }\n }\n if (this.options.inline) {\n const contents = new Anonymous(this.root, 0,\n {\n filename: this.importedFilename,\n reference: this.path._fileInfo && this.path._fileInfo.reference\n }, true, true);\n\n return this.features ? new Media([contents], this.features.value) : [contents];\n } else if (this.css) {\n const newImport = new Import(this.evalPath(context), features, this.options, this._index);\n if (!newImport.css && this.error) {\n throw this.error;\n }\n return newImport;\n } else if (this.root) {\n ruleset = new Ruleset(null, utils.copyArray(this.root.rules));\n ruleset.evalImports(context);\n\n return this.features ? new Media(ruleset.rules, this.features.value) : ruleset.rules;\n } else {\n return [];\n }\n }\n}\n\nImport.prototype.type = 'Import';\nexport default Import;\n","import Node from './node';\nimport Variable from './variable';\n\nclass JsEvalNode extends Node {\n evaluateJavaScript(expression, context) {\n let result;\n const that = this;\n const evalContext = {};\n\n if (!context.javascriptEnabled) {\n throw { message: 'Inline JavaScript is not enabled. Is it set in your options?',\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n expression = expression.replace(/@\\{([\\w-]+)\\}/g, function (_, name) {\n return that.jsify(new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context));\n });\n\n try {\n expression = new Function(`return (${expression})`);\n } catch (e) {\n throw { message: `JavaScript evaluation error: ${e.message} from \\`${expression}\\`` ,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n const variables = context.frames[0].variables();\n for (const k in variables) {\n if (variables.hasOwnProperty(k)) {\n /* jshint loopfunc:true */\n evalContext[k.slice(1)] = {\n value: variables[k].value,\n toJS: function () {\n return this.value.eval(context).toCSS();\n }\n };\n }\n }\n\n try {\n result = expression.call(evalContext);\n } catch (e) {\n throw { message: `JavaScript evaluation error: '${e.name}: ${e.message.replace(/[\"]/g, '\\'')}'` ,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n return result;\n }\n\n jsify(obj) {\n if (Array.isArray(obj.value) && (obj.value.length > 1)) {\n return `[${obj.value.map(function (v) { return v.toCSS(); }).join(', ')}]`;\n } else {\n return obj.toCSS();\n }\n }\n}\n\nexport default JsEvalNode;\n","import JsEvalNode from './js-eval-node';\nimport Dimension from './dimension';\nimport Quoted from './quoted';\nimport Anonymous from './anonymous';\n\nclass JavaScript extends JsEvalNode {\n constructor(string, escaped, index, currentFileInfo) {\n super();\n\n this.escaped = escaped;\n this.expression = string;\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n eval(context) {\n const result = this.evaluateJavaScript(this.expression, context);\n const type = typeof result;\n\n if (type === 'number' && !isNaN(result)) {\n return new Dimension(result);\n } else if (type === 'string') {\n return new Quoted(`\"${result}\"`, result, this.escaped, this._index);\n } else if (Array.isArray(result)) {\n return new Anonymous(result.join(', '));\n } else {\n return new Anonymous(result);\n }\n }\n}\n\nJavaScript.prototype.type = 'JavaScript';\nexport default JavaScript;\n","import Node from './node';\n\nclass Assignment extends Node {\n constructor(key, val) {\n super();\n\n this.key = key;\n this.value = val;\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n eval(context) {\n if (this.value.eval) {\n return new Assignment(this.key, this.value.eval(context));\n }\n return this;\n }\n\n genCSS(context, output) {\n output.add(`${this.key}=`);\n if (this.value.genCSS) {\n this.value.genCSS(context, output);\n } else {\n output.add(this.value);\n }\n }\n}\n\nAssignment.prototype.type = 'Assignment';\nexport default Assignment;\n","import Node from './node';\n\nclass Condition extends Node {\n constructor(op, l, r, i, negate) {\n super();\n\n this.op = op.trim();\n this.lvalue = l;\n this.rvalue = r;\n this._index = i;\n this.negate = negate;\n }\n\n accept(visitor) {\n this.lvalue = visitor.visit(this.lvalue);\n this.rvalue = visitor.visit(this.rvalue);\n }\n\n eval(context) {\n const result = (function (op, a, b) {\n switch (op) {\n case 'and': return a && b;\n case 'or': return a || b;\n default:\n switch (Node.compare(a, b)) {\n case -1:\n return op === '<' || op === '=<' || op === '<=';\n case 0:\n return op === '=' || op === '>=' || op === '=<' || op === '<=';\n case 1:\n return op === '>' || op === '>=';\n default:\n return false;\n }\n }\n })(this.op, this.lvalue.eval(context), this.rvalue.eval(context));\n\n return this.negate ? !result : result;\n }\n}\n\nCondition.prototype.type = 'Condition';\nexport default Condition;\n","import Node from './node';\n\nclass UnicodeDescriptor extends Node {\n constructor(value) {\n super();\n\n this.value = value;\n }\n}\n\nUnicodeDescriptor.prototype.type = 'UnicodeDescriptor';\n\nexport default UnicodeDescriptor;\n","import Node from './node';\nimport Operation from './operation';\nimport Dimension from './dimension';\n\nclass Negative extends Node {\n constructor(node) {\n super();\n\n this.value = node;\n }\n\n genCSS(context, output) {\n output.add('-');\n this.value.genCSS(context, output);\n }\n\n eval(context) {\n if (context.isMathOn()) {\n return (new Operation('*', [new Dimension(-1), this.value])).eval(context);\n }\n return new Negative(this.value.eval(context));\n }\n}\n\nNegative.prototype.type = 'Negative';\nexport default Negative;\n","import Node from './node';\nimport Selector from './selector';\n\nclass Extend extends Node {\n constructor(selector, option, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.selector = selector;\n this.option = option;\n this.object_id = Extend.next_id++;\n this.parent_ids = [this.object_id];\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n\n switch (option) {\n case 'all':\n this.allowBefore = true;\n this.allowAfter = true;\n break;\n default:\n this.allowBefore = false;\n this.allowAfter = false;\n break;\n }\n this.setParent(this.selector, this);\n }\n\n accept(visitor) {\n this.selector = visitor.visit(this.selector);\n }\n\n eval(context) {\n return new Extend(this.selector.eval(context), this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n }\n\n clone(context) {\n return new Extend(this.selector, this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n }\n\n // it concatenates (joins) all selectors in selector array\n findSelfSelectors(selectors) {\n let selfElements = [], i, selectorElements;\n\n for (i = 0; i < selectors.length; i++) {\n selectorElements = selectors[i].elements;\n // duplicate the logic in genCSS function inside the selector node.\n // future TODO - move both logics into the selector joiner visitor\n if (i > 0 && selectorElements.length && selectorElements[0].combinator.value === '') {\n selectorElements[0].combinator.value = ' ';\n }\n selfElements = selfElements.concat(selectors[i].elements);\n }\n\n this.selfSelectors = [new Selector(selfElements)];\n this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo());\n }\n}\n\nExtend.next_id = 0;\n\nExtend.prototype.type = 'Extend';\nexport default Extend;\n","import Node from './node';\nimport Variable from './variable';\nimport Ruleset from './ruleset';\nimport DetachedRuleset from './detached-ruleset';\nimport LessError from '../less-error';\n\nclass VariableCall extends Node {\n constructor(variable, index, currentFileInfo) {\n super();\n\n this.variable = variable;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.allowRoot = true;\n }\n\n eval(context) {\n let rules;\n let detachedRuleset = new Variable(this.variable, this.getIndex(), this.fileInfo()).eval(context);\n const error = new LessError({message: `Could not evaluate variable call ${this.variable}`});\n\n if (!detachedRuleset.ruleset) {\n if (detachedRuleset.rules) {\n rules = detachedRuleset;\n }\n else if (Array.isArray(detachedRuleset)) {\n rules = new Ruleset('', detachedRuleset);\n }\n else if (Array.isArray(detachedRuleset.value)) {\n rules = new Ruleset('', detachedRuleset.value);\n }\n else {\n throw error;\n }\n detachedRuleset = new DetachedRuleset(rules);\n }\n\n if (detachedRuleset.ruleset) {\n return detachedRuleset.callEval(context);\n }\n throw error;\n }\n}\n\nVariableCall.prototype.type = 'VariableCall';\nexport default VariableCall;\n","import Node from './node';\nimport Variable from './variable';\nimport Ruleset from './ruleset';\nimport Selector from './selector';\n\nclass NamespaceValue extends Node {\n constructor(ruleCall, lookups, index, fileInfo) {\n super();\n\n this.value = ruleCall;\n this.lookups = lookups;\n this._index = index;\n this._fileInfo = fileInfo;\n }\n\n eval(context) {\n let i, j, name, rules = this.value.eval(context);\n \n for (i = 0; i < this.lookups.length; i++) {\n name = this.lookups[i];\n\n /**\n * Eval'd DRs return rulesets.\n * Eval'd mixins return rules, so let's make a ruleset if we need it.\n * We need to do this because of late parsing of values\n */\n if (Array.isArray(rules)) {\n rules = new Ruleset([new Selector()], rules);\n }\n\n if (name === '') {\n rules = rules.lastDeclaration();\n }\n else if (name.charAt(0) === '@') {\n if (name.charAt(1) === '@') {\n name = `@${new Variable(name.substr(1)).eval(context).value}`;\n }\n if (rules.variables) {\n rules = rules.variable(name);\n }\n \n if (!rules) {\n throw { type: 'Name',\n message: `variable ${name} not found`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n }\n else {\n if (name.substring(0, 2) === '$@') {\n name = `$${new Variable(name.substr(1)).eval(context).value}`;\n }\n else {\n name = name.charAt(0) === '$' ? name : `$${name}`;\n }\n if (rules.properties) {\n rules = rules.property(name);\n }\n \n if (!rules) {\n throw { type: 'Name',\n message: `property \"${name.substr(1)}\" not found`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n // Properties are an array of values, since a ruleset can have multiple props.\n // We pick the last one (the \"cascaded\" value)\n rules = rules[rules.length - 1];\n }\n\n if (rules.value) {\n rules = rules.eval(context).value;\n }\n if (rules.ruleset) {\n rules = rules.ruleset.eval(context);\n }\n }\n return rules;\n }\n}\n\nNamespaceValue.prototype.type = 'NamespaceValue';\nexport default NamespaceValue;\n","import Selector from './selector';\nimport Element from './element';\nimport Ruleset from './ruleset';\nimport Declaration from './declaration';\nimport DetachedRuleset from './detached-ruleset';\nimport Expression from './expression';\nimport contexts from '../contexts';\nimport * as utils from '../utils';\n\nclass Definition extends Ruleset {\n constructor(name, params, rules, condition, variadic, frames, visibilityInfo) {\n super();\n\n this.name = name || 'anonymous mixin';\n this.selectors = [new Selector([new Element(null, name, false, this._index, this._fileInfo)])];\n this.params = params;\n this.condition = condition;\n this.variadic = variadic;\n this.arity = params.length;\n this.rules = rules;\n this._lookups = {};\n const optionalParameters = [];\n this.required = params.reduce(function (count, p) {\n if (!p.name || (p.name && !p.value)) {\n return count + 1;\n }\n else {\n optionalParameters.push(p.name);\n return count;\n }\n }, 0);\n this.optionalParameters = optionalParameters;\n this.frames = frames;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n }\n\n accept(visitor) {\n if (this.params && this.params.length) {\n this.params = visitor.visitArray(this.params);\n }\n this.rules = visitor.visitArray(this.rules);\n if (this.condition) {\n this.condition = visitor.visit(this.condition);\n }\n }\n\n evalParams(context, mixinEnv, args, evaldArguments) {\n /* jshint boss:true */\n const frame = new Ruleset(null, null);\n\n let varargs;\n let arg;\n const params = utils.copyArray(this.params);\n let i;\n let j;\n let val;\n let name;\n let isNamedFound;\n let argIndex;\n let argsLength = 0;\n\n if (mixinEnv.frames && mixinEnv.frames[0] && mixinEnv.frames[0].functionRegistry) {\n frame.functionRegistry = mixinEnv.frames[0].functionRegistry.inherit();\n }\n mixinEnv = new contexts.Eval(mixinEnv, [frame].concat(mixinEnv.frames));\n\n if (args) {\n args = utils.copyArray(args);\n argsLength = args.length;\n\n for (i = 0; i < argsLength; i++) {\n arg = args[i];\n if (name = (arg && arg.name)) {\n isNamedFound = false;\n for (j = 0; j < params.length; j++) {\n if (!evaldArguments[j] && name === params[j].name) {\n evaldArguments[j] = arg.value.eval(context);\n frame.prependRule(new Declaration(name, arg.value.eval(context)));\n isNamedFound = true;\n break;\n }\n }\n if (isNamedFound) {\n args.splice(i, 1);\n i--;\n continue;\n } else {\n throw { type: 'Runtime', message: `Named argument for ${this.name} ${args[i].name} not found` };\n }\n }\n }\n }\n argIndex = 0;\n for (i = 0; i < params.length; i++) {\n if (evaldArguments[i]) { continue; }\n\n arg = args && args[argIndex];\n\n if (name = params[i].name) {\n if (params[i].variadic) {\n varargs = [];\n for (j = argIndex; j < argsLength; j++) {\n varargs.push(args[j].value.eval(context));\n }\n frame.prependRule(new Declaration(name, new Expression(varargs).eval(context)));\n } else {\n val = arg && arg.value;\n if (val) {\n // This was a mixin call, pass in a detached ruleset of it's eval'd rules\n if (Array.isArray(val)) {\n val = new DetachedRuleset(new Ruleset('', val));\n }\n else {\n val = val.eval(context);\n }\n } else if (params[i].value) {\n val = params[i].value.eval(mixinEnv);\n frame.resetCache();\n } else {\n throw { type: 'Runtime', message: `wrong number of arguments for ${this.name} (${argsLength} for ${this.arity})` };\n }\n\n frame.prependRule(new Declaration(name, val));\n evaldArguments[i] = val;\n }\n }\n\n if (params[i].variadic && args) {\n for (j = argIndex; j < argsLength; j++) {\n evaldArguments[j] = args[j].value.eval(context);\n }\n }\n argIndex++;\n }\n\n return frame;\n }\n\n makeImportant() {\n const rules = !this.rules ? this.rules : this.rules.map(function (r) {\n if (r.makeImportant) {\n return r.makeImportant(true);\n } else {\n return r;\n }\n });\n const result = new Definition(this.name, this.params, rules, this.condition, this.variadic, this.frames);\n return result;\n }\n\n eval(context) {\n return new Definition(this.name, this.params, this.rules, this.condition, this.variadic, this.frames || utils.copyArray(context.frames));\n }\n\n evalCall(context, args, important) {\n const _arguments = [];\n const mixinFrames = this.frames ? this.frames.concat(context.frames) : context.frames;\n const frame = this.evalParams(context, new contexts.Eval(context, mixinFrames), args, _arguments);\n let rules;\n let ruleset;\n\n frame.prependRule(new Declaration('@arguments', new Expression(_arguments).eval(context)));\n\n rules = utils.copyArray(this.rules);\n\n ruleset = new Ruleset(null, rules);\n ruleset.originalRuleset = this;\n ruleset = ruleset.eval(new contexts.Eval(context, [this, frame].concat(mixinFrames)));\n if (important) {\n ruleset = ruleset.makeImportant();\n }\n return ruleset;\n }\n\n matchCondition(args, context) {\n if (this.condition && !this.condition.eval(\n new contexts.Eval(context,\n [this.evalParams(context, /* the parameter variables */\n new contexts.Eval(context, this.frames ? this.frames.concat(context.frames) : context.frames), args, [])]\n .concat(this.frames || []) // the parent namespace/mixin frames\n .concat(context.frames)))) { // the current environment frames\n return false;\n }\n return true;\n }\n\n matchArgs(args, context) {\n const allArgsCnt = (args && args.length) || 0;\n let len;\n const optionalParameters = this.optionalParameters;\n const requiredArgsCnt = !args ? 0 : args.reduce(function (count, p) {\n if (optionalParameters.indexOf(p.name) < 0) {\n return count + 1;\n } else {\n return count;\n }\n }, 0);\n\n if (!this.variadic) {\n if (requiredArgsCnt < this.required) {\n return false;\n }\n if (allArgsCnt > this.params.length) {\n return false;\n }\n } else {\n if (requiredArgsCnt < (this.required - 1)) {\n return false;\n }\n }\n\n // check patterns\n len = Math.min(requiredArgsCnt, this.arity);\n\n for (let i = 0; i < len; i++) {\n if (!this.params[i].name && !this.params[i].variadic) {\n if (args[i].value.eval(context).toCSS() != this.params[i].value.eval(context).toCSS()) {\n return false;\n }\n }\n }\n return true;\n }\n}\n\nDefinition.prototype.type = 'MixinDefinition';\nDefinition.prototype.evalFirst = true;\nexport default Definition;\n","import Node from './node';\nimport Selector from './selector';\nimport MixinDefinition from './mixin-definition';\nimport defaultFunc from '../functions/default';\n\nclass MixinCall extends Node {\n constructor(elements, args, index, currentFileInfo, important) {\n super();\n\n this.selector = new Selector(elements);\n this.arguments = args || [];\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.important = important;\n this.allowRoot = true;\n this.setParent(this.selector, this);\n }\n\n accept(visitor) {\n if (this.selector) {\n this.selector = visitor.visit(this.selector);\n }\n if (this.arguments.length) {\n this.arguments = visitor.visitArray(this.arguments);\n }\n }\n\n eval(context) {\n let mixins;\n let mixin;\n let mixinPath;\n const args = [];\n let arg;\n let argValue;\n const rules = [];\n let match = false;\n let i;\n let m;\n let f;\n let isRecursive;\n let isOneFound;\n const candidates = [];\n let candidate;\n const conditionResult = [];\n let defaultResult;\n const defFalseEitherCase = -1;\n const defNone = 0;\n const defTrue = 1;\n const defFalse = 2;\n let count;\n let originalRuleset;\n let noArgumentsFilter;\n\n this.selector = this.selector.eval(context);\n\n function calcDefGroup(mixin, mixinPath) {\n let f, p, namespace;\n\n for (f = 0; f < 2; f++) {\n conditionResult[f] = true;\n defaultFunc.value(f);\n for (p = 0; p < mixinPath.length && conditionResult[f]; p++) {\n namespace = mixinPath[p];\n if (namespace.matchCondition) {\n conditionResult[f] = conditionResult[f] && namespace.matchCondition(null, context);\n }\n }\n if (mixin.matchCondition) {\n conditionResult[f] = conditionResult[f] && mixin.matchCondition(args, context);\n }\n }\n if (conditionResult[0] || conditionResult[1]) {\n if (conditionResult[0] != conditionResult[1]) {\n return conditionResult[1] ?\n defTrue : defFalse;\n }\n\n return defNone;\n }\n return defFalseEitherCase;\n }\n\n for (i = 0; i < this.arguments.length; i++) {\n arg = this.arguments[i];\n argValue = arg.value.eval(context);\n if (arg.expand && Array.isArray(argValue.value)) {\n argValue = argValue.value;\n for (m = 0; m < argValue.length; m++) {\n args.push({value: argValue[m]});\n }\n } else {\n args.push({name: arg.name, value: argValue});\n }\n }\n\n noArgumentsFilter = function(rule) {return rule.matchArgs(null, context);};\n\n for (i = 0; i < context.frames.length; i++) {\n if ((mixins = context.frames[i].find(this.selector, null, noArgumentsFilter)).length > 0) {\n isOneFound = true;\n\n // To make `default()` function independent of definition order we have two \"subpasses\" here.\n // At first we evaluate each guard *twice* (with `default() == true` and `default() == false`),\n // and build candidate list with corresponding flags. Then, when we know all possible matches,\n // we make a final decision.\n\n for (m = 0; m < mixins.length; m++) {\n mixin = mixins[m].rule;\n mixinPath = mixins[m].path;\n isRecursive = false;\n for (f = 0; f < context.frames.length; f++) {\n if ((!(mixin instanceof MixinDefinition)) && mixin === (context.frames[f].originalRuleset || context.frames[f])) {\n isRecursive = true;\n break;\n }\n }\n if (isRecursive) {\n continue;\n }\n\n if (mixin.matchArgs(args, context)) {\n candidate = {mixin, group: calcDefGroup(mixin, mixinPath)};\n\n if (candidate.group !== defFalseEitherCase) {\n candidates.push(candidate);\n }\n\n match = true;\n }\n }\n\n defaultFunc.reset();\n\n count = [0, 0, 0];\n for (m = 0; m < candidates.length; m++) {\n count[candidates[m].group]++;\n }\n\n if (count[defNone] > 0) {\n defaultResult = defFalse;\n } else {\n defaultResult = defTrue;\n if ((count[defTrue] + count[defFalse]) > 1) {\n throw { type: 'Runtime',\n message: `Ambiguous use of \\`default()\\` found when matching for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n }\n\n for (m = 0; m < candidates.length; m++) {\n candidate = candidates[m].group;\n if ((candidate === defNone) || (candidate === defaultResult)) {\n try {\n mixin = candidates[m].mixin;\n if (!(mixin instanceof MixinDefinition)) {\n originalRuleset = mixin.originalRuleset || mixin;\n mixin = new MixinDefinition('', [], mixin.rules, null, false, null, originalRuleset.visibilityInfo());\n mixin.originalRuleset = originalRuleset;\n }\n const newRules = mixin.evalCall(context, args, this.important).rules;\n this._setVisibilityToReplacement(newRules);\n Array.prototype.push.apply(rules, newRules);\n } catch (e) {\n throw { message: e.message, index: this.getIndex(), filename: this.fileInfo().filename, stack: e.stack };\n }\n }\n }\n\n if (match) {\n return rules;\n }\n }\n }\n if (isOneFound) {\n throw { type: 'Runtime',\n message: `No matching definition was found for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n } else {\n throw { type: 'Name',\n message: `${this.selector.toCSS().trim()} is undefined`,\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n }\n\n _setVisibilityToReplacement(replacement) {\n let i, rule;\n if (this.blocksVisibility()) {\n for (i = 0; i < replacement.length; i++) {\n rule = replacement[i];\n rule.addVisibilityBlock();\n }\n }\n }\n\n format(args) {\n return `${this.selector.toCSS().trim()}(${args ? args.map(function (a) {\n let argValue = '';\n if (a.name) {\n argValue += `${a.name}:`;\n }\n if (a.value.toCSS) {\n argValue += a.value.toCSS();\n } else {\n argValue += '???';\n }\n return argValue;\n }).join(', ') : ''})`;\n }\n}\n\nMixinCall.prototype.type = 'MixinCall';\nexport default MixinCall;\n","import Node from './node';\nimport Color from './color';\nimport AtRule from './atrule';\nimport DetachedRuleset from './detached-ruleset';\nimport Operation from './operation';\nimport Dimension from './dimension';\nimport Unit from './unit';\nimport Keyword from './keyword';\nimport Variable from './variable';\nimport Property from './property';\nimport Ruleset from './ruleset';\nimport Element from './element';\nimport Attribute from './attribute';\nimport Combinator from './combinator';\nimport Selector from './selector';\nimport Quoted from './quoted';\nimport Expression from './expression';\nimport Declaration from './declaration';\nimport Call from './call';\nimport URL from './url';\nimport Import from './import';\nimport Comment from './comment';\nimport Anonymous from './anonymous';\nimport Value from './value';\nimport JavaScript from './javascript';\nimport Assignment from './assignment';\nimport Condition from './condition';\nimport Paren from './paren';\nimport Media from './media';\nimport UnicodeDescriptor from './unicode-descriptor';\nimport Negative from './negative';\nimport Extend from './extend';\nimport VariableCall from './variable-call';\nimport NamespaceValue from './namespace-value';\n\n// mixins\nimport MixinCall from './mixin-call';\nimport MixinDefinition from './mixin-definition';\n\nexport default {\n Node, Color, AtRule, DetachedRuleset, Operation,\n Dimension, Unit, Keyword, Variable, Property,\n Ruleset, Element, Attribute, Combinator, Selector,\n Quoted, Expression, Declaration, Call, URL, Import,\n Comment, Anonymous, Value, JavaScript, Assignment,\n Condition, Paren, Media, UnicodeDescriptor, Negative,\n Extend, VariableCall, NamespaceValue,\n mixin: {\n Call: MixinCall,\n Definition: MixinDefinition\n }\n};","class AbstractFileManager {\n getPath(filename) {\n let j = filename.lastIndexOf('?');\n if (j > 0) {\n filename = filename.slice(0, j);\n }\n j = filename.lastIndexOf('/');\n if (j < 0) {\n j = filename.lastIndexOf('\\\\');\n }\n if (j < 0) {\n return '';\n }\n return filename.slice(0, j + 1);\n }\n\n tryAppendExtension(path, ext) {\n return /(\\.[a-z]*$)|([\\?;].*)$/.test(path) ? path : path + ext;\n }\n\n tryAppendLessExtension(path) {\n return this.tryAppendExtension(path, '.less');\n }\n\n supportsSync() {\n return false;\n }\n\n alwaysMakePathsAbsolute() {\n return false;\n }\n\n isPathAbsolute(filename) {\n return (/^(?:[a-z-]+:|\\/|\\\\|#)/i).test(filename);\n }\n\n // TODO: pull out / replace?\n join(basePath, laterPath) {\n if (!basePath) {\n return laterPath;\n }\n return basePath + laterPath;\n }\n\n pathDiff(url, baseUrl) {\n // diff between two paths to create a relative path\n\n const urlParts = this.extractUrlParts(url);\n\n const baseUrlParts = this.extractUrlParts(baseUrl);\n let i;\n let max;\n let urlDirectories;\n let baseUrlDirectories;\n let diff = '';\n if (urlParts.hostPart !== baseUrlParts.hostPart) {\n return '';\n }\n max = Math.max(baseUrlParts.directories.length, urlParts.directories.length);\n for (i = 0; i < max; i++) {\n if (baseUrlParts.directories[i] !== urlParts.directories[i]) { break; }\n }\n baseUrlDirectories = baseUrlParts.directories.slice(i);\n urlDirectories = urlParts.directories.slice(i);\n for (i = 0; i < baseUrlDirectories.length - 1; i++) {\n diff += '../';\n }\n for (i = 0; i < urlDirectories.length - 1; i++) {\n diff += `${urlDirectories[i]}/`;\n }\n return diff;\n }\n\n // helper function, not part of API\n extractUrlParts(url, baseUrl) {\n // urlParts[1] = protocol://hostname/ OR /\n // urlParts[2] = / if path relative to host base\n // urlParts[3] = directories\n // urlParts[4] = filename\n // urlParts[5] = parameters\n\n const urlPartsRegex = /^((?:[a-z-]+:)?\\/{2}(?:[^\\/\\?#]*\\/)|([\\/\\\\]))?((?:[^\\/\\\\\\?#]*[\\/\\\\])*)([^\\/\\\\\\?#]*)([#\\?].*)?$/i;\n\n const urlParts = url.match(urlPartsRegex);\n const returner = {};\n let rawDirectories = [];\n const directories = [];\n let i;\n let baseUrlParts;\n\n if (!urlParts) {\n throw new Error(`Could not parse sheet href - '${url}'`);\n }\n\n // Stylesheets in IE don't always return the full path\n if (baseUrl && (!urlParts[1] || urlParts[2])) {\n baseUrlParts = baseUrl.match(urlPartsRegex);\n if (!baseUrlParts) {\n throw new Error(`Could not parse page url - '${baseUrl}'`);\n }\n urlParts[1] = urlParts[1] || baseUrlParts[1] || '';\n if (!urlParts[2]) {\n urlParts[3] = baseUrlParts[3] + urlParts[3];\n }\n }\n\n if (urlParts[3]) {\n rawDirectories = urlParts[3].replace(/\\\\/g, '/').split('/');\n\n // collapse '..' and skip '.'\n for (i = 0; i < rawDirectories.length; i++) {\n\n if (rawDirectories[i] === '..') {\n directories.pop();\n }\n else if (rawDirectories[i] !== '.') {\n directories.push(rawDirectories[i]);\n }\n \n }\n }\n\n returner.hostPart = urlParts[1];\n returner.directories = directories;\n returner.rawPath = (urlParts[1] || '') + rawDirectories.join('/');\n returner.path = (urlParts[1] || '') + directories.join('/');\n returner.filename = urlParts[4];\n returner.fileUrl = returner.path + (urlParts[4] || '');\n returner.url = returner.fileUrl + (urlParts[5] || '');\n return returner;\n }\n}\n\nexport default AbstractFileManager;\n","import functionRegistry from '../functions/function-registry';\nimport LessError from '../less-error';\n\nclass AbstractPluginLoader {\n constructor() {\n // Implemented by Node.js plugin loader\n this.require = function() {\n return null;\n }\n }\n\n evalPlugin(contents, context, imports, pluginOptions, fileInfo) {\n\n let loader, registry, pluginObj, localModule, pluginManager, filename, result;\n\n pluginManager = context.pluginManager;\n\n if (fileInfo) {\n if (typeof fileInfo === 'string') {\n filename = fileInfo;\n }\n else {\n filename = fileInfo.filename;\n }\n }\n const shortname = (new this.less.FileManager()).extractUrlParts(filename).filename;\n\n if (filename) {\n pluginObj = pluginManager.get(filename);\n\n if (pluginObj) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imports, filename);\n }\n return pluginObj;\n }\n }\n localModule = {\n exports: {},\n pluginManager,\n fileInfo\n };\n registry = functionRegistry.create();\n\n const registerPlugin = function(obj) {\n pluginObj = obj;\n };\n\n try {\n loader = new Function('module', 'require', 'registerPlugin', 'functions', 'tree', 'less', 'fileInfo', contents);\n loader(localModule, this.require(filename), registerPlugin, registry, this.less.tree, this.less, fileInfo);\n }\n catch (e) {\n return new LessError(e, imports, filename);\n }\n\n if (!pluginObj) {\n pluginObj = localModule.exports;\n }\n pluginObj = this.validatePlugin(pluginObj, filename, shortname);\n\n if (pluginObj instanceof LessError) {\n return pluginObj;\n }\n\n if (pluginObj) {\n pluginObj.imports = imports;\n pluginObj.filename = filename;\n\n // For < 3.x (or unspecified minVersion) - setOptions() before install()\n if (!pluginObj.minVersion || this.compareVersion('3.0.0', pluginObj.minVersion) < 0) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n\n if (result) {\n return result;\n }\n }\n\n // Run on first load\n pluginManager.addPlugin(pluginObj, fileInfo.filename, registry);\n pluginObj.functions = registry.getLocalFunctions();\n\n // Need to call setOptions again because the pluginObj might have functions\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n\n // Run every @plugin call\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imports, filename);\n }\n\n }\n else {\n return new LessError({ message: 'Not a valid plugin' }, imports, filename);\n }\n\n return pluginObj;\n\n }\n\n trySetOptions(plugin, filename, name, options) {\n if (options && !plugin.setOptions) {\n return new LessError({\n message: `Options have been provided but the plugin ${name} does not support any options.`\n });\n }\n try {\n plugin.setOptions && plugin.setOptions(options);\n }\n catch (e) {\n return new LessError(e);\n }\n }\n\n validatePlugin(plugin, filename, name) {\n if (plugin) {\n // support plugins being a function\n // so that the plugin can be more usable programmatically\n if (typeof plugin === 'function') {\n plugin = new plugin();\n }\n\n if (plugin.minVersion) {\n if (this.compareVersion(plugin.minVersion, this.less.version) < 0) {\n return new LessError({\n message: `Plugin ${name} requires version ${this.versionToString(plugin.minVersion)}`\n });\n }\n }\n return plugin;\n }\n return null;\n }\n\n compareVersion(aVersion, bVersion) {\n if (typeof aVersion === 'string') {\n aVersion = aVersion.match(/^(\\d+)\\.?(\\d+)?\\.?(\\d+)?/);\n aVersion.shift();\n }\n for (let i = 0; i < aVersion.length; i++) {\n if (aVersion[i] !== bVersion[i]) {\n return parseInt(aVersion[i]) > parseInt(bVersion[i]) ? -1 : 1;\n }\n }\n return 0;\n }\n\n versionToString(version) {\n let versionString = '';\n for (let i = 0; i < version.length; i++) {\n versionString += (versionString ? '.' : '') + version[i];\n }\n return versionString;\n }\n\n printUsage(plugins) {\n for (let i = 0; i < plugins.length; i++) {\n const plugin = plugins[i];\n if (plugin.printUsage) {\n plugin.printUsage();\n }\n }\n }\n}\n\nexport default AbstractPluginLoader;\n\n","import tree from '../tree';\n\nconst _visitArgs = { visitDeeper: true };\nlet _hasIndexed = false;\n\nfunction _noop(node) {\n return node;\n}\n\nfunction indexNodeTypes(parent, ticker) {\n // add .typeIndex to tree node types for lookup table\n let key, child;\n for (key in parent) { \n /* eslint guard-for-in: 0 */\n child = parent[key];\n switch (typeof child) {\n case 'function':\n // ignore bound functions directly on tree which do not have a prototype\n // or aren't nodes\n if (child.prototype && child.prototype.type) {\n child.prototype.typeIndex = ticker++;\n }\n break;\n case 'object':\n ticker = indexNodeTypes(child, ticker);\n break;\n \n }\n }\n return ticker;\n}\n\nclass Visitor {\n constructor(implementation) {\n this._implementation = implementation;\n this._visitInCache = {};\n this._visitOutCache = {};\n\n if (!_hasIndexed) {\n indexNodeTypes(tree, 1);\n _hasIndexed = true;\n }\n }\n\n visit(node) {\n if (!node) {\n return node;\n }\n\n const nodeTypeIndex = node.typeIndex;\n if (!nodeTypeIndex) {\n // MixinCall args aren't a node type?\n if (node.value && node.value.typeIndex) {\n this.visit(node.value);\n }\n return node;\n }\n\n const impl = this._implementation;\n let func = this._visitInCache[nodeTypeIndex];\n let funcOut = this._visitOutCache[nodeTypeIndex];\n const visitArgs = _visitArgs;\n let fnName;\n\n visitArgs.visitDeeper = true;\n\n if (!func) {\n fnName = `visit${node.type}`;\n func = impl[fnName] || _noop;\n funcOut = impl[`${fnName}Out`] || _noop;\n this._visitInCache[nodeTypeIndex] = func;\n this._visitOutCache[nodeTypeIndex] = funcOut;\n }\n\n if (func !== _noop) {\n const newNode = func.call(impl, node, visitArgs);\n if (node && impl.isReplacing) {\n node = newNode;\n }\n }\n\n if (visitArgs.visitDeeper && node) {\n if (node.length) {\n for (let i = 0, cnt = node.length; i < cnt; i++) {\n if (node[i].accept) {\n node[i].accept(this);\n }\n }\n } else if (node.accept) {\n node.accept(this);\n }\n }\n\n if (funcOut != _noop) {\n funcOut.call(impl, node);\n }\n\n return node;\n }\n\n visitArray(nodes, nonReplacing) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.length;\n let i;\n\n // Non-replacing\n if (nonReplacing || !this._implementation.isReplacing) {\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n // Replacing\n const out = [];\n for (i = 0; i < cnt; i++) {\n const evald = this.visit(nodes[i]);\n if (evald === undefined) { continue; }\n if (!evald.splice) {\n out.push(evald);\n } else if (evald.length) {\n this.flatten(evald, out);\n }\n }\n return out;\n }\n\n flatten(arr, out) {\n if (!out) {\n out = [];\n }\n\n let cnt, i, item, nestedCnt, j, nestedItem;\n\n for (i = 0, cnt = arr.length; i < cnt; i++) {\n item = arr[i];\n if (item === undefined) {\n continue;\n }\n if (!item.splice) {\n out.push(item);\n continue;\n }\n\n for (j = 0, nestedCnt = item.length; j < nestedCnt; j++) {\n nestedItem = item[j];\n if (nestedItem === undefined) {\n continue;\n }\n if (!nestedItem.splice) {\n out.push(nestedItem);\n } else if (nestedItem.length) {\n this.flatten(nestedItem, out);\n }\n }\n }\n\n return out;\n }\n}\n\nexport default Visitor;\n","class ImportSequencer {\n constructor(onSequencerEmpty) {\n this.imports = [];\n this.variableImports = [];\n this._onSequencerEmpty = onSequencerEmpty;\n this._currentDepth = 0;\n }\n\n addImport(callback) {\n const importSequencer = this,\n importItem = {\n callback,\n args: null,\n isReady: false\n };\n this.imports.push(importItem);\n return function() {\n importItem.args = Array.prototype.slice.call(arguments, 0);\n importItem.isReady = true;\n importSequencer.tryRun();\n };\n }\n\n addVariableImport(callback) {\n this.variableImports.push(callback);\n }\n\n tryRun() {\n this._currentDepth++;\n try {\n while (true) {\n while (this.imports.length > 0) {\n const importItem = this.imports[0];\n if (!importItem.isReady) {\n return;\n }\n this.imports = this.imports.slice(1);\n importItem.callback.apply(null, importItem.args);\n }\n if (this.variableImports.length === 0) {\n break;\n }\n const variableImport = this.variableImports[0];\n this.variableImports = this.variableImports.slice(1);\n variableImport();\n }\n } finally {\n this._currentDepth--;\n }\n if (this._currentDepth === 0 && this._onSequencerEmpty) {\n this._onSequencerEmpty();\n }\n }\n}\n\nexport default ImportSequencer;\n","import contexts from '../contexts';\nimport Visitor from './visitor';\nimport ImportSequencer from './import-sequencer';\nimport * as utils from '../utils';\n\nconst ImportVisitor = function(importer, finish) {\n\n this._visitor = new Visitor(this);\n this._importer = importer;\n this._finish = finish;\n this.context = new contexts.Eval();\n this.importCount = 0;\n this.onceFileDetectionMap = {};\n this.recursionDetector = {};\n this._sequencer = new ImportSequencer(this._onSequencerEmpty.bind(this));\n};\n\nImportVisitor.prototype = {\n isReplacing: false,\n run: function (root) {\n try {\n // process the contents\n this._visitor.visit(root);\n }\n catch (e) {\n this.error = e;\n }\n\n this.isFinished = true;\n this._sequencer.tryRun();\n },\n _onSequencerEmpty: function() {\n if (!this.isFinished) {\n return;\n }\n this._finish(this.error);\n },\n visitImport: function (importNode, visitArgs) {\n const inlineCSS = importNode.options.inline;\n\n if (!importNode.css || inlineCSS) {\n\n const context = new contexts.Eval(this.context, utils.copyArray(this.context.frames));\n const importParent = context.frames[0];\n\n this.importCount++;\n if (importNode.isVariableImport()) {\n this._sequencer.addVariableImport(this.processImportNode.bind(this, importNode, context, importParent));\n } else {\n this.processImportNode(importNode, context, importParent);\n }\n }\n visitArgs.visitDeeper = false;\n },\n processImportNode: function(importNode, context, importParent) {\n let evaldImportNode;\n const inlineCSS = importNode.options.inline;\n\n try {\n evaldImportNode = importNode.evalForImport(context);\n } catch (e) {\n if (!e.filename) { e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename; }\n // attempt to eval properly and treat as css\n importNode.css = true;\n // if that fails, this error will be thrown\n importNode.error = e;\n }\n\n if (evaldImportNode && (!evaldImportNode.css || inlineCSS)) {\n\n if (evaldImportNode.options.multiple) {\n context.importMultiple = true;\n }\n\n // try appending if we haven't determined if it is css or not\n const tryAppendLessExtension = evaldImportNode.css === undefined;\n\n for (let i = 0; i < importParent.rules.length; i++) {\n if (importParent.rules[i] === importNode) {\n importParent.rules[i] = evaldImportNode;\n break;\n }\n }\n\n const onImported = this.onImported.bind(this, evaldImportNode, context), sequencedOnImported = this._sequencer.addImport(onImported);\n\n this._importer.push(evaldImportNode.getPath(), tryAppendLessExtension, evaldImportNode.fileInfo(),\n evaldImportNode.options, sequencedOnImported);\n } else {\n this.importCount--;\n if (this.isFinished) {\n this._sequencer.tryRun();\n }\n }\n },\n onImported: function (importNode, context, e, root, importedAtRoot, fullPath) {\n if (e) {\n if (!e.filename) {\n e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename;\n }\n this.error = e;\n }\n\n const importVisitor = this, inlineCSS = importNode.options.inline, isPlugin = importNode.options.isPlugin, isOptional = importNode.options.optional, duplicateImport = importedAtRoot || fullPath in importVisitor.recursionDetector;\n\n if (!context.importMultiple) {\n if (duplicateImport) {\n importNode.skip = true;\n } else {\n importNode.skip = function() {\n if (fullPath in importVisitor.onceFileDetectionMap) {\n return true;\n }\n importVisitor.onceFileDetectionMap[fullPath] = true;\n return false;\n };\n }\n }\n\n if (!fullPath && isOptional) {\n importNode.skip = true;\n }\n\n if (root) {\n importNode.root = root;\n importNode.importedFilename = fullPath;\n\n if (!inlineCSS && !isPlugin && (context.importMultiple || !duplicateImport)) {\n importVisitor.recursionDetector[fullPath] = true;\n\n const oldContext = this.context;\n this.context = context;\n try {\n this._visitor.visit(root);\n } catch (e) {\n this.error = e;\n }\n this.context = oldContext;\n }\n }\n\n importVisitor.importCount--;\n\n if (importVisitor.isFinished) {\n importVisitor._sequencer.tryRun();\n }\n },\n visitDeclaration: function (declNode, visitArgs) {\n if (declNode.value.type === 'DetachedRuleset') {\n this.context.frames.unshift(declNode);\n } else {\n visitArgs.visitDeeper = false;\n }\n },\n visitDeclarationOut: function(declNode) {\n if (declNode.value.type === 'DetachedRuleset') {\n this.context.frames.shift();\n }\n },\n visitAtRule: function (atRuleNode, visitArgs) {\n this.context.frames.unshift(atRuleNode);\n },\n visitAtRuleOut: function (atRuleNode) {\n this.context.frames.shift();\n },\n visitMixinDefinition: function (mixinDefinitionNode, visitArgs) {\n this.context.frames.unshift(mixinDefinitionNode);\n },\n visitMixinDefinitionOut: function (mixinDefinitionNode) {\n this.context.frames.shift();\n },\n visitRuleset: function (rulesetNode, visitArgs) {\n this.context.frames.unshift(rulesetNode);\n },\n visitRulesetOut: function (rulesetNode) {\n this.context.frames.shift();\n },\n visitMedia: function (mediaNode, visitArgs) {\n this.context.frames.unshift(mediaNode.rules[0]);\n },\n visitMediaOut: function (mediaNode) {\n this.context.frames.shift();\n }\n};\nexport default ImportVisitor;\n","class SetTreeVisibilityVisitor {\n constructor(visible) {\n this.visible = visible;\n }\n\n run(root) {\n this.visit(root);\n }\n\n visitArray(nodes) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.length;\n let i;\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n visit(node) {\n if (!node) {\n return node;\n }\n if (node.constructor === Array) {\n return this.visitArray(node);\n }\n\n if (!node.blocksVisibility || node.blocksVisibility()) {\n return node;\n }\n if (this.visible) {\n node.ensureVisibility();\n } else {\n node.ensureInvisibility();\n }\n\n node.accept(this);\n return node;\n }\n}\n\nexport default SetTreeVisibilityVisitor;","import tree from '../tree';\nimport Visitor from './visitor';\nimport logger from '../logger';\nimport * as utils from '../utils';\n\n/* jshint loopfunc:true */\n\nclass ExtendFinderVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n this.contexts = [];\n this.allExtendsStack = [[]];\n }\n\n run(root) {\n root = this._visitor.visit(root);\n root.allExtends = this.allExtendsStack[0];\n return root;\n }\n\n visitDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n\n let i;\n let j;\n let extend;\n const allSelectorsExtendList = [];\n let extendList;\n\n // get &:extend(.a); rules which apply to all selectors in this ruleset\n const rules = rulesetNode.rules, ruleCnt = rules ? rules.length : 0;\n for (i = 0; i < ruleCnt; i++) {\n if (rulesetNode.rules[i] instanceof tree.Extend) {\n allSelectorsExtendList.push(rules[i]);\n rulesetNode.extendOnEveryPath = true;\n }\n }\n\n // now find every selector and apply the extends that apply to all extends\n // and the ones which apply to an individual extend\n const paths = rulesetNode.paths;\n for (i = 0; i < paths.length; i++) {\n const selectorPath = paths[i], selector = selectorPath[selectorPath.length - 1], selExtendList = selector.extendList;\n\n extendList = selExtendList ? utils.copyArray(selExtendList).concat(allSelectorsExtendList)\n : allSelectorsExtendList;\n\n if (extendList) {\n extendList = extendList.map(function(allSelectorsExtend) {\n return allSelectorsExtend.clone();\n });\n }\n\n for (j = 0; j < extendList.length; j++) {\n this.foundExtends = true;\n extend = extendList[j];\n extend.findSelfSelectors(selectorPath);\n extend.ruleset = rulesetNode;\n if (j === 0) { extend.firstExtendOnThisSelectorPath = true; }\n this.allExtendsStack[this.allExtendsStack.length - 1].push(extend);\n }\n }\n\n this.contexts.push(rulesetNode.selectors);\n }\n\n visitRulesetOut(rulesetNode) {\n if (!rulesetNode.root) {\n this.contexts.length = this.contexts.length - 1;\n }\n }\n\n visitMedia(mediaNode, visitArgs) {\n mediaNode.allExtends = [];\n this.allExtendsStack.push(mediaNode.allExtends);\n }\n\n visitMediaOut(mediaNode) {\n this.allExtendsStack.length = this.allExtendsStack.length - 1;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n atRuleNode.allExtends = [];\n this.allExtendsStack.push(atRuleNode.allExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n this.allExtendsStack.length = this.allExtendsStack.length - 1;\n }\n}\n\nclass ProcessExtendsVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n }\n\n run(root) {\n const extendFinder = new ExtendFinderVisitor();\n this.extendIndices = {};\n extendFinder.run(root);\n if (!extendFinder.foundExtends) { return root; }\n root.allExtends = root.allExtends.concat(this.doExtendChaining(root.allExtends, root.allExtends));\n this.allExtendsStack = [root.allExtends];\n const newRoot = this._visitor.visit(root);\n this.checkExtendsForNonMatched(root.allExtends);\n return newRoot;\n }\n\n checkExtendsForNonMatched(extendList) {\n const indices = this.extendIndices;\n extendList.filter(function(extend) {\n return !extend.hasFoundMatches && extend.parent_ids.length == 1;\n }).forEach(function(extend) {\n let selector = '_unknown_';\n try {\n selector = extend.selector.toCSS({});\n }\n catch (_) {}\n\n if (!indices[`${extend.index} ${selector}`]) {\n indices[`${extend.index} ${selector}`] = true;\n logger.warn(`extend '${selector}' has no matches`);\n }\n });\n }\n\n doExtendChaining(extendsList, extendsListTarget, iterationCount) {\n //\n // chaining is different from normal extension.. if we extend an extend then we are not just copying, altering\n // and pasting the selector we would do normally, but we are also adding an extend with the same target selector\n // this means this new extend can then go and alter other extends\n //\n // this method deals with all the chaining work - without it, extend is flat and doesn't work on other extend selectors\n // this is also the most expensive.. and a match on one selector can cause an extension of a selector we had already\n // processed if we look at each selector at a time, as is done in visitRuleset\n\n let extendIndex;\n\n let targetExtendIndex;\n let matches;\n const extendsToAdd = [];\n let newSelector;\n const extendVisitor = this;\n let selectorPath;\n let extend;\n let targetExtend;\n let newExtend;\n\n iterationCount = iterationCount || 0;\n\n // loop through comparing every extend with every target extend.\n // a target extend is the one on the ruleset we are looking at copy/edit/pasting in place\n // e.g. .a:extend(.b) {} and .b:extend(.c) {} then the first extend extends the second one\n // and the second is the target.\n // the separation into two lists allows us to process a subset of chains with a bigger set, as is the\n // case when processing media queries\n for (extendIndex = 0; extendIndex < extendsList.length; extendIndex++) {\n for (targetExtendIndex = 0; targetExtendIndex < extendsListTarget.length; targetExtendIndex++) {\n\n extend = extendsList[extendIndex];\n targetExtend = extendsListTarget[targetExtendIndex];\n\n // look for circular references\n if ( extend.parent_ids.indexOf( targetExtend.object_id ) >= 0 ) { continue; }\n\n // find a match in the target extends self selector (the bit before :extend)\n selectorPath = [targetExtend.selfSelectors[0]];\n matches = extendVisitor.findMatch(extend, selectorPath);\n\n if (matches.length) {\n extend.hasFoundMatches = true;\n\n // we found a match, so for each self selector..\n extend.selfSelectors.forEach(function(selfSelector) {\n const info = targetExtend.visibilityInfo();\n\n // process the extend as usual\n newSelector = extendVisitor.extendSelector(matches, selectorPath, selfSelector, extend.isVisible());\n\n // but now we create a new extend from it\n newExtend = new(tree.Extend)(targetExtend.selector, targetExtend.option, 0, targetExtend.fileInfo(), info);\n newExtend.selfSelectors = newSelector;\n\n // add the extend onto the list of extends for that selector\n newSelector[newSelector.length - 1].extendList = [newExtend];\n\n // record that we need to add it.\n extendsToAdd.push(newExtend);\n newExtend.ruleset = targetExtend.ruleset;\n\n // remember its parents for circular references\n newExtend.parent_ids = newExtend.parent_ids.concat(targetExtend.parent_ids, extend.parent_ids);\n\n // only process the selector once.. if we have :extend(.a,.b) then multiple\n // extends will look at the same selector path, so when extending\n // we know that any others will be duplicates in terms of what is added to the css\n if (targetExtend.firstExtendOnThisSelectorPath) {\n newExtend.firstExtendOnThisSelectorPath = true;\n targetExtend.ruleset.paths.push(newSelector);\n }\n });\n }\n }\n }\n\n if (extendsToAdd.length) {\n // try to detect circular references to stop a stack overflow.\n // may no longer be needed.\n this.extendChainCount++;\n if (iterationCount > 100) {\n let selectorOne = '{unable to calculate}';\n let selectorTwo = '{unable to calculate}';\n try {\n selectorOne = extendsToAdd[0].selfSelectors[0].toCSS();\n selectorTwo = extendsToAdd[0].selector.toCSS();\n }\n catch (e) {}\n throw { message: `extend circular reference detected. One of the circular extends is currently:${selectorOne}:extend(${selectorTwo})`};\n }\n\n // now process the new extends on the existing rules so that we can handle a extending b extending c extending\n // d extending e...\n return extendsToAdd.concat(extendVisitor.doExtendChaining(extendsToAdd, extendsListTarget, iterationCount + 1));\n } else {\n return extendsToAdd;\n }\n }\n\n visitDeclaration(ruleNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitSelector(selectorNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n let matches;\n let pathIndex;\n let extendIndex;\n const allExtends = this.allExtendsStack[this.allExtendsStack.length - 1];\n const selectorsToAdd = [];\n const extendVisitor = this;\n let selectorPath;\n\n // look at each selector path in the ruleset, find any extend matches and then copy, find and replace\n\n for (extendIndex = 0; extendIndex < allExtends.length; extendIndex++) {\n for (pathIndex = 0; pathIndex < rulesetNode.paths.length; pathIndex++) {\n selectorPath = rulesetNode.paths[pathIndex];\n\n // extending extends happens initially, before the main pass\n if (rulesetNode.extendOnEveryPath) { continue; }\n const extendList = selectorPath[selectorPath.length - 1].extendList;\n if (extendList && extendList.length) { continue; }\n\n matches = this.findMatch(allExtends[extendIndex], selectorPath);\n\n if (matches.length) {\n allExtends[extendIndex].hasFoundMatches = true;\n\n allExtends[extendIndex].selfSelectors.forEach(function(selfSelector) {\n let extendedSelectors;\n extendedSelectors = extendVisitor.extendSelector(matches, selectorPath, selfSelector, allExtends[extendIndex].isVisible());\n selectorsToAdd.push(extendedSelectors);\n });\n }\n }\n }\n rulesetNode.paths = rulesetNode.paths.concat(selectorsToAdd);\n }\n\n findMatch(extend, haystackSelectorPath) {\n //\n // look through the haystack selector path to try and find the needle - extend.selector\n // returns an array of selector matches that can then be replaced\n //\n let haystackSelectorIndex;\n\n let hackstackSelector;\n let hackstackElementIndex;\n let haystackElement;\n let targetCombinator;\n let i;\n const extendVisitor = this;\n const needleElements = extend.selector.elements;\n const potentialMatches = [];\n let potentialMatch;\n const matches = [];\n\n // loop through the haystack elements\n for (haystackSelectorIndex = 0; haystackSelectorIndex < haystackSelectorPath.length; haystackSelectorIndex++) {\n hackstackSelector = haystackSelectorPath[haystackSelectorIndex];\n\n for (hackstackElementIndex = 0; hackstackElementIndex < hackstackSelector.elements.length; hackstackElementIndex++) {\n\n haystackElement = hackstackSelector.elements[hackstackElementIndex];\n\n // if we allow elements before our match we can add a potential match every time. otherwise only at the first element.\n if (extend.allowBefore || (haystackSelectorIndex === 0 && hackstackElementIndex === 0)) {\n potentialMatches.push({pathIndex: haystackSelectorIndex, index: hackstackElementIndex, matched: 0,\n initialCombinator: haystackElement.combinator});\n }\n\n for (i = 0; i < potentialMatches.length; i++) {\n potentialMatch = potentialMatches[i];\n\n // selectors add \" \" onto the first element. When we use & it joins the selectors together, but if we don't\n // then each selector in haystackSelectorPath has a space before it added in the toCSS phase. so we need to\n // work out what the resulting combinator will be\n targetCombinator = haystackElement.combinator.value;\n if (targetCombinator === '' && hackstackElementIndex === 0) {\n targetCombinator = ' ';\n }\n\n // if we don't match, null our match to indicate failure\n if (!extendVisitor.isElementValuesEqual(needleElements[potentialMatch.matched].value, haystackElement.value) ||\n (potentialMatch.matched > 0 && needleElements[potentialMatch.matched].combinator.value !== targetCombinator)) {\n potentialMatch = null;\n } else {\n potentialMatch.matched++;\n }\n\n // if we are still valid and have finished, test whether we have elements after and whether these are allowed\n if (potentialMatch) {\n potentialMatch.finished = potentialMatch.matched === needleElements.length;\n if (potentialMatch.finished &&\n (!extend.allowAfter &&\n (hackstackElementIndex + 1 < hackstackSelector.elements.length || haystackSelectorIndex + 1 < haystackSelectorPath.length))) {\n potentialMatch = null;\n }\n }\n // if null we remove, if not, we are still valid, so either push as a valid match or continue\n if (potentialMatch) {\n if (potentialMatch.finished) {\n potentialMatch.length = needleElements.length;\n potentialMatch.endPathIndex = haystackSelectorIndex;\n potentialMatch.endPathElementIndex = hackstackElementIndex + 1; // index after end of match\n potentialMatches.length = 0; // we don't allow matches to overlap, so start matching again\n matches.push(potentialMatch);\n }\n } else {\n potentialMatches.splice(i, 1);\n i--;\n }\n }\n }\n }\n return matches;\n }\n\n isElementValuesEqual(elementValue1, elementValue2) {\n if (typeof elementValue1 === 'string' || typeof elementValue2 === 'string') {\n return elementValue1 === elementValue2;\n }\n if (elementValue1 instanceof tree.Attribute) {\n if (elementValue1.op !== elementValue2.op || elementValue1.key !== elementValue2.key) {\n return false;\n }\n if (!elementValue1.value || !elementValue2.value) {\n if (elementValue1.value || elementValue2.value) {\n return false;\n }\n return true;\n }\n elementValue1 = elementValue1.value.value || elementValue1.value;\n elementValue2 = elementValue2.value.value || elementValue2.value;\n return elementValue1 === elementValue2;\n }\n elementValue1 = elementValue1.value;\n elementValue2 = elementValue2.value;\n if (elementValue1 instanceof tree.Selector) {\n if (!(elementValue2 instanceof tree.Selector) || elementValue1.elements.length !== elementValue2.elements.length) {\n return false;\n }\n for (let i = 0; i < elementValue1.elements.length; i++) {\n if (elementValue1.elements[i].combinator.value !== elementValue2.elements[i].combinator.value) {\n if (i !== 0 || (elementValue1.elements[i].combinator.value || ' ') !== (elementValue2.elements[i].combinator.value || ' ')) {\n return false;\n }\n }\n if (!this.isElementValuesEqual(elementValue1.elements[i].value, elementValue2.elements[i].value)) {\n return false;\n }\n }\n return true;\n }\n return false;\n }\n\n extendSelector(matches, selectorPath, replacementSelector, isVisible) {\n\n // for a set of matches, replace each match with the replacement selector\n\n let currentSelectorPathIndex = 0, currentSelectorPathElementIndex = 0, path = [], matchIndex, selector, firstElement, match, newElements;\n\n for (matchIndex = 0; matchIndex < matches.length; matchIndex++) {\n match = matches[matchIndex];\n selector = selectorPath[match.pathIndex];\n firstElement = new tree.Element(\n match.initialCombinator,\n replacementSelector.elements[0].value,\n replacementSelector.elements[0].isVariable,\n replacementSelector.elements[0].getIndex(),\n replacementSelector.elements[0].fileInfo()\n );\n\n if (match.pathIndex > currentSelectorPathIndex && currentSelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n\n newElements = selector.elements\n .slice(currentSelectorPathElementIndex, match.index)\n .concat([firstElement])\n .concat(replacementSelector.elements.slice(1));\n\n if (currentSelectorPathIndex === match.pathIndex && matchIndex > 0) {\n path[path.length - 1].elements =\n path[path.length - 1].elements.concat(newElements);\n } else {\n path = path.concat(selectorPath.slice(currentSelectorPathIndex, match.pathIndex));\n\n path.push(new tree.Selector(\n newElements\n ));\n }\n currentSelectorPathIndex = match.endPathIndex;\n currentSelectorPathElementIndex = match.endPathElementIndex;\n if (currentSelectorPathElementIndex >= selectorPath[currentSelectorPathIndex].elements.length) {\n currentSelectorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n }\n\n if (currentSelectorPathIndex < selectorPath.length && currentSelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathIndex++;\n }\n\n path = path.concat(selectorPath.slice(currentSelectorPathIndex, selectorPath.length));\n path = path.map(function (currentValue) {\n // we can re-use elements here, because the visibility property matters only for selectors\n const derived = currentValue.createDerived(currentValue.elements);\n if (isVisible) {\n derived.ensureVisibility();\n } else {\n derived.ensureInvisibility();\n }\n return derived;\n });\n return path;\n }\n\n visitMedia(mediaNode, visitArgs) {\n let newAllExtends = mediaNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, mediaNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitMediaOut(mediaNode) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStack.length = lastIndex;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n let newAllExtends = atRuleNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, atRuleNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStack.length = lastIndex;\n }\n}\n\nexport default ProcessExtendsVisitor;\n","import Visitor from './visitor';\n\nclass JoinSelectorVisitor {\n constructor() {\n this.contexts = [[]];\n this._visitor = new Visitor(this);\n }\n\n run(root) {\n return this._visitor.visit(root);\n }\n\n visitDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n const paths = [];\n let selectors;\n\n this.contexts.push(paths);\n\n if (!rulesetNode.root) {\n selectors = rulesetNode.selectors;\n if (selectors) {\n selectors = selectors.filter(function(selector) { return selector.getIsOutput(); });\n rulesetNode.selectors = selectors.length ? selectors : (selectors = null);\n if (selectors) { rulesetNode.joinSelectors(paths, context, selectors); }\n }\n if (!selectors) { rulesetNode.rules = null; }\n rulesetNode.paths = paths;\n }\n }\n\n visitRulesetOut(rulesetNode) {\n this.contexts.length = this.contexts.length - 1;\n }\n\n visitMedia(mediaNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n mediaNode.rules[0].root = (context.length === 0 || context[0].multiMedia);\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n if (atRuleNode.rules && atRuleNode.rules.length) {\n atRuleNode.rules[0].root = (atRuleNode.isRooted || context.length === 0 || null);\n }\n }\n}\n\nexport default JoinSelectorVisitor;\n","import tree from '../tree';\nimport Visitor from './visitor';\n\nclass CSSVisitorUtils {\n constructor(context) {\n this._visitor = new Visitor(this);\n this._context = context;\n }\n\n containsSilentNonBlockedChild(bodyRules) {\n let rule;\n if (!bodyRules) {\n return false;\n }\n for (let r = 0; r < bodyRules.length; r++) {\n rule = bodyRules[r];\n if (rule.isSilent && rule.isSilent(this._context) && !rule.blocksVisibility()) {\n // the atrule contains something that was referenced (likely by extend)\n // therefore it needs to be shown in output too\n return true;\n }\n }\n return false;\n }\n\n keepOnlyVisibleChilds(owner) {\n if (owner && owner.rules) {\n owner.rules = owner.rules.filter(thing => thing.isVisible());\n }\n }\n\n isEmpty(owner) {\n return (owner && owner.rules) \n ? (owner.rules.length === 0) : true;\n }\n\n hasVisibleSelector(rulesetNode) {\n return (rulesetNode && rulesetNode.paths)\n ? (rulesetNode.paths.length > 0) : false;\n }\n\n resolveVisibility(node, originalRules) {\n if (!node.blocksVisibility()) {\n if (this.isEmpty(node) && !this.containsSilentNonBlockedChild(originalRules)) {\n return ;\n }\n\n return node;\n }\n\n const compiledRulesBody = node.rules[0];\n this.keepOnlyVisibleChilds(compiledRulesBody);\n\n if (this.isEmpty(compiledRulesBody)) {\n return ;\n }\n\n node.ensureVisibility();\n node.removeVisibilityBlock();\n\n return node;\n }\n\n isVisibleRuleset(rulesetNode) {\n if (rulesetNode.firstRoot) {\n return true;\n }\n\n if (this.isEmpty(rulesetNode)) {\n return false;\n }\n\n if (!rulesetNode.root && !this.hasVisibleSelector(rulesetNode)) {\n return false;\n }\n\n return true;\n }\n}\n\nconst ToCSSVisitor = function(context) {\n this._visitor = new Visitor(this);\n this._context = context;\n this.utils = new CSSVisitorUtils(context);\n};\n\nToCSSVisitor.prototype = {\n isReplacing: true,\n run: function (root) {\n return this._visitor.visit(root);\n },\n\n visitDeclaration: function (declNode, visitArgs) {\n if (declNode.blocksVisibility() || declNode.variable) {\n return;\n }\n return declNode;\n },\n\n visitMixinDefinition: function (mixinNode, visitArgs) {\n // mixin definitions do not get eval'd - this means they keep state\n // so we have to clear that state here so it isn't used if toCSS is called twice\n mixinNode.frames = [];\n },\n\n visitExtend: function (extendNode, visitArgs) {\n },\n\n visitComment: function (commentNode, visitArgs) {\n if (commentNode.blocksVisibility() || commentNode.isSilent(this._context)) {\n return;\n }\n return commentNode;\n },\n\n visitMedia: function(mediaNode, visitArgs) {\n const originalRules = mediaNode.rules[0].rules;\n mediaNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n\n return this.utils.resolveVisibility(mediaNode, originalRules);\n },\n\n visitImport: function (importNode, visitArgs) {\n if (importNode.blocksVisibility()) {\n return ;\n }\n return importNode;\n },\n\n visitAtRule: function(atRuleNode, visitArgs) {\n if (atRuleNode.rules && atRuleNode.rules.length) {\n return this.visitAtRuleWithBody(atRuleNode, visitArgs);\n } else {\n return this.visitAtRuleWithoutBody(atRuleNode, visitArgs);\n }\n },\n\n visitAnonymous: function(anonymousNode, visitArgs) {\n if (!anonymousNode.blocksVisibility()) {\n anonymousNode.accept(this._visitor);\n return anonymousNode;\n }\n },\n\n visitAtRuleWithBody: function(atRuleNode, visitArgs) {\n // if there is only one nested ruleset and that one has no path, then it is\n // just fake ruleset\n function hasFakeRuleset(atRuleNode) {\n const bodyRules = atRuleNode.rules;\n return bodyRules.length === 1 && (!bodyRules[0].paths || bodyRules[0].paths.length === 0);\n }\n function getBodyRules(atRuleNode) {\n const nodeRules = atRuleNode.rules;\n if (hasFakeRuleset(atRuleNode)) {\n return nodeRules[0].rules;\n }\n\n return nodeRules;\n }\n // it is still true that it is only one ruleset in array\n // this is last such moment\n // process childs\n const originalRules = getBodyRules(atRuleNode);\n atRuleNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n\n if (!this.utils.isEmpty(atRuleNode)) {\n this._mergeRules(atRuleNode.rules[0].rules);\n }\n\n return this.utils.resolveVisibility(atRuleNode, originalRules);\n },\n\n visitAtRuleWithoutBody: function(atRuleNode, visitArgs) {\n if (atRuleNode.blocksVisibility()) {\n return;\n }\n\n if (atRuleNode.name === '@charset') {\n // Only output the debug info together with subsequent @charset definitions\n // a comment (or @media statement) before the actual @charset atrule would\n // be considered illegal css as it has to be on the first line\n if (this.charset) {\n if (atRuleNode.debugInfo) {\n const comment = new tree.Comment(`/* ${atRuleNode.toCSS(this._context).replace(/\\n/g, '')} */\\n`);\n comment.debugInfo = atRuleNode.debugInfo;\n return this._visitor.visit(comment);\n }\n return;\n }\n this.charset = true;\n }\n\n return atRuleNode;\n },\n\n checkValidNodes: function(rules, isRoot) {\n if (!rules) {\n return;\n }\n\n for (let i = 0; i < rules.length; i++) {\n const ruleNode = rules[i];\n if (isRoot && ruleNode instanceof tree.Declaration && !ruleNode.variable) {\n throw { message: 'Properties must be inside selector blocks. They cannot be in the root',\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n if (ruleNode instanceof tree.Call) {\n throw { message: `Function '${ruleNode.name}' did not return a root node`,\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n if (ruleNode.type && !ruleNode.allowRoot) {\n throw { message: `${ruleNode.type} node returned by a function is not valid here`,\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n }\n },\n\n visitRuleset: function (rulesetNode, visitArgs) {\n // at this point rulesets are nested into each other\n let rule;\n\n const rulesets = [];\n\n this.checkValidNodes(rulesetNode.rules, rulesetNode.firstRoot);\n\n if (!rulesetNode.root) {\n // remove invisible paths\n this._compileRulesetPaths(rulesetNode);\n\n // remove rulesets from this ruleset body and compile them separately\n const nodeRules = rulesetNode.rules;\n\n let nodeRuleCnt = nodeRules ? nodeRules.length : 0;\n for (let i = 0; i < nodeRuleCnt; ) {\n rule = nodeRules[i];\n if (rule && rule.rules) {\n // visit because we are moving them out from being a child\n rulesets.push(this._visitor.visit(rule));\n nodeRules.splice(i, 1);\n nodeRuleCnt--;\n continue;\n }\n i++;\n }\n // accept the visitor to remove rules and refactor itself\n // then we can decide nogw whether we want it or not\n // compile body\n if (nodeRuleCnt > 0) {\n rulesetNode.accept(this._visitor);\n } else {\n rulesetNode.rules = null;\n }\n visitArgs.visitDeeper = false;\n } else { // if (! rulesetNode.root) {\n rulesetNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n }\n\n if (rulesetNode.rules) {\n this._mergeRules(rulesetNode.rules);\n this._removeDuplicateRules(rulesetNode.rules);\n }\n\n // now decide whether we keep the ruleset\n if (this.utils.isVisibleRuleset(rulesetNode)) {\n rulesetNode.ensureVisibility();\n rulesets.splice(0, 0, rulesetNode);\n }\n\n if (rulesets.length === 1) {\n return rulesets[0];\n }\n return rulesets;\n },\n\n _compileRulesetPaths: function(rulesetNode) {\n if (rulesetNode.paths) {\n rulesetNode.paths = rulesetNode.paths\n .filter(p => {\n let i;\n if (p[0].elements[0].combinator.value === ' ') {\n p[0].elements[0].combinator = new(tree.Combinator)('');\n }\n for (i = 0; i < p.length; i++) {\n if (p[i].isVisible() && p[i].getIsOutput()) {\n return true;\n }\n }\n return false;\n });\n }\n },\n\n _removeDuplicateRules: function(rules) {\n if (!rules) { return; }\n\n // remove duplicates\n const ruleCache = {};\n\n let ruleList;\n let rule;\n let i;\n\n for (i = rules.length - 1; i >= 0 ; i--) {\n rule = rules[i];\n if (rule instanceof tree.Declaration) {\n if (!ruleCache[rule.name]) {\n ruleCache[rule.name] = rule;\n } else {\n ruleList = ruleCache[rule.name];\n if (ruleList instanceof tree.Declaration) {\n ruleList = ruleCache[rule.name] = [ruleCache[rule.name].toCSS(this._context)];\n }\n const ruleCSS = rule.toCSS(this._context);\n if (ruleList.indexOf(ruleCSS) !== -1) {\n rules.splice(i, 1);\n } else {\n ruleList.push(ruleCSS);\n }\n }\n }\n }\n },\n\n _mergeRules: function(rules) {\n if (!rules) {\n return; \n }\n\n const groups = {};\n const groupsArr = [];\n\n for (let i = 0; i < rules.length; i++) {\n const rule = rules[i];\n if (rule.merge) {\n const key = rule.name;\n groups[key] ? rules.splice(i--, 1) : \n groupsArr.push(groups[key] = []);\n groups[key].push(rule);\n }\n }\n\n groupsArr.forEach(group => {\n if (group.length > 0) {\n const result = group[0];\n let space = [];\n const comma = [new tree.Expression(space)];\n group.forEach(rule => {\n if ((rule.merge === '+') && (space.length > 0)) {\n comma.push(new tree.Expression(space = []));\n }\n space.push(rule.value);\n result.important = result.important || rule.important;\n });\n result.value = new tree.Value(comma);\n }\n });\n }\n};\n\nexport default ToCSSVisitor;\n","import Visitor from './visitor';\nimport ImportVisitor from './import-visitor';\nimport MarkVisibleSelectorsVisitor from './set-tree-visibility-visitor';\nimport ExtendVisitor from './extend-visitor';\nimport JoinSelectorVisitor from './join-selector-visitor';\nimport ToCSSVisitor from './to-css-visitor';\n\nexport default {\n Visitor,\n ImportVisitor,\n MarkVisibleSelectorsVisitor,\n ExtendVisitor,\n JoinSelectorVisitor,\n ToCSSVisitor\n};\n","import chunker from './chunker';\n\nexport default () => {\n let // Less input string\n input;\n\n let // current chunk\n j;\n\n const // holds state for backtracking\n saveStack = [];\n\n let // furthest index the parser has gone to\n furthest;\n\n let // if this is furthest we got to, this is the probably cause\n furthestPossibleErrorMessage;\n\n let // chunkified input\n chunks;\n\n let // current chunk\n current;\n\n let // index of current chunk, in `input`\n currentPos;\n\n const parserInput = {};\n const CHARCODE_SPACE = 32;\n const CHARCODE_TAB = 9;\n const CHARCODE_LF = 10;\n const CHARCODE_CR = 13;\n const CHARCODE_PLUS = 43;\n const CHARCODE_COMMA = 44;\n const CHARCODE_FORWARD_SLASH = 47;\n const CHARCODE_9 = 57;\n\n function skipWhitespace(length) {\n const oldi = parserInput.i;\n const oldj = j;\n const curr = parserInput.i - currentPos;\n const endIndex = parserInput.i + current.length - curr;\n const mem = (parserInput.i += length);\n const inp = input;\n let c;\n let nextChar;\n let comment;\n\n for (; parserInput.i < endIndex; parserInput.i++) {\n c = inp.charCodeAt(parserInput.i);\n\n if (parserInput.autoCommentAbsorb && c === CHARCODE_FORWARD_SLASH) {\n nextChar = inp.charAt(parserInput.i + 1);\n if (nextChar === '/') {\n comment = {index: parserInput.i, isLineComment: true};\n let nextNewLine = inp.indexOf('\\n', parserInput.i + 2);\n if (nextNewLine < 0) {\n nextNewLine = endIndex;\n }\n parserInput.i = nextNewLine;\n comment.text = inp.substr(comment.index, parserInput.i - comment.index);\n parserInput.commentStore.push(comment);\n continue;\n } else if (nextChar === '*') {\n const nextStarSlash = inp.indexOf('*/', parserInput.i + 2);\n if (nextStarSlash >= 0) {\n comment = {\n index: parserInput.i,\n text: inp.substr(parserInput.i, nextStarSlash + 2 - parserInput.i),\n isLineComment: false\n };\n parserInput.i += comment.text.length - 1;\n parserInput.commentStore.push(comment);\n continue;\n }\n }\n break;\n }\n\n if ((c !== CHARCODE_SPACE) && (c !== CHARCODE_LF) && (c !== CHARCODE_TAB) && (c !== CHARCODE_CR)) {\n break;\n }\n }\n\n current = current.slice(length + parserInput.i - mem + curr);\n currentPos = parserInput.i;\n\n if (!current.length) {\n if (j < chunks.length - 1) {\n current = chunks[++j];\n skipWhitespace(0); // skip space at the beginning of a chunk\n return true; // things changed\n }\n parserInput.finished = true;\n }\n\n return oldi !== parserInput.i || oldj !== j;\n }\n\n parserInput.save = () => {\n currentPos = parserInput.i;\n saveStack.push( { current, i: parserInput.i, j });\n };\n parserInput.restore = possibleErrorMessage => {\n\n if (parserInput.i > furthest || (parserInput.i === furthest && possibleErrorMessage && !furthestPossibleErrorMessage)) {\n furthest = parserInput.i;\n furthestPossibleErrorMessage = possibleErrorMessage;\n }\n const state = saveStack.pop();\n current = state.current;\n currentPos = parserInput.i = state.i;\n j = state.j;\n };\n parserInput.forget = () => {\n saveStack.pop();\n };\n parserInput.isWhitespace = offset => {\n const pos = parserInput.i + (offset || 0);\n const code = input.charCodeAt(pos);\n return (code === CHARCODE_SPACE || code === CHARCODE_CR || code === CHARCODE_TAB || code === CHARCODE_LF);\n };\n\n // Specialization of $(tok)\n parserInput.$re = tok => {\n if (parserInput.i > currentPos) {\n current = current.slice(parserInput.i - currentPos);\n currentPos = parserInput.i;\n }\n\n const m = tok.exec(current);\n if (!m) {\n return null;\n }\n\n skipWhitespace(m[0].length);\n if (typeof m === 'string') {\n return m;\n }\n\n return m.length === 1 ? m[0] : m;\n };\n\n parserInput.$char = tok => {\n if (input.charAt(parserInput.i) !== tok) {\n return null;\n }\n skipWhitespace(1);\n return tok;\n };\n\n parserInput.$str = tok => {\n const tokLength = tok.length;\n\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tokLength; i++) {\n if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n return null;\n }\n }\n\n skipWhitespace(tokLength);\n return tok;\n };\n\n parserInput.$quoted = loc => {\n const pos = loc || parserInput.i;\n const startChar = input.charAt(pos);\n\n if (startChar !== '\\'' && startChar !== '\"') {\n return;\n }\n const length = input.length;\n const currentPosition = pos;\n\n for (let i = 1; i + currentPosition < length; i++) {\n const nextChar = input.charAt(i + currentPosition);\n switch (nextChar) {\n case '\\\\':\n i++;\n continue;\n case '\\r':\n case '\\n':\n break;\n case startChar:\n const str = input.substr(currentPosition, i + 1);\n if (!loc && loc !== 0) {\n skipWhitespace(i + 1);\n return str\n }\n return [startChar, str];\n default:\n }\n }\n return null;\n };\n\n /**\n * Permissive parsing. Ignores everything except matching {} [] () and quotes\n * until matching token (outside of blocks)\n */\n parserInput.$parseUntil = tok => {\n let quote = '';\n let returnVal = null;\n let inComment = false;\n let blockDepth = 0;\n const blockStack = [];\n const parseGroups = [];\n const length = input.length;\n const startPos = parserInput.i;\n let lastPos = parserInput.i;\n let i = parserInput.i;\n let loop = true;\n let testChar;\n\n if (typeof tok === 'string') {\n testChar = char => char === tok\n } else {\n testChar = char => tok.test(char)\n }\n\n do {\n let prevChar;\n let nextChar = input.charAt(i);\n if (blockDepth === 0 && testChar(nextChar)) {\n returnVal = input.substr(lastPos, i - lastPos);\n if (returnVal) {\n parseGroups.push(returnVal);\n }\n else {\n parseGroups.push(' ');\n }\n returnVal = parseGroups;\n skipWhitespace(i - startPos);\n loop = false\n } else {\n if (inComment) {\n if (nextChar === '*' && \n input.charAt(i + 1) === '/') {\n i++;\n blockDepth--;\n inComment = false;\n }\n i++;\n continue;\n }\n switch (nextChar) {\n case '\\\\':\n i++;\n nextChar = input.charAt(i);\n parseGroups.push(input.substr(lastPos, i - lastPos + 1));\n lastPos = i + 1;\n break;\n case '/':\n if (input.charAt(i + 1) === '*') {\n i++;\n inComment = true;\n blockDepth++;\n }\n break;\n case '\\'':\n case '\"':\n quote = parserInput.$quoted(i);\n if (quote) {\n parseGroups.push(input.substr(lastPos, i - lastPos), quote);\n i += quote[1].length - 1;\n lastPos = i + 1;\n }\n else {\n skipWhitespace(i - startPos);\n returnVal = nextChar;\n loop = false;\n }\n break;\n case '{':\n blockStack.push('}');\n blockDepth++;\n break;\n case '(':\n blockStack.push(')');\n blockDepth++;\n break;\n case '[':\n blockStack.push(']');\n blockDepth++;\n break;\n case '}':\n case ')':\n case ']':\n const expected = blockStack.pop();\n if (nextChar === expected) {\n blockDepth--;\n } else {\n // move the parser to the error and return expected\n skipWhitespace(i - startPos);\n returnVal = expected;\n loop = false;\n }\n }\n i++;\n if (i > length) {\n loop = false;\n }\n }\n prevChar = nextChar;\n } while (loop);\n\n return returnVal ? returnVal : null;\n }\n\n parserInput.autoCommentAbsorb = true;\n parserInput.commentStore = [];\n parserInput.finished = false;\n\n // Same as $(), but don't change the state of the parser,\n // just return the match.\n parserInput.peek = tok => {\n if (typeof tok === 'string') {\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tok.length; i++) {\n if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n return false;\n }\n }\n return true;\n } else {\n return tok.test(current);\n }\n };\n\n // Specialization of peek()\n // TODO remove or change some currentChar calls to peekChar\n parserInput.peekChar = tok => input.charAt(parserInput.i) === tok;\n\n parserInput.currentChar = () => input.charAt(parserInput.i);\n\n parserInput.prevChar = () => input.charAt(parserInput.i - 1);\n\n parserInput.getInput = () => input;\n\n parserInput.peekNotNumeric = () => {\n const c = input.charCodeAt(parserInput.i);\n // Is the first char of the dimension 0-9, '.', '+' or '-'\n return (c > CHARCODE_9 || c < CHARCODE_PLUS) || c === CHARCODE_FORWARD_SLASH || c === CHARCODE_COMMA;\n };\n\n parserInput.start = (str, chunkInput, failFunction) => {\n input = str;\n parserInput.i = j = currentPos = furthest = 0;\n\n // chunking apparently makes things quicker (but my tests indicate\n // it might actually make things slower in node at least)\n // and it is a non-perfect parse - it can't recognise\n // unquoted urls, meaning it can't distinguish comments\n // meaning comments with quotes or {}() in them get 'counted'\n // and then lead to parse errors.\n // In addition if the chunking chunks in the wrong place we might\n // not be able to parse a parser statement in one go\n // this is officially deprecated but can be switched on via an option\n // in the case it causes too much performance issues.\n if (chunkInput) {\n chunks = chunker(str, failFunction);\n } else {\n chunks = [str];\n }\n\n current = chunks[0];\n\n skipWhitespace(0);\n };\n\n parserInput.end = () => {\n let message;\n const isFinished = parserInput.i >= input.length;\n\n if (parserInput.i < furthest) {\n message = furthestPossibleErrorMessage;\n parserInput.i = furthest;\n }\n return {\n isFinished,\n furthest: parserInput.i,\n furthestPossibleErrorMessage: message,\n furthestReachedEnd: parserInput.i >= input.length - 1,\n furthestChar: input[parserInput.i]\n };\n };\n\n return parserInput;\n};\n","// Split the input into chunks.\nexport default function (input, fail) {\n const len = input.length;\n let level = 0;\n let parenLevel = 0;\n let lastOpening;\n let lastOpeningParen;\n let lastMultiComment;\n let lastMultiCommentEndBrace;\n const chunks = [];\n let emitFrom = 0;\n let chunkerCurrentIndex;\n let currentChunkStartIndex;\n let cc;\n let cc2;\n let matched;\n\n function emitChunk(force) {\n const len = chunkerCurrentIndex - emitFrom;\n if (((len < 512) && !force) || !len) {\n return;\n }\n chunks.push(input.slice(emitFrom, chunkerCurrentIndex + 1));\n emitFrom = chunkerCurrentIndex + 1;\n }\n\n for (chunkerCurrentIndex = 0; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc = input.charCodeAt(chunkerCurrentIndex);\n if (((cc >= 97) && (cc <= 122)) || (cc < 34)) {\n // a-z or whitespace\n continue;\n }\n\n switch (cc) {\n case 40: // (\n parenLevel++;\n lastOpeningParen = chunkerCurrentIndex;\n continue;\n case 41: // )\n if (--parenLevel < 0) {\n return fail('missing opening `(`', chunkerCurrentIndex);\n }\n continue;\n case 59: // ;\n if (!parenLevel) { emitChunk(); }\n continue;\n case 123: // {\n level++;\n lastOpening = chunkerCurrentIndex;\n continue;\n case 125: // }\n if (--level < 0) {\n return fail('missing opening `{`', chunkerCurrentIndex);\n }\n if (!level && !parenLevel) { emitChunk(); }\n continue;\n case 92: // \\\n if (chunkerCurrentIndex < len - 1) { chunkerCurrentIndex++; continue; }\n return fail('unescaped `\\\\`', chunkerCurrentIndex);\n case 34:\n case 39:\n case 96: // \", ' and `\n matched = 0;\n currentChunkStartIndex = chunkerCurrentIndex;\n for (chunkerCurrentIndex = chunkerCurrentIndex + 1; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if (cc2 > 96) { continue; }\n if (cc2 == cc) { matched = 1; break; }\n if (cc2 == 92) { // \\\n if (chunkerCurrentIndex == len - 1) {\n return fail('unescaped `\\\\`', chunkerCurrentIndex);\n }\n chunkerCurrentIndex++;\n }\n }\n if (matched) { continue; }\n return fail(`unmatched \\`${String.fromCharCode(cc)}\\``, currentChunkStartIndex);\n case 47: // /, check for comment\n if (parenLevel || (chunkerCurrentIndex == len - 1)) { continue; }\n cc2 = input.charCodeAt(chunkerCurrentIndex + 1);\n if (cc2 == 47) {\n // //, find lnfeed\n for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if ((cc2 <= 13) && ((cc2 == 10) || (cc2 == 13))) { break; }\n }\n } else if (cc2 == 42) {\n // /*, find */\n lastMultiComment = currentChunkStartIndex = chunkerCurrentIndex;\n for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len - 1; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if (cc2 == 125) { lastMultiCommentEndBrace = chunkerCurrentIndex; }\n if (cc2 != 42) { continue; }\n if (input.charCodeAt(chunkerCurrentIndex + 1) == 47) { break; }\n }\n if (chunkerCurrentIndex == len - 1) {\n return fail('missing closing `*/`', currentChunkStartIndex);\n }\n chunkerCurrentIndex++;\n }\n continue;\n case 42: // *, check for unmatched */\n if ((chunkerCurrentIndex < len - 1) && (input.charCodeAt(chunkerCurrentIndex + 1) == 47)) {\n return fail('unmatched `/*`', chunkerCurrentIndex);\n }\n continue;\n }\n }\n\n if (level !== 0) {\n if ((lastMultiComment > lastOpening) && (lastMultiCommentEndBrace > lastMultiComment)) {\n return fail('missing closing `}` or `*/`', lastOpening);\n } else {\n return fail('missing closing `}`', lastOpening);\n }\n } else if (parenLevel !== 0) {\n return fail('missing closing `)`', lastOpeningParen);\n }\n\n emitChunk(true);\n return chunks;\n};\n","import LessError from '../less-error';\nimport tree from '../tree';\nimport visitors from '../visitors';\nimport getParserInput from './parser-input';\nimport * as utils from '../utils';\nimport functionRegistry from '../functions/function-registry';\n\n//\n// less.js - parser\n//\n// A relatively straight-forward predictive parser.\n// There is no tokenization/lexing stage, the input is parsed\n// in one sweep.\n//\n// To make the parser fast enough to run in the browser, several\n// optimization had to be made:\n//\n// - Matching and slicing on a huge input is often cause of slowdowns.\n// The solution is to chunkify the input into smaller strings.\n// The chunks are stored in the `chunks` var,\n// `j` holds the current chunk index, and `currentPos` holds\n// the index of the current chunk in relation to `input`.\n// This gives us an almost 4x speed-up.\n//\n// - In many cases, we don't need to match individual tokens;\n// for example, if a value doesn't hold any variables, operations\n// or dynamic references, the parser can effectively 'skip' it,\n// treating it as a literal.\n// An example would be '1px solid #000' - which evaluates to itself,\n// we don't need to know what the individual components are.\n// The drawback, of course is that you don't get the benefits of\n// syntax-checking on the CSS. This gives us a 50% speed-up in the parser,\n// and a smaller speed-up in the code-gen.\n//\n//\n// Token matching is done with the `$` function, which either takes\n// a terminal string or regexp, or a non-terminal function to call.\n// It also takes care of moving all the indices forwards.\n//\n\nconst Parser = function Parser(context, imports, fileInfo) {\n let parsers;\n const parserInput = getParserInput();\n\n function error(msg, type) {\n throw new LessError(\n {\n index: parserInput.i,\n filename: fileInfo.filename,\n type: type || 'Syntax',\n message: msg\n },\n imports\n );\n }\n\n function expect(arg, msg) {\n // some older browsers return typeof 'function' for RegExp\n const result = (arg instanceof Function) ? arg.call(parsers) : parserInput.$re(arg);\n if (result) {\n return result;\n }\n \n error(msg || (typeof arg === 'string'\n ? `expected '${arg}' got '${parserInput.currentChar()}'`\n : 'unexpected token'));\n }\n\n // Specialization of expect()\n function expectChar(arg, msg) {\n if (parserInput.$char(arg)) {\n return arg;\n }\n error(msg || `expected '${arg}' got '${parserInput.currentChar()}'`);\n }\n\n function getDebugInfo(index) {\n const filename = fileInfo.filename;\n\n return {\n lineNumber: utils.getLocation(index, parserInput.getInput()).line + 1,\n fileName: filename\n };\n }\n\n /**\n * Used after initial parsing to create nodes on the fly\n * \n * @param {String} str - string to parse \n * @param {Array} parseList - array of parsers to run input through e.g. [\"value\", \"important\"]\n * @param {Number} currentIndex - start number to begin indexing\n * @param {Object} fileInfo - fileInfo to attach to created nodes\n */\n function parseNode(str, parseList, currentIndex, fileInfo, callback) {\n let result;\n const returnNodes = [];\n const parser = parserInput;\n\n try {\n parser.start(str, false, function fail(msg, index) {\n callback({\n message: msg,\n index: index + currentIndex\n });\n });\n for (let x = 0, p, i; (p = parseList[x]); x++) {\n i = parser.i;\n result = parsers[p]();\n if (result) {\n try {\n result._index = i + currentIndex;\n result._fileInfo = fileInfo;\n } catch (e) {}\n returnNodes.push(result);\n }\n else {\n returnNodes.push(null);\n }\n }\n\n const endInfo = parser.end();\n if (endInfo.isFinished) {\n callback(null, returnNodes);\n }\n else {\n callback(true, null);\n }\n } catch (e) {\n throw new LessError({\n index: e.index + currentIndex,\n message: e.message\n }, imports, fileInfo.filename);\n }\n }\n\n //\n // The Parser\n //\n return {\n parserInput,\n imports,\n fileInfo,\n parseNode,\n //\n // Parse an input string into an abstract syntax tree,\n // @param str A string containing 'less' markup\n // @param callback call `callback` when done.\n // @param [additionalData] An optional map which can contains vars - a map (key, value) of variables to apply\n //\n parse: function (str, callback, additionalData) {\n let root;\n let error = null;\n let globalVars;\n let modifyVars;\n let ignored;\n let preText = '';\n\n globalVars = (additionalData && additionalData.globalVars) ? `${Parser.serializeVars(additionalData.globalVars)}\\n` : '';\n modifyVars = (additionalData && additionalData.modifyVars) ? `\\n${Parser.serializeVars(additionalData.modifyVars)}` : '';\n\n if (context.pluginManager) {\n const preProcessors = context.pluginManager.getPreProcessors();\n for (let i = 0; i < preProcessors.length; i++) {\n str = preProcessors[i].process(str, { context, imports, fileInfo });\n }\n }\n\n if (globalVars || (additionalData && additionalData.banner)) {\n preText = ((additionalData && additionalData.banner) ? additionalData.banner : '') + globalVars;\n ignored = imports.contentsIgnoredChars;\n ignored[fileInfo.filename] = ignored[fileInfo.filename] || 0;\n ignored[fileInfo.filename] += preText.length;\n }\n\n str = str.replace(/\\r\\n?/g, '\\n');\n // Remove potential UTF Byte Order Mark\n str = preText + str.replace(/^\\uFEFF/, '') + modifyVars;\n imports.contents[fileInfo.filename] = str;\n\n // Start with the primary rule.\n // The whole syntax tree is held under a Ruleset node,\n // with the `root` property set to true, so no `{}` are\n // output. The callback is called when the input is parsed.\n try {\n parserInput.start(str, context.chunkInput, function fail(msg, index) {\n throw new LessError({\n index,\n type: 'Parse',\n message: msg,\n filename: fileInfo.filename\n }, imports);\n });\n\n tree.Node.prototype.parse = this;\n root = new tree.Ruleset(null, this.parsers.primary());\n tree.Node.prototype.rootNode = root;\n root.root = true;\n root.firstRoot = true;\n root.functionRegistry = functionRegistry.inherit();\n \n } catch (e) {\n return callback(new LessError(e, imports, fileInfo.filename));\n }\n\n // If `i` is smaller than the `input.length - 1`,\n // it means the parser wasn't able to parse the whole\n // string, so we've got a parsing error.\n //\n // We try to extract a \\n delimited string,\n // showing the line where the parse error occurred.\n // We split it up into two parts (the part which parsed,\n // and the part which didn't), so we can color them differently.\n const endInfo = parserInput.end();\n if (!endInfo.isFinished) {\n\n let message = endInfo.furthestPossibleErrorMessage;\n\n if (!message) {\n message = 'Unrecognised input';\n if (endInfo.furthestChar === '}') {\n message += '. Possibly missing opening \\'{\\'';\n } else if (endInfo.furthestChar === ')') {\n message += '. Possibly missing opening \\'(\\'';\n } else if (endInfo.furthestReachedEnd) {\n message += '. Possibly missing something';\n }\n }\n\n error = new LessError({\n type: 'Parse',\n message,\n index: endInfo.furthest,\n filename: fileInfo.filename\n }, imports);\n }\n\n const finish = e => {\n e = error || e || imports.error;\n\n if (e) {\n if (!(e instanceof LessError)) {\n e = new LessError(e, imports, fileInfo.filename);\n }\n\n return callback(e);\n }\n else {\n return callback(null, root);\n }\n };\n\n if (context.processImports !== false) {\n new visitors.ImportVisitor(imports, finish)\n .run(root);\n } else {\n return finish();\n }\n },\n\n //\n // Here in, the parsing rules/functions\n //\n // The basic structure of the syntax tree generated is as follows:\n //\n // Ruleset -> Declaration -> Value -> Expression -> Entity\n //\n // Here's some Less code:\n //\n // .class {\n // color: #fff;\n // border: 1px solid #000;\n // width: @w + 4px;\n // > .child {...}\n // }\n //\n // And here's what the parse tree might look like:\n //\n // Ruleset (Selector '.class', [\n // Declaration (\"color\", Value ([Expression [Color #fff]]))\n // Declaration (\"border\", Value ([Expression [Dimension 1px][Keyword \"solid\"][Color #000]]))\n // Declaration (\"width\", Value ([Expression [Operation \" + \" [Variable \"@w\"][Dimension 4px]]]))\n // Ruleset (Selector [Element '>', '.child'], [...])\n // ])\n //\n // In general, most rules will try to parse a token with the `$re()` function, and if the return\n // value is truly, will return a new node, of the relevant type. Sometimes, we need to check\n // first, before parsing, that's when we use `peek()`.\n //\n parsers: parsers = {\n //\n // The `primary` rule is the *entry* and *exit* point of the parser.\n // The rules here can appear at any level of the parse tree.\n //\n // The recursive nature of the grammar is an interplay between the `block`\n // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule,\n // as represented by this simplified grammar:\n //\n // primary → (ruleset | declaration)+\n // ruleset → selector+ block\n // block → '{' primary '}'\n //\n // Only at one point is the primary rule not called from the\n // block rule: at the root level.\n //\n primary: function () {\n const mixin = this.mixin;\n let root = [];\n let node;\n\n while (true) {\n while (true) {\n node = this.comment();\n if (!node) { break; }\n root.push(node);\n }\n // always process comments before deciding if finished\n if (parserInput.finished) {\n break;\n }\n if (parserInput.peek('}')) {\n break;\n }\n\n node = this.extendRule();\n if (node) {\n root = root.concat(node);\n continue;\n }\n\n node = mixin.definition() || this.declaration() || mixin.call(false, false) || \n this.ruleset() || this.variableCall() || this.entities.call() || this.atrule();\n if (node) {\n root.push(node);\n } else {\n let foundSemiColon = false;\n while (parserInput.$char(';')) {\n foundSemiColon = true;\n }\n if (!foundSemiColon) {\n break;\n }\n }\n }\n\n return root;\n },\n\n // comments are collected by the main parsing mechanism and then assigned to nodes\n // where the current structure allows it\n comment: function () {\n if (parserInput.commentStore.length) {\n const comment = parserInput.commentStore.shift();\n return new(tree.Comment)(comment.text, comment.isLineComment, comment.index, fileInfo);\n }\n },\n\n //\n // Entities are tokens which can be found inside an Expression\n //\n entities: {\n mixinLookup: function() {\n return parsers.mixin.call(true, true);\n },\n //\n // A string, which supports escaping \" and '\n //\n // \"milky way\" 'he\\'s the one!'\n //\n quoted: function (forceEscaped) {\n let str;\n const index = parserInput.i;\n let isEscaped = false;\n\n parserInput.save();\n if (parserInput.$char('~')) {\n isEscaped = true;\n } else if (forceEscaped) {\n parserInput.restore();\n return;\n }\n\n str = parserInput.$quoted();\n if (!str) {\n parserInput.restore();\n return;\n }\n parserInput.forget();\n\n return new(tree.Quoted)(str.charAt(0), str.substr(1, str.length - 2), isEscaped, index, fileInfo);\n },\n\n //\n // A catch-all word, such as:\n //\n // black border-collapse\n //\n keyword: function () {\n const k = parserInput.$char('%') || parserInput.$re(/^\\[?(?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+\\]?/);\n if (k) {\n return tree.Color.fromKeyword(k) || new(tree.Keyword)(k);\n }\n },\n\n //\n // A function call\n //\n // rgb(255, 0, 255)\n //\n // The arguments are parsed with the `entities.arguments` parser.\n //\n call: function () {\n let name;\n let args;\n let func;\n const index = parserInput.i;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (parserInput.peek(/^url\\(/i)) {\n return;\n }\n\n parserInput.save();\n\n name = parserInput.$re(/^([\\w-]+|%|~|progid:[\\w\\.]+)\\(/);\n if (!name) {\n parserInput.forget(); \n return;\n }\n\n name = name[1];\n func = this.customFuncCall(name);\n if (func) {\n args = func.parse();\n if (args && func.stop) {\n parserInput.forget();\n return args;\n }\n }\n\n args = this.arguments(args);\n\n if (!parserInput.$char(')')) {\n parserInput.restore('Could not parse call arguments or missing \\')\\'');\n return;\n }\n\n parserInput.forget();\n\n return new(tree.Call)(name, args, index, fileInfo);\n },\n \n //\n // Parsing rules for functions with non-standard args, e.g.:\n //\n // boolean(not(2 > 1))\n //\n // This is a quick prototype, to be modified/improved when\n // more custom-parsed funcs come (e.g. `selector(...)`)\n //\n\n customFuncCall: function (name) {\n /* Ideally the table is to be moved out of here for faster perf.,\n but it's quite tricky since it relies on all these `parsers`\n and `expect` available only here */\n return {\n alpha: f(parsers.ieAlpha, true),\n boolean: f(condition),\n 'if': f(condition)\n }[name.toLowerCase()];\n\n function f(parse, stop) {\n return {\n parse, // parsing function\n stop // when true - stop after parse() and return its result, \n // otherwise continue for plain args\n };\n }\n \n function condition() {\n return [expect(parsers.condition, 'expected condition')];\n }\n },\n\n arguments: function (prevArgs) {\n let argsComma = prevArgs || [];\n const argsSemiColon = [];\n let isSemiColonSeparated;\n let value;\n\n parserInput.save();\n\n while (true) {\n if (prevArgs) {\n prevArgs = false;\n } else {\n value = parsers.detachedRuleset() || this.assignment() || parsers.expression();\n if (!value) {\n break;\n }\n\n if (value.value && value.value.length == 1) {\n value = value.value[0];\n }\n\n argsComma.push(value);\n }\n\n if (parserInput.$char(',')) {\n continue;\n }\n\n if (parserInput.$char(';') || isSemiColonSeparated) {\n isSemiColonSeparated = true;\n value = (argsComma.length < 1) ? argsComma[0]\n : new tree.Value(argsComma);\n argsSemiColon.push(value);\n argsComma = [];\n }\n }\n\n parserInput.forget();\n return isSemiColonSeparated ? argsSemiColon : argsComma;\n },\n literal: function () {\n return this.dimension() ||\n this.color() ||\n this.quoted() ||\n this.unicodeDescriptor();\n },\n\n // Assignments are argument entities for calls.\n // They are present in ie filter properties as shown below.\n //\n // filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* )\n //\n\n assignment: function () {\n let key;\n let value;\n parserInput.save();\n key = parserInput.$re(/^\\w+(?=\\s?=)/i);\n if (!key) {\n parserInput.restore();\n return;\n }\n if (!parserInput.$char('=')) {\n parserInput.restore();\n return;\n }\n value = parsers.entity();\n if (value) {\n parserInput.forget();\n return new(tree.Assignment)(key, value);\n } else {\n parserInput.restore();\n }\n },\n\n //\n // Parse url() tokens\n //\n // We use a specific rule for urls, because they don't really behave like\n // standard function calls. The difference is that the argument doesn't have\n // to be enclosed within a string, so it can't be parsed as an Expression.\n //\n url: function () {\n let value;\n const index = parserInput.i;\n\n parserInput.autoCommentAbsorb = false;\n\n if (!parserInput.$str('url(')) {\n parserInput.autoCommentAbsorb = true;\n return;\n }\n\n value = this.quoted() || this.variable() || this.property() ||\n parserInput.$re(/^(?:(?:\\\\[\\(\\)'\"])|[^\\(\\)'\"])+/) || '';\n\n parserInput.autoCommentAbsorb = true;\n\n expectChar(')');\n\n return new(tree.URL)((value.value != null || \n value instanceof tree.Variable || \n value instanceof tree.Property) ?\n value : new(tree.Anonymous)(value, index), index, fileInfo);\n },\n\n //\n // A Variable entity, such as `@fink`, in\n //\n // width: @fink + 2px\n //\n // We use a different parser for variable definitions,\n // see `parsers.variable`.\n //\n variable: function () {\n let ch;\n let name;\n const index = parserInput.i;\n\n parserInput.save();\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^@@?[\\w-]+/))) {\n ch = parserInput.currentChar();\n if (ch === '(' || ch === '[' && !parserInput.prevChar().match(/^\\s/)) {\n // this may be a VariableCall lookup\n const result = parsers.variableCall(name);\n if (result) {\n parserInput.forget();\n return result;\n }\n }\n parserInput.forget();\n return new(tree.Variable)(name, index, fileInfo);\n }\n parserInput.restore();\n },\n\n // A variable entity using the protective {} e.g. @{var}\n variableCurly: function () {\n let curly;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '@' && (curly = parserInput.$re(/^@\\{([\\w-]+)\\}/))) {\n return new(tree.Variable)(`@${curly[1]}`, index, fileInfo);\n }\n },\n //\n // A Property accessor, such as `$color`, in\n //\n // background-color: $color\n //\n property: function () {\n let name;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' && (name = parserInput.$re(/^\\$[\\w-]+/))) {\n return new(tree.Property)(name, index, fileInfo);\n }\n },\n\n // A property entity useing the protective {} e.g. ${prop}\n propertyCurly: function () {\n let curly;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' && (curly = parserInput.$re(/^\\$\\{([\\w-]+)\\}/))) {\n return new(tree.Property)(`$${curly[1]}`, index, fileInfo);\n }\n },\n //\n // A Hexadecimal color\n //\n // #4F3C2F\n //\n // `rgb` and `hsl` colors are parsed through the `entities.call` parser.\n //\n color: function () {\n let rgb;\n parserInput.save();\n\n if (parserInput.currentChar() === '#' && (rgb = parserInput.$re(/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})([\\w.#\\[])?/))) {\n if (!rgb[2]) {\n parserInput.forget();\n return new(tree.Color)(rgb[1], undefined, rgb[0]);\n } \n }\n parserInput.restore();\n },\n\n colorKeyword: function () {\n parserInput.save();\n const autoCommentAbsorb = parserInput.autoCommentAbsorb;\n parserInput.autoCommentAbsorb = false;\n const k = parserInput.$re(/^[_A-Za-z-][_A-Za-z0-9-]+/);\n parserInput.autoCommentAbsorb = autoCommentAbsorb;\n if (!k) {\n parserInput.forget();\n return;\n }\n parserInput.restore();\n const color = tree.Color.fromKeyword(k);\n if (color) {\n parserInput.$str(k);\n return color;\n }\n },\n\n //\n // A Dimension, that is, a number and a unit\n //\n // 0.5em 95%\n //\n dimension: function () {\n if (parserInput.peekNotNumeric()) {\n return;\n }\n\n const value = parserInput.$re(/^([+-]?\\d*\\.?\\d+)(%|[a-z_]+)?/i);\n if (value) {\n return new(tree.Dimension)(value[1], value[2]);\n }\n },\n\n //\n // A unicode descriptor, as is used in unicode-range\n //\n // U+0?? or U+00A1-00A9\n //\n unicodeDescriptor: function () {\n let ud;\n\n ud = parserInput.$re(/^U\\+[0-9a-fA-F?]+(\\-[0-9a-fA-F?]+)?/);\n if (ud) {\n return new(tree.UnicodeDescriptor)(ud[0]);\n }\n },\n\n //\n // JavaScript code to be evaluated\n //\n // `window.location.href`\n //\n javascript: function () {\n let js;\n const index = parserInput.i;\n\n parserInput.save();\n\n const escape = parserInput.$char('~');\n const jsQuote = parserInput.$char('`');\n\n if (!jsQuote) {\n parserInput.restore();\n return;\n }\n\n js = parserInput.$re(/^[^`]*`/);\n if (js) {\n parserInput.forget();\n return new(tree.JavaScript)(js.substr(0, js.length - 1), Boolean(escape), index, fileInfo);\n }\n parserInput.restore('invalid javascript definition');\n }\n },\n\n //\n // The variable part of a variable definition. Used in the `rule` parser\n //\n // @fink:\n //\n variable: function () {\n let name;\n\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^(@[\\w-]+)\\s*:/))) { return name[1]; }\n },\n\n //\n // Call a variable value to retrieve a detached ruleset\n // or a value from a detached ruleset's rules.\n //\n // @fink();\n // @fink;\n // color: @fink[@color];\n //\n variableCall: function (parsedName) {\n let lookups;\n const i = parserInput.i;\n const inValue = !!parsedName;\n let name = parsedName;\n\n parserInput.save();\n\n if (name || (parserInput.currentChar() === '@'\n && (name = parserInput.$re(/^(@[\\w-]+)(\\(\\s*\\))?/)))) {\n\n lookups = this.mixin.ruleLookups();\n\n if (!lookups && ((inValue && parserInput.$str('()') !== '()') || (name[2] !== '()'))) {\n parserInput.restore('Missing \\'[...]\\' lookup in variable call');\n return;\n }\n\n if (!inValue) {\n name = name[1];\n }\n\n const call = new tree.VariableCall(name, i, fileInfo);\n if (!inValue && parsers.end()) {\n parserInput.forget();\n return call;\n }\n else {\n parserInput.forget();\n return new tree.NamespaceValue(call, lookups, i, fileInfo);\n }\n }\n\n parserInput.restore();\n },\n\n //\n // extend syntax - used to extend selectors\n //\n extend: function(isRule) {\n let elements;\n let e;\n const index = parserInput.i;\n let option;\n let extendList;\n let extend;\n\n if (!parserInput.$str(isRule ? '&:extend(' : ':extend(')) {\n return;\n }\n\n do {\n option = null;\n elements = null;\n while (!(option = parserInput.$re(/^(all)(?=\\s*(\\)|,))/))) {\n e = this.element();\n if (!e) {\n break;\n }\n if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n }\n\n option = option && option[1];\n if (!elements) {\n error('Missing target selector for :extend().');\n }\n extend = new(tree.Extend)(new(tree.Selector)(elements), option, index, fileInfo);\n if (extendList) {\n extendList.push(extend);\n } else {\n extendList = [ extend ];\n }\n } while (parserInput.$char(','));\n\n expect(/^\\)/);\n\n if (isRule) {\n expect(/^;/);\n }\n\n return extendList;\n },\n\n //\n // extendRule - used in a rule to extend all the parent selectors\n //\n extendRule: function() {\n return this.extend(true);\n },\n\n //\n // Mixins\n //\n mixin: {\n //\n // A Mixin call, with an optional argument list\n //\n // #mixins > .square(#fff);\n // #mixins.square(#fff);\n // .rounded(4px, black);\n // .button;\n //\n // We can lookup / return a value using the lookup syntax:\n //\n // color: #mixin.square(#fff)[@color];\n //\n // The `while` loop is there because mixins can be\n // namespaced, but we only support the child and descendant\n // selector for now.\n //\n call: function (inValue, getLookup) {\n const s = parserInput.currentChar();\n let important = false;\n let lookups;\n const index = parserInput.i;\n let elements;\n let args;\n let hasParens;\n\n if (s !== '.' && s !== '#') { return; }\n\n parserInput.save(); // stop us absorbing part of an invalid selector\n\n elements = this.elements();\n\n if (elements) {\n if (parserInput.$char('(')) {\n args = this.args(true).args;\n expectChar(')');\n hasParens = true;\n }\n\n if (getLookup !== false) {\n lookups = this.ruleLookups();\n }\n if (getLookup === true && !lookups) {\n parserInput.restore();\n return;\n }\n\n if (!lookups && !hasParens) {\n // This isn't a valid mixin call\n parserInput.restore('Unrecognized input. Possibly missing \\'(\\' in mixin call.');\n return;\n }\n\n if (!inValue && parsers.important()) {\n important = true;\n }\n\n if (inValue || parsers.end()) {\n parserInput.forget();\n const mixin = new(tree.mixin.Call)(elements, args, index, fileInfo, !lookups && important);\n if (lookups) {\n return new tree.NamespaceValue(mixin, lookups);\n }\n else {\n return mixin;\n }\n }\n }\n\n parserInput.restore();\n },\n /**\n * Matching elements for mixins\n * (Start with . or # and can have > )\n */\n elements: function() {\n let elements;\n let e;\n let c;\n let elem;\n let elemIndex;\n const re = /^[#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/;\n while (true) {\n elemIndex = parserInput.i;\n e = parserInput.$re(re);\n \n if (!e) {\n break;\n }\n elem = new(tree.Element)(c, e, false, elemIndex, fileInfo);\n if (elements) {\n elements.push(elem);\n } else {\n elements = [ elem ];\n }\n c = parserInput.$char('>');\n }\n return elements;\n },\n args: function (isCall) {\n const entities = parsers.entities;\n const returner = { args:null, variadic: false };\n let expressions = [];\n const argsSemiColon = [];\n const argsComma = [];\n let isSemiColonSeparated;\n let expressionContainsNamed;\n let name;\n let nameLoop;\n let value;\n let arg;\n let expand;\n let hasSep = true;\n\n parserInput.save();\n\n while (true) {\n if (isCall) {\n arg = parsers.detachedRuleset() || parsers.expression();\n } else {\n parserInput.commentStore.length = 0;\n if (parserInput.$str('...')) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ variadic: true });\n break;\n }\n arg = entities.variable() || entities.property() || entities.literal() || entities.keyword() || this.call(true);\n }\n\n if (!arg || !hasSep) {\n break;\n }\n\n nameLoop = null;\n if (arg.throwAwayComments) {\n arg.throwAwayComments();\n }\n value = arg;\n let val = null;\n\n if (isCall) {\n // Variable\n if (arg.value && arg.value.length == 1) {\n val = arg.value[0];\n }\n } else {\n val = arg;\n }\n\n if (val && (val instanceof tree.Variable || val instanceof tree.Property)) {\n if (parserInput.$char(':')) {\n if (expressions.length > 0) {\n if (isSemiColonSeparated) {\n error('Cannot mix ; and , as delimiter types');\n }\n expressionContainsNamed = true;\n }\n\n value = parsers.detachedRuleset() || parsers.expression();\n\n if (!value) {\n if (isCall) {\n error('could not understand value for named argument');\n } else {\n parserInput.restore();\n returner.args = [];\n return returner;\n }\n }\n nameLoop = (name = val.name);\n } else if (parserInput.$str('...')) {\n if (!isCall) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ name: arg.name, variadic: true });\n break;\n } else {\n expand = true;\n }\n } else if (!isCall) {\n name = nameLoop = val.name;\n value = null;\n }\n }\n\n if (value) {\n expressions.push(value);\n }\n\n argsComma.push({ name:nameLoop, value, expand });\n\n if (parserInput.$char(',')) {\n hasSep = true;\n continue;\n }\n hasSep = parserInput.$char(';') === ';';\n\n if (hasSep || isSemiColonSeparated) {\n\n if (expressionContainsNamed) {\n error('Cannot mix ; and , as delimiter types');\n }\n\n isSemiColonSeparated = true;\n\n if (expressions.length > 1) {\n value = new(tree.Value)(expressions);\n }\n argsSemiColon.push({ name, value, expand });\n\n name = null;\n expressions = [];\n expressionContainsNamed = false;\n }\n }\n\n parserInput.forget();\n returner.args = isSemiColonSeparated ? argsSemiColon : argsComma;\n return returner;\n },\n //\n // A Mixin definition, with a list of parameters\n //\n // .rounded (@radius: 2px, @color) {\n // ...\n // }\n //\n // Until we have a finer grained state-machine, we have to\n // do a look-ahead, to make sure we don't have a mixin call.\n // See the `rule` function for more information.\n //\n // We start by matching `.rounded (`, and then proceed on to\n // the argument list, which has optional default values.\n // We store the parameters in `params`, with a `value` key,\n // if there is a value, such as in the case of `@radius`.\n //\n // Once we've got our params list, and a closing `)`, we parse\n // the `{...}` block.\n //\n definition: function () {\n let name;\n let params = [];\n let match;\n let ruleset;\n let cond;\n let variadic = false;\n if ((parserInput.currentChar() !== '.' && parserInput.currentChar() !== '#') ||\n parserInput.peek(/^[^{]*\\}/)) {\n return;\n }\n\n parserInput.save();\n\n match = parserInput.$re(/^([#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\\s*\\(/);\n if (match) {\n name = match[1];\n\n const argInfo = this.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n\n // .mixincall(\"@{a}\");\n // looks a bit like a mixin definition..\n // also\n // .mixincall(@a: {rule: set;});\n // so we have to be nice and restore\n if (!parserInput.$char(')')) {\n parserInput.restore('Missing closing \\')\\'');\n return;\n }\n\n parserInput.commentStore.length = 0;\n\n if (parserInput.$str('when')) { // Guard\n cond = expect(parsers.conditions, 'expected condition');\n }\n\n ruleset = parsers.block();\n\n if (ruleset) {\n parserInput.forget();\n return new(tree.mixin.Definition)(name, params, ruleset, cond, variadic);\n } else {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n }\n },\n \n ruleLookups: function() {\n let rule;\n let args;\n const lookups = [];\n\n if (parserInput.currentChar() !== '[') { \n return;\n }\n\n while (true) {\n parserInput.save();\n args = null;\n rule = this.lookupValue();\n if (!rule && rule !== '') {\n parserInput.restore();\n break;\n }\n lookups.push(rule);\n parserInput.forget();\n }\n if (lookups.length > 0) {\n return lookups;\n }\n },\n \n lookupValue: function() {\n parserInput.save();\n \n if (!parserInput.$char('[')) { \n parserInput.restore();\n return;\n }\n \n const name = parserInput.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);\n \n if (!parserInput.$char(']')) {\n parserInput.restore();\n return;\n } \n\n if (name || name === '') {\n parserInput.forget();\n return name;\n }\n \n parserInput.restore();\n }\n },\n //\n // Entities are the smallest recognized token,\n // and can be found inside a rule's value.\n //\n entity: function () {\n const entities = this.entities;\n\n return this.comment() || entities.literal() || entities.variable() || entities.url() ||\n entities.property() || entities.call() || entities.keyword() || this.mixin.call(true) ||\n entities.javascript();\n },\n\n //\n // A Declaration terminator. Note that we use `peek()` to check for '}',\n // because the `block` rule will be expecting it, but we still need to make sure\n // it's there, if ';' was omitted.\n //\n end: function () {\n return parserInput.$char(';') || parserInput.peek('}');\n },\n\n //\n // IE's alpha function\n //\n // alpha(opacity=88)\n //\n ieAlpha: function () {\n let value;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (!parserInput.$re(/^opacity=/i)) { return; }\n value = parserInput.$re(/^\\d+/);\n if (!value) {\n value = expect(parsers.entities.variable, 'Could not parse alpha');\n value = `@{${value.name.slice(1)}}`;\n }\n expectChar(')');\n return new tree.Quoted('', `alpha(opacity=${value})`);\n },\n\n //\n // A Selector Element\n //\n // div\n // + h1\n // #socks\n // input[type=\"text\"]\n //\n // Elements are the building blocks for Selectors,\n // they are made out of a `Combinator` (see combinator rule),\n // and an element name, such as a tag a class, or `*`.\n //\n element: function () {\n let e;\n let c;\n let v;\n const index = parserInput.i;\n\n c = this.combinator();\n\n e = parserInput.$re(/^(?:\\d+\\.\\d+|\\d+)%/) ||\n parserInput.$re(/^(?:[.#]?|:*)(?:[\\w-]|[^\\x00-\\x9f]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/) ||\n parserInput.$char('*') || parserInput.$char('&') || this.attribute() ||\n parserInput.$re(/^\\([^&()@]+\\)/) || parserInput.$re(/^[\\.#:](?=@)/) ||\n this.entities.variableCurly();\n\n if (!e) {\n parserInput.save();\n if (parserInput.$char('(')) {\n if ((v = this.selector(false)) && parserInput.$char(')')) {\n e = new(tree.Paren)(v);\n parserInput.forget();\n } else {\n parserInput.restore('Missing closing \\')\\'');\n }\n } else {\n parserInput.forget();\n }\n }\n\n if (e) { return new(tree.Element)(c, e, e instanceof tree.Variable, index, fileInfo); }\n },\n\n //\n // Combinators combine elements together, in a Selector.\n //\n // Because our parser isn't white-space sensitive, special care\n // has to be taken, when parsing the descendant combinator, ` `,\n // as it's an empty space. We have to check the previous character\n // in the input, to see if it's a ` ` character. More info on how\n // we deal with this in *combinator.js*.\n //\n combinator: function () {\n let c = parserInput.currentChar();\n\n if (c === '/') {\n parserInput.save();\n const slashedCombinator = parserInput.$re(/^\\/[a-z]+\\//i);\n if (slashedCombinator) {\n parserInput.forget();\n return new(tree.Combinator)(slashedCombinator);\n }\n parserInput.restore();\n }\n\n if (c === '>' || c === '+' || c === '~' || c === '|' || c === '^') {\n parserInput.i++;\n if (c === '^' && parserInput.currentChar() === '^') {\n c = '^^';\n parserInput.i++;\n }\n while (parserInput.isWhitespace()) { parserInput.i++; }\n return new(tree.Combinator)(c);\n } else if (parserInput.isWhitespace(-1)) {\n return new(tree.Combinator)(' ');\n } else {\n return new(tree.Combinator)(null);\n }\n },\n //\n // A CSS Selector\n // with less extensions e.g. the ability to extend and guard\n //\n // .class > div + h1\n // li a:hover\n //\n // Selectors are made out of one or more Elements, see above.\n //\n selector: function (isLess) {\n const index = parserInput.i;\n let elements;\n let extendList;\n let c;\n let e;\n let allExtends;\n let when;\n let condition;\n isLess = isLess !== false;\n while ((isLess && (extendList = this.extend())) || (isLess && (when = parserInput.$str('when'))) || (e = this.element())) {\n if (when) {\n condition = expect(this.conditions, 'expected condition');\n } else if (condition) {\n error('CSS guard can only be used at the end of selector');\n } else if (extendList) {\n if (allExtends) {\n allExtends = allExtends.concat(extendList);\n } else {\n allExtends = extendList;\n }\n } else {\n if (allExtends) { error('Extend can only be used at the end of selector'); }\n c = parserInput.currentChar();\n if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n e = null;\n }\n if (c === '{' || c === '}' || c === ';' || c === ',' || c === ')') {\n break;\n }\n }\n\n if (elements) { return new(tree.Selector)(elements, allExtends, condition, index, fileInfo); }\n if (allExtends) { error('Extend must be used to extend a selector, it cannot be used on its own'); }\n },\n selectors: function () {\n let s;\n let selectors;\n while (true) {\n s = this.selector();\n if (!s) {\n break;\n }\n if (selectors) {\n selectors.push(s);\n } else {\n selectors = [ s ];\n }\n parserInput.commentStore.length = 0;\n if (s.condition && selectors.length > 1) {\n error(\"Guards are only currently allowed on a single selector.\");\n }\n if (!parserInput.$char(',')) { break; }\n if (s.condition) {\n error(\"Guards are only currently allowed on a single selector.\");\n }\n parserInput.commentStore.length = 0;\n }\n return selectors;\n },\n attribute: function () {\n if (!parserInput.$char('[')) { return; }\n\n const entities = this.entities;\n let key;\n let val;\n let op;\n\n if (!(key = entities.variableCurly())) {\n key = expect(/^(?:[_A-Za-z0-9-\\*]*\\|)?(?:[_A-Za-z0-9-]|\\\\.)+/);\n }\n\n op = parserInput.$re(/^[|~*$^]?=/);\n if (op) {\n val = entities.quoted() || parserInput.$re(/^[0-9]+%/) || parserInput.$re(/^[\\w-]+/) || entities.variableCurly();\n }\n\n expectChar(']');\n\n return new(tree.Attribute)(key, op, val);\n },\n\n //\n // The `block` rule is used by `ruleset` and `mixin.definition`.\n // It's a wrapper around the `primary` rule, with added `{}`.\n //\n block: function () {\n let content;\n if (parserInput.$char('{') && (content = this.primary()) && parserInput.$char('}')) {\n return content;\n }\n },\n\n blockRuleset: function() {\n let block = this.block();\n\n if (block) {\n block = new tree.Ruleset(null, block);\n }\n return block;\n },\n\n detachedRuleset: function() {\n let argInfo;\n let params;\n let variadic;\n\n parserInput.save();\n if (parserInput.$re(/^[.#]\\(/)) {\n /**\n * DR args currently only implemented for each() function, and not \n * yet settable as `@dr: #(@arg) {}`\n * This should be done when DRs are merged with mixins.\n * See: https://github.com/less/less-meta/issues/16\n */\n argInfo = this.mixin.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n if (!parserInput.$char(')')) {\n parserInput.restore();\n return;\n }\n }\n const blockRuleset = this.blockRuleset();\n if (blockRuleset) {\n parserInput.forget();\n if (params) {\n return new tree.mixin.Definition(null, params, blockRuleset, null, variadic);\n }\n return new tree.DetachedRuleset(blockRuleset);\n }\n parserInput.restore();\n },\n\n //\n // div, .class, body > p {...}\n //\n ruleset: function () {\n let selectors;\n let rules;\n let debugInfo;\n\n parserInput.save();\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(parserInput.i);\n }\n\n selectors = this.selectors();\n\n if (selectors && (rules = this.block())) {\n parserInput.forget();\n const ruleset = new(tree.Ruleset)(selectors, rules, context.strictImports);\n if (context.dumpLineNumbers) {\n ruleset.debugInfo = debugInfo;\n }\n return ruleset;\n } else {\n parserInput.restore();\n }\n },\n declaration: function () {\n let name;\n let value;\n const index = parserInput.i;\n let hasDR;\n const c = parserInput.currentChar();\n let important;\n let merge;\n let isVariable;\n\n if (c === '.' || c === '#' || c === '&' || c === ':') { return; }\n\n parserInput.save();\n\n name = this.variable() || this.ruleProperty();\n if (name) {\n isVariable = typeof name === 'string';\n\n if (isVariable) {\n value = this.detachedRuleset();\n if (value) {\n hasDR = true;\n }\n }\n\n parserInput.commentStore.length = 0;\n if (!value) {\n // a name returned by this.ruleProperty() is always an array of the form:\n // [string-1, ..., string-n, \"\"] or [string-1, ..., string-n, \"+\"]\n // where each item is a tree.Keyword or tree.Variable\n merge = !isVariable && name.length > 1 && name.pop().value;\n\n // Custom property values get permissive parsing\n if (name[0].value && name[0].value.slice(0, 2) === '--') {\n value = this.permissiveValue();\n }\n // Try to store values as anonymous\n // If we need the value later we'll re-parse it in ruleset.parseValue\n else {\n value = this.anonymousValue();\n }\n if (value) {\n parserInput.forget();\n // anonymous values absorb the end ';' which is required for them to work\n return new(tree.Declaration)(name, value, false, merge, index, fileInfo);\n }\n\n if (!value) {\n value = this.value();\n }\n\n if (value) {\n important = this.important();\n } else if (isVariable) {\n // As a last resort, try permissiveValue\n value = this.permissiveValue();\n }\n }\n\n if (value && (this.end() || hasDR)) {\n parserInput.forget();\n return new(tree.Declaration)(name, value, important, merge, index, fileInfo);\n }\n else {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n }\n },\n anonymousValue: function () {\n const index = parserInput.i;\n const match = parserInput.$re(/^([^.#@\\$+\\/'\"*`(;{}-]*);/);\n if (match) {\n return new(tree.Anonymous)(match[1], index);\n }\n },\n /**\n * Used for custom properties, at-rules, and variables (as fallback)\n * Parses almost anything inside of {} [] () \"\" blocks\n * until it reaches outer-most tokens.\n * \n * First, it will try to parse comments and entities to reach\n * the end. This is mostly like the Expression parser except no\n * math is allowed.\n */\n permissiveValue: function (untilTokens) {\n let i;\n let e;\n let done;\n let value;\n const tok = untilTokens || ';';\n const index = parserInput.i;\n const result = [];\n\n function testCurrentChar() {\n const char = parserInput.currentChar();\n if (typeof tok === 'string') {\n return char === tok;\n } else {\n return tok.test(char);\n }\n }\n if (testCurrentChar()) {\n return;\n }\n value = [];\n do {\n e = this.comment();\n if (e) {\n value.push(e);\n continue;\n }\n e = this.entity();\n if (e) {\n value.push(e);\n }\n } while (e);\n\n done = testCurrentChar();\n\n if (value.length > 0) {\n value = new(tree.Expression)(value);\n if (done) {\n return value;\n }\n else {\n result.push(value);\n }\n // Preserve space before $parseUntil as it will not\n if (parserInput.prevChar() === ' ') {\n result.push(new tree.Anonymous(' ', index));\n }\n }\n parserInput.save();\n\n value = parserInput.$parseUntil(tok);\n\n if (value) {\n if (typeof value === 'string') {\n error(`Expected '${value}'`, 'Parse');\n }\n if (value.length === 1 && value[0] === ' ') {\n parserInput.forget();\n return new tree.Anonymous('', index);\n }\n let item;\n for (i = 0; i < value.length; i++) {\n item = value[i];\n if (Array.isArray(item)) {\n // Treat actual quotes as normal quoted values\n result.push(new tree.Quoted(item[0], item[1], true, index, fileInfo));\n }\n else {\n if (i === value.length - 1) {\n item = item.trim();\n }\n // Treat like quoted values, but replace vars like unquoted expressions\n const quote = new tree.Quoted('\\'', item, true, index, fileInfo);\n quote.variableRegex = /@([\\w-]+)/g;\n quote.propRegex = /\\$([\\w-]+)/g;\n result.push(quote);\n }\n }\n parserInput.forget();\n return new tree.Expression(result, true);\n }\n parserInput.restore();\n },\n\n //\n // An @import atrule\n //\n // @import \"lib\";\n //\n // Depending on our environment, importing is done differently:\n // In the browser, it's an XHR request, in Node, it would be a\n // file-system operation. The function used for importing is\n // stored in `import`, which we pass to the Import constructor.\n //\n 'import': function () {\n let path;\n let features;\n const index = parserInput.i;\n\n const dir = parserInput.$re(/^@import?\\s+/);\n\n if (dir) {\n const options = (dir ? this.importOptions() : null) || {};\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n features = this.mediaFeatures();\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon or unrecognised media features on import');\n }\n features = features && new(tree.Value)(features);\n return new(tree.Import)(path, features, options, index, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed import statement');\n }\n }\n },\n\n importOptions: function() {\n let o;\n const options = {};\n let optionName;\n let value;\n\n // list of options, surrounded by parens\n if (!parserInput.$char('(')) { return null; }\n do {\n o = this.importOption();\n if (o) {\n optionName = o;\n value = true;\n switch (optionName) {\n case 'css':\n optionName = 'less';\n value = false;\n break;\n case 'once':\n optionName = 'multiple';\n value = false;\n break;\n }\n options[optionName] = value;\n if (!parserInput.$char(',')) { break; }\n }\n } while (o);\n expectChar(')');\n return options;\n },\n\n importOption: function() {\n const opt = parserInput.$re(/^(less|css|multiple|once|inline|reference|optional)/);\n if (opt) {\n return opt[1];\n }\n },\n\n mediaFeature: function () {\n const entities = this.entities;\n const nodes = [];\n let e;\n let p;\n parserInput.save();\n do {\n e = entities.keyword() || entities.variable() || entities.mixinLookup();\n if (e) {\n nodes.push(e);\n } else if (parserInput.$char('(')) {\n p = this.property();\n e = this.value();\n if (parserInput.$char(')')) {\n if (p && e) {\n nodes.push(new(tree.Paren)(new(tree.Declaration)(p, e, null, null, parserInput.i, fileInfo, true)));\n } else if (e) {\n nodes.push(new(tree.Paren)(e));\n } else {\n error('badly formed media feature definition');\n }\n } else {\n error('Missing closing \\')\\'', 'Parse');\n }\n }\n } while (e);\n\n parserInput.forget();\n if (nodes.length > 0) {\n return new(tree.Expression)(nodes);\n }\n },\n\n mediaFeatures: function () {\n const entities = this.entities;\n const features = [];\n let e;\n do {\n e = this.mediaFeature();\n if (e) {\n features.push(e);\n if (!parserInput.$char(',')) { break; }\n } else {\n e = entities.variable() || entities.mixinLookup();\n if (e) {\n features.push(e);\n if (!parserInput.$char(',')) { break; }\n }\n }\n } while (e);\n\n return features.length > 0 ? features : null;\n },\n\n media: function () {\n let features;\n let rules;\n let media;\n let debugInfo;\n const index = parserInput.i;\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(index);\n }\n\n parserInput.save();\n\n if (parserInput.$str('@media')) {\n features = this.mediaFeatures();\n\n rules = this.block();\n\n if (!rules) {\n error('media definitions require block statements after any features');\n }\n\n parserInput.forget();\n\n media = new(tree.Media)(rules, features, index, fileInfo);\n if (context.dumpLineNumbers) {\n media.debugInfo = debugInfo;\n }\n\n return media;\n }\n\n parserInput.restore();\n },\n\n //\n\n // A @plugin directive, used to import plugins dynamically.\n //\n // @plugin (args) \"lib\";\n //\n plugin: function () {\n let path;\n let args;\n let options;\n const index = parserInput.i;\n const dir = parserInput.$re(/^@plugin?\\s+/);\n\n if (dir) {\n args = this.pluginArgs();\n\n if (args) {\n options = {\n pluginArgs: args,\n isPlugin: true\n };\n }\n else {\n options = { isPlugin: true };\n }\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon on @plugin');\n }\n return new(tree.Import)(path, null, options, index, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed @plugin statement');\n }\n }\n },\n\n pluginArgs: function() {\n // list of options, surrounded by parens\n parserInput.save();\n if (!parserInput.$char('(')) {\n parserInput.restore();\n return null;\n }\n const args = parserInput.$re(/^\\s*([^\\);]+)\\)\\s*/);\n if (args[1]) {\n parserInput.forget();\n return args[1].trim();\n }\n else { \n parserInput.restore();\n return null;\n }\n },\n\n //\n // A CSS AtRule\n //\n // @charset \"utf-8\";\n //\n atrule: function () {\n const index = parserInput.i;\n let name;\n let value;\n let rules;\n let nonVendorSpecificName;\n let hasIdentifier;\n let hasExpression;\n let hasUnknown;\n let hasBlock = true;\n let isRooted = true;\n\n if (parserInput.currentChar() !== '@') { return; }\n\n value = this['import']() || this.plugin() || this.media();\n if (value) {\n return value;\n }\n\n parserInput.save();\n\n name = parserInput.$re(/^@[a-z-]+/);\n\n if (!name) { return; }\n\n nonVendorSpecificName = name;\n if (name.charAt(1) == '-' && name.indexOf('-', 2) > 0) {\n nonVendorSpecificName = `@${name.slice(name.indexOf('-', 2) + 1)}`;\n }\n\n switch (nonVendorSpecificName) {\n case '@charset':\n hasIdentifier = true;\n hasBlock = false;\n break;\n case '@namespace':\n hasExpression = true;\n hasBlock = false;\n break;\n case '@keyframes':\n case '@counter-style':\n hasIdentifier = true;\n break;\n case '@document':\n case '@supports':\n hasUnknown = true;\n isRooted = false;\n break;\n default:\n hasUnknown = true;\n break;\n }\n\n parserInput.commentStore.length = 0;\n\n if (hasIdentifier) {\n value = this.entity();\n if (!value) {\n error(`expected ${name} identifier`);\n }\n } else if (hasExpression) {\n value = this.expression();\n if (!value) {\n error(`expected ${name} expression`);\n }\n } else if (hasUnknown) {\n value = this.permissiveValue(/^[{;]/);\n hasBlock = (parserInput.currentChar() === '{');\n if (!value) {\n if (!hasBlock && parserInput.currentChar() !== ';') {\n error(`${name} rule is missing block or ending semi-colon`);\n }\n }\n else if (!value.value) {\n value = null;\n }\n }\n\n if (hasBlock) {\n rules = this.blockRuleset();\n }\n\n if (rules || (!hasBlock && value && parserInput.$char(';'))) {\n parserInput.forget();\n return new(tree.AtRule)(name, value, rules, index, fileInfo,\n context.dumpLineNumbers ? getDebugInfo(index) : null,\n isRooted\n );\n }\n\n parserInput.restore('at-rule options not recognised');\n },\n\n //\n // A Value is a comma-delimited list of Expressions\n //\n // font-family: Baskerville, Georgia, serif;\n //\n // In a Rule, a Value represents everything after the `:`,\n // and before the `;`.\n //\n value: function () {\n let e;\n const expressions = [];\n const index = parserInput.i;\n\n do {\n e = this.expression();\n if (e) {\n expressions.push(e);\n if (!parserInput.$char(',')) { break; }\n }\n } while (e);\n\n if (expressions.length > 0) {\n return new(tree.Value)(expressions, index);\n }\n },\n important: function () {\n if (parserInput.currentChar() === '!') {\n return parserInput.$re(/^! *important/);\n }\n },\n sub: function () {\n let a;\n let e;\n\n parserInput.save();\n if (parserInput.$char('(')) {\n a = this.addition();\n if (a && parserInput.$char(')')) {\n parserInput.forget();\n e = new(tree.Expression)([a]);\n e.parens = true;\n return e;\n }\n parserInput.restore('Expected \\')\\'');\n return;\n }\n parserInput.restore();\n },\n multiplication: function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.operand();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1);\n while (true) {\n if (parserInput.peek(/^\\/[*\\/]/)) {\n break;\n }\n\n parserInput.save();\n\n op = parserInput.$char('/') || parserInput.$char('*') || parserInput.$str('./');\n\n if (!op) { parserInput.forget(); break; }\n\n a = this.operand();\n\n if (!a) { parserInput.restore(); break; }\n parserInput.forget();\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n isSpaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n addition: function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.multiplication();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1);\n while (true) {\n op = parserInput.$re(/^[-+]\\s+/) || (!isSpaced && (parserInput.$char('+') || parserInput.$char('-')));\n if (!op) {\n break;\n }\n a = this.multiplication();\n if (!a) {\n break;\n }\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n isSpaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n conditions: function () {\n let a;\n let b;\n const index = parserInput.i;\n let condition;\n\n a = this.condition(true);\n if (a) {\n while (true) {\n if (!parserInput.peek(/^,\\s*(not\\s*)?\\(/) || !parserInput.$char(',')) {\n break;\n }\n b = this.condition(true);\n if (!b) {\n break;\n }\n condition = new(tree.Condition)('or', condition || a, b, index);\n }\n return condition || a;\n }\n },\n condition: function (needsParens) {\n let result;\n let logical;\n let next;\n function or() {\n return parserInput.$str('or');\n }\n\n result = this.conditionAnd(needsParens);\n if (!result) {\n return ;\n }\n logical = or();\n if (logical) {\n next = this.condition(needsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n }\n }\n return result;\n },\n conditionAnd: function (needsParens) {\n let result;\n let logical;\n let next;\n const self = this;\n function insideCondition() {\n const cond = self.negatedCondition(needsParens) || self.parenthesisCondition(needsParens);\n if (!cond && !needsParens) {\n return self.atomicCondition(needsParens);\n }\n return cond;\n }\n function and() {\n return parserInput.$str('and');\n }\n\n result = insideCondition();\n if (!result) {\n return ;\n }\n logical = and();\n if (logical) {\n next = this.conditionAnd(needsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n }\n }\n return result;\n },\n negatedCondition: function (needsParens) {\n if (parserInput.$str('not')) {\n const result = this.parenthesisCondition(needsParens);\n if (result) {\n result.negate = !result.negate;\n }\n return result;\n }\n },\n parenthesisCondition: function (needsParens) {\n function tryConditionFollowedByParenthesis(me) {\n let body;\n parserInput.save();\n body = me.condition(needsParens);\n if (!body) {\n parserInput.restore();\n return ;\n }\n if (!parserInput.$char(')')) {\n parserInput.restore();\n return ;\n }\n parserInput.forget();\n return body;\n }\n\n let body;\n parserInput.save();\n if (!parserInput.$str('(')) {\n parserInput.restore();\n return ;\n }\n body = tryConditionFollowedByParenthesis(this);\n if (body) {\n parserInput.forget();\n return body;\n }\n\n body = this.atomicCondition(needsParens);\n if (!body) {\n parserInput.restore();\n return ;\n }\n if (!parserInput.$char(')')) {\n parserInput.restore(`expected ')' got '${parserInput.currentChar()}'`);\n return ;\n }\n parserInput.forget();\n return body;\n },\n atomicCondition: function (needsParens) {\n const entities = this.entities;\n const index = parserInput.i;\n let a;\n let b;\n let c;\n let op;\n\n function cond() {\n return this.addition() || entities.keyword() || entities.quoted() || entities.mixinLookup();\n }\n cond = cond.bind(this);\n\n a = cond();\n if (a) {\n if (parserInput.$char('>')) {\n if (parserInput.$char('=')) {\n op = '>=';\n } else {\n op = '>';\n }\n } else\n if (parserInput.$char('<')) {\n if (parserInput.$char('=')) {\n op = '<=';\n } else {\n op = '<';\n }\n } else\n if (parserInput.$char('=')) {\n if (parserInput.$char('>')) {\n op = '=>';\n } else if (parserInput.$char('<')) {\n op = '=<';\n } else {\n op = '=';\n }\n }\n if (op) {\n b = cond();\n if (b) {\n c = new(tree.Condition)(op, a, b, index, false);\n } else {\n error('expected expression');\n }\n } else {\n c = new(tree.Condition)('=', a, new(tree.Keyword)('true'), index, false);\n }\n return c;\n }\n },\n\n //\n // An operand is anything that can be part of an operation,\n // such as a Color, or a Variable\n //\n operand: function () {\n const entities = this.entities;\n let negate;\n\n if (parserInput.peek(/^-[@\\$\\(]/)) {\n negate = parserInput.$char('-');\n }\n\n let o = this.sub() || entities.dimension() ||\n entities.color() || entities.variable() ||\n entities.property() || entities.call() ||\n entities.quoted(true) || entities.colorKeyword() ||\n entities.mixinLookup();\n\n if (negate) {\n o.parensInOp = true;\n o = new(tree.Negative)(o);\n }\n\n return o;\n },\n\n //\n // Expressions either represent mathematical operations,\n // or white-space delimited Entities.\n //\n // 1px solid black\n // @var * 2\n //\n expression: function () {\n const entities = [];\n let e;\n let delim;\n const index = parserInput.i;\n\n do {\n e = this.comment();\n if (e) {\n entities.push(e);\n continue;\n }\n e = this.addition() || this.entity();\n\n if (e instanceof tree.Comment) {\n e = null;\n }\n\n if (e) {\n entities.push(e);\n // operations do not allow keyword \"/\" dimension (e.g. small/20px) so we support that here\n if (!parserInput.peek(/^\\/[\\/*]/)) {\n delim = parserInput.$char('/');\n if (delim) {\n entities.push(new(tree.Anonymous)(delim, index));\n }\n }\n }\n } while (e);\n if (entities.length > 0) {\n return new(tree.Expression)(entities);\n }\n },\n property: function () {\n const name = parserInput.$re(/^(\\*?-?[_a-zA-Z0-9-]+)\\s*:/);\n if (name) {\n return name[1];\n }\n },\n ruleProperty: function () {\n let name = [];\n const index = [];\n let s;\n let k;\n\n parserInput.save();\n\n const simpleProperty = parserInput.$re(/^([_a-zA-Z0-9-]+)\\s*:/);\n if (simpleProperty) {\n name = [new(tree.Keyword)(simpleProperty[1])];\n parserInput.forget();\n return name;\n }\n\n function match(re) {\n const i = parserInput.i;\n const chunk = parserInput.$re(re);\n if (chunk) {\n index.push(i);\n return name.push(chunk[1]);\n }\n }\n\n match(/^(\\*?)/);\n while (true) {\n if (!match(/^((?:[\\w-]+)|(?:[@\\$]\\{[\\w-]+\\}))/)) {\n break;\n }\n }\n\n if ((name.length > 1) && match(/^((?:\\+_|\\+)?)\\s*:/)) {\n parserInput.forget();\n\n // at last, we have the complete match now. move forward,\n // convert name particles to tree objects and return:\n if (name[0] === '') {\n name.shift();\n index.shift();\n }\n for (k = 0; k < name.length; k++) {\n s = name[k];\n name[k] = (s.charAt(0) !== '@' && s.charAt(0) !== '$') ?\n new(tree.Keyword)(s) :\n (s.charAt(0) === '@' ?\n new(tree.Variable)(`@${s.slice(2, -1)}`, index[k], fileInfo) :\n new(tree.Property)(`$${s.slice(2, -1)}`, index[k], fileInfo));\n }\n return name;\n }\n parserInput.restore();\n }\n }\n };\n};\nParser.serializeVars = vars => {\n let s = '';\n\n for (const name in vars) {\n if (Object.hasOwnProperty.call(vars, name)) {\n const value = vars[name];\n s += `${((name[0] === '@') ? '' : '@') + name}: ${value}${(String(value).slice(-1) === ';') ? '' : ';'}`;\n }\n }\n\n return s;\n};\n\nexport default Parser;\n","import Anonymous from '../tree/anonymous';\nimport Keyword from '../tree/keyword';\n\nfunction boolean(condition) {\n return condition ? Keyword.True : Keyword.False;\n}\n\n/**\n * Functions with evalArgs set to false are sent context\n * as the first argument.\n */\nfunction If(context, condition, trueValue, falseValue) {\n return condition.eval(context) ? trueValue.eval(context)\n : (falseValue ? falseValue.eval(context) : new Anonymous);\n}\nIf.evalArgs = false\n\nexport default { boolean, 'if': If };\n","import Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport Expression from '../tree/expression';\nimport Operation from '../tree/operation';\nlet colorFunctions;\n\nfunction clamp(val) {\n return Math.min(1, Math.max(0, val));\n}\nfunction hsla(origColor, hsl) {\n const color = colorFunctions.hsla(hsl.h, hsl.s, hsl.l, hsl.a);\n if (color) {\n if (origColor.value && \n /^(rgb|hsl)/.test(origColor.value)) {\n color.value = origColor.value;\n } else {\n color.value = 'rgb';\n }\n return color;\n }\n}\nfunction toHSL(color) {\n if (color.toHSL) {\n return color.toHSL();\n } else {\n throw new Error('Argument cannot be evaluated to a color');\n }\n}\n\nfunction toHSV(color) {\n if (color.toHSV) {\n return color.toHSV();\n } else {\n throw new Error('Argument cannot be evaluated to a color');\n }\n}\n\nfunction number(n) {\n if (n instanceof Dimension) {\n return parseFloat(n.unit.is('%') ? n.value / 100 : n.value);\n } else if (typeof n === 'number') {\n return n;\n } else {\n throw {\n type: 'Argument',\n message: 'color functions take numbers as parameters'\n };\n }\n}\nfunction scaled(n, size) {\n if (n instanceof Dimension && n.unit.is('%')) {\n return parseFloat(n.value * size / 100);\n } else {\n return number(n);\n }\n}\ncolorFunctions = {\n rgb: function (r, g, b) {\n let a = 1\n /**\n * Comma-less syntax\n * e.g. rgb(0 128 255 / 50%)\n */\n if (r instanceof Expression) {\n const val = r.value\n r = val[0]\n g = val[1]\n b = val[2]\n /** \n * @todo - should this be normalized in\n * function caller? Or parsed differently?\n */\n if (b instanceof Operation) {\n const op = b\n b = op.operands[0]\n a = op.operands[1]\n }\n }\n const color = colorFunctions.rgba(r, g, b, a);\n if (color) {\n color.value = 'rgb';\n return color;\n }\n },\n rgba: function (r, g, b, a) {\n try {\n if (r instanceof Color) {\n if (g) {\n a = number(g);\n } else {\n a = r.alpha;\n }\n return new Color(r.rgb, a, 'rgba');\n }\n const rgb = [r, g, b].map(c => scaled(c, 255));\n a = number(a);\n return new Color(rgb, a, 'rgba');\n }\n catch (e) {}\n },\n hsl: function (h, s, l) {\n let a = 1\n if (h instanceof Expression) {\n const val = h.value\n h = val[0]\n s = val[1]\n l = val[2]\n\n if (l instanceof Operation) {\n const op = l\n l = op.operands[0]\n a = op.operands[1]\n }\n }\n const color = colorFunctions.hsla(h, s, l, a);\n if (color) {\n color.value = 'hsl';\n return color;\n }\n },\n hsla: function (h, s, l, a) {\n try {\n if (h instanceof Color) {\n if (s) {\n a = number(s);\n } else {\n a = h.alpha;\n }\n return new Color(h.rgb, a, 'hsla');\n }\n\n let m1;\n let m2;\n\n function hue(h) {\n h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h);\n if (h * 6 < 1) {\n return m1 + (m2 - m1) * h * 6;\n }\n else if (h * 2 < 1) {\n return m2;\n }\n else if (h * 3 < 2) {\n return m1 + (m2 - m1) * (2 / 3 - h) * 6;\n }\n else {\n return m1;\n }\n }\n\n h = (number(h) % 360) / 360;\n s = clamp(number(s));l = clamp(number(l));a = clamp(number(a));\n\n m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n m1 = l * 2 - m2;\n\n const rgb = [\n hue(h + 1 / 3) * 255,\n hue(h) * 255,\n hue(h - 1 / 3) * 255\n ];\n a = number(a);\n return new Color(rgb, a, 'hsla');\n }\n catch (e) {}\n },\n\n hsv: function(h, s, v) {\n return colorFunctions.hsva(h, s, v, 1.0);\n },\n\n hsva: function(h, s, v, a) {\n h = ((number(h) % 360) / 360) * 360;\n s = number(s);v = number(v);a = number(a);\n\n let i;\n let f;\n i = Math.floor((h / 60) % 6);\n f = (h / 60) - i;\n\n const vs = [v,\n v * (1 - s),\n v * (1 - f * s),\n v * (1 - (1 - f) * s)];\n const perm = [[0, 3, 1],\n [2, 0, 1],\n [1, 0, 3],\n [1, 2, 0],\n [3, 1, 0],\n [0, 1, 2]];\n\n return colorFunctions.rgba(vs[perm[i][0]] * 255,\n vs[perm[i][1]] * 255,\n vs[perm[i][2]] * 255,\n a);\n },\n\n hue: function (color) {\n return new Dimension(toHSL(color).h);\n },\n saturation: function (color) {\n return new Dimension(toHSL(color).s * 100, '%');\n },\n lightness: function (color) {\n return new Dimension(toHSL(color).l * 100, '%');\n },\n hsvhue: function(color) {\n return new Dimension(toHSV(color).h);\n },\n hsvsaturation: function (color) {\n return new Dimension(toHSV(color).s * 100, '%');\n },\n hsvvalue: function (color) {\n return new Dimension(toHSV(color).v * 100, '%');\n },\n red: function (color) {\n return new Dimension(color.rgb[0]);\n },\n green: function (color) {\n return new Dimension(color.rgb[1]);\n },\n blue: function (color) {\n return new Dimension(color.rgb[2]);\n },\n alpha: function (color) {\n return new Dimension(toHSL(color).a);\n },\n luma: function (color) {\n return new Dimension(color.luma() * color.alpha * 100, '%');\n },\n luminance: function (color) {\n const luminance =\n (0.2126 * color.rgb[0] / 255) +\n (0.7152 * color.rgb[1] / 255) +\n (0.0722 * color.rgb[2] / 255);\n\n return new Dimension(luminance * color.alpha * 100, '%');\n },\n saturate: function (color, amount, method) {\n // filter: saturate(3.2);\n // should be kept as is, so check for color\n if (!color.rgb) {\n return null;\n }\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.s += hsl.s * amount.value / 100;\n }\n else {\n hsl.s += amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n return hsla(color, hsl);\n },\n desaturate: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.s -= hsl.s * amount.value / 100;\n }\n else {\n hsl.s -= amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n return hsla(color, hsl);\n },\n lighten: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.l += hsl.l * amount.value / 100;\n }\n else {\n hsl.l += amount.value / 100;\n }\n hsl.l = clamp(hsl.l);\n return hsla(color, hsl);\n },\n darken: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.l -= hsl.l * amount.value / 100;\n }\n else {\n hsl.l -= amount.value / 100;\n }\n hsl.l = clamp(hsl.l);\n return hsla(color, hsl);\n },\n fadein: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.a += hsl.a * amount.value / 100;\n }\n else {\n hsl.a += amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fadeout: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.a -= hsl.a * amount.value / 100;\n }\n else {\n hsl.a -= amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fade: function (color, amount) {\n const hsl = toHSL(color);\n\n hsl.a = amount.value / 100;\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n spin: function (color, amount) {\n const hsl = toHSL(color);\n const hue = (hsl.h + amount.value) % 360;\n\n hsl.h = hue < 0 ? 360 + hue : hue;\n\n return hsla(color, hsl);\n },\n //\n // Copyright (c) 2006-2009 Hampton Catlin, Natalie Weizenbaum, and Chris Eppstein\n // http://sass-lang.com\n //\n mix: function (color1, color2, weight) {\n if (!weight) {\n weight = new Dimension(50);\n }\n const p = weight.value / 100.0;\n const w = p * 2 - 1;\n const a = toHSL(color1).a - toHSL(color2).a;\n\n const w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n const w2 = 1 - w1;\n\n const rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2,\n color1.rgb[1] * w1 + color2.rgb[1] * w2,\n color1.rgb[2] * w1 + color2.rgb[2] * w2];\n\n const alpha = color1.alpha * p + color2.alpha * (1 - p);\n\n return new Color(rgb, alpha);\n },\n greyscale: function (color) {\n return colorFunctions.desaturate(color, new Dimension(100));\n },\n contrast: function (color, dark, light, threshold) {\n // filter: contrast(3.2);\n // should be kept as is, so check for color\n if (!color.rgb) {\n return null;\n }\n if (typeof light === 'undefined') {\n light = colorFunctions.rgba(255, 255, 255, 1.0);\n }\n if (typeof dark === 'undefined') {\n dark = colorFunctions.rgba(0, 0, 0, 1.0);\n }\n // Figure out which is actually light and dark:\n if (dark.luma() > light.luma()) {\n const t = light;\n light = dark;\n dark = t;\n }\n if (typeof threshold === 'undefined') {\n threshold = 0.43;\n } else {\n threshold = number(threshold);\n }\n if (color.luma() < threshold) {\n return light;\n } else {\n return dark;\n }\n },\n // Changes made in 2.7.0 - Reverted in 3.0.0\n // contrast: function (color, color1, color2, threshold) {\n // // Return which of `color1` and `color2` has the greatest contrast with `color`\n // // according to the standard WCAG contrast ratio calculation.\n // // http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n // // The threshold param is no longer used, in line with SASS.\n // // filter: contrast(3.2);\n // // should be kept as is, so check for color\n // if (!color.rgb) {\n // return null;\n // }\n // if (typeof color1 === 'undefined') {\n // color1 = colorFunctions.rgba(0, 0, 0, 1.0);\n // }\n // if (typeof color2 === 'undefined') {\n // color2 = colorFunctions.rgba(255, 255, 255, 1.0);\n // }\n // var contrast1, contrast2;\n // var luma = color.luma();\n // var luma1 = color1.luma();\n // var luma2 = color2.luma();\n // // Calculate contrast ratios for each color\n // if (luma > luma1) {\n // contrast1 = (luma + 0.05) / (luma1 + 0.05);\n // } else {\n // contrast1 = (luma1 + 0.05) / (luma + 0.05);\n // }\n // if (luma > luma2) {\n // contrast2 = (luma + 0.05) / (luma2 + 0.05);\n // } else {\n // contrast2 = (luma2 + 0.05) / (luma + 0.05);\n // }\n // if (contrast1 > contrast2) {\n // return color1;\n // } else {\n // return color2;\n // }\n // },\n argb: function (color) {\n return new Anonymous(color.toARGB());\n },\n color: function(c) {\n if ((c instanceof Quoted) &&\n (/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})$/i.test(c.value))) {\n const val = c.value.slice(1);\n return new Color(val, undefined, `#${val}`);\n }\n if ((c instanceof Color) || (c = Color.fromKeyword(c.value))) {\n c.value = undefined;\n return c;\n }\n throw {\n type: 'Argument',\n message: 'argument must be a color keyword or 3|4|6|8 digit hex e.g. #FFF'\n };\n },\n tint: function(color, amount) {\n return colorFunctions.mix(colorFunctions.rgb(255, 255, 255), color, amount);\n },\n shade: function(color, amount) {\n return colorFunctions.mix(colorFunctions.rgb(0, 0, 0), color, amount);\n }\n};\n\nexport default colorFunctions;\n","import Color from '../tree/color';\n\n// Color Blending\n// ref: http://www.w3.org/TR/compositing-1\n\nfunction colorBlend(mode, color1, color2) {\n const ab = color1.alpha; // result\n\n let // backdrop\n cb;\n\n const as = color2.alpha;\n\n let // source\n cs;\n\n let ar;\n let cr;\n const r = [];\n\n ar = as + ab * (1 - as);\n for (let i = 0; i < 3; i++) {\n cb = color1.rgb[i] / 255;\n cs = color2.rgb[i] / 255;\n cr = mode(cb, cs);\n if (ar) {\n cr = (as * cs + ab * (cb -\n as * (cb + cs - cr))) / ar;\n }\n r[i] = cr * 255;\n }\n\n return new Color(r, ar);\n}\n\nconst colorBlendModeFunctions = {\n multiply: function(cb, cs) {\n return cb * cs;\n },\n screen: function(cb, cs) {\n return cb + cs - cb * cs;\n },\n overlay: function(cb, cs) {\n cb *= 2;\n return (cb <= 1) ?\n colorBlendModeFunctions.multiply(cb, cs) :\n colorBlendModeFunctions.screen(cb - 1, cs);\n },\n softlight: function(cb, cs) {\n let d = 1;\n let e = cb;\n if (cs > 0.5) {\n e = 1;\n d = (cb > 0.25) ? Math.sqrt(cb)\n : ((16 * cb - 12) * cb + 4) * cb;\n }\n return cb - (1 - 2 * cs) * e * (d - cb);\n },\n hardlight: function(cb, cs) {\n return colorBlendModeFunctions.overlay(cs, cb);\n },\n difference: function(cb, cs) {\n return Math.abs(cb - cs);\n },\n exclusion: function(cb, cs) {\n return cb + cs - 2 * cb * cs;\n },\n\n // non-w3c functions:\n average: function(cb, cs) {\n return (cb + cs) / 2;\n },\n negation: function(cb, cs) {\n return 1 - Math.abs(cb + cs - 1);\n }\n};\n\nfor (const f in colorBlendModeFunctions) {\n if (colorBlendModeFunctions.hasOwnProperty(f)) {\n colorBlend[f] = colorBlend.bind(null, colorBlendModeFunctions[f]);\n }\n}\n\nexport default colorBlend;\n","import Comment from '../tree/comment';\nimport Node from '../tree/node';\nimport Dimension from '../tree/dimension';\nimport Declaration from '../tree/declaration';\nimport Expression from '../tree/expression';\nimport Ruleset from '../tree/ruleset';\nimport Selector from '../tree/selector';\nimport Element from '../tree/element';\nimport Quote from '../tree/quoted';\nimport Value from '../tree/value';\n\nconst getItemsFromNode = node => {\n // handle non-array values as an array of length 1\n // return 'undefined' if index is invalid\n const items = Array.isArray(node.value) ?\n node.value : Array(node);\n\n return items;\n};\n\nexport default {\n _SELF: function(n) {\n return n;\n },\n '~': function(...expr) {\n if (expr.length === 1) {\n return expr[0];\n }\n return new Value(expr);\n },\n extract: function(values, index) {\n // (1-based index)\n index = index.value - 1;\n\n return getItemsFromNode(values)[index];\n },\n length: function(values) {\n return new Dimension(getItemsFromNode(values).length);\n },\n /**\n * Creates a Less list of incremental values.\n * Modeled after Lodash's range function, also exists natively in PHP\n * \n * @param {Dimension} [start=1]\n * @param {Dimension} end - e.g. 10 or 10px - unit is added to output\n * @param {Dimension} [step=1] \n */\n range: function(start, end, step) {\n let from;\n let to;\n let stepValue = 1;\n const list = [];\n if (end) {\n to = end;\n from = start.value;\n if (step) {\n stepValue = step.value;\n }\n }\n else {\n from = 1;\n to = start;\n }\n\n for (let i = from; i <= to.value; i += stepValue) {\n list.push(new Dimension(i, to.unit));\n }\n\n return new Expression(list);\n },\n each: function(list, rs) {\n const rules = [];\n let newRules;\n let iterator;\n\n const tryEval = val => {\n if (val instanceof Node) {\n return val.eval(this.context);\n }\n return val;\n };\n\n if (list.value && !(list instanceof Quote)) {\n if (Array.isArray(list.value)) {\n iterator = list.value.map(tryEval);\n } else {\n iterator = [tryEval(list.value)];\n }\n } else if (list.ruleset) {\n iterator = tryEval(list.ruleset).rules;\n } else if (list.rules) {\n iterator = list.rules.map(tryEval);\n } else if (Array.isArray(list)) {\n iterator = list.map(tryEval);\n } else {\n iterator = [tryEval(list)];\n }\n\n let valueName = '@value';\n let keyName = '@key';\n let indexName = '@index';\n\n if (rs.params) {\n valueName = rs.params[0] && rs.params[0].name;\n keyName = rs.params[1] && rs.params[1].name;\n indexName = rs.params[2] && rs.params[2].name;\n rs = rs.rules;\n } else {\n rs = rs.ruleset;\n }\n\n for (let i = 0; i < iterator.length; i++) {\n let key;\n let value;\n const item = iterator[i];\n if (item instanceof Declaration) {\n key = typeof item.name === 'string' ? item.name : item.name[0].value;\n value = item.value;\n } else {\n key = new Dimension(i + 1);\n value = item;\n }\n\n if (item instanceof Comment) {\n continue;\n }\n\n newRules = rs.rules.slice(0);\n if (valueName) {\n newRules.push(new Declaration(valueName,\n value,\n false, false, this.index, this.currentFileInfo));\n }\n if (indexName) {\n newRules.push(new Declaration(indexName,\n new Dimension(i + 1),\n false, false, this.index, this.currentFileInfo));\n }\n if (keyName) {\n newRules.push(new Declaration(keyName,\n key,\n false, false, this.index, this.currentFileInfo));\n }\n\n rules.push(new Ruleset([ new(Selector)([ new Element(\"\", '&') ]) ],\n newRules,\n rs.strictImports,\n rs.visibilityInfo()\n ));\n }\n\n return new Ruleset([ new(Selector)([ new Element(\"\", '&') ]) ],\n rules,\n rs.strictImports,\n rs.visibilityInfo()\n ).eval(this.context);\n }\n};\n","import Dimension from '../tree/dimension';\n\nconst MathHelper = (fn, unit, n) => {\n if (!(n instanceof Dimension)) {\n throw { type: 'Argument', message: 'argument must be a number' };\n }\n if (unit == null) {\n unit = n.unit;\n } else {\n n = n.unify();\n }\n return new Dimension(fn(parseFloat(n.value)), unit);\n};\n\nexport default MathHelper;","import mathHelper from './math-helper.js';\n\nconst mathFunctions = {\n // name, unit\n ceil: null,\n floor: null,\n sqrt: null,\n abs: null,\n tan: '',\n sin: '',\n cos: '',\n atan: 'rad',\n asin: 'rad',\n acos: 'rad'\n};\n\nfor (const f in mathFunctions) {\n if (mathFunctions.hasOwnProperty(f)) {\n mathFunctions[f] = mathHelper.bind(null, Math[f], mathFunctions[f]);\n }\n}\n\nmathFunctions.round = (n, f) => {\n const fraction = typeof f === 'undefined' ? 0 : f.value;\n return mathHelper(num => num.toFixed(fraction), null, n);\n};\n\nexport default mathFunctions;\n","import Dimension from '../tree/dimension';\nimport Anonymous from '../tree/anonymous';\nimport mathHelper from './math-helper.js';\n\nconst minMax = function (isMin, args) {\n args = Array.prototype.slice.call(args);\n switch (args.length) {\n case 0: throw { type: 'Argument', message: 'one or more arguments required' };\n }\n let i; // key is the unit.toString() for unified Dimension values,\n let j;\n let current;\n let currentUnified;\n let referenceUnified;\n let unit;\n let unitStatic;\n let unitClone;\n\n const // elems only contains original argument values.\n order = [];\n\n const values = {};\n // value is the index into the order array.\n for (i = 0; i < args.length; i++) {\n current = args[i];\n if (!(current instanceof Dimension)) {\n if (Array.isArray(args[i].value)) {\n Array.prototype.push.apply(args, Array.prototype.slice.call(args[i].value));\n }\n continue;\n }\n currentUnified = current.unit.toString() === '' && unitClone !== undefined ? new Dimension(current.value, unitClone).unify() : current.unify();\n unit = currentUnified.unit.toString() === '' && unitStatic !== undefined ? unitStatic : currentUnified.unit.toString();\n unitStatic = unit !== '' && unitStatic === undefined || unit !== '' && order[0].unify().unit.toString() === '' ? unit : unitStatic;\n unitClone = unit !== '' && unitClone === undefined ? current.unit.toString() : unitClone;\n j = values[''] !== undefined && unit !== '' && unit === unitStatic ? values[''] : values[unit];\n if (j === undefined) {\n if (unitStatic !== undefined && unit !== unitStatic) {\n throw { type: 'Argument', message: 'incompatible types' };\n }\n values[unit] = order.length;\n order.push(current);\n continue;\n }\n referenceUnified = order[j].unit.toString() === '' && unitClone !== undefined ? new Dimension(order[j].value, unitClone).unify() : order[j].unify();\n if ( isMin && currentUnified.value < referenceUnified.value ||\n !isMin && currentUnified.value > referenceUnified.value) {\n order[j] = current;\n }\n }\n if (order.length == 1) {\n return order[0];\n }\n args = order.map(function (a) { return a.toCSS(this.context); }).join(this.context.compress ? ',' : ', ');\n return new Anonymous(`${isMin ? 'min' : 'max'}(${args})`);\n};\n\nexport default {\n min: function(...args) {\n try {\n return minMax(true, args);\n } catch (e) {}\n },\n max: function(...args) {\n try {\n return minMax(false, args);\n } catch (e) {}\n },\n convert: function (val, unit) {\n return val.convertTo(unit.value);\n },\n pi: function () {\n return new Dimension(Math.PI);\n },\n mod: function(a, b) {\n return new Dimension(a.value % b.value, a.unit);\n },\n pow: function(x, y) {\n if (typeof x === 'number' && typeof y === 'number') {\n x = new Dimension(x);\n y = new Dimension(y);\n } else if (!(x instanceof Dimension) || !(y instanceof Dimension)) {\n throw { type: 'Argument', message: 'arguments must be numbers' };\n }\n\n return new Dimension(Math.pow(x.value, y.value), x.unit);\n },\n percentage: function (n) {\n const result = mathHelper(num => num * 100, '%', n);\n\n return result;\n }\n};\n","import Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport JavaScript from '../tree/javascript';\n\nexport default {\n e: function (str) {\n return new Quoted('\"', str instanceof JavaScript ? str.evaluated : str.value, true);\n },\n escape: function (str) {\n return new Anonymous(\n encodeURI(str.value).replace(/=/g, '%3D').replace(/:/g, '%3A').replace(/#/g, '%23').replace(/;/g, '%3B')\n .replace(/\\(/g, '%28').replace(/\\)/g, '%29'));\n },\n replace: function (string, pattern, replacement, flags) {\n let result = string.value;\n replacement = (replacement.type === 'Quoted') ?\n replacement.value : replacement.toCSS();\n result = result.replace(new RegExp(pattern.value, flags ? flags.value : ''), replacement);\n return new Quoted(string.quote || '', result, string.escaped);\n },\n '%': function (string /* arg, arg, ... */) {\n const args = Array.prototype.slice.call(arguments, 1);\n let result = string.value;\n\n for (let i = 0; i < args.length; i++) {\n /* jshint loopfunc:true */\n result = result.replace(/%[sda]/i, token => {\n const value = ((args[i].type === 'Quoted') &&\n token.match(/s/i)) ? args[i].value : args[i].toCSS();\n return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value;\n });\n }\n result = result.replace(/%%/g, '%');\n return new Quoted(string.quote || '', result, string.escaped);\n }\n};\n","import Keyword from '../tree/keyword';\nimport DetachedRuleset from '../tree/detached-ruleset';\nimport Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport URL from '../tree/url';\nimport Operation from '../tree/operation';\n\nconst isa = (n, Type) => (n instanceof Type) ? Keyword.True : Keyword.False;\nconst isunit = (n, unit) => {\n if (unit === undefined) {\n throw { type: 'Argument', message: 'missing the required second argument to isunit.' };\n }\n unit = typeof unit.value === 'string' ? unit.value : unit;\n if (typeof unit !== 'string') {\n throw { type: 'Argument', message: 'Second argument to isunit should be a unit or a string.' };\n }\n return (n instanceof Dimension) && n.unit.is(unit) ? Keyword.True : Keyword.False;\n};\n\nexport default {\n isruleset: function (n) {\n return isa(n, DetachedRuleset);\n },\n iscolor: function (n) {\n return isa(n, Color);\n },\n isnumber: function (n) {\n return isa(n, Dimension);\n },\n isstring: function (n) {\n return isa(n, Quoted);\n },\n iskeyword: function (n) {\n return isa(n, Keyword);\n },\n isurl: function (n) {\n return isa(n, URL);\n },\n ispixel: function (n) {\n return isunit(n, 'px');\n },\n ispercentage: function (n) {\n return isunit(n, '%');\n },\n isem: function (n) {\n return isunit(n, 'em');\n },\n isunit,\n unit: function (val, unit) {\n if (!(val instanceof Dimension)) {\n throw { type: 'Argument',\n message: `the first argument to unit must be a number${val instanceof Operation ? '. Have you forgotten parenthesis?' : ''}` };\n }\n if (unit) {\n if (unit instanceof Keyword) {\n unit = unit.value;\n } else {\n unit = unit.toCSS();\n }\n } else {\n unit = '';\n }\n return new Dimension(val.value, unit);\n },\n 'get-unit': function (n) {\n return new Anonymous(n.unit);\n }\n};\n","import functionRegistry from './function-registry';\nimport functionCaller from './function-caller';\n\nimport boolean from './boolean';\nimport defaultFunc from './default';\nimport color from './color';\nimport colorBlending from './color-blending';\nimport dataUri from './data-uri';\nimport list from './list';\nimport math from './math';\nimport number from './number';\nimport string from './string';\nimport svg from './svg';\nimport types from './types';\n\nexport default environment => {\n const functions = { functionRegistry, functionCaller };\n\n // register functions\n functionRegistry.addMultiple(boolean);\n functionRegistry.add('default', defaultFunc.eval.bind(defaultFunc));\n functionRegistry.addMultiple(color);\n functionRegistry.addMultiple(colorBlending);\n functionRegistry.addMultiple(dataUri(environment));\n functionRegistry.addMultiple(list);\n functionRegistry.addMultiple(math);\n functionRegistry.addMultiple(number);\n functionRegistry.addMultiple(string);\n functionRegistry.addMultiple(svg(environment));\n functionRegistry.addMultiple(types);\n\n return functions;\n};\n","import Quoted from '../tree/quoted';\nimport URL from '../tree/url';\nimport * as utils from '../utils';\nimport logger from '../logger';\n\nexport default environment => {\n \n const fallback = (functionThis, node) => new URL(node, functionThis.index, functionThis.currentFileInfo).eval(functionThis.context); \n\n return { 'data-uri': function(mimetypeNode, filePathNode) {\n\n if (!filePathNode) {\n filePathNode = mimetypeNode;\n mimetypeNode = null;\n }\n\n let mimetype = mimetypeNode && mimetypeNode.value;\n let filePath = filePathNode.value;\n const currentFileInfo = this.currentFileInfo;\n const currentDirectory = currentFileInfo.rewriteUrls ?\n currentFileInfo.currentDirectory : currentFileInfo.entryPath;\n\n const fragmentStart = filePath.indexOf('#');\n let fragment = '';\n if (fragmentStart !== -1) {\n fragment = filePath.slice(fragmentStart);\n filePath = filePath.slice(0, fragmentStart);\n }\n const context = utils.clone(this.context);\n context.rawBuffer = true;\n\n const fileManager = environment.getFileManager(filePath, currentDirectory, context, environment, true);\n\n if (!fileManager) {\n return fallback(this, filePathNode);\n }\n\n let useBase64 = false;\n\n // detect the mimetype if not given\n if (!mimetypeNode) {\n\n mimetype = environment.mimeLookup(filePath);\n\n if (mimetype === 'image/svg+xml') {\n useBase64 = false;\n } else {\n // use base 64 unless it's an ASCII or UTF-8 format\n const charset = environment.charsetLookup(mimetype);\n useBase64 = ['US-ASCII', 'UTF-8'].indexOf(charset) < 0;\n }\n if (useBase64) { mimetype += ';base64'; }\n }\n else {\n useBase64 = /;base64$/.test(mimetype);\n }\n\n const fileSync = fileManager.loadFileSync(filePath, currentDirectory, context, environment);\n if (!fileSync.contents) {\n logger.warn(`Skipped data-uri embedding of ${filePath} because file not found`);\n return fallback(this, filePathNode || mimetypeNode);\n }\n let buf = fileSync.contents;\n if (useBase64 && !environment.encodeBase64) {\n return fallback(this, filePathNode);\n }\n\n buf = useBase64 ? environment.encodeBase64(buf) : encodeURIComponent(buf);\n\n const uri = `data:${mimetype},${buf}${fragment}`;\n\n return new URL(new Quoted(`\"${uri}\"`, uri, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n }};\n};\n","import Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Expression from '../tree/expression';\nimport Quoted from '../tree/quoted';\nimport URL from '../tree/url';\n\nexport default environment => {\n return { 'svg-gradient': function(direction) {\n let stops;\n let gradientDirectionSvg;\n let gradientType = 'linear';\n let rectangleDimension = 'x=\"0\" y=\"0\" width=\"1\" height=\"1\"';\n const renderEnv = {compress: false};\n let returner;\n const directionValue = direction.toCSS(renderEnv);\n let i;\n let color;\n let position;\n let positionValue;\n let alpha;\n\n function throwArgumentDescriptor() {\n throw { type: 'Argument',\n message: 'svg-gradient expects direction, start_color [start_position], [color position,]...,' +\n ' end_color [end_position] or direction, color list' };\n }\n\n if (arguments.length == 2) {\n if (arguments[1].value.length < 2) {\n throwArgumentDescriptor();\n }\n stops = arguments[1].value;\n } else if (arguments.length < 3) {\n throwArgumentDescriptor();\n } else {\n stops = Array.prototype.slice.call(arguments, 1);\n }\n\n switch (directionValue) {\n case 'to bottom':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\"';\n break;\n case 'to right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'to bottom right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\"';\n break;\n case 'to top right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"100%\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'ellipse':\n case 'ellipse at center':\n gradientType = 'radial';\n gradientDirectionSvg = 'cx=\"50%\" cy=\"50%\" r=\"75%\"';\n rectangleDimension = 'x=\"-50\" y=\"-50\" width=\"101\" height=\"101\"';\n break;\n default:\n throw { type: 'Argument', message: 'svg-gradient direction must be \\'to bottom\\', \\'to right\\',' +\n ' \\'to bottom right\\', \\'to top right\\' or \\'ellipse at center\\'' };\n }\n returner = `<${gradientType}Gradient id=\"g\" ${gradientDirectionSvg}>`;\n\n for (i = 0; i < stops.length; i += 1) {\n if (stops[i] instanceof Expression) {\n color = stops[i].value[0];\n position = stops[i].value[1];\n } else {\n color = stops[i];\n position = undefined;\n }\n\n if (!(color instanceof Color) || (!((i === 0 || i + 1 === stops.length) && position === undefined) && !(position instanceof Dimension))) {\n throwArgumentDescriptor();\n }\n positionValue = position ? position.toCSS(renderEnv) : i === 0 ? '0%' : '100%';\n alpha = color.alpha;\n returner += ``;\n }\n returner += ``;\n\n returner = encodeURIComponent(returner);\n\n returner = `data:image/svg+xml,${returner}`;\n return new URL(new Quoted(`'${returner}'`, returner, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n }};\n};\n","import contexts from './contexts';\nimport visitor from './visitors';\nimport tree from './tree';\n\nexport default function(root, options) {\n options = options || {};\n let evaldRoot;\n let variables = options.variables;\n const evalEnv = new contexts.Eval(options);\n\n //\n // Allows setting variables with a hash, so:\n //\n // `{ color: new tree.Color('#f01') }` will become:\n //\n // new tree.Declaration('@color',\n // new tree.Value([\n // new tree.Expression([\n // new tree.Color('#f01')\n // ])\n // ])\n // )\n //\n if (typeof variables === 'object' && !Array.isArray(variables)) {\n variables = Object.keys(variables).map(function (k) {\n let value = variables[k];\n\n if (!(value instanceof tree.Value)) {\n if (!(value instanceof tree.Expression)) {\n value = new tree.Expression([value]);\n }\n value = new tree.Value([value]);\n }\n return new tree.Declaration(`@${k}`, value, false, null, 0);\n });\n evalEnv.frames = [new tree.Ruleset(null, variables)];\n }\n\n const visitors = [\n new visitor.JoinSelectorVisitor(),\n new visitor.MarkVisibleSelectorsVisitor(true),\n new visitor.ExtendVisitor(),\n new visitor.ToCSSVisitor({compress: Boolean(options.compress)})\n ];\n\n const preEvalVisitors = [];\n let v;\n let visitorIterator;\n\n /**\n * first() / get() allows visitors to be added while visiting\n * \n * @todo Add scoping for visitors just like functions for @plugin; right now they're global\n */\n if (options.pluginManager) {\n visitorIterator = options.pluginManager.visitor();\n for (var i = 0; i < 2; i++) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (v.isPreEvalVisitor) {\n if (i === 0 || preEvalVisitors.indexOf(v) === -1) {\n preEvalVisitors.push(v);\n v.run(root);\n }\n }\n else {\n if (i === 0 || visitors.indexOf(v) === -1) {\n if (v.isPreVisitor) {\n visitors.unshift(v);\n }\n else {\n visitors.push(v);\n }\n }\n }\n }\n }\n }\n\n evaldRoot = root.eval(evalEnv);\n\n for (var i = 0; i < visitors.length; i++) {\n visitors[i].run(evaldRoot);\n }\n\n // Run any remaining visitors added after eval pass\n if (options.pluginManager) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (visitors.indexOf(v) === -1 && preEvalVisitors.indexOf(v) === -1) {\n v.run(evaldRoot);\n }\n }\n }\n\n return evaldRoot;\n};\n","/**\n * Plugin Manager\n */\nclass PluginManager {\n constructor(less) {\n this.less = less;\n this.visitors = [];\n this.preProcessors = [];\n this.postProcessors = [];\n this.installedPlugins = [];\n this.fileManagers = [];\n this.iterator = -1;\n this.pluginCache = {};\n this.Loader = new less.PluginLoader(less);\n }\n\n /**\n * Adds all the plugins in the array\n * @param {Array} plugins\n */\n addPlugins(plugins) {\n if (plugins) {\n for (let i = 0; i < plugins.length; i++) {\n this.addPlugin(plugins[i]);\n }\n }\n }\n\n /**\n *\n * @param plugin\n * @param {String} filename\n */\n addPlugin(plugin, filename, functionRegistry) {\n this.installedPlugins.push(plugin);\n if (filename) {\n this.pluginCache[filename] = plugin;\n }\n if (plugin.install) {\n plugin.install(this.less, this, functionRegistry || this.less.functions.functionRegistry);\n }\n }\n\n /**\n *\n * @param filename\n */\n get(filename) {\n return this.pluginCache[filename];\n }\n\n /**\n * Adds a visitor. The visitor object has options on itself to determine\n * when it should run.\n * @param visitor\n */\n addVisitor(visitor) {\n this.visitors.push(visitor);\n }\n\n /**\n * Adds a pre processor object\n * @param {object} preProcessor\n * @param {number} priority - guidelines 1 = before import, 1000 = import, 2000 = after import\n */\n addPreProcessor(preProcessor, priority) {\n let indexToInsertAt;\n for (indexToInsertAt = 0; indexToInsertAt < this.preProcessors.length; indexToInsertAt++) {\n if (this.preProcessors[indexToInsertAt].priority >= priority) {\n break;\n }\n }\n this.preProcessors.splice(indexToInsertAt, 0, {preProcessor, priority});\n }\n\n /**\n * Adds a post processor object\n * @param {object} postProcessor\n * @param {number} priority - guidelines 1 = before compression, 1000 = compression, 2000 = after compression\n */\n addPostProcessor(postProcessor, priority) {\n let indexToInsertAt;\n for (indexToInsertAt = 0; indexToInsertAt < this.postProcessors.length; indexToInsertAt++) {\n if (this.postProcessors[indexToInsertAt].priority >= priority) {\n break;\n }\n }\n this.postProcessors.splice(indexToInsertAt, 0, {postProcessor, priority});\n }\n\n /**\n *\n * @param manager\n */\n addFileManager(manager) {\n this.fileManagers.push(manager);\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getPreProcessors() {\n const preProcessors = [];\n for (let i = 0; i < this.preProcessors.length; i++) {\n preProcessors.push(this.preProcessors[i].preProcessor);\n }\n return preProcessors;\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getPostProcessors() {\n const postProcessors = [];\n for (let i = 0; i < this.postProcessors.length; i++) {\n postProcessors.push(this.postProcessors[i].postProcessor);\n }\n return postProcessors;\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getVisitors() {\n return this.visitors;\n }\n\n visitor() {\n const self = this;\n return {\n first: function() {\n self.iterator = -1;\n return self.visitors[self.iterator];\n },\n get: function() {\n self.iterator += 1;\n return self.visitors[self.iterator];\n }\n };\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getFileManagers() {\n return this.fileManagers;\n }\n}\n\nlet pm;\n\nconst PluginManagerFactory = function(less, newFactory) {\n if (newFactory || !pm) {\n pm = new PluginManager(less);\n }\n return pm;\n};\n\n//\nexport default PluginManagerFactory;\n","/* global window, XMLHttpRequest */\n\nimport AbstractFileManager from '../less/environment/abstract-file-manager.js';\n\nlet options;\nlet logger;\nlet fileCache = {};\n\n// TODOS - move log somewhere. pathDiff and doing something similar in node. use pathDiff in the other browser file for the initial load\nclass FileManager extends AbstractFileManager {\n alwaysMakePathsAbsolute() {\n return true;\n }\n\n join(basePath, laterPath) {\n if (!basePath) {\n return laterPath;\n }\n return this.extractUrlParts(laterPath, basePath).path;\n }\n\n doXHR(url, type, callback, errback) {\n const xhr = new XMLHttpRequest();\n const async = options.isFileProtocol ? options.fileAsync : true;\n\n if (typeof xhr.overrideMimeType === 'function') {\n xhr.overrideMimeType('text/css');\n }\n logger.debug(`XHR: Getting '${url}'`);\n xhr.open('GET', url, async);\n xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5');\n xhr.send(null);\n\n function handleResponse(xhr, callback, errback) {\n if (xhr.status >= 200 && xhr.status < 300) {\n callback(xhr.responseText,\n xhr.getResponseHeader('Last-Modified'));\n } else if (typeof errback === 'function') {\n errback(xhr.status, url);\n }\n }\n\n if (options.isFileProtocol && !options.fileAsync) {\n if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) {\n callback(xhr.responseText);\n } else {\n errback(xhr.status, url);\n }\n } else if (async) {\n xhr.onreadystatechange = () => {\n if (xhr.readyState == 4) {\n handleResponse(xhr, callback, errback);\n }\n };\n } else {\n handleResponse(xhr, callback, errback);\n }\n }\n\n supports() {\n return true;\n }\n\n clearFileCache() {\n fileCache = {};\n }\n\n loadFile(filename, currentDirectory, options, environment) {\n // TODO: Add prefix support like less-node?\n // What about multiple paths?\n\n if (currentDirectory && !this.isPathAbsolute(filename)) {\n filename = currentDirectory + filename;\n }\n\n filename = options.ext ? this.tryAppendExtension(filename, options.ext) : filename;\n\n options = options || {};\n\n // sheet may be set to the stylesheet for the initial load or a collection of properties including\n // some context variables for imports\n const hrefParts = this.extractUrlParts(filename, window.location.href);\n const href = hrefParts.url;\n const self = this;\n \n return new Promise((resolve, reject) => {\n if (options.useFileCache && fileCache[href]) {\n try {\n const lessText = fileCache[href];\n return resolve({ contents: lessText, filename: href, webInfo: { lastModified: new Date() }});\n } catch (e) {\n return reject({ filename: href, message: `Error loading file ${href} error was ${e.message}` });\n }\n }\n\n self.doXHR(href, options.mime, function doXHRCallback(data, lastModified) {\n // per file cache\n fileCache[href] = data;\n\n // Use remote copy (re-parse)\n resolve({ contents: data, filename: href, webInfo: { lastModified }});\n }, function doXHRError(status, url) {\n reject({ type: 'File', message: `'${url}' wasn't found (${status})`, href });\n });\n });\n }\n}\n\nexport default (opts, log) => {\n options = opts;\n logger = log;\n return FileManager;\n}\n","import Environment from './environment/environment';\nimport data from './data';\nimport tree from './tree';\nimport AbstractFileManager from './environment/abstract-file-manager';\nimport AbstractPluginLoader from './environment/abstract-plugin-loader';\nimport visitors from './visitors';\nimport Parser from './parser/parser';\nimport functions from './functions';\nimport contexts from './contexts';\nimport LessError from './less-error';\nimport transformTree from './transform-tree';\nimport * as utils from './utils';\nimport PluginManager from './plugin-manager';\nimport logger from './logger';\nimport SourceMapOutput from './source-map-output';\nimport SourceMapBuilder from './source-map-builder';\nimport ParseTree from './parse-tree';\nimport ImportManager from './import-manager';\nimport Parse from './parse';\nimport Render from './render';\n\nexport default function(environment, fileManagers) {\n let sourceMapOutput, sourceMapBuilder, parseTree, importManager;\n\n environment = new Environment(environment, fileManagers);\n sourceMapOutput = SourceMapOutput(environment);\n sourceMapBuilder = SourceMapBuilder(sourceMapOutput, environment);\n parseTree = ParseTree(sourceMapBuilder);\n importManager = ImportManager(environment);\n\n const render = Render(environment, parseTree, importManager);\n const parse = Parse(environment, parseTree, importManager);\n\n const initial = {\n version: [4, 0, 0],\n data,\n tree,\n Environment,\n AbstractFileManager,\n AbstractPluginLoader,\n environment,\n visitors,\n Parser,\n functions: functions(environment),\n contexts,\n SourceMapOutput: sourceMapOutput,\n SourceMapBuilder: sourceMapBuilder,\n ParseTree: parseTree,\n ImportManager: importManager,\n render,\n parse,\n LessError,\n transformTree,\n utils,\n PluginManager,\n logger\n };\n\n // Create a public API\n\n const ctor = function(t) {\n return function() {\n const obj = Object.create(t.prototype);\n t.apply(obj, Array.prototype.slice.call(arguments, 0));\n return obj;\n };\n };\n let t;\n const api = Object.create(initial);\n for (const n in initial.tree) {\n /* eslint guard-for-in: 0 */\n t = initial.tree[n];\n if (typeof t === 'function') {\n api[n.toLowerCase()] = ctor(t);\n }\n else {\n api[n] = Object.create(null);\n for (const o in t) {\n /* eslint guard-for-in: 0 */\n api[n][o.toLowerCase()] = ctor(t[o]);\n }\n }\n }\n\n /**\n * Some of the functions assume a `this` context of the API object,\n * which causes it to fail when wrapped for ES6 imports.\n * \n * An assumed `this` should be removed in the future.\n */\n initial.parse = initial.parse.bind(api);\n initial.render = initial.render.bind(api);\n\n return api;\n};\n","import LessError from './less-error';\nimport transformTree from './transform-tree';\nimport logger from './logger';\n\nexport default function(SourceMapBuilder) {\n class ParseTree {\n constructor(root, imports) {\n this.root = root;\n this.imports = imports;\n }\n\n toCSS(options) {\n let evaldRoot;\n const result = {};\n let sourceMapBuilder;\n try {\n evaldRoot = transformTree(this.root, options);\n } catch (e) {\n throw new LessError(e, this.imports);\n }\n\n try {\n const compress = Boolean(options.compress);\n if (compress) {\n logger.warn('The compress option has been deprecated. ' + \n 'We recommend you use a dedicated css minifier, for instance see less-plugin-clean-css.');\n }\n\n const toCSSOptions = {\n compress,\n dumpLineNumbers: options.dumpLineNumbers,\n strictUnits: Boolean(options.strictUnits),\n numPrecision: 8};\n\n if (options.sourceMap) {\n sourceMapBuilder = new SourceMapBuilder(options.sourceMap);\n result.css = sourceMapBuilder.toCSS(evaldRoot, toCSSOptions, this.imports);\n } else {\n result.css = evaldRoot.toCSS(toCSSOptions);\n }\n } catch (e) {\n throw new LessError(e, this.imports);\n }\n\n if (options.pluginManager) {\n const postProcessors = options.pluginManager.getPostProcessors();\n for (let i = 0; i < postProcessors.length; i++) {\n result.css = postProcessors[i].process(result.css, { sourceMap: sourceMapBuilder, options, imports: this.imports });\n }\n }\n if (options.sourceMap) {\n result.map = sourceMapBuilder.getExternalSourceMap();\n }\n\n result.imports = [];\n for (const file in this.imports.files) {\n if (this.imports.files.hasOwnProperty(file) && file !== this.imports.rootFilename) {\n result.imports.push(file);\n }\n }\n return result;\n }\n }\n\n return ParseTree;\n};\n","export default function (SourceMapOutput, environment) {\n class SourceMapBuilder {\n constructor(options) {\n this.options = options;\n }\n\n toCSS(rootNode, options, imports) {\n const sourceMapOutput = new SourceMapOutput(\n {\n contentsIgnoredCharsMap: imports.contentsIgnoredChars,\n rootNode,\n contentsMap: imports.contents,\n sourceMapFilename: this.options.sourceMapFilename,\n sourceMapURL: this.options.sourceMapURL,\n outputFilename: this.options.sourceMapOutputFilename,\n sourceMapBasepath: this.options.sourceMapBasepath,\n sourceMapRootpath: this.options.sourceMapRootpath,\n outputSourceFiles: this.options.outputSourceFiles,\n sourceMapGenerator: this.options.sourceMapGenerator,\n sourceMapFileInline: this.options.sourceMapFileInline, \n disableSourcemapAnnotation: this.options.disableSourcemapAnnotation\n });\n\n const css = sourceMapOutput.toCSS(options);\n this.sourceMap = sourceMapOutput.sourceMap;\n this.sourceMapURL = sourceMapOutput.sourceMapURL;\n if (this.options.sourceMapInputFilename) {\n this.sourceMapInputFilename = sourceMapOutput.normalizeFilename(this.options.sourceMapInputFilename);\n }\n if (this.options.sourceMapBasepath !== undefined && this.sourceMapURL !== undefined) {\n this.sourceMapURL = sourceMapOutput.removeBasepath(this.sourceMapURL);\n }\n return css + this.getCSSAppendage();\n }\n\n getCSSAppendage() {\n\n let sourceMapURL = this.sourceMapURL;\n if (this.options.sourceMapFileInline) {\n if (this.sourceMap === undefined) {\n return '';\n }\n sourceMapURL = `data:application/json;base64,${environment.encodeBase64(this.sourceMap)}`;\n }\n\n if (this.options.disableSourcemapAnnotation) {\n return '';\n }\n\n if (sourceMapURL) {\n return `/*# sourceMappingURL=${sourceMapURL} */`;\n }\n return '';\n }\n\n getExternalSourceMap() {\n return this.sourceMap;\n }\n\n setExternalSourceMap(sourceMap) {\n this.sourceMap = sourceMap;\n }\n\n isInline() {\n return this.options.sourceMapFileInline;\n }\n\n getSourceMapURL() {\n return this.sourceMapURL;\n }\n\n getOutputFilename() {\n return this.options.sourceMapOutputFilename;\n }\n\n getInputFilename() {\n return this.sourceMapInputFilename;\n }\n }\n\n return SourceMapBuilder;\n};\n","export default function (environment) {\n class SourceMapOutput {\n constructor(options) {\n this._css = [];\n this._rootNode = options.rootNode;\n this._contentsMap = options.contentsMap;\n this._contentsIgnoredCharsMap = options.contentsIgnoredCharsMap;\n if (options.sourceMapFilename) {\n this._sourceMapFilename = options.sourceMapFilename.replace(/\\\\/g, '/');\n }\n this._outputFilename = options.outputFilename;\n this.sourceMapURL = options.sourceMapURL;\n if (options.sourceMapBasepath) {\n this._sourceMapBasepath = options.sourceMapBasepath.replace(/\\\\/g, '/');\n }\n if (options.sourceMapRootpath) {\n this._sourceMapRootpath = options.sourceMapRootpath.replace(/\\\\/g, '/');\n if (this._sourceMapRootpath.charAt(this._sourceMapRootpath.length - 1) !== '/') {\n this._sourceMapRootpath += '/';\n }\n } else {\n this._sourceMapRootpath = '';\n }\n this._outputSourceFiles = options.outputSourceFiles;\n this._sourceMapGeneratorConstructor = environment.getSourceMapGenerator();\n\n this._lineNumber = 0;\n this._column = 0;\n }\n\n removeBasepath(path) {\n if (this._sourceMapBasepath && path.indexOf(this._sourceMapBasepath) === 0) {\n path = path.substring(this._sourceMapBasepath.length);\n if (path.charAt(0) === '\\\\' || path.charAt(0) === '/') {\n path = path.substring(1);\n }\n }\n\n return path;\n }\n\n normalizeFilename(filename) {\n filename = filename.replace(/\\\\/g, '/');\n filename = this.removeBasepath(filename);\n return (this._sourceMapRootpath || '') + filename;\n }\n\n add(chunk, fileInfo, index, mapLines) {\n\n // ignore adding empty strings\n if (!chunk) {\n return;\n }\n\n let lines, sourceLines, columns, sourceColumns, i;\n\n if (fileInfo && fileInfo.filename) {\n let inputSource = this._contentsMap[fileInfo.filename];\n\n // remove vars/banner added to the top of the file\n if (this._contentsIgnoredCharsMap[fileInfo.filename]) {\n // adjust the index\n index -= this._contentsIgnoredCharsMap[fileInfo.filename];\n if (index < 0) { index = 0; }\n // adjust the source\n inputSource = inputSource.slice(this._contentsIgnoredCharsMap[fileInfo.filename]);\n }\n\n // ignore empty content\n if (inputSource === undefined) {\n return;\n }\n\n inputSource = inputSource.substring(0, index);\n sourceLines = inputSource.split('\\n');\n sourceColumns = sourceLines[sourceLines.length - 1];\n }\n\n lines = chunk.split('\\n');\n columns = lines[lines.length - 1];\n\n if (fileInfo && fileInfo.filename) {\n if (!mapLines) {\n this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + 1, column: this._column},\n original: { line: sourceLines.length, column: sourceColumns.length},\n source: this.normalizeFilename(fileInfo.filename)});\n } else {\n for (i = 0; i < lines.length; i++) {\n this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + i + 1, column: i === 0 ? this._column : 0},\n original: { line: sourceLines.length + i, column: i === 0 ? sourceColumns.length : 0},\n source: this.normalizeFilename(fileInfo.filename)});\n }\n }\n }\n\n if (lines.length === 1) {\n this._column += columns.length;\n } else {\n this._lineNumber += lines.length - 1;\n this._column = columns.length;\n }\n\n this._css.push(chunk);\n }\n\n isEmpty() {\n return this._css.length === 0;\n }\n\n toCSS(context) {\n this._sourceMapGenerator = new this._sourceMapGeneratorConstructor({ file: this._outputFilename, sourceRoot: null });\n\n if (this._outputSourceFiles) {\n for (const filename in this._contentsMap) {\n if (this._contentsMap.hasOwnProperty(filename)) {\n let source = this._contentsMap[filename];\n if (this._contentsIgnoredCharsMap[filename]) {\n source = source.slice(this._contentsIgnoredCharsMap[filename]);\n }\n this._sourceMapGenerator.setSourceContent(this.normalizeFilename(filename), source);\n }\n }\n }\n\n this._rootNode.genCSS(context, this);\n\n if (this._css.length > 0) {\n let sourceMapURL;\n const sourceMapContent = JSON.stringify(this._sourceMapGenerator.toJSON());\n\n if (this.sourceMapURL) {\n sourceMapURL = this.sourceMapURL;\n } else if (this._sourceMapFilename) {\n sourceMapURL = this._sourceMapFilename;\n }\n this.sourceMapURL = sourceMapURL;\n\n this.sourceMap = sourceMapContent;\n }\n\n return this._css.join('');\n }\n }\n\n return SourceMapOutput;\n};\n","import contexts from './contexts';\nimport Parser from './parser/parser';\nimport LessError from './less-error';\nimport * as utils from './utils';\nimport logger from './logger';\n\nexport default function(environment) {\n // FileInfo = {\n // 'rewriteUrls' - option - whether to adjust URL's to be relative\n // 'filename' - full resolved filename of current file\n // 'rootpath' - path to append to normal URLs for this node\n // 'currentDirectory' - path to the current file, absolute\n // 'rootFilename' - filename of the base file\n // 'entryPath' - absolute path to the entry file\n // 'reference' - whether the file should not be output and only output parts that are referenced\n\n class ImportManager {\n constructor(less, context, rootFileInfo) {\n this.less = less;\n this.rootFilename = rootFileInfo.filename;\n this.paths = context.paths || []; // Search paths, when importing\n this.contents = {}; // map - filename to contents of all the files\n this.contentsIgnoredChars = {}; // map - filename to lines at the beginning of each file to ignore\n this.mime = context.mime;\n this.error = null;\n this.context = context;\n // Deprecated? Unused outside of here, could be useful.\n this.queue = []; // Files which haven't been imported yet\n this.files = {}; // Holds the imported parse trees.\n }\n\n /**\n * Add an import to be imported\n * @param path - the raw path\n * @param tryAppendExtension - whether to try appending a file extension (.less or .js if the path has no extension)\n * @param currentFileInfo - the current file info (used for instance to work out relative paths)\n * @param importOptions - import options\n * @param callback - callback for when it is imported\n */\n push(path, tryAppendExtension, currentFileInfo, importOptions, callback) {\n const importManager = this, pluginLoader = this.context.pluginManager.Loader;\n\n this.queue.push(path);\n\n const fileParsedFunc = function (e, root, fullPath) {\n importManager.queue.splice(importManager.queue.indexOf(path), 1); // Remove the path from the queue\n\n const importedEqualsRoot = fullPath === importManager.rootFilename;\n if (importOptions.optional && e) {\n callback(null, {rules:[]}, false, null);\n logger.info(`The file ${fullPath} was skipped because it was not found and the import was marked optional.`);\n }\n else {\n // Inline imports aren't cached here.\n // If we start to cache them, please make sure they won't conflict with non-inline imports of the\n // same name as they used to do before this comment and the condition below have been added.\n if (!importManager.files[fullPath] && !importOptions.inline) {\n importManager.files[fullPath] = { root, options: importOptions };\n }\n if (e && !importManager.error) { importManager.error = e; }\n callback(e, root, importedEqualsRoot, fullPath);\n }\n };\n\n const newFileInfo = {\n rewriteUrls: this.context.rewriteUrls,\n entryPath: currentFileInfo.entryPath,\n rootpath: currentFileInfo.rootpath,\n rootFilename: currentFileInfo.rootFilename\n };\n\n const fileManager = environment.getFileManager(path, currentFileInfo.currentDirectory, this.context, environment);\n\n if (!fileManager) {\n fileParsedFunc({ message: `Could not find a file-manager for ${path}` });\n return;\n }\n\n const loadFileCallback = function(loadedFile) {\n let plugin;\n const resolvedFilename = loadedFile.filename;\n const contents = loadedFile.contents.replace(/^\\uFEFF/, '');\n\n // Pass on an updated rootpath if path of imported file is relative and file\n // is in a (sub|sup) directory\n //\n // Examples:\n // - If path of imported file is 'module/nav/nav.less' and rootpath is 'less/',\n // then rootpath should become 'less/module/nav/'\n // - If path of imported file is '../mixins.less' and rootpath is 'less/',\n // then rootpath should become 'less/../'\n newFileInfo.currentDirectory = fileManager.getPath(resolvedFilename);\n if (newFileInfo.rewriteUrls) {\n newFileInfo.rootpath = fileManager.join(\n (importManager.context.rootpath || ''),\n fileManager.pathDiff(newFileInfo.currentDirectory, newFileInfo.entryPath));\n\n if (!fileManager.isPathAbsolute(newFileInfo.rootpath) && fileManager.alwaysMakePathsAbsolute()) {\n newFileInfo.rootpath = fileManager.join(newFileInfo.entryPath, newFileInfo.rootpath);\n }\n }\n newFileInfo.filename = resolvedFilename;\n\n const newEnv = new contexts.Parse(importManager.context);\n\n newEnv.processImports = false;\n importManager.contents[resolvedFilename] = contents;\n\n if (currentFileInfo.reference || importOptions.reference) {\n newFileInfo.reference = true;\n }\n\n if (importOptions.isPlugin) {\n plugin = pluginLoader.evalPlugin(contents, newEnv, importManager, importOptions.pluginArgs, newFileInfo);\n if (plugin instanceof LessError) {\n fileParsedFunc(plugin, null, resolvedFilename);\n }\n else {\n fileParsedFunc(null, plugin, resolvedFilename);\n }\n } else if (importOptions.inline) {\n fileParsedFunc(null, contents, resolvedFilename);\n } else {\n\n // import (multiple) parse trees apparently get altered and can't be cached.\n // TODO: investigate why this is\n if (importManager.files[resolvedFilename]\n && !importManager.files[resolvedFilename].options.multiple\n && !importOptions.multiple) {\n\n fileParsedFunc(null, importManager.files[resolvedFilename].root, resolvedFilename);\n }\n else {\n new Parser(newEnv, importManager, newFileInfo).parse(contents, function (e, root) {\n fileParsedFunc(e, root, resolvedFilename);\n });\n }\n }\n };\n let loadedFile;\n let promise;\n const context = utils.clone(this.context);\n\n if (tryAppendExtension) {\n context.ext = importOptions.isPlugin ? '.js' : '.less';\n }\n\n if (importOptions.isPlugin) {\n context.mime = 'application/javascript';\n\n if (context.syncImport) {\n loadedFile = pluginLoader.loadPluginSync(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n } else {\n promise = pluginLoader.loadPlugin(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n }\n }\n else {\n if (context.syncImport) {\n loadedFile = fileManager.loadFileSync(path, currentFileInfo.currentDirectory, context, environment);\n } else {\n promise = fileManager.loadFile(path, currentFileInfo.currentDirectory, context, environment,\n (err, loadedFile) => {\n if (err) {\n fileParsedFunc(err);\n } else {\n loadFileCallback(loadedFile);\n }\n });\n }\n }\n if (loadedFile) {\n if (!loadedFile.filename) {\n fileParsedFunc(loadedFile);\n } else {\n loadFileCallback(loadedFile);\n }\n } else if (promise) {\n promise.then(loadFileCallback, fileParsedFunc);\n }\n }\n }\n\n return ImportManager;\n};\n","import * as utils from './utils';\n\nexport default function(environment, ParseTree, ImportManager) {\n const render = function (input, options, callback) {\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(this.options, {});\n }\n else {\n options = utils.copyOptions(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n return new Promise(function (resolve, reject) {\n render.call(self, input, options, function(err, output) {\n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n this.parse(input, options, function(err, root, imports, options) {\n if (err) { return callback(err); }\n\n let result;\n try {\n const parseTree = new ParseTree(root, imports);\n result = parseTree.toCSS(options);\n }\n catch (err) { return callback(err); }\n\n callback(null, result);\n });\n }\n };\n\n return render;\n};\n","import contexts from './contexts';\nimport Parser from './parser/parser';\nimport PluginManager from './plugin-manager';\nimport LessError from './less-error';\nimport * as utils from './utils';\n\nexport default function(environment, ParseTree, ImportManager) {\n const parse = function (input, options, callback) {\n\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(this.options, {});\n }\n else {\n options = utils.copyOptions(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n return new Promise(function (resolve, reject) {\n parse.call(self, input, options, function(err, output) {\n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n let context;\n let rootFileInfo;\n const pluginManager = new PluginManager(this, !options.reUsePluginManager);\n\n options.pluginManager = pluginManager;\n\n context = new contexts.Parse(options);\n\n if (options.rootFileInfo) {\n rootFileInfo = options.rootFileInfo;\n } else {\n const filename = options.filename || 'input';\n const entryPath = filename.replace(/[^\\/\\\\]*$/, '');\n rootFileInfo = {\n filename,\n rewriteUrls: context.rewriteUrls,\n rootpath: context.rootpath || '',\n currentDirectory: entryPath,\n entryPath,\n rootFilename: filename\n };\n // add in a missing trailing slash\n if (rootFileInfo.rootpath && rootFileInfo.rootpath.slice(-1) !== '/') {\n rootFileInfo.rootpath += '/';\n }\n }\n\n const imports = new ImportManager(this, context, rootFileInfo);\n this.importManager = imports;\n\n // TODO: allow the plugins to be just a list of paths or names\n // Do an async plugin queue like lessc\n\n if (options.plugins) {\n options.plugins.forEach(function(plugin) {\n let evalResult, contents;\n if (plugin.fileContent) {\n contents = plugin.fileContent.replace(/^\\uFEFF/, '');\n evalResult = pluginManager.Loader.evalPlugin(contents, context, imports, plugin.options, plugin.filename);\n if (evalResult instanceof LessError) {\n return callback(evalResult);\n }\n }\n else {\n pluginManager.addPlugin(plugin);\n }\n });\n }\n\n new Parser(context, imports, rootFileInfo)\n .parse(input, function (e, root) {\n if (e) { return callback(e); }\n callback(null, root, imports, options);\n }, options);\n }\n };\n return parse;\n};\n","// TODO: Add tests for browser @plugin\n/* global window */\n\nimport AbstractPluginLoader from '../less/environment/abstract-plugin-loader.js';\n\n/**\n * Browser Plugin Loader\n */\nclass PluginLoader extends AbstractPluginLoader {\n constructor(less) {\n super();\n\n this.less = less;\n // Should we shim this.require for browser? Probably not?\n }\n\n loadPlugin(filename, basePath, context, environment, fileManager) {\n return new Promise((fulfill, reject) => {\n fileManager.loadFile(filename, basePath, context, environment)\n .then(fulfill).catch(reject);\n });\n }\n}\n\nexport default PluginLoader;\n\n","import * as utils from './utils';\nimport browser from './browser';\n\nexport default (window, less, options) => {\n\n function errorHTML(e, rootHref) {\n const id = `less-error-message:${utils.extractId(rootHref || '')}`;\n const template = '
  • {content}
  • ';\n const elem = window.document.createElement('div');\n let timer;\n let content;\n const errors = [];\n const filename = e.filename || rootHref;\n const filenameNoPath = filename.match(/([^\\/]+(\\?.*)?)$/)[1];\n\n elem.id = id;\n elem.className = 'less-error-message';\n\n content = `

    ${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'}` + \n `

    in ${filenameNoPath} `;\n\n const errorline = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\{content\\}/, e.extract[i]));\n }\n };\n\n if (e.line) {\n errorline(e, 0, '');\n errorline(e, 1, 'line');\n errorline(e, 2, '');\n content += `on line ${e.line}, column ${e.column + 1}:

      ${errors.join('')}
    `;\n }\n if (e.stack && (e.extract || options.logLevel >= 4)) {\n content += `
    Stack Trace
    ${e.stack.split('\\n').slice(1).join('
    ')}`;\n }\n elem.innerHTML = content;\n\n // CSS for error messages\n browser.createCSS(window.document, [\n '.less-error-message ul, .less-error-message li {',\n 'list-style-type: none;',\n 'margin-right: 15px;',\n 'padding: 4px 0;',\n 'margin: 0;',\n '}',\n '.less-error-message label {',\n 'font-size: 12px;',\n 'margin-right: 15px;',\n 'padding: 4px 0;',\n 'color: #cc7777;',\n '}',\n '.less-error-message pre {',\n 'color: #dd6666;',\n 'padding: 4px 0;',\n 'margin: 0;',\n 'display: inline-block;',\n '}',\n '.less-error-message pre.line {',\n 'color: #ff0000;',\n '}',\n '.less-error-message h3 {',\n 'font-size: 20px;',\n 'font-weight: bold;',\n 'padding: 15px 0 5px 0;',\n 'margin: 0;',\n '}',\n '.less-error-message a {',\n 'color: #10a',\n '}',\n '.less-error-message .error {',\n 'color: red;',\n 'font-weight: bold;',\n 'padding-bottom: 2px;',\n 'border-bottom: 1px dashed red;',\n '}'\n ].join('\\n'), { title: 'error-message' });\n\n elem.style.cssText = [\n 'font-family: Arial, sans-serif',\n 'border: 1px solid #e00',\n 'background-color: #eee',\n 'border-radius: 5px',\n '-webkit-border-radius: 5px',\n '-moz-border-radius: 5px',\n 'color: #e00',\n 'padding: 15px',\n 'margin-bottom: 15px'\n ].join(';');\n\n if (options.env === 'development') {\n timer = setInterval(() => {\n const document = window.document;\n const body = document.body;\n if (body) {\n if (document.getElementById(id)) {\n body.replaceChild(elem, document.getElementById(id));\n } else {\n body.insertBefore(elem, body.firstChild);\n }\n clearInterval(timer);\n }\n }, 10);\n }\n }\n\n function removeErrorHTML(path) {\n const node = window.document.getElementById(`less-error-message:${utils.extractId(path)}`);\n if (node) {\n node.parentNode.removeChild(node);\n }\n }\n\n function removeErrorConsole(path) {\n // no action\n }\n\n function removeError(path) {\n if (!options.errorReporting || options.errorReporting === 'html') {\n removeErrorHTML(path);\n } else if (options.errorReporting === 'console') {\n removeErrorConsole(path);\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('remove', path);\n }\n }\n\n function errorConsole(e, rootHref) {\n const template = '{line} {content}';\n const filename = e.filename || rootHref;\n const errors = [];\n let content = `${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'} in ${filename}`;\n\n const errorline = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\{content\\}/, e.extract[i]));\n }\n };\n\n if (e.line) {\n errorline(e, 0, '');\n errorline(e, 1, 'line');\n errorline(e, 2, '');\n content += ` on line ${e.line}, column ${e.column + 1}:\\n${errors.join('\\n')}`;\n }\n if (e.stack && (e.extract || options.logLevel >= 4)) {\n content += `\\nStack Trace\\n${e.stack}`;\n }\n less.logger.error(content);\n }\n\n function error(e, rootHref) {\n if (!options.errorReporting || options.errorReporting === 'html') {\n errorHTML(e, rootHref);\n } else if (options.errorReporting === 'console') {\n errorConsole(e, rootHref);\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('add', e, rootHref);\n }\n }\n\n return {\n add: error,\n remove: removeError\n };\n};\n","/**\n * Kicks off less and compiles any stylesheets\n * used in the browser distributed version of less\n * to kick-start less using the browser api\n */\n/* global window, document */\n\nimport defaultOptions from '../less/default-options';\nimport addDefaultOptions from './add-default-options';\nimport root from './index';\n\nconst options = defaultOptions();\n\nif (window.less) {\n for (const key in window.less) {\n if (window.less.hasOwnProperty(key)) {\n options[key] = window.less[key];\n }\n }\n}\naddDefaultOptions(window, options);\n\noptions.plugins = options.plugins || [];\n\nif (window.LESS_PLUGINS) {\n options.plugins = options.plugins.concat(window.LESS_PLUGINS);\n}\n\nconst less = root(window, options);\nexport default less;\n\nwindow.less = less;\n\nlet css;\nlet head;\nlet style;\n\n// Always restore page visibility\nfunction resolveOrReject(data) {\n if (data.filename) {\n console.warn(data);\n }\n if (!options.async) {\n head.removeChild(style);\n }\n}\n\nif (options.onReady) {\n if (/!watch/.test(window.location.hash)) {\n less.watch();\n }\n // Simulate synchronous stylesheet loading by hiding page rendering\n if (!options.async) {\n css = 'body { display: none !important }';\n head = document.head || document.getElementsByTagName('head')[0];\n style = document.createElement('style');\n\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n\n head.appendChild(style);\n }\n less.registerStylesheetsImmediately();\n less.pageLoadFinished = less.refresh(less.env === 'development').then(resolveOrReject, resolveOrReject);\n}\n","// Export a new default each time\nexport default function() {\n return {\n /* Inline Javascript - @plugin still allowed */\n javascriptEnabled: false,\n\n /* Outputs a makefile import dependency list to stdout. */\n depends: false,\n\n /* (DEPRECATED) Compress using less built-in compression. \n * This does an okay job but does not utilise all the tricks of \n * dedicated css compression. */\n compress: false,\n\n /* Runs the less parser and just reports errors without any output. */\n lint: false,\n\n /* Sets available include paths.\n * If the file in an @import rule does not exist at that exact location, \n * less will look for it at the location(s) passed to this option. \n * You might use this for instance to specify a path to a library which \n * you want to be referenced simply and relatively in the less files. */\n paths: [],\n\n /* color output in the terminal */\n color: true,\n\n /* The strictImports controls whether the compiler will allow an @import inside of either \n * @media blocks or (a later addition) other selector blocks.\n * See: https://github.com/less/less.js/issues/656 */\n strictImports: false,\n\n /* Allow Imports from Insecure HTTPS Hosts */\n insecure: false,\n\n /* Allows you to add a path to every generated import and url in your css. \n * This does not affect less import statements that are processed, just ones \n * that are left in the output css. */\n rootpath: '',\n\n /* By default URLs are kept as-is, so if you import a file in a sub-directory \n * that references an image, exactly the same URL will be output in the css. \n * This option allows you to re-write URL's in imported files so that the \n * URL is always relative to the base imported file */\n rewriteUrls: false,\n\n /* How to process math \n * 0 always - eagerly try to solve all operations\n * 1 parens-division - require parens for division \"/\"\n * 2 parens | strict - require parens for all operations\n * 3 strict-legacy - legacy strict behavior (super-strict)\n */\n math: 1,\n\n /* Without this option, less attempts to guess at the output unit when it does maths. */\n strictUnits: false,\n\n /* Effectively the declaration is put at the top of your base Less file, \n * meaning it can be used but it also can be overridden if this variable \n * is defined in the file. */\n globalVars: null,\n\n /* As opposed to the global variable option, this puts the declaration at the\n * end of your base file, meaning it will override anything defined in your Less file. */\n modifyVars: null,\n\n /* This option allows you to specify a argument to go on to every URL. */\n urlArgs: ''\n }\n};","import {addDataAttr} from './utils';\nimport browser from './browser';\n\nexport default (window, options) => {\n\n // use options from the current script tag data attribues\n addDataAttr(options, browser.currentScript(window));\n\n if (options.isFileProtocol === undefined) {\n options.isFileProtocol = /^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(window.location.protocol);\n }\n\n // Load styles asynchronously (default: false)\n //\n // This is set to `false` by default, so that the body\n // doesn't start loading before the stylesheets are parsed.\n // Setting this to `true` can result in flickering.\n //\n options.async = options.async || false;\n options.fileAsync = options.fileAsync || false;\n\n // Interval between watch polls\n options.poll = options.poll || (options.isFileProtocol ? 1000 : 1500);\n\n options.env = options.env || (window.location.hostname == '127.0.0.1' ||\n window.location.hostname == '0.0.0.0' ||\n window.location.hostname == 'localhost' ||\n (window.location.port &&\n window.location.port.length > 0) ||\n options.isFileProtocol ? 'development'\n : 'production');\n\n const dumpLineNumbers = /!dumpLineNumbers:(comments|mediaquery|all)/.exec(window.location.hash);\n if (dumpLineNumbers) {\n options.dumpLineNumbers = dumpLineNumbers[1];\n }\n\n if (options.useFileCache === undefined) {\n options.useFileCache = true;\n }\n\n if (options.onReady === undefined) {\n options.onReady = true;\n }\n\n if (options.relativeUrls) {\n options.rewriteUrls = 'all';\n }\n};\n","//\n// index.js\n// Should expose the additional browser functions on to the less object\n//\nimport {addDataAttr} from './utils';\nimport lessRoot from '../less';\nimport browser from './browser';\nimport FM from './file-manager';\nimport PluginLoader from './plugin-loader';\nimport LogListener from './log-listener';\nimport ErrorReporting from './error-reporting';\nimport Cache from './cache';\nimport ImageSize from './image-size';\n\nexport default (window, options) => {\n const document = window.document;\n const less = lessRoot();\n\n less.options = options;\n const environment = less.environment;\n const FileManager = FM(options, less.logger);\n const fileManager = new FileManager();\n environment.addFileManager(fileManager);\n less.FileManager = FileManager;\n less.PluginLoader = PluginLoader;\n\n LogListener(less, options);\n const errors = ErrorReporting(window, less, options);\n const cache = less.cache = options.cache || Cache(window, options, less.logger);\n ImageSize(less.environment);\n\n // Setup user functions - Deprecate?\n if (options.functions) {\n less.functions.functionRegistry.addMultiple(options.functions);\n }\n\n const typePattern = /^text\\/(x-)?less$/;\n\n function clone(obj) {\n const cloned = {};\n for (const prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n cloned[prop] = obj[prop];\n }\n }\n return cloned;\n }\n\n // only really needed for phantom\n function bind(func, thisArg) {\n const curryArgs = Array.prototype.slice.call(arguments, 2);\n return function() {\n const args = curryArgs.concat(Array.prototype.slice.call(arguments, 0));\n return func.apply(thisArg, args);\n };\n }\n\n function loadStyles(modifyVars) {\n const styles = document.getElementsByTagName('style');\n let style;\n\n for (let i = 0; i < styles.length; i++) {\n style = styles[i];\n if (style.type.match(typePattern)) {\n const instanceOptions = clone(options);\n instanceOptions.modifyVars = modifyVars;\n const lessText = style.innerHTML || '';\n instanceOptions.filename = document.location.href.replace(/#.*$/, '');\n\n /* jshint loopfunc:true */\n // use closure to store current style\n less.render(lessText, instanceOptions,\n bind((style, e, result) => {\n if (e) {\n errors.add(e, 'inline');\n } else {\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = result.css;\n } else {\n style.innerHTML = result.css;\n }\n }\n }, null, style));\n }\n }\n }\n\n function loadStyleSheet(sheet, callback, reload, remaining, modifyVars) {\n\n const instanceOptions = clone(options);\n addDataAttr(instanceOptions, sheet);\n instanceOptions.mime = sheet.type;\n\n if (modifyVars) {\n instanceOptions.modifyVars = modifyVars;\n }\n\n function loadInitialFileCallback(loadedFile) {\n const data = loadedFile.contents;\n const path = loadedFile.filename;\n const webInfo = loadedFile.webInfo;\n\n const newFileInfo = {\n currentDirectory: fileManager.getPath(path),\n filename: path,\n rootFilename: path,\n rewriteUrls: instanceOptions.rewriteUrls\n };\n\n newFileInfo.entryPath = newFileInfo.currentDirectory;\n newFileInfo.rootpath = instanceOptions.rootpath || newFileInfo.currentDirectory;\n\n if (webInfo) {\n webInfo.remaining = remaining;\n\n const css = cache.getCSS(path, webInfo, instanceOptions.modifyVars);\n if (!reload && css) {\n webInfo.local = true;\n callback(null, css, data, sheet, webInfo, path);\n return;\n }\n\n }\n\n // TODO add tests around how this behaves when reloading\n errors.remove(path);\n\n instanceOptions.rootFileInfo = newFileInfo;\n less.render(data, instanceOptions, (e, result) => {\n if (e) {\n e.href = path;\n callback(e);\n } else {\n cache.setCSS(sheet.href, webInfo.lastModified, instanceOptions.modifyVars, result.css);\n callback(null, result.css, data, sheet, webInfo, path);\n }\n });\n }\n\n fileManager.loadFile(sheet.href, null, instanceOptions, environment)\n .then(loadedFile => {\n loadInitialFileCallback(loadedFile);\n }).catch(err => {\n console.log(err);\n callback(err);\n });\n\n }\n\n function loadStyleSheets(callback, reload, modifyVars) {\n for (let i = 0; i < less.sheets.length; i++) {\n loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1), modifyVars);\n }\n }\n\n function initRunningMode() {\n if (less.env === 'development') {\n less.watchTimer = setInterval(() => {\n if (less.watchMode) {\n fileManager.clearFileCache();\n loadStyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n } else if (css) {\n browser.createCSS(window.document, css, sheet);\n }\n });\n }\n }, options.poll);\n }\n }\n\n //\n // Watch mode\n //\n less.watch = function () {\n if (!less.watchMode ) {\n less.env = 'development';\n initRunningMode();\n }\n this.watchMode = true;\n return true;\n };\n\n less.unwatch = function () {clearInterval(less.watchTimer); this.watchMode = false; return false; };\n\n //\n // Synchronously get all tags with the 'rel' attribute set to\n // \"stylesheet/less\".\n //\n less.registerStylesheetsImmediately = () => {\n const links = document.getElementsByTagName('link');\n less.sheets = [];\n\n for (let i = 0; i < links.length; i++) {\n if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) &&\n (links[i].type.match(typePattern)))) {\n less.sheets.push(links[i]);\n }\n }\n };\n\n //\n // Asynchronously get all tags with the 'rel' attribute set to\n // \"stylesheet/less\", returning a Promise.\n //\n less.registerStylesheets = () => new Promise((resolve, reject) => {\n less.registerStylesheetsImmediately();\n resolve();\n });\n\n //\n // With this function, it's possible to alter variables and re-render\n // CSS without reloading less-files\n //\n less.modifyVars = record => less.refresh(true, record, false);\n\n less.refresh = (reload, modifyVars, clearFileCache) => {\n if ((reload || clearFileCache) && clearFileCache !== false) {\n fileManager.clearFileCache();\n }\n return new Promise((resolve, reject) => {\n let startTime;\n let endTime;\n let totalMilliseconds;\n let remainingSheets;\n startTime = endTime = new Date();\n\n // Set counter for remaining unprocessed sheets\n remainingSheets = less.sheets.length;\n\n if (remainingSheets === 0) {\n\n endTime = new Date();\n totalMilliseconds = endTime - startTime;\n less.logger.info('Less has finished and no sheets were loaded.');\n resolve({\n startTime,\n endTime,\n totalMilliseconds,\n sheets: less.sheets.length\n });\n\n } else {\n // Relies on less.sheets array, callback seems to be guaranteed to be called for every element of the array\n loadStyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n reject(e);\n return;\n }\n if (webInfo.local) {\n less.logger.info(`Loading ${sheet.href} from cache.`);\n } else {\n less.logger.info(`Rendered ${sheet.href} successfully.`);\n }\n browser.createCSS(window.document, css, sheet);\n less.logger.info(`CSS for ${sheet.href} generated in ${new Date() - endTime}ms`);\n\n // Count completed sheet\n remainingSheets--;\n\n // Check if the last remaining sheet was processed and then call the promise\n if (remainingSheets === 0) {\n totalMilliseconds = new Date() - startTime;\n less.logger.info(`Less has finished. CSS generated in ${totalMilliseconds}ms`);\n resolve({\n startTime,\n endTime,\n totalMilliseconds,\n sheets: less.sheets.length\n });\n }\n endTime = new Date();\n }, reload, modifyVars);\n }\n\n loadStyles(modifyVars);\n });\n };\n\n less.refreshStyles = loadStyles;\n return less;\n};\n","export default (less, options) => {\n const logLevel_debug = 4;\n const logLevel_info = 3;\n const logLevel_warn = 2;\n const logLevel_error = 1;\n\n // The amount of logging in the javascript console.\n // 3 - Debug, information and errors\n // 2 - Information and errors\n // 1 - Errors\n // 0 - None\n // Defaults to 2\n options.logLevel = typeof options.logLevel !== 'undefined' ? options.logLevel : (options.env === 'development' ? logLevel_info : logLevel_error);\n\n if (!options.loggers) {\n options.loggers = [{\n debug: function(msg) {\n if (options.logLevel >= logLevel_debug) {\n console.log(msg);\n }\n },\n info: function(msg) {\n if (options.logLevel >= logLevel_info) {\n console.log(msg);\n }\n },\n warn: function(msg) {\n if (options.logLevel >= logLevel_warn) {\n console.warn(msg);\n }\n },\n error: function(msg) {\n if (options.logLevel >= logLevel_error) {\n console.error(msg);\n }\n }\n }];\n }\n for (let i = 0; i < options.loggers.length; i++) {\n less.logger.addListener(options.loggers[i]);\n }\n};\n","// Cache system is a bit outdated and could do with work\n\nexport default (window, options, logger) => {\n let cache = null;\n if (options.env !== 'development') {\n try {\n cache = (typeof window.localStorage === 'undefined') ? null : window.localStorage;\n } catch (_) {}\n }\n return {\n setCSS: function(path, lastModified, modifyVars, styles) {\n if (cache) {\n logger.info(`saving ${path} to cache.`);\n try {\n cache.setItem(path, styles);\n cache.setItem(`${path}:timestamp`, lastModified);\n if (modifyVars) {\n cache.setItem(`${path}:vars`, JSON.stringify(modifyVars));\n }\n } catch (e) {\n // TODO - could do with adding more robust error handling\n logger.error(`failed to save \"${path}\" to local storage for caching.`);\n }\n }\n },\n getCSS: function(path, webInfo, modifyVars) {\n const css = cache && cache.getItem(path);\n const timestamp = cache && cache.getItem(`${path}:timestamp`);\n let vars = cache && cache.getItem(`${path}:vars`);\n\n modifyVars = modifyVars || {};\n vars = vars || \"{}\"; // if not set, treat as the JSON representation of an empty object\n\n if (timestamp && webInfo.lastModified &&\n (new Date(webInfo.lastModified).valueOf() ===\n new Date(timestamp).valueOf()) &&\n JSON.stringify(modifyVars) === vars) {\n // Use local copy\n return css;\n }\n }\n };\n};\n","\nimport functionRegistry from './../less/functions/function-registry';\n\nexport default () => {\n function imageSize() {\n throw {\n type: 'Runtime',\n message: 'Image size functions are not supported in browser version of less'\n };\n }\n\n const imageFunctions = {\n 'image-size': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n },\n 'image-width': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n },\n 'image-height': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n }\n };\n\n functionRegistry.addMultiple(imageFunctions);\n};\n"],"names":["extractId","href","replace","addDataAttr","options","tag","opt","dataset","hasOwnProperty","JSON","parse","_","document","styles","sheet","id","title","utils.extractId","oldStyleNode","getElementById","keepOldStyleNode","styleNode","createElement","setAttribute","media","styleSheet","appendChild","createTextNode","childNodes","length","firstChild","nodeValue","head","getElementsByTagName","nextEl","nextSibling","parentNode","insertBefore","removeChild","cssText","e","Error","window","scripts","currentScript","error","msg","this","_fireEvent","warn","info","debug","addListener","listener","_listeners","push","removeListener","i","splice","type","logFunction","externalEnvironment","fileManagers","requiredFunctions","functions","concat","propName","environmentFunc","bind","Environment","filename","currentDirectory","environment","isSync","logger","pluginManager","getFileManagers","fileManager","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","darkgrey","darkgreen","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","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","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","m","cm","mm","in","px","pt","pc","duration","s","ms","angle","rad","Math","PI","deg","grad","turn","colors","unitConversions","parent","visibilityBlocks","undefined","nodeVisible","rootNode","parsed","self","Object","defineProperty","get","fileInfo","getIndex","Node","nodes","set","node","Array","isArray","forEach","_index","_fileInfo","context","strs","genCSS","add","chunk","index","isEmpty","join","output","value","visitor","visit","op","a","b","precision","numPrecision","Number","toFixed","compare","extendStatics","d","setPrototypeOf","__proto__","p","__extends","__","constructor","prototype","create","__assign","assign","t","n","arguments","call","apply","rgb","originalForm","_super","_this","match","map","c","parseInt","alpha","split","Color","r","g","pow","toCSS","doNotCompress","color","colorFunction","compress","args","fround","indexOf","clamp","round","toHSL","h","l","toRGB","splitcolor","other","_operate","toHex","max","min","v","x","keyword","key","toLowerCase","slice","toString","Paren","eval","_noSpaceCombinators"," ","|","emptyOrWhitespace","trim","Combinator","spaceOrEmpty","combinator","isVariable","currentFileInfo","visibilityInfo","copyVisibilityInfo","setParent","Element","firstSelector","charAt","ALWAYS","PARENS_DIVISION","PARENS","RewriteUrls","getLocation","inputStream","line","column","copyArray","arr","copy","clone","obj","cloned","prop","defaults","obj1","obj2","newObj","_defaults","defaults_1","copyOptions","opts","strictMath","math","Constants.Math","relativeUrls","rewriteUrls","Constants.RewriteUrls","flattenArray","result","length_1","anonymousFunc","LessError","fileContentMap","currentFilename","message","stack","input","contents","loc","utils.getLocation","col","callLine","lines","found","func","Function","lineAdjust","callExtract","extract","F","stylize","str","errorTxt","substr","elements","extendList","condition","evaldCondition","getElements","mixinElements_","Selector","visitArray","newSelector","mediaEmpty","els","parseNode","err","imports","sels","olen","len","mixinElements","shift","extend","createDerived","Value","Keyword","True","False","mapLines","rulesetLike","allowRoot","Anonymous","Boolean","MATH","name","important","merge","inline","variable","Declaration","lastRule","prevMath","evaldValue","mathBypass","evalName","importantScope","importantResult","pop","ctx","lineSeparator","dumpLineNumbers","debugInfo","asComment","asMediaQuery","lineNumber","fileName","filenameWithProtocol","test","isLineComment","Comment","getDebugInfo","isCompressed","contexts","copyFromOriginal","original","destination","propertiesToCopy","parseCopyProperties","Parse","paths","evalCopyProperties","isPathRelative","path","isPathLocalRelative","Eval","frames","enterCalc","calcStack","inCalc","exitCalc","inParenthesis","parensStack","outOfParenthesis","mathOn","isMathOn","pathRequiresRewrite","rewritePath","rootpath","newPath","normalizePath","segment","segments","reverse","makeRegistry","base","_data","addMultiple","keys","getLocalFunctions","inherit","defaultFunc","value_","error_","reset","selectors","rules","strictImports","_lookups","_variables","_properties","Ruleset","selCnt","selector","hasVariable","hasOnePassingSelector","j","toParseSelectors","utils.flattenArray","rule","subRule","utils.copyArray","ruleset","originalRuleset","root","firstRoot","allowImports","functionRegistry","globalFunctionRegistry","ctxFrames","unshift","ctxSelectors","evalImports","rsRules","evalFirst","mediaBlockCount","mediaBlocks","filter","resetCache","isJustParentSelector","bubbleSelectors","importRules","makeImportant","lastSelector","_rulesets","reduce","hash","variables","vars","name_1","name_2","decl","parseValue","properties","toParse","transformDeclaration","nodes_1","filtRules","isRuleset","foundMixins","rulesets","find","ruleNodes","tabLevel","sep","tabRuleStr","tabSetStr","charsetNodeIndex","importNodeIndex","isCharset","pathCnt","pathSubCnt","currentLastRule","isRulesetLike","isVisible","joinSelector","createParenthesis","elementsToPak","originalElement","replacementParen","insideParent","createSelector","containedElement","element","addReplacementIntoPath","beginningPath","addPath","replacedElement","originalSelector","newSelectorPath","newJoinedSelector","parentEl","restOfPath","addAllReplacementsIntoPath","addPaths","mergeElementsOnToSelectors","sel","deriveSelector","deriveFrom","newPaths","replaceParentSelector","inSelector","k","currentElements","newSelectors","selectorsMultiplied","el","maybeSelector","hadParentSelector","nestedSelector","replaced","nestedPaths","replacedNewSelectors","concatenated","isRooted","createEmptySelectors","AtRule","outputRuleset","mediaPathBackup","mediaBlocksBackup","mediaPath","ruleCnt","DetachedRuleset","numerator","denominator","backupUnit","sort","Unit","strictUnits","returnStr","is","unitString","toUpperCase","RegExp","callback","group","mapUnit","groupName","atomicUnit","counter","count","unit","parseFloat","isNaN","Dimension","isSingular","strValue","String","isLength","convertTo","usedUnits","cancel","unify","numericCompare","conversions","targetUnit","applyUnit","derivedConversions","operands","isSpaced","Operation","toColor","operate","noSpacing","Expression","returnValue","parens","doubleParen","parensInOp","functionCaller","evalArgs","commentFilter","item","subNodes","il","jl","calc","Call","currentMathContext","funcCaller","FunctionCaller","isValid","columnNumber","Variable","evaluating","frame","fun","Property","property","mergeRules","less","visitors","ToCSSVisitor","_mergeRules","vArr","Attribute","content","escaped","quote","variableRegex","propRegex","Quoted","that","iterativeReplace","regexp","replacementFnc","evaluatedValue","val","isEvald","URL","urlArgs","features","Media","evalTop","evalNested","multiMedia","permute","fragment","rest","css","pathValue","getPath","Import","isPlugin","reference","containsVariables","doEval","blocksVisibility","addVisibilityBlock","registry","skip","importedFilename","newImport","evalPath","string","expression","JavaScript","evaluateJavaScript","JsEvalNode","evalContext","javascriptEnabled","jsify","toJS","Assignment","negate","lvalue","rvalue","Condition","UnicodeDescriptor","Negative","option","object_id","Extend","next_id","parent_ids","allowBefore","allowAfter","selectorElements","selfElements","selfSelectors","VariableCall","detachedRuleset","callEval","ruleCall","lookups","NamespaceValue","lastDeclaration","substring","params","variadic","arity","optionalParameters","required","Definition","mixinEnv","evaldArguments","varargs","arg","isNamedFound","argIndex","argsLength","prependRule","_arguments","mixinFrames","evalParams","allArgsCnt","requiredArgsCnt","MixinCall","mixins","mixin","mixinPath","argValue","f","isRecursive","isOneFound","candidate","defaultResult","noArgumentsFilter","candidates","conditionResult","calcDefGroup","namespace","matchCondition","expand","matchArgs","MixinDefinition","format","newRules","evalCall","_setVisibilityToReplacement","replacement","AbstractFileManager","lastIndexOf","ext","tryAppendExtension","basePath","laterPath","url","baseUrl","urlDirectories","baseUrlDirectories","urlParts","extractUrlParts","baseUrlParts","diff","hostPart","directories","urlPartsRegex","returner","rawDirectories","rawPath","fileUrl","require","AbstractPluginLoader","pluginOptions","pluginObj","localModule","shortname","FileManager","trySetOptions","use","exports","loader","tree","validatePlugin","minVersion","compareVersion","addPlugin","plugin","setOptions","version","versionToString","aVersion","bVersion","versionString","plugins","printUsage","_visitArgs","visitDeeper","_hasIndexed","_noop","implementation","_implementation","_visitInCache","_visitOutCache","indexNodeTypes","ticker","child","typeIndex","Visitor","nodeTypeIndex","fnName","impl","funcOut","visitArgs","newNode","isReplacing","cnt","accept","nonReplacing","out","evald","flatten","nestedCnt","nestedItem","onSequencerEmpty","variableImports","_onSequencerEmpty","_currentDepth","ImportSequencer","importSequencer","importItem","isReady","tryRun","variableImport","ImportVisitor","importer","finish","_visitor","_importer","_finish","importCount","onceFileDetectionMap","recursionDetector","_sequencer","run","isFinished","visitImport","importNode","inlineCSS","importParent","isVariableImport","addVariableImport","processImportNode","evaldImportNode","evalForImport","multiple","importMultiple","tryAppendLessExtension","onImported","sequencedOnImported","addImport","importedAtRoot","fullPath","importVisitor","isOptional","optional","duplicateImport","oldContext","visitDeclaration","declNode","visitDeclarationOut","visitAtRule","atRuleNode","visitAtRuleOut","visitMixinDefinition","mixinDefinitionNode","visitMixinDefinitionOut","visitRuleset","rulesetNode","visitRulesetOut","visitMedia","mediaNode","visitMediaOut","visible","SetTreeVisibilityVisitor","ensureVisibility","ensureInvisibility","allExtendsStack","ExtendFinderVisitor","allExtends","allSelectorsExtendList","extendOnEveryPath","selectorPath","selExtendList","allSelectorsExtend","foundExtends","findSelfSelectors","firstExtendOnThisSelectorPath","ProcessExtendsVisitor","extendFinder","extendIndices","doExtendChaining","newRoot","checkExtendsForNonMatched","indices","hasFoundMatches","extendsList","extendsListTarget","iterationCount","extendIndex","targetExtendIndex","matches","targetExtend","newExtend","extendsToAdd","extendVisitor","findMatch","selfSelector","extendSelector","extendChainCount","selectorOne","selectorTwo","ruleNode","selectorNode","pathIndex","selectorsToAdd","extendedSelectors","haystackSelectorPath","haystackSelectorIndex","hackstackSelector","hackstackElementIndex","haystackElement","targetCombinator","potentialMatch","needleElements","potentialMatches","matched","initialCombinator","isElementValuesEqual","finished","endPathIndex","endPathElementIndex","elementValue1","elementValue2","replacementSelector","matchIndex","firstElement","newElements","currentSelectorPathIndex","currentSelectorPathElementIndex","currentValue","derived","newAllExtends","lastIndex","JoinSelectorVisitor","getIsOutput","joinSelectors","_context","CSSVisitorUtils","bodyRules","isSilent","owner","thing","originalRules","containsSilentNonBlockedChild","compiledRulesBody","keepOnlyVisibleChilds","removeVisibilityBlock","hasVisibleSelector","utils","mixinNode","visitExtend","extendNode","visitComment","commentNode","resolveVisibility","visitAtRuleWithBody","visitAtRuleWithoutBody","visitAnonymous","anonymousNode","nodeRules","hasFakeRuleset","getBodyRules","charset","comment","checkValidNodes","isRoot","_compileRulesetPaths","nodeRuleCnt","_removeDuplicateRules","isVisibleRuleset","ruleList","ruleCache","ruleCSS","groups","groupsArr","result_1","space_1","comma_1","MarkVisibleSelectorsVisitor","ExtendVisitor","furthest","furthestPossibleErrorMessage","chunks","current","currentPos","saveStack","parserInput","skipWhitespace","nextChar","oldi","oldj","curr","endIndex","mem","inp","charCodeAt","autoCommentAbsorb","nextNewLine","text","commentStore","nextStarSlash","save","restore","possibleErrorMessage","state","forget","isWhitespace","offset","pos","code","$re","tok","exec","$char","$str","tokLength","$quoted","startChar","currentPosition","$parseUntil","testChar","returnVal","inComment","blockDepth","blockStack","parseGroups","startPos","lastPos","loop","char","expected","peek","peekChar","currentChar","prevChar","getInput","peekNotNumeric","start","chunkInput","failFunction","fail","lastOpening","lastOpeningParen","lastMultiComment","lastMultiCommentEndBrace","chunkerCurrentIndex","currentChunkStartIndex","cc","cc2","level","parenLevel","emitFrom","emitChunk","force","fromCharCode","chunker","end","furthestReachedEnd","furthestChar","Parser","parsers","getParserInput","expect","expectChar","parseList","currentIndex","returnNodes","parser","additionalData","globalVars","modifyVars","ignored","preText","serializeVars","preProcessors","getPreProcessors","process","banner","contentsIgnoredChars","primary","endInfo","processImports","extendRule","definition","declaration","variableCall","entities","atrule","foundSemiColon","mixinLookup","quoted","forceEscaped","isEscaped","fromKeyword","customFuncCall","stop","ieAlpha","boolean","if","prevArgs","isSemiColonSeparated","argsComma","argsSemiColon","assignment","literal","dimension","unicodeDescriptor","entity","ch","variableCurly","curly","propertyCurly","colorKeyword","ud","javascript","js","escape","parsedName","inValue","ruleLookups","isRule","getLookup","hasParens","elem","elemIndex","re","isCall","expressionContainsNamed","nameLoop","expressions","hasSep","throwAwayComments","cond","argInfo","conditions","block","lookupValue","attribute","slashedCombinator","isLess","when","blockRuleset","hasDR","ruleProperty","permissiveValue","anonymousValue","untilTokens","done","testCurrentChar","import","dir","importOptions","mediaFeatures","o","optionName","importOption","mediaFeature","pluginArgs","nonVendorSpecificName","hasIdentifier","hasExpression","hasUnknown","hasBlock","sub","addition","multiplication","operation","operand","needsParens","logical","next","conditionAnd","negatedCondition","parenthesisCondition","atomicCondition","body","me","tryConditionFollowedByParenthesis","delim","simpleProperty","If","trueValue","falseValue","colorFunctions","hsla","origColor","hsl","toHSV","number","rgba","size","m1_1","m2_1","hue","hsv","hsva","vs","floor","perm","saturation","lightness","hsvhue","hsvsaturation","hsvvalue","luma","luminance","saturate","amount","method","desaturate","lighten","darken","fadein","fadeout","fade","spin","mix","color1","color2","weight","w","w1","w2","greyscale","contrast","dark","light","threshold","argb","toARGB","tint","shade","colorBlend","mode","cb","cs","ar","cr","ab","as","colorBlendModeFunctions","multiply","screen","overlay","softlight","sqrt","hardlight","difference","abs","exclusion","average","negation","getItemsFromNode","_SELF","~","_i","expr","values","range","step","from","to","stepValue","list","each","rs","iterator","tryEval","Quote","valueName","keyName","indexName","MathHelper","fn","mathFunctions","ceil","sin","cos","atan","asin","acos","mathHelper","fraction","num","minMax","isMin","currentUnified","referenceUnified","unitStatic","unitClone","order","convert","pi","mod","y","percentage","evaluated","encodeURI","pattern","flags","%","token","encodeURIComponent","isa","Type","isunit","isruleset","iscolor","isnumber","isstring","iskeyword","isurl","ispixel","ispercentage","isem","get-unit","colorBlending","fallback","functionThis","data-uri","mimetypeNode","filePathNode","mimetype","filePath","entryPath","fragmentStart","utils.clone","rawBuffer","getFileManager","useBase64","mimeLookup","charsetLookup","fileSync","loadFileSync","buf","encodeBase64","uri","dataUri","svg-gradient","direction","stops","gradientDirectionSvg","position","positionValue","gradientType","rectangleDimension","renderEnv","directionValue","throwArgumentDescriptor","types","evaldRoot","evalEnv","visitorIterator","preEvalVisitors","first","isPreEvalVisitor","isPreVisitor","pm","postProcessors","installedPlugins","pluginCache","Loader","PluginLoader","PluginManager","install","preProcessor","priority","indexToInsertAt","postProcessor","manager","PluginManagerFactory","newFactory","sourceMapOutput","sourceMapBuilder","parseTree","importManager","SourceMapBuilder","ParseTree","transformTree","toCSSOptions","sourceMap","getPostProcessors","file","getExternalSourceMap","files","rootFilename","SourceMapOutput","contentsIgnoredCharsMap","contentsMap","sourceMapFilename","sourceMapURL","outputFilename","sourceMapOutputFilename","sourceMapBasepath","sourceMapRootpath","outputSourceFiles","sourceMapGenerator","sourceMapFileInline","disableSourcemapAnnotation","sourceMapInputFilename","normalizeFilename","removeBasepath","getCSSAppendage","_css","_rootNode","_contentsMap","_contentsIgnoredCharsMap","_sourceMapFilename","_outputFilename","_sourceMapBasepath","_sourceMapRootpath","_outputSourceFiles","_sourceMapGeneratorConstructor","getSourceMapGenerator","_lineNumber","_column","sourceLines","columns","sourceColumns","inputSource","_sourceMapGenerator","addMapping","generated","source","sourceRoot","setSourceContent","sourceMapContent","stringify","toJSON","rootFileInfo","mime","queue","ImportManager","pluginLoader","fileParsedFunc","importedEqualsRoot","newFileInfo","loadedFile","promise","loadFileCallback","resolvedFilename","pathDiff","isPathAbsolute","alwaysMakePathsAbsolute","newEnv","evalPlugin","syncImport","loadPluginSync","loadPlugin","loadFile","then","render","utils.copyOptions","self_1","Promise","resolve","reject","Render","context_1","pluginManager_1","reUsePluginManager","imports_1","evalResult","fileContent","initial","data","ctor","api","fileCache","errback","xhr","XMLHttpRequest","async","isFileProtocol","fileAsync","handleResponse","status","responseText","getResponseHeader","overrideMimeType","open","setRequestHeader","send","onreadystatechange","readyState","location","useFileCache","lessText","webInfo","lastModified","Date","doXHR","log","fulfill","catch","rootHref","errorReporting","errors","errorline","classname","logLevel","errorConsole","timer","filenameNoPath","className","innerHTML","browser","style","env","setInterval","replaceChild","clearInterval","errorHTML","remove","removeErrorHTML","depends","lint","insecure","protocol","poll","hostname","port","onReady","addDefaultOptions","LESS_PLUGINS","lessRoot","FM","addFileManager","loggers","console","LogListener","ErrorReporting","cache","localStorage","setCSS","setItem","getCSS","getItem","timestamp","valueOf","Cache","imageSize","imageFunctions","image-size","image-width","image-height","ImageSize","typePattern","thisArg","curryArgs","loadStyles","instanceOptions","loadStyleSheet","reload","remaining","local","loadInitialFileCallback","loadStyleSheets","sheets","watch","watchMode","watchTimer","clearFileCache","unwatch","registerStylesheetsImmediately","links","rel","registerStylesheets","record","refresh","startTime","endTime","totalMilliseconds","remainingSheets","refreshStyles","resolveOrReject","pageLoadFinished"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"less.min.js","sources":["../src/less-browser/utils.js","../src/less-browser/browser.js","../src/less/logger.js","../src/less/environment/environment.js","../src/less/data/colors.js","../src/less/data/unit-conversions.js","../src/less/data/index.js","../src/less/tree/node.js","../src/less/tree/color.js","../src/less/tree/paren.js","../src/less/tree/combinator.js","../src/less/tree/element.js","../node_modules/tslib/tslib.es6.js","../src/less/constants.js","../src/less/utils.js","../src/less/less-error.js","../src/less/tree/selector.js","../src/less/tree/value.js","../src/less/tree/keyword.js","../src/less/tree/anonymous.js","../src/less/tree/declaration.js","../src/less/tree/debug-info.js","../src/less/tree/comment.js","../src/less/contexts.js","../src/less/functions/function-registry.js","../src/less/functions/default.js","../src/less/tree/ruleset.js","../src/less/tree/atrule.js","../src/less/tree/detached-ruleset.js","../src/less/tree/unit.js","../src/less/tree/dimension.js","../src/less/tree/operation.js","../src/less/tree/expression.js","../src/less/functions/function-caller.js","../src/less/tree/call.js","../src/less/tree/variable.js","../src/less/tree/property.js","../src/less/tree/attribute.js","../src/less/tree/quoted.js","../src/less/tree/url.js","../src/less/tree/media.js","../src/less/tree/import.js","../src/less/tree/js-eval-node.js","../src/less/tree/javascript.js","../src/less/tree/assignment.js","../src/less/tree/condition.js","../src/less/tree/unicode-descriptor.js","../src/less/tree/negative.js","../src/less/tree/extend.js","../src/less/tree/variable-call.js","../src/less/tree/namespace-value.js","../src/less/tree/mixin-definition.js","../src/less/tree/mixin-call.js","../src/less/tree/index.js","../src/less/environment/abstract-file-manager.js","../src/less/environment/abstract-plugin-loader.js","../src/less/visitors/visitor.js","../src/less/visitors/import-sequencer.js","../src/less/visitors/import-visitor.js","../src/less/visitors/set-tree-visibility-visitor.js","../src/less/visitors/extend-visitor.js","../src/less/visitors/join-selector-visitor.js","../src/less/visitors/to-css-visitor.js","../src/less/visitors/index.js","../src/less/parser/parser-input.js","../src/less/parser/chunker.js","../src/less/parser/parser.js","../src/less/functions/boolean.js","../src/less/functions/color.js","../src/less/functions/color-blending.js","../src/less/functions/list.js","../src/less/functions/math-helper.js","../src/less/functions/math.js","../src/less/functions/number.js","../src/less/functions/string.js","../src/less/functions/types.js","../src/less/functions/index.js","../src/less/functions/data-uri.js","../src/less/functions/svg.js","../src/less/transform-tree.js","../src/less/plugin-manager.js","../src/less-browser/file-manager.js","../src/less/index.js","../src/less/parse-tree.js","../src/less/source-map-builder.js","../src/less/source-map-output.js","../src/less/import-manager.js","../src/less/render.js","../src/less/parse.js","../src/less-browser/plugin-loader.js","../src/less-browser/error-reporting.js","../src/less-browser/bootstrap.js","../src/less/default-options.js","../src/less-browser/add-default-options.js","../src/less-browser/index.js","../src/less-browser/log-listener.js","../src/less-browser/cache.js","../src/less-browser/image-size.js"],"sourcesContent":["\nexport function extractId(href) {\n return href.replace(/^[a-z-]+:\\/+?[^\\/]+/, '') // Remove protocol & domain\n .replace(/[\\?\\&]livereload=\\w+/, '') // Remove LiveReload cachebuster\n .replace(/^\\//, '') // Remove root /\n .replace(/\\.[a-zA-Z]+$/, '') // Remove simple extension\n .replace(/[^\\.\\w-]+/g, '-') // Replace illegal characters\n .replace(/\\./g, ':'); // Replace dots with colons(for valid id)\n}\n\nexport function addDataAttr(options, tag) {\n for (const opt in tag.dataset) {\n if (tag.dataset.hasOwnProperty(opt)) {\n if (opt === 'env' || opt === 'dumpLineNumbers' || opt === 'rootpath' || opt === 'errorReporting') {\n options[opt] = tag.dataset[opt];\n } else {\n try {\n options[opt] = JSON.parse(tag.dataset[opt]);\n }\n catch (_) {}\n }\n }\n }\n}\n","import * as utils from './utils';\n\nexport default {\n createCSS: function (document, styles, sheet) {\n // Strip the query-string\n const href = sheet.href || '';\n\n // If there is no title set, use the filename, minus the extension\n const id = `less:${sheet.title || utils.extractId(href)}`;\n\n // If this has already been inserted into the DOM, we may need to replace it\n const oldStyleNode = document.getElementById(id);\n let keepOldStyleNode = false;\n\n // Create a new stylesheet node for insertion or (if necessary) replacement\n const styleNode = document.createElement('style');\n styleNode.setAttribute('type', 'text/css');\n if (sheet.media) {\n styleNode.setAttribute('media', sheet.media);\n }\n styleNode.id = id;\n\n if (!styleNode.styleSheet) {\n styleNode.appendChild(document.createTextNode(styles));\n\n // If new contents match contents of oldStyleNode, don't replace oldStyleNode\n keepOldStyleNode = (oldStyleNode !== null && oldStyleNode.childNodes.length > 0 && styleNode.childNodes.length > 0 &&\n oldStyleNode.firstChild.nodeValue === styleNode.firstChild.nodeValue);\n }\n\n const head = document.getElementsByTagName('head')[0];\n\n // If there is no oldStyleNode, just append; otherwise, only append if we need\n // to replace oldStyleNode with an updated stylesheet\n if (oldStyleNode === null || keepOldStyleNode === false) {\n const nextEl = sheet && sheet.nextSibling || null;\n if (nextEl) {\n nextEl.parentNode.insertBefore(styleNode, nextEl);\n } else {\n head.appendChild(styleNode);\n }\n }\n if (oldStyleNode && keepOldStyleNode === false) {\n oldStyleNode.parentNode.removeChild(oldStyleNode);\n }\n\n // For IE.\n // This needs to happen *after* the style element is added to the DOM, otherwise IE 7 and 8 may crash.\n // See http://social.msdn.microsoft.com/Forums/en-US/7e081b65-878a-4c22-8e68-c10d39c2ed32/internet-explorer-crashes-appending-style-element-to-head\n if (styleNode.styleSheet) {\n try {\n styleNode.styleSheet.cssText = styles;\n } catch (e) {\n throw new Error('Couldn\\'t reassign styleSheet.cssText.');\n }\n }\n },\n currentScript: function(window) {\n const document = window.document;\n return document.currentScript || (() => {\n const scripts = document.getElementsByTagName('script');\n return scripts[scripts.length - 1];\n })();\n }\n};\n","export default {\n error: function(msg) {\n this._fireEvent('error', msg);\n },\n warn: function(msg) {\n this._fireEvent('warn', msg);\n },\n info: function(msg) {\n this._fireEvent('info', msg);\n },\n debug: function(msg) {\n this._fireEvent('debug', msg);\n },\n addListener: function(listener) {\n this._listeners.push(listener);\n },\n removeListener: function(listener) {\n for (let i = 0; i < this._listeners.length; i++) {\n if (this._listeners[i] === listener) {\n this._listeners.splice(i, 1);\n return;\n }\n }\n },\n _fireEvent: function(type, msg) {\n for (let i = 0; i < this._listeners.length; i++) {\n const logFunction = this._listeners[i][type];\n if (logFunction) {\n logFunction(msg);\n }\n }\n },\n _listeners: []\n};\n","/**\n * @todo Document why this abstraction exists, and the relationship between\n * environment, file managers, and plugin manager\n */\n\nimport logger from '../logger';\n\nclass Environment {\n constructor(externalEnvironment, fileManagers) {\n this.fileManagers = fileManagers || [];\n externalEnvironment = externalEnvironment || {};\n\n const optionalFunctions = ['encodeBase64', 'mimeLookup', 'charsetLookup', 'getSourceMapGenerator'];\n const requiredFunctions = [];\n const functions = requiredFunctions.concat(optionalFunctions);\n\n for (let i = 0; i < functions.length; i++) {\n const propName = functions[i];\n const environmentFunc = externalEnvironment[propName];\n if (environmentFunc) {\n this[propName] = environmentFunc.bind(externalEnvironment);\n } else if (i < requiredFunctions.length) {\n this.warn(`missing required function in environment - ${propName}`);\n }\n }\n }\n\n getFileManager(filename, currentDirectory, options, environment, isSync) {\n\n if (!filename) {\n logger.warn('getFileManager called with no filename.. Please report this issue. continuing.');\n }\n if (currentDirectory == null) {\n logger.warn('getFileManager called with null directory.. Please report this issue. continuing.');\n }\n\n let fileManagers = this.fileManagers;\n if (options.pluginManager) {\n fileManagers = [].concat(fileManagers).concat(options.pluginManager.getFileManagers());\n }\n for (let i = fileManagers.length - 1; i >= 0 ; i--) {\n const fileManager = fileManagers[i];\n if (fileManager[isSync ? 'supportsSync' : 'supports'](filename, currentDirectory, options, environment)) {\n return fileManager;\n }\n }\n return null;\n }\n\n addFileManager(fileManager) {\n this.fileManagers.push(fileManager);\n }\n\n clearFileManagers() {\n this.fileManagers = [];\n }\n}\n\nexport default Environment;\n","export default {\n 'aliceblue':'#f0f8ff',\n 'antiquewhite':'#faebd7',\n 'aqua':'#00ffff',\n 'aquamarine':'#7fffd4',\n 'azure':'#f0ffff',\n 'beige':'#f5f5dc',\n 'bisque':'#ffe4c4',\n 'black':'#000000',\n 'blanchedalmond':'#ffebcd',\n 'blue':'#0000ff',\n 'blueviolet':'#8a2be2',\n 'brown':'#a52a2a',\n 'burlywood':'#deb887',\n 'cadetblue':'#5f9ea0',\n 'chartreuse':'#7fff00',\n 'chocolate':'#d2691e',\n 'coral':'#ff7f50',\n 'cornflowerblue':'#6495ed',\n 'cornsilk':'#fff8dc',\n 'crimson':'#dc143c',\n 'cyan':'#00ffff',\n 'darkblue':'#00008b',\n 'darkcyan':'#008b8b',\n 'darkgoldenrod':'#b8860b',\n 'darkgray':'#a9a9a9',\n 'darkgrey':'#a9a9a9',\n 'darkgreen':'#006400',\n 'darkkhaki':'#bdb76b',\n 'darkmagenta':'#8b008b',\n 'darkolivegreen':'#556b2f',\n 'darkorange':'#ff8c00',\n 'darkorchid':'#9932cc',\n 'darkred':'#8b0000',\n 'darksalmon':'#e9967a',\n 'darkseagreen':'#8fbc8f',\n 'darkslateblue':'#483d8b',\n 'darkslategray':'#2f4f4f',\n 'darkslategrey':'#2f4f4f',\n 'darkturquoise':'#00ced1',\n 'darkviolet':'#9400d3',\n 'deeppink':'#ff1493',\n 'deepskyblue':'#00bfff',\n 'dimgray':'#696969',\n 'dimgrey':'#696969',\n 'dodgerblue':'#1e90ff',\n 'firebrick':'#b22222',\n 'floralwhite':'#fffaf0',\n 'forestgreen':'#228b22',\n 'fuchsia':'#ff00ff',\n 'gainsboro':'#dcdcdc',\n 'ghostwhite':'#f8f8ff',\n 'gold':'#ffd700',\n 'goldenrod':'#daa520',\n 'gray':'#808080',\n 'grey':'#808080',\n 'green':'#008000',\n 'greenyellow':'#adff2f',\n 'honeydew':'#f0fff0',\n 'hotpink':'#ff69b4',\n 'indianred':'#cd5c5c',\n 'indigo':'#4b0082',\n 'ivory':'#fffff0',\n 'khaki':'#f0e68c',\n 'lavender':'#e6e6fa',\n 'lavenderblush':'#fff0f5',\n 'lawngreen':'#7cfc00',\n 'lemonchiffon':'#fffacd',\n 'lightblue':'#add8e6',\n 'lightcoral':'#f08080',\n 'lightcyan':'#e0ffff',\n 'lightgoldenrodyellow':'#fafad2',\n 'lightgray':'#d3d3d3',\n 'lightgrey':'#d3d3d3',\n 'lightgreen':'#90ee90',\n 'lightpink':'#ffb6c1',\n 'lightsalmon':'#ffa07a',\n 'lightseagreen':'#20b2aa',\n 'lightskyblue':'#87cefa',\n 'lightslategray':'#778899',\n 'lightslategrey':'#778899',\n 'lightsteelblue':'#b0c4de',\n 'lightyellow':'#ffffe0',\n 'lime':'#00ff00',\n 'limegreen':'#32cd32',\n 'linen':'#faf0e6',\n 'magenta':'#ff00ff',\n 'maroon':'#800000',\n 'mediumaquamarine':'#66cdaa',\n 'mediumblue':'#0000cd',\n 'mediumorchid':'#ba55d3',\n 'mediumpurple':'#9370d8',\n 'mediumseagreen':'#3cb371',\n 'mediumslateblue':'#7b68ee',\n 'mediumspringgreen':'#00fa9a',\n 'mediumturquoise':'#48d1cc',\n 'mediumvioletred':'#c71585',\n 'midnightblue':'#191970',\n 'mintcream':'#f5fffa',\n 'mistyrose':'#ffe4e1',\n 'moccasin':'#ffe4b5',\n 'navajowhite':'#ffdead',\n 'navy':'#000080',\n 'oldlace':'#fdf5e6',\n 'olive':'#808000',\n 'olivedrab':'#6b8e23',\n 'orange':'#ffa500',\n 'orangered':'#ff4500',\n 'orchid':'#da70d6',\n 'palegoldenrod':'#eee8aa',\n 'palegreen':'#98fb98',\n 'paleturquoise':'#afeeee',\n 'palevioletred':'#d87093',\n 'papayawhip':'#ffefd5',\n 'peachpuff':'#ffdab9',\n 'peru':'#cd853f',\n 'pink':'#ffc0cb',\n 'plum':'#dda0dd',\n 'powderblue':'#b0e0e6',\n 'purple':'#800080',\n 'rebeccapurple':'#663399',\n 'red':'#ff0000',\n 'rosybrown':'#bc8f8f',\n 'royalblue':'#4169e1',\n 'saddlebrown':'#8b4513',\n 'salmon':'#fa8072',\n 'sandybrown':'#f4a460',\n 'seagreen':'#2e8b57',\n 'seashell':'#fff5ee',\n 'sienna':'#a0522d',\n 'silver':'#c0c0c0',\n 'skyblue':'#87ceeb',\n 'slateblue':'#6a5acd',\n 'slategray':'#708090',\n 'slategrey':'#708090',\n 'snow':'#fffafa',\n 'springgreen':'#00ff7f',\n 'steelblue':'#4682b4',\n 'tan':'#d2b48c',\n 'teal':'#008080',\n 'thistle':'#d8bfd8',\n 'tomato':'#ff6347',\n 'turquoise':'#40e0d0',\n 'violet':'#ee82ee',\n 'wheat':'#f5deb3',\n 'white':'#ffffff',\n 'whitesmoke':'#f5f5f5',\n 'yellow':'#ffff00',\n 'yellowgreen':'#9acd32'\n};","export default {\n length: {\n 'm': 1,\n 'cm': 0.01,\n 'mm': 0.001,\n 'in': 0.0254,\n 'px': 0.0254 / 96,\n 'pt': 0.0254 / 72,\n 'pc': 0.0254 / 72 * 12\n },\n duration: {\n 's': 1,\n 'ms': 0.001\n },\n angle: {\n 'rad': 1 / (2 * Math.PI),\n 'deg': 1 / 360,\n 'grad': 1 / 400,\n 'turn': 1\n }\n};","import colors from './colors';\nimport unitConversions from './unit-conversions';\n\nexport default { colors, unitConversions };\n","class Node {\n constructor() {\n this.parent = null;\n this.visibilityBlocks = undefined;\n this.nodeVisible = undefined;\n this.rootNode = null;\n this.parsed = null;\n\n const self = this;\n Object.defineProperty(this, 'currentFileInfo', {\n get: function() { return self.fileInfo(); }\n });\n Object.defineProperty(this, 'index', {\n get: function() { return self.getIndex(); }\n });\n\n }\n\n setParent(nodes, parent) {\n function set(node) {\n if (node && node instanceof Node) {\n node.parent = parent;\n }\n }\n if (Array.isArray(nodes)) {\n nodes.forEach(set);\n }\n else {\n set(nodes);\n }\n }\n\n getIndex() {\n return this._index || (this.parent && this.parent.getIndex()) || 0;\n }\n\n fileInfo() {\n return this._fileInfo || (this.parent && this.parent.fileInfo()) || {};\n }\n\n isRulesetLike() { return false; }\n\n toCSS(context) {\n const strs = [];\n this.genCSS(context, {\n add: function(chunk, fileInfo, index) {\n strs.push(chunk);\n },\n isEmpty: function () {\n return strs.length === 0;\n }\n });\n return strs.join('');\n }\n\n genCSS(context, output) {\n output.add(this.value);\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n eval() { return this; }\n\n _operate(context, op, a, b) {\n switch (op) {\n case '+': return a + b;\n case '-': return a - b;\n case '*': return a * b;\n case '/': return a / b;\n }\n }\n\n fround(context, value) {\n const precision = context && context.numPrecision;\n // add \"epsilon\" to ensure numbers like 1.000000005 (represented as 1.000000004999...) are properly rounded:\n return (precision) ? Number((value + 2e-16).toFixed(precision)) : value;\n }\n\n static compare(a, b) {\n /* returns:\n -1: a < b\n 0: a = b\n 1: a > b\n and *any* other value for a != b (e.g. undefined, NaN, -2 etc.) */\n\n if ((a.compare) &&\n // for \"symmetric results\" force toCSS-based comparison\n // of Quoted or Anonymous if either value is one of those\n !(b.type === 'Quoted' || b.type === 'Anonymous')) {\n return a.compare(b);\n } else if (b.compare) {\n return -b.compare(a);\n } else if (a.type !== b.type) {\n return undefined;\n }\n\n a = a.value;\n b = b.value;\n if (!Array.isArray(a)) {\n return a === b ? 0 : undefined;\n }\n if (a.length !== b.length) {\n return undefined;\n }\n for (let i = 0; i < a.length; i++) {\n if (Node.compare(a[i], b[i]) !== 0) {\n return undefined;\n }\n }\n return 0;\n }\n\n static numericCompare(a, b) {\n return a < b ? -1\n : a === b ? 0\n : a > b ? 1 : undefined;\n }\n\n // Returns true if this node represents root of ast imported by reference\n blocksVisibility() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n return this.visibilityBlocks !== 0;\n }\n\n addVisibilityBlock() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks + 1;\n }\n\n removeVisibilityBlock() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks - 1;\n }\n\n // Turns on node visibility - if called node will be shown in output regardless\n // of whether it comes from import by reference or not\n ensureVisibility() {\n this.nodeVisible = true;\n }\n\n // Turns off node visibility - if called node will NOT be shown in output regardless\n // of whether it comes from import by reference or not\n ensureInvisibility() {\n this.nodeVisible = false;\n }\n\n // return values:\n // false - the node must not be visible\n // true - the node must be visible\n // undefined or null - the node has the same visibility as its parent\n isVisible() {\n return this.nodeVisible;\n }\n\n visibilityInfo() {\n return {\n visibilityBlocks: this.visibilityBlocks,\n nodeVisible: this.nodeVisible\n };\n }\n\n copyVisibilityInfo(info) {\n if (!info) {\n return;\n }\n this.visibilityBlocks = info.visibilityBlocks;\n this.nodeVisible = info.nodeVisible;\n }\n}\n\nexport default Node;\n","import Node from './node';\nimport colors from '../data/colors';\n\n//\n// RGB Colors - #ff0014, #eee\n//\nconst Color = function(rgb, a, originalForm) {\n const self = this;\n //\n // The end goal here, is to parse the arguments\n // into an integer triplet, such as `128, 255, 0`\n //\n // This facilitates operations and conversions.\n //\n if (Array.isArray(rgb)) {\n this.rgb = rgb;\n } else if (rgb.length >= 6) {\n this.rgb = [];\n rgb.match(/.{2}/g).map(function (c, i) {\n if (i < 3) {\n self.rgb.push(parseInt(c, 16));\n } else {\n self.alpha = (parseInt(c, 16)) / 255;\n }\n });\n } else {\n this.rgb = [];\n rgb.split('').map(function (c, i) {\n if (i < 3) {\n self.rgb.push(parseInt(c + c, 16));\n } else {\n self.alpha = (parseInt(c + c, 16)) / 255;\n }\n });\n }\n this.alpha = this.alpha || (typeof a === 'number' ? a : 1);\n if (typeof originalForm !== 'undefined') {\n this.value = originalForm;\n }\n}\n\nColor.prototype = Object.assign(new Node(), {\n type: 'Color',\n\n luma() {\n let r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255;\n\n r = (r <= 0.03928) ? r / 12.92 : Math.pow(((r + 0.055) / 1.055), 2.4);\n g = (g <= 0.03928) ? g / 12.92 : Math.pow(((g + 0.055) / 1.055), 2.4);\n b = (b <= 0.03928) ? b / 12.92 : Math.pow(((b + 0.055) / 1.055), 2.4);\n\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n },\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n },\n\n toCSS(context, doNotCompress) {\n const compress = context && context.compress && !doNotCompress;\n let color;\n let alpha;\n let colorFunction;\n let args = [];\n\n // `value` is set if this color was originally\n // converted from a named color string so we need\n // to respect this and try to output named color too.\n alpha = this.fround(context, this.alpha);\n\n if (this.value) {\n if (this.value.indexOf('rgb') === 0) {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n } else if (this.value.indexOf('hsl') === 0) {\n if (alpha < 1) {\n colorFunction = 'hsla';\n } else {\n colorFunction = 'hsl';\n }\n } else {\n return this.value;\n }\n } else {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n }\n\n switch (colorFunction) {\n case 'rgba':\n args = this.rgb.map(function (c) {\n return clamp(Math.round(c), 255);\n }).concat(clamp(alpha, 1));\n break;\n case 'hsla':\n args.push(clamp(alpha, 1));\n case 'hsl':\n color = this.toHSL();\n args = [\n this.fround(context, color.h),\n `${this.fround(context, color.s * 100)}%`,\n `${this.fround(context, color.l * 100)}%`\n ].concat(args);\n }\n\n if (colorFunction) {\n // Values are capped between `0` and `255`, rounded and zero-padded.\n return `${colorFunction}(${args.join(`,${compress ? '' : ' '}`)})`;\n }\n\n color = this.toRGB();\n\n if (compress) {\n const splitcolor = color.split('');\n\n // Convert color to short format\n if (splitcolor[1] === splitcolor[2] && splitcolor[3] === splitcolor[4] && splitcolor[5] === splitcolor[6]) {\n color = `#${splitcolor[1]}${splitcolor[3]}${splitcolor[5]}`;\n }\n }\n\n return color;\n },\n\n //\n // Operations have to be done per-channel, if not,\n // channels will spill onto each other. Once we have\n // our result, in the form of an integer triplet,\n // we create a new Color node to hold the result.\n //\n operate(context, op, other) {\n const rgb = new Array(3);\n const alpha = this.alpha * (1 - other.alpha) + other.alpha;\n for (let c = 0; c < 3; c++) {\n rgb[c] = this._operate(context, op, this.rgb[c], other.rgb[c]);\n }\n return new Color(rgb, alpha);\n },\n\n toRGB() {\n return toHex(this.rgb);\n },\n\n toHSL() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h;\n let s;\n const l = (max + min) / 2;\n const d = max - min;\n\n if (max === min) {\n h = s = 0;\n } else {\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, l, a };\n },\n\n // Adapted from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript\n toHSV() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h;\n let s;\n const v = max;\n\n const d = max - min;\n if (max === 0) {\n s = 0;\n } else {\n s = d / max;\n }\n\n if (max === min) {\n h = 0;\n } else {\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, v, a };\n },\n\n toARGB() {\n return toHex([this.alpha * 255].concat(this.rgb));\n },\n\n compare(x) {\n return (x.rgb &&\n x.rgb[0] === this.rgb[0] &&\n x.rgb[1] === this.rgb[1] &&\n x.rgb[2] === this.rgb[2] &&\n x.alpha === this.alpha) ? 0 : undefined;\n }\n});\n\nColor.fromKeyword = function(keyword) {\n let c;\n const key = keyword.toLowerCase();\n if (colors.hasOwnProperty(key)) {\n c = new Color(colors[key].slice(1));\n }\n else if (key === 'transparent') {\n c = new Color([0, 0, 0], 0);\n }\n\n if (c) {\n c.value = keyword;\n return c;\n }\n};\n\nfunction clamp(v, max) {\n return Math.min(Math.max(v, 0), max);\n}\n\nfunction toHex(v) {\n return `#${v.map(function (c) {\n c = clamp(Math.round(c), 255);\n return (c < 16 ? '0' : '') + c.toString(16);\n}).join('')}`;\n}\n\nexport default Color;\n","import Node from './node';\n\nconst Paren = function(node) {\n this.value = node;\n};\n\nParen.prototype = Object.assign(new Node(), {\n type: 'Paren',\n\n genCSS(context, output) {\n output.add('(');\n this.value.genCSS(context, output);\n output.add(')');\n },\n\n eval(context) {\n return new Paren(this.value.eval(context));\n }\n});\n\nexport default Paren;\n","import Node from './node';\nconst _noSpaceCombinators = {\n '': true,\n ' ': true,\n '|': true\n};\n\nconst Combinator = function(value) {\n if (value === ' ') {\n this.value = ' ';\n this.emptyOrWhitespace = true;\n } else {\n this.value = value ? value.trim() : '';\n this.emptyOrWhitespace = this.value === '';\n }\n}\n\nCombinator.prototype = Object.assign(new Node(), {\n type: 'Combinator',\n\n genCSS(context, output) {\n const spaceOrEmpty = (context.compress || _noSpaceCombinators[this.value]) ? '' : ' ';\n output.add(spaceOrEmpty + this.value + spaceOrEmpty);\n }\n});\n\nexport default Combinator;\n","import Node from './node';\nimport Paren from './paren';\nimport Combinator from './combinator';\n\nconst Element = function(combinator, value, isVariable, index, currentFileInfo, visibilityInfo) {\n this.combinator = combinator instanceof Combinator ?\n combinator : new Combinator(combinator);\n\n if (typeof value === 'string') {\n this.value = value.trim();\n } else if (value) {\n this.value = value;\n } else {\n this.value = '';\n }\n this.isVariable = isVariable;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.combinator, this);\n}\n\nElement.prototype = Object.assign(new Node(), {\n type: 'Element',\n\n accept(visitor) {\n const value = this.value;\n this.combinator = visitor.visit(this.combinator);\n if (typeof value === 'object') {\n this.value = visitor.visit(value);\n }\n },\n\n eval(context) {\n return new Element(this.combinator,\n this.value.eval ? this.value.eval(context) : this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n },\n\n clone() {\n return new Element(this.combinator,\n this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n },\n\n genCSS(context, output) {\n output.add(this.toCSS(context), this.fileInfo(), this.getIndex());\n },\n\n toCSS(context) {\n context = context || {};\n let value = this.value;\n const firstSelector = context.firstSelector;\n if (value instanceof Paren) {\n // selector in parens should not be affected by outer selector\n // flags (breaks only interpolated selectors - see #1973)\n context.firstSelector = true;\n }\n value = value.toCSS ? value.toCSS(context) : value;\n context.firstSelector = firstSelector;\n if (value === '' && this.combinator.value.charAt(0) === '&') {\n return '';\n } else {\n return this.combinator.toCSS(context) + value;\n }\n }\n});\n\nexport default Element;\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","\nexport const Math = {\n ALWAYS: 0,\n PARENS_DIVISION: 1,\n PARENS: 2,\n // removed - STRICT_LEGACY: 3\n};\n\nexport const RewriteUrls = {\n OFF: 0,\n LOCAL: 1,\n ALL: 2\n};","/* jshint proto: true */\nimport * as Constants from './constants';\n\nexport function getLocation(index, inputStream) {\n let n = index + 1;\n let line = null;\n let column = -1;\n\n while (--n >= 0 && inputStream.charAt(n) !== '\\n') {\n column++;\n }\n\n if (typeof index === 'number') {\n line = (inputStream.slice(0, index).match(/\\n/g) || '').length;\n }\n\n return {\n line,\n column\n };\n}\n\nexport function copyArray(arr) {\n let i;\n const length = arr.length;\n const copy = new Array(length);\n\n for (i = 0; i < length; i++) {\n copy[i] = arr[i];\n }\n return copy;\n}\n\nexport function clone(obj) {\n const cloned = {};\n for (const prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n cloned[prop] = obj[prop];\n }\n }\n return cloned;\n}\n\nexport function defaults(obj1, obj2) {\n let newObj = obj2 || {};\n if (!obj2._defaults) {\n newObj = {};\n const defaults = {...obj1};\n newObj._defaults = defaults;\n const cloned = obj2 ? {...obj2} : {};\n Object.assign(newObj, defaults, cloned);\n }\n return newObj;\n}\n\nexport function copyOptions(obj1, obj2) {\n if (obj2 && obj2._defaults) {\n return obj2;\n }\n const opts = defaults(obj1, obj2);\n if (opts.strictMath) {\n opts.math = Constants.Math.PARENS;\n }\n // Back compat with changed relativeUrls option\n if (opts.relativeUrls) {\n opts.rewriteUrls = Constants.RewriteUrls.ALL;\n }\n if (typeof opts.math === 'string') {\n switch (opts.math.toLowerCase()) {\n case 'always':\n opts.math = Constants.Math.ALWAYS;\n break;\n case 'parens-division':\n opts.math = Constants.Math.PARENS_DIVISION;\n break;\n case 'strict':\n case 'parens':\n opts.math = Constants.Math.PARENS;\n break;\n default:\n opts.math = Constants.Math.PARENS;\n }\n }\n if (typeof opts.rewriteUrls === 'string') {\n switch (opts.rewriteUrls.toLowerCase()) {\n case 'off':\n opts.rewriteUrls = Constants.RewriteUrls.OFF;\n break;\n case 'local':\n opts.rewriteUrls = Constants.RewriteUrls.LOCAL;\n break;\n case 'all':\n opts.rewriteUrls = Constants.RewriteUrls.ALL;\n break;\n }\n }\n return opts;\n}\n\nexport function merge(obj1, obj2) {\n for (const prop in obj2) {\n if (obj2.hasOwnProperty(prop)) {\n obj1[prop] = obj2[prop];\n }\n }\n return obj1;\n}\n\nexport function flattenArray(arr, result = []) {\n for (let i = 0, length = arr.length; i < length; i++) {\n const value = arr[i];\n if (Array.isArray(value)) {\n flattenArray(value, result);\n } else {\n if (value !== undefined) {\n result.push(value);\n }\n }\n }\n return result;\n}","import * as utils from './utils';\n\nconst anonymousFunc = /(|Function):(\\d+):(\\d+)/;\n\n/**\n * This is a centralized class of any error that could be thrown internally (mostly by the parser).\n * Besides standard .message it keeps some additional data like a path to the file where the error\n * occurred along with line and column numbers.\n *\n * @class\n * @extends Error\n * @type {module.LessError}\n *\n * @prop {string} type\n * @prop {string} filename\n * @prop {number} index\n * @prop {number} line\n * @prop {number} column\n * @prop {number} callLine\n * @prop {number} callExtract\n * @prop {string[]} extract\n *\n * @param {Object} e - An error object to wrap around or just a descriptive object\n * @param {Object} fileContentMap - An object with file contents in 'contents' property (like importManager) @todo - move to fileManager?\n * @param {string} [currentFilename]\n */\nconst LessError = function(e, fileContentMap, currentFilename) {\n Error.call(this);\n\n const filename = e.filename || currentFilename;\n\n this.message = e.message;\n this.stack = e.stack;\n\n if (fileContentMap && filename) {\n const input = fileContentMap.contents[filename];\n const loc = utils.getLocation(e.index, input);\n var line = loc.line;\n const col = loc.column;\n const callLine = e.call && utils.getLocation(e.call, input).line;\n const lines = input ? input.split('\\n') : '';\n\n this.type = e.type || 'Syntax';\n this.filename = filename;\n this.index = e.index;\n this.line = typeof line === 'number' ? line + 1 : null;\n this.column = col;\n\n if (!this.line && this.stack) {\n const found = this.stack.match(anonymousFunc);\n\n /**\n * We have to figure out how this environment stringifies anonymous functions\n * so we can correctly map plugin errors.\n * \n * Note, in Node 8, the output of anonymous funcs varied based on parameters\n * being present or not, so we inject dummy params.\n */\n const func = new Function('a', 'throw new Error()');\n let lineAdjust = 0;\n try {\n func();\n } catch (e) {\n const match = e.stack.match(anonymousFunc);\n var line = parseInt(match[2]);\n lineAdjust = 1 - line;\n }\n\n if (found) {\n if (found[2]) {\n this.line = parseInt(found[2]) + lineAdjust;\n }\n if (found[3]) {\n this.column = parseInt(found[3]);\n }\n }\n }\n\n this.callLine = callLine + 1;\n this.callExtract = lines[callLine];\n\n this.extract = [\n lines[this.line - 2],\n lines[this.line - 1],\n lines[this.line]\n ];\n }\n\n};\n\nif (typeof Object.create === 'undefined') {\n const F = function () {};\n F.prototype = Error.prototype;\n LessError.prototype = new F();\n} else {\n LessError.prototype = Object.create(Error.prototype);\n}\n\nLessError.prototype.constructor = LessError;\n\n/**\n * An overridden version of the default Object.prototype.toString\n * which uses additional information to create a helpful message.\n *\n * @param {Object} options\n * @returns {string}\n */\nLessError.prototype.toString = function(options) {\n options = options || {};\n\n let message = '';\n const extract = this.extract || [];\n let error = [];\n let stylize = function (str) { return str; };\n if (options.stylize) {\n const type = typeof options.stylize;\n if (type !== 'function') {\n throw Error(`options.stylize should be a function, got a ${type}!`);\n }\n stylize = options.stylize;\n }\n\n if (this.line !== null) {\n if (typeof extract[0] === 'string') {\n error.push(stylize(`${this.line - 1} ${extract[0]}`, 'grey'));\n }\n\n if (typeof extract[1] === 'string') {\n let errorTxt = `${this.line} `;\n if (extract[1]) {\n errorTxt += extract[1].slice(0, this.column) +\n stylize(stylize(stylize(extract[1].substr(this.column, 1), 'bold') +\n extract[1].slice(this.column + 1), 'red'), 'inverse');\n }\n error.push(errorTxt);\n }\n\n if (typeof extract[2] === 'string') {\n error.push(stylize(`${this.line + 1} ${extract[2]}`, 'grey'));\n }\n error = `${error.join('\\n') + stylize('', 'reset')}\\n`;\n }\n\n message += stylize(`${this.type}Error: ${this.message}`, 'red');\n if (this.filename) {\n message += stylize(' in ', 'red') + this.filename;\n }\n if (this.line) {\n message += stylize(` on line ${this.line}, column ${this.column + 1}:`, 'grey');\n }\n\n message += `\\n${error}`;\n\n if (this.callLine) {\n message += `${stylize('from ', 'red') + (this.filename || '')}/n`;\n message += `${stylize(this.callLine, 'grey')} ${this.callExtract}/n`;\n }\n\n return message;\n};\n\nexport default LessError;","import Node from './node';\nimport Element from './element';\nimport LessError from '../less-error';\n\nconst Selector = function(elements, extendList, condition, index, currentFileInfo, visibilityInfo) {\n this.extendList = extendList;\n this.condition = condition;\n this.evaldCondition = !condition;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.elements = this.getElements(elements);\n this.mixinElements_ = undefined;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.elements, this);\n};\n\nSelector.prototype = Object.assign(new Node(), {\n type: 'Selector',\n\n accept(visitor) {\n if (this.elements) {\n this.elements = visitor.visitArray(this.elements);\n }\n if (this.extendList) {\n this.extendList = visitor.visitArray(this.extendList);\n }\n if (this.condition) {\n this.condition = visitor.visit(this.condition);\n }\n },\n\n createDerived(elements, extendList, evaldCondition) {\n elements = this.getElements(elements);\n const newSelector = new Selector(elements, extendList || this.extendList,\n null, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n newSelector.evaldCondition = (evaldCondition != null) ? evaldCondition : this.evaldCondition;\n newSelector.mediaEmpty = this.mediaEmpty;\n return newSelector;\n },\n\n getElements(els) {\n if (!els) {\n return [new Element('', '&', false, this._index, this._fileInfo)];\n }\n if (typeof els === 'string') {\n this.parse.parseNode(\n els, \n ['selector'],\n this._index, \n this._fileInfo, \n function(err, result) {\n if (err) {\n throw new LessError({\n index: err.index,\n message: err.message\n }, this.parse.imports, this._fileInfo.filename);\n }\n els = result[0].elements;\n });\n }\n return els;\n },\n\n createEmptySelectors() {\n const el = new Element('', '&', false, this._index, this._fileInfo), sels = [new Selector([el], null, null, this._index, this._fileInfo)];\n sels[0].mediaEmpty = true;\n return sels;\n },\n\n match(other) {\n const elements = this.elements;\n const len = elements.length;\n let olen;\n let i;\n\n other = other.mixinElements();\n olen = other.length;\n if (olen === 0 || len < olen) {\n return 0;\n } else {\n for (i = 0; i < olen; i++) {\n if (elements[i].value !== other[i]) {\n return 0;\n }\n }\n }\n\n return olen; // return number of matched elements\n },\n\n mixinElements() {\n if (this.mixinElements_) {\n return this.mixinElements_;\n }\n\n let elements = this.elements.map( function(v) {\n return v.combinator.value + (v.value.value || v.value);\n }).join('').match(/[,&#\\*\\.\\w-]([\\w-]|(\\\\.))*/g);\n\n if (elements) {\n if (elements[0] === '&') {\n elements.shift();\n }\n } else {\n elements = [];\n }\n\n return (this.mixinElements_ = elements);\n },\n\n isJustParentSelector() {\n return !this.mediaEmpty &&\n this.elements.length === 1 &&\n this.elements[0].value === '&' &&\n (this.elements[0].combinator.value === ' ' || this.elements[0].combinator.value === '');\n },\n\n eval(context) {\n const evaldCondition = this.condition && this.condition.eval(context);\n let elements = this.elements;\n let extendList = this.extendList;\n\n elements = elements && elements.map(function (e) { return e.eval(context); });\n extendList = extendList && extendList.map(function(extend) { return extend.eval(context); });\n\n return this.createDerived(elements, extendList, evaldCondition);\n },\n\n genCSS(context, output) {\n let i, element;\n if ((!context || !context.firstSelector) && this.elements[0].combinator.value === '') {\n output.add(' ', this.fileInfo(), this.getIndex());\n }\n for (i = 0; i < this.elements.length; i++) {\n element = this.elements[i];\n element.genCSS(context, output);\n }\n },\n\n getIsOutput() {\n return this.evaldCondition;\n }\n});\n\nexport default Selector;\n","import Node from './node';\n\nconst Value = function(value) {\n if (!value) {\n throw new Error('Value requires an array argument');\n }\n if (!Array.isArray(value)) {\n this.value = [ value ];\n }\n else {\n this.value = value;\n }\n};\n\nValue.prototype = Object.assign(new Node(), {\n type: 'Value',\n\n accept(visitor) {\n if (this.value) {\n this.value = visitor.visitArray(this.value);\n }\n },\n\n eval(context) {\n if (this.value.length === 1) {\n return this.value[0].eval(context);\n } else {\n return new Value(this.value.map(function (v) {\n return v.eval(context);\n }));\n }\n },\n\n genCSS(context, output) {\n let i;\n for (i = 0; i < this.value.length; i++) {\n this.value[i].genCSS(context, output);\n if (i + 1 < this.value.length) {\n output.add((context && context.compress) ? ',' : ', ');\n }\n }\n }\n});\n\nexport default Value;\n","import Node from './node';\n\nconst Keyword = function(value) {\n this.value = value;\n};\n\nKeyword.prototype = Object.assign(new Node(), {\n type: 'Keyword',\n\n genCSS(context, output) {\n if (this.value === '%') { throw { type: 'Syntax', message: 'Invalid % without number' }; }\n output.add(this.value);\n }\n});\n\nKeyword.True = new Keyword('true');\nKeyword.False = new Keyword('false');\n\nexport default Keyword;\n","import Node from './node';\n\nconst Anonymous = function(value, index, currentFileInfo, mapLines, rulesetLike, visibilityInfo) {\n this.value = value;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.mapLines = mapLines;\n this.rulesetLike = (typeof rulesetLike === 'undefined') ? false : rulesetLike;\n this.allowRoot = true;\n this.copyVisibilityInfo(visibilityInfo);\n}\n\nAnonymous.prototype = Object.assign(new Node(), {\n type: 'Anonymous',\n eval() {\n return new Anonymous(this.value, this._index, this._fileInfo, this.mapLines, this.rulesetLike, this.visibilityInfo());\n },\n compare(other) {\n return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n },\n isRulesetLike() {\n return this.rulesetLike;\n },\n genCSS(context, output) {\n this.nodeVisible = Boolean(this.value);\n if (this.nodeVisible) {\n output.add(this.value, this._fileInfo, this._index, this.mapLines);\n }\n }\n})\n\nexport default Anonymous;\n","import Node from './node';\nimport Value from './value';\nimport Keyword from './keyword';\nimport Anonymous from './anonymous';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\nfunction evalName(context, name) {\n let value = '';\n let i;\n const n = name.length;\n const output = {add: function (s) {value += s;}};\n for (i = 0; i < n; i++) {\n name[i].eval(context).genCSS(context, output);\n }\n return value;\n}\n\nconst Declaration = function(name, value, important, merge, index, currentFileInfo, inline, variable) {\n this.name = name;\n this.value = (value instanceof Node) ? value : new Value([value ? new Anonymous(value) : null]);\n this.important = important ? ` ${important.trim()}` : '';\n this.merge = merge;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.inline = inline || false;\n this.variable = (variable !== undefined) ? variable\n : (name.charAt && (name.charAt(0) === '@'));\n this.allowRoot = true;\n this.setParent(this.value, this);\n};\n\nDeclaration.prototype = Object.assign(new Node(), {\n type: 'Declaration',\n\n genCSS(context, output) {\n output.add(this.name + (context.compress ? ':' : ': '), this.fileInfo(), this.getIndex());\n try {\n this.value.genCSS(context, output);\n }\n catch (e) {\n e.index = this._index;\n e.filename = this._fileInfo.filename;\n throw e;\n }\n output.add(this.important + ((this.inline || (context.lastRule && context.compress)) ? '' : ';'), this._fileInfo, this._index);\n },\n\n eval(context) {\n let mathBypass = false, prevMath, name = this.name, evaldValue, variable = this.variable;\n if (typeof name !== 'string') {\n // expand 'primitive' name directly to get\n // things faster (~10% for benchmark.less):\n name = (name.length === 1) && (name[0] instanceof Keyword) ?\n name[0].value : evalName(context, name);\n variable = false; // never treat expanded interpolation as new variable name\n }\n\n // @todo remove when parens-division is default\n if (name === 'font' && context.math === MATH.ALWAYS) {\n mathBypass = true;\n prevMath = context.math;\n context.math = MATH.PARENS_DIVISION;\n }\n try {\n context.importantScope.push({});\n evaldValue = this.value.eval(context);\n\n if (!this.variable && evaldValue.type === 'DetachedRuleset') {\n throw { message: 'Rulesets cannot be evaluated on a property.',\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n let important = this.important;\n const importantResult = context.importantScope.pop();\n if (!important && importantResult.important) {\n important = importantResult.important;\n }\n\n return new Declaration(name,\n evaldValue,\n important,\n this.merge,\n this.getIndex(), this.fileInfo(), this.inline,\n variable);\n }\n catch (e) {\n if (typeof e.index !== 'number') {\n e.index = this.getIndex();\n e.filename = this.fileInfo().filename;\n }\n throw e;\n }\n finally {\n if (mathBypass) {\n context.math = prevMath;\n }\n }\n },\n\n makeImportant() {\n return new Declaration(this.name,\n this.value,\n '!important',\n this.merge,\n this.getIndex(), this.fileInfo(), this.inline);\n }\n});\n\nexport default Declaration;","class debugInfo {\n constructor(context, ctx, lineSeparator) {\n let result = '';\n if (context.dumpLineNumbers && !context.compress) {\n switch (context.dumpLineNumbers) {\n case 'comments':\n result = debugInfo.asComment(ctx);\n break;\n case 'mediaquery':\n result = debugInfo.asMediaQuery(ctx);\n break;\n case 'all':\n result = debugInfo.asComment(ctx) + (lineSeparator || '') + debugInfo.asMediaQuery(ctx);\n break;\n }\n }\n return result;\n }\n\n static asComment(ctx) {\n return `/* line ${ctx.debugInfo.lineNumber}, ${ctx.debugInfo.fileName} */\\n`;\n }\n\n static asMediaQuery(ctx) {\n let filenameWithProtocol = ctx.debugInfo.fileName;\n if (!/^[a-z]+:\\/\\//i.test(filenameWithProtocol)) {\n filenameWithProtocol = `file://${filenameWithProtocol}`;\n }\n return `@media -sass-debug-info{filename{font-family:${filenameWithProtocol.replace(/([.:\\/\\\\])/g, function (a) {\n if (a == '\\\\') {\n a = '\\/';\n }\n return `\\\\${a}`;\n})}}line{font-family:\\\\00003${ctx.debugInfo.lineNumber}}}\\n`;\n }\n}\n\nexport default debugInfo;\n","import Node from './node';\nimport getDebugInfo from './debug-info';\n\nconst Comment = function(value, isLineComment, index, currentFileInfo) {\n this.value = value;\n this.isLineComment = isLineComment;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.allowRoot = true;\n}\n\nComment.prototype = Object.assign(new Node(), {\n type: 'Comment',\n\n genCSS(context, output) {\n if (this.debugInfo) {\n output.add(getDebugInfo(context, this), this.fileInfo(), this.getIndex());\n }\n output.add(this.value);\n },\n\n isSilent(context) {\n const isCompressed = context.compress && this.value[2] !== '!';\n return this.isLineComment || isCompressed;\n }\n});\n\nexport default Comment;\n","const contexts = {};\nexport default contexts;\nimport * as Constants from './constants';\n\nconst copyFromOriginal = function copyFromOriginal(original, destination, propertiesToCopy) {\n if (!original) { return; }\n\n for (let i = 0; i < propertiesToCopy.length; i++) {\n if (original.hasOwnProperty(propertiesToCopy[i])) {\n destination[propertiesToCopy[i]] = original[propertiesToCopy[i]];\n }\n }\n};\n\n/*\n parse is used whilst parsing\n */\nconst parseCopyProperties = [\n // options\n 'paths', // option - unmodified - paths to search for imports on\n 'rewriteUrls', // option - whether to adjust URL's to be relative\n 'rootpath', // option - rootpath to append to URL's\n 'strictImports', // option -\n 'insecure', // option - whether to allow imports from insecure ssl hosts\n 'dumpLineNumbers', // option - whether to dump line numbers\n 'compress', // option - whether to compress\n 'syncImport', // option - whether to import synchronously\n 'chunkInput', // option - whether to chunk input. more performant but causes parse issues.\n 'mime', // browser only - mime type for sheet import\n 'useFileCache', // browser only - whether to use the per file session cache\n // context\n 'processImports', // option & context - whether to process imports. if false then imports will not be imported.\n // Used by the import manager to stop multiple import visitors being created.\n 'pluginManager' // Used as the plugin manager for the session\n];\n\ncontexts.Parse = function(options) {\n copyFromOriginal(options, this, parseCopyProperties);\n\n if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n};\n\nconst evalCopyProperties = [\n 'paths', // additional include paths\n 'compress', // whether to compress\n 'math', // whether math has to be within parenthesis\n 'strictUnits', // whether units need to evaluate correctly\n 'sourceMap', // whether to output a source map\n 'importMultiple', // whether we are currently importing multiple copies\n 'urlArgs', // whether to add args into url tokens\n 'javascriptEnabled', // option - whether Inline JavaScript is enabled. if undefined, defaults to false\n 'pluginManager', // Used as the plugin manager for the session\n 'importantScope', // used to bubble up !important statements\n 'rewriteUrls' // option - whether to adjust URL's to be relative\n];\n\ncontexts.Eval = function(options, frames) {\n copyFromOriginal(options, this, evalCopyProperties);\n\n if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n\n this.frames = frames || [];\n this.importantScope = this.importantScope || [];\n};\n\ncontexts.Eval.prototype.enterCalc = function () {\n if (!this.calcStack) {\n this.calcStack = [];\n }\n this.calcStack.push(true);\n this.inCalc = true;\n};\n\ncontexts.Eval.prototype.exitCalc = function () {\n this.calcStack.pop();\n if (!this.calcStack.length) {\n this.inCalc = false;\n }\n};\n\ncontexts.Eval.prototype.inParenthesis = function () {\n if (!this.parensStack) {\n this.parensStack = [];\n }\n this.parensStack.push(true);\n};\n\ncontexts.Eval.prototype.outOfParenthesis = function () {\n this.parensStack.pop();\n};\n\ncontexts.Eval.prototype.inCalc = false;\ncontexts.Eval.prototype.mathOn = true;\ncontexts.Eval.prototype.isMathOn = function (op) {\n if (!this.mathOn) {\n return false;\n }\n if (op === '/' && this.math !== Constants.Math.ALWAYS && (!this.parensStack || !this.parensStack.length)) {\n return false;\n }\n if (this.math > Constants.Math.PARENS_DIVISION) {\n return this.parensStack && this.parensStack.length;\n }\n return true;\n};\n\ncontexts.Eval.prototype.pathRequiresRewrite = function (path) {\n const isRelative = this.rewriteUrls === Constants.RewriteUrls.LOCAL ? isPathLocalRelative : isPathRelative;\n\n return isRelative(path);\n};\n\ncontexts.Eval.prototype.rewritePath = function (path, rootpath) {\n let newPath;\n\n rootpath = rootpath || '';\n newPath = this.normalizePath(rootpath + path);\n\n // If a path was explicit relative and the rootpath was not an absolute path\n // we must ensure that the new path is also explicit relative.\n if (isPathLocalRelative(path) &&\n isPathRelative(rootpath) &&\n isPathLocalRelative(newPath) === false) {\n newPath = `./${newPath}`;\n }\n\n return newPath;\n};\n\ncontexts.Eval.prototype.normalizePath = function (path) {\n const segments = path.split('/').reverse();\n let segment;\n\n path = [];\n while (segments.length !== 0) {\n segment = segments.pop();\n switch ( segment ) {\n case '.':\n break;\n case '..':\n if ((path.length === 0) || (path[path.length - 1] === '..')) {\n path.push( segment );\n } else {\n path.pop();\n }\n break;\n default:\n path.push(segment);\n break;\n }\n }\n\n return path.join('/');\n};\n\nfunction isPathRelative(path) {\n return !/^(?:[a-z-]+:|\\/|#)/i.test(path);\n}\n\nfunction isPathLocalRelative(path) {\n return path.charAt(0) === '.';\n}\n\n// todo - do the same for the toCSS ?\n","function makeRegistry( base ) {\n return {\n _data: {},\n add: function(name, func) {\n // precautionary case conversion, as later querying of\n // the registry by function-caller uses lower case as well.\n name = name.toLowerCase();\n\n if (this._data.hasOwnProperty(name)) {\n // TODO warn\n }\n this._data[name] = func;\n },\n addMultiple: function(functions) {\n Object.keys(functions).forEach(\n name => {\n this.add(name, functions[name]);\n });\n },\n get: function(name) {\n return this._data[name] || ( base && base.get( name ));\n },\n getLocalFunctions: function() {\n return this._data;\n },\n inherit: function() {\n return makeRegistry( this );\n },\n create: function(base) {\n return makeRegistry(base);\n }\n };\n}\n\nexport default makeRegistry( null );","import Keyword from '../tree/keyword';\n\nconst defaultFunc = {\n eval: function () {\n const v = this.value_;\n const e = this.error_;\n if (e) {\n throw e;\n }\n if (v != null) {\n return v ? Keyword.True : Keyword.False;\n }\n },\n value: function (v) {\n this.value_ = v;\n },\n error: function (e) {\n this.error_ = e;\n },\n reset: function () {\n this.value_ = this.error_ = null;\n }\n};\n\nexport default defaultFunc;\n","import Node from './node';\nimport Declaration from './declaration';\nimport Keyword from './keyword';\nimport Comment from './comment';\nimport Paren from './paren';\nimport Selector from './selector';\nimport Element from './element';\nimport Anonymous from './anonymous';\nimport contexts from '../contexts';\nimport globalFunctionRegistry from '../functions/function-registry';\nimport defaultFunc from '../functions/default';\nimport getDebugInfo from './debug-info';\nimport * as utils from '../utils';\n\nconst Ruleset = function(selectors, rules, strictImports, visibilityInfo) {\n this.selectors = selectors;\n this.rules = rules;\n this._lookups = {};\n this._variables = null;\n this._properties = null;\n this.strictImports = strictImports;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n\n this.setParent(this.selectors, this);\n this.setParent(this.rules, this);\n}\n\nRuleset.prototype = Object.assign(new Node(), {\n type: 'Ruleset',\n isRuleset: true,\n\n isRulesetLike() { return true; },\n\n accept(visitor) {\n if (this.paths) {\n this.paths = visitor.visitArray(this.paths, true);\n } else if (this.selectors) {\n this.selectors = visitor.visitArray(this.selectors);\n }\n if (this.rules && this.rules.length) {\n this.rules = visitor.visitArray(this.rules);\n }\n },\n\n eval(context) {\n const that = this;\n let selectors;\n let selCnt;\n let selector;\n let i;\n let hasVariable;\n let hasOnePassingSelector = false;\n\n if (this.selectors && (selCnt = this.selectors.length)) {\n selectors = new Array(selCnt);\n defaultFunc.error({\n type: 'Syntax',\n message: 'it is currently only allowed in parametric mixin guards,'\n });\n\n for (i = 0; i < selCnt; i++) {\n selector = this.selectors[i].eval(context);\n for (var j = 0; j < selector.elements.length; j++) {\n if (selector.elements[j].isVariable) {\n hasVariable = true;\n break;\n }\n }\n selectors[i] = selector;\n if (selector.evaldCondition) {\n hasOnePassingSelector = true;\n }\n }\n\n if (hasVariable) {\n const toParseSelectors = new Array(selCnt);\n for (i = 0; i < selCnt; i++) {\n selector = selectors[i];\n toParseSelectors[i] = selector.toCSS(context);\n }\n this.parse.parseNode(\n toParseSelectors.join(','),\n [\"selectors\"], \n selectors[0].getIndex(), \n selectors[0].fileInfo(), \n function(err, result) {\n if (result) {\n selectors = utils.flattenArray(result);\n }\n });\n }\n\n defaultFunc.reset();\n } else {\n hasOnePassingSelector = true;\n }\n\n let rules = this.rules ? utils.copyArray(this.rules) : null;\n const ruleset = new Ruleset(selectors, rules, this.strictImports, this.visibilityInfo());\n let rule;\n let subRule;\n\n ruleset.originalRuleset = this;\n ruleset.root = this.root;\n ruleset.firstRoot = this.firstRoot;\n ruleset.allowImports = this.allowImports;\n\n if (this.debugInfo) {\n ruleset.debugInfo = this.debugInfo;\n }\n\n if (!hasOnePassingSelector) {\n rules.length = 0;\n }\n\n // inherit a function registry from the frames stack when possible;\n // otherwise from the global registry\n ruleset.functionRegistry = (function (frames) {\n let i = 0;\n const n = frames.length;\n let found;\n for ( ; i !== n ; ++i ) {\n found = frames[ i ].functionRegistry;\n if ( found ) { return found; }\n }\n return globalFunctionRegistry;\n }(context.frames)).inherit();\n\n // push the current ruleset to the frames stack\n const ctxFrames = context.frames;\n ctxFrames.unshift(ruleset);\n\n // currrent selectors\n let ctxSelectors = context.selectors;\n if (!ctxSelectors) {\n context.selectors = ctxSelectors = [];\n }\n ctxSelectors.unshift(this.selectors);\n\n // Evaluate imports\n if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) {\n ruleset.evalImports(context);\n }\n\n // Store the frames around mixin definitions,\n // so they can be evaluated like closures when the time comes.\n const rsRules = ruleset.rules;\n for (i = 0; (rule = rsRules[i]); i++) {\n if (rule.evalFirst) {\n rsRules[i] = rule.eval(context);\n }\n }\n\n const mediaBlockCount = (context.mediaBlocks && context.mediaBlocks.length) || 0;\n\n // Evaluate mixin calls.\n for (i = 0; (rule = rsRules[i]); i++) {\n if (rule.type === 'MixinCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).filter(function(r) {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope if the variable is\n // already there. consider returning false here\n // but we need a way to \"return\" variable from mixins\n return !(ruleset.variable(r.name));\n }\n return true;\n });\n rsRules.splice.apply(rsRules, [i, 1].concat(rules));\n i += rules.length - 1;\n ruleset.resetCache();\n } else if (rule.type === 'VariableCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).rules.filter(function(r) {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope at all\n return false;\n }\n return true;\n });\n rsRules.splice.apply(rsRules, [i, 1].concat(rules));\n i += rules.length - 1;\n ruleset.resetCache();\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n if (!rule.evalFirst) {\n rsRules[i] = rule = rule.eval ? rule.eval(context) : rule;\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n // for rulesets, check if it is a css guard and can be removed\n if (rule instanceof Ruleset && rule.selectors && rule.selectors.length === 1) {\n // check if it can be folded in (e.g. & where)\n if (rule.selectors[0] && rule.selectors[0].isJustParentSelector()) {\n rsRules.splice(i--, 1);\n\n for (var j = 0; (subRule = rule.rules[j]); j++) {\n if (subRule instanceof Node) {\n subRule.copyVisibilityInfo(rule.visibilityInfo());\n if (!(subRule instanceof Declaration) || !subRule.variable) {\n rsRules.splice(++i, 0, subRule);\n }\n }\n }\n }\n }\n }\n\n // Pop the stack\n ctxFrames.shift();\n ctxSelectors.shift();\n\n if (context.mediaBlocks) {\n for (i = mediaBlockCount; i < context.mediaBlocks.length; i++) {\n context.mediaBlocks[i].bubbleSelectors(selectors);\n }\n }\n\n return ruleset;\n },\n\n evalImports(context) {\n const rules = this.rules;\n let i;\n let importRules;\n if (!rules) { return; }\n\n for (i = 0; i < rules.length; i++) {\n if (rules[i].type === 'Import') {\n importRules = rules[i].eval(context);\n if (importRules && (importRules.length || importRules.length === 0)) {\n rules.splice.apply(rules, [i, 1].concat(importRules));\n i += importRules.length - 1;\n } else {\n rules.splice(i, 1, importRules);\n }\n this.resetCache();\n }\n }\n },\n\n makeImportant() {\n const result = new Ruleset(this.selectors, this.rules.map(function (r) {\n if (r.makeImportant) {\n return r.makeImportant();\n } else {\n return r;\n }\n }), this.strictImports, this.visibilityInfo());\n\n return result;\n },\n\n matchArgs(args) {\n return !args || args.length === 0;\n },\n\n // lets you call a css selector with a guard\n matchCondition(args, context) {\n const lastSelector = this.selectors[this.selectors.length - 1];\n if (!lastSelector.evaldCondition) {\n return false;\n }\n if (lastSelector.condition &&\n !lastSelector.condition.eval(\n new contexts.Eval(context,\n context.frames))) {\n return false;\n }\n return true;\n },\n\n resetCache() {\n this._rulesets = null;\n this._variables = null;\n this._properties = null;\n this._lookups = {};\n },\n\n variables() {\n if (!this._variables) {\n this._variables = !this.rules ? {} : this.rules.reduce(function (hash, r) {\n if (r instanceof Declaration && r.variable === true) {\n hash[r.name] = r;\n }\n // when evaluating variables in an import statement, imports have not been eval'd\n // so we need to go inside import statements.\n // guard against root being a string (in the case of inlined less)\n if (r.type === 'Import' && r.root && r.root.variables) {\n const vars = r.root.variables();\n for (const name in vars) {\n if (vars.hasOwnProperty(name)) {\n hash[name] = r.root.variable(name);\n }\n }\n }\n return hash;\n }, {});\n }\n return this._variables;\n },\n\n properties() {\n if (!this._properties) {\n this._properties = !this.rules ? {} : this.rules.reduce(function (hash, r) {\n if (r instanceof Declaration && r.variable !== true) {\n const name = (r.name.length === 1) && (r.name[0] instanceof Keyword) ?\n r.name[0].value : r.name;\n // Properties don't overwrite as they can merge\n if (!hash[`$${name}`]) {\n hash[`$${name}`] = [ r ];\n }\n else {\n hash[`$${name}`].push(r);\n }\n }\n return hash;\n }, {});\n }\n return this._properties;\n },\n\n variable(name) {\n const decl = this.variables()[name];\n if (decl) {\n return this.parseValue(decl);\n }\n },\n\n property(name) {\n const decl = this.properties()[name];\n if (decl) {\n return this.parseValue(decl);\n }\n },\n\n lastDeclaration() {\n for (let i = this.rules.length; i > 0; i--) {\n const decl = this.rules[i - 1];\n if (decl instanceof Declaration) {\n return this.parseValue(decl);\n }\n }\n },\n\n parseValue(toParse) {\n const self = this;\n function transformDeclaration(decl) {\n if (decl.value instanceof Anonymous && !decl.parsed) {\n if (typeof decl.value.value === 'string') {\n this.parse.parseNode(\n decl.value.value,\n ['value', 'important'], \n decl.value.getIndex(), \n decl.fileInfo(), \n function(err, result) {\n if (err) {\n decl.parsed = true;\n }\n if (result) {\n decl.value = result[0];\n decl.important = result[1] || '';\n decl.parsed = true;\n }\n });\n } else {\n decl.parsed = true;\n }\n\n return decl;\n }\n else {\n return decl;\n }\n }\n if (!Array.isArray(toParse)) {\n return transformDeclaration.call(self, toParse);\n }\n else {\n const nodes = [];\n toParse.forEach(function(n) {\n nodes.push(transformDeclaration.call(self, n));\n });\n return nodes;\n }\n },\n\n rulesets() {\n if (!this.rules) { return []; }\n\n const filtRules = [];\n const rules = this.rules;\n let i;\n let rule;\n\n for (i = 0; (rule = rules[i]); i++) {\n if (rule.isRuleset) {\n filtRules.push(rule);\n }\n }\n\n return filtRules;\n },\n\n prependRule(rule) {\n const rules = this.rules;\n if (rules) {\n rules.unshift(rule);\n } else {\n this.rules = [ rule ];\n }\n this.setParent(rule, this);\n },\n\n find(selector, self, filter) {\n self = self || this;\n const rules = [];\n let match;\n let foundMixins;\n const key = selector.toCSS();\n\n if (key in this._lookups) { return this._lookups[key]; }\n\n this.rulesets().forEach(function (rule) {\n if (rule !== self) {\n for (let j = 0; j < rule.selectors.length; j++) {\n match = selector.match(rule.selectors[j]);\n if (match) {\n if (selector.elements.length > match) {\n if (!filter || filter(rule)) {\n foundMixins = rule.find(new Selector(selector.elements.slice(match)), self, filter);\n for (let i = 0; i < foundMixins.length; ++i) {\n foundMixins[i].path.push(rule);\n }\n Array.prototype.push.apply(rules, foundMixins);\n }\n } else {\n rules.push({ rule, path: []});\n }\n break;\n }\n }\n }\n });\n this._lookups[key] = rules;\n return rules;\n },\n\n genCSS(context, output) {\n let i;\n let j;\n const charsetRuleNodes = [];\n let ruleNodes = [];\n\n let // Line number debugging\n debugInfo;\n\n let rule;\n let path;\n\n context.tabLevel = (context.tabLevel || 0);\n\n if (!this.root) {\n context.tabLevel++;\n }\n\n const tabRuleStr = context.compress ? '' : Array(context.tabLevel + 1).join(' ');\n const tabSetStr = context.compress ? '' : Array(context.tabLevel).join(' ');\n let sep;\n\n let charsetNodeIndex = 0;\n let importNodeIndex = 0;\n for (i = 0; (rule = this.rules[i]); i++) {\n if (rule instanceof Comment) {\n if (importNodeIndex === i) {\n importNodeIndex++;\n }\n ruleNodes.push(rule);\n } else if (rule.isCharset && rule.isCharset()) {\n ruleNodes.splice(charsetNodeIndex, 0, rule);\n charsetNodeIndex++;\n importNodeIndex++;\n } else if (rule.type === 'Import') {\n ruleNodes.splice(importNodeIndex, 0, rule);\n importNodeIndex++;\n } else {\n ruleNodes.push(rule);\n }\n }\n ruleNodes = charsetRuleNodes.concat(ruleNodes);\n\n // If this is the root node, we don't render\n // a selector, or {}.\n if (!this.root) {\n debugInfo = getDebugInfo(context, this, tabSetStr);\n\n if (debugInfo) {\n output.add(debugInfo);\n output.add(tabSetStr);\n }\n\n const paths = this.paths;\n const pathCnt = paths.length;\n let pathSubCnt;\n\n sep = context.compress ? ',' : (`,\\n${tabSetStr}`);\n\n for (i = 0; i < pathCnt; i++) {\n path = paths[i];\n if (!(pathSubCnt = path.length)) { continue; }\n if (i > 0) { output.add(sep); }\n\n context.firstSelector = true;\n path[0].genCSS(context, output);\n\n context.firstSelector = false;\n for (j = 1; j < pathSubCnt; j++) {\n path[j].genCSS(context, output);\n }\n }\n\n output.add((context.compress ? '{' : ' {\\n') + tabRuleStr);\n }\n\n // Compile rules and rulesets\n for (i = 0; (rule = ruleNodes[i]); i++) {\n\n if (i + 1 === ruleNodes.length) {\n context.lastRule = true;\n }\n\n const currentLastRule = context.lastRule;\n if (rule.isRulesetLike(rule)) {\n context.lastRule = false;\n }\n\n if (rule.genCSS) {\n rule.genCSS(context, output);\n } else if (rule.value) {\n output.add(rule.value.toString());\n }\n\n context.lastRule = currentLastRule;\n\n if (!context.lastRule && rule.isVisible()) {\n output.add(context.compress ? '' : (`\\n${tabRuleStr}`));\n } else {\n context.lastRule = false;\n }\n }\n\n if (!this.root) {\n output.add((context.compress ? '}' : `\\n${tabSetStr}}`));\n context.tabLevel--;\n }\n\n if (!output.isEmpty() && !context.compress && this.firstRoot) {\n output.add('\\n');\n }\n },\n\n joinSelectors(paths, context, selectors) {\n for (let s = 0; s < selectors.length; s++) {\n this.joinSelector(paths, context, selectors[s]);\n }\n },\n\n joinSelector(paths, context, selector) {\n\n function createParenthesis(elementsToPak, originalElement) {\n let replacementParen, j;\n if (elementsToPak.length === 0) {\n replacementParen = new Paren(elementsToPak[0]);\n } else {\n const insideParent = new Array(elementsToPak.length);\n for (j = 0; j < elementsToPak.length; j++) {\n insideParent[j] = new Element(\n null,\n elementsToPak[j],\n originalElement.isVariable,\n originalElement._index,\n originalElement._fileInfo\n );\n }\n replacementParen = new Paren(new Selector(insideParent));\n }\n return replacementParen;\n }\n\n function createSelector(containedElement, originalElement) {\n let element, selector;\n element = new Element(null, containedElement, originalElement.isVariable, originalElement._index, originalElement._fileInfo);\n selector = new Selector([element]);\n return selector;\n }\n\n // joins selector path from `beginningPath` with selector path in `addPath`\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns concatenated path\n function addReplacementIntoPath(beginningPath, addPath, replacedElement, originalSelector) {\n let newSelectorPath, lastSelector, newJoinedSelector;\n // our new selector path\n newSelectorPath = [];\n\n // construct the joined selector - if & is the first thing this will be empty,\n // if not newJoinedSelector will be the last set of elements in the selector\n if (beginningPath.length > 0) {\n newSelectorPath = utils.copyArray(beginningPath);\n lastSelector = newSelectorPath.pop();\n newJoinedSelector = originalSelector.createDerived(utils.copyArray(lastSelector.elements));\n }\n else {\n newJoinedSelector = originalSelector.createDerived([]);\n }\n\n if (addPath.length > 0) {\n // /deep/ is a CSS4 selector - (removed, so should deprecate)\n // that is valid without anything in front of it\n // so if the & does not have a combinator that is \"\" or \" \" then\n // and there is a combinator on the parent, then grab that.\n // this also allows + a { & .b { .a & { ... though not sure why you would want to do that\n let combinator = replacedElement.combinator;\n\n const parentEl = addPath[0].elements[0];\n if (combinator.emptyOrWhitespace && !parentEl.combinator.emptyOrWhitespace) {\n combinator = parentEl.combinator;\n }\n // join the elements so far with the first part of the parent\n newJoinedSelector.elements.push(new Element(\n combinator,\n parentEl.value,\n replacedElement.isVariable,\n replacedElement._index,\n replacedElement._fileInfo\n ));\n newJoinedSelector.elements = newJoinedSelector.elements.concat(addPath[0].elements.slice(1));\n }\n\n // now add the joined selector - but only if it is not empty\n if (newJoinedSelector.elements.length !== 0) {\n newSelectorPath.push(newJoinedSelector);\n }\n\n // put together the parent selectors after the join (e.g. the rest of the parent)\n if (addPath.length > 1) {\n let restOfPath = addPath.slice(1);\n restOfPath = restOfPath.map(function (selector) {\n return selector.createDerived(selector.elements, []);\n });\n newSelectorPath = newSelectorPath.concat(restOfPath);\n }\n return newSelectorPath;\n }\n\n // joins selector path from `beginningPath` with every selector path in `addPaths` array\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns array with all concatenated paths\n function addAllReplacementsIntoPath( beginningPath, addPaths, replacedElement, originalSelector, result) {\n let j;\n for (j = 0; j < beginningPath.length; j++) {\n const newSelectorPath = addReplacementIntoPath(beginningPath[j], addPaths, replacedElement, originalSelector);\n result.push(newSelectorPath);\n }\n return result;\n }\n\n function mergeElementsOnToSelectors(elements, selectors) {\n let i, sel;\n\n if (elements.length === 0) {\n return ;\n }\n if (selectors.length === 0) {\n selectors.push([ new Selector(elements) ]);\n return;\n }\n\n for (i = 0; (sel = selectors[i]); i++) {\n // if the previous thing in sel is a parent this needs to join on to it\n if (sel.length > 0) {\n sel[sel.length - 1] = sel[sel.length - 1].createDerived(sel[sel.length - 1].elements.concat(elements));\n }\n else {\n sel.push(new Selector(elements));\n }\n }\n }\n\n // replace all parent selectors inside `inSelector` by content of `context` array\n // resulting selectors are returned inside `paths` array\n // returns true if `inSelector` contained at least one parent selector\n function replaceParentSelector(paths, context, inSelector) {\n // The paths are [[Selector]]\n // The first list is a list of comma separated selectors\n // The inner list is a list of inheritance separated selectors\n // e.g.\n // .a, .b {\n // .c {\n // }\n // }\n // == [[.a] [.c]] [[.b] [.c]]\n //\n let i, j, k, currentElements, newSelectors, selectorsMultiplied, sel, el, hadParentSelector = false, length, lastSelector;\n function findNestedSelector(element) {\n let maybeSelector;\n if (!(element.value instanceof Paren)) {\n return null;\n }\n\n maybeSelector = element.value.value;\n if (!(maybeSelector instanceof Selector)) {\n return null;\n }\n\n return maybeSelector;\n }\n\n // the elements from the current selector so far\n currentElements = [];\n // the current list of new selectors to add to the path.\n // We will build it up. We initiate it with one empty selector as we \"multiply\" the new selectors\n // by the parents\n newSelectors = [\n []\n ];\n\n for (i = 0; (el = inSelector.elements[i]); i++) {\n // non parent reference elements just get added\n if (el.value !== '&') {\n const nestedSelector = findNestedSelector(el);\n if (nestedSelector != null) {\n // merge the current list of non parent selector elements\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n const nestedPaths = [];\n let replaced;\n const replacedNewSelectors = [];\n replaced = replaceParentSelector(nestedPaths, context, nestedSelector);\n hadParentSelector = hadParentSelector || replaced;\n // the nestedPaths array should have only one member - replaceParentSelector does not multiply selectors\n for (k = 0; k < nestedPaths.length; k++) {\n const replacementSelector = createSelector(createParenthesis(nestedPaths[k], el), el);\n addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors);\n }\n newSelectors = replacedNewSelectors;\n currentElements = [];\n } else {\n currentElements.push(el);\n }\n\n } else {\n hadParentSelector = true;\n // the new list of selectors to add\n selectorsMultiplied = [];\n\n // merge the current list of non parent selector elements\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n // loop through our current selectors\n for (j = 0; j < newSelectors.length; j++) {\n sel = newSelectors[j];\n // if we don't have any parent paths, the & might be in a mixin so that it can be used\n // whether there are parents or not\n if (context.length === 0) {\n // the combinator used on el should now be applied to the next element instead so that\n // it is not lost\n if (sel.length > 0) {\n sel[0].elements.push(new Element(el.combinator, '', el.isVariable, el._index, el._fileInfo));\n }\n selectorsMultiplied.push(sel);\n }\n else {\n // and the parent selectors\n for (k = 0; k < context.length; k++) {\n // We need to put the current selectors\n // then join the last selector's elements on to the parents selectors\n const newSelectorPath = addReplacementIntoPath(sel, context[k], el, inSelector);\n // add that to our new set of selectors\n selectorsMultiplied.push(newSelectorPath);\n }\n }\n }\n\n // our new selectors has been multiplied, so reset the state\n newSelectors = selectorsMultiplied;\n currentElements = [];\n }\n }\n\n // if we have any elements left over (e.g. .a& .b == .b)\n // add them on to all the current selectors\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n for (i = 0; i < newSelectors.length; i++) {\n length = newSelectors[i].length;\n if (length > 0) {\n paths.push(newSelectors[i]);\n lastSelector = newSelectors[i][length - 1];\n newSelectors[i][length - 1] = lastSelector.createDerived(lastSelector.elements, inSelector.extendList);\n }\n }\n\n return hadParentSelector;\n }\n\n function deriveSelector(visibilityInfo, deriveFrom) {\n const newSelector = deriveFrom.createDerived(deriveFrom.elements, deriveFrom.extendList, deriveFrom.evaldCondition);\n newSelector.copyVisibilityInfo(visibilityInfo);\n return newSelector;\n }\n\n // joinSelector code follows\n let i, newPaths, hadParentSelector;\n\n newPaths = [];\n hadParentSelector = replaceParentSelector(newPaths, context, selector);\n\n if (!hadParentSelector) {\n if (context.length > 0) {\n newPaths = [];\n for (i = 0; i < context.length; i++) {\n\n const concatenated = context[i].map(deriveSelector.bind(this, selector.visibilityInfo()));\n\n concatenated.push(selector);\n newPaths.push(concatenated);\n }\n }\n else {\n newPaths = [[selector]];\n }\n }\n\n for (i = 0; i < newPaths.length; i++) {\n paths.push(newPaths[i]);\n }\n\n }\n});\n\nexport default Ruleset;\n","import Node from './node';\nimport Selector from './selector';\nimport Ruleset from './ruleset';\nimport Anonymous from './anonymous';\n\nconst AtRule = function(\n name,\n value,\n rules,\n index,\n currentFileInfo,\n debugInfo,\n isRooted,\n visibilityInfo\n) {\n let i;\n\n this.name = name;\n this.value = (value instanceof Node) ? value : (value ? new Anonymous(value) : value);\n if (rules) {\n if (Array.isArray(rules)) {\n this.rules = rules;\n } else {\n this.rules = [rules];\n this.rules[0].selectors = (new Selector([], null, null, index, currentFileInfo)).createEmptySelectors();\n }\n for (i = 0; i < this.rules.length; i++) {\n this.rules[i].allowImports = true;\n }\n this.setParent(this.rules, this);\n }\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.debugInfo = debugInfo;\n this.isRooted = isRooted || false;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n}\n\nAtRule.prototype = Object.assign(new Node(), {\n type: 'AtRule',\n accept(visitor) {\n const value = this.value, rules = this.rules;\n if (rules) {\n this.rules = visitor.visitArray(rules);\n }\n if (value) {\n this.value = visitor.visit(value);\n }\n },\n\n isRulesetLike() {\n return this.rules || !this.isCharset();\n },\n\n isCharset() {\n return '@charset' === this.name;\n },\n\n genCSS(context, output) {\n const value = this.value, rules = this.rules;\n output.add(this.name, this.fileInfo(), this.getIndex());\n if (value) {\n output.add(' ');\n value.genCSS(context, output);\n }\n if (rules) {\n this.outputRuleset(context, output, rules);\n } else {\n output.add(';');\n }\n },\n\n eval(context) {\n let mediaPathBackup, mediaBlocksBackup, value = this.value, rules = this.rules;\n\n // media stored inside other atrule should not bubble over it\n // backpup media bubbling information\n mediaPathBackup = context.mediaPath;\n mediaBlocksBackup = context.mediaBlocks;\n // deleted media bubbling information\n context.mediaPath = [];\n context.mediaBlocks = [];\n\n if (value) {\n value = value.eval(context);\n }\n if (rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n rules = [rules[0].eval(context)];\n rules[0].root = true;\n }\n // restore media bubbling information\n context.mediaPath = mediaPathBackup;\n context.mediaBlocks = mediaBlocksBackup;\n\n return new AtRule(this.name, value, rules,\n this.getIndex(), this.fileInfo(), this.debugInfo, this.isRooted, this.visibilityInfo());\n },\n\n variable(name) {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.variable.call(this.rules[0], name);\n }\n },\n\n find() {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.find.apply(this.rules[0], arguments);\n }\n },\n\n rulesets() {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.rulesets.apply(this.rules[0]);\n }\n },\n\n outputRuleset(context, output, rules) {\n const ruleCnt = rules.length;\n let i;\n context.tabLevel = (context.tabLevel | 0) + 1;\n\n // Compressed\n if (context.compress) {\n output.add('{');\n for (i = 0; i < ruleCnt; i++) {\n rules[i].genCSS(context, output);\n }\n output.add('}');\n context.tabLevel--;\n return;\n }\n\n // Non-compressed\n const tabSetStr = `\\n${Array(context.tabLevel).join(' ')}`, tabRuleStr = `${tabSetStr} `;\n if (!ruleCnt) {\n output.add(` {${tabSetStr}}`);\n } else {\n output.add(` {${tabRuleStr}`);\n rules[0].genCSS(context, output);\n for (i = 1; i < ruleCnt; i++) {\n output.add(tabRuleStr);\n rules[i].genCSS(context, output);\n }\n output.add(`${tabSetStr}}`);\n }\n\n context.tabLevel--;\n }\n})\n\nexport default AtRule;\n","import Node from './node';\nimport contexts from '../contexts';\nimport * as utils from '../utils';\n\nconst DetachedRuleset = function(ruleset, frames) {\n this.ruleset = ruleset;\n this.frames = frames;\n this.setParent(this.ruleset, this);\n};\n\nDetachedRuleset.prototype = Object.assign(new Node(), {\n type: 'DetachedRuleset',\n evalFirst: true,\n\n accept(visitor) {\n this.ruleset = visitor.visit(this.ruleset);\n },\n\n eval(context) {\n const frames = this.frames || utils.copyArray(context.frames);\n return new DetachedRuleset(this.ruleset, frames);\n },\n\n callEval(context) {\n return this.ruleset.eval(this.frames ? new contexts.Eval(context, this.frames.concat(context.frames)) : context);\n }\n});\n\nexport default DetachedRuleset;\n","import Node from './node';\nimport unitConversions from '../data/unit-conversions';\nimport * as utils from '../utils';\n\nconst Unit = function(numerator, denominator, backupUnit) {\n this.numerator = numerator ? utils.copyArray(numerator).sort() : [];\n this.denominator = denominator ? utils.copyArray(denominator).sort() : [];\n if (backupUnit) {\n this.backupUnit = backupUnit;\n } else if (numerator && numerator.length) {\n this.backupUnit = numerator[0];\n }\n};\n\nUnit.prototype = Object.assign(new Node(), {\n type: 'Unit',\n\n clone() {\n return new Unit(utils.copyArray(this.numerator), utils.copyArray(this.denominator), this.backupUnit);\n },\n\n genCSS(context, output) {\n // Dimension checks the unit is singular and throws an error if in strict math mode.\n const strictUnits = context && context.strictUnits;\n if (this.numerator.length === 1) {\n output.add(this.numerator[0]); // the ideal situation\n } else if (!strictUnits && this.backupUnit) {\n output.add(this.backupUnit);\n } else if (!strictUnits && this.denominator.length) {\n output.add(this.denominator[0]);\n }\n },\n\n toString() {\n let i, returnStr = this.numerator.join('*');\n for (i = 0; i < this.denominator.length; i++) {\n returnStr += `/${this.denominator[i]}`;\n }\n return returnStr;\n },\n\n compare(other) {\n return this.is(other.toString()) ? 0 : undefined;\n },\n\n is(unitString) {\n return this.toString().toUpperCase() === unitString.toUpperCase();\n },\n\n isLength() {\n return RegExp('^(px|em|ex|ch|rem|in|cm|mm|pc|pt|ex|vw|vh|vmin|vmax)$', 'gi').test(this.toCSS());\n },\n\n isEmpty() {\n return this.numerator.length === 0 && this.denominator.length === 0;\n },\n\n isSingular() {\n return this.numerator.length <= 1 && this.denominator.length === 0;\n },\n\n map(callback) {\n let i;\n\n for (i = 0; i < this.numerator.length; i++) {\n this.numerator[i] = callback(this.numerator[i], false);\n }\n\n for (i = 0; i < this.denominator.length; i++) {\n this.denominator[i] = callback(this.denominator[i], true);\n }\n },\n\n usedUnits() {\n let group;\n const result = {};\n let mapUnit;\n let groupName;\n\n mapUnit = function (atomicUnit) {\n /* jshint loopfunc:true */\n if (group.hasOwnProperty(atomicUnit) && !result[groupName]) {\n result[groupName] = atomicUnit;\n }\n\n return atomicUnit;\n };\n\n for (groupName in unitConversions) {\n if (unitConversions.hasOwnProperty(groupName)) {\n group = unitConversions[groupName];\n\n this.map(mapUnit);\n }\n }\n\n return result;\n },\n\n cancel() {\n const counter = {};\n let atomicUnit;\n let i;\n\n for (i = 0; i < this.numerator.length; i++) {\n atomicUnit = this.numerator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) + 1;\n }\n\n for (i = 0; i < this.denominator.length; i++) {\n atomicUnit = this.denominator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) - 1;\n }\n\n this.numerator = [];\n this.denominator = [];\n\n for (atomicUnit in counter) {\n if (counter.hasOwnProperty(atomicUnit)) {\n const count = counter[atomicUnit];\n\n if (count > 0) {\n for (i = 0; i < count; i++) {\n this.numerator.push(atomicUnit);\n }\n } else if (count < 0) {\n for (i = 0; i < -count; i++) {\n this.denominator.push(atomicUnit);\n }\n }\n }\n }\n\n this.numerator.sort();\n this.denominator.sort();\n }\n});\n\nexport default Unit;\n","import Node from './node';\nimport unitConversions from '../data/unit-conversions';\nimport Unit from './unit';\nimport Color from './color';\n\n//\n// A number with a unit\n//\nconst Dimension = function(value, unit) {\n this.value = parseFloat(value);\n if (isNaN(this.value)) {\n throw new Error('Dimension is not a number.');\n }\n this.unit = (unit && unit instanceof Unit) ? unit :\n new Unit(unit ? [unit] : undefined);\n this.setParent(this.unit, this);\n};\n\nDimension.prototype = Object.assign(new Node(), {\n type: 'Dimension',\n\n accept(visitor) {\n this.unit = visitor.visit(this.unit);\n },\n\n eval(context) {\n return this;\n },\n\n toColor() {\n return new Color([this.value, this.value, this.value]);\n },\n\n genCSS(context, output) {\n if ((context && context.strictUnits) && !this.unit.isSingular()) {\n throw new Error(`Multiple units in dimension. Correct the units or use the unit function. Bad unit: ${this.unit.toString()}`);\n }\n\n const value = this.fround(context, this.value);\n let strValue = String(value);\n\n if (value !== 0 && value < 0.000001 && value > -0.000001) {\n // would be output 1e-6 etc.\n strValue = value.toFixed(20).replace(/0+$/, '');\n }\n\n if (context && context.compress) {\n // Zero values doesn't need a unit\n if (value === 0 && this.unit.isLength()) {\n output.add(strValue);\n return;\n }\n\n // Float values doesn't need a leading zero\n if (value > 0 && value < 1) {\n strValue = (strValue).substr(1);\n }\n }\n\n output.add(strValue);\n this.unit.genCSS(context, output);\n },\n\n // In an operation between two Dimensions,\n // we default to the first Dimension's unit,\n // so `1px + 2` will yield `3px`.\n operate(context, op, other) {\n /* jshint noempty:false */\n let value = this._operate(context, op, this.value, other.value), unit = this.unit.clone();\n\n if (op === '+' || op === '-') {\n if (unit.numerator.length === 0 && unit.denominator.length === 0) {\n unit = other.unit.clone();\n if (this.unit.backupUnit) {\n unit.backupUnit = this.unit.backupUnit;\n }\n } else if (other.unit.numerator.length === 0 && unit.denominator.length === 0) {\n // do nothing\n } else {\n other = other.convertTo(this.unit.usedUnits());\n\n if (context.strictUnits && other.unit.toString() !== unit.toString()) {\n throw new Error(`Incompatible units. Change the units or use the unit function. Bad units: '${unit.toString()}' and '${other.unit.toString()}'.`);\n }\n\n value = this._operate(context, op, this.value, other.value);\n }\n } else if (op === '*') {\n unit.numerator = unit.numerator.concat(other.unit.numerator).sort();\n unit.denominator = unit.denominator.concat(other.unit.denominator).sort();\n unit.cancel();\n } else if (op === '/') {\n unit.numerator = unit.numerator.concat(other.unit.denominator).sort();\n unit.denominator = unit.denominator.concat(other.unit.numerator).sort();\n unit.cancel();\n }\n return new Dimension(value, unit);\n },\n\n compare(other) {\n let a, b;\n\n if (!(other instanceof Dimension)) {\n return undefined;\n }\n\n if (this.unit.isEmpty() || other.unit.isEmpty()) {\n a = this;\n b = other;\n } else {\n a = this.unify();\n b = other.unify();\n if (a.unit.compare(b.unit) !== 0) {\n return undefined;\n }\n }\n\n return Node.numericCompare(a.value, b.value);\n },\n\n unify() {\n return this.convertTo({ length: 'px', duration: 's', angle: 'rad' });\n },\n\n convertTo(conversions) {\n let value = this.value;\n const unit = this.unit.clone();\n let i;\n let groupName;\n let group;\n let targetUnit;\n let derivedConversions = {};\n let applyUnit;\n\n if (typeof conversions === 'string') {\n for (i in unitConversions) {\n if (unitConversions[i].hasOwnProperty(conversions)) {\n derivedConversions = {};\n derivedConversions[i] = conversions;\n }\n }\n conversions = derivedConversions;\n }\n applyUnit = function (atomicUnit, denominator) {\n /* jshint loopfunc:true */\n if (group.hasOwnProperty(atomicUnit)) {\n if (denominator) {\n value = value / (group[atomicUnit] / group[targetUnit]);\n } else {\n value = value * (group[atomicUnit] / group[targetUnit]);\n }\n\n return targetUnit;\n }\n\n return atomicUnit;\n };\n\n for (groupName in conversions) {\n if (conversions.hasOwnProperty(groupName)) {\n targetUnit = conversions[groupName];\n group = unitConversions[groupName];\n\n unit.map(applyUnit);\n }\n }\n\n unit.cancel();\n\n return new Dimension(value, unit);\n }\n});\n\nexport default Dimension;\n","import Node from './node';\nimport Color from './color';\nimport Dimension from './dimension';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\n\nconst Operation = function(op, operands, isSpaced) {\n this.op = op.trim();\n this.operands = operands;\n this.isSpaced = isSpaced;\n};\n\nOperation.prototype = Object.assign(new Node(), {\n type: 'Operation',\n\n accept(visitor) {\n this.operands = visitor.visitArray(this.operands);\n },\n\n eval(context) {\n let a = this.operands[0].eval(context), b = this.operands[1].eval(context), op;\n\n if (context.isMathOn(this.op)) {\n op = this.op === './' ? '/' : this.op;\n if (a instanceof Dimension && b instanceof Color) {\n a = a.toColor();\n }\n if (b instanceof Dimension && a instanceof Color) {\n b = b.toColor();\n }\n if (!a.operate) {\n if (a instanceof Operation && a.op === '/' && context.math === MATH.PARENS_DIVISION) {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n throw { type: 'Operation',\n message: 'Operation on an invalid type' };\n }\n\n return a.operate(context, op, b);\n } else {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n },\n\n genCSS(context, output) {\n this.operands[0].genCSS(context, output);\n if (this.isSpaced) {\n output.add(' ');\n }\n output.add(this.op);\n if (this.isSpaced) {\n output.add(' ');\n }\n this.operands[1].genCSS(context, output);\n }\n});\n\nexport default Operation;\n","import Node from './node';\nimport Paren from './paren';\nimport Comment from './comment';\nimport Dimension from './dimension';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\nconst Expression = function(value, noSpacing) {\n this.value = value;\n this.noSpacing = noSpacing;\n if (!value) {\n throw new Error('Expression requires an array parameter');\n }\n};\n\nExpression.prototype = Object.assign(new Node(), {\n type: 'Expression',\n\n accept(visitor) {\n this.value = visitor.visitArray(this.value);\n },\n\n eval(context) {\n let returnValue;\n const mathOn = context.isMathOn();\n const inParenthesis = this.parens;\n\n let doubleParen = false;\n if (inParenthesis) {\n context.inParenthesis();\n }\n if (this.value.length > 1) {\n returnValue = new Expression(this.value.map(function (e) {\n if (!e.eval) {\n return e;\n }\n return e.eval(context);\n }), this.noSpacing);\n } else if (this.value.length === 1) {\n if (this.value[0].parens && !this.value[0].parensInOp && !context.inCalc) {\n doubleParen = true;\n }\n returnValue = this.value[0].eval(context);\n } else {\n returnValue = this;\n }\n if (inParenthesis) {\n context.outOfParenthesis();\n }\n if (this.parens && this.parensInOp && !mathOn && !doubleParen \n && (!(returnValue instanceof Dimension))) {\n returnValue = new Paren(returnValue);\n }\n return returnValue;\n },\n\n genCSS(context, output) {\n for (let i = 0; i < this.value.length; i++) {\n this.value[i].genCSS(context, output);\n if (!this.noSpacing && i + 1 < this.value.length) {\n output.add(' ');\n }\n }\n },\n\n throwAwayComments() {\n this.value = this.value.filter(function(v) {\n return !(v instanceof Comment);\n });\n }\n});\n\nexport default Expression;\n","import Expression from '../tree/expression';\n\nclass functionCaller {\n constructor(name, context, index, currentFileInfo) {\n this.name = name.toLowerCase();\n this.index = index;\n this.context = context;\n this.currentFileInfo = currentFileInfo;\n\n this.func = context.frames[0].functionRegistry.get(this.name);\n }\n\n isValid() {\n return Boolean(this.func);\n }\n\n call(args) {\n if (!(Array.isArray(args))) {\n args = [args];\n }\n const evalArgs = this.func.evalArgs;\n if (evalArgs !== false) {\n args = args.map(a => a.eval(this.context));\n }\n const commentFilter = item => !(item.type === 'Comment');\n\n // This code is terrible and should be replaced as per this issue...\n // https://github.com/less/less.js/issues/2477\n args = args\n .filter(commentFilter)\n .map(item => {\n if (item.type === 'Expression') {\n const subNodes = item.value.filter(commentFilter);\n if (subNodes.length === 1) {\n return subNodes[0];\n } else {\n return new Expression(subNodes);\n }\n }\n return item;\n });\n\n if (evalArgs === false) {\n return this.func(this.context, ...args);\n }\n\n return this.func(...args);\n }\n}\n\nexport default functionCaller;\n","import Node from './node';\nimport Anonymous from './anonymous';\nimport FunctionCaller from '../functions/function-caller';\n\n//\n// A function call node.\n//\nconst Call = function(name, args, index, currentFileInfo) {\n this.name = name;\n this.args = args;\n this.calc = name === 'calc';\n this._index = index;\n this._fileInfo = currentFileInfo;\n}\n\nCall.prototype = Object.assign(new Node(), {\n type: 'Call',\n\n accept(visitor) {\n if (this.args) {\n this.args = visitor.visitArray(this.args);\n }\n },\n\n //\n // When evaluating a function call,\n // we either find the function in the functionRegistry,\n // in which case we call it, passing the evaluated arguments,\n // if this returns null or we cannot find the function, we\n // simply print it out as it appeared originally [2].\n //\n // The reason why we evaluate the arguments, is in the case where\n // we try to pass a variable to a function, like: `saturate(@color)`.\n // The function should receive the value, not the variable.\n //\n eval(context) {\n /**\n * Turn off math for calc(), and switch back on for evaluating nested functions\n */\n const currentMathContext = context.mathOn;\n context.mathOn = !this.calc;\n if (this.calc || context.inCalc) {\n context.enterCalc();\n }\n\n const exitCalc = () => {\n if (this.calc || context.inCalc) {\n context.exitCalc();\n }\n context.mathOn = currentMathContext;\n };\n\n let result;\n const funcCaller = new FunctionCaller(this.name, context, this.getIndex(), this.fileInfo());\n\n if (funcCaller.isValid()) {\n try {\n result = funcCaller.call(this.args);\n exitCalc();\n } catch (e) {\n if (e.hasOwnProperty('line') && e.hasOwnProperty('column')) {\n throw e;\n }\n throw { \n type: e.type || 'Runtime',\n message: `Error evaluating function \\`${this.name}\\`${e.message ? `: ${e.message}` : ''}`,\n index: this.getIndex(), \n filename: this.fileInfo().filename,\n line: e.lineNumber,\n column: e.columnNumber\n };\n }\n }\n\n if (result !== null && result !== undefined) {\n // Results that that are not nodes are cast as Anonymous nodes\n // Falsy values or booleans are returned as empty nodes\n if (!(result instanceof Node)) {\n if (!result || result === true) {\n result = new Anonymous(null); \n }\n else {\n result = new Anonymous(result.toString()); \n }\n \n }\n result._index = this._index;\n result._fileInfo = this._fileInfo;\n return result;\n }\n\n const args = this.args.map(a => a.eval(context));\n exitCalc();\n\n return new Call(this.name, args, this.getIndex(), this.fileInfo());\n },\n\n genCSS(context, output) {\n output.add(`${this.name}(`, this.fileInfo(), this.getIndex());\n\n for (let i = 0; i < this.args.length; i++) {\n this.args[i].genCSS(context, output);\n if (i + 1 < this.args.length) {\n output.add(', ');\n }\n }\n\n output.add(')');\n }\n});\n\nexport default Call;\n","import Node from './node';\nimport Call from './call';\n\nconst Variable = function(name, index, currentFileInfo) {\n this.name = name;\n this._index = index;\n this._fileInfo = currentFileInfo;\n};\n\nVariable.prototype = Object.assign(new Node(), {\n type: 'Variable',\n\n eval(context) {\n let variable, name = this.name;\n\n if (name.indexOf('@@') === 0) {\n name = `@${new Variable(name.slice(1), this.getIndex(), this.fileInfo()).eval(context).value}`;\n }\n\n if (this.evaluating) {\n throw { type: 'Name',\n message: `Recursive variable definition for ${name}`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n variable = this.find(context.frames, function (frame) {\n const v = frame.variable(name);\n if (v) {\n if (v.important) {\n const importantScope = context.importantScope[context.importantScope.length - 1];\n importantScope.important = v.important;\n }\n // If in calc, wrap vars in a function call to cascade evaluate args first\n if (context.inCalc) {\n return (new Call('_SELF', [v.value])).eval(context);\n }\n else {\n return v.value.eval(context);\n }\n }\n });\n if (variable) {\n this.evaluating = false;\n return variable;\n } else {\n throw { type: 'Name',\n message: `variable ${name} is undefined`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n },\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n});\n\nexport default Variable;\n","import Node from './node';\nimport Declaration from './declaration';\n\nconst Property = function(name, index, currentFileInfo) {\n this.name = name;\n this._index = index;\n this._fileInfo = currentFileInfo;\n};\n\nProperty.prototype = Object.assign(new Node(), {\n type: 'Property',\n\n eval(context) {\n let property;\n const name = this.name;\n // TODO: shorten this reference\n const mergeRules = context.pluginManager.less.visitors.ToCSSVisitor.prototype._mergeRules;\n\n if (this.evaluating) {\n throw { type: 'Name',\n message: `Recursive property reference for ${name}`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n property = this.find(context.frames, function (frame) {\n let v;\n const vArr = frame.property(name);\n if (vArr) {\n for (let i = 0; i < vArr.length; i++) {\n v = vArr[i];\n\n vArr[i] = new Declaration(v.name,\n v.value,\n v.important,\n v.merge,\n v.index,\n v.currentFileInfo,\n v.inline,\n v.variable\n );\n }\n mergeRules(vArr);\n\n v = vArr[vArr.length - 1];\n if (v.important) {\n const importantScope = context.importantScope[context.importantScope.length - 1];\n importantScope.important = v.important;\n }\n v = v.value.eval(context);\n return v;\n }\n });\n if (property) {\n this.evaluating = false;\n return property;\n } else {\n throw { type: 'Name',\n message: `Property '${name}' is undefined`,\n filename: this.currentFileInfo.filename,\n index: this.index };\n }\n },\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n});\n\nexport default Property;\n","import Node from './node';\n\nconst Attribute = function(key, op, value) {\n this.key = key;\n this.op = op;\n this.value = value;\n}\n\nAttribute.prototype = Object.assign(new Node(), {\n type: 'Attribute',\n\n eval(context) {\n return new Attribute(this.key.eval ? this.key.eval(context) : this.key,\n this.op, (this.value && this.value.eval) ? this.value.eval(context) : this.value);\n },\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n },\n\n toCSS(context) {\n let value = this.key.toCSS ? this.key.toCSS(context) : this.key;\n\n if (this.op) {\n value += this.op;\n value += (this.value.toCSS ? this.value.toCSS(context) : this.value);\n }\n\n return `[${value}]`;\n }\n})\n\nexport default Attribute;\n","import Node from './node';\nimport Variable from './variable';\nimport Property from './property';\n\n\nconst Quoted = function(str, content, escaped, index, currentFileInfo) {\n this.escaped = (escaped == null) ? true : escaped;\n this.value = content || '';\n this.quote = str.charAt(0);\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.variableRegex = /@\\{([\\w-]+)\\}/g;\n this.propRegex = /\\$\\{([\\w-]+)\\}/g;\n this.allowRoot = escaped;\n};\n\nQuoted.prototype = Object.assign(new Node(), {\n type: 'Quoted',\n\n genCSS(context, output) {\n if (!this.escaped) {\n output.add(this.quote, this.fileInfo(), this.getIndex());\n }\n output.add(this.value);\n if (!this.escaped) {\n output.add(this.quote);\n }\n },\n\n containsVariables() {\n return this.value.match(this.variableRegex);\n },\n\n eval(context) {\n const that = this;\n let value = this.value;\n const variableReplacement = function (_, name) {\n const v = new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v.value : v.toCSS();\n };\n const propertyReplacement = function (_, name) {\n const v = new Property(`$${name}`, that.getIndex(), that.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v.value : v.toCSS();\n };\n function iterativeReplace(value, regexp, replacementFnc) {\n let evaluatedValue = value;\n do {\n value = evaluatedValue.toString();\n evaluatedValue = value.replace(regexp, replacementFnc);\n } while (value !== evaluatedValue);\n return evaluatedValue;\n }\n value = iterativeReplace(value, this.variableRegex, variableReplacement);\n value = iterativeReplace(value, this.propRegex, propertyReplacement);\n return new Quoted(this.quote + value + this.quote, value, this.escaped, this.getIndex(), this.fileInfo());\n },\n\n compare(other) {\n // when comparing quoted strings allow the quote to differ\n if (other.type === 'Quoted' && !this.escaped && !other.escaped) {\n return Node.numericCompare(this.value, other.value);\n } else {\n return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n }\n }\n});\n\nexport default Quoted;\n","import Node from './node';\n\nfunction escapePath(path) {\n return path.replace(/[\\(\\)'\"\\s]/g, function(match) { return `\\\\${match}`; });\n}\n\nconst URL = function(val, index, currentFileInfo, isEvald) {\n this.value = val;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.isEvald = isEvald;\n};\n\nURL.prototype = Object.assign(new Node(), {\n type: 'URL',\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n },\n\n genCSS(context, output) {\n output.add('url(');\n this.value.genCSS(context, output);\n output.add(')');\n },\n\n eval(context) {\n const val = this.value.eval(context);\n let rootpath;\n\n if (!this.isEvald) {\n // Add the rootpath if the URL requires a rewrite\n rootpath = this.fileInfo() && this.fileInfo().rootpath;\n if (typeof rootpath === 'string' &&\n typeof val.value === 'string' &&\n context.pathRequiresRewrite(val.value)) {\n if (!val.quote) {\n rootpath = escapePath(rootpath);\n }\n val.value = context.rewritePath(val.value, rootpath);\n } else {\n val.value = context.normalizePath(val.value);\n }\n\n // Add url args if enabled\n if (context.urlArgs) {\n if (!val.value.match(/^\\s*data:/)) {\n const delimiter = val.value.indexOf('?') === -1 ? '?' : '&';\n const urlArgs = delimiter + context.urlArgs;\n if (val.value.indexOf('#') !== -1) {\n val.value = val.value.replace('#', `${urlArgs}#`);\n } else {\n val.value += urlArgs;\n }\n }\n }\n }\n\n return new URL(val, this.getIndex(), this.fileInfo(), true);\n }\n});\n\nexport default URL;\n","import Ruleset from './ruleset';\nimport Value from './value';\nimport Selector from './selector';\nimport Anonymous from './anonymous';\nimport Expression from './expression';\nimport AtRule from './atrule';\nimport * as utils from '../utils';\n\nconst Media = function(value, features, index, currentFileInfo, visibilityInfo) {\n this._index = index;\n this._fileInfo = currentFileInfo;\n\n const selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors();\n\n this.features = new Value(features);\n this.rules = [new Ruleset(selectors, value)];\n this.rules[0].allowImports = true;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n this.setParent(selectors, this);\n this.setParent(this.features, this);\n this.setParent(this.rules, this);\n};\n\nMedia.prototype = Object.assign(new AtRule(), {\n type: 'Media',\n\n isRulesetLike() {\n return true;\n },\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this.features);\n }\n if (this.rules) {\n this.rules = visitor.visitArray(this.rules);\n }\n },\n\n genCSS(context, output) {\n output.add('@media ', this._fileInfo, this._index);\n this.features.genCSS(context, output);\n this.outputRuleset(context, output, this.rules);\n },\n\n eval(context) {\n if (!context.mediaBlocks) {\n context.mediaBlocks = [];\n context.mediaPath = [];\n }\n\n const media = new Media(null, [], this._index, this._fileInfo, this.visibilityInfo());\n if (this.debugInfo) {\n this.rules[0].debugInfo = this.debugInfo;\n media.debugInfo = this.debugInfo;\n }\n \n media.features = this.features.eval(context);\n\n context.mediaPath.push(media);\n context.mediaBlocks.push(media);\n\n this.rules[0].functionRegistry = context.frames[0].functionRegistry.inherit();\n context.frames.unshift(this.rules[0]);\n media.rules = [this.rules[0].eval(context)];\n context.frames.shift();\n\n context.mediaPath.pop();\n\n return context.mediaPath.length === 0 ? media.evalTop(context) :\n media.evalNested(context);\n },\n\n evalTop(context) {\n let result = this;\n\n // Render all dependent Media blocks.\n if (context.mediaBlocks.length > 1) {\n const selectors = (new Selector([], null, null, this.getIndex(), this.fileInfo())).createEmptySelectors();\n result = new Ruleset(selectors, context.mediaBlocks);\n result.multiMedia = true;\n result.copyVisibilityInfo(this.visibilityInfo());\n this.setParent(result, this);\n }\n\n delete context.mediaBlocks;\n delete context.mediaPath;\n\n return result;\n },\n\n evalNested(context) {\n let i;\n let value;\n const path = context.mediaPath.concat([this]);\n\n // Extract the media-query conditions separated with `,` (OR).\n for (i = 0; i < path.length; i++) {\n value = path[i].features instanceof Value ?\n path[i].features.value : path[i].features;\n path[i] = Array.isArray(value) ? value : [value];\n }\n\n // Trace all permutations to generate the resulting media-query.\n //\n // (a, b and c) with nested (d, e) ->\n // a and d\n // a and e\n // b and c and d\n // b and c and e\n this.features = new Value(this.permute(path).map(path => {\n path = path.map(fragment => fragment.toCSS ? fragment : new Anonymous(fragment));\n\n for (i = path.length - 1; i > 0; i--) {\n path.splice(i, 0, new Anonymous('and'));\n }\n\n return new Expression(path);\n }));\n this.setParent(this.features, this);\n\n // Fake a tree-node that doesn't output anything.\n return new Ruleset([], []);\n },\n\n permute(arr) {\n if (arr.length === 0) {\n return [];\n } else if (arr.length === 1) {\n return arr[0];\n } else {\n const result = [];\n const rest = this.permute(arr.slice(1));\n for (let i = 0; i < rest.length; i++) {\n for (let j = 0; j < arr[0].length; j++) {\n result.push([arr[0][j]].concat(rest[i]));\n }\n }\n return result;\n }\n },\n\n bubbleSelectors(selectors) {\n if (!selectors) {\n return;\n }\n this.rules = [new Ruleset(utils.copyArray(selectors), [this.rules[0]])];\n this.setParent(this.rules, this);\n }\n});\n\nexport default Media;\n","import Node from './node';\nimport Media from './media';\nimport URL from './url';\nimport Quoted from './quoted';\nimport Ruleset from './ruleset';\nimport Anonymous from './anonymous';\nimport * as utils from '../utils';\nimport LessError from '../less-error';\n\n//\n// CSS @import node\n//\n// The general strategy here is that we don't want to wait\n// for the parsing to be completed, before we start importing\n// the file. That's because in the context of a browser,\n// most of the time will be spent waiting for the server to respond.\n//\n// On creation, we push the import path to our import queue, though\n// `import,push`, we also pass it a callback, which it'll call once\n// the file has been fetched, and parsed.\n//\nconst Import = function(path, features, options, index, currentFileInfo, visibilityInfo) {\n this.options = options;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.path = path;\n this.features = features;\n this.allowRoot = true;\n\n if (this.options.less !== undefined || this.options.inline) {\n this.css = !this.options.less || this.options.inline;\n } else {\n const pathValue = this.getPath();\n if (pathValue && /[#\\.\\&\\?]css([\\?;].*)?$/.test(pathValue)) {\n this.css = true;\n }\n }\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.features, this);\n this.setParent(this.path, this);\n};\n\nImport.prototype = Object.assign(new Node(), {\n type: 'Import',\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this.features);\n }\n this.path = visitor.visit(this.path);\n if (!this.options.isPlugin && !this.options.inline && this.root) {\n this.root = visitor.visit(this.root);\n }\n },\n\n genCSS(context, output) {\n if (this.css && this.path._fileInfo.reference === undefined) {\n output.add('@import ', this._fileInfo, this._index);\n this.path.genCSS(context, output);\n if (this.features) {\n output.add(' ');\n this.features.genCSS(context, output);\n }\n output.add(';');\n }\n },\n\n getPath() {\n return (this.path instanceof URL) ?\n this.path.value.value : this.path.value;\n },\n\n isVariableImport() {\n let path = this.path;\n if (path instanceof URL) {\n path = path.value;\n }\n if (path instanceof Quoted) {\n return path.containsVariables();\n }\n\n return true;\n },\n\n evalForImport(context) {\n let path = this.path;\n\n if (path instanceof URL) {\n path = path.value;\n }\n\n return new Import(path.eval(context), this.features, this.options, this._index, this._fileInfo, this.visibilityInfo());\n },\n\n evalPath(context) {\n const path = this.path.eval(context);\n const fileInfo = this._fileInfo;\n\n if (!(path instanceof URL)) {\n // Add the rootpath if the URL requires a rewrite\n const pathValue = path.value;\n if (fileInfo &&\n pathValue &&\n context.pathRequiresRewrite(pathValue)) {\n path.value = context.rewritePath(pathValue, fileInfo.rootpath);\n } else {\n path.value = context.normalizePath(path.value);\n }\n }\n\n return path;\n },\n\n eval(context) {\n const result = this.doEval(context);\n if (this.options.reference || this.blocksVisibility()) {\n if (result.length || result.length === 0) {\n result.forEach(function (node) {\n node.addVisibilityBlock();\n }\n );\n } else {\n result.addVisibilityBlock();\n }\n }\n return result;\n },\n\n doEval(context) {\n let ruleset;\n let registry;\n const features = this.features && this.features.eval(context);\n\n if (this.options.isPlugin) {\n if (this.root && this.root.eval) {\n try {\n this.root.eval(context);\n }\n catch (e) {\n e.message = 'Plugin error during evaluation';\n throw new LessError(e, this.root.imports, this.root.filename);\n }\n }\n registry = context.frames[0] && context.frames[0].functionRegistry;\n if ( registry && this.root && this.root.functions ) {\n registry.addMultiple( this.root.functions );\n }\n\n return [];\n }\n\n if (this.skip) {\n if (typeof this.skip === 'function') {\n this.skip = this.skip();\n }\n if (this.skip) {\n return [];\n }\n }\n if (this.options.inline) {\n const contents = new Anonymous(this.root, 0,\n {\n filename: this.importedFilename,\n reference: this.path._fileInfo && this.path._fileInfo.reference\n }, true, true);\n\n return this.features ? new Media([contents], this.features.value) : [contents];\n } else if (this.css) {\n const newImport = new Import(this.evalPath(context), features, this.options, this._index);\n if (!newImport.css && this.error) {\n throw this.error;\n }\n return newImport;\n } else if (this.root) {\n ruleset = new Ruleset(null, utils.copyArray(this.root.rules));\n ruleset.evalImports(context);\n\n return this.features ? new Media(ruleset.rules, this.features.value) : ruleset.rules;\n } else {\n return [];\n }\n }\n});\n\nexport default Import;\n","import Node from './node';\nimport Variable from './variable';\n\nconst JsEvalNode = function() {};\n\nJsEvalNode.prototype = Object.assign(new Node(), {\n evaluateJavaScript(expression, context) {\n let result;\n const that = this;\n const evalContext = {};\n\n if (!context.javascriptEnabled) {\n throw { message: 'Inline JavaScript is not enabled. Is it set in your options?',\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n expression = expression.replace(/@\\{([\\w-]+)\\}/g, function (_, name) {\n return that.jsify(new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context));\n });\n\n try {\n expression = new Function(`return (${expression})`);\n } catch (e) {\n throw { message: `JavaScript evaluation error: ${e.message} from \\`${expression}\\`` ,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n const variables = context.frames[0].variables();\n for (const k in variables) {\n if (variables.hasOwnProperty(k)) {\n /* jshint loopfunc:true */\n evalContext[k.slice(1)] = {\n value: variables[k].value,\n toJS: function () {\n return this.value.eval(context).toCSS();\n }\n };\n }\n }\n\n try {\n result = expression.call(evalContext);\n } catch (e) {\n throw { message: `JavaScript evaluation error: '${e.name}: ${e.message.replace(/[\"]/g, '\\'')}'` ,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n return result;\n },\n\n jsify(obj) {\n if (Array.isArray(obj.value) && (obj.value.length > 1)) {\n return `[${obj.value.map(function (v) { return v.toCSS(); }).join(', ')}]`;\n } else {\n return obj.toCSS();\n }\n }\n});\n\nexport default JsEvalNode;\n","import JsEvalNode from './js-eval-node';\nimport Dimension from './dimension';\nimport Quoted from './quoted';\nimport Anonymous from './anonymous';\n\nconst JavaScript = function(string, escaped, index, currentFileInfo) {\n this.escaped = escaped;\n this.expression = string;\n this._index = index;\n this._fileInfo = currentFileInfo;\n}\n\nJavaScript.prototype = Object.assign(new JsEvalNode(), {\n type: 'JavaScript',\n\n eval(context) {\n const result = this.evaluateJavaScript(this.expression, context);\n const type = typeof result;\n\n if (type === 'number' && !isNaN(result)) {\n return new Dimension(result);\n } else if (type === 'string') {\n return new Quoted(`\"${result}\"`, result, this.escaped, this._index);\n } else if (Array.isArray(result)) {\n return new Anonymous(result.join(', '));\n } else {\n return new Anonymous(result);\n }\n }\n});\n\nexport default JavaScript;\n","import Node from './node';\n\nconst Assignment = function(key, val) {\n this.key = key;\n this.value = val;\n}\n\nAssignment.prototype = Object.assign(new Node(), {\n type: 'Assignment',\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n },\n\n eval(context) {\n if (this.value.eval) {\n return new Assignment(this.key, this.value.eval(context));\n }\n return this;\n },\n\n genCSS(context, output) {\n output.add(`${this.key}=`);\n if (this.value.genCSS) {\n this.value.genCSS(context, output);\n } else {\n output.add(this.value);\n }\n }\n})\n\nexport default Assignment;\n","import Node from './node';\n\nconst Condition = function(op, l, r, i, negate) {\n this.op = op.trim();\n this.lvalue = l;\n this.rvalue = r;\n this._index = i;\n this.negate = negate;\n};\n\nCondition.prototype = Object.assign(new Node(), {\n type: 'Condition',\n\n accept(visitor) {\n this.lvalue = visitor.visit(this.lvalue);\n this.rvalue = visitor.visit(this.rvalue);\n },\n\n eval(context) {\n const result = (function (op, a, b) {\n switch (op) {\n case 'and': return a && b;\n case 'or': return a || b;\n default:\n switch (Node.compare(a, b)) {\n case -1:\n return op === '<' || op === '=<' || op === '<=';\n case 0:\n return op === '=' || op === '>=' || op === '=<' || op === '<=';\n case 1:\n return op === '>' || op === '>=';\n default:\n return false;\n }\n }\n })(this.op, this.lvalue.eval(context), this.rvalue.eval(context));\n\n return this.negate ? !result : result;\n }\n});\n\nexport default Condition;\n","import Node from './node';\n\nconst UnicodeDescriptor = function(value) {\n this.value = value;\n}\n\nUnicodeDescriptor.prototype = Object.assign(new Node(), {\n type: 'UnicodeDescriptor'\n})\n\nexport default UnicodeDescriptor;\n","import Node from './node';\nimport Operation from './operation';\nimport Dimension from './dimension';\n\nconst Negative = function(node) {\n this.value = node;\n};\n\nNegative.prototype = Object.assign(new Node(), {\n type: 'Negative',\n\n genCSS(context, output) {\n output.add('-');\n this.value.genCSS(context, output);\n },\n\n eval(context) {\n if (context.isMathOn()) {\n return (new Operation('*', [new Dimension(-1), this.value])).eval(context);\n }\n return new Negative(this.value.eval(context));\n }\n});\n\nexport default Negative;\n","import Node from './node';\nimport Selector from './selector';\n\nconst Extend = function(selector, option, index, currentFileInfo, visibilityInfo) {\n this.selector = selector;\n this.option = option;\n this.object_id = Extend.next_id++;\n this.parent_ids = [this.object_id];\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n\n switch (option) {\n case 'all':\n this.allowBefore = true;\n this.allowAfter = true;\n break;\n default:\n this.allowBefore = false;\n this.allowAfter = false;\n break;\n }\n this.setParent(this.selector, this);\n};\n\nExtend.prototype = Object.assign(new Node(), {\n type: 'Extend',\n\n accept(visitor) {\n this.selector = visitor.visit(this.selector);\n },\n\n eval(context) {\n return new Extend(this.selector.eval(context), this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n },\n\n clone(context) {\n return new Extend(this.selector, this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n },\n\n // it concatenates (joins) all selectors in selector array\n findSelfSelectors(selectors) {\n let selfElements = [], i, selectorElements;\n\n for (i = 0; i < selectors.length; i++) {\n selectorElements = selectors[i].elements;\n // duplicate the logic in genCSS function inside the selector node.\n // future TODO - move both logics into the selector joiner visitor\n if (i > 0 && selectorElements.length && selectorElements[0].combinator.value === '') {\n selectorElements[0].combinator.value = ' ';\n }\n selfElements = selfElements.concat(selectors[i].elements);\n }\n\n this.selfSelectors = [new Selector(selfElements)];\n this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo());\n }\n});\n\nExtend.next_id = 0;\nexport default Extend;\n","import Node from './node';\nimport Variable from './variable';\nimport Ruleset from './ruleset';\nimport DetachedRuleset from './detached-ruleset';\nimport LessError from '../less-error';\n\nconst VariableCall = function(variable, index, currentFileInfo) {\n this.variable = variable;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.allowRoot = true;\n};\n\nVariableCall.prototype = Object.assign(new Node(), {\n type: 'VariableCall',\n\n eval(context) {\n let rules;\n let detachedRuleset = new Variable(this.variable, this.getIndex(), this.fileInfo()).eval(context);\n const error = new LessError({message: `Could not evaluate variable call ${this.variable}`});\n\n if (!detachedRuleset.ruleset) {\n if (detachedRuleset.rules) {\n rules = detachedRuleset;\n }\n else if (Array.isArray(detachedRuleset)) {\n rules = new Ruleset('', detachedRuleset);\n }\n else if (Array.isArray(detachedRuleset.value)) {\n rules = new Ruleset('', detachedRuleset.value);\n }\n else {\n throw error;\n }\n detachedRuleset = new DetachedRuleset(rules);\n }\n\n if (detachedRuleset.ruleset) {\n return detachedRuleset.callEval(context);\n }\n throw error;\n }\n});\n\nexport default VariableCall;\n","import Node from './node';\nimport Variable from './variable';\nimport Ruleset from './ruleset';\nimport Selector from './selector';\n\nconst NamespaceValue = function(ruleCall, lookups, index, fileInfo) {\n this.value = ruleCall;\n this.lookups = lookups;\n this._index = index;\n this._fileInfo = fileInfo;\n};\n\nNamespaceValue.prototype = Object.assign(new Node(), {\n type: 'NamespaceValue',\n\n eval(context) {\n let i, j, name, rules = this.value.eval(context);\n \n for (i = 0; i < this.lookups.length; i++) {\n name = this.lookups[i];\n\n /**\n * Eval'd DRs return rulesets.\n * Eval'd mixins return rules, so let's make a ruleset if we need it.\n * We need to do this because of late parsing of values\n */\n if (Array.isArray(rules)) {\n rules = new Ruleset([new Selector()], rules);\n }\n\n if (name === '') {\n rules = rules.lastDeclaration();\n }\n else if (name.charAt(0) === '@') {\n if (name.charAt(1) === '@') {\n name = `@${new Variable(name.substr(1)).eval(context).value}`;\n }\n if (rules.variables) {\n rules = rules.variable(name);\n }\n \n if (!rules) {\n throw { type: 'Name',\n message: `variable ${name} not found`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n }\n else {\n if (name.substring(0, 2) === '$@') {\n name = `$${new Variable(name.substr(1)).eval(context).value}`;\n }\n else {\n name = name.charAt(0) === '$' ? name : `$${name}`;\n }\n if (rules.properties) {\n rules = rules.property(name);\n }\n \n if (!rules) {\n throw { type: 'Name',\n message: `property \"${name.substr(1)}\" not found`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n // Properties are an array of values, since a ruleset can have multiple props.\n // We pick the last one (the \"cascaded\" value)\n rules = rules[rules.length - 1];\n }\n\n if (rules.value) {\n rules = rules.eval(context).value;\n }\n if (rules.ruleset) {\n rules = rules.ruleset.eval(context);\n }\n }\n return rules;\n }\n});\n\nexport default NamespaceValue;\n","import Selector from './selector';\nimport Element from './element';\nimport Ruleset from './ruleset';\nimport Declaration from './declaration';\nimport DetachedRuleset from './detached-ruleset';\nimport Expression from './expression';\nimport contexts from '../contexts';\nimport * as utils from '../utils';\n\nconst Definition = function(name, params, rules, condition, variadic, frames, visibilityInfo) {\n this.name = name || 'anonymous mixin';\n this.selectors = [new Selector([new Element(null, name, false, this._index, this._fileInfo)])];\n this.params = params;\n this.condition = condition;\n this.variadic = variadic;\n this.arity = params.length;\n this.rules = rules;\n this._lookups = {};\n const optionalParameters = [];\n this.required = params.reduce(function (count, p) {\n if (!p.name || (p.name && !p.value)) {\n return count + 1;\n }\n else {\n optionalParameters.push(p.name);\n return count;\n }\n }, 0);\n this.optionalParameters = optionalParameters;\n this.frames = frames;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n}\n\nDefinition.prototype = Object.assign(new Ruleset(), {\n type: 'MixinDefinition',\n evalFirst: true,\n\n accept(visitor) {\n if (this.params && this.params.length) {\n this.params = visitor.visitArray(this.params);\n }\n this.rules = visitor.visitArray(this.rules);\n if (this.condition) {\n this.condition = visitor.visit(this.condition);\n }\n },\n\n evalParams(context, mixinEnv, args, evaldArguments) {\n /* jshint boss:true */\n const frame = new Ruleset(null, null);\n\n let varargs;\n let arg;\n const params = utils.copyArray(this.params);\n let i;\n let j;\n let val;\n let name;\n let isNamedFound;\n let argIndex;\n let argsLength = 0;\n\n if (mixinEnv.frames && mixinEnv.frames[0] && mixinEnv.frames[0].functionRegistry) {\n frame.functionRegistry = mixinEnv.frames[0].functionRegistry.inherit();\n }\n mixinEnv = new contexts.Eval(mixinEnv, [frame].concat(mixinEnv.frames));\n\n if (args) {\n args = utils.copyArray(args);\n argsLength = args.length;\n\n for (i = 0; i < argsLength; i++) {\n arg = args[i];\n if (name = (arg && arg.name)) {\n isNamedFound = false;\n for (j = 0; j < params.length; j++) {\n if (!evaldArguments[j] && name === params[j].name) {\n evaldArguments[j] = arg.value.eval(context);\n frame.prependRule(new Declaration(name, arg.value.eval(context)));\n isNamedFound = true;\n break;\n }\n }\n if (isNamedFound) {\n args.splice(i, 1);\n i--;\n continue;\n } else {\n throw { type: 'Runtime', message: `Named argument for ${this.name} ${args[i].name} not found` };\n }\n }\n }\n }\n argIndex = 0;\n for (i = 0; i < params.length; i++) {\n if (evaldArguments[i]) { continue; }\n\n arg = args && args[argIndex];\n\n if (name = params[i].name) {\n if (params[i].variadic) {\n varargs = [];\n for (j = argIndex; j < argsLength; j++) {\n varargs.push(args[j].value.eval(context));\n }\n frame.prependRule(new Declaration(name, new Expression(varargs).eval(context)));\n } else {\n val = arg && arg.value;\n if (val) {\n // This was a mixin call, pass in a detached ruleset of it's eval'd rules\n if (Array.isArray(val)) {\n val = new DetachedRuleset(new Ruleset('', val));\n }\n else {\n val = val.eval(context);\n }\n } else if (params[i].value) {\n val = params[i].value.eval(mixinEnv);\n frame.resetCache();\n } else {\n throw { type: 'Runtime', message: `wrong number of arguments for ${this.name} (${argsLength} for ${this.arity})` };\n }\n\n frame.prependRule(new Declaration(name, val));\n evaldArguments[i] = val;\n }\n }\n\n if (params[i].variadic && args) {\n for (j = argIndex; j < argsLength; j++) {\n evaldArguments[j] = args[j].value.eval(context);\n }\n }\n argIndex++;\n }\n\n return frame;\n },\n\n makeImportant() {\n const rules = !this.rules ? this.rules : this.rules.map(function (r) {\n if (r.makeImportant) {\n return r.makeImportant(true);\n } else {\n return r;\n }\n });\n const result = new Definition(this.name, this.params, rules, this.condition, this.variadic, this.frames);\n return result;\n },\n\n eval(context) {\n return new Definition(this.name, this.params, this.rules, this.condition, this.variadic, this.frames || utils.copyArray(context.frames));\n },\n\n evalCall(context, args, important) {\n const _arguments = [];\n const mixinFrames = this.frames ? this.frames.concat(context.frames) : context.frames;\n const frame = this.evalParams(context, new contexts.Eval(context, mixinFrames), args, _arguments);\n let rules;\n let ruleset;\n\n frame.prependRule(new Declaration('@arguments', new Expression(_arguments).eval(context)));\n\n rules = utils.copyArray(this.rules);\n\n ruleset = new Ruleset(null, rules);\n ruleset.originalRuleset = this;\n ruleset = ruleset.eval(new contexts.Eval(context, [this, frame].concat(mixinFrames)));\n if (important) {\n ruleset = ruleset.makeImportant();\n }\n return ruleset;\n },\n\n matchCondition(args, context) {\n if (this.condition && !this.condition.eval(\n new contexts.Eval(context,\n [this.evalParams(context, /* the parameter variables */\n new contexts.Eval(context, this.frames ? this.frames.concat(context.frames) : context.frames), args, [])]\n .concat(this.frames || []) // the parent namespace/mixin frames\n .concat(context.frames)))) { // the current environment frames\n return false;\n }\n return true;\n },\n\n matchArgs(args, context) {\n const allArgsCnt = (args && args.length) || 0;\n let len;\n const optionalParameters = this.optionalParameters;\n const requiredArgsCnt = !args ? 0 : args.reduce(function (count, p) {\n if (optionalParameters.indexOf(p.name) < 0) {\n return count + 1;\n } else {\n return count;\n }\n }, 0);\n\n if (!this.variadic) {\n if (requiredArgsCnt < this.required) {\n return false;\n }\n if (allArgsCnt > this.params.length) {\n return false;\n }\n } else {\n if (requiredArgsCnt < (this.required - 1)) {\n return false;\n }\n }\n\n // check patterns\n len = Math.min(requiredArgsCnt, this.arity);\n\n for (let i = 0; i < len; i++) {\n if (!this.params[i].name && !this.params[i].variadic) {\n if (args[i].value.eval(context).toCSS() != this.params[i].value.eval(context).toCSS()) {\n return false;\n }\n }\n }\n return true;\n }\n});\n\nexport default Definition;\n","import Node from './node';\nimport Selector from './selector';\nimport MixinDefinition from './mixin-definition';\nimport defaultFunc from '../functions/default';\n\nconst MixinCall = function(elements, args, index, currentFileInfo, important) {\n this.selector = new Selector(elements);\n this.arguments = args || [];\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.important = important;\n this.allowRoot = true;\n this.setParent(this.selector, this);\n};\n\nMixinCall.prototype = Object.assign(new Node(), {\n type: 'MixinCall',\n\n accept(visitor) {\n if (this.selector) {\n this.selector = visitor.visit(this.selector);\n }\n if (this.arguments.length) {\n this.arguments = visitor.visitArray(this.arguments);\n }\n },\n\n eval(context) {\n let mixins;\n let mixin;\n let mixinPath;\n const args = [];\n let arg;\n let argValue;\n const rules = [];\n let match = false;\n let i;\n let m;\n let f;\n let isRecursive;\n let isOneFound;\n const candidates = [];\n let candidate;\n const conditionResult = [];\n let defaultResult;\n const defFalseEitherCase = -1;\n const defNone = 0;\n const defTrue = 1;\n const defFalse = 2;\n let count;\n let originalRuleset;\n let noArgumentsFilter;\n\n this.selector = this.selector.eval(context);\n\n function calcDefGroup(mixin, mixinPath) {\n let f, p, namespace;\n\n for (f = 0; f < 2; f++) {\n conditionResult[f] = true;\n defaultFunc.value(f);\n for (p = 0; p < mixinPath.length && conditionResult[f]; p++) {\n namespace = mixinPath[p];\n if (namespace.matchCondition) {\n conditionResult[f] = conditionResult[f] && namespace.matchCondition(null, context);\n }\n }\n if (mixin.matchCondition) {\n conditionResult[f] = conditionResult[f] && mixin.matchCondition(args, context);\n }\n }\n if (conditionResult[0] || conditionResult[1]) {\n if (conditionResult[0] != conditionResult[1]) {\n return conditionResult[1] ?\n defTrue : defFalse;\n }\n\n return defNone;\n }\n return defFalseEitherCase;\n }\n\n for (i = 0; i < this.arguments.length; i++) {\n arg = this.arguments[i];\n argValue = arg.value.eval(context);\n if (arg.expand && Array.isArray(argValue.value)) {\n argValue = argValue.value;\n for (m = 0; m < argValue.length; m++) {\n args.push({value: argValue[m]});\n }\n } else {\n args.push({name: arg.name, value: argValue});\n }\n }\n\n noArgumentsFilter = function(rule) {return rule.matchArgs(null, context);};\n\n for (i = 0; i < context.frames.length; i++) {\n if ((mixins = context.frames[i].find(this.selector, null, noArgumentsFilter)).length > 0) {\n isOneFound = true;\n\n // To make `default()` function independent of definition order we have two \"subpasses\" here.\n // At first we evaluate each guard *twice* (with `default() == true` and `default() == false`),\n // and build candidate list with corresponding flags. Then, when we know all possible matches,\n // we make a final decision.\n\n for (m = 0; m < mixins.length; m++) {\n mixin = mixins[m].rule;\n mixinPath = mixins[m].path;\n isRecursive = false;\n for (f = 0; f < context.frames.length; f++) {\n if ((!(mixin instanceof MixinDefinition)) && mixin === (context.frames[f].originalRuleset || context.frames[f])) {\n isRecursive = true;\n break;\n }\n }\n if (isRecursive) {\n continue;\n }\n\n if (mixin.matchArgs(args, context)) {\n candidate = {mixin, group: calcDefGroup(mixin, mixinPath)};\n\n if (candidate.group !== defFalseEitherCase) {\n candidates.push(candidate);\n }\n\n match = true;\n }\n }\n\n defaultFunc.reset();\n\n count = [0, 0, 0];\n for (m = 0; m < candidates.length; m++) {\n count[candidates[m].group]++;\n }\n\n if (count[defNone] > 0) {\n defaultResult = defFalse;\n } else {\n defaultResult = defTrue;\n if ((count[defTrue] + count[defFalse]) > 1) {\n throw { type: 'Runtime',\n message: `Ambiguous use of \\`default()\\` found when matching for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n }\n\n for (m = 0; m < candidates.length; m++) {\n candidate = candidates[m].group;\n if ((candidate === defNone) || (candidate === defaultResult)) {\n try {\n mixin = candidates[m].mixin;\n if (!(mixin instanceof MixinDefinition)) {\n originalRuleset = mixin.originalRuleset || mixin;\n mixin = new MixinDefinition('', [], mixin.rules, null, false, null, originalRuleset.visibilityInfo());\n mixin.originalRuleset = originalRuleset;\n }\n const newRules = mixin.evalCall(context, args, this.important).rules;\n this._setVisibilityToReplacement(newRules);\n Array.prototype.push.apply(rules, newRules);\n } catch (e) {\n throw { message: e.message, index: this.getIndex(), filename: this.fileInfo().filename, stack: e.stack };\n }\n }\n }\n\n if (match) {\n return rules;\n }\n }\n }\n if (isOneFound) {\n throw { type: 'Runtime',\n message: `No matching definition was found for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n } else {\n throw { type: 'Name',\n message: `${this.selector.toCSS().trim()} is undefined`,\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n },\n\n _setVisibilityToReplacement(replacement) {\n let i, rule;\n if (this.blocksVisibility()) {\n for (i = 0; i < replacement.length; i++) {\n rule = replacement[i];\n rule.addVisibilityBlock();\n }\n }\n },\n\n format(args) {\n return `${this.selector.toCSS().trim()}(${args ? args.map(function (a) {\n let argValue = '';\n if (a.name) {\n argValue += `${a.name}:`;\n }\n if (a.value.toCSS) {\n argValue += a.value.toCSS();\n } else {\n argValue += '???';\n }\n return argValue;\n }).join(', ') : ''})`;\n }\n});\n\nexport default MixinCall;\n","import Node from './node';\nimport Color from './color';\nimport AtRule from './atrule';\nimport DetachedRuleset from './detached-ruleset';\nimport Operation from './operation';\nimport Dimension from './dimension';\nimport Unit from './unit';\nimport Keyword from './keyword';\nimport Variable from './variable';\nimport Property from './property';\nimport Ruleset from './ruleset';\nimport Element from './element';\nimport Attribute from './attribute';\nimport Combinator from './combinator';\nimport Selector from './selector';\nimport Quoted from './quoted';\nimport Expression from './expression';\nimport Declaration from './declaration';\nimport Call from './call';\nimport URL from './url';\nimport Import from './import';\nimport Comment from './comment';\nimport Anonymous from './anonymous';\nimport Value from './value';\nimport JavaScript from './javascript';\nimport Assignment from './assignment';\nimport Condition from './condition';\nimport Paren from './paren';\nimport Media from './media';\nimport UnicodeDescriptor from './unicode-descriptor';\nimport Negative from './negative';\nimport Extend from './extend';\nimport VariableCall from './variable-call';\nimport NamespaceValue from './namespace-value';\n\n// mixins\nimport MixinCall from './mixin-call';\nimport MixinDefinition from './mixin-definition';\n\nexport default {\n Node, Color, AtRule, DetachedRuleset, Operation,\n Dimension, Unit, Keyword, Variable, Property,\n Ruleset, Element, Attribute, Combinator, Selector,\n Quoted, Expression, Declaration, Call, URL, Import,\n Comment, Anonymous, Value, JavaScript, Assignment,\n Condition, Paren, Media, UnicodeDescriptor, Negative,\n Extend, VariableCall, NamespaceValue,\n mixin: {\n Call: MixinCall,\n Definition: MixinDefinition\n }\n};","class AbstractFileManager {\n getPath(filename) {\n let j = filename.lastIndexOf('?');\n if (j > 0) {\n filename = filename.slice(0, j);\n }\n j = filename.lastIndexOf('/');\n if (j < 0) {\n j = filename.lastIndexOf('\\\\');\n }\n if (j < 0) {\n return '';\n }\n return filename.slice(0, j + 1);\n }\n\n tryAppendExtension(path, ext) {\n return /(\\.[a-z]*$)|([\\?;].*)$/.test(path) ? path : path + ext;\n }\n\n tryAppendLessExtension(path) {\n return this.tryAppendExtension(path, '.less');\n }\n\n supportsSync() {\n return false;\n }\n\n alwaysMakePathsAbsolute() {\n return false;\n }\n\n isPathAbsolute(filename) {\n return (/^(?:[a-z-]+:|\\/|\\\\|#)/i).test(filename);\n }\n\n // TODO: pull out / replace?\n join(basePath, laterPath) {\n if (!basePath) {\n return laterPath;\n }\n return basePath + laterPath;\n }\n\n pathDiff(url, baseUrl) {\n // diff between two paths to create a relative path\n\n const urlParts = this.extractUrlParts(url);\n\n const baseUrlParts = this.extractUrlParts(baseUrl);\n let i;\n let max;\n let urlDirectories;\n let baseUrlDirectories;\n let diff = '';\n if (urlParts.hostPart !== baseUrlParts.hostPart) {\n return '';\n }\n max = Math.max(baseUrlParts.directories.length, urlParts.directories.length);\n for (i = 0; i < max; i++) {\n if (baseUrlParts.directories[i] !== urlParts.directories[i]) { break; }\n }\n baseUrlDirectories = baseUrlParts.directories.slice(i);\n urlDirectories = urlParts.directories.slice(i);\n for (i = 0; i < baseUrlDirectories.length - 1; i++) {\n diff += '../';\n }\n for (i = 0; i < urlDirectories.length - 1; i++) {\n diff += `${urlDirectories[i]}/`;\n }\n return diff;\n }\n\n // helper function, not part of API\n extractUrlParts(url, baseUrl) {\n // urlParts[1] = protocol://hostname/ OR /\n // urlParts[2] = / if path relative to host base\n // urlParts[3] = directories\n // urlParts[4] = filename\n // urlParts[5] = parameters\n\n const urlPartsRegex = /^((?:[a-z-]+:)?\\/{2}(?:[^\\/\\?#]*\\/)|([\\/\\\\]))?((?:[^\\/\\\\\\?#]*[\\/\\\\])*)([^\\/\\\\\\?#]*)([#\\?].*)?$/i;\n\n const urlParts = url.match(urlPartsRegex);\n const returner = {};\n let rawDirectories = [];\n const directories = [];\n let i;\n let baseUrlParts;\n\n if (!urlParts) {\n throw new Error(`Could not parse sheet href - '${url}'`);\n }\n\n // Stylesheets in IE don't always return the full path\n if (baseUrl && (!urlParts[1] || urlParts[2])) {\n baseUrlParts = baseUrl.match(urlPartsRegex);\n if (!baseUrlParts) {\n throw new Error(`Could not parse page url - '${baseUrl}'`);\n }\n urlParts[1] = urlParts[1] || baseUrlParts[1] || '';\n if (!urlParts[2]) {\n urlParts[3] = baseUrlParts[3] + urlParts[3];\n }\n }\n\n if (urlParts[3]) {\n rawDirectories = urlParts[3].replace(/\\\\/g, '/').split('/');\n\n // collapse '..' and skip '.'\n for (i = 0; i < rawDirectories.length; i++) {\n\n if (rawDirectories[i] === '..') {\n directories.pop();\n }\n else if (rawDirectories[i] !== '.') {\n directories.push(rawDirectories[i]);\n }\n \n }\n }\n\n returner.hostPart = urlParts[1];\n returner.directories = directories;\n returner.rawPath = (urlParts[1] || '') + rawDirectories.join('/');\n returner.path = (urlParts[1] || '') + directories.join('/');\n returner.filename = urlParts[4];\n returner.fileUrl = returner.path + (urlParts[4] || '');\n returner.url = returner.fileUrl + (urlParts[5] || '');\n return returner;\n }\n}\n\nexport default AbstractFileManager;\n","import functionRegistry from '../functions/function-registry';\nimport LessError from '../less-error';\n\nclass AbstractPluginLoader {\n constructor() {\n // Implemented by Node.js plugin loader\n this.require = function() {\n return null;\n }\n }\n\n evalPlugin(contents, context, imports, pluginOptions, fileInfo) {\n\n let loader, registry, pluginObj, localModule, pluginManager, filename, result;\n\n pluginManager = context.pluginManager;\n\n if (fileInfo) {\n if (typeof fileInfo === 'string') {\n filename = fileInfo;\n }\n else {\n filename = fileInfo.filename;\n }\n }\n const shortname = (new this.less.FileManager()).extractUrlParts(filename).filename;\n\n if (filename) {\n pluginObj = pluginManager.get(filename);\n\n if (pluginObj) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imports, filename);\n }\n return pluginObj;\n }\n }\n localModule = {\n exports: {},\n pluginManager,\n fileInfo\n };\n registry = functionRegistry.create();\n\n const registerPlugin = function(obj) {\n pluginObj = obj;\n };\n\n try {\n loader = new Function('module', 'require', 'registerPlugin', 'functions', 'tree', 'less', 'fileInfo', contents);\n loader(localModule, this.require(filename), registerPlugin, registry, this.less.tree, this.less, fileInfo);\n }\n catch (e) {\n return new LessError(e, imports, filename);\n }\n\n if (!pluginObj) {\n pluginObj = localModule.exports;\n }\n pluginObj = this.validatePlugin(pluginObj, filename, shortname);\n\n if (pluginObj instanceof LessError) {\n return pluginObj;\n }\n\n if (pluginObj) {\n pluginObj.imports = imports;\n pluginObj.filename = filename;\n\n // For < 3.x (or unspecified minVersion) - setOptions() before install()\n if (!pluginObj.minVersion || this.compareVersion('3.0.0', pluginObj.minVersion) < 0) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n\n if (result) {\n return result;\n }\n }\n\n // Run on first load\n pluginManager.addPlugin(pluginObj, fileInfo.filename, registry);\n pluginObj.functions = registry.getLocalFunctions();\n\n // Need to call setOptions again because the pluginObj might have functions\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n\n // Run every @plugin call\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imports, filename);\n }\n\n }\n else {\n return new LessError({ message: 'Not a valid plugin' }, imports, filename);\n }\n\n return pluginObj;\n\n }\n\n trySetOptions(plugin, filename, name, options) {\n if (options && !plugin.setOptions) {\n return new LessError({\n message: `Options have been provided but the plugin ${name} does not support any options.`\n });\n }\n try {\n plugin.setOptions && plugin.setOptions(options);\n }\n catch (e) {\n return new LessError(e);\n }\n }\n\n validatePlugin(plugin, filename, name) {\n if (plugin) {\n // support plugins being a function\n // so that the plugin can be more usable programmatically\n if (typeof plugin === 'function') {\n plugin = new plugin();\n }\n\n if (plugin.minVersion) {\n if (this.compareVersion(plugin.minVersion, this.less.version) < 0) {\n return new LessError({\n message: `Plugin ${name} requires version ${this.versionToString(plugin.minVersion)}`\n });\n }\n }\n return plugin;\n }\n return null;\n }\n\n compareVersion(aVersion, bVersion) {\n if (typeof aVersion === 'string') {\n aVersion = aVersion.match(/^(\\d+)\\.?(\\d+)?\\.?(\\d+)?/);\n aVersion.shift();\n }\n for (let i = 0; i < aVersion.length; i++) {\n if (aVersion[i] !== bVersion[i]) {\n return parseInt(aVersion[i]) > parseInt(bVersion[i]) ? -1 : 1;\n }\n }\n return 0;\n }\n\n versionToString(version) {\n let versionString = '';\n for (let i = 0; i < version.length; i++) {\n versionString += (versionString ? '.' : '') + version[i];\n }\n return versionString;\n }\n\n printUsage(plugins) {\n for (let i = 0; i < plugins.length; i++) {\n const plugin = plugins[i];\n if (plugin.printUsage) {\n plugin.printUsage();\n }\n }\n }\n}\n\nexport default AbstractPluginLoader;\n\n","import tree from '../tree';\n\nconst _visitArgs = { visitDeeper: true };\nlet _hasIndexed = false;\n\nfunction _noop(node) {\n return node;\n}\n\nfunction indexNodeTypes(parent, ticker) {\n // add .typeIndex to tree node types for lookup table\n let key, child;\n for (key in parent) { \n /* eslint guard-for-in: 0 */\n child = parent[key];\n switch (typeof child) {\n case 'function':\n // ignore bound functions directly on tree which do not have a prototype\n // or aren't nodes\n if (child.prototype && child.prototype.type) {\n child.prototype.typeIndex = ticker++;\n }\n break;\n case 'object':\n ticker = indexNodeTypes(child, ticker);\n break;\n \n }\n }\n return ticker;\n}\n\nclass Visitor {\n constructor(implementation) {\n this._implementation = implementation;\n this._visitInCache = {};\n this._visitOutCache = {};\n\n if (!_hasIndexed) {\n indexNodeTypes(tree, 1);\n _hasIndexed = true;\n }\n }\n\n visit(node) {\n if (!node) {\n return node;\n }\n\n const nodeTypeIndex = node.typeIndex;\n if (!nodeTypeIndex) {\n // MixinCall args aren't a node type?\n if (node.value && node.value.typeIndex) {\n this.visit(node.value);\n }\n return node;\n }\n\n const impl = this._implementation;\n let func = this._visitInCache[nodeTypeIndex];\n let funcOut = this._visitOutCache[nodeTypeIndex];\n const visitArgs = _visitArgs;\n let fnName;\n\n visitArgs.visitDeeper = true;\n\n if (!func) {\n fnName = `visit${node.type}`;\n func = impl[fnName] || _noop;\n funcOut = impl[`${fnName}Out`] || _noop;\n this._visitInCache[nodeTypeIndex] = func;\n this._visitOutCache[nodeTypeIndex] = funcOut;\n }\n\n if (func !== _noop) {\n const newNode = func.call(impl, node, visitArgs);\n if (node && impl.isReplacing) {\n node = newNode;\n }\n }\n\n if (visitArgs.visitDeeper && node) {\n if (node.length) {\n for (let i = 0, cnt = node.length; i < cnt; i++) {\n if (node[i].accept) {\n node[i].accept(this);\n }\n }\n } else if (node.accept) {\n node.accept(this);\n }\n }\n\n if (funcOut != _noop) {\n funcOut.call(impl, node);\n }\n\n return node;\n }\n\n visitArray(nodes, nonReplacing) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.length;\n let i;\n\n // Non-replacing\n if (nonReplacing || !this._implementation.isReplacing) {\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n // Replacing\n const out = [];\n for (i = 0; i < cnt; i++) {\n const evald = this.visit(nodes[i]);\n if (evald === undefined) { continue; }\n if (!evald.splice) {\n out.push(evald);\n } else if (evald.length) {\n this.flatten(evald, out);\n }\n }\n return out;\n }\n\n flatten(arr, out) {\n if (!out) {\n out = [];\n }\n\n let cnt, i, item, nestedCnt, j, nestedItem;\n\n for (i = 0, cnt = arr.length; i < cnt; i++) {\n item = arr[i];\n if (item === undefined) {\n continue;\n }\n if (!item.splice) {\n out.push(item);\n continue;\n }\n\n for (j = 0, nestedCnt = item.length; j < nestedCnt; j++) {\n nestedItem = item[j];\n if (nestedItem === undefined) {\n continue;\n }\n if (!nestedItem.splice) {\n out.push(nestedItem);\n } else if (nestedItem.length) {\n this.flatten(nestedItem, out);\n }\n }\n }\n\n return out;\n }\n}\n\nexport default Visitor;\n","class ImportSequencer {\n constructor(onSequencerEmpty) {\n this.imports = [];\n this.variableImports = [];\n this._onSequencerEmpty = onSequencerEmpty;\n this._currentDepth = 0;\n }\n\n addImport(callback) {\n const importSequencer = this,\n importItem = {\n callback,\n args: null,\n isReady: false\n };\n this.imports.push(importItem);\n return function() {\n importItem.args = Array.prototype.slice.call(arguments, 0);\n importItem.isReady = true;\n importSequencer.tryRun();\n };\n }\n\n addVariableImport(callback) {\n this.variableImports.push(callback);\n }\n\n tryRun() {\n this._currentDepth++;\n try {\n while (true) {\n while (this.imports.length > 0) {\n const importItem = this.imports[0];\n if (!importItem.isReady) {\n return;\n }\n this.imports = this.imports.slice(1);\n importItem.callback.apply(null, importItem.args);\n }\n if (this.variableImports.length === 0) {\n break;\n }\n const variableImport = this.variableImports[0];\n this.variableImports = this.variableImports.slice(1);\n variableImport();\n }\n } finally {\n this._currentDepth--;\n }\n if (this._currentDepth === 0 && this._onSequencerEmpty) {\n this._onSequencerEmpty();\n }\n }\n}\n\nexport default ImportSequencer;\n","import contexts from '../contexts';\nimport Visitor from './visitor';\nimport ImportSequencer from './import-sequencer';\nimport * as utils from '../utils';\n\nconst ImportVisitor = function(importer, finish) {\n\n this._visitor = new Visitor(this);\n this._importer = importer;\n this._finish = finish;\n this.context = new contexts.Eval();\n this.importCount = 0;\n this.onceFileDetectionMap = {};\n this.recursionDetector = {};\n this._sequencer = new ImportSequencer(this._onSequencerEmpty.bind(this));\n};\n\nImportVisitor.prototype = {\n isReplacing: false,\n run: function (root) {\n try {\n // process the contents\n this._visitor.visit(root);\n }\n catch (e) {\n this.error = e;\n }\n\n this.isFinished = true;\n this._sequencer.tryRun();\n },\n _onSequencerEmpty: function() {\n if (!this.isFinished) {\n return;\n }\n this._finish(this.error);\n },\n visitImport: function (importNode, visitArgs) {\n const inlineCSS = importNode.options.inline;\n\n if (!importNode.css || inlineCSS) {\n\n const context = new contexts.Eval(this.context, utils.copyArray(this.context.frames));\n const importParent = context.frames[0];\n\n this.importCount++;\n if (importNode.isVariableImport()) {\n this._sequencer.addVariableImport(this.processImportNode.bind(this, importNode, context, importParent));\n } else {\n this.processImportNode(importNode, context, importParent);\n }\n }\n visitArgs.visitDeeper = false;\n },\n processImportNode: function(importNode, context, importParent) {\n let evaldImportNode;\n const inlineCSS = importNode.options.inline;\n\n try {\n evaldImportNode = importNode.evalForImport(context);\n } catch (e) {\n if (!e.filename) { e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename; }\n // attempt to eval properly and treat as css\n importNode.css = true;\n // if that fails, this error will be thrown\n importNode.error = e;\n }\n\n if (evaldImportNode && (!evaldImportNode.css || inlineCSS)) {\n\n if (evaldImportNode.options.multiple) {\n context.importMultiple = true;\n }\n\n // try appending if we haven't determined if it is css or not\n const tryAppendLessExtension = evaldImportNode.css === undefined;\n\n for (let i = 0; i < importParent.rules.length; i++) {\n if (importParent.rules[i] === importNode) {\n importParent.rules[i] = evaldImportNode;\n break;\n }\n }\n\n const onImported = this.onImported.bind(this, evaldImportNode, context), sequencedOnImported = this._sequencer.addImport(onImported);\n\n this._importer.push(evaldImportNode.getPath(), tryAppendLessExtension, evaldImportNode.fileInfo(),\n evaldImportNode.options, sequencedOnImported);\n } else {\n this.importCount--;\n if (this.isFinished) {\n this._sequencer.tryRun();\n }\n }\n },\n onImported: function (importNode, context, e, root, importedAtRoot, fullPath) {\n if (e) {\n if (!e.filename) {\n e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename;\n }\n this.error = e;\n }\n\n const importVisitor = this, inlineCSS = importNode.options.inline, isPlugin = importNode.options.isPlugin, isOptional = importNode.options.optional, duplicateImport = importedAtRoot || fullPath in importVisitor.recursionDetector;\n\n if (!context.importMultiple) {\n if (duplicateImport) {\n importNode.skip = true;\n } else {\n importNode.skip = function() {\n if (fullPath in importVisitor.onceFileDetectionMap) {\n return true;\n }\n importVisitor.onceFileDetectionMap[fullPath] = true;\n return false;\n };\n }\n }\n\n if (!fullPath && isOptional) {\n importNode.skip = true;\n }\n\n if (root) {\n importNode.root = root;\n importNode.importedFilename = fullPath;\n\n if (!inlineCSS && !isPlugin && (context.importMultiple || !duplicateImport)) {\n importVisitor.recursionDetector[fullPath] = true;\n\n const oldContext = this.context;\n this.context = context;\n try {\n this._visitor.visit(root);\n } catch (e) {\n this.error = e;\n }\n this.context = oldContext;\n }\n }\n\n importVisitor.importCount--;\n\n if (importVisitor.isFinished) {\n importVisitor._sequencer.tryRun();\n }\n },\n visitDeclaration: function (declNode, visitArgs) {\n if (declNode.value.type === 'DetachedRuleset') {\n this.context.frames.unshift(declNode);\n } else {\n visitArgs.visitDeeper = false;\n }\n },\n visitDeclarationOut: function(declNode) {\n if (declNode.value.type === 'DetachedRuleset') {\n this.context.frames.shift();\n }\n },\n visitAtRule: function (atRuleNode, visitArgs) {\n this.context.frames.unshift(atRuleNode);\n },\n visitAtRuleOut: function (atRuleNode) {\n this.context.frames.shift();\n },\n visitMixinDefinition: function (mixinDefinitionNode, visitArgs) {\n this.context.frames.unshift(mixinDefinitionNode);\n },\n visitMixinDefinitionOut: function (mixinDefinitionNode) {\n this.context.frames.shift();\n },\n visitRuleset: function (rulesetNode, visitArgs) {\n this.context.frames.unshift(rulesetNode);\n },\n visitRulesetOut: function (rulesetNode) {\n this.context.frames.shift();\n },\n visitMedia: function (mediaNode, visitArgs) {\n this.context.frames.unshift(mediaNode.rules[0]);\n },\n visitMediaOut: function (mediaNode) {\n this.context.frames.shift();\n }\n};\nexport default ImportVisitor;\n","class SetTreeVisibilityVisitor {\n constructor(visible) {\n this.visible = visible;\n }\n\n run(root) {\n this.visit(root);\n }\n\n visitArray(nodes) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.length;\n let i;\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n visit(node) {\n if (!node) {\n return node;\n }\n if (node.constructor === Array) {\n return this.visitArray(node);\n }\n\n if (!node.blocksVisibility || node.blocksVisibility()) {\n return node;\n }\n if (this.visible) {\n node.ensureVisibility();\n } else {\n node.ensureInvisibility();\n }\n\n node.accept(this);\n return node;\n }\n}\n\nexport default SetTreeVisibilityVisitor;","import tree from '../tree';\nimport Visitor from './visitor';\nimport logger from '../logger';\nimport * as utils from '../utils';\n\n/* jshint loopfunc:true */\n\nclass ExtendFinderVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n this.contexts = [];\n this.allExtendsStack = [[]];\n }\n\n run(root) {\n root = this._visitor.visit(root);\n root.allExtends = this.allExtendsStack[0];\n return root;\n }\n\n visitDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n\n let i;\n let j;\n let extend;\n const allSelectorsExtendList = [];\n let extendList;\n\n // get &:extend(.a); rules which apply to all selectors in this ruleset\n const rules = rulesetNode.rules, ruleCnt = rules ? rules.length : 0;\n for (i = 0; i < ruleCnt; i++) {\n if (rulesetNode.rules[i] instanceof tree.Extend) {\n allSelectorsExtendList.push(rules[i]);\n rulesetNode.extendOnEveryPath = true;\n }\n }\n\n // now find every selector and apply the extends that apply to all extends\n // and the ones which apply to an individual extend\n const paths = rulesetNode.paths;\n for (i = 0; i < paths.length; i++) {\n const selectorPath = paths[i], selector = selectorPath[selectorPath.length - 1], selExtendList = selector.extendList;\n\n extendList = selExtendList ? utils.copyArray(selExtendList).concat(allSelectorsExtendList)\n : allSelectorsExtendList;\n\n if (extendList) {\n extendList = extendList.map(function(allSelectorsExtend) {\n return allSelectorsExtend.clone();\n });\n }\n\n for (j = 0; j < extendList.length; j++) {\n this.foundExtends = true;\n extend = extendList[j];\n extend.findSelfSelectors(selectorPath);\n extend.ruleset = rulesetNode;\n if (j === 0) { extend.firstExtendOnThisSelectorPath = true; }\n this.allExtendsStack[this.allExtendsStack.length - 1].push(extend);\n }\n }\n\n this.contexts.push(rulesetNode.selectors);\n }\n\n visitRulesetOut(rulesetNode) {\n if (!rulesetNode.root) {\n this.contexts.length = this.contexts.length - 1;\n }\n }\n\n visitMedia(mediaNode, visitArgs) {\n mediaNode.allExtends = [];\n this.allExtendsStack.push(mediaNode.allExtends);\n }\n\n visitMediaOut(mediaNode) {\n this.allExtendsStack.length = this.allExtendsStack.length - 1;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n atRuleNode.allExtends = [];\n this.allExtendsStack.push(atRuleNode.allExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n this.allExtendsStack.length = this.allExtendsStack.length - 1;\n }\n}\n\nclass ProcessExtendsVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n }\n\n run(root) {\n const extendFinder = new ExtendFinderVisitor();\n this.extendIndices = {};\n extendFinder.run(root);\n if (!extendFinder.foundExtends) { return root; }\n root.allExtends = root.allExtends.concat(this.doExtendChaining(root.allExtends, root.allExtends));\n this.allExtendsStack = [root.allExtends];\n const newRoot = this._visitor.visit(root);\n this.checkExtendsForNonMatched(root.allExtends);\n return newRoot;\n }\n\n checkExtendsForNonMatched(extendList) {\n const indices = this.extendIndices;\n extendList.filter(function(extend) {\n return !extend.hasFoundMatches && extend.parent_ids.length == 1;\n }).forEach(function(extend) {\n let selector = '_unknown_';\n try {\n selector = extend.selector.toCSS({});\n }\n catch (_) {}\n\n if (!indices[`${extend.index} ${selector}`]) {\n indices[`${extend.index} ${selector}`] = true;\n logger.warn(`extend '${selector}' has no matches`);\n }\n });\n }\n\n doExtendChaining(extendsList, extendsListTarget, iterationCount) {\n //\n // chaining is different from normal extension.. if we extend an extend then we are not just copying, altering\n // and pasting the selector we would do normally, but we are also adding an extend with the same target selector\n // this means this new extend can then go and alter other extends\n //\n // this method deals with all the chaining work - without it, extend is flat and doesn't work on other extend selectors\n // this is also the most expensive.. and a match on one selector can cause an extension of a selector we had already\n // processed if we look at each selector at a time, as is done in visitRuleset\n\n let extendIndex;\n\n let targetExtendIndex;\n let matches;\n const extendsToAdd = [];\n let newSelector;\n const extendVisitor = this;\n let selectorPath;\n let extend;\n let targetExtend;\n let newExtend;\n\n iterationCount = iterationCount || 0;\n\n // loop through comparing every extend with every target extend.\n // a target extend is the one on the ruleset we are looking at copy/edit/pasting in place\n // e.g. .a:extend(.b) {} and .b:extend(.c) {} then the first extend extends the second one\n // and the second is the target.\n // the separation into two lists allows us to process a subset of chains with a bigger set, as is the\n // case when processing media queries\n for (extendIndex = 0; extendIndex < extendsList.length; extendIndex++) {\n for (targetExtendIndex = 0; targetExtendIndex < extendsListTarget.length; targetExtendIndex++) {\n\n extend = extendsList[extendIndex];\n targetExtend = extendsListTarget[targetExtendIndex];\n\n // look for circular references\n if ( extend.parent_ids.indexOf( targetExtend.object_id ) >= 0 ) { continue; }\n\n // find a match in the target extends self selector (the bit before :extend)\n selectorPath = [targetExtend.selfSelectors[0]];\n matches = extendVisitor.findMatch(extend, selectorPath);\n\n if (matches.length) {\n extend.hasFoundMatches = true;\n\n // we found a match, so for each self selector..\n extend.selfSelectors.forEach(function(selfSelector) {\n const info = targetExtend.visibilityInfo();\n\n // process the extend as usual\n newSelector = extendVisitor.extendSelector(matches, selectorPath, selfSelector, extend.isVisible());\n\n // but now we create a new extend from it\n newExtend = new(tree.Extend)(targetExtend.selector, targetExtend.option, 0, targetExtend.fileInfo(), info);\n newExtend.selfSelectors = newSelector;\n\n // add the extend onto the list of extends for that selector\n newSelector[newSelector.length - 1].extendList = [newExtend];\n\n // record that we need to add it.\n extendsToAdd.push(newExtend);\n newExtend.ruleset = targetExtend.ruleset;\n\n // remember its parents for circular references\n newExtend.parent_ids = newExtend.parent_ids.concat(targetExtend.parent_ids, extend.parent_ids);\n\n // only process the selector once.. if we have :extend(.a,.b) then multiple\n // extends will look at the same selector path, so when extending\n // we know that any others will be duplicates in terms of what is added to the css\n if (targetExtend.firstExtendOnThisSelectorPath) {\n newExtend.firstExtendOnThisSelectorPath = true;\n targetExtend.ruleset.paths.push(newSelector);\n }\n });\n }\n }\n }\n\n if (extendsToAdd.length) {\n // try to detect circular references to stop a stack overflow.\n // may no longer be needed.\n this.extendChainCount++;\n if (iterationCount > 100) {\n let selectorOne = '{unable to calculate}';\n let selectorTwo = '{unable to calculate}';\n try {\n selectorOne = extendsToAdd[0].selfSelectors[0].toCSS();\n selectorTwo = extendsToAdd[0].selector.toCSS();\n }\n catch (e) {}\n throw { message: `extend circular reference detected. One of the circular extends is currently:${selectorOne}:extend(${selectorTwo})`};\n }\n\n // now process the new extends on the existing rules so that we can handle a extending b extending c extending\n // d extending e...\n return extendsToAdd.concat(extendVisitor.doExtendChaining(extendsToAdd, extendsListTarget, iterationCount + 1));\n } else {\n return extendsToAdd;\n }\n }\n\n visitDeclaration(ruleNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitSelector(selectorNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n let matches;\n let pathIndex;\n let extendIndex;\n const allExtends = this.allExtendsStack[this.allExtendsStack.length - 1];\n const selectorsToAdd = [];\n const extendVisitor = this;\n let selectorPath;\n\n // look at each selector path in the ruleset, find any extend matches and then copy, find and replace\n\n for (extendIndex = 0; extendIndex < allExtends.length; extendIndex++) {\n for (pathIndex = 0; pathIndex < rulesetNode.paths.length; pathIndex++) {\n selectorPath = rulesetNode.paths[pathIndex];\n\n // extending extends happens initially, before the main pass\n if (rulesetNode.extendOnEveryPath) { continue; }\n const extendList = selectorPath[selectorPath.length - 1].extendList;\n if (extendList && extendList.length) { continue; }\n\n matches = this.findMatch(allExtends[extendIndex], selectorPath);\n\n if (matches.length) {\n allExtends[extendIndex].hasFoundMatches = true;\n\n allExtends[extendIndex].selfSelectors.forEach(function(selfSelector) {\n let extendedSelectors;\n extendedSelectors = extendVisitor.extendSelector(matches, selectorPath, selfSelector, allExtends[extendIndex].isVisible());\n selectorsToAdd.push(extendedSelectors);\n });\n }\n }\n }\n rulesetNode.paths = rulesetNode.paths.concat(selectorsToAdd);\n }\n\n findMatch(extend, haystackSelectorPath) {\n //\n // look through the haystack selector path to try and find the needle - extend.selector\n // returns an array of selector matches that can then be replaced\n //\n let haystackSelectorIndex;\n\n let hackstackSelector;\n let hackstackElementIndex;\n let haystackElement;\n let targetCombinator;\n let i;\n const extendVisitor = this;\n const needleElements = extend.selector.elements;\n const potentialMatches = [];\n let potentialMatch;\n const matches = [];\n\n // loop through the haystack elements\n for (haystackSelectorIndex = 0; haystackSelectorIndex < haystackSelectorPath.length; haystackSelectorIndex++) {\n hackstackSelector = haystackSelectorPath[haystackSelectorIndex];\n\n for (hackstackElementIndex = 0; hackstackElementIndex < hackstackSelector.elements.length; hackstackElementIndex++) {\n\n haystackElement = hackstackSelector.elements[hackstackElementIndex];\n\n // if we allow elements before our match we can add a potential match every time. otherwise only at the first element.\n if (extend.allowBefore || (haystackSelectorIndex === 0 && hackstackElementIndex === 0)) {\n potentialMatches.push({pathIndex: haystackSelectorIndex, index: hackstackElementIndex, matched: 0,\n initialCombinator: haystackElement.combinator});\n }\n\n for (i = 0; i < potentialMatches.length; i++) {\n potentialMatch = potentialMatches[i];\n\n // selectors add \" \" onto the first element. When we use & it joins the selectors together, but if we don't\n // then each selector in haystackSelectorPath has a space before it added in the toCSS phase. so we need to\n // work out what the resulting combinator will be\n targetCombinator = haystackElement.combinator.value;\n if (targetCombinator === '' && hackstackElementIndex === 0) {\n targetCombinator = ' ';\n }\n\n // if we don't match, null our match to indicate failure\n if (!extendVisitor.isElementValuesEqual(needleElements[potentialMatch.matched].value, haystackElement.value) ||\n (potentialMatch.matched > 0 && needleElements[potentialMatch.matched].combinator.value !== targetCombinator)) {\n potentialMatch = null;\n } else {\n potentialMatch.matched++;\n }\n\n // if we are still valid and have finished, test whether we have elements after and whether these are allowed\n if (potentialMatch) {\n potentialMatch.finished = potentialMatch.matched === needleElements.length;\n if (potentialMatch.finished &&\n (!extend.allowAfter &&\n (hackstackElementIndex + 1 < hackstackSelector.elements.length || haystackSelectorIndex + 1 < haystackSelectorPath.length))) {\n potentialMatch = null;\n }\n }\n // if null we remove, if not, we are still valid, so either push as a valid match or continue\n if (potentialMatch) {\n if (potentialMatch.finished) {\n potentialMatch.length = needleElements.length;\n potentialMatch.endPathIndex = haystackSelectorIndex;\n potentialMatch.endPathElementIndex = hackstackElementIndex + 1; // index after end of match\n potentialMatches.length = 0; // we don't allow matches to overlap, so start matching again\n matches.push(potentialMatch);\n }\n } else {\n potentialMatches.splice(i, 1);\n i--;\n }\n }\n }\n }\n return matches;\n }\n\n isElementValuesEqual(elementValue1, elementValue2) {\n if (typeof elementValue1 === 'string' || typeof elementValue2 === 'string') {\n return elementValue1 === elementValue2;\n }\n if (elementValue1 instanceof tree.Attribute) {\n if (elementValue1.op !== elementValue2.op || elementValue1.key !== elementValue2.key) {\n return false;\n }\n if (!elementValue1.value || !elementValue2.value) {\n if (elementValue1.value || elementValue2.value) {\n return false;\n }\n return true;\n }\n elementValue1 = elementValue1.value.value || elementValue1.value;\n elementValue2 = elementValue2.value.value || elementValue2.value;\n return elementValue1 === elementValue2;\n }\n elementValue1 = elementValue1.value;\n elementValue2 = elementValue2.value;\n if (elementValue1 instanceof tree.Selector) {\n if (!(elementValue2 instanceof tree.Selector) || elementValue1.elements.length !== elementValue2.elements.length) {\n return false;\n }\n for (let i = 0; i < elementValue1.elements.length; i++) {\n if (elementValue1.elements[i].combinator.value !== elementValue2.elements[i].combinator.value) {\n if (i !== 0 || (elementValue1.elements[i].combinator.value || ' ') !== (elementValue2.elements[i].combinator.value || ' ')) {\n return false;\n }\n }\n if (!this.isElementValuesEqual(elementValue1.elements[i].value, elementValue2.elements[i].value)) {\n return false;\n }\n }\n return true;\n }\n return false;\n }\n\n extendSelector(matches, selectorPath, replacementSelector, isVisible) {\n\n // for a set of matches, replace each match with the replacement selector\n\n let currentSelectorPathIndex = 0, currentSelectorPathElementIndex = 0, path = [], matchIndex, selector, firstElement, match, newElements;\n\n for (matchIndex = 0; matchIndex < matches.length; matchIndex++) {\n match = matches[matchIndex];\n selector = selectorPath[match.pathIndex];\n firstElement = new tree.Element(\n match.initialCombinator,\n replacementSelector.elements[0].value,\n replacementSelector.elements[0].isVariable,\n replacementSelector.elements[0].getIndex(),\n replacementSelector.elements[0].fileInfo()\n );\n\n if (match.pathIndex > currentSelectorPathIndex && currentSelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n\n newElements = selector.elements\n .slice(currentSelectorPathElementIndex, match.index)\n .concat([firstElement])\n .concat(replacementSelector.elements.slice(1));\n\n if (currentSelectorPathIndex === match.pathIndex && matchIndex > 0) {\n path[path.length - 1].elements =\n path[path.length - 1].elements.concat(newElements);\n } else {\n path = path.concat(selectorPath.slice(currentSelectorPathIndex, match.pathIndex));\n\n path.push(new tree.Selector(\n newElements\n ));\n }\n currentSelectorPathIndex = match.endPathIndex;\n currentSelectorPathElementIndex = match.endPathElementIndex;\n if (currentSelectorPathElementIndex >= selectorPath[currentSelectorPathIndex].elements.length) {\n currentSelectorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n }\n\n if (currentSelectorPathIndex < selectorPath.length && currentSelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathIndex++;\n }\n\n path = path.concat(selectorPath.slice(currentSelectorPathIndex, selectorPath.length));\n path = path.map(function (currentValue) {\n // we can re-use elements here, because the visibility property matters only for selectors\n const derived = currentValue.createDerived(currentValue.elements);\n if (isVisible) {\n derived.ensureVisibility();\n } else {\n derived.ensureInvisibility();\n }\n return derived;\n });\n return path;\n }\n\n visitMedia(mediaNode, visitArgs) {\n let newAllExtends = mediaNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, mediaNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitMediaOut(mediaNode) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStack.length = lastIndex;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n let newAllExtends = atRuleNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, atRuleNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStack.length = lastIndex;\n }\n}\n\nexport default ProcessExtendsVisitor;\n","import Visitor from './visitor';\n\nclass JoinSelectorVisitor {\n constructor() {\n this.contexts = [[]];\n this._visitor = new Visitor(this);\n }\n\n run(root) {\n return this._visitor.visit(root);\n }\n\n visitDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n const paths = [];\n let selectors;\n\n this.contexts.push(paths);\n\n if (!rulesetNode.root) {\n selectors = rulesetNode.selectors;\n if (selectors) {\n selectors = selectors.filter(function(selector) { return selector.getIsOutput(); });\n rulesetNode.selectors = selectors.length ? selectors : (selectors = null);\n if (selectors) { rulesetNode.joinSelectors(paths, context, selectors); }\n }\n if (!selectors) { rulesetNode.rules = null; }\n rulesetNode.paths = paths;\n }\n }\n\n visitRulesetOut(rulesetNode) {\n this.contexts.length = this.contexts.length - 1;\n }\n\n visitMedia(mediaNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n mediaNode.rules[0].root = (context.length === 0 || context[0].multiMedia);\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n if (atRuleNode.rules && atRuleNode.rules.length) {\n atRuleNode.rules[0].root = (atRuleNode.isRooted || context.length === 0 || null);\n }\n }\n}\n\nexport default JoinSelectorVisitor;\n","import tree from '../tree';\nimport Visitor from './visitor';\n\nclass CSSVisitorUtils {\n constructor(context) {\n this._visitor = new Visitor(this);\n this._context = context;\n }\n\n containsSilentNonBlockedChild(bodyRules) {\n let rule;\n if (!bodyRules) {\n return false;\n }\n for (let r = 0; r < bodyRules.length; r++) {\n rule = bodyRules[r];\n if (rule.isSilent && rule.isSilent(this._context) && !rule.blocksVisibility()) {\n // the atrule contains something that was referenced (likely by extend)\n // therefore it needs to be shown in output too\n return true;\n }\n }\n return false;\n }\n\n keepOnlyVisibleChilds(owner) {\n if (owner && owner.rules) {\n owner.rules = owner.rules.filter(thing => thing.isVisible());\n }\n }\n\n isEmpty(owner) {\n return (owner && owner.rules) \n ? (owner.rules.length === 0) : true;\n }\n\n hasVisibleSelector(rulesetNode) {\n return (rulesetNode && rulesetNode.paths)\n ? (rulesetNode.paths.length > 0) : false;\n }\n\n resolveVisibility(node, originalRules) {\n if (!node.blocksVisibility()) {\n if (this.isEmpty(node) && !this.containsSilentNonBlockedChild(originalRules)) {\n return ;\n }\n\n return node;\n }\n\n const compiledRulesBody = node.rules[0];\n this.keepOnlyVisibleChilds(compiledRulesBody);\n\n if (this.isEmpty(compiledRulesBody)) {\n return ;\n }\n\n node.ensureVisibility();\n node.removeVisibilityBlock();\n\n return node;\n }\n\n isVisibleRuleset(rulesetNode) {\n if (rulesetNode.firstRoot) {\n return true;\n }\n\n if (this.isEmpty(rulesetNode)) {\n return false;\n }\n\n if (!rulesetNode.root && !this.hasVisibleSelector(rulesetNode)) {\n return false;\n }\n\n return true;\n }\n}\n\nconst ToCSSVisitor = function(context) {\n this._visitor = new Visitor(this);\n this._context = context;\n this.utils = new CSSVisitorUtils(context);\n};\n\nToCSSVisitor.prototype = {\n isReplacing: true,\n run: function (root) {\n return this._visitor.visit(root);\n },\n\n visitDeclaration: function (declNode, visitArgs) {\n if (declNode.blocksVisibility() || declNode.variable) {\n return;\n }\n return declNode;\n },\n\n visitMixinDefinition: function (mixinNode, visitArgs) {\n // mixin definitions do not get eval'd - this means they keep state\n // so we have to clear that state here so it isn't used if toCSS is called twice\n mixinNode.frames = [];\n },\n\n visitExtend: function (extendNode, visitArgs) {\n },\n\n visitComment: function (commentNode, visitArgs) {\n if (commentNode.blocksVisibility() || commentNode.isSilent(this._context)) {\n return;\n }\n return commentNode;\n },\n\n visitMedia: function(mediaNode, visitArgs) {\n const originalRules = mediaNode.rules[0].rules;\n mediaNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n\n return this.utils.resolveVisibility(mediaNode, originalRules);\n },\n\n visitImport: function (importNode, visitArgs) {\n if (importNode.blocksVisibility()) {\n return ;\n }\n return importNode;\n },\n\n visitAtRule: function(atRuleNode, visitArgs) {\n if (atRuleNode.rules && atRuleNode.rules.length) {\n return this.visitAtRuleWithBody(atRuleNode, visitArgs);\n } else {\n return this.visitAtRuleWithoutBody(atRuleNode, visitArgs);\n }\n },\n\n visitAnonymous: function(anonymousNode, visitArgs) {\n if (!anonymousNode.blocksVisibility()) {\n anonymousNode.accept(this._visitor);\n return anonymousNode;\n }\n },\n\n visitAtRuleWithBody: function(atRuleNode, visitArgs) {\n // if there is only one nested ruleset and that one has no path, then it is\n // just fake ruleset\n function hasFakeRuleset(atRuleNode) {\n const bodyRules = atRuleNode.rules;\n return bodyRules.length === 1 && (!bodyRules[0].paths || bodyRules[0].paths.length === 0);\n }\n function getBodyRules(atRuleNode) {\n const nodeRules = atRuleNode.rules;\n if (hasFakeRuleset(atRuleNode)) {\n return nodeRules[0].rules;\n }\n\n return nodeRules;\n }\n // it is still true that it is only one ruleset in array\n // this is last such moment\n // process childs\n const originalRules = getBodyRules(atRuleNode);\n atRuleNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n\n if (!this.utils.isEmpty(atRuleNode)) {\n this._mergeRules(atRuleNode.rules[0].rules);\n }\n\n return this.utils.resolveVisibility(atRuleNode, originalRules);\n },\n\n visitAtRuleWithoutBody: function(atRuleNode, visitArgs) {\n if (atRuleNode.blocksVisibility()) {\n return;\n }\n\n if (atRuleNode.name === '@charset') {\n // Only output the debug info together with subsequent @charset definitions\n // a comment (or @media statement) before the actual @charset atrule would\n // be considered illegal css as it has to be on the first line\n if (this.charset) {\n if (atRuleNode.debugInfo) {\n const comment = new tree.Comment(`/* ${atRuleNode.toCSS(this._context).replace(/\\n/g, '')} */\\n`);\n comment.debugInfo = atRuleNode.debugInfo;\n return this._visitor.visit(comment);\n }\n return;\n }\n this.charset = true;\n }\n\n return atRuleNode;\n },\n\n checkValidNodes: function(rules, isRoot) {\n if (!rules) {\n return;\n }\n\n for (let i = 0; i < rules.length; i++) {\n const ruleNode = rules[i];\n if (isRoot && ruleNode instanceof tree.Declaration && !ruleNode.variable) {\n throw { message: 'Properties must be inside selector blocks. They cannot be in the root',\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n if (ruleNode instanceof tree.Call) {\n throw { message: `Function '${ruleNode.name}' did not return a root node`,\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n if (ruleNode.type && !ruleNode.allowRoot) {\n throw { message: `${ruleNode.type} node returned by a function is not valid here`,\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n }\n },\n\n visitRuleset: function (rulesetNode, visitArgs) {\n // at this point rulesets are nested into each other\n let rule;\n\n const rulesets = [];\n\n this.checkValidNodes(rulesetNode.rules, rulesetNode.firstRoot);\n\n if (!rulesetNode.root) {\n // remove invisible paths\n this._compileRulesetPaths(rulesetNode);\n\n // remove rulesets from this ruleset body and compile them separately\n const nodeRules = rulesetNode.rules;\n\n let nodeRuleCnt = nodeRules ? nodeRules.length : 0;\n for (let i = 0; i < nodeRuleCnt; ) {\n rule = nodeRules[i];\n if (rule && rule.rules) {\n // visit because we are moving them out from being a child\n rulesets.push(this._visitor.visit(rule));\n nodeRules.splice(i, 1);\n nodeRuleCnt--;\n continue;\n }\n i++;\n }\n // accept the visitor to remove rules and refactor itself\n // then we can decide nogw whether we want it or not\n // compile body\n if (nodeRuleCnt > 0) {\n rulesetNode.accept(this._visitor);\n } else {\n rulesetNode.rules = null;\n }\n visitArgs.visitDeeper = false;\n } else { // if (! rulesetNode.root) {\n rulesetNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n }\n\n if (rulesetNode.rules) {\n this._mergeRules(rulesetNode.rules);\n this._removeDuplicateRules(rulesetNode.rules);\n }\n\n // now decide whether we keep the ruleset\n if (this.utils.isVisibleRuleset(rulesetNode)) {\n rulesetNode.ensureVisibility();\n rulesets.splice(0, 0, rulesetNode);\n }\n\n if (rulesets.length === 1) {\n return rulesets[0];\n }\n return rulesets;\n },\n\n _compileRulesetPaths: function(rulesetNode) {\n if (rulesetNode.paths) {\n rulesetNode.paths = rulesetNode.paths\n .filter(p => {\n let i;\n if (p[0].elements[0].combinator.value === ' ') {\n p[0].elements[0].combinator = new(tree.Combinator)('');\n }\n for (i = 0; i < p.length; i++) {\n if (p[i].isVisible() && p[i].getIsOutput()) {\n return true;\n }\n }\n return false;\n });\n }\n },\n\n _removeDuplicateRules: function(rules) {\n if (!rules) { return; }\n\n // remove duplicates\n const ruleCache = {};\n\n let ruleList;\n let rule;\n let i;\n\n for (i = rules.length - 1; i >= 0 ; i--) {\n rule = rules[i];\n if (rule instanceof tree.Declaration) {\n if (!ruleCache[rule.name]) {\n ruleCache[rule.name] = rule;\n } else {\n ruleList = ruleCache[rule.name];\n if (ruleList instanceof tree.Declaration) {\n ruleList = ruleCache[rule.name] = [ruleCache[rule.name].toCSS(this._context)];\n }\n const ruleCSS = rule.toCSS(this._context);\n if (ruleList.indexOf(ruleCSS) !== -1) {\n rules.splice(i, 1);\n } else {\n ruleList.push(ruleCSS);\n }\n }\n }\n }\n },\n\n _mergeRules: function(rules) {\n if (!rules) {\n return; \n }\n\n const groups = {};\n const groupsArr = [];\n\n for (let i = 0; i < rules.length; i++) {\n const rule = rules[i];\n if (rule.merge) {\n const key = rule.name;\n groups[key] ? rules.splice(i--, 1) : \n groupsArr.push(groups[key] = []);\n groups[key].push(rule);\n }\n }\n\n groupsArr.forEach(group => {\n if (group.length > 0) {\n const result = group[0];\n let space = [];\n const comma = [new tree.Expression(space)];\n group.forEach(rule => {\n if ((rule.merge === '+') && (space.length > 0)) {\n comma.push(new tree.Expression(space = []));\n }\n space.push(rule.value);\n result.important = result.important || rule.important;\n });\n result.value = new tree.Value(comma);\n }\n });\n }\n};\n\nexport default ToCSSVisitor;\n","import Visitor from './visitor';\nimport ImportVisitor from './import-visitor';\nimport MarkVisibleSelectorsVisitor from './set-tree-visibility-visitor';\nimport ExtendVisitor from './extend-visitor';\nimport JoinSelectorVisitor from './join-selector-visitor';\nimport ToCSSVisitor from './to-css-visitor';\n\nexport default {\n Visitor,\n ImportVisitor,\n MarkVisibleSelectorsVisitor,\n ExtendVisitor,\n JoinSelectorVisitor,\n ToCSSVisitor\n};\n","import chunker from './chunker';\n\nexport default () => {\n let // Less input string\n input;\n\n let // current chunk\n j;\n\n const // holds state for backtracking\n saveStack = [];\n\n let // furthest index the parser has gone to\n furthest;\n\n let // if this is furthest we got to, this is the probably cause\n furthestPossibleErrorMessage;\n\n let // chunkified input\n chunks;\n\n let // current chunk\n current;\n\n let // index of current chunk, in `input`\n currentPos;\n\n const parserInput = {};\n const CHARCODE_SPACE = 32;\n const CHARCODE_TAB = 9;\n const CHARCODE_LF = 10;\n const CHARCODE_CR = 13;\n const CHARCODE_PLUS = 43;\n const CHARCODE_COMMA = 44;\n const CHARCODE_FORWARD_SLASH = 47;\n const CHARCODE_9 = 57;\n\n function skipWhitespace(length) {\n const oldi = parserInput.i;\n const oldj = j;\n const curr = parserInput.i - currentPos;\n const endIndex = parserInput.i + current.length - curr;\n const mem = (parserInput.i += length);\n const inp = input;\n let c;\n let nextChar;\n let comment;\n\n for (; parserInput.i < endIndex; parserInput.i++) {\n c = inp.charCodeAt(parserInput.i);\n\n if (parserInput.autoCommentAbsorb && c === CHARCODE_FORWARD_SLASH) {\n nextChar = inp.charAt(parserInput.i + 1);\n if (nextChar === '/') {\n comment = {index: parserInput.i, isLineComment: true};\n let nextNewLine = inp.indexOf('\\n', parserInput.i + 2);\n if (nextNewLine < 0) {\n nextNewLine = endIndex;\n }\n parserInput.i = nextNewLine;\n comment.text = inp.substr(comment.index, parserInput.i - comment.index);\n parserInput.commentStore.push(comment);\n continue;\n } else if (nextChar === '*') {\n const nextStarSlash = inp.indexOf('*/', parserInput.i + 2);\n if (nextStarSlash >= 0) {\n comment = {\n index: parserInput.i,\n text: inp.substr(parserInput.i, nextStarSlash + 2 - parserInput.i),\n isLineComment: false\n };\n parserInput.i += comment.text.length - 1;\n parserInput.commentStore.push(comment);\n continue;\n }\n }\n break;\n }\n\n if ((c !== CHARCODE_SPACE) && (c !== CHARCODE_LF) && (c !== CHARCODE_TAB) && (c !== CHARCODE_CR)) {\n break;\n }\n }\n\n current = current.slice(length + parserInput.i - mem + curr);\n currentPos = parserInput.i;\n\n if (!current.length) {\n if (j < chunks.length - 1) {\n current = chunks[++j];\n skipWhitespace(0); // skip space at the beginning of a chunk\n return true; // things changed\n }\n parserInput.finished = true;\n }\n\n return oldi !== parserInput.i || oldj !== j;\n }\n\n parserInput.save = () => {\n currentPos = parserInput.i;\n saveStack.push( { current, i: parserInput.i, j });\n };\n parserInput.restore = possibleErrorMessage => {\n\n if (parserInput.i > furthest || (parserInput.i === furthest && possibleErrorMessage && !furthestPossibleErrorMessage)) {\n furthest = parserInput.i;\n furthestPossibleErrorMessage = possibleErrorMessage;\n }\n const state = saveStack.pop();\n current = state.current;\n currentPos = parserInput.i = state.i;\n j = state.j;\n };\n parserInput.forget = () => {\n saveStack.pop();\n };\n parserInput.isWhitespace = offset => {\n const pos = parserInput.i + (offset || 0);\n const code = input.charCodeAt(pos);\n return (code === CHARCODE_SPACE || code === CHARCODE_CR || code === CHARCODE_TAB || code === CHARCODE_LF);\n };\n\n // Specialization of $(tok)\n parserInput.$re = tok => {\n if (parserInput.i > currentPos) {\n current = current.slice(parserInput.i - currentPos);\n currentPos = parserInput.i;\n }\n\n const m = tok.exec(current);\n if (!m) {\n return null;\n }\n\n skipWhitespace(m[0].length);\n if (typeof m === 'string') {\n return m;\n }\n\n return m.length === 1 ? m[0] : m;\n };\n\n parserInput.$char = tok => {\n if (input.charAt(parserInput.i) !== tok) {\n return null;\n }\n skipWhitespace(1);\n return tok;\n };\n\n parserInput.$str = tok => {\n const tokLength = tok.length;\n\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tokLength; i++) {\n if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n return null;\n }\n }\n\n skipWhitespace(tokLength);\n return tok;\n };\n\n parserInput.$quoted = loc => {\n const pos = loc || parserInput.i;\n const startChar = input.charAt(pos);\n\n if (startChar !== '\\'' && startChar !== '\"') {\n return;\n }\n const length = input.length;\n const currentPosition = pos;\n\n for (let i = 1; i + currentPosition < length; i++) {\n const nextChar = input.charAt(i + currentPosition);\n switch (nextChar) {\n case '\\\\':\n i++;\n continue;\n case '\\r':\n case '\\n':\n break;\n case startChar:\n const str = input.substr(currentPosition, i + 1);\n if (!loc && loc !== 0) {\n skipWhitespace(i + 1);\n return str\n }\n return [startChar, str];\n default:\n }\n }\n return null;\n };\n\n /**\n * Permissive parsing. Ignores everything except matching {} [] () and quotes\n * until matching token (outside of blocks)\n */\n parserInput.$parseUntil = tok => {\n let quote = '';\n let returnVal = null;\n let inComment = false;\n let blockDepth = 0;\n const blockStack = [];\n const parseGroups = [];\n const length = input.length;\n const startPos = parserInput.i;\n let lastPos = parserInput.i;\n let i = parserInput.i;\n let loop = true;\n let testChar;\n\n if (typeof tok === 'string') {\n testChar = char => char === tok\n } else {\n testChar = char => tok.test(char)\n }\n\n do {\n let prevChar;\n let nextChar = input.charAt(i);\n if (blockDepth === 0 && testChar(nextChar)) {\n returnVal = input.substr(lastPos, i - lastPos);\n if (returnVal) {\n parseGroups.push(returnVal);\n }\n else {\n parseGroups.push(' ');\n }\n returnVal = parseGroups;\n skipWhitespace(i - startPos);\n loop = false\n } else {\n if (inComment) {\n if (nextChar === '*' && \n input.charAt(i + 1) === '/') {\n i++;\n blockDepth--;\n inComment = false;\n }\n i++;\n continue;\n }\n switch (nextChar) {\n case '\\\\':\n i++;\n nextChar = input.charAt(i);\n parseGroups.push(input.substr(lastPos, i - lastPos + 1));\n lastPos = i + 1;\n break;\n case '/':\n if (input.charAt(i + 1) === '*') {\n i++;\n inComment = true;\n blockDepth++;\n }\n break;\n case '\\'':\n case '\"':\n quote = parserInput.$quoted(i);\n if (quote) {\n parseGroups.push(input.substr(lastPos, i - lastPos), quote);\n i += quote[1].length - 1;\n lastPos = i + 1;\n }\n else {\n skipWhitespace(i - startPos);\n returnVal = nextChar;\n loop = false;\n }\n break;\n case '{':\n blockStack.push('}');\n blockDepth++;\n break;\n case '(':\n blockStack.push(')');\n blockDepth++;\n break;\n case '[':\n blockStack.push(']');\n blockDepth++;\n break;\n case '}':\n case ')':\n case ']':\n const expected = blockStack.pop();\n if (nextChar === expected) {\n blockDepth--;\n } else {\n // move the parser to the error and return expected\n skipWhitespace(i - startPos);\n returnVal = expected;\n loop = false;\n }\n }\n i++;\n if (i > length) {\n loop = false;\n }\n }\n prevChar = nextChar;\n } while (loop);\n\n return returnVal ? returnVal : null;\n }\n\n parserInput.autoCommentAbsorb = true;\n parserInput.commentStore = [];\n parserInput.finished = false;\n\n // Same as $(), but don't change the state of the parser,\n // just return the match.\n parserInput.peek = tok => {\n if (typeof tok === 'string') {\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tok.length; i++) {\n if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n return false;\n }\n }\n return true;\n } else {\n return tok.test(current);\n }\n };\n\n // Specialization of peek()\n // TODO remove or change some currentChar calls to peekChar\n parserInput.peekChar = tok => input.charAt(parserInput.i) === tok;\n\n parserInput.currentChar = () => input.charAt(parserInput.i);\n\n parserInput.prevChar = () => input.charAt(parserInput.i - 1);\n\n parserInput.getInput = () => input;\n\n parserInput.peekNotNumeric = () => {\n const c = input.charCodeAt(parserInput.i);\n // Is the first char of the dimension 0-9, '.', '+' or '-'\n return (c > CHARCODE_9 || c < CHARCODE_PLUS) || c === CHARCODE_FORWARD_SLASH || c === CHARCODE_COMMA;\n };\n\n parserInput.start = (str, chunkInput, failFunction) => {\n input = str;\n parserInput.i = j = currentPos = furthest = 0;\n\n // chunking apparently makes things quicker (but my tests indicate\n // it might actually make things slower in node at least)\n // and it is a non-perfect parse - it can't recognise\n // unquoted urls, meaning it can't distinguish comments\n // meaning comments with quotes or {}() in them get 'counted'\n // and then lead to parse errors.\n // In addition if the chunking chunks in the wrong place we might\n // not be able to parse a parser statement in one go\n // this is officially deprecated but can be switched on via an option\n // in the case it causes too much performance issues.\n if (chunkInput) {\n chunks = chunker(str, failFunction);\n } else {\n chunks = [str];\n }\n\n current = chunks[0];\n\n skipWhitespace(0);\n };\n\n parserInput.end = () => {\n let message;\n const isFinished = parserInput.i >= input.length;\n\n if (parserInput.i < furthest) {\n message = furthestPossibleErrorMessage;\n parserInput.i = furthest;\n }\n return {\n isFinished,\n furthest: parserInput.i,\n furthestPossibleErrorMessage: message,\n furthestReachedEnd: parserInput.i >= input.length - 1,\n furthestChar: input[parserInput.i]\n };\n };\n\n return parserInput;\n};\n","// Split the input into chunks.\nexport default function (input, fail) {\n const len = input.length;\n let level = 0;\n let parenLevel = 0;\n let lastOpening;\n let lastOpeningParen;\n let lastMultiComment;\n let lastMultiCommentEndBrace;\n const chunks = [];\n let emitFrom = 0;\n let chunkerCurrentIndex;\n let currentChunkStartIndex;\n let cc;\n let cc2;\n let matched;\n\n function emitChunk(force) {\n const len = chunkerCurrentIndex - emitFrom;\n if (((len < 512) && !force) || !len) {\n return;\n }\n chunks.push(input.slice(emitFrom, chunkerCurrentIndex + 1));\n emitFrom = chunkerCurrentIndex + 1;\n }\n\n for (chunkerCurrentIndex = 0; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc = input.charCodeAt(chunkerCurrentIndex);\n if (((cc >= 97) && (cc <= 122)) || (cc < 34)) {\n // a-z or whitespace\n continue;\n }\n\n switch (cc) {\n case 40: // (\n parenLevel++;\n lastOpeningParen = chunkerCurrentIndex;\n continue;\n case 41: // )\n if (--parenLevel < 0) {\n return fail('missing opening `(`', chunkerCurrentIndex);\n }\n continue;\n case 59: // ;\n if (!parenLevel) { emitChunk(); }\n continue;\n case 123: // {\n level++;\n lastOpening = chunkerCurrentIndex;\n continue;\n case 125: // }\n if (--level < 0) {\n return fail('missing opening `{`', chunkerCurrentIndex);\n }\n if (!level && !parenLevel) { emitChunk(); }\n continue;\n case 92: // \\\n if (chunkerCurrentIndex < len - 1) { chunkerCurrentIndex++; continue; }\n return fail('unescaped `\\\\`', chunkerCurrentIndex);\n case 34:\n case 39:\n case 96: // \", ' and `\n matched = 0;\n currentChunkStartIndex = chunkerCurrentIndex;\n for (chunkerCurrentIndex = chunkerCurrentIndex + 1; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if (cc2 > 96) { continue; }\n if (cc2 == cc) { matched = 1; break; }\n if (cc2 == 92) { // \\\n if (chunkerCurrentIndex == len - 1) {\n return fail('unescaped `\\\\`', chunkerCurrentIndex);\n }\n chunkerCurrentIndex++;\n }\n }\n if (matched) { continue; }\n return fail(`unmatched \\`${String.fromCharCode(cc)}\\``, currentChunkStartIndex);\n case 47: // /, check for comment\n if (parenLevel || (chunkerCurrentIndex == len - 1)) { continue; }\n cc2 = input.charCodeAt(chunkerCurrentIndex + 1);\n if (cc2 == 47) {\n // //, find lnfeed\n for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if ((cc2 <= 13) && ((cc2 == 10) || (cc2 == 13))) { break; }\n }\n } else if (cc2 == 42) {\n // /*, find */\n lastMultiComment = currentChunkStartIndex = chunkerCurrentIndex;\n for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len - 1; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if (cc2 == 125) { lastMultiCommentEndBrace = chunkerCurrentIndex; }\n if (cc2 != 42) { continue; }\n if (input.charCodeAt(chunkerCurrentIndex + 1) == 47) { break; }\n }\n if (chunkerCurrentIndex == len - 1) {\n return fail('missing closing `*/`', currentChunkStartIndex);\n }\n chunkerCurrentIndex++;\n }\n continue;\n case 42: // *, check for unmatched */\n if ((chunkerCurrentIndex < len - 1) && (input.charCodeAt(chunkerCurrentIndex + 1) == 47)) {\n return fail('unmatched `/*`', chunkerCurrentIndex);\n }\n continue;\n }\n }\n\n if (level !== 0) {\n if ((lastMultiComment > lastOpening) && (lastMultiCommentEndBrace > lastMultiComment)) {\n return fail('missing closing `}` or `*/`', lastOpening);\n } else {\n return fail('missing closing `}`', lastOpening);\n }\n } else if (parenLevel !== 0) {\n return fail('missing closing `)`', lastOpeningParen);\n }\n\n emitChunk(true);\n return chunks;\n};\n","import LessError from '../less-error';\nimport tree from '../tree';\nimport visitors from '../visitors';\nimport getParserInput from './parser-input';\nimport * as utils from '../utils';\nimport functionRegistry from '../functions/function-registry';\n\n//\n// less.js - parser\n//\n// A relatively straight-forward predictive parser.\n// There is no tokenization/lexing stage, the input is parsed\n// in one sweep.\n//\n// To make the parser fast enough to run in the browser, several\n// optimization had to be made:\n//\n// - Matching and slicing on a huge input is often cause of slowdowns.\n// The solution is to chunkify the input into smaller strings.\n// The chunks are stored in the `chunks` var,\n// `j` holds the current chunk index, and `currentPos` holds\n// the index of the current chunk in relation to `input`.\n// This gives us an almost 4x speed-up.\n//\n// - In many cases, we don't need to match individual tokens;\n// for example, if a value doesn't hold any variables, operations\n// or dynamic references, the parser can effectively 'skip' it,\n// treating it as a literal.\n// An example would be '1px solid #000' - which evaluates to itself,\n// we don't need to know what the individual components are.\n// The drawback, of course is that you don't get the benefits of\n// syntax-checking on the CSS. This gives us a 50% speed-up in the parser,\n// and a smaller speed-up in the code-gen.\n//\n//\n// Token matching is done with the `$` function, which either takes\n// a terminal string or regexp, or a non-terminal function to call.\n// It also takes care of moving all the indices forwards.\n//\n\nconst Parser = function Parser(context, imports, fileInfo) {\n let parsers;\n const parserInput = getParserInput();\n\n function error(msg, type) {\n throw new LessError(\n {\n index: parserInput.i,\n filename: fileInfo.filename,\n type: type || 'Syntax',\n message: msg\n },\n imports\n );\n }\n\n function expect(arg, msg) {\n // some older browsers return typeof 'function' for RegExp\n const result = (arg instanceof Function) ? arg.call(parsers) : parserInput.$re(arg);\n if (result) {\n return result;\n }\n \n error(msg || (typeof arg === 'string'\n ? `expected '${arg}' got '${parserInput.currentChar()}'`\n : 'unexpected token'));\n }\n\n // Specialization of expect()\n function expectChar(arg, msg) {\n if (parserInput.$char(arg)) {\n return arg;\n }\n error(msg || `expected '${arg}' got '${parserInput.currentChar()}'`);\n }\n\n function getDebugInfo(index) {\n const filename = fileInfo.filename;\n\n return {\n lineNumber: utils.getLocation(index, parserInput.getInput()).line + 1,\n fileName: filename\n };\n }\n\n /**\n * Used after initial parsing to create nodes on the fly\n * \n * @param {String} str - string to parse \n * @param {Array} parseList - array of parsers to run input through e.g. [\"value\", \"important\"]\n * @param {Number} currentIndex - start number to begin indexing\n * @param {Object} fileInfo - fileInfo to attach to created nodes\n */\n function parseNode(str, parseList, currentIndex, fileInfo, callback) {\n let result;\n const returnNodes = [];\n const parser = parserInput;\n\n try {\n parser.start(str, false, function fail(msg, index) {\n callback({\n message: msg,\n index: index + currentIndex\n });\n });\n for (let x = 0, p, i; (p = parseList[x]); x++) {\n i = parser.i;\n result = parsers[p]();\n if (result) {\n try {\n result._index = i + currentIndex;\n result._fileInfo = fileInfo;\n } catch (e) {}\n returnNodes.push(result);\n }\n else {\n returnNodes.push(null);\n }\n }\n\n const endInfo = parser.end();\n if (endInfo.isFinished) {\n callback(null, returnNodes);\n }\n else {\n callback(true, null);\n }\n } catch (e) {\n throw new LessError({\n index: e.index + currentIndex,\n message: e.message\n }, imports, fileInfo.filename);\n }\n }\n\n //\n // The Parser\n //\n return {\n parserInput,\n imports,\n fileInfo,\n parseNode,\n //\n // Parse an input string into an abstract syntax tree,\n // @param str A string containing 'less' markup\n // @param callback call `callback` when done.\n // @param [additionalData] An optional map which can contains vars - a map (key, value) of variables to apply\n //\n parse: function (str, callback, additionalData) {\n let root;\n let error = null;\n let globalVars;\n let modifyVars;\n let ignored;\n let preText = '';\n\n globalVars = (additionalData && additionalData.globalVars) ? `${Parser.serializeVars(additionalData.globalVars)}\\n` : '';\n modifyVars = (additionalData && additionalData.modifyVars) ? `\\n${Parser.serializeVars(additionalData.modifyVars)}` : '';\n\n if (context.pluginManager) {\n const preProcessors = context.pluginManager.getPreProcessors();\n for (let i = 0; i < preProcessors.length; i++) {\n str = preProcessors[i].process(str, { context, imports, fileInfo });\n }\n }\n\n if (globalVars || (additionalData && additionalData.banner)) {\n preText = ((additionalData && additionalData.banner) ? additionalData.banner : '') + globalVars;\n ignored = imports.contentsIgnoredChars;\n ignored[fileInfo.filename] = ignored[fileInfo.filename] || 0;\n ignored[fileInfo.filename] += preText.length;\n }\n\n str = str.replace(/\\r\\n?/g, '\\n');\n // Remove potential UTF Byte Order Mark\n str = preText + str.replace(/^\\uFEFF/, '') + modifyVars;\n imports.contents[fileInfo.filename] = str;\n\n // Start with the primary rule.\n // The whole syntax tree is held under a Ruleset node,\n // with the `root` property set to true, so no `{}` are\n // output. The callback is called when the input is parsed.\n try {\n parserInput.start(str, context.chunkInput, function fail(msg, index) {\n throw new LessError({\n index,\n type: 'Parse',\n message: msg,\n filename: fileInfo.filename\n }, imports);\n });\n\n tree.Node.prototype.parse = this;\n root = new tree.Ruleset(null, this.parsers.primary());\n tree.Node.prototype.rootNode = root;\n root.root = true;\n root.firstRoot = true;\n root.functionRegistry = functionRegistry.inherit();\n \n } catch (e) {\n return callback(new LessError(e, imports, fileInfo.filename));\n }\n\n // If `i` is smaller than the `input.length - 1`,\n // it means the parser wasn't able to parse the whole\n // string, so we've got a parsing error.\n //\n // We try to extract a \\n delimited string,\n // showing the line where the parse error occurred.\n // We split it up into two parts (the part which parsed,\n // and the part which didn't), so we can color them differently.\n const endInfo = parserInput.end();\n if (!endInfo.isFinished) {\n\n let message = endInfo.furthestPossibleErrorMessage;\n\n if (!message) {\n message = 'Unrecognised input';\n if (endInfo.furthestChar === '}') {\n message += '. Possibly missing opening \\'{\\'';\n } else if (endInfo.furthestChar === ')') {\n message += '. Possibly missing opening \\'(\\'';\n } else if (endInfo.furthestReachedEnd) {\n message += '. Possibly missing something';\n }\n }\n\n error = new LessError({\n type: 'Parse',\n message,\n index: endInfo.furthest,\n filename: fileInfo.filename\n }, imports);\n }\n\n const finish = e => {\n e = error || e || imports.error;\n\n if (e) {\n if (!(e instanceof LessError)) {\n e = new LessError(e, imports, fileInfo.filename);\n }\n\n return callback(e);\n }\n else {\n return callback(null, root);\n }\n };\n\n if (context.processImports !== false) {\n new visitors.ImportVisitor(imports, finish)\n .run(root);\n } else {\n return finish();\n }\n },\n\n //\n // Here in, the parsing rules/functions\n //\n // The basic structure of the syntax tree generated is as follows:\n //\n // Ruleset -> Declaration -> Value -> Expression -> Entity\n //\n // Here's some Less code:\n //\n // .class {\n // color: #fff;\n // border: 1px solid #000;\n // width: @w + 4px;\n // > .child {...}\n // }\n //\n // And here's what the parse tree might look like:\n //\n // Ruleset (Selector '.class', [\n // Declaration (\"color\", Value ([Expression [Color #fff]]))\n // Declaration (\"border\", Value ([Expression [Dimension 1px][Keyword \"solid\"][Color #000]]))\n // Declaration (\"width\", Value ([Expression [Operation \" + \" [Variable \"@w\"][Dimension 4px]]]))\n // Ruleset (Selector [Element '>', '.child'], [...])\n // ])\n //\n // In general, most rules will try to parse a token with the `$re()` function, and if the return\n // value is truly, will return a new node, of the relevant type. Sometimes, we need to check\n // first, before parsing, that's when we use `peek()`.\n //\n parsers: parsers = {\n //\n // The `primary` rule is the *entry* and *exit* point of the parser.\n // The rules here can appear at any level of the parse tree.\n //\n // The recursive nature of the grammar is an interplay between the `block`\n // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule,\n // as represented by this simplified grammar:\n //\n // primary → (ruleset | declaration)+\n // ruleset → selector+ block\n // block → '{' primary '}'\n //\n // Only at one point is the primary rule not called from the\n // block rule: at the root level.\n //\n primary: function () {\n const mixin = this.mixin;\n let root = [];\n let node;\n\n while (true) {\n while (true) {\n node = this.comment();\n if (!node) { break; }\n root.push(node);\n }\n // always process comments before deciding if finished\n if (parserInput.finished) {\n break;\n }\n if (parserInput.peek('}')) {\n break;\n }\n\n node = this.extendRule();\n if (node) {\n root = root.concat(node);\n continue;\n }\n\n node = mixin.definition() || this.declaration() || mixin.call(false, false) || \n this.ruleset() || this.variableCall() || this.entities.call() || this.atrule();\n if (node) {\n root.push(node);\n } else {\n let foundSemiColon = false;\n while (parserInput.$char(';')) {\n foundSemiColon = true;\n }\n if (!foundSemiColon) {\n break;\n }\n }\n }\n\n return root;\n },\n\n // comments are collected by the main parsing mechanism and then assigned to nodes\n // where the current structure allows it\n comment: function () {\n if (parserInput.commentStore.length) {\n const comment = parserInput.commentStore.shift();\n return new(tree.Comment)(comment.text, comment.isLineComment, comment.index, fileInfo);\n }\n },\n\n //\n // Entities are tokens which can be found inside an Expression\n //\n entities: {\n mixinLookup: function() {\n return parsers.mixin.call(true, true);\n },\n //\n // A string, which supports escaping \" and '\n //\n // \"milky way\" 'he\\'s the one!'\n //\n quoted: function (forceEscaped) {\n let str;\n const index = parserInput.i;\n let isEscaped = false;\n\n parserInput.save();\n if (parserInput.$char('~')) {\n isEscaped = true;\n } else if (forceEscaped) {\n parserInput.restore();\n return;\n }\n\n str = parserInput.$quoted();\n if (!str) {\n parserInput.restore();\n return;\n }\n parserInput.forget();\n\n return new(tree.Quoted)(str.charAt(0), str.substr(1, str.length - 2), isEscaped, index, fileInfo);\n },\n\n //\n // A catch-all word, such as:\n //\n // black border-collapse\n //\n keyword: function () {\n const k = parserInput.$char('%') || parserInput.$re(/^\\[?(?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+\\]?/);\n if (k) {\n return tree.Color.fromKeyword(k) || new(tree.Keyword)(k);\n }\n },\n\n //\n // A function call\n //\n // rgb(255, 0, 255)\n //\n // The arguments are parsed with the `entities.arguments` parser.\n //\n call: function () {\n let name;\n let args;\n let func;\n const index = parserInput.i;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (parserInput.peek(/^url\\(/i)) {\n return;\n }\n\n parserInput.save();\n\n name = parserInput.$re(/^([\\w-]+|%|~|progid:[\\w\\.]+)\\(/);\n if (!name) {\n parserInput.forget(); \n return;\n }\n\n name = name[1];\n func = this.customFuncCall(name);\n if (func) {\n args = func.parse();\n if (args && func.stop) {\n parserInput.forget();\n return args;\n }\n }\n\n args = this.arguments(args);\n\n if (!parserInput.$char(')')) {\n parserInput.restore('Could not parse call arguments or missing \\')\\'');\n return;\n }\n\n parserInput.forget();\n\n return new(tree.Call)(name, args, index, fileInfo);\n },\n \n //\n // Parsing rules for functions with non-standard args, e.g.:\n //\n // boolean(not(2 > 1))\n //\n // This is a quick prototype, to be modified/improved when\n // more custom-parsed funcs come (e.g. `selector(...)`)\n //\n\n customFuncCall: function (name) {\n /* Ideally the table is to be moved out of here for faster perf.,\n but it's quite tricky since it relies on all these `parsers`\n and `expect` available only here */\n return {\n alpha: f(parsers.ieAlpha, true),\n boolean: f(condition),\n 'if': f(condition)\n }[name.toLowerCase()];\n\n function f(parse, stop) {\n return {\n parse, // parsing function\n stop // when true - stop after parse() and return its result, \n // otherwise continue for plain args\n };\n }\n \n function condition() {\n return [expect(parsers.condition, 'expected condition')];\n }\n },\n\n arguments: function (prevArgs) {\n let argsComma = prevArgs || [];\n const argsSemiColon = [];\n let isSemiColonSeparated;\n let value;\n\n parserInput.save();\n\n while (true) {\n if (prevArgs) {\n prevArgs = false;\n } else {\n value = parsers.detachedRuleset() || this.assignment() || parsers.expression();\n if (!value) {\n break;\n }\n\n if (value.value && value.value.length == 1) {\n value = value.value[0];\n }\n\n argsComma.push(value);\n }\n\n if (parserInput.$char(',')) {\n continue;\n }\n\n if (parserInput.$char(';') || isSemiColonSeparated) {\n isSemiColonSeparated = true;\n value = (argsComma.length < 1) ? argsComma[0]\n : new tree.Value(argsComma);\n argsSemiColon.push(value);\n argsComma = [];\n }\n }\n\n parserInput.forget();\n return isSemiColonSeparated ? argsSemiColon : argsComma;\n },\n literal: function () {\n return this.dimension() ||\n this.color() ||\n this.quoted() ||\n this.unicodeDescriptor();\n },\n\n // Assignments are argument entities for calls.\n // They are present in ie filter properties as shown below.\n //\n // filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* )\n //\n\n assignment: function () {\n let key;\n let value;\n parserInput.save();\n key = parserInput.$re(/^\\w+(?=\\s?=)/i);\n if (!key) {\n parserInput.restore();\n return;\n }\n if (!parserInput.$char('=')) {\n parserInput.restore();\n return;\n }\n value = parsers.entity();\n if (value) {\n parserInput.forget();\n return new(tree.Assignment)(key, value);\n } else {\n parserInput.restore();\n }\n },\n\n //\n // Parse url() tokens\n //\n // We use a specific rule for urls, because they don't really behave like\n // standard function calls. The difference is that the argument doesn't have\n // to be enclosed within a string, so it can't be parsed as an Expression.\n //\n url: function () {\n let value;\n const index = parserInput.i;\n\n parserInput.autoCommentAbsorb = false;\n\n if (!parserInput.$str('url(')) {\n parserInput.autoCommentAbsorb = true;\n return;\n }\n\n value = this.quoted() || this.variable() || this.property() ||\n parserInput.$re(/^(?:(?:\\\\[\\(\\)'\"])|[^\\(\\)'\"])+/) || '';\n\n parserInput.autoCommentAbsorb = true;\n\n expectChar(')');\n\n return new(tree.URL)((value.value != null || \n value instanceof tree.Variable || \n value instanceof tree.Property) ?\n value : new(tree.Anonymous)(value, index), index, fileInfo);\n },\n\n //\n // A Variable entity, such as `@fink`, in\n //\n // width: @fink + 2px\n //\n // We use a different parser for variable definitions,\n // see `parsers.variable`.\n //\n variable: function () {\n let ch;\n let name;\n const index = parserInput.i;\n\n parserInput.save();\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^@@?[\\w-]+/))) {\n ch = parserInput.currentChar();\n if (ch === '(' || ch === '[' && !parserInput.prevChar().match(/^\\s/)) {\n // this may be a VariableCall lookup\n const result = parsers.variableCall(name);\n if (result) {\n parserInput.forget();\n return result;\n }\n }\n parserInput.forget();\n return new(tree.Variable)(name, index, fileInfo);\n }\n parserInput.restore();\n },\n\n // A variable entity using the protective {} e.g. @{var}\n variableCurly: function () {\n let curly;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '@' && (curly = parserInput.$re(/^@\\{([\\w-]+)\\}/))) {\n return new(tree.Variable)(`@${curly[1]}`, index, fileInfo);\n }\n },\n //\n // A Property accessor, such as `$color`, in\n //\n // background-color: $color\n //\n property: function () {\n let name;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' && (name = parserInput.$re(/^\\$[\\w-]+/))) {\n return new(tree.Property)(name, index, fileInfo);\n }\n },\n\n // A property entity useing the protective {} e.g. ${prop}\n propertyCurly: function () {\n let curly;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' && (curly = parserInput.$re(/^\\$\\{([\\w-]+)\\}/))) {\n return new(tree.Property)(`$${curly[1]}`, index, fileInfo);\n }\n },\n //\n // A Hexadecimal color\n //\n // #4F3C2F\n //\n // `rgb` and `hsl` colors are parsed through the `entities.call` parser.\n //\n color: function () {\n let rgb;\n parserInput.save();\n\n if (parserInput.currentChar() === '#' && (rgb = parserInput.$re(/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})([\\w.#\\[])?/))) {\n if (!rgb[2]) {\n parserInput.forget();\n return new(tree.Color)(rgb[1], undefined, rgb[0]);\n } \n }\n parserInput.restore();\n },\n\n colorKeyword: function () {\n parserInput.save();\n const autoCommentAbsorb = parserInput.autoCommentAbsorb;\n parserInput.autoCommentAbsorb = false;\n const k = parserInput.$re(/^[_A-Za-z-][_A-Za-z0-9-]+/);\n parserInput.autoCommentAbsorb = autoCommentAbsorb;\n if (!k) {\n parserInput.forget();\n return;\n }\n parserInput.restore();\n const color = tree.Color.fromKeyword(k);\n if (color) {\n parserInput.$str(k);\n return color;\n }\n },\n\n //\n // A Dimension, that is, a number and a unit\n //\n // 0.5em 95%\n //\n dimension: function () {\n if (parserInput.peekNotNumeric()) {\n return;\n }\n\n const value = parserInput.$re(/^([+-]?\\d*\\.?\\d+)(%|[a-z_]+)?/i);\n if (value) {\n return new(tree.Dimension)(value[1], value[2]);\n }\n },\n\n //\n // A unicode descriptor, as is used in unicode-range\n //\n // U+0?? or U+00A1-00A9\n //\n unicodeDescriptor: function () {\n let ud;\n\n ud = parserInput.$re(/^U\\+[0-9a-fA-F?]+(\\-[0-9a-fA-F?]+)?/);\n if (ud) {\n return new(tree.UnicodeDescriptor)(ud[0]);\n }\n },\n\n //\n // JavaScript code to be evaluated\n //\n // `window.location.href`\n //\n javascript: function () {\n let js;\n const index = parserInput.i;\n\n parserInput.save();\n\n const escape = parserInput.$char('~');\n const jsQuote = parserInput.$char('`');\n\n if (!jsQuote) {\n parserInput.restore();\n return;\n }\n\n js = parserInput.$re(/^[^`]*`/);\n if (js) {\n parserInput.forget();\n return new(tree.JavaScript)(js.substr(0, js.length - 1), Boolean(escape), index, fileInfo);\n }\n parserInput.restore('invalid javascript definition');\n }\n },\n\n //\n // The variable part of a variable definition. Used in the `rule` parser\n //\n // @fink:\n //\n variable: function () {\n let name;\n\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^(@[\\w-]+)\\s*:/))) { return name[1]; }\n },\n\n //\n // Call a variable value to retrieve a detached ruleset\n // or a value from a detached ruleset's rules.\n //\n // @fink();\n // @fink;\n // color: @fink[@color];\n //\n variableCall: function (parsedName) {\n let lookups;\n const i = parserInput.i;\n const inValue = !!parsedName;\n let name = parsedName;\n\n parserInput.save();\n\n if (name || (parserInput.currentChar() === '@'\n && (name = parserInput.$re(/^(@[\\w-]+)(\\(\\s*\\))?/)))) {\n\n lookups = this.mixin.ruleLookups();\n\n if (!lookups && ((inValue && parserInput.$str('()') !== '()') || (name[2] !== '()'))) {\n parserInput.restore('Missing \\'[...]\\' lookup in variable call');\n return;\n }\n\n if (!inValue) {\n name = name[1];\n }\n\n const call = new tree.VariableCall(name, i, fileInfo);\n if (!inValue && parsers.end()) {\n parserInput.forget();\n return call;\n }\n else {\n parserInput.forget();\n return new tree.NamespaceValue(call, lookups, i, fileInfo);\n }\n }\n\n parserInput.restore();\n },\n\n //\n // extend syntax - used to extend selectors\n //\n extend: function(isRule) {\n let elements;\n let e;\n const index = parserInput.i;\n let option;\n let extendList;\n let extend;\n\n if (!parserInput.$str(isRule ? '&:extend(' : ':extend(')) {\n return;\n }\n\n do {\n option = null;\n elements = null;\n while (!(option = parserInput.$re(/^(all)(?=\\s*(\\)|,))/))) {\n e = this.element();\n if (!e) {\n break;\n }\n if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n }\n\n option = option && option[1];\n if (!elements) {\n error('Missing target selector for :extend().');\n }\n extend = new(tree.Extend)(new(tree.Selector)(elements), option, index, fileInfo);\n if (extendList) {\n extendList.push(extend);\n } else {\n extendList = [ extend ];\n }\n } while (parserInput.$char(','));\n\n expect(/^\\)/);\n\n if (isRule) {\n expect(/^;/);\n }\n\n return extendList;\n },\n\n //\n // extendRule - used in a rule to extend all the parent selectors\n //\n extendRule: function() {\n return this.extend(true);\n },\n\n //\n // Mixins\n //\n mixin: {\n //\n // A Mixin call, with an optional argument list\n //\n // #mixins > .square(#fff);\n // #mixins.square(#fff);\n // .rounded(4px, black);\n // .button;\n //\n // We can lookup / return a value using the lookup syntax:\n //\n // color: #mixin.square(#fff)[@color];\n //\n // The `while` loop is there because mixins can be\n // namespaced, but we only support the child and descendant\n // selector for now.\n //\n call: function (inValue, getLookup) {\n const s = parserInput.currentChar();\n let important = false;\n let lookups;\n const index = parserInput.i;\n let elements;\n let args;\n let hasParens;\n\n if (s !== '.' && s !== '#') { return; }\n\n parserInput.save(); // stop us absorbing part of an invalid selector\n\n elements = this.elements();\n\n if (elements) {\n if (parserInput.$char('(')) {\n args = this.args(true).args;\n expectChar(')');\n hasParens = true;\n }\n\n if (getLookup !== false) {\n lookups = this.ruleLookups();\n }\n if (getLookup === true && !lookups) {\n parserInput.restore();\n return;\n }\n\n if (!lookups && !hasParens) {\n // This isn't a valid mixin call\n parserInput.restore('Unrecognized input. Possibly missing \\'(\\' in mixin call.');\n return;\n }\n\n if (!inValue && parsers.important()) {\n important = true;\n }\n\n if (inValue || parsers.end()) {\n parserInput.forget();\n const mixin = new(tree.mixin.Call)(elements, args, index, fileInfo, !lookups && important);\n if (lookups) {\n return new tree.NamespaceValue(mixin, lookups);\n }\n else {\n return mixin;\n }\n }\n }\n\n parserInput.restore();\n },\n /**\n * Matching elements for mixins\n * (Start with . or # and can have > )\n */\n elements: function() {\n let elements;\n let e;\n let c;\n let elem;\n let elemIndex;\n const re = /^[#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/;\n while (true) {\n elemIndex = parserInput.i;\n e = parserInput.$re(re);\n \n if (!e) {\n break;\n }\n elem = new(tree.Element)(c, e, false, elemIndex, fileInfo);\n if (elements) {\n elements.push(elem);\n } else {\n elements = [ elem ];\n }\n c = parserInput.$char('>');\n }\n return elements;\n },\n args: function (isCall) {\n const entities = parsers.entities;\n const returner = { args:null, variadic: false };\n let expressions = [];\n const argsSemiColon = [];\n const argsComma = [];\n let isSemiColonSeparated;\n let expressionContainsNamed;\n let name;\n let nameLoop;\n let value;\n let arg;\n let expand;\n let hasSep = true;\n\n parserInput.save();\n\n while (true) {\n if (isCall) {\n arg = parsers.detachedRuleset() || parsers.expression();\n } else {\n parserInput.commentStore.length = 0;\n if (parserInput.$str('...')) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ variadic: true });\n break;\n }\n arg = entities.variable() || entities.property() || entities.literal() || entities.keyword() || this.call(true);\n }\n\n if (!arg || !hasSep) {\n break;\n }\n\n nameLoop = null;\n if (arg.throwAwayComments) {\n arg.throwAwayComments();\n }\n value = arg;\n let val = null;\n\n if (isCall) {\n // Variable\n if (arg.value && arg.value.length == 1) {\n val = arg.value[0];\n }\n } else {\n val = arg;\n }\n\n if (val && (val instanceof tree.Variable || val instanceof tree.Property)) {\n if (parserInput.$char(':')) {\n if (expressions.length > 0) {\n if (isSemiColonSeparated) {\n error('Cannot mix ; and , as delimiter types');\n }\n expressionContainsNamed = true;\n }\n\n value = parsers.detachedRuleset() || parsers.expression();\n\n if (!value) {\n if (isCall) {\n error('could not understand value for named argument');\n } else {\n parserInput.restore();\n returner.args = [];\n return returner;\n }\n }\n nameLoop = (name = val.name);\n } else if (parserInput.$str('...')) {\n if (!isCall) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ name: arg.name, variadic: true });\n break;\n } else {\n expand = true;\n }\n } else if (!isCall) {\n name = nameLoop = val.name;\n value = null;\n }\n }\n\n if (value) {\n expressions.push(value);\n }\n\n argsComma.push({ name:nameLoop, value, expand });\n\n if (parserInput.$char(',')) {\n hasSep = true;\n continue;\n }\n hasSep = parserInput.$char(';') === ';';\n\n if (hasSep || isSemiColonSeparated) {\n\n if (expressionContainsNamed) {\n error('Cannot mix ; and , as delimiter types');\n }\n\n isSemiColonSeparated = true;\n\n if (expressions.length > 1) {\n value = new(tree.Value)(expressions);\n }\n argsSemiColon.push({ name, value, expand });\n\n name = null;\n expressions = [];\n expressionContainsNamed = false;\n }\n }\n\n parserInput.forget();\n returner.args = isSemiColonSeparated ? argsSemiColon : argsComma;\n return returner;\n },\n //\n // A Mixin definition, with a list of parameters\n //\n // .rounded (@radius: 2px, @color) {\n // ...\n // }\n //\n // Until we have a finer grained state-machine, we have to\n // do a look-ahead, to make sure we don't have a mixin call.\n // See the `rule` function for more information.\n //\n // We start by matching `.rounded (`, and then proceed on to\n // the argument list, which has optional default values.\n // We store the parameters in `params`, with a `value` key,\n // if there is a value, such as in the case of `@radius`.\n //\n // Once we've got our params list, and a closing `)`, we parse\n // the `{...}` block.\n //\n definition: function () {\n let name;\n let params = [];\n let match;\n let ruleset;\n let cond;\n let variadic = false;\n if ((parserInput.currentChar() !== '.' && parserInput.currentChar() !== '#') ||\n parserInput.peek(/^[^{]*\\}/)) {\n return;\n }\n\n parserInput.save();\n\n match = parserInput.$re(/^([#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\\s*\\(/);\n if (match) {\n name = match[1];\n\n const argInfo = this.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n\n // .mixincall(\"@{a}\");\n // looks a bit like a mixin definition..\n // also\n // .mixincall(@a: {rule: set;});\n // so we have to be nice and restore\n if (!parserInput.$char(')')) {\n parserInput.restore('Missing closing \\')\\'');\n return;\n }\n\n parserInput.commentStore.length = 0;\n\n if (parserInput.$str('when')) { // Guard\n cond = expect(parsers.conditions, 'expected condition');\n }\n\n ruleset = parsers.block();\n\n if (ruleset) {\n parserInput.forget();\n return new(tree.mixin.Definition)(name, params, ruleset, cond, variadic);\n } else {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n }\n },\n \n ruleLookups: function() {\n let rule;\n let args;\n const lookups = [];\n\n if (parserInput.currentChar() !== '[') { \n return;\n }\n\n while (true) {\n parserInput.save();\n args = null;\n rule = this.lookupValue();\n if (!rule && rule !== '') {\n parserInput.restore();\n break;\n }\n lookups.push(rule);\n parserInput.forget();\n }\n if (lookups.length > 0) {\n return lookups;\n }\n },\n \n lookupValue: function() {\n parserInput.save();\n \n if (!parserInput.$char('[')) { \n parserInput.restore();\n return;\n }\n \n const name = parserInput.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);\n \n if (!parserInput.$char(']')) {\n parserInput.restore();\n return;\n } \n\n if (name || name === '') {\n parserInput.forget();\n return name;\n }\n \n parserInput.restore();\n }\n },\n //\n // Entities are the smallest recognized token,\n // and can be found inside a rule's value.\n //\n entity: function () {\n const entities = this.entities;\n\n return this.comment() || entities.literal() || entities.variable() || entities.url() ||\n entities.property() || entities.call() || entities.keyword() || this.mixin.call(true) ||\n entities.javascript();\n },\n\n //\n // A Declaration terminator. Note that we use `peek()` to check for '}',\n // because the `block` rule will be expecting it, but we still need to make sure\n // it's there, if ';' was omitted.\n //\n end: function () {\n return parserInput.$char(';') || parserInput.peek('}');\n },\n\n //\n // IE's alpha function\n //\n // alpha(opacity=88)\n //\n ieAlpha: function () {\n let value;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (!parserInput.$re(/^opacity=/i)) { return; }\n value = parserInput.$re(/^\\d+/);\n if (!value) {\n value = expect(parsers.entities.variable, 'Could not parse alpha');\n value = `@{${value.name.slice(1)}}`;\n }\n expectChar(')');\n return new tree.Quoted('', `alpha(opacity=${value})`);\n },\n\n //\n // A Selector Element\n //\n // div\n // + h1\n // #socks\n // input[type=\"text\"]\n //\n // Elements are the building blocks for Selectors,\n // they are made out of a `Combinator` (see combinator rule),\n // and an element name, such as a tag a class, or `*`.\n //\n element: function () {\n let e;\n let c;\n let v;\n const index = parserInput.i;\n\n c = this.combinator();\n\n e = parserInput.$re(/^(?:\\d+\\.\\d+|\\d+)%/) ||\n parserInput.$re(/^(?:[.#]?|:*)(?:[\\w-]|[^\\x00-\\x9f]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/) ||\n parserInput.$char('*') || parserInput.$char('&') || this.attribute() ||\n parserInput.$re(/^\\([^&()@]+\\)/) || parserInput.$re(/^[\\.#:](?=@)/) ||\n this.entities.variableCurly();\n\n if (!e) {\n parserInput.save();\n if (parserInput.$char('(')) {\n if ((v = this.selector(false)) && parserInput.$char(')')) {\n e = new(tree.Paren)(v);\n parserInput.forget();\n } else {\n parserInput.restore('Missing closing \\')\\'');\n }\n } else {\n parserInput.forget();\n }\n }\n\n if (e) { return new(tree.Element)(c, e, e instanceof tree.Variable, index, fileInfo); }\n },\n\n //\n // Combinators combine elements together, in a Selector.\n //\n // Because our parser isn't white-space sensitive, special care\n // has to be taken, when parsing the descendant combinator, ` `,\n // as it's an empty space. We have to check the previous character\n // in the input, to see if it's a ` ` character. More info on how\n // we deal with this in *combinator.js*.\n //\n combinator: function () {\n let c = parserInput.currentChar();\n\n if (c === '/') {\n parserInput.save();\n const slashedCombinator = parserInput.$re(/^\\/[a-z]+\\//i);\n if (slashedCombinator) {\n parserInput.forget();\n return new(tree.Combinator)(slashedCombinator);\n }\n parserInput.restore();\n }\n\n if (c === '>' || c === '+' || c === '~' || c === '|' || c === '^') {\n parserInput.i++;\n if (c === '^' && parserInput.currentChar() === '^') {\n c = '^^';\n parserInput.i++;\n }\n while (parserInput.isWhitespace()) { parserInput.i++; }\n return new(tree.Combinator)(c);\n } else if (parserInput.isWhitespace(-1)) {\n return new(tree.Combinator)(' ');\n } else {\n return new(tree.Combinator)(null);\n }\n },\n //\n // A CSS Selector\n // with less extensions e.g. the ability to extend and guard\n //\n // .class > div + h1\n // li a:hover\n //\n // Selectors are made out of one or more Elements, see above.\n //\n selector: function (isLess) {\n const index = parserInput.i;\n let elements;\n let extendList;\n let c;\n let e;\n let allExtends;\n let when;\n let condition;\n isLess = isLess !== false;\n while ((isLess && (extendList = this.extend())) || (isLess && (when = parserInput.$str('when'))) || (e = this.element())) {\n if (when) {\n condition = expect(this.conditions, 'expected condition');\n } else if (condition) {\n error('CSS guard can only be used at the end of selector');\n } else if (extendList) {\n if (allExtends) {\n allExtends = allExtends.concat(extendList);\n } else {\n allExtends = extendList;\n }\n } else {\n if (allExtends) { error('Extend can only be used at the end of selector'); }\n c = parserInput.currentChar();\n if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n e = null;\n }\n if (c === '{' || c === '}' || c === ';' || c === ',' || c === ')') {\n break;\n }\n }\n\n if (elements) { return new(tree.Selector)(elements, allExtends, condition, index, fileInfo); }\n if (allExtends) { error('Extend must be used to extend a selector, it cannot be used on its own'); }\n },\n selectors: function () {\n let s;\n let selectors;\n while (true) {\n s = this.selector();\n if (!s) {\n break;\n }\n if (selectors) {\n selectors.push(s);\n } else {\n selectors = [ s ];\n }\n parserInput.commentStore.length = 0;\n if (s.condition && selectors.length > 1) {\n error(\"Guards are only currently allowed on a single selector.\");\n }\n if (!parserInput.$char(',')) { break; }\n if (s.condition) {\n error(\"Guards are only currently allowed on a single selector.\");\n }\n parserInput.commentStore.length = 0;\n }\n return selectors;\n },\n attribute: function () {\n if (!parserInput.$char('[')) { return; }\n\n const entities = this.entities;\n let key;\n let val;\n let op;\n\n if (!(key = entities.variableCurly())) {\n key = expect(/^(?:[_A-Za-z0-9-\\*]*\\|)?(?:[_A-Za-z0-9-]|\\\\.)+/);\n }\n\n op = parserInput.$re(/^[|~*$^]?=/);\n if (op) {\n val = entities.quoted() || parserInput.$re(/^[0-9]+%/) || parserInput.$re(/^[\\w-]+/) || entities.variableCurly();\n }\n\n expectChar(']');\n\n return new(tree.Attribute)(key, op, val);\n },\n\n //\n // The `block` rule is used by `ruleset` and `mixin.definition`.\n // It's a wrapper around the `primary` rule, with added `{}`.\n //\n block: function () {\n let content;\n if (parserInput.$char('{') && (content = this.primary()) && parserInput.$char('}')) {\n return content;\n }\n },\n\n blockRuleset: function() {\n let block = this.block();\n\n if (block) {\n block = new tree.Ruleset(null, block);\n }\n return block;\n },\n\n detachedRuleset: function() {\n let argInfo;\n let params;\n let variadic;\n\n parserInput.save();\n if (parserInput.$re(/^[.#]\\(/)) {\n /**\n * DR args currently only implemented for each() function, and not \n * yet settable as `@dr: #(@arg) {}`\n * This should be done when DRs are merged with mixins.\n * See: https://github.com/less/less-meta/issues/16\n */\n argInfo = this.mixin.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n if (!parserInput.$char(')')) {\n parserInput.restore();\n return;\n }\n }\n const blockRuleset = this.blockRuleset();\n if (blockRuleset) {\n parserInput.forget();\n if (params) {\n return new tree.mixin.Definition(null, params, blockRuleset, null, variadic);\n }\n return new tree.DetachedRuleset(blockRuleset);\n }\n parserInput.restore();\n },\n\n //\n // div, .class, body > p {...}\n //\n ruleset: function () {\n let selectors;\n let rules;\n let debugInfo;\n\n parserInput.save();\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(parserInput.i);\n }\n\n selectors = this.selectors();\n\n if (selectors && (rules = this.block())) {\n parserInput.forget();\n const ruleset = new(tree.Ruleset)(selectors, rules, context.strictImports);\n if (context.dumpLineNumbers) {\n ruleset.debugInfo = debugInfo;\n }\n return ruleset;\n } else {\n parserInput.restore();\n }\n },\n declaration: function () {\n let name;\n let value;\n const index = parserInput.i;\n let hasDR;\n const c = parserInput.currentChar();\n let important;\n let merge;\n let isVariable;\n\n if (c === '.' || c === '#' || c === '&' || c === ':') { return; }\n\n parserInput.save();\n\n name = this.variable() || this.ruleProperty();\n if (name) {\n isVariable = typeof name === 'string';\n\n if (isVariable) {\n value = this.detachedRuleset();\n if (value) {\n hasDR = true;\n }\n }\n\n parserInput.commentStore.length = 0;\n if (!value) {\n // a name returned by this.ruleProperty() is always an array of the form:\n // [string-1, ..., string-n, \"\"] or [string-1, ..., string-n, \"+\"]\n // where each item is a tree.Keyword or tree.Variable\n merge = !isVariable && name.length > 1 && name.pop().value;\n\n // Custom property values get permissive parsing\n if (name[0].value && name[0].value.slice(0, 2) === '--') {\n value = this.permissiveValue();\n }\n // Try to store values as anonymous\n // If we need the value later we'll re-parse it in ruleset.parseValue\n else {\n value = this.anonymousValue();\n }\n if (value) {\n parserInput.forget();\n // anonymous values absorb the end ';' which is required for them to work\n return new(tree.Declaration)(name, value, false, merge, index, fileInfo);\n }\n\n if (!value) {\n value = this.value();\n }\n\n if (value) {\n important = this.important();\n } else if (isVariable) {\n // As a last resort, try permissiveValue\n value = this.permissiveValue();\n }\n }\n\n if (value && (this.end() || hasDR)) {\n parserInput.forget();\n return new(tree.Declaration)(name, value, important, merge, index, fileInfo);\n }\n else {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n }\n },\n anonymousValue: function () {\n const index = parserInput.i;\n const match = parserInput.$re(/^([^.#@\\$+\\/'\"*`(;{}-]*);/);\n if (match) {\n return new(tree.Anonymous)(match[1], index);\n }\n },\n /**\n * Used for custom properties, at-rules, and variables (as fallback)\n * Parses almost anything inside of {} [] () \"\" blocks\n * until it reaches outer-most tokens.\n * \n * First, it will try to parse comments and entities to reach\n * the end. This is mostly like the Expression parser except no\n * math is allowed.\n */\n permissiveValue: function (untilTokens) {\n let i;\n let e;\n let done;\n let value;\n const tok = untilTokens || ';';\n const index = parserInput.i;\n const result = [];\n\n function testCurrentChar() {\n const char = parserInput.currentChar();\n if (typeof tok === 'string') {\n return char === tok;\n } else {\n return tok.test(char);\n }\n }\n if (testCurrentChar()) {\n return;\n }\n value = [];\n do {\n e = this.comment();\n if (e) {\n value.push(e);\n continue;\n }\n e = this.entity();\n if (e) {\n value.push(e);\n }\n } while (e);\n\n done = testCurrentChar();\n\n if (value.length > 0) {\n value = new(tree.Expression)(value);\n if (done) {\n return value;\n }\n else {\n result.push(value);\n }\n // Preserve space before $parseUntil as it will not\n if (parserInput.prevChar() === ' ') {\n result.push(new tree.Anonymous(' ', index));\n }\n }\n parserInput.save();\n\n value = parserInput.$parseUntil(tok);\n\n if (value) {\n if (typeof value === 'string') {\n error(`Expected '${value}'`, 'Parse');\n }\n if (value.length === 1 && value[0] === ' ') {\n parserInput.forget();\n return new tree.Anonymous('', index);\n }\n let item;\n for (i = 0; i < value.length; i++) {\n item = value[i];\n if (Array.isArray(item)) {\n // Treat actual quotes as normal quoted values\n result.push(new tree.Quoted(item[0], item[1], true, index, fileInfo));\n }\n else {\n if (i === value.length - 1) {\n item = item.trim();\n }\n // Treat like quoted values, but replace vars like unquoted expressions\n const quote = new tree.Quoted('\\'', item, true, index, fileInfo);\n quote.variableRegex = /@([\\w-]+)/g;\n quote.propRegex = /\\$([\\w-]+)/g;\n result.push(quote);\n }\n }\n parserInput.forget();\n return new tree.Expression(result, true);\n }\n parserInput.restore();\n },\n\n //\n // An @import atrule\n //\n // @import \"lib\";\n //\n // Depending on our environment, importing is done differently:\n // In the browser, it's an XHR request, in Node, it would be a\n // file-system operation. The function used for importing is\n // stored in `import`, which we pass to the Import constructor.\n //\n 'import': function () {\n let path;\n let features;\n const index = parserInput.i;\n\n const dir = parserInput.$re(/^@import?\\s+/);\n\n if (dir) {\n const options = (dir ? this.importOptions() : null) || {};\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n features = this.mediaFeatures();\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon or unrecognised media features on import');\n }\n features = features && new(tree.Value)(features);\n return new(tree.Import)(path, features, options, index, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed import statement');\n }\n }\n },\n\n importOptions: function() {\n let o;\n const options = {};\n let optionName;\n let value;\n\n // list of options, surrounded by parens\n if (!parserInput.$char('(')) { return null; }\n do {\n o = this.importOption();\n if (o) {\n optionName = o;\n value = true;\n switch (optionName) {\n case 'css':\n optionName = 'less';\n value = false;\n break;\n case 'once':\n optionName = 'multiple';\n value = false;\n break;\n }\n options[optionName] = value;\n if (!parserInput.$char(',')) { break; }\n }\n } while (o);\n expectChar(')');\n return options;\n },\n\n importOption: function() {\n const opt = parserInput.$re(/^(less|css|multiple|once|inline|reference|optional)/);\n if (opt) {\n return opt[1];\n }\n },\n\n mediaFeature: function () {\n const entities = this.entities;\n const nodes = [];\n let e;\n let p;\n parserInput.save();\n do {\n e = entities.keyword() || entities.variable() || entities.mixinLookup();\n if (e) {\n nodes.push(e);\n } else if (parserInput.$char('(')) {\n p = this.property();\n e = this.value();\n if (parserInput.$char(')')) {\n if (p && e) {\n nodes.push(new(tree.Paren)(new(tree.Declaration)(p, e, null, null, parserInput.i, fileInfo, true)));\n } else if (e) {\n nodes.push(new(tree.Paren)(e));\n } else {\n error('badly formed media feature definition');\n }\n } else {\n error('Missing closing \\')\\'', 'Parse');\n }\n }\n } while (e);\n\n parserInput.forget();\n if (nodes.length > 0) {\n return new(tree.Expression)(nodes);\n }\n },\n\n mediaFeatures: function () {\n const entities = this.entities;\n const features = [];\n let e;\n do {\n e = this.mediaFeature();\n if (e) {\n features.push(e);\n if (!parserInput.$char(',')) { break; }\n } else {\n e = entities.variable() || entities.mixinLookup();\n if (e) {\n features.push(e);\n if (!parserInput.$char(',')) { break; }\n }\n }\n } while (e);\n\n return features.length > 0 ? features : null;\n },\n\n media: function () {\n let features;\n let rules;\n let media;\n let debugInfo;\n const index = parserInput.i;\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(index);\n }\n\n parserInput.save();\n\n if (parserInput.$str('@media')) {\n features = this.mediaFeatures();\n\n rules = this.block();\n\n if (!rules) {\n error('media definitions require block statements after any features');\n }\n\n parserInput.forget();\n\n media = new(tree.Media)(rules, features, index, fileInfo);\n if (context.dumpLineNumbers) {\n media.debugInfo = debugInfo;\n }\n\n return media;\n }\n\n parserInput.restore();\n },\n\n //\n\n // A @plugin directive, used to import plugins dynamically.\n //\n // @plugin (args) \"lib\";\n //\n plugin: function () {\n let path;\n let args;\n let options;\n const index = parserInput.i;\n const dir = parserInput.$re(/^@plugin?\\s+/);\n\n if (dir) {\n args = this.pluginArgs();\n\n if (args) {\n options = {\n pluginArgs: args,\n isPlugin: true\n };\n }\n else {\n options = { isPlugin: true };\n }\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon on @plugin');\n }\n return new(tree.Import)(path, null, options, index, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed @plugin statement');\n }\n }\n },\n\n pluginArgs: function() {\n // list of options, surrounded by parens\n parserInput.save();\n if (!parserInput.$char('(')) {\n parserInput.restore();\n return null;\n }\n const args = parserInput.$re(/^\\s*([^\\);]+)\\)\\s*/);\n if (args[1]) {\n parserInput.forget();\n return args[1].trim();\n }\n else { \n parserInput.restore();\n return null;\n }\n },\n\n //\n // A CSS AtRule\n //\n // @charset \"utf-8\";\n //\n atrule: function () {\n const index = parserInput.i;\n let name;\n let value;\n let rules;\n let nonVendorSpecificName;\n let hasIdentifier;\n let hasExpression;\n let hasUnknown;\n let hasBlock = true;\n let isRooted = true;\n\n if (parserInput.currentChar() !== '@') { return; }\n\n value = this['import']() || this.plugin() || this.media();\n if (value) {\n return value;\n }\n\n parserInput.save();\n\n name = parserInput.$re(/^@[a-z-]+/);\n\n if (!name) { return; }\n\n nonVendorSpecificName = name;\n if (name.charAt(1) == '-' && name.indexOf('-', 2) > 0) {\n nonVendorSpecificName = `@${name.slice(name.indexOf('-', 2) + 1)}`;\n }\n\n switch (nonVendorSpecificName) {\n case '@charset':\n hasIdentifier = true;\n hasBlock = false;\n break;\n case '@namespace':\n hasExpression = true;\n hasBlock = false;\n break;\n case '@keyframes':\n case '@counter-style':\n hasIdentifier = true;\n break;\n case '@document':\n case '@supports':\n hasUnknown = true;\n isRooted = false;\n break;\n default:\n hasUnknown = true;\n break;\n }\n\n parserInput.commentStore.length = 0;\n\n if (hasIdentifier) {\n value = this.entity();\n if (!value) {\n error(`expected ${name} identifier`);\n }\n } else if (hasExpression) {\n value = this.expression();\n if (!value) {\n error(`expected ${name} expression`);\n }\n } else if (hasUnknown) {\n value = this.permissiveValue(/^[{;]/);\n hasBlock = (parserInput.currentChar() === '{');\n if (!value) {\n if (!hasBlock && parserInput.currentChar() !== ';') {\n error(`${name} rule is missing block or ending semi-colon`);\n }\n }\n else if (!value.value) {\n value = null;\n }\n }\n\n if (hasBlock) {\n rules = this.blockRuleset();\n }\n\n if (rules || (!hasBlock && value && parserInput.$char(';'))) {\n parserInput.forget();\n return new(tree.AtRule)(name, value, rules, index, fileInfo,\n context.dumpLineNumbers ? getDebugInfo(index) : null,\n isRooted\n );\n }\n\n parserInput.restore('at-rule options not recognised');\n },\n\n //\n // A Value is a comma-delimited list of Expressions\n //\n // font-family: Baskerville, Georgia, serif;\n //\n // In a Rule, a Value represents everything after the `:`,\n // and before the `;`.\n //\n value: function () {\n let e;\n const expressions = [];\n const index = parserInput.i;\n\n do {\n e = this.expression();\n if (e) {\n expressions.push(e);\n if (!parserInput.$char(',')) { break; }\n }\n } while (e);\n\n if (expressions.length > 0) {\n return new(tree.Value)(expressions, index);\n }\n },\n important: function () {\n if (parserInput.currentChar() === '!') {\n return parserInput.$re(/^! *important/);\n }\n },\n sub: function () {\n let a;\n let e;\n\n parserInput.save();\n if (parserInput.$char('(')) {\n a = this.addition();\n if (a && parserInput.$char(')')) {\n parserInput.forget();\n e = new(tree.Expression)([a]);\n e.parens = true;\n return e;\n }\n parserInput.restore('Expected \\')\\'');\n return;\n }\n parserInput.restore();\n },\n multiplication: function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.operand();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1);\n while (true) {\n if (parserInput.peek(/^\\/[*\\/]/)) {\n break;\n }\n\n parserInput.save();\n\n op = parserInput.$char('/') || parserInput.$char('*') || parserInput.$str('./');\n\n if (!op) { parserInput.forget(); break; }\n\n a = this.operand();\n\n if (!a) { parserInput.restore(); break; }\n parserInput.forget();\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n isSpaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n addition: function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.multiplication();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1);\n while (true) {\n op = parserInput.$re(/^[-+]\\s+/) || (!isSpaced && (parserInput.$char('+') || parserInput.$char('-')));\n if (!op) {\n break;\n }\n a = this.multiplication();\n if (!a) {\n break;\n }\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n isSpaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n conditions: function () {\n let a;\n let b;\n const index = parserInput.i;\n let condition;\n\n a = this.condition(true);\n if (a) {\n while (true) {\n if (!parserInput.peek(/^,\\s*(not\\s*)?\\(/) || !parserInput.$char(',')) {\n break;\n }\n b = this.condition(true);\n if (!b) {\n break;\n }\n condition = new(tree.Condition)('or', condition || a, b, index);\n }\n return condition || a;\n }\n },\n condition: function (needsParens) {\n let result;\n let logical;\n let next;\n function or() {\n return parserInput.$str('or');\n }\n\n result = this.conditionAnd(needsParens);\n if (!result) {\n return ;\n }\n logical = or();\n if (logical) {\n next = this.condition(needsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n }\n }\n return result;\n },\n conditionAnd: function (needsParens) {\n let result;\n let logical;\n let next;\n const self = this;\n function insideCondition() {\n const cond = self.negatedCondition(needsParens) || self.parenthesisCondition(needsParens);\n if (!cond && !needsParens) {\n return self.atomicCondition(needsParens);\n }\n return cond;\n }\n function and() {\n return parserInput.$str('and');\n }\n\n result = insideCondition();\n if (!result) {\n return ;\n }\n logical = and();\n if (logical) {\n next = this.conditionAnd(needsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n }\n }\n return result;\n },\n negatedCondition: function (needsParens) {\n if (parserInput.$str('not')) {\n const result = this.parenthesisCondition(needsParens);\n if (result) {\n result.negate = !result.negate;\n }\n return result;\n }\n },\n parenthesisCondition: function (needsParens) {\n function tryConditionFollowedByParenthesis(me) {\n let body;\n parserInput.save();\n body = me.condition(needsParens);\n if (!body) {\n parserInput.restore();\n return ;\n }\n if (!parserInput.$char(')')) {\n parserInput.restore();\n return ;\n }\n parserInput.forget();\n return body;\n }\n\n let body;\n parserInput.save();\n if (!parserInput.$str('(')) {\n parserInput.restore();\n return ;\n }\n body = tryConditionFollowedByParenthesis(this);\n if (body) {\n parserInput.forget();\n return body;\n }\n\n body = this.atomicCondition(needsParens);\n if (!body) {\n parserInput.restore();\n return ;\n }\n if (!parserInput.$char(')')) {\n parserInput.restore(`expected ')' got '${parserInput.currentChar()}'`);\n return ;\n }\n parserInput.forget();\n return body;\n },\n atomicCondition: function (needsParens) {\n const entities = this.entities;\n const index = parserInput.i;\n let a;\n let b;\n let c;\n let op;\n\n function cond() {\n return this.addition() || entities.keyword() || entities.quoted() || entities.mixinLookup();\n }\n cond = cond.bind(this);\n\n a = cond();\n if (a) {\n if (parserInput.$char('>')) {\n if (parserInput.$char('=')) {\n op = '>=';\n } else {\n op = '>';\n }\n } else\n if (parserInput.$char('<')) {\n if (parserInput.$char('=')) {\n op = '<=';\n } else {\n op = '<';\n }\n } else\n if (parserInput.$char('=')) {\n if (parserInput.$char('>')) {\n op = '=>';\n } else if (parserInput.$char('<')) {\n op = '=<';\n } else {\n op = '=';\n }\n }\n if (op) {\n b = cond();\n if (b) {\n c = new(tree.Condition)(op, a, b, index, false);\n } else {\n error('expected expression');\n }\n } else {\n c = new(tree.Condition)('=', a, new(tree.Keyword)('true'), index, false);\n }\n return c;\n }\n },\n\n //\n // An operand is anything that can be part of an operation,\n // such as a Color, or a Variable\n //\n operand: function () {\n const entities = this.entities;\n let negate;\n\n if (parserInput.peek(/^-[@\\$\\(]/)) {\n negate = parserInput.$char('-');\n }\n\n let o = this.sub() || entities.dimension() ||\n entities.color() || entities.variable() ||\n entities.property() || entities.call() ||\n entities.quoted(true) || entities.colorKeyword() ||\n entities.mixinLookup();\n\n if (negate) {\n o.parensInOp = true;\n o = new(tree.Negative)(o);\n }\n\n return o;\n },\n\n //\n // Expressions either represent mathematical operations,\n // or white-space delimited Entities.\n //\n // 1px solid black\n // @var * 2\n //\n expression: function () {\n const entities = [];\n let e;\n let delim;\n const index = parserInput.i;\n\n do {\n e = this.comment();\n if (e) {\n entities.push(e);\n continue;\n }\n e = this.addition() || this.entity();\n\n if (e instanceof tree.Comment) {\n e = null;\n }\n\n if (e) {\n entities.push(e);\n // operations do not allow keyword \"/\" dimension (e.g. small/20px) so we support that here\n if (!parserInput.peek(/^\\/[\\/*]/)) {\n delim = parserInput.$char('/');\n if (delim) {\n entities.push(new(tree.Anonymous)(delim, index));\n }\n }\n }\n } while (e);\n if (entities.length > 0) {\n return new(tree.Expression)(entities);\n }\n },\n property: function () {\n const name = parserInput.$re(/^(\\*?-?[_a-zA-Z0-9-]+)\\s*:/);\n if (name) {\n return name[1];\n }\n },\n ruleProperty: function () {\n let name = [];\n const index = [];\n let s;\n let k;\n\n parserInput.save();\n\n const simpleProperty = parserInput.$re(/^([_a-zA-Z0-9-]+)\\s*:/);\n if (simpleProperty) {\n name = [new(tree.Keyword)(simpleProperty[1])];\n parserInput.forget();\n return name;\n }\n\n function match(re) {\n const i = parserInput.i;\n const chunk = parserInput.$re(re);\n if (chunk) {\n index.push(i);\n return name.push(chunk[1]);\n }\n }\n\n match(/^(\\*?)/);\n while (true) {\n if (!match(/^((?:[\\w-]+)|(?:[@\\$]\\{[\\w-]+\\}))/)) {\n break;\n }\n }\n\n if ((name.length > 1) && match(/^((?:\\+_|\\+)?)\\s*:/)) {\n parserInput.forget();\n\n // at last, we have the complete match now. move forward,\n // convert name particles to tree objects and return:\n if (name[0] === '') {\n name.shift();\n index.shift();\n }\n for (k = 0; k < name.length; k++) {\n s = name[k];\n name[k] = (s.charAt(0) !== '@' && s.charAt(0) !== '$') ?\n new(tree.Keyword)(s) :\n (s.charAt(0) === '@' ?\n new(tree.Variable)(`@${s.slice(2, -1)}`, index[k], fileInfo) :\n new(tree.Property)(`$${s.slice(2, -1)}`, index[k], fileInfo));\n }\n return name;\n }\n parserInput.restore();\n }\n }\n };\n};\nParser.serializeVars = vars => {\n let s = '';\n\n for (const name in vars) {\n if (Object.hasOwnProperty.call(vars, name)) {\n const value = vars[name];\n s += `${((name[0] === '@') ? '' : '@') + name}: ${value}${(String(value).slice(-1) === ';') ? '' : ';'}`;\n }\n }\n\n return s;\n};\n\nexport default Parser;\n","import Anonymous from '../tree/anonymous';\nimport Keyword from '../tree/keyword';\n\nfunction boolean(condition) {\n return condition ? Keyword.True : Keyword.False;\n}\n\n/**\n * Functions with evalArgs set to false are sent context\n * as the first argument.\n */\nfunction If(context, condition, trueValue, falseValue) {\n return condition.eval(context) ? trueValue.eval(context)\n : (falseValue ? falseValue.eval(context) : new Anonymous);\n}\nIf.evalArgs = false\n\nexport default { boolean, 'if': If };\n","import Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport Expression from '../tree/expression';\nimport Operation from '../tree/operation';\nlet colorFunctions;\n\nfunction clamp(val) {\n return Math.min(1, Math.max(0, val));\n}\nfunction hsla(origColor, hsl) {\n const color = colorFunctions.hsla(hsl.h, hsl.s, hsl.l, hsl.a);\n if (color) {\n if (origColor.value && \n /^(rgb|hsl)/.test(origColor.value)) {\n color.value = origColor.value;\n } else {\n color.value = 'rgb';\n }\n return color;\n }\n}\nfunction toHSL(color) {\n if (color.toHSL) {\n return color.toHSL();\n } else {\n throw new Error('Argument cannot be evaluated to a color');\n }\n}\n\nfunction toHSV(color) {\n if (color.toHSV) {\n return color.toHSV();\n } else {\n throw new Error('Argument cannot be evaluated to a color');\n }\n}\n\nfunction number(n) {\n if (n instanceof Dimension) {\n return parseFloat(n.unit.is('%') ? n.value / 100 : n.value);\n } else if (typeof n === 'number') {\n return n;\n } else {\n throw {\n type: 'Argument',\n message: 'color functions take numbers as parameters'\n };\n }\n}\nfunction scaled(n, size) {\n if (n instanceof Dimension && n.unit.is('%')) {\n return parseFloat(n.value * size / 100);\n } else {\n return number(n);\n }\n}\ncolorFunctions = {\n rgb: function (r, g, b) {\n let a = 1\n /**\n * Comma-less syntax\n * e.g. rgb(0 128 255 / 50%)\n */\n if (r instanceof Expression) {\n const val = r.value\n r = val[0]\n g = val[1]\n b = val[2]\n /** \n * @todo - should this be normalized in\n * function caller? Or parsed differently?\n */\n if (b instanceof Operation) {\n const op = b\n b = op.operands[0]\n a = op.operands[1]\n }\n }\n const color = colorFunctions.rgba(r, g, b, a);\n if (color) {\n color.value = 'rgb';\n return color;\n }\n },\n rgba: function (r, g, b, a) {\n try {\n if (r instanceof Color) {\n if (g) {\n a = number(g);\n } else {\n a = r.alpha;\n }\n return new Color(r.rgb, a, 'rgba');\n }\n const rgb = [r, g, b].map(c => scaled(c, 255));\n a = number(a);\n return new Color(rgb, a, 'rgba');\n }\n catch (e) {}\n },\n hsl: function (h, s, l) {\n let a = 1\n if (h instanceof Expression) {\n const val = h.value\n h = val[0]\n s = val[1]\n l = val[2]\n\n if (l instanceof Operation) {\n const op = l\n l = op.operands[0]\n a = op.operands[1]\n }\n }\n const color = colorFunctions.hsla(h, s, l, a);\n if (color) {\n color.value = 'hsl';\n return color;\n }\n },\n hsla: function (h, s, l, a) {\n try {\n if (h instanceof Color) {\n if (s) {\n a = number(s);\n } else {\n a = h.alpha;\n }\n return new Color(h.rgb, a, 'hsla');\n }\n\n let m1;\n let m2;\n\n function hue(h) {\n h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h);\n if (h * 6 < 1) {\n return m1 + (m2 - m1) * h * 6;\n }\n else if (h * 2 < 1) {\n return m2;\n }\n else if (h * 3 < 2) {\n return m1 + (m2 - m1) * (2 / 3 - h) * 6;\n }\n else {\n return m1;\n }\n }\n\n h = (number(h) % 360) / 360;\n s = clamp(number(s));l = clamp(number(l));a = clamp(number(a));\n\n m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n m1 = l * 2 - m2;\n\n const rgb = [\n hue(h + 1 / 3) * 255,\n hue(h) * 255,\n hue(h - 1 / 3) * 255\n ];\n a = number(a);\n return new Color(rgb, a, 'hsla');\n }\n catch (e) {}\n },\n\n hsv: function(h, s, v) {\n return colorFunctions.hsva(h, s, v, 1.0);\n },\n\n hsva: function(h, s, v, a) {\n h = ((number(h) % 360) / 360) * 360;\n s = number(s);v = number(v);a = number(a);\n\n let i;\n let f;\n i = Math.floor((h / 60) % 6);\n f = (h / 60) - i;\n\n const vs = [v,\n v * (1 - s),\n v * (1 - f * s),\n v * (1 - (1 - f) * s)];\n const perm = [[0, 3, 1],\n [2, 0, 1],\n [1, 0, 3],\n [1, 2, 0],\n [3, 1, 0],\n [0, 1, 2]];\n\n return colorFunctions.rgba(vs[perm[i][0]] * 255,\n vs[perm[i][1]] * 255,\n vs[perm[i][2]] * 255,\n a);\n },\n\n hue: function (color) {\n return new Dimension(toHSL(color).h);\n },\n saturation: function (color) {\n return new Dimension(toHSL(color).s * 100, '%');\n },\n lightness: function (color) {\n return new Dimension(toHSL(color).l * 100, '%');\n },\n hsvhue: function(color) {\n return new Dimension(toHSV(color).h);\n },\n hsvsaturation: function (color) {\n return new Dimension(toHSV(color).s * 100, '%');\n },\n hsvvalue: function (color) {\n return new Dimension(toHSV(color).v * 100, '%');\n },\n red: function (color) {\n return new Dimension(color.rgb[0]);\n },\n green: function (color) {\n return new Dimension(color.rgb[1]);\n },\n blue: function (color) {\n return new Dimension(color.rgb[2]);\n },\n alpha: function (color) {\n return new Dimension(toHSL(color).a);\n },\n luma: function (color) {\n return new Dimension(color.luma() * color.alpha * 100, '%');\n },\n luminance: function (color) {\n const luminance =\n (0.2126 * color.rgb[0] / 255) +\n (0.7152 * color.rgb[1] / 255) +\n (0.0722 * color.rgb[2] / 255);\n\n return new Dimension(luminance * color.alpha * 100, '%');\n },\n saturate: function (color, amount, method) {\n // filter: saturate(3.2);\n // should be kept as is, so check for color\n if (!color.rgb) {\n return null;\n }\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.s += hsl.s * amount.value / 100;\n }\n else {\n hsl.s += amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n return hsla(color, hsl);\n },\n desaturate: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.s -= hsl.s * amount.value / 100;\n }\n else {\n hsl.s -= amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n return hsla(color, hsl);\n },\n lighten: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.l += hsl.l * amount.value / 100;\n }\n else {\n hsl.l += amount.value / 100;\n }\n hsl.l = clamp(hsl.l);\n return hsla(color, hsl);\n },\n darken: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.l -= hsl.l * amount.value / 100;\n }\n else {\n hsl.l -= amount.value / 100;\n }\n hsl.l = clamp(hsl.l);\n return hsla(color, hsl);\n },\n fadein: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.a += hsl.a * amount.value / 100;\n }\n else {\n hsl.a += amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fadeout: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.a -= hsl.a * amount.value / 100;\n }\n else {\n hsl.a -= amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fade: function (color, amount) {\n const hsl = toHSL(color);\n\n hsl.a = amount.value / 100;\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n spin: function (color, amount) {\n const hsl = toHSL(color);\n const hue = (hsl.h + amount.value) % 360;\n\n hsl.h = hue < 0 ? 360 + hue : hue;\n\n return hsla(color, hsl);\n },\n //\n // Copyright (c) 2006-2009 Hampton Catlin, Natalie Weizenbaum, and Chris Eppstein\n // http://sass-lang.com\n //\n mix: function (color1, color2, weight) {\n if (!weight) {\n weight = new Dimension(50);\n }\n const p = weight.value / 100.0;\n const w = p * 2 - 1;\n const a = toHSL(color1).a - toHSL(color2).a;\n\n const w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n const w2 = 1 - w1;\n\n const rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2,\n color1.rgb[1] * w1 + color2.rgb[1] * w2,\n color1.rgb[2] * w1 + color2.rgb[2] * w2];\n\n const alpha = color1.alpha * p + color2.alpha * (1 - p);\n\n return new Color(rgb, alpha);\n },\n greyscale: function (color) {\n return colorFunctions.desaturate(color, new Dimension(100));\n },\n contrast: function (color, dark, light, threshold) {\n // filter: contrast(3.2);\n // should be kept as is, so check for color\n if (!color.rgb) {\n return null;\n }\n if (typeof light === 'undefined') {\n light = colorFunctions.rgba(255, 255, 255, 1.0);\n }\n if (typeof dark === 'undefined') {\n dark = colorFunctions.rgba(0, 0, 0, 1.0);\n }\n // Figure out which is actually light and dark:\n if (dark.luma() > light.luma()) {\n const t = light;\n light = dark;\n dark = t;\n }\n if (typeof threshold === 'undefined') {\n threshold = 0.43;\n } else {\n threshold = number(threshold);\n }\n if (color.luma() < threshold) {\n return light;\n } else {\n return dark;\n }\n },\n // Changes made in 2.7.0 - Reverted in 3.0.0\n // contrast: function (color, color1, color2, threshold) {\n // // Return which of `color1` and `color2` has the greatest contrast with `color`\n // // according to the standard WCAG contrast ratio calculation.\n // // http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n // // The threshold param is no longer used, in line with SASS.\n // // filter: contrast(3.2);\n // // should be kept as is, so check for color\n // if (!color.rgb) {\n // return null;\n // }\n // if (typeof color1 === 'undefined') {\n // color1 = colorFunctions.rgba(0, 0, 0, 1.0);\n // }\n // if (typeof color2 === 'undefined') {\n // color2 = colorFunctions.rgba(255, 255, 255, 1.0);\n // }\n // var contrast1, contrast2;\n // var luma = color.luma();\n // var luma1 = color1.luma();\n // var luma2 = color2.luma();\n // // Calculate contrast ratios for each color\n // if (luma > luma1) {\n // contrast1 = (luma + 0.05) / (luma1 + 0.05);\n // } else {\n // contrast1 = (luma1 + 0.05) / (luma + 0.05);\n // }\n // if (luma > luma2) {\n // contrast2 = (luma + 0.05) / (luma2 + 0.05);\n // } else {\n // contrast2 = (luma2 + 0.05) / (luma + 0.05);\n // }\n // if (contrast1 > contrast2) {\n // return color1;\n // } else {\n // return color2;\n // }\n // },\n argb: function (color) {\n return new Anonymous(color.toARGB());\n },\n color: function(c) {\n if ((c instanceof Quoted) &&\n (/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})$/i.test(c.value))) {\n const val = c.value.slice(1);\n return new Color(val, undefined, `#${val}`);\n }\n if ((c instanceof Color) || (c = Color.fromKeyword(c.value))) {\n c.value = undefined;\n return c;\n }\n throw {\n type: 'Argument',\n message: 'argument must be a color keyword or 3|4|6|8 digit hex e.g. #FFF'\n };\n },\n tint: function(color, amount) {\n return colorFunctions.mix(colorFunctions.rgb(255, 255, 255), color, amount);\n },\n shade: function(color, amount) {\n return colorFunctions.mix(colorFunctions.rgb(0, 0, 0), color, amount);\n }\n};\n\nexport default colorFunctions;\n","import Color from '../tree/color';\n\n// Color Blending\n// ref: http://www.w3.org/TR/compositing-1\n\nfunction colorBlend(mode, color1, color2) {\n const ab = color1.alpha; // result\n\n let // backdrop\n cb;\n\n const as = color2.alpha;\n\n let // source\n cs;\n\n let ar;\n let cr;\n const r = [];\n\n ar = as + ab * (1 - as);\n for (let i = 0; i < 3; i++) {\n cb = color1.rgb[i] / 255;\n cs = color2.rgb[i] / 255;\n cr = mode(cb, cs);\n if (ar) {\n cr = (as * cs + ab * (cb -\n as * (cb + cs - cr))) / ar;\n }\n r[i] = cr * 255;\n }\n\n return new Color(r, ar);\n}\n\nconst colorBlendModeFunctions = {\n multiply: function(cb, cs) {\n return cb * cs;\n },\n screen: function(cb, cs) {\n return cb + cs - cb * cs;\n },\n overlay: function(cb, cs) {\n cb *= 2;\n return (cb <= 1) ?\n colorBlendModeFunctions.multiply(cb, cs) :\n colorBlendModeFunctions.screen(cb - 1, cs);\n },\n softlight: function(cb, cs) {\n let d = 1;\n let e = cb;\n if (cs > 0.5) {\n e = 1;\n d = (cb > 0.25) ? Math.sqrt(cb)\n : ((16 * cb - 12) * cb + 4) * cb;\n }\n return cb - (1 - 2 * cs) * e * (d - cb);\n },\n hardlight: function(cb, cs) {\n return colorBlendModeFunctions.overlay(cs, cb);\n },\n difference: function(cb, cs) {\n return Math.abs(cb - cs);\n },\n exclusion: function(cb, cs) {\n return cb + cs - 2 * cb * cs;\n },\n\n // non-w3c functions:\n average: function(cb, cs) {\n return (cb + cs) / 2;\n },\n negation: function(cb, cs) {\n return 1 - Math.abs(cb + cs - 1);\n }\n};\n\nfor (const f in colorBlendModeFunctions) {\n if (colorBlendModeFunctions.hasOwnProperty(f)) {\n colorBlend[f] = colorBlend.bind(null, colorBlendModeFunctions[f]);\n }\n}\n\nexport default colorBlend;\n","import Comment from '../tree/comment';\nimport Node from '../tree/node';\nimport Dimension from '../tree/dimension';\nimport Declaration from '../tree/declaration';\nimport Expression from '../tree/expression';\nimport Ruleset from '../tree/ruleset';\nimport Selector from '../tree/selector';\nimport Element from '../tree/element';\nimport Quote from '../tree/quoted';\nimport Value from '../tree/value';\n\nconst getItemsFromNode = node => {\n // handle non-array values as an array of length 1\n // return 'undefined' if index is invalid\n const items = Array.isArray(node.value) ?\n node.value : Array(node);\n\n return items;\n};\n\nexport default {\n _SELF: function(n) {\n return n;\n },\n '~': function(...expr) {\n if (expr.length === 1) {\n return expr[0];\n }\n return new Value(expr);\n },\n extract: function(values, index) {\n // (1-based index)\n index = index.value - 1;\n\n return getItemsFromNode(values)[index];\n },\n length: function(values) {\n return new Dimension(getItemsFromNode(values).length);\n },\n /**\n * Creates a Less list of incremental values.\n * Modeled after Lodash's range function, also exists natively in PHP\n * \n * @param {Dimension} [start=1]\n * @param {Dimension} end - e.g. 10 or 10px - unit is added to output\n * @param {Dimension} [step=1] \n */\n range: function(start, end, step) {\n let from;\n let to;\n let stepValue = 1;\n const list = [];\n if (end) {\n to = end;\n from = start.value;\n if (step) {\n stepValue = step.value;\n }\n }\n else {\n from = 1;\n to = start;\n }\n\n for (let i = from; i <= to.value; i += stepValue) {\n list.push(new Dimension(i, to.unit));\n }\n\n return new Expression(list);\n },\n each: function(list, rs) {\n const rules = [];\n let newRules;\n let iterator;\n\n const tryEval = val => {\n if (val instanceof Node) {\n return val.eval(this.context);\n }\n return val;\n };\n\n if (list.value && !(list instanceof Quote)) {\n if (Array.isArray(list.value)) {\n iterator = list.value.map(tryEval);\n } else {\n iterator = [tryEval(list.value)];\n }\n } else if (list.ruleset) {\n iterator = tryEval(list.ruleset).rules;\n } else if (list.rules) {\n iterator = list.rules.map(tryEval);\n } else if (Array.isArray(list)) {\n iterator = list.map(tryEval);\n } else {\n iterator = [tryEval(list)];\n }\n\n let valueName = '@value';\n let keyName = '@key';\n let indexName = '@index';\n\n if (rs.params) {\n valueName = rs.params[0] && rs.params[0].name;\n keyName = rs.params[1] && rs.params[1].name;\n indexName = rs.params[2] && rs.params[2].name;\n rs = rs.rules;\n } else {\n rs = rs.ruleset;\n }\n\n for (let i = 0; i < iterator.length; i++) {\n let key;\n let value;\n const item = iterator[i];\n if (item instanceof Declaration) {\n key = typeof item.name === 'string' ? item.name : item.name[0].value;\n value = item.value;\n } else {\n key = new Dimension(i + 1);\n value = item;\n }\n\n if (item instanceof Comment) {\n continue;\n }\n\n newRules = rs.rules.slice(0);\n if (valueName) {\n newRules.push(new Declaration(valueName,\n value,\n false, false, this.index, this.currentFileInfo));\n }\n if (indexName) {\n newRules.push(new Declaration(indexName,\n new Dimension(i + 1),\n false, false, this.index, this.currentFileInfo));\n }\n if (keyName) {\n newRules.push(new Declaration(keyName,\n key,\n false, false, this.index, this.currentFileInfo));\n }\n\n rules.push(new Ruleset([ new(Selector)([ new Element(\"\", '&') ]) ],\n newRules,\n rs.strictImports,\n rs.visibilityInfo()\n ));\n }\n\n return new Ruleset([ new(Selector)([ new Element(\"\", '&') ]) ],\n rules,\n rs.strictImports,\n rs.visibilityInfo()\n ).eval(this.context);\n }\n};\n","import Dimension from '../tree/dimension';\n\nconst MathHelper = (fn, unit, n) => {\n if (!(n instanceof Dimension)) {\n throw { type: 'Argument', message: 'argument must be a number' };\n }\n if (unit == null) {\n unit = n.unit;\n } else {\n n = n.unify();\n }\n return new Dimension(fn(parseFloat(n.value)), unit);\n};\n\nexport default MathHelper;","import mathHelper from './math-helper.js';\n\nconst mathFunctions = {\n // name, unit\n ceil: null,\n floor: null,\n sqrt: null,\n abs: null,\n tan: '',\n sin: '',\n cos: '',\n atan: 'rad',\n asin: 'rad',\n acos: 'rad'\n};\n\nfor (const f in mathFunctions) {\n if (mathFunctions.hasOwnProperty(f)) {\n mathFunctions[f] = mathHelper.bind(null, Math[f], mathFunctions[f]);\n }\n}\n\nmathFunctions.round = (n, f) => {\n const fraction = typeof f === 'undefined' ? 0 : f.value;\n return mathHelper(num => num.toFixed(fraction), null, n);\n};\n\nexport default mathFunctions;\n","import Dimension from '../tree/dimension';\nimport Anonymous from '../tree/anonymous';\nimport mathHelper from './math-helper.js';\n\nconst minMax = function (isMin, args) {\n args = Array.prototype.slice.call(args);\n switch (args.length) {\n case 0: throw { type: 'Argument', message: 'one or more arguments required' };\n }\n let i; // key is the unit.toString() for unified Dimension values,\n let j;\n let current;\n let currentUnified;\n let referenceUnified;\n let unit;\n let unitStatic;\n let unitClone;\n\n const // elems only contains original argument values.\n order = [];\n\n const values = {};\n // value is the index into the order array.\n for (i = 0; i < args.length; i++) {\n current = args[i];\n if (!(current instanceof Dimension)) {\n if (Array.isArray(args[i].value)) {\n Array.prototype.push.apply(args, Array.prototype.slice.call(args[i].value));\n }\n continue;\n }\n currentUnified = current.unit.toString() === '' && unitClone !== undefined ? new Dimension(current.value, unitClone).unify() : current.unify();\n unit = currentUnified.unit.toString() === '' && unitStatic !== undefined ? unitStatic : currentUnified.unit.toString();\n unitStatic = unit !== '' && unitStatic === undefined || unit !== '' && order[0].unify().unit.toString() === '' ? unit : unitStatic;\n unitClone = unit !== '' && unitClone === undefined ? current.unit.toString() : unitClone;\n j = values[''] !== undefined && unit !== '' && unit === unitStatic ? values[''] : values[unit];\n if (j === undefined) {\n if (unitStatic !== undefined && unit !== unitStatic) {\n throw { type: 'Argument', message: 'incompatible types' };\n }\n values[unit] = order.length;\n order.push(current);\n continue;\n }\n referenceUnified = order[j].unit.toString() === '' && unitClone !== undefined ? new Dimension(order[j].value, unitClone).unify() : order[j].unify();\n if ( isMin && currentUnified.value < referenceUnified.value ||\n !isMin && currentUnified.value > referenceUnified.value) {\n order[j] = current;\n }\n }\n if (order.length == 1) {\n return order[0];\n }\n args = order.map(function (a) { return a.toCSS(this.context); }).join(this.context.compress ? ',' : ', ');\n return new Anonymous(`${isMin ? 'min' : 'max'}(${args})`);\n};\n\nexport default {\n min: function(...args) {\n try {\n return minMax(true, args);\n } catch (e) {}\n },\n max: function(...args) {\n try {\n return minMax(false, args);\n } catch (e) {}\n },\n convert: function (val, unit) {\n return val.convertTo(unit.value);\n },\n pi: function () {\n return new Dimension(Math.PI);\n },\n mod: function(a, b) {\n return new Dimension(a.value % b.value, a.unit);\n },\n pow: function(x, y) {\n if (typeof x === 'number' && typeof y === 'number') {\n x = new Dimension(x);\n y = new Dimension(y);\n } else if (!(x instanceof Dimension) || !(y instanceof Dimension)) {\n throw { type: 'Argument', message: 'arguments must be numbers' };\n }\n\n return new Dimension(Math.pow(x.value, y.value), x.unit);\n },\n percentage: function (n) {\n const result = mathHelper(num => num * 100, '%', n);\n\n return result;\n }\n};\n","import Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport JavaScript from '../tree/javascript';\n\nexport default {\n e: function (str) {\n return new Quoted('\"', str instanceof JavaScript ? str.evaluated : str.value, true);\n },\n escape: function (str) {\n return new Anonymous(\n encodeURI(str.value).replace(/=/g, '%3D').replace(/:/g, '%3A').replace(/#/g, '%23').replace(/;/g, '%3B')\n .replace(/\\(/g, '%28').replace(/\\)/g, '%29'));\n },\n replace: function (string, pattern, replacement, flags) {\n let result = string.value;\n replacement = (replacement.type === 'Quoted') ?\n replacement.value : replacement.toCSS();\n result = result.replace(new RegExp(pattern.value, flags ? flags.value : ''), replacement);\n return new Quoted(string.quote || '', result, string.escaped);\n },\n '%': function (string /* arg, arg, ... */) {\n const args = Array.prototype.slice.call(arguments, 1);\n let result = string.value;\n\n for (let i = 0; i < args.length; i++) {\n /* jshint loopfunc:true */\n result = result.replace(/%[sda]/i, token => {\n const value = ((args[i].type === 'Quoted') &&\n token.match(/s/i)) ? args[i].value : args[i].toCSS();\n return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value;\n });\n }\n result = result.replace(/%%/g, '%');\n return new Quoted(string.quote || '', result, string.escaped);\n }\n};\n","import Keyword from '../tree/keyword';\nimport DetachedRuleset from '../tree/detached-ruleset';\nimport Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport URL from '../tree/url';\nimport Operation from '../tree/operation';\n\nconst isa = (n, Type) => (n instanceof Type) ? Keyword.True : Keyword.False;\nconst isunit = (n, unit) => {\n if (unit === undefined) {\n throw { type: 'Argument', message: 'missing the required second argument to isunit.' };\n }\n unit = typeof unit.value === 'string' ? unit.value : unit;\n if (typeof unit !== 'string') {\n throw { type: 'Argument', message: 'Second argument to isunit should be a unit or a string.' };\n }\n return (n instanceof Dimension) && n.unit.is(unit) ? Keyword.True : Keyword.False;\n};\n\nexport default {\n isruleset: function (n) {\n return isa(n, DetachedRuleset);\n },\n iscolor: function (n) {\n return isa(n, Color);\n },\n isnumber: function (n) {\n return isa(n, Dimension);\n },\n isstring: function (n) {\n return isa(n, Quoted);\n },\n iskeyword: function (n) {\n return isa(n, Keyword);\n },\n isurl: function (n) {\n return isa(n, URL);\n },\n ispixel: function (n) {\n return isunit(n, 'px');\n },\n ispercentage: function (n) {\n return isunit(n, '%');\n },\n isem: function (n) {\n return isunit(n, 'em');\n },\n isunit,\n unit: function (val, unit) {\n if (!(val instanceof Dimension)) {\n throw { type: 'Argument',\n message: `the first argument to unit must be a number${val instanceof Operation ? '. Have you forgotten parenthesis?' : ''}` };\n }\n if (unit) {\n if (unit instanceof Keyword) {\n unit = unit.value;\n } else {\n unit = unit.toCSS();\n }\n } else {\n unit = '';\n }\n return new Dimension(val.value, unit);\n },\n 'get-unit': function (n) {\n return new Anonymous(n.unit);\n }\n};\n","import functionRegistry from './function-registry';\nimport functionCaller from './function-caller';\n\nimport boolean from './boolean';\nimport defaultFunc from './default';\nimport color from './color';\nimport colorBlending from './color-blending';\nimport dataUri from './data-uri';\nimport list from './list';\nimport math from './math';\nimport number from './number';\nimport string from './string';\nimport svg from './svg';\nimport types from './types';\n\nexport default environment => {\n const functions = { functionRegistry, functionCaller };\n\n // register functions\n functionRegistry.addMultiple(boolean);\n functionRegistry.add('default', defaultFunc.eval.bind(defaultFunc));\n functionRegistry.addMultiple(color);\n functionRegistry.addMultiple(colorBlending);\n functionRegistry.addMultiple(dataUri(environment));\n functionRegistry.addMultiple(list);\n functionRegistry.addMultiple(math);\n functionRegistry.addMultiple(number);\n functionRegistry.addMultiple(string);\n functionRegistry.addMultiple(svg(environment));\n functionRegistry.addMultiple(types);\n\n return functions;\n};\n","import Quoted from '../tree/quoted';\nimport URL from '../tree/url';\nimport * as utils from '../utils';\nimport logger from '../logger';\n\nexport default environment => {\n \n const fallback = (functionThis, node) => new URL(node, functionThis.index, functionThis.currentFileInfo).eval(functionThis.context); \n\n return { 'data-uri': function(mimetypeNode, filePathNode) {\n\n if (!filePathNode) {\n filePathNode = mimetypeNode;\n mimetypeNode = null;\n }\n\n let mimetype = mimetypeNode && mimetypeNode.value;\n let filePath = filePathNode.value;\n const currentFileInfo = this.currentFileInfo;\n const currentDirectory = currentFileInfo.rewriteUrls ?\n currentFileInfo.currentDirectory : currentFileInfo.entryPath;\n\n const fragmentStart = filePath.indexOf('#');\n let fragment = '';\n if (fragmentStart !== -1) {\n fragment = filePath.slice(fragmentStart);\n filePath = filePath.slice(0, fragmentStart);\n }\n const context = utils.clone(this.context);\n context.rawBuffer = true;\n\n const fileManager = environment.getFileManager(filePath, currentDirectory, context, environment, true);\n\n if (!fileManager) {\n return fallback(this, filePathNode);\n }\n\n let useBase64 = false;\n\n // detect the mimetype if not given\n if (!mimetypeNode) {\n\n mimetype = environment.mimeLookup(filePath);\n\n if (mimetype === 'image/svg+xml') {\n useBase64 = false;\n } else {\n // use base 64 unless it's an ASCII or UTF-8 format\n const charset = environment.charsetLookup(mimetype);\n useBase64 = ['US-ASCII', 'UTF-8'].indexOf(charset) < 0;\n }\n if (useBase64) { mimetype += ';base64'; }\n }\n else {\n useBase64 = /;base64$/.test(mimetype);\n }\n\n const fileSync = fileManager.loadFileSync(filePath, currentDirectory, context, environment);\n if (!fileSync.contents) {\n logger.warn(`Skipped data-uri embedding of ${filePath} because file not found`);\n return fallback(this, filePathNode || mimetypeNode);\n }\n let buf = fileSync.contents;\n if (useBase64 && !environment.encodeBase64) {\n return fallback(this, filePathNode);\n }\n\n buf = useBase64 ? environment.encodeBase64(buf) : encodeURIComponent(buf);\n\n const uri = `data:${mimetype},${buf}${fragment}`;\n\n return new URL(new Quoted(`\"${uri}\"`, uri, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n }};\n};\n","import Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Expression from '../tree/expression';\nimport Quoted from '../tree/quoted';\nimport URL from '../tree/url';\n\nexport default environment => {\n return { 'svg-gradient': function(direction) {\n let stops;\n let gradientDirectionSvg;\n let gradientType = 'linear';\n let rectangleDimension = 'x=\"0\" y=\"0\" width=\"1\" height=\"1\"';\n const renderEnv = {compress: false};\n let returner;\n const directionValue = direction.toCSS(renderEnv);\n let i;\n let color;\n let position;\n let positionValue;\n let alpha;\n\n function throwArgumentDescriptor() {\n throw { type: 'Argument',\n message: 'svg-gradient expects direction, start_color [start_position], [color position,]...,' +\n ' end_color [end_position] or direction, color list' };\n }\n\n if (arguments.length == 2) {\n if (arguments[1].value.length < 2) {\n throwArgumentDescriptor();\n }\n stops = arguments[1].value;\n } else if (arguments.length < 3) {\n throwArgumentDescriptor();\n } else {\n stops = Array.prototype.slice.call(arguments, 1);\n }\n\n switch (directionValue) {\n case 'to bottom':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\"';\n break;\n case 'to right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'to bottom right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\"';\n break;\n case 'to top right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"100%\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'ellipse':\n case 'ellipse at center':\n gradientType = 'radial';\n gradientDirectionSvg = 'cx=\"50%\" cy=\"50%\" r=\"75%\"';\n rectangleDimension = 'x=\"-50\" y=\"-50\" width=\"101\" height=\"101\"';\n break;\n default:\n throw { type: 'Argument', message: 'svg-gradient direction must be \\'to bottom\\', \\'to right\\',' +\n ' \\'to bottom right\\', \\'to top right\\' or \\'ellipse at center\\'' };\n }\n returner = `<${gradientType}Gradient id=\"g\" ${gradientDirectionSvg}>`;\n\n for (i = 0; i < stops.length; i += 1) {\n if (stops[i] instanceof Expression) {\n color = stops[i].value[0];\n position = stops[i].value[1];\n } else {\n color = stops[i];\n position = undefined;\n }\n\n if (!(color instanceof Color) || (!((i === 0 || i + 1 === stops.length) && position === undefined) && !(position instanceof Dimension))) {\n throwArgumentDescriptor();\n }\n positionValue = position ? position.toCSS(renderEnv) : i === 0 ? '0%' : '100%';\n alpha = color.alpha;\n returner += ``;\n }\n returner += ``;\n\n returner = encodeURIComponent(returner);\n\n returner = `data:image/svg+xml,${returner}`;\n return new URL(new Quoted(`'${returner}'`, returner, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n }};\n};\n","import contexts from './contexts';\nimport visitor from './visitors';\nimport tree from './tree';\n\nexport default function(root, options) {\n options = options || {};\n let evaldRoot;\n let variables = options.variables;\n const evalEnv = new contexts.Eval(options);\n\n //\n // Allows setting variables with a hash, so:\n //\n // `{ color: new tree.Color('#f01') }` will become:\n //\n // new tree.Declaration('@color',\n // new tree.Value([\n // new tree.Expression([\n // new tree.Color('#f01')\n // ])\n // ])\n // )\n //\n if (typeof variables === 'object' && !Array.isArray(variables)) {\n variables = Object.keys(variables).map(function (k) {\n let value = variables[k];\n\n if (!(value instanceof tree.Value)) {\n if (!(value instanceof tree.Expression)) {\n value = new tree.Expression([value]);\n }\n value = new tree.Value([value]);\n }\n return new tree.Declaration(`@${k}`, value, false, null, 0);\n });\n evalEnv.frames = [new tree.Ruleset(null, variables)];\n }\n\n const visitors = [\n new visitor.JoinSelectorVisitor(),\n new visitor.MarkVisibleSelectorsVisitor(true),\n new visitor.ExtendVisitor(),\n new visitor.ToCSSVisitor({compress: Boolean(options.compress)})\n ];\n\n const preEvalVisitors = [];\n let v;\n let visitorIterator;\n\n /**\n * first() / get() allows visitors to be added while visiting\n * \n * @todo Add scoping for visitors just like functions for @plugin; right now they're global\n */\n if (options.pluginManager) {\n visitorIterator = options.pluginManager.visitor();\n for (var i = 0; i < 2; i++) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (v.isPreEvalVisitor) {\n if (i === 0 || preEvalVisitors.indexOf(v) === -1) {\n preEvalVisitors.push(v);\n v.run(root);\n }\n }\n else {\n if (i === 0 || visitors.indexOf(v) === -1) {\n if (v.isPreVisitor) {\n visitors.unshift(v);\n }\n else {\n visitors.push(v);\n }\n }\n }\n }\n }\n }\n\n evaldRoot = root.eval(evalEnv);\n\n for (var i = 0; i < visitors.length; i++) {\n visitors[i].run(evaldRoot);\n }\n\n // Run any remaining visitors added after eval pass\n if (options.pluginManager) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (visitors.indexOf(v) === -1 && preEvalVisitors.indexOf(v) === -1) {\n v.run(evaldRoot);\n }\n }\n }\n\n return evaldRoot;\n};\n","/**\n * Plugin Manager\n */\nclass PluginManager {\n constructor(less) {\n this.less = less;\n this.visitors = [];\n this.preProcessors = [];\n this.postProcessors = [];\n this.installedPlugins = [];\n this.fileManagers = [];\n this.iterator = -1;\n this.pluginCache = {};\n this.Loader = new less.PluginLoader(less);\n }\n\n /**\n * Adds all the plugins in the array\n * @param {Array} plugins\n */\n addPlugins(plugins) {\n if (plugins) {\n for (let i = 0; i < plugins.length; i++) {\n this.addPlugin(plugins[i]);\n }\n }\n }\n\n /**\n *\n * @param plugin\n * @param {String} filename\n */\n addPlugin(plugin, filename, functionRegistry) {\n this.installedPlugins.push(plugin);\n if (filename) {\n this.pluginCache[filename] = plugin;\n }\n if (plugin.install) {\n plugin.install(this.less, this, functionRegistry || this.less.functions.functionRegistry);\n }\n }\n\n /**\n *\n * @param filename\n */\n get(filename) {\n return this.pluginCache[filename];\n }\n\n /**\n * Adds a visitor. The visitor object has options on itself to determine\n * when it should run.\n * @param visitor\n */\n addVisitor(visitor) {\n this.visitors.push(visitor);\n }\n\n /**\n * Adds a pre processor object\n * @param {object} preProcessor\n * @param {number} priority - guidelines 1 = before import, 1000 = import, 2000 = after import\n */\n addPreProcessor(preProcessor, priority) {\n let indexToInsertAt;\n for (indexToInsertAt = 0; indexToInsertAt < this.preProcessors.length; indexToInsertAt++) {\n if (this.preProcessors[indexToInsertAt].priority >= priority) {\n break;\n }\n }\n this.preProcessors.splice(indexToInsertAt, 0, {preProcessor, priority});\n }\n\n /**\n * Adds a post processor object\n * @param {object} postProcessor\n * @param {number} priority - guidelines 1 = before compression, 1000 = compression, 2000 = after compression\n */\n addPostProcessor(postProcessor, priority) {\n let indexToInsertAt;\n for (indexToInsertAt = 0; indexToInsertAt < this.postProcessors.length; indexToInsertAt++) {\n if (this.postProcessors[indexToInsertAt].priority >= priority) {\n break;\n }\n }\n this.postProcessors.splice(indexToInsertAt, 0, {postProcessor, priority});\n }\n\n /**\n *\n * @param manager\n */\n addFileManager(manager) {\n this.fileManagers.push(manager);\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getPreProcessors() {\n const preProcessors = [];\n for (let i = 0; i < this.preProcessors.length; i++) {\n preProcessors.push(this.preProcessors[i].preProcessor);\n }\n return preProcessors;\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getPostProcessors() {\n const postProcessors = [];\n for (let i = 0; i < this.postProcessors.length; i++) {\n postProcessors.push(this.postProcessors[i].postProcessor);\n }\n return postProcessors;\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getVisitors() {\n return this.visitors;\n }\n\n visitor() {\n const self = this;\n return {\n first: function() {\n self.iterator = -1;\n return self.visitors[self.iterator];\n },\n get: function() {\n self.iterator += 1;\n return self.visitors[self.iterator];\n }\n };\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getFileManagers() {\n return this.fileManagers;\n }\n}\n\nlet pm;\n\nconst PluginManagerFactory = function(less, newFactory) {\n if (newFactory || !pm) {\n pm = new PluginManager(less);\n }\n return pm;\n};\n\n//\nexport default PluginManagerFactory;\n","/* global window, XMLHttpRequest */\n\nimport AbstractFileManager from '../less/environment/abstract-file-manager.js';\n\nlet options;\nlet logger;\nlet fileCache = {};\n\n// TODOS - move log somewhere. pathDiff and doing something similar in node. use pathDiff in the other browser file for the initial load\nconst FileManager = function() {}\nFileManager.prototype = Object.assign(new AbstractFileManager(), {\n alwaysMakePathsAbsolute() {\n return true;\n },\n\n join(basePath, laterPath) {\n if (!basePath) {\n return laterPath;\n }\n return this.extractUrlParts(laterPath, basePath).path;\n },\n\n doXHR(url, type, callback, errback) {\n const xhr = new XMLHttpRequest();\n const async = options.isFileProtocol ? options.fileAsync : true;\n\n if (typeof xhr.overrideMimeType === 'function') {\n xhr.overrideMimeType('text/css');\n }\n logger.debug(`XHR: Getting '${url}'`);\n xhr.open('GET', url, async);\n xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5');\n xhr.send(null);\n\n function handleResponse(xhr, callback, errback) {\n if (xhr.status >= 200 && xhr.status < 300) {\n callback(xhr.responseText,\n xhr.getResponseHeader('Last-Modified'));\n } else if (typeof errback === 'function') {\n errback(xhr.status, url);\n }\n }\n\n if (options.isFileProtocol && !options.fileAsync) {\n if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) {\n callback(xhr.responseText);\n } else {\n errback(xhr.status, url);\n }\n } else if (async) {\n xhr.onreadystatechange = () => {\n if (xhr.readyState == 4) {\n handleResponse(xhr, callback, errback);\n }\n };\n } else {\n handleResponse(xhr, callback, errback);\n }\n },\n\n supports() {\n return true;\n },\n\n clearFileCache() {\n fileCache = {};\n },\n\n loadFile(filename, currentDirectory, options, environment) {\n // TODO: Add prefix support like less-node?\n // What about multiple paths?\n\n if (currentDirectory && !this.isPathAbsolute(filename)) {\n filename = currentDirectory + filename;\n }\n\n filename = options.ext ? this.tryAppendExtension(filename, options.ext) : filename;\n\n options = options || {};\n\n // sheet may be set to the stylesheet for the initial load or a collection of properties including\n // some context variables for imports\n const hrefParts = this.extractUrlParts(filename, window.location.href);\n const href = hrefParts.url;\n const self = this;\n \n return new Promise((resolve, reject) => {\n if (options.useFileCache && fileCache[href]) {\n try {\n const lessText = fileCache[href];\n return resolve({ contents: lessText, filename: href, webInfo: { lastModified: new Date() }});\n } catch (e) {\n return reject({ filename: href, message: `Error loading file ${href} error was ${e.message}` });\n }\n }\n\n self.doXHR(href, options.mime, function doXHRCallback(data, lastModified) {\n // per file cache\n fileCache[href] = data;\n\n // Use remote copy (re-parse)\n resolve({ contents: data, filename: href, webInfo: { lastModified }});\n }, function doXHRError(status, url) {\n reject({ type: 'File', message: `'${url}' wasn't found (${status})`, href });\n });\n });\n }\n});\n\nexport default (opts, log) => {\n options = opts;\n logger = log;\n return FileManager;\n}\n","import Environment from './environment/environment';\nimport data from './data';\nimport tree from './tree';\nimport AbstractFileManager from './environment/abstract-file-manager';\nimport AbstractPluginLoader from './environment/abstract-plugin-loader';\nimport visitors from './visitors';\nimport Parser from './parser/parser';\nimport functions from './functions';\nimport contexts from './contexts';\nimport LessError from './less-error';\nimport transformTree from './transform-tree';\nimport * as utils from './utils';\nimport PluginManager from './plugin-manager';\nimport logger from './logger';\nimport SourceMapOutput from './source-map-output';\nimport SourceMapBuilder from './source-map-builder';\nimport ParseTree from './parse-tree';\nimport ImportManager from './import-manager';\nimport Parse from './parse';\nimport Render from './render';\n\nexport default function(environment, fileManagers) {\n let sourceMapOutput, sourceMapBuilder, parseTree, importManager;\n\n environment = new Environment(environment, fileManagers);\n sourceMapOutput = SourceMapOutput(environment);\n sourceMapBuilder = SourceMapBuilder(sourceMapOutput, environment);\n parseTree = ParseTree(sourceMapBuilder);\n importManager = ImportManager(environment);\n\n const render = Render(environment, parseTree, importManager);\n const parse = Parse(environment, parseTree, importManager);\n\n const initial = {\n version: [4, 0, 0],\n data,\n tree,\n Environment,\n AbstractFileManager,\n AbstractPluginLoader,\n environment,\n visitors,\n Parser,\n functions: functions(environment),\n contexts,\n SourceMapOutput: sourceMapOutput,\n SourceMapBuilder: sourceMapBuilder,\n ParseTree: parseTree,\n ImportManager: importManager,\n render,\n parse,\n LessError,\n transformTree,\n utils,\n PluginManager,\n logger\n };\n\n // Create a public API\n\n const ctor = function(t) {\n return function() {\n const obj = Object.create(t.prototype);\n t.apply(obj, Array.prototype.slice.call(arguments, 0));\n return obj;\n };\n };\n let t;\n const api = Object.create(initial);\n for (const n in initial.tree) {\n /* eslint guard-for-in: 0 */\n t = initial.tree[n];\n if (typeof t === 'function') {\n api[n.toLowerCase()] = ctor(t);\n }\n else {\n api[n] = Object.create(null);\n for (const o in t) {\n /* eslint guard-for-in: 0 */\n api[n][o.toLowerCase()] = ctor(t[o]);\n }\n }\n }\n\n /**\n * Some of the functions assume a `this` context of the API object,\n * which causes it to fail when wrapped for ES6 imports.\n * \n * An assumed `this` should be removed in the future.\n */\n initial.parse = initial.parse.bind(api);\n initial.render = initial.render.bind(api);\n\n return api;\n};\n","import LessError from './less-error';\nimport transformTree from './transform-tree';\nimport logger from './logger';\n\nexport default function(SourceMapBuilder) {\n class ParseTree {\n constructor(root, imports) {\n this.root = root;\n this.imports = imports;\n }\n\n toCSS(options) {\n let evaldRoot;\n const result = {};\n let sourceMapBuilder;\n try {\n evaldRoot = transformTree(this.root, options);\n } catch (e) {\n throw new LessError(e, this.imports);\n }\n\n try {\n const compress = Boolean(options.compress);\n if (compress) {\n logger.warn('The compress option has been deprecated. ' + \n 'We recommend you use a dedicated css minifier, for instance see less-plugin-clean-css.');\n }\n\n const toCSSOptions = {\n compress,\n dumpLineNumbers: options.dumpLineNumbers,\n strictUnits: Boolean(options.strictUnits),\n numPrecision: 8};\n\n if (options.sourceMap) {\n sourceMapBuilder = new SourceMapBuilder(options.sourceMap);\n result.css = sourceMapBuilder.toCSS(evaldRoot, toCSSOptions, this.imports);\n } else {\n result.css = evaldRoot.toCSS(toCSSOptions);\n }\n } catch (e) {\n throw new LessError(e, this.imports);\n }\n\n if (options.pluginManager) {\n const postProcessors = options.pluginManager.getPostProcessors();\n for (let i = 0; i < postProcessors.length; i++) {\n result.css = postProcessors[i].process(result.css, { sourceMap: sourceMapBuilder, options, imports: this.imports });\n }\n }\n if (options.sourceMap) {\n result.map = sourceMapBuilder.getExternalSourceMap();\n }\n\n result.imports = [];\n for (const file in this.imports.files) {\n if (this.imports.files.hasOwnProperty(file) && file !== this.imports.rootFilename) {\n result.imports.push(file);\n }\n }\n return result;\n }\n }\n\n return ParseTree;\n};\n","export default function (SourceMapOutput, environment) {\n class SourceMapBuilder {\n constructor(options) {\n this.options = options;\n }\n\n toCSS(rootNode, options, imports) {\n const sourceMapOutput = new SourceMapOutput(\n {\n contentsIgnoredCharsMap: imports.contentsIgnoredChars,\n rootNode,\n contentsMap: imports.contents,\n sourceMapFilename: this.options.sourceMapFilename,\n sourceMapURL: this.options.sourceMapURL,\n outputFilename: this.options.sourceMapOutputFilename,\n sourceMapBasepath: this.options.sourceMapBasepath,\n sourceMapRootpath: this.options.sourceMapRootpath,\n outputSourceFiles: this.options.outputSourceFiles,\n sourceMapGenerator: this.options.sourceMapGenerator,\n sourceMapFileInline: this.options.sourceMapFileInline, \n disableSourcemapAnnotation: this.options.disableSourcemapAnnotation\n });\n\n const css = sourceMapOutput.toCSS(options);\n this.sourceMap = sourceMapOutput.sourceMap;\n this.sourceMapURL = sourceMapOutput.sourceMapURL;\n if (this.options.sourceMapInputFilename) {\n this.sourceMapInputFilename = sourceMapOutput.normalizeFilename(this.options.sourceMapInputFilename);\n }\n if (this.options.sourceMapBasepath !== undefined && this.sourceMapURL !== undefined) {\n this.sourceMapURL = sourceMapOutput.removeBasepath(this.sourceMapURL);\n }\n return css + this.getCSSAppendage();\n }\n\n getCSSAppendage() {\n\n let sourceMapURL = this.sourceMapURL;\n if (this.options.sourceMapFileInline) {\n if (this.sourceMap === undefined) {\n return '';\n }\n sourceMapURL = `data:application/json;base64,${environment.encodeBase64(this.sourceMap)}`;\n }\n\n if (this.options.disableSourcemapAnnotation) {\n return '';\n }\n\n if (sourceMapURL) {\n return `/*# sourceMappingURL=${sourceMapURL} */`;\n }\n return '';\n }\n\n getExternalSourceMap() {\n return this.sourceMap;\n }\n\n setExternalSourceMap(sourceMap) {\n this.sourceMap = sourceMap;\n }\n\n isInline() {\n return this.options.sourceMapFileInline;\n }\n\n getSourceMapURL() {\n return this.sourceMapURL;\n }\n\n getOutputFilename() {\n return this.options.sourceMapOutputFilename;\n }\n\n getInputFilename() {\n return this.sourceMapInputFilename;\n }\n }\n\n return SourceMapBuilder;\n};\n","export default function (environment) {\n class SourceMapOutput {\n constructor(options) {\n this._css = [];\n this._rootNode = options.rootNode;\n this._contentsMap = options.contentsMap;\n this._contentsIgnoredCharsMap = options.contentsIgnoredCharsMap;\n if (options.sourceMapFilename) {\n this._sourceMapFilename = options.sourceMapFilename.replace(/\\\\/g, '/');\n }\n this._outputFilename = options.outputFilename;\n this.sourceMapURL = options.sourceMapURL;\n if (options.sourceMapBasepath) {\n this._sourceMapBasepath = options.sourceMapBasepath.replace(/\\\\/g, '/');\n }\n if (options.sourceMapRootpath) {\n this._sourceMapRootpath = options.sourceMapRootpath.replace(/\\\\/g, '/');\n if (this._sourceMapRootpath.charAt(this._sourceMapRootpath.length - 1) !== '/') {\n this._sourceMapRootpath += '/';\n }\n } else {\n this._sourceMapRootpath = '';\n }\n this._outputSourceFiles = options.outputSourceFiles;\n this._sourceMapGeneratorConstructor = environment.getSourceMapGenerator();\n\n this._lineNumber = 0;\n this._column = 0;\n }\n\n removeBasepath(path) {\n if (this._sourceMapBasepath && path.indexOf(this._sourceMapBasepath) === 0) {\n path = path.substring(this._sourceMapBasepath.length);\n if (path.charAt(0) === '\\\\' || path.charAt(0) === '/') {\n path = path.substring(1);\n }\n }\n\n return path;\n }\n\n normalizeFilename(filename) {\n filename = filename.replace(/\\\\/g, '/');\n filename = this.removeBasepath(filename);\n return (this._sourceMapRootpath || '') + filename;\n }\n\n add(chunk, fileInfo, index, mapLines) {\n\n // ignore adding empty strings\n if (!chunk) {\n return;\n }\n\n let lines, sourceLines, columns, sourceColumns, i;\n\n if (fileInfo && fileInfo.filename) {\n let inputSource = this._contentsMap[fileInfo.filename];\n\n // remove vars/banner added to the top of the file\n if (this._contentsIgnoredCharsMap[fileInfo.filename]) {\n // adjust the index\n index -= this._contentsIgnoredCharsMap[fileInfo.filename];\n if (index < 0) { index = 0; }\n // adjust the source\n inputSource = inputSource.slice(this._contentsIgnoredCharsMap[fileInfo.filename]);\n }\n\n // ignore empty content\n if (inputSource === undefined) {\n return;\n }\n\n inputSource = inputSource.substring(0, index);\n sourceLines = inputSource.split('\\n');\n sourceColumns = sourceLines[sourceLines.length - 1];\n }\n\n lines = chunk.split('\\n');\n columns = lines[lines.length - 1];\n\n if (fileInfo && fileInfo.filename) {\n if (!mapLines) {\n this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + 1, column: this._column},\n original: { line: sourceLines.length, column: sourceColumns.length},\n source: this.normalizeFilename(fileInfo.filename)});\n } else {\n for (i = 0; i < lines.length; i++) {\n this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + i + 1, column: i === 0 ? this._column : 0},\n original: { line: sourceLines.length + i, column: i === 0 ? sourceColumns.length : 0},\n source: this.normalizeFilename(fileInfo.filename)});\n }\n }\n }\n\n if (lines.length === 1) {\n this._column += columns.length;\n } else {\n this._lineNumber += lines.length - 1;\n this._column = columns.length;\n }\n\n this._css.push(chunk);\n }\n\n isEmpty() {\n return this._css.length === 0;\n }\n\n toCSS(context) {\n this._sourceMapGenerator = new this._sourceMapGeneratorConstructor({ file: this._outputFilename, sourceRoot: null });\n\n if (this._outputSourceFiles) {\n for (const filename in this._contentsMap) {\n if (this._contentsMap.hasOwnProperty(filename)) {\n let source = this._contentsMap[filename];\n if (this._contentsIgnoredCharsMap[filename]) {\n source = source.slice(this._contentsIgnoredCharsMap[filename]);\n }\n this._sourceMapGenerator.setSourceContent(this.normalizeFilename(filename), source);\n }\n }\n }\n\n this._rootNode.genCSS(context, this);\n\n if (this._css.length > 0) {\n let sourceMapURL;\n const sourceMapContent = JSON.stringify(this._sourceMapGenerator.toJSON());\n\n if (this.sourceMapURL) {\n sourceMapURL = this.sourceMapURL;\n } else if (this._sourceMapFilename) {\n sourceMapURL = this._sourceMapFilename;\n }\n this.sourceMapURL = sourceMapURL;\n\n this.sourceMap = sourceMapContent;\n }\n\n return this._css.join('');\n }\n }\n\n return SourceMapOutput;\n};\n","import contexts from './contexts';\nimport Parser from './parser/parser';\nimport LessError from './less-error';\nimport * as utils from './utils';\nimport logger from './logger';\n\nexport default function(environment) {\n // FileInfo = {\n // 'rewriteUrls' - option - whether to adjust URL's to be relative\n // 'filename' - full resolved filename of current file\n // 'rootpath' - path to append to normal URLs for this node\n // 'currentDirectory' - path to the current file, absolute\n // 'rootFilename' - filename of the base file\n // 'entryPath' - absolute path to the entry file\n // 'reference' - whether the file should not be output and only output parts that are referenced\n\n class ImportManager {\n constructor(less, context, rootFileInfo) {\n this.less = less;\n this.rootFilename = rootFileInfo.filename;\n this.paths = context.paths || []; // Search paths, when importing\n this.contents = {}; // map - filename to contents of all the files\n this.contentsIgnoredChars = {}; // map - filename to lines at the beginning of each file to ignore\n this.mime = context.mime;\n this.error = null;\n this.context = context;\n // Deprecated? Unused outside of here, could be useful.\n this.queue = []; // Files which haven't been imported yet\n this.files = {}; // Holds the imported parse trees.\n }\n\n /**\n * Add an import to be imported\n * @param path - the raw path\n * @param tryAppendExtension - whether to try appending a file extension (.less or .js if the path has no extension)\n * @param currentFileInfo - the current file info (used for instance to work out relative paths)\n * @param importOptions - import options\n * @param callback - callback for when it is imported\n */\n push(path, tryAppendExtension, currentFileInfo, importOptions, callback) {\n const importManager = this, pluginLoader = this.context.pluginManager.Loader;\n\n this.queue.push(path);\n\n const fileParsedFunc = function (e, root, fullPath) {\n importManager.queue.splice(importManager.queue.indexOf(path), 1); // Remove the path from the queue\n\n const importedEqualsRoot = fullPath === importManager.rootFilename;\n if (importOptions.optional && e) {\n callback(null, {rules:[]}, false, null);\n logger.info(`The file ${fullPath} was skipped because it was not found and the import was marked optional.`);\n }\n else {\n // Inline imports aren't cached here.\n // If we start to cache them, please make sure they won't conflict with non-inline imports of the\n // same name as they used to do before this comment and the condition below have been added.\n if (!importManager.files[fullPath] && !importOptions.inline) {\n importManager.files[fullPath] = { root, options: importOptions };\n }\n if (e && !importManager.error) { importManager.error = e; }\n callback(e, root, importedEqualsRoot, fullPath);\n }\n };\n\n const newFileInfo = {\n rewriteUrls: this.context.rewriteUrls,\n entryPath: currentFileInfo.entryPath,\n rootpath: currentFileInfo.rootpath,\n rootFilename: currentFileInfo.rootFilename\n };\n\n const fileManager = environment.getFileManager(path, currentFileInfo.currentDirectory, this.context, environment);\n\n if (!fileManager) {\n fileParsedFunc({ message: `Could not find a file-manager for ${path}` });\n return;\n }\n\n const loadFileCallback = function(loadedFile) {\n let plugin;\n const resolvedFilename = loadedFile.filename;\n const contents = loadedFile.contents.replace(/^\\uFEFF/, '');\n\n // Pass on an updated rootpath if path of imported file is relative and file\n // is in a (sub|sup) directory\n //\n // Examples:\n // - If path of imported file is 'module/nav/nav.less' and rootpath is 'less/',\n // then rootpath should become 'less/module/nav/'\n // - If path of imported file is '../mixins.less' and rootpath is 'less/',\n // then rootpath should become 'less/../'\n newFileInfo.currentDirectory = fileManager.getPath(resolvedFilename);\n if (newFileInfo.rewriteUrls) {\n newFileInfo.rootpath = fileManager.join(\n (importManager.context.rootpath || ''),\n fileManager.pathDiff(newFileInfo.currentDirectory, newFileInfo.entryPath));\n\n if (!fileManager.isPathAbsolute(newFileInfo.rootpath) && fileManager.alwaysMakePathsAbsolute()) {\n newFileInfo.rootpath = fileManager.join(newFileInfo.entryPath, newFileInfo.rootpath);\n }\n }\n newFileInfo.filename = resolvedFilename;\n\n const newEnv = new contexts.Parse(importManager.context);\n\n newEnv.processImports = false;\n importManager.contents[resolvedFilename] = contents;\n\n if (currentFileInfo.reference || importOptions.reference) {\n newFileInfo.reference = true;\n }\n\n if (importOptions.isPlugin) {\n plugin = pluginLoader.evalPlugin(contents, newEnv, importManager, importOptions.pluginArgs, newFileInfo);\n if (plugin instanceof LessError) {\n fileParsedFunc(plugin, null, resolvedFilename);\n }\n else {\n fileParsedFunc(null, plugin, resolvedFilename);\n }\n } else if (importOptions.inline) {\n fileParsedFunc(null, contents, resolvedFilename);\n } else {\n\n // import (multiple) parse trees apparently get altered and can't be cached.\n // TODO: investigate why this is\n if (importManager.files[resolvedFilename]\n && !importManager.files[resolvedFilename].options.multiple\n && !importOptions.multiple) {\n\n fileParsedFunc(null, importManager.files[resolvedFilename].root, resolvedFilename);\n }\n else {\n new Parser(newEnv, importManager, newFileInfo).parse(contents, function (e, root) {\n fileParsedFunc(e, root, resolvedFilename);\n });\n }\n }\n };\n let loadedFile;\n let promise;\n const context = utils.clone(this.context);\n\n if (tryAppendExtension) {\n context.ext = importOptions.isPlugin ? '.js' : '.less';\n }\n\n if (importOptions.isPlugin) {\n context.mime = 'application/javascript';\n\n if (context.syncImport) {\n loadedFile = pluginLoader.loadPluginSync(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n } else {\n promise = pluginLoader.loadPlugin(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n }\n }\n else {\n if (context.syncImport) {\n loadedFile = fileManager.loadFileSync(path, currentFileInfo.currentDirectory, context, environment);\n } else {\n promise = fileManager.loadFile(path, currentFileInfo.currentDirectory, context, environment,\n (err, loadedFile) => {\n if (err) {\n fileParsedFunc(err);\n } else {\n loadFileCallback(loadedFile);\n }\n });\n }\n }\n if (loadedFile) {\n if (!loadedFile.filename) {\n fileParsedFunc(loadedFile);\n } else {\n loadFileCallback(loadedFile);\n }\n } else if (promise) {\n promise.then(loadFileCallback, fileParsedFunc);\n }\n }\n }\n\n return ImportManager;\n};\n","import * as utils from './utils';\n\nexport default function(environment, ParseTree, ImportManager) {\n const render = function (input, options, callback) {\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(this.options, {});\n }\n else {\n options = utils.copyOptions(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n return new Promise(function (resolve, reject) {\n render.call(self, input, options, function(err, output) {\n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n this.parse(input, options, function(err, root, imports, options) {\n if (err) { return callback(err); }\n\n let result;\n try {\n const parseTree = new ParseTree(root, imports);\n result = parseTree.toCSS(options);\n }\n catch (err) { return callback(err); }\n\n callback(null, result);\n });\n }\n };\n\n return render;\n};\n","import contexts from './contexts';\nimport Parser from './parser/parser';\nimport PluginManager from './plugin-manager';\nimport LessError from './less-error';\nimport * as utils from './utils';\n\nexport default function(environment, ParseTree, ImportManager) {\n const parse = function (input, options, callback) {\n\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(this.options, {});\n }\n else {\n options = utils.copyOptions(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n return new Promise(function (resolve, reject) {\n parse.call(self, input, options, function(err, output) {\n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n let context;\n let rootFileInfo;\n const pluginManager = new PluginManager(this, !options.reUsePluginManager);\n\n options.pluginManager = pluginManager;\n\n context = new contexts.Parse(options);\n\n if (options.rootFileInfo) {\n rootFileInfo = options.rootFileInfo;\n } else {\n const filename = options.filename || 'input';\n const entryPath = filename.replace(/[^\\/\\\\]*$/, '');\n rootFileInfo = {\n filename,\n rewriteUrls: context.rewriteUrls,\n rootpath: context.rootpath || '',\n currentDirectory: entryPath,\n entryPath,\n rootFilename: filename\n };\n // add in a missing trailing slash\n if (rootFileInfo.rootpath && rootFileInfo.rootpath.slice(-1) !== '/') {\n rootFileInfo.rootpath += '/';\n }\n }\n\n const imports = new ImportManager(this, context, rootFileInfo);\n this.importManager = imports;\n\n // TODO: allow the plugins to be just a list of paths or names\n // Do an async plugin queue like lessc\n\n if (options.plugins) {\n options.plugins.forEach(function(plugin) {\n let evalResult, contents;\n if (plugin.fileContent) {\n contents = plugin.fileContent.replace(/^\\uFEFF/, '');\n evalResult = pluginManager.Loader.evalPlugin(contents, context, imports, plugin.options, plugin.filename);\n if (evalResult instanceof LessError) {\n return callback(evalResult);\n }\n }\n else {\n pluginManager.addPlugin(plugin);\n }\n });\n }\n\n new Parser(context, imports, rootFileInfo)\n .parse(input, function (e, root) {\n if (e) { return callback(e); }\n callback(null, root, imports, options);\n }, options);\n }\n };\n return parse;\n};\n","// TODO: Add tests for browser @plugin\n/* global window */\n\nimport AbstractPluginLoader from '../less/environment/abstract-plugin-loader.js';\n\n/**\n * Browser Plugin Loader\n */\nconst PluginLoader = function(less) {\n this.less = less;\n // Should we shim this.require for browser? Probably not?\n};\n\nPluginLoader.prototype = Object.assign(new AbstractPluginLoader(), {\n loadPlugin(filename, basePath, context, environment, fileManager) {\n return new Promise((fulfill, reject) => {\n fileManager.loadFile(filename, basePath, context, environment)\n .then(fulfill).catch(reject);\n });\n }\n});\n\nexport default PluginLoader;\n\n","import * as utils from './utils';\nimport browser from './browser';\n\nexport default (window, less, options) => {\n\n function errorHTML(e, rootHref) {\n const id = `less-error-message:${utils.extractId(rootHref || '')}`;\n const template = '
  • {content}
  • ';\n const elem = window.document.createElement('div');\n let timer;\n let content;\n const errors = [];\n const filename = e.filename || rootHref;\n const filenameNoPath = filename.match(/([^\\/]+(\\?.*)?)$/)[1];\n\n elem.id = id;\n elem.className = 'less-error-message';\n\n content = `

    ${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'}` + \n `

    in ${filenameNoPath} `;\n\n const errorline = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\{content\\}/, e.extract[i]));\n }\n };\n\n if (e.line) {\n errorline(e, 0, '');\n errorline(e, 1, 'line');\n errorline(e, 2, '');\n content += `on line ${e.line}, column ${e.column + 1}:

      ${errors.join('')}
    `;\n }\n if (e.stack && (e.extract || options.logLevel >= 4)) {\n content += `
    Stack Trace
    ${e.stack.split('\\n').slice(1).join('
    ')}`;\n }\n elem.innerHTML = content;\n\n // CSS for error messages\n browser.createCSS(window.document, [\n '.less-error-message ul, .less-error-message li {',\n 'list-style-type: none;',\n 'margin-right: 15px;',\n 'padding: 4px 0;',\n 'margin: 0;',\n '}',\n '.less-error-message label {',\n 'font-size: 12px;',\n 'margin-right: 15px;',\n 'padding: 4px 0;',\n 'color: #cc7777;',\n '}',\n '.less-error-message pre {',\n 'color: #dd6666;',\n 'padding: 4px 0;',\n 'margin: 0;',\n 'display: inline-block;',\n '}',\n '.less-error-message pre.line {',\n 'color: #ff0000;',\n '}',\n '.less-error-message h3 {',\n 'font-size: 20px;',\n 'font-weight: bold;',\n 'padding: 15px 0 5px 0;',\n 'margin: 0;',\n '}',\n '.less-error-message a {',\n 'color: #10a',\n '}',\n '.less-error-message .error {',\n 'color: red;',\n 'font-weight: bold;',\n 'padding-bottom: 2px;',\n 'border-bottom: 1px dashed red;',\n '}'\n ].join('\\n'), { title: 'error-message' });\n\n elem.style.cssText = [\n 'font-family: Arial, sans-serif',\n 'border: 1px solid #e00',\n 'background-color: #eee',\n 'border-radius: 5px',\n '-webkit-border-radius: 5px',\n '-moz-border-radius: 5px',\n 'color: #e00',\n 'padding: 15px',\n 'margin-bottom: 15px'\n ].join(';');\n\n if (options.env === 'development') {\n timer = setInterval(() => {\n const document = window.document;\n const body = document.body;\n if (body) {\n if (document.getElementById(id)) {\n body.replaceChild(elem, document.getElementById(id));\n } else {\n body.insertBefore(elem, body.firstChild);\n }\n clearInterval(timer);\n }\n }, 10);\n }\n }\n\n function removeErrorHTML(path) {\n const node = window.document.getElementById(`less-error-message:${utils.extractId(path)}`);\n if (node) {\n node.parentNode.removeChild(node);\n }\n }\n\n function removeErrorConsole(path) {\n // no action\n }\n\n function removeError(path) {\n if (!options.errorReporting || options.errorReporting === 'html') {\n removeErrorHTML(path);\n } else if (options.errorReporting === 'console') {\n removeErrorConsole(path);\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('remove', path);\n }\n }\n\n function errorConsole(e, rootHref) {\n const template = '{line} {content}';\n const filename = e.filename || rootHref;\n const errors = [];\n let content = `${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'} in ${filename}`;\n\n const errorline = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\{content\\}/, e.extract[i]));\n }\n };\n\n if (e.line) {\n errorline(e, 0, '');\n errorline(e, 1, 'line');\n errorline(e, 2, '');\n content += ` on line ${e.line}, column ${e.column + 1}:\\n${errors.join('\\n')}`;\n }\n if (e.stack && (e.extract || options.logLevel >= 4)) {\n content += `\\nStack Trace\\n${e.stack}`;\n }\n less.logger.error(content);\n }\n\n function error(e, rootHref) {\n if (!options.errorReporting || options.errorReporting === 'html') {\n errorHTML(e, rootHref);\n } else if (options.errorReporting === 'console') {\n errorConsole(e, rootHref);\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('add', e, rootHref);\n }\n }\n\n return {\n add: error,\n remove: removeError\n };\n};\n","/**\n * Kicks off less and compiles any stylesheets\n * used in the browser distributed version of less\n * to kick-start less using the browser api\n */\n/* global window, document */\n\nimport defaultOptions from '../less/default-options';\nimport addDefaultOptions from './add-default-options';\nimport root from './index';\n\nconst options = defaultOptions();\n\nif (window.less) {\n for (const key in window.less) {\n if (window.less.hasOwnProperty(key)) {\n options[key] = window.less[key];\n }\n }\n}\naddDefaultOptions(window, options);\n\noptions.plugins = options.plugins || [];\n\nif (window.LESS_PLUGINS) {\n options.plugins = options.plugins.concat(window.LESS_PLUGINS);\n}\n\nconst less = root(window, options);\nexport default less;\n\nwindow.less = less;\n\nlet css;\nlet head;\nlet style;\n\n// Always restore page visibility\nfunction resolveOrReject(data) {\n if (data.filename) {\n console.warn(data);\n }\n if (!options.async) {\n head.removeChild(style);\n }\n}\n\nif (options.onReady) {\n if (/!watch/.test(window.location.hash)) {\n less.watch();\n }\n // Simulate synchronous stylesheet loading by hiding page rendering\n if (!options.async) {\n css = 'body { display: none !important }';\n head = document.head || document.getElementsByTagName('head')[0];\n style = document.createElement('style');\n\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n\n head.appendChild(style);\n }\n less.registerStylesheetsImmediately();\n less.pageLoadFinished = less.refresh(less.env === 'development').then(resolveOrReject, resolveOrReject);\n}\n","// Export a new default each time\nexport default function() {\n return {\n /* Inline Javascript - @plugin still allowed */\n javascriptEnabled: false,\n\n /* Outputs a makefile import dependency list to stdout. */\n depends: false,\n\n /* (DEPRECATED) Compress using less built-in compression. \n * This does an okay job but does not utilise all the tricks of \n * dedicated css compression. */\n compress: false,\n\n /* Runs the less parser and just reports errors without any output. */\n lint: false,\n\n /* Sets available include paths.\n * If the file in an @import rule does not exist at that exact location, \n * less will look for it at the location(s) passed to this option. \n * You might use this for instance to specify a path to a library which \n * you want to be referenced simply and relatively in the less files. */\n paths: [],\n\n /* color output in the terminal */\n color: true,\n\n /* The strictImports controls whether the compiler will allow an @import inside of either \n * @media blocks or (a later addition) other selector blocks.\n * See: https://github.com/less/less.js/issues/656 */\n strictImports: false,\n\n /* Allow Imports from Insecure HTTPS Hosts */\n insecure: false,\n\n /* Allows you to add a path to every generated import and url in your css. \n * This does not affect less import statements that are processed, just ones \n * that are left in the output css. */\n rootpath: '',\n\n /* By default URLs are kept as-is, so if you import a file in a sub-directory \n * that references an image, exactly the same URL will be output in the css. \n * This option allows you to re-write URL's in imported files so that the \n * URL is always relative to the base imported file */\n rewriteUrls: false,\n\n /* How to process math \n * 0 always - eagerly try to solve all operations\n * 1 parens-division - require parens for division \"/\"\n * 2 parens | strict - require parens for all operations\n * 3 strict-legacy - legacy strict behavior (super-strict)\n */\n math: 1,\n\n /* Without this option, less attempts to guess at the output unit when it does maths. */\n strictUnits: false,\n\n /* Effectively the declaration is put at the top of your base Less file, \n * meaning it can be used but it also can be overridden if this variable \n * is defined in the file. */\n globalVars: null,\n\n /* As opposed to the global variable option, this puts the declaration at the\n * end of your base file, meaning it will override anything defined in your Less file. */\n modifyVars: null,\n\n /* This option allows you to specify a argument to go on to every URL. */\n urlArgs: ''\n }\n};","import {addDataAttr} from './utils';\nimport browser from './browser';\n\nexport default (window, options) => {\n\n // use options from the current script tag data attribues\n addDataAttr(options, browser.currentScript(window));\n\n if (options.isFileProtocol === undefined) {\n options.isFileProtocol = /^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(window.location.protocol);\n }\n\n // Load styles asynchronously (default: false)\n //\n // This is set to `false` by default, so that the body\n // doesn't start loading before the stylesheets are parsed.\n // Setting this to `true` can result in flickering.\n //\n options.async = options.async || false;\n options.fileAsync = options.fileAsync || false;\n\n // Interval between watch polls\n options.poll = options.poll || (options.isFileProtocol ? 1000 : 1500);\n\n options.env = options.env || (window.location.hostname == '127.0.0.1' ||\n window.location.hostname == '0.0.0.0' ||\n window.location.hostname == 'localhost' ||\n (window.location.port &&\n window.location.port.length > 0) ||\n options.isFileProtocol ? 'development'\n : 'production');\n\n const dumpLineNumbers = /!dumpLineNumbers:(comments|mediaquery|all)/.exec(window.location.hash);\n if (dumpLineNumbers) {\n options.dumpLineNumbers = dumpLineNumbers[1];\n }\n\n if (options.useFileCache === undefined) {\n options.useFileCache = true;\n }\n\n if (options.onReady === undefined) {\n options.onReady = true;\n }\n\n if (options.relativeUrls) {\n options.rewriteUrls = 'all';\n }\n};\n","//\n// index.js\n// Should expose the additional browser functions on to the less object\n//\nimport {addDataAttr} from './utils';\nimport lessRoot from '../less';\nimport browser from './browser';\nimport FM from './file-manager';\nimport PluginLoader from './plugin-loader';\nimport LogListener from './log-listener';\nimport ErrorReporting from './error-reporting';\nimport Cache from './cache';\nimport ImageSize from './image-size';\n\nexport default (window, options) => {\n const document = window.document;\n const less = lessRoot();\n\n less.options = options;\n const environment = less.environment;\n const FileManager = FM(options, less.logger);\n const fileManager = new FileManager();\n environment.addFileManager(fileManager);\n less.FileManager = FileManager;\n less.PluginLoader = PluginLoader;\n\n LogListener(less, options);\n const errors = ErrorReporting(window, less, options);\n const cache = less.cache = options.cache || Cache(window, options, less.logger);\n ImageSize(less.environment);\n\n // Setup user functions - Deprecate?\n if (options.functions) {\n less.functions.functionRegistry.addMultiple(options.functions);\n }\n\n const typePattern = /^text\\/(x-)?less$/;\n\n function clone(obj) {\n const cloned = {};\n for (const prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n cloned[prop] = obj[prop];\n }\n }\n return cloned;\n }\n\n // only really needed for phantom\n function bind(func, thisArg) {\n const curryArgs = Array.prototype.slice.call(arguments, 2);\n return function() {\n const args = curryArgs.concat(Array.prototype.slice.call(arguments, 0));\n return func.apply(thisArg, args);\n };\n }\n\n function loadStyles(modifyVars) {\n const styles = document.getElementsByTagName('style');\n let style;\n\n for (let i = 0; i < styles.length; i++) {\n style = styles[i];\n if (style.type.match(typePattern)) {\n const instanceOptions = clone(options);\n instanceOptions.modifyVars = modifyVars;\n const lessText = style.innerHTML || '';\n instanceOptions.filename = document.location.href.replace(/#.*$/, '');\n\n /* jshint loopfunc:true */\n // use closure to store current style\n less.render(lessText, instanceOptions,\n bind((style, e, result) => {\n if (e) {\n errors.add(e, 'inline');\n } else {\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = result.css;\n } else {\n style.innerHTML = result.css;\n }\n }\n }, null, style));\n }\n }\n }\n\n function loadStyleSheet(sheet, callback, reload, remaining, modifyVars) {\n\n const instanceOptions = clone(options);\n addDataAttr(instanceOptions, sheet);\n instanceOptions.mime = sheet.type;\n\n if (modifyVars) {\n instanceOptions.modifyVars = modifyVars;\n }\n\n function loadInitialFileCallback(loadedFile) {\n const data = loadedFile.contents;\n const path = loadedFile.filename;\n const webInfo = loadedFile.webInfo;\n\n const newFileInfo = {\n currentDirectory: fileManager.getPath(path),\n filename: path,\n rootFilename: path,\n rewriteUrls: instanceOptions.rewriteUrls\n };\n\n newFileInfo.entryPath = newFileInfo.currentDirectory;\n newFileInfo.rootpath = instanceOptions.rootpath || newFileInfo.currentDirectory;\n\n if (webInfo) {\n webInfo.remaining = remaining;\n\n const css = cache.getCSS(path, webInfo, instanceOptions.modifyVars);\n if (!reload && css) {\n webInfo.local = true;\n callback(null, css, data, sheet, webInfo, path);\n return;\n }\n\n }\n\n // TODO add tests around how this behaves when reloading\n errors.remove(path);\n\n instanceOptions.rootFileInfo = newFileInfo;\n less.render(data, instanceOptions, (e, result) => {\n if (e) {\n e.href = path;\n callback(e);\n } else {\n cache.setCSS(sheet.href, webInfo.lastModified, instanceOptions.modifyVars, result.css);\n callback(null, result.css, data, sheet, webInfo, path);\n }\n });\n }\n\n fileManager.loadFile(sheet.href, null, instanceOptions, environment)\n .then(loadedFile => {\n loadInitialFileCallback(loadedFile);\n }).catch(err => {\n console.log(err);\n callback(err);\n });\n\n }\n\n function loadStyleSheets(callback, reload, modifyVars) {\n for (let i = 0; i < less.sheets.length; i++) {\n loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1), modifyVars);\n }\n }\n\n function initRunningMode() {\n if (less.env === 'development') {\n less.watchTimer = setInterval(() => {\n if (less.watchMode) {\n fileManager.clearFileCache();\n loadStyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n } else if (css) {\n browser.createCSS(window.document, css, sheet);\n }\n });\n }\n }, options.poll);\n }\n }\n\n //\n // Watch mode\n //\n less.watch = function () {\n if (!less.watchMode ) {\n less.env = 'development';\n initRunningMode();\n }\n this.watchMode = true;\n return true;\n };\n\n less.unwatch = function () {clearInterval(less.watchTimer); this.watchMode = false; return false; };\n\n //\n // Synchronously get all tags with the 'rel' attribute set to\n // \"stylesheet/less\".\n //\n less.registerStylesheetsImmediately = () => {\n const links = document.getElementsByTagName('link');\n less.sheets = [];\n\n for (let i = 0; i < links.length; i++) {\n if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) &&\n (links[i].type.match(typePattern)))) {\n less.sheets.push(links[i]);\n }\n }\n };\n\n //\n // Asynchronously get all tags with the 'rel' attribute set to\n // \"stylesheet/less\", returning a Promise.\n //\n less.registerStylesheets = () => new Promise((resolve, reject) => {\n less.registerStylesheetsImmediately();\n resolve();\n });\n\n //\n // With this function, it's possible to alter variables and re-render\n // CSS without reloading less-files\n //\n less.modifyVars = record => less.refresh(true, record, false);\n\n less.refresh = (reload, modifyVars, clearFileCache) => {\n if ((reload || clearFileCache) && clearFileCache !== false) {\n fileManager.clearFileCache();\n }\n return new Promise((resolve, reject) => {\n let startTime;\n let endTime;\n let totalMilliseconds;\n let remainingSheets;\n startTime = endTime = new Date();\n\n // Set counter for remaining unprocessed sheets\n remainingSheets = less.sheets.length;\n\n if (remainingSheets === 0) {\n\n endTime = new Date();\n totalMilliseconds = endTime - startTime;\n less.logger.info('Less has finished and no sheets were loaded.');\n resolve({\n startTime,\n endTime,\n totalMilliseconds,\n sheets: less.sheets.length\n });\n\n } else {\n // Relies on less.sheets array, callback seems to be guaranteed to be called for every element of the array\n loadStyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n reject(e);\n return;\n }\n if (webInfo.local) {\n less.logger.info(`Loading ${sheet.href} from cache.`);\n } else {\n less.logger.info(`Rendered ${sheet.href} successfully.`);\n }\n browser.createCSS(window.document, css, sheet);\n less.logger.info(`CSS for ${sheet.href} generated in ${new Date() - endTime}ms`);\n\n // Count completed sheet\n remainingSheets--;\n\n // Check if the last remaining sheet was processed and then call the promise\n if (remainingSheets === 0) {\n totalMilliseconds = new Date() - startTime;\n less.logger.info(`Less has finished. CSS generated in ${totalMilliseconds}ms`);\n resolve({\n startTime,\n endTime,\n totalMilliseconds,\n sheets: less.sheets.length\n });\n }\n endTime = new Date();\n }, reload, modifyVars);\n }\n\n loadStyles(modifyVars);\n });\n };\n\n less.refreshStyles = loadStyles;\n return less;\n};\n","export default (less, options) => {\n const logLevel_debug = 4;\n const logLevel_info = 3;\n const logLevel_warn = 2;\n const logLevel_error = 1;\n\n // The amount of logging in the javascript console.\n // 3 - Debug, information and errors\n // 2 - Information and errors\n // 1 - Errors\n // 0 - None\n // Defaults to 2\n options.logLevel = typeof options.logLevel !== 'undefined' ? options.logLevel : (options.env === 'development' ? logLevel_info : logLevel_error);\n\n if (!options.loggers) {\n options.loggers = [{\n debug: function(msg) {\n if (options.logLevel >= logLevel_debug) {\n console.log(msg);\n }\n },\n info: function(msg) {\n if (options.logLevel >= logLevel_info) {\n console.log(msg);\n }\n },\n warn: function(msg) {\n if (options.logLevel >= logLevel_warn) {\n console.warn(msg);\n }\n },\n error: function(msg) {\n if (options.logLevel >= logLevel_error) {\n console.error(msg);\n }\n }\n }];\n }\n for (let i = 0; i < options.loggers.length; i++) {\n less.logger.addListener(options.loggers[i]);\n }\n};\n","// Cache system is a bit outdated and could do with work\n\nexport default (window, options, logger) => {\n let cache = null;\n if (options.env !== 'development') {\n try {\n cache = (typeof window.localStorage === 'undefined') ? null : window.localStorage;\n } catch (_) {}\n }\n return {\n setCSS: function(path, lastModified, modifyVars, styles) {\n if (cache) {\n logger.info(`saving ${path} to cache.`);\n try {\n cache.setItem(path, styles);\n cache.setItem(`${path}:timestamp`, lastModified);\n if (modifyVars) {\n cache.setItem(`${path}:vars`, JSON.stringify(modifyVars));\n }\n } catch (e) {\n // TODO - could do with adding more robust error handling\n logger.error(`failed to save \"${path}\" to local storage for caching.`);\n }\n }\n },\n getCSS: function(path, webInfo, modifyVars) {\n const css = cache && cache.getItem(path);\n const timestamp = cache && cache.getItem(`${path}:timestamp`);\n let vars = cache && cache.getItem(`${path}:vars`);\n\n modifyVars = modifyVars || {};\n vars = vars || \"{}\"; // if not set, treat as the JSON representation of an empty object\n\n if (timestamp && webInfo.lastModified &&\n (new Date(webInfo.lastModified).valueOf() ===\n new Date(timestamp).valueOf()) &&\n JSON.stringify(modifyVars) === vars) {\n // Use local copy\n return css;\n }\n }\n };\n};\n","\nimport functionRegistry from './../less/functions/function-registry';\n\nexport default () => {\n function imageSize() {\n throw {\n type: 'Runtime',\n message: 'Image size functions are not supported in browser version of less'\n };\n }\n\n const imageFunctions = {\n 'image-size': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n },\n 'image-width': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n },\n 'image-height': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n }\n };\n\n functionRegistry.addMultiple(imageFunctions);\n};\n"],"names":["extractId","href","replace","addDataAttr","options","tag","opt","dataset","hasOwnProperty","JSON","parse","_","document","styles","sheet","id","title","utils.extractId","oldStyleNode","getElementById","keepOldStyleNode","styleNode","createElement","setAttribute","media","styleSheet","appendChild","createTextNode","childNodes","length","firstChild","nodeValue","head","getElementsByTagName","nextEl","nextSibling","parentNode","insertBefore","removeChild","cssText","e","Error","window","scripts","currentScript","error","msg","this","_fireEvent","warn","info","debug","addListener","listener","_listeners","push","removeListener","i","splice","type","logFunction","externalEnvironment","fileManagers","requiredFunctions","functions","concat","propName","environmentFunc","bind","Environment","filename","currentDirectory","environment","isSync","logger","pluginManager","getFileManagers","fileManager","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","darkgrey","darkgreen","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","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","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","m","cm","mm","in","px","pt","pc","duration","s","ms","angle","rad","Math","PI","deg","grad","turn","colors","unitConversions","parent","visibilityBlocks","undefined","nodeVisible","rootNode","parsed","self","Object","defineProperty","get","fileInfo","getIndex","Node","nodes","set","node","Array","isArray","forEach","_index","_fileInfo","context","strs","genCSS","add","chunk","index","isEmpty","join","output","value","visitor","visit","op","a","b","precision","numPrecision","Number","toFixed","compare","Color","rgb","originalForm","match","map","c","parseInt","alpha","split","clamp","v","max","min","toHex","round","toString","prototype","assign","luma","r","g","pow","toCSS","doNotCompress","color","colorFunction","compress","args","fround","indexOf","toHSL","h","l","toRGB","splitcolor","operate","other","_operate","d","toHSV","toARGB","x","fromKeyword","keyword","key","toLowerCase","slice","Paren","eval","_noSpaceCombinators"," ","|","Combinator","emptyOrWhitespace","trim","spaceOrEmpty","Element","combinator","isVariable","currentFileInfo","visibilityInfo","copyVisibilityInfo","setParent","accept","clone","firstSelector","charAt","__assign","t","n","arguments","p","call","apply","ALWAYS","PARENS_DIVISION","PARENS","RewriteUrls","getLocation","inputStream","line","column","copyArray","arr","copy","obj","cloned","prop","defaults","obj1","obj2","newObj","_defaults","defaults_1","copyOptions","opts","strictMath","math","Constants.Math","relativeUrls","rewriteUrls","Constants.RewriteUrls","flattenArray","result","length_1","anonymousFunc","LessError","fileContentMap","currentFilename","message","stack","input","contents","loc","utils.getLocation","col","callLine","lines","found","func","Function","lineAdjust","callExtract","extract","create","F","constructor","stylize","str","errorTxt","substr","Selector","elements","extendList","condition","evaldCondition","getElements","mixinElements_","visitArray","createDerived","newSelector","mediaEmpty","els","parseNode","err","imports","createEmptySelectors","el","sels","olen","len","mixinElements","shift","isJustParentSelector","extend","getIsOutput","Value","Keyword","True","False","Anonymous","mapLines","rulesetLike","allowRoot","isRulesetLike","Boolean","MATH","Declaration","name","important","merge","inline","variable","lastRule","prevMath","evaldValue","mathBypass","evalName","importantScope","importantResult","pop","makeImportant","ctx","lineSeparator","dumpLineNumbers","debugInfo","asComment","asMediaQuery","lineNumber","fileName","filenameWithProtocol","test","Comment","isLineComment","getDebugInfo","isSilent","isCompressed","contexts","copyFromOriginal","original","destination","propertiesToCopy","parseCopyProperties","Parse","paths","evalCopyProperties","isPathRelative","path","isPathLocalRelative","Eval","frames","enterCalc","calcStack","inCalc","exitCalc","inParenthesis","parensStack","outOfParenthesis","mathOn","isMathOn","pathRequiresRewrite","rewritePath","rootpath","newPath","normalizePath","segment","segments","reverse","makeRegistry","base","_data","addMultiple","keys","_this","getLocalFunctions","inherit","defaultFunc","value_","error_","reset","Ruleset","selectors","rules","strictImports","_lookups","_variables","_properties","isRuleset","selCnt","selector","hasVariable","hasOnePassingSelector","j","toParseSelectors","utils.flattenArray","rule","subRule","utils.copyArray","ruleset","originalRuleset","root","firstRoot","allowImports","functionRegistry","globalFunctionRegistry","ctxFrames","unshift","ctxSelectors","evalImports","rsRules","evalFirst","mediaBlockCount","mediaBlocks","filter","resetCache","bubbleSelectors","importRules","matchArgs","matchCondition","lastSelector","_rulesets","variables","reduce","hash","vars","name_1","properties","name_2","decl","parseValue","property","lastDeclaration","toParse","transformDeclaration","nodes_1","rulesets","filtRules","prependRule","find","foundMixins","ruleNodes","tabLevel","sep","tabRuleStr","tabSetStr","charsetNodeIndex","importNodeIndex","isCharset","pathCnt","pathSubCnt","currentLastRule","isVisible","joinSelectors","joinSelector","createParenthesis","elementsToPak","originalElement","replacementParen","insideParent","createSelector","containedElement","element","addReplacementIntoPath","beginningPath","addPath","replacedElement","originalSelector","newSelectorPath","newJoinedSelector","parentEl","restOfPath","addAllReplacementsIntoPath","addPaths","mergeElementsOnToSelectors","sel","deriveSelector","deriveFrom","newPaths","replaceParentSelector","inSelector","k","currentElements","newSelectors","selectorsMultiplied","maybeSelector","hadParentSelector","nestedSelector","replaced","nestedPaths","replacedNewSelectors","concatenated","AtRule","isRooted","outputRuleset","mediaPathBackup","mediaBlocksBackup","mediaPath","ruleCnt","DetachedRuleset","callEval","Unit","numerator","denominator","backupUnit","sort","strictUnits","returnStr","is","unitString","toUpperCase","isLength","RegExp","isSingular","callback","usedUnits","group","mapUnit","groupName","atomicUnit","cancel","counter","count","Dimension","unit","parseFloat","isNaN","toColor","strValue","String","convertTo","unify","numericCompare","conversions","targetUnit","applyUnit","derivedConversions","Operation","operands","isSpaced","Expression","noSpacing","returnValue","parens","doubleParen","parensInOp","throwAwayComments","functionCaller","evalArgs","commentFilter","item","subNodes","il","jl","Call","calc","currentMathContext","funcCaller","FunctionCaller","isValid","columnNumber","Variable","evaluating","frame","fun","Property","mergeRules","less","visitors","ToCSSVisitor","_mergeRules","vArr","Attribute","Quoted","content","escaped","quote","variableRegex","propRegex","containsVariables","that","iterativeReplace","regexp","replacementFnc","evaluatedValue","URL","val","isEvald","urlArgs","Media","features","evalTop","evalNested","multiMedia","permute","fragment","rest","Import","css","pathValue","getPath","isPlugin","reference","isVariableImport","evalForImport","evalPath","doEval","blocksVisibility","addVisibilityBlock","registry","skip","importedFilename","newImport","JsEvalNode","evaluateJavaScript","expression","evalContext","javascriptEnabled","jsify","toJS","JavaScript","string","Assignment","Condition","negate","lvalue","rvalue","UnicodeDescriptor","Negative","Extend","option","object_id","next_id","parent_ids","allowBefore","allowAfter","findSelfSelectors","selectorElements","selfElements","selfSelectors","VariableCall","detachedRuleset","NamespaceValue","ruleCall","lookups","substring","Definition","params","variadic","arity","optionalParameters","required","evalParams","mixinEnv","evaldArguments","varargs","arg","isNamedFound","argIndex","argsLength","evalCall","_arguments","mixinFrames","allArgsCnt","requiredArgsCnt","MixinCall","mixins","mixin","mixinPath","argValue","f","isRecursive","isOneFound","candidate","defaultResult","noArgumentsFilter","candidates","conditionResult","calcDefGroup","namespace","expand","MixinDefinition","format","newRules","_setVisibilityToReplacement","replacement","AbstractFileManager","lastIndexOf","ext","tryAppendExtension","basePath","laterPath","url","baseUrl","urlDirectories","baseUrlDirectories","urlParts","extractUrlParts","baseUrlParts","diff","hostPart","directories","urlPartsRegex","returner","rawDirectories","rawPath","fileUrl","require","AbstractPluginLoader","pluginOptions","pluginObj","localModule","shortname","FileManager","trySetOptions","use","exports","loader","tree","validatePlugin","minVersion","compareVersion","addPlugin","plugin","setOptions","version","versionToString","aVersion","bVersion","versionString","plugins","printUsage","_visitArgs","visitDeeper","_hasIndexed","_noop","implementation","_implementation","_visitInCache","_visitOutCache","indexNodeTypes","ticker","child","typeIndex","Visitor","nodeTypeIndex","fnName","impl","funcOut","visitArgs","newNode","isReplacing","cnt","nonReplacing","out","evald","flatten","nestedCnt","nestedItem","onSequencerEmpty","variableImports","_onSequencerEmpty","_currentDepth","ImportSequencer","importSequencer","importItem","isReady","tryRun","variableImport","ImportVisitor","importer","finish","_visitor","_importer","_finish","importCount","onceFileDetectionMap","recursionDetector","_sequencer","run","isFinished","visitImport","importNode","inlineCSS","importParent","addVariableImport","processImportNode","evaldImportNode","multiple","importMultiple","tryAppendLessExtension","onImported","sequencedOnImported","addImport","importedAtRoot","fullPath","importVisitor","isOptional","optional","duplicateImport","oldContext","visitDeclaration","declNode","visitDeclarationOut","visitAtRule","atRuleNode","visitAtRuleOut","visitMixinDefinition","mixinDefinitionNode","visitMixinDefinitionOut","visitRuleset","rulesetNode","visitRulesetOut","visitMedia","mediaNode","visitMediaOut","visible","SetTreeVisibilityVisitor","ensureVisibility","ensureInvisibility","allExtendsStack","ExtendFinderVisitor","allExtends","allSelectorsExtendList","extendOnEveryPath","selectorPath","selExtendList","allSelectorsExtend","foundExtends","firstExtendOnThisSelectorPath","ProcessExtendsVisitor","extendFinder","extendIndices","doExtendChaining","newRoot","checkExtendsForNonMatched","indices","hasFoundMatches","extendsList","extendsListTarget","iterationCount","extendIndex","targetExtendIndex","matches","targetExtend","newExtend","extendsToAdd","extendVisitor","findMatch","selfSelector","extendSelector","extendChainCount","selectorOne","selectorTwo","ruleNode","selectorNode","pathIndex","selectorsToAdd","extendedSelectors","haystackSelectorPath","haystackSelectorIndex","hackstackSelector","hackstackElementIndex","haystackElement","targetCombinator","potentialMatch","needleElements","potentialMatches","matched","initialCombinator","isElementValuesEqual","finished","endPathIndex","endPathElementIndex","elementValue1","elementValue2","replacementSelector","matchIndex","firstElement","newElements","currentSelectorPathIndex","currentSelectorPathElementIndex","currentValue","derived","newAllExtends","lastIndex","JoinSelectorVisitor","_context","CSSVisitorUtils","bodyRules","owner","thing","originalRules","containsSilentNonBlockedChild","compiledRulesBody","keepOnlyVisibleChilds","removeVisibilityBlock","hasVisibleSelector","utils","mixinNode","visitExtend","extendNode","visitComment","commentNode","resolveVisibility","visitAtRuleWithBody","visitAtRuleWithoutBody","visitAnonymous","anonymousNode","nodeRules","hasFakeRuleset","getBodyRules","charset","comment","checkValidNodes","isRoot","_compileRulesetPaths","nodeRuleCnt","_removeDuplicateRules","isVisibleRuleset","ruleList","ruleCache","ruleCSS","groups","groupsArr","result_1","space_1","comma_1","MarkVisibleSelectorsVisitor","ExtendVisitor","furthest","furthestPossibleErrorMessage","chunks","current","currentPos","saveStack","parserInput","skipWhitespace","nextChar","oldi","oldj","curr","endIndex","mem","inp","charCodeAt","autoCommentAbsorb","nextNewLine","text","commentStore","nextStarSlash","save","restore","possibleErrorMessage","state","forget","isWhitespace","offset","pos","code","$re","tok","exec","$char","$str","tokLength","$quoted","startChar","currentPosition","$parseUntil","testChar","returnVal","inComment","blockDepth","blockStack","parseGroups","startPos","lastPos","loop","char","expected","peek","peekChar","currentChar","prevChar","getInput","peekNotNumeric","start","chunkInput","failFunction","fail","lastOpening","lastOpeningParen","lastMultiComment","lastMultiCommentEndBrace","chunkerCurrentIndex","currentChunkStartIndex","cc","cc2","level","parenLevel","emitFrom","emitChunk","force","fromCharCode","chunker","end","furthestReachedEnd","furthestChar","Parser","parsers","getParserInput","expect","expectChar","parseList","currentIndex","returnNodes","parser","additionalData","globalVars","modifyVars","ignored","preText","serializeVars","preProcessors","getPreProcessors","process","banner","contentsIgnoredChars","primary","endInfo","processImports","extendRule","definition","declaration","variableCall","entities","atrule","foundSemiColon","mixinLookup","quoted","forceEscaped","isEscaped","customFuncCall","stop","ieAlpha","boolean","if","prevArgs","isSemiColonSeparated","argsComma","argsSemiColon","assignment","literal","dimension","unicodeDescriptor","entity","ch","variableCurly","curly","propertyCurly","colorKeyword","ud","javascript","js","escape","parsedName","inValue","ruleLookups","isRule","getLookup","hasParens","elem","elemIndex","re","isCall","expressionContainsNamed","nameLoop","expressions","hasSep","cond","argInfo","conditions","block","lookupValue","attribute","slashedCombinator","isLess","when","blockRuleset","hasDR","ruleProperty","permissiveValue","anonymousValue","untilTokens","done","testCurrentChar","import","dir","importOptions","mediaFeatures","o","optionName","importOption","mediaFeature","pluginArgs","nonVendorSpecificName","hasIdentifier","hasExpression","hasUnknown","hasBlock","sub","addition","multiplication","operation","operand","needsParens","logical","next","conditionAnd","negatedCondition","parenthesisCondition","atomicCondition","body","me","tryConditionFollowedByParenthesis","delim","simpleProperty","If","trueValue","falseValue","colorFunctions","hsla","origColor","hsl","number","rgba","size","m1_1","m2_1","hue","hsv","hsva","vs","floor","perm","saturation","lightness","hsvhue","hsvsaturation","hsvvalue","luminance","saturate","amount","method","desaturate","lighten","darken","fadein","fadeout","fade","spin","mix","color1","color2","weight","w","w1","w2","greyscale","contrast","dark","light","threshold","argb","tint","shade","colorBlend","mode","cb","cs","ar","cr","ab","as","colorBlendModeFunctions","multiply","screen","overlay","softlight","sqrt","hardlight","difference","abs","exclusion","average","negation","getItemsFromNode","_SELF","~","_i","expr","values","range","step","from","to","stepValue","list","each","rs","iterator","tryEval","Quote","valueName","keyName","indexName","MathHelper","fn","mathFunctions","ceil","sin","cos","atan","asin","acos","mathHelper","fraction","num","minMax","isMin","currentUnified","referenceUnified","unitStatic","unitClone","order","convert","pi","mod","y","percentage","evaluated","encodeURI","pattern","flags","%","token","encodeURIComponent","isa","Type","isunit","isruleset","iscolor","isnumber","isstring","iskeyword","isurl","ispixel","ispercentage","isem","get-unit","colorBlending","fallback","functionThis","data-uri","mimetypeNode","filePathNode","mimetype","filePath","entryPath","fragmentStart","utils.clone","rawBuffer","getFileManager","useBase64","mimeLookup","charsetLookup","fileSync","loadFileSync","buf","encodeBase64","uri","dataUri","svg-gradient","direction","stops","gradientDirectionSvg","position","positionValue","gradientType","rectangleDimension","renderEnv","directionValue","throwArgumentDescriptor","types","evaldRoot","evalEnv","visitorIterator","preEvalVisitors","first","isPreEvalVisitor","isPreVisitor","pm","postProcessors","installedPlugins","pluginCache","Loader","PluginLoader","PluginManager","install","preProcessor","priority","indexToInsertAt","postProcessor","manager","PluginManagerFactory","newFactory","sourceMapOutput","sourceMapBuilder","parseTree","importManager","SourceMapBuilder","ParseTree","transformTree","toCSSOptions","sourceMap","getPostProcessors","file","getExternalSourceMap","files","rootFilename","SourceMapOutput","contentsIgnoredCharsMap","contentsMap","sourceMapFilename","sourceMapURL","outputFilename","sourceMapOutputFilename","sourceMapBasepath","sourceMapRootpath","outputSourceFiles","sourceMapGenerator","sourceMapFileInline","disableSourcemapAnnotation","sourceMapInputFilename","normalizeFilename","removeBasepath","getCSSAppendage","_css","_rootNode","_contentsMap","_contentsIgnoredCharsMap","_sourceMapFilename","_outputFilename","_sourceMapBasepath","_sourceMapRootpath","_outputSourceFiles","_sourceMapGeneratorConstructor","getSourceMapGenerator","_lineNumber","_column","sourceLines","columns","sourceColumns","inputSource","_sourceMapGenerator","addMapping","generated","source","sourceRoot","setSourceContent","sourceMapContent","stringify","toJSON","rootFileInfo","mime","queue","ImportManager","pluginLoader","fileParsedFunc","importedEqualsRoot","newFileInfo","loadedFile","promise","loadFileCallback","resolvedFilename","pathDiff","isPathAbsolute","alwaysMakePathsAbsolute","newEnv","evalPlugin","syncImport","loadPluginSync","loadPlugin","loadFile","then","render","utils.copyOptions","self_1","Promise","resolve","reject","Render","context_1","pluginManager_1","reUsePluginManager","imports_1","evalResult","fileContent","initial","data","ctor","api","fileCache","doXHR","errback","xhr","XMLHttpRequest","async","isFileProtocol","fileAsync","handleResponse","status","responseText","getResponseHeader","overrideMimeType","open","setRequestHeader","send","onreadystatechange","readyState","supports","clearFileCache","location","useFileCache","lessText","webInfo","lastModified","Date","log","fulfill","catch","rootHref","errorReporting","errors","errorline","classname","logLevel","errorConsole","timer","filenameNoPath","className","innerHTML","browser","style","env","setInterval","replaceChild","clearInterval","errorHTML","remove","removeErrorHTML","depends","lint","insecure","protocol","poll","hostname","port","onReady","addDefaultOptions","LESS_PLUGINS","lessRoot","FM","addFileManager","loggers","console","LogListener","ErrorReporting","cache","localStorage","setCSS","setItem","getCSS","getItem","timestamp","valueOf","Cache","imageSize","imageFunctions","image-size","image-width","image-height","ImageSize","typePattern","thisArg","curryArgs","loadStyles","instanceOptions","loadStyleSheet","reload","remaining","local","loadInitialFileCallback","loadStyleSheets","sheets","watch","watchMode","watchTimer","unwatch","registerStylesheetsImmediately","links","rel","registerStylesheets","record","refresh","startTime","endTime","totalMilliseconds","remainingSheets","refreshStyles","resolveOrReject","pageLoadFinished"],"mappings":"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"} \ No newline at end of file diff --git a/packages/less/benchmark/benchmark.less b/packages/less/benchmark/benchmark.less index 72aa04f6b..dfec2a6f1 100644 --- a/packages/less/benchmark/benchmark.less +++ b/packages/less/benchmark/benchmark.less @@ -2327,7 +2327,7 @@ p + h1 { } .no-parens { - .mixin; + .mixin(); } .no-args { @@ -2388,7 +2388,7 @@ body { @var: 10px; width: @var; } -#var-inside { .var-inside; } +#var-inside { .var-inside(); } .mix-inner (@var) { border-width: @var; } @@ -2525,37 +2525,37 @@ body { } #container { color: black; - .mixin; - .mixout; - #theme > .mixin; + .mixin(); + .mixout(); + #theme > .mixin(); } #header { .milk { color: white; - .mixin; - #theme > .mixin; + .mixin(); + #theme > .mixin(); } #cookie { .chips { - #namespace .borders; + #namespace .borders(); .calories { - #container; + #container(); } } - .borders; + .borders(); } } -.secure-zone { #namespace .biohazard .man; } +.secure-zone { #namespace .biohazard .man(); } .direct { - #namespace > .borders; + #namespace > .borders(); } #operations { color: #110000 + #000011 + #001100; // #111111 - height: 10px / 2px + 6px - 1px * 2; // 9px + height: (10px / 2px) + 6px - 1px * 2; // 9px width: 2 * 4 - 5em; // 3em .spacing { - height: 10px / 2px+6px-1px*2; + height: (10px / 2px)+6px-1px*2; width: 2 * 4-5em; } subtraction: 20 - 10 - 5 - 5; // 0 @@ -2657,7 +2657,7 @@ body { .tiny-scope { color: @mix; // #989 - .mixin; + .mixin(); } .scope1 { @@ -3091,7 +3091,7 @@ p + h1 { } .no-parens { - .mixin; + .mixin(); } .no-args { @@ -3152,7 +3152,7 @@ body { @var: 10px; width: @var; } -#var-inside { .var-inside; } +#var-inside { .var-inside(); } .mix-inner (@var) { border-width: @var; } @@ -3289,37 +3289,37 @@ body { } #container { color: black; - .mixin; - .mixout; - #theme > .mixin; + .mixin(); + .mixout(); + #theme > .mixin(); } #header { .milk { color: white; - .mixin; - #theme > .mixin; + .mixin(); + #theme > .mixin(); } #cookie { .chips { - #namespace .borders; + #namespace .borders(); .calories { - #container; + #container(); } } - .borders; + .borders(); } } -.secure-zone { #namespace .biohazard .man; } +.secure-zone { #namespace .biohazard .man(); } .direct { - #namespace > .borders; + #namespace > .borders(); } #operations { color: #110000 + #000011 + #001100; // #111111 - height: 10px / 2px + 6px - 1px * 2; // 9px + height: (10px / 2px) + 6px - 1px * 2; // 9px width: 2 * 4 - 5em; // 3em .spacing { - height: 10px / 2px+6px-1px*2; + height: (10px / 2px)+6px-1px*2; width: 2 * 4-5em; } subtraction: 20 - 10 - 5 - 5; // 0 @@ -3421,7 +3421,7 @@ body { .tiny-scope { color: @mix; // #989 - .mixin; + .mixin(); } .scope1 { @@ -3855,7 +3855,7 @@ p + h1 { } .no-parens { - .mixin; + .mixin(); } .no-args { @@ -3916,7 +3916,7 @@ body { @var: 10px; width: @var; } -#var-inside { .var-inside; } +#var-inside { .var-inside(); } .mix-inner (@var) { border-width: @var; } diff --git a/packages/less/benchmark/index.js b/packages/less/benchmark/index.js index 3dfb14ab4..8bb5eca2c 100644 --- a/packages/less/benchmark/index.js +++ b/packages/less/benchmark/index.js @@ -2,7 +2,7 @@ var path = require('path'), fs = require('fs'), now = require("performance-now"); -var less = require('../test/less'); +var less = require('../.'); var file = path.join(__dirname, 'benchmark.less'); if (process.argv[2]) { file = path.join(process.cwd(), process.argv[2]) } @@ -31,7 +31,7 @@ fs.readFile(file, 'utf8', function (e, data) { less.parse(data, {}, function(err, root, imports, options) { if (err) { - less.writeError(err); + console.log(err); process.exit(3); } parserEnd = now(); diff --git a/packages/less/dist/less.js b/packages/less/dist/less.js index 3d7366530..f5e33a44c 100644 --- a/packages/less/dist/less.js +++ b/packages/less/dist/less.js @@ -1,5 +1,5 @@ /** - * Less - Leaner CSS v4.0.1-alpha.0+70e242c5 + * Less - Leaner CSS v4.0.0 * http://lesscss.org * * Copyright (c) 2009-2020, Alexis Sellier @@ -608,111 +608,60 @@ return Node; }()); - /*! ***************************************************************************** - Copyright (c) Microsoft Corporation. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, - INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR - OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. - ***************************************************************************** */ - /* global Reflect, Promise */ - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) - if (b.hasOwnProperty(p)) - d[p] = b[p]; }; - return extendStatics(d, b); - }; - function __extends(d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - } - var __assign = function () { - __assign = Object.assign || function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) - if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); - }; - function __spreadArrays() { - for (var s = 0, i = 0, il = arguments.length; i < il; i++) - s += arguments[i].length; - for (var r = Array(s), k = 0, i = 0; i < il; i++) - for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) - r[k] = a[j]; - return r; - } - // // RGB Colors - #ff0014, #eee // - var Color = /** @class */ (function (_super) { - __extends(Color, _super); - function Color(rgb, a, originalForm) { - var _this = _super.call(this) || this; - var self = _this; - // - // The end goal here, is to parse the arguments - // into an integer triplet, such as `128, 255, 0` - // - // This facilitates operations and conversions. - // - if (Array.isArray(rgb)) { - _this.rgb = rgb; - } - else if (rgb.length >= 6) { - _this.rgb = []; - rgb.match(/.{2}/g).map(function (c, i) { - if (i < 3) { - self.rgb.push(parseInt(c, 16)); - } - else { - self.alpha = (parseInt(c, 16)) / 255; - } - }); - } - else { - _this.rgb = []; - rgb.split('').map(function (c, i) { - if (i < 3) { - self.rgb.push(parseInt(c + c, 16)); - } - else { - self.alpha = (parseInt(c + c, 16)) / 255; - } - }); - } - _this.alpha = _this.alpha || (typeof a === 'number' ? a : 1); - if (typeof originalForm !== 'undefined') { - _this.value = originalForm; - } - return _this; + var Color = function (rgb, a, originalForm) { + var self = this; + // + // The end goal here, is to parse the arguments + // into an integer triplet, such as `128, 255, 0` + // + // This facilitates operations and conversions. + // + if (Array.isArray(rgb)) { + this.rgb = rgb; + } + else if (rgb.length >= 6) { + this.rgb = []; + rgb.match(/.{2}/g).map(function (c, i) { + if (i < 3) { + self.rgb.push(parseInt(c, 16)); + } + else { + self.alpha = (parseInt(c, 16)) / 255; + } + }); + } + else { + this.rgb = []; + rgb.split('').map(function (c, i) { + if (i < 3) { + self.rgb.push(parseInt(c + c, 16)); + } + else { + self.alpha = (parseInt(c + c, 16)) / 255; + } + }); } - Color.prototype.luma = function () { + this.alpha = this.alpha || (typeof a === 'number' ? a : 1); + if (typeof originalForm !== 'undefined') { + this.value = originalForm; + } + }; + Color.prototype = Object.assign(new Node(), { + type: 'Color', + luma: function () { var r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255; r = (r <= 0.03928) ? r / 12.92 : Math.pow(((r + 0.055) / 1.055), 2.4); g = (g <= 0.03928) ? g / 12.92 : Math.pow(((g + 0.055) / 1.055), 2.4); b = (b <= 0.03928) ? b / 12.92 : Math.pow(((b + 0.055) / 1.055), 2.4); return 0.2126 * r + 0.7152 * g + 0.0722 * b; - }; - Color.prototype.genCSS = function (context, output) { + }, + genCSS: function (context, output) { output.add(this.toCSS(context)); - }; - Color.prototype.toCSS = function (context, doNotCompress) { + }, + toCSS: function (context, doNotCompress) { var compress = context && context.compress && !doNotCompress; var color; var alpha; @@ -774,25 +723,25 @@ } } return color; - }; + }, // // Operations have to be done per-channel, if not, // channels will spill onto each other. Once we have // our result, in the form of an integer triplet, // we create a new Color node to hold the result. // - Color.prototype.operate = function (context, op, other) { + operate: function (context, op, other) { var rgb = new Array(3); var alpha = this.alpha * (1 - other.alpha) + other.alpha; for (var c = 0; c < 3; c++) { rgb[c] = this._operate(context, op, this.rgb[c], other.rgb[c]); } return new Color(rgb, alpha); - }; - Color.prototype.toRGB = function () { + }, + toRGB: function () { return toHex(this.rgb); - }; - Color.prototype.toHSL = function () { + }, + toHSL: function () { var r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha; var max = Math.max(r, g, b), min = Math.min(r, g, b); var h; @@ -818,9 +767,9 @@ h /= 6; } return { h: h * 360, s: s, l: l, a: a }; - }; + }, // Adapted from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript - Color.prototype.toHSV = function () { + toHSV: function () { var r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha; var max = Math.max(r, g, b), min = Math.min(r, g, b); var h; @@ -851,34 +800,32 @@ h /= 6; } return { h: h * 360, s: s, v: v, a: a }; - }; - Color.prototype.toARGB = function () { + }, + toARGB: function () { return toHex([this.alpha * 255].concat(this.rgb)); - }; - Color.prototype.compare = function (x) { + }, + compare: function (x) { return (x.rgb && x.rgb[0] === this.rgb[0] && x.rgb[1] === this.rgb[1] && x.rgb[2] === this.rgb[2] && x.alpha === this.alpha) ? 0 : undefined; - }; - Color.fromKeyword = function (keyword) { - var c; - var key = keyword.toLowerCase(); - if (colors.hasOwnProperty(key)) { - c = new Color(colors[key].slice(1)); - } - else if (key === 'transparent') { - c = new Color([0, 0, 0], 0); - } - if (c) { - c.value = keyword; - return c; - } - }; - return Color; - }(Node)); - Color.prototype.type = 'Color'; + } + }); + Color.fromKeyword = function (keyword) { + var c; + var key = keyword.toLowerCase(); + if (colors.hasOwnProperty(key)) { + c = new Color(colors[key].slice(1)); + } + else if (key === 'transparent') { + c = new Color([0, 0, 0], 0); + } + if (c) { + c.value = keyword; + return c; + } + }; function clamp(v, max) { return Math.min(Math.max(v, 0), max); } @@ -889,91 +836,81 @@ }).join(''); } - var Paren = /** @class */ (function (_super) { - __extends(Paren, _super); - function Paren(node) { - var _this = _super.call(this) || this; - _this.value = node; - return _this; - } - Paren.prototype.genCSS = function (context, output) { + var Paren = function (node) { + this.value = node; + }; + Paren.prototype = Object.assign(new Node(), { + type: 'Paren', + genCSS: function (context, output) { output.add('('); this.value.genCSS(context, output); output.add(')'); - }; - Paren.prototype.eval = function (context) { + }, + eval: function (context) { return new Paren(this.value.eval(context)); - }; - return Paren; - }(Node)); - Paren.prototype.type = 'Paren'; + } + }); var _noSpaceCombinators = { '': true, ' ': true, '|': true }; - var Combinator = /** @class */ (function (_super) { - __extends(Combinator, _super); - function Combinator(value) { - var _this = _super.call(this) || this; - if (value === ' ') { - _this.value = ' '; - _this.emptyOrWhitespace = true; - } - else { - _this.value = value ? value.trim() : ''; - _this.emptyOrWhitespace = _this.value === ''; - } - return _this; + var Combinator = function (value) { + if (value === ' ') { + this.value = ' '; + this.emptyOrWhitespace = true; } - Combinator.prototype.genCSS = function (context, output) { + else { + this.value = value ? value.trim() : ''; + this.emptyOrWhitespace = this.value === ''; + } + }; + Combinator.prototype = Object.assign(new Node(), { + type: 'Combinator', + genCSS: function (context, output) { var spaceOrEmpty = (context.compress || _noSpaceCombinators[this.value]) ? '' : ' '; output.add(spaceOrEmpty + this.value + spaceOrEmpty); - }; - return Combinator; - }(Node)); - Combinator.prototype.type = 'Combinator'; + } + }); - var Element = /** @class */ (function (_super) { - __extends(Element, _super); - function Element(combinator, value, isVariable, index, currentFileInfo, visibilityInfo) { - var _this = _super.call(this) || this; - _this.combinator = combinator instanceof Combinator ? - combinator : new Combinator(combinator); - if (typeof value === 'string') { - _this.value = value.trim(); - } - else if (value) { - _this.value = value; - } - else { - _this.value = ''; - } - _this.isVariable = isVariable; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.copyVisibilityInfo(visibilityInfo); - _this.setParent(_this.combinator, _this); - return _this; + var Element = function (combinator, value, isVariable, index, currentFileInfo, visibilityInfo) { + this.combinator = combinator instanceof Combinator ? + combinator : new Combinator(combinator); + if (typeof value === 'string') { + this.value = value.trim(); } - Element.prototype.accept = function (visitor) { + else if (value) { + this.value = value; + } + else { + this.value = ''; + } + this.isVariable = isVariable; + this._index = index; + this._fileInfo = currentFileInfo; + this.copyVisibilityInfo(visibilityInfo); + this.setParent(this.combinator, this); + }; + Element.prototype = Object.assign(new Node(), { + type: 'Element', + accept: function (visitor) { var value = this.value; this.combinator = visitor.visit(this.combinator); if (typeof value === 'object') { this.value = visitor.visit(value); } - }; - Element.prototype.eval = function (context) { + }, + eval: function (context) { return new Element(this.combinator, this.value.eval ? this.value.eval(context) : this.value, this.isVariable, this.getIndex(), this.fileInfo(), this.visibilityInfo()); - }; - Element.prototype.clone = function () { + }, + clone: function () { return new Element(this.combinator, this.value, this.isVariable, this.getIndex(), this.fileInfo(), this.visibilityInfo()); - }; - Element.prototype.genCSS = function (context, output) { + }, + genCSS: function (context, output) { output.add(this.toCSS(context), this.fileInfo(), this.getIndex()); - }; - Element.prototype.toCSS = function (context) { + }, + toCSS: function (context) { context = context || {}; var value = this.value; var firstSelector = context.firstSelector; @@ -990,10 +927,43 @@ else { return this.combinator.toCSS(context) + value; } + } + }); + + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + ***************************************************************************** */ + var __assign = function () { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; }; - return Element; - }(Node)); - Element.prototype.type = 'Element'; + return __assign.apply(this, arguments); + }; + function __spreadArrays() { + for (var s = 0, i = 0, il = arguments.length; i < il; i++) + s += arguments[i].length; + for (var r = Array(s), k = 0, i = 0; i < il; i++) + for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) + r[k] = a[j]; + return r; + } var Math$1 = { ALWAYS: 0, @@ -1267,22 +1237,20 @@ return message; }; - var Selector = /** @class */ (function (_super) { - __extends(Selector, _super); - function Selector(elements, extendList, condition, index, currentFileInfo, visibilityInfo) { - var _this = _super.call(this) || this; - _this.extendList = extendList; - _this.condition = condition; - _this.evaldCondition = !condition; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.elements = _this.getElements(elements); - _this.mixinElements_ = undefined; - _this.copyVisibilityInfo(visibilityInfo); - _this.setParent(_this.elements, _this); - return _this; - } - Selector.prototype.accept = function (visitor) { + var Selector = function (elements, extendList, condition, index, currentFileInfo, visibilityInfo) { + this.extendList = extendList; + this.condition = condition; + this.evaldCondition = !condition; + this._index = index; + this._fileInfo = currentFileInfo; + this.elements = this.getElements(elements); + this.mixinElements_ = undefined; + this.copyVisibilityInfo(visibilityInfo); + this.setParent(this.elements, this); + }; + Selector.prototype = Object.assign(new Node(), { + type: 'Selector', + accept: function (visitor) { if (this.elements) { this.elements = visitor.visitArray(this.elements); } @@ -1292,15 +1260,15 @@ if (this.condition) { this.condition = visitor.visit(this.condition); } - }; - Selector.prototype.createDerived = function (elements, extendList, evaldCondition) { + }, + createDerived: function (elements, extendList, evaldCondition) { elements = this.getElements(elements); var newSelector = new Selector(elements, extendList || this.extendList, null, this.getIndex(), this.fileInfo(), this.visibilityInfo()); newSelector.evaldCondition = (evaldCondition != null) ? evaldCondition : this.evaldCondition; newSelector.mediaEmpty = this.mediaEmpty; return newSelector; - }; - Selector.prototype.getElements = function (els) { + }, + getElements: function (els) { if (!els) { return [new Element('', '&', false, this._index, this._fileInfo)]; } @@ -1316,13 +1284,13 @@ }); } return els; - }; - Selector.prototype.createEmptySelectors = function () { + }, + createEmptySelectors: function () { var el = new Element('', '&', false, this._index, this._fileInfo), sels = [new Selector([el], null, null, this._index, this._fileInfo)]; sels[0].mediaEmpty = true; return sels; - }; - Selector.prototype.match = function (other) { + }, + match: function (other) { var elements = this.elements; var len = elements.length; var olen; @@ -1340,8 +1308,8 @@ } } return olen; // return number of matched elements - }; - Selector.prototype.mixinElements = function () { + }, + mixinElements: function () { if (this.mixinElements_) { return this.mixinElements_; } @@ -1357,22 +1325,22 @@ elements = []; } return (this.mixinElements_ = elements); - }; - Selector.prototype.isJustParentSelector = function () { + }, + isJustParentSelector: function () { return !this.mediaEmpty && this.elements.length === 1 && this.elements[0].value === '&' && (this.elements[0].combinator.value === ' ' || this.elements[0].combinator.value === ''); - }; - Selector.prototype.eval = function (context) { + }, + eval: function (context) { var evaldCondition = this.condition && this.condition.eval(context); var elements = this.elements; var extendList = this.extendList; elements = elements && elements.map(function (e) { return e.eval(context); }); extendList = extendList && extendList.map(function (extend) { return extend.eval(context); }); return this.createDerived(elements, extendList, evaldCondition); - }; - Selector.prototype.genCSS = function (context, output) { + }, + genCSS: function (context, output) { var i, element; if ((!context || !context.firstSelector) && this.elements[0].combinator.value === '') { output.add(' ', this.fileInfo(), this.getIndex()); @@ -1381,35 +1349,31 @@ element = this.elements[i]; element.genCSS(context, output); } - }; - Selector.prototype.getIsOutput = function () { + }, + getIsOutput: function () { return this.evaldCondition; - }; - return Selector; - }(Node)); - Selector.prototype.type = 'Selector'; + } + }); - var Value = /** @class */ (function (_super) { - __extends(Value, _super); - function Value(value) { - var _this = _super.call(this) || this; - if (!value) { - throw new Error('Value requires an array argument'); - } - if (!Array.isArray(value)) { - _this.value = [value]; - } - else { - _this.value = value; - } - return _this; + var Value = function (value) { + if (!value) { + throw new Error('Value requires an array argument'); } - Value.prototype.accept = function (visitor) { + if (!Array.isArray(value)) { + this.value = [value]; + } + else { + this.value = value; + } + }; + Value.prototype = Object.assign(new Node(), { + type: 'Value', + accept: function (visitor) { if (this.value) { this.value = visitor.visitArray(this.value); } - }; - Value.prototype.eval = function (context) { + }, + eval: function (context) { if (this.value.length === 1) { return this.value[0].eval(context); } @@ -1418,8 +1382,8 @@ return v.eval(context); })); } - }; - Value.prototype.genCSS = function (context, output) { + }, + genCSS: function (context, output) { var i; for (i = 0; i < this.value.length; i++) { this.value[i].genCSS(context, output); @@ -1427,81 +1391,79 @@ output.add((context && context.compress) ? ',' : ', '); } } - }; - return Value; - }(Node)); - Value.prototype.type = 'Value'; + } + }); - var Keyword = /** @class */ (function (_super) { - __extends(Keyword, _super); - function Keyword(value) { - var _this = _super.call(this) || this; - _this.value = value; - return _this; - } - Keyword.prototype.genCSS = function (context, output) { + var Keyword = function (value) { + this.value = value; + }; + Keyword.prototype = Object.assign(new Node(), { + type: 'Keyword', + genCSS: function (context, output) { if (this.value === '%') { throw { type: 'Syntax', message: 'Invalid % without number' }; } output.add(this.value); - }; - return Keyword; - }(Node)); - Keyword.prototype.type = 'Keyword'; + } + }); Keyword.True = new Keyword('true'); Keyword.False = new Keyword('false'); - var Anonymous = /** @class */ (function (_super) { - __extends(Anonymous, _super); - function Anonymous(value, index, currentFileInfo, mapLines, rulesetLike, visibilityInfo) { - var _this = _super.call(this) || this; - _this.value = value; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.mapLines = mapLines; - _this.rulesetLike = (typeof rulesetLike === 'undefined') ? false : rulesetLike; - _this.allowRoot = true; - _this.copyVisibilityInfo(visibilityInfo); - return _this; - } - Anonymous.prototype.eval = function () { + var Anonymous = function (value, index, currentFileInfo, mapLines, rulesetLike, visibilityInfo) { + this.value = value; + this._index = index; + this._fileInfo = currentFileInfo; + this.mapLines = mapLines; + this.rulesetLike = (typeof rulesetLike === 'undefined') ? false : rulesetLike; + this.allowRoot = true; + this.copyVisibilityInfo(visibilityInfo); + }; + Anonymous.prototype = Object.assign(new Node(), { + type: 'Anonymous', + eval: function () { return new Anonymous(this.value, this._index, this._fileInfo, this.mapLines, this.rulesetLike, this.visibilityInfo()); - }; - Anonymous.prototype.compare = function (other) { + }, + compare: function (other) { return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined; - }; - Anonymous.prototype.isRulesetLike = function () { + }, + isRulesetLike: function () { return this.rulesetLike; - }; - Anonymous.prototype.genCSS = function (context, output) { + }, + genCSS: function (context, output) { this.nodeVisible = Boolean(this.value); if (this.nodeVisible) { output.add(this.value, this._fileInfo, this._index, this.mapLines); } - }; - return Anonymous; - }(Node)); - Anonymous.prototype.type = 'Anonymous'; + } + }); var MATH = Math$1; - var Declaration = /** @class */ (function (_super) { - __extends(Declaration, _super); - function Declaration(name, value, important, merge, index, currentFileInfo, inline, variable) { - var _this = _super.call(this) || this; - _this.name = name; - _this.value = (value instanceof Node) ? value : new Value([value ? new Anonymous(value) : null]); - _this.important = important ? " " + important.trim() : ''; - _this.merge = merge; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.inline = inline || false; - _this.variable = (variable !== undefined) ? variable - : (name.charAt && (name.charAt(0) === '@')); - _this.allowRoot = true; - _this.setParent(_this.value, _this); - return _this; - } - Declaration.prototype.genCSS = function (context, output) { + function evalName(context, name) { + var value = ''; + var i; + var n = name.length; + var output = { add: function (s) { value += s; } }; + for (i = 0; i < n; i++) { + name[i].eval(context).genCSS(context, output); + } + return value; + } + var Declaration = function (name, value, important, merge, index, currentFileInfo, inline, variable) { + this.name = name; + this.value = (value instanceof Node) ? value : new Value([value ? new Anonymous(value) : null]); + this.important = important ? " " + important.trim() : ''; + this.merge = merge; + this._index = index; + this._fileInfo = currentFileInfo; + this.inline = inline || false; + this.variable = (variable !== undefined) ? variable + : (name.charAt && (name.charAt(0) === '@')); + this.allowRoot = true; + this.setParent(this.value, this); + }; + Declaration.prototype = Object.assign(new Node(), { + type: 'Declaration', + genCSS: function (context, output) { output.add(this.name + (context.compress ? ':' : ': '), this.fileInfo(), this.getIndex()); try { this.value.genCSS(context, output); @@ -1512,8 +1474,8 @@ throw e; } output.add(this.important + ((this.inline || (context.lastRule && context.compress)) ? '' : ';'), this._fileInfo, this._index); - }; - Declaration.prototype.eval = function (context) { + }, + eval: function (context) { var mathBypass = false, prevMath, name = this.name, evaldValue, variable = this.variable; if (typeof name !== 'string') { // expand 'primitive' name directly to get @@ -1554,23 +1516,11 @@ context.math = prevMath; } } - }; - Declaration.prototype.makeImportant = function () { + }, + makeImportant: function () { return new Declaration(this.name, this.value, '!important', this.merge, this.getIndex(), this.fileInfo(), this.inline); - }; - return Declaration; - }(Node)); - function evalName(context, name) { - var value = ''; - var i; - var n = name.length; - var output = { add: function (s) { value += s; } }; - for (i = 0; i < n; i++) { - name[i].eval(context).genCSS(context, output); } - return value; - } - Declaration.prototype.type = 'Declaration'; + }); var debugInfo = /** @class */ (function () { function debugInfo(context, ctx, lineSeparator) { @@ -1608,30 +1558,26 @@ return debugInfo; }()); - var Comment = /** @class */ (function (_super) { - __extends(Comment, _super); - function Comment(value, isLineComment, index, currentFileInfo) { - var _this = _super.call(this) || this; - _this.value = value; - _this.isLineComment = isLineComment; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.allowRoot = true; - return _this; - } - Comment.prototype.genCSS = function (context, output) { + var Comment = function (value, isLineComment, index, currentFileInfo) { + this.value = value; + this.isLineComment = isLineComment; + this._index = index; + this._fileInfo = currentFileInfo; + this.allowRoot = true; + }; + Comment.prototype = Object.assign(new Node(), { + type: 'Comment', + genCSS: function (context, output) { if (this.debugInfo) { output.add(debugInfo(context, this), this.fileInfo(), this.getIndex()); } output.add(this.value); - }; - Comment.prototype.isSilent = function (context) { + }, + isSilent: function (context) { var isCompressed = context.compress && this.value[2] !== '!'; return this.isLineComment || isCompressed; - }; - return Comment; - }(Node)); - Comment.prototype.type = 'Comment'; + } + }); var contexts = {}; var copyFromOriginal = function copyFromOriginal(original, destination, propertiesToCopy) { @@ -1831,24 +1777,23 @@ } }; - var Ruleset = /** @class */ (function (_super) { - __extends(Ruleset, _super); - function Ruleset(selectors, rules, strictImports, visibilityInfo) { - var _this = _super.call(this) || this; - _this.selectors = selectors; - _this.rules = rules; - _this._lookups = {}; - _this._variables = null; - _this._properties = null; - _this.strictImports = strictImports; - _this.copyVisibilityInfo(visibilityInfo); - _this.allowRoot = true; - _this.setParent(_this.selectors, _this); - _this.setParent(_this.rules, _this); - return _this; - } - Ruleset.prototype.isRulesetLike = function () { return true; }; - Ruleset.prototype.accept = function (visitor) { + var Ruleset = function (selectors, rules, strictImports, visibilityInfo) { + this.selectors = selectors; + this.rules = rules; + this._lookups = {}; + this._variables = null; + this._properties = null; + this.strictImports = strictImports; + this.copyVisibilityInfo(visibilityInfo); + this.allowRoot = true; + this.setParent(this.selectors, this); + this.setParent(this.rules, this); + }; + Ruleset.prototype = Object.assign(new Node(), { + type: 'Ruleset', + isRuleset: true, + isRulesetLike: function () { return true; }, + accept: function (visitor) { if (this.paths) { this.paths = visitor.visitArray(this.paths, true); } @@ -1858,8 +1803,8 @@ if (this.rules && this.rules.length) { this.rules = visitor.visitArray(this.rules); } - }; - Ruleset.prototype.eval = function (context) { + }, + eval: function (context) { var selectors; var selCnt; var selector; @@ -2016,8 +1961,8 @@ } } return ruleset; - }; - Ruleset.prototype.evalImports = function (context) { + }, + evalImports: function (context) { var rules = this.rules; var i; var importRules; @@ -2037,8 +1982,8 @@ this.resetCache(); } } - }; - Ruleset.prototype.makeImportant = function () { + }, + makeImportant: function () { var result = new Ruleset(this.selectors, this.rules.map(function (r) { if (r.makeImportant) { return r.makeImportant(); @@ -2048,12 +1993,12 @@ } }), this.strictImports, this.visibilityInfo()); return result; - }; - Ruleset.prototype.matchArgs = function (args) { + }, + matchArgs: function (args) { return !args || args.length === 0; - }; + }, // lets you call a css selector with a guard - Ruleset.prototype.matchCondition = function (args, context) { + matchCondition: function (args, context) { var lastSelector = this.selectors[this.selectors.length - 1]; if (!lastSelector.evaldCondition) { return false; @@ -2063,14 +2008,14 @@ return false; } return true; - }; - Ruleset.prototype.resetCache = function () { + }, + resetCache: function () { this._rulesets = null; this._variables = null; this._properties = null; this._lookups = {}; - }; - Ruleset.prototype.variables = function () { + }, + variables: function () { if (!this._variables) { this._variables = !this.rules ? {} : this.rules.reduce(function (hash, r) { if (r instanceof Declaration && r.variable === true) { @@ -2091,8 +2036,8 @@ }, {}); } return this._variables; - }; - Ruleset.prototype.properties = function () { + }, + properties: function () { if (!this._properties) { this._properties = !this.rules ? {} : this.rules.reduce(function (hash, r) { if (r instanceof Declaration && r.variable !== true) { @@ -2110,28 +2055,28 @@ }, {}); } return this._properties; - }; - Ruleset.prototype.variable = function (name) { + }, + variable: function (name) { var decl = this.variables()[name]; if (decl) { return this.parseValue(decl); } - }; - Ruleset.prototype.property = function (name) { + }, + property: function (name) { var decl = this.properties()[name]; if (decl) { return this.parseValue(decl); } - }; - Ruleset.prototype.lastDeclaration = function () { + }, + lastDeclaration: function () { for (var i = this.rules.length; i > 0; i--) { var decl = this.rules[i - 1]; if (decl instanceof Declaration) { return this.parseValue(decl); } } - }; - Ruleset.prototype.parseValue = function (toParse) { + }, + parseValue: function (toParse) { var self = this; function transformDeclaration(decl) { if (decl.value instanceof Anonymous && !decl.parsed) { @@ -2166,8 +2111,8 @@ }); return nodes_1; } - }; - Ruleset.prototype.rulesets = function () { + }, + rulesets: function () { if (!this.rules) { return []; } @@ -2181,8 +2126,8 @@ } } return filtRules; - }; - Ruleset.prototype.prependRule = function (rule) { + }, + prependRule: function (rule) { var rules = this.rules; if (rules) { rules.unshift(rule); @@ -2191,8 +2136,8 @@ this.rules = [rule]; } this.setParent(rule, this); - }; - Ruleset.prototype.find = function (selector, self, filter) { + }, + find: function (selector, self, filter) { self = self || this; var rules = []; var match; @@ -2225,8 +2170,8 @@ }); this._lookups[key] = rules; return rules; - }; - Ruleset.prototype.genCSS = function (context, output) { + }, + genCSS: function (context, output) { var i; var j; var charsetRuleNodes = []; @@ -2324,13 +2269,13 @@ if (!output.isEmpty() && !context.compress && this.firstRoot) { output.add('\n'); } - }; - Ruleset.prototype.joinSelectors = function (paths, context, selectors) { + }, + joinSelectors: function (paths, context, selectors) { for (var s = 0; s < selectors.length; s++) { this.joinSelector(paths, context, selectors[s]); } - }; - Ruleset.prototype.joinSelector = function (paths, context, selector) { + }, + joinSelector: function (paths, context, selector) { function createParenthesis(elementsToPak, originalElement) { var replacementParen, j; if (elementsToPak.length === 0) { @@ -2560,41 +2505,36 @@ for (i = 0; i < newPaths.length; i++) { paths.push(newPaths[i]); } - }; - return Ruleset; - }(Node)); - Ruleset.prototype.type = 'Ruleset'; - Ruleset.prototype.isRuleset = true; + } + }); - var AtRule = /** @class */ (function (_super) { - __extends(AtRule, _super); - function AtRule(name, value, rules, index, currentFileInfo, debugInfo, isRooted, visibilityInfo) { - var _this = _super.call(this) || this; - var i; - _this.name = name; - _this.value = (value instanceof Node) ? value : (value ? new Anonymous(value) : value); - if (rules) { - if (Array.isArray(rules)) { - _this.rules = rules; - } - else { - _this.rules = [rules]; - _this.rules[0].selectors = (new Selector([], null, null, index, currentFileInfo)).createEmptySelectors(); - } - for (i = 0; i < _this.rules.length; i++) { - _this.rules[i].allowImports = true; - } - _this.setParent(_this.rules, _this); + var AtRule = function (name, value, rules, index, currentFileInfo, debugInfo, isRooted, visibilityInfo) { + var i; + this.name = name; + this.value = (value instanceof Node) ? value : (value ? new Anonymous(value) : value); + if (rules) { + if (Array.isArray(rules)) { + this.rules = rules; + } + else { + this.rules = [rules]; + this.rules[0].selectors = (new Selector([], null, null, index, currentFileInfo)).createEmptySelectors(); + } + for (i = 0; i < this.rules.length; i++) { + this.rules[i].allowImports = true; } - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.debugInfo = debugInfo; - _this.isRooted = isRooted || false; - _this.copyVisibilityInfo(visibilityInfo); - _this.allowRoot = true; - return _this; + this.setParent(this.rules, this); } - AtRule.prototype.accept = function (visitor) { + this._index = index; + this._fileInfo = currentFileInfo; + this.debugInfo = debugInfo; + this.isRooted = isRooted || false; + this.copyVisibilityInfo(visibilityInfo); + this.allowRoot = true; + }; + AtRule.prototype = Object.assign(new Node(), { + type: 'AtRule', + accept: function (visitor) { var value = this.value, rules = this.rules; if (rules) { this.rules = visitor.visitArray(rules); @@ -2602,14 +2542,14 @@ if (value) { this.value = visitor.visit(value); } - }; - AtRule.prototype.isRulesetLike = function () { + }, + isRulesetLike: function () { return this.rules || !this.isCharset(); - }; - AtRule.prototype.isCharset = function () { + }, + isCharset: function () { return '@charset' === this.name; - }; - AtRule.prototype.genCSS = function (context, output) { + }, + genCSS: function (context, output) { var value = this.value, rules = this.rules; output.add(this.name, this.fileInfo(), this.getIndex()); if (value) { @@ -2622,8 +2562,8 @@ else { output.add(';'); } - }; - AtRule.prototype.eval = function (context) { + }, + eval: function (context) { var mediaPathBackup, mediaBlocksBackup, value = this.value, rules = this.rules; // media stored inside other atrule should not bubble over it // backpup media bubbling information @@ -2644,26 +2584,26 @@ context.mediaPath = mediaPathBackup; context.mediaBlocks = mediaBlocksBackup; return new AtRule(this.name, value, rules, this.getIndex(), this.fileInfo(), this.debugInfo, this.isRooted, this.visibilityInfo()); - }; - AtRule.prototype.variable = function (name) { + }, + variable: function (name) { if (this.rules) { // assuming that there is only one rule at this point - that is how parser constructs the rule return Ruleset.prototype.variable.call(this.rules[0], name); } - }; - AtRule.prototype.find = function () { + }, + find: function () { if (this.rules) { // assuming that there is only one rule at this point - that is how parser constructs the rule return Ruleset.prototype.find.apply(this.rules[0], arguments); } - }; - AtRule.prototype.rulesets = function () { + }, + rulesets: function () { if (this.rules) { // assuming that there is only one rule at this point - that is how parser constructs the rule return Ruleset.prototype.rulesets.apply(this.rules[0]); } - }; - AtRule.prototype.outputRuleset = function (context, output, rules) { + }, + outputRuleset: function (context, output, rules) { var ruleCnt = rules.length; var i; context.tabLevel = (context.tabLevel | 0) + 1; @@ -2692,53 +2632,45 @@ output.add(tabSetStr + "}"); } context.tabLevel--; - }; - return AtRule; - }(Node)); - AtRule.prototype.type = 'AtRule'; + } + }); - var DetachedRuleset = /** @class */ (function (_super) { - __extends(DetachedRuleset, _super); - function DetachedRuleset(ruleset, frames) { - var _this = _super.call(this) || this; - _this.ruleset = ruleset; - _this.frames = frames; - _this.setParent(_this.ruleset, _this); - return _this; - } - DetachedRuleset.prototype.accept = function (visitor) { + var DetachedRuleset = function (ruleset, frames) { + this.ruleset = ruleset; + this.frames = frames; + this.setParent(this.ruleset, this); + }; + DetachedRuleset.prototype = Object.assign(new Node(), { + type: 'DetachedRuleset', + evalFirst: true, + accept: function (visitor) { this.ruleset = visitor.visit(this.ruleset); - }; - DetachedRuleset.prototype.eval = function (context) { + }, + eval: function (context) { var frames = this.frames || copyArray(context.frames); return new DetachedRuleset(this.ruleset, frames); - }; - DetachedRuleset.prototype.callEval = function (context) { + }, + callEval: function (context) { return this.ruleset.eval(this.frames ? new contexts.Eval(context, this.frames.concat(context.frames)) : context); - }; - return DetachedRuleset; - }(Node)); - DetachedRuleset.prototype.type = 'DetachedRuleset'; - DetachedRuleset.prototype.evalFirst = true; + } + }); - var Unit = /** @class */ (function (_super) { - __extends(Unit, _super); - function Unit(numerator, denominator, backupUnit) { - var _this = _super.call(this) || this; - _this.numerator = numerator ? copyArray(numerator).sort() : []; - _this.denominator = denominator ? copyArray(denominator).sort() : []; - if (backupUnit) { - _this.backupUnit = backupUnit; - } - else if (numerator && numerator.length) { - _this.backupUnit = numerator[0]; - } - return _this; + var Unit = function (numerator, denominator, backupUnit) { + this.numerator = numerator ? copyArray(numerator).sort() : []; + this.denominator = denominator ? copyArray(denominator).sort() : []; + if (backupUnit) { + this.backupUnit = backupUnit; + } + else if (numerator && numerator.length) { + this.backupUnit = numerator[0]; } - Unit.prototype.clone = function () { + }; + Unit.prototype = Object.assign(new Node(), { + type: 'Unit', + clone: function () { return new Unit(copyArray(this.numerator), copyArray(this.denominator), this.backupUnit); - }; - Unit.prototype.genCSS = function (context, output) { + }, + genCSS: function (context, output) { // Dimension checks the unit is singular and throws an error if in strict math mode. var strictUnits = context && context.strictUnits; if (this.numerator.length === 1) { @@ -2750,30 +2682,30 @@ else if (!strictUnits && this.denominator.length) { output.add(this.denominator[0]); } - }; - Unit.prototype.toString = function () { + }, + toString: function () { var i, returnStr = this.numerator.join('*'); for (i = 0; i < this.denominator.length; i++) { returnStr += "/" + this.denominator[i]; } return returnStr; - }; - Unit.prototype.compare = function (other) { + }, + compare: function (other) { return this.is(other.toString()) ? 0 : undefined; - }; - Unit.prototype.is = function (unitString) { + }, + is: function (unitString) { return this.toString().toUpperCase() === unitString.toUpperCase(); - }; - Unit.prototype.isLength = function () { + }, + isLength: function () { return RegExp('^(px|em|ex|ch|rem|in|cm|mm|pc|pt|ex|vw|vh|vmin|vmax)$', 'gi').test(this.toCSS()); - }; - Unit.prototype.isEmpty = function () { + }, + isEmpty: function () { return this.numerator.length === 0 && this.denominator.length === 0; - }; - Unit.prototype.isSingular = function () { + }, + isSingular: function () { return this.numerator.length <= 1 && this.denominator.length === 0; - }; - Unit.prototype.map = function (callback) { + }, + map: function (callback) { var i; for (i = 0; i < this.numerator.length; i++) { this.numerator[i] = callback(this.numerator[i], false); @@ -2781,8 +2713,8 @@ for (i = 0; i < this.denominator.length; i++) { this.denominator[i] = callback(this.denominator[i], true); } - }; - Unit.prototype.usedUnits = function () { + }, + usedUnits: function () { var group; var result = {}; var mapUnit; @@ -2801,8 +2733,8 @@ } } return result; - }; - Unit.prototype.cancel = function () { + }, + cancel: function () { var counter = {}; var atomicUnit; var i; @@ -2833,37 +2765,33 @@ } this.numerator.sort(); this.denominator.sort(); - }; - return Unit; - }(Node)); - Unit.prototype.type = 'Unit'; + } + }); // // A number with a unit // - var Dimension = /** @class */ (function (_super) { - __extends(Dimension, _super); - function Dimension(value, unit) { - var _this = _super.call(this) || this; - _this.value = parseFloat(value); - if (isNaN(_this.value)) { - throw new Error('Dimension is not a number.'); - } - _this.unit = (unit && unit instanceof Unit) ? unit : - new Unit(unit ? [unit] : undefined); - _this.setParent(_this.unit, _this); - return _this; - } - Dimension.prototype.accept = function (visitor) { + var Dimension = function (value, unit) { + this.value = parseFloat(value); + if (isNaN(this.value)) { + throw new Error('Dimension is not a number.'); + } + this.unit = (unit && unit instanceof Unit) ? unit : + new Unit(unit ? [unit] : undefined); + this.setParent(this.unit, this); + }; + Dimension.prototype = Object.assign(new Node(), { + type: 'Dimension', + accept: function (visitor) { this.unit = visitor.visit(this.unit); - }; - Dimension.prototype.eval = function (context) { + }, + eval: function (context) { return this; - }; - Dimension.prototype.toColor = function () { + }, + toColor: function () { return new Color([this.value, this.value, this.value]); - }; - Dimension.prototype.genCSS = function (context, output) { + }, + genCSS: function (context, output) { if ((context && context.strictUnits) && !this.unit.isSingular()) { throw new Error("Multiple units in dimension. Correct the units or use the unit function. Bad unit: " + this.unit.toString()); } @@ -2886,11 +2814,11 @@ } output.add(strValue); this.unit.genCSS(context, output); - }; + }, // In an operation between two Dimensions, // we default to the first Dimension's unit, // so `1px + 2` will yield `3px`. - Dimension.prototype.operate = function (context, op, other) { + operate: function (context, op, other) { /* jshint noempty:false */ var value = this._operate(context, op, this.value, other.value), unit = this.unit.clone(); if (op === '+' || op === '-') { @@ -2920,8 +2848,8 @@ unit.cancel(); } return new Dimension(value, unit); - }; - Dimension.prototype.compare = function (other) { + }, + compare: function (other) { var a, b; if (!(other instanceof Dimension)) { return undefined; @@ -2938,11 +2866,11 @@ } } return Node.numericCompare(a.value, b.value); - }; - Dimension.prototype.unify = function () { + }, + unify: function () { return this.convertTo({ length: 'px', duration: 's', angle: 'rad' }); - }; - Dimension.prototype.convertTo = function (conversions) { + }, + convertTo: function (conversions) { var value = this.value; var unit = this.unit.clone(); var i; @@ -2982,25 +2910,21 @@ } unit.cancel(); return new Dimension(value, unit); - }; - return Dimension; - }(Node)); - Dimension.prototype.type = 'Dimension'; + } + }); var MATH$1 = Math$1; - var Operation = /** @class */ (function (_super) { - __extends(Operation, _super); - function Operation(op, operands, isSpaced) { - var _this = _super.call(this) || this; - _this.op = op.trim(); - _this.operands = operands; - _this.isSpaced = isSpaced; - return _this; - } - Operation.prototype.accept = function (visitor) { + var Operation = function (op, operands, isSpaced) { + this.op = op.trim(); + this.operands = operands; + this.isSpaced = isSpaced; + }; + Operation.prototype = Object.assign(new Node(), { + type: 'Operation', + accept: function (visitor) { this.operands = visitor.visitArray(this.operands); - }; - Operation.prototype.eval = function (context) { + }, + eval: function (context) { var a = this.operands[0].eval(context), b = this.operands[1].eval(context), op; if (context.isMathOn(this.op)) { op = this.op === './' ? '/' : this.op; @@ -3022,8 +2946,8 @@ else { return new Operation(this.op, [a, b], this.isSpaced); } - }; - Operation.prototype.genCSS = function (context, output) { + }, + genCSS: function (context, output) { this.operands[0].genCSS(context, output); if (this.isSpaced) { output.add(' '); @@ -3033,26 +2957,22 @@ output.add(' '); } this.operands[1].genCSS(context, output); - }; - return Operation; - }(Node)); - Operation.prototype.type = 'Operation'; + } + }); - var Expression = /** @class */ (function (_super) { - __extends(Expression, _super); - function Expression(value, noSpacing) { - var _this = _super.call(this) || this; - _this.value = value; - _this.noSpacing = noSpacing; - if (!value) { - throw new Error('Expression requires an array parameter'); - } - return _this; - } - Expression.prototype.accept = function (visitor) { + var Expression = function (value, noSpacing) { + this.value = value; + this.noSpacing = noSpacing; + if (!value) { + throw new Error('Expression requires an array parameter'); + } + }; + Expression.prototype = Object.assign(new Node(), { + type: 'Expression', + accept: function (visitor) { this.value = visitor.visitArray(this.value); - }; - Expression.prototype.eval = function (context) { + }, + eval: function (context) { var returnValue; var mathOn = context.isMathOn(); var inParenthesis = this.parens; @@ -3085,23 +3005,21 @@ returnValue = new Paren(returnValue); } return returnValue; - }; - Expression.prototype.genCSS = function (context, output) { + }, + genCSS: function (context, output) { for (var i = 0; i < this.value.length; i++) { this.value[i].genCSS(context, output); if (!this.noSpacing && i + 1 < this.value.length) { output.add(' '); } } - }; - Expression.prototype.throwAwayComments = function () { + }, + throwAwayComments: function () { this.value = this.value.filter(function (v) { return !(v instanceof Comment); }); - }; - return Expression; - }(Node)); - Expression.prototype.type = 'Expression'; + } + }); var functionCaller = /** @class */ (function () { function functionCaller(name, context, index, currentFileInfo) { @@ -3151,22 +3069,20 @@ // // A function call node. // - var Call = /** @class */ (function (_super) { - __extends(Call, _super); - function Call(name, args, index, currentFileInfo) { - var _this = _super.call(this) || this; - _this.name = name; - _this.args = args; - _this.calc = name === 'calc'; - _this._index = index; - _this._fileInfo = currentFileInfo; - return _this; - } - Call.prototype.accept = function (visitor) { + var Call = function (name, args, index, currentFileInfo) { + this.name = name; + this.args = args; + this.calc = name === 'calc'; + this._index = index; + this._fileInfo = currentFileInfo; + }; + Call.prototype = Object.assign(new Node(), { + type: 'Call', + accept: function (visitor) { if (this.args) { this.args = visitor.visitArray(this.args); } - }; + }, // // When evaluating a function call, // we either find the function in the functionRegistry, @@ -3178,7 +3094,7 @@ // we try to pass a variable to a function, like: `saturate(@color)`. // The function should receive the value, not the variable. // - Call.prototype.eval = function (context) { + eval: function (context) { var _this = this; /** * Turn off math for calc(), and switch back on for evaluating nested functions @@ -3233,8 +3149,8 @@ var args = this.args.map(function (a) { return a.eval(context); }); exitCalc(); return new Call(this.name, args, this.getIndex(), this.fileInfo()); - }; - Call.prototype.genCSS = function (context, output) { + }, + genCSS: function (context, output) { output.add(this.name + "(", this.fileInfo(), this.getIndex()); for (var i = 0; i < this.args.length; i++) { this.args[i].genCSS(context, output); @@ -3243,21 +3159,17 @@ } } output.add(')'); - }; - return Call; - }(Node)); - Call.prototype.type = 'Call'; + } + }); - var Variable = /** @class */ (function (_super) { - __extends(Variable, _super); - function Variable(name, index, currentFileInfo) { - var _this = _super.call(this) || this; - _this.name = name; - _this._index = index; - _this._fileInfo = currentFileInfo; - return _this; - } - Variable.prototype.eval = function (context) { + var Variable = function (name, index, currentFileInfo) { + this.name = name; + this._index = index; + this._fileInfo = currentFileInfo; + }; + Variable.prototype = Object.assign(new Node(), { + type: 'Variable', + eval: function (context) { var variable, name = this.name; if (name.indexOf('@@') === 0) { name = "@" + new Variable(name.slice(1), this.getIndex(), this.fileInfo()).eval(context).value; @@ -3291,8 +3203,8 @@ throw { type: 'Name', message: "variable " + name + " is undefined", filename: this.fileInfo().filename, index: this.getIndex() }; } - }; - Variable.prototype.find = function (obj, fun) { + }, + find: function (obj, fun) { for (var i = 0, r = void 0; i < obj.length; i++) { r = fun.call(obj, obj[i]); if (r) { @@ -3300,21 +3212,17 @@ } } return null; - }; - return Variable; - }(Node)); - Variable.prototype.type = 'Variable'; + } + }); - var Property = /** @class */ (function (_super) { - __extends(Property, _super); - function Property(name, index, currentFileInfo) { - var _this = _super.call(this) || this; - _this.name = name; - _this._index = index; - _this._fileInfo = currentFileInfo; - return _this; - } - Property.prototype.eval = function (context) { + var Property = function (name, index, currentFileInfo) { + this.name = name; + this._index = index; + this._fileInfo = currentFileInfo; + }; + Property.prototype = Object.assign(new Node(), { + type: 'Property', + eval: function (context) { var property; var name = this.name; // TODO: shorten this reference @@ -3350,8 +3258,8 @@ throw { type: 'Name', message: "Property '" + name + "' is undefined", filename: this.currentFileInfo.filename, index: this.index }; } - }; - Property.prototype.find = function (obj, fun) { + }, + find: function (obj, fun) { for (var i = 0, r = void 0; i < obj.length; i++) { r = fun.call(obj, obj[i]); if (r) { @@ -3359,53 +3267,45 @@ } } return null; - }; - return Property; - }(Node)); - Property.prototype.type = 'Property'; + } + }); - var Attribute = /** @class */ (function (_super) { - __extends(Attribute, _super); - function Attribute(key, op, value) { - var _this = _super.call(this) || this; - _this.key = key; - _this.op = op; - _this.value = value; - return _this; - } - Attribute.prototype.eval = function (context) { + var Attribute = function (key, op, value) { + this.key = key; + this.op = op; + this.value = value; + }; + Attribute.prototype = Object.assign(new Node(), { + type: 'Attribute', + eval: function (context) { return new Attribute(this.key.eval ? this.key.eval(context) : this.key, this.op, (this.value && this.value.eval) ? this.value.eval(context) : this.value); - }; - Attribute.prototype.genCSS = function (context, output) { + }, + genCSS: function (context, output) { output.add(this.toCSS(context)); - }; - Attribute.prototype.toCSS = function (context) { + }, + toCSS: function (context) { var value = this.key.toCSS ? this.key.toCSS(context) : this.key; if (this.op) { value += this.op; value += (this.value.toCSS ? this.value.toCSS(context) : this.value); } return "[" + value + "]"; - }; - return Attribute; - }(Node)); - Attribute.prototype.type = 'Attribute'; + } + }); - var Quoted = /** @class */ (function (_super) { - __extends(Quoted, _super); - function Quoted(str, content, escaped, index, currentFileInfo) { - var _this = _super.call(this) || this; - _this.escaped = (escaped == null) ? true : escaped; - _this.value = content || ''; - _this.quote = str.charAt(0); - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.variableRegex = /@\{([\w-]+)\}/g; - _this.propRegex = /\$\{([\w-]+)\}/g; - _this.allowRoot = escaped; - return _this; - } - Quoted.prototype.genCSS = function (context, output) { + var Quoted = function (str, content, escaped, index, currentFileInfo) { + this.escaped = (escaped == null) ? true : escaped; + this.value = content || ''; + this.quote = str.charAt(0); + this._index = index; + this._fileInfo = currentFileInfo; + this.variableRegex = /@\{([\w-]+)\}/g; + this.propRegex = /\$\{([\w-]+)\}/g; + this.allowRoot = escaped; + }; + Quoted.prototype = Object.assign(new Node(), { + type: 'Quoted', + genCSS: function (context, output) { if (!this.escaped) { output.add(this.quote, this.fileInfo(), this.getIndex()); } @@ -3413,11 +3313,11 @@ if (!this.escaped) { output.add(this.quote); } - }; - Quoted.prototype.containsVariables = function () { + }, + containsVariables: function () { return this.value.match(this.variableRegex); - }; - Quoted.prototype.eval = function (context) { + }, + eval: function (context) { var that = this; var value = this.value; var variableReplacement = function (_, name) { @@ -3439,8 +3339,8 @@ value = iterativeReplace(value, this.variableRegex, variableReplacement); value = iterativeReplace(value, this.propRegex, propertyReplacement); return new Quoted(this.quote + value + this.quote, value, this.escaped, this.getIndex(), this.fileInfo()); - }; - Quoted.prototype.compare = function (other) { + }, + compare: function (other) { // when comparing quoted strings allow the quote to differ if (other.type === 'Quoted' && !this.escaped && !other.escaped) { return Node.numericCompare(this.value, other.value); @@ -3448,30 +3348,29 @@ else { return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined; } - }; - return Quoted; - }(Node)); - Quoted.prototype.type = 'Quoted'; + } + }); - var URL = /** @class */ (function (_super) { - __extends(URL, _super); - function URL(val, index, currentFileInfo, isEvald) { - var _this = _super.call(this) || this; - _this.value = val; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.isEvald = isEvald; - return _this; - } - URL.prototype.accept = function (visitor) { + function escapePath(path) { + return path.replace(/[\(\)'"\s]/g, function (match) { return "\\" + match; }); + } + var URL = function (val, index, currentFileInfo, isEvald) { + this.value = val; + this._index = index; + this._fileInfo = currentFileInfo; + this.isEvald = isEvald; + }; + URL.prototype = Object.assign(new Node(), { + type: 'URL', + accept: function (visitor) { this.value = visitor.visit(this.value); - }; - URL.prototype.genCSS = function (context, output) { + }, + genCSS: function (context, output) { output.add('url('); this.value.genCSS(context, output); output.add(')'); - }; - URL.prototype.eval = function (context) { + }, + eval: function (context) { var val = this.value.eval(context); var rootpath; if (!this.isEvald) { @@ -3503,48 +3402,41 @@ } } return new URL(val, this.getIndex(), this.fileInfo(), true); - }; - return URL; - }(Node)); - URL.prototype.type = 'Url'; - function escapePath(path) { - return path.replace(/[\(\)'"\s]/g, function (match) { return "\\" + match; }); - } + } + }); - var Media = /** @class */ (function (_super) { - __extends(Media, _super); - function Media(value, features, index, currentFileInfo, visibilityInfo) { - var _this = _super.call(this) || this; - _this._index = index; - _this._fileInfo = currentFileInfo; - var selectors = (new Selector([], null, null, _this._index, _this._fileInfo)).createEmptySelectors(); - _this.features = new Value(features); - _this.rules = [new Ruleset(selectors, value)]; - _this.rules[0].allowImports = true; - _this.copyVisibilityInfo(visibilityInfo); - _this.allowRoot = true; - _this.setParent(selectors, _this); - _this.setParent(_this.features, _this); - _this.setParent(_this.rules, _this); - return _this; - } - Media.prototype.isRulesetLike = function () { + var Media = function (value, features, index, currentFileInfo, visibilityInfo) { + this._index = index; + this._fileInfo = currentFileInfo; + var selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors(); + this.features = new Value(features); + this.rules = [new Ruleset(selectors, value)]; + this.rules[0].allowImports = true; + this.copyVisibilityInfo(visibilityInfo); + this.allowRoot = true; + this.setParent(selectors, this); + this.setParent(this.features, this); + this.setParent(this.rules, this); + }; + Media.prototype = Object.assign(new AtRule(), { + type: 'Media', + isRulesetLike: function () { return true; - }; - Media.prototype.accept = function (visitor) { + }, + accept: function (visitor) { if (this.features) { this.features = visitor.visit(this.features); } if (this.rules) { this.rules = visitor.visitArray(this.rules); } - }; - Media.prototype.genCSS = function (context, output) { + }, + genCSS: function (context, output) { output.add('@media ', this._fileInfo, this._index); this.features.genCSS(context, output); this.outputRuleset(context, output, this.rules); - }; - Media.prototype.eval = function (context) { + }, + eval: function (context) { if (!context.mediaBlocks) { context.mediaBlocks = []; context.mediaPath = []; @@ -3564,8 +3456,8 @@ context.mediaPath.pop(); return context.mediaPath.length === 0 ? media.evalTop(context) : media.evalNested(context); - }; - Media.prototype.evalTop = function (context) { + }, + evalTop: function (context) { var result = this; // Render all dependent Media blocks. if (context.mediaBlocks.length > 1) { @@ -3578,8 +3470,8 @@ delete context.mediaBlocks; delete context.mediaPath; return result; - }; - Media.prototype.evalNested = function (context) { + }, + evalNested: function (context) { var i; var value; var path = context.mediaPath.concat([this]); @@ -3606,8 +3498,8 @@ this.setParent(this.features, this); // Fake a tree-node that doesn't output anything. return new Ruleset([], []); - }; - Media.prototype.permute = function (arr) { + }, + permute: function (arr) { if (arr.length === 0) { return []; } @@ -3624,17 +3516,15 @@ } return result; } - }; - Media.prototype.bubbleSelectors = function (selectors) { + }, + bubbleSelectors: function (selectors) { if (!selectors) { return; } this.rules = [new Ruleset(copyArray(selectors), [this.rules[0]])]; this.setParent(this.rules, this); - }; - return Media; - }(AtRule)); - Media.prototype.type = 'Media'; + } + }); // // CSS @import node @@ -3648,31 +3538,29 @@ // `import,push`, we also pass it a callback, which it'll call once // the file has been fetched, and parsed. // - var Import = /** @class */ (function (_super) { - __extends(Import, _super); - function Import(path, features, options, index, currentFileInfo, visibilityInfo) { - var _this = _super.call(this) || this; - _this.options = options; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.path = path; - _this.features = features; - _this.allowRoot = true; - if (_this.options.less !== undefined || _this.options.inline) { - _this.css = !_this.options.less || _this.options.inline; - } - else { - var pathValue = _this.getPath(); - if (pathValue && /[#\.\&\?]css([\?;].*)?$/.test(pathValue)) { - _this.css = true; - } + var Import = function (path, features, options, index, currentFileInfo, visibilityInfo) { + this.options = options; + this._index = index; + this._fileInfo = currentFileInfo; + this.path = path; + this.features = features; + this.allowRoot = true; + if (this.options.less !== undefined || this.options.inline) { + this.css = !this.options.less || this.options.inline; + } + else { + var pathValue = this.getPath(); + if (pathValue && /[#\.\&\?]css([\?;].*)?$/.test(pathValue)) { + this.css = true; } - _this.copyVisibilityInfo(visibilityInfo); - _this.setParent(_this.features, _this); - _this.setParent(_this.path, _this); - return _this; } - Import.prototype.accept = function (visitor) { + this.copyVisibilityInfo(visibilityInfo); + this.setParent(this.features, this); + this.setParent(this.path, this); + }; + Import.prototype = Object.assign(new Node(), { + type: 'Import', + accept: function (visitor) { if (this.features) { this.features = visitor.visit(this.features); } @@ -3680,8 +3568,8 @@ if (!this.options.isPlugin && !this.options.inline && this.root) { this.root = visitor.visit(this.root); } - }; - Import.prototype.genCSS = function (context, output) { + }, + genCSS: function (context, output) { if (this.css && this.path._fileInfo.reference === undefined) { output.add('@import ', this._fileInfo, this._index); this.path.genCSS(context, output); @@ -3691,12 +3579,12 @@ } output.add(';'); } - }; - Import.prototype.getPath = function () { + }, + getPath: function () { return (this.path instanceof URL) ? this.path.value.value : this.path.value; - }; - Import.prototype.isVariableImport = function () { + }, + isVariableImport: function () { var path = this.path; if (path instanceof URL) { path = path.value; @@ -3705,15 +3593,15 @@ return path.containsVariables(); } return true; - }; - Import.prototype.evalForImport = function (context) { + }, + evalForImport: function (context) { var path = this.path; if (path instanceof URL) { path = path.value; } return new Import(path.eval(context), this.features, this.options, this._index, this._fileInfo, this.visibilityInfo()); - }; - Import.prototype.evalPath = function (context) { + }, + evalPath: function (context) { var path = this.path.eval(context); var fileInfo = this._fileInfo; if (!(path instanceof URL)) { @@ -3729,8 +3617,8 @@ } } return path; - }; - Import.prototype.eval = function (context) { + }, + eval: function (context) { var result = this.doEval(context); if (this.options.reference || this.blocksVisibility()) { if (result.length || result.length === 0) { @@ -3743,8 +3631,8 @@ } } return result; - }; - Import.prototype.doEval = function (context) { + }, + doEval: function (context) { var ruleset; var registry; var features = this.features && this.features.eval(context); @@ -3794,17 +3682,12 @@ else { return []; } - }; - return Import; - }(Node)); - Import.prototype.type = 'Import'; - - var JsEvalNode = /** @class */ (function (_super) { - __extends(JsEvalNode, _super); - function JsEvalNode() { - return _super !== null && _super.apply(this, arguments) || this; } - JsEvalNode.prototype.evaluateJavaScript = function (expression, context) { + }); + + var JsEvalNode = function () { }; + JsEvalNode.prototype = Object.assign(new Node(), { + evaluateJavaScript: function (expression, context) { var result; var that = this; var evalContext = {}; @@ -3843,29 +3726,26 @@ index: this.getIndex() }; } return result; - }; - JsEvalNode.prototype.jsify = function (obj) { + }, + jsify: function (obj) { if (Array.isArray(obj.value) && (obj.value.length > 1)) { return "[" + obj.value.map(function (v) { return v.toCSS(); }).join(', ') + "]"; } else { return obj.toCSS(); } - }; - return JsEvalNode; - }(Node)); + } + }); - var JavaScript = /** @class */ (function (_super) { - __extends(JavaScript, _super); - function JavaScript(string, escaped, index, currentFileInfo) { - var _this = _super.call(this) || this; - _this.escaped = escaped; - _this.expression = string; - _this._index = index; - _this._fileInfo = currentFileInfo; - return _this; - } - JavaScript.prototype.eval = function (context) { + var JavaScript = function (string, escaped, index, currentFileInfo) { + this.escaped = escaped; + this.expression = string; + this._index = index; + this._fileInfo = currentFileInfo; + }; + JavaScript.prototype = Object.assign(new JsEvalNode(), { + type: 'JavaScript', + eval: function (context) { var result = this.evaluateJavaScript(this.expression, context); var type = typeof result; if (type === 'number' && !isNaN(result)) { @@ -3880,29 +3760,25 @@ else { return new Anonymous(result); } - }; - return JavaScript; - }(JsEvalNode)); - JavaScript.prototype.type = 'JavaScript'; + } + }); - var Assignment = /** @class */ (function (_super) { - __extends(Assignment, _super); - function Assignment(key, val) { - var _this = _super.call(this) || this; - _this.key = key; - _this.value = val; - return _this; - } - Assignment.prototype.accept = function (visitor) { + var Assignment = function (key, val) { + this.key = key; + this.value = val; + }; + Assignment.prototype = Object.assign(new Node(), { + type: 'Assignment', + accept: function (visitor) { this.value = visitor.visit(this.value); - }; - Assignment.prototype.eval = function (context) { + }, + eval: function (context) { if (this.value.eval) { return new Assignment(this.key, this.value.eval(context)); } return this; - }; - Assignment.prototype.genCSS = function (context, output) { + }, + genCSS: function (context, output) { output.add(this.key + "="); if (this.value.genCSS) { this.value.genCSS(context, output); @@ -3910,27 +3786,23 @@ else { output.add(this.value); } - }; - return Assignment; - }(Node)); - Assignment.prototype.type = 'Assignment'; + } + }); - var Condition = /** @class */ (function (_super) { - __extends(Condition, _super); - function Condition(op, l, r, i, negate) { - var _this = _super.call(this) || this; - _this.op = op.trim(); - _this.lvalue = l; - _this.rvalue = r; - _this._index = i; - _this.negate = negate; - return _this; - } - Condition.prototype.accept = function (visitor) { + var Condition = function (op, l, r, i, negate) { + this.op = op.trim(); + this.lvalue = l; + this.rvalue = r; + this._index = i; + this.negate = negate; + }; + Condition.prototype = Object.assign(new Node(), { + type: 'Condition', + accept: function (visitor) { this.lvalue = visitor.visit(this.lvalue); this.rvalue = visitor.visit(this.rvalue); - }; - Condition.prototype.eval = function (context) { + }, + eval: function (context) { var result = (function (op, a, b) { switch (op) { case 'and': return a && b; @@ -3949,79 +3821,67 @@ } })(this.op, this.lvalue.eval(context), this.rvalue.eval(context)); return this.negate ? !result : result; - }; - return Condition; - }(Node)); - Condition.prototype.type = 'Condition'; + } + }); - var UnicodeDescriptor = /** @class */ (function (_super) { - __extends(UnicodeDescriptor, _super); - function UnicodeDescriptor(value) { - var _this = _super.call(this) || this; - _this.value = value; - return _this; - } - return UnicodeDescriptor; - }(Node)); - UnicodeDescriptor.prototype.type = 'UnicodeDescriptor'; + var UnicodeDescriptor = function (value) { + this.value = value; + }; + UnicodeDescriptor.prototype = Object.assign(new Node(), { + type: 'UnicodeDescriptor' + }); - var Negative = /** @class */ (function (_super) { - __extends(Negative, _super); - function Negative(node) { - var _this = _super.call(this) || this; - _this.value = node; - return _this; - } - Negative.prototype.genCSS = function (context, output) { + var Negative = function (node) { + this.value = node; + }; + Negative.prototype = Object.assign(new Node(), { + type: 'Negative', + genCSS: function (context, output) { output.add('-'); this.value.genCSS(context, output); - }; - Negative.prototype.eval = function (context) { + }, + eval: function (context) { if (context.isMathOn()) { return (new Operation('*', [new Dimension(-1), this.value])).eval(context); } return new Negative(this.value.eval(context)); - }; - return Negative; - }(Node)); - Negative.prototype.type = 'Negative'; - - var Extend = /** @class */ (function (_super) { - __extends(Extend, _super); - function Extend(selector, option, index, currentFileInfo, visibilityInfo) { - var _this = _super.call(this) || this; - _this.selector = selector; - _this.option = option; - _this.object_id = Extend.next_id++; - _this.parent_ids = [_this.object_id]; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.copyVisibilityInfo(visibilityInfo); - _this.allowRoot = true; - switch (option) { - case 'all': - _this.allowBefore = true; - _this.allowAfter = true; - break; - default: - _this.allowBefore = false; - _this.allowAfter = false; - break; - } - _this.setParent(_this.selector, _this); - return _this; } - Extend.prototype.accept = function (visitor) { + }); + + var Extend = function (selector, option, index, currentFileInfo, visibilityInfo) { + this.selector = selector; + this.option = option; + this.object_id = Extend.next_id++; + this.parent_ids = [this.object_id]; + this._index = index; + this._fileInfo = currentFileInfo; + this.copyVisibilityInfo(visibilityInfo); + this.allowRoot = true; + switch (option) { + case 'all': + this.allowBefore = true; + this.allowAfter = true; + break; + default: + this.allowBefore = false; + this.allowAfter = false; + break; + } + this.setParent(this.selector, this); + }; + Extend.prototype = Object.assign(new Node(), { + type: 'Extend', + accept: function (visitor) { this.selector = visitor.visit(this.selector); - }; - Extend.prototype.eval = function (context) { + }, + eval: function (context) { return new Extend(this.selector.eval(context), this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo()); - }; - Extend.prototype.clone = function (context) { + }, + clone: function (context) { return new Extend(this.selector, this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo()); - }; + }, // it concatenates (joins) all selectors in selector array - Extend.prototype.findSelfSelectors = function (selectors) { + findSelfSelectors: function (selectors) { var selfElements = [], i, selectorElements; for (i = 0; i < selectors.length; i++) { selectorElements = selectors[i].elements; @@ -4034,23 +3894,19 @@ } this.selfSelectors = [new Selector(selfElements)]; this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo()); - }; - return Extend; - }(Node)); + } + }); Extend.next_id = 0; - Extend.prototype.type = 'Extend'; - var VariableCall = /** @class */ (function (_super) { - __extends(VariableCall, _super); - function VariableCall(variable, index, currentFileInfo) { - var _this = _super.call(this) || this; - _this.variable = variable; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.allowRoot = true; - return _this; - } - VariableCall.prototype.eval = function (context) { + var VariableCall = function (variable, index, currentFileInfo) { + this.variable = variable; + this._index = index; + this._fileInfo = currentFileInfo; + this.allowRoot = true; + }; + VariableCall.prototype = Object.assign(new Node(), { + type: 'VariableCall', + eval: function (context) { var rules; var detachedRuleset = new Variable(this.variable, this.getIndex(), this.fileInfo()).eval(context); var error = new LessError({ message: "Could not evaluate variable call " + this.variable }); @@ -4073,22 +3929,18 @@ return detachedRuleset.callEval(context); } throw error; - }; - return VariableCall; - }(Node)); - VariableCall.prototype.type = 'VariableCall'; + } + }); - var NamespaceValue = /** @class */ (function (_super) { - __extends(NamespaceValue, _super); - function NamespaceValue(ruleCall, lookups, index, fileInfo) { - var _this = _super.call(this) || this; - _this.value = ruleCall; - _this.lookups = lookups; - _this._index = index; - _this._fileInfo = fileInfo; - return _this; - } - NamespaceValue.prototype.eval = function (context) { + var NamespaceValue = function (ruleCall, lookups, index, fileInfo) { + this.value = ruleCall; + this.lookups = lookups; + this._index = index; + this._fileInfo = fileInfo; + }; + NamespaceValue.prototype = Object.assign(new Node(), { + type: 'NamespaceValue', + eval: function (context) { var i, name, rules = this.value.eval(context); for (i = 0; i < this.lookups.length; i++) { name = this.lookups[i]; @@ -4141,40 +3993,37 @@ } } return rules; - }; - return NamespaceValue; - }(Node)); - NamespaceValue.prototype.type = 'NamespaceValue'; - - var Definition = /** @class */ (function (_super) { - __extends(Definition, _super); - function Definition(name, params, rules, condition, variadic, frames, visibilityInfo) { - var _this = _super.call(this) || this; - _this.name = name || 'anonymous mixin'; - _this.selectors = [new Selector([new Element(null, name, false, _this._index, _this._fileInfo)])]; - _this.params = params; - _this.condition = condition; - _this.variadic = variadic; - _this.arity = params.length; - _this.rules = rules; - _this._lookups = {}; - var optionalParameters = []; - _this.required = params.reduce(function (count, p) { - if (!p.name || (p.name && !p.value)) { - return count + 1; - } - else { - optionalParameters.push(p.name); - return count; - } - }, 0); - _this.optionalParameters = optionalParameters; - _this.frames = frames; - _this.copyVisibilityInfo(visibilityInfo); - _this.allowRoot = true; - return _this; } - Definition.prototype.accept = function (visitor) { + }); + + var Definition = function (name, params, rules, condition, variadic, frames, visibilityInfo) { + this.name = name || 'anonymous mixin'; + this.selectors = [new Selector([new Element(null, name, false, this._index, this._fileInfo)])]; + this.params = params; + this.condition = condition; + this.variadic = variadic; + this.arity = params.length; + this.rules = rules; + this._lookups = {}; + var optionalParameters = []; + this.required = params.reduce(function (count, p) { + if (!p.name || (p.name && !p.value)) { + return count + 1; + } + else { + optionalParameters.push(p.name); + return count; + } + }, 0); + this.optionalParameters = optionalParameters; + this.frames = frames; + this.copyVisibilityInfo(visibilityInfo); + this.allowRoot = true; + }; + Definition.prototype = Object.assign(new Ruleset(), { + type: 'MixinDefinition', + evalFirst: true, + accept: function (visitor) { if (this.params && this.params.length) { this.params = visitor.visitArray(this.params); } @@ -4182,8 +4031,8 @@ if (this.condition) { this.condition = visitor.visit(this.condition); } - }; - Definition.prototype.evalParams = function (context, mixinEnv, args, evaldArguments) { + }, + evalParams: function (context, mixinEnv, args, evaldArguments) { /* jshint boss:true */ var frame = new Ruleset(null, null); var varargs; @@ -4270,8 +4119,8 @@ argIndex++; } return frame; - }; - Definition.prototype.makeImportant = function () { + }, + makeImportant: function () { var rules = !this.rules ? this.rules : this.rules.map(function (r) { if (r.makeImportant) { return r.makeImportant(true); @@ -4282,11 +4131,11 @@ }); var result = new Definition(this.name, this.params, rules, this.condition, this.variadic, this.frames); return result; - }; - Definition.prototype.eval = function (context) { + }, + eval: function (context) { return new Definition(this.name, this.params, this.rules, this.condition, this.variadic, this.frames || copyArray(context.frames)); - }; - Definition.prototype.evalCall = function (context, args, important) { + }, + evalCall: function (context, args, important) { var _arguments = []; var mixinFrames = this.frames ? this.frames.concat(context.frames) : context.frames; var frame = this.evalParams(context, new contexts.Eval(context, mixinFrames), args, _arguments); @@ -4301,16 +4150,16 @@ ruleset = ruleset.makeImportant(); } return ruleset; - }; - Definition.prototype.matchCondition = function (args, context) { + }, + matchCondition: function (args, context) { if (this.condition && !this.condition.eval(new contexts.Eval(context, [this.evalParams(context, /* the parameter variables */ new contexts.Eval(context, this.frames ? this.frames.concat(context.frames) : context.frames), args, [])] .concat(this.frames || []) // the parent namespace/mixin frames .concat(context.frames)))) { // the current environment frames return false; } return true; - }; - Definition.prototype.matchArgs = function (args, context) { + }, + matchArgs: function (args, context) { var allArgsCnt = (args && args.length) || 0; var len; var optionalParameters = this.optionalParameters; @@ -4345,34 +4194,29 @@ } } return true; - }; - return Definition; - }(Ruleset)); - Definition.prototype.type = 'MixinDefinition'; - Definition.prototype.evalFirst = true; + } + }); - var MixinCall = /** @class */ (function (_super) { - __extends(MixinCall, _super); - function MixinCall(elements, args, index, currentFileInfo, important) { - var _this = _super.call(this) || this; - _this.selector = new Selector(elements); - _this.arguments = args || []; - _this._index = index; - _this._fileInfo = currentFileInfo; - _this.important = important; - _this.allowRoot = true; - _this.setParent(_this.selector, _this); - return _this; - } - MixinCall.prototype.accept = function (visitor) { + var MixinCall = function (elements, args, index, currentFileInfo, important) { + this.selector = new Selector(elements); + this.arguments = args || []; + this._index = index; + this._fileInfo = currentFileInfo; + this.important = important; + this.allowRoot = true; + this.setParent(this.selector, this); + }; + MixinCall.prototype = Object.assign(new Node(), { + type: 'MixinCall', + accept: function (visitor) { if (this.selector) { this.selector = visitor.visit(this.selector); } if (this.arguments.length) { this.arguments = visitor.visitArray(this.arguments); } - }; - MixinCall.prototype.eval = function (context) { + }, + eval: function (context) { var mixins; var mixin; var mixinPath; @@ -4508,8 +4352,8 @@ else { throw { type: 'Name', message: this.selector.toCSS().trim() + " is undefined", index: this.getIndex(), filename: this.fileInfo().filename }; } - }; - MixinCall.prototype._setVisibilityToReplacement = function (replacement) { + }, + _setVisibilityToReplacement: function (replacement) { var i, rule; if (this.blocksVisibility()) { for (i = 0; i < replacement.length; i++) { @@ -4517,8 +4361,8 @@ rule.addVisibilityBlock(); } } - }; - MixinCall.prototype.format = function (args) { + }, + format: function (args) { return this.selector.toCSS().trim() + "(" + (args ? args.map(function (a) { var argValue = ''; if (a.name) { @@ -4532,10 +4376,8 @@ } return argValue; }).join(', ') : '') + ")"; - }; - return MixinCall; - }(Node)); - MixinCall.prototype.type = 'MixinCall'; + } + }); var tree = { Node: Node, Color: Color, AtRule: AtRule, DetachedRuleset: DetachedRuleset, Operation: Operation, @@ -10633,21 +10475,18 @@ var logger$1; var fileCache = {}; // TODOS - move log somewhere. pathDiff and doing something similar in node. use pathDiff in the other browser file for the initial load - var FileManager = /** @class */ (function (_super) { - __extends(FileManager, _super); - function FileManager() { - return _super !== null && _super.apply(this, arguments) || this; - } - FileManager.prototype.alwaysMakePathsAbsolute = function () { + var FileManager = function () { }; + FileManager.prototype = Object.assign(new AbstractFileManager(), { + alwaysMakePathsAbsolute: function () { return true; - }; - FileManager.prototype.join = function (basePath, laterPath) { + }, + join: function (basePath, laterPath) { if (!basePath) { return laterPath; } return this.extractUrlParts(laterPath, basePath).path; - }; - FileManager.prototype.doXHR = function (url, type, callback, errback) { + }, + doXHR: function (url, type, callback, errback) { var xhr = new XMLHttpRequest(); var async = options.isFileProtocol ? options.fileAsync : true; if (typeof xhr.overrideMimeType === 'function') { @@ -10683,14 +10522,14 @@ else { handleResponse(xhr, callback, errback); } - }; - FileManager.prototype.supports = function () { + }, + supports: function () { return true; - }; - FileManager.prototype.clearFileCache = function () { + }, + clearFileCache: function () { fileCache = {}; - }; - FileManager.prototype.loadFile = function (filename, currentDirectory, options, environment) { + }, + loadFile: function (filename, currentDirectory, options, environment) { // TODO: Add prefix support like less-node? // What about multiple paths? if (currentDirectory && !this.isPathAbsolute(filename)) { @@ -10722,9 +10561,8 @@ reject({ type: 'File', message: "'" + url + "' wasn't found (" + status + ")", href: href }); }); }); - }; - return FileManager; - }(AbstractFileManager)); + } + }); var FM = (function (opts, log) { options = opts; logger$1 = log; @@ -10735,22 +10573,18 @@ /** * Browser Plugin Loader */ - var PluginLoader = /** @class */ (function (_super) { - __extends(PluginLoader, _super); - function PluginLoader(less) { - var _this = _super.call(this) || this; - _this.less = less; - return _this; - // Should we shim this.require for browser? Probably not? - } - PluginLoader.prototype.loadPlugin = function (filename, basePath, context, environment, fileManager) { + var PluginLoader = function (less) { + this.less = less; + // Should we shim this.require for browser? Probably not? + }; + PluginLoader.prototype = Object.assign(new AbstractPluginLoader(), { + loadPlugin: function (filename, basePath, context, environment, fileManager) { return new Promise(function (fulfill, reject) { fileManager.loadFile(filename, basePath, context, environment) .then(fulfill).catch(reject); }); - }; - return PluginLoader; - }(AbstractPluginLoader)); + } + }); var LogListener = (function (less, options) { var logLevel_debug = 4; diff --git a/packages/less/dist/less.min.js b/packages/less/dist/less.min.js index 34348cf92..c54c1d6f4 100644 --- a/packages/less/dist/less.min.js +++ b/packages/less/dist/less.min.js @@ -1,5 +1,5 @@ /** - * Less - Leaner CSS v4.0.1-alpha.0+70e242c5 + * Less - Leaner CSS v4.0.0 * http://lesscss.org * * Copyright (c) 2009-2020, Alexis Sellier @@ -7,5 +7,5 @@ * * @license Apache-2.0 */ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).less=t()}(this,(function(){"use strict";function e(e){return e.replace(/^[a-z-]+:\/+?[^\/]+/,"").replace(/[\?\&]livereload=\w+/,"").replace(/^\//,"").replace(/\.[a-zA-Z]+$/,"").replace(/[^\.\w-]+/g,"-").replace(/\./g,":")}function t(e,t){for(var n in t.dataset)if(t.dataset.hasOwnProperty(n))if("env"===n||"dumpLineNumbers"===n||"rootpath"===n||"errorReporting"===n)e[n]=t.dataset[n];else try{e[n]=JSON.parse(t.dataset[n])}catch(e){}}var n=function(t,n,i){var r=i.href||"",o="less:"+(i.title||e(r)),s=t.getElementById(o),a=!1,l=t.createElement("style");l.setAttribute("type","text/css"),i.media&&l.setAttribute("media",i.media),l.id=o,l.styleSheet||(l.appendChild(t.createTextNode(n)),a=null!==s&&s.childNodes.length>0&&l.childNodes.length>0&&s.firstChild.nodeValue===l.firstChild.nodeValue);var u=t.getElementsByTagName("head")[0];if(null===s||!1===a){var c=i&&i.nextSibling||null;c?c.parentNode.insertBefore(l,c):u.appendChild(l)}if(s&&!1===a&&s.parentNode.removeChild(s),l.styleSheet)try{l.styleSheet.cssText=n}catch(e){throw new Error("Couldn't reassign styleSheet.cssText.")}},i=function(e){var t,n=e.document;return n.currentScript||(t=n.getElementsByTagName("script"))[t.length-1]},r={error:function(e){this._fireEvent("error",e)},warn:function(e){this._fireEvent("warn",e)},info:function(e){this._fireEvent("info",e)},debug:function(e){this._fireEvent("debug",e)},addListener:function(e){this._listeners.push(e)},removeListener:function(e){for(var t=0;t=0;a--){var l=s[a];if(l[o?"supportsSync":"supports"](e,t,n,i))return l}return null},e.prototype.addFileManager=function(e){this.fileManagers.push(e)},e.prototype.clearFileManagers=function(){this.fileManagers=[]},e}(),s={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",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:"#ff00ff",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:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",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:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",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:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},a={length:{m:1,cm:.01,mm:.001,in:.0254,px:.0254/96,pt:.0254/72,pc:.0254/72*12},duration:{s:1,ms:.001},angle:{rad:1/(2*Math.PI),deg:1/360,grad:1/400,turn:1}},l={colors:s,unitConversions:a},u=function(){function e(){this.parent=null,this.visibilityBlocks=void 0,this.nodeVisible=void 0,this.rootNode=null,this.parsed=null;var e=this;Object.defineProperty(this,"currentFileInfo",{get:function(){return e.fileInfo()}}),Object.defineProperty(this,"index",{get:function(){return e.getIndex()}})}return e.prototype.setParent=function(t,n){function i(t){t&&t instanceof e&&(t.parent=n)}Array.isArray(t)?t.forEach(i):i(t)},e.prototype.getIndex=function(){return this._index||this.parent&&this.parent.getIndex()||0},e.prototype.fileInfo=function(){return this._fileInfo||this.parent&&this.parent.fileInfo()||{}},e.prototype.isRulesetLike=function(){return!1},e.prototype.toCSS=function(e){var t=[];return this.genCSS(e,{add:function(e,n,i){t.push(e)},isEmpty:function(){return 0===t.length}}),t.join("")},e.prototype.genCSS=function(e,t){t.add(this.value)},e.prototype.accept=function(e){this.value=e.visit(this.value)},e.prototype.eval=function(){return this},e.prototype._operate=function(e,t,n,i){switch(t){case"+":return n+i;case"-":return n-i;case"*":return n*i;case"/":return n/i}},e.prototype.fround=function(e,t){var n=e&&e.numPrecision;return n?Number((t+2e-16).toFixed(n)):t},e.compare=function(t,n){if(t.compare&&"Quoted"!==n.type&&"Anonymous"!==n.type)return t.compare(n);if(n.compare)return-n.compare(t);if(t.type===n.type){if(t=t.value,n=n.value,!Array.isArray(t))return t===n?0:void 0;if(t.length===n.length){for(var i=0;it?1:void 0},e.prototype.blocksVisibility=function(){return null==this.visibilityBlocks&&(this.visibilityBlocks=0),0!==this.visibilityBlocks},e.prototype.addVisibilityBlock=function(){null==this.visibilityBlocks&&(this.visibilityBlocks=0),this.visibilityBlocks=this.visibilityBlocks+1},e.prototype.removeVisibilityBlock=function(){null==this.visibilityBlocks&&(this.visibilityBlocks=0),this.visibilityBlocks=this.visibilityBlocks-1},e.prototype.ensureVisibility=function(){this.nodeVisible=!0},e.prototype.ensureInvisibility=function(){this.nodeVisible=!1},e.prototype.isVisible=function(){return this.nodeVisible},e.prototype.visibilityInfo=function(){return{visibilityBlocks:this.visibilityBlocks,nodeVisible:this.nodeVisible}},e.prototype.copyVisibilityInfo=function(e){e&&(this.visibilityBlocks=e.visibilityBlocks,this.nodeVisible=e.nodeVisible)},e}(),c=function(e,t){return(c=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};function h(e,t){function n(){this.constructor=e}c(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var f=function(){return(f=Object.assign||function(e){for(var t,n=1,i=arguments.length;n=6?(r.rgb=[],t.match(/.{2}/g).map((function(e,t){t<3?o.rgb.push(parseInt(e,16)):o.alpha=parseInt(e,16)/255}))):(r.rgb=[],t.split("").map((function(e,t){t<3?o.rgb.push(parseInt(e+e,16)):o.alpha=parseInt(e+e,16)/255}))),r.alpha=r.alpha||("number"==typeof n?n:1),void 0!==i&&(r.value=i),r}return h(t,e),t.prototype.luma=function(){var e=this.rgb[0]/255,t=this.rgb[1]/255,n=this.rgb[2]/255;return.2126*(e=e<=.03928?e/12.92:Math.pow((e+.055)/1.055,2.4))+.7152*(t=t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4))+.0722*(n=n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4))},t.prototype.genCSS=function(e,t){t.add(this.toCSS(e))},t.prototype.toCSS=function(e,t){var n,i,r,o=e&&e.compress&&!t,s=[];if(i=this.fround(e,this.alpha),this.value)if(0===this.value.indexOf("rgb"))i<1&&(r="rgba");else{if(0!==this.value.indexOf("hsl"))return this.value;r=i<1?"hsla":"hsl"}else i<1&&(r="rgba");switch(r){case"rgba":s=this.rgb.map((function(e){return v(Math.round(e),255)})).concat(v(i,1));break;case"hsla":s.push(v(i,1));case"hsl":n=this.toHSL(),s=[this.fround(e,n.h),this.fround(e,100*n.s)+"%",this.fround(e,100*n.l)+"%"].concat(s)}if(r)return r+"("+s.join(","+(o?"":" "))+")";if(n=this.toRGB(),o){var a=n.split("");a[1]===a[2]&&a[3]===a[4]&&a[5]===a[6]&&(n="#"+a[1]+a[3]+a[5])}return n},t.prototype.operate=function(e,n,i){for(var r=new Array(3),o=this.alpha*(1-i.alpha)+i.alpha,s=0;s<3;s++)r[s]=this._operate(e,n,this.rgb[s],i.rgb[s]);return new t(r,o)},t.prototype.toRGB=function(){return d(this.rgb)},t.prototype.toHSL=function(){var e,t,n=this.rgb[0]/255,i=this.rgb[1]/255,r=this.rgb[2]/255,o=this.alpha,s=Math.max(n,i,r),a=Math.min(n,i,r),l=(s+a)/2,u=s-a;if(s===a)e=t=0;else{switch(t=l>.5?u/(2-s-a):u/(s+a),s){case n:e=(i-r)/u+(i=0&&"\n"!==t.charAt(n);)r++;return"number"==typeof e&&(i=(t.slice(0,e).match(/\n/g)||"").length),{line:i,column:r}}function k(e){var t,n=e.length,i=new Array(n);for(t=0;t|Function):(\d+):(\d+)/,V=function(e,t,n){Error.call(this);var i=e.filename||n;if(this.message=e.message,this.stack=e.stack,t&&i){var r=t.contents[i],o=C(e.index,r),s=o.line,a=o.column,l=e.call&&C(e.call,r).line,u=r?r.split("\n"):"";if(this.type=e.type||"Syntax",this.filename=i,this.index=e.index,this.line="number"==typeof s?s+1:null,this.column=a,!this.line&&this.stack){var c=this.stack.match(R),h=new Function("a","throw new Error()"),f=0;try{h()}catch(e){var p=e.stack.match(R);f=1-(s=parseInt(p[2]))}c&&(c[2]&&(this.line=parseInt(c[2])+f),c[3]&&(this.column=parseInt(c[3])))}this.callLine=l+1,this.callExtract=u[l],this.extract=[u[this.line-2],u[this.line-1],u[this.line]]}};if(void 0===Object.create){var F=function(){};F.prototype=Error.prototype,V.prototype=new F}else V.prototype=Object.create(Error.prototype);V.prototype.constructor=V,V.prototype.toString=function(e){e=e||{};var t="",n=this.extract||[],i=[],r=function(e){return e};if(e.stylize){var o=typeof e.stylize;if("function"!==o)throw Error("options.stylize should be a function, got a "+o+"!");r=e.stylize}if(null!==this.line){if("string"==typeof n[0]&&i.push(r(this.line-1+" "+n[0],"grey")),"string"==typeof n[1]){var s=this.line+" ";n[1]&&(s+=n[1].slice(0,this.column)+r(r(r(n[1].substr(this.column,1),"bold")+n[1].slice(this.column+1),"red"),"inverse")),i.push(s)}"string"==typeof n[2]&&i.push(r(this.line+1+" "+n[2],"grey")),i=i.join("\n")+r("","reset")+"\n"}return t+=r(this.type+"Error: "+this.message,"red"),this.filename&&(t+=r(" in ","red")+this.filename),this.line&&(t+=r(" on line "+this.line+", column "+(this.column+1)+":","grey")),t+="\n"+i,this.callLine&&(t+=r("from ","red")+(this.filename||"")+"/n",t+=r(this.callLine,"grey")+" "+this.callExtract+"/n"),t};var $=function(e){function t(t,n,i,r,o,s){var a=e.call(this)||this;return a.extendList=n,a.condition=i,a.evaldCondition=!i,a._index=r,a._fileInfo=o,a.elements=a.getElements(t),a.mixinElements_=void 0,a.copyVisibilityInfo(s),a.setParent(a.elements,a),a}return h(t,e),t.prototype.accept=function(e){this.elements&&(this.elements=e.visitArray(this.elements)),this.extendList&&(this.extendList=e.visitArray(this.extendList)),this.condition&&(this.condition=e.visit(this.condition))},t.prototype.createDerived=function(e,n,i){var r=new t(e=this.getElements(e),n||this.extendList,null,this.getIndex(),this.fileInfo(),this.visibilityInfo());return r.evaldCondition=null!=i?i:this.evaldCondition,r.mediaEmpty=this.mediaEmpty,r},t.prototype.getElements=function(e){return e?("string"==typeof e&&this.parse.parseNode(e,["selector"],this._index,this._fileInfo,(function(t,n){if(t)throw new V({index:t.index,message:t.message},this.parse.imports,this._fileInfo.filename);e=n[0].elements})),e):[new b("","&",!1,this._index,this._fileInfo)]},t.prototype.createEmptySelectors=function(){var e=[new t([new b("","&",!1,this._index,this._fileInfo)],null,null,this._index,this._fileInfo)];return e[0].mediaEmpty=!0,e},t.prototype.match=function(e){var t,n,i=this.elements,r=i.length;if(0===(t=(e=e.mixinElements()).length)||rw.PARENS_DIVISION)||this.parensStack&&this.parensStack.length))},j.Eval.prototype.pathRequiresRewrite=function(e){return(this.rewriteUrls===S?J:W)(e)},j.Eval.prototype.rewritePath=function(e,t){var n;return t=t||"",n=this.normalizePath(t+e),J(e)&&W(t)&&!1===J(n)&&(n="./"+n),n},j.Eval.prototype.normalizePath=function(e){var t,n=e.split("/").reverse();for(e=[];0!==n.length;)switch(t=n.pop()){case".":break;case"..":0===e.length||".."===e[e.length-1]?e.push(t):e.pop();break;default:e.push(t)}return e.join("/")};var H=function e(t){return{_data:{},add:function(e,t){e=e.toLowerCase(),this._data.hasOwnProperty(e),this._data[e]=t},addMultiple:function(e){var t=this;Object.keys(e).forEach((function(n){t.add(n,e[n])}))},get:function(e){return this._data[e]||t&&t.get(e)},getLocalFunctions:function(){return this._data},inherit:function(){return e(this)},create:function(t){return e(t)}}}(null),Q={eval:function(){var e=this.value_,t=this.error_;if(t)throw t;if(null!=e)return e?L.True:L.False},value:function(e){this.value_=e},error:function(e){this.error_=e},reset:function(){this.value_=this.error_=null}},K=function(e){function t(t,n,i,r){var o=e.call(this)||this;return o.selectors=t,o.rules=n,o._lookups={},o._variables=null,o._properties=null,o.strictImports=i,o.copyVisibilityInfo(r),o.allowRoot=!0,o.setParent(o.selectors,o),o.setParent(o.rules,o),o}return h(t,e),t.prototype.isRulesetLike=function(){return!0},t.prototype.accept=function(e){this.paths?this.paths=e.visitArray(this.paths,!0):this.selectors&&(this.selectors=e.visitArray(this.selectors)),this.rules&&this.rules.length&&(this.rules=e.visitArray(this.rules))},t.prototype.eval=function(e){var n,i,r,o,s,a=!1;if(this.selectors&&(i=this.selectors.length)){for(n=new Array(i),Q.error({type:"Syntax",message:"it is currently only allowed in parametric mixin guards,"}),o=0;o0;e--){var t=this.rules[e-1];if(t instanceof B)return this.parseValue(t)}},t.prototype.parseValue=function(e){var t=this;function n(e){return e.value instanceof N&&!e.parsed?("string"==typeof e.value.value?this.parse.parseNode(e.value.value,["value","important"],e.value.getIndex(),e.fileInfo(),(function(t,n){t&&(e.parsed=!0),n&&(e.value=n[0],e.important=n[1]||"",e.parsed=!0)})):e.parsed=!0,e):e}if(Array.isArray(e)){var i=[];return e.forEach((function(e){i.push(n.call(t,e))})),i}return n.call(t,e)},t.prototype.rulesets=function(){if(!this.rules)return[];var e,t,n=[],i=this.rules;for(e=0;t=i[e];e++)t.isRuleset&&n.push(t);return n},t.prototype.prependRule=function(e){var t=this.rules;t?t.unshift(e):this.rules=[e],this.setParent(e,this)},t.prototype.find=function(e,t,n){t=t||this;var i,r,o=[],s=e.toCSS();return s in this._lookups?this._lookups[s]:(this.rulesets().forEach((function(s){if(s!==t)for(var a=0;ai){if(!n||n(s)){r=s.find(new $(e.elements.slice(i)),t,n);for(var l=0;l0&&t.add(l),e.firstSelector=!0,s[0].genCSS(e,t),e.firstSelector=!1,i=1;i0?(o=(r=k(e)).pop(),s=i.createDerived(k(o.elements))):s=i.createDerived([]),t.length>0){var a=n.combinator,l=t[0].elements[0];a.emptyOrWhitespace&&!l.combinator.emptyOrWhitespace&&(a=l.combinator),s.elements.push(new b(a,l.value,n.isVariable,n._index,n._fileInfo)),s.elements=s.elements.concat(t[0].elements.slice(1))}if(0!==s.elements.length&&r.push(s),t.length>1){var u=t.slice(1);u=u.map((function(e){return e.createDerived(e.elements,[])})),r=r.concat(u)}return r}function s(e,t,n,i,r){var s;for(s=0;s0?i[i.length-1]=i[i.length-1].createDerived(i[i.length-1].elements.concat(e)):i.push(new $(e));else t.push([new $(e)])}function l(e,t){var n=t.createDerived(t.elements,t.extendList,t.evaldCondition);return n.copyVisibilityInfo(e),n}var u,c;if(!function e(t,n,l){var u,c,h,f,p,v,d,g,y,w,x,S,I=!1;for(f=[],p=[[]],u=0;g=l.elements[u];u++)if("&"!==g.value){var C=(S=void 0,(x=g).value instanceof m&&(S=x.value.value)instanceof $?S:null);if(null!=C){a(f,p);var k,_=[],A=[];for(k=e(_,n,C),I=I||k,h=0;h<_.length;h++){s(p,[r(i(_[h],g),g)],g,l,A)}p=A,f=[]}else f.push(g)}else{for(I=!0,v=[],a(f,p),c=0;c0&&d[0].elements.push(new b(g.combinator,"",g.isVariable,g._index,g._fileInfo)),v.push(d);else for(h=0;h0&&(t.push(p[u]),w=p[u][y-1],p[u][y-1]=w.createDerived(w.elements,l.extendList));return I}(c=[],t,n))if(t.length>0)for(c=[],u=0;u0)for(t=0;t-1e-6&&(i=n.toFixed(20).replace(/0+$/,"")),e&&e.compress){if(0===n&&this.unit.isLength())return void t.add(i);n>0&&n<1&&(i=i.substr(1))}t.add(i),this.unit.genCSS(e,t)},t.prototype.operate=function(e,n,i){var r=this._operate(e,n,this.value,i.value),o=this.unit.clone();if("+"===n||"-"===n)if(0===o.numerator.length&&0===o.denominator.length)o=i.unit.clone(),this.unit.backupUnit&&(o.backupUnit=this.unit.backupUnit);else if(0===i.unit.numerator.length&&0===o.denominator.length);else{if(i=i.convertTo(this.unit.usedUnits()),e.strictUnits&&i.unit.toString()!==o.toString())throw new Error("Incompatible units. Change the units or use the unit function. Bad units: '"+o.toString()+"' and '"+i.unit.toString()+"'.");r=this._operate(e,n,this.value,i.value)}else"*"===n?(o.numerator=o.numerator.concat(i.unit.numerator).sort(),o.denominator=o.denominator.concat(i.unit.denominator).sort(),o.cancel()):"/"===n&&(o.numerator=o.numerator.concat(i.unit.denominator).sort(),o.denominator=o.denominator.concat(i.unit.numerator).sort(),o.cancel());return new t(r,o)},t.prototype.compare=function(e){var n,i;if(e instanceof t){if(this.unit.isEmpty()||e.unit.isEmpty())n=this,i=e;else if(n=this.unify(),i=e.unify(),0!==n.unit.compare(i.unit))return;return u.numericCompare(n.value,i.value)}},t.prototype.unify=function(){return this.convertTo({length:"px",duration:"s",angle:"rad"})},t.prototype.convertTo=function(e){var n,i,r,o,s,l=this.value,u=this.unit.clone(),c={};if("string"==typeof e){for(n in a)a[n].hasOwnProperty(e)&&((c={})[n]=e);e=c}for(i in s=function(e,t){return r.hasOwnProperty(e)?(t?l/=r[e]/r[o]:l*=r[e]/r[o],o):e},e)e.hasOwnProperty(i)&&(o=e[i],r=a[i],u.map(s));return u.cancel(),new t(l,u)},t}(u);ee.prototype.type="Dimension";var te=w,ne=function(e){function t(t,n,i){var r=e.call(this)||this;return r.op=t.trim(),r.operands=n,r.isSpaced=i,r}return h(t,e),t.prototype.accept=function(e){this.operands=e.visitArray(this.operands)},t.prototype.eval=function(e){var n,i=this.operands[0].eval(e),r=this.operands[1].eval(e);if(e.isMathOn(this.op)){if(n="./"===this.op?"/":this.op,i instanceof ee&&r instanceof p&&(i=i.toColor()),r instanceof ee&&i instanceof p&&(r=r.toColor()),!i.operate){if(i instanceof t&&"/"===i.op&&e.math===te.PARENS_DIVISION)return new t(this.op,[i,r],this.isSpaced);throw{type:"Operation",message:"Operation on an invalid type"}}return i.operate(e,n,r)}return new t(this.op,[i,r],this.isSpaced)},t.prototype.genCSS=function(e,t){this.operands[0].genCSS(e,t),this.isSpaced&&t.add(" "),t.add(this.op),this.isSpaced&&t.add(" "),this.operands[1].genCSS(e,t)},t}(u);ne.prototype.type="Operation";var ie=function(e){function t(t,n){var i=e.call(this)||this;if(i.value=t,i.noSpacing=n,!t)throw new Error("Expression requires an array parameter");return i}return h(t,e),t.prototype.accept=function(e){this.value=e.visitArray(this.value)},t.prototype.eval=function(e){var n,i=e.isMathOn(),r=this.parens,o=!1;return r&&e.inParenthesis(),this.value.length>1?n=new t(this.value.map((function(t){return t.eval?t.eval(e):t})),this.noSpacing):1===this.value.length?(!this.value[0].parens||this.value[0].parensInOp||e.inCalc||(o=!0),n=this.value[0].eval(e)):n=this,r&&e.outOfParenthesis(),!this.parens||!this.parensInOp||i||o||n instanceof ee||(n=new m(n)),n},t.prototype.genCSS=function(e,t){for(var n=0;n1){var n=new $([],null,null,this.getIndex(),this.fileInfo()).createEmptySelectors();(t=new K(n,e.mediaBlocks)).multiMedia=!0,t.copyVisibilityInfo(this.visibilityInfo()),this.setParent(t,this)}return delete e.mediaBlocks,delete e.mediaPath,t},t.prototype.evalNested=function(e){var t,n,i=e.mediaPath.concat([this]);for(t=0;t0;t--)e.splice(t,0,new N("and"));return new ie(e)}))),this.setParent(this.features,this),new K([],[])},t.prototype.permute=function(e){if(0===e.length)return[];if(1===e.length)return e[0];for(var t=[],n=this.permute(e.slice(1)),i=0;i1?"["+e.value.map((function(e){return e.toCSS()})).join(", ")+"]":e.toCSS()},t}(u));pe.prototype.type="JavaScript";var ve=function(e){function t(t,n){var i=e.call(this)||this;return i.key=t,i.value=n,i}return h(t,e),t.prototype.accept=function(e){this.value=e.visit(this.value)},t.prototype.eval=function(e){return this.value.eval?new t(this.key,this.value.eval(e)):this},t.prototype.genCSS=function(e,t){t.add(this.key+"="),this.value.genCSS?this.value.genCSS(e,t):t.add(this.value)},t}(u);ve.prototype.type="Assignment";var de=function(e){function t(t,n,i,r,o){var s=e.call(this)||this;return s.op=t.trim(),s.lvalue=n,s.rvalue=i,s._index=r,s.negate=o,s}return h(t,e),t.prototype.accept=function(e){this.lvalue=e.visit(this.lvalue),this.rvalue=e.visit(this.rvalue)},t.prototype.eval=function(e){var t=function(e,t,n){switch(e){case"and":return t&&n;case"or":return t||n;default:switch(u.compare(t,n)){case-1:return"<"===e||"=<"===e||"<="===e;case 0:return"="===e||">="===e||"=<"===e||"<="===e;case 1:return">"===e||">="===e;default:return!1}}}(this.op,this.lvalue.eval(e),this.rvalue.eval(e));return this.negate?!t:t},t}(u);de.prototype.type="Condition";var me=function(e){function t(t){var n=e.call(this)||this;return n.value=t,n}return h(t,e),t}(u);me.prototype.type="UnicodeDescriptor";var ge=function(e){function t(t){var n=e.call(this)||this;return n.value=t,n}return h(t,e),t.prototype.genCSS=function(e,t){t.add("-"),this.value.genCSS(e,t)},t.prototype.eval=function(e){return e.isMathOn()?new ne("*",[new ee(-1),this.value]).eval(e):new t(this.value.eval(e))},t}(u);ge.prototype.type="Negative";var ye=function(e){function t(n,i,r,o,s){var a=e.call(this)||this;switch(a.selector=n,a.option=i,a.object_id=t.next_id++,a.parent_ids=[a.object_id],a._index=r,a._fileInfo=o,a.copyVisibilityInfo(s),a.allowRoot=!0,i){case"all":a.allowBefore=!0,a.allowAfter=!0;break;default:a.allowBefore=!1,a.allowAfter=!1}return a.setParent(a.selector,a),a}return h(t,e),t.prototype.accept=function(e){this.selector=e.visit(this.selector)},t.prototype.eval=function(e){return new t(this.selector.eval(e),this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},t.prototype.clone=function(e){return new t(this.selector,this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},t.prototype.findSelfSelectors=function(e){var t,n,i=[];for(t=0;t0&&n.length&&""===n[0].combinator.value&&(n[0].combinator.value=" "),i=i.concat(e[t].elements);this.selfSelectors=[new $(i)],this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo())},t}(u);ye.next_id=0,ye.prototype.type="Extend";var be=function(e){function t(t,n,i){var r=e.call(this)||this;return r.variable=t,r._index=n,r._fileInfo=i,r.allowRoot=!0,r}return h(t,e),t.prototype.eval=function(e){var t,n=new se(this.variable,this.getIndex(),this.fileInfo()).eval(e),i=new V({message:"Could not evaluate variable call "+this.variable});if(!n.ruleset){if(n.rules)t=n;else if(Array.isArray(n))t=new K("",n);else{if(!Array.isArray(n.value))throw i;t=new K("",n.value)}n=new X(t)}if(n.ruleset)return n.callEval(e);throw i},t}(u);be.prototype.type="VariableCall";var we=function(e){function t(t,n,i,r){var o=e.call(this)||this;return o.value=t,o.lookups=n,o._index=i,o._fileInfo=r,o}return h(t,e),t.prototype.eval=function(e){var t,n,i=this.value.eval(e);for(t=0;tthis.params.length)return!1}n=Math.min(o,this.arity);for(var s=0;s0){for(c=!0,a=0;a0)f=2;else if(f=1,p[1]+p[2]>1)throw{type:"Runtime",message:"Ambiguous use of `default()` found when matching for `"+this.format(m)+"`",index:this.getIndex(),filename:this.fileInfo().filename};for(a=0;a0&&(e=e.slice(0,t)),(t=e.lastIndexOf("/"))<0&&(t=e.lastIndexOf("\\")),t<0?"":e.slice(0,t+1)},e.prototype.tryAppendExtension=function(e,t){return/(\.[a-z]*$)|([\?;].*)$/.test(e)?e:e+t},e.prototype.tryAppendLessExtension=function(e){return this.tryAppendExtension(e,".less")},e.prototype.supportsSync=function(){return!1},e.prototype.alwaysMakePathsAbsolute=function(){return!1},e.prototype.isPathAbsolute=function(e){return/^(?:[a-z-]+:|\/|\\|#)/i.test(e)},e.prototype.join=function(e,t){return e?e+t:t},e.prototype.pathDiff=function(e,t){var n,i,r,o,s=this.extractUrlParts(e),a=this.extractUrlParts(t),l="";if(s.hostPart!==a.hostPart)return"";for(i=Math.max(a.directories.length,s.directories.length),n=0;nparseInt(t[n])?-1:1;return 0},e.prototype.versionToString=function(e){for(var t="",n=0;n0;){var e=this.imports[0];if(!e.isReady)return;this.imports=this.imports.slice(1),e.callback.apply(null,e.args)}if(0===this.variableImports.length)break;var t=this.variableImports[0];this.variableImports=this.variableImports.slice(1),t()}}finally{this._currentDepth--}0===this._currentDepth&&this._onSequencerEmpty&&this._onSequencerEmpty()},e}(),Re=function(e,t){this._visitor=new Ee(this),this._importer=e,this._finish=t,this.context=new j.Eval,this.importCount=0,this.onceFileDetectionMap={},this.recursionDetector={},this._sequencer=new Pe(this._onSequencerEmpty.bind(this))};Re.prototype={isReplacing:!1,run:function(e){try{this._visitor.visit(e)}catch(e){this.error=e}this.isFinished=!0,this._sequencer.tryRun()},_onSequencerEmpty:function(){this.isFinished&&this._finish(this.error)},visitImport:function(e,t){var n=e.options.inline;if(!e.css||n){var i=new j.Eval(this.context,k(this.context.frames)),r=i.frames[0];this.importCount++,e.isVariableImport()?this._sequencer.addVariableImport(this.processImportNode.bind(this,e,i,r)):this.processImportNode(e,i,r)}t.visitDeeper=!1},processImportNode:function(e,t,n){var i,r=e.options.inline;try{i=e.evalForImport(t)}catch(t){t.filename||(t.index=e.getIndex(),t.filename=e.fileInfo().filename),e.css=!0,e.error=t}if(!i||i.css&&!r)this.importCount--,this.isFinished&&this._sequencer.tryRun();else{i.options.multiple&&(t.importMultiple=!0);for(var o=void 0===i.css,s=0;s=0||(a=[u.selfSelectors[0]],(o=f.findMatch(l,a)).length&&(l.hasFoundMatches=!0,l.selfSelectors.forEach((function(e){var t=u.visibilityInfo();s=f.extendSelector(o,a,e,l.isVisible()),(c=new Ie.Extend(u.selector,u.option,0,u.fileInfo(),t)).selfSelectors=s,s[s.length-1].extendList=[c],h.push(c),c.ruleset=u.ruleset,c.parent_ids=c.parent_ids.concat(u.parent_ids,l.parent_ids),u.firstExtendOnThisSelectorPath&&(c.firstExtendOnThisSelectorPath=!0,u.ruleset.paths.push(s))}))));if(h.length){if(this.extendChainCount++,n>100){var p="{unable to calculate}",v="{unable to calculate}";try{p=h[0].selfSelectors[0].toCSS(),v=h[0].selector.toCSS()}catch(e){}throw{message:"extend circular reference detected. One of the circular extends is currently:"+p+":extend("+v+")"}}return h.concat(f.doExtendChaining(h,t,n+1))}return h},e.prototype.visitDeclaration=function(e,t){t.visitDeeper=!1},e.prototype.visitMixinDefinition=function(e,t){t.visitDeeper=!1},e.prototype.visitSelector=function(e,t){t.visitDeeper=!1},e.prototype.visitRuleset=function(e,t){if(!e.root){var n,i,r,o,s=this.allExtendsStack[this.allExtendsStack.length-1],a=[],l=this;for(r=0;r0&&u[l.matched].combinator.value!==s?l=null:l.matched++,l&&(l.finished=l.matched===u.length,l.finished&&!e.allowAfter&&(r+1u&&c>0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[u].elements.slice(c)),c=0,u++),l=o.elements.slice(c,a.index).concat([s]).concat(n.elements.slice(1)),u===a.pathIndex&&r>0?h[h.length-1].elements=h[h.length-1].elements.concat(l):(h=h.concat(t.slice(u,a.pathIndex))).push(new Ie.Selector(l)),u=a.endPathIndex,(c=a.endPathElementIndex)>=t[u].elements.length&&(c=0,u++);return u0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[u].elements.slice(c)),u++),h=(h=h.concat(t.slice(u,t.length))).map((function(e){var t=e.createDerived(e.elements);return i?t.ensureVisibility():t.ensureInvisibility(),t}))},e.prototype.visitMedia=function(e,t){var n=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);n=n.concat(this.doExtendChaining(n,e.allExtends)),this.allExtendsStack.push(n)},e.prototype.visitMediaOut=function(e){var t=this.allExtendsStack.length-1;this.allExtendsStack.length=t},e.prototype.visitAtRule=function(e,t){var n=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);n=n.concat(this.doExtendChaining(n,e.allExtends)),this.allExtendsStack.push(n)},e.prototype.visitAtRuleOut=function(e){var t=this.allExtendsStack.length-1;this.allExtendsStack.length=t},e}(),Oe=function(){function e(){this.contexts=[[]],this._visitor=new Ee(this)}return e.prototype.run=function(e){return this._visitor.visit(e)},e.prototype.visitDeclaration=function(e,t){t.visitDeeper=!1},e.prototype.visitMixinDefinition=function(e,t){t.visitDeeper=!1},e.prototype.visitRuleset=function(e,t){var n,i=this.contexts[this.contexts.length-1],r=[];this.contexts.push(r),e.root||((n=e.selectors)&&(n=n.filter((function(e){return e.getIsOutput()})),e.selectors=n.length?n:n=null,n&&e.joinSelectors(r,i,n)),n||(e.rules=null),e.paths=r)},e.prototype.visitRulesetOut=function(e){this.contexts.length=this.contexts.length-1},e.prototype.visitMedia=function(e,t){var n=this.contexts[this.contexts.length-1];e.rules[0].root=0===n.length||n[0].multiMedia},e.prototype.visitAtRule=function(e,t){var n=this.contexts[this.contexts.length-1];e.rules&&e.rules.length&&(e.rules[0].root=e.isRooted||0===n.length||null)},e}(),Le=function(){function e(e){this._visitor=new Ee(this),this._context=e}return e.prototype.containsSilentNonBlockedChild=function(e){var t;if(!e)return!1;for(var n=0;n0},e.prototype.resolveVisibility=function(e,t){if(!e.blocksVisibility()){if(this.isEmpty(e)&&!this.containsSilentNonBlockedChild(t))return;return e}var n=e.rules[0];if(this.keepOnlyVisibleChilds(n),!this.isEmpty(n))return e.ensureVisibility(),e.removeVisibilityBlock(),e},e.prototype.isVisibleRuleset=function(e){return!!e.firstRoot||!this.isEmpty(e)&&!(!e.root&&!this.hasVisibleSelector(e))},e}(),Ne=function(e){this._visitor=new Ee(this),this._context=e,this.utils=new Le(e)};Ne.prototype={isReplacing:!0,run:function(e){return this._visitor.visit(e)},visitDeclaration:function(e,t){if(!e.blocksVisibility()&&!e.variable)return e},visitMixinDefinition:function(e,t){e.frames=[]},visitExtend:function(e,t){},visitComment:function(e,t){if(!e.blocksVisibility()&&!e.isSilent(this._context))return e},visitMedia:function(e,t){var n=e.rules[0].rules;return e.accept(this._visitor),t.visitDeeper=!1,this.utils.resolveVisibility(e,n)},visitImport:function(e,t){if(!e.blocksVisibility())return e},visitAtRule:function(e,t){return e.rules&&e.rules.length?this.visitAtRuleWithBody(e,t):this.visitAtRuleWithoutBody(e,t)},visitAnonymous:function(e,t){if(!e.blocksVisibility())return e.accept(this._visitor),e},visitAtRuleWithBody:function(e,t){var n=function(e){var t=e.rules;return function(e){var t=e.rules;return 1===t.length&&(!t[0].paths||0===t[0].paths.length)}(e)?t[0].rules:t}(e);return e.accept(this._visitor),t.visitDeeper=!1,this.utils.isEmpty(e)||this._mergeRules(e.rules[0].rules),this.utils.resolveVisibility(e,n)},visitAtRuleWithoutBody:function(e,t){if(!e.blocksVisibility()){if("@charset"===e.name){if(this.charset){if(e.debugInfo){var n=new Ie.Comment("/* "+e.toCSS(this._context).replace(/\n/g,"")+" */\n");return n.debugInfo=e.debugInfo,this._visitor.visit(n)}return}this.charset=!0}return e}},checkValidNodes:function(e,t){if(e)for(var n=0;n0?e.accept(this._visitor):e.rules=null,t.visitDeeper=!1}return e.rules&&(this._mergeRules(e.rules),this._removeDuplicateRules(e.rules)),this.utils.isVisibleRuleset(e)&&(e.ensureVisibility(),i.splice(0,0,e)),1===i.length?i[0]:i},_compileRulesetPaths:function(e){e.paths&&(e.paths=e.paths.filter((function(e){var t;for(" "===e[0].elements[0].combinator.value&&(e[0].elements[0].combinator=new Ie.Combinator("")),t=0;t=0;i--)if((n=e[i])instanceof Ie.Declaration)if(r[n.name]){(t=r[n.name])instanceof Ie.Declaration&&(t=r[n.name]=[r[n.name].toCSS(this._context)]);var o=n.toCSS(this._context);-1!==t.indexOf(o)?e.splice(i,1):t.push(o)}else r[n.name]=n}},_mergeRules:function(e){if(e){for(var t={},n=[],i=0;i0){var t=e[0],n=[],i=[new Ie.Expression(n)];e.forEach((function(e){"+"===e.merge&&n.length>0&&i.push(new Ie.Expression(n=[])),n.push(e.value),t.important=t.important||e.important})),t.value=new Ie.Value(i)}}))}}};var De={Visitor:Ee,ImportVisitor:Re,MarkVisibleSelectorsVisitor:Ve,ExtendVisitor:$e,JoinSelectorVisitor:Oe,ToCSSVisitor:Ne};var Be=function(){var e,t,n,i,r,o,s,a=[],l={};function u(n){for(var i,a,c,h=l.i,f=t,p=l.i-s,v=l.i+o.length-p,d=l.i+=n,m=e;l.i=0){c={index:l.i,text:m.substr(l.i,y+2-l.i),isLineComment:!1},l.i+=c.text.length-1,l.commentStore.push(c);continue}}break}if(32!==i&&10!==i&&9!==i&&13!==i)break}if(o=o.slice(n+l.i-d+p),s=l.i,!o.length){if(tn||l.i===n&&e&&!i)&&(n=l.i,i=e);var r=a.pop();o=r.current,s=l.i=r.i,t=r.j},l.forget=function(){a.pop()},l.isWhitespace=function(t){var n=l.i+(t||0),i=e.charCodeAt(n);return 32===i||13===i||9===i||10===i},l.$re=function(e){l.i>s&&(o=o.slice(l.i-s),s=l.i);var t=e.exec(o);return t?(u(t[0].length),"string"==typeof t?t:1===t.length?t[0]:t):null},l.$char=function(t){return e.charAt(l.i)!==t?null:(u(1),t)},l.$str=function(t){for(var n=t.length,i=0;ih&&(d=!1)}}while(d);return r||null},l.autoCommentAbsorb=!0,l.commentStore=[],l.finished=!1,l.peek=function(t){if("string"==typeof t){for(var n=0;n57||t<43||47===t||44===t},l.start=function(i,a,c){e=i,l.i=t=s=n=0,r=a?function(e,t){var n,i,r,o,s,a,l,u,c,h=e.length,f=0,p=0,v=[],d=0;function m(t){var n=s-d;n<512&&!t||!n||(v.push(e.slice(d,s+1)),d=s+1)}for(s=0;s=97&&l<=122||l<34))switch(l){case 40:p++,i=s;continue;case 41:if(--p<0)return t("missing opening `(`",s);continue;case 59:p||m();continue;case 123:f++,n=s;continue;case 125:if(--f<0)return t("missing opening `{`",s);f||p||m();continue;case 92:if(s96)){if(u==l){c=1;break}if(92==u){if(s==h-1)return t("unescaped `\\`",s);s++}}if(c)continue;return t("unmatched `"+String.fromCharCode(l)+"`",a);case 47:if(p||s==h-1)continue;if(47==(u=e.charCodeAt(s+1)))for(s+=2;sn&&o>r?"missing closing `}` or `*/`":"missing closing `}`",n):0!==p?t("missing closing `)`",i):(m(!0),v)}(i,c):[i],o=r[0],u(0)},l.end=function(){var t,r=l.i>=e.length;return l.i=e.length-1,furthestChar:e[l.i]}},l},Ue=function e(t,n,i){var r,o=Be();function s(e,t){throw new V({index:o.i,filename:i.filename,type:t||"Syntax",message:e},n)}function a(e,t){var n=e instanceof Function?e.call(r):o.$re(e);if(n)return n;s(t||("string"==typeof e?"expected '"+e+"' got '"+o.currentChar()+"'":"unexpected token"))}function l(e,t){if(o.$char(e))return e;s(t||"expected '"+e+"' got '"+o.currentChar()+"'")}function u(e){var t=i.filename;return{lineNumber:C(e,o.getInput()).line+1,fileName:t}}return{parserInput:o,imports:n,fileInfo:i,parseNode:function(e,t,i,s,a){var l,u=[],c=o;try{c.start(e,!1,(function(e,t){a({message:e,index:t+i})}));for(var h=0,f=void 0,p=void 0;f=t[h];h++)if(p=c.i,l=r[f]()){try{l._index=p+i,l._fileInfo=s}catch(e){}u.push(l)}else u.push(null);c.end().isFinished?a(null,u):a(!0,null)}catch(e){throw new V({index:e.index+i,message:e.message},n,s.filename)}},parse:function(r,s,a){var l,u,c,h,f=null,p="";if(u=a&&a.globalVars?e.serializeVars(a.globalVars)+"\n":"",c=a&&a.modifyVars?"\n"+e.serializeVars(a.modifyVars):"",t.pluginManager)for(var v=t.pluginManager.getPreProcessors(),d=0;d");return e},args:function(e){var t,n,i,a,l,u,c,h=r.entities,f={args:null,variadic:!1},p=[],v=[],d=[],m=!0;for(o.save();;){if(e)u=r.detachedRuleset()||r.expression();else{if(o.commentStore.length=0,o.$str("...")){f.variadic=!0,o.$char(";")&&!t&&(t=!0),(t?v:d).push({variadic:!0});break}u=h.variable()||h.property()||h.literal()||h.keyword()||this.call(!0)}if(!u||!m)break;a=null,u.throwAwayComments&&u.throwAwayComments(),l=u;var g=null;if(e?u.value&&1==u.value.length&&(g=u.value[0]):g=u,g&&(g instanceof Ie.Variable||g instanceof Ie.Property))if(o.$char(":")){if(p.length>0&&(t&&s("Cannot mix ; and , as delimiter types"),n=!0),!(l=r.detachedRuleset()||r.expression())){if(!e)return o.restore(),f.args=[],f;s("could not understand value for named argument")}a=i=g.name}else if(o.$str("...")){if(!e){f.variadic=!0,o.$char(";")&&!t&&(t=!0),(t?v:d).push({name:u.name,variadic:!0});break}c=!0}else e||(i=a=g.name,l=null);l&&p.push(l),d.push({name:a,value:l,expand:c}),o.$char(",")?m=!0:((m=";"===o.$char(";"))||t)&&(n&&s("Cannot mix ; and , as delimiter types"),t=!0,p.length>1&&(l=new Ie.Value(p)),v.push({name:i,value:l,expand:c}),i=null,p=[],n=!1)}return o.forget(),f.args=t?v:d,f},definition:function(){var e,t,n,i,s=[],l=!1;if(!("."!==o.currentChar()&&"#"!==o.currentChar()||o.peek(/^[^{]*\}/)))if(o.save(),t=o.$re(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/)){e=t[1];var u=this.args(!1);if(s=u.args,l=u.variadic,!o.$char(")"))return void o.restore("Missing closing ')'");if(o.commentStore.length=0,o.$str("when")&&(i=a(r.conditions,"expected condition")),n=r.block())return o.forget(),new Ie.mixin.Definition(e,s,n,i,l);o.restore()}else o.restore()},ruleLookups:function(){var e,t=[];if("["===o.currentChar()){for(;;){if(o.save(),!(e=this.lookupValue())&&""!==e){o.restore();break}t.push(e),o.forget()}return t.length>0?t:void 0}},lookupValue:function(){if(o.save(),o.$char("[")){var e=o.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);if(o.$char("]"))return e||""===e?(o.forget(),e):void o.restore();o.restore()}else o.restore()}},entity:function(){var e=this.entities;return this.comment()||e.literal()||e.variable()||e.url()||e.property()||e.call()||e.keyword()||this.mixin.call(!0)||e.javascript()},end:function(){return o.$char(";")||o.peek("}")},ieAlpha:function(){var e;if(o.$re(/^opacity=/i))return(e=o.$re(/^\d+/))||(e="@{"+(e=a(r.entities.variable,"Could not parse alpha")).name.slice(1)+"}"),l(")"),new Ie.Quoted("","alpha(opacity="+e+")")},element:function(){var e,t,n,r=o.i;if(t=this.combinator(),(e=o.$re(/^(?:\d+\.\d+|\d+)%/)||o.$re(/^(?:[.#]?|:*)(?:[\w-]|[^\x00-\x9f]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/)||o.$char("*")||o.$char("&")||this.attribute()||o.$re(/^\([^&()@]+\)/)||o.$re(/^[\.#:](?=@)/)||this.entities.variableCurly())||(o.save(),o.$char("(")?(n=this.selector(!1))&&o.$char(")")?(e=new Ie.Paren(n),o.forget()):o.restore("Missing closing ')'"):o.forget()),e)return new Ie.Element(t,e,e instanceof Ie.Variable,r,i)},combinator:function(){var e=o.currentChar();if("/"===e){o.save();var t=o.$re(/^\/[a-z]+\//i);if(t)return o.forget(),new Ie.Combinator(t);o.restore()}if(">"===e||"+"===e||"~"===e||"|"===e||"^"===e){for(o.i++,"^"===e&&"^"===o.currentChar()&&(e="^^",o.i++);o.isWhitespace();)o.i++;return new Ie.Combinator(e)}return o.isWhitespace(-1)?new Ie.Combinator(" "):new Ie.Combinator(null)},selector:function(e){var t,n,r,l,u,c,h,f=o.i;for(e=!1!==e;(e&&(n=this.extend())||e&&(c=o.$str("when"))||(l=this.element()))&&(c?h=a(this.conditions,"expected condition"):h?s("CSS guard can only be used at the end of selector"):n?u=u?u.concat(n):n:(u&&s("Extend can only be used at the end of selector"),r=o.currentChar(),t?t.push(l):t=[l],l=null),"{"!==r&&"}"!==r&&";"!==r&&","!==r&&")"!==r););if(t)return new Ie.Selector(t,u,h,f,i);u&&s("Extend must be used to extend a selector, it cannot be used on its own")},selectors:function(){for(var e,t;(e=this.selector())&&(t?t.push(e):t=[e],o.commentStore.length=0,e.condition&&t.length>1&&s("Guards are only currently allowed on a single selector."),o.$char(","));)e.condition&&s("Guards are only currently allowed on a single selector."),o.commentStore.length=0;return t},attribute:function(){if(o.$char("[")){var e,t,n,i=this.entities;return(e=i.variableCurly())||(e=a(/^(?:[_A-Za-z0-9-\*]*\|)?(?:[_A-Za-z0-9-]|\\.)+/)),(n=o.$re(/^[|~*$^]?=/))&&(t=i.quoted()||o.$re(/^[0-9]+%/)||o.$re(/^[\w-]+/)||i.variableCurly()),l("]"),new Ie.Attribute(e,n,t)}},block:function(){var e;if(o.$char("{")&&(e=this.primary())&&o.$char("}"))return e},blockRuleset:function(){var e=this.block();return e&&(e=new Ie.Ruleset(null,e)),e},detachedRuleset:function(){var e,t,n;if(o.save(),!o.$re(/^[.#]\(/)||(t=(e=this.mixin.args(!1)).args,n=e.variadic,o.$char(")"))){var i=this.blockRuleset();if(i)return o.forget(),t?new Ie.mixin.Definition(null,t,i,null,n):new Ie.DetachedRuleset(i);o.restore()}else o.restore()},ruleset:function(){var e,n,i;if(o.save(),t.dumpLineNumbers&&(i=u(o.i)),(e=this.selectors())&&(n=this.block())){o.forget();var r=new Ie.Ruleset(e,n,t.strictImports);return t.dumpLineNumbers&&(r.debugInfo=i),r}o.restore()},declaration:function(){var e,t,n,r,s,a,l=o.i,u=o.currentChar();if("."!==u&&"#"!==u&&"&"!==u&&":"!==u)if(o.save(),e=this.variable()||this.ruleProperty()){if((a="string"==typeof e)&&(t=this.detachedRuleset())&&(n=!0),o.commentStore.length=0,!t){if(s=!a&&e.length>1&&e.pop().value,t=e[0].value&&"--"===e[0].value.slice(0,2)?this.permissiveValue():this.anonymousValue())return o.forget(),new Ie.Declaration(e,t,!1,s,l,i);t||(t=this.value()),t?r=this.important():a&&(t=this.permissiveValue())}if(t&&(this.end()||n))return o.forget(),new Ie.Declaration(e,t,r,s,l,i);o.restore()}else o.restore()},anonymousValue:function(){var e=o.i,t=o.$re(/^([^.#@\$+\/'"*`(;{}-]*);/);if(t)return new Ie.Anonymous(t[1],e)},permissiveValue:function(e){var t,n,r,a,l=e||";",u=o.i,c=[];function h(){var e=o.currentChar();return"string"==typeof l?e===l:l.test(e)}if(!h()){a=[];do{((n=this.comment())||(n=this.entity()))&&a.push(n)}while(n);if(r=h(),a.length>0){if(a=new Ie.Expression(a),r)return a;c.push(a)," "===o.prevChar()&&c.push(new Ie.Anonymous(" ",u))}if(o.save(),a=o.$parseUntil(l)){if("string"==typeof a&&s("Expected '"+a+"'","Parse"),1===a.length&&" "===a[0])return o.forget(),new Ie.Anonymous("",u);var f=void 0;for(t=0;t0)return new Ie.Expression(r)},mediaFeatures:function(){var e,t=this.entities,n=[];do{if(e=this.mediaFeature()){if(n.push(e),!o.$char(","))break}else if((e=t.variable()||t.mixinLookup())&&(n.push(e),!o.$char(",")))break}while(e);return n.length>0?n:null},media:function(){var e,n,r,a,l=o.i;if(t.dumpLineNumbers&&(a=u(l)),o.save(),o.$str("@media"))return e=this.mediaFeatures(),(n=this.block())||s("media definitions require block statements after any features"),o.forget(),r=new Ie.Media(n,e,l,i),t.dumpLineNumbers&&(r.debugInfo=a),r;o.restore()},plugin:function(){var e,t,n,r=o.i;if(o.$re(/^@plugin?\s+/)){if(n=(t=this.pluginArgs())?{pluginArgs:t,isPlugin:!0}:{isPlugin:!0},e=this.entities.quoted()||this.entities.url())return o.$char(";")||(o.i=r,s("missing semi-colon on @plugin")),new Ie.Import(e,null,n,r,i);o.i=r,s("malformed @plugin statement")}},pluginArgs:function(){if(o.save(),!o.$char("("))return o.restore(),null;var e=o.$re(/^\s*([^\);]+)\)\s*/);return e[1]?(o.forget(),e[1].trim()):(o.restore(),null)},atrule:function(){var e,n,r,a,l,c,h,f=o.i,p=!0,v=!0;if("@"===o.currentChar()){if(n=this.import()||this.plugin()||this.media())return n;if(o.save(),e=o.$re(/^@[a-z-]+/)){switch(a=e,"-"==e.charAt(1)&&e.indexOf("-",2)>0&&(a="@"+e.slice(e.indexOf("-",2)+1)),a){case"@charset":l=!0,p=!1;break;case"@namespace":c=!0,p=!1;break;case"@keyframes":case"@counter-style":l=!0;break;case"@document":case"@supports":h=!0,v=!1;break;default:h=!0}if(o.commentStore.length=0,l?(n=this.entity())||s("expected "+e+" identifier"):c?(n=this.expression())||s("expected "+e+" expression"):h&&(n=this.permissiveValue(/^[{;]/),p="{"===o.currentChar(),n?n.value||(n=null):p||";"===o.currentChar()||s(e+" rule is missing block or ending semi-colon")),p&&(r=this.blockRuleset()),r||!p&&n&&o.$char(";"))return o.forget(),new Ie.AtRule(e,n,r,f,i,t.dumpLineNumbers?u(f):null,v);o.restore("at-rule options not recognised")}}},value:function(){var e,t=[],n=o.i;do{if((e=this.expression())&&(t.push(e),!o.$char(",")))break}while(e);if(t.length>0)return new Ie.Value(t,n)},important:function(){if("!"===o.currentChar())return o.$re(/^! *important/)},sub:function(){var e,t;if(o.save(),o.$char("("))return(e=this.addition())&&o.$char(")")?(o.forget(),(t=new Ie.Expression([e])).parens=!0,t):void o.restore("Expected ')'");o.restore()},multiplication:function(){var e,t,n,i,r;if(e=this.operand()){for(r=o.isWhitespace(-1);!o.peek(/^\/[*\/]/);){if(o.save(),!(n=o.$char("/")||o.$char("*")||o.$str("./"))){o.forget();break}if(!(t=this.operand())){o.restore();break}o.forget(),e.parensInOp=!0,t.parensInOp=!0,i=new Ie.Operation(n,[i||e,t],r),r=o.isWhitespace(-1)}return i||e}},addition:function(){var e,t,n,i,r;if(e=this.multiplication()){for(r=o.isWhitespace(-1);(n=o.$re(/^[-+]\s+/)||!r&&(o.$char("+")||o.$char("-")))&&(t=this.multiplication());)e.parensInOp=!0,t.parensInOp=!0,i=new Ie.Operation(n,[i||e,t],r),r=o.isWhitespace(-1);return i||e}},conditions:function(){var e,t,n,i=o.i;if(e=this.condition(!0)){for(;o.peek(/^,\s*(not\s*)?\(/)&&o.$char(",")&&(t=this.condition(!0));)n=new Ie.Condition("or",n||e,t,i);return n||e}},condition:function(e){var t,n,i;if(t=this.conditionAnd(e)){if(n=o.$str("or")){if(!(i=this.condition(e)))return;t=new Ie.Condition(n,t,i)}return t}},conditionAnd:function(e){var t,n,i,r,s=this;if(t=(r=s.negatedCondition(e)||s.parenthesisCondition(e))||e?r:s.atomicCondition(e)){if(n=o.$str("and")){if(!(i=this.conditionAnd(e)))return;t=new Ie.Condition(n,t,i)}return t}},negatedCondition:function(e){if(o.$str("not")){var t=this.parenthesisCondition(e);return t&&(t.negate=!t.negate),t}},parenthesisCondition:function(e){var t;if(o.save(),o.$str("(")){if(t=function(t){var n;if(o.save(),n=t.condition(e)){if(o.$char(")"))return o.forget(),n;o.restore()}else o.restore()}(this))return o.forget(),t;if(t=this.atomicCondition(e)){if(o.$char(")"))return o.forget(),t;o.restore("expected ')' got '"+o.currentChar()+"'")}else o.restore()}else o.restore()},atomicCondition:function(e){var t,n,i,r,a=this.entities,l=o.i;function u(){return this.addition()||a.keyword()||a.quoted()||a.mixinLookup()}if(t=(u=u.bind(this))())return o.$char(">")?r=o.$char("=")?">=":">":o.$char("<")?r=o.$char("=")?"<=":"<":o.$char("=")&&(r=o.$char(">")?"=>":o.$char("<")?"=<":"="),r?(n=u())?i=new Ie.Condition(r,t,n,l,!1):s("expected expression"):i=new Ie.Condition("=",t,new Ie.Keyword("true"),l,!1),i},operand:function(){var e,t=this.entities;o.peek(/^-[@\$\(]/)&&(e=o.$char("-"));var n=this.sub()||t.dimension()||t.color()||t.variable()||t.property()||t.call()||t.quoted(!0)||t.colorKeyword()||t.mixinLookup();return e&&(n.parensInOp=!0,n=new Ie.Negative(n)),n},expression:function(){var e,t,n=[],i=o.i;do{(e=this.comment())?n.push(e):((e=this.addition()||this.entity())instanceof Ie.Comment&&(e=null),e&&(n.push(e),o.peek(/^\/[\/*]/)||(t=o.$char("/"))&&n.push(new Ie.Anonymous(t,i))))}while(e);if(n.length>0)return new Ie.Expression(n)},property:function(){var e=o.$re(/^(\*?-?[_a-zA-Z0-9-]+)\s*:/);if(e)return e[1]},ruleProperty:function(){var e,t,n=[],r=[];o.save();var s=o.$re(/^([_a-zA-Z0-9-]+)\s*:/);if(s)return n=[new Ie.Keyword(s[1])],o.forget(),n;function a(e){var t=o.i,i=o.$re(e);if(i)return r.push(t),n.push(i[1])}for(a(/^(\*?)/);a(/^((?:[\w-]+)|(?:[@\$]\{[\w-]+\}))/););if(n.length>1&&a(/^((?:\+_|\+)?)\s*:/)){for(o.forget(),""===n[0]&&(n.shift(),r.shift()),t=0;t1?e-1:e)<1?r+(o-r)*e*6:2*e<1?o:3*e<2?r+(o-r)*(2/3-e)*6:r}e=He(e)%360/360,t=ze(He(t)),n=ze(He(n)),i=ze(He(i)),r=2*n-(o=n<=.5?n*(t+1):n+t-n*t);var a=[255*s(e+1/3),255*s(e),255*s(e-1/3)];return i=He(i),new p(a,i,"hsla")}catch(e){}},hsv:function(e,t,n){return je.hsva(e,t,n,1)},hsva:function(e,t,n,i){var r,o;e=He(e)%360/360*360,t=He(t),n=He(n),i=He(i);var s=[n,n*(1-t),n*(1-(o=e/60-(r=Math.floor(e/60%6)))*t),n*(1-(1-o)*t)],a=[[0,3,1],[2,0,1],[1,0,3],[1,2,0],[3,1,0],[0,1,2]];return je.rgba(255*s[a[r][0]],255*s[a[r][1]],255*s[a[r][2]],i)},hue:function(e){return new ee(We(e).h)},saturation:function(e){return new ee(100*We(e).s,"%")},lightness:function(e){return new ee(100*We(e).l,"%")},hsvhue:function(e){return new ee(Je(e).h)},hsvsaturation:function(e){return new ee(100*Je(e).s,"%")},hsvvalue:function(e){return new ee(100*Je(e).v,"%")},red:function(e){return new ee(e.rgb[0])},green:function(e){return new ee(e.rgb[1])},blue:function(e){return new ee(e.rgb[2])},alpha:function(e){return new ee(We(e).a)},luma:function(e){return new ee(e.luma()*e.alpha*100,"%")},luminance:function(e){var t=.2126*e.rgb[0]/255+.7152*e.rgb[1]/255+.0722*e.rgb[2]/255;return new ee(t*e.alpha*100,"%")},saturate:function(e,t,n){if(!e.rgb)return null;var i=We(e);return void 0!==n&&"relative"===n.value?i.s+=i.s*t.value/100:i.s+=t.value/100,i.s=ze(i.s),Ge(e,i)},desaturate:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.s-=i.s*t.value/100:i.s-=t.value/100,i.s=ze(i.s),Ge(e,i)},lighten:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.l+=i.l*t.value/100:i.l+=t.value/100,i.l=ze(i.l),Ge(e,i)},darken:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.l-=i.l*t.value/100:i.l-=t.value/100,i.l=ze(i.l),Ge(e,i)},fadein:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.a+=i.a*t.value/100:i.a+=t.value/100,i.a=ze(i.a),Ge(e,i)},fadeout:function(e,t,n){var i=We(e);return void 0!==n&&"relative"===n.value?i.a-=i.a*t.value/100:i.a-=t.value/100,i.a=ze(i.a),Ge(e,i)},fade:function(e,t){var n=We(e);return n.a=t.value/100,n.a=ze(n.a),Ge(e,n)},spin:function(e,t){var n=We(e),i=(n.h+t.value)%360;return n.h=i<0?360+i:i,Ge(e,n)},mix:function(e,t,n){n||(n=new ee(50));var i=n.value/100,r=2*i-1,o=We(e).a-We(t).a,s=((r*o==-1?r:(r+o)/(1+r*o))+1)/2,a=1-s,l=[e.rgb[0]*s+t.rgb[0]*a,e.rgb[1]*s+t.rgb[1]*a,e.rgb[2]*s+t.rgb[2]*a],u=e.alpha*i+t.alpha*(1-i);return new p(l,u)},greyscale:function(e){return je.desaturate(e,new ee(100))},contrast:function(e,t,n,i){if(!e.rgb)return null;if(void 0===n&&(n=je.rgba(255,255,255,1)),void 0===t&&(t=je.rgba(0,0,0,1)),t.luma()>n.luma()){var r=n;n=t,t=r}return i=void 0===i?.43:He(i),e.luma().5&&(i=1,n=e>.25?Math.sqrt(e):((16*e-12)*e+4)*e),e-(1-2*t)*i*(n-e)},hardlight:function(e,t){return Ze.overlay(t,e)},difference:function(e,t){return Math.abs(e-t)},exclusion:function(e,t){return e+t-2*e*t},average:function(e,t){return(e+t)/2},negation:function(e,t){return 1-Math.abs(e+t-1)}};for(var Xe in Ze)Ze.hasOwnProperty(Xe)&&(Ke[Xe]=Ke.bind(null,Ze[Xe]));var Ye=function(e){return Array.isArray(e.value)?e.value:Array(e)},et={_SELF:function(e){return e},"~":function(){for(var e=[],t=0;ts.value)&&(c[i]=r);else{if(void 0!==l&&a!==l)throw{type:"Argument",message:"incompatible types"};h[a]=c.length,c.push(r)}else Array.isArray(t[n].value)&&Array.prototype.push.apply(t,Array.prototype.slice.call(t[n].value));return 1==c.length?c[0]:(t=c.map((function(e){return e.toCSS(this.context)})).join(this.context.compress?",":", "),new N((e?"min":"max")+"("+t+")"))},ot={min:function(){for(var e=[],t=0;t",r=0;r";return i+="',i=encodeURIComponent(i),new ce(new ue("'"+(i="data:image/svg+xml,"+i)+"'",i,!1,this.index,this.currentFileInfo),this.index,this.currentFileInfo)}}),H.addMultiple(ut),t};function ht(e,t){var n,i=(t=t||{}).variables,r=new j.Eval(t);"object"!=typeof i||Array.isArray(i)||(i=Object.keys(i).map((function(e){var t=i[e];return t instanceof Ie.Value||(t instanceof Ie.Expression||(t=new Ie.Expression([t])),t=new Ie.Value([t])),new Ie.Declaration("@"+e,t,!1,null,0)})),r.frames=[new Ie.Ruleset(null,i)]);var o,s,a=[new De.JoinSelectorVisitor,new De.MarkVisibleSelectorsVisitor(!0),new De.ExtendVisitor,new De.ToCSSVisitor({compress:Boolean(t.compress)})],l=[];if(t.pluginManager){s=t.pluginManager.visitor();for(var u=0;u<2;u++)for(s.first();o=s.get();)o.isPreEvalVisitor?0!==u&&-1!==l.indexOf(o)||(l.push(o),o.run(e)):0!==u&&-1!==a.indexOf(o)||(o.isPreVisitor?a.unshift(o):a.push(o))}n=e.eval(r);for(u=0;u=t);n++);this.preProcessors.splice(n,0,{preProcessor:e,priority:t})},e.prototype.addPostProcessor=function(e,t){var n;for(n=0;n=t);n++);this.postProcessors.splice(n,0,{postProcessor:e,priority:t})},e.prototype.addFileManager=function(e){this.fileManagers.push(e)},e.prototype.getPreProcessors=function(){for(var e=[],t=0;t0){var i=void 0,r=JSON.stringify(this._sourceMapGenerator.toJSON());this.sourceMapURL?i=this.sourceMapURL:this._sourceMapFilename&&(i=this._sourceMapFilename),this.sourceMapURL=i,this.sourceMap=r}return this._css.join("")},t}()}(e=new o(e,t)),e)),a=function(e){return function(){function t(e,t,n){this.less=e,this.rootFilename=n.filename,this.paths=t.paths||[],this.contents={},this.contentsIgnoredChars={},this.mime=t.mime,this.error=null,this.context=t,this.queue=[],this.files={}}return t.prototype.push=function(t,n,i,o,s){var a=this,l=this.context.pluginManager.Loader;this.queue.push(t);var u=function(e,n,i){a.queue.splice(a.queue.indexOf(t),1);var l=i===a.rootFilename;o.optional&&e?(s(null,{rules:[]},!1,null),r.info("The file "+i+" was skipped because it was not found and the import was marked optional.")):(a.files[i]||o.inline||(a.files[i]={root:n,options:o}),e&&!a.error&&(a.error=e),s(e,n,l,i))},c={rewriteUrls:this.context.rewriteUrls,entryPath:i.entryPath,rootpath:i.rootpath,rootFilename:i.rootFilename},h=e.getFileManager(t,i.currentDirectory,this.context,e);if(h){var f,p,v=function(e){var t,n=e.filename,r=e.contents.replace(/^\uFEFF/,"");c.currentDirectory=h.getPath(n),c.rewriteUrls&&(c.rootpath=h.join(a.context.rootpath||"",h.pathDiff(c.currentDirectory,c.entryPath)),!h.isPathAbsolute(c.rootpath)&&h.alwaysMakePathsAbsolute()&&(c.rootpath=h.join(c.entryPath,c.rootpath))),c.filename=n;var s=new j.Parse(a.context);s.processImports=!1,a.contents[n]=r,(i.reference||o.reference)&&(c.reference=!0),o.isPlugin?(t=l.evalPlugin(r,s,a,o.pluginArgs,c))instanceof V?u(t,null,n):u(null,t,n):o.inline?u(null,r,n):!a.files[n]||a.files[n].options.multiple||o.multiple?new Ue(s,a,c).parse(r,(function(e,t){u(e,t,n)})):u(null,a.files[n].root,n)},d=_(this.context);n&&(d.ext=o.isPlugin?".js":".less"),o.isPlugin?(d.mime="application/javascript",d.syncImport?f=l.loadPluginSync(t,i.currentDirectory,d,e,h):p=l.loadPlugin(t,i.currentDirectory,d,e,h)):d.syncImport?f=h.loadFileSync(t,i.currentDirectory,d,e):p=h.loadFile(t,i.currentDirectory,d,e,(function(e,t){e?u(e):v(t)})),f?f.filename?v(f):u(f):p&&p.then(v,u)}else u({message:"Could not find a file-manager for "+t})},t}()}(e);var u,c=function(e,t,n){var i=function(e,n,r){if("function"==typeof n?(r=n,n=M(this.options,{})):n=M(this.options,n||{}),!r){var o=this;return new Promise((function(t,r){i.call(o,e,n,(function(e,n){e?r(e):t(n)}))}))}this.parse(e,n,(function(e,n,i,o){if(e)return r(e);var s;try{s=new t(n,i).toCSS(o)}catch(e){return r(e)}r(null,s)}))};return i}(0,s),h=function(e,t,n){var i=function(e,t,r){if("function"==typeof t?(r=t,t=M(this.options,{})):t=M(this.options,t||{}),!r){var o=this;return new Promise((function(n,r){i.call(o,e,t,(function(e,t){e?r(e):n(t)}))}))}var s,a=void 0,l=new mt(this,!t.reUsePluginManager);if(t.pluginManager=l,s=new j.Parse(t),t.rootFileInfo)a=t.rootFileInfo;else{var u=t.filename||"input",c=u.replace(/[^\/\\]*$/,"");(a={filename:u,rewriteUrls:s.rewriteUrls,rootpath:s.rootpath||"",currentDirectory:c,entryPath:c,rootFilename:u}).rootpath&&"/"!==a.rootpath.slice(-1)&&(a.rootpath+="/")}var h=new n(this,s,a);this.importManager=h,t.plugins&&t.plugins.forEach((function(e){var t,n;if(e.fileContent){if(n=e.fileContent.replace(/^\uFEFF/,""),(t=l.Loader.evalPlugin(n,s,h,e.options,e.filename))instanceof V)return r(t)}else l.addPlugin(e)})),new Ue(s,h,a).parse(e,(function(e,n){if(e)return r(e);r(null,n,h,t)}),t)};return i}(0,0,a),f={version:[4,0,0],data:l,tree:Ie,Environment:o,AbstractFileManager:Ce,AbstractPluginLoader:ke,environment:e,visitors:De,Parser:Ue,functions:ct(e),contexts:j,SourceMapOutput:n,SourceMapBuilder:i,ParseTree:s,ImportManager:a,render:c,parse:h,LessError:V,transformTree:ht,utils:P,PluginManager:mt,logger:r},p=function(e){return function(){var t=Object.create(e.prototype);return e.apply(t,Array.prototype.slice.call(arguments,0)),t}},v=Object.create(f);for(var d in f.tree)if("function"==typeof(u=f.tree[d]))v[d.toLowerCase()]=p(u);else for(var m in v[d]=Object.create(null),u)v[d][m.toLowerCase()]=p(u[m]);return f.parse=f.parse.bind(v),f.render=f.render.bind(v),v}var yt={},bt=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return h(t,e),t.prototype.alwaysMakePathsAbsolute=function(){return!0},t.prototype.join=function(e,t){return e?this.extractUrlParts(t,e).path:t},t.prototype.doXHR=function(e,t,n,i){var r=new XMLHttpRequest,o=!pt.isFileProtocol||pt.fileAsync;function s(t,n,i){t.status>=200&&t.status<300?n(t.responseText,t.getResponseHeader("Last-Modified")):"function"==typeof i&&i(t.status,e)}"function"==typeof r.overrideMimeType&&r.overrideMimeType("text/css"),vt.debug("XHR: Getting '"+e+"'"),r.open("GET",e,o),r.setRequestHeader("Accept",t||"text/x-less, text/css; q=0.9, */*; q=0.5"),r.send(null),pt.isFileProtocol&&!pt.fileAsync?0===r.status||r.status>=200&&r.status<300?n(r.responseText):i(r.status,e):o?r.onreadystatechange=function(){4==r.readyState&&s(r,n,i)}:s(r,n,i)},t.prototype.supports=function(){return!0},t.prototype.clearFileCache=function(){yt={}},t.prototype.loadFile=function(e,t,n,i){t&&!this.isPathAbsolute(e)&&(e=t+e),e=n.ext?this.tryAppendExtension(e,n.ext):e,n=n||{};var r=this.extractUrlParts(e,window.location.href).url,o=this;return new Promise((function(e,t){if(n.useFileCache&&yt[r])try{var i=yt[r];return e({contents:i,filename:r,webInfo:{lastModified:new Date}})}catch(e){return t({filename:r,message:"Error loading file "+r+" error was "+e.message})}o.doXHR(r,n.mime,(function(t,n){yt[r]=t,e({contents:t,filename:r,webInfo:{lastModified:n}})}),(function(e,n){t({type:"File",message:"'"+n+"' wasn't found ("+e+")",href:r})}))}))},t}(Ce),wt=function(e,t){return pt=e,vt=t,bt},xt=function(e){function t(t){var n=e.call(this)||this;return n.less=t,n}return h(t,e),t.prototype.loadPlugin=function(e,t,n,i,r){return new Promise((function(o,s){r.loadFile(e,t,n,i).then(o).catch(s)}))},t}(ke),St=function(t,i,r){return{add:function(o,s){r.errorReporting&&"html"!==r.errorReporting?"console"===r.errorReporting?function(e,t){var n=e.filename||t,o=[],s=(e.type||"Syntax")+"Error: "+(e.message||"There is an error in your .less file")+" in "+n,a=function(e,t,n){void 0!==e.extract[t]&&o.push("{line} {content}".replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,n).replace(/\{content\}/,e.extract[t]))};e.line&&(a(e,0,""),a(e,1,"line"),a(e,2,""),s+=" on line "+e.line+", column "+(e.column+1)+":\n"+o.join("\n")),e.stack&&(e.extract||r.logLevel>=4)&&(s+="\nStack Trace\n"+e.stack),i.logger.error(s)}(o,s):"function"==typeof r.errorReporting&&r.errorReporting("add",o,s):function(i,o){var s,a,l="less-error-message:"+e(o||""),u=t.document.createElement("div"),c=[],h=i.filename||o,f=h.match(/([^\/]+(\?.*)?)$/)[1];u.id=l,u.className="less-error-message",a="

    "+(i.type||"Syntax")+"Error: "+(i.message||"There is an error in your .less file")+'

    in '+f+" ";var p=function(e,t,n){void 0!==e.extract[t]&&c.push('

  • {content}
  • '.replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,n).replace(/\{content\}/,e.extract[t]))};i.line&&(p(i,0,""),p(i,1,"line"),p(i,2,""),a+="on line "+i.line+", column "+(i.column+1)+":

      "+c.join("")+"
    "),i.stack&&(i.extract||r.logLevel>=4)&&(a+="
    Stack Trace
    "+i.stack.split("\n").slice(1).join("
    ")),u.innerHTML=a,n(t.document,[".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #dd6666;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.line {","color: #ff0000;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),u.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),"development"===r.env&&(s=setInterval((function(){var e=t.document,n=e.body;n&&(e.getElementById(l)?n.replaceChild(u,e.getElementById(l)):n.insertBefore(u,n.firstChild),clearInterval(s))}),10))}(o,s)},remove:function(n){r.errorReporting&&"html"!==r.errorReporting?"console"===r.errorReporting||"function"==typeof r.errorReporting&&r.errorReporting("remove",n):function(n){var i=t.document.getElementById("less-error-message:"+e(n));i&&i.parentNode.removeChild(i)}(n)}}},It={javascriptEnabled:!1,depends:!1,compress:!1,lint:!1,paths:[],color:!0,strictImports:!1,insecure:!1,rootpath:"",rewriteUrls:!1,math:1,strictUnits:!1,globalVars:null,modifyVars:null,urlArgs:""};if(window.less)for(var Ct in window.less)window.less.hasOwnProperty(Ct)&&(It[Ct]=window.less[Ct]);!function(e,n){t(n,i(e)),void 0===n.isFileProtocol&&(n.isFileProtocol=/^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(e.location.protocol)),n.async=n.async||!1,n.fileAsync=n.fileAsync||!1,n.poll=n.poll||(n.isFileProtocol?1e3:1500),n.env=n.env||("127.0.0.1"==e.location.hostname||"0.0.0.0"==e.location.hostname||"localhost"==e.location.hostname||e.location.port&&e.location.port.length>0||n.isFileProtocol?"development":"production");var r=/!dumpLineNumbers:(comments|mediaquery|all)/.exec(e.location.hash);r&&(n.dumpLineNumbers=r[1]),void 0===n.useFileCache&&(n.useFileCache=!0),void 0===n.onReady&&(n.onReady=!0),n.relativeUrls&&(n.rewriteUrls="all")}(window,It),It.plugins=It.plugins||[],window.LESS_PLUGINS&&(It.plugins=It.plugins.concat(window.LESS_PLUGINS));var kt,_t,At,Mt=function(e,i){var r=e.document,o=gt();o.options=i;var s=o.environment,a=wt(i,o.logger),l=new a;s.addFileManager(l),o.FileManager=a,o.PluginLoader=xt,function(e,t){t.logLevel=void 0!==t.logLevel?t.logLevel:"development"===t.env?3:1,t.loggers||(t.loggers=[{debug:function(e){t.logLevel>=4&&console.log(e)},info:function(e){t.logLevel>=3&&console.log(e)},warn:function(e){t.logLevel>=2&&console.warn(e)},error:function(e){t.logLevel>=1&&console.error(e)}}]);for(var n=0;n0&&l.childNodes.length>0&&o.firstChild.nodeValue===l.firstChild.nodeValue);var u=t.getElementsByTagName("head")[0];if(null===o||!1===a){var c=n&&n.nextSibling||null;c?c.parentNode.insertBefore(l,c):u.appendChild(l)}if(o&&!1===a&&o.parentNode.removeChild(o),l.styleSheet)try{l.styleSheet.cssText=i}catch(e){throw new Error("Couldn't reassign styleSheet.cssText.")}},n=function(e){var t,i=e.document;return i.currentScript||(t=i.getElementsByTagName("script"))[t.length-1]},r={error:function(e){this._fireEvent("error",e)},warn:function(e){this._fireEvent("warn",e)},info:function(e){this._fireEvent("info",e)},debug:function(e){this._fireEvent("debug",e)},addListener:function(e){this._listeners.push(e)},removeListener:function(e){for(var t=0;t=0;a--){var l=o[a];if(l[s?"supportsSync":"supports"](e,t,i,n))return l}return null},e.prototype.addFileManager=function(e){this.fileManagers.push(e)},e.prototype.clearFileManagers=function(){this.fileManagers=[]},e}(),o={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",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:"#ff00ff",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:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",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:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",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:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},a={length:{m:1,cm:.01,mm:.001,in:.0254,px:.0254/96,pt:.0254/72,pc:.0254/72*12},duration:{s:1,ms:.001},angle:{rad:1/(2*Math.PI),deg:1/360,grad:1/400,turn:1}},l={colors:o,unitConversions:a},u=function(){function e(){this.parent=null,this.visibilityBlocks=void 0,this.nodeVisible=void 0,this.rootNode=null,this.parsed=null;var e=this;Object.defineProperty(this,"currentFileInfo",{get:function(){return e.fileInfo()}}),Object.defineProperty(this,"index",{get:function(){return e.getIndex()}})}return e.prototype.setParent=function(t,i){function n(t){t&&t instanceof e&&(t.parent=i)}Array.isArray(t)?t.forEach(n):n(t)},e.prototype.getIndex=function(){return this._index||this.parent&&this.parent.getIndex()||0},e.prototype.fileInfo=function(){return this._fileInfo||this.parent&&this.parent.fileInfo()||{}},e.prototype.isRulesetLike=function(){return!1},e.prototype.toCSS=function(e){var t=[];return this.genCSS(e,{add:function(e,i,n){t.push(e)},isEmpty:function(){return 0===t.length}}),t.join("")},e.prototype.genCSS=function(e,t){t.add(this.value)},e.prototype.accept=function(e){this.value=e.visit(this.value)},e.prototype.eval=function(){return this},e.prototype._operate=function(e,t,i,n){switch(t){case"+":return i+n;case"-":return i-n;case"*":return i*n;case"/":return i/n}},e.prototype.fround=function(e,t){var i=e&&e.numPrecision;return i?Number((t+2e-16).toFixed(i)):t},e.compare=function(t,i){if(t.compare&&"Quoted"!==i.type&&"Anonymous"!==i.type)return t.compare(i);if(i.compare)return-i.compare(t);if(t.type===i.type){if(t=t.value,i=i.value,!Array.isArray(t))return t===i?0:void 0;if(t.length===i.length){for(var n=0;nt?1:void 0},e.prototype.blocksVisibility=function(){return null==this.visibilityBlocks&&(this.visibilityBlocks=0),0!==this.visibilityBlocks},e.prototype.addVisibilityBlock=function(){null==this.visibilityBlocks&&(this.visibilityBlocks=0),this.visibilityBlocks=this.visibilityBlocks+1},e.prototype.removeVisibilityBlock=function(){null==this.visibilityBlocks&&(this.visibilityBlocks=0),this.visibilityBlocks=this.visibilityBlocks-1},e.prototype.ensureVisibility=function(){this.nodeVisible=!0},e.prototype.ensureInvisibility=function(){this.nodeVisible=!1},e.prototype.isVisible=function(){return this.nodeVisible},e.prototype.visibilityInfo=function(){return{visibilityBlocks:this.visibilityBlocks,nodeVisible:this.nodeVisible}},e.prototype.copyVisibilityInfo=function(e){e&&(this.visibilityBlocks=e.visibilityBlocks,this.nodeVisible=e.nodeVisible)},e}(),c=function(e,t,i){var n=this;Array.isArray(e)?this.rgb=e:e.length>=6?(this.rgb=[],e.match(/.{2}/g).map((function(e,t){t<3?n.rgb.push(parseInt(e,16)):n.alpha=parseInt(e,16)/255}))):(this.rgb=[],e.split("").map((function(e,t){t<3?n.rgb.push(parseInt(e+e,16)):n.alpha=parseInt(e+e,16)/255}))),this.alpha=this.alpha||("number"==typeof t?t:1),void 0!==i&&(this.value=i)};function h(e,t){return Math.min(Math.max(e,0),t)}function f(e){return"#"+e.map((function(e){return((e=h(Math.round(e),255))<16?"0":"")+e.toString(16)})).join("")}c.prototype=Object.assign(new u,{type:"Color",luma:function(){var e=this.rgb[0]/255,t=this.rgb[1]/255,i=this.rgb[2]/255;return.2126*(e=e<=.03928?e/12.92:Math.pow((e+.055)/1.055,2.4))+.7152*(t=t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4))+.0722*(i=i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4))},genCSS:function(e,t){t.add(this.toCSS(e))},toCSS:function(e,t){var i,n,r,s=e&&e.compress&&!t,o=[];if(n=this.fround(e,this.alpha),this.value)if(0===this.value.indexOf("rgb"))n<1&&(r="rgba");else{if(0!==this.value.indexOf("hsl"))return this.value;r=n<1?"hsla":"hsl"}else n<1&&(r="rgba");switch(r){case"rgba":o=this.rgb.map((function(e){return h(Math.round(e),255)})).concat(h(n,1));break;case"hsla":o.push(h(n,1));case"hsl":i=this.toHSL(),o=[this.fround(e,i.h),this.fround(e,100*i.s)+"%",this.fround(e,100*i.l)+"%"].concat(o)}if(r)return r+"("+o.join(","+(s?"":" "))+")";if(i=this.toRGB(),s){var a=i.split("");a[1]===a[2]&&a[3]===a[4]&&a[5]===a[6]&&(i="#"+a[1]+a[3]+a[5])}return i},operate:function(e,t,i){for(var n=new Array(3),r=this.alpha*(1-i.alpha)+i.alpha,s=0;s<3;s++)n[s]=this._operate(e,t,this.rgb[s],i.rgb[s]);return new c(n,r)},toRGB:function(){return f(this.rgb)},toHSL:function(){var e,t,i=this.rgb[0]/255,n=this.rgb[1]/255,r=this.rgb[2]/255,s=this.alpha,o=Math.max(i,n,r),a=Math.min(i,n,r),l=(o+a)/2,u=o-a;if(o===a)e=t=0;else{switch(t=l>.5?u/(2-o-a):u/(o+a),o){case i:e=(n-r)/u+(n=0&&"\n"!==t.charAt(i);)r++;return"number"==typeof e&&(n=(t.slice(0,e).match(/\n/g)||"").length),{line:n,column:r}}function I(e){var t,i=e.length,n=new Array(i);for(t=0;t|Function):(\d+):(\d+)/,P=function(e,t,i){Error.call(this);var n=e.filename||i;if(this.message=e.message,this.stack=e.stack,t&&n){var r=t.contents[n],s=S(e.index,r),o=s.line,a=s.column,l=e.call&&S(e.call,r).line,u=r?r.split("\n"):"";if(this.type=e.type||"Syntax",this.filename=n,this.index=e.index,this.line="number"==typeof o?o+1:null,this.column=a,!this.line&&this.stack){var c=this.stack.match(E),h=new Function("a","throw new Error()"),f=0;try{h()}catch(e){var p=e.stack.match(E);f=1-(o=parseInt(p[2]))}c&&(c[2]&&(this.line=parseInt(c[2])+f),c[3]&&(this.column=parseInt(c[3])))}this.callLine=l+1,this.callExtract=u[l],this.extract=[u[this.line-2],u[this.line-1],u[this.line]]}};if(void 0===Object.create){var R=function(){};R.prototype=Error.prototype,P.prototype=new R}else P.prototype=Object.create(Error.prototype);P.prototype.constructor=P,P.prototype.toString=function(e){e=e||{};var t="",i=this.extract||[],n=[],r=function(e){return e};if(e.stylize){var s=typeof e.stylize;if("function"!==s)throw Error("options.stylize should be a function, got a "+s+"!");r=e.stylize}if(null!==this.line){if("string"==typeof i[0]&&n.push(r(this.line-1+" "+i[0],"grey")),"string"==typeof i[1]){var o=this.line+" ";i[1]&&(o+=i[1].slice(0,this.column)+r(r(r(i[1].substr(this.column,1),"bold")+i[1].slice(this.column+1),"red"),"inverse")),n.push(o)}"string"==typeof i[2]&&n.push(r(this.line+1+" "+i[2],"grey")),n=n.join("\n")+r("","reset")+"\n"}return t+=r(this.type+"Error: "+this.message,"red"),this.filename&&(t+=r(" in ","red")+this.filename),this.line&&(t+=r(" on line "+this.line+", column "+(this.column+1)+":","grey")),t+="\n"+n,this.callLine&&(t+=r("from ","red")+(this.filename||"")+"/n",t+=r(this.callLine,"grey")+" "+this.callExtract+"/n"),t};var O=function(e,t,i,n,r,s){this.extendList=t,this.condition=i,this.evaldCondition=!i,this._index=n,this._fileInfo=r,this.elements=this.getElements(e),this.mixinElements_=void 0,this.copyVisibilityInfo(s),this.setParent(this.elements,this)};O.prototype=Object.assign(new u,{type:"Selector",accept:function(e){this.elements&&(this.elements=e.visitArray(this.elements)),this.extendList&&(this.extendList=e.visitArray(this.extendList)),this.condition&&(this.condition=e.visit(this.condition))},createDerived:function(e,t,i){e=this.getElements(e);var n=new O(e,t||this.extendList,null,this.getIndex(),this.fileInfo(),this.visibilityInfo());return n.evaldCondition=null!=i?i:this.evaldCondition,n.mediaEmpty=this.mediaEmpty,n},getElements:function(e){return e?("string"==typeof e&&this.parse.parseNode(e,["selector"],this._index,this._fileInfo,(function(t,i){if(t)throw new P({index:t.index,message:t.message},this.parse.imports,this._fileInfo.filename);e=i[0].elements})),e):[new m("","&",!1,this._index,this._fileInfo)]},createEmptySelectors:function(){var e=new m("","&",!1,this._index,this._fileInfo),t=[new O([e],null,null,this._index,this._fileInfo)];return t[0].mediaEmpty=!0,t},match:function(e){var t,i,n=this.elements,r=n.length;if(0===(t=(e=e.mixinElements()).length)||ry.PARENS_DIVISION)||this.parensStack&&this.parensStack.length))},B.Eval.prototype.pathRequiresRewrite=function(e){return(this.rewriteUrls===w?G:z)(e)},B.Eval.prototype.rewritePath=function(e,t){var i;return t=t||"",i=this.normalizePath(t+e),G(e)&&z(t)&&!1===G(i)&&(i="./"+i),i},B.Eval.prototype.normalizePath=function(e){var t,i=e.split("/").reverse();for(e=[];0!==i.length;)switch(t=i.pop()){case".":break;case"..":0===e.length||".."===e[e.length-1]?e.push(t):e.pop();break;default:e.push(t)}return e.join("/")};var W=function e(t){return{_data:{},add:function(e,t){e=e.toLowerCase(),this._data.hasOwnProperty(e),this._data[e]=t},addMultiple:function(e){var t=this;Object.keys(e).forEach((function(i){t.add(i,e[i])}))},get:function(e){return this._data[e]||t&&t.get(e)},getLocalFunctions:function(){return this._data},inherit:function(){return e(this)},create:function(t){return e(t)}}}(null),J={eval:function(){var e=this.value_,t=this.error_;if(t)throw t;if(null!=e)return e?F.True:F.False},value:function(e){this.value_=e},error:function(e){this.error_=e},reset:function(){this.value_=this.error_=null}},H=function(e,t,i,n){this.selectors=e,this.rules=t,this._lookups={},this._variables=null,this._properties=null,this.strictImports=i,this.copyVisibilityInfo(n),this.allowRoot=!0,this.setParent(this.selectors,this),this.setParent(this.rules,this)};H.prototype=Object.assign(new u,{type:"Ruleset",isRuleset:!0,isRulesetLike:function(){return!0},accept:function(e){this.paths?this.paths=e.visitArray(this.paths,!0):this.selectors&&(this.selectors=e.visitArray(this.selectors)),this.rules&&this.rules.length&&(this.rules=e.visitArray(this.rules))},eval:function(e){var t,i,n,r,s,o=!1;if(this.selectors&&(i=this.selectors.length)){for(t=new Array(i),J.error({type:"Syntax",message:"it is currently only allowed in parametric mixin guards,"}),r=0;r0;e--){var t=this.rules[e-1];if(t instanceof N)return this.parseValue(t)}},parseValue:function(e){var t=this;function i(e){return e.value instanceof $&&!e.parsed?("string"==typeof e.value.value?this.parse.parseNode(e.value.value,["value","important"],e.value.getIndex(),e.fileInfo(),(function(t,i){t&&(e.parsed=!0),i&&(e.value=i[0],e.important=i[1]||"",e.parsed=!0)})):e.parsed=!0,e):e}if(Array.isArray(e)){var n=[];return e.forEach((function(e){n.push(i.call(t,e))})),n}return i.call(t,e)},rulesets:function(){if(!this.rules)return[];var e,t,i=[],n=this.rules;for(e=0;t=n[e];e++)t.isRuleset&&i.push(t);return i},prependRule:function(e){var t=this.rules;t?t.unshift(e):this.rules=[e],this.setParent(e,this)},find:function(e,t,i){t=t||this;var n,r,s=[],o=e.toCSS();return o in this._lookups?this._lookups[o]:(this.rulesets().forEach((function(o){if(o!==t)for(var a=0;an){if(!i||i(o)){r=o.find(new O(e.elements.slice(n)),t,i);for(var l=0;l0&&t.add(l),e.firstSelector=!0,o[0].genCSS(e,t),e.firstSelector=!1,n=1;n0?(s=(r=I(e)).pop(),o=n.createDerived(I(s.elements))):o=n.createDerived([]),t.length>0){var a=i.combinator,l=t[0].elements[0];a.emptyOrWhitespace&&!l.combinator.emptyOrWhitespace&&(a=l.combinator),o.elements.push(new m(a,l.value,i.isVariable,i._index,i._fileInfo)),o.elements=o.elements.concat(t[0].elements.slice(1))}if(0!==o.elements.length&&r.push(o),t.length>1){var u=t.slice(1);u=u.map((function(e){return e.createDerived(e.elements,[])})),r=r.concat(u)}return r}function o(e,t,i,n,r){var o;for(o=0;o0?n[n.length-1]=n[n.length-1].createDerived(n[n.length-1].elements.concat(e)):n.push(new O(e));else t.push([new O(e)])}function l(e,t){var i=t.createDerived(t.elements,t.extendList,t.evaldCondition);return i.copyVisibilityInfo(e),i}var u,c;if(!function e(t,i,l){var u,c,h,f,v,d,g,y,b,w,x,S,I=!1;for(f=[],v=[[]],u=0;y=l.elements[u];u++)if("&"!==y.value){var C=(S=void 0,(x=y).value instanceof p&&(S=x.value.value)instanceof O?S:null);if(null!=C){a(f,v);var k,_=[],A=[];for(k=e(_,i,C),I=I||k,h=0;h<_.length;h++){o(v,[r(n(_[h],y),y)],y,l,A)}v=A,f=[]}else f.push(y)}else{for(I=!0,d=[],a(f,v),c=0;c0&&g[0].elements.push(new m(y.combinator,"",y.isVariable,y._index,y._fileInfo)),d.push(g);else for(h=0;h0&&(t.push(v[u]),w=v[u][b-1],v[u][b-1]=w.createDerived(w.elements,l.extendList));return I}(c=[],t,i))if(t.length>0)for(c=[],u=0;u0)for(t=0;t-1e-6&&(n=i.toFixed(20).replace(/0+$/,"")),e&&e.compress){if(0===i&&this.unit.isLength())return void t.add(n);i>0&&i<1&&(n=n.substr(1))}t.add(n),this.unit.genCSS(e,t)},operate:function(e,t,i){var n=this._operate(e,t,this.value,i.value),r=this.unit.clone();if("+"===t||"-"===t)if(0===r.numerator.length&&0===r.denominator.length)r=i.unit.clone(),this.unit.backupUnit&&(r.backupUnit=this.unit.backupUnit);else if(0===i.unit.numerator.length&&0===r.denominator.length);else{if(i=i.convertTo(this.unit.usedUnits()),e.strictUnits&&i.unit.toString()!==r.toString())throw new Error("Incompatible units. Change the units or use the unit function. Bad units: '"+r.toString()+"' and '"+i.unit.toString()+"'.");n=this._operate(e,t,this.value,i.value)}else"*"===t?(r.numerator=r.numerator.concat(i.unit.numerator).sort(),r.denominator=r.denominator.concat(i.unit.denominator).sort(),r.cancel()):"/"===t&&(r.numerator=r.numerator.concat(i.unit.denominator).sort(),r.denominator=r.denominator.concat(i.unit.numerator).sort(),r.cancel());return new X(n,r)},compare:function(e){var t,i;if(e instanceof X){if(this.unit.isEmpty()||e.unit.isEmpty())t=this,i=e;else if(t=this.unify(),i=e.unify(),0!==t.unit.compare(i.unit))return;return u.numericCompare(t.value,i.value)}},unify:function(){return this.convertTo({length:"px",duration:"s",angle:"rad"})},convertTo:function(e){var t,i,n,r,s,o=this.value,l=this.unit.clone(),u={};if("string"==typeof e){for(t in a)a[t].hasOwnProperty(e)&&((u={})[t]=e);e=u}for(i in s=function(e,t){return n.hasOwnProperty(e)?(t?o/=n[e]/n[r]:o*=n[e]/n[r],r):e},e)e.hasOwnProperty(i)&&(r=e[i],n=a[i],l.map(s));return l.cancel(),new X(o,l)}});var Y=y,ee=function(e,t,i){this.op=e.trim(),this.operands=t,this.isSpaced=i};ee.prototype=Object.assign(new u,{type:"Operation",accept:function(e){this.operands=e.visitArray(this.operands)},eval:function(e){var t,i=this.operands[0].eval(e),n=this.operands[1].eval(e);if(e.isMathOn(this.op)){if(t="./"===this.op?"/":this.op,i instanceof X&&n instanceof c&&(i=i.toColor()),n instanceof X&&i instanceof c&&(n=n.toColor()),!i.operate){if(i instanceof ee&&"/"===i.op&&e.math===Y.PARENS_DIVISION)return new ee(this.op,[i,n],this.isSpaced);throw{type:"Operation",message:"Operation on an invalid type"}}return i.operate(e,t,n)}return new ee(this.op,[i,n],this.isSpaced)},genCSS:function(e,t){this.operands[0].genCSS(e,t),this.isSpaced&&t.add(" "),t.add(this.op),this.isSpaced&&t.add(" "),this.operands[1].genCSS(e,t)}});var te=function(e,t){if(this.value=e,this.noSpacing=t,!e)throw new Error("Expression requires an array parameter")};te.prototype=Object.assign(new u,{type:"Expression",accept:function(e){this.value=e.visitArray(this.value)},eval:function(e){var t,i=e.isMathOn(),n=this.parens,r=!1;return n&&e.inParenthesis(),this.value.length>1?t=new te(this.value.map((function(t){return t.eval?t.eval(e):t})),this.noSpacing):1===this.value.length?(!this.value[0].parens||this.value[0].parensInOp||e.inCalc||(r=!0),t=this.value[0].eval(e)):t=this,n&&e.outOfParenthesis(),!this.parens||!this.parensInOp||i||r||t instanceof X||(t=new p(t)),t},genCSS:function(e,t){for(var i=0;i1){var i=new O([],null,null,this.getIndex(),this.fileInfo()).createEmptySelectors();(t=new H(i,e.mediaBlocks)).multiMedia=!0,t.copyVisibilityInfo(this.visibilityInfo()),this.setParent(t,this)}return delete e.mediaBlocks,delete e.mediaPath,t},evalNested:function(e){var t,i,n=e.mediaPath.concat([this]);for(t=0;t0;t--)e.splice(t,0,new $("and"));return new te(e)}))),this.setParent(this.features,this),new H([],[])},permute:function(e){if(0===e.length)return[];if(1===e.length)return e[0];for(var t=[],i=this.permute(e.slice(1)),n=0;n1?"["+e.value.map((function(e){return e.toCSS()})).join(", ")+"]":e.toCSS()}});var fe=function(e,t,i,n){this.escaped=t,this.expression=e,this._index=i,this._fileInfo=n};fe.prototype=Object.assign(new he,{type:"JavaScript",eval:function(e){var t=this.evaluateJavaScript(this.expression,e),i=typeof t;return"number"!==i||isNaN(t)?"string"===i?new ae('"'+t+'"',t,this.escaped,this._index):Array.isArray(t)?new $(t.join(", ")):new $(t):new X(t)}});var pe=function(e,t){this.key=e,this.value=t};pe.prototype=Object.assign(new u,{type:"Assignment",accept:function(e){this.value=e.visit(this.value)},eval:function(e){return this.value.eval?new pe(this.key,this.value.eval(e)):this},genCSS:function(e,t){t.add(this.key+"="),this.value.genCSS?this.value.genCSS(e,t):t.add(this.value)}});var ve=function(e,t,i,n,r){this.op=e.trim(),this.lvalue=t,this.rvalue=i,this._index=n,this.negate=r};ve.prototype=Object.assign(new u,{type:"Condition",accept:function(e){this.lvalue=e.visit(this.lvalue),this.rvalue=e.visit(this.rvalue)},eval:function(e){var t=function(e,t,i){switch(e){case"and":return t&&i;case"or":return t||i;default:switch(u.compare(t,i)){case-1:return"<"===e||"=<"===e||"<="===e;case 0:return"="===e||">="===e||"=<"===e||"<="===e;case 1:return">"===e||">="===e;default:return!1}}}(this.op,this.lvalue.eval(e),this.rvalue.eval(e));return this.negate?!t:t}});var de=function(e){this.value=e};de.prototype=Object.assign(new u,{type:"UnicodeDescriptor"});var me=function(e){this.value=e};me.prototype=Object.assign(new u,{type:"Negative",genCSS:function(e,t){t.add("-"),this.value.genCSS(e,t)},eval:function(e){return e.isMathOn()?new ee("*",[new X(-1),this.value]).eval(e):new me(this.value.eval(e))}});var ge=function(e,t,i,n,r){switch(this.selector=e,this.option=t,this.object_id=ge.next_id++,this.parent_ids=[this.object_id],this._index=i,this._fileInfo=n,this.copyVisibilityInfo(r),this.allowRoot=!0,t){case"all":this.allowBefore=!0,this.allowAfter=!0;break;default:this.allowBefore=!1,this.allowAfter=!1}this.setParent(this.selector,this)};ge.prototype=Object.assign(new u,{type:"Extend",accept:function(e){this.selector=e.visit(this.selector)},eval:function(e){return new ge(this.selector.eval(e),this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},clone:function(e){return new ge(this.selector,this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},findSelfSelectors:function(e){var t,i,n=[];for(t=0;t0&&i.length&&""===i[0].combinator.value&&(i[0].combinator.value=" "),n=n.concat(e[t].elements);this.selfSelectors=[new O(n)],this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo())}}),ge.next_id=0;var ye=function(e,t,i){this.variable=e,this._index=t,this._fileInfo=i,this.allowRoot=!0};ye.prototype=Object.assign(new u,{type:"VariableCall",eval:function(e){var t,i=new re(this.variable,this.getIndex(),this.fileInfo()).eval(e),n=new P({message:"Could not evaluate variable call "+this.variable});if(!i.ruleset){if(i.rules)t=i;else if(Array.isArray(i))t=new H("",i);else{if(!Array.isArray(i.value))throw n;t=new H("",i.value)}i=new K(t)}if(i.ruleset)return i.callEval(e);throw n}});var be=function(e,t,i,n){this.value=e,this.lookups=t,this._index=i,this._fileInfo=n};be.prototype=Object.assign(new u,{type:"NamespaceValue",eval:function(e){var t,i,n=this.value.eval(e);for(t=0;tthis.params.length)return!1}i=Math.min(s,this.arity);for(var o=0;o0){for(c=!0,a=0;a0)f=2;else if(f=1,p[1]+p[2]>1)throw{type:"Runtime",message:"Ambiguous use of `default()` found when matching for `"+this.format(m)+"`",index:this.getIndex(),filename:this.fileInfo().filename};for(a=0;a0&&(e=e.slice(0,t)),(t=e.lastIndexOf("/"))<0&&(t=e.lastIndexOf("\\")),t<0?"":e.slice(0,t+1)},e.prototype.tryAppendExtension=function(e,t){return/(\.[a-z]*$)|([\?;].*)$/.test(e)?e:e+t},e.prototype.tryAppendLessExtension=function(e){return this.tryAppendExtension(e,".less")},e.prototype.supportsSync=function(){return!1},e.prototype.alwaysMakePathsAbsolute=function(){return!1},e.prototype.isPathAbsolute=function(e){return/^(?:[a-z-]+:|\/|\\|#)/i.test(e)},e.prototype.join=function(e,t){return e?e+t:t},e.prototype.pathDiff=function(e,t){var i,n,r,s,o=this.extractUrlParts(e),a=this.extractUrlParts(t),l="";if(o.hostPart!==a.hostPart)return"";for(n=Math.max(a.directories.length,o.directories.length),i=0;iparseInt(t[i])?-1:1;return 0},e.prototype.versionToString=function(e){for(var t="",i=0;i0;){var e=this.imports[0];if(!e.isReady)return;this.imports=this.imports.slice(1),e.callback.apply(null,e.args)}if(0===this.variableImports.length)break;var t=this.variableImports[0];this.variableImports=this.variableImports.slice(1),t()}}finally{this._currentDepth--}0===this._currentDepth&&this._onSequencerEmpty&&this._onSequencerEmpty()},e}(),Pe=function(e,t){this._visitor=new Me(this),this._importer=e,this._finish=t,this.context=new B.Eval,this.importCount=0,this.onceFileDetectionMap={},this.recursionDetector={},this._sequencer=new Ee(this._onSequencerEmpty.bind(this))};Pe.prototype={isReplacing:!1,run:function(e){try{this._visitor.visit(e)}catch(e){this.error=e}this.isFinished=!0,this._sequencer.tryRun()},_onSequencerEmpty:function(){this.isFinished&&this._finish(this.error)},visitImport:function(e,t){var i=e.options.inline;if(!e.css||i){var n=new B.Eval(this.context,I(this.context.frames)),r=n.frames[0];this.importCount++,e.isVariableImport()?this._sequencer.addVariableImport(this.processImportNode.bind(this,e,n,r)):this.processImportNode(e,n,r)}t.visitDeeper=!1},processImportNode:function(e,t,i){var n,r=e.options.inline;try{n=e.evalForImport(t)}catch(t){t.filename||(t.index=e.getIndex(),t.filename=e.fileInfo().filename),e.css=!0,e.error=t}if(!n||n.css&&!r)this.importCount--,this.isFinished&&this._sequencer.tryRun();else{n.options.multiple&&(t.importMultiple=!0);for(var s=void 0===n.css,o=0;o=0||(a=[u.selfSelectors[0]],(s=f.findMatch(l,a)).length&&(l.hasFoundMatches=!0,l.selfSelectors.forEach((function(e){var t=u.visibilityInfo();o=f.extendSelector(s,a,e,l.isVisible()),(c=new Se.Extend(u.selector,u.option,0,u.fileInfo(),t)).selfSelectors=o,o[o.length-1].extendList=[c],h.push(c),c.ruleset=u.ruleset,c.parent_ids=c.parent_ids.concat(u.parent_ids,l.parent_ids),u.firstExtendOnThisSelectorPath&&(c.firstExtendOnThisSelectorPath=!0,u.ruleset.paths.push(o))}))));if(h.length){if(this.extendChainCount++,i>100){var p="{unable to calculate}",v="{unable to calculate}";try{p=h[0].selfSelectors[0].toCSS(),v=h[0].selector.toCSS()}catch(e){}throw{message:"extend circular reference detected. One of the circular extends is currently:"+p+":extend("+v+")"}}return h.concat(f.doExtendChaining(h,t,i+1))}return h},e.prototype.visitDeclaration=function(e,t){t.visitDeeper=!1},e.prototype.visitMixinDefinition=function(e,t){t.visitDeeper=!1},e.prototype.visitSelector=function(e,t){t.visitDeeper=!1},e.prototype.visitRuleset=function(e,t){if(!e.root){var i,n,r,s,o=this.allExtendsStack[this.allExtendsStack.length-1],a=[],l=this;for(r=0;r0&&u[l.matched].combinator.value!==o?l=null:l.matched++,l&&(l.finished=l.matched===u.length,l.finished&&!e.allowAfter&&(r+1u&&c>0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[u].elements.slice(c)),c=0,u++),l=s.elements.slice(c,a.index).concat([o]).concat(i.elements.slice(1)),u===a.pathIndex&&r>0?h[h.length-1].elements=h[h.length-1].elements.concat(l):(h=h.concat(t.slice(u,a.pathIndex))).push(new Se.Selector(l)),u=a.endPathIndex,(c=a.endPathElementIndex)>=t[u].elements.length&&(c=0,u++);return u0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[u].elements.slice(c)),u++),h=(h=h.concat(t.slice(u,t.length))).map((function(e){var t=e.createDerived(e.elements);return n?t.ensureVisibility():t.ensureInvisibility(),t}))},e.prototype.visitMedia=function(e,t){var i=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);i=i.concat(this.doExtendChaining(i,e.allExtends)),this.allExtendsStack.push(i)},e.prototype.visitMediaOut=function(e){var t=this.allExtendsStack.length-1;this.allExtendsStack.length=t},e.prototype.visitAtRule=function(e,t){var i=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);i=i.concat(this.doExtendChaining(i,e.allExtends)),this.allExtendsStack.push(i)},e.prototype.visitAtRuleOut=function(e){var t=this.allExtendsStack.length-1;this.allExtendsStack.length=t},e}(),Fe=function(){function e(){this.contexts=[[]],this._visitor=new Me(this)}return e.prototype.run=function(e){return this._visitor.visit(e)},e.prototype.visitDeclaration=function(e,t){t.visitDeeper=!1},e.prototype.visitMixinDefinition=function(e,t){t.visitDeeper=!1},e.prototype.visitRuleset=function(e,t){var i,n=this.contexts[this.contexts.length-1],r=[];this.contexts.push(r),e.root||((i=e.selectors)&&(i=i.filter((function(e){return e.getIsOutput()})),e.selectors=i.length?i:i=null,i&&e.joinSelectors(r,n,i)),i||(e.rules=null),e.paths=r)},e.prototype.visitRulesetOut=function(e){this.contexts.length=this.contexts.length-1},e.prototype.visitMedia=function(e,t){var i=this.contexts[this.contexts.length-1];e.rules[0].root=0===i.length||i[0].multiMedia},e.prototype.visitAtRule=function(e,t){var i=this.contexts[this.contexts.length-1];e.rules&&e.rules.length&&(e.rules[0].root=e.isRooted||0===i.length||null)},e}(),$e=function(){function e(e){this._visitor=new Me(this),this._context=e}return e.prototype.containsSilentNonBlockedChild=function(e){var t;if(!e)return!1;for(var i=0;i0},e.prototype.resolveVisibility=function(e,t){if(!e.blocksVisibility()){if(this.isEmpty(e)&&!this.containsSilentNonBlockedChild(t))return;return e}var i=e.rules[0];if(this.keepOnlyVisibleChilds(i),!this.isEmpty(i))return e.ensureVisibility(),e.removeVisibilityBlock(),e},e.prototype.isVisibleRuleset=function(e){return!!e.firstRoot||!this.isEmpty(e)&&!(!e.root&&!this.hasVisibleSelector(e))},e}(),Le=function(e){this._visitor=new Me(this),this._context=e,this.utils=new $e(e)};Le.prototype={isReplacing:!0,run:function(e){return this._visitor.visit(e)},visitDeclaration:function(e,t){if(!e.blocksVisibility()&&!e.variable)return e},visitMixinDefinition:function(e,t){e.frames=[]},visitExtend:function(e,t){},visitComment:function(e,t){if(!e.blocksVisibility()&&!e.isSilent(this._context))return e},visitMedia:function(e,t){var i=e.rules[0].rules;return e.accept(this._visitor),t.visitDeeper=!1,this.utils.resolveVisibility(e,i)},visitImport:function(e,t){if(!e.blocksVisibility())return e},visitAtRule:function(e,t){return e.rules&&e.rules.length?this.visitAtRuleWithBody(e,t):this.visitAtRuleWithoutBody(e,t)},visitAnonymous:function(e,t){if(!e.blocksVisibility())return e.accept(this._visitor),e},visitAtRuleWithBody:function(e,t){var i=function(e){var t=e.rules;return function(e){var t=e.rules;return 1===t.length&&(!t[0].paths||0===t[0].paths.length)}(e)?t[0].rules:t}(e);return e.accept(this._visitor),t.visitDeeper=!1,this.utils.isEmpty(e)||this._mergeRules(e.rules[0].rules),this.utils.resolveVisibility(e,i)},visitAtRuleWithoutBody:function(e,t){if(!e.blocksVisibility()){if("@charset"===e.name){if(this.charset){if(e.debugInfo){var i=new Se.Comment("/* "+e.toCSS(this._context).replace(/\n/g,"")+" */\n");return i.debugInfo=e.debugInfo,this._visitor.visit(i)}return}this.charset=!0}return e}},checkValidNodes:function(e,t){if(e)for(var i=0;i0?e.accept(this._visitor):e.rules=null,t.visitDeeper=!1}return e.rules&&(this._mergeRules(e.rules),this._removeDuplicateRules(e.rules)),this.utils.isVisibleRuleset(e)&&(e.ensureVisibility(),n.splice(0,0,e)),1===n.length?n[0]:n},_compileRulesetPaths:function(e){e.paths&&(e.paths=e.paths.filter((function(e){var t;for(" "===e[0].elements[0].combinator.value&&(e[0].elements[0].combinator=new Se.Combinator("")),t=0;t=0;n--)if((i=e[n])instanceof Se.Declaration)if(r[i.name]){(t=r[i.name])instanceof Se.Declaration&&(t=r[i.name]=[r[i.name].toCSS(this._context)]);var s=i.toCSS(this._context);-1!==t.indexOf(s)?e.splice(n,1):t.push(s)}else r[i.name]=i}},_mergeRules:function(e){if(e){for(var t={},i=[],n=0;n0){var t=e[0],i=[],n=[new Se.Expression(i)];e.forEach((function(e){"+"===e.merge&&i.length>0&&n.push(new Se.Expression(i=[])),i.push(e.value),t.important=t.important||e.important})),t.value=new Se.Value(n)}}))}}};var Ne={Visitor:Me,ImportVisitor:Pe,MarkVisibleSelectorsVisitor:Re,ExtendVisitor:Ve,JoinSelectorVisitor:Fe,ToCSSVisitor:Le};var De=function(){var e,t,i,n,r,s,o,a=[],l={};function u(i){for(var n,a,c,h=l.i,f=t,p=l.i-o,v=l.i+s.length-p,d=l.i+=i,m=e;l.i=0){c={index:l.i,text:m.substr(l.i,y+2-l.i),isLineComment:!1},l.i+=c.text.length-1,l.commentStore.push(c);continue}}break}if(32!==n&&10!==n&&9!==n&&13!==n)break}if(s=s.slice(i+l.i-d+p),o=l.i,!s.length){if(ti||l.i===i&&e&&!n)&&(i=l.i,n=e);var r=a.pop();s=r.current,o=l.i=r.i,t=r.j},l.forget=function(){a.pop()},l.isWhitespace=function(t){var i=l.i+(t||0),n=e.charCodeAt(i);return 32===n||13===n||9===n||10===n},l.$re=function(e){l.i>o&&(s=s.slice(l.i-o),o=l.i);var t=e.exec(s);return t?(u(t[0].length),"string"==typeof t?t:1===t.length?t[0]:t):null},l.$char=function(t){return e.charAt(l.i)!==t?null:(u(1),t)},l.$str=function(t){for(var i=t.length,n=0;nh&&(d=!1)}}while(d);return r||null},l.autoCommentAbsorb=!0,l.commentStore=[],l.finished=!1,l.peek=function(t){if("string"==typeof t){for(var i=0;i57||t<43||47===t||44===t},l.start=function(n,a,c){e=n,l.i=t=o=i=0,r=a?function(e,t){var i,n,r,s,o,a,l,u,c,h=e.length,f=0,p=0,v=[],d=0;function m(t){var i=o-d;i<512&&!t||!i||(v.push(e.slice(d,o+1)),d=o+1)}for(o=0;o=97&&l<=122||l<34))switch(l){case 40:p++,n=o;continue;case 41:if(--p<0)return t("missing opening `(`",o);continue;case 59:p||m();continue;case 123:f++,i=o;continue;case 125:if(--f<0)return t("missing opening `{`",o);f||p||m();continue;case 92:if(o96)){if(u==l){c=1;break}if(92==u){if(o==h-1)return t("unescaped `\\`",o);o++}}if(c)continue;return t("unmatched `"+String.fromCharCode(l)+"`",a);case 47:if(p||o==h-1)continue;if(47==(u=e.charCodeAt(o+1)))for(o+=2;oi&&s>r?"missing closing `}` or `*/`":"missing closing `}`",i):0!==p?t("missing closing `)`",n):(m(!0),v)}(n,c):[n],s=r[0],u(0)},l.end=function(){var t,r=l.i>=e.length;return l.i=e.length-1,furthestChar:e[l.i]}},l},je=function e(t,i,n){var r,s=De();function o(e,t){throw new P({index:s.i,filename:n.filename,type:t||"Syntax",message:e},i)}function a(e,t){var i=e instanceof Function?e.call(r):s.$re(e);if(i)return i;o(t||("string"==typeof e?"expected '"+e+"' got '"+s.currentChar()+"'":"unexpected token"))}function l(e,t){if(s.$char(e))return e;o(t||"expected '"+e+"' got '"+s.currentChar()+"'")}function u(e){var t=n.filename;return{lineNumber:S(e,s.getInput()).line+1,fileName:t}}return{parserInput:s,imports:i,fileInfo:n,parseNode:function(e,t,n,o,a){var l,u=[],c=s;try{c.start(e,!1,(function(e,t){a({message:e,index:t+n})}));for(var h=0,f=void 0,p=void 0;f=t[h];h++)if(p=c.i,l=r[f]()){try{l._index=p+n,l._fileInfo=o}catch(e){}u.push(l)}else u.push(null);c.end().isFinished?a(null,u):a(!0,null)}catch(e){throw new P({index:e.index+n,message:e.message},i,o.filename)}},parse:function(r,o,a){var l,u,c,h,f=null,p="";if(u=a&&a.globalVars?e.serializeVars(a.globalVars)+"\n":"",c=a&&a.modifyVars?"\n"+e.serializeVars(a.modifyVars):"",t.pluginManager)for(var v=t.pluginManager.getPreProcessors(),d=0;d");return e},args:function(e){var t,i,n,a,l,u,c,h=r.entities,f={args:null,variadic:!1},p=[],v=[],d=[],m=!0;for(s.save();;){if(e)u=r.detachedRuleset()||r.expression();else{if(s.commentStore.length=0,s.$str("...")){f.variadic=!0,s.$char(";")&&!t&&(t=!0),(t?v:d).push({variadic:!0});break}u=h.variable()||h.property()||h.literal()||h.keyword()||this.call(!0)}if(!u||!m)break;a=null,u.throwAwayComments&&u.throwAwayComments(),l=u;var g=null;if(e?u.value&&1==u.value.length&&(g=u.value[0]):g=u,g&&(g instanceof Se.Variable||g instanceof Se.Property))if(s.$char(":")){if(p.length>0&&(t&&o("Cannot mix ; and , as delimiter types"),i=!0),!(l=r.detachedRuleset()||r.expression())){if(!e)return s.restore(),f.args=[],f;o("could not understand value for named argument")}a=n=g.name}else if(s.$str("...")){if(!e){f.variadic=!0,s.$char(";")&&!t&&(t=!0),(t?v:d).push({name:u.name,variadic:!0});break}c=!0}else e||(n=a=g.name,l=null);l&&p.push(l),d.push({name:a,value:l,expand:c}),s.$char(",")?m=!0:((m=";"===s.$char(";"))||t)&&(i&&o("Cannot mix ; and , as delimiter types"),t=!0,p.length>1&&(l=new Se.Value(p)),v.push({name:n,value:l,expand:c}),n=null,p=[],i=!1)}return s.forget(),f.args=t?v:d,f},definition:function(){var e,t,i,n,o=[],l=!1;if(!("."!==s.currentChar()&&"#"!==s.currentChar()||s.peek(/^[^{]*\}/)))if(s.save(),t=s.$re(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/)){e=t[1];var u=this.args(!1);if(o=u.args,l=u.variadic,!s.$char(")"))return void s.restore("Missing closing ')'");if(s.commentStore.length=0,s.$str("when")&&(n=a(r.conditions,"expected condition")),i=r.block())return s.forget(),new Se.mixin.Definition(e,o,i,n,l);s.restore()}else s.restore()},ruleLookups:function(){var e,t=[];if("["===s.currentChar()){for(;;){if(s.save(),!(e=this.lookupValue())&&""!==e){s.restore();break}t.push(e),s.forget()}return t.length>0?t:void 0}},lookupValue:function(){if(s.save(),s.$char("[")){var e=s.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);if(s.$char("]"))return e||""===e?(s.forget(),e):void s.restore();s.restore()}else s.restore()}},entity:function(){var e=this.entities;return this.comment()||e.literal()||e.variable()||e.url()||e.property()||e.call()||e.keyword()||this.mixin.call(!0)||e.javascript()},end:function(){return s.$char(";")||s.peek("}")},ieAlpha:function(){var e;if(s.$re(/^opacity=/i))return(e=s.$re(/^\d+/))||(e="@{"+(e=a(r.entities.variable,"Could not parse alpha")).name.slice(1)+"}"),l(")"),new Se.Quoted("","alpha(opacity="+e+")")},element:function(){var e,t,i,r=s.i;if(t=this.combinator(),(e=s.$re(/^(?:\d+\.\d+|\d+)%/)||s.$re(/^(?:[.#]?|:*)(?:[\w-]|[^\x00-\x9f]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/)||s.$char("*")||s.$char("&")||this.attribute()||s.$re(/^\([^&()@]+\)/)||s.$re(/^[\.#:](?=@)/)||this.entities.variableCurly())||(s.save(),s.$char("(")?(i=this.selector(!1))&&s.$char(")")?(e=new Se.Paren(i),s.forget()):s.restore("Missing closing ')'"):s.forget()),e)return new Se.Element(t,e,e instanceof Se.Variable,r,n)},combinator:function(){var e=s.currentChar();if("/"===e){s.save();var t=s.$re(/^\/[a-z]+\//i);if(t)return s.forget(),new Se.Combinator(t);s.restore()}if(">"===e||"+"===e||"~"===e||"|"===e||"^"===e){for(s.i++,"^"===e&&"^"===s.currentChar()&&(e="^^",s.i++);s.isWhitespace();)s.i++;return new Se.Combinator(e)}return s.isWhitespace(-1)?new Se.Combinator(" "):new Se.Combinator(null)},selector:function(e){var t,i,r,l,u,c,h,f=s.i;for(e=!1!==e;(e&&(i=this.extend())||e&&(c=s.$str("when"))||(l=this.element()))&&(c?h=a(this.conditions,"expected condition"):h?o("CSS guard can only be used at the end of selector"):i?u=u?u.concat(i):i:(u&&o("Extend can only be used at the end of selector"),r=s.currentChar(),t?t.push(l):t=[l],l=null),"{"!==r&&"}"!==r&&";"!==r&&","!==r&&")"!==r););if(t)return new Se.Selector(t,u,h,f,n);u&&o("Extend must be used to extend a selector, it cannot be used on its own")},selectors:function(){for(var e,t;(e=this.selector())&&(t?t.push(e):t=[e],s.commentStore.length=0,e.condition&&t.length>1&&o("Guards are only currently allowed on a single selector."),s.$char(","));)e.condition&&o("Guards are only currently allowed on a single selector."),s.commentStore.length=0;return t},attribute:function(){if(s.$char("[")){var e,t,i,n=this.entities;return(e=n.variableCurly())||(e=a(/^(?:[_A-Za-z0-9-\*]*\|)?(?:[_A-Za-z0-9-]|\\.)+/)),(i=s.$re(/^[|~*$^]?=/))&&(t=n.quoted()||s.$re(/^[0-9]+%/)||s.$re(/^[\w-]+/)||n.variableCurly()),l("]"),new Se.Attribute(e,i,t)}},block:function(){var e;if(s.$char("{")&&(e=this.primary())&&s.$char("}"))return e},blockRuleset:function(){var e=this.block();return e&&(e=new Se.Ruleset(null,e)),e},detachedRuleset:function(){var e,t,i;if(s.save(),!s.$re(/^[.#]\(/)||(t=(e=this.mixin.args(!1)).args,i=e.variadic,s.$char(")"))){var n=this.blockRuleset();if(n)return s.forget(),t?new Se.mixin.Definition(null,t,n,null,i):new Se.DetachedRuleset(n);s.restore()}else s.restore()},ruleset:function(){var e,i,n;if(s.save(),t.dumpLineNumbers&&(n=u(s.i)),(e=this.selectors())&&(i=this.block())){s.forget();var r=new Se.Ruleset(e,i,t.strictImports);return t.dumpLineNumbers&&(r.debugInfo=n),r}s.restore()},declaration:function(){var e,t,i,r,o,a,l=s.i,u=s.currentChar();if("."!==u&&"#"!==u&&"&"!==u&&":"!==u)if(s.save(),e=this.variable()||this.ruleProperty()){if((a="string"==typeof e)&&(t=this.detachedRuleset())&&(i=!0),s.commentStore.length=0,!t){if(o=!a&&e.length>1&&e.pop().value,t=e[0].value&&"--"===e[0].value.slice(0,2)?this.permissiveValue():this.anonymousValue())return s.forget(),new Se.Declaration(e,t,!1,o,l,n);t||(t=this.value()),t?r=this.important():a&&(t=this.permissiveValue())}if(t&&(this.end()||i))return s.forget(),new Se.Declaration(e,t,r,o,l,n);s.restore()}else s.restore()},anonymousValue:function(){var e=s.i,t=s.$re(/^([^.#@\$+\/'"*`(;{}-]*);/);if(t)return new Se.Anonymous(t[1],e)},permissiveValue:function(e){var t,i,r,a,l=e||";",u=s.i,c=[];function h(){var e=s.currentChar();return"string"==typeof l?e===l:l.test(e)}if(!h()){a=[];do{((i=this.comment())||(i=this.entity()))&&a.push(i)}while(i);if(r=h(),a.length>0){if(a=new Se.Expression(a),r)return a;c.push(a)," "===s.prevChar()&&c.push(new Se.Anonymous(" ",u))}if(s.save(),a=s.$parseUntil(l)){if("string"==typeof a&&o("Expected '"+a+"'","Parse"),1===a.length&&" "===a[0])return s.forget(),new Se.Anonymous("",u);var f=void 0;for(t=0;t0)return new Se.Expression(r)},mediaFeatures:function(){var e,t=this.entities,i=[];do{if(e=this.mediaFeature()){if(i.push(e),!s.$char(","))break}else if((e=t.variable()||t.mixinLookup())&&(i.push(e),!s.$char(",")))break}while(e);return i.length>0?i:null},media:function(){var e,i,r,a,l=s.i;if(t.dumpLineNumbers&&(a=u(l)),s.save(),s.$str("@media"))return e=this.mediaFeatures(),(i=this.block())||o("media definitions require block statements after any features"),s.forget(),r=new Se.Media(i,e,l,n),t.dumpLineNumbers&&(r.debugInfo=a),r;s.restore()},plugin:function(){var e,t,i,r=s.i;if(s.$re(/^@plugin?\s+/)){if(i=(t=this.pluginArgs())?{pluginArgs:t,isPlugin:!0}:{isPlugin:!0},e=this.entities.quoted()||this.entities.url())return s.$char(";")||(s.i=r,o("missing semi-colon on @plugin")),new Se.Import(e,null,i,r,n);s.i=r,o("malformed @plugin statement")}},pluginArgs:function(){if(s.save(),!s.$char("("))return s.restore(),null;var e=s.$re(/^\s*([^\);]+)\)\s*/);return e[1]?(s.forget(),e[1].trim()):(s.restore(),null)},atrule:function(){var e,i,r,a,l,c,h,f=s.i,p=!0,v=!0;if("@"===s.currentChar()){if(i=this.import()||this.plugin()||this.media())return i;if(s.save(),e=s.$re(/^@[a-z-]+/)){switch(a=e,"-"==e.charAt(1)&&e.indexOf("-",2)>0&&(a="@"+e.slice(e.indexOf("-",2)+1)),a){case"@charset":l=!0,p=!1;break;case"@namespace":c=!0,p=!1;break;case"@keyframes":case"@counter-style":l=!0;break;case"@document":case"@supports":h=!0,v=!1;break;default:h=!0}if(s.commentStore.length=0,l?(i=this.entity())||o("expected "+e+" identifier"):c?(i=this.expression())||o("expected "+e+" expression"):h&&(i=this.permissiveValue(/^[{;]/),p="{"===s.currentChar(),i?i.value||(i=null):p||";"===s.currentChar()||o(e+" rule is missing block or ending semi-colon")),p&&(r=this.blockRuleset()),r||!p&&i&&s.$char(";"))return s.forget(),new Se.AtRule(e,i,r,f,n,t.dumpLineNumbers?u(f):null,v);s.restore("at-rule options not recognised")}}},value:function(){var e,t=[],i=s.i;do{if((e=this.expression())&&(t.push(e),!s.$char(",")))break}while(e);if(t.length>0)return new Se.Value(t,i)},important:function(){if("!"===s.currentChar())return s.$re(/^! *important/)},sub:function(){var e,t;if(s.save(),s.$char("("))return(e=this.addition())&&s.$char(")")?(s.forget(),(t=new Se.Expression([e])).parens=!0,t):void s.restore("Expected ')'");s.restore()},multiplication:function(){var e,t,i,n,r;if(e=this.operand()){for(r=s.isWhitespace(-1);!s.peek(/^\/[*\/]/);){if(s.save(),!(i=s.$char("/")||s.$char("*")||s.$str("./"))){s.forget();break}if(!(t=this.operand())){s.restore();break}s.forget(),e.parensInOp=!0,t.parensInOp=!0,n=new Se.Operation(i,[n||e,t],r),r=s.isWhitespace(-1)}return n||e}},addition:function(){var e,t,i,n,r;if(e=this.multiplication()){for(r=s.isWhitespace(-1);(i=s.$re(/^[-+]\s+/)||!r&&(s.$char("+")||s.$char("-")))&&(t=this.multiplication());)e.parensInOp=!0,t.parensInOp=!0,n=new Se.Operation(i,[n||e,t],r),r=s.isWhitespace(-1);return n||e}},conditions:function(){var e,t,i,n=s.i;if(e=this.condition(!0)){for(;s.peek(/^,\s*(not\s*)?\(/)&&s.$char(",")&&(t=this.condition(!0));)i=new Se.Condition("or",i||e,t,n);return i||e}},condition:function(e){var t,i,n;if(t=this.conditionAnd(e)){if(i=s.$str("or")){if(!(n=this.condition(e)))return;t=new Se.Condition(i,t,n)}return t}},conditionAnd:function(e){var t,i,n,r,o=this;if(t=(r=o.negatedCondition(e)||o.parenthesisCondition(e))||e?r:o.atomicCondition(e)){if(i=s.$str("and")){if(!(n=this.conditionAnd(e)))return;t=new Se.Condition(i,t,n)}return t}},negatedCondition:function(e){if(s.$str("not")){var t=this.parenthesisCondition(e);return t&&(t.negate=!t.negate),t}},parenthesisCondition:function(e){var t;if(s.save(),s.$str("(")){if(t=function(t){var i;if(s.save(),i=t.condition(e)){if(s.$char(")"))return s.forget(),i;s.restore()}else s.restore()}(this))return s.forget(),t;if(t=this.atomicCondition(e)){if(s.$char(")"))return s.forget(),t;s.restore("expected ')' got '"+s.currentChar()+"'")}else s.restore()}else s.restore()},atomicCondition:function(e){var t,i,n,r,a=this.entities,l=s.i;function u(){return this.addition()||a.keyword()||a.quoted()||a.mixinLookup()}if(t=(u=u.bind(this))())return s.$char(">")?r=s.$char("=")?">=":">":s.$char("<")?r=s.$char("=")?"<=":"<":s.$char("=")&&(r=s.$char(">")?"=>":s.$char("<")?"=<":"="),r?(i=u())?n=new Se.Condition(r,t,i,l,!1):o("expected expression"):n=new Se.Condition("=",t,new Se.Keyword("true"),l,!1),n},operand:function(){var e,t=this.entities;s.peek(/^-[@\$\(]/)&&(e=s.$char("-"));var i=this.sub()||t.dimension()||t.color()||t.variable()||t.property()||t.call()||t.quoted(!0)||t.colorKeyword()||t.mixinLookup();return e&&(i.parensInOp=!0,i=new Se.Negative(i)),i},expression:function(){var e,t,i=[],n=s.i;do{(e=this.comment())?i.push(e):((e=this.addition()||this.entity())instanceof Se.Comment&&(e=null),e&&(i.push(e),s.peek(/^\/[\/*]/)||(t=s.$char("/"))&&i.push(new Se.Anonymous(t,n))))}while(e);if(i.length>0)return new Se.Expression(i)},property:function(){var e=s.$re(/^(\*?-?[_a-zA-Z0-9-]+)\s*:/);if(e)return e[1]},ruleProperty:function(){var e,t,i=[],r=[];s.save();var o=s.$re(/^([_a-zA-Z0-9-]+)\s*:/);if(o)return i=[new Se.Keyword(o[1])],s.forget(),i;function a(e){var t=s.i,n=s.$re(e);if(n)return r.push(t),i.push(n[1])}for(a(/^(\*?)/);a(/^((?:[\w-]+)|(?:[@\$]\{[\w-]+\}))/););if(i.length>1&&a(/^((?:\+_|\+)?)\s*:/)){for(s.forget(),""===i[0]&&(i.shift(),r.shift()),t=0;t1?e-1:e)<1?r+(s-r)*e*6:2*e<1?s:3*e<2?r+(s-r)*(2/3-e)*6:r}e=Je(e)%360/360,t=Te(Je(t)),i=Te(Je(i)),n=Te(Je(n)),r=2*i-(s=i<=.5?i*(t+1):i+t-i*t);var a=[255*o(e+1/3),255*o(e),255*o(e-1/3)];return n=Je(n),new c(a,n,"hsla")}catch(e){}},hsv:function(e,t,i){return Ue.hsva(e,t,i,1)},hsva:function(e,t,i,n){var r,s;e=Je(e)%360/360*360,t=Je(t),i=Je(i),n=Je(n);var o=[i,i*(1-t),i*(1-(s=e/60-(r=Math.floor(e/60%6)))*t),i*(1-(1-s)*t)],a=[[0,3,1],[2,0,1],[1,0,3],[1,2,0],[3,1,0],[0,1,2]];return Ue.rgba(255*o[a[r][0]],255*o[a[r][1]],255*o[a[r][2]],n)},hue:function(e){return new X(Ge(e).h)},saturation:function(e){return new X(100*Ge(e).s,"%")},lightness:function(e){return new X(100*Ge(e).l,"%")},hsvhue:function(e){return new X(We(e).h)},hsvsaturation:function(e){return new X(100*We(e).s,"%")},hsvvalue:function(e){return new X(100*We(e).v,"%")},red:function(e){return new X(e.rgb[0])},green:function(e){return new X(e.rgb[1])},blue:function(e){return new X(e.rgb[2])},alpha:function(e){return new X(Ge(e).a)},luma:function(e){return new X(e.luma()*e.alpha*100,"%")},luminance:function(e){var t=.2126*e.rgb[0]/255+.7152*e.rgb[1]/255+.0722*e.rgb[2]/255;return new X(t*e.alpha*100,"%")},saturate:function(e,t,i){if(!e.rgb)return null;var n=Ge(e);return void 0!==i&&"relative"===i.value?n.s+=n.s*t.value/100:n.s+=t.value/100,n.s=Te(n.s),ze(e,n)},desaturate:function(e,t,i){var n=Ge(e);return void 0!==i&&"relative"===i.value?n.s-=n.s*t.value/100:n.s-=t.value/100,n.s=Te(n.s),ze(e,n)},lighten:function(e,t,i){var n=Ge(e);return void 0!==i&&"relative"===i.value?n.l+=n.l*t.value/100:n.l+=t.value/100,n.l=Te(n.l),ze(e,n)},darken:function(e,t,i){var n=Ge(e);return void 0!==i&&"relative"===i.value?n.l-=n.l*t.value/100:n.l-=t.value/100,n.l=Te(n.l),ze(e,n)},fadein:function(e,t,i){var n=Ge(e);return void 0!==i&&"relative"===i.value?n.a+=n.a*t.value/100:n.a+=t.value/100,n.a=Te(n.a),ze(e,n)},fadeout:function(e,t,i){var n=Ge(e);return void 0!==i&&"relative"===i.value?n.a-=n.a*t.value/100:n.a-=t.value/100,n.a=Te(n.a),ze(e,n)},fade:function(e,t){var i=Ge(e);return i.a=t.value/100,i.a=Te(i.a),ze(e,i)},spin:function(e,t){var i=Ge(e),n=(i.h+t.value)%360;return i.h=n<0?360+n:n,ze(e,i)},mix:function(e,t,i){i||(i=new X(50));var n=i.value/100,r=2*n-1,s=Ge(e).a-Ge(t).a,o=((r*s==-1?r:(r+s)/(1+r*s))+1)/2,a=1-o,l=[e.rgb[0]*o+t.rgb[0]*a,e.rgb[1]*o+t.rgb[1]*a,e.rgb[2]*o+t.rgb[2]*a],u=e.alpha*n+t.alpha*(1-n);return new c(l,u)},greyscale:function(e){return Ue.desaturate(e,new X(100))},contrast:function(e,t,i,n){if(!e.rgb)return null;if(void 0===i&&(i=Ue.rgba(255,255,255,1)),void 0===t&&(t=Ue.rgba(0,0,0,1)),t.luma()>i.luma()){var r=i;i=t,t=r}return n=void 0===n?.43:Je(n),e.luma().5&&(n=1,i=e>.25?Math.sqrt(e):((16*e-12)*e+4)*e),e-(1-2*t)*n*(i-e)},hardlight:function(e,t){return Ke.overlay(t,e)},difference:function(e,t){return Math.abs(e-t)},exclusion:function(e,t){return e+t-2*e*t},average:function(e,t){return(e+t)/2},negation:function(e,t){return 1-Math.abs(e+t-1)}};for(var Ze in Ke)Ke.hasOwnProperty(Ze)&&(Qe[Ze]=Qe.bind(null,Ke[Ze]));var Xe=function(e){return Array.isArray(e.value)?e.value:Array(e)},Ye={_SELF:function(e){return e},"~":function(){for(var e=[],t=0;to.value)&&(c[n]=r);else{if(void 0!==l&&a!==l)throw{type:"Argument",message:"incompatible types"};h[a]=c.length,c.push(r)}else Array.isArray(t[i].value)&&Array.prototype.push.apply(t,Array.prototype.slice.call(t[i].value));return 1==c.length?c[0]:(t=c.map((function(e){return e.toCSS(this.context)})).join(this.context.compress?",":", "),new $((e?"min":"max")+"("+t+")"))},rt={min:function(){for(var e=[],t=0;t",r=0;r";return n+="',n=encodeURIComponent(n),new le(new ae("'"+(n="data:image/svg+xml,"+n)+"'",n,!1,this.index,this.currentFileInfo),this.index,this.currentFileInfo)}}),W.addMultiple(lt),t};function ct(e,t){var i,n=(t=t||{}).variables,r=new B.Eval(t);"object"!=typeof n||Array.isArray(n)||(n=Object.keys(n).map((function(e){var t=n[e];return t instanceof Se.Value||(t instanceof Se.Expression||(t=new Se.Expression([t])),t=new Se.Value([t])),new Se.Declaration("@"+e,t,!1,null,0)})),r.frames=[new Se.Ruleset(null,n)]);var s,o,a=[new Ne.JoinSelectorVisitor,new Ne.MarkVisibleSelectorsVisitor(!0),new Ne.ExtendVisitor,new Ne.ToCSSVisitor({compress:Boolean(t.compress)})],l=[];if(t.pluginManager){o=t.pluginManager.visitor();for(var u=0;u<2;u++)for(o.first();s=o.get();)s.isPreEvalVisitor?0!==u&&-1!==l.indexOf(s)||(l.push(s),s.run(e)):0!==u&&-1!==a.indexOf(s)||(s.isPreVisitor?a.unshift(s):a.push(s))}i=e.eval(r);for(u=0;u=t);i++);this.preProcessors.splice(i,0,{preProcessor:e,priority:t})},e.prototype.addPostProcessor=function(e,t){var i;for(i=0;i=t);i++);this.postProcessors.splice(i,0,{postProcessor:e,priority:t})},e.prototype.addFileManager=function(e){this.fileManagers.push(e)},e.prototype.getPreProcessors=function(){for(var e=[],t=0;t0){var n=void 0,r=JSON.stringify(this._sourceMapGenerator.toJSON());this.sourceMapURL?n=this.sourceMapURL:this._sourceMapFilename&&(n=this._sourceMapFilename),this.sourceMapURL=n,this.sourceMap=r}return this._css.join("")},t}()}(e=new s(e,t)),e)),a=function(e){return function(){function t(e,t,i){this.less=e,this.rootFilename=i.filename,this.paths=t.paths||[],this.contents={},this.contentsIgnoredChars={},this.mime=t.mime,this.error=null,this.context=t,this.queue=[],this.files={}}return t.prototype.push=function(t,i,n,s,o){var a=this,l=this.context.pluginManager.Loader;this.queue.push(t);var u=function(e,i,n){a.queue.splice(a.queue.indexOf(t),1);var l=n===a.rootFilename;s.optional&&e?(o(null,{rules:[]},!1,null),r.info("The file "+n+" was skipped because it was not found and the import was marked optional.")):(a.files[n]||s.inline||(a.files[n]={root:i,options:s}),e&&!a.error&&(a.error=e),o(e,i,l,n))},c={rewriteUrls:this.context.rewriteUrls,entryPath:n.entryPath,rootpath:n.rootpath,rootFilename:n.rootFilename},h=e.getFileManager(t,n.currentDirectory,this.context,e);if(h){var f,p,v=function(e){var t,i=e.filename,r=e.contents.replace(/^\uFEFF/,"");c.currentDirectory=h.getPath(i),c.rewriteUrls&&(c.rootpath=h.join(a.context.rootpath||"",h.pathDiff(c.currentDirectory,c.entryPath)),!h.isPathAbsolute(c.rootpath)&&h.alwaysMakePathsAbsolute()&&(c.rootpath=h.join(c.entryPath,c.rootpath))),c.filename=i;var o=new B.Parse(a.context);o.processImports=!1,a.contents[i]=r,(n.reference||s.reference)&&(c.reference=!0),s.isPlugin?(t=l.evalPlugin(r,o,a,s.pluginArgs,c))instanceof P?u(t,null,i):u(null,t,i):s.inline?u(null,r,i):!a.files[i]||a.files[i].options.multiple||s.multiple?new je(o,a,c).parse(r,(function(e,t){u(e,t,i)})):u(null,a.files[i].root,i)},d=C(this.context);i&&(d.ext=s.isPlugin?".js":".less"),s.isPlugin?(d.mime="application/javascript",d.syncImport?f=l.loadPluginSync(t,n.currentDirectory,d,e,h):p=l.loadPlugin(t,n.currentDirectory,d,e,h)):d.syncImport?f=h.loadFileSync(t,n.currentDirectory,d,e):p=h.loadFile(t,n.currentDirectory,d,e,(function(e,t){e?u(e):v(t)})),f?f.filename?v(f):u(f):p&&p.then(v,u)}else u({message:"Could not find a file-manager for "+t})},t}()}(e);var u,c=function(e,t,i){var n=function(e,i,r){if("function"==typeof i?(r=i,i=_(this.options,{})):i=_(this.options,i||{}),!r){var s=this;return new Promise((function(t,r){n.call(s,e,i,(function(e,i){e?r(e):t(i)}))}))}this.parse(e,i,(function(e,i,n,s){if(e)return r(e);var o;try{o=new t(i,n).toCSS(s)}catch(e){return r(e)}r(null,o)}))};return n}(0,o),h=function(e,t,i){var n=function(e,t,r){if("function"==typeof t?(r=t,t=_(this.options,{})):t=_(this.options,t||{}),!r){var s=this;return new Promise((function(i,r){n.call(s,e,t,(function(e,t){e?r(e):i(t)}))}))}var o,a=void 0,l=new dt(this,!t.reUsePluginManager);if(t.pluginManager=l,o=new B.Parse(t),t.rootFileInfo)a=t.rootFileInfo;else{var u=t.filename||"input",c=u.replace(/[^\/\\]*$/,"");(a={filename:u,rewriteUrls:o.rewriteUrls,rootpath:o.rootpath||"",currentDirectory:c,entryPath:c,rootFilename:u}).rootpath&&"/"!==a.rootpath.slice(-1)&&(a.rootpath+="/")}var h=new i(this,o,a);this.importManager=h,t.plugins&&t.plugins.forEach((function(e){var t,i;if(e.fileContent){if(i=e.fileContent.replace(/^\uFEFF/,""),(t=l.Loader.evalPlugin(i,o,h,e.options,e.filename))instanceof P)return r(t)}else l.addPlugin(e)})),new je(o,h,a).parse(e,(function(e,i){if(e)return r(e);r(null,i,h,t)}),t)};return n}(0,0,a),f={version:[4,0,0],data:l,tree:Se,Environment:s,AbstractFileManager:Ie,AbstractPluginLoader:Ce,environment:e,visitors:Ne,Parser:je,functions:ut(e),contexts:B,SourceMapOutput:i,SourceMapBuilder:n,ParseTree:o,ImportManager:a,render:c,parse:h,LessError:P,transformTree:ct,utils:M,PluginManager:dt,logger:r},p=function(e){return function(){var t=Object.create(e.prototype);return e.apply(t,Array.prototype.slice.call(arguments,0)),t}},v=Object.create(f);for(var d in f.tree)if("function"==typeof(u=f.tree[d]))v[d.toLowerCase()]=p(u);else for(var m in v[d]=Object.create(null),u)v[d][m.toLowerCase()]=p(u[m]);return f.parse=f.parse.bind(v),f.render=f.render.bind(v),v}var gt={},yt=function(){};yt.prototype=Object.assign(new Ie,{alwaysMakePathsAbsolute:function(){return!0},join:function(e,t){return e?this.extractUrlParts(t,e).path:t},doXHR:function(e,t,i,n){var r=new XMLHttpRequest,s=!ft.isFileProtocol||ft.fileAsync;function o(t,i,n){t.status>=200&&t.status<300?i(t.responseText,t.getResponseHeader("Last-Modified")):"function"==typeof n&&n(t.status,e)}"function"==typeof r.overrideMimeType&&r.overrideMimeType("text/css"),pt.debug("XHR: Getting '"+e+"'"),r.open("GET",e,s),r.setRequestHeader("Accept",t||"text/x-less, text/css; q=0.9, */*; q=0.5"),r.send(null),ft.isFileProtocol&&!ft.fileAsync?0===r.status||r.status>=200&&r.status<300?i(r.responseText):n(r.status,e):s?r.onreadystatechange=function(){4==r.readyState&&o(r,i,n)}:o(r,i,n)},supports:function(){return!0},clearFileCache:function(){gt={}},loadFile:function(e,t,i,n){t&&!this.isPathAbsolute(e)&&(e=t+e),e=i.ext?this.tryAppendExtension(e,i.ext):e,i=i||{};var r=this.extractUrlParts(e,window.location.href).url,s=this;return new Promise((function(e,t){if(i.useFileCache&>[r])try{var n=gt[r];return e({contents:n,filename:r,webInfo:{lastModified:new Date}})}catch(e){return t({filename:r,message:"Error loading file "+r+" error was "+e.message})}s.doXHR(r,i.mime,(function(t,i){gt[r]=t,e({contents:t,filename:r,webInfo:{lastModified:i}})}),(function(e,i){t({type:"File",message:"'"+i+"' wasn't found ("+e+")",href:r})}))}))}});var bt=function(e,t){return ft=e,pt=t,yt},wt=function(e){this.less=e};wt.prototype=Object.assign(new Ce,{loadPlugin:function(e,t,i,n,r){return new Promise((function(s,o){r.loadFile(e,t,i,n).then(s).catch(o)}))}});var xt=function(t,n,r){return{add:function(s,o){r.errorReporting&&"html"!==r.errorReporting?"console"===r.errorReporting?function(e,t){var i=e.filename||t,s=[],o=(e.type||"Syntax")+"Error: "+(e.message||"There is an error in your .less file")+" in "+i,a=function(e,t,i){void 0!==e.extract[t]&&s.push("{line} {content}".replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,i).replace(/\{content\}/,e.extract[t]))};e.line&&(a(e,0,""),a(e,1,"line"),a(e,2,""),o+=" on line "+e.line+", column "+(e.column+1)+":\n"+s.join("\n")),e.stack&&(e.extract||r.logLevel>=4)&&(o+="\nStack Trace\n"+e.stack),n.logger.error(o)}(s,o):"function"==typeof r.errorReporting&&r.errorReporting("add",s,o):function(n,s){var o,a,l="less-error-message:"+e(s||""),u=t.document.createElement("div"),c=[],h=n.filename||s,f=h.match(/([^\/]+(\?.*)?)$/)[1];u.id=l,u.className="less-error-message",a="

    "+(n.type||"Syntax")+"Error: "+(n.message||"There is an error in your .less file")+'

    in '+f+" ";var p=function(e,t,i){void 0!==e.extract[t]&&c.push('

  • {content}
  • '.replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,i).replace(/\{content\}/,e.extract[t]))};n.line&&(p(n,0,""),p(n,1,"line"),p(n,2,""),a+="on line "+n.line+", column "+(n.column+1)+":

      "+c.join("")+"
    "),n.stack&&(n.extract||r.logLevel>=4)&&(a+="
    Stack Trace
    "+n.stack.split("\n").slice(1).join("
    ")),u.innerHTML=a,i(t.document,[".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #dd6666;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.line {","color: #ff0000;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),u.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),"development"===r.env&&(o=setInterval((function(){var e=t.document,i=e.body;i&&(e.getElementById(l)?i.replaceChild(u,e.getElementById(l)):i.insertBefore(u,i.firstChild),clearInterval(o))}),10))}(s,o)},remove:function(i){r.errorReporting&&"html"!==r.errorReporting?"console"===r.errorReporting||"function"==typeof r.errorReporting&&r.errorReporting("remove",i):function(i){var n=t.document.getElementById("less-error-message:"+e(i));n&&n.parentNode.removeChild(n)}(i)}}},St={javascriptEnabled:!1,depends:!1,compress:!1,lint:!1,paths:[],color:!0,strictImports:!1,insecure:!1,rootpath:"",rewriteUrls:!1,math:1,strictUnits:!1,globalVars:null,modifyVars:null,urlArgs:""};if(window.less)for(var It in window.less)window.less.hasOwnProperty(It)&&(St[It]=window.less[It]);!function(e,i){t(i,n(e)),void 0===i.isFileProtocol&&(i.isFileProtocol=/^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(e.location.protocol)),i.async=i.async||!1,i.fileAsync=i.fileAsync||!1,i.poll=i.poll||(i.isFileProtocol?1e3:1500),i.env=i.env||("127.0.0.1"==e.location.hostname||"0.0.0.0"==e.location.hostname||"localhost"==e.location.hostname||e.location.port&&e.location.port.length>0||i.isFileProtocol?"development":"production");var r=/!dumpLineNumbers:(comments|mediaquery|all)/.exec(e.location.hash);r&&(i.dumpLineNumbers=r[1]),void 0===i.useFileCache&&(i.useFileCache=!0),void 0===i.onReady&&(i.onReady=!0),i.relativeUrls&&(i.rewriteUrls="all")}(window,St),St.plugins=St.plugins||[],window.LESS_PLUGINS&&(St.plugins=St.plugins.concat(window.LESS_PLUGINS));var Ct,kt,_t,At=function(e,n){var r=e.document,s=mt();s.options=n;var o=s.environment,a=bt(n,s.logger),l=new a;o.addFileManager(l),s.FileManager=a,s.PluginLoader=wt,function(e,t){t.logLevel=void 0!==t.logLevel?t.logLevel:"development"===t.env?3:1,t.loggers||(t.loggers=[{debug:function(e){t.logLevel>=4&&console.log(e)},info:function(e){t.logLevel>=3&&console.log(e)},warn:function(e){t.logLevel>=2&&console.warn(e)},error:function(e){t.logLevel>=1&&console.error(e)}}]);for(var i=0;i 0 && styleNode.childNodes.length > 0 &&\n oldStyleNode.firstChild.nodeValue === styleNode.firstChild.nodeValue);\n }\n\n const head = document.getElementsByTagName('head')[0];\n\n // If there is no oldStyleNode, just append; otherwise, only append if we need\n // to replace oldStyleNode with an updated stylesheet\n if (oldStyleNode === null || keepOldStyleNode === false) {\n const nextEl = sheet && sheet.nextSibling || null;\n if (nextEl) {\n nextEl.parentNode.insertBefore(styleNode, nextEl);\n } else {\n head.appendChild(styleNode);\n }\n }\n if (oldStyleNode && keepOldStyleNode === false) {\n oldStyleNode.parentNode.removeChild(oldStyleNode);\n }\n\n // For IE.\n // This needs to happen *after* the style element is added to the DOM, otherwise IE 7 and 8 may crash.\n // See http://social.msdn.microsoft.com/Forums/en-US/7e081b65-878a-4c22-8e68-c10d39c2ed32/internet-explorer-crashes-appending-style-element-to-head\n if (styleNode.styleSheet) {\n try {\n styleNode.styleSheet.cssText = styles;\n } catch (e) {\n throw new Error('Couldn\\'t reassign styleSheet.cssText.');\n }\n }\n },\n currentScript: function(window) {\n const document = window.document;\n return document.currentScript || (() => {\n const scripts = document.getElementsByTagName('script');\n return scripts[scripts.length - 1];\n })();\n }\n};\n","export default {\n error: function(msg) {\n this._fireEvent('error', msg);\n },\n warn: function(msg) {\n this._fireEvent('warn', msg);\n },\n info: function(msg) {\n this._fireEvent('info', msg);\n },\n debug: function(msg) {\n this._fireEvent('debug', msg);\n },\n addListener: function(listener) {\n this._listeners.push(listener);\n },\n removeListener: function(listener) {\n for (let i = 0; i < this._listeners.length; i++) {\n if (this._listeners[i] === listener) {\n this._listeners.splice(i, 1);\n return;\n }\n }\n },\n _fireEvent: function(type, msg) {\n for (let i = 0; i < this._listeners.length; i++) {\n const logFunction = this._listeners[i][type];\n if (logFunction) {\n logFunction(msg);\n }\n }\n },\n _listeners: []\n};\n","/**\n * @todo Document why this abstraction exists, and the relationship between\n * environment, file managers, and plugin manager\n */\n\nimport logger from '../logger';\n\nclass Environment {\n constructor(externalEnvironment, fileManagers) {\n this.fileManagers = fileManagers || [];\n externalEnvironment = externalEnvironment || {};\n\n const optionalFunctions = ['encodeBase64', 'mimeLookup', 'charsetLookup', 'getSourceMapGenerator'];\n const requiredFunctions = [];\n const functions = requiredFunctions.concat(optionalFunctions);\n\n for (let i = 0; i < functions.length; i++) {\n const propName = functions[i];\n const environmentFunc = externalEnvironment[propName];\n if (environmentFunc) {\n this[propName] = environmentFunc.bind(externalEnvironment);\n } else if (i < requiredFunctions.length) {\n this.warn(`missing required function in environment - ${propName}`);\n }\n }\n }\n\n getFileManager(filename, currentDirectory, options, environment, isSync) {\n\n if (!filename) {\n logger.warn('getFileManager called with no filename.. Please report this issue. continuing.');\n }\n if (currentDirectory == null) {\n logger.warn('getFileManager called with null directory.. Please report this issue. continuing.');\n }\n\n let fileManagers = this.fileManagers;\n if (options.pluginManager) {\n fileManagers = [].concat(fileManagers).concat(options.pluginManager.getFileManagers());\n }\n for (let i = fileManagers.length - 1; i >= 0 ; i--) {\n const fileManager = fileManagers[i];\n if (fileManager[isSync ? 'supportsSync' : 'supports'](filename, currentDirectory, options, environment)) {\n return fileManager;\n }\n }\n return null;\n }\n\n addFileManager(fileManager) {\n this.fileManagers.push(fileManager);\n }\n\n clearFileManagers() {\n this.fileManagers = [];\n }\n}\n\nexport default Environment;\n","export default {\n 'aliceblue':'#f0f8ff',\n 'antiquewhite':'#faebd7',\n 'aqua':'#00ffff',\n 'aquamarine':'#7fffd4',\n 'azure':'#f0ffff',\n 'beige':'#f5f5dc',\n 'bisque':'#ffe4c4',\n 'black':'#000000',\n 'blanchedalmond':'#ffebcd',\n 'blue':'#0000ff',\n 'blueviolet':'#8a2be2',\n 'brown':'#a52a2a',\n 'burlywood':'#deb887',\n 'cadetblue':'#5f9ea0',\n 'chartreuse':'#7fff00',\n 'chocolate':'#d2691e',\n 'coral':'#ff7f50',\n 'cornflowerblue':'#6495ed',\n 'cornsilk':'#fff8dc',\n 'crimson':'#dc143c',\n 'cyan':'#00ffff',\n 'darkblue':'#00008b',\n 'darkcyan':'#008b8b',\n 'darkgoldenrod':'#b8860b',\n 'darkgray':'#a9a9a9',\n 'darkgrey':'#a9a9a9',\n 'darkgreen':'#006400',\n 'darkkhaki':'#bdb76b',\n 'darkmagenta':'#8b008b',\n 'darkolivegreen':'#556b2f',\n 'darkorange':'#ff8c00',\n 'darkorchid':'#9932cc',\n 'darkred':'#8b0000',\n 'darksalmon':'#e9967a',\n 'darkseagreen':'#8fbc8f',\n 'darkslateblue':'#483d8b',\n 'darkslategray':'#2f4f4f',\n 'darkslategrey':'#2f4f4f',\n 'darkturquoise':'#00ced1',\n 'darkviolet':'#9400d3',\n 'deeppink':'#ff1493',\n 'deepskyblue':'#00bfff',\n 'dimgray':'#696969',\n 'dimgrey':'#696969',\n 'dodgerblue':'#1e90ff',\n 'firebrick':'#b22222',\n 'floralwhite':'#fffaf0',\n 'forestgreen':'#228b22',\n 'fuchsia':'#ff00ff',\n 'gainsboro':'#dcdcdc',\n 'ghostwhite':'#f8f8ff',\n 'gold':'#ffd700',\n 'goldenrod':'#daa520',\n 'gray':'#808080',\n 'grey':'#808080',\n 'green':'#008000',\n 'greenyellow':'#adff2f',\n 'honeydew':'#f0fff0',\n 'hotpink':'#ff69b4',\n 'indianred':'#cd5c5c',\n 'indigo':'#4b0082',\n 'ivory':'#fffff0',\n 'khaki':'#f0e68c',\n 'lavender':'#e6e6fa',\n 'lavenderblush':'#fff0f5',\n 'lawngreen':'#7cfc00',\n 'lemonchiffon':'#fffacd',\n 'lightblue':'#add8e6',\n 'lightcoral':'#f08080',\n 'lightcyan':'#e0ffff',\n 'lightgoldenrodyellow':'#fafad2',\n 'lightgray':'#d3d3d3',\n 'lightgrey':'#d3d3d3',\n 'lightgreen':'#90ee90',\n 'lightpink':'#ffb6c1',\n 'lightsalmon':'#ffa07a',\n 'lightseagreen':'#20b2aa',\n 'lightskyblue':'#87cefa',\n 'lightslategray':'#778899',\n 'lightslategrey':'#778899',\n 'lightsteelblue':'#b0c4de',\n 'lightyellow':'#ffffe0',\n 'lime':'#00ff00',\n 'limegreen':'#32cd32',\n 'linen':'#faf0e6',\n 'magenta':'#ff00ff',\n 'maroon':'#800000',\n 'mediumaquamarine':'#66cdaa',\n 'mediumblue':'#0000cd',\n 'mediumorchid':'#ba55d3',\n 'mediumpurple':'#9370d8',\n 'mediumseagreen':'#3cb371',\n 'mediumslateblue':'#7b68ee',\n 'mediumspringgreen':'#00fa9a',\n 'mediumturquoise':'#48d1cc',\n 'mediumvioletred':'#c71585',\n 'midnightblue':'#191970',\n 'mintcream':'#f5fffa',\n 'mistyrose':'#ffe4e1',\n 'moccasin':'#ffe4b5',\n 'navajowhite':'#ffdead',\n 'navy':'#000080',\n 'oldlace':'#fdf5e6',\n 'olive':'#808000',\n 'olivedrab':'#6b8e23',\n 'orange':'#ffa500',\n 'orangered':'#ff4500',\n 'orchid':'#da70d6',\n 'palegoldenrod':'#eee8aa',\n 'palegreen':'#98fb98',\n 'paleturquoise':'#afeeee',\n 'palevioletred':'#d87093',\n 'papayawhip':'#ffefd5',\n 'peachpuff':'#ffdab9',\n 'peru':'#cd853f',\n 'pink':'#ffc0cb',\n 'plum':'#dda0dd',\n 'powderblue':'#b0e0e6',\n 'purple':'#800080',\n 'rebeccapurple':'#663399',\n 'red':'#ff0000',\n 'rosybrown':'#bc8f8f',\n 'royalblue':'#4169e1',\n 'saddlebrown':'#8b4513',\n 'salmon':'#fa8072',\n 'sandybrown':'#f4a460',\n 'seagreen':'#2e8b57',\n 'seashell':'#fff5ee',\n 'sienna':'#a0522d',\n 'silver':'#c0c0c0',\n 'skyblue':'#87ceeb',\n 'slateblue':'#6a5acd',\n 'slategray':'#708090',\n 'slategrey':'#708090',\n 'snow':'#fffafa',\n 'springgreen':'#00ff7f',\n 'steelblue':'#4682b4',\n 'tan':'#d2b48c',\n 'teal':'#008080',\n 'thistle':'#d8bfd8',\n 'tomato':'#ff6347',\n 'turquoise':'#40e0d0',\n 'violet':'#ee82ee',\n 'wheat':'#f5deb3',\n 'white':'#ffffff',\n 'whitesmoke':'#f5f5f5',\n 'yellow':'#ffff00',\n 'yellowgreen':'#9acd32'\n};","export default {\n length: {\n 'm': 1,\n 'cm': 0.01,\n 'mm': 0.001,\n 'in': 0.0254,\n 'px': 0.0254 / 96,\n 'pt': 0.0254 / 72,\n 'pc': 0.0254 / 72 * 12\n },\n duration: {\n 's': 1,\n 'ms': 0.001\n },\n angle: {\n 'rad': 1 / (2 * Math.PI),\n 'deg': 1 / 360,\n 'grad': 1 / 400,\n 'turn': 1\n }\n};","import colors from './colors';\nimport unitConversions from './unit-conversions';\n\nexport default { colors, unitConversions };\n","class Node {\n constructor() {\n this.parent = null;\n this.visibilityBlocks = undefined;\n this.nodeVisible = undefined;\n this.rootNode = null;\n this.parsed = null;\n\n const self = this;\n Object.defineProperty(this, 'currentFileInfo', {\n get: function() { return self.fileInfo(); }\n });\n Object.defineProperty(this, 'index', {\n get: function() { return self.getIndex(); }\n });\n\n }\n\n setParent(nodes, parent) {\n function set(node) {\n if (node && node instanceof Node) {\n node.parent = parent;\n }\n }\n if (Array.isArray(nodes)) {\n nodes.forEach(set);\n }\n else {\n set(nodes);\n }\n }\n\n getIndex() {\n return this._index || (this.parent && this.parent.getIndex()) || 0;\n }\n\n fileInfo() {\n return this._fileInfo || (this.parent && this.parent.fileInfo()) || {};\n }\n\n isRulesetLike() { return false; }\n\n toCSS(context) {\n const strs = [];\n this.genCSS(context, {\n add: function(chunk, fileInfo, index) {\n strs.push(chunk);\n },\n isEmpty: function () {\n return strs.length === 0;\n }\n });\n return strs.join('');\n }\n\n genCSS(context, output) {\n output.add(this.value);\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n eval() { return this; }\n\n _operate(context, op, a, b) {\n switch (op) {\n case '+': return a + b;\n case '-': return a - b;\n case '*': return a * b;\n case '/': return a / b;\n }\n }\n\n fround(context, value) {\n const precision = context && context.numPrecision;\n // add \"epsilon\" to ensure numbers like 1.000000005 (represented as 1.000000004999...) are properly rounded:\n return (precision) ? Number((value + 2e-16).toFixed(precision)) : value;\n }\n\n static compare(a, b) {\n /* returns:\n -1: a < b\n 0: a = b\n 1: a > b\n and *any* other value for a != b (e.g. undefined, NaN, -2 etc.) */\n\n if ((a.compare) &&\n // for \"symmetric results\" force toCSS-based comparison\n // of Quoted or Anonymous if either value is one of those\n !(b.type === 'Quoted' || b.type === 'Anonymous')) {\n return a.compare(b);\n } else if (b.compare) {\n return -b.compare(a);\n } else if (a.type !== b.type) {\n return undefined;\n }\n\n a = a.value;\n b = b.value;\n if (!Array.isArray(a)) {\n return a === b ? 0 : undefined;\n }\n if (a.length !== b.length) {\n return undefined;\n }\n for (let i = 0; i < a.length; i++) {\n if (Node.compare(a[i], b[i]) !== 0) {\n return undefined;\n }\n }\n return 0;\n }\n\n static numericCompare(a, b) {\n return a < b ? -1\n : a === b ? 0\n : a > b ? 1 : undefined;\n }\n\n // Returns true if this node represents root of ast imported by reference\n blocksVisibility() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n return this.visibilityBlocks !== 0;\n }\n\n addVisibilityBlock() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks + 1;\n }\n\n removeVisibilityBlock() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks - 1;\n }\n\n // Turns on node visibility - if called node will be shown in output regardless\n // of whether it comes from import by reference or not\n ensureVisibility() {\n this.nodeVisible = true;\n }\n\n // Turns off node visibility - if called node will NOT be shown in output regardless\n // of whether it comes from import by reference or not\n ensureInvisibility() {\n this.nodeVisible = false;\n }\n\n // return values:\n // false - the node must not be visible\n // true - the node must be visible\n // undefined or null - the node has the same visibility as its parent\n isVisible() {\n return this.nodeVisible;\n }\n\n visibilityInfo() {\n return {\n visibilityBlocks: this.visibilityBlocks,\n nodeVisible: this.nodeVisible\n };\n }\n\n copyVisibilityInfo(info) {\n if (!info) {\n return;\n }\n this.visibilityBlocks = info.visibilityBlocks;\n this.nodeVisible = info.nodeVisible;\n }\n}\n\nexport default Node;\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import Node from './node';\nimport colors from '../data/colors';\n\n//\n// RGB Colors - #ff0014, #eee\n//\nclass Color extends Node {\n constructor(rgb, a, originalForm) {\n super();\n\n const self = this;\n //\n // The end goal here, is to parse the arguments\n // into an integer triplet, such as `128, 255, 0`\n //\n // This facilitates operations and conversions.\n //\n if (Array.isArray(rgb)) {\n this.rgb = rgb;\n } else if (rgb.length >= 6) {\n this.rgb = [];\n rgb.match(/.{2}/g).map(function (c, i) {\n if (i < 3) {\n self.rgb.push(parseInt(c, 16));\n } else {\n self.alpha = (parseInt(c, 16)) / 255;\n }\n });\n } else {\n this.rgb = [];\n rgb.split('').map(function (c, i) {\n if (i < 3) {\n self.rgb.push(parseInt(c + c, 16));\n } else {\n self.alpha = (parseInt(c + c, 16)) / 255;\n }\n });\n }\n this.alpha = this.alpha || (typeof a === 'number' ? a : 1);\n if (typeof originalForm !== 'undefined') {\n this.value = originalForm;\n }\n }\n\n luma() {\n let r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255;\n\n r = (r <= 0.03928) ? r / 12.92 : Math.pow(((r + 0.055) / 1.055), 2.4);\n g = (g <= 0.03928) ? g / 12.92 : Math.pow(((g + 0.055) / 1.055), 2.4);\n b = (b <= 0.03928) ? b / 12.92 : Math.pow(((b + 0.055) / 1.055), 2.4);\n\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n }\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n }\n\n toCSS(context, doNotCompress) {\n const compress = context && context.compress && !doNotCompress;\n let color;\n let alpha;\n let colorFunction;\n let args = [];\n\n // `value` is set if this color was originally\n // converted from a named color string so we need\n // to respect this and try to output named color too.\n alpha = this.fround(context, this.alpha);\n\n if (this.value) {\n if (this.value.indexOf('rgb') === 0) {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n } else if (this.value.indexOf('hsl') === 0) {\n if (alpha < 1) {\n colorFunction = 'hsla';\n } else {\n colorFunction = 'hsl';\n }\n } else {\n return this.value;\n }\n } else {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n }\n\n switch (colorFunction) {\n case 'rgba':\n args = this.rgb.map(function (c) {\n return clamp(Math.round(c), 255);\n }).concat(clamp(alpha, 1));\n break;\n case 'hsla':\n args.push(clamp(alpha, 1));\n case 'hsl':\n color = this.toHSL();\n args = [\n this.fround(context, color.h),\n `${this.fround(context, color.s * 100)}%`,\n `${this.fround(context, color.l * 100)}%`\n ].concat(args);\n }\n\n if (colorFunction) {\n // Values are capped between `0` and `255`, rounded and zero-padded.\n return `${colorFunction}(${args.join(`,${compress ? '' : ' '}`)})`;\n }\n\n color = this.toRGB();\n\n if (compress) {\n const splitcolor = color.split('');\n\n // Convert color to short format\n if (splitcolor[1] === splitcolor[2] && splitcolor[3] === splitcolor[4] && splitcolor[5] === splitcolor[6]) {\n color = `#${splitcolor[1]}${splitcolor[3]}${splitcolor[5]}`;\n }\n }\n\n return color;\n }\n\n //\n // Operations have to be done per-channel, if not,\n // channels will spill onto each other. Once we have\n // our result, in the form of an integer triplet,\n // we create a new Color node to hold the result.\n //\n operate(context, op, other) {\n const rgb = new Array(3);\n const alpha = this.alpha * (1 - other.alpha) + other.alpha;\n for (let c = 0; c < 3; c++) {\n rgb[c] = this._operate(context, op, this.rgb[c], other.rgb[c]);\n }\n return new Color(rgb, alpha);\n }\n\n toRGB() {\n return toHex(this.rgb);\n }\n\n toHSL() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h;\n let s;\n const l = (max + min) / 2;\n const d = max - min;\n\n if (max === min) {\n h = s = 0;\n } else {\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, l, a };\n }\n\n // Adapted from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript\n toHSV() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h;\n let s;\n const v = max;\n\n const d = max - min;\n if (max === 0) {\n s = 0;\n } else {\n s = d / max;\n }\n\n if (max === min) {\n h = 0;\n } else {\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, v, a };\n }\n\n toARGB() {\n return toHex([this.alpha * 255].concat(this.rgb));\n }\n\n compare(x) {\n return (x.rgb &&\n x.rgb[0] === this.rgb[0] &&\n x.rgb[1] === this.rgb[1] &&\n x.rgb[2] === this.rgb[2] &&\n x.alpha === this.alpha) ? 0 : undefined;\n }\n\n static fromKeyword(keyword) {\n let c;\n const key = keyword.toLowerCase();\n if (colors.hasOwnProperty(key)) {\n c = new Color(colors[key].slice(1));\n }\n else if (key === 'transparent') {\n c = new Color([0, 0, 0], 0);\n }\n\n if (c) {\n c.value = keyword;\n return c;\n }\n }\n}\n\nColor.prototype.type = 'Color';\n\nfunction clamp(v, max) {\n return Math.min(Math.max(v, 0), max);\n}\n\nfunction toHex(v) {\n return `#${v.map(function (c) {\n c = clamp(Math.round(c), 255);\n return (c < 16 ? '0' : '') + c.toString(16);\n}).join('')}`;\n}\n\nexport default Color;\n","import Node from './node';\n\nclass Paren extends Node {\n constructor(node) {\n super();\n\n this.value = node;\n }\n\n genCSS(context, output) {\n output.add('(');\n this.value.genCSS(context, output);\n output.add(')');\n }\n\n eval(context) {\n return new Paren(this.value.eval(context));\n }\n}\n\nParen.prototype.type = 'Paren';\nexport default Paren;\n","import Node from './node';\nconst _noSpaceCombinators = {\n '': true,\n ' ': true,\n '|': true\n};\n\nclass Combinator extends Node {\n constructor(value) {\n super();\n\n if (value === ' ') {\n this.value = ' ';\n this.emptyOrWhitespace = true;\n } else {\n this.value = value ? value.trim() : '';\n this.emptyOrWhitespace = this.value === '';\n }\n }\n\n genCSS(context, output) {\n const spaceOrEmpty = (context.compress || _noSpaceCombinators[this.value]) ? '' : ' ';\n output.add(spaceOrEmpty + this.value + spaceOrEmpty);\n }\n}\n\nCombinator.prototype.type = 'Combinator';\n\nexport default Combinator;\n","import Node from './node';\nimport Paren from './paren';\nimport Combinator from './combinator';\n\nclass Element extends Node {\n constructor(combinator, value, isVariable, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.combinator = combinator instanceof Combinator ?\n combinator : new Combinator(combinator);\n\n if (typeof value === 'string') {\n this.value = value.trim();\n } else if (value) {\n this.value = value;\n } else {\n this.value = '';\n }\n this.isVariable = isVariable;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.combinator, this);\n }\n\n accept(visitor) {\n const value = this.value;\n this.combinator = visitor.visit(this.combinator);\n if (typeof value === 'object') {\n this.value = visitor.visit(value);\n }\n }\n\n eval(context) {\n return new Element(this.combinator,\n this.value.eval ? this.value.eval(context) : this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n }\n\n clone() {\n return new Element(this.combinator,\n this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n }\n\n genCSS(context, output) {\n output.add(this.toCSS(context), this.fileInfo(), this.getIndex());\n }\n\n toCSS(context) {\n context = context || {};\n let value = this.value;\n const firstSelector = context.firstSelector;\n if (value instanceof Paren) {\n // selector in parens should not be affected by outer selector\n // flags (breaks only interpolated selectors - see #1973)\n context.firstSelector = true;\n }\n value = value.toCSS ? value.toCSS(context) : value;\n context.firstSelector = firstSelector;\n if (value === '' && this.combinator.value.charAt(0) === '&') {\n return '';\n } else {\n return this.combinator.toCSS(context) + value;\n }\n }\n}\n\nElement.prototype.type = 'Element';\nexport default Element;\n","\nexport const Math = {\n ALWAYS: 0,\n PARENS_DIVISION: 1,\n PARENS: 2,\n // removed - STRICT_LEGACY: 3\n};\n\nexport const RewriteUrls = {\n OFF: 0,\n LOCAL: 1,\n ALL: 2\n};","/* jshint proto: true */\nimport * as Constants from './constants';\n\nexport function getLocation(index, inputStream) {\n let n = index + 1;\n let line = null;\n let column = -1;\n\n while (--n >= 0 && inputStream.charAt(n) !== '\\n') {\n column++;\n }\n\n if (typeof index === 'number') {\n line = (inputStream.slice(0, index).match(/\\n/g) || '').length;\n }\n\n return {\n line,\n column\n };\n}\n\nexport function copyArray(arr) {\n let i;\n const length = arr.length;\n const copy = new Array(length);\n\n for (i = 0; i < length; i++) {\n copy[i] = arr[i];\n }\n return copy;\n}\n\nexport function clone(obj) {\n const cloned = {};\n for (const prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n cloned[prop] = obj[prop];\n }\n }\n return cloned;\n}\n\nexport function defaults(obj1, obj2) {\n let newObj = obj2 || {};\n if (!obj2._defaults) {\n newObj = {};\n const defaults = {...obj1};\n newObj._defaults = defaults;\n const cloned = obj2 ? {...obj2} : {};\n Object.assign(newObj, defaults, cloned);\n }\n return newObj;\n}\n\nexport function copyOptions(obj1, obj2) {\n if (obj2 && obj2._defaults) {\n return obj2;\n }\n const opts = defaults(obj1, obj2);\n if (opts.strictMath) {\n opts.math = Constants.Math.PARENS;\n }\n // Back compat with changed relativeUrls option\n if (opts.relativeUrls) {\n opts.rewriteUrls = Constants.RewriteUrls.ALL;\n }\n if (typeof opts.math === 'string') {\n switch (opts.math.toLowerCase()) {\n case 'always':\n opts.math = Constants.Math.ALWAYS;\n break;\n case 'parens-division':\n opts.math = Constants.Math.PARENS_DIVISION;\n break;\n case 'strict':\n case 'parens':\n opts.math = Constants.Math.PARENS;\n break;\n default:\n opts.math = Constants.Math.PARENS;\n }\n }\n if (typeof opts.rewriteUrls === 'string') {\n switch (opts.rewriteUrls.toLowerCase()) {\n case 'off':\n opts.rewriteUrls = Constants.RewriteUrls.OFF;\n break;\n case 'local':\n opts.rewriteUrls = Constants.RewriteUrls.LOCAL;\n break;\n case 'all':\n opts.rewriteUrls = Constants.RewriteUrls.ALL;\n break;\n }\n }\n return opts;\n}\n\nexport function merge(obj1, obj2) {\n for (const prop in obj2) {\n if (obj2.hasOwnProperty(prop)) {\n obj1[prop] = obj2[prop];\n }\n }\n return obj1;\n}\n\nexport function flattenArray(arr, result = []) {\n for (let i = 0, length = arr.length; i < length; i++) {\n const value = arr[i];\n if (Array.isArray(value)) {\n flattenArray(value, result);\n } else {\n if (value !== undefined) {\n result.push(value);\n }\n }\n }\n return result;\n}","import * as utils from './utils';\n\nconst anonymousFunc = /(|Function):(\\d+):(\\d+)/;\n\n/**\n * This is a centralized class of any error that could be thrown internally (mostly by the parser).\n * Besides standard .message it keeps some additional data like a path to the file where the error\n * occurred along with line and column numbers.\n *\n * @class\n * @extends Error\n * @type {module.LessError}\n *\n * @prop {string} type\n * @prop {string} filename\n * @prop {number} index\n * @prop {number} line\n * @prop {number} column\n * @prop {number} callLine\n * @prop {number} callExtract\n * @prop {string[]} extract\n *\n * @param {Object} e - An error object to wrap around or just a descriptive object\n * @param {Object} fileContentMap - An object with file contents in 'contents' property (like importManager) @todo - move to fileManager?\n * @param {string} [currentFilename]\n */\nconst LessError = function(e, fileContentMap, currentFilename) {\n Error.call(this);\n\n const filename = e.filename || currentFilename;\n\n this.message = e.message;\n this.stack = e.stack;\n\n if (fileContentMap && filename) {\n const input = fileContentMap.contents[filename];\n const loc = utils.getLocation(e.index, input);\n var line = loc.line;\n const col = loc.column;\n const callLine = e.call && utils.getLocation(e.call, input).line;\n const lines = input ? input.split('\\n') : '';\n\n this.type = e.type || 'Syntax';\n this.filename = filename;\n this.index = e.index;\n this.line = typeof line === 'number' ? line + 1 : null;\n this.column = col;\n\n if (!this.line && this.stack) {\n const found = this.stack.match(anonymousFunc);\n\n /**\n * We have to figure out how this environment stringifies anonymous functions\n * so we can correctly map plugin errors.\n * \n * Note, in Node 8, the output of anonymous funcs varied based on parameters\n * being present or not, so we inject dummy params.\n */\n const func = new Function('a', 'throw new Error()');\n let lineAdjust = 0;\n try {\n func();\n } catch (e) {\n const match = e.stack.match(anonymousFunc);\n var line = parseInt(match[2]);\n lineAdjust = 1 - line;\n }\n\n if (found) {\n if (found[2]) {\n this.line = parseInt(found[2]) + lineAdjust;\n }\n if (found[3]) {\n this.column = parseInt(found[3]);\n }\n }\n }\n\n this.callLine = callLine + 1;\n this.callExtract = lines[callLine];\n\n this.extract = [\n lines[this.line - 2],\n lines[this.line - 1],\n lines[this.line]\n ];\n }\n\n};\n\nif (typeof Object.create === 'undefined') {\n const F = function () {};\n F.prototype = Error.prototype;\n LessError.prototype = new F();\n} else {\n LessError.prototype = Object.create(Error.prototype);\n}\n\nLessError.prototype.constructor = LessError;\n\n/**\n * An overridden version of the default Object.prototype.toString\n * which uses additional information to create a helpful message.\n *\n * @param {Object} options\n * @returns {string}\n */\nLessError.prototype.toString = function(options) {\n options = options || {};\n\n let message = '';\n const extract = this.extract || [];\n let error = [];\n let stylize = function (str) { return str; };\n if (options.stylize) {\n const type = typeof options.stylize;\n if (type !== 'function') {\n throw Error(`options.stylize should be a function, got a ${type}!`);\n }\n stylize = options.stylize;\n }\n\n if (this.line !== null) {\n if (typeof extract[0] === 'string') {\n error.push(stylize(`${this.line - 1} ${extract[0]}`, 'grey'));\n }\n\n if (typeof extract[1] === 'string') {\n let errorTxt = `${this.line} `;\n if (extract[1]) {\n errorTxt += extract[1].slice(0, this.column) +\n stylize(stylize(stylize(extract[1].substr(this.column, 1), 'bold') +\n extract[1].slice(this.column + 1), 'red'), 'inverse');\n }\n error.push(errorTxt);\n }\n\n if (typeof extract[2] === 'string') {\n error.push(stylize(`${this.line + 1} ${extract[2]}`, 'grey'));\n }\n error = `${error.join('\\n') + stylize('', 'reset')}\\n`;\n }\n\n message += stylize(`${this.type}Error: ${this.message}`, 'red');\n if (this.filename) {\n message += stylize(' in ', 'red') + this.filename;\n }\n if (this.line) {\n message += stylize(` on line ${this.line}, column ${this.column + 1}:`, 'grey');\n }\n\n message += `\\n${error}`;\n\n if (this.callLine) {\n message += `${stylize('from ', 'red') + (this.filename || '')}/n`;\n message += `${stylize(this.callLine, 'grey')} ${this.callExtract}/n`;\n }\n\n return message;\n};\n\nexport default LessError;","import Node from './node';\nimport Element from './element';\nimport LessError from '../less-error';\n\nclass Selector extends Node {\n constructor(elements, extendList, condition, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.extendList = extendList;\n this.condition = condition;\n this.evaldCondition = !condition;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.elements = this.getElements(elements);\n this.mixinElements_ = undefined;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.elements, this);\n }\n\n accept(visitor) {\n if (this.elements) {\n this.elements = visitor.visitArray(this.elements);\n }\n if (this.extendList) {\n this.extendList = visitor.visitArray(this.extendList);\n }\n if (this.condition) {\n this.condition = visitor.visit(this.condition);\n }\n }\n\n createDerived(elements, extendList, evaldCondition) {\n elements = this.getElements(elements);\n const newSelector = new Selector(elements, extendList || this.extendList,\n null, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n newSelector.evaldCondition = (evaldCondition != null) ? evaldCondition : this.evaldCondition;\n newSelector.mediaEmpty = this.mediaEmpty;\n return newSelector;\n }\n\n getElements(els) {\n if (!els) {\n return [new Element('', '&', false, this._index, this._fileInfo)];\n }\n if (typeof els === 'string') {\n this.parse.parseNode(\n els, \n ['selector'],\n this._index, \n this._fileInfo, \n function(err, result) {\n if (err) {\n throw new LessError({\n index: err.index,\n message: err.message\n }, this.parse.imports, this._fileInfo.filename);\n }\n els = result[0].elements;\n });\n }\n return els;\n }\n\n createEmptySelectors() {\n const el = new Element('', '&', false, this._index, this._fileInfo), sels = [new Selector([el], null, null, this._index, this._fileInfo)];\n sels[0].mediaEmpty = true;\n return sels;\n }\n\n match(other) {\n const elements = this.elements;\n const len = elements.length;\n let olen;\n let i;\n\n other = other.mixinElements();\n olen = other.length;\n if (olen === 0 || len < olen) {\n return 0;\n } else {\n for (i = 0; i < olen; i++) {\n if (elements[i].value !== other[i]) {\n return 0;\n }\n }\n }\n\n return olen; // return number of matched elements\n }\n\n mixinElements() {\n if (this.mixinElements_) {\n return this.mixinElements_;\n }\n\n let elements = this.elements.map( function(v) {\n return v.combinator.value + (v.value.value || v.value);\n }).join('').match(/[,&#\\*\\.\\w-]([\\w-]|(\\\\.))*/g);\n\n if (elements) {\n if (elements[0] === '&') {\n elements.shift();\n }\n } else {\n elements = [];\n }\n\n return (this.mixinElements_ = elements);\n }\n\n isJustParentSelector() {\n return !this.mediaEmpty &&\n this.elements.length === 1 &&\n this.elements[0].value === '&' &&\n (this.elements[0].combinator.value === ' ' || this.elements[0].combinator.value === '');\n }\n\n eval(context) {\n const evaldCondition = this.condition && this.condition.eval(context);\n let elements = this.elements;\n let extendList = this.extendList;\n\n elements = elements && elements.map(function (e) { return e.eval(context); });\n extendList = extendList && extendList.map(function(extend) { return extend.eval(context); });\n\n return this.createDerived(elements, extendList, evaldCondition);\n }\n\n genCSS(context, output) {\n let i, element;\n if ((!context || !context.firstSelector) && this.elements[0].combinator.value === '') {\n output.add(' ', this.fileInfo(), this.getIndex());\n }\n for (i = 0; i < this.elements.length; i++) {\n element = this.elements[i];\n element.genCSS(context, output);\n }\n }\n\n getIsOutput() {\n return this.evaldCondition;\n }\n}\n\nSelector.prototype.type = 'Selector';\nexport default Selector;\n","import Node from './node';\n\nclass Value extends Node {\n constructor(value) {\n super();\n\n if (!value) {\n throw new Error('Value requires an array argument');\n }\n if (!Array.isArray(value)) {\n this.value = [ value ];\n }\n else {\n this.value = value;\n }\n }\n\n accept(visitor) {\n if (this.value) {\n this.value = visitor.visitArray(this.value);\n }\n }\n\n eval(context) {\n if (this.value.length === 1) {\n return this.value[0].eval(context);\n } else {\n return new Value(this.value.map(function (v) {\n return v.eval(context);\n }));\n }\n }\n\n genCSS(context, output) {\n let i;\n for (i = 0; i < this.value.length; i++) {\n this.value[i].genCSS(context, output);\n if (i + 1 < this.value.length) {\n output.add((context && context.compress) ? ',' : ', ');\n }\n }\n }\n}\n\nValue.prototype.type = 'Value';\nexport default Value;\n","import Node from './node';\n\nclass Keyword extends Node {\n constructor(value) {\n super();\n\n this.value = value;\n }\n\n genCSS(context, output) {\n if (this.value === '%') { throw { type: 'Syntax', message: 'Invalid % without number' }; }\n output.add(this.value);\n }\n}\n\nKeyword.prototype.type = 'Keyword';\n\nKeyword.True = new Keyword('true');\nKeyword.False = new Keyword('false');\n\nexport default Keyword;\n","import Node from './node';\n\nclass Anonymous extends Node {\n constructor(value, index, currentFileInfo, mapLines, rulesetLike, visibilityInfo) {\n super();\n\n this.value = value;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.mapLines = mapLines;\n this.rulesetLike = (typeof rulesetLike === 'undefined') ? false : rulesetLike;\n this.allowRoot = true;\n this.copyVisibilityInfo(visibilityInfo);\n }\n\n eval() {\n return new Anonymous(this.value, this._index, this._fileInfo, this.mapLines, this.rulesetLike, this.visibilityInfo());\n }\n\n compare(other) {\n return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n }\n\n isRulesetLike() {\n return this.rulesetLike;\n }\n\n genCSS(context, output) {\n this.nodeVisible = Boolean(this.value);\n if (this.nodeVisible) {\n output.add(this.value, this._fileInfo, this._index, this.mapLines);\n }\n }\n}\n\nAnonymous.prototype.type = 'Anonymous';\nexport default Anonymous;\n","import Node from './node';\nimport Value from './value';\nimport Keyword from './keyword';\nimport Anonymous from './anonymous';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\nclass Declaration extends Node {\n constructor(name, value, important, merge, index, currentFileInfo, inline, variable) {\n super();\n\n this.name = name;\n this.value = (value instanceof Node) ? value : new Value([value ? new Anonymous(value) : null]);\n this.important = important ? ` ${important.trim()}` : '';\n this.merge = merge;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.inline = inline || false;\n this.variable = (variable !== undefined) ? variable\n : (name.charAt && (name.charAt(0) === '@'));\n this.allowRoot = true;\n this.setParent(this.value, this);\n }\n\n genCSS(context, output) {\n output.add(this.name + (context.compress ? ':' : ': '), this.fileInfo(), this.getIndex());\n try {\n this.value.genCSS(context, output);\n }\n catch (e) {\n e.index = this._index;\n e.filename = this._fileInfo.filename;\n throw e;\n }\n output.add(this.important + ((this.inline || (context.lastRule && context.compress)) ? '' : ';'), this._fileInfo, this._index);\n }\n\n eval(context) {\n let mathBypass = false, prevMath, name = this.name, evaldValue, variable = this.variable;\n if (typeof name !== 'string') {\n // expand 'primitive' name directly to get\n // things faster (~10% for benchmark.less):\n name = (name.length === 1) && (name[0] instanceof Keyword) ?\n name[0].value : evalName(context, name);\n variable = false; // never treat expanded interpolation as new variable name\n }\n\n // @todo remove when parens-division is default\n if (name === 'font' && context.math === MATH.ALWAYS) {\n mathBypass = true;\n prevMath = context.math;\n context.math = MATH.PARENS_DIVISION;\n }\n try {\n context.importantScope.push({});\n evaldValue = this.value.eval(context);\n\n if (!this.variable && evaldValue.type === 'DetachedRuleset') {\n throw { message: 'Rulesets cannot be evaluated on a property.',\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n let important = this.important;\n const importantResult = context.importantScope.pop();\n if (!important && importantResult.important) {\n important = importantResult.important;\n }\n\n return new Declaration(name,\n evaldValue,\n important,\n this.merge,\n this.getIndex(), this.fileInfo(), this.inline,\n variable);\n }\n catch (e) {\n if (typeof e.index !== 'number') {\n e.index = this.getIndex();\n e.filename = this.fileInfo().filename;\n }\n throw e;\n }\n finally {\n if (mathBypass) {\n context.math = prevMath;\n }\n }\n }\n\n makeImportant() {\n return new Declaration(this.name,\n this.value,\n '!important',\n this.merge,\n this.getIndex(), this.fileInfo(), this.inline);\n }\n}\n\nfunction evalName(context, name) {\n let value = '';\n let i;\n const n = name.length;\n const output = {add: function (s) {value += s;}};\n for (i = 0; i < n; i++) {\n name[i].eval(context).genCSS(context, output);\n }\n return value;\n}\n\nDeclaration.prototype.type = 'Declaration';\nexport default Declaration;","class debugInfo {\n constructor(context, ctx, lineSeparator) {\n let result = '';\n if (context.dumpLineNumbers && !context.compress) {\n switch (context.dumpLineNumbers) {\n case 'comments':\n result = debugInfo.asComment(ctx);\n break;\n case 'mediaquery':\n result = debugInfo.asMediaQuery(ctx);\n break;\n case 'all':\n result = debugInfo.asComment(ctx) + (lineSeparator || '') + debugInfo.asMediaQuery(ctx);\n break;\n }\n }\n return result;\n }\n\n static asComment(ctx) {\n return `/* line ${ctx.debugInfo.lineNumber}, ${ctx.debugInfo.fileName} */\\n`;\n }\n\n static asMediaQuery(ctx) {\n let filenameWithProtocol = ctx.debugInfo.fileName;\n if (!/^[a-z]+:\\/\\//i.test(filenameWithProtocol)) {\n filenameWithProtocol = `file://${filenameWithProtocol}`;\n }\n return `@media -sass-debug-info{filename{font-family:${filenameWithProtocol.replace(/([.:\\/\\\\])/g, function (a) {\n if (a == '\\\\') {\n a = '\\/';\n }\n return `\\\\${a}`;\n})}}line{font-family:\\\\00003${ctx.debugInfo.lineNumber}}}\\n`;\n }\n}\n\nexport default debugInfo;\n","import Node from './node';\nimport getDebugInfo from './debug-info';\n\nclass Comment extends Node {\n constructor(value, isLineComment, index, currentFileInfo) {\n super();\n\n this.value = value;\n this.isLineComment = isLineComment;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.allowRoot = true;\n }\n\n genCSS(context, output) {\n if (this.debugInfo) {\n output.add(getDebugInfo(context, this), this.fileInfo(), this.getIndex());\n }\n output.add(this.value);\n }\n\n isSilent(context) {\n const isCompressed = context.compress && this.value[2] !== '!';\n return this.isLineComment || isCompressed;\n }\n}\n\nComment.prototype.type = 'Comment';\nexport default Comment;\n","const contexts = {};\nexport default contexts;\nimport * as Constants from './constants';\n\nconst copyFromOriginal = function copyFromOriginal(original, destination, propertiesToCopy) {\n if (!original) { return; }\n\n for (let i = 0; i < propertiesToCopy.length; i++) {\n if (original.hasOwnProperty(propertiesToCopy[i])) {\n destination[propertiesToCopy[i]] = original[propertiesToCopy[i]];\n }\n }\n};\n\n/*\n parse is used whilst parsing\n */\nconst parseCopyProperties = [\n // options\n 'paths', // option - unmodified - paths to search for imports on\n 'rewriteUrls', // option - whether to adjust URL's to be relative\n 'rootpath', // option - rootpath to append to URL's\n 'strictImports', // option -\n 'insecure', // option - whether to allow imports from insecure ssl hosts\n 'dumpLineNumbers', // option - whether to dump line numbers\n 'compress', // option - whether to compress\n 'syncImport', // option - whether to import synchronously\n 'chunkInput', // option - whether to chunk input. more performant but causes parse issues.\n 'mime', // browser only - mime type for sheet import\n 'useFileCache', // browser only - whether to use the per file session cache\n // context\n 'processImports', // option & context - whether to process imports. if false then imports will not be imported.\n // Used by the import manager to stop multiple import visitors being created.\n 'pluginManager' // Used as the plugin manager for the session\n];\n\ncontexts.Parse = function(options) {\n copyFromOriginal(options, this, parseCopyProperties);\n\n if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n};\n\nconst evalCopyProperties = [\n 'paths', // additional include paths\n 'compress', // whether to compress\n 'math', // whether math has to be within parenthesis\n 'strictUnits', // whether units need to evaluate correctly\n 'sourceMap', // whether to output a source map\n 'importMultiple', // whether we are currently importing multiple copies\n 'urlArgs', // whether to add args into url tokens\n 'javascriptEnabled', // option - whether Inline JavaScript is enabled. if undefined, defaults to false\n 'pluginManager', // Used as the plugin manager for the session\n 'importantScope', // used to bubble up !important statements\n 'rewriteUrls' // option - whether to adjust URL's to be relative\n];\n\ncontexts.Eval = function(options, frames) {\n copyFromOriginal(options, this, evalCopyProperties);\n\n if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n\n this.frames = frames || [];\n this.importantScope = this.importantScope || [];\n};\n\ncontexts.Eval.prototype.enterCalc = function () {\n if (!this.calcStack) {\n this.calcStack = [];\n }\n this.calcStack.push(true);\n this.inCalc = true;\n};\n\ncontexts.Eval.prototype.exitCalc = function () {\n this.calcStack.pop();\n if (!this.calcStack.length) {\n this.inCalc = false;\n }\n};\n\ncontexts.Eval.prototype.inParenthesis = function () {\n if (!this.parensStack) {\n this.parensStack = [];\n }\n this.parensStack.push(true);\n};\n\ncontexts.Eval.prototype.outOfParenthesis = function () {\n this.parensStack.pop();\n};\n\ncontexts.Eval.prototype.inCalc = false;\ncontexts.Eval.prototype.mathOn = true;\ncontexts.Eval.prototype.isMathOn = function (op) {\n if (!this.mathOn) {\n return false;\n }\n if (op === '/' && this.math !== Constants.Math.ALWAYS && (!this.parensStack || !this.parensStack.length)) {\n return false;\n }\n if (this.math > Constants.Math.PARENS_DIVISION) {\n return this.parensStack && this.parensStack.length;\n }\n return true;\n};\n\ncontexts.Eval.prototype.pathRequiresRewrite = function (path) {\n const isRelative = this.rewriteUrls === Constants.RewriteUrls.LOCAL ? isPathLocalRelative : isPathRelative;\n\n return isRelative(path);\n};\n\ncontexts.Eval.prototype.rewritePath = function (path, rootpath) {\n let newPath;\n\n rootpath = rootpath || '';\n newPath = this.normalizePath(rootpath + path);\n\n // If a path was explicit relative and the rootpath was not an absolute path\n // we must ensure that the new path is also explicit relative.\n if (isPathLocalRelative(path) &&\n isPathRelative(rootpath) &&\n isPathLocalRelative(newPath) === false) {\n newPath = `./${newPath}`;\n }\n\n return newPath;\n};\n\ncontexts.Eval.prototype.normalizePath = function (path) {\n const segments = path.split('/').reverse();\n let segment;\n\n path = [];\n while (segments.length !== 0) {\n segment = segments.pop();\n switch ( segment ) {\n case '.':\n break;\n case '..':\n if ((path.length === 0) || (path[path.length - 1] === '..')) {\n path.push( segment );\n } else {\n path.pop();\n }\n break;\n default:\n path.push(segment);\n break;\n }\n }\n\n return path.join('/');\n};\n\nfunction isPathRelative(path) {\n return !/^(?:[a-z-]+:|\\/|#)/i.test(path);\n}\n\nfunction isPathLocalRelative(path) {\n return path.charAt(0) === '.';\n}\n\n// todo - do the same for the toCSS ?\n","function makeRegistry( base ) {\n return {\n _data: {},\n add: function(name, func) {\n // precautionary case conversion, as later querying of\n // the registry by function-caller uses lower case as well.\n name = name.toLowerCase();\n\n if (this._data.hasOwnProperty(name)) {\n // TODO warn\n }\n this._data[name] = func;\n },\n addMultiple: function(functions) {\n Object.keys(functions).forEach(\n name => {\n this.add(name, functions[name]);\n });\n },\n get: function(name) {\n return this._data[name] || ( base && base.get( name ));\n },\n getLocalFunctions: function() {\n return this._data;\n },\n inherit: function() {\n return makeRegistry( this );\n },\n create: function(base) {\n return makeRegistry(base);\n }\n };\n}\n\nexport default makeRegistry( null );","import Keyword from '../tree/keyword';\n\nconst defaultFunc = {\n eval: function () {\n const v = this.value_;\n const e = this.error_;\n if (e) {\n throw e;\n }\n if (v != null) {\n return v ? Keyword.True : Keyword.False;\n }\n },\n value: function (v) {\n this.value_ = v;\n },\n error: function (e) {\n this.error_ = e;\n },\n reset: function () {\n this.value_ = this.error_ = null;\n }\n};\n\nexport default defaultFunc;\n","import Node from './node';\nimport Declaration from './declaration';\nimport Keyword from './keyword';\nimport Comment from './comment';\nimport Paren from './paren';\nimport Selector from './selector';\nimport Element from './element';\nimport Anonymous from './anonymous';\nimport contexts from '../contexts';\nimport globalFunctionRegistry from '../functions/function-registry';\nimport defaultFunc from '../functions/default';\nimport getDebugInfo from './debug-info';\nimport * as utils from '../utils';\n\nclass Ruleset extends Node {\n constructor(selectors, rules, strictImports, visibilityInfo) {\n super();\n\n this.selectors = selectors;\n this.rules = rules;\n this._lookups = {};\n this._variables = null;\n this._properties = null;\n this.strictImports = strictImports;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n\n this.setParent(this.selectors, this);\n this.setParent(this.rules, this);\n\n }\n\n isRulesetLike() { return true; }\n\n accept(visitor) {\n if (this.paths) {\n this.paths = visitor.visitArray(this.paths, true);\n } else if (this.selectors) {\n this.selectors = visitor.visitArray(this.selectors);\n }\n if (this.rules && this.rules.length) {\n this.rules = visitor.visitArray(this.rules);\n }\n }\n\n eval(context) {\n const that = this;\n let selectors;\n let selCnt;\n let selector;\n let i;\n let hasVariable;\n let hasOnePassingSelector = false;\n\n if (this.selectors && (selCnt = this.selectors.length)) {\n selectors = new Array(selCnt);\n defaultFunc.error({\n type: 'Syntax',\n message: 'it is currently only allowed in parametric mixin guards,'\n });\n\n for (i = 0; i < selCnt; i++) {\n selector = this.selectors[i].eval(context);\n for (var j = 0; j < selector.elements.length; j++) {\n if (selector.elements[j].isVariable) {\n hasVariable = true;\n break;\n }\n }\n selectors[i] = selector;\n if (selector.evaldCondition) {\n hasOnePassingSelector = true;\n }\n }\n\n if (hasVariable) {\n const toParseSelectors = new Array(selCnt);\n for (i = 0; i < selCnt; i++) {\n selector = selectors[i];\n toParseSelectors[i] = selector.toCSS(context);\n }\n this.parse.parseNode(\n toParseSelectors.join(','),\n [\"selectors\"], \n selectors[0].getIndex(), \n selectors[0].fileInfo(), \n function(err, result) {\n if (result) {\n selectors = utils.flattenArray(result);\n }\n });\n }\n\n defaultFunc.reset();\n } else {\n hasOnePassingSelector = true;\n }\n\n let rules = this.rules ? utils.copyArray(this.rules) : null;\n const ruleset = new Ruleset(selectors, rules, this.strictImports, this.visibilityInfo());\n let rule;\n let subRule;\n\n ruleset.originalRuleset = this;\n ruleset.root = this.root;\n ruleset.firstRoot = this.firstRoot;\n ruleset.allowImports = this.allowImports;\n\n if (this.debugInfo) {\n ruleset.debugInfo = this.debugInfo;\n }\n\n if (!hasOnePassingSelector) {\n rules.length = 0;\n }\n\n // inherit a function registry from the frames stack when possible;\n // otherwise from the global registry\n ruleset.functionRegistry = (function (frames) {\n let i = 0;\n const n = frames.length;\n let found;\n for ( ; i !== n ; ++i ) {\n found = frames[ i ].functionRegistry;\n if ( found ) { return found; }\n }\n return globalFunctionRegistry;\n }(context.frames)).inherit();\n\n // push the current ruleset to the frames stack\n const ctxFrames = context.frames;\n ctxFrames.unshift(ruleset);\n\n // currrent selectors\n let ctxSelectors = context.selectors;\n if (!ctxSelectors) {\n context.selectors = ctxSelectors = [];\n }\n ctxSelectors.unshift(this.selectors);\n\n // Evaluate imports\n if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) {\n ruleset.evalImports(context);\n }\n\n // Store the frames around mixin definitions,\n // so they can be evaluated like closures when the time comes.\n const rsRules = ruleset.rules;\n for (i = 0; (rule = rsRules[i]); i++) {\n if (rule.evalFirst) {\n rsRules[i] = rule.eval(context);\n }\n }\n\n const mediaBlockCount = (context.mediaBlocks && context.mediaBlocks.length) || 0;\n\n // Evaluate mixin calls.\n for (i = 0; (rule = rsRules[i]); i++) {\n if (rule.type === 'MixinCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).filter(function(r) {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope if the variable is\n // already there. consider returning false here\n // but we need a way to \"return\" variable from mixins\n return !(ruleset.variable(r.name));\n }\n return true;\n });\n rsRules.splice.apply(rsRules, [i, 1].concat(rules));\n i += rules.length - 1;\n ruleset.resetCache();\n } else if (rule.type === 'VariableCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).rules.filter(function(r) {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope at all\n return false;\n }\n return true;\n });\n rsRules.splice.apply(rsRules, [i, 1].concat(rules));\n i += rules.length - 1;\n ruleset.resetCache();\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n if (!rule.evalFirst) {\n rsRules[i] = rule = rule.eval ? rule.eval(context) : rule;\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n // for rulesets, check if it is a css guard and can be removed\n if (rule instanceof Ruleset && rule.selectors && rule.selectors.length === 1) {\n // check if it can be folded in (e.g. & where)\n if (rule.selectors[0] && rule.selectors[0].isJustParentSelector()) {\n rsRules.splice(i--, 1);\n\n for (var j = 0; (subRule = rule.rules[j]); j++) {\n if (subRule instanceof Node) {\n subRule.copyVisibilityInfo(rule.visibilityInfo());\n if (!(subRule instanceof Declaration) || !subRule.variable) {\n rsRules.splice(++i, 0, subRule);\n }\n }\n }\n }\n }\n }\n\n // Pop the stack\n ctxFrames.shift();\n ctxSelectors.shift();\n\n if (context.mediaBlocks) {\n for (i = mediaBlockCount; i < context.mediaBlocks.length; i++) {\n context.mediaBlocks[i].bubbleSelectors(selectors);\n }\n }\n\n return ruleset;\n }\n\n evalImports(context) {\n const rules = this.rules;\n let i;\n let importRules;\n if (!rules) { return; }\n\n for (i = 0; i < rules.length; i++) {\n if (rules[i].type === 'Import') {\n importRules = rules[i].eval(context);\n if (importRules && (importRules.length || importRules.length === 0)) {\n rules.splice.apply(rules, [i, 1].concat(importRules));\n i += importRules.length - 1;\n } else {\n rules.splice(i, 1, importRules);\n }\n this.resetCache();\n }\n }\n }\n\n makeImportant() {\n const result = new Ruleset(this.selectors, this.rules.map(function (r) {\n if (r.makeImportant) {\n return r.makeImportant();\n } else {\n return r;\n }\n }), this.strictImports, this.visibilityInfo());\n\n return result;\n }\n\n matchArgs(args) {\n return !args || args.length === 0;\n }\n\n // lets you call a css selector with a guard\n matchCondition(args, context) {\n const lastSelector = this.selectors[this.selectors.length - 1];\n if (!lastSelector.evaldCondition) {\n return false;\n }\n if (lastSelector.condition &&\n !lastSelector.condition.eval(\n new contexts.Eval(context,\n context.frames))) {\n return false;\n }\n return true;\n }\n\n resetCache() {\n this._rulesets = null;\n this._variables = null;\n this._properties = null;\n this._lookups = {};\n }\n\n variables() {\n if (!this._variables) {\n this._variables = !this.rules ? {} : this.rules.reduce(function (hash, r) {\n if (r instanceof Declaration && r.variable === true) {\n hash[r.name] = r;\n }\n // when evaluating variables in an import statement, imports have not been eval'd\n // so we need to go inside import statements.\n // guard against root being a string (in the case of inlined less)\n if (r.type === 'Import' && r.root && r.root.variables) {\n const vars = r.root.variables();\n for (const name in vars) {\n if (vars.hasOwnProperty(name)) {\n hash[name] = r.root.variable(name);\n }\n }\n }\n return hash;\n }, {});\n }\n return this._variables;\n }\n\n properties() {\n if (!this._properties) {\n this._properties = !this.rules ? {} : this.rules.reduce(function (hash, r) {\n if (r instanceof Declaration && r.variable !== true) {\n const name = (r.name.length === 1) && (r.name[0] instanceof Keyword) ?\n r.name[0].value : r.name;\n // Properties don't overwrite as they can merge\n if (!hash[`$${name}`]) {\n hash[`$${name}`] = [ r ];\n }\n else {\n hash[`$${name}`].push(r);\n }\n }\n return hash;\n }, {});\n }\n return this._properties;\n }\n\n variable(name) {\n const decl = this.variables()[name];\n if (decl) {\n return this.parseValue(decl);\n }\n }\n\n property(name) {\n const decl = this.properties()[name];\n if (decl) {\n return this.parseValue(decl);\n }\n }\n\n lastDeclaration() {\n for (let i = this.rules.length; i > 0; i--) {\n const decl = this.rules[i - 1];\n if (decl instanceof Declaration) {\n return this.parseValue(decl);\n }\n }\n }\n\n parseValue(toParse) {\n const self = this;\n function transformDeclaration(decl) {\n if (decl.value instanceof Anonymous && !decl.parsed) {\n if (typeof decl.value.value === 'string') {\n this.parse.parseNode(\n decl.value.value,\n ['value', 'important'], \n decl.value.getIndex(), \n decl.fileInfo(), \n function(err, result) {\n if (err) {\n decl.parsed = true;\n }\n if (result) {\n decl.value = result[0];\n decl.important = result[1] || '';\n decl.parsed = true;\n }\n });\n } else {\n decl.parsed = true;\n }\n\n return decl;\n }\n else {\n return decl;\n }\n }\n if (!Array.isArray(toParse)) {\n return transformDeclaration.call(self, toParse);\n }\n else {\n const nodes = [];\n toParse.forEach(function(n) {\n nodes.push(transformDeclaration.call(self, n));\n });\n return nodes;\n }\n }\n\n rulesets() {\n if (!this.rules) { return []; }\n\n const filtRules = [];\n const rules = this.rules;\n let i;\n let rule;\n\n for (i = 0; (rule = rules[i]); i++) {\n if (rule.isRuleset) {\n filtRules.push(rule);\n }\n }\n\n return filtRules;\n }\n\n prependRule(rule) {\n const rules = this.rules;\n if (rules) {\n rules.unshift(rule);\n } else {\n this.rules = [ rule ];\n }\n this.setParent(rule, this);\n }\n\n find(selector, self, filter) {\n self = self || this;\n const rules = [];\n let match;\n let foundMixins;\n const key = selector.toCSS();\n\n if (key in this._lookups) { return this._lookups[key]; }\n\n this.rulesets().forEach(function (rule) {\n if (rule !== self) {\n for (let j = 0; j < rule.selectors.length; j++) {\n match = selector.match(rule.selectors[j]);\n if (match) {\n if (selector.elements.length > match) {\n if (!filter || filter(rule)) {\n foundMixins = rule.find(new Selector(selector.elements.slice(match)), self, filter);\n for (let i = 0; i < foundMixins.length; ++i) {\n foundMixins[i].path.push(rule);\n }\n Array.prototype.push.apply(rules, foundMixins);\n }\n } else {\n rules.push({ rule, path: []});\n }\n break;\n }\n }\n }\n });\n this._lookups[key] = rules;\n return rules;\n }\n\n genCSS(context, output) {\n let i;\n let j;\n const charsetRuleNodes = [];\n let ruleNodes = [];\n\n let // Line number debugging\n debugInfo;\n\n let rule;\n let path;\n\n context.tabLevel = (context.tabLevel || 0);\n\n if (!this.root) {\n context.tabLevel++;\n }\n\n const tabRuleStr = context.compress ? '' : Array(context.tabLevel + 1).join(' ');\n const tabSetStr = context.compress ? '' : Array(context.tabLevel).join(' ');\n let sep;\n\n let charsetNodeIndex = 0;\n let importNodeIndex = 0;\n for (i = 0; (rule = this.rules[i]); i++) {\n if (rule instanceof Comment) {\n if (importNodeIndex === i) {\n importNodeIndex++;\n }\n ruleNodes.push(rule);\n } else if (rule.isCharset && rule.isCharset()) {\n ruleNodes.splice(charsetNodeIndex, 0, rule);\n charsetNodeIndex++;\n importNodeIndex++;\n } else if (rule.type === 'Import') {\n ruleNodes.splice(importNodeIndex, 0, rule);\n importNodeIndex++;\n } else {\n ruleNodes.push(rule);\n }\n }\n ruleNodes = charsetRuleNodes.concat(ruleNodes);\n\n // If this is the root node, we don't render\n // a selector, or {}.\n if (!this.root) {\n debugInfo = getDebugInfo(context, this, tabSetStr);\n\n if (debugInfo) {\n output.add(debugInfo);\n output.add(tabSetStr);\n }\n\n const paths = this.paths;\n const pathCnt = paths.length;\n let pathSubCnt;\n\n sep = context.compress ? ',' : (`,\\n${tabSetStr}`);\n\n for (i = 0; i < pathCnt; i++) {\n path = paths[i];\n if (!(pathSubCnt = path.length)) { continue; }\n if (i > 0) { output.add(sep); }\n\n context.firstSelector = true;\n path[0].genCSS(context, output);\n\n context.firstSelector = false;\n for (j = 1; j < pathSubCnt; j++) {\n path[j].genCSS(context, output);\n }\n }\n\n output.add((context.compress ? '{' : ' {\\n') + tabRuleStr);\n }\n\n // Compile rules and rulesets\n for (i = 0; (rule = ruleNodes[i]); i++) {\n\n if (i + 1 === ruleNodes.length) {\n context.lastRule = true;\n }\n\n const currentLastRule = context.lastRule;\n if (rule.isRulesetLike(rule)) {\n context.lastRule = false;\n }\n\n if (rule.genCSS) {\n rule.genCSS(context, output);\n } else if (rule.value) {\n output.add(rule.value.toString());\n }\n\n context.lastRule = currentLastRule;\n\n if (!context.lastRule && rule.isVisible()) {\n output.add(context.compress ? '' : (`\\n${tabRuleStr}`));\n } else {\n context.lastRule = false;\n }\n }\n\n if (!this.root) {\n output.add((context.compress ? '}' : `\\n${tabSetStr}}`));\n context.tabLevel--;\n }\n\n if (!output.isEmpty() && !context.compress && this.firstRoot) {\n output.add('\\n');\n }\n }\n\n joinSelectors(paths, context, selectors) {\n for (let s = 0; s < selectors.length; s++) {\n this.joinSelector(paths, context, selectors[s]);\n }\n }\n\n joinSelector(paths, context, selector) {\n\n function createParenthesis(elementsToPak, originalElement) {\n let replacementParen, j;\n if (elementsToPak.length === 0) {\n replacementParen = new Paren(elementsToPak[0]);\n } else {\n const insideParent = new Array(elementsToPak.length);\n for (j = 0; j < elementsToPak.length; j++) {\n insideParent[j] = new Element(\n null,\n elementsToPak[j],\n originalElement.isVariable,\n originalElement._index,\n originalElement._fileInfo\n );\n }\n replacementParen = new Paren(new Selector(insideParent));\n }\n return replacementParen;\n }\n\n function createSelector(containedElement, originalElement) {\n let element, selector;\n element = new Element(null, containedElement, originalElement.isVariable, originalElement._index, originalElement._fileInfo);\n selector = new Selector([element]);\n return selector;\n }\n\n // joins selector path from `beginningPath` with selector path in `addPath`\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns concatenated path\n function addReplacementIntoPath(beginningPath, addPath, replacedElement, originalSelector) {\n let newSelectorPath, lastSelector, newJoinedSelector;\n // our new selector path\n newSelectorPath = [];\n\n // construct the joined selector - if & is the first thing this will be empty,\n // if not newJoinedSelector will be the last set of elements in the selector\n if (beginningPath.length > 0) {\n newSelectorPath = utils.copyArray(beginningPath);\n lastSelector = newSelectorPath.pop();\n newJoinedSelector = originalSelector.createDerived(utils.copyArray(lastSelector.elements));\n }\n else {\n newJoinedSelector = originalSelector.createDerived([]);\n }\n\n if (addPath.length > 0) {\n // /deep/ is a CSS4 selector - (removed, so should deprecate)\n // that is valid without anything in front of it\n // so if the & does not have a combinator that is \"\" or \" \" then\n // and there is a combinator on the parent, then grab that.\n // this also allows + a { & .b { .a & { ... though not sure why you would want to do that\n let combinator = replacedElement.combinator;\n\n const parentEl = addPath[0].elements[0];\n if (combinator.emptyOrWhitespace && !parentEl.combinator.emptyOrWhitespace) {\n combinator = parentEl.combinator;\n }\n // join the elements so far with the first part of the parent\n newJoinedSelector.elements.push(new Element(\n combinator,\n parentEl.value,\n replacedElement.isVariable,\n replacedElement._index,\n replacedElement._fileInfo\n ));\n newJoinedSelector.elements = newJoinedSelector.elements.concat(addPath[0].elements.slice(1));\n }\n\n // now add the joined selector - but only if it is not empty\n if (newJoinedSelector.elements.length !== 0) {\n newSelectorPath.push(newJoinedSelector);\n }\n\n // put together the parent selectors after the join (e.g. the rest of the parent)\n if (addPath.length > 1) {\n let restOfPath = addPath.slice(1);\n restOfPath = restOfPath.map(function (selector) {\n return selector.createDerived(selector.elements, []);\n });\n newSelectorPath = newSelectorPath.concat(restOfPath);\n }\n return newSelectorPath;\n }\n\n // joins selector path from `beginningPath` with every selector path in `addPaths` array\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns array with all concatenated paths\n function addAllReplacementsIntoPath( beginningPath, addPaths, replacedElement, originalSelector, result) {\n let j;\n for (j = 0; j < beginningPath.length; j++) {\n const newSelectorPath = addReplacementIntoPath(beginningPath[j], addPaths, replacedElement, originalSelector);\n result.push(newSelectorPath);\n }\n return result;\n }\n\n function mergeElementsOnToSelectors(elements, selectors) {\n let i, sel;\n\n if (elements.length === 0) {\n return ;\n }\n if (selectors.length === 0) {\n selectors.push([ new Selector(elements) ]);\n return;\n }\n\n for (i = 0; (sel = selectors[i]); i++) {\n // if the previous thing in sel is a parent this needs to join on to it\n if (sel.length > 0) {\n sel[sel.length - 1] = sel[sel.length - 1].createDerived(sel[sel.length - 1].elements.concat(elements));\n }\n else {\n sel.push(new Selector(elements));\n }\n }\n }\n\n // replace all parent selectors inside `inSelector` by content of `context` array\n // resulting selectors are returned inside `paths` array\n // returns true if `inSelector` contained at least one parent selector\n function replaceParentSelector(paths, context, inSelector) {\n // The paths are [[Selector]]\n // The first list is a list of comma separated selectors\n // The inner list is a list of inheritance separated selectors\n // e.g.\n // .a, .b {\n // .c {\n // }\n // }\n // == [[.a] [.c]] [[.b] [.c]]\n //\n let i, j, k, currentElements, newSelectors, selectorsMultiplied, sel, el, hadParentSelector = false, length, lastSelector;\n function findNestedSelector(element) {\n let maybeSelector;\n if (!(element.value instanceof Paren)) {\n return null;\n }\n\n maybeSelector = element.value.value;\n if (!(maybeSelector instanceof Selector)) {\n return null;\n }\n\n return maybeSelector;\n }\n\n // the elements from the current selector so far\n currentElements = [];\n // the current list of new selectors to add to the path.\n // We will build it up. We initiate it with one empty selector as we \"multiply\" the new selectors\n // by the parents\n newSelectors = [\n []\n ];\n\n for (i = 0; (el = inSelector.elements[i]); i++) {\n // non parent reference elements just get added\n if (el.value !== '&') {\n const nestedSelector = findNestedSelector(el);\n if (nestedSelector != null) {\n // merge the current list of non parent selector elements\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n const nestedPaths = [];\n let replaced;\n const replacedNewSelectors = [];\n replaced = replaceParentSelector(nestedPaths, context, nestedSelector);\n hadParentSelector = hadParentSelector || replaced;\n // the nestedPaths array should have only one member - replaceParentSelector does not multiply selectors\n for (k = 0; k < nestedPaths.length; k++) {\n const replacementSelector = createSelector(createParenthesis(nestedPaths[k], el), el);\n addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors);\n }\n newSelectors = replacedNewSelectors;\n currentElements = [];\n } else {\n currentElements.push(el);\n }\n\n } else {\n hadParentSelector = true;\n // the new list of selectors to add\n selectorsMultiplied = [];\n\n // merge the current list of non parent selector elements\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n // loop through our current selectors\n for (j = 0; j < newSelectors.length; j++) {\n sel = newSelectors[j];\n // if we don't have any parent paths, the & might be in a mixin so that it can be used\n // whether there are parents or not\n if (context.length === 0) {\n // the combinator used on el should now be applied to the next element instead so that\n // it is not lost\n if (sel.length > 0) {\n sel[0].elements.push(new Element(el.combinator, '', el.isVariable, el._index, el._fileInfo));\n }\n selectorsMultiplied.push(sel);\n }\n else {\n // and the parent selectors\n for (k = 0; k < context.length; k++) {\n // We need to put the current selectors\n // then join the last selector's elements on to the parents selectors\n const newSelectorPath = addReplacementIntoPath(sel, context[k], el, inSelector);\n // add that to our new set of selectors\n selectorsMultiplied.push(newSelectorPath);\n }\n }\n }\n\n // our new selectors has been multiplied, so reset the state\n newSelectors = selectorsMultiplied;\n currentElements = [];\n }\n }\n\n // if we have any elements left over (e.g. .a& .b == .b)\n // add them on to all the current selectors\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n for (i = 0; i < newSelectors.length; i++) {\n length = newSelectors[i].length;\n if (length > 0) {\n paths.push(newSelectors[i]);\n lastSelector = newSelectors[i][length - 1];\n newSelectors[i][length - 1] = lastSelector.createDerived(lastSelector.elements, inSelector.extendList);\n }\n }\n\n return hadParentSelector;\n }\n\n function deriveSelector(visibilityInfo, deriveFrom) {\n const newSelector = deriveFrom.createDerived(deriveFrom.elements, deriveFrom.extendList, deriveFrom.evaldCondition);\n newSelector.copyVisibilityInfo(visibilityInfo);\n return newSelector;\n }\n\n // joinSelector code follows\n let i, newPaths, hadParentSelector;\n\n newPaths = [];\n hadParentSelector = replaceParentSelector(newPaths, context, selector);\n\n if (!hadParentSelector) {\n if (context.length > 0) {\n newPaths = [];\n for (i = 0; i < context.length; i++) {\n\n const concatenated = context[i].map(deriveSelector.bind(this, selector.visibilityInfo()));\n\n concatenated.push(selector);\n newPaths.push(concatenated);\n }\n }\n else {\n newPaths = [[selector]];\n }\n }\n\n for (i = 0; i < newPaths.length; i++) {\n paths.push(newPaths[i]);\n }\n\n }\n}\n\nRuleset.prototype.type = 'Ruleset';\nRuleset.prototype.isRuleset = true;\nexport default Ruleset;\n","import Node from './node';\nimport Selector from './selector';\nimport Ruleset from './ruleset';\nimport Anonymous from './anonymous';\n\nclass AtRule extends Node {\n constructor(\n name,\n value,\n rules,\n index,\n currentFileInfo,\n debugInfo,\n isRooted,\n visibilityInfo\n ) {\n super();\n\n let i;\n\n this.name = name;\n this.value = (value instanceof Node) ? value : (value ? new Anonymous(value) : value);\n if (rules) {\n if (Array.isArray(rules)) {\n this.rules = rules;\n } else {\n this.rules = [rules];\n this.rules[0].selectors = (new Selector([], null, null, index, currentFileInfo)).createEmptySelectors();\n }\n for (i = 0; i < this.rules.length; i++) {\n this.rules[i].allowImports = true;\n }\n this.setParent(this.rules, this);\n }\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.debugInfo = debugInfo;\n this.isRooted = isRooted || false;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n }\n\n accept(visitor) {\n const value = this.value, rules = this.rules;\n if (rules) {\n this.rules = visitor.visitArray(rules);\n }\n if (value) {\n this.value = visitor.visit(value);\n }\n }\n\n isRulesetLike() {\n return this.rules || !this.isCharset();\n }\n\n isCharset() {\n return '@charset' === this.name;\n }\n\n genCSS(context, output) {\n const value = this.value, rules = this.rules;\n output.add(this.name, this.fileInfo(), this.getIndex());\n if (value) {\n output.add(' ');\n value.genCSS(context, output);\n }\n if (rules) {\n this.outputRuleset(context, output, rules);\n } else {\n output.add(';');\n }\n }\n\n eval(context) {\n let mediaPathBackup, mediaBlocksBackup, value = this.value, rules = this.rules;\n\n // media stored inside other atrule should not bubble over it\n // backpup media bubbling information\n mediaPathBackup = context.mediaPath;\n mediaBlocksBackup = context.mediaBlocks;\n // deleted media bubbling information\n context.mediaPath = [];\n context.mediaBlocks = [];\n\n if (value) {\n value = value.eval(context);\n }\n if (rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n rules = [rules[0].eval(context)];\n rules[0].root = true;\n }\n // restore media bubbling information\n context.mediaPath = mediaPathBackup;\n context.mediaBlocks = mediaBlocksBackup;\n\n return new AtRule(this.name, value, rules,\n this.getIndex(), this.fileInfo(), this.debugInfo, this.isRooted, this.visibilityInfo());\n }\n\n variable(name) {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.variable.call(this.rules[0], name);\n }\n }\n\n find() {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.find.apply(this.rules[0], arguments);\n }\n }\n\n rulesets() {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.rulesets.apply(this.rules[0]);\n }\n }\n\n outputRuleset(context, output, rules) {\n const ruleCnt = rules.length;\n let i;\n context.tabLevel = (context.tabLevel | 0) + 1;\n\n // Compressed\n if (context.compress) {\n output.add('{');\n for (i = 0; i < ruleCnt; i++) {\n rules[i].genCSS(context, output);\n }\n output.add('}');\n context.tabLevel--;\n return;\n }\n\n // Non-compressed\n const tabSetStr = `\\n${Array(context.tabLevel).join(' ')}`, tabRuleStr = `${tabSetStr} `;\n if (!ruleCnt) {\n output.add(` {${tabSetStr}}`);\n } else {\n output.add(` {${tabRuleStr}`);\n rules[0].genCSS(context, output);\n for (i = 1; i < ruleCnt; i++) {\n output.add(tabRuleStr);\n rules[i].genCSS(context, output);\n }\n output.add(`${tabSetStr}}`);\n }\n\n context.tabLevel--;\n }\n}\n\nAtRule.prototype.type = 'AtRule';\nexport default AtRule;\n","import Node from './node';\nimport contexts from '../contexts';\nimport * as utils from '../utils';\n\nclass DetachedRuleset extends Node {\n constructor(ruleset, frames) {\n super();\n\n this.ruleset = ruleset;\n this.frames = frames;\n this.setParent(this.ruleset, this);\n }\n\n accept(visitor) {\n this.ruleset = visitor.visit(this.ruleset);\n }\n\n eval(context) {\n const frames = this.frames || utils.copyArray(context.frames);\n return new DetachedRuleset(this.ruleset, frames);\n }\n\n callEval(context) {\n return this.ruleset.eval(this.frames ? new contexts.Eval(context, this.frames.concat(context.frames)) : context);\n }\n}\n\nDetachedRuleset.prototype.type = 'DetachedRuleset';\nDetachedRuleset.prototype.evalFirst = true;\nexport default DetachedRuleset;\n","import Node from './node';\nimport unitConversions from '../data/unit-conversions';\nimport * as utils from '../utils';\n\nclass Unit extends Node {\n constructor(numerator, denominator, backupUnit) {\n super();\n\n this.numerator = numerator ? utils.copyArray(numerator).sort() : [];\n this.denominator = denominator ? utils.copyArray(denominator).sort() : [];\n if (backupUnit) {\n this.backupUnit = backupUnit;\n } else if (numerator && numerator.length) {\n this.backupUnit = numerator[0];\n }\n }\n\n clone() {\n return new Unit(utils.copyArray(this.numerator), utils.copyArray(this.denominator), this.backupUnit);\n }\n\n genCSS(context, output) {\n // Dimension checks the unit is singular and throws an error if in strict math mode.\n const strictUnits = context && context.strictUnits;\n if (this.numerator.length === 1) {\n output.add(this.numerator[0]); // the ideal situation\n } else if (!strictUnits && this.backupUnit) {\n output.add(this.backupUnit);\n } else if (!strictUnits && this.denominator.length) {\n output.add(this.denominator[0]);\n }\n }\n\n toString() {\n let i, returnStr = this.numerator.join('*');\n for (i = 0; i < this.denominator.length; i++) {\n returnStr += `/${this.denominator[i]}`;\n }\n return returnStr;\n }\n\n compare(other) {\n return this.is(other.toString()) ? 0 : undefined;\n }\n\n is(unitString) {\n return this.toString().toUpperCase() === unitString.toUpperCase();\n }\n\n isLength() {\n return RegExp('^(px|em|ex|ch|rem|in|cm|mm|pc|pt|ex|vw|vh|vmin|vmax)$', 'gi').test(this.toCSS());\n }\n\n isEmpty() {\n return this.numerator.length === 0 && this.denominator.length === 0;\n }\n\n isSingular() {\n return this.numerator.length <= 1 && this.denominator.length === 0;\n }\n\n map(callback) {\n let i;\n\n for (i = 0; i < this.numerator.length; i++) {\n this.numerator[i] = callback(this.numerator[i], false);\n }\n\n for (i = 0; i < this.denominator.length; i++) {\n this.denominator[i] = callback(this.denominator[i], true);\n }\n }\n\n usedUnits() {\n let group;\n const result = {};\n let mapUnit;\n let groupName;\n\n mapUnit = function (atomicUnit) {\n /* jshint loopfunc:true */\n if (group.hasOwnProperty(atomicUnit) && !result[groupName]) {\n result[groupName] = atomicUnit;\n }\n\n return atomicUnit;\n };\n\n for (groupName in unitConversions) {\n if (unitConversions.hasOwnProperty(groupName)) {\n group = unitConversions[groupName];\n\n this.map(mapUnit);\n }\n }\n\n return result;\n }\n\n cancel() {\n const counter = {};\n let atomicUnit;\n let i;\n\n for (i = 0; i < this.numerator.length; i++) {\n atomicUnit = this.numerator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) + 1;\n }\n\n for (i = 0; i < this.denominator.length; i++) {\n atomicUnit = this.denominator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) - 1;\n }\n\n this.numerator = [];\n this.denominator = [];\n\n for (atomicUnit in counter) {\n if (counter.hasOwnProperty(atomicUnit)) {\n const count = counter[atomicUnit];\n\n if (count > 0) {\n for (i = 0; i < count; i++) {\n this.numerator.push(atomicUnit);\n }\n } else if (count < 0) {\n for (i = 0; i < -count; i++) {\n this.denominator.push(atomicUnit);\n }\n }\n }\n }\n\n this.numerator.sort();\n this.denominator.sort();\n }\n}\n\nUnit.prototype.type = 'Unit';\nexport default Unit;\n","import Node from './node';\nimport unitConversions from '../data/unit-conversions';\nimport Unit from './unit';\nimport Color from './color';\n\n//\n// A number with a unit\n//\nclass Dimension extends Node {\n constructor(value, unit) {\n super();\n\n this.value = parseFloat(value);\n if (isNaN(this.value)) {\n throw new Error('Dimension is not a number.');\n }\n this.unit = (unit && unit instanceof Unit) ? unit :\n new Unit(unit ? [unit] : undefined);\n this.setParent(this.unit, this);\n }\n\n accept(visitor) {\n this.unit = visitor.visit(this.unit);\n }\n\n eval(context) {\n return this;\n }\n\n toColor() {\n return new Color([this.value, this.value, this.value]);\n }\n\n genCSS(context, output) {\n if ((context && context.strictUnits) && !this.unit.isSingular()) {\n throw new Error(`Multiple units in dimension. Correct the units or use the unit function. Bad unit: ${this.unit.toString()}`);\n }\n\n const value = this.fround(context, this.value);\n let strValue = String(value);\n\n if (value !== 0 && value < 0.000001 && value > -0.000001) {\n // would be output 1e-6 etc.\n strValue = value.toFixed(20).replace(/0+$/, '');\n }\n\n if (context && context.compress) {\n // Zero values doesn't need a unit\n if (value === 0 && this.unit.isLength()) {\n output.add(strValue);\n return;\n }\n\n // Float values doesn't need a leading zero\n if (value > 0 && value < 1) {\n strValue = (strValue).substr(1);\n }\n }\n\n output.add(strValue);\n this.unit.genCSS(context, output);\n }\n\n // In an operation between two Dimensions,\n // we default to the first Dimension's unit,\n // so `1px + 2` will yield `3px`.\n operate(context, op, other) {\n /* jshint noempty:false */\n let value = this._operate(context, op, this.value, other.value), unit = this.unit.clone();\n\n if (op === '+' || op === '-') {\n if (unit.numerator.length === 0 && unit.denominator.length === 0) {\n unit = other.unit.clone();\n if (this.unit.backupUnit) {\n unit.backupUnit = this.unit.backupUnit;\n }\n } else if (other.unit.numerator.length === 0 && unit.denominator.length === 0) {\n // do nothing\n } else {\n other = other.convertTo(this.unit.usedUnits());\n\n if (context.strictUnits && other.unit.toString() !== unit.toString()) {\n throw new Error(`Incompatible units. Change the units or use the unit function. Bad units: '${unit.toString()}' and '${other.unit.toString()}'.`);\n }\n\n value = this._operate(context, op, this.value, other.value);\n }\n } else if (op === '*') {\n unit.numerator = unit.numerator.concat(other.unit.numerator).sort();\n unit.denominator = unit.denominator.concat(other.unit.denominator).sort();\n unit.cancel();\n } else if (op === '/') {\n unit.numerator = unit.numerator.concat(other.unit.denominator).sort();\n unit.denominator = unit.denominator.concat(other.unit.numerator).sort();\n unit.cancel();\n }\n return new Dimension(value, unit);\n }\n\n compare(other) {\n let a, b;\n\n if (!(other instanceof Dimension)) {\n return undefined;\n }\n\n if (this.unit.isEmpty() || other.unit.isEmpty()) {\n a = this;\n b = other;\n } else {\n a = this.unify();\n b = other.unify();\n if (a.unit.compare(b.unit) !== 0) {\n return undefined;\n }\n }\n\n return Node.numericCompare(a.value, b.value);\n }\n\n unify() {\n return this.convertTo({ length: 'px', duration: 's', angle: 'rad' });\n }\n\n convertTo(conversions) {\n let value = this.value;\n const unit = this.unit.clone();\n let i;\n let groupName;\n let group;\n let targetUnit;\n let derivedConversions = {};\n let applyUnit;\n\n if (typeof conversions === 'string') {\n for (i in unitConversions) {\n if (unitConversions[i].hasOwnProperty(conversions)) {\n derivedConversions = {};\n derivedConversions[i] = conversions;\n }\n }\n conversions = derivedConversions;\n }\n applyUnit = function (atomicUnit, denominator) {\n /* jshint loopfunc:true */\n if (group.hasOwnProperty(atomicUnit)) {\n if (denominator) {\n value = value / (group[atomicUnit] / group[targetUnit]);\n } else {\n value = value * (group[atomicUnit] / group[targetUnit]);\n }\n\n return targetUnit;\n }\n\n return atomicUnit;\n };\n\n for (groupName in conversions) {\n if (conversions.hasOwnProperty(groupName)) {\n targetUnit = conversions[groupName];\n group = unitConversions[groupName];\n\n unit.map(applyUnit);\n }\n }\n\n unit.cancel();\n\n return new Dimension(value, unit);\n }\n}\n\nDimension.prototype.type = 'Dimension';\nexport default Dimension;\n","import Node from './node';\nimport Color from './color';\nimport Dimension from './dimension';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\n\nclass Operation extends Node {\n constructor(op, operands, isSpaced) {\n super();\n\n this.op = op.trim();\n this.operands = operands;\n this.isSpaced = isSpaced;\n }\n\n accept(visitor) {\n this.operands = visitor.visitArray(this.operands);\n }\n\n eval(context) {\n let a = this.operands[0].eval(context), b = this.operands[1].eval(context), op;\n\n if (context.isMathOn(this.op)) {\n op = this.op === './' ? '/' : this.op;\n if (a instanceof Dimension && b instanceof Color) {\n a = a.toColor();\n }\n if (b instanceof Dimension && a instanceof Color) {\n b = b.toColor();\n }\n if (!a.operate) {\n if (a instanceof Operation && a.op === '/' && context.math === MATH.PARENS_DIVISION) {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n throw { type: 'Operation',\n message: 'Operation on an invalid type' };\n }\n\n return a.operate(context, op, b);\n } else {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n }\n\n genCSS(context, output) {\n this.operands[0].genCSS(context, output);\n if (this.isSpaced) {\n output.add(' ');\n }\n output.add(this.op);\n if (this.isSpaced) {\n output.add(' ');\n }\n this.operands[1].genCSS(context, output);\n }\n}\n\nOperation.prototype.type = 'Operation';\nexport default Operation;\n","import Node from './node';\nimport Paren from './paren';\nimport Comment from './comment';\nimport Dimension from './dimension';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\nclass Expression extends Node {\n constructor(value, noSpacing) {\n super();\n\n this.value = value;\n this.noSpacing = noSpacing;\n if (!value) {\n throw new Error('Expression requires an array parameter');\n }\n }\n\n accept(visitor) {\n this.value = visitor.visitArray(this.value);\n }\n\n eval(context) {\n let returnValue;\n const mathOn = context.isMathOn();\n const inParenthesis = this.parens;\n\n let doubleParen = false;\n if (inParenthesis) {\n context.inParenthesis();\n }\n if (this.value.length > 1) {\n returnValue = new Expression(this.value.map(function (e) {\n if (!e.eval) {\n return e;\n }\n return e.eval(context);\n }), this.noSpacing);\n } else if (this.value.length === 1) {\n if (this.value[0].parens && !this.value[0].parensInOp && !context.inCalc) {\n doubleParen = true;\n }\n returnValue = this.value[0].eval(context);\n } else {\n returnValue = this;\n }\n if (inParenthesis) {\n context.outOfParenthesis();\n }\n if (this.parens && this.parensInOp && !mathOn && !doubleParen \n && (!(returnValue instanceof Dimension))) {\n returnValue = new Paren(returnValue);\n }\n return returnValue;\n }\n\n genCSS(context, output) {\n for (let i = 0; i < this.value.length; i++) {\n this.value[i].genCSS(context, output);\n if (!this.noSpacing && i + 1 < this.value.length) {\n output.add(' ');\n }\n }\n }\n\n throwAwayComments() {\n this.value = this.value.filter(function(v) {\n return !(v instanceof Comment);\n });\n }\n}\n\nExpression.prototype.type = 'Expression';\nexport default Expression;\n","import Expression from '../tree/expression';\n\nclass functionCaller {\n constructor(name, context, index, currentFileInfo) {\n this.name = name.toLowerCase();\n this.index = index;\n this.context = context;\n this.currentFileInfo = currentFileInfo;\n\n this.func = context.frames[0].functionRegistry.get(this.name);\n }\n\n isValid() {\n return Boolean(this.func);\n }\n\n call(args) {\n if (!(Array.isArray(args))) {\n args = [args];\n }\n const evalArgs = this.func.evalArgs;\n if (evalArgs !== false) {\n args = args.map(a => a.eval(this.context));\n }\n const commentFilter = item => !(item.type === 'Comment');\n\n // This code is terrible and should be replaced as per this issue...\n // https://github.com/less/less.js/issues/2477\n args = args\n .filter(commentFilter)\n .map(item => {\n if (item.type === 'Expression') {\n const subNodes = item.value.filter(commentFilter);\n if (subNodes.length === 1) {\n return subNodes[0];\n } else {\n return new Expression(subNodes);\n }\n }\n return item;\n });\n\n if (evalArgs === false) {\n return this.func(this.context, ...args);\n }\n\n return this.func(...args);\n }\n}\n\nexport default functionCaller;\n","import Node from './node';\nimport Anonymous from './anonymous';\nimport FunctionCaller from '../functions/function-caller';\nimport logger from '../logger';\n\n//\n// A function call node.\n//\nclass Call extends Node {\n constructor(name, args, index, currentFileInfo) {\n super();\n\n this.name = name;\n this.args = args;\n this.calc = name === 'calc';\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n accept(visitor) {\n if (this.args) {\n this.args = visitor.visitArray(this.args);\n }\n }\n\n //\n // When evaluating a function call,\n // we either find the function in the functionRegistry,\n // in which case we call it, passing the evaluated arguments,\n // if this returns null or we cannot find the function, we\n // simply print it out as it appeared originally [2].\n //\n // The reason why we evaluate the arguments, is in the case where\n // we try to pass a variable to a function, like: `saturate(@color)`.\n // The function should receive the value, not the variable.\n //\n eval(context) {\n /**\n * Turn off math for calc(), and switch back on for evaluating nested functions\n */\n const currentMathContext = context.mathOn;\n context.mathOn = !this.calc;\n if (this.calc || context.inCalc) {\n context.enterCalc();\n }\n\n const exitCalc = () => {\n if (this.calc || context.inCalc) {\n context.exitCalc();\n }\n context.mathOn = currentMathContext;\n };\n\n let result;\n const funcCaller = new FunctionCaller(this.name, context, this.getIndex(), this.fileInfo());\n\n if (funcCaller.isValid()) {\n try {\n result = funcCaller.call(this.args);\n exitCalc();\n } catch (e) {\n if (e.hasOwnProperty('line') && e.hasOwnProperty('column')) {\n throw e;\n }\n throw { \n type: e.type || 'Runtime',\n message: `Error evaluating function \\`${this.name}\\`${e.message ? `: ${e.message}` : ''}`,\n index: this.getIndex(), \n filename: this.fileInfo().filename,\n line: e.lineNumber,\n column: e.columnNumber\n };\n }\n }\n\n if (result !== null && result !== undefined) {\n // Results that that are not nodes are cast as Anonymous nodes\n // Falsy values or booleans are returned as empty nodes\n if (!(result instanceof Node)) {\n if (!result || result === true) {\n result = new Anonymous(null); \n }\n else {\n result = new Anonymous(result.toString()); \n }\n \n }\n result._index = this._index;\n result._fileInfo = this._fileInfo;\n return result;\n }\n\n const args = this.args.map(a => a.eval(context));\n exitCalc();\n\n return new Call(this.name, args, this.getIndex(), this.fileInfo());\n }\n\n genCSS(context, output) {\n output.add(`${this.name}(`, this.fileInfo(), this.getIndex());\n\n for (let i = 0; i < this.args.length; i++) {\n this.args[i].genCSS(context, output);\n if (i + 1 < this.args.length) {\n output.add(', ');\n }\n }\n\n output.add(')');\n }\n}\n\nCall.prototype.type = 'Call';\nexport default Call;\n","import Node from './node';\nimport Call from './call';\n\nclass Variable extends Node {\n constructor(name, index, currentFileInfo) {\n super();\n\n this.name = name;\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n eval(context) {\n let variable, name = this.name;\n\n if (name.indexOf('@@') === 0) {\n name = `@${new Variable(name.slice(1), this.getIndex(), this.fileInfo()).eval(context).value}`;\n }\n\n if (this.evaluating) {\n throw { type: 'Name',\n message: `Recursive variable definition for ${name}`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n variable = this.find(context.frames, function (frame) {\n const v = frame.variable(name);\n if (v) {\n if (v.important) {\n const importantScope = context.importantScope[context.importantScope.length - 1];\n importantScope.important = v.important;\n }\n // If in calc, wrap vars in a function call to cascade evaluate args first\n if (context.inCalc) {\n return (new Call('_SELF', [v.value])).eval(context);\n }\n else {\n return v.value.eval(context);\n }\n }\n });\n if (variable) {\n this.evaluating = false;\n return variable;\n } else {\n throw { type: 'Name',\n message: `variable ${name} is undefined`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n }\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n}\n\nVariable.prototype.type = 'Variable';\nexport default Variable;\n","import Node from './node';\nimport Declaration from './declaration';\n\nclass Property extends Node {\n constructor(name, index, currentFileInfo) {\n super();\n\n this.name = name;\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n eval(context) {\n let property;\n const name = this.name;\n // TODO: shorten this reference\n const mergeRules = context.pluginManager.less.visitors.ToCSSVisitor.prototype._mergeRules;\n\n if (this.evaluating) {\n throw { type: 'Name',\n message: `Recursive property reference for ${name}`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n property = this.find(context.frames, function (frame) {\n let v;\n const vArr = frame.property(name);\n if (vArr) {\n for (let i = 0; i < vArr.length; i++) {\n v = vArr[i];\n\n vArr[i] = new Declaration(v.name,\n v.value,\n v.important,\n v.merge,\n v.index,\n v.currentFileInfo,\n v.inline,\n v.variable\n );\n }\n mergeRules(vArr);\n\n v = vArr[vArr.length - 1];\n if (v.important) {\n const importantScope = context.importantScope[context.importantScope.length - 1];\n importantScope.important = v.important;\n }\n v = v.value.eval(context);\n return v;\n }\n });\n if (property) {\n this.evaluating = false;\n return property;\n } else {\n throw { type: 'Name',\n message: `Property '${name}' is undefined`,\n filename: this.currentFileInfo.filename,\n index: this.index };\n }\n }\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n}\n\nProperty.prototype.type = 'Property';\nexport default Property;\n","import Node from './node';\n\nclass Attribute extends Node {\n constructor(key, op, value) {\n super();\n\n this.key = key;\n this.op = op;\n this.value = value;\n }\n\n eval(context) {\n return new Attribute(this.key.eval ? this.key.eval(context) : this.key,\n this.op, (this.value && this.value.eval) ? this.value.eval(context) : this.value);\n }\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n }\n\n toCSS(context) {\n let value = this.key.toCSS ? this.key.toCSS(context) : this.key;\n\n if (this.op) {\n value += this.op;\n value += (this.value.toCSS ? this.value.toCSS(context) : this.value);\n }\n\n return `[${value}]`;\n }\n}\n\nAttribute.prototype.type = 'Attribute';\nexport default Attribute;\n","import Node from './node';\nimport Variable from './variable';\nimport Property from './property';\n\n\nclass Quoted extends Node {\n constructor(str, content, escaped, index, currentFileInfo) {\n super();\n\n this.escaped = (escaped == null) ? true : escaped;\n this.value = content || '';\n this.quote = str.charAt(0);\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.variableRegex = /@\\{([\\w-]+)\\}/g;\n this.propRegex = /\\$\\{([\\w-]+)\\}/g;\n this.allowRoot = escaped;\n }\n\n genCSS(context, output) {\n if (!this.escaped) {\n output.add(this.quote, this.fileInfo(), this.getIndex());\n }\n output.add(this.value);\n if (!this.escaped) {\n output.add(this.quote);\n }\n }\n\n containsVariables() {\n return this.value.match(this.variableRegex);\n }\n\n eval(context) {\n const that = this;\n let value = this.value;\n const variableReplacement = function (_, name) {\n const v = new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v.value : v.toCSS();\n };\n const propertyReplacement = function (_, name) {\n const v = new Property(`$${name}`, that.getIndex(), that.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v.value : v.toCSS();\n };\n function iterativeReplace(value, regexp, replacementFnc) {\n let evaluatedValue = value;\n do {\n value = evaluatedValue.toString();\n evaluatedValue = value.replace(regexp, replacementFnc);\n } while (value !== evaluatedValue);\n return evaluatedValue;\n }\n value = iterativeReplace(value, this.variableRegex, variableReplacement);\n value = iterativeReplace(value, this.propRegex, propertyReplacement);\n return new Quoted(this.quote + value + this.quote, value, this.escaped, this.getIndex(), this.fileInfo());\n }\n\n compare(other) {\n // when comparing quoted strings allow the quote to differ\n if (other.type === 'Quoted' && !this.escaped && !other.escaped) {\n return Node.numericCompare(this.value, other.value);\n } else {\n return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n }\n }\n}\n\nQuoted.prototype.type = 'Quoted';\nexport default Quoted;\n","import Node from './node';\n\nclass URL extends Node {\n constructor(val, index, currentFileInfo, isEvald) {\n super();\n\n this.value = val;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.isEvald = isEvald;\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n genCSS(context, output) {\n output.add('url(');\n this.value.genCSS(context, output);\n output.add(')');\n }\n\n eval(context) {\n const val = this.value.eval(context);\n let rootpath;\n\n if (!this.isEvald) {\n // Add the rootpath if the URL requires a rewrite\n rootpath = this.fileInfo() && this.fileInfo().rootpath;\n if (typeof rootpath === 'string' &&\n typeof val.value === 'string' &&\n context.pathRequiresRewrite(val.value)) {\n if (!val.quote) {\n rootpath = escapePath(rootpath);\n }\n val.value = context.rewritePath(val.value, rootpath);\n } else {\n val.value = context.normalizePath(val.value);\n }\n\n // Add url args if enabled\n if (context.urlArgs) {\n if (!val.value.match(/^\\s*data:/)) {\n const delimiter = val.value.indexOf('?') === -1 ? '?' : '&';\n const urlArgs = delimiter + context.urlArgs;\n if (val.value.indexOf('#') !== -1) {\n val.value = val.value.replace('#', `${urlArgs}#`);\n } else {\n val.value += urlArgs;\n }\n }\n }\n }\n\n return new URL(val, this.getIndex(), this.fileInfo(), true);\n }\n}\n\nURL.prototype.type = 'Url';\n\nfunction escapePath(path) {\n return path.replace(/[\\(\\)'\"\\s]/g, function(match) { return `\\\\${match}`; });\n}\n\nexport default URL;\n","import Ruleset from './ruleset';\nimport Value from './value';\nimport Selector from './selector';\nimport Anonymous from './anonymous';\nimport Expression from './expression';\nimport AtRule from './atrule';\nimport * as utils from '../utils';\n\nclass Media extends AtRule {\n constructor(value, features, index, currentFileInfo, visibilityInfo) {\n super();\n\n this._index = index;\n this._fileInfo = currentFileInfo;\n\n const selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors();\n\n this.features = new Value(features);\n this.rules = [new Ruleset(selectors, value)];\n this.rules[0].allowImports = true;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n this.setParent(selectors, this);\n this.setParent(this.features, this);\n this.setParent(this.rules, this);\n }\n\n isRulesetLike() {\n return true;\n }\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this.features);\n }\n if (this.rules) {\n this.rules = visitor.visitArray(this.rules);\n }\n }\n\n genCSS(context, output) {\n output.add('@media ', this._fileInfo, this._index);\n this.features.genCSS(context, output);\n this.outputRuleset(context, output, this.rules);\n }\n\n eval(context) {\n if (!context.mediaBlocks) {\n context.mediaBlocks = [];\n context.mediaPath = [];\n }\n\n const media = new Media(null, [], this._index, this._fileInfo, this.visibilityInfo());\n if (this.debugInfo) {\n this.rules[0].debugInfo = this.debugInfo;\n media.debugInfo = this.debugInfo;\n }\n \n media.features = this.features.eval(context);\n\n context.mediaPath.push(media);\n context.mediaBlocks.push(media);\n\n this.rules[0].functionRegistry = context.frames[0].functionRegistry.inherit();\n context.frames.unshift(this.rules[0]);\n media.rules = [this.rules[0].eval(context)];\n context.frames.shift();\n\n context.mediaPath.pop();\n\n return context.mediaPath.length === 0 ? media.evalTop(context) :\n media.evalNested(context);\n }\n\n evalTop(context) {\n let result = this;\n\n // Render all dependent Media blocks.\n if (context.mediaBlocks.length > 1) {\n const selectors = (new Selector([], null, null, this.getIndex(), this.fileInfo())).createEmptySelectors();\n result = new Ruleset(selectors, context.mediaBlocks);\n result.multiMedia = true;\n result.copyVisibilityInfo(this.visibilityInfo());\n this.setParent(result, this);\n }\n\n delete context.mediaBlocks;\n delete context.mediaPath;\n\n return result;\n }\n\n evalNested(context) {\n let i;\n let value;\n const path = context.mediaPath.concat([this]);\n\n // Extract the media-query conditions separated with `,` (OR).\n for (i = 0; i < path.length; i++) {\n value = path[i].features instanceof Value ?\n path[i].features.value : path[i].features;\n path[i] = Array.isArray(value) ? value : [value];\n }\n\n // Trace all permutations to generate the resulting media-query.\n //\n // (a, b and c) with nested (d, e) ->\n // a and d\n // a and e\n // b and c and d\n // b and c and e\n this.features = new Value(this.permute(path).map(path => {\n path = path.map(fragment => fragment.toCSS ? fragment : new Anonymous(fragment));\n\n for (i = path.length - 1; i > 0; i--) {\n path.splice(i, 0, new Anonymous('and'));\n }\n\n return new Expression(path);\n }));\n this.setParent(this.features, this);\n\n // Fake a tree-node that doesn't output anything.\n return new Ruleset([], []);\n }\n\n permute(arr) {\n if (arr.length === 0) {\n return [];\n } else if (arr.length === 1) {\n return arr[0];\n } else {\n const result = [];\n const rest = this.permute(arr.slice(1));\n for (let i = 0; i < rest.length; i++) {\n for (let j = 0; j < arr[0].length; j++) {\n result.push([arr[0][j]].concat(rest[i]));\n }\n }\n return result;\n }\n }\n\n bubbleSelectors(selectors) {\n if (!selectors) {\n return;\n }\n this.rules = [new Ruleset(utils.copyArray(selectors), [this.rules[0]])];\n this.setParent(this.rules, this);\n }\n}\n\nMedia.prototype.type = 'Media';\nexport default Media;\n","import Node from './node';\nimport Media from './media';\nimport URL from './url';\nimport Quoted from './quoted';\nimport Ruleset from './ruleset';\nimport Anonymous from './anonymous';\nimport * as utils from '../utils';\nimport LessError from '../less-error';\n\n//\n// CSS @import node\n//\n// The general strategy here is that we don't want to wait\n// for the parsing to be completed, before we start importing\n// the file. That's because in the context of a browser,\n// most of the time will be spent waiting for the server to respond.\n//\n// On creation, we push the import path to our import queue, though\n// `import,push`, we also pass it a callback, which it'll call once\n// the file has been fetched, and parsed.\n//\nclass Import extends Node {\n constructor(path, features, options, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.options = options;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.path = path;\n this.features = features;\n this.allowRoot = true;\n\n if (this.options.less !== undefined || this.options.inline) {\n this.css = !this.options.less || this.options.inline;\n } else {\n const pathValue = this.getPath();\n if (pathValue && /[#\\.\\&\\?]css([\\?;].*)?$/.test(pathValue)) {\n this.css = true;\n }\n }\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.features, this);\n this.setParent(this.path, this);\n }\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this.features);\n }\n this.path = visitor.visit(this.path);\n if (!this.options.isPlugin && !this.options.inline && this.root) {\n this.root = visitor.visit(this.root);\n }\n }\n\n genCSS(context, output) {\n if (this.css && this.path._fileInfo.reference === undefined) {\n output.add('@import ', this._fileInfo, this._index);\n this.path.genCSS(context, output);\n if (this.features) {\n output.add(' ');\n this.features.genCSS(context, output);\n }\n output.add(';');\n }\n }\n\n getPath() {\n return (this.path instanceof URL) ?\n this.path.value.value : this.path.value;\n }\n\n isVariableImport() {\n let path = this.path;\n if (path instanceof URL) {\n path = path.value;\n }\n if (path instanceof Quoted) {\n return path.containsVariables();\n }\n\n return true;\n }\n\n evalForImport(context) {\n let path = this.path;\n\n if (path instanceof URL) {\n path = path.value;\n }\n\n return new Import(path.eval(context), this.features, this.options, this._index, this._fileInfo, this.visibilityInfo());\n }\n\n evalPath(context) {\n const path = this.path.eval(context);\n const fileInfo = this._fileInfo;\n\n if (!(path instanceof URL)) {\n // Add the rootpath if the URL requires a rewrite\n const pathValue = path.value;\n if (fileInfo &&\n pathValue &&\n context.pathRequiresRewrite(pathValue)) {\n path.value = context.rewritePath(pathValue, fileInfo.rootpath);\n } else {\n path.value = context.normalizePath(path.value);\n }\n }\n\n return path;\n }\n\n eval(context) {\n const result = this.doEval(context);\n if (this.options.reference || this.blocksVisibility()) {\n if (result.length || result.length === 0) {\n result.forEach(function (node) {\n node.addVisibilityBlock();\n }\n );\n } else {\n result.addVisibilityBlock();\n }\n }\n return result;\n }\n\n doEval(context) {\n let ruleset;\n let registry;\n const features = this.features && this.features.eval(context);\n\n if (this.options.isPlugin) {\n if (this.root && this.root.eval) {\n try {\n this.root.eval(context);\n }\n catch (e) {\n e.message = 'Plugin error during evaluation';\n throw new LessError(e, this.root.imports, this.root.filename);\n }\n }\n registry = context.frames[0] && context.frames[0].functionRegistry;\n if ( registry && this.root && this.root.functions ) {\n registry.addMultiple( this.root.functions );\n }\n\n return [];\n }\n\n if (this.skip) {\n if (typeof this.skip === 'function') {\n this.skip = this.skip();\n }\n if (this.skip) {\n return [];\n }\n }\n if (this.options.inline) {\n const contents = new Anonymous(this.root, 0,\n {\n filename: this.importedFilename,\n reference: this.path._fileInfo && this.path._fileInfo.reference\n }, true, true);\n\n return this.features ? new Media([contents], this.features.value) : [contents];\n } else if (this.css) {\n const newImport = new Import(this.evalPath(context), features, this.options, this._index);\n if (!newImport.css && this.error) {\n throw this.error;\n }\n return newImport;\n } else if (this.root) {\n ruleset = new Ruleset(null, utils.copyArray(this.root.rules));\n ruleset.evalImports(context);\n\n return this.features ? new Media(ruleset.rules, this.features.value) : ruleset.rules;\n } else {\n return [];\n }\n }\n}\n\nImport.prototype.type = 'Import';\nexport default Import;\n","import Node from './node';\nimport Variable from './variable';\n\nclass JsEvalNode extends Node {\n evaluateJavaScript(expression, context) {\n let result;\n const that = this;\n const evalContext = {};\n\n if (!context.javascriptEnabled) {\n throw { message: 'Inline JavaScript is not enabled. Is it set in your options?',\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n expression = expression.replace(/@\\{([\\w-]+)\\}/g, function (_, name) {\n return that.jsify(new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context));\n });\n\n try {\n expression = new Function(`return (${expression})`);\n } catch (e) {\n throw { message: `JavaScript evaluation error: ${e.message} from \\`${expression}\\`` ,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n const variables = context.frames[0].variables();\n for (const k in variables) {\n if (variables.hasOwnProperty(k)) {\n /* jshint loopfunc:true */\n evalContext[k.slice(1)] = {\n value: variables[k].value,\n toJS: function () {\n return this.value.eval(context).toCSS();\n }\n };\n }\n }\n\n try {\n result = expression.call(evalContext);\n } catch (e) {\n throw { message: `JavaScript evaluation error: '${e.name}: ${e.message.replace(/[\"]/g, '\\'')}'` ,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n return result;\n }\n\n jsify(obj) {\n if (Array.isArray(obj.value) && (obj.value.length > 1)) {\n return `[${obj.value.map(function (v) { return v.toCSS(); }).join(', ')}]`;\n } else {\n return obj.toCSS();\n }\n }\n}\n\nexport default JsEvalNode;\n","import JsEvalNode from './js-eval-node';\nimport Dimension from './dimension';\nimport Quoted from './quoted';\nimport Anonymous from './anonymous';\n\nclass JavaScript extends JsEvalNode {\n constructor(string, escaped, index, currentFileInfo) {\n super();\n\n this.escaped = escaped;\n this.expression = string;\n this._index = index;\n this._fileInfo = currentFileInfo;\n }\n\n eval(context) {\n const result = this.evaluateJavaScript(this.expression, context);\n const type = typeof result;\n\n if (type === 'number' && !isNaN(result)) {\n return new Dimension(result);\n } else if (type === 'string') {\n return new Quoted(`\"${result}\"`, result, this.escaped, this._index);\n } else if (Array.isArray(result)) {\n return new Anonymous(result.join(', '));\n } else {\n return new Anonymous(result);\n }\n }\n}\n\nJavaScript.prototype.type = 'JavaScript';\nexport default JavaScript;\n","import Node from './node';\n\nclass Assignment extends Node {\n constructor(key, val) {\n super();\n\n this.key = key;\n this.value = val;\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n eval(context) {\n if (this.value.eval) {\n return new Assignment(this.key, this.value.eval(context));\n }\n return this;\n }\n\n genCSS(context, output) {\n output.add(`${this.key}=`);\n if (this.value.genCSS) {\n this.value.genCSS(context, output);\n } else {\n output.add(this.value);\n }\n }\n}\n\nAssignment.prototype.type = 'Assignment';\nexport default Assignment;\n","import Node from './node';\n\nclass Condition extends Node {\n constructor(op, l, r, i, negate) {\n super();\n\n this.op = op.trim();\n this.lvalue = l;\n this.rvalue = r;\n this._index = i;\n this.negate = negate;\n }\n\n accept(visitor) {\n this.lvalue = visitor.visit(this.lvalue);\n this.rvalue = visitor.visit(this.rvalue);\n }\n\n eval(context) {\n const result = (function (op, a, b) {\n switch (op) {\n case 'and': return a && b;\n case 'or': return a || b;\n default:\n switch (Node.compare(a, b)) {\n case -1:\n return op === '<' || op === '=<' || op === '<=';\n case 0:\n return op === '=' || op === '>=' || op === '=<' || op === '<=';\n case 1:\n return op === '>' || op === '>=';\n default:\n return false;\n }\n }\n })(this.op, this.lvalue.eval(context), this.rvalue.eval(context));\n\n return this.negate ? !result : result;\n }\n}\n\nCondition.prototype.type = 'Condition';\nexport default Condition;\n","import Node from './node';\n\nclass UnicodeDescriptor extends Node {\n constructor(value) {\n super();\n\n this.value = value;\n }\n}\n\nUnicodeDescriptor.prototype.type = 'UnicodeDescriptor';\n\nexport default UnicodeDescriptor;\n","import Node from './node';\nimport Operation from './operation';\nimport Dimension from './dimension';\n\nclass Negative extends Node {\n constructor(node) {\n super();\n\n this.value = node;\n }\n\n genCSS(context, output) {\n output.add('-');\n this.value.genCSS(context, output);\n }\n\n eval(context) {\n if (context.isMathOn()) {\n return (new Operation('*', [new Dimension(-1), this.value])).eval(context);\n }\n return new Negative(this.value.eval(context));\n }\n}\n\nNegative.prototype.type = 'Negative';\nexport default Negative;\n","import Node from './node';\nimport Selector from './selector';\n\nclass Extend extends Node {\n constructor(selector, option, index, currentFileInfo, visibilityInfo) {\n super();\n\n this.selector = selector;\n this.option = option;\n this.object_id = Extend.next_id++;\n this.parent_ids = [this.object_id];\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n\n switch (option) {\n case 'all':\n this.allowBefore = true;\n this.allowAfter = true;\n break;\n default:\n this.allowBefore = false;\n this.allowAfter = false;\n break;\n }\n this.setParent(this.selector, this);\n }\n\n accept(visitor) {\n this.selector = visitor.visit(this.selector);\n }\n\n eval(context) {\n return new Extend(this.selector.eval(context), this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n }\n\n clone(context) {\n return new Extend(this.selector, this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n }\n\n // it concatenates (joins) all selectors in selector array\n findSelfSelectors(selectors) {\n let selfElements = [], i, selectorElements;\n\n for (i = 0; i < selectors.length; i++) {\n selectorElements = selectors[i].elements;\n // duplicate the logic in genCSS function inside the selector node.\n // future TODO - move both logics into the selector joiner visitor\n if (i > 0 && selectorElements.length && selectorElements[0].combinator.value === '') {\n selectorElements[0].combinator.value = ' ';\n }\n selfElements = selfElements.concat(selectors[i].elements);\n }\n\n this.selfSelectors = [new Selector(selfElements)];\n this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo());\n }\n}\n\nExtend.next_id = 0;\n\nExtend.prototype.type = 'Extend';\nexport default Extend;\n","import Node from './node';\nimport Variable from './variable';\nimport Ruleset from './ruleset';\nimport DetachedRuleset from './detached-ruleset';\nimport LessError from '../less-error';\n\nclass VariableCall extends Node {\n constructor(variable, index, currentFileInfo) {\n super();\n\n this.variable = variable;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.allowRoot = true;\n }\n\n eval(context) {\n let rules;\n let detachedRuleset = new Variable(this.variable, this.getIndex(), this.fileInfo()).eval(context);\n const error = new LessError({message: `Could not evaluate variable call ${this.variable}`});\n\n if (!detachedRuleset.ruleset) {\n if (detachedRuleset.rules) {\n rules = detachedRuleset;\n }\n else if (Array.isArray(detachedRuleset)) {\n rules = new Ruleset('', detachedRuleset);\n }\n else if (Array.isArray(detachedRuleset.value)) {\n rules = new Ruleset('', detachedRuleset.value);\n }\n else {\n throw error;\n }\n detachedRuleset = new DetachedRuleset(rules);\n }\n\n if (detachedRuleset.ruleset) {\n return detachedRuleset.callEval(context);\n }\n throw error;\n }\n}\n\nVariableCall.prototype.type = 'VariableCall';\nexport default VariableCall;\n","import Node from './node';\nimport Variable from './variable';\nimport Ruleset from './ruleset';\nimport Selector from './selector';\n\nclass NamespaceValue extends Node {\n constructor(ruleCall, lookups, index, fileInfo) {\n super();\n\n this.value = ruleCall;\n this.lookups = lookups;\n this._index = index;\n this._fileInfo = fileInfo;\n }\n\n eval(context) {\n let i, j, name, rules = this.value.eval(context);\n \n for (i = 0; i < this.lookups.length; i++) {\n name = this.lookups[i];\n\n /**\n * Eval'd DRs return rulesets.\n * Eval'd mixins return rules, so let's make a ruleset if we need it.\n * We need to do this because of late parsing of values\n */\n if (Array.isArray(rules)) {\n rules = new Ruleset([new Selector()], rules);\n }\n\n if (name === '') {\n rules = rules.lastDeclaration();\n }\n else if (name.charAt(0) === '@') {\n if (name.charAt(1) === '@') {\n name = `@${new Variable(name.substr(1)).eval(context).value}`;\n }\n if (rules.variables) {\n rules = rules.variable(name);\n }\n \n if (!rules) {\n throw { type: 'Name',\n message: `variable ${name} not found`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n }\n else {\n if (name.substring(0, 2) === '$@') {\n name = `$${new Variable(name.substr(1)).eval(context).value}`;\n }\n else {\n name = name.charAt(0) === '$' ? name : `$${name}`;\n }\n if (rules.properties) {\n rules = rules.property(name);\n }\n \n if (!rules) {\n throw { type: 'Name',\n message: `property \"${name.substr(1)}\" not found`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n // Properties are an array of values, since a ruleset can have multiple props.\n // We pick the last one (the \"cascaded\" value)\n rules = rules[rules.length - 1];\n }\n\n if (rules.value) {\n rules = rules.eval(context).value;\n }\n if (rules.ruleset) {\n rules = rules.ruleset.eval(context);\n }\n }\n return rules;\n }\n}\n\nNamespaceValue.prototype.type = 'NamespaceValue';\nexport default NamespaceValue;\n","import Selector from './selector';\nimport Element from './element';\nimport Ruleset from './ruleset';\nimport Declaration from './declaration';\nimport DetachedRuleset from './detached-ruleset';\nimport Expression from './expression';\nimport contexts from '../contexts';\nimport * as utils from '../utils';\n\nclass Definition extends Ruleset {\n constructor(name, params, rules, condition, variadic, frames, visibilityInfo) {\n super();\n\n this.name = name || 'anonymous mixin';\n this.selectors = [new Selector([new Element(null, name, false, this._index, this._fileInfo)])];\n this.params = params;\n this.condition = condition;\n this.variadic = variadic;\n this.arity = params.length;\n this.rules = rules;\n this._lookups = {};\n const optionalParameters = [];\n this.required = params.reduce(function (count, p) {\n if (!p.name || (p.name && !p.value)) {\n return count + 1;\n }\n else {\n optionalParameters.push(p.name);\n return count;\n }\n }, 0);\n this.optionalParameters = optionalParameters;\n this.frames = frames;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n }\n\n accept(visitor) {\n if (this.params && this.params.length) {\n this.params = visitor.visitArray(this.params);\n }\n this.rules = visitor.visitArray(this.rules);\n if (this.condition) {\n this.condition = visitor.visit(this.condition);\n }\n }\n\n evalParams(context, mixinEnv, args, evaldArguments) {\n /* jshint boss:true */\n const frame = new Ruleset(null, null);\n\n let varargs;\n let arg;\n const params = utils.copyArray(this.params);\n let i;\n let j;\n let val;\n let name;\n let isNamedFound;\n let argIndex;\n let argsLength = 0;\n\n if (mixinEnv.frames && mixinEnv.frames[0] && mixinEnv.frames[0].functionRegistry) {\n frame.functionRegistry = mixinEnv.frames[0].functionRegistry.inherit();\n }\n mixinEnv = new contexts.Eval(mixinEnv, [frame].concat(mixinEnv.frames));\n\n if (args) {\n args = utils.copyArray(args);\n argsLength = args.length;\n\n for (i = 0; i < argsLength; i++) {\n arg = args[i];\n if (name = (arg && arg.name)) {\n isNamedFound = false;\n for (j = 0; j < params.length; j++) {\n if (!evaldArguments[j] && name === params[j].name) {\n evaldArguments[j] = arg.value.eval(context);\n frame.prependRule(new Declaration(name, arg.value.eval(context)));\n isNamedFound = true;\n break;\n }\n }\n if (isNamedFound) {\n args.splice(i, 1);\n i--;\n continue;\n } else {\n throw { type: 'Runtime', message: `Named argument for ${this.name} ${args[i].name} not found` };\n }\n }\n }\n }\n argIndex = 0;\n for (i = 0; i < params.length; i++) {\n if (evaldArguments[i]) { continue; }\n\n arg = args && args[argIndex];\n\n if (name = params[i].name) {\n if (params[i].variadic) {\n varargs = [];\n for (j = argIndex; j < argsLength; j++) {\n varargs.push(args[j].value.eval(context));\n }\n frame.prependRule(new Declaration(name, new Expression(varargs).eval(context)));\n } else {\n val = arg && arg.value;\n if (val) {\n // This was a mixin call, pass in a detached ruleset of it's eval'd rules\n if (Array.isArray(val)) {\n val = new DetachedRuleset(new Ruleset('', val));\n }\n else {\n val = val.eval(context);\n }\n } else if (params[i].value) {\n val = params[i].value.eval(mixinEnv);\n frame.resetCache();\n } else {\n throw { type: 'Runtime', message: `wrong number of arguments for ${this.name} (${argsLength} for ${this.arity})` };\n }\n\n frame.prependRule(new Declaration(name, val));\n evaldArguments[i] = val;\n }\n }\n\n if (params[i].variadic && args) {\n for (j = argIndex; j < argsLength; j++) {\n evaldArguments[j] = args[j].value.eval(context);\n }\n }\n argIndex++;\n }\n\n return frame;\n }\n\n makeImportant() {\n const rules = !this.rules ? this.rules : this.rules.map(function (r) {\n if (r.makeImportant) {\n return r.makeImportant(true);\n } else {\n return r;\n }\n });\n const result = new Definition(this.name, this.params, rules, this.condition, this.variadic, this.frames);\n return result;\n }\n\n eval(context) {\n return new Definition(this.name, this.params, this.rules, this.condition, this.variadic, this.frames || utils.copyArray(context.frames));\n }\n\n evalCall(context, args, important) {\n const _arguments = [];\n const mixinFrames = this.frames ? this.frames.concat(context.frames) : context.frames;\n const frame = this.evalParams(context, new contexts.Eval(context, mixinFrames), args, _arguments);\n let rules;\n let ruleset;\n\n frame.prependRule(new Declaration('@arguments', new Expression(_arguments).eval(context)));\n\n rules = utils.copyArray(this.rules);\n\n ruleset = new Ruleset(null, rules);\n ruleset.originalRuleset = this;\n ruleset = ruleset.eval(new contexts.Eval(context, [this, frame].concat(mixinFrames)));\n if (important) {\n ruleset = ruleset.makeImportant();\n }\n return ruleset;\n }\n\n matchCondition(args, context) {\n if (this.condition && !this.condition.eval(\n new contexts.Eval(context,\n [this.evalParams(context, /* the parameter variables */\n new contexts.Eval(context, this.frames ? this.frames.concat(context.frames) : context.frames), args, [])]\n .concat(this.frames || []) // the parent namespace/mixin frames\n .concat(context.frames)))) { // the current environment frames\n return false;\n }\n return true;\n }\n\n matchArgs(args, context) {\n const allArgsCnt = (args && args.length) || 0;\n let len;\n const optionalParameters = this.optionalParameters;\n const requiredArgsCnt = !args ? 0 : args.reduce(function (count, p) {\n if (optionalParameters.indexOf(p.name) < 0) {\n return count + 1;\n } else {\n return count;\n }\n }, 0);\n\n if (!this.variadic) {\n if (requiredArgsCnt < this.required) {\n return false;\n }\n if (allArgsCnt > this.params.length) {\n return false;\n }\n } else {\n if (requiredArgsCnt < (this.required - 1)) {\n return false;\n }\n }\n\n // check patterns\n len = Math.min(requiredArgsCnt, this.arity);\n\n for (let i = 0; i < len; i++) {\n if (!this.params[i].name && !this.params[i].variadic) {\n if (args[i].value.eval(context).toCSS() != this.params[i].value.eval(context).toCSS()) {\n return false;\n }\n }\n }\n return true;\n }\n}\n\nDefinition.prototype.type = 'MixinDefinition';\nDefinition.prototype.evalFirst = true;\nexport default Definition;\n","import Node from './node';\nimport Selector from './selector';\nimport MixinDefinition from './mixin-definition';\nimport defaultFunc from '../functions/default';\n\nclass MixinCall extends Node {\n constructor(elements, args, index, currentFileInfo, important) {\n super();\n\n this.selector = new Selector(elements);\n this.arguments = args || [];\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.important = important;\n this.allowRoot = true;\n this.setParent(this.selector, this);\n }\n\n accept(visitor) {\n if (this.selector) {\n this.selector = visitor.visit(this.selector);\n }\n if (this.arguments.length) {\n this.arguments = visitor.visitArray(this.arguments);\n }\n }\n\n eval(context) {\n let mixins;\n let mixin;\n let mixinPath;\n const args = [];\n let arg;\n let argValue;\n const rules = [];\n let match = false;\n let i;\n let m;\n let f;\n let isRecursive;\n let isOneFound;\n const candidates = [];\n let candidate;\n const conditionResult = [];\n let defaultResult;\n const defFalseEitherCase = -1;\n const defNone = 0;\n const defTrue = 1;\n const defFalse = 2;\n let count;\n let originalRuleset;\n let noArgumentsFilter;\n\n this.selector = this.selector.eval(context);\n\n function calcDefGroup(mixin, mixinPath) {\n let f, p, namespace;\n\n for (f = 0; f < 2; f++) {\n conditionResult[f] = true;\n defaultFunc.value(f);\n for (p = 0; p < mixinPath.length && conditionResult[f]; p++) {\n namespace = mixinPath[p];\n if (namespace.matchCondition) {\n conditionResult[f] = conditionResult[f] && namespace.matchCondition(null, context);\n }\n }\n if (mixin.matchCondition) {\n conditionResult[f] = conditionResult[f] && mixin.matchCondition(args, context);\n }\n }\n if (conditionResult[0] || conditionResult[1]) {\n if (conditionResult[0] != conditionResult[1]) {\n return conditionResult[1] ?\n defTrue : defFalse;\n }\n\n return defNone;\n }\n return defFalseEitherCase;\n }\n\n for (i = 0; i < this.arguments.length; i++) {\n arg = this.arguments[i];\n argValue = arg.value.eval(context);\n if (arg.expand && Array.isArray(argValue.value)) {\n argValue = argValue.value;\n for (m = 0; m < argValue.length; m++) {\n args.push({value: argValue[m]});\n }\n } else {\n args.push({name: arg.name, value: argValue});\n }\n }\n\n noArgumentsFilter = function(rule) {return rule.matchArgs(null, context);};\n\n for (i = 0; i < context.frames.length; i++) {\n if ((mixins = context.frames[i].find(this.selector, null, noArgumentsFilter)).length > 0) {\n isOneFound = true;\n\n // To make `default()` function independent of definition order we have two \"subpasses\" here.\n // At first we evaluate each guard *twice* (with `default() == true` and `default() == false`),\n // and build candidate list with corresponding flags. Then, when we know all possible matches,\n // we make a final decision.\n\n for (m = 0; m < mixins.length; m++) {\n mixin = mixins[m].rule;\n mixinPath = mixins[m].path;\n isRecursive = false;\n for (f = 0; f < context.frames.length; f++) {\n if ((!(mixin instanceof MixinDefinition)) && mixin === (context.frames[f].originalRuleset || context.frames[f])) {\n isRecursive = true;\n break;\n }\n }\n if (isRecursive) {\n continue;\n }\n\n if (mixin.matchArgs(args, context)) {\n candidate = {mixin, group: calcDefGroup(mixin, mixinPath)};\n\n if (candidate.group !== defFalseEitherCase) {\n candidates.push(candidate);\n }\n\n match = true;\n }\n }\n\n defaultFunc.reset();\n\n count = [0, 0, 0];\n for (m = 0; m < candidates.length; m++) {\n count[candidates[m].group]++;\n }\n\n if (count[defNone] > 0) {\n defaultResult = defFalse;\n } else {\n defaultResult = defTrue;\n if ((count[defTrue] + count[defFalse]) > 1) {\n throw { type: 'Runtime',\n message: `Ambiguous use of \\`default()\\` found when matching for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n }\n\n for (m = 0; m < candidates.length; m++) {\n candidate = candidates[m].group;\n if ((candidate === defNone) || (candidate === defaultResult)) {\n try {\n mixin = candidates[m].mixin;\n if (!(mixin instanceof MixinDefinition)) {\n originalRuleset = mixin.originalRuleset || mixin;\n mixin = new MixinDefinition('', [], mixin.rules, null, false, null, originalRuleset.visibilityInfo());\n mixin.originalRuleset = originalRuleset;\n }\n const newRules = mixin.evalCall(context, args, this.important).rules;\n this._setVisibilityToReplacement(newRules);\n Array.prototype.push.apply(rules, newRules);\n } catch (e) {\n throw { message: e.message, index: this.getIndex(), filename: this.fileInfo().filename, stack: e.stack };\n }\n }\n }\n\n if (match) {\n return rules;\n }\n }\n }\n if (isOneFound) {\n throw { type: 'Runtime',\n message: `No matching definition was found for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n } else {\n throw { type: 'Name',\n message: `${this.selector.toCSS().trim()} is undefined`,\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n }\n\n _setVisibilityToReplacement(replacement) {\n let i, rule;\n if (this.blocksVisibility()) {\n for (i = 0; i < replacement.length; i++) {\n rule = replacement[i];\n rule.addVisibilityBlock();\n }\n }\n }\n\n format(args) {\n return `${this.selector.toCSS().trim()}(${args ? args.map(function (a) {\n let argValue = '';\n if (a.name) {\n argValue += `${a.name}:`;\n }\n if (a.value.toCSS) {\n argValue += a.value.toCSS();\n } else {\n argValue += '???';\n }\n return argValue;\n }).join(', ') : ''})`;\n }\n}\n\nMixinCall.prototype.type = 'MixinCall';\nexport default MixinCall;\n","import Node from './node';\nimport Color from './color';\nimport AtRule from './atrule';\nimport DetachedRuleset from './detached-ruleset';\nimport Operation from './operation';\nimport Dimension from './dimension';\nimport Unit from './unit';\nimport Keyword from './keyword';\nimport Variable from './variable';\nimport Property from './property';\nimport Ruleset from './ruleset';\nimport Element from './element';\nimport Attribute from './attribute';\nimport Combinator from './combinator';\nimport Selector from './selector';\nimport Quoted from './quoted';\nimport Expression from './expression';\nimport Declaration from './declaration';\nimport Call from './call';\nimport URL from './url';\nimport Import from './import';\nimport Comment from './comment';\nimport Anonymous from './anonymous';\nimport Value from './value';\nimport JavaScript from './javascript';\nimport Assignment from './assignment';\nimport Condition from './condition';\nimport Paren from './paren';\nimport Media from './media';\nimport UnicodeDescriptor from './unicode-descriptor';\nimport Negative from './negative';\nimport Extend from './extend';\nimport VariableCall from './variable-call';\nimport NamespaceValue from './namespace-value';\n\n// mixins\nimport MixinCall from './mixin-call';\nimport MixinDefinition from './mixin-definition';\n\nexport default {\n Node, Color, AtRule, DetachedRuleset, Operation,\n Dimension, Unit, Keyword, Variable, Property,\n Ruleset, Element, Attribute, Combinator, Selector,\n Quoted, Expression, Declaration, Call, URL, Import,\n Comment, Anonymous, Value, JavaScript, Assignment,\n Condition, Paren, Media, UnicodeDescriptor, Negative,\n Extend, VariableCall, NamespaceValue,\n mixin: {\n Call: MixinCall,\n Definition: MixinDefinition\n }\n};","class AbstractFileManager {\n getPath(filename) {\n let j = filename.lastIndexOf('?');\n if (j > 0) {\n filename = filename.slice(0, j);\n }\n j = filename.lastIndexOf('/');\n if (j < 0) {\n j = filename.lastIndexOf('\\\\');\n }\n if (j < 0) {\n return '';\n }\n return filename.slice(0, j + 1);\n }\n\n tryAppendExtension(path, ext) {\n return /(\\.[a-z]*$)|([\\?;].*)$/.test(path) ? path : path + ext;\n }\n\n tryAppendLessExtension(path) {\n return this.tryAppendExtension(path, '.less');\n }\n\n supportsSync() {\n return false;\n }\n\n alwaysMakePathsAbsolute() {\n return false;\n }\n\n isPathAbsolute(filename) {\n return (/^(?:[a-z-]+:|\\/|\\\\|#)/i).test(filename);\n }\n\n // TODO: pull out / replace?\n join(basePath, laterPath) {\n if (!basePath) {\n return laterPath;\n }\n return basePath + laterPath;\n }\n\n pathDiff(url, baseUrl) {\n // diff between two paths to create a relative path\n\n const urlParts = this.extractUrlParts(url);\n\n const baseUrlParts = this.extractUrlParts(baseUrl);\n let i;\n let max;\n let urlDirectories;\n let baseUrlDirectories;\n let diff = '';\n if (urlParts.hostPart !== baseUrlParts.hostPart) {\n return '';\n }\n max = Math.max(baseUrlParts.directories.length, urlParts.directories.length);\n for (i = 0; i < max; i++) {\n if (baseUrlParts.directories[i] !== urlParts.directories[i]) { break; }\n }\n baseUrlDirectories = baseUrlParts.directories.slice(i);\n urlDirectories = urlParts.directories.slice(i);\n for (i = 0; i < baseUrlDirectories.length - 1; i++) {\n diff += '../';\n }\n for (i = 0; i < urlDirectories.length - 1; i++) {\n diff += `${urlDirectories[i]}/`;\n }\n return diff;\n }\n\n // helper function, not part of API\n extractUrlParts(url, baseUrl) {\n // urlParts[1] = protocol://hostname/ OR /\n // urlParts[2] = / if path relative to host base\n // urlParts[3] = directories\n // urlParts[4] = filename\n // urlParts[5] = parameters\n\n const urlPartsRegex = /^((?:[a-z-]+:)?\\/{2}(?:[^\\/\\?#]*\\/)|([\\/\\\\]))?((?:[^\\/\\\\\\?#]*[\\/\\\\])*)([^\\/\\\\\\?#]*)([#\\?].*)?$/i;\n\n const urlParts = url.match(urlPartsRegex);\n const returner = {};\n let rawDirectories = [];\n const directories = [];\n let i;\n let baseUrlParts;\n\n if (!urlParts) {\n throw new Error(`Could not parse sheet href - '${url}'`);\n }\n\n // Stylesheets in IE don't always return the full path\n if (baseUrl && (!urlParts[1] || urlParts[2])) {\n baseUrlParts = baseUrl.match(urlPartsRegex);\n if (!baseUrlParts) {\n throw new Error(`Could not parse page url - '${baseUrl}'`);\n }\n urlParts[1] = urlParts[1] || baseUrlParts[1] || '';\n if (!urlParts[2]) {\n urlParts[3] = baseUrlParts[3] + urlParts[3];\n }\n }\n\n if (urlParts[3]) {\n rawDirectories = urlParts[3].replace(/\\\\/g, '/').split('/');\n\n // collapse '..' and skip '.'\n for (i = 0; i < rawDirectories.length; i++) {\n\n if (rawDirectories[i] === '..') {\n directories.pop();\n }\n else if (rawDirectories[i] !== '.') {\n directories.push(rawDirectories[i]);\n }\n \n }\n }\n\n returner.hostPart = urlParts[1];\n returner.directories = directories;\n returner.rawPath = (urlParts[1] || '') + rawDirectories.join('/');\n returner.path = (urlParts[1] || '') + directories.join('/');\n returner.filename = urlParts[4];\n returner.fileUrl = returner.path + (urlParts[4] || '');\n returner.url = returner.fileUrl + (urlParts[5] || '');\n return returner;\n }\n}\n\nexport default AbstractFileManager;\n","import functionRegistry from '../functions/function-registry';\nimport LessError from '../less-error';\n\nclass AbstractPluginLoader {\n constructor() {\n // Implemented by Node.js plugin loader\n this.require = function() {\n return null;\n }\n }\n\n evalPlugin(contents, context, imports, pluginOptions, fileInfo) {\n\n let loader, registry, pluginObj, localModule, pluginManager, filename, result;\n\n pluginManager = context.pluginManager;\n\n if (fileInfo) {\n if (typeof fileInfo === 'string') {\n filename = fileInfo;\n }\n else {\n filename = fileInfo.filename;\n }\n }\n const shortname = (new this.less.FileManager()).extractUrlParts(filename).filename;\n\n if (filename) {\n pluginObj = pluginManager.get(filename);\n\n if (pluginObj) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imports, filename);\n }\n return pluginObj;\n }\n }\n localModule = {\n exports: {},\n pluginManager,\n fileInfo\n };\n registry = functionRegistry.create();\n\n const registerPlugin = function(obj) {\n pluginObj = obj;\n };\n\n try {\n loader = new Function('module', 'require', 'registerPlugin', 'functions', 'tree', 'less', 'fileInfo', contents);\n loader(localModule, this.require(filename), registerPlugin, registry, this.less.tree, this.less, fileInfo);\n }\n catch (e) {\n return new LessError(e, imports, filename);\n }\n\n if (!pluginObj) {\n pluginObj = localModule.exports;\n }\n pluginObj = this.validatePlugin(pluginObj, filename, shortname);\n\n if (pluginObj instanceof LessError) {\n return pluginObj;\n }\n\n if (pluginObj) {\n pluginObj.imports = imports;\n pluginObj.filename = filename;\n\n // For < 3.x (or unspecified minVersion) - setOptions() before install()\n if (!pluginObj.minVersion || this.compareVersion('3.0.0', pluginObj.minVersion) < 0) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n\n if (result) {\n return result;\n }\n }\n\n // Run on first load\n pluginManager.addPlugin(pluginObj, fileInfo.filename, registry);\n pluginObj.functions = registry.getLocalFunctions();\n\n // Need to call setOptions again because the pluginObj might have functions\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n\n // Run every @plugin call\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imports, filename);\n }\n\n }\n else {\n return new LessError({ message: 'Not a valid plugin' }, imports, filename);\n }\n\n return pluginObj;\n\n }\n\n trySetOptions(plugin, filename, name, options) {\n if (options && !plugin.setOptions) {\n return new LessError({\n message: `Options have been provided but the plugin ${name} does not support any options.`\n });\n }\n try {\n plugin.setOptions && plugin.setOptions(options);\n }\n catch (e) {\n return new LessError(e);\n }\n }\n\n validatePlugin(plugin, filename, name) {\n if (plugin) {\n // support plugins being a function\n // so that the plugin can be more usable programmatically\n if (typeof plugin === 'function') {\n plugin = new plugin();\n }\n\n if (plugin.minVersion) {\n if (this.compareVersion(plugin.minVersion, this.less.version) < 0) {\n return new LessError({\n message: `Plugin ${name} requires version ${this.versionToString(plugin.minVersion)}`\n });\n }\n }\n return plugin;\n }\n return null;\n }\n\n compareVersion(aVersion, bVersion) {\n if (typeof aVersion === 'string') {\n aVersion = aVersion.match(/^(\\d+)\\.?(\\d+)?\\.?(\\d+)?/);\n aVersion.shift();\n }\n for (let i = 0; i < aVersion.length; i++) {\n if (aVersion[i] !== bVersion[i]) {\n return parseInt(aVersion[i]) > parseInt(bVersion[i]) ? -1 : 1;\n }\n }\n return 0;\n }\n\n versionToString(version) {\n let versionString = '';\n for (let i = 0; i < version.length; i++) {\n versionString += (versionString ? '.' : '') + version[i];\n }\n return versionString;\n }\n\n printUsage(plugins) {\n for (let i = 0; i < plugins.length; i++) {\n const plugin = plugins[i];\n if (plugin.printUsage) {\n plugin.printUsage();\n }\n }\n }\n}\n\nexport default AbstractPluginLoader;\n\n","import tree from '../tree';\n\nconst _visitArgs = { visitDeeper: true };\nlet _hasIndexed = false;\n\nfunction _noop(node) {\n return node;\n}\n\nfunction indexNodeTypes(parent, ticker) {\n // add .typeIndex to tree node types for lookup table\n let key, child;\n for (key in parent) { \n /* eslint guard-for-in: 0 */\n child = parent[key];\n switch (typeof child) {\n case 'function':\n // ignore bound functions directly on tree which do not have a prototype\n // or aren't nodes\n if (child.prototype && child.prototype.type) {\n child.prototype.typeIndex = ticker++;\n }\n break;\n case 'object':\n ticker = indexNodeTypes(child, ticker);\n break;\n \n }\n }\n return ticker;\n}\n\nclass Visitor {\n constructor(implementation) {\n this._implementation = implementation;\n this._visitInCache = {};\n this._visitOutCache = {};\n\n if (!_hasIndexed) {\n indexNodeTypes(tree, 1);\n _hasIndexed = true;\n }\n }\n\n visit(node) {\n if (!node) {\n return node;\n }\n\n const nodeTypeIndex = node.typeIndex;\n if (!nodeTypeIndex) {\n // MixinCall args aren't a node type?\n if (node.value && node.value.typeIndex) {\n this.visit(node.value);\n }\n return node;\n }\n\n const impl = this._implementation;\n let func = this._visitInCache[nodeTypeIndex];\n let funcOut = this._visitOutCache[nodeTypeIndex];\n const visitArgs = _visitArgs;\n let fnName;\n\n visitArgs.visitDeeper = true;\n\n if (!func) {\n fnName = `visit${node.type}`;\n func = impl[fnName] || _noop;\n funcOut = impl[`${fnName}Out`] || _noop;\n this._visitInCache[nodeTypeIndex] = func;\n this._visitOutCache[nodeTypeIndex] = funcOut;\n }\n\n if (func !== _noop) {\n const newNode = func.call(impl, node, visitArgs);\n if (node && impl.isReplacing) {\n node = newNode;\n }\n }\n\n if (visitArgs.visitDeeper && node) {\n if (node.length) {\n for (let i = 0, cnt = node.length; i < cnt; i++) {\n if (node[i].accept) {\n node[i].accept(this);\n }\n }\n } else if (node.accept) {\n node.accept(this);\n }\n }\n\n if (funcOut != _noop) {\n funcOut.call(impl, node);\n }\n\n return node;\n }\n\n visitArray(nodes, nonReplacing) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.length;\n let i;\n\n // Non-replacing\n if (nonReplacing || !this._implementation.isReplacing) {\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n // Replacing\n const out = [];\n for (i = 0; i < cnt; i++) {\n const evald = this.visit(nodes[i]);\n if (evald === undefined) { continue; }\n if (!evald.splice) {\n out.push(evald);\n } else if (evald.length) {\n this.flatten(evald, out);\n }\n }\n return out;\n }\n\n flatten(arr, out) {\n if (!out) {\n out = [];\n }\n\n let cnt, i, item, nestedCnt, j, nestedItem;\n\n for (i = 0, cnt = arr.length; i < cnt; i++) {\n item = arr[i];\n if (item === undefined) {\n continue;\n }\n if (!item.splice) {\n out.push(item);\n continue;\n }\n\n for (j = 0, nestedCnt = item.length; j < nestedCnt; j++) {\n nestedItem = item[j];\n if (nestedItem === undefined) {\n continue;\n }\n if (!nestedItem.splice) {\n out.push(nestedItem);\n } else if (nestedItem.length) {\n this.flatten(nestedItem, out);\n }\n }\n }\n\n return out;\n }\n}\n\nexport default Visitor;\n","class ImportSequencer {\n constructor(onSequencerEmpty) {\n this.imports = [];\n this.variableImports = [];\n this._onSequencerEmpty = onSequencerEmpty;\n this._currentDepth = 0;\n }\n\n addImport(callback) {\n const importSequencer = this,\n importItem = {\n callback,\n args: null,\n isReady: false\n };\n this.imports.push(importItem);\n return function() {\n importItem.args = Array.prototype.slice.call(arguments, 0);\n importItem.isReady = true;\n importSequencer.tryRun();\n };\n }\n\n addVariableImport(callback) {\n this.variableImports.push(callback);\n }\n\n tryRun() {\n this._currentDepth++;\n try {\n while (true) {\n while (this.imports.length > 0) {\n const importItem = this.imports[0];\n if (!importItem.isReady) {\n return;\n }\n this.imports = this.imports.slice(1);\n importItem.callback.apply(null, importItem.args);\n }\n if (this.variableImports.length === 0) {\n break;\n }\n const variableImport = this.variableImports[0];\n this.variableImports = this.variableImports.slice(1);\n variableImport();\n }\n } finally {\n this._currentDepth--;\n }\n if (this._currentDepth === 0 && this._onSequencerEmpty) {\n this._onSequencerEmpty();\n }\n }\n}\n\nexport default ImportSequencer;\n","import contexts from '../contexts';\nimport Visitor from './visitor';\nimport ImportSequencer from './import-sequencer';\nimport * as utils from '../utils';\n\nconst ImportVisitor = function(importer, finish) {\n\n this._visitor = new Visitor(this);\n this._importer = importer;\n this._finish = finish;\n this.context = new contexts.Eval();\n this.importCount = 0;\n this.onceFileDetectionMap = {};\n this.recursionDetector = {};\n this._sequencer = new ImportSequencer(this._onSequencerEmpty.bind(this));\n};\n\nImportVisitor.prototype = {\n isReplacing: false,\n run: function (root) {\n try {\n // process the contents\n this._visitor.visit(root);\n }\n catch (e) {\n this.error = e;\n }\n\n this.isFinished = true;\n this._sequencer.tryRun();\n },\n _onSequencerEmpty: function() {\n if (!this.isFinished) {\n return;\n }\n this._finish(this.error);\n },\n visitImport: function (importNode, visitArgs) {\n const inlineCSS = importNode.options.inline;\n\n if (!importNode.css || inlineCSS) {\n\n const context = new contexts.Eval(this.context, utils.copyArray(this.context.frames));\n const importParent = context.frames[0];\n\n this.importCount++;\n if (importNode.isVariableImport()) {\n this._sequencer.addVariableImport(this.processImportNode.bind(this, importNode, context, importParent));\n } else {\n this.processImportNode(importNode, context, importParent);\n }\n }\n visitArgs.visitDeeper = false;\n },\n processImportNode: function(importNode, context, importParent) {\n let evaldImportNode;\n const inlineCSS = importNode.options.inline;\n\n try {\n evaldImportNode = importNode.evalForImport(context);\n } catch (e) {\n if (!e.filename) { e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename; }\n // attempt to eval properly and treat as css\n importNode.css = true;\n // if that fails, this error will be thrown\n importNode.error = e;\n }\n\n if (evaldImportNode && (!evaldImportNode.css || inlineCSS)) {\n\n if (evaldImportNode.options.multiple) {\n context.importMultiple = true;\n }\n\n // try appending if we haven't determined if it is css or not\n const tryAppendLessExtension = evaldImportNode.css === undefined;\n\n for (let i = 0; i < importParent.rules.length; i++) {\n if (importParent.rules[i] === importNode) {\n importParent.rules[i] = evaldImportNode;\n break;\n }\n }\n\n const onImported = this.onImported.bind(this, evaldImportNode, context), sequencedOnImported = this._sequencer.addImport(onImported);\n\n this._importer.push(evaldImportNode.getPath(), tryAppendLessExtension, evaldImportNode.fileInfo(),\n evaldImportNode.options, sequencedOnImported);\n } else {\n this.importCount--;\n if (this.isFinished) {\n this._sequencer.tryRun();\n }\n }\n },\n onImported: function (importNode, context, e, root, importedAtRoot, fullPath) {\n if (e) {\n if (!e.filename) {\n e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename;\n }\n this.error = e;\n }\n\n const importVisitor = this, inlineCSS = importNode.options.inline, isPlugin = importNode.options.isPlugin, isOptional = importNode.options.optional, duplicateImport = importedAtRoot || fullPath in importVisitor.recursionDetector;\n\n if (!context.importMultiple) {\n if (duplicateImport) {\n importNode.skip = true;\n } else {\n importNode.skip = function() {\n if (fullPath in importVisitor.onceFileDetectionMap) {\n return true;\n }\n importVisitor.onceFileDetectionMap[fullPath] = true;\n return false;\n };\n }\n }\n\n if (!fullPath && isOptional) {\n importNode.skip = true;\n }\n\n if (root) {\n importNode.root = root;\n importNode.importedFilename = fullPath;\n\n if (!inlineCSS && !isPlugin && (context.importMultiple || !duplicateImport)) {\n importVisitor.recursionDetector[fullPath] = true;\n\n const oldContext = this.context;\n this.context = context;\n try {\n this._visitor.visit(root);\n } catch (e) {\n this.error = e;\n }\n this.context = oldContext;\n }\n }\n\n importVisitor.importCount--;\n\n if (importVisitor.isFinished) {\n importVisitor._sequencer.tryRun();\n }\n },\n visitDeclaration: function (declNode, visitArgs) {\n if (declNode.value.type === 'DetachedRuleset') {\n this.context.frames.unshift(declNode);\n } else {\n visitArgs.visitDeeper = false;\n }\n },\n visitDeclarationOut: function(declNode) {\n if (declNode.value.type === 'DetachedRuleset') {\n this.context.frames.shift();\n }\n },\n visitAtRule: function (atRuleNode, visitArgs) {\n this.context.frames.unshift(atRuleNode);\n },\n visitAtRuleOut: function (atRuleNode) {\n this.context.frames.shift();\n },\n visitMixinDefinition: function (mixinDefinitionNode, visitArgs) {\n this.context.frames.unshift(mixinDefinitionNode);\n },\n visitMixinDefinitionOut: function (mixinDefinitionNode) {\n this.context.frames.shift();\n },\n visitRuleset: function (rulesetNode, visitArgs) {\n this.context.frames.unshift(rulesetNode);\n },\n visitRulesetOut: function (rulesetNode) {\n this.context.frames.shift();\n },\n visitMedia: function (mediaNode, visitArgs) {\n this.context.frames.unshift(mediaNode.rules[0]);\n },\n visitMediaOut: function (mediaNode) {\n this.context.frames.shift();\n }\n};\nexport default ImportVisitor;\n","class SetTreeVisibilityVisitor {\n constructor(visible) {\n this.visible = visible;\n }\n\n run(root) {\n this.visit(root);\n }\n\n visitArray(nodes) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.length;\n let i;\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n visit(node) {\n if (!node) {\n return node;\n }\n if (node.constructor === Array) {\n return this.visitArray(node);\n }\n\n if (!node.blocksVisibility || node.blocksVisibility()) {\n return node;\n }\n if (this.visible) {\n node.ensureVisibility();\n } else {\n node.ensureInvisibility();\n }\n\n node.accept(this);\n return node;\n }\n}\n\nexport default SetTreeVisibilityVisitor;","import tree from '../tree';\nimport Visitor from './visitor';\nimport logger from '../logger';\nimport * as utils from '../utils';\n\n/* jshint loopfunc:true */\n\nclass ExtendFinderVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n this.contexts = [];\n this.allExtendsStack = [[]];\n }\n\n run(root) {\n root = this._visitor.visit(root);\n root.allExtends = this.allExtendsStack[0];\n return root;\n }\n\n visitDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n\n let i;\n let j;\n let extend;\n const allSelectorsExtendList = [];\n let extendList;\n\n // get &:extend(.a); rules which apply to all selectors in this ruleset\n const rules = rulesetNode.rules, ruleCnt = rules ? rules.length : 0;\n for (i = 0; i < ruleCnt; i++) {\n if (rulesetNode.rules[i] instanceof tree.Extend) {\n allSelectorsExtendList.push(rules[i]);\n rulesetNode.extendOnEveryPath = true;\n }\n }\n\n // now find every selector and apply the extends that apply to all extends\n // and the ones which apply to an individual extend\n const paths = rulesetNode.paths;\n for (i = 0; i < paths.length; i++) {\n const selectorPath = paths[i], selector = selectorPath[selectorPath.length - 1], selExtendList = selector.extendList;\n\n extendList = selExtendList ? utils.copyArray(selExtendList).concat(allSelectorsExtendList)\n : allSelectorsExtendList;\n\n if (extendList) {\n extendList = extendList.map(function(allSelectorsExtend) {\n return allSelectorsExtend.clone();\n });\n }\n\n for (j = 0; j < extendList.length; j++) {\n this.foundExtends = true;\n extend = extendList[j];\n extend.findSelfSelectors(selectorPath);\n extend.ruleset = rulesetNode;\n if (j === 0) { extend.firstExtendOnThisSelectorPath = true; }\n this.allExtendsStack[this.allExtendsStack.length - 1].push(extend);\n }\n }\n\n this.contexts.push(rulesetNode.selectors);\n }\n\n visitRulesetOut(rulesetNode) {\n if (!rulesetNode.root) {\n this.contexts.length = this.contexts.length - 1;\n }\n }\n\n visitMedia(mediaNode, visitArgs) {\n mediaNode.allExtends = [];\n this.allExtendsStack.push(mediaNode.allExtends);\n }\n\n visitMediaOut(mediaNode) {\n this.allExtendsStack.length = this.allExtendsStack.length - 1;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n atRuleNode.allExtends = [];\n this.allExtendsStack.push(atRuleNode.allExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n this.allExtendsStack.length = this.allExtendsStack.length - 1;\n }\n}\n\nclass ProcessExtendsVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n }\n\n run(root) {\n const extendFinder = new ExtendFinderVisitor();\n this.extendIndices = {};\n extendFinder.run(root);\n if (!extendFinder.foundExtends) { return root; }\n root.allExtends = root.allExtends.concat(this.doExtendChaining(root.allExtends, root.allExtends));\n this.allExtendsStack = [root.allExtends];\n const newRoot = this._visitor.visit(root);\n this.checkExtendsForNonMatched(root.allExtends);\n return newRoot;\n }\n\n checkExtendsForNonMatched(extendList) {\n const indices = this.extendIndices;\n extendList.filter(function(extend) {\n return !extend.hasFoundMatches && extend.parent_ids.length == 1;\n }).forEach(function(extend) {\n let selector = '_unknown_';\n try {\n selector = extend.selector.toCSS({});\n }\n catch (_) {}\n\n if (!indices[`${extend.index} ${selector}`]) {\n indices[`${extend.index} ${selector}`] = true;\n logger.warn(`extend '${selector}' has no matches`);\n }\n });\n }\n\n doExtendChaining(extendsList, extendsListTarget, iterationCount) {\n //\n // chaining is different from normal extension.. if we extend an extend then we are not just copying, altering\n // and pasting the selector we would do normally, but we are also adding an extend with the same target selector\n // this means this new extend can then go and alter other extends\n //\n // this method deals with all the chaining work - without it, extend is flat and doesn't work on other extend selectors\n // this is also the most expensive.. and a match on one selector can cause an extension of a selector we had already\n // processed if we look at each selector at a time, as is done in visitRuleset\n\n let extendIndex;\n\n let targetExtendIndex;\n let matches;\n const extendsToAdd = [];\n let newSelector;\n const extendVisitor = this;\n let selectorPath;\n let extend;\n let targetExtend;\n let newExtend;\n\n iterationCount = iterationCount || 0;\n\n // loop through comparing every extend with every target extend.\n // a target extend is the one on the ruleset we are looking at copy/edit/pasting in place\n // e.g. .a:extend(.b) {} and .b:extend(.c) {} then the first extend extends the second one\n // and the second is the target.\n // the separation into two lists allows us to process a subset of chains with a bigger set, as is the\n // case when processing media queries\n for (extendIndex = 0; extendIndex < extendsList.length; extendIndex++) {\n for (targetExtendIndex = 0; targetExtendIndex < extendsListTarget.length; targetExtendIndex++) {\n\n extend = extendsList[extendIndex];\n targetExtend = extendsListTarget[targetExtendIndex];\n\n // look for circular references\n if ( extend.parent_ids.indexOf( targetExtend.object_id ) >= 0 ) { continue; }\n\n // find a match in the target extends self selector (the bit before :extend)\n selectorPath = [targetExtend.selfSelectors[0]];\n matches = extendVisitor.findMatch(extend, selectorPath);\n\n if (matches.length) {\n extend.hasFoundMatches = true;\n\n // we found a match, so for each self selector..\n extend.selfSelectors.forEach(function(selfSelector) {\n const info = targetExtend.visibilityInfo();\n\n // process the extend as usual\n newSelector = extendVisitor.extendSelector(matches, selectorPath, selfSelector, extend.isVisible());\n\n // but now we create a new extend from it\n newExtend = new(tree.Extend)(targetExtend.selector, targetExtend.option, 0, targetExtend.fileInfo(), info);\n newExtend.selfSelectors = newSelector;\n\n // add the extend onto the list of extends for that selector\n newSelector[newSelector.length - 1].extendList = [newExtend];\n\n // record that we need to add it.\n extendsToAdd.push(newExtend);\n newExtend.ruleset = targetExtend.ruleset;\n\n // remember its parents for circular references\n newExtend.parent_ids = newExtend.parent_ids.concat(targetExtend.parent_ids, extend.parent_ids);\n\n // only process the selector once.. if we have :extend(.a,.b) then multiple\n // extends will look at the same selector path, so when extending\n // we know that any others will be duplicates in terms of what is added to the css\n if (targetExtend.firstExtendOnThisSelectorPath) {\n newExtend.firstExtendOnThisSelectorPath = true;\n targetExtend.ruleset.paths.push(newSelector);\n }\n });\n }\n }\n }\n\n if (extendsToAdd.length) {\n // try to detect circular references to stop a stack overflow.\n // may no longer be needed.\n this.extendChainCount++;\n if (iterationCount > 100) {\n let selectorOne = '{unable to calculate}';\n let selectorTwo = '{unable to calculate}';\n try {\n selectorOne = extendsToAdd[0].selfSelectors[0].toCSS();\n selectorTwo = extendsToAdd[0].selector.toCSS();\n }\n catch (e) {}\n throw { message: `extend circular reference detected. One of the circular extends is currently:${selectorOne}:extend(${selectorTwo})`};\n }\n\n // now process the new extends on the existing rules so that we can handle a extending b extending c extending\n // d extending e...\n return extendsToAdd.concat(extendVisitor.doExtendChaining(extendsToAdd, extendsListTarget, iterationCount + 1));\n } else {\n return extendsToAdd;\n }\n }\n\n visitDeclaration(ruleNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitSelector(selectorNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n let matches;\n let pathIndex;\n let extendIndex;\n const allExtends = this.allExtendsStack[this.allExtendsStack.length - 1];\n const selectorsToAdd = [];\n const extendVisitor = this;\n let selectorPath;\n\n // look at each selector path in the ruleset, find any extend matches and then copy, find and replace\n\n for (extendIndex = 0; extendIndex < allExtends.length; extendIndex++) {\n for (pathIndex = 0; pathIndex < rulesetNode.paths.length; pathIndex++) {\n selectorPath = rulesetNode.paths[pathIndex];\n\n // extending extends happens initially, before the main pass\n if (rulesetNode.extendOnEveryPath) { continue; }\n const extendList = selectorPath[selectorPath.length - 1].extendList;\n if (extendList && extendList.length) { continue; }\n\n matches = this.findMatch(allExtends[extendIndex], selectorPath);\n\n if (matches.length) {\n allExtends[extendIndex].hasFoundMatches = true;\n\n allExtends[extendIndex].selfSelectors.forEach(function(selfSelector) {\n let extendedSelectors;\n extendedSelectors = extendVisitor.extendSelector(matches, selectorPath, selfSelector, allExtends[extendIndex].isVisible());\n selectorsToAdd.push(extendedSelectors);\n });\n }\n }\n }\n rulesetNode.paths = rulesetNode.paths.concat(selectorsToAdd);\n }\n\n findMatch(extend, haystackSelectorPath) {\n //\n // look through the haystack selector path to try and find the needle - extend.selector\n // returns an array of selector matches that can then be replaced\n //\n let haystackSelectorIndex;\n\n let hackstackSelector;\n let hackstackElementIndex;\n let haystackElement;\n let targetCombinator;\n let i;\n const extendVisitor = this;\n const needleElements = extend.selector.elements;\n const potentialMatches = [];\n let potentialMatch;\n const matches = [];\n\n // loop through the haystack elements\n for (haystackSelectorIndex = 0; haystackSelectorIndex < haystackSelectorPath.length; haystackSelectorIndex++) {\n hackstackSelector = haystackSelectorPath[haystackSelectorIndex];\n\n for (hackstackElementIndex = 0; hackstackElementIndex < hackstackSelector.elements.length; hackstackElementIndex++) {\n\n haystackElement = hackstackSelector.elements[hackstackElementIndex];\n\n // if we allow elements before our match we can add a potential match every time. otherwise only at the first element.\n if (extend.allowBefore || (haystackSelectorIndex === 0 && hackstackElementIndex === 0)) {\n potentialMatches.push({pathIndex: haystackSelectorIndex, index: hackstackElementIndex, matched: 0,\n initialCombinator: haystackElement.combinator});\n }\n\n for (i = 0; i < potentialMatches.length; i++) {\n potentialMatch = potentialMatches[i];\n\n // selectors add \" \" onto the first element. When we use & it joins the selectors together, but if we don't\n // then each selector in haystackSelectorPath has a space before it added in the toCSS phase. so we need to\n // work out what the resulting combinator will be\n targetCombinator = haystackElement.combinator.value;\n if (targetCombinator === '' && hackstackElementIndex === 0) {\n targetCombinator = ' ';\n }\n\n // if we don't match, null our match to indicate failure\n if (!extendVisitor.isElementValuesEqual(needleElements[potentialMatch.matched].value, haystackElement.value) ||\n (potentialMatch.matched > 0 && needleElements[potentialMatch.matched].combinator.value !== targetCombinator)) {\n potentialMatch = null;\n } else {\n potentialMatch.matched++;\n }\n\n // if we are still valid and have finished, test whether we have elements after and whether these are allowed\n if (potentialMatch) {\n potentialMatch.finished = potentialMatch.matched === needleElements.length;\n if (potentialMatch.finished &&\n (!extend.allowAfter &&\n (hackstackElementIndex + 1 < hackstackSelector.elements.length || haystackSelectorIndex + 1 < haystackSelectorPath.length))) {\n potentialMatch = null;\n }\n }\n // if null we remove, if not, we are still valid, so either push as a valid match or continue\n if (potentialMatch) {\n if (potentialMatch.finished) {\n potentialMatch.length = needleElements.length;\n potentialMatch.endPathIndex = haystackSelectorIndex;\n potentialMatch.endPathElementIndex = hackstackElementIndex + 1; // index after end of match\n potentialMatches.length = 0; // we don't allow matches to overlap, so start matching again\n matches.push(potentialMatch);\n }\n } else {\n potentialMatches.splice(i, 1);\n i--;\n }\n }\n }\n }\n return matches;\n }\n\n isElementValuesEqual(elementValue1, elementValue2) {\n if (typeof elementValue1 === 'string' || typeof elementValue2 === 'string') {\n return elementValue1 === elementValue2;\n }\n if (elementValue1 instanceof tree.Attribute) {\n if (elementValue1.op !== elementValue2.op || elementValue1.key !== elementValue2.key) {\n return false;\n }\n if (!elementValue1.value || !elementValue2.value) {\n if (elementValue1.value || elementValue2.value) {\n return false;\n }\n return true;\n }\n elementValue1 = elementValue1.value.value || elementValue1.value;\n elementValue2 = elementValue2.value.value || elementValue2.value;\n return elementValue1 === elementValue2;\n }\n elementValue1 = elementValue1.value;\n elementValue2 = elementValue2.value;\n if (elementValue1 instanceof tree.Selector) {\n if (!(elementValue2 instanceof tree.Selector) || elementValue1.elements.length !== elementValue2.elements.length) {\n return false;\n }\n for (let i = 0; i < elementValue1.elements.length; i++) {\n if (elementValue1.elements[i].combinator.value !== elementValue2.elements[i].combinator.value) {\n if (i !== 0 || (elementValue1.elements[i].combinator.value || ' ') !== (elementValue2.elements[i].combinator.value || ' ')) {\n return false;\n }\n }\n if (!this.isElementValuesEqual(elementValue1.elements[i].value, elementValue2.elements[i].value)) {\n return false;\n }\n }\n return true;\n }\n return false;\n }\n\n extendSelector(matches, selectorPath, replacementSelector, isVisible) {\n\n // for a set of matches, replace each match with the replacement selector\n\n let currentSelectorPathIndex = 0, currentSelectorPathElementIndex = 0, path = [], matchIndex, selector, firstElement, match, newElements;\n\n for (matchIndex = 0; matchIndex < matches.length; matchIndex++) {\n match = matches[matchIndex];\n selector = selectorPath[match.pathIndex];\n firstElement = new tree.Element(\n match.initialCombinator,\n replacementSelector.elements[0].value,\n replacementSelector.elements[0].isVariable,\n replacementSelector.elements[0].getIndex(),\n replacementSelector.elements[0].fileInfo()\n );\n\n if (match.pathIndex > currentSelectorPathIndex && currentSelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n\n newElements = selector.elements\n .slice(currentSelectorPathElementIndex, match.index)\n .concat([firstElement])\n .concat(replacementSelector.elements.slice(1));\n\n if (currentSelectorPathIndex === match.pathIndex && matchIndex > 0) {\n path[path.length - 1].elements =\n path[path.length - 1].elements.concat(newElements);\n } else {\n path = path.concat(selectorPath.slice(currentSelectorPathIndex, match.pathIndex));\n\n path.push(new tree.Selector(\n newElements\n ));\n }\n currentSelectorPathIndex = match.endPathIndex;\n currentSelectorPathElementIndex = match.endPathElementIndex;\n if (currentSelectorPathElementIndex >= selectorPath[currentSelectorPathIndex].elements.length) {\n currentSelectorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n }\n\n if (currentSelectorPathIndex < selectorPath.length && currentSelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathIndex++;\n }\n\n path = path.concat(selectorPath.slice(currentSelectorPathIndex, selectorPath.length));\n path = path.map(function (currentValue) {\n // we can re-use elements here, because the visibility property matters only for selectors\n const derived = currentValue.createDerived(currentValue.elements);\n if (isVisible) {\n derived.ensureVisibility();\n } else {\n derived.ensureInvisibility();\n }\n return derived;\n });\n return path;\n }\n\n visitMedia(mediaNode, visitArgs) {\n let newAllExtends = mediaNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, mediaNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitMediaOut(mediaNode) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStack.length = lastIndex;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n let newAllExtends = atRuleNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, atRuleNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStack.length = lastIndex;\n }\n}\n\nexport default ProcessExtendsVisitor;\n","import Visitor from './visitor';\n\nclass JoinSelectorVisitor {\n constructor() {\n this.contexts = [[]];\n this._visitor = new Visitor(this);\n }\n\n run(root) {\n return this._visitor.visit(root);\n }\n\n visitDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n const paths = [];\n let selectors;\n\n this.contexts.push(paths);\n\n if (!rulesetNode.root) {\n selectors = rulesetNode.selectors;\n if (selectors) {\n selectors = selectors.filter(function(selector) { return selector.getIsOutput(); });\n rulesetNode.selectors = selectors.length ? selectors : (selectors = null);\n if (selectors) { rulesetNode.joinSelectors(paths, context, selectors); }\n }\n if (!selectors) { rulesetNode.rules = null; }\n rulesetNode.paths = paths;\n }\n }\n\n visitRulesetOut(rulesetNode) {\n this.contexts.length = this.contexts.length - 1;\n }\n\n visitMedia(mediaNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n mediaNode.rules[0].root = (context.length === 0 || context[0].multiMedia);\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n if (atRuleNode.rules && atRuleNode.rules.length) {\n atRuleNode.rules[0].root = (atRuleNode.isRooted || context.length === 0 || null);\n }\n }\n}\n\nexport default JoinSelectorVisitor;\n","import tree from '../tree';\nimport Visitor from './visitor';\n\nclass CSSVisitorUtils {\n constructor(context) {\n this._visitor = new Visitor(this);\n this._context = context;\n }\n\n containsSilentNonBlockedChild(bodyRules) {\n let rule;\n if (!bodyRules) {\n return false;\n }\n for (let r = 0; r < bodyRules.length; r++) {\n rule = bodyRules[r];\n if (rule.isSilent && rule.isSilent(this._context) && !rule.blocksVisibility()) {\n // the atrule contains something that was referenced (likely by extend)\n // therefore it needs to be shown in output too\n return true;\n }\n }\n return false;\n }\n\n keepOnlyVisibleChilds(owner) {\n if (owner && owner.rules) {\n owner.rules = owner.rules.filter(thing => thing.isVisible());\n }\n }\n\n isEmpty(owner) {\n return (owner && owner.rules) \n ? (owner.rules.length === 0) : true;\n }\n\n hasVisibleSelector(rulesetNode) {\n return (rulesetNode && rulesetNode.paths)\n ? (rulesetNode.paths.length > 0) : false;\n }\n\n resolveVisibility(node, originalRules) {\n if (!node.blocksVisibility()) {\n if (this.isEmpty(node) && !this.containsSilentNonBlockedChild(originalRules)) {\n return ;\n }\n\n return node;\n }\n\n const compiledRulesBody = node.rules[0];\n this.keepOnlyVisibleChilds(compiledRulesBody);\n\n if (this.isEmpty(compiledRulesBody)) {\n return ;\n }\n\n node.ensureVisibility();\n node.removeVisibilityBlock();\n\n return node;\n }\n\n isVisibleRuleset(rulesetNode) {\n if (rulesetNode.firstRoot) {\n return true;\n }\n\n if (this.isEmpty(rulesetNode)) {\n return false;\n }\n\n if (!rulesetNode.root && !this.hasVisibleSelector(rulesetNode)) {\n return false;\n }\n\n return true;\n }\n}\n\nconst ToCSSVisitor = function(context) {\n this._visitor = new Visitor(this);\n this._context = context;\n this.utils = new CSSVisitorUtils(context);\n};\n\nToCSSVisitor.prototype = {\n isReplacing: true,\n run: function (root) {\n return this._visitor.visit(root);\n },\n\n visitDeclaration: function (declNode, visitArgs) {\n if (declNode.blocksVisibility() || declNode.variable) {\n return;\n }\n return declNode;\n },\n\n visitMixinDefinition: function (mixinNode, visitArgs) {\n // mixin definitions do not get eval'd - this means they keep state\n // so we have to clear that state here so it isn't used if toCSS is called twice\n mixinNode.frames = [];\n },\n\n visitExtend: function (extendNode, visitArgs) {\n },\n\n visitComment: function (commentNode, visitArgs) {\n if (commentNode.blocksVisibility() || commentNode.isSilent(this._context)) {\n return;\n }\n return commentNode;\n },\n\n visitMedia: function(mediaNode, visitArgs) {\n const originalRules = mediaNode.rules[0].rules;\n mediaNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n\n return this.utils.resolveVisibility(mediaNode, originalRules);\n },\n\n visitImport: function (importNode, visitArgs) {\n if (importNode.blocksVisibility()) {\n return ;\n }\n return importNode;\n },\n\n visitAtRule: function(atRuleNode, visitArgs) {\n if (atRuleNode.rules && atRuleNode.rules.length) {\n return this.visitAtRuleWithBody(atRuleNode, visitArgs);\n } else {\n return this.visitAtRuleWithoutBody(atRuleNode, visitArgs);\n }\n },\n\n visitAnonymous: function(anonymousNode, visitArgs) {\n if (!anonymousNode.blocksVisibility()) {\n anonymousNode.accept(this._visitor);\n return anonymousNode;\n }\n },\n\n visitAtRuleWithBody: function(atRuleNode, visitArgs) {\n // if there is only one nested ruleset and that one has no path, then it is\n // just fake ruleset\n function hasFakeRuleset(atRuleNode) {\n const bodyRules = atRuleNode.rules;\n return bodyRules.length === 1 && (!bodyRules[0].paths || bodyRules[0].paths.length === 0);\n }\n function getBodyRules(atRuleNode) {\n const nodeRules = atRuleNode.rules;\n if (hasFakeRuleset(atRuleNode)) {\n return nodeRules[0].rules;\n }\n\n return nodeRules;\n }\n // it is still true that it is only one ruleset in array\n // this is last such moment\n // process childs\n const originalRules = getBodyRules(atRuleNode);\n atRuleNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n\n if (!this.utils.isEmpty(atRuleNode)) {\n this._mergeRules(atRuleNode.rules[0].rules);\n }\n\n return this.utils.resolveVisibility(atRuleNode, originalRules);\n },\n\n visitAtRuleWithoutBody: function(atRuleNode, visitArgs) {\n if (atRuleNode.blocksVisibility()) {\n return;\n }\n\n if (atRuleNode.name === '@charset') {\n // Only output the debug info together with subsequent @charset definitions\n // a comment (or @media statement) before the actual @charset atrule would\n // be considered illegal css as it has to be on the first line\n if (this.charset) {\n if (atRuleNode.debugInfo) {\n const comment = new tree.Comment(`/* ${atRuleNode.toCSS(this._context).replace(/\\n/g, '')} */\\n`);\n comment.debugInfo = atRuleNode.debugInfo;\n return this._visitor.visit(comment);\n }\n return;\n }\n this.charset = true;\n }\n\n return atRuleNode;\n },\n\n checkValidNodes: function(rules, isRoot) {\n if (!rules) {\n return;\n }\n\n for (let i = 0; i < rules.length; i++) {\n const ruleNode = rules[i];\n if (isRoot && ruleNode instanceof tree.Declaration && !ruleNode.variable) {\n throw { message: 'Properties must be inside selector blocks. They cannot be in the root',\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n if (ruleNode instanceof tree.Call) {\n throw { message: `Function '${ruleNode.name}' did not return a root node`,\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n if (ruleNode.type && !ruleNode.allowRoot) {\n throw { message: `${ruleNode.type} node returned by a function is not valid here`,\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n }\n },\n\n visitRuleset: function (rulesetNode, visitArgs) {\n // at this point rulesets are nested into each other\n let rule;\n\n const rulesets = [];\n\n this.checkValidNodes(rulesetNode.rules, rulesetNode.firstRoot);\n\n if (!rulesetNode.root) {\n // remove invisible paths\n this._compileRulesetPaths(rulesetNode);\n\n // remove rulesets from this ruleset body and compile them separately\n const nodeRules = rulesetNode.rules;\n\n let nodeRuleCnt = nodeRules ? nodeRules.length : 0;\n for (let i = 0; i < nodeRuleCnt; ) {\n rule = nodeRules[i];\n if (rule && rule.rules) {\n // visit because we are moving them out from being a child\n rulesets.push(this._visitor.visit(rule));\n nodeRules.splice(i, 1);\n nodeRuleCnt--;\n continue;\n }\n i++;\n }\n // accept the visitor to remove rules and refactor itself\n // then we can decide nogw whether we want it or not\n // compile body\n if (nodeRuleCnt > 0) {\n rulesetNode.accept(this._visitor);\n } else {\n rulesetNode.rules = null;\n }\n visitArgs.visitDeeper = false;\n } else { // if (! rulesetNode.root) {\n rulesetNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n }\n\n if (rulesetNode.rules) {\n this._mergeRules(rulesetNode.rules);\n this._removeDuplicateRules(rulesetNode.rules);\n }\n\n // now decide whether we keep the ruleset\n if (this.utils.isVisibleRuleset(rulesetNode)) {\n rulesetNode.ensureVisibility();\n rulesets.splice(0, 0, rulesetNode);\n }\n\n if (rulesets.length === 1) {\n return rulesets[0];\n }\n return rulesets;\n },\n\n _compileRulesetPaths: function(rulesetNode) {\n if (rulesetNode.paths) {\n rulesetNode.paths = rulesetNode.paths\n .filter(p => {\n let i;\n if (p[0].elements[0].combinator.value === ' ') {\n p[0].elements[0].combinator = new(tree.Combinator)('');\n }\n for (i = 0; i < p.length; i++) {\n if (p[i].isVisible() && p[i].getIsOutput()) {\n return true;\n }\n }\n return false;\n });\n }\n },\n\n _removeDuplicateRules: function(rules) {\n if (!rules) { return; }\n\n // remove duplicates\n const ruleCache = {};\n\n let ruleList;\n let rule;\n let i;\n\n for (i = rules.length - 1; i >= 0 ; i--) {\n rule = rules[i];\n if (rule instanceof tree.Declaration) {\n if (!ruleCache[rule.name]) {\n ruleCache[rule.name] = rule;\n } else {\n ruleList = ruleCache[rule.name];\n if (ruleList instanceof tree.Declaration) {\n ruleList = ruleCache[rule.name] = [ruleCache[rule.name].toCSS(this._context)];\n }\n const ruleCSS = rule.toCSS(this._context);\n if (ruleList.indexOf(ruleCSS) !== -1) {\n rules.splice(i, 1);\n } else {\n ruleList.push(ruleCSS);\n }\n }\n }\n }\n },\n\n _mergeRules: function(rules) {\n if (!rules) {\n return; \n }\n\n const groups = {};\n const groupsArr = [];\n\n for (let i = 0; i < rules.length; i++) {\n const rule = rules[i];\n if (rule.merge) {\n const key = rule.name;\n groups[key] ? rules.splice(i--, 1) : \n groupsArr.push(groups[key] = []);\n groups[key].push(rule);\n }\n }\n\n groupsArr.forEach(group => {\n if (group.length > 0) {\n const result = group[0];\n let space = [];\n const comma = [new tree.Expression(space)];\n group.forEach(rule => {\n if ((rule.merge === '+') && (space.length > 0)) {\n comma.push(new tree.Expression(space = []));\n }\n space.push(rule.value);\n result.important = result.important || rule.important;\n });\n result.value = new tree.Value(comma);\n }\n });\n }\n};\n\nexport default ToCSSVisitor;\n","import Visitor from './visitor';\nimport ImportVisitor from './import-visitor';\nimport MarkVisibleSelectorsVisitor from './set-tree-visibility-visitor';\nimport ExtendVisitor from './extend-visitor';\nimport JoinSelectorVisitor from './join-selector-visitor';\nimport ToCSSVisitor from './to-css-visitor';\n\nexport default {\n Visitor,\n ImportVisitor,\n MarkVisibleSelectorsVisitor,\n ExtendVisitor,\n JoinSelectorVisitor,\n ToCSSVisitor\n};\n","import chunker from './chunker';\n\nexport default () => {\n let // Less input string\n input;\n\n let // current chunk\n j;\n\n const // holds state for backtracking\n saveStack = [];\n\n let // furthest index the parser has gone to\n furthest;\n\n let // if this is furthest we got to, this is the probably cause\n furthestPossibleErrorMessage;\n\n let // chunkified input\n chunks;\n\n let // current chunk\n current;\n\n let // index of current chunk, in `input`\n currentPos;\n\n const parserInput = {};\n const CHARCODE_SPACE = 32;\n const CHARCODE_TAB = 9;\n const CHARCODE_LF = 10;\n const CHARCODE_CR = 13;\n const CHARCODE_PLUS = 43;\n const CHARCODE_COMMA = 44;\n const CHARCODE_FORWARD_SLASH = 47;\n const CHARCODE_9 = 57;\n\n function skipWhitespace(length) {\n const oldi = parserInput.i;\n const oldj = j;\n const curr = parserInput.i - currentPos;\n const endIndex = parserInput.i + current.length - curr;\n const mem = (parserInput.i += length);\n const inp = input;\n let c;\n let nextChar;\n let comment;\n\n for (; parserInput.i < endIndex; parserInput.i++) {\n c = inp.charCodeAt(parserInput.i);\n\n if (parserInput.autoCommentAbsorb && c === CHARCODE_FORWARD_SLASH) {\n nextChar = inp.charAt(parserInput.i + 1);\n if (nextChar === '/') {\n comment = {index: parserInput.i, isLineComment: true};\n let nextNewLine = inp.indexOf('\\n', parserInput.i + 2);\n if (nextNewLine < 0) {\n nextNewLine = endIndex;\n }\n parserInput.i = nextNewLine;\n comment.text = inp.substr(comment.index, parserInput.i - comment.index);\n parserInput.commentStore.push(comment);\n continue;\n } else if (nextChar === '*') {\n const nextStarSlash = inp.indexOf('*/', parserInput.i + 2);\n if (nextStarSlash >= 0) {\n comment = {\n index: parserInput.i,\n text: inp.substr(parserInput.i, nextStarSlash + 2 - parserInput.i),\n isLineComment: false\n };\n parserInput.i += comment.text.length - 1;\n parserInput.commentStore.push(comment);\n continue;\n }\n }\n break;\n }\n\n if ((c !== CHARCODE_SPACE) && (c !== CHARCODE_LF) && (c !== CHARCODE_TAB) && (c !== CHARCODE_CR)) {\n break;\n }\n }\n\n current = current.slice(length + parserInput.i - mem + curr);\n currentPos = parserInput.i;\n\n if (!current.length) {\n if (j < chunks.length - 1) {\n current = chunks[++j];\n skipWhitespace(0); // skip space at the beginning of a chunk\n return true; // things changed\n }\n parserInput.finished = true;\n }\n\n return oldi !== parserInput.i || oldj !== j;\n }\n\n parserInput.save = () => {\n currentPos = parserInput.i;\n saveStack.push( { current, i: parserInput.i, j });\n };\n parserInput.restore = possibleErrorMessage => {\n\n if (parserInput.i > furthest || (parserInput.i === furthest && possibleErrorMessage && !furthestPossibleErrorMessage)) {\n furthest = parserInput.i;\n furthestPossibleErrorMessage = possibleErrorMessage;\n }\n const state = saveStack.pop();\n current = state.current;\n currentPos = parserInput.i = state.i;\n j = state.j;\n };\n parserInput.forget = () => {\n saveStack.pop();\n };\n parserInput.isWhitespace = offset => {\n const pos = parserInput.i + (offset || 0);\n const code = input.charCodeAt(pos);\n return (code === CHARCODE_SPACE || code === CHARCODE_CR || code === CHARCODE_TAB || code === CHARCODE_LF);\n };\n\n // Specialization of $(tok)\n parserInput.$re = tok => {\n if (parserInput.i > currentPos) {\n current = current.slice(parserInput.i - currentPos);\n currentPos = parserInput.i;\n }\n\n const m = tok.exec(current);\n if (!m) {\n return null;\n }\n\n skipWhitespace(m[0].length);\n if (typeof m === 'string') {\n return m;\n }\n\n return m.length === 1 ? m[0] : m;\n };\n\n parserInput.$char = tok => {\n if (input.charAt(parserInput.i) !== tok) {\n return null;\n }\n skipWhitespace(1);\n return tok;\n };\n\n parserInput.$str = tok => {\n const tokLength = tok.length;\n\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tokLength; i++) {\n if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n return null;\n }\n }\n\n skipWhitespace(tokLength);\n return tok;\n };\n\n parserInput.$quoted = loc => {\n const pos = loc || parserInput.i;\n const startChar = input.charAt(pos);\n\n if (startChar !== '\\'' && startChar !== '\"') {\n return;\n }\n const length = input.length;\n const currentPosition = pos;\n\n for (let i = 1; i + currentPosition < length; i++) {\n const nextChar = input.charAt(i + currentPosition);\n switch (nextChar) {\n case '\\\\':\n i++;\n continue;\n case '\\r':\n case '\\n':\n break;\n case startChar:\n const str = input.substr(currentPosition, i + 1);\n if (!loc && loc !== 0) {\n skipWhitespace(i + 1);\n return str\n }\n return [startChar, str];\n default:\n }\n }\n return null;\n };\n\n /**\n * Permissive parsing. Ignores everything except matching {} [] () and quotes\n * until matching token (outside of blocks)\n */\n parserInput.$parseUntil = tok => {\n let quote = '';\n let returnVal = null;\n let inComment = false;\n let blockDepth = 0;\n const blockStack = [];\n const parseGroups = [];\n const length = input.length;\n const startPos = parserInput.i;\n let lastPos = parserInput.i;\n let i = parserInput.i;\n let loop = true;\n let testChar;\n\n if (typeof tok === 'string') {\n testChar = char => char === tok\n } else {\n testChar = char => tok.test(char)\n }\n\n do {\n let prevChar;\n let nextChar = input.charAt(i);\n if (blockDepth === 0 && testChar(nextChar)) {\n returnVal = input.substr(lastPos, i - lastPos);\n if (returnVal) {\n parseGroups.push(returnVal);\n }\n else {\n parseGroups.push(' ');\n }\n returnVal = parseGroups;\n skipWhitespace(i - startPos);\n loop = false\n } else {\n if (inComment) {\n if (nextChar === '*' && \n input.charAt(i + 1) === '/') {\n i++;\n blockDepth--;\n inComment = false;\n }\n i++;\n continue;\n }\n switch (nextChar) {\n case '\\\\':\n i++;\n nextChar = input.charAt(i);\n parseGroups.push(input.substr(lastPos, i - lastPos + 1));\n lastPos = i + 1;\n break;\n case '/':\n if (input.charAt(i + 1) === '*') {\n i++;\n inComment = true;\n blockDepth++;\n }\n break;\n case '\\'':\n case '\"':\n quote = parserInput.$quoted(i);\n if (quote) {\n parseGroups.push(input.substr(lastPos, i - lastPos), quote);\n i += quote[1].length - 1;\n lastPos = i + 1;\n }\n else {\n skipWhitespace(i - startPos);\n returnVal = nextChar;\n loop = false;\n }\n break;\n case '{':\n blockStack.push('}');\n blockDepth++;\n break;\n case '(':\n blockStack.push(')');\n blockDepth++;\n break;\n case '[':\n blockStack.push(']');\n blockDepth++;\n break;\n case '}':\n case ')':\n case ']':\n const expected = blockStack.pop();\n if (nextChar === expected) {\n blockDepth--;\n } else {\n // move the parser to the error and return expected\n skipWhitespace(i - startPos);\n returnVal = expected;\n loop = false;\n }\n }\n i++;\n if (i > length) {\n loop = false;\n }\n }\n prevChar = nextChar;\n } while (loop);\n\n return returnVal ? returnVal : null;\n }\n\n parserInput.autoCommentAbsorb = true;\n parserInput.commentStore = [];\n parserInput.finished = false;\n\n // Same as $(), but don't change the state of the parser,\n // just return the match.\n parserInput.peek = tok => {\n if (typeof tok === 'string') {\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tok.length; i++) {\n if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n return false;\n }\n }\n return true;\n } else {\n return tok.test(current);\n }\n };\n\n // Specialization of peek()\n // TODO remove or change some currentChar calls to peekChar\n parserInput.peekChar = tok => input.charAt(parserInput.i) === tok;\n\n parserInput.currentChar = () => input.charAt(parserInput.i);\n\n parserInput.prevChar = () => input.charAt(parserInput.i - 1);\n\n parserInput.getInput = () => input;\n\n parserInput.peekNotNumeric = () => {\n const c = input.charCodeAt(parserInput.i);\n // Is the first char of the dimension 0-9, '.', '+' or '-'\n return (c > CHARCODE_9 || c < CHARCODE_PLUS) || c === CHARCODE_FORWARD_SLASH || c === CHARCODE_COMMA;\n };\n\n parserInput.start = (str, chunkInput, failFunction) => {\n input = str;\n parserInput.i = j = currentPos = furthest = 0;\n\n // chunking apparently makes things quicker (but my tests indicate\n // it might actually make things slower in node at least)\n // and it is a non-perfect parse - it can't recognise\n // unquoted urls, meaning it can't distinguish comments\n // meaning comments with quotes or {}() in them get 'counted'\n // and then lead to parse errors.\n // In addition if the chunking chunks in the wrong place we might\n // not be able to parse a parser statement in one go\n // this is officially deprecated but can be switched on via an option\n // in the case it causes too much performance issues.\n if (chunkInput) {\n chunks = chunker(str, failFunction);\n } else {\n chunks = [str];\n }\n\n current = chunks[0];\n\n skipWhitespace(0);\n };\n\n parserInput.end = () => {\n let message;\n const isFinished = parserInput.i >= input.length;\n\n if (parserInput.i < furthest) {\n message = furthestPossibleErrorMessage;\n parserInput.i = furthest;\n }\n return {\n isFinished,\n furthest: parserInput.i,\n furthestPossibleErrorMessage: message,\n furthestReachedEnd: parserInput.i >= input.length - 1,\n furthestChar: input[parserInput.i]\n };\n };\n\n return parserInput;\n};\n","// Split the input into chunks.\nexport default function (input, fail) {\n const len = input.length;\n let level = 0;\n let parenLevel = 0;\n let lastOpening;\n let lastOpeningParen;\n let lastMultiComment;\n let lastMultiCommentEndBrace;\n const chunks = [];\n let emitFrom = 0;\n let chunkerCurrentIndex;\n let currentChunkStartIndex;\n let cc;\n let cc2;\n let matched;\n\n function emitChunk(force) {\n const len = chunkerCurrentIndex - emitFrom;\n if (((len < 512) && !force) || !len) {\n return;\n }\n chunks.push(input.slice(emitFrom, chunkerCurrentIndex + 1));\n emitFrom = chunkerCurrentIndex + 1;\n }\n\n for (chunkerCurrentIndex = 0; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc = input.charCodeAt(chunkerCurrentIndex);\n if (((cc >= 97) && (cc <= 122)) || (cc < 34)) {\n // a-z or whitespace\n continue;\n }\n\n switch (cc) {\n case 40: // (\n parenLevel++;\n lastOpeningParen = chunkerCurrentIndex;\n continue;\n case 41: // )\n if (--parenLevel < 0) {\n return fail('missing opening `(`', chunkerCurrentIndex);\n }\n continue;\n case 59: // ;\n if (!parenLevel) { emitChunk(); }\n continue;\n case 123: // {\n level++;\n lastOpening = chunkerCurrentIndex;\n continue;\n case 125: // }\n if (--level < 0) {\n return fail('missing opening `{`', chunkerCurrentIndex);\n }\n if (!level && !parenLevel) { emitChunk(); }\n continue;\n case 92: // \\\n if (chunkerCurrentIndex < len - 1) { chunkerCurrentIndex++; continue; }\n return fail('unescaped `\\\\`', chunkerCurrentIndex);\n case 34:\n case 39:\n case 96: // \", ' and `\n matched = 0;\n currentChunkStartIndex = chunkerCurrentIndex;\n for (chunkerCurrentIndex = chunkerCurrentIndex + 1; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if (cc2 > 96) { continue; }\n if (cc2 == cc) { matched = 1; break; }\n if (cc2 == 92) { // \\\n if (chunkerCurrentIndex == len - 1) {\n return fail('unescaped `\\\\`', chunkerCurrentIndex);\n }\n chunkerCurrentIndex++;\n }\n }\n if (matched) { continue; }\n return fail(`unmatched \\`${String.fromCharCode(cc)}\\``, currentChunkStartIndex);\n case 47: // /, check for comment\n if (parenLevel || (chunkerCurrentIndex == len - 1)) { continue; }\n cc2 = input.charCodeAt(chunkerCurrentIndex + 1);\n if (cc2 == 47) {\n // //, find lnfeed\n for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if ((cc2 <= 13) && ((cc2 == 10) || (cc2 == 13))) { break; }\n }\n } else if (cc2 == 42) {\n // /*, find */\n lastMultiComment = currentChunkStartIndex = chunkerCurrentIndex;\n for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len - 1; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if (cc2 == 125) { lastMultiCommentEndBrace = chunkerCurrentIndex; }\n if (cc2 != 42) { continue; }\n if (input.charCodeAt(chunkerCurrentIndex + 1) == 47) { break; }\n }\n if (chunkerCurrentIndex == len - 1) {\n return fail('missing closing `*/`', currentChunkStartIndex);\n }\n chunkerCurrentIndex++;\n }\n continue;\n case 42: // *, check for unmatched */\n if ((chunkerCurrentIndex < len - 1) && (input.charCodeAt(chunkerCurrentIndex + 1) == 47)) {\n return fail('unmatched `/*`', chunkerCurrentIndex);\n }\n continue;\n }\n }\n\n if (level !== 0) {\n if ((lastMultiComment > lastOpening) && (lastMultiCommentEndBrace > lastMultiComment)) {\n return fail('missing closing `}` or `*/`', lastOpening);\n } else {\n return fail('missing closing `}`', lastOpening);\n }\n } else if (parenLevel !== 0) {\n return fail('missing closing `)`', lastOpeningParen);\n }\n\n emitChunk(true);\n return chunks;\n};\n","import LessError from '../less-error';\nimport tree from '../tree';\nimport visitors from '../visitors';\nimport getParserInput from './parser-input';\nimport * as utils from '../utils';\nimport functionRegistry from '../functions/function-registry';\n\n//\n// less.js - parser\n//\n// A relatively straight-forward predictive parser.\n// There is no tokenization/lexing stage, the input is parsed\n// in one sweep.\n//\n// To make the parser fast enough to run in the browser, several\n// optimization had to be made:\n//\n// - Matching and slicing on a huge input is often cause of slowdowns.\n// The solution is to chunkify the input into smaller strings.\n// The chunks are stored in the `chunks` var,\n// `j` holds the current chunk index, and `currentPos` holds\n// the index of the current chunk in relation to `input`.\n// This gives us an almost 4x speed-up.\n//\n// - In many cases, we don't need to match individual tokens;\n// for example, if a value doesn't hold any variables, operations\n// or dynamic references, the parser can effectively 'skip' it,\n// treating it as a literal.\n// An example would be '1px solid #000' - which evaluates to itself,\n// we don't need to know what the individual components are.\n// The drawback, of course is that you don't get the benefits of\n// syntax-checking on the CSS. This gives us a 50% speed-up in the parser,\n// and a smaller speed-up in the code-gen.\n//\n//\n// Token matching is done with the `$` function, which either takes\n// a terminal string or regexp, or a non-terminal function to call.\n// It also takes care of moving all the indices forwards.\n//\n\nconst Parser = function Parser(context, imports, fileInfo) {\n let parsers;\n const parserInput = getParserInput();\n\n function error(msg, type) {\n throw new LessError(\n {\n index: parserInput.i,\n filename: fileInfo.filename,\n type: type || 'Syntax',\n message: msg\n },\n imports\n );\n }\n\n function expect(arg, msg) {\n // some older browsers return typeof 'function' for RegExp\n const result = (arg instanceof Function) ? arg.call(parsers) : parserInput.$re(arg);\n if (result) {\n return result;\n }\n \n error(msg || (typeof arg === 'string'\n ? `expected '${arg}' got '${parserInput.currentChar()}'`\n : 'unexpected token'));\n }\n\n // Specialization of expect()\n function expectChar(arg, msg) {\n if (parserInput.$char(arg)) {\n return arg;\n }\n error(msg || `expected '${arg}' got '${parserInput.currentChar()}'`);\n }\n\n function getDebugInfo(index) {\n const filename = fileInfo.filename;\n\n return {\n lineNumber: utils.getLocation(index, parserInput.getInput()).line + 1,\n fileName: filename\n };\n }\n\n /**\n * Used after initial parsing to create nodes on the fly\n * \n * @param {String} str - string to parse \n * @param {Array} parseList - array of parsers to run input through e.g. [\"value\", \"important\"]\n * @param {Number} currentIndex - start number to begin indexing\n * @param {Object} fileInfo - fileInfo to attach to created nodes\n */\n function parseNode(str, parseList, currentIndex, fileInfo, callback) {\n let result;\n const returnNodes = [];\n const parser = parserInput;\n\n try {\n parser.start(str, false, function fail(msg, index) {\n callback({\n message: msg,\n index: index + currentIndex\n });\n });\n for (let x = 0, p, i; (p = parseList[x]); x++) {\n i = parser.i;\n result = parsers[p]();\n if (result) {\n try {\n result._index = i + currentIndex;\n result._fileInfo = fileInfo;\n } catch (e) {}\n returnNodes.push(result);\n }\n else {\n returnNodes.push(null);\n }\n }\n\n const endInfo = parser.end();\n if (endInfo.isFinished) {\n callback(null, returnNodes);\n }\n else {\n callback(true, null);\n }\n } catch (e) {\n throw new LessError({\n index: e.index + currentIndex,\n message: e.message\n }, imports, fileInfo.filename);\n }\n }\n\n //\n // The Parser\n //\n return {\n parserInput,\n imports,\n fileInfo,\n parseNode,\n //\n // Parse an input string into an abstract syntax tree,\n // @param str A string containing 'less' markup\n // @param callback call `callback` when done.\n // @param [additionalData] An optional map which can contains vars - a map (key, value) of variables to apply\n //\n parse: function (str, callback, additionalData) {\n let root;\n let error = null;\n let globalVars;\n let modifyVars;\n let ignored;\n let preText = '';\n\n globalVars = (additionalData && additionalData.globalVars) ? `${Parser.serializeVars(additionalData.globalVars)}\\n` : '';\n modifyVars = (additionalData && additionalData.modifyVars) ? `\\n${Parser.serializeVars(additionalData.modifyVars)}` : '';\n\n if (context.pluginManager) {\n const preProcessors = context.pluginManager.getPreProcessors();\n for (let i = 0; i < preProcessors.length; i++) {\n str = preProcessors[i].process(str, { context, imports, fileInfo });\n }\n }\n\n if (globalVars || (additionalData && additionalData.banner)) {\n preText = ((additionalData && additionalData.banner) ? additionalData.banner : '') + globalVars;\n ignored = imports.contentsIgnoredChars;\n ignored[fileInfo.filename] = ignored[fileInfo.filename] || 0;\n ignored[fileInfo.filename] += preText.length;\n }\n\n str = str.replace(/\\r\\n?/g, '\\n');\n // Remove potential UTF Byte Order Mark\n str = preText + str.replace(/^\\uFEFF/, '') + modifyVars;\n imports.contents[fileInfo.filename] = str;\n\n // Start with the primary rule.\n // The whole syntax tree is held under a Ruleset node,\n // with the `root` property set to true, so no `{}` are\n // output. The callback is called when the input is parsed.\n try {\n parserInput.start(str, context.chunkInput, function fail(msg, index) {\n throw new LessError({\n index,\n type: 'Parse',\n message: msg,\n filename: fileInfo.filename\n }, imports);\n });\n\n tree.Node.prototype.parse = this;\n root = new tree.Ruleset(null, this.parsers.primary());\n tree.Node.prototype.rootNode = root;\n root.root = true;\n root.firstRoot = true;\n root.functionRegistry = functionRegistry.inherit();\n \n } catch (e) {\n return callback(new LessError(e, imports, fileInfo.filename));\n }\n\n // If `i` is smaller than the `input.length - 1`,\n // it means the parser wasn't able to parse the whole\n // string, so we've got a parsing error.\n //\n // We try to extract a \\n delimited string,\n // showing the line where the parse error occurred.\n // We split it up into two parts (the part which parsed,\n // and the part which didn't), so we can color them differently.\n const endInfo = parserInput.end();\n if (!endInfo.isFinished) {\n\n let message = endInfo.furthestPossibleErrorMessage;\n\n if (!message) {\n message = 'Unrecognised input';\n if (endInfo.furthestChar === '}') {\n message += '. Possibly missing opening \\'{\\'';\n } else if (endInfo.furthestChar === ')') {\n message += '. Possibly missing opening \\'(\\'';\n } else if (endInfo.furthestReachedEnd) {\n message += '. Possibly missing something';\n }\n }\n\n error = new LessError({\n type: 'Parse',\n message,\n index: endInfo.furthest,\n filename: fileInfo.filename\n }, imports);\n }\n\n const finish = e => {\n e = error || e || imports.error;\n\n if (e) {\n if (!(e instanceof LessError)) {\n e = new LessError(e, imports, fileInfo.filename);\n }\n\n return callback(e);\n }\n else {\n return callback(null, root);\n }\n };\n\n if (context.processImports !== false) {\n new visitors.ImportVisitor(imports, finish)\n .run(root);\n } else {\n return finish();\n }\n },\n\n //\n // Here in, the parsing rules/functions\n //\n // The basic structure of the syntax tree generated is as follows:\n //\n // Ruleset -> Declaration -> Value -> Expression -> Entity\n //\n // Here's some Less code:\n //\n // .class {\n // color: #fff;\n // border: 1px solid #000;\n // width: @w + 4px;\n // > .child {...}\n // }\n //\n // And here's what the parse tree might look like:\n //\n // Ruleset (Selector '.class', [\n // Declaration (\"color\", Value ([Expression [Color #fff]]))\n // Declaration (\"border\", Value ([Expression [Dimension 1px][Keyword \"solid\"][Color #000]]))\n // Declaration (\"width\", Value ([Expression [Operation \" + \" [Variable \"@w\"][Dimension 4px]]]))\n // Ruleset (Selector [Element '>', '.child'], [...])\n // ])\n //\n // In general, most rules will try to parse a token with the `$re()` function, and if the return\n // value is truly, will return a new node, of the relevant type. Sometimes, we need to check\n // first, before parsing, that's when we use `peek()`.\n //\n parsers: parsers = {\n //\n // The `primary` rule is the *entry* and *exit* point of the parser.\n // The rules here can appear at any level of the parse tree.\n //\n // The recursive nature of the grammar is an interplay between the `block`\n // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule,\n // as represented by this simplified grammar:\n //\n // primary → (ruleset | declaration)+\n // ruleset → selector+ block\n // block → '{' primary '}'\n //\n // Only at one point is the primary rule not called from the\n // block rule: at the root level.\n //\n primary: function () {\n const mixin = this.mixin;\n let root = [];\n let node;\n\n while (true) {\n while (true) {\n node = this.comment();\n if (!node) { break; }\n root.push(node);\n }\n // always process comments before deciding if finished\n if (parserInput.finished) {\n break;\n }\n if (parserInput.peek('}')) {\n break;\n }\n\n node = this.extendRule();\n if (node) {\n root = root.concat(node);\n continue;\n }\n\n node = mixin.definition() || this.declaration() || mixin.call(false, false) || \n this.ruleset() || this.variableCall() || this.entities.call() || this.atrule();\n if (node) {\n root.push(node);\n } else {\n let foundSemiColon = false;\n while (parserInput.$char(';')) {\n foundSemiColon = true;\n }\n if (!foundSemiColon) {\n break;\n }\n }\n }\n\n return root;\n },\n\n // comments are collected by the main parsing mechanism and then assigned to nodes\n // where the current structure allows it\n comment: function () {\n if (parserInput.commentStore.length) {\n const comment = parserInput.commentStore.shift();\n return new(tree.Comment)(comment.text, comment.isLineComment, comment.index, fileInfo);\n }\n },\n\n //\n // Entities are tokens which can be found inside an Expression\n //\n entities: {\n mixinLookup: function() {\n return parsers.mixin.call(true, true);\n },\n //\n // A string, which supports escaping \" and '\n //\n // \"milky way\" 'he\\'s the one!'\n //\n quoted: function (forceEscaped) {\n let str;\n const index = parserInput.i;\n let isEscaped = false;\n\n parserInput.save();\n if (parserInput.$char('~')) {\n isEscaped = true;\n } else if (forceEscaped) {\n parserInput.restore();\n return;\n }\n\n str = parserInput.$quoted();\n if (!str) {\n parserInput.restore();\n return;\n }\n parserInput.forget();\n\n return new(tree.Quoted)(str.charAt(0), str.substr(1, str.length - 2), isEscaped, index, fileInfo);\n },\n\n //\n // A catch-all word, such as:\n //\n // black border-collapse\n //\n keyword: function () {\n const k = parserInput.$char('%') || parserInput.$re(/^\\[?(?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+\\]?/);\n if (k) {\n return tree.Color.fromKeyword(k) || new(tree.Keyword)(k);\n }\n },\n\n //\n // A function call\n //\n // rgb(255, 0, 255)\n //\n // The arguments are parsed with the `entities.arguments` parser.\n //\n call: function () {\n let name;\n let args;\n let func;\n const index = parserInput.i;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (parserInput.peek(/^url\\(/i)) {\n return;\n }\n\n parserInput.save();\n\n name = parserInput.$re(/^([\\w-]+|%|~|progid:[\\w\\.]+)\\(/);\n if (!name) {\n parserInput.forget(); \n return;\n }\n\n name = name[1];\n func = this.customFuncCall(name);\n if (func) {\n args = func.parse();\n if (args && func.stop) {\n parserInput.forget();\n return args;\n }\n }\n\n args = this.arguments(args);\n\n if (!parserInput.$char(')')) {\n parserInput.restore('Could not parse call arguments or missing \\')\\'');\n return;\n }\n\n parserInput.forget();\n\n return new(tree.Call)(name, args, index, fileInfo);\n },\n \n //\n // Parsing rules for functions with non-standard args, e.g.:\n //\n // boolean(not(2 > 1))\n //\n // This is a quick prototype, to be modified/improved when\n // more custom-parsed funcs come (e.g. `selector(...)`)\n //\n\n customFuncCall: function (name) {\n /* Ideally the table is to be moved out of here for faster perf.,\n but it's quite tricky since it relies on all these `parsers`\n and `expect` available only here */\n return {\n alpha: f(parsers.ieAlpha, true),\n boolean: f(condition),\n 'if': f(condition)\n }[name.toLowerCase()];\n\n function f(parse, stop) {\n return {\n parse, // parsing function\n stop // when true - stop after parse() and return its result, \n // otherwise continue for plain args\n };\n }\n \n function condition() {\n return [expect(parsers.condition, 'expected condition')];\n }\n },\n\n arguments: function (prevArgs) {\n let argsComma = prevArgs || [];\n const argsSemiColon = [];\n let isSemiColonSeparated;\n let value;\n\n parserInput.save();\n\n while (true) {\n if (prevArgs) {\n prevArgs = false;\n } else {\n value = parsers.detachedRuleset() || this.assignment() || parsers.expression();\n if (!value) {\n break;\n }\n\n if (value.value && value.value.length == 1) {\n value = value.value[0];\n }\n\n argsComma.push(value);\n }\n\n if (parserInput.$char(',')) {\n continue;\n }\n\n if (parserInput.$char(';') || isSemiColonSeparated) {\n isSemiColonSeparated = true;\n value = (argsComma.length < 1) ? argsComma[0]\n : new tree.Value(argsComma);\n argsSemiColon.push(value);\n argsComma = [];\n }\n }\n\n parserInput.forget();\n return isSemiColonSeparated ? argsSemiColon : argsComma;\n },\n literal: function () {\n return this.dimension() ||\n this.color() ||\n this.quoted() ||\n this.unicodeDescriptor();\n },\n\n // Assignments are argument entities for calls.\n // They are present in ie filter properties as shown below.\n //\n // filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* )\n //\n\n assignment: function () {\n let key;\n let value;\n parserInput.save();\n key = parserInput.$re(/^\\w+(?=\\s?=)/i);\n if (!key) {\n parserInput.restore();\n return;\n }\n if (!parserInput.$char('=')) {\n parserInput.restore();\n return;\n }\n value = parsers.entity();\n if (value) {\n parserInput.forget();\n return new(tree.Assignment)(key, value);\n } else {\n parserInput.restore();\n }\n },\n\n //\n // Parse url() tokens\n //\n // We use a specific rule for urls, because they don't really behave like\n // standard function calls. The difference is that the argument doesn't have\n // to be enclosed within a string, so it can't be parsed as an Expression.\n //\n url: function () {\n let value;\n const index = parserInput.i;\n\n parserInput.autoCommentAbsorb = false;\n\n if (!parserInput.$str('url(')) {\n parserInput.autoCommentAbsorb = true;\n return;\n }\n\n value = this.quoted() || this.variable() || this.property() ||\n parserInput.$re(/^(?:(?:\\\\[\\(\\)'\"])|[^\\(\\)'\"])+/) || '';\n\n parserInput.autoCommentAbsorb = true;\n\n expectChar(')');\n\n return new(tree.URL)((value.value != null || \n value instanceof tree.Variable || \n value instanceof tree.Property) ?\n value : new(tree.Anonymous)(value, index), index, fileInfo);\n },\n\n //\n // A Variable entity, such as `@fink`, in\n //\n // width: @fink + 2px\n //\n // We use a different parser for variable definitions,\n // see `parsers.variable`.\n //\n variable: function () {\n let ch;\n let name;\n const index = parserInput.i;\n\n parserInput.save();\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^@@?[\\w-]+/))) {\n ch = parserInput.currentChar();\n if (ch === '(' || ch === '[' && !parserInput.prevChar().match(/^\\s/)) {\n // this may be a VariableCall lookup\n const result = parsers.variableCall(name);\n if (result) {\n parserInput.forget();\n return result;\n }\n }\n parserInput.forget();\n return new(tree.Variable)(name, index, fileInfo);\n }\n parserInput.restore();\n },\n\n // A variable entity using the protective {} e.g. @{var}\n variableCurly: function () {\n let curly;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '@' && (curly = parserInput.$re(/^@\\{([\\w-]+)\\}/))) {\n return new(tree.Variable)(`@${curly[1]}`, index, fileInfo);\n }\n },\n //\n // A Property accessor, such as `$color`, in\n //\n // background-color: $color\n //\n property: function () {\n let name;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' && (name = parserInput.$re(/^\\$[\\w-]+/))) {\n return new(tree.Property)(name, index, fileInfo);\n }\n },\n\n // A property entity useing the protective {} e.g. ${prop}\n propertyCurly: function () {\n let curly;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' && (curly = parserInput.$re(/^\\$\\{([\\w-]+)\\}/))) {\n return new(tree.Property)(`$${curly[1]}`, index, fileInfo);\n }\n },\n //\n // A Hexadecimal color\n //\n // #4F3C2F\n //\n // `rgb` and `hsl` colors are parsed through the `entities.call` parser.\n //\n color: function () {\n let rgb;\n parserInput.save();\n\n if (parserInput.currentChar() === '#' && (rgb = parserInput.$re(/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})([\\w.#\\[])?/))) {\n if (!rgb[2]) {\n parserInput.forget();\n return new(tree.Color)(rgb[1], undefined, rgb[0]);\n } \n }\n parserInput.restore();\n },\n\n colorKeyword: function () {\n parserInput.save();\n const autoCommentAbsorb = parserInput.autoCommentAbsorb;\n parserInput.autoCommentAbsorb = false;\n const k = parserInput.$re(/^[_A-Za-z-][_A-Za-z0-9-]+/);\n parserInput.autoCommentAbsorb = autoCommentAbsorb;\n if (!k) {\n parserInput.forget();\n return;\n }\n parserInput.restore();\n const color = tree.Color.fromKeyword(k);\n if (color) {\n parserInput.$str(k);\n return color;\n }\n },\n\n //\n // A Dimension, that is, a number and a unit\n //\n // 0.5em 95%\n //\n dimension: function () {\n if (parserInput.peekNotNumeric()) {\n return;\n }\n\n const value = parserInput.$re(/^([+-]?\\d*\\.?\\d+)(%|[a-z_]+)?/i);\n if (value) {\n return new(tree.Dimension)(value[1], value[2]);\n }\n },\n\n //\n // A unicode descriptor, as is used in unicode-range\n //\n // U+0?? or U+00A1-00A9\n //\n unicodeDescriptor: function () {\n let ud;\n\n ud = parserInput.$re(/^U\\+[0-9a-fA-F?]+(\\-[0-9a-fA-F?]+)?/);\n if (ud) {\n return new(tree.UnicodeDescriptor)(ud[0]);\n }\n },\n\n //\n // JavaScript code to be evaluated\n //\n // `window.location.href`\n //\n javascript: function () {\n let js;\n const index = parserInput.i;\n\n parserInput.save();\n\n const escape = parserInput.$char('~');\n const jsQuote = parserInput.$char('`');\n\n if (!jsQuote) {\n parserInput.restore();\n return;\n }\n\n js = parserInput.$re(/^[^`]*`/);\n if (js) {\n parserInput.forget();\n return new(tree.JavaScript)(js.substr(0, js.length - 1), Boolean(escape), index, fileInfo);\n }\n parserInput.restore('invalid javascript definition');\n }\n },\n\n //\n // The variable part of a variable definition. Used in the `rule` parser\n //\n // @fink:\n //\n variable: function () {\n let name;\n\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^(@[\\w-]+)\\s*:/))) { return name[1]; }\n },\n\n //\n // Call a variable value to retrieve a detached ruleset\n // or a value from a detached ruleset's rules.\n //\n // @fink();\n // @fink;\n // color: @fink[@color];\n //\n variableCall: function (parsedName) {\n let lookups;\n const i = parserInput.i;\n const inValue = !!parsedName;\n let name = parsedName;\n\n parserInput.save();\n\n if (name || (parserInput.currentChar() === '@'\n && (name = parserInput.$re(/^(@[\\w-]+)(\\(\\s*\\))?/)))) {\n\n lookups = this.mixin.ruleLookups();\n\n if (!lookups && ((inValue && parserInput.$str('()') !== '()') || (name[2] !== '()'))) {\n parserInput.restore('Missing \\'[...]\\' lookup in variable call');\n return;\n }\n\n if (!inValue) {\n name = name[1];\n }\n\n const call = new tree.VariableCall(name, i, fileInfo);\n if (!inValue && parsers.end()) {\n parserInput.forget();\n return call;\n }\n else {\n parserInput.forget();\n return new tree.NamespaceValue(call, lookups, i, fileInfo);\n }\n }\n\n parserInput.restore();\n },\n\n //\n // extend syntax - used to extend selectors\n //\n extend: function(isRule) {\n let elements;\n let e;\n const index = parserInput.i;\n let option;\n let extendList;\n let extend;\n\n if (!parserInput.$str(isRule ? '&:extend(' : ':extend(')) {\n return;\n }\n\n do {\n option = null;\n elements = null;\n while (!(option = parserInput.$re(/^(all)(?=\\s*(\\)|,))/))) {\n e = this.element();\n if (!e) {\n break;\n }\n if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n }\n\n option = option && option[1];\n if (!elements) {\n error('Missing target selector for :extend().');\n }\n extend = new(tree.Extend)(new(tree.Selector)(elements), option, index, fileInfo);\n if (extendList) {\n extendList.push(extend);\n } else {\n extendList = [ extend ];\n }\n } while (parserInput.$char(','));\n\n expect(/^\\)/);\n\n if (isRule) {\n expect(/^;/);\n }\n\n return extendList;\n },\n\n //\n // extendRule - used in a rule to extend all the parent selectors\n //\n extendRule: function() {\n return this.extend(true);\n },\n\n //\n // Mixins\n //\n mixin: {\n //\n // A Mixin call, with an optional argument list\n //\n // #mixins > .square(#fff);\n // #mixins.square(#fff);\n // .rounded(4px, black);\n // .button;\n //\n // We can lookup / return a value using the lookup syntax:\n //\n // color: #mixin.square(#fff)[@color];\n //\n // The `while` loop is there because mixins can be\n // namespaced, but we only support the child and descendant\n // selector for now.\n //\n call: function (inValue, getLookup) {\n const s = parserInput.currentChar();\n let important = false;\n let lookups;\n const index = parserInput.i;\n let elements;\n let args;\n let hasParens;\n\n if (s !== '.' && s !== '#') { return; }\n\n parserInput.save(); // stop us absorbing part of an invalid selector\n\n elements = this.elements();\n\n if (elements) {\n if (parserInput.$char('(')) {\n args = this.args(true).args;\n expectChar(')');\n hasParens = true;\n }\n\n if (getLookup !== false) {\n lookups = this.ruleLookups();\n }\n if (getLookup === true && !lookups) {\n parserInput.restore();\n return;\n }\n\n if (!lookups && !hasParens) {\n // This isn't a valid mixin call\n parserInput.restore('Unrecognized input. Possibly missing \\'(\\' in mixin call.');\n return;\n }\n\n if (!inValue && parsers.important()) {\n important = true;\n }\n\n if (inValue || parsers.end()) {\n parserInput.forget();\n const mixin = new(tree.mixin.Call)(elements, args, index, fileInfo, !lookups && important);\n if (lookups) {\n return new tree.NamespaceValue(mixin, lookups);\n }\n else {\n return mixin;\n }\n }\n }\n\n parserInput.restore();\n },\n /**\n * Matching elements for mixins\n * (Start with . or # and can have > )\n */\n elements: function() {\n let elements;\n let e;\n let c;\n let elem;\n let elemIndex;\n const re = /^[#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/;\n while (true) {\n elemIndex = parserInput.i;\n e = parserInput.$re(re);\n \n if (!e) {\n break;\n }\n elem = new(tree.Element)(c, e, false, elemIndex, fileInfo);\n if (elements) {\n elements.push(elem);\n } else {\n elements = [ elem ];\n }\n c = parserInput.$char('>');\n }\n return elements;\n },\n args: function (isCall) {\n const entities = parsers.entities;\n const returner = { args:null, variadic: false };\n let expressions = [];\n const argsSemiColon = [];\n const argsComma = [];\n let isSemiColonSeparated;\n let expressionContainsNamed;\n let name;\n let nameLoop;\n let value;\n let arg;\n let expand;\n let hasSep = true;\n\n parserInput.save();\n\n while (true) {\n if (isCall) {\n arg = parsers.detachedRuleset() || parsers.expression();\n } else {\n parserInput.commentStore.length = 0;\n if (parserInput.$str('...')) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ variadic: true });\n break;\n }\n arg = entities.variable() || entities.property() || entities.literal() || entities.keyword() || this.call(true);\n }\n\n if (!arg || !hasSep) {\n break;\n }\n\n nameLoop = null;\n if (arg.throwAwayComments) {\n arg.throwAwayComments();\n }\n value = arg;\n let val = null;\n\n if (isCall) {\n // Variable\n if (arg.value && arg.value.length == 1) {\n val = arg.value[0];\n }\n } else {\n val = arg;\n }\n\n if (val && (val instanceof tree.Variable || val instanceof tree.Property)) {\n if (parserInput.$char(':')) {\n if (expressions.length > 0) {\n if (isSemiColonSeparated) {\n error('Cannot mix ; and , as delimiter types');\n }\n expressionContainsNamed = true;\n }\n\n value = parsers.detachedRuleset() || parsers.expression();\n\n if (!value) {\n if (isCall) {\n error('could not understand value for named argument');\n } else {\n parserInput.restore();\n returner.args = [];\n return returner;\n }\n }\n nameLoop = (name = val.name);\n } else if (parserInput.$str('...')) {\n if (!isCall) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ name: arg.name, variadic: true });\n break;\n } else {\n expand = true;\n }\n } else if (!isCall) {\n name = nameLoop = val.name;\n value = null;\n }\n }\n\n if (value) {\n expressions.push(value);\n }\n\n argsComma.push({ name:nameLoop, value, expand });\n\n if (parserInput.$char(',')) {\n hasSep = true;\n continue;\n }\n hasSep = parserInput.$char(';') === ';';\n\n if (hasSep || isSemiColonSeparated) {\n\n if (expressionContainsNamed) {\n error('Cannot mix ; and , as delimiter types');\n }\n\n isSemiColonSeparated = true;\n\n if (expressions.length > 1) {\n value = new(tree.Value)(expressions);\n }\n argsSemiColon.push({ name, value, expand });\n\n name = null;\n expressions = [];\n expressionContainsNamed = false;\n }\n }\n\n parserInput.forget();\n returner.args = isSemiColonSeparated ? argsSemiColon : argsComma;\n return returner;\n },\n //\n // A Mixin definition, with a list of parameters\n //\n // .rounded (@radius: 2px, @color) {\n // ...\n // }\n //\n // Until we have a finer grained state-machine, we have to\n // do a look-ahead, to make sure we don't have a mixin call.\n // See the `rule` function for more information.\n //\n // We start by matching `.rounded (`, and then proceed on to\n // the argument list, which has optional default values.\n // We store the parameters in `params`, with a `value` key,\n // if there is a value, such as in the case of `@radius`.\n //\n // Once we've got our params list, and a closing `)`, we parse\n // the `{...}` block.\n //\n definition: function () {\n let name;\n let params = [];\n let match;\n let ruleset;\n let cond;\n let variadic = false;\n if ((parserInput.currentChar() !== '.' && parserInput.currentChar() !== '#') ||\n parserInput.peek(/^[^{]*\\}/)) {\n return;\n }\n\n parserInput.save();\n\n match = parserInput.$re(/^([#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\\s*\\(/);\n if (match) {\n name = match[1];\n\n const argInfo = this.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n\n // .mixincall(\"@{a}\");\n // looks a bit like a mixin definition..\n // also\n // .mixincall(@a: {rule: set;});\n // so we have to be nice and restore\n if (!parserInput.$char(')')) {\n parserInput.restore('Missing closing \\')\\'');\n return;\n }\n\n parserInput.commentStore.length = 0;\n\n if (parserInput.$str('when')) { // Guard\n cond = expect(parsers.conditions, 'expected condition');\n }\n\n ruleset = parsers.block();\n\n if (ruleset) {\n parserInput.forget();\n return new(tree.mixin.Definition)(name, params, ruleset, cond, variadic);\n } else {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n }\n },\n \n ruleLookups: function() {\n let rule;\n let args;\n const lookups = [];\n\n if (parserInput.currentChar() !== '[') { \n return;\n }\n\n while (true) {\n parserInput.save();\n args = null;\n rule = this.lookupValue();\n if (!rule && rule !== '') {\n parserInput.restore();\n break;\n }\n lookups.push(rule);\n parserInput.forget();\n }\n if (lookups.length > 0) {\n return lookups;\n }\n },\n \n lookupValue: function() {\n parserInput.save();\n \n if (!parserInput.$char('[')) { \n parserInput.restore();\n return;\n }\n \n const name = parserInput.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);\n \n if (!parserInput.$char(']')) {\n parserInput.restore();\n return;\n } \n\n if (name || name === '') {\n parserInput.forget();\n return name;\n }\n \n parserInput.restore();\n }\n },\n //\n // Entities are the smallest recognized token,\n // and can be found inside a rule's value.\n //\n entity: function () {\n const entities = this.entities;\n\n return this.comment() || entities.literal() || entities.variable() || entities.url() ||\n entities.property() || entities.call() || entities.keyword() || this.mixin.call(true) ||\n entities.javascript();\n },\n\n //\n // A Declaration terminator. Note that we use `peek()` to check for '}',\n // because the `block` rule will be expecting it, but we still need to make sure\n // it's there, if ';' was omitted.\n //\n end: function () {\n return parserInput.$char(';') || parserInput.peek('}');\n },\n\n //\n // IE's alpha function\n //\n // alpha(opacity=88)\n //\n ieAlpha: function () {\n let value;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (!parserInput.$re(/^opacity=/i)) { return; }\n value = parserInput.$re(/^\\d+/);\n if (!value) {\n value = expect(parsers.entities.variable, 'Could not parse alpha');\n value = `@{${value.name.slice(1)}}`;\n }\n expectChar(')');\n return new tree.Quoted('', `alpha(opacity=${value})`);\n },\n\n //\n // A Selector Element\n //\n // div\n // + h1\n // #socks\n // input[type=\"text\"]\n //\n // Elements are the building blocks for Selectors,\n // they are made out of a `Combinator` (see combinator rule),\n // and an element name, such as a tag a class, or `*`.\n //\n element: function () {\n let e;\n let c;\n let v;\n const index = parserInput.i;\n\n c = this.combinator();\n\n e = parserInput.$re(/^(?:\\d+\\.\\d+|\\d+)%/) ||\n parserInput.$re(/^(?:[.#]?|:*)(?:[\\w-]|[^\\x00-\\x9f]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/) ||\n parserInput.$char('*') || parserInput.$char('&') || this.attribute() ||\n parserInput.$re(/^\\([^&()@]+\\)/) || parserInput.$re(/^[\\.#:](?=@)/) ||\n this.entities.variableCurly();\n\n if (!e) {\n parserInput.save();\n if (parserInput.$char('(')) {\n if ((v = this.selector(false)) && parserInput.$char(')')) {\n e = new(tree.Paren)(v);\n parserInput.forget();\n } else {\n parserInput.restore('Missing closing \\')\\'');\n }\n } else {\n parserInput.forget();\n }\n }\n\n if (e) { return new(tree.Element)(c, e, e instanceof tree.Variable, index, fileInfo); }\n },\n\n //\n // Combinators combine elements together, in a Selector.\n //\n // Because our parser isn't white-space sensitive, special care\n // has to be taken, when parsing the descendant combinator, ` `,\n // as it's an empty space. We have to check the previous character\n // in the input, to see if it's a ` ` character. More info on how\n // we deal with this in *combinator.js*.\n //\n combinator: function () {\n let c = parserInput.currentChar();\n\n if (c === '/') {\n parserInput.save();\n const slashedCombinator = parserInput.$re(/^\\/[a-z]+\\//i);\n if (slashedCombinator) {\n parserInput.forget();\n return new(tree.Combinator)(slashedCombinator);\n }\n parserInput.restore();\n }\n\n if (c === '>' || c === '+' || c === '~' || c === '|' || c === '^') {\n parserInput.i++;\n if (c === '^' && parserInput.currentChar() === '^') {\n c = '^^';\n parserInput.i++;\n }\n while (parserInput.isWhitespace()) { parserInput.i++; }\n return new(tree.Combinator)(c);\n } else if (parserInput.isWhitespace(-1)) {\n return new(tree.Combinator)(' ');\n } else {\n return new(tree.Combinator)(null);\n }\n },\n //\n // A CSS Selector\n // with less extensions e.g. the ability to extend and guard\n //\n // .class > div + h1\n // li a:hover\n //\n // Selectors are made out of one or more Elements, see above.\n //\n selector: function (isLess) {\n const index = parserInput.i;\n let elements;\n let extendList;\n let c;\n let e;\n let allExtends;\n let when;\n let condition;\n isLess = isLess !== false;\n while ((isLess && (extendList = this.extend())) || (isLess && (when = parserInput.$str('when'))) || (e = this.element())) {\n if (when) {\n condition = expect(this.conditions, 'expected condition');\n } else if (condition) {\n error('CSS guard can only be used at the end of selector');\n } else if (extendList) {\n if (allExtends) {\n allExtends = allExtends.concat(extendList);\n } else {\n allExtends = extendList;\n }\n } else {\n if (allExtends) { error('Extend can only be used at the end of selector'); }\n c = parserInput.currentChar();\n if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n e = null;\n }\n if (c === '{' || c === '}' || c === ';' || c === ',' || c === ')') {\n break;\n }\n }\n\n if (elements) { return new(tree.Selector)(elements, allExtends, condition, index, fileInfo); }\n if (allExtends) { error('Extend must be used to extend a selector, it cannot be used on its own'); }\n },\n selectors: function () {\n let s;\n let selectors;\n while (true) {\n s = this.selector();\n if (!s) {\n break;\n }\n if (selectors) {\n selectors.push(s);\n } else {\n selectors = [ s ];\n }\n parserInput.commentStore.length = 0;\n if (s.condition && selectors.length > 1) {\n error(\"Guards are only currently allowed on a single selector.\");\n }\n if (!parserInput.$char(',')) { break; }\n if (s.condition) {\n error(\"Guards are only currently allowed on a single selector.\");\n }\n parserInput.commentStore.length = 0;\n }\n return selectors;\n },\n attribute: function () {\n if (!parserInput.$char('[')) { return; }\n\n const entities = this.entities;\n let key;\n let val;\n let op;\n\n if (!(key = entities.variableCurly())) {\n key = expect(/^(?:[_A-Za-z0-9-\\*]*\\|)?(?:[_A-Za-z0-9-]|\\\\.)+/);\n }\n\n op = parserInput.$re(/^[|~*$^]?=/);\n if (op) {\n val = entities.quoted() || parserInput.$re(/^[0-9]+%/) || parserInput.$re(/^[\\w-]+/) || entities.variableCurly();\n }\n\n expectChar(']');\n\n return new(tree.Attribute)(key, op, val);\n },\n\n //\n // The `block` rule is used by `ruleset` and `mixin.definition`.\n // It's a wrapper around the `primary` rule, with added `{}`.\n //\n block: function () {\n let content;\n if (parserInput.$char('{') && (content = this.primary()) && parserInput.$char('}')) {\n return content;\n }\n },\n\n blockRuleset: function() {\n let block = this.block();\n\n if (block) {\n block = new tree.Ruleset(null, block);\n }\n return block;\n },\n\n detachedRuleset: function() {\n let argInfo;\n let params;\n let variadic;\n\n parserInput.save();\n if (parserInput.$re(/^[.#]\\(/)) {\n /**\n * DR args currently only implemented for each() function, and not \n * yet settable as `@dr: #(@arg) {}`\n * This should be done when DRs are merged with mixins.\n * See: https://github.com/less/less-meta/issues/16\n */\n argInfo = this.mixin.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n if (!parserInput.$char(')')) {\n parserInput.restore();\n return;\n }\n }\n const blockRuleset = this.blockRuleset();\n if (blockRuleset) {\n parserInput.forget();\n if (params) {\n return new tree.mixin.Definition(null, params, blockRuleset, null, variadic);\n }\n return new tree.DetachedRuleset(blockRuleset);\n }\n parserInput.restore();\n },\n\n //\n // div, .class, body > p {...}\n //\n ruleset: function () {\n let selectors;\n let rules;\n let debugInfo;\n\n parserInput.save();\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(parserInput.i);\n }\n\n selectors = this.selectors();\n\n if (selectors && (rules = this.block())) {\n parserInput.forget();\n const ruleset = new(tree.Ruleset)(selectors, rules, context.strictImports);\n if (context.dumpLineNumbers) {\n ruleset.debugInfo = debugInfo;\n }\n return ruleset;\n } else {\n parserInput.restore();\n }\n },\n declaration: function () {\n let name;\n let value;\n const index = parserInput.i;\n let hasDR;\n const c = parserInput.currentChar();\n let important;\n let merge;\n let isVariable;\n\n if (c === '.' || c === '#' || c === '&' || c === ':') { return; }\n\n parserInput.save();\n\n name = this.variable() || this.ruleProperty();\n if (name) {\n isVariable = typeof name === 'string';\n\n if (isVariable) {\n value = this.detachedRuleset();\n if (value) {\n hasDR = true;\n }\n }\n\n parserInput.commentStore.length = 0;\n if (!value) {\n // a name returned by this.ruleProperty() is always an array of the form:\n // [string-1, ..., string-n, \"\"] or [string-1, ..., string-n, \"+\"]\n // where each item is a tree.Keyword or tree.Variable\n merge = !isVariable && name.length > 1 && name.pop().value;\n\n // Custom property values get permissive parsing\n if (name[0].value && name[0].value.slice(0, 2) === '--') {\n value = this.permissiveValue();\n }\n // Try to store values as anonymous\n // If we need the value later we'll re-parse it in ruleset.parseValue\n else {\n value = this.anonymousValue();\n }\n if (value) {\n parserInput.forget();\n // anonymous values absorb the end ';' which is required for them to work\n return new(tree.Declaration)(name, value, false, merge, index, fileInfo);\n }\n\n if (!value) {\n value = this.value();\n }\n\n if (value) {\n important = this.important();\n } else if (isVariable) {\n // As a last resort, try permissiveValue\n value = this.permissiveValue();\n }\n }\n\n if (value && (this.end() || hasDR)) {\n parserInput.forget();\n return new(tree.Declaration)(name, value, important, merge, index, fileInfo);\n }\n else {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n }\n },\n anonymousValue: function () {\n const index = parserInput.i;\n const match = parserInput.$re(/^([^.#@\\$+\\/'\"*`(;{}-]*);/);\n if (match) {\n return new(tree.Anonymous)(match[1], index);\n }\n },\n /**\n * Used for custom properties, at-rules, and variables (as fallback)\n * Parses almost anything inside of {} [] () \"\" blocks\n * until it reaches outer-most tokens.\n * \n * First, it will try to parse comments and entities to reach\n * the end. This is mostly like the Expression parser except no\n * math is allowed.\n */\n permissiveValue: function (untilTokens) {\n let i;\n let e;\n let done;\n let value;\n const tok = untilTokens || ';';\n const index = parserInput.i;\n const result = [];\n\n function testCurrentChar() {\n const char = parserInput.currentChar();\n if (typeof tok === 'string') {\n return char === tok;\n } else {\n return tok.test(char);\n }\n }\n if (testCurrentChar()) {\n return;\n }\n value = [];\n do {\n e = this.comment();\n if (e) {\n value.push(e);\n continue;\n }\n e = this.entity();\n if (e) {\n value.push(e);\n }\n } while (e);\n\n done = testCurrentChar();\n\n if (value.length > 0) {\n value = new(tree.Expression)(value);\n if (done) {\n return value;\n }\n else {\n result.push(value);\n }\n // Preserve space before $parseUntil as it will not\n if (parserInput.prevChar() === ' ') {\n result.push(new tree.Anonymous(' ', index));\n }\n }\n parserInput.save();\n\n value = parserInput.$parseUntil(tok);\n\n if (value) {\n if (typeof value === 'string') {\n error(`Expected '${value}'`, 'Parse');\n }\n if (value.length === 1 && value[0] === ' ') {\n parserInput.forget();\n return new tree.Anonymous('', index);\n }\n let item;\n for (i = 0; i < value.length; i++) {\n item = value[i];\n if (Array.isArray(item)) {\n // Treat actual quotes as normal quoted values\n result.push(new tree.Quoted(item[0], item[1], true, index, fileInfo));\n }\n else {\n if (i === value.length - 1) {\n item = item.trim();\n }\n // Treat like quoted values, but replace vars like unquoted expressions\n const quote = new tree.Quoted('\\'', item, true, index, fileInfo);\n quote.variableRegex = /@([\\w-]+)/g;\n quote.propRegex = /\\$([\\w-]+)/g;\n result.push(quote);\n }\n }\n parserInput.forget();\n return new tree.Expression(result, true);\n }\n parserInput.restore();\n },\n\n //\n // An @import atrule\n //\n // @import \"lib\";\n //\n // Depending on our environment, importing is done differently:\n // In the browser, it's an XHR request, in Node, it would be a\n // file-system operation. The function used for importing is\n // stored in `import`, which we pass to the Import constructor.\n //\n 'import': function () {\n let path;\n let features;\n const index = parserInput.i;\n\n const dir = parserInput.$re(/^@import?\\s+/);\n\n if (dir) {\n const options = (dir ? this.importOptions() : null) || {};\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n features = this.mediaFeatures();\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon or unrecognised media features on import');\n }\n features = features && new(tree.Value)(features);\n return new(tree.Import)(path, features, options, index, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed import statement');\n }\n }\n },\n\n importOptions: function() {\n let o;\n const options = {};\n let optionName;\n let value;\n\n // list of options, surrounded by parens\n if (!parserInput.$char('(')) { return null; }\n do {\n o = this.importOption();\n if (o) {\n optionName = o;\n value = true;\n switch (optionName) {\n case 'css':\n optionName = 'less';\n value = false;\n break;\n case 'once':\n optionName = 'multiple';\n value = false;\n break;\n }\n options[optionName] = value;\n if (!parserInput.$char(',')) { break; }\n }\n } while (o);\n expectChar(')');\n return options;\n },\n\n importOption: function() {\n const opt = parserInput.$re(/^(less|css|multiple|once|inline|reference|optional)/);\n if (opt) {\n return opt[1];\n }\n },\n\n mediaFeature: function () {\n const entities = this.entities;\n const nodes = [];\n let e;\n let p;\n parserInput.save();\n do {\n e = entities.keyword() || entities.variable() || entities.mixinLookup();\n if (e) {\n nodes.push(e);\n } else if (parserInput.$char('(')) {\n p = this.property();\n e = this.value();\n if (parserInput.$char(')')) {\n if (p && e) {\n nodes.push(new(tree.Paren)(new(tree.Declaration)(p, e, null, null, parserInput.i, fileInfo, true)));\n } else if (e) {\n nodes.push(new(tree.Paren)(e));\n } else {\n error('badly formed media feature definition');\n }\n } else {\n error('Missing closing \\')\\'', 'Parse');\n }\n }\n } while (e);\n\n parserInput.forget();\n if (nodes.length > 0) {\n return new(tree.Expression)(nodes);\n }\n },\n\n mediaFeatures: function () {\n const entities = this.entities;\n const features = [];\n let e;\n do {\n e = this.mediaFeature();\n if (e) {\n features.push(e);\n if (!parserInput.$char(',')) { break; }\n } else {\n e = entities.variable() || entities.mixinLookup();\n if (e) {\n features.push(e);\n if (!parserInput.$char(',')) { break; }\n }\n }\n } while (e);\n\n return features.length > 0 ? features : null;\n },\n\n media: function () {\n let features;\n let rules;\n let media;\n let debugInfo;\n const index = parserInput.i;\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(index);\n }\n\n parserInput.save();\n\n if (parserInput.$str('@media')) {\n features = this.mediaFeatures();\n\n rules = this.block();\n\n if (!rules) {\n error('media definitions require block statements after any features');\n }\n\n parserInput.forget();\n\n media = new(tree.Media)(rules, features, index, fileInfo);\n if (context.dumpLineNumbers) {\n media.debugInfo = debugInfo;\n }\n\n return media;\n }\n\n parserInput.restore();\n },\n\n //\n\n // A @plugin directive, used to import plugins dynamically.\n //\n // @plugin (args) \"lib\";\n //\n plugin: function () {\n let path;\n let args;\n let options;\n const index = parserInput.i;\n const dir = parserInput.$re(/^@plugin?\\s+/);\n\n if (dir) {\n args = this.pluginArgs();\n\n if (args) {\n options = {\n pluginArgs: args,\n isPlugin: true\n };\n }\n else {\n options = { isPlugin: true };\n }\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon on @plugin');\n }\n return new(tree.Import)(path, null, options, index, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed @plugin statement');\n }\n }\n },\n\n pluginArgs: function() {\n // list of options, surrounded by parens\n parserInput.save();\n if (!parserInput.$char('(')) {\n parserInput.restore();\n return null;\n }\n const args = parserInput.$re(/^\\s*([^\\);]+)\\)\\s*/);\n if (args[1]) {\n parserInput.forget();\n return args[1].trim();\n }\n else { \n parserInput.restore();\n return null;\n }\n },\n\n //\n // A CSS AtRule\n //\n // @charset \"utf-8\";\n //\n atrule: function () {\n const index = parserInput.i;\n let name;\n let value;\n let rules;\n let nonVendorSpecificName;\n let hasIdentifier;\n let hasExpression;\n let hasUnknown;\n let hasBlock = true;\n let isRooted = true;\n\n if (parserInput.currentChar() !== '@') { return; }\n\n value = this['import']() || this.plugin() || this.media();\n if (value) {\n return value;\n }\n\n parserInput.save();\n\n name = parserInput.$re(/^@[a-z-]+/);\n\n if (!name) { return; }\n\n nonVendorSpecificName = name;\n if (name.charAt(1) == '-' && name.indexOf('-', 2) > 0) {\n nonVendorSpecificName = `@${name.slice(name.indexOf('-', 2) + 1)}`;\n }\n\n switch (nonVendorSpecificName) {\n case '@charset':\n hasIdentifier = true;\n hasBlock = false;\n break;\n case '@namespace':\n hasExpression = true;\n hasBlock = false;\n break;\n case '@keyframes':\n case '@counter-style':\n hasIdentifier = true;\n break;\n case '@document':\n case '@supports':\n hasUnknown = true;\n isRooted = false;\n break;\n default:\n hasUnknown = true;\n break;\n }\n\n parserInput.commentStore.length = 0;\n\n if (hasIdentifier) {\n value = this.entity();\n if (!value) {\n error(`expected ${name} identifier`);\n }\n } else if (hasExpression) {\n value = this.expression();\n if (!value) {\n error(`expected ${name} expression`);\n }\n } else if (hasUnknown) {\n value = this.permissiveValue(/^[{;]/);\n hasBlock = (parserInput.currentChar() === '{');\n if (!value) {\n if (!hasBlock && parserInput.currentChar() !== ';') {\n error(`${name} rule is missing block or ending semi-colon`);\n }\n }\n else if (!value.value) {\n value = null;\n }\n }\n\n if (hasBlock) {\n rules = this.blockRuleset();\n }\n\n if (rules || (!hasBlock && value && parserInput.$char(';'))) {\n parserInput.forget();\n return new(tree.AtRule)(name, value, rules, index, fileInfo,\n context.dumpLineNumbers ? getDebugInfo(index) : null,\n isRooted\n );\n }\n\n parserInput.restore('at-rule options not recognised');\n },\n\n //\n // A Value is a comma-delimited list of Expressions\n //\n // font-family: Baskerville, Georgia, serif;\n //\n // In a Rule, a Value represents everything after the `:`,\n // and before the `;`.\n //\n value: function () {\n let e;\n const expressions = [];\n const index = parserInput.i;\n\n do {\n e = this.expression();\n if (e) {\n expressions.push(e);\n if (!parserInput.$char(',')) { break; }\n }\n } while (e);\n\n if (expressions.length > 0) {\n return new(tree.Value)(expressions, index);\n }\n },\n important: function () {\n if (parserInput.currentChar() === '!') {\n return parserInput.$re(/^! *important/);\n }\n },\n sub: function () {\n let a;\n let e;\n\n parserInput.save();\n if (parserInput.$char('(')) {\n a = this.addition();\n if (a && parserInput.$char(')')) {\n parserInput.forget();\n e = new(tree.Expression)([a]);\n e.parens = true;\n return e;\n }\n parserInput.restore('Expected \\')\\'');\n return;\n }\n parserInput.restore();\n },\n multiplication: function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.operand();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1);\n while (true) {\n if (parserInput.peek(/^\\/[*\\/]/)) {\n break;\n }\n\n parserInput.save();\n\n op = parserInput.$char('/') || parserInput.$char('*') || parserInput.$str('./');\n\n if (!op) { parserInput.forget(); break; }\n\n a = this.operand();\n\n if (!a) { parserInput.restore(); break; }\n parserInput.forget();\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n isSpaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n addition: function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.multiplication();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1);\n while (true) {\n op = parserInput.$re(/^[-+]\\s+/) || (!isSpaced && (parserInput.$char('+') || parserInput.$char('-')));\n if (!op) {\n break;\n }\n a = this.multiplication();\n if (!a) {\n break;\n }\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n isSpaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n conditions: function () {\n let a;\n let b;\n const index = parserInput.i;\n let condition;\n\n a = this.condition(true);\n if (a) {\n while (true) {\n if (!parserInput.peek(/^,\\s*(not\\s*)?\\(/) || !parserInput.$char(',')) {\n break;\n }\n b = this.condition(true);\n if (!b) {\n break;\n }\n condition = new(tree.Condition)('or', condition || a, b, index);\n }\n return condition || a;\n }\n },\n condition: function (needsParens) {\n let result;\n let logical;\n let next;\n function or() {\n return parserInput.$str('or');\n }\n\n result = this.conditionAnd(needsParens);\n if (!result) {\n return ;\n }\n logical = or();\n if (logical) {\n next = this.condition(needsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n }\n }\n return result;\n },\n conditionAnd: function (needsParens) {\n let result;\n let logical;\n let next;\n const self = this;\n function insideCondition() {\n const cond = self.negatedCondition(needsParens) || self.parenthesisCondition(needsParens);\n if (!cond && !needsParens) {\n return self.atomicCondition(needsParens);\n }\n return cond;\n }\n function and() {\n return parserInput.$str('and');\n }\n\n result = insideCondition();\n if (!result) {\n return ;\n }\n logical = and();\n if (logical) {\n next = this.conditionAnd(needsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n }\n }\n return result;\n },\n negatedCondition: function (needsParens) {\n if (parserInput.$str('not')) {\n const result = this.parenthesisCondition(needsParens);\n if (result) {\n result.negate = !result.negate;\n }\n return result;\n }\n },\n parenthesisCondition: function (needsParens) {\n function tryConditionFollowedByParenthesis(me) {\n let body;\n parserInput.save();\n body = me.condition(needsParens);\n if (!body) {\n parserInput.restore();\n return ;\n }\n if (!parserInput.$char(')')) {\n parserInput.restore();\n return ;\n }\n parserInput.forget();\n return body;\n }\n\n let body;\n parserInput.save();\n if (!parserInput.$str('(')) {\n parserInput.restore();\n return ;\n }\n body = tryConditionFollowedByParenthesis(this);\n if (body) {\n parserInput.forget();\n return body;\n }\n\n body = this.atomicCondition(needsParens);\n if (!body) {\n parserInput.restore();\n return ;\n }\n if (!parserInput.$char(')')) {\n parserInput.restore(`expected ')' got '${parserInput.currentChar()}'`);\n return ;\n }\n parserInput.forget();\n return body;\n },\n atomicCondition: function (needsParens) {\n const entities = this.entities;\n const index = parserInput.i;\n let a;\n let b;\n let c;\n let op;\n\n function cond() {\n return this.addition() || entities.keyword() || entities.quoted() || entities.mixinLookup();\n }\n cond = cond.bind(this);\n\n a = cond();\n if (a) {\n if (parserInput.$char('>')) {\n if (parserInput.$char('=')) {\n op = '>=';\n } else {\n op = '>';\n }\n } else\n if (parserInput.$char('<')) {\n if (parserInput.$char('=')) {\n op = '<=';\n } else {\n op = '<';\n }\n } else\n if (parserInput.$char('=')) {\n if (parserInput.$char('>')) {\n op = '=>';\n } else if (parserInput.$char('<')) {\n op = '=<';\n } else {\n op = '=';\n }\n }\n if (op) {\n b = cond();\n if (b) {\n c = new(tree.Condition)(op, a, b, index, false);\n } else {\n error('expected expression');\n }\n } else {\n c = new(tree.Condition)('=', a, new(tree.Keyword)('true'), index, false);\n }\n return c;\n }\n },\n\n //\n // An operand is anything that can be part of an operation,\n // such as a Color, or a Variable\n //\n operand: function () {\n const entities = this.entities;\n let negate;\n\n if (parserInput.peek(/^-[@\\$\\(]/)) {\n negate = parserInput.$char('-');\n }\n\n let o = this.sub() || entities.dimension() ||\n entities.color() || entities.variable() ||\n entities.property() || entities.call() ||\n entities.quoted(true) || entities.colorKeyword() ||\n entities.mixinLookup();\n\n if (negate) {\n o.parensInOp = true;\n o = new(tree.Negative)(o);\n }\n\n return o;\n },\n\n //\n // Expressions either represent mathematical operations,\n // or white-space delimited Entities.\n //\n // 1px solid black\n // @var * 2\n //\n expression: function () {\n const entities = [];\n let e;\n let delim;\n const index = parserInput.i;\n\n do {\n e = this.comment();\n if (e) {\n entities.push(e);\n continue;\n }\n e = this.addition() || this.entity();\n\n if (e instanceof tree.Comment) {\n e = null;\n }\n\n if (e) {\n entities.push(e);\n // operations do not allow keyword \"/\" dimension (e.g. small/20px) so we support that here\n if (!parserInput.peek(/^\\/[\\/*]/)) {\n delim = parserInput.$char('/');\n if (delim) {\n entities.push(new(tree.Anonymous)(delim, index));\n }\n }\n }\n } while (e);\n if (entities.length > 0) {\n return new(tree.Expression)(entities);\n }\n },\n property: function () {\n const name = parserInput.$re(/^(\\*?-?[_a-zA-Z0-9-]+)\\s*:/);\n if (name) {\n return name[1];\n }\n },\n ruleProperty: function () {\n let name = [];\n const index = [];\n let s;\n let k;\n\n parserInput.save();\n\n const simpleProperty = parserInput.$re(/^([_a-zA-Z0-9-]+)\\s*:/);\n if (simpleProperty) {\n name = [new(tree.Keyword)(simpleProperty[1])];\n parserInput.forget();\n return name;\n }\n\n function match(re) {\n const i = parserInput.i;\n const chunk = parserInput.$re(re);\n if (chunk) {\n index.push(i);\n return name.push(chunk[1]);\n }\n }\n\n match(/^(\\*?)/);\n while (true) {\n if (!match(/^((?:[\\w-]+)|(?:[@\\$]\\{[\\w-]+\\}))/)) {\n break;\n }\n }\n\n if ((name.length > 1) && match(/^((?:\\+_|\\+)?)\\s*:/)) {\n parserInput.forget();\n\n // at last, we have the complete match now. move forward,\n // convert name particles to tree objects and return:\n if (name[0] === '') {\n name.shift();\n index.shift();\n }\n for (k = 0; k < name.length; k++) {\n s = name[k];\n name[k] = (s.charAt(0) !== '@' && s.charAt(0) !== '$') ?\n new(tree.Keyword)(s) :\n (s.charAt(0) === '@' ?\n new(tree.Variable)(`@${s.slice(2, -1)}`, index[k], fileInfo) :\n new(tree.Property)(`$${s.slice(2, -1)}`, index[k], fileInfo));\n }\n return name;\n }\n parserInput.restore();\n }\n }\n };\n};\nParser.serializeVars = vars => {\n let s = '';\n\n for (const name in vars) {\n if (Object.hasOwnProperty.call(vars, name)) {\n const value = vars[name];\n s += `${((name[0] === '@') ? '' : '@') + name}: ${value}${(String(value).slice(-1) === ';') ? '' : ';'}`;\n }\n }\n\n return s;\n};\n\nexport default Parser;\n","import Anonymous from '../tree/anonymous';\nimport Keyword from '../tree/keyword';\n\nfunction boolean(condition) {\n return condition ? Keyword.True : Keyword.False;\n}\n\n/**\n * Functions with evalArgs set to false are sent context\n * as the first argument.\n */\nfunction If(context, condition, trueValue, falseValue) {\n return condition.eval(context) ? trueValue.eval(context)\n : (falseValue ? falseValue.eval(context) : new Anonymous);\n}\nIf.evalArgs = false\n\nexport default { boolean, 'if': If };\n","import Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport Expression from '../tree/expression';\nimport Operation from '../tree/operation';\nlet colorFunctions;\n\nfunction clamp(val) {\n return Math.min(1, Math.max(0, val));\n}\nfunction hsla(origColor, hsl) {\n const color = colorFunctions.hsla(hsl.h, hsl.s, hsl.l, hsl.a);\n if (color) {\n if (origColor.value && \n /^(rgb|hsl)/.test(origColor.value)) {\n color.value = origColor.value;\n } else {\n color.value = 'rgb';\n }\n return color;\n }\n}\nfunction toHSL(color) {\n if (color.toHSL) {\n return color.toHSL();\n } else {\n throw new Error('Argument cannot be evaluated to a color');\n }\n}\n\nfunction toHSV(color) {\n if (color.toHSV) {\n return color.toHSV();\n } else {\n throw new Error('Argument cannot be evaluated to a color');\n }\n}\n\nfunction number(n) {\n if (n instanceof Dimension) {\n return parseFloat(n.unit.is('%') ? n.value / 100 : n.value);\n } else if (typeof n === 'number') {\n return n;\n } else {\n throw {\n type: 'Argument',\n message: 'color functions take numbers as parameters'\n };\n }\n}\nfunction scaled(n, size) {\n if (n instanceof Dimension && n.unit.is('%')) {\n return parseFloat(n.value * size / 100);\n } else {\n return number(n);\n }\n}\ncolorFunctions = {\n rgb: function (r, g, b) {\n let a = 1\n /**\n * Comma-less syntax\n * e.g. rgb(0 128 255 / 50%)\n */\n if (r instanceof Expression) {\n const val = r.value\n r = val[0]\n g = val[1]\n b = val[2]\n /** \n * @todo - should this be normalized in\n * function caller? Or parsed differently?\n */\n if (b instanceof Operation) {\n const op = b\n b = op.operands[0]\n a = op.operands[1]\n }\n }\n const color = colorFunctions.rgba(r, g, b, a);\n if (color) {\n color.value = 'rgb';\n return color;\n }\n },\n rgba: function (r, g, b, a) {\n try {\n if (r instanceof Color) {\n if (g) {\n a = number(g);\n } else {\n a = r.alpha;\n }\n return new Color(r.rgb, a, 'rgba');\n }\n const rgb = [r, g, b].map(c => scaled(c, 255));\n a = number(a);\n return new Color(rgb, a, 'rgba');\n }\n catch (e) {}\n },\n hsl: function (h, s, l) {\n let a = 1\n if (h instanceof Expression) {\n const val = h.value\n h = val[0]\n s = val[1]\n l = val[2]\n\n if (l instanceof Operation) {\n const op = l\n l = op.operands[0]\n a = op.operands[1]\n }\n }\n const color = colorFunctions.hsla(h, s, l, a);\n if (color) {\n color.value = 'hsl';\n return color;\n }\n },\n hsla: function (h, s, l, a) {\n try {\n if (h instanceof Color) {\n if (s) {\n a = number(s);\n } else {\n a = h.alpha;\n }\n return new Color(h.rgb, a, 'hsla');\n }\n\n let m1;\n let m2;\n\n function hue(h) {\n h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h);\n if (h * 6 < 1) {\n return m1 + (m2 - m1) * h * 6;\n }\n else if (h * 2 < 1) {\n return m2;\n }\n else if (h * 3 < 2) {\n return m1 + (m2 - m1) * (2 / 3 - h) * 6;\n }\n else {\n return m1;\n }\n }\n\n h = (number(h) % 360) / 360;\n s = clamp(number(s));l = clamp(number(l));a = clamp(number(a));\n\n m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n m1 = l * 2 - m2;\n\n const rgb = [\n hue(h + 1 / 3) * 255,\n hue(h) * 255,\n hue(h - 1 / 3) * 255\n ];\n a = number(a);\n return new Color(rgb, a, 'hsla');\n }\n catch (e) {}\n },\n\n hsv: function(h, s, v) {\n return colorFunctions.hsva(h, s, v, 1.0);\n },\n\n hsva: function(h, s, v, a) {\n h = ((number(h) % 360) / 360) * 360;\n s = number(s);v = number(v);a = number(a);\n\n let i;\n let f;\n i = Math.floor((h / 60) % 6);\n f = (h / 60) - i;\n\n const vs = [v,\n v * (1 - s),\n v * (1 - f * s),\n v * (1 - (1 - f) * s)];\n const perm = [[0, 3, 1],\n [2, 0, 1],\n [1, 0, 3],\n [1, 2, 0],\n [3, 1, 0],\n [0, 1, 2]];\n\n return colorFunctions.rgba(vs[perm[i][0]] * 255,\n vs[perm[i][1]] * 255,\n vs[perm[i][2]] * 255,\n a);\n },\n\n hue: function (color) {\n return new Dimension(toHSL(color).h);\n },\n saturation: function (color) {\n return new Dimension(toHSL(color).s * 100, '%');\n },\n lightness: function (color) {\n return new Dimension(toHSL(color).l * 100, '%');\n },\n hsvhue: function(color) {\n return new Dimension(toHSV(color).h);\n },\n hsvsaturation: function (color) {\n return new Dimension(toHSV(color).s * 100, '%');\n },\n hsvvalue: function (color) {\n return new Dimension(toHSV(color).v * 100, '%');\n },\n red: function (color) {\n return new Dimension(color.rgb[0]);\n },\n green: function (color) {\n return new Dimension(color.rgb[1]);\n },\n blue: function (color) {\n return new Dimension(color.rgb[2]);\n },\n alpha: function (color) {\n return new Dimension(toHSL(color).a);\n },\n luma: function (color) {\n return new Dimension(color.luma() * color.alpha * 100, '%');\n },\n luminance: function (color) {\n const luminance =\n (0.2126 * color.rgb[0] / 255) +\n (0.7152 * color.rgb[1] / 255) +\n (0.0722 * color.rgb[2] / 255);\n\n return new Dimension(luminance * color.alpha * 100, '%');\n },\n saturate: function (color, amount, method) {\n // filter: saturate(3.2);\n // should be kept as is, so check for color\n if (!color.rgb) {\n return null;\n }\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.s += hsl.s * amount.value / 100;\n }\n else {\n hsl.s += amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n return hsla(color, hsl);\n },\n desaturate: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.s -= hsl.s * amount.value / 100;\n }\n else {\n hsl.s -= amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n return hsla(color, hsl);\n },\n lighten: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.l += hsl.l * amount.value / 100;\n }\n else {\n hsl.l += amount.value / 100;\n }\n hsl.l = clamp(hsl.l);\n return hsla(color, hsl);\n },\n darken: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.l -= hsl.l * amount.value / 100;\n }\n else {\n hsl.l -= amount.value / 100;\n }\n hsl.l = clamp(hsl.l);\n return hsla(color, hsl);\n },\n fadein: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.a += hsl.a * amount.value / 100;\n }\n else {\n hsl.a += amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fadeout: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.a -= hsl.a * amount.value / 100;\n }\n else {\n hsl.a -= amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fade: function (color, amount) {\n const hsl = toHSL(color);\n\n hsl.a = amount.value / 100;\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n spin: function (color, amount) {\n const hsl = toHSL(color);\n const hue = (hsl.h + amount.value) % 360;\n\n hsl.h = hue < 0 ? 360 + hue : hue;\n\n return hsla(color, hsl);\n },\n //\n // Copyright (c) 2006-2009 Hampton Catlin, Natalie Weizenbaum, and Chris Eppstein\n // http://sass-lang.com\n //\n mix: function (color1, color2, weight) {\n if (!weight) {\n weight = new Dimension(50);\n }\n const p = weight.value / 100.0;\n const w = p * 2 - 1;\n const a = toHSL(color1).a - toHSL(color2).a;\n\n const w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n const w2 = 1 - w1;\n\n const rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2,\n color1.rgb[1] * w1 + color2.rgb[1] * w2,\n color1.rgb[2] * w1 + color2.rgb[2] * w2];\n\n const alpha = color1.alpha * p + color2.alpha * (1 - p);\n\n return new Color(rgb, alpha);\n },\n greyscale: function (color) {\n return colorFunctions.desaturate(color, new Dimension(100));\n },\n contrast: function (color, dark, light, threshold) {\n // filter: contrast(3.2);\n // should be kept as is, so check for color\n if (!color.rgb) {\n return null;\n }\n if (typeof light === 'undefined') {\n light = colorFunctions.rgba(255, 255, 255, 1.0);\n }\n if (typeof dark === 'undefined') {\n dark = colorFunctions.rgba(0, 0, 0, 1.0);\n }\n // Figure out which is actually light and dark:\n if (dark.luma() > light.luma()) {\n const t = light;\n light = dark;\n dark = t;\n }\n if (typeof threshold === 'undefined') {\n threshold = 0.43;\n } else {\n threshold = number(threshold);\n }\n if (color.luma() < threshold) {\n return light;\n } else {\n return dark;\n }\n },\n // Changes made in 2.7.0 - Reverted in 3.0.0\n // contrast: function (color, color1, color2, threshold) {\n // // Return which of `color1` and `color2` has the greatest contrast with `color`\n // // according to the standard WCAG contrast ratio calculation.\n // // http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n // // The threshold param is no longer used, in line with SASS.\n // // filter: contrast(3.2);\n // // should be kept as is, so check for color\n // if (!color.rgb) {\n // return null;\n // }\n // if (typeof color1 === 'undefined') {\n // color1 = colorFunctions.rgba(0, 0, 0, 1.0);\n // }\n // if (typeof color2 === 'undefined') {\n // color2 = colorFunctions.rgba(255, 255, 255, 1.0);\n // }\n // var contrast1, contrast2;\n // var luma = color.luma();\n // var luma1 = color1.luma();\n // var luma2 = color2.luma();\n // // Calculate contrast ratios for each color\n // if (luma > luma1) {\n // contrast1 = (luma + 0.05) / (luma1 + 0.05);\n // } else {\n // contrast1 = (luma1 + 0.05) / (luma + 0.05);\n // }\n // if (luma > luma2) {\n // contrast2 = (luma + 0.05) / (luma2 + 0.05);\n // } else {\n // contrast2 = (luma2 + 0.05) / (luma + 0.05);\n // }\n // if (contrast1 > contrast2) {\n // return color1;\n // } else {\n // return color2;\n // }\n // },\n argb: function (color) {\n return new Anonymous(color.toARGB());\n },\n color: function(c) {\n if ((c instanceof Quoted) &&\n (/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})$/i.test(c.value))) {\n const val = c.value.slice(1);\n return new Color(val, undefined, `#${val}`);\n }\n if ((c instanceof Color) || (c = Color.fromKeyword(c.value))) {\n c.value = undefined;\n return c;\n }\n throw {\n type: 'Argument',\n message: 'argument must be a color keyword or 3|4|6|8 digit hex e.g. #FFF'\n };\n },\n tint: function(color, amount) {\n return colorFunctions.mix(colorFunctions.rgb(255, 255, 255), color, amount);\n },\n shade: function(color, amount) {\n return colorFunctions.mix(colorFunctions.rgb(0, 0, 0), color, amount);\n }\n};\n\nexport default colorFunctions;\n","import Color from '../tree/color';\n\n// Color Blending\n// ref: http://www.w3.org/TR/compositing-1\n\nfunction colorBlend(mode, color1, color2) {\n const ab = color1.alpha; // result\n\n let // backdrop\n cb;\n\n const as = color2.alpha;\n\n let // source\n cs;\n\n let ar;\n let cr;\n const r = [];\n\n ar = as + ab * (1 - as);\n for (let i = 0; i < 3; i++) {\n cb = color1.rgb[i] / 255;\n cs = color2.rgb[i] / 255;\n cr = mode(cb, cs);\n if (ar) {\n cr = (as * cs + ab * (cb -\n as * (cb + cs - cr))) / ar;\n }\n r[i] = cr * 255;\n }\n\n return new Color(r, ar);\n}\n\nconst colorBlendModeFunctions = {\n multiply: function(cb, cs) {\n return cb * cs;\n },\n screen: function(cb, cs) {\n return cb + cs - cb * cs;\n },\n overlay: function(cb, cs) {\n cb *= 2;\n return (cb <= 1) ?\n colorBlendModeFunctions.multiply(cb, cs) :\n colorBlendModeFunctions.screen(cb - 1, cs);\n },\n softlight: function(cb, cs) {\n let d = 1;\n let e = cb;\n if (cs > 0.5) {\n e = 1;\n d = (cb > 0.25) ? Math.sqrt(cb)\n : ((16 * cb - 12) * cb + 4) * cb;\n }\n return cb - (1 - 2 * cs) * e * (d - cb);\n },\n hardlight: function(cb, cs) {\n return colorBlendModeFunctions.overlay(cs, cb);\n },\n difference: function(cb, cs) {\n return Math.abs(cb - cs);\n },\n exclusion: function(cb, cs) {\n return cb + cs - 2 * cb * cs;\n },\n\n // non-w3c functions:\n average: function(cb, cs) {\n return (cb + cs) / 2;\n },\n negation: function(cb, cs) {\n return 1 - Math.abs(cb + cs - 1);\n }\n};\n\nfor (const f in colorBlendModeFunctions) {\n if (colorBlendModeFunctions.hasOwnProperty(f)) {\n colorBlend[f] = colorBlend.bind(null, colorBlendModeFunctions[f]);\n }\n}\n\nexport default colorBlend;\n","import Comment from '../tree/comment';\nimport Node from '../tree/node';\nimport Dimension from '../tree/dimension';\nimport Declaration from '../tree/declaration';\nimport Expression from '../tree/expression';\nimport Ruleset from '../tree/ruleset';\nimport Selector from '../tree/selector';\nimport Element from '../tree/element';\nimport Quote from '../tree/quoted';\nimport Value from '../tree/value';\n\nconst getItemsFromNode = node => {\n // handle non-array values as an array of length 1\n // return 'undefined' if index is invalid\n const items = Array.isArray(node.value) ?\n node.value : Array(node);\n\n return items;\n};\n\nexport default {\n _SELF: function(n) {\n return n;\n },\n '~': function(...expr) {\n if (expr.length === 1) {\n return expr[0];\n }\n return new Value(expr);\n },\n extract: function(values, index) {\n // (1-based index)\n index = index.value - 1;\n\n return getItemsFromNode(values)[index];\n },\n length: function(values) {\n return new Dimension(getItemsFromNode(values).length);\n },\n /**\n * Creates a Less list of incremental values.\n * Modeled after Lodash's range function, also exists natively in PHP\n * \n * @param {Dimension} [start=1]\n * @param {Dimension} end - e.g. 10 or 10px - unit is added to output\n * @param {Dimension} [step=1] \n */\n range: function(start, end, step) {\n let from;\n let to;\n let stepValue = 1;\n const list = [];\n if (end) {\n to = end;\n from = start.value;\n if (step) {\n stepValue = step.value;\n }\n }\n else {\n from = 1;\n to = start;\n }\n\n for (let i = from; i <= to.value; i += stepValue) {\n list.push(new Dimension(i, to.unit));\n }\n\n return new Expression(list);\n },\n each: function(list, rs) {\n const rules = [];\n let newRules;\n let iterator;\n\n const tryEval = val => {\n if (val instanceof Node) {\n return val.eval(this.context);\n }\n return val;\n };\n\n if (list.value && !(list instanceof Quote)) {\n if (Array.isArray(list.value)) {\n iterator = list.value.map(tryEval);\n } else {\n iterator = [tryEval(list.value)];\n }\n } else if (list.ruleset) {\n iterator = tryEval(list.ruleset).rules;\n } else if (list.rules) {\n iterator = list.rules.map(tryEval);\n } else if (Array.isArray(list)) {\n iterator = list.map(tryEval);\n } else {\n iterator = [tryEval(list)];\n }\n\n let valueName = '@value';\n let keyName = '@key';\n let indexName = '@index';\n\n if (rs.params) {\n valueName = rs.params[0] && rs.params[0].name;\n keyName = rs.params[1] && rs.params[1].name;\n indexName = rs.params[2] && rs.params[2].name;\n rs = rs.rules;\n } else {\n rs = rs.ruleset;\n }\n\n for (let i = 0; i < iterator.length; i++) {\n let key;\n let value;\n const item = iterator[i];\n if (item instanceof Declaration) {\n key = typeof item.name === 'string' ? item.name : item.name[0].value;\n value = item.value;\n } else {\n key = new Dimension(i + 1);\n value = item;\n }\n\n if (item instanceof Comment) {\n continue;\n }\n\n newRules = rs.rules.slice(0);\n if (valueName) {\n newRules.push(new Declaration(valueName,\n value,\n false, false, this.index, this.currentFileInfo));\n }\n if (indexName) {\n newRules.push(new Declaration(indexName,\n new Dimension(i + 1),\n false, false, this.index, this.currentFileInfo));\n }\n if (keyName) {\n newRules.push(new Declaration(keyName,\n key,\n false, false, this.index, this.currentFileInfo));\n }\n\n rules.push(new Ruleset([ new(Selector)([ new Element(\"\", '&') ]) ],\n newRules,\n rs.strictImports,\n rs.visibilityInfo()\n ));\n }\n\n return new Ruleset([ new(Selector)([ new Element(\"\", '&') ]) ],\n rules,\n rs.strictImports,\n rs.visibilityInfo()\n ).eval(this.context);\n }\n};\n","import Dimension from '../tree/dimension';\n\nconst MathHelper = (fn, unit, n) => {\n if (!(n instanceof Dimension)) {\n throw { type: 'Argument', message: 'argument must be a number' };\n }\n if (unit == null) {\n unit = n.unit;\n } else {\n n = n.unify();\n }\n return new Dimension(fn(parseFloat(n.value)), unit);\n};\n\nexport default MathHelper;","import mathHelper from './math-helper.js';\n\nconst mathFunctions = {\n // name, unit\n ceil: null,\n floor: null,\n sqrt: null,\n abs: null,\n tan: '',\n sin: '',\n cos: '',\n atan: 'rad',\n asin: 'rad',\n acos: 'rad'\n};\n\nfor (const f in mathFunctions) {\n if (mathFunctions.hasOwnProperty(f)) {\n mathFunctions[f] = mathHelper.bind(null, Math[f], mathFunctions[f]);\n }\n}\n\nmathFunctions.round = (n, f) => {\n const fraction = typeof f === 'undefined' ? 0 : f.value;\n return mathHelper(num => num.toFixed(fraction), null, n);\n};\n\nexport default mathFunctions;\n","import Dimension from '../tree/dimension';\nimport Anonymous from '../tree/anonymous';\nimport mathHelper from './math-helper.js';\n\nconst minMax = function (isMin, args) {\n args = Array.prototype.slice.call(args);\n switch (args.length) {\n case 0: throw { type: 'Argument', message: 'one or more arguments required' };\n }\n let i; // key is the unit.toString() for unified Dimension values,\n let j;\n let current;\n let currentUnified;\n let referenceUnified;\n let unit;\n let unitStatic;\n let unitClone;\n\n const // elems only contains original argument values.\n order = [];\n\n const values = {};\n // value is the index into the order array.\n for (i = 0; i < args.length; i++) {\n current = args[i];\n if (!(current instanceof Dimension)) {\n if (Array.isArray(args[i].value)) {\n Array.prototype.push.apply(args, Array.prototype.slice.call(args[i].value));\n }\n continue;\n }\n currentUnified = current.unit.toString() === '' && unitClone !== undefined ? new Dimension(current.value, unitClone).unify() : current.unify();\n unit = currentUnified.unit.toString() === '' && unitStatic !== undefined ? unitStatic : currentUnified.unit.toString();\n unitStatic = unit !== '' && unitStatic === undefined || unit !== '' && order[0].unify().unit.toString() === '' ? unit : unitStatic;\n unitClone = unit !== '' && unitClone === undefined ? current.unit.toString() : unitClone;\n j = values[''] !== undefined && unit !== '' && unit === unitStatic ? values[''] : values[unit];\n if (j === undefined) {\n if (unitStatic !== undefined && unit !== unitStatic) {\n throw { type: 'Argument', message: 'incompatible types' };\n }\n values[unit] = order.length;\n order.push(current);\n continue;\n }\n referenceUnified = order[j].unit.toString() === '' && unitClone !== undefined ? new Dimension(order[j].value, unitClone).unify() : order[j].unify();\n if ( isMin && currentUnified.value < referenceUnified.value ||\n !isMin && currentUnified.value > referenceUnified.value) {\n order[j] = current;\n }\n }\n if (order.length == 1) {\n return order[0];\n }\n args = order.map(function (a) { return a.toCSS(this.context); }).join(this.context.compress ? ',' : ', ');\n return new Anonymous(`${isMin ? 'min' : 'max'}(${args})`);\n};\n\nexport default {\n min: function(...args) {\n try {\n return minMax(true, args);\n } catch (e) {}\n },\n max: function(...args) {\n try {\n return minMax(false, args);\n } catch (e) {}\n },\n convert: function (val, unit) {\n return val.convertTo(unit.value);\n },\n pi: function () {\n return new Dimension(Math.PI);\n },\n mod: function(a, b) {\n return new Dimension(a.value % b.value, a.unit);\n },\n pow: function(x, y) {\n if (typeof x === 'number' && typeof y === 'number') {\n x = new Dimension(x);\n y = new Dimension(y);\n } else if (!(x instanceof Dimension) || !(y instanceof Dimension)) {\n throw { type: 'Argument', message: 'arguments must be numbers' };\n }\n\n return new Dimension(Math.pow(x.value, y.value), x.unit);\n },\n percentage: function (n) {\n const result = mathHelper(num => num * 100, '%', n);\n\n return result;\n }\n};\n","import Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport JavaScript from '../tree/javascript';\n\nexport default {\n e: function (str) {\n return new Quoted('\"', str instanceof JavaScript ? str.evaluated : str.value, true);\n },\n escape: function (str) {\n return new Anonymous(\n encodeURI(str.value).replace(/=/g, '%3D').replace(/:/g, '%3A').replace(/#/g, '%23').replace(/;/g, '%3B')\n .replace(/\\(/g, '%28').replace(/\\)/g, '%29'));\n },\n replace: function (string, pattern, replacement, flags) {\n let result = string.value;\n replacement = (replacement.type === 'Quoted') ?\n replacement.value : replacement.toCSS();\n result = result.replace(new RegExp(pattern.value, flags ? flags.value : ''), replacement);\n return new Quoted(string.quote || '', result, string.escaped);\n },\n '%': function (string /* arg, arg, ... */) {\n const args = Array.prototype.slice.call(arguments, 1);\n let result = string.value;\n\n for (let i = 0; i < args.length; i++) {\n /* jshint loopfunc:true */\n result = result.replace(/%[sda]/i, token => {\n const value = ((args[i].type === 'Quoted') &&\n token.match(/s/i)) ? args[i].value : args[i].toCSS();\n return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value;\n });\n }\n result = result.replace(/%%/g, '%');\n return new Quoted(string.quote || '', result, string.escaped);\n }\n};\n","import Keyword from '../tree/keyword';\nimport DetachedRuleset from '../tree/detached-ruleset';\nimport Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport URL from '../tree/url';\nimport Operation from '../tree/operation';\n\nconst isa = (n, Type) => (n instanceof Type) ? Keyword.True : Keyword.False;\nconst isunit = (n, unit) => {\n if (unit === undefined) {\n throw { type: 'Argument', message: 'missing the required second argument to isunit.' };\n }\n unit = typeof unit.value === 'string' ? unit.value : unit;\n if (typeof unit !== 'string') {\n throw { type: 'Argument', message: 'Second argument to isunit should be a unit or a string.' };\n }\n return (n instanceof Dimension) && n.unit.is(unit) ? Keyword.True : Keyword.False;\n};\n\nexport default {\n isruleset: function (n) {\n return isa(n, DetachedRuleset);\n },\n iscolor: function (n) {\n return isa(n, Color);\n },\n isnumber: function (n) {\n return isa(n, Dimension);\n },\n isstring: function (n) {\n return isa(n, Quoted);\n },\n iskeyword: function (n) {\n return isa(n, Keyword);\n },\n isurl: function (n) {\n return isa(n, URL);\n },\n ispixel: function (n) {\n return isunit(n, 'px');\n },\n ispercentage: function (n) {\n return isunit(n, '%');\n },\n isem: function (n) {\n return isunit(n, 'em');\n },\n isunit,\n unit: function (val, unit) {\n if (!(val instanceof Dimension)) {\n throw { type: 'Argument',\n message: `the first argument to unit must be a number${val instanceof Operation ? '. Have you forgotten parenthesis?' : ''}` };\n }\n if (unit) {\n if (unit instanceof Keyword) {\n unit = unit.value;\n } else {\n unit = unit.toCSS();\n }\n } else {\n unit = '';\n }\n return new Dimension(val.value, unit);\n },\n 'get-unit': function (n) {\n return new Anonymous(n.unit);\n }\n};\n","import functionRegistry from './function-registry';\nimport functionCaller from './function-caller';\n\nimport boolean from './boolean';\nimport defaultFunc from './default';\nimport color from './color';\nimport colorBlending from './color-blending';\nimport dataUri from './data-uri';\nimport list from './list';\nimport math from './math';\nimport number from './number';\nimport string from './string';\nimport svg from './svg';\nimport types from './types';\n\nexport default environment => {\n const functions = { functionRegistry, functionCaller };\n\n // register functions\n functionRegistry.addMultiple(boolean);\n functionRegistry.add('default', defaultFunc.eval.bind(defaultFunc));\n functionRegistry.addMultiple(color);\n functionRegistry.addMultiple(colorBlending);\n functionRegistry.addMultiple(dataUri(environment));\n functionRegistry.addMultiple(list);\n functionRegistry.addMultiple(math);\n functionRegistry.addMultiple(number);\n functionRegistry.addMultiple(string);\n functionRegistry.addMultiple(svg(environment));\n functionRegistry.addMultiple(types);\n\n return functions;\n};\n","import Quoted from '../tree/quoted';\nimport URL from '../tree/url';\nimport * as utils from '../utils';\nimport logger from '../logger';\n\nexport default environment => {\n \n const fallback = (functionThis, node) => new URL(node, functionThis.index, functionThis.currentFileInfo).eval(functionThis.context); \n\n return { 'data-uri': function(mimetypeNode, filePathNode) {\n\n if (!filePathNode) {\n filePathNode = mimetypeNode;\n mimetypeNode = null;\n }\n\n let mimetype = mimetypeNode && mimetypeNode.value;\n let filePath = filePathNode.value;\n const currentFileInfo = this.currentFileInfo;\n const currentDirectory = currentFileInfo.rewriteUrls ?\n currentFileInfo.currentDirectory : currentFileInfo.entryPath;\n\n const fragmentStart = filePath.indexOf('#');\n let fragment = '';\n if (fragmentStart !== -1) {\n fragment = filePath.slice(fragmentStart);\n filePath = filePath.slice(0, fragmentStart);\n }\n const context = utils.clone(this.context);\n context.rawBuffer = true;\n\n const fileManager = environment.getFileManager(filePath, currentDirectory, context, environment, true);\n\n if (!fileManager) {\n return fallback(this, filePathNode);\n }\n\n let useBase64 = false;\n\n // detect the mimetype if not given\n if (!mimetypeNode) {\n\n mimetype = environment.mimeLookup(filePath);\n\n if (mimetype === 'image/svg+xml') {\n useBase64 = false;\n } else {\n // use base 64 unless it's an ASCII or UTF-8 format\n const charset = environment.charsetLookup(mimetype);\n useBase64 = ['US-ASCII', 'UTF-8'].indexOf(charset) < 0;\n }\n if (useBase64) { mimetype += ';base64'; }\n }\n else {\n useBase64 = /;base64$/.test(mimetype);\n }\n\n const fileSync = fileManager.loadFileSync(filePath, currentDirectory, context, environment);\n if (!fileSync.contents) {\n logger.warn(`Skipped data-uri embedding of ${filePath} because file not found`);\n return fallback(this, filePathNode || mimetypeNode);\n }\n let buf = fileSync.contents;\n if (useBase64 && !environment.encodeBase64) {\n return fallback(this, filePathNode);\n }\n\n buf = useBase64 ? environment.encodeBase64(buf) : encodeURIComponent(buf);\n\n const uri = `data:${mimetype},${buf}${fragment}`;\n\n return new URL(new Quoted(`\"${uri}\"`, uri, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n }};\n};\n","import Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Expression from '../tree/expression';\nimport Quoted from '../tree/quoted';\nimport URL from '../tree/url';\n\nexport default environment => {\n return { 'svg-gradient': function(direction) {\n let stops;\n let gradientDirectionSvg;\n let gradientType = 'linear';\n let rectangleDimension = 'x=\"0\" y=\"0\" width=\"1\" height=\"1\"';\n const renderEnv = {compress: false};\n let returner;\n const directionValue = direction.toCSS(renderEnv);\n let i;\n let color;\n let position;\n let positionValue;\n let alpha;\n\n function throwArgumentDescriptor() {\n throw { type: 'Argument',\n message: 'svg-gradient expects direction, start_color [start_position], [color position,]...,' +\n ' end_color [end_position] or direction, color list' };\n }\n\n if (arguments.length == 2) {\n if (arguments[1].value.length < 2) {\n throwArgumentDescriptor();\n }\n stops = arguments[1].value;\n } else if (arguments.length < 3) {\n throwArgumentDescriptor();\n } else {\n stops = Array.prototype.slice.call(arguments, 1);\n }\n\n switch (directionValue) {\n case 'to bottom':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\"';\n break;\n case 'to right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'to bottom right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\"';\n break;\n case 'to top right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"100%\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'ellipse':\n case 'ellipse at center':\n gradientType = 'radial';\n gradientDirectionSvg = 'cx=\"50%\" cy=\"50%\" r=\"75%\"';\n rectangleDimension = 'x=\"-50\" y=\"-50\" width=\"101\" height=\"101\"';\n break;\n default:\n throw { type: 'Argument', message: 'svg-gradient direction must be \\'to bottom\\', \\'to right\\',' +\n ' \\'to bottom right\\', \\'to top right\\' or \\'ellipse at center\\'' };\n }\n returner = `<${gradientType}Gradient id=\"g\" ${gradientDirectionSvg}>`;\n\n for (i = 0; i < stops.length; i += 1) {\n if (stops[i] instanceof Expression) {\n color = stops[i].value[0];\n position = stops[i].value[1];\n } else {\n color = stops[i];\n position = undefined;\n }\n\n if (!(color instanceof Color) || (!((i === 0 || i + 1 === stops.length) && position === undefined) && !(position instanceof Dimension))) {\n throwArgumentDescriptor();\n }\n positionValue = position ? position.toCSS(renderEnv) : i === 0 ? '0%' : '100%';\n alpha = color.alpha;\n returner += ``;\n }\n returner += ``;\n\n returner = encodeURIComponent(returner);\n\n returner = `data:image/svg+xml,${returner}`;\n return new URL(new Quoted(`'${returner}'`, returner, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n }};\n};\n","import contexts from './contexts';\nimport visitor from './visitors';\nimport tree from './tree';\n\nexport default function(root, options) {\n options = options || {};\n let evaldRoot;\n let variables = options.variables;\n const evalEnv = new contexts.Eval(options);\n\n //\n // Allows setting variables with a hash, so:\n //\n // `{ color: new tree.Color('#f01') }` will become:\n //\n // new tree.Declaration('@color',\n // new tree.Value([\n // new tree.Expression([\n // new tree.Color('#f01')\n // ])\n // ])\n // )\n //\n if (typeof variables === 'object' && !Array.isArray(variables)) {\n variables = Object.keys(variables).map(function (k) {\n let value = variables[k];\n\n if (!(value instanceof tree.Value)) {\n if (!(value instanceof tree.Expression)) {\n value = new tree.Expression([value]);\n }\n value = new tree.Value([value]);\n }\n return new tree.Declaration(`@${k}`, value, false, null, 0);\n });\n evalEnv.frames = [new tree.Ruleset(null, variables)];\n }\n\n const visitors = [\n new visitor.JoinSelectorVisitor(),\n new visitor.MarkVisibleSelectorsVisitor(true),\n new visitor.ExtendVisitor(),\n new visitor.ToCSSVisitor({compress: Boolean(options.compress)})\n ];\n\n const preEvalVisitors = [];\n let v;\n let visitorIterator;\n\n /**\n * first() / get() allows visitors to be added while visiting\n * \n * @todo Add scoping for visitors just like functions for @plugin; right now they're global\n */\n if (options.pluginManager) {\n visitorIterator = options.pluginManager.visitor();\n for (var i = 0; i < 2; i++) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (v.isPreEvalVisitor) {\n if (i === 0 || preEvalVisitors.indexOf(v) === -1) {\n preEvalVisitors.push(v);\n v.run(root);\n }\n }\n else {\n if (i === 0 || visitors.indexOf(v) === -1) {\n if (v.isPreVisitor) {\n visitors.unshift(v);\n }\n else {\n visitors.push(v);\n }\n }\n }\n }\n }\n }\n\n evaldRoot = root.eval(evalEnv);\n\n for (var i = 0; i < visitors.length; i++) {\n visitors[i].run(evaldRoot);\n }\n\n // Run any remaining visitors added after eval pass\n if (options.pluginManager) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (visitors.indexOf(v) === -1 && preEvalVisitors.indexOf(v) === -1) {\n v.run(evaldRoot);\n }\n }\n }\n\n return evaldRoot;\n};\n","/**\n * Plugin Manager\n */\nclass PluginManager {\n constructor(less) {\n this.less = less;\n this.visitors = [];\n this.preProcessors = [];\n this.postProcessors = [];\n this.installedPlugins = [];\n this.fileManagers = [];\n this.iterator = -1;\n this.pluginCache = {};\n this.Loader = new less.PluginLoader(less);\n }\n\n /**\n * Adds all the plugins in the array\n * @param {Array} plugins\n */\n addPlugins(plugins) {\n if (plugins) {\n for (let i = 0; i < plugins.length; i++) {\n this.addPlugin(plugins[i]);\n }\n }\n }\n\n /**\n *\n * @param plugin\n * @param {String} filename\n */\n addPlugin(plugin, filename, functionRegistry) {\n this.installedPlugins.push(plugin);\n if (filename) {\n this.pluginCache[filename] = plugin;\n }\n if (plugin.install) {\n plugin.install(this.less, this, functionRegistry || this.less.functions.functionRegistry);\n }\n }\n\n /**\n *\n * @param filename\n */\n get(filename) {\n return this.pluginCache[filename];\n }\n\n /**\n * Adds a visitor. The visitor object has options on itself to determine\n * when it should run.\n * @param visitor\n */\n addVisitor(visitor) {\n this.visitors.push(visitor);\n }\n\n /**\n * Adds a pre processor object\n * @param {object} preProcessor\n * @param {number} priority - guidelines 1 = before import, 1000 = import, 2000 = after import\n */\n addPreProcessor(preProcessor, priority) {\n let indexToInsertAt;\n for (indexToInsertAt = 0; indexToInsertAt < this.preProcessors.length; indexToInsertAt++) {\n if (this.preProcessors[indexToInsertAt].priority >= priority) {\n break;\n }\n }\n this.preProcessors.splice(indexToInsertAt, 0, {preProcessor, priority});\n }\n\n /**\n * Adds a post processor object\n * @param {object} postProcessor\n * @param {number} priority - guidelines 1 = before compression, 1000 = compression, 2000 = after compression\n */\n addPostProcessor(postProcessor, priority) {\n let indexToInsertAt;\n for (indexToInsertAt = 0; indexToInsertAt < this.postProcessors.length; indexToInsertAt++) {\n if (this.postProcessors[indexToInsertAt].priority >= priority) {\n break;\n }\n }\n this.postProcessors.splice(indexToInsertAt, 0, {postProcessor, priority});\n }\n\n /**\n *\n * @param manager\n */\n addFileManager(manager) {\n this.fileManagers.push(manager);\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getPreProcessors() {\n const preProcessors = [];\n for (let i = 0; i < this.preProcessors.length; i++) {\n preProcessors.push(this.preProcessors[i].preProcessor);\n }\n return preProcessors;\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getPostProcessors() {\n const postProcessors = [];\n for (let i = 0; i < this.postProcessors.length; i++) {\n postProcessors.push(this.postProcessors[i].postProcessor);\n }\n return postProcessors;\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getVisitors() {\n return this.visitors;\n }\n\n visitor() {\n const self = this;\n return {\n first: function() {\n self.iterator = -1;\n return self.visitors[self.iterator];\n },\n get: function() {\n self.iterator += 1;\n return self.visitors[self.iterator];\n }\n };\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getFileManagers() {\n return this.fileManagers;\n }\n}\n\nlet pm;\n\nconst PluginManagerFactory = function(less, newFactory) {\n if (newFactory || !pm) {\n pm = new PluginManager(less);\n }\n return pm;\n};\n\n//\nexport default PluginManagerFactory;\n","/* global window, XMLHttpRequest */\n\nimport AbstractFileManager from '../less/environment/abstract-file-manager.js';\n\nlet options;\nlet logger;\nlet fileCache = {};\n\n// TODOS - move log somewhere. pathDiff and doing something similar in node. use pathDiff in the other browser file for the initial load\nclass FileManager extends AbstractFileManager {\n alwaysMakePathsAbsolute() {\n return true;\n }\n\n join(basePath, laterPath) {\n if (!basePath) {\n return laterPath;\n }\n return this.extractUrlParts(laterPath, basePath).path;\n }\n\n doXHR(url, type, callback, errback) {\n const xhr = new XMLHttpRequest();\n const async = options.isFileProtocol ? options.fileAsync : true;\n\n if (typeof xhr.overrideMimeType === 'function') {\n xhr.overrideMimeType('text/css');\n }\n logger.debug(`XHR: Getting '${url}'`);\n xhr.open('GET', url, async);\n xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5');\n xhr.send(null);\n\n function handleResponse(xhr, callback, errback) {\n if (xhr.status >= 200 && xhr.status < 300) {\n callback(xhr.responseText,\n xhr.getResponseHeader('Last-Modified'));\n } else if (typeof errback === 'function') {\n errback(xhr.status, url);\n }\n }\n\n if (options.isFileProtocol && !options.fileAsync) {\n if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) {\n callback(xhr.responseText);\n } else {\n errback(xhr.status, url);\n }\n } else if (async) {\n xhr.onreadystatechange = () => {\n if (xhr.readyState == 4) {\n handleResponse(xhr, callback, errback);\n }\n };\n } else {\n handleResponse(xhr, callback, errback);\n }\n }\n\n supports() {\n return true;\n }\n\n clearFileCache() {\n fileCache = {};\n }\n\n loadFile(filename, currentDirectory, options, environment) {\n // TODO: Add prefix support like less-node?\n // What about multiple paths?\n\n if (currentDirectory && !this.isPathAbsolute(filename)) {\n filename = currentDirectory + filename;\n }\n\n filename = options.ext ? this.tryAppendExtension(filename, options.ext) : filename;\n\n options = options || {};\n\n // sheet may be set to the stylesheet for the initial load or a collection of properties including\n // some context variables for imports\n const hrefParts = this.extractUrlParts(filename, window.location.href);\n const href = hrefParts.url;\n const self = this;\n \n return new Promise((resolve, reject) => {\n if (options.useFileCache && fileCache[href]) {\n try {\n const lessText = fileCache[href];\n return resolve({ contents: lessText, filename: href, webInfo: { lastModified: new Date() }});\n } catch (e) {\n return reject({ filename: href, message: `Error loading file ${href} error was ${e.message}` });\n }\n }\n\n self.doXHR(href, options.mime, function doXHRCallback(data, lastModified) {\n // per file cache\n fileCache[href] = data;\n\n // Use remote copy (re-parse)\n resolve({ contents: data, filename: href, webInfo: { lastModified }});\n }, function doXHRError(status, url) {\n reject({ type: 'File', message: `'${url}' wasn't found (${status})`, href });\n });\n });\n }\n}\n\nexport default (opts, log) => {\n options = opts;\n logger = log;\n return FileManager;\n}\n","import Environment from './environment/environment';\nimport data from './data';\nimport tree from './tree';\nimport AbstractFileManager from './environment/abstract-file-manager';\nimport AbstractPluginLoader from './environment/abstract-plugin-loader';\nimport visitors from './visitors';\nimport Parser from './parser/parser';\nimport functions from './functions';\nimport contexts from './contexts';\nimport LessError from './less-error';\nimport transformTree from './transform-tree';\nimport * as utils from './utils';\nimport PluginManager from './plugin-manager';\nimport logger from './logger';\nimport SourceMapOutput from './source-map-output';\nimport SourceMapBuilder from './source-map-builder';\nimport ParseTree from './parse-tree';\nimport ImportManager from './import-manager';\nimport Parse from './parse';\nimport Render from './render';\n\nexport default function(environment, fileManagers) {\n let sourceMapOutput, sourceMapBuilder, parseTree, importManager;\n\n environment = new Environment(environment, fileManagers);\n sourceMapOutput = SourceMapOutput(environment);\n sourceMapBuilder = SourceMapBuilder(sourceMapOutput, environment);\n parseTree = ParseTree(sourceMapBuilder);\n importManager = ImportManager(environment);\n\n const render = Render(environment, parseTree, importManager);\n const parse = Parse(environment, parseTree, importManager);\n\n const initial = {\n version: [4, 0, 0],\n data,\n tree,\n Environment,\n AbstractFileManager,\n AbstractPluginLoader,\n environment,\n visitors,\n Parser,\n functions: functions(environment),\n contexts,\n SourceMapOutput: sourceMapOutput,\n SourceMapBuilder: sourceMapBuilder,\n ParseTree: parseTree,\n ImportManager: importManager,\n render,\n parse,\n LessError,\n transformTree,\n utils,\n PluginManager,\n logger\n };\n\n // Create a public API\n\n const ctor = function(t) {\n return function() {\n const obj = Object.create(t.prototype);\n t.apply(obj, Array.prototype.slice.call(arguments, 0));\n return obj;\n };\n };\n let t;\n const api = Object.create(initial);\n for (const n in initial.tree) {\n /* eslint guard-for-in: 0 */\n t = initial.tree[n];\n if (typeof t === 'function') {\n api[n.toLowerCase()] = ctor(t);\n }\n else {\n api[n] = Object.create(null);\n for (const o in t) {\n /* eslint guard-for-in: 0 */\n api[n][o.toLowerCase()] = ctor(t[o]);\n }\n }\n }\n\n /**\n * Some of the functions assume a `this` context of the API object,\n * which causes it to fail when wrapped for ES6 imports.\n * \n * An assumed `this` should be removed in the future.\n */\n initial.parse = initial.parse.bind(api);\n initial.render = initial.render.bind(api);\n\n return api;\n};\n","import LessError from './less-error';\nimport transformTree from './transform-tree';\nimport logger from './logger';\n\nexport default function(SourceMapBuilder) {\n class ParseTree {\n constructor(root, imports) {\n this.root = root;\n this.imports = imports;\n }\n\n toCSS(options) {\n let evaldRoot;\n const result = {};\n let sourceMapBuilder;\n try {\n evaldRoot = transformTree(this.root, options);\n } catch (e) {\n throw new LessError(e, this.imports);\n }\n\n try {\n const compress = Boolean(options.compress);\n if (compress) {\n logger.warn('The compress option has been deprecated. ' + \n 'We recommend you use a dedicated css minifier, for instance see less-plugin-clean-css.');\n }\n\n const toCSSOptions = {\n compress,\n dumpLineNumbers: options.dumpLineNumbers,\n strictUnits: Boolean(options.strictUnits),\n numPrecision: 8};\n\n if (options.sourceMap) {\n sourceMapBuilder = new SourceMapBuilder(options.sourceMap);\n result.css = sourceMapBuilder.toCSS(evaldRoot, toCSSOptions, this.imports);\n } else {\n result.css = evaldRoot.toCSS(toCSSOptions);\n }\n } catch (e) {\n throw new LessError(e, this.imports);\n }\n\n if (options.pluginManager) {\n const postProcessors = options.pluginManager.getPostProcessors();\n for (let i = 0; i < postProcessors.length; i++) {\n result.css = postProcessors[i].process(result.css, { sourceMap: sourceMapBuilder, options, imports: this.imports });\n }\n }\n if (options.sourceMap) {\n result.map = sourceMapBuilder.getExternalSourceMap();\n }\n\n result.imports = [];\n for (const file in this.imports.files) {\n if (this.imports.files.hasOwnProperty(file) && file !== this.imports.rootFilename) {\n result.imports.push(file);\n }\n }\n return result;\n }\n }\n\n return ParseTree;\n};\n","export default function (SourceMapOutput, environment) {\n class SourceMapBuilder {\n constructor(options) {\n this.options = options;\n }\n\n toCSS(rootNode, options, imports) {\n const sourceMapOutput = new SourceMapOutput(\n {\n contentsIgnoredCharsMap: imports.contentsIgnoredChars,\n rootNode,\n contentsMap: imports.contents,\n sourceMapFilename: this.options.sourceMapFilename,\n sourceMapURL: this.options.sourceMapURL,\n outputFilename: this.options.sourceMapOutputFilename,\n sourceMapBasepath: this.options.sourceMapBasepath,\n sourceMapRootpath: this.options.sourceMapRootpath,\n outputSourceFiles: this.options.outputSourceFiles,\n sourceMapGenerator: this.options.sourceMapGenerator,\n sourceMapFileInline: this.options.sourceMapFileInline, \n disableSourcemapAnnotation: this.options.disableSourcemapAnnotation\n });\n\n const css = sourceMapOutput.toCSS(options);\n this.sourceMap = sourceMapOutput.sourceMap;\n this.sourceMapURL = sourceMapOutput.sourceMapURL;\n if (this.options.sourceMapInputFilename) {\n this.sourceMapInputFilename = sourceMapOutput.normalizeFilename(this.options.sourceMapInputFilename);\n }\n if (this.options.sourceMapBasepath !== undefined && this.sourceMapURL !== undefined) {\n this.sourceMapURL = sourceMapOutput.removeBasepath(this.sourceMapURL);\n }\n return css + this.getCSSAppendage();\n }\n\n getCSSAppendage() {\n\n let sourceMapURL = this.sourceMapURL;\n if (this.options.sourceMapFileInline) {\n if (this.sourceMap === undefined) {\n return '';\n }\n sourceMapURL = `data:application/json;base64,${environment.encodeBase64(this.sourceMap)}`;\n }\n\n if (this.options.disableSourcemapAnnotation) {\n return '';\n }\n\n if (sourceMapURL) {\n return `/*# sourceMappingURL=${sourceMapURL} */`;\n }\n return '';\n }\n\n getExternalSourceMap() {\n return this.sourceMap;\n }\n\n setExternalSourceMap(sourceMap) {\n this.sourceMap = sourceMap;\n }\n\n isInline() {\n return this.options.sourceMapFileInline;\n }\n\n getSourceMapURL() {\n return this.sourceMapURL;\n }\n\n getOutputFilename() {\n return this.options.sourceMapOutputFilename;\n }\n\n getInputFilename() {\n return this.sourceMapInputFilename;\n }\n }\n\n return SourceMapBuilder;\n};\n","export default function (environment) {\n class SourceMapOutput {\n constructor(options) {\n this._css = [];\n this._rootNode = options.rootNode;\n this._contentsMap = options.contentsMap;\n this._contentsIgnoredCharsMap = options.contentsIgnoredCharsMap;\n if (options.sourceMapFilename) {\n this._sourceMapFilename = options.sourceMapFilename.replace(/\\\\/g, '/');\n }\n this._outputFilename = options.outputFilename;\n this.sourceMapURL = options.sourceMapURL;\n if (options.sourceMapBasepath) {\n this._sourceMapBasepath = options.sourceMapBasepath.replace(/\\\\/g, '/');\n }\n if (options.sourceMapRootpath) {\n this._sourceMapRootpath = options.sourceMapRootpath.replace(/\\\\/g, '/');\n if (this._sourceMapRootpath.charAt(this._sourceMapRootpath.length - 1) !== '/') {\n this._sourceMapRootpath += '/';\n }\n } else {\n this._sourceMapRootpath = '';\n }\n this._outputSourceFiles = options.outputSourceFiles;\n this._sourceMapGeneratorConstructor = environment.getSourceMapGenerator();\n\n this._lineNumber = 0;\n this._column = 0;\n }\n\n removeBasepath(path) {\n if (this._sourceMapBasepath && path.indexOf(this._sourceMapBasepath) === 0) {\n path = path.substring(this._sourceMapBasepath.length);\n if (path.charAt(0) === '\\\\' || path.charAt(0) === '/') {\n path = path.substring(1);\n }\n }\n\n return path;\n }\n\n normalizeFilename(filename) {\n filename = filename.replace(/\\\\/g, '/');\n filename = this.removeBasepath(filename);\n return (this._sourceMapRootpath || '') + filename;\n }\n\n add(chunk, fileInfo, index, mapLines) {\n\n // ignore adding empty strings\n if (!chunk) {\n return;\n }\n\n let lines, sourceLines, columns, sourceColumns, i;\n\n if (fileInfo && fileInfo.filename) {\n let inputSource = this._contentsMap[fileInfo.filename];\n\n // remove vars/banner added to the top of the file\n if (this._contentsIgnoredCharsMap[fileInfo.filename]) {\n // adjust the index\n index -= this._contentsIgnoredCharsMap[fileInfo.filename];\n if (index < 0) { index = 0; }\n // adjust the source\n inputSource = inputSource.slice(this._contentsIgnoredCharsMap[fileInfo.filename]);\n }\n\n // ignore empty content\n if (inputSource === undefined) {\n return;\n }\n\n inputSource = inputSource.substring(0, index);\n sourceLines = inputSource.split('\\n');\n sourceColumns = sourceLines[sourceLines.length - 1];\n }\n\n lines = chunk.split('\\n');\n columns = lines[lines.length - 1];\n\n if (fileInfo && fileInfo.filename) {\n if (!mapLines) {\n this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + 1, column: this._column},\n original: { line: sourceLines.length, column: sourceColumns.length},\n source: this.normalizeFilename(fileInfo.filename)});\n } else {\n for (i = 0; i < lines.length; i++) {\n this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + i + 1, column: i === 0 ? this._column : 0},\n original: { line: sourceLines.length + i, column: i === 0 ? sourceColumns.length : 0},\n source: this.normalizeFilename(fileInfo.filename)});\n }\n }\n }\n\n if (lines.length === 1) {\n this._column += columns.length;\n } else {\n this._lineNumber += lines.length - 1;\n this._column = columns.length;\n }\n\n this._css.push(chunk);\n }\n\n isEmpty() {\n return this._css.length === 0;\n }\n\n toCSS(context) {\n this._sourceMapGenerator = new this._sourceMapGeneratorConstructor({ file: this._outputFilename, sourceRoot: null });\n\n if (this._outputSourceFiles) {\n for (const filename in this._contentsMap) {\n if (this._contentsMap.hasOwnProperty(filename)) {\n let source = this._contentsMap[filename];\n if (this._contentsIgnoredCharsMap[filename]) {\n source = source.slice(this._contentsIgnoredCharsMap[filename]);\n }\n this._sourceMapGenerator.setSourceContent(this.normalizeFilename(filename), source);\n }\n }\n }\n\n this._rootNode.genCSS(context, this);\n\n if (this._css.length > 0) {\n let sourceMapURL;\n const sourceMapContent = JSON.stringify(this._sourceMapGenerator.toJSON());\n\n if (this.sourceMapURL) {\n sourceMapURL = this.sourceMapURL;\n } else if (this._sourceMapFilename) {\n sourceMapURL = this._sourceMapFilename;\n }\n this.sourceMapURL = sourceMapURL;\n\n this.sourceMap = sourceMapContent;\n }\n\n return this._css.join('');\n }\n }\n\n return SourceMapOutput;\n};\n","import contexts from './contexts';\nimport Parser from './parser/parser';\nimport LessError from './less-error';\nimport * as utils from './utils';\nimport logger from './logger';\n\nexport default function(environment) {\n // FileInfo = {\n // 'rewriteUrls' - option - whether to adjust URL's to be relative\n // 'filename' - full resolved filename of current file\n // 'rootpath' - path to append to normal URLs for this node\n // 'currentDirectory' - path to the current file, absolute\n // 'rootFilename' - filename of the base file\n // 'entryPath' - absolute path to the entry file\n // 'reference' - whether the file should not be output and only output parts that are referenced\n\n class ImportManager {\n constructor(less, context, rootFileInfo) {\n this.less = less;\n this.rootFilename = rootFileInfo.filename;\n this.paths = context.paths || []; // Search paths, when importing\n this.contents = {}; // map - filename to contents of all the files\n this.contentsIgnoredChars = {}; // map - filename to lines at the beginning of each file to ignore\n this.mime = context.mime;\n this.error = null;\n this.context = context;\n // Deprecated? Unused outside of here, could be useful.\n this.queue = []; // Files which haven't been imported yet\n this.files = {}; // Holds the imported parse trees.\n }\n\n /**\n * Add an import to be imported\n * @param path - the raw path\n * @param tryAppendExtension - whether to try appending a file extension (.less or .js if the path has no extension)\n * @param currentFileInfo - the current file info (used for instance to work out relative paths)\n * @param importOptions - import options\n * @param callback - callback for when it is imported\n */\n push(path, tryAppendExtension, currentFileInfo, importOptions, callback) {\n const importManager = this, pluginLoader = this.context.pluginManager.Loader;\n\n this.queue.push(path);\n\n const fileParsedFunc = function (e, root, fullPath) {\n importManager.queue.splice(importManager.queue.indexOf(path), 1); // Remove the path from the queue\n\n const importedEqualsRoot = fullPath === importManager.rootFilename;\n if (importOptions.optional && e) {\n callback(null, {rules:[]}, false, null);\n logger.info(`The file ${fullPath} was skipped because it was not found and the import was marked optional.`);\n }\n else {\n // Inline imports aren't cached here.\n // If we start to cache them, please make sure they won't conflict with non-inline imports of the\n // same name as they used to do before this comment and the condition below have been added.\n if (!importManager.files[fullPath] && !importOptions.inline) {\n importManager.files[fullPath] = { root, options: importOptions };\n }\n if (e && !importManager.error) { importManager.error = e; }\n callback(e, root, importedEqualsRoot, fullPath);\n }\n };\n\n const newFileInfo = {\n rewriteUrls: this.context.rewriteUrls,\n entryPath: currentFileInfo.entryPath,\n rootpath: currentFileInfo.rootpath,\n rootFilename: currentFileInfo.rootFilename\n };\n\n const fileManager = environment.getFileManager(path, currentFileInfo.currentDirectory, this.context, environment);\n\n if (!fileManager) {\n fileParsedFunc({ message: `Could not find a file-manager for ${path}` });\n return;\n }\n\n const loadFileCallback = function(loadedFile) {\n let plugin;\n const resolvedFilename = loadedFile.filename;\n const contents = loadedFile.contents.replace(/^\\uFEFF/, '');\n\n // Pass on an updated rootpath if path of imported file is relative and file\n // is in a (sub|sup) directory\n //\n // Examples:\n // - If path of imported file is 'module/nav/nav.less' and rootpath is 'less/',\n // then rootpath should become 'less/module/nav/'\n // - If path of imported file is '../mixins.less' and rootpath is 'less/',\n // then rootpath should become 'less/../'\n newFileInfo.currentDirectory = fileManager.getPath(resolvedFilename);\n if (newFileInfo.rewriteUrls) {\n newFileInfo.rootpath = fileManager.join(\n (importManager.context.rootpath || ''),\n fileManager.pathDiff(newFileInfo.currentDirectory, newFileInfo.entryPath));\n\n if (!fileManager.isPathAbsolute(newFileInfo.rootpath) && fileManager.alwaysMakePathsAbsolute()) {\n newFileInfo.rootpath = fileManager.join(newFileInfo.entryPath, newFileInfo.rootpath);\n }\n }\n newFileInfo.filename = resolvedFilename;\n\n const newEnv = new contexts.Parse(importManager.context);\n\n newEnv.processImports = false;\n importManager.contents[resolvedFilename] = contents;\n\n if (currentFileInfo.reference || importOptions.reference) {\n newFileInfo.reference = true;\n }\n\n if (importOptions.isPlugin) {\n plugin = pluginLoader.evalPlugin(contents, newEnv, importManager, importOptions.pluginArgs, newFileInfo);\n if (plugin instanceof LessError) {\n fileParsedFunc(plugin, null, resolvedFilename);\n }\n else {\n fileParsedFunc(null, plugin, resolvedFilename);\n }\n } else if (importOptions.inline) {\n fileParsedFunc(null, contents, resolvedFilename);\n } else {\n\n // import (multiple) parse trees apparently get altered and can't be cached.\n // TODO: investigate why this is\n if (importManager.files[resolvedFilename]\n && !importManager.files[resolvedFilename].options.multiple\n && !importOptions.multiple) {\n\n fileParsedFunc(null, importManager.files[resolvedFilename].root, resolvedFilename);\n }\n else {\n new Parser(newEnv, importManager, newFileInfo).parse(contents, function (e, root) {\n fileParsedFunc(e, root, resolvedFilename);\n });\n }\n }\n };\n let loadedFile;\n let promise;\n const context = utils.clone(this.context);\n\n if (tryAppendExtension) {\n context.ext = importOptions.isPlugin ? '.js' : '.less';\n }\n\n if (importOptions.isPlugin) {\n context.mime = 'application/javascript';\n\n if (context.syncImport) {\n loadedFile = pluginLoader.loadPluginSync(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n } else {\n promise = pluginLoader.loadPlugin(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n }\n }\n else {\n if (context.syncImport) {\n loadedFile = fileManager.loadFileSync(path, currentFileInfo.currentDirectory, context, environment);\n } else {\n promise = fileManager.loadFile(path, currentFileInfo.currentDirectory, context, environment,\n (err, loadedFile) => {\n if (err) {\n fileParsedFunc(err);\n } else {\n loadFileCallback(loadedFile);\n }\n });\n }\n }\n if (loadedFile) {\n if (!loadedFile.filename) {\n fileParsedFunc(loadedFile);\n } else {\n loadFileCallback(loadedFile);\n }\n } else if (promise) {\n promise.then(loadFileCallback, fileParsedFunc);\n }\n }\n }\n\n return ImportManager;\n};\n","import * as utils from './utils';\n\nexport default function(environment, ParseTree, ImportManager) {\n const render = function (input, options, callback) {\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(this.options, {});\n }\n else {\n options = utils.copyOptions(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n return new Promise(function (resolve, reject) {\n render.call(self, input, options, function(err, output) {\n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n this.parse(input, options, function(err, root, imports, options) {\n if (err) { return callback(err); }\n\n let result;\n try {\n const parseTree = new ParseTree(root, imports);\n result = parseTree.toCSS(options);\n }\n catch (err) { return callback(err); }\n\n callback(null, result);\n });\n }\n };\n\n return render;\n};\n","import contexts from './contexts';\nimport Parser from './parser/parser';\nimport PluginManager from './plugin-manager';\nimport LessError from './less-error';\nimport * as utils from './utils';\n\nexport default function(environment, ParseTree, ImportManager) {\n const parse = function (input, options, callback) {\n\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(this.options, {});\n }\n else {\n options = utils.copyOptions(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n return new Promise(function (resolve, reject) {\n parse.call(self, input, options, function(err, output) {\n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n let context;\n let rootFileInfo;\n const pluginManager = new PluginManager(this, !options.reUsePluginManager);\n\n options.pluginManager = pluginManager;\n\n context = new contexts.Parse(options);\n\n if (options.rootFileInfo) {\n rootFileInfo = options.rootFileInfo;\n } else {\n const filename = options.filename || 'input';\n const entryPath = filename.replace(/[^\\/\\\\]*$/, '');\n rootFileInfo = {\n filename,\n rewriteUrls: context.rewriteUrls,\n rootpath: context.rootpath || '',\n currentDirectory: entryPath,\n entryPath,\n rootFilename: filename\n };\n // add in a missing trailing slash\n if (rootFileInfo.rootpath && rootFileInfo.rootpath.slice(-1) !== '/') {\n rootFileInfo.rootpath += '/';\n }\n }\n\n const imports = new ImportManager(this, context, rootFileInfo);\n this.importManager = imports;\n\n // TODO: allow the plugins to be just a list of paths or names\n // Do an async plugin queue like lessc\n\n if (options.plugins) {\n options.plugins.forEach(function(plugin) {\n let evalResult, contents;\n if (plugin.fileContent) {\n contents = plugin.fileContent.replace(/^\\uFEFF/, '');\n evalResult = pluginManager.Loader.evalPlugin(contents, context, imports, plugin.options, plugin.filename);\n if (evalResult instanceof LessError) {\n return callback(evalResult);\n }\n }\n else {\n pluginManager.addPlugin(plugin);\n }\n });\n }\n\n new Parser(context, imports, rootFileInfo)\n .parse(input, function (e, root) {\n if (e) { return callback(e); }\n callback(null, root, imports, options);\n }, options);\n }\n };\n return parse;\n};\n","// TODO: Add tests for browser @plugin\n/* global window */\n\nimport AbstractPluginLoader from '../less/environment/abstract-plugin-loader.js';\n\n/**\n * Browser Plugin Loader\n */\nclass PluginLoader extends AbstractPluginLoader {\n constructor(less) {\n super();\n\n this.less = less;\n // Should we shim this.require for browser? Probably not?\n }\n\n loadPlugin(filename, basePath, context, environment, fileManager) {\n return new Promise((fulfill, reject) => {\n fileManager.loadFile(filename, basePath, context, environment)\n .then(fulfill).catch(reject);\n });\n }\n}\n\nexport default PluginLoader;\n\n","import * as utils from './utils';\nimport browser from './browser';\n\nexport default (window, less, options) => {\n\n function errorHTML(e, rootHref) {\n const id = `less-error-message:${utils.extractId(rootHref || '')}`;\n const template = '
  • {content}
  • ';\n const elem = window.document.createElement('div');\n let timer;\n let content;\n const errors = [];\n const filename = e.filename || rootHref;\n const filenameNoPath = filename.match(/([^\\/]+(\\?.*)?)$/)[1];\n\n elem.id = id;\n elem.className = 'less-error-message';\n\n content = `

    ${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'}` + \n `

    in ${filenameNoPath} `;\n\n const errorline = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\{content\\}/, e.extract[i]));\n }\n };\n\n if (e.line) {\n errorline(e, 0, '');\n errorline(e, 1, 'line');\n errorline(e, 2, '');\n content += `on line ${e.line}, column ${e.column + 1}:

      ${errors.join('')}
    `;\n }\n if (e.stack && (e.extract || options.logLevel >= 4)) {\n content += `
    Stack Trace
    ${e.stack.split('\\n').slice(1).join('
    ')}`;\n }\n elem.innerHTML = content;\n\n // CSS for error messages\n browser.createCSS(window.document, [\n '.less-error-message ul, .less-error-message li {',\n 'list-style-type: none;',\n 'margin-right: 15px;',\n 'padding: 4px 0;',\n 'margin: 0;',\n '}',\n '.less-error-message label {',\n 'font-size: 12px;',\n 'margin-right: 15px;',\n 'padding: 4px 0;',\n 'color: #cc7777;',\n '}',\n '.less-error-message pre {',\n 'color: #dd6666;',\n 'padding: 4px 0;',\n 'margin: 0;',\n 'display: inline-block;',\n '}',\n '.less-error-message pre.line {',\n 'color: #ff0000;',\n '}',\n '.less-error-message h3 {',\n 'font-size: 20px;',\n 'font-weight: bold;',\n 'padding: 15px 0 5px 0;',\n 'margin: 0;',\n '}',\n '.less-error-message a {',\n 'color: #10a',\n '}',\n '.less-error-message .error {',\n 'color: red;',\n 'font-weight: bold;',\n 'padding-bottom: 2px;',\n 'border-bottom: 1px dashed red;',\n '}'\n ].join('\\n'), { title: 'error-message' });\n\n elem.style.cssText = [\n 'font-family: Arial, sans-serif',\n 'border: 1px solid #e00',\n 'background-color: #eee',\n 'border-radius: 5px',\n '-webkit-border-radius: 5px',\n '-moz-border-radius: 5px',\n 'color: #e00',\n 'padding: 15px',\n 'margin-bottom: 15px'\n ].join(';');\n\n if (options.env === 'development') {\n timer = setInterval(() => {\n const document = window.document;\n const body = document.body;\n if (body) {\n if (document.getElementById(id)) {\n body.replaceChild(elem, document.getElementById(id));\n } else {\n body.insertBefore(elem, body.firstChild);\n }\n clearInterval(timer);\n }\n }, 10);\n }\n }\n\n function removeErrorHTML(path) {\n const node = window.document.getElementById(`less-error-message:${utils.extractId(path)}`);\n if (node) {\n node.parentNode.removeChild(node);\n }\n }\n\n function removeErrorConsole(path) {\n // no action\n }\n\n function removeError(path) {\n if (!options.errorReporting || options.errorReporting === 'html') {\n removeErrorHTML(path);\n } else if (options.errorReporting === 'console') {\n removeErrorConsole(path);\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('remove', path);\n }\n }\n\n function errorConsole(e, rootHref) {\n const template = '{line} {content}';\n const filename = e.filename || rootHref;\n const errors = [];\n let content = `${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'} in ${filename}`;\n\n const errorline = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\{content\\}/, e.extract[i]));\n }\n };\n\n if (e.line) {\n errorline(e, 0, '');\n errorline(e, 1, 'line');\n errorline(e, 2, '');\n content += ` on line ${e.line}, column ${e.column + 1}:\\n${errors.join('\\n')}`;\n }\n if (e.stack && (e.extract || options.logLevel >= 4)) {\n content += `\\nStack Trace\\n${e.stack}`;\n }\n less.logger.error(content);\n }\n\n function error(e, rootHref) {\n if (!options.errorReporting || options.errorReporting === 'html') {\n errorHTML(e, rootHref);\n } else if (options.errorReporting === 'console') {\n errorConsole(e, rootHref);\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('add', e, rootHref);\n }\n }\n\n return {\n add: error,\n remove: removeError\n };\n};\n","/**\n * Kicks off less and compiles any stylesheets\n * used in the browser distributed version of less\n * to kick-start less using the browser api\n */\n/* global window, document */\n\nimport defaultOptions from '../less/default-options';\nimport addDefaultOptions from './add-default-options';\nimport root from './index';\n\nconst options = defaultOptions();\n\nif (window.less) {\n for (const key in window.less) {\n if (window.less.hasOwnProperty(key)) {\n options[key] = window.less[key];\n }\n }\n}\naddDefaultOptions(window, options);\n\noptions.plugins = options.plugins || [];\n\nif (window.LESS_PLUGINS) {\n options.plugins = options.plugins.concat(window.LESS_PLUGINS);\n}\n\nconst less = root(window, options);\nexport default less;\n\nwindow.less = less;\n\nlet css;\nlet head;\nlet style;\n\n// Always restore page visibility\nfunction resolveOrReject(data) {\n if (data.filename) {\n console.warn(data);\n }\n if (!options.async) {\n head.removeChild(style);\n }\n}\n\nif (options.onReady) {\n if (/!watch/.test(window.location.hash)) {\n less.watch();\n }\n // Simulate synchronous stylesheet loading by hiding page rendering\n if (!options.async) {\n css = 'body { display: none !important }';\n head = document.head || document.getElementsByTagName('head')[0];\n style = document.createElement('style');\n\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n\n head.appendChild(style);\n }\n less.registerStylesheetsImmediately();\n less.pageLoadFinished = less.refresh(less.env === 'development').then(resolveOrReject, resolveOrReject);\n}\n","// Export a new default each time\nexport default function() {\n return {\n /* Inline Javascript - @plugin still allowed */\n javascriptEnabled: false,\n\n /* Outputs a makefile import dependency list to stdout. */\n depends: false,\n\n /* (DEPRECATED) Compress using less built-in compression. \n * This does an okay job but does not utilise all the tricks of \n * dedicated css compression. */\n compress: false,\n\n /* Runs the less parser and just reports errors without any output. */\n lint: false,\n\n /* Sets available include paths.\n * If the file in an @import rule does not exist at that exact location, \n * less will look for it at the location(s) passed to this option. \n * You might use this for instance to specify a path to a library which \n * you want to be referenced simply and relatively in the less files. */\n paths: [],\n\n /* color output in the terminal */\n color: true,\n\n /* The strictImports controls whether the compiler will allow an @import inside of either \n * @media blocks or (a later addition) other selector blocks.\n * See: https://github.com/less/less.js/issues/656 */\n strictImports: false,\n\n /* Allow Imports from Insecure HTTPS Hosts */\n insecure: false,\n\n /* Allows you to add a path to every generated import and url in your css. \n * This does not affect less import statements that are processed, just ones \n * that are left in the output css. */\n rootpath: '',\n\n /* By default URLs are kept as-is, so if you import a file in a sub-directory \n * that references an image, exactly the same URL will be output in the css. \n * This option allows you to re-write URL's in imported files so that the \n * URL is always relative to the base imported file */\n rewriteUrls: false,\n\n /* How to process math \n * 0 always - eagerly try to solve all operations\n * 1 parens-division - require parens for division \"/\"\n * 2 parens | strict - require parens for all operations\n * 3 strict-legacy - legacy strict behavior (super-strict)\n */\n math: 1,\n\n /* Without this option, less attempts to guess at the output unit when it does maths. */\n strictUnits: false,\n\n /* Effectively the declaration is put at the top of your base Less file, \n * meaning it can be used but it also can be overridden if this variable \n * is defined in the file. */\n globalVars: null,\n\n /* As opposed to the global variable option, this puts the declaration at the\n * end of your base file, meaning it will override anything defined in your Less file. */\n modifyVars: null,\n\n /* This option allows you to specify a argument to go on to every URL. */\n urlArgs: ''\n }\n};","import {addDataAttr} from './utils';\nimport browser from './browser';\n\nexport default (window, options) => {\n\n // use options from the current script tag data attribues\n addDataAttr(options, browser.currentScript(window));\n\n if (options.isFileProtocol === undefined) {\n options.isFileProtocol = /^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(window.location.protocol);\n }\n\n // Load styles asynchronously (default: false)\n //\n // This is set to `false` by default, so that the body\n // doesn't start loading before the stylesheets are parsed.\n // Setting this to `true` can result in flickering.\n //\n options.async = options.async || false;\n options.fileAsync = options.fileAsync || false;\n\n // Interval between watch polls\n options.poll = options.poll || (options.isFileProtocol ? 1000 : 1500);\n\n options.env = options.env || (window.location.hostname == '127.0.0.1' ||\n window.location.hostname == '0.0.0.0' ||\n window.location.hostname == 'localhost' ||\n (window.location.port &&\n window.location.port.length > 0) ||\n options.isFileProtocol ? 'development'\n : 'production');\n\n const dumpLineNumbers = /!dumpLineNumbers:(comments|mediaquery|all)/.exec(window.location.hash);\n if (dumpLineNumbers) {\n options.dumpLineNumbers = dumpLineNumbers[1];\n }\n\n if (options.useFileCache === undefined) {\n options.useFileCache = true;\n }\n\n if (options.onReady === undefined) {\n options.onReady = true;\n }\n\n if (options.relativeUrls) {\n options.rewriteUrls = 'all';\n }\n};\n","//\n// index.js\n// Should expose the additional browser functions on to the less object\n//\nimport {addDataAttr} from './utils';\nimport lessRoot from '../less';\nimport browser from './browser';\nimport FM from './file-manager';\nimport PluginLoader from './plugin-loader';\nimport LogListener from './log-listener';\nimport ErrorReporting from './error-reporting';\nimport Cache from './cache';\nimport ImageSize from './image-size';\n\nexport default (window, options) => {\n const document = window.document;\n const less = lessRoot();\n\n less.options = options;\n const environment = less.environment;\n const FileManager = FM(options, less.logger);\n const fileManager = new FileManager();\n environment.addFileManager(fileManager);\n less.FileManager = FileManager;\n less.PluginLoader = PluginLoader;\n\n LogListener(less, options);\n const errors = ErrorReporting(window, less, options);\n const cache = less.cache = options.cache || Cache(window, options, less.logger);\n ImageSize(less.environment);\n\n // Setup user functions - Deprecate?\n if (options.functions) {\n less.functions.functionRegistry.addMultiple(options.functions);\n }\n\n const typePattern = /^text\\/(x-)?less$/;\n\n function clone(obj) {\n const cloned = {};\n for (const prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n cloned[prop] = obj[prop];\n }\n }\n return cloned;\n }\n\n // only really needed for phantom\n function bind(func, thisArg) {\n const curryArgs = Array.prototype.slice.call(arguments, 2);\n return function() {\n const args = curryArgs.concat(Array.prototype.slice.call(arguments, 0));\n return func.apply(thisArg, args);\n };\n }\n\n function loadStyles(modifyVars) {\n const styles = document.getElementsByTagName('style');\n let style;\n\n for (let i = 0; i < styles.length; i++) {\n style = styles[i];\n if (style.type.match(typePattern)) {\n const instanceOptions = clone(options);\n instanceOptions.modifyVars = modifyVars;\n const lessText = style.innerHTML || '';\n instanceOptions.filename = document.location.href.replace(/#.*$/, '');\n\n /* jshint loopfunc:true */\n // use closure to store current style\n less.render(lessText, instanceOptions,\n bind((style, e, result) => {\n if (e) {\n errors.add(e, 'inline');\n } else {\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = result.css;\n } else {\n style.innerHTML = result.css;\n }\n }\n }, null, style));\n }\n }\n }\n\n function loadStyleSheet(sheet, callback, reload, remaining, modifyVars) {\n\n const instanceOptions = clone(options);\n addDataAttr(instanceOptions, sheet);\n instanceOptions.mime = sheet.type;\n\n if (modifyVars) {\n instanceOptions.modifyVars = modifyVars;\n }\n\n function loadInitialFileCallback(loadedFile) {\n const data = loadedFile.contents;\n const path = loadedFile.filename;\n const webInfo = loadedFile.webInfo;\n\n const newFileInfo = {\n currentDirectory: fileManager.getPath(path),\n filename: path,\n rootFilename: path,\n rewriteUrls: instanceOptions.rewriteUrls\n };\n\n newFileInfo.entryPath = newFileInfo.currentDirectory;\n newFileInfo.rootpath = instanceOptions.rootpath || newFileInfo.currentDirectory;\n\n if (webInfo) {\n webInfo.remaining = remaining;\n\n const css = cache.getCSS(path, webInfo, instanceOptions.modifyVars);\n if (!reload && css) {\n webInfo.local = true;\n callback(null, css, data, sheet, webInfo, path);\n return;\n }\n\n }\n\n // TODO add tests around how this behaves when reloading\n errors.remove(path);\n\n instanceOptions.rootFileInfo = newFileInfo;\n less.render(data, instanceOptions, (e, result) => {\n if (e) {\n e.href = path;\n callback(e);\n } else {\n cache.setCSS(sheet.href, webInfo.lastModified, instanceOptions.modifyVars, result.css);\n callback(null, result.css, data, sheet, webInfo, path);\n }\n });\n }\n\n fileManager.loadFile(sheet.href, null, instanceOptions, environment)\n .then(loadedFile => {\n loadInitialFileCallback(loadedFile);\n }).catch(err => {\n console.log(err);\n callback(err);\n });\n\n }\n\n function loadStyleSheets(callback, reload, modifyVars) {\n for (let i = 0; i < less.sheets.length; i++) {\n loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1), modifyVars);\n }\n }\n\n function initRunningMode() {\n if (less.env === 'development') {\n less.watchTimer = setInterval(() => {\n if (less.watchMode) {\n fileManager.clearFileCache();\n loadStyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n } else if (css) {\n browser.createCSS(window.document, css, sheet);\n }\n });\n }\n }, options.poll);\n }\n }\n\n //\n // Watch mode\n //\n less.watch = function () {\n if (!less.watchMode ) {\n less.env = 'development';\n initRunningMode();\n }\n this.watchMode = true;\n return true;\n };\n\n less.unwatch = function () {clearInterval(less.watchTimer); this.watchMode = false; return false; };\n\n //\n // Synchronously get all tags with the 'rel' attribute set to\n // \"stylesheet/less\".\n //\n less.registerStylesheetsImmediately = () => {\n const links = document.getElementsByTagName('link');\n less.sheets = [];\n\n for (let i = 0; i < links.length; i++) {\n if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) &&\n (links[i].type.match(typePattern)))) {\n less.sheets.push(links[i]);\n }\n }\n };\n\n //\n // Asynchronously get all tags with the 'rel' attribute set to\n // \"stylesheet/less\", returning a Promise.\n //\n less.registerStylesheets = () => new Promise((resolve, reject) => {\n less.registerStylesheetsImmediately();\n resolve();\n });\n\n //\n // With this function, it's possible to alter variables and re-render\n // CSS without reloading less-files\n //\n less.modifyVars = record => less.refresh(true, record, false);\n\n less.refresh = (reload, modifyVars, clearFileCache) => {\n if ((reload || clearFileCache) && clearFileCache !== false) {\n fileManager.clearFileCache();\n }\n return new Promise((resolve, reject) => {\n let startTime;\n let endTime;\n let totalMilliseconds;\n let remainingSheets;\n startTime = endTime = new Date();\n\n // Set counter for remaining unprocessed sheets\n remainingSheets = less.sheets.length;\n\n if (remainingSheets === 0) {\n\n endTime = new Date();\n totalMilliseconds = endTime - startTime;\n less.logger.info('Less has finished and no sheets were loaded.');\n resolve({\n startTime,\n endTime,\n totalMilliseconds,\n sheets: less.sheets.length\n });\n\n } else {\n // Relies on less.sheets array, callback seems to be guaranteed to be called for every element of the array\n loadStyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n reject(e);\n return;\n }\n if (webInfo.local) {\n less.logger.info(`Loading ${sheet.href} from cache.`);\n } else {\n less.logger.info(`Rendered ${sheet.href} successfully.`);\n }\n browser.createCSS(window.document, css, sheet);\n less.logger.info(`CSS for ${sheet.href} generated in ${new Date() - endTime}ms`);\n\n // Count completed sheet\n remainingSheets--;\n\n // Check if the last remaining sheet was processed and then call the promise\n if (remainingSheets === 0) {\n totalMilliseconds = new Date() - startTime;\n less.logger.info(`Less has finished. CSS generated in ${totalMilliseconds}ms`);\n resolve({\n startTime,\n endTime,\n totalMilliseconds,\n sheets: less.sheets.length\n });\n }\n endTime = new Date();\n }, reload, modifyVars);\n }\n\n loadStyles(modifyVars);\n });\n };\n\n less.refreshStyles = loadStyles;\n return less;\n};\n","export default (less, options) => {\n const logLevel_debug = 4;\n const logLevel_info = 3;\n const logLevel_warn = 2;\n const logLevel_error = 1;\n\n // The amount of logging in the javascript console.\n // 3 - Debug, information and errors\n // 2 - Information and errors\n // 1 - Errors\n // 0 - None\n // Defaults to 2\n options.logLevel = typeof options.logLevel !== 'undefined' ? options.logLevel : (options.env === 'development' ? logLevel_info : logLevel_error);\n\n if (!options.loggers) {\n options.loggers = [{\n debug: function(msg) {\n if (options.logLevel >= logLevel_debug) {\n console.log(msg);\n }\n },\n info: function(msg) {\n if (options.logLevel >= logLevel_info) {\n console.log(msg);\n }\n },\n warn: function(msg) {\n if (options.logLevel >= logLevel_warn) {\n console.warn(msg);\n }\n },\n error: function(msg) {\n if (options.logLevel >= logLevel_error) {\n console.error(msg);\n }\n }\n }];\n }\n for (let i = 0; i < options.loggers.length; i++) {\n less.logger.addListener(options.loggers[i]);\n }\n};\n","// Cache system is a bit outdated and could do with work\n\nexport default (window, options, logger) => {\n let cache = null;\n if (options.env !== 'development') {\n try {\n cache = (typeof window.localStorage === 'undefined') ? null : window.localStorage;\n } catch (_) {}\n }\n return {\n setCSS: function(path, lastModified, modifyVars, styles) {\n if (cache) {\n logger.info(`saving ${path} to cache.`);\n try {\n cache.setItem(path, styles);\n cache.setItem(`${path}:timestamp`, lastModified);\n if (modifyVars) {\n cache.setItem(`${path}:vars`, JSON.stringify(modifyVars));\n }\n } catch (e) {\n // TODO - could do with adding more robust error handling\n logger.error(`failed to save \"${path}\" to local storage for caching.`);\n }\n }\n },\n getCSS: function(path, webInfo, modifyVars) {\n const css = cache && cache.getItem(path);\n const timestamp = cache && cache.getItem(`${path}:timestamp`);\n let vars = cache && cache.getItem(`${path}:vars`);\n\n modifyVars = modifyVars || {};\n vars = vars || \"{}\"; // if not set, treat as the JSON representation of an empty object\n\n if (timestamp && webInfo.lastModified &&\n (new Date(webInfo.lastModified).valueOf() ===\n new Date(timestamp).valueOf()) &&\n JSON.stringify(modifyVars) === vars) {\n // Use local copy\n return css;\n }\n }\n };\n};\n","\nimport functionRegistry from './../less/functions/function-registry';\n\nexport default () => {\n function imageSize() {\n throw {\n type: 'Runtime',\n message: 'Image size functions are not supported in browser version of less'\n };\n }\n\n const imageFunctions = {\n 'image-size': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n },\n 'image-width': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n },\n 'image-height': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n }\n };\n\n functionRegistry.addMultiple(imageFunctions);\n};\n"],"names":["extractId","href","replace","addDataAttr","options","tag","opt","dataset","hasOwnProperty","JSON","parse","_","document","styles","sheet","id","title","utils.extractId","oldStyleNode","getElementById","keepOldStyleNode","styleNode","createElement","setAttribute","media","styleSheet","appendChild","createTextNode","childNodes","length","firstChild","nodeValue","head","getElementsByTagName","nextEl","nextSibling","parentNode","insertBefore","removeChild","cssText","e","Error","window","scripts","currentScript","error","msg","this","_fireEvent","warn","info","debug","addListener","listener","_listeners","push","removeListener","i","splice","type","logFunction","externalEnvironment","fileManagers","requiredFunctions","functions","concat","propName","environmentFunc","bind","Environment","filename","currentDirectory","environment","isSync","logger","pluginManager","getFileManagers","fileManager","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","darkgrey","darkgreen","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","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","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","m","cm","mm","in","px","pt","pc","duration","s","ms","angle","rad","Math","PI","deg","grad","turn","colors","unitConversions","parent","visibilityBlocks","undefined","nodeVisible","rootNode","parsed","self","Object","defineProperty","get","fileInfo","getIndex","Node","nodes","set","node","Array","isArray","forEach","_index","_fileInfo","context","strs","genCSS","add","chunk","index","isEmpty","join","output","value","visitor","visit","op","a","b","precision","numPrecision","Number","toFixed","compare","extendStatics","d","setPrototypeOf","__proto__","p","__extends","__","constructor","prototype","create","__assign","assign","t","n","arguments","call","apply","rgb","originalForm","_super","_this","match","map","c","parseInt","alpha","split","Color","r","g","pow","toCSS","doNotCompress","color","colorFunction","compress","args","fround","indexOf","clamp","round","toHSL","h","l","toRGB","splitcolor","other","_operate","toHex","max","min","v","x","keyword","key","toLowerCase","slice","toString","Paren","eval","_noSpaceCombinators"," ","|","emptyOrWhitespace","trim","Combinator","spaceOrEmpty","combinator","isVariable","currentFileInfo","visibilityInfo","copyVisibilityInfo","setParent","Element","firstSelector","charAt","ALWAYS","PARENS_DIVISION","PARENS","RewriteUrls","getLocation","inputStream","line","column","copyArray","arr","copy","clone","obj","cloned","prop","defaults","obj1","obj2","newObj","_defaults","defaults_1","copyOptions","opts","strictMath","math","Constants.Math","relativeUrls","rewriteUrls","Constants.RewriteUrls","flattenArray","result","length_1","anonymousFunc","LessError","fileContentMap","currentFilename","message","stack","input","contents","loc","utils.getLocation","col","callLine","lines","found","func","Function","lineAdjust","callExtract","extract","F","stylize","str","errorTxt","substr","elements","extendList","condition","evaldCondition","getElements","mixinElements_","Selector","visitArray","newSelector","mediaEmpty","els","parseNode","err","imports","sels","olen","len","mixinElements","shift","extend","createDerived","Value","Keyword","True","False","mapLines","rulesetLike","allowRoot","Anonymous","Boolean","MATH","name","important","merge","inline","variable","Declaration","lastRule","prevMath","evaldValue","mathBypass","evalName","importantScope","importantResult","pop","ctx","lineSeparator","dumpLineNumbers","debugInfo","asComment","asMediaQuery","lineNumber","fileName","filenameWithProtocol","test","isLineComment","Comment","getDebugInfo","isCompressed","contexts","copyFromOriginal","original","destination","propertiesToCopy","parseCopyProperties","Parse","paths","evalCopyProperties","isPathRelative","path","isPathLocalRelative","Eval","frames","enterCalc","calcStack","inCalc","exitCalc","inParenthesis","parensStack","outOfParenthesis","mathOn","isMathOn","pathRequiresRewrite","rewritePath","rootpath","newPath","normalizePath","segment","segments","reverse","makeRegistry","base","_data","addMultiple","keys","getLocalFunctions","inherit","defaultFunc","value_","error_","reset","selectors","rules","strictImports","_lookups","_variables","_properties","Ruleset","selCnt","selector","hasVariable","hasOnePassingSelector","j","toParseSelectors","utils.flattenArray","rule","subRule","utils.copyArray","ruleset","originalRuleset","root","firstRoot","allowImports","functionRegistry","globalFunctionRegistry","ctxFrames","unshift","ctxSelectors","evalImports","rsRules","evalFirst","mediaBlockCount","mediaBlocks","filter","resetCache","isJustParentSelector","bubbleSelectors","importRules","makeImportant","lastSelector","_rulesets","reduce","hash","variables","vars","name_1","name_2","decl","parseValue","properties","toParse","transformDeclaration","nodes_1","filtRules","isRuleset","foundMixins","rulesets","find","ruleNodes","tabLevel","sep","tabRuleStr","tabSetStr","charsetNodeIndex","importNodeIndex","isCharset","pathCnt","pathSubCnt","currentLastRule","isRulesetLike","isVisible","joinSelector","createParenthesis","elementsToPak","originalElement","replacementParen","insideParent","createSelector","containedElement","element","addReplacementIntoPath","beginningPath","addPath","replacedElement","originalSelector","newSelectorPath","newJoinedSelector","parentEl","restOfPath","addAllReplacementsIntoPath","addPaths","mergeElementsOnToSelectors","sel","deriveSelector","deriveFrom","newPaths","replaceParentSelector","inSelector","k","currentElements","newSelectors","selectorsMultiplied","el","maybeSelector","hadParentSelector","nestedSelector","replaced","nestedPaths","replacedNewSelectors","concatenated","isRooted","createEmptySelectors","AtRule","outputRuleset","mediaPathBackup","mediaBlocksBackup","mediaPath","ruleCnt","DetachedRuleset","numerator","denominator","backupUnit","sort","Unit","strictUnits","returnStr","is","unitString","toUpperCase","RegExp","callback","group","mapUnit","groupName","atomicUnit","counter","count","unit","parseFloat","isNaN","Dimension","isSingular","strValue","String","isLength","convertTo","usedUnits","cancel","unify","numericCompare","conversions","targetUnit","applyUnit","derivedConversions","operands","isSpaced","Operation","toColor","operate","noSpacing","Expression","returnValue","parens","doubleParen","parensInOp","functionCaller","evalArgs","commentFilter","item","subNodes","il","jl","calc","Call","currentMathContext","funcCaller","FunctionCaller","isValid","columnNumber","Variable","evaluating","frame","fun","Property","property","mergeRules","less","visitors","ToCSSVisitor","_mergeRules","vArr","Attribute","content","escaped","quote","variableRegex","propRegex","Quoted","that","iterativeReplace","regexp","replacementFnc","evaluatedValue","val","isEvald","URL","urlArgs","features","Media","evalTop","evalNested","multiMedia","permute","fragment","rest","css","pathValue","getPath","Import","isPlugin","reference","containsVariables","doEval","blocksVisibility","addVisibilityBlock","registry","skip","importedFilename","newImport","evalPath","string","expression","JavaScript","evaluateJavaScript","JsEvalNode","evalContext","javascriptEnabled","jsify","toJS","Assignment","negate","lvalue","rvalue","Condition","UnicodeDescriptor","Negative","option","object_id","Extend","next_id","parent_ids","allowBefore","allowAfter","selectorElements","selfElements","selfSelectors","VariableCall","detachedRuleset","callEval","ruleCall","lookups","NamespaceValue","lastDeclaration","substring","params","variadic","arity","optionalParameters","required","Definition","mixinEnv","evaldArguments","varargs","arg","isNamedFound","argIndex","argsLength","prependRule","_arguments","mixinFrames","evalParams","allArgsCnt","requiredArgsCnt","MixinCall","mixins","mixin","mixinPath","argValue","f","isRecursive","isOneFound","candidate","defaultResult","noArgumentsFilter","candidates","conditionResult","calcDefGroup","namespace","matchCondition","expand","matchArgs","MixinDefinition","format","newRules","evalCall","_setVisibilityToReplacement","replacement","AbstractFileManager","lastIndexOf","ext","tryAppendExtension","basePath","laterPath","url","baseUrl","urlDirectories","baseUrlDirectories","urlParts","extractUrlParts","baseUrlParts","diff","hostPart","directories","urlPartsRegex","returner","rawDirectories","rawPath","fileUrl","require","AbstractPluginLoader","pluginOptions","pluginObj","localModule","shortname","FileManager","trySetOptions","use","exports","loader","tree","validatePlugin","minVersion","compareVersion","addPlugin","plugin","setOptions","version","versionToString","aVersion","bVersion","versionString","plugins","printUsage","_visitArgs","visitDeeper","_hasIndexed","_noop","implementation","_implementation","_visitInCache","_visitOutCache","indexNodeTypes","ticker","child","typeIndex","Visitor","nodeTypeIndex","fnName","impl","funcOut","visitArgs","newNode","isReplacing","cnt","accept","nonReplacing","out","evald","flatten","nestedCnt","nestedItem","onSequencerEmpty","variableImports","_onSequencerEmpty","_currentDepth","ImportSequencer","importSequencer","importItem","isReady","tryRun","variableImport","ImportVisitor","importer","finish","_visitor","_importer","_finish","importCount","onceFileDetectionMap","recursionDetector","_sequencer","run","isFinished","visitImport","importNode","inlineCSS","importParent","isVariableImport","addVariableImport","processImportNode","evaldImportNode","evalForImport","multiple","importMultiple","tryAppendLessExtension","onImported","sequencedOnImported","addImport","importedAtRoot","fullPath","importVisitor","isOptional","optional","duplicateImport","oldContext","visitDeclaration","declNode","visitDeclarationOut","visitAtRule","atRuleNode","visitAtRuleOut","visitMixinDefinition","mixinDefinitionNode","visitMixinDefinitionOut","visitRuleset","rulesetNode","visitRulesetOut","visitMedia","mediaNode","visitMediaOut","visible","SetTreeVisibilityVisitor","ensureVisibility","ensureInvisibility","allExtendsStack","ExtendFinderVisitor","allExtends","allSelectorsExtendList","extendOnEveryPath","selectorPath","selExtendList","allSelectorsExtend","foundExtends","findSelfSelectors","firstExtendOnThisSelectorPath","ProcessExtendsVisitor","extendFinder","extendIndices","doExtendChaining","newRoot","checkExtendsForNonMatched","indices","hasFoundMatches","extendsList","extendsListTarget","iterationCount","extendIndex","targetExtendIndex","matches","targetExtend","newExtend","extendsToAdd","extendVisitor","findMatch","selfSelector","extendSelector","extendChainCount","selectorOne","selectorTwo","ruleNode","selectorNode","pathIndex","selectorsToAdd","extendedSelectors","haystackSelectorPath","haystackSelectorIndex","hackstackSelector","hackstackElementIndex","haystackElement","targetCombinator","potentialMatch","needleElements","potentialMatches","matched","initialCombinator","isElementValuesEqual","finished","endPathIndex","endPathElementIndex","elementValue1","elementValue2","replacementSelector","matchIndex","firstElement","newElements","currentSelectorPathIndex","currentSelectorPathElementIndex","currentValue","derived","newAllExtends","lastIndex","JoinSelectorVisitor","getIsOutput","joinSelectors","_context","CSSVisitorUtils","bodyRules","isSilent","owner","thing","originalRules","containsSilentNonBlockedChild","compiledRulesBody","keepOnlyVisibleChilds","removeVisibilityBlock","hasVisibleSelector","utils","mixinNode","visitExtend","extendNode","visitComment","commentNode","resolveVisibility","visitAtRuleWithBody","visitAtRuleWithoutBody","visitAnonymous","anonymousNode","nodeRules","hasFakeRuleset","getBodyRules","charset","comment","checkValidNodes","isRoot","_compileRulesetPaths","nodeRuleCnt","_removeDuplicateRules","isVisibleRuleset","ruleList","ruleCache","ruleCSS","groups","groupsArr","result_1","space_1","comma_1","MarkVisibleSelectorsVisitor","ExtendVisitor","furthest","furthestPossibleErrorMessage","chunks","current","currentPos","saveStack","parserInput","skipWhitespace","nextChar","oldi","oldj","curr","endIndex","mem","inp","charCodeAt","autoCommentAbsorb","nextNewLine","text","commentStore","nextStarSlash","save","restore","possibleErrorMessage","state","forget","isWhitespace","offset","pos","code","$re","tok","exec","$char","$str","tokLength","$quoted","startChar","currentPosition","$parseUntil","testChar","returnVal","inComment","blockDepth","blockStack","parseGroups","startPos","lastPos","loop","char","expected","peek","peekChar","currentChar","prevChar","getInput","peekNotNumeric","start","chunkInput","failFunction","fail","lastOpening","lastOpeningParen","lastMultiComment","lastMultiCommentEndBrace","chunkerCurrentIndex","currentChunkStartIndex","cc","cc2","level","parenLevel","emitFrom","emitChunk","force","fromCharCode","chunker","end","furthestReachedEnd","furthestChar","Parser","parsers","getParserInput","expect","expectChar","parseList","currentIndex","returnNodes","parser","additionalData","globalVars","modifyVars","ignored","preText","serializeVars","preProcessors","getPreProcessors","process","banner","contentsIgnoredChars","primary","endInfo","processImports","extendRule","definition","declaration","variableCall","entities","atrule","foundSemiColon","mixinLookup","quoted","forceEscaped","isEscaped","fromKeyword","customFuncCall","stop","ieAlpha","boolean","if","prevArgs","isSemiColonSeparated","argsComma","argsSemiColon","assignment","literal","dimension","unicodeDescriptor","entity","ch","variableCurly","curly","propertyCurly","colorKeyword","ud","javascript","js","escape","parsedName","inValue","ruleLookups","isRule","getLookup","hasParens","elem","elemIndex","re","isCall","expressionContainsNamed","nameLoop","expressions","hasSep","throwAwayComments","cond","argInfo","conditions","block","lookupValue","attribute","slashedCombinator","isLess","when","blockRuleset","hasDR","ruleProperty","permissiveValue","anonymousValue","untilTokens","done","testCurrentChar","import","dir","importOptions","mediaFeatures","o","optionName","importOption","mediaFeature","pluginArgs","nonVendorSpecificName","hasIdentifier","hasExpression","hasUnknown","hasBlock","sub","addition","multiplication","operation","operand","needsParens","logical","next","conditionAnd","negatedCondition","parenthesisCondition","atomicCondition","body","me","tryConditionFollowedByParenthesis","delim","simpleProperty","If","trueValue","falseValue","colorFunctions","hsla","origColor","hsl","toHSV","number","rgba","size","m1_1","m2_1","hue","hsv","hsva","vs","floor","perm","saturation","lightness","hsvhue","hsvsaturation","hsvvalue","luma","luminance","saturate","amount","method","desaturate","lighten","darken","fadein","fadeout","fade","spin","mix","color1","color2","weight","w","w1","w2","greyscale","contrast","dark","light","threshold","argb","toARGB","tint","shade","colorBlend","mode","cb","cs","ar","cr","ab","as","colorBlendModeFunctions","multiply","screen","overlay","softlight","sqrt","hardlight","difference","abs","exclusion","average","negation","getItemsFromNode","_SELF","~","_i","expr","values","range","step","from","to","stepValue","list","each","rs","iterator","tryEval","Quote","valueName","keyName","indexName","MathHelper","fn","mathFunctions","ceil","sin","cos","atan","asin","acos","mathHelper","fraction","num","minMax","isMin","currentUnified","referenceUnified","unitStatic","unitClone","order","convert","pi","mod","y","percentage","evaluated","encodeURI","pattern","flags","%","token","encodeURIComponent","isa","Type","isunit","isruleset","iscolor","isnumber","isstring","iskeyword","isurl","ispixel","ispercentage","isem","get-unit","colorBlending","fallback","functionThis","data-uri","mimetypeNode","filePathNode","mimetype","filePath","entryPath","fragmentStart","utils.clone","rawBuffer","getFileManager","useBase64","mimeLookup","charsetLookup","fileSync","loadFileSync","buf","encodeBase64","uri","dataUri","svg-gradient","direction","stops","gradientDirectionSvg","position","positionValue","gradientType","rectangleDimension","renderEnv","directionValue","throwArgumentDescriptor","types","evaldRoot","evalEnv","visitorIterator","preEvalVisitors","first","isPreEvalVisitor","isPreVisitor","pm","postProcessors","installedPlugins","pluginCache","Loader","PluginLoader","PluginManager","install","preProcessor","priority","indexToInsertAt","postProcessor","manager","PluginManagerFactory","newFactory","sourceMapOutput","sourceMapBuilder","parseTree","importManager","SourceMapBuilder","ParseTree","transformTree","toCSSOptions","sourceMap","getPostProcessors","file","getExternalSourceMap","files","rootFilename","SourceMapOutput","contentsIgnoredCharsMap","contentsMap","sourceMapFilename","sourceMapURL","outputFilename","sourceMapOutputFilename","sourceMapBasepath","sourceMapRootpath","outputSourceFiles","sourceMapGenerator","sourceMapFileInline","disableSourcemapAnnotation","sourceMapInputFilename","normalizeFilename","removeBasepath","getCSSAppendage","_css","_rootNode","_contentsMap","_contentsIgnoredCharsMap","_sourceMapFilename","_outputFilename","_sourceMapBasepath","_sourceMapRootpath","_outputSourceFiles","_sourceMapGeneratorConstructor","getSourceMapGenerator","_lineNumber","_column","sourceLines","columns","sourceColumns","inputSource","_sourceMapGenerator","addMapping","generated","source","sourceRoot","setSourceContent","sourceMapContent","stringify","toJSON","rootFileInfo","mime","queue","ImportManager","pluginLoader","fileParsedFunc","importedEqualsRoot","newFileInfo","loadedFile","promise","loadFileCallback","resolvedFilename","pathDiff","isPathAbsolute","alwaysMakePathsAbsolute","newEnv","evalPlugin","syncImport","loadPluginSync","loadPlugin","loadFile","then","render","utils.copyOptions","self_1","Promise","resolve","reject","Render","context_1","pluginManager_1","reUsePluginManager","imports_1","evalResult","fileContent","initial","data","ctor","api","fileCache","errback","xhr","XMLHttpRequest","async","isFileProtocol","fileAsync","handleResponse","status","responseText","getResponseHeader","overrideMimeType","open","setRequestHeader","send","onreadystatechange","readyState","location","useFileCache","lessText","webInfo","lastModified","Date","doXHR","log","fulfill","catch","rootHref","errorReporting","errors","errorline","classname","logLevel","errorConsole","timer","filenameNoPath","className","innerHTML","browser","style","env","setInterval","replaceChild","clearInterval","errorHTML","remove","removeErrorHTML","depends","lint","insecure","protocol","poll","hostname","port","onReady","addDefaultOptions","LESS_PLUGINS","lessRoot","FM","addFileManager","loggers","console","LogListener","ErrorReporting","cache","localStorage","setCSS","setItem","getCSS","getItem","timestamp","valueOf","Cache","imageSize","imageFunctions","image-size","image-width","image-height","ImageSize","typePattern","thisArg","curryArgs","loadStyles","instanceOptions","loadStyleSheet","reload","remaining","local","loadInitialFileCallback","loadStyleSheets","sheets","watch","watchMode","watchTimer","clearFileCache","unwatch","registerStylesheetsImmediately","links","rel","registerStylesheets","record","refresh","startTime","endTime","totalMilliseconds","remainingSheets","refreshStyles","resolveOrReject","pageLoadFinished"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"less.min.js","sources":["../src/less-browser/utils.js","../src/less-browser/browser.js","../src/less/logger.js","../src/less/environment/environment.js","../src/less/data/colors.js","../src/less/data/unit-conversions.js","../src/less/data/index.js","../src/less/tree/node.js","../src/less/tree/color.js","../src/less/tree/paren.js","../src/less/tree/combinator.js","../src/less/tree/element.js","../node_modules/tslib/tslib.es6.js","../src/less/constants.js","../src/less/utils.js","../src/less/less-error.js","../src/less/tree/selector.js","../src/less/tree/value.js","../src/less/tree/keyword.js","../src/less/tree/anonymous.js","../src/less/tree/declaration.js","../src/less/tree/debug-info.js","../src/less/tree/comment.js","../src/less/contexts.js","../src/less/functions/function-registry.js","../src/less/functions/default.js","../src/less/tree/ruleset.js","../src/less/tree/atrule.js","../src/less/tree/detached-ruleset.js","../src/less/tree/unit.js","../src/less/tree/dimension.js","../src/less/tree/operation.js","../src/less/tree/expression.js","../src/less/functions/function-caller.js","../src/less/tree/call.js","../src/less/tree/variable.js","../src/less/tree/property.js","../src/less/tree/attribute.js","../src/less/tree/quoted.js","../src/less/tree/url.js","../src/less/tree/media.js","../src/less/tree/import.js","../src/less/tree/js-eval-node.js","../src/less/tree/javascript.js","../src/less/tree/assignment.js","../src/less/tree/condition.js","../src/less/tree/unicode-descriptor.js","../src/less/tree/negative.js","../src/less/tree/extend.js","../src/less/tree/variable-call.js","../src/less/tree/namespace-value.js","../src/less/tree/mixin-definition.js","../src/less/tree/mixin-call.js","../src/less/tree/index.js","../src/less/environment/abstract-file-manager.js","../src/less/environment/abstract-plugin-loader.js","../src/less/visitors/visitor.js","../src/less/visitors/import-sequencer.js","../src/less/visitors/import-visitor.js","../src/less/visitors/set-tree-visibility-visitor.js","../src/less/visitors/extend-visitor.js","../src/less/visitors/join-selector-visitor.js","../src/less/visitors/to-css-visitor.js","../src/less/visitors/index.js","../src/less/parser/parser-input.js","../src/less/parser/chunker.js","../src/less/parser/parser.js","../src/less/functions/boolean.js","../src/less/functions/color.js","../src/less/functions/color-blending.js","../src/less/functions/list.js","../src/less/functions/math-helper.js","../src/less/functions/math.js","../src/less/functions/number.js","../src/less/functions/string.js","../src/less/functions/types.js","../src/less/functions/index.js","../src/less/functions/data-uri.js","../src/less/functions/svg.js","../src/less/transform-tree.js","../src/less/plugin-manager.js","../src/less-browser/file-manager.js","../src/less/index.js","../src/less/parse-tree.js","../src/less/source-map-builder.js","../src/less/source-map-output.js","../src/less/import-manager.js","../src/less/render.js","../src/less/parse.js","../src/less-browser/plugin-loader.js","../src/less-browser/error-reporting.js","../src/less-browser/bootstrap.js","../src/less/default-options.js","../src/less-browser/add-default-options.js","../src/less-browser/index.js","../src/less-browser/log-listener.js","../src/less-browser/cache.js","../src/less-browser/image-size.js"],"sourcesContent":["\nexport function extractId(href) {\n return href.replace(/^[a-z-]+:\\/+?[^\\/]+/, '') // Remove protocol & domain\n .replace(/[\\?\\&]livereload=\\w+/, '') // Remove LiveReload cachebuster\n .replace(/^\\//, '') // Remove root /\n .replace(/\\.[a-zA-Z]+$/, '') // Remove simple extension\n .replace(/[^\\.\\w-]+/g, '-') // Replace illegal characters\n .replace(/\\./g, ':'); // Replace dots with colons(for valid id)\n}\n\nexport function addDataAttr(options, tag) {\n for (const opt in tag.dataset) {\n if (tag.dataset.hasOwnProperty(opt)) {\n if (opt === 'env' || opt === 'dumpLineNumbers' || opt === 'rootpath' || opt === 'errorReporting') {\n options[opt] = tag.dataset[opt];\n } else {\n try {\n options[opt] = JSON.parse(tag.dataset[opt]);\n }\n catch (_) {}\n }\n }\n }\n}\n","import * as utils from './utils';\n\nexport default {\n createCSS: function (document, styles, sheet) {\n // Strip the query-string\n const href = sheet.href || '';\n\n // If there is no title set, use the filename, minus the extension\n const id = `less:${sheet.title || utils.extractId(href)}`;\n\n // If this has already been inserted into the DOM, we may need to replace it\n const oldStyleNode = document.getElementById(id);\n let keepOldStyleNode = false;\n\n // Create a new stylesheet node for insertion or (if necessary) replacement\n const styleNode = document.createElement('style');\n styleNode.setAttribute('type', 'text/css');\n if (sheet.media) {\n styleNode.setAttribute('media', sheet.media);\n }\n styleNode.id = id;\n\n if (!styleNode.styleSheet) {\n styleNode.appendChild(document.createTextNode(styles));\n\n // If new contents match contents of oldStyleNode, don't replace oldStyleNode\n keepOldStyleNode = (oldStyleNode !== null && oldStyleNode.childNodes.length > 0 && styleNode.childNodes.length > 0 &&\n oldStyleNode.firstChild.nodeValue === styleNode.firstChild.nodeValue);\n }\n\n const head = document.getElementsByTagName('head')[0];\n\n // If there is no oldStyleNode, just append; otherwise, only append if we need\n // to replace oldStyleNode with an updated stylesheet\n if (oldStyleNode === null || keepOldStyleNode === false) {\n const nextEl = sheet && sheet.nextSibling || null;\n if (nextEl) {\n nextEl.parentNode.insertBefore(styleNode, nextEl);\n } else {\n head.appendChild(styleNode);\n }\n }\n if (oldStyleNode && keepOldStyleNode === false) {\n oldStyleNode.parentNode.removeChild(oldStyleNode);\n }\n\n // For IE.\n // This needs to happen *after* the style element is added to the DOM, otherwise IE 7 and 8 may crash.\n // See http://social.msdn.microsoft.com/Forums/en-US/7e081b65-878a-4c22-8e68-c10d39c2ed32/internet-explorer-crashes-appending-style-element-to-head\n if (styleNode.styleSheet) {\n try {\n styleNode.styleSheet.cssText = styles;\n } catch (e) {\n throw new Error('Couldn\\'t reassign styleSheet.cssText.');\n }\n }\n },\n currentScript: function(window) {\n const document = window.document;\n return document.currentScript || (() => {\n const scripts = document.getElementsByTagName('script');\n return scripts[scripts.length - 1];\n })();\n }\n};\n","export default {\n error: function(msg) {\n this._fireEvent('error', msg);\n },\n warn: function(msg) {\n this._fireEvent('warn', msg);\n },\n info: function(msg) {\n this._fireEvent('info', msg);\n },\n debug: function(msg) {\n this._fireEvent('debug', msg);\n },\n addListener: function(listener) {\n this._listeners.push(listener);\n },\n removeListener: function(listener) {\n for (let i = 0; i < this._listeners.length; i++) {\n if (this._listeners[i] === listener) {\n this._listeners.splice(i, 1);\n return;\n }\n }\n },\n _fireEvent: function(type, msg) {\n for (let i = 0; i < this._listeners.length; i++) {\n const logFunction = this._listeners[i][type];\n if (logFunction) {\n logFunction(msg);\n }\n }\n },\n _listeners: []\n};\n","/**\n * @todo Document why this abstraction exists, and the relationship between\n * environment, file managers, and plugin manager\n */\n\nimport logger from '../logger';\n\nclass Environment {\n constructor(externalEnvironment, fileManagers) {\n this.fileManagers = fileManagers || [];\n externalEnvironment = externalEnvironment || {};\n\n const optionalFunctions = ['encodeBase64', 'mimeLookup', 'charsetLookup', 'getSourceMapGenerator'];\n const requiredFunctions = [];\n const functions = requiredFunctions.concat(optionalFunctions);\n\n for (let i = 0; i < functions.length; i++) {\n const propName = functions[i];\n const environmentFunc = externalEnvironment[propName];\n if (environmentFunc) {\n this[propName] = environmentFunc.bind(externalEnvironment);\n } else if (i < requiredFunctions.length) {\n this.warn(`missing required function in environment - ${propName}`);\n }\n }\n }\n\n getFileManager(filename, currentDirectory, options, environment, isSync) {\n\n if (!filename) {\n logger.warn('getFileManager called with no filename.. Please report this issue. continuing.');\n }\n if (currentDirectory == null) {\n logger.warn('getFileManager called with null directory.. Please report this issue. continuing.');\n }\n\n let fileManagers = this.fileManagers;\n if (options.pluginManager) {\n fileManagers = [].concat(fileManagers).concat(options.pluginManager.getFileManagers());\n }\n for (let i = fileManagers.length - 1; i >= 0 ; i--) {\n const fileManager = fileManagers[i];\n if (fileManager[isSync ? 'supportsSync' : 'supports'](filename, currentDirectory, options, environment)) {\n return fileManager;\n }\n }\n return null;\n }\n\n addFileManager(fileManager) {\n this.fileManagers.push(fileManager);\n }\n\n clearFileManagers() {\n this.fileManagers = [];\n }\n}\n\nexport default Environment;\n","export default {\n 'aliceblue':'#f0f8ff',\n 'antiquewhite':'#faebd7',\n 'aqua':'#00ffff',\n 'aquamarine':'#7fffd4',\n 'azure':'#f0ffff',\n 'beige':'#f5f5dc',\n 'bisque':'#ffe4c4',\n 'black':'#000000',\n 'blanchedalmond':'#ffebcd',\n 'blue':'#0000ff',\n 'blueviolet':'#8a2be2',\n 'brown':'#a52a2a',\n 'burlywood':'#deb887',\n 'cadetblue':'#5f9ea0',\n 'chartreuse':'#7fff00',\n 'chocolate':'#d2691e',\n 'coral':'#ff7f50',\n 'cornflowerblue':'#6495ed',\n 'cornsilk':'#fff8dc',\n 'crimson':'#dc143c',\n 'cyan':'#00ffff',\n 'darkblue':'#00008b',\n 'darkcyan':'#008b8b',\n 'darkgoldenrod':'#b8860b',\n 'darkgray':'#a9a9a9',\n 'darkgrey':'#a9a9a9',\n 'darkgreen':'#006400',\n 'darkkhaki':'#bdb76b',\n 'darkmagenta':'#8b008b',\n 'darkolivegreen':'#556b2f',\n 'darkorange':'#ff8c00',\n 'darkorchid':'#9932cc',\n 'darkred':'#8b0000',\n 'darksalmon':'#e9967a',\n 'darkseagreen':'#8fbc8f',\n 'darkslateblue':'#483d8b',\n 'darkslategray':'#2f4f4f',\n 'darkslategrey':'#2f4f4f',\n 'darkturquoise':'#00ced1',\n 'darkviolet':'#9400d3',\n 'deeppink':'#ff1493',\n 'deepskyblue':'#00bfff',\n 'dimgray':'#696969',\n 'dimgrey':'#696969',\n 'dodgerblue':'#1e90ff',\n 'firebrick':'#b22222',\n 'floralwhite':'#fffaf0',\n 'forestgreen':'#228b22',\n 'fuchsia':'#ff00ff',\n 'gainsboro':'#dcdcdc',\n 'ghostwhite':'#f8f8ff',\n 'gold':'#ffd700',\n 'goldenrod':'#daa520',\n 'gray':'#808080',\n 'grey':'#808080',\n 'green':'#008000',\n 'greenyellow':'#adff2f',\n 'honeydew':'#f0fff0',\n 'hotpink':'#ff69b4',\n 'indianred':'#cd5c5c',\n 'indigo':'#4b0082',\n 'ivory':'#fffff0',\n 'khaki':'#f0e68c',\n 'lavender':'#e6e6fa',\n 'lavenderblush':'#fff0f5',\n 'lawngreen':'#7cfc00',\n 'lemonchiffon':'#fffacd',\n 'lightblue':'#add8e6',\n 'lightcoral':'#f08080',\n 'lightcyan':'#e0ffff',\n 'lightgoldenrodyellow':'#fafad2',\n 'lightgray':'#d3d3d3',\n 'lightgrey':'#d3d3d3',\n 'lightgreen':'#90ee90',\n 'lightpink':'#ffb6c1',\n 'lightsalmon':'#ffa07a',\n 'lightseagreen':'#20b2aa',\n 'lightskyblue':'#87cefa',\n 'lightslategray':'#778899',\n 'lightslategrey':'#778899',\n 'lightsteelblue':'#b0c4de',\n 'lightyellow':'#ffffe0',\n 'lime':'#00ff00',\n 'limegreen':'#32cd32',\n 'linen':'#faf0e6',\n 'magenta':'#ff00ff',\n 'maroon':'#800000',\n 'mediumaquamarine':'#66cdaa',\n 'mediumblue':'#0000cd',\n 'mediumorchid':'#ba55d3',\n 'mediumpurple':'#9370d8',\n 'mediumseagreen':'#3cb371',\n 'mediumslateblue':'#7b68ee',\n 'mediumspringgreen':'#00fa9a',\n 'mediumturquoise':'#48d1cc',\n 'mediumvioletred':'#c71585',\n 'midnightblue':'#191970',\n 'mintcream':'#f5fffa',\n 'mistyrose':'#ffe4e1',\n 'moccasin':'#ffe4b5',\n 'navajowhite':'#ffdead',\n 'navy':'#000080',\n 'oldlace':'#fdf5e6',\n 'olive':'#808000',\n 'olivedrab':'#6b8e23',\n 'orange':'#ffa500',\n 'orangered':'#ff4500',\n 'orchid':'#da70d6',\n 'palegoldenrod':'#eee8aa',\n 'palegreen':'#98fb98',\n 'paleturquoise':'#afeeee',\n 'palevioletred':'#d87093',\n 'papayawhip':'#ffefd5',\n 'peachpuff':'#ffdab9',\n 'peru':'#cd853f',\n 'pink':'#ffc0cb',\n 'plum':'#dda0dd',\n 'powderblue':'#b0e0e6',\n 'purple':'#800080',\n 'rebeccapurple':'#663399',\n 'red':'#ff0000',\n 'rosybrown':'#bc8f8f',\n 'royalblue':'#4169e1',\n 'saddlebrown':'#8b4513',\n 'salmon':'#fa8072',\n 'sandybrown':'#f4a460',\n 'seagreen':'#2e8b57',\n 'seashell':'#fff5ee',\n 'sienna':'#a0522d',\n 'silver':'#c0c0c0',\n 'skyblue':'#87ceeb',\n 'slateblue':'#6a5acd',\n 'slategray':'#708090',\n 'slategrey':'#708090',\n 'snow':'#fffafa',\n 'springgreen':'#00ff7f',\n 'steelblue':'#4682b4',\n 'tan':'#d2b48c',\n 'teal':'#008080',\n 'thistle':'#d8bfd8',\n 'tomato':'#ff6347',\n 'turquoise':'#40e0d0',\n 'violet':'#ee82ee',\n 'wheat':'#f5deb3',\n 'white':'#ffffff',\n 'whitesmoke':'#f5f5f5',\n 'yellow':'#ffff00',\n 'yellowgreen':'#9acd32'\n};","export default {\n length: {\n 'm': 1,\n 'cm': 0.01,\n 'mm': 0.001,\n 'in': 0.0254,\n 'px': 0.0254 / 96,\n 'pt': 0.0254 / 72,\n 'pc': 0.0254 / 72 * 12\n },\n duration: {\n 's': 1,\n 'ms': 0.001\n },\n angle: {\n 'rad': 1 / (2 * Math.PI),\n 'deg': 1 / 360,\n 'grad': 1 / 400,\n 'turn': 1\n }\n};","import colors from './colors';\nimport unitConversions from './unit-conversions';\n\nexport default { colors, unitConversions };\n","class Node {\n constructor() {\n this.parent = null;\n this.visibilityBlocks = undefined;\n this.nodeVisible = undefined;\n this.rootNode = null;\n this.parsed = null;\n\n const self = this;\n Object.defineProperty(this, 'currentFileInfo', {\n get: function() { return self.fileInfo(); }\n });\n Object.defineProperty(this, 'index', {\n get: function() { return self.getIndex(); }\n });\n\n }\n\n setParent(nodes, parent) {\n function set(node) {\n if (node && node instanceof Node) {\n node.parent = parent;\n }\n }\n if (Array.isArray(nodes)) {\n nodes.forEach(set);\n }\n else {\n set(nodes);\n }\n }\n\n getIndex() {\n return this._index || (this.parent && this.parent.getIndex()) || 0;\n }\n\n fileInfo() {\n return this._fileInfo || (this.parent && this.parent.fileInfo()) || {};\n }\n\n isRulesetLike() { return false; }\n\n toCSS(context) {\n const strs = [];\n this.genCSS(context, {\n add: function(chunk, fileInfo, index) {\n strs.push(chunk);\n },\n isEmpty: function () {\n return strs.length === 0;\n }\n });\n return strs.join('');\n }\n\n genCSS(context, output) {\n output.add(this.value);\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n eval() { return this; }\n\n _operate(context, op, a, b) {\n switch (op) {\n case '+': return a + b;\n case '-': return a - b;\n case '*': return a * b;\n case '/': return a / b;\n }\n }\n\n fround(context, value) {\n const precision = context && context.numPrecision;\n // add \"epsilon\" to ensure numbers like 1.000000005 (represented as 1.000000004999...) are properly rounded:\n return (precision) ? Number((value + 2e-16).toFixed(precision)) : value;\n }\n\n static compare(a, b) {\n /* returns:\n -1: a < b\n 0: a = b\n 1: a > b\n and *any* other value for a != b (e.g. undefined, NaN, -2 etc.) */\n\n if ((a.compare) &&\n // for \"symmetric results\" force toCSS-based comparison\n // of Quoted or Anonymous if either value is one of those\n !(b.type === 'Quoted' || b.type === 'Anonymous')) {\n return a.compare(b);\n } else if (b.compare) {\n return -b.compare(a);\n } else if (a.type !== b.type) {\n return undefined;\n }\n\n a = a.value;\n b = b.value;\n if (!Array.isArray(a)) {\n return a === b ? 0 : undefined;\n }\n if (a.length !== b.length) {\n return undefined;\n }\n for (let i = 0; i < a.length; i++) {\n if (Node.compare(a[i], b[i]) !== 0) {\n return undefined;\n }\n }\n return 0;\n }\n\n static numericCompare(a, b) {\n return a < b ? -1\n : a === b ? 0\n : a > b ? 1 : undefined;\n }\n\n // Returns true if this node represents root of ast imported by reference\n blocksVisibility() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n return this.visibilityBlocks !== 0;\n }\n\n addVisibilityBlock() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks + 1;\n }\n\n removeVisibilityBlock() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks - 1;\n }\n\n // Turns on node visibility - if called node will be shown in output regardless\n // of whether it comes from import by reference or not\n ensureVisibility() {\n this.nodeVisible = true;\n }\n\n // Turns off node visibility - if called node will NOT be shown in output regardless\n // of whether it comes from import by reference or not\n ensureInvisibility() {\n this.nodeVisible = false;\n }\n\n // return values:\n // false - the node must not be visible\n // true - the node must be visible\n // undefined or null - the node has the same visibility as its parent\n isVisible() {\n return this.nodeVisible;\n }\n\n visibilityInfo() {\n return {\n visibilityBlocks: this.visibilityBlocks,\n nodeVisible: this.nodeVisible\n };\n }\n\n copyVisibilityInfo(info) {\n if (!info) {\n return;\n }\n this.visibilityBlocks = info.visibilityBlocks;\n this.nodeVisible = info.nodeVisible;\n }\n}\n\nexport default Node;\n","import Node from './node';\nimport colors from '../data/colors';\n\n//\n// RGB Colors - #ff0014, #eee\n//\nconst Color = function(rgb, a, originalForm) {\n const self = this;\n //\n // The end goal here, is to parse the arguments\n // into an integer triplet, such as `128, 255, 0`\n //\n // This facilitates operations and conversions.\n //\n if (Array.isArray(rgb)) {\n this.rgb = rgb;\n } else if (rgb.length >= 6) {\n this.rgb = [];\n rgb.match(/.{2}/g).map(function (c, i) {\n if (i < 3) {\n self.rgb.push(parseInt(c, 16));\n } else {\n self.alpha = (parseInt(c, 16)) / 255;\n }\n });\n } else {\n this.rgb = [];\n rgb.split('').map(function (c, i) {\n if (i < 3) {\n self.rgb.push(parseInt(c + c, 16));\n } else {\n self.alpha = (parseInt(c + c, 16)) / 255;\n }\n });\n }\n this.alpha = this.alpha || (typeof a === 'number' ? a : 1);\n if (typeof originalForm !== 'undefined') {\n this.value = originalForm;\n }\n}\n\nColor.prototype = Object.assign(new Node(), {\n type: 'Color',\n\n luma() {\n let r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255;\n\n r = (r <= 0.03928) ? r / 12.92 : Math.pow(((r + 0.055) / 1.055), 2.4);\n g = (g <= 0.03928) ? g / 12.92 : Math.pow(((g + 0.055) / 1.055), 2.4);\n b = (b <= 0.03928) ? b / 12.92 : Math.pow(((b + 0.055) / 1.055), 2.4);\n\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n },\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n },\n\n toCSS(context, doNotCompress) {\n const compress = context && context.compress && !doNotCompress;\n let color;\n let alpha;\n let colorFunction;\n let args = [];\n\n // `value` is set if this color was originally\n // converted from a named color string so we need\n // to respect this and try to output named color too.\n alpha = this.fround(context, this.alpha);\n\n if (this.value) {\n if (this.value.indexOf('rgb') === 0) {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n } else if (this.value.indexOf('hsl') === 0) {\n if (alpha < 1) {\n colorFunction = 'hsla';\n } else {\n colorFunction = 'hsl';\n }\n } else {\n return this.value;\n }\n } else {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n }\n\n switch (colorFunction) {\n case 'rgba':\n args = this.rgb.map(function (c) {\n return clamp(Math.round(c), 255);\n }).concat(clamp(alpha, 1));\n break;\n case 'hsla':\n args.push(clamp(alpha, 1));\n case 'hsl':\n color = this.toHSL();\n args = [\n this.fround(context, color.h),\n `${this.fround(context, color.s * 100)}%`,\n `${this.fround(context, color.l * 100)}%`\n ].concat(args);\n }\n\n if (colorFunction) {\n // Values are capped between `0` and `255`, rounded and zero-padded.\n return `${colorFunction}(${args.join(`,${compress ? '' : ' '}`)})`;\n }\n\n color = this.toRGB();\n\n if (compress) {\n const splitcolor = color.split('');\n\n // Convert color to short format\n if (splitcolor[1] === splitcolor[2] && splitcolor[3] === splitcolor[4] && splitcolor[5] === splitcolor[6]) {\n color = `#${splitcolor[1]}${splitcolor[3]}${splitcolor[5]}`;\n }\n }\n\n return color;\n },\n\n //\n // Operations have to be done per-channel, if not,\n // channels will spill onto each other. Once we have\n // our result, in the form of an integer triplet,\n // we create a new Color node to hold the result.\n //\n operate(context, op, other) {\n const rgb = new Array(3);\n const alpha = this.alpha * (1 - other.alpha) + other.alpha;\n for (let c = 0; c < 3; c++) {\n rgb[c] = this._operate(context, op, this.rgb[c], other.rgb[c]);\n }\n return new Color(rgb, alpha);\n },\n\n toRGB() {\n return toHex(this.rgb);\n },\n\n toHSL() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h;\n let s;\n const l = (max + min) / 2;\n const d = max - min;\n\n if (max === min) {\n h = s = 0;\n } else {\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, l, a };\n },\n\n // Adapted from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript\n toHSV() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h;\n let s;\n const v = max;\n\n const d = max - min;\n if (max === 0) {\n s = 0;\n } else {\n s = d / max;\n }\n\n if (max === min) {\n h = 0;\n } else {\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, v, a };\n },\n\n toARGB() {\n return toHex([this.alpha * 255].concat(this.rgb));\n },\n\n compare(x) {\n return (x.rgb &&\n x.rgb[0] === this.rgb[0] &&\n x.rgb[1] === this.rgb[1] &&\n x.rgb[2] === this.rgb[2] &&\n x.alpha === this.alpha) ? 0 : undefined;\n }\n});\n\nColor.fromKeyword = function(keyword) {\n let c;\n const key = keyword.toLowerCase();\n if (colors.hasOwnProperty(key)) {\n c = new Color(colors[key].slice(1));\n }\n else if (key === 'transparent') {\n c = new Color([0, 0, 0], 0);\n }\n\n if (c) {\n c.value = keyword;\n return c;\n }\n};\n\nfunction clamp(v, max) {\n return Math.min(Math.max(v, 0), max);\n}\n\nfunction toHex(v) {\n return `#${v.map(function (c) {\n c = clamp(Math.round(c), 255);\n return (c < 16 ? '0' : '') + c.toString(16);\n}).join('')}`;\n}\n\nexport default Color;\n","import Node from './node';\n\nconst Paren = function(node) {\n this.value = node;\n};\n\nParen.prototype = Object.assign(new Node(), {\n type: 'Paren',\n\n genCSS(context, output) {\n output.add('(');\n this.value.genCSS(context, output);\n output.add(')');\n },\n\n eval(context) {\n return new Paren(this.value.eval(context));\n }\n});\n\nexport default Paren;\n","import Node from './node';\nconst _noSpaceCombinators = {\n '': true,\n ' ': true,\n '|': true\n};\n\nconst Combinator = function(value) {\n if (value === ' ') {\n this.value = ' ';\n this.emptyOrWhitespace = true;\n } else {\n this.value = value ? value.trim() : '';\n this.emptyOrWhitespace = this.value === '';\n }\n}\n\nCombinator.prototype = Object.assign(new Node(), {\n type: 'Combinator',\n\n genCSS(context, output) {\n const spaceOrEmpty = (context.compress || _noSpaceCombinators[this.value]) ? '' : ' ';\n output.add(spaceOrEmpty + this.value + spaceOrEmpty);\n }\n});\n\nexport default Combinator;\n","import Node from './node';\nimport Paren from './paren';\nimport Combinator from './combinator';\n\nconst Element = function(combinator, value, isVariable, index, currentFileInfo, visibilityInfo) {\n this.combinator = combinator instanceof Combinator ?\n combinator : new Combinator(combinator);\n\n if (typeof value === 'string') {\n this.value = value.trim();\n } else if (value) {\n this.value = value;\n } else {\n this.value = '';\n }\n this.isVariable = isVariable;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.combinator, this);\n}\n\nElement.prototype = Object.assign(new Node(), {\n type: 'Element',\n\n accept(visitor) {\n const value = this.value;\n this.combinator = visitor.visit(this.combinator);\n if (typeof value === 'object') {\n this.value = visitor.visit(value);\n }\n },\n\n eval(context) {\n return new Element(this.combinator,\n this.value.eval ? this.value.eval(context) : this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n },\n\n clone() {\n return new Element(this.combinator,\n this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n },\n\n genCSS(context, output) {\n output.add(this.toCSS(context), this.fileInfo(), this.getIndex());\n },\n\n toCSS(context) {\n context = context || {};\n let value = this.value;\n const firstSelector = context.firstSelector;\n if (value instanceof Paren) {\n // selector in parens should not be affected by outer selector\n // flags (breaks only interpolated selectors - see #1973)\n context.firstSelector = true;\n }\n value = value.toCSS ? value.toCSS(context) : value;\n context.firstSelector = firstSelector;\n if (value === '' && this.combinator.value.charAt(0) === '&') {\n return '';\n } else {\n return this.combinator.toCSS(context) + value;\n }\n }\n});\n\nexport default Element;\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","\nexport const Math = {\n ALWAYS: 0,\n PARENS_DIVISION: 1,\n PARENS: 2,\n // removed - STRICT_LEGACY: 3\n};\n\nexport const RewriteUrls = {\n OFF: 0,\n LOCAL: 1,\n ALL: 2\n};","/* jshint proto: true */\nimport * as Constants from './constants';\n\nexport function getLocation(index, inputStream) {\n let n = index + 1;\n let line = null;\n let column = -1;\n\n while (--n >= 0 && inputStream.charAt(n) !== '\\n') {\n column++;\n }\n\n if (typeof index === 'number') {\n line = (inputStream.slice(0, index).match(/\\n/g) || '').length;\n }\n\n return {\n line,\n column\n };\n}\n\nexport function copyArray(arr) {\n let i;\n const length = arr.length;\n const copy = new Array(length);\n\n for (i = 0; i < length; i++) {\n copy[i] = arr[i];\n }\n return copy;\n}\n\nexport function clone(obj) {\n const cloned = {};\n for (const prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n cloned[prop] = obj[prop];\n }\n }\n return cloned;\n}\n\nexport function defaults(obj1, obj2) {\n let newObj = obj2 || {};\n if (!obj2._defaults) {\n newObj = {};\n const defaults = {...obj1};\n newObj._defaults = defaults;\n const cloned = obj2 ? {...obj2} : {};\n Object.assign(newObj, defaults, cloned);\n }\n return newObj;\n}\n\nexport function copyOptions(obj1, obj2) {\n if (obj2 && obj2._defaults) {\n return obj2;\n }\n const opts = defaults(obj1, obj2);\n if (opts.strictMath) {\n opts.math = Constants.Math.PARENS;\n }\n // Back compat with changed relativeUrls option\n if (opts.relativeUrls) {\n opts.rewriteUrls = Constants.RewriteUrls.ALL;\n }\n if (typeof opts.math === 'string') {\n switch (opts.math.toLowerCase()) {\n case 'always':\n opts.math = Constants.Math.ALWAYS;\n break;\n case 'parens-division':\n opts.math = Constants.Math.PARENS_DIVISION;\n break;\n case 'strict':\n case 'parens':\n opts.math = Constants.Math.PARENS;\n break;\n default:\n opts.math = Constants.Math.PARENS;\n }\n }\n if (typeof opts.rewriteUrls === 'string') {\n switch (opts.rewriteUrls.toLowerCase()) {\n case 'off':\n opts.rewriteUrls = Constants.RewriteUrls.OFF;\n break;\n case 'local':\n opts.rewriteUrls = Constants.RewriteUrls.LOCAL;\n break;\n case 'all':\n opts.rewriteUrls = Constants.RewriteUrls.ALL;\n break;\n }\n }\n return opts;\n}\n\nexport function merge(obj1, obj2) {\n for (const prop in obj2) {\n if (obj2.hasOwnProperty(prop)) {\n obj1[prop] = obj2[prop];\n }\n }\n return obj1;\n}\n\nexport function flattenArray(arr, result = []) {\n for (let i = 0, length = arr.length; i < length; i++) {\n const value = arr[i];\n if (Array.isArray(value)) {\n flattenArray(value, result);\n } else {\n if (value !== undefined) {\n result.push(value);\n }\n }\n }\n return result;\n}","import * as utils from './utils';\n\nconst anonymousFunc = /(|Function):(\\d+):(\\d+)/;\n\n/**\n * This is a centralized class of any error that could be thrown internally (mostly by the parser).\n * Besides standard .message it keeps some additional data like a path to the file where the error\n * occurred along with line and column numbers.\n *\n * @class\n * @extends Error\n * @type {module.LessError}\n *\n * @prop {string} type\n * @prop {string} filename\n * @prop {number} index\n * @prop {number} line\n * @prop {number} column\n * @prop {number} callLine\n * @prop {number} callExtract\n * @prop {string[]} extract\n *\n * @param {Object} e - An error object to wrap around or just a descriptive object\n * @param {Object} fileContentMap - An object with file contents in 'contents' property (like importManager) @todo - move to fileManager?\n * @param {string} [currentFilename]\n */\nconst LessError = function(e, fileContentMap, currentFilename) {\n Error.call(this);\n\n const filename = e.filename || currentFilename;\n\n this.message = e.message;\n this.stack = e.stack;\n\n if (fileContentMap && filename) {\n const input = fileContentMap.contents[filename];\n const loc = utils.getLocation(e.index, input);\n var line = loc.line;\n const col = loc.column;\n const callLine = e.call && utils.getLocation(e.call, input).line;\n const lines = input ? input.split('\\n') : '';\n\n this.type = e.type || 'Syntax';\n this.filename = filename;\n this.index = e.index;\n this.line = typeof line === 'number' ? line + 1 : null;\n this.column = col;\n\n if (!this.line && this.stack) {\n const found = this.stack.match(anonymousFunc);\n\n /**\n * We have to figure out how this environment stringifies anonymous functions\n * so we can correctly map plugin errors.\n * \n * Note, in Node 8, the output of anonymous funcs varied based on parameters\n * being present or not, so we inject dummy params.\n */\n const func = new Function('a', 'throw new Error()');\n let lineAdjust = 0;\n try {\n func();\n } catch (e) {\n const match = e.stack.match(anonymousFunc);\n var line = parseInt(match[2]);\n lineAdjust = 1 - line;\n }\n\n if (found) {\n if (found[2]) {\n this.line = parseInt(found[2]) + lineAdjust;\n }\n if (found[3]) {\n this.column = parseInt(found[3]);\n }\n }\n }\n\n this.callLine = callLine + 1;\n this.callExtract = lines[callLine];\n\n this.extract = [\n lines[this.line - 2],\n lines[this.line - 1],\n lines[this.line]\n ];\n }\n\n};\n\nif (typeof Object.create === 'undefined') {\n const F = function () {};\n F.prototype = Error.prototype;\n LessError.prototype = new F();\n} else {\n LessError.prototype = Object.create(Error.prototype);\n}\n\nLessError.prototype.constructor = LessError;\n\n/**\n * An overridden version of the default Object.prototype.toString\n * which uses additional information to create a helpful message.\n *\n * @param {Object} options\n * @returns {string}\n */\nLessError.prototype.toString = function(options) {\n options = options || {};\n\n let message = '';\n const extract = this.extract || [];\n let error = [];\n let stylize = function (str) { return str; };\n if (options.stylize) {\n const type = typeof options.stylize;\n if (type !== 'function') {\n throw Error(`options.stylize should be a function, got a ${type}!`);\n }\n stylize = options.stylize;\n }\n\n if (this.line !== null) {\n if (typeof extract[0] === 'string') {\n error.push(stylize(`${this.line - 1} ${extract[0]}`, 'grey'));\n }\n\n if (typeof extract[1] === 'string') {\n let errorTxt = `${this.line} `;\n if (extract[1]) {\n errorTxt += extract[1].slice(0, this.column) +\n stylize(stylize(stylize(extract[1].substr(this.column, 1), 'bold') +\n extract[1].slice(this.column + 1), 'red'), 'inverse');\n }\n error.push(errorTxt);\n }\n\n if (typeof extract[2] === 'string') {\n error.push(stylize(`${this.line + 1} ${extract[2]}`, 'grey'));\n }\n error = `${error.join('\\n') + stylize('', 'reset')}\\n`;\n }\n\n message += stylize(`${this.type}Error: ${this.message}`, 'red');\n if (this.filename) {\n message += stylize(' in ', 'red') + this.filename;\n }\n if (this.line) {\n message += stylize(` on line ${this.line}, column ${this.column + 1}:`, 'grey');\n }\n\n message += `\\n${error}`;\n\n if (this.callLine) {\n message += `${stylize('from ', 'red') + (this.filename || '')}/n`;\n message += `${stylize(this.callLine, 'grey')} ${this.callExtract}/n`;\n }\n\n return message;\n};\n\nexport default LessError;","import Node from './node';\nimport Element from './element';\nimport LessError from '../less-error';\n\nconst Selector = function(elements, extendList, condition, index, currentFileInfo, visibilityInfo) {\n this.extendList = extendList;\n this.condition = condition;\n this.evaldCondition = !condition;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.elements = this.getElements(elements);\n this.mixinElements_ = undefined;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.elements, this);\n};\n\nSelector.prototype = Object.assign(new Node(), {\n type: 'Selector',\n\n accept(visitor) {\n if (this.elements) {\n this.elements = visitor.visitArray(this.elements);\n }\n if (this.extendList) {\n this.extendList = visitor.visitArray(this.extendList);\n }\n if (this.condition) {\n this.condition = visitor.visit(this.condition);\n }\n },\n\n createDerived(elements, extendList, evaldCondition) {\n elements = this.getElements(elements);\n const newSelector = new Selector(elements, extendList || this.extendList,\n null, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n newSelector.evaldCondition = (evaldCondition != null) ? evaldCondition : this.evaldCondition;\n newSelector.mediaEmpty = this.mediaEmpty;\n return newSelector;\n },\n\n getElements(els) {\n if (!els) {\n return [new Element('', '&', false, this._index, this._fileInfo)];\n }\n if (typeof els === 'string') {\n this.parse.parseNode(\n els, \n ['selector'],\n this._index, \n this._fileInfo, \n function(err, result) {\n if (err) {\n throw new LessError({\n index: err.index,\n message: err.message\n }, this.parse.imports, this._fileInfo.filename);\n }\n els = result[0].elements;\n });\n }\n return els;\n },\n\n createEmptySelectors() {\n const el = new Element('', '&', false, this._index, this._fileInfo), sels = [new Selector([el], null, null, this._index, this._fileInfo)];\n sels[0].mediaEmpty = true;\n return sels;\n },\n\n match(other) {\n const elements = this.elements;\n const len = elements.length;\n let olen;\n let i;\n\n other = other.mixinElements();\n olen = other.length;\n if (olen === 0 || len < olen) {\n return 0;\n } else {\n for (i = 0; i < olen; i++) {\n if (elements[i].value !== other[i]) {\n return 0;\n }\n }\n }\n\n return olen; // return number of matched elements\n },\n\n mixinElements() {\n if (this.mixinElements_) {\n return this.mixinElements_;\n }\n\n let elements = this.elements.map( function(v) {\n return v.combinator.value + (v.value.value || v.value);\n }).join('').match(/[,&#\\*\\.\\w-]([\\w-]|(\\\\.))*/g);\n\n if (elements) {\n if (elements[0] === '&') {\n elements.shift();\n }\n } else {\n elements = [];\n }\n\n return (this.mixinElements_ = elements);\n },\n\n isJustParentSelector() {\n return !this.mediaEmpty &&\n this.elements.length === 1 &&\n this.elements[0].value === '&' &&\n (this.elements[0].combinator.value === ' ' || this.elements[0].combinator.value === '');\n },\n\n eval(context) {\n const evaldCondition = this.condition && this.condition.eval(context);\n let elements = this.elements;\n let extendList = this.extendList;\n\n elements = elements && elements.map(function (e) { return e.eval(context); });\n extendList = extendList && extendList.map(function(extend) { return extend.eval(context); });\n\n return this.createDerived(elements, extendList, evaldCondition);\n },\n\n genCSS(context, output) {\n let i, element;\n if ((!context || !context.firstSelector) && this.elements[0].combinator.value === '') {\n output.add(' ', this.fileInfo(), this.getIndex());\n }\n for (i = 0; i < this.elements.length; i++) {\n element = this.elements[i];\n element.genCSS(context, output);\n }\n },\n\n getIsOutput() {\n return this.evaldCondition;\n }\n});\n\nexport default Selector;\n","import Node from './node';\n\nconst Value = function(value) {\n if (!value) {\n throw new Error('Value requires an array argument');\n }\n if (!Array.isArray(value)) {\n this.value = [ value ];\n }\n else {\n this.value = value;\n }\n};\n\nValue.prototype = Object.assign(new Node(), {\n type: 'Value',\n\n accept(visitor) {\n if (this.value) {\n this.value = visitor.visitArray(this.value);\n }\n },\n\n eval(context) {\n if (this.value.length === 1) {\n return this.value[0].eval(context);\n } else {\n return new Value(this.value.map(function (v) {\n return v.eval(context);\n }));\n }\n },\n\n genCSS(context, output) {\n let i;\n for (i = 0; i < this.value.length; i++) {\n this.value[i].genCSS(context, output);\n if (i + 1 < this.value.length) {\n output.add((context && context.compress) ? ',' : ', ');\n }\n }\n }\n});\n\nexport default Value;\n","import Node from './node';\n\nconst Keyword = function(value) {\n this.value = value;\n};\n\nKeyword.prototype = Object.assign(new Node(), {\n type: 'Keyword',\n\n genCSS(context, output) {\n if (this.value === '%') { throw { type: 'Syntax', message: 'Invalid % without number' }; }\n output.add(this.value);\n }\n});\n\nKeyword.True = new Keyword('true');\nKeyword.False = new Keyword('false');\n\nexport default Keyword;\n","import Node from './node';\n\nconst Anonymous = function(value, index, currentFileInfo, mapLines, rulesetLike, visibilityInfo) {\n this.value = value;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.mapLines = mapLines;\n this.rulesetLike = (typeof rulesetLike === 'undefined') ? false : rulesetLike;\n this.allowRoot = true;\n this.copyVisibilityInfo(visibilityInfo);\n}\n\nAnonymous.prototype = Object.assign(new Node(), {\n type: 'Anonymous',\n eval() {\n return new Anonymous(this.value, this._index, this._fileInfo, this.mapLines, this.rulesetLike, this.visibilityInfo());\n },\n compare(other) {\n return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n },\n isRulesetLike() {\n return this.rulesetLike;\n },\n genCSS(context, output) {\n this.nodeVisible = Boolean(this.value);\n if (this.nodeVisible) {\n output.add(this.value, this._fileInfo, this._index, this.mapLines);\n }\n }\n})\n\nexport default Anonymous;\n","import Node from './node';\nimport Value from './value';\nimport Keyword from './keyword';\nimport Anonymous from './anonymous';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\nfunction evalName(context, name) {\n let value = '';\n let i;\n const n = name.length;\n const output = {add: function (s) {value += s;}};\n for (i = 0; i < n; i++) {\n name[i].eval(context).genCSS(context, output);\n }\n return value;\n}\n\nconst Declaration = function(name, value, important, merge, index, currentFileInfo, inline, variable) {\n this.name = name;\n this.value = (value instanceof Node) ? value : new Value([value ? new Anonymous(value) : null]);\n this.important = important ? ` ${important.trim()}` : '';\n this.merge = merge;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.inline = inline || false;\n this.variable = (variable !== undefined) ? variable\n : (name.charAt && (name.charAt(0) === '@'));\n this.allowRoot = true;\n this.setParent(this.value, this);\n};\n\nDeclaration.prototype = Object.assign(new Node(), {\n type: 'Declaration',\n\n genCSS(context, output) {\n output.add(this.name + (context.compress ? ':' : ': '), this.fileInfo(), this.getIndex());\n try {\n this.value.genCSS(context, output);\n }\n catch (e) {\n e.index = this._index;\n e.filename = this._fileInfo.filename;\n throw e;\n }\n output.add(this.important + ((this.inline || (context.lastRule && context.compress)) ? '' : ';'), this._fileInfo, this._index);\n },\n\n eval(context) {\n let mathBypass = false, prevMath, name = this.name, evaldValue, variable = this.variable;\n if (typeof name !== 'string') {\n // expand 'primitive' name directly to get\n // things faster (~10% for benchmark.less):\n name = (name.length === 1) && (name[0] instanceof Keyword) ?\n name[0].value : evalName(context, name);\n variable = false; // never treat expanded interpolation as new variable name\n }\n\n // @todo remove when parens-division is default\n if (name === 'font' && context.math === MATH.ALWAYS) {\n mathBypass = true;\n prevMath = context.math;\n context.math = MATH.PARENS_DIVISION;\n }\n try {\n context.importantScope.push({});\n evaldValue = this.value.eval(context);\n\n if (!this.variable && evaldValue.type === 'DetachedRuleset') {\n throw { message: 'Rulesets cannot be evaluated on a property.',\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n let important = this.important;\n const importantResult = context.importantScope.pop();\n if (!important && importantResult.important) {\n important = importantResult.important;\n }\n\n return new Declaration(name,\n evaldValue,\n important,\n this.merge,\n this.getIndex(), this.fileInfo(), this.inline,\n variable);\n }\n catch (e) {\n if (typeof e.index !== 'number') {\n e.index = this.getIndex();\n e.filename = this.fileInfo().filename;\n }\n throw e;\n }\n finally {\n if (mathBypass) {\n context.math = prevMath;\n }\n }\n },\n\n makeImportant() {\n return new Declaration(this.name,\n this.value,\n '!important',\n this.merge,\n this.getIndex(), this.fileInfo(), this.inline);\n }\n});\n\nexport default Declaration;","class debugInfo {\n constructor(context, ctx, lineSeparator) {\n let result = '';\n if (context.dumpLineNumbers && !context.compress) {\n switch (context.dumpLineNumbers) {\n case 'comments':\n result = debugInfo.asComment(ctx);\n break;\n case 'mediaquery':\n result = debugInfo.asMediaQuery(ctx);\n break;\n case 'all':\n result = debugInfo.asComment(ctx) + (lineSeparator || '') + debugInfo.asMediaQuery(ctx);\n break;\n }\n }\n return result;\n }\n\n static asComment(ctx) {\n return `/* line ${ctx.debugInfo.lineNumber}, ${ctx.debugInfo.fileName} */\\n`;\n }\n\n static asMediaQuery(ctx) {\n let filenameWithProtocol = ctx.debugInfo.fileName;\n if (!/^[a-z]+:\\/\\//i.test(filenameWithProtocol)) {\n filenameWithProtocol = `file://${filenameWithProtocol}`;\n }\n return `@media -sass-debug-info{filename{font-family:${filenameWithProtocol.replace(/([.:\\/\\\\])/g, function (a) {\n if (a == '\\\\') {\n a = '\\/';\n }\n return `\\\\${a}`;\n})}}line{font-family:\\\\00003${ctx.debugInfo.lineNumber}}}\\n`;\n }\n}\n\nexport default debugInfo;\n","import Node from './node';\nimport getDebugInfo from './debug-info';\n\nconst Comment = function(value, isLineComment, index, currentFileInfo) {\n this.value = value;\n this.isLineComment = isLineComment;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.allowRoot = true;\n}\n\nComment.prototype = Object.assign(new Node(), {\n type: 'Comment',\n\n genCSS(context, output) {\n if (this.debugInfo) {\n output.add(getDebugInfo(context, this), this.fileInfo(), this.getIndex());\n }\n output.add(this.value);\n },\n\n isSilent(context) {\n const isCompressed = context.compress && this.value[2] !== '!';\n return this.isLineComment || isCompressed;\n }\n});\n\nexport default Comment;\n","const contexts = {};\nexport default contexts;\nimport * as Constants from './constants';\n\nconst copyFromOriginal = function copyFromOriginal(original, destination, propertiesToCopy) {\n if (!original) { return; }\n\n for (let i = 0; i < propertiesToCopy.length; i++) {\n if (original.hasOwnProperty(propertiesToCopy[i])) {\n destination[propertiesToCopy[i]] = original[propertiesToCopy[i]];\n }\n }\n};\n\n/*\n parse is used whilst parsing\n */\nconst parseCopyProperties = [\n // options\n 'paths', // option - unmodified - paths to search for imports on\n 'rewriteUrls', // option - whether to adjust URL's to be relative\n 'rootpath', // option - rootpath to append to URL's\n 'strictImports', // option -\n 'insecure', // option - whether to allow imports from insecure ssl hosts\n 'dumpLineNumbers', // option - whether to dump line numbers\n 'compress', // option - whether to compress\n 'syncImport', // option - whether to import synchronously\n 'chunkInput', // option - whether to chunk input. more performant but causes parse issues.\n 'mime', // browser only - mime type for sheet import\n 'useFileCache', // browser only - whether to use the per file session cache\n // context\n 'processImports', // option & context - whether to process imports. if false then imports will not be imported.\n // Used by the import manager to stop multiple import visitors being created.\n 'pluginManager' // Used as the plugin manager for the session\n];\n\ncontexts.Parse = function(options) {\n copyFromOriginal(options, this, parseCopyProperties);\n\n if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n};\n\nconst evalCopyProperties = [\n 'paths', // additional include paths\n 'compress', // whether to compress\n 'math', // whether math has to be within parenthesis\n 'strictUnits', // whether units need to evaluate correctly\n 'sourceMap', // whether to output a source map\n 'importMultiple', // whether we are currently importing multiple copies\n 'urlArgs', // whether to add args into url tokens\n 'javascriptEnabled', // option - whether Inline JavaScript is enabled. if undefined, defaults to false\n 'pluginManager', // Used as the plugin manager for the session\n 'importantScope', // used to bubble up !important statements\n 'rewriteUrls' // option - whether to adjust URL's to be relative\n];\n\ncontexts.Eval = function(options, frames) {\n copyFromOriginal(options, this, evalCopyProperties);\n\n if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n\n this.frames = frames || [];\n this.importantScope = this.importantScope || [];\n};\n\ncontexts.Eval.prototype.enterCalc = function () {\n if (!this.calcStack) {\n this.calcStack = [];\n }\n this.calcStack.push(true);\n this.inCalc = true;\n};\n\ncontexts.Eval.prototype.exitCalc = function () {\n this.calcStack.pop();\n if (!this.calcStack.length) {\n this.inCalc = false;\n }\n};\n\ncontexts.Eval.prototype.inParenthesis = function () {\n if (!this.parensStack) {\n this.parensStack = [];\n }\n this.parensStack.push(true);\n};\n\ncontexts.Eval.prototype.outOfParenthesis = function () {\n this.parensStack.pop();\n};\n\ncontexts.Eval.prototype.inCalc = false;\ncontexts.Eval.prototype.mathOn = true;\ncontexts.Eval.prototype.isMathOn = function (op) {\n if (!this.mathOn) {\n return false;\n }\n if (op === '/' && this.math !== Constants.Math.ALWAYS && (!this.parensStack || !this.parensStack.length)) {\n return false;\n }\n if (this.math > Constants.Math.PARENS_DIVISION) {\n return this.parensStack && this.parensStack.length;\n }\n return true;\n};\n\ncontexts.Eval.prototype.pathRequiresRewrite = function (path) {\n const isRelative = this.rewriteUrls === Constants.RewriteUrls.LOCAL ? isPathLocalRelative : isPathRelative;\n\n return isRelative(path);\n};\n\ncontexts.Eval.prototype.rewritePath = function (path, rootpath) {\n let newPath;\n\n rootpath = rootpath || '';\n newPath = this.normalizePath(rootpath + path);\n\n // If a path was explicit relative and the rootpath was not an absolute path\n // we must ensure that the new path is also explicit relative.\n if (isPathLocalRelative(path) &&\n isPathRelative(rootpath) &&\n isPathLocalRelative(newPath) === false) {\n newPath = `./${newPath}`;\n }\n\n return newPath;\n};\n\ncontexts.Eval.prototype.normalizePath = function (path) {\n const segments = path.split('/').reverse();\n let segment;\n\n path = [];\n while (segments.length !== 0) {\n segment = segments.pop();\n switch ( segment ) {\n case '.':\n break;\n case '..':\n if ((path.length === 0) || (path[path.length - 1] === '..')) {\n path.push( segment );\n } else {\n path.pop();\n }\n break;\n default:\n path.push(segment);\n break;\n }\n }\n\n return path.join('/');\n};\n\nfunction isPathRelative(path) {\n return !/^(?:[a-z-]+:|\\/|#)/i.test(path);\n}\n\nfunction isPathLocalRelative(path) {\n return path.charAt(0) === '.';\n}\n\n// todo - do the same for the toCSS ?\n","function makeRegistry( base ) {\n return {\n _data: {},\n add: function(name, func) {\n // precautionary case conversion, as later querying of\n // the registry by function-caller uses lower case as well.\n name = name.toLowerCase();\n\n if (this._data.hasOwnProperty(name)) {\n // TODO warn\n }\n this._data[name] = func;\n },\n addMultiple: function(functions) {\n Object.keys(functions).forEach(\n name => {\n this.add(name, functions[name]);\n });\n },\n get: function(name) {\n return this._data[name] || ( base && base.get( name ));\n },\n getLocalFunctions: function() {\n return this._data;\n },\n inherit: function() {\n return makeRegistry( this );\n },\n create: function(base) {\n return makeRegistry(base);\n }\n };\n}\n\nexport default makeRegistry( null );","import Keyword from '../tree/keyword';\n\nconst defaultFunc = {\n eval: function () {\n const v = this.value_;\n const e = this.error_;\n if (e) {\n throw e;\n }\n if (v != null) {\n return v ? Keyword.True : Keyword.False;\n }\n },\n value: function (v) {\n this.value_ = v;\n },\n error: function (e) {\n this.error_ = e;\n },\n reset: function () {\n this.value_ = this.error_ = null;\n }\n};\n\nexport default defaultFunc;\n","import Node from './node';\nimport Declaration from './declaration';\nimport Keyword from './keyword';\nimport Comment from './comment';\nimport Paren from './paren';\nimport Selector from './selector';\nimport Element from './element';\nimport Anonymous from './anonymous';\nimport contexts from '../contexts';\nimport globalFunctionRegistry from '../functions/function-registry';\nimport defaultFunc from '../functions/default';\nimport getDebugInfo from './debug-info';\nimport * as utils from '../utils';\n\nconst Ruleset = function(selectors, rules, strictImports, visibilityInfo) {\n this.selectors = selectors;\n this.rules = rules;\n this._lookups = {};\n this._variables = null;\n this._properties = null;\n this.strictImports = strictImports;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n\n this.setParent(this.selectors, this);\n this.setParent(this.rules, this);\n}\n\nRuleset.prototype = Object.assign(new Node(), {\n type: 'Ruleset',\n isRuleset: true,\n\n isRulesetLike() { return true; },\n\n accept(visitor) {\n if (this.paths) {\n this.paths = visitor.visitArray(this.paths, true);\n } else if (this.selectors) {\n this.selectors = visitor.visitArray(this.selectors);\n }\n if (this.rules && this.rules.length) {\n this.rules = visitor.visitArray(this.rules);\n }\n },\n\n eval(context) {\n const that = this;\n let selectors;\n let selCnt;\n let selector;\n let i;\n let hasVariable;\n let hasOnePassingSelector = false;\n\n if (this.selectors && (selCnt = this.selectors.length)) {\n selectors = new Array(selCnt);\n defaultFunc.error({\n type: 'Syntax',\n message: 'it is currently only allowed in parametric mixin guards,'\n });\n\n for (i = 0; i < selCnt; i++) {\n selector = this.selectors[i].eval(context);\n for (var j = 0; j < selector.elements.length; j++) {\n if (selector.elements[j].isVariable) {\n hasVariable = true;\n break;\n }\n }\n selectors[i] = selector;\n if (selector.evaldCondition) {\n hasOnePassingSelector = true;\n }\n }\n\n if (hasVariable) {\n const toParseSelectors = new Array(selCnt);\n for (i = 0; i < selCnt; i++) {\n selector = selectors[i];\n toParseSelectors[i] = selector.toCSS(context);\n }\n this.parse.parseNode(\n toParseSelectors.join(','),\n [\"selectors\"], \n selectors[0].getIndex(), \n selectors[0].fileInfo(), \n function(err, result) {\n if (result) {\n selectors = utils.flattenArray(result);\n }\n });\n }\n\n defaultFunc.reset();\n } else {\n hasOnePassingSelector = true;\n }\n\n let rules = this.rules ? utils.copyArray(this.rules) : null;\n const ruleset = new Ruleset(selectors, rules, this.strictImports, this.visibilityInfo());\n let rule;\n let subRule;\n\n ruleset.originalRuleset = this;\n ruleset.root = this.root;\n ruleset.firstRoot = this.firstRoot;\n ruleset.allowImports = this.allowImports;\n\n if (this.debugInfo) {\n ruleset.debugInfo = this.debugInfo;\n }\n\n if (!hasOnePassingSelector) {\n rules.length = 0;\n }\n\n // inherit a function registry from the frames stack when possible;\n // otherwise from the global registry\n ruleset.functionRegistry = (function (frames) {\n let i = 0;\n const n = frames.length;\n let found;\n for ( ; i !== n ; ++i ) {\n found = frames[ i ].functionRegistry;\n if ( found ) { return found; }\n }\n return globalFunctionRegistry;\n }(context.frames)).inherit();\n\n // push the current ruleset to the frames stack\n const ctxFrames = context.frames;\n ctxFrames.unshift(ruleset);\n\n // currrent selectors\n let ctxSelectors = context.selectors;\n if (!ctxSelectors) {\n context.selectors = ctxSelectors = [];\n }\n ctxSelectors.unshift(this.selectors);\n\n // Evaluate imports\n if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) {\n ruleset.evalImports(context);\n }\n\n // Store the frames around mixin definitions,\n // so they can be evaluated like closures when the time comes.\n const rsRules = ruleset.rules;\n for (i = 0; (rule = rsRules[i]); i++) {\n if (rule.evalFirst) {\n rsRules[i] = rule.eval(context);\n }\n }\n\n const mediaBlockCount = (context.mediaBlocks && context.mediaBlocks.length) || 0;\n\n // Evaluate mixin calls.\n for (i = 0; (rule = rsRules[i]); i++) {\n if (rule.type === 'MixinCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).filter(function(r) {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope if the variable is\n // already there. consider returning false here\n // but we need a way to \"return\" variable from mixins\n return !(ruleset.variable(r.name));\n }\n return true;\n });\n rsRules.splice.apply(rsRules, [i, 1].concat(rules));\n i += rules.length - 1;\n ruleset.resetCache();\n } else if (rule.type === 'VariableCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).rules.filter(function(r) {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope at all\n return false;\n }\n return true;\n });\n rsRules.splice.apply(rsRules, [i, 1].concat(rules));\n i += rules.length - 1;\n ruleset.resetCache();\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n if (!rule.evalFirst) {\n rsRules[i] = rule = rule.eval ? rule.eval(context) : rule;\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n // for rulesets, check if it is a css guard and can be removed\n if (rule instanceof Ruleset && rule.selectors && rule.selectors.length === 1) {\n // check if it can be folded in (e.g. & where)\n if (rule.selectors[0] && rule.selectors[0].isJustParentSelector()) {\n rsRules.splice(i--, 1);\n\n for (var j = 0; (subRule = rule.rules[j]); j++) {\n if (subRule instanceof Node) {\n subRule.copyVisibilityInfo(rule.visibilityInfo());\n if (!(subRule instanceof Declaration) || !subRule.variable) {\n rsRules.splice(++i, 0, subRule);\n }\n }\n }\n }\n }\n }\n\n // Pop the stack\n ctxFrames.shift();\n ctxSelectors.shift();\n\n if (context.mediaBlocks) {\n for (i = mediaBlockCount; i < context.mediaBlocks.length; i++) {\n context.mediaBlocks[i].bubbleSelectors(selectors);\n }\n }\n\n return ruleset;\n },\n\n evalImports(context) {\n const rules = this.rules;\n let i;\n let importRules;\n if (!rules) { return; }\n\n for (i = 0; i < rules.length; i++) {\n if (rules[i].type === 'Import') {\n importRules = rules[i].eval(context);\n if (importRules && (importRules.length || importRules.length === 0)) {\n rules.splice.apply(rules, [i, 1].concat(importRules));\n i += importRules.length - 1;\n } else {\n rules.splice(i, 1, importRules);\n }\n this.resetCache();\n }\n }\n },\n\n makeImportant() {\n const result = new Ruleset(this.selectors, this.rules.map(function (r) {\n if (r.makeImportant) {\n return r.makeImportant();\n } else {\n return r;\n }\n }), this.strictImports, this.visibilityInfo());\n\n return result;\n },\n\n matchArgs(args) {\n return !args || args.length === 0;\n },\n\n // lets you call a css selector with a guard\n matchCondition(args, context) {\n const lastSelector = this.selectors[this.selectors.length - 1];\n if (!lastSelector.evaldCondition) {\n return false;\n }\n if (lastSelector.condition &&\n !lastSelector.condition.eval(\n new contexts.Eval(context,\n context.frames))) {\n return false;\n }\n return true;\n },\n\n resetCache() {\n this._rulesets = null;\n this._variables = null;\n this._properties = null;\n this._lookups = {};\n },\n\n variables() {\n if (!this._variables) {\n this._variables = !this.rules ? {} : this.rules.reduce(function (hash, r) {\n if (r instanceof Declaration && r.variable === true) {\n hash[r.name] = r;\n }\n // when evaluating variables in an import statement, imports have not been eval'd\n // so we need to go inside import statements.\n // guard against root being a string (in the case of inlined less)\n if (r.type === 'Import' && r.root && r.root.variables) {\n const vars = r.root.variables();\n for (const name in vars) {\n if (vars.hasOwnProperty(name)) {\n hash[name] = r.root.variable(name);\n }\n }\n }\n return hash;\n }, {});\n }\n return this._variables;\n },\n\n properties() {\n if (!this._properties) {\n this._properties = !this.rules ? {} : this.rules.reduce(function (hash, r) {\n if (r instanceof Declaration && r.variable !== true) {\n const name = (r.name.length === 1) && (r.name[0] instanceof Keyword) ?\n r.name[0].value : r.name;\n // Properties don't overwrite as they can merge\n if (!hash[`$${name}`]) {\n hash[`$${name}`] = [ r ];\n }\n else {\n hash[`$${name}`].push(r);\n }\n }\n return hash;\n }, {});\n }\n return this._properties;\n },\n\n variable(name) {\n const decl = this.variables()[name];\n if (decl) {\n return this.parseValue(decl);\n }\n },\n\n property(name) {\n const decl = this.properties()[name];\n if (decl) {\n return this.parseValue(decl);\n }\n },\n\n lastDeclaration() {\n for (let i = this.rules.length; i > 0; i--) {\n const decl = this.rules[i - 1];\n if (decl instanceof Declaration) {\n return this.parseValue(decl);\n }\n }\n },\n\n parseValue(toParse) {\n const self = this;\n function transformDeclaration(decl) {\n if (decl.value instanceof Anonymous && !decl.parsed) {\n if (typeof decl.value.value === 'string') {\n this.parse.parseNode(\n decl.value.value,\n ['value', 'important'], \n decl.value.getIndex(), \n decl.fileInfo(), \n function(err, result) {\n if (err) {\n decl.parsed = true;\n }\n if (result) {\n decl.value = result[0];\n decl.important = result[1] || '';\n decl.parsed = true;\n }\n });\n } else {\n decl.parsed = true;\n }\n\n return decl;\n }\n else {\n return decl;\n }\n }\n if (!Array.isArray(toParse)) {\n return transformDeclaration.call(self, toParse);\n }\n else {\n const nodes = [];\n toParse.forEach(function(n) {\n nodes.push(transformDeclaration.call(self, n));\n });\n return nodes;\n }\n },\n\n rulesets() {\n if (!this.rules) { return []; }\n\n const filtRules = [];\n const rules = this.rules;\n let i;\n let rule;\n\n for (i = 0; (rule = rules[i]); i++) {\n if (rule.isRuleset) {\n filtRules.push(rule);\n }\n }\n\n return filtRules;\n },\n\n prependRule(rule) {\n const rules = this.rules;\n if (rules) {\n rules.unshift(rule);\n } else {\n this.rules = [ rule ];\n }\n this.setParent(rule, this);\n },\n\n find(selector, self, filter) {\n self = self || this;\n const rules = [];\n let match;\n let foundMixins;\n const key = selector.toCSS();\n\n if (key in this._lookups) { return this._lookups[key]; }\n\n this.rulesets().forEach(function (rule) {\n if (rule !== self) {\n for (let j = 0; j < rule.selectors.length; j++) {\n match = selector.match(rule.selectors[j]);\n if (match) {\n if (selector.elements.length > match) {\n if (!filter || filter(rule)) {\n foundMixins = rule.find(new Selector(selector.elements.slice(match)), self, filter);\n for (let i = 0; i < foundMixins.length; ++i) {\n foundMixins[i].path.push(rule);\n }\n Array.prototype.push.apply(rules, foundMixins);\n }\n } else {\n rules.push({ rule, path: []});\n }\n break;\n }\n }\n }\n });\n this._lookups[key] = rules;\n return rules;\n },\n\n genCSS(context, output) {\n let i;\n let j;\n const charsetRuleNodes = [];\n let ruleNodes = [];\n\n let // Line number debugging\n debugInfo;\n\n let rule;\n let path;\n\n context.tabLevel = (context.tabLevel || 0);\n\n if (!this.root) {\n context.tabLevel++;\n }\n\n const tabRuleStr = context.compress ? '' : Array(context.tabLevel + 1).join(' ');\n const tabSetStr = context.compress ? '' : Array(context.tabLevel).join(' ');\n let sep;\n\n let charsetNodeIndex = 0;\n let importNodeIndex = 0;\n for (i = 0; (rule = this.rules[i]); i++) {\n if (rule instanceof Comment) {\n if (importNodeIndex === i) {\n importNodeIndex++;\n }\n ruleNodes.push(rule);\n } else if (rule.isCharset && rule.isCharset()) {\n ruleNodes.splice(charsetNodeIndex, 0, rule);\n charsetNodeIndex++;\n importNodeIndex++;\n } else if (rule.type === 'Import') {\n ruleNodes.splice(importNodeIndex, 0, rule);\n importNodeIndex++;\n } else {\n ruleNodes.push(rule);\n }\n }\n ruleNodes = charsetRuleNodes.concat(ruleNodes);\n\n // If this is the root node, we don't render\n // a selector, or {}.\n if (!this.root) {\n debugInfo = getDebugInfo(context, this, tabSetStr);\n\n if (debugInfo) {\n output.add(debugInfo);\n output.add(tabSetStr);\n }\n\n const paths = this.paths;\n const pathCnt = paths.length;\n let pathSubCnt;\n\n sep = context.compress ? ',' : (`,\\n${tabSetStr}`);\n\n for (i = 0; i < pathCnt; i++) {\n path = paths[i];\n if (!(pathSubCnt = path.length)) { continue; }\n if (i > 0) { output.add(sep); }\n\n context.firstSelector = true;\n path[0].genCSS(context, output);\n\n context.firstSelector = false;\n for (j = 1; j < pathSubCnt; j++) {\n path[j].genCSS(context, output);\n }\n }\n\n output.add((context.compress ? '{' : ' {\\n') + tabRuleStr);\n }\n\n // Compile rules and rulesets\n for (i = 0; (rule = ruleNodes[i]); i++) {\n\n if (i + 1 === ruleNodes.length) {\n context.lastRule = true;\n }\n\n const currentLastRule = context.lastRule;\n if (rule.isRulesetLike(rule)) {\n context.lastRule = false;\n }\n\n if (rule.genCSS) {\n rule.genCSS(context, output);\n } else if (rule.value) {\n output.add(rule.value.toString());\n }\n\n context.lastRule = currentLastRule;\n\n if (!context.lastRule && rule.isVisible()) {\n output.add(context.compress ? '' : (`\\n${tabRuleStr}`));\n } else {\n context.lastRule = false;\n }\n }\n\n if (!this.root) {\n output.add((context.compress ? '}' : `\\n${tabSetStr}}`));\n context.tabLevel--;\n }\n\n if (!output.isEmpty() && !context.compress && this.firstRoot) {\n output.add('\\n');\n }\n },\n\n joinSelectors(paths, context, selectors) {\n for (let s = 0; s < selectors.length; s++) {\n this.joinSelector(paths, context, selectors[s]);\n }\n },\n\n joinSelector(paths, context, selector) {\n\n function createParenthesis(elementsToPak, originalElement) {\n let replacementParen, j;\n if (elementsToPak.length === 0) {\n replacementParen = new Paren(elementsToPak[0]);\n } else {\n const insideParent = new Array(elementsToPak.length);\n for (j = 0; j < elementsToPak.length; j++) {\n insideParent[j] = new Element(\n null,\n elementsToPak[j],\n originalElement.isVariable,\n originalElement._index,\n originalElement._fileInfo\n );\n }\n replacementParen = new Paren(new Selector(insideParent));\n }\n return replacementParen;\n }\n\n function createSelector(containedElement, originalElement) {\n let element, selector;\n element = new Element(null, containedElement, originalElement.isVariable, originalElement._index, originalElement._fileInfo);\n selector = new Selector([element]);\n return selector;\n }\n\n // joins selector path from `beginningPath` with selector path in `addPath`\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns concatenated path\n function addReplacementIntoPath(beginningPath, addPath, replacedElement, originalSelector) {\n let newSelectorPath, lastSelector, newJoinedSelector;\n // our new selector path\n newSelectorPath = [];\n\n // construct the joined selector - if & is the first thing this will be empty,\n // if not newJoinedSelector will be the last set of elements in the selector\n if (beginningPath.length > 0) {\n newSelectorPath = utils.copyArray(beginningPath);\n lastSelector = newSelectorPath.pop();\n newJoinedSelector = originalSelector.createDerived(utils.copyArray(lastSelector.elements));\n }\n else {\n newJoinedSelector = originalSelector.createDerived([]);\n }\n\n if (addPath.length > 0) {\n // /deep/ is a CSS4 selector - (removed, so should deprecate)\n // that is valid without anything in front of it\n // so if the & does not have a combinator that is \"\" or \" \" then\n // and there is a combinator on the parent, then grab that.\n // this also allows + a { & .b { .a & { ... though not sure why you would want to do that\n let combinator = replacedElement.combinator;\n\n const parentEl = addPath[0].elements[0];\n if (combinator.emptyOrWhitespace && !parentEl.combinator.emptyOrWhitespace) {\n combinator = parentEl.combinator;\n }\n // join the elements so far with the first part of the parent\n newJoinedSelector.elements.push(new Element(\n combinator,\n parentEl.value,\n replacedElement.isVariable,\n replacedElement._index,\n replacedElement._fileInfo\n ));\n newJoinedSelector.elements = newJoinedSelector.elements.concat(addPath[0].elements.slice(1));\n }\n\n // now add the joined selector - but only if it is not empty\n if (newJoinedSelector.elements.length !== 0) {\n newSelectorPath.push(newJoinedSelector);\n }\n\n // put together the parent selectors after the join (e.g. the rest of the parent)\n if (addPath.length > 1) {\n let restOfPath = addPath.slice(1);\n restOfPath = restOfPath.map(function (selector) {\n return selector.createDerived(selector.elements, []);\n });\n newSelectorPath = newSelectorPath.concat(restOfPath);\n }\n return newSelectorPath;\n }\n\n // joins selector path from `beginningPath` with every selector path in `addPaths` array\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns array with all concatenated paths\n function addAllReplacementsIntoPath( beginningPath, addPaths, replacedElement, originalSelector, result) {\n let j;\n for (j = 0; j < beginningPath.length; j++) {\n const newSelectorPath = addReplacementIntoPath(beginningPath[j], addPaths, replacedElement, originalSelector);\n result.push(newSelectorPath);\n }\n return result;\n }\n\n function mergeElementsOnToSelectors(elements, selectors) {\n let i, sel;\n\n if (elements.length === 0) {\n return ;\n }\n if (selectors.length === 0) {\n selectors.push([ new Selector(elements) ]);\n return;\n }\n\n for (i = 0; (sel = selectors[i]); i++) {\n // if the previous thing in sel is a parent this needs to join on to it\n if (sel.length > 0) {\n sel[sel.length - 1] = sel[sel.length - 1].createDerived(sel[sel.length - 1].elements.concat(elements));\n }\n else {\n sel.push(new Selector(elements));\n }\n }\n }\n\n // replace all parent selectors inside `inSelector` by content of `context` array\n // resulting selectors are returned inside `paths` array\n // returns true if `inSelector` contained at least one parent selector\n function replaceParentSelector(paths, context, inSelector) {\n // The paths are [[Selector]]\n // The first list is a list of comma separated selectors\n // The inner list is a list of inheritance separated selectors\n // e.g.\n // .a, .b {\n // .c {\n // }\n // }\n // == [[.a] [.c]] [[.b] [.c]]\n //\n let i, j, k, currentElements, newSelectors, selectorsMultiplied, sel, el, hadParentSelector = false, length, lastSelector;\n function findNestedSelector(element) {\n let maybeSelector;\n if (!(element.value instanceof Paren)) {\n return null;\n }\n\n maybeSelector = element.value.value;\n if (!(maybeSelector instanceof Selector)) {\n return null;\n }\n\n return maybeSelector;\n }\n\n // the elements from the current selector so far\n currentElements = [];\n // the current list of new selectors to add to the path.\n // We will build it up. We initiate it with one empty selector as we \"multiply\" the new selectors\n // by the parents\n newSelectors = [\n []\n ];\n\n for (i = 0; (el = inSelector.elements[i]); i++) {\n // non parent reference elements just get added\n if (el.value !== '&') {\n const nestedSelector = findNestedSelector(el);\n if (nestedSelector != null) {\n // merge the current list of non parent selector elements\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n const nestedPaths = [];\n let replaced;\n const replacedNewSelectors = [];\n replaced = replaceParentSelector(nestedPaths, context, nestedSelector);\n hadParentSelector = hadParentSelector || replaced;\n // the nestedPaths array should have only one member - replaceParentSelector does not multiply selectors\n for (k = 0; k < nestedPaths.length; k++) {\n const replacementSelector = createSelector(createParenthesis(nestedPaths[k], el), el);\n addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors);\n }\n newSelectors = replacedNewSelectors;\n currentElements = [];\n } else {\n currentElements.push(el);\n }\n\n } else {\n hadParentSelector = true;\n // the new list of selectors to add\n selectorsMultiplied = [];\n\n // merge the current list of non parent selector elements\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n // loop through our current selectors\n for (j = 0; j < newSelectors.length; j++) {\n sel = newSelectors[j];\n // if we don't have any parent paths, the & might be in a mixin so that it can be used\n // whether there are parents or not\n if (context.length === 0) {\n // the combinator used on el should now be applied to the next element instead so that\n // it is not lost\n if (sel.length > 0) {\n sel[0].elements.push(new Element(el.combinator, '', el.isVariable, el._index, el._fileInfo));\n }\n selectorsMultiplied.push(sel);\n }\n else {\n // and the parent selectors\n for (k = 0; k < context.length; k++) {\n // We need to put the current selectors\n // then join the last selector's elements on to the parents selectors\n const newSelectorPath = addReplacementIntoPath(sel, context[k], el, inSelector);\n // add that to our new set of selectors\n selectorsMultiplied.push(newSelectorPath);\n }\n }\n }\n\n // our new selectors has been multiplied, so reset the state\n newSelectors = selectorsMultiplied;\n currentElements = [];\n }\n }\n\n // if we have any elements left over (e.g. .a& .b == .b)\n // add them on to all the current selectors\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n for (i = 0; i < newSelectors.length; i++) {\n length = newSelectors[i].length;\n if (length > 0) {\n paths.push(newSelectors[i]);\n lastSelector = newSelectors[i][length - 1];\n newSelectors[i][length - 1] = lastSelector.createDerived(lastSelector.elements, inSelector.extendList);\n }\n }\n\n return hadParentSelector;\n }\n\n function deriveSelector(visibilityInfo, deriveFrom) {\n const newSelector = deriveFrom.createDerived(deriveFrom.elements, deriveFrom.extendList, deriveFrom.evaldCondition);\n newSelector.copyVisibilityInfo(visibilityInfo);\n return newSelector;\n }\n\n // joinSelector code follows\n let i, newPaths, hadParentSelector;\n\n newPaths = [];\n hadParentSelector = replaceParentSelector(newPaths, context, selector);\n\n if (!hadParentSelector) {\n if (context.length > 0) {\n newPaths = [];\n for (i = 0; i < context.length; i++) {\n\n const concatenated = context[i].map(deriveSelector.bind(this, selector.visibilityInfo()));\n\n concatenated.push(selector);\n newPaths.push(concatenated);\n }\n }\n else {\n newPaths = [[selector]];\n }\n }\n\n for (i = 0; i < newPaths.length; i++) {\n paths.push(newPaths[i]);\n }\n\n }\n});\n\nexport default Ruleset;\n","import Node from './node';\nimport Selector from './selector';\nimport Ruleset from './ruleset';\nimport Anonymous from './anonymous';\n\nconst AtRule = function(\n name,\n value,\n rules,\n index,\n currentFileInfo,\n debugInfo,\n isRooted,\n visibilityInfo\n) {\n let i;\n\n this.name = name;\n this.value = (value instanceof Node) ? value : (value ? new Anonymous(value) : value);\n if (rules) {\n if (Array.isArray(rules)) {\n this.rules = rules;\n } else {\n this.rules = [rules];\n this.rules[0].selectors = (new Selector([], null, null, index, currentFileInfo)).createEmptySelectors();\n }\n for (i = 0; i < this.rules.length; i++) {\n this.rules[i].allowImports = true;\n }\n this.setParent(this.rules, this);\n }\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.debugInfo = debugInfo;\n this.isRooted = isRooted || false;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n}\n\nAtRule.prototype = Object.assign(new Node(), {\n type: 'AtRule',\n accept(visitor) {\n const value = this.value, rules = this.rules;\n if (rules) {\n this.rules = visitor.visitArray(rules);\n }\n if (value) {\n this.value = visitor.visit(value);\n }\n },\n\n isRulesetLike() {\n return this.rules || !this.isCharset();\n },\n\n isCharset() {\n return '@charset' === this.name;\n },\n\n genCSS(context, output) {\n const value = this.value, rules = this.rules;\n output.add(this.name, this.fileInfo(), this.getIndex());\n if (value) {\n output.add(' ');\n value.genCSS(context, output);\n }\n if (rules) {\n this.outputRuleset(context, output, rules);\n } else {\n output.add(';');\n }\n },\n\n eval(context) {\n let mediaPathBackup, mediaBlocksBackup, value = this.value, rules = this.rules;\n\n // media stored inside other atrule should not bubble over it\n // backpup media bubbling information\n mediaPathBackup = context.mediaPath;\n mediaBlocksBackup = context.mediaBlocks;\n // deleted media bubbling information\n context.mediaPath = [];\n context.mediaBlocks = [];\n\n if (value) {\n value = value.eval(context);\n }\n if (rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n rules = [rules[0].eval(context)];\n rules[0].root = true;\n }\n // restore media bubbling information\n context.mediaPath = mediaPathBackup;\n context.mediaBlocks = mediaBlocksBackup;\n\n return new AtRule(this.name, value, rules,\n this.getIndex(), this.fileInfo(), this.debugInfo, this.isRooted, this.visibilityInfo());\n },\n\n variable(name) {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.variable.call(this.rules[0], name);\n }\n },\n\n find() {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.find.apply(this.rules[0], arguments);\n }\n },\n\n rulesets() {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.rulesets.apply(this.rules[0]);\n }\n },\n\n outputRuleset(context, output, rules) {\n const ruleCnt = rules.length;\n let i;\n context.tabLevel = (context.tabLevel | 0) + 1;\n\n // Compressed\n if (context.compress) {\n output.add('{');\n for (i = 0; i < ruleCnt; i++) {\n rules[i].genCSS(context, output);\n }\n output.add('}');\n context.tabLevel--;\n return;\n }\n\n // Non-compressed\n const tabSetStr = `\\n${Array(context.tabLevel).join(' ')}`, tabRuleStr = `${tabSetStr} `;\n if (!ruleCnt) {\n output.add(` {${tabSetStr}}`);\n } else {\n output.add(` {${tabRuleStr}`);\n rules[0].genCSS(context, output);\n for (i = 1; i < ruleCnt; i++) {\n output.add(tabRuleStr);\n rules[i].genCSS(context, output);\n }\n output.add(`${tabSetStr}}`);\n }\n\n context.tabLevel--;\n }\n})\n\nexport default AtRule;\n","import Node from './node';\nimport contexts from '../contexts';\nimport * as utils from '../utils';\n\nconst DetachedRuleset = function(ruleset, frames) {\n this.ruleset = ruleset;\n this.frames = frames;\n this.setParent(this.ruleset, this);\n};\n\nDetachedRuleset.prototype = Object.assign(new Node(), {\n type: 'DetachedRuleset',\n evalFirst: true,\n\n accept(visitor) {\n this.ruleset = visitor.visit(this.ruleset);\n },\n\n eval(context) {\n const frames = this.frames || utils.copyArray(context.frames);\n return new DetachedRuleset(this.ruleset, frames);\n },\n\n callEval(context) {\n return this.ruleset.eval(this.frames ? new contexts.Eval(context, this.frames.concat(context.frames)) : context);\n }\n});\n\nexport default DetachedRuleset;\n","import Node from './node';\nimport unitConversions from '../data/unit-conversions';\nimport * as utils from '../utils';\n\nconst Unit = function(numerator, denominator, backupUnit) {\n this.numerator = numerator ? utils.copyArray(numerator).sort() : [];\n this.denominator = denominator ? utils.copyArray(denominator).sort() : [];\n if (backupUnit) {\n this.backupUnit = backupUnit;\n } else if (numerator && numerator.length) {\n this.backupUnit = numerator[0];\n }\n};\n\nUnit.prototype = Object.assign(new Node(), {\n type: 'Unit',\n\n clone() {\n return new Unit(utils.copyArray(this.numerator), utils.copyArray(this.denominator), this.backupUnit);\n },\n\n genCSS(context, output) {\n // Dimension checks the unit is singular and throws an error if in strict math mode.\n const strictUnits = context && context.strictUnits;\n if (this.numerator.length === 1) {\n output.add(this.numerator[0]); // the ideal situation\n } else if (!strictUnits && this.backupUnit) {\n output.add(this.backupUnit);\n } else if (!strictUnits && this.denominator.length) {\n output.add(this.denominator[0]);\n }\n },\n\n toString() {\n let i, returnStr = this.numerator.join('*');\n for (i = 0; i < this.denominator.length; i++) {\n returnStr += `/${this.denominator[i]}`;\n }\n return returnStr;\n },\n\n compare(other) {\n return this.is(other.toString()) ? 0 : undefined;\n },\n\n is(unitString) {\n return this.toString().toUpperCase() === unitString.toUpperCase();\n },\n\n isLength() {\n return RegExp('^(px|em|ex|ch|rem|in|cm|mm|pc|pt|ex|vw|vh|vmin|vmax)$', 'gi').test(this.toCSS());\n },\n\n isEmpty() {\n return this.numerator.length === 0 && this.denominator.length === 0;\n },\n\n isSingular() {\n return this.numerator.length <= 1 && this.denominator.length === 0;\n },\n\n map(callback) {\n let i;\n\n for (i = 0; i < this.numerator.length; i++) {\n this.numerator[i] = callback(this.numerator[i], false);\n }\n\n for (i = 0; i < this.denominator.length; i++) {\n this.denominator[i] = callback(this.denominator[i], true);\n }\n },\n\n usedUnits() {\n let group;\n const result = {};\n let mapUnit;\n let groupName;\n\n mapUnit = function (atomicUnit) {\n /* jshint loopfunc:true */\n if (group.hasOwnProperty(atomicUnit) && !result[groupName]) {\n result[groupName] = atomicUnit;\n }\n\n return atomicUnit;\n };\n\n for (groupName in unitConversions) {\n if (unitConversions.hasOwnProperty(groupName)) {\n group = unitConversions[groupName];\n\n this.map(mapUnit);\n }\n }\n\n return result;\n },\n\n cancel() {\n const counter = {};\n let atomicUnit;\n let i;\n\n for (i = 0; i < this.numerator.length; i++) {\n atomicUnit = this.numerator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) + 1;\n }\n\n for (i = 0; i < this.denominator.length; i++) {\n atomicUnit = this.denominator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) - 1;\n }\n\n this.numerator = [];\n this.denominator = [];\n\n for (atomicUnit in counter) {\n if (counter.hasOwnProperty(atomicUnit)) {\n const count = counter[atomicUnit];\n\n if (count > 0) {\n for (i = 0; i < count; i++) {\n this.numerator.push(atomicUnit);\n }\n } else if (count < 0) {\n for (i = 0; i < -count; i++) {\n this.denominator.push(atomicUnit);\n }\n }\n }\n }\n\n this.numerator.sort();\n this.denominator.sort();\n }\n});\n\nexport default Unit;\n","import Node from './node';\nimport unitConversions from '../data/unit-conversions';\nimport Unit from './unit';\nimport Color from './color';\n\n//\n// A number with a unit\n//\nconst Dimension = function(value, unit) {\n this.value = parseFloat(value);\n if (isNaN(this.value)) {\n throw new Error('Dimension is not a number.');\n }\n this.unit = (unit && unit instanceof Unit) ? unit :\n new Unit(unit ? [unit] : undefined);\n this.setParent(this.unit, this);\n};\n\nDimension.prototype = Object.assign(new Node(), {\n type: 'Dimension',\n\n accept(visitor) {\n this.unit = visitor.visit(this.unit);\n },\n\n eval(context) {\n return this;\n },\n\n toColor() {\n return new Color([this.value, this.value, this.value]);\n },\n\n genCSS(context, output) {\n if ((context && context.strictUnits) && !this.unit.isSingular()) {\n throw new Error(`Multiple units in dimension. Correct the units or use the unit function. Bad unit: ${this.unit.toString()}`);\n }\n\n const value = this.fround(context, this.value);\n let strValue = String(value);\n\n if (value !== 0 && value < 0.000001 && value > -0.000001) {\n // would be output 1e-6 etc.\n strValue = value.toFixed(20).replace(/0+$/, '');\n }\n\n if (context && context.compress) {\n // Zero values doesn't need a unit\n if (value === 0 && this.unit.isLength()) {\n output.add(strValue);\n return;\n }\n\n // Float values doesn't need a leading zero\n if (value > 0 && value < 1) {\n strValue = (strValue).substr(1);\n }\n }\n\n output.add(strValue);\n this.unit.genCSS(context, output);\n },\n\n // In an operation between two Dimensions,\n // we default to the first Dimension's unit,\n // so `1px + 2` will yield `3px`.\n operate(context, op, other) {\n /* jshint noempty:false */\n let value = this._operate(context, op, this.value, other.value), unit = this.unit.clone();\n\n if (op === '+' || op === '-') {\n if (unit.numerator.length === 0 && unit.denominator.length === 0) {\n unit = other.unit.clone();\n if (this.unit.backupUnit) {\n unit.backupUnit = this.unit.backupUnit;\n }\n } else if (other.unit.numerator.length === 0 && unit.denominator.length === 0) {\n // do nothing\n } else {\n other = other.convertTo(this.unit.usedUnits());\n\n if (context.strictUnits && other.unit.toString() !== unit.toString()) {\n throw new Error(`Incompatible units. Change the units or use the unit function. Bad units: '${unit.toString()}' and '${other.unit.toString()}'.`);\n }\n\n value = this._operate(context, op, this.value, other.value);\n }\n } else if (op === '*') {\n unit.numerator = unit.numerator.concat(other.unit.numerator).sort();\n unit.denominator = unit.denominator.concat(other.unit.denominator).sort();\n unit.cancel();\n } else if (op === '/') {\n unit.numerator = unit.numerator.concat(other.unit.denominator).sort();\n unit.denominator = unit.denominator.concat(other.unit.numerator).sort();\n unit.cancel();\n }\n return new Dimension(value, unit);\n },\n\n compare(other) {\n let a, b;\n\n if (!(other instanceof Dimension)) {\n return undefined;\n }\n\n if (this.unit.isEmpty() || other.unit.isEmpty()) {\n a = this;\n b = other;\n } else {\n a = this.unify();\n b = other.unify();\n if (a.unit.compare(b.unit) !== 0) {\n return undefined;\n }\n }\n\n return Node.numericCompare(a.value, b.value);\n },\n\n unify() {\n return this.convertTo({ length: 'px', duration: 's', angle: 'rad' });\n },\n\n convertTo(conversions) {\n let value = this.value;\n const unit = this.unit.clone();\n let i;\n let groupName;\n let group;\n let targetUnit;\n let derivedConversions = {};\n let applyUnit;\n\n if (typeof conversions === 'string') {\n for (i in unitConversions) {\n if (unitConversions[i].hasOwnProperty(conversions)) {\n derivedConversions = {};\n derivedConversions[i] = conversions;\n }\n }\n conversions = derivedConversions;\n }\n applyUnit = function (atomicUnit, denominator) {\n /* jshint loopfunc:true */\n if (group.hasOwnProperty(atomicUnit)) {\n if (denominator) {\n value = value / (group[atomicUnit] / group[targetUnit]);\n } else {\n value = value * (group[atomicUnit] / group[targetUnit]);\n }\n\n return targetUnit;\n }\n\n return atomicUnit;\n };\n\n for (groupName in conversions) {\n if (conversions.hasOwnProperty(groupName)) {\n targetUnit = conversions[groupName];\n group = unitConversions[groupName];\n\n unit.map(applyUnit);\n }\n }\n\n unit.cancel();\n\n return new Dimension(value, unit);\n }\n});\n\nexport default Dimension;\n","import Node from './node';\nimport Color from './color';\nimport Dimension from './dimension';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\n\nconst Operation = function(op, operands, isSpaced) {\n this.op = op.trim();\n this.operands = operands;\n this.isSpaced = isSpaced;\n};\n\nOperation.prototype = Object.assign(new Node(), {\n type: 'Operation',\n\n accept(visitor) {\n this.operands = visitor.visitArray(this.operands);\n },\n\n eval(context) {\n let a = this.operands[0].eval(context), b = this.operands[1].eval(context), op;\n\n if (context.isMathOn(this.op)) {\n op = this.op === './' ? '/' : this.op;\n if (a instanceof Dimension && b instanceof Color) {\n a = a.toColor();\n }\n if (b instanceof Dimension && a instanceof Color) {\n b = b.toColor();\n }\n if (!a.operate) {\n if (a instanceof Operation && a.op === '/' && context.math === MATH.PARENS_DIVISION) {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n throw { type: 'Operation',\n message: 'Operation on an invalid type' };\n }\n\n return a.operate(context, op, b);\n } else {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n },\n\n genCSS(context, output) {\n this.operands[0].genCSS(context, output);\n if (this.isSpaced) {\n output.add(' ');\n }\n output.add(this.op);\n if (this.isSpaced) {\n output.add(' ');\n }\n this.operands[1].genCSS(context, output);\n }\n});\n\nexport default Operation;\n","import Node from './node';\nimport Paren from './paren';\nimport Comment from './comment';\nimport Dimension from './dimension';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\nconst Expression = function(value, noSpacing) {\n this.value = value;\n this.noSpacing = noSpacing;\n if (!value) {\n throw new Error('Expression requires an array parameter');\n }\n};\n\nExpression.prototype = Object.assign(new Node(), {\n type: 'Expression',\n\n accept(visitor) {\n this.value = visitor.visitArray(this.value);\n },\n\n eval(context) {\n let returnValue;\n const mathOn = context.isMathOn();\n const inParenthesis = this.parens;\n\n let doubleParen = false;\n if (inParenthesis) {\n context.inParenthesis();\n }\n if (this.value.length > 1) {\n returnValue = new Expression(this.value.map(function (e) {\n if (!e.eval) {\n return e;\n }\n return e.eval(context);\n }), this.noSpacing);\n } else if (this.value.length === 1) {\n if (this.value[0].parens && !this.value[0].parensInOp && !context.inCalc) {\n doubleParen = true;\n }\n returnValue = this.value[0].eval(context);\n } else {\n returnValue = this;\n }\n if (inParenthesis) {\n context.outOfParenthesis();\n }\n if (this.parens && this.parensInOp && !mathOn && !doubleParen \n && (!(returnValue instanceof Dimension))) {\n returnValue = new Paren(returnValue);\n }\n return returnValue;\n },\n\n genCSS(context, output) {\n for (let i = 0; i < this.value.length; i++) {\n this.value[i].genCSS(context, output);\n if (!this.noSpacing && i + 1 < this.value.length) {\n output.add(' ');\n }\n }\n },\n\n throwAwayComments() {\n this.value = this.value.filter(function(v) {\n return !(v instanceof Comment);\n });\n }\n});\n\nexport default Expression;\n","import Expression from '../tree/expression';\n\nclass functionCaller {\n constructor(name, context, index, currentFileInfo) {\n this.name = name.toLowerCase();\n this.index = index;\n this.context = context;\n this.currentFileInfo = currentFileInfo;\n\n this.func = context.frames[0].functionRegistry.get(this.name);\n }\n\n isValid() {\n return Boolean(this.func);\n }\n\n call(args) {\n if (!(Array.isArray(args))) {\n args = [args];\n }\n const evalArgs = this.func.evalArgs;\n if (evalArgs !== false) {\n args = args.map(a => a.eval(this.context));\n }\n const commentFilter = item => !(item.type === 'Comment');\n\n // This code is terrible and should be replaced as per this issue...\n // https://github.com/less/less.js/issues/2477\n args = args\n .filter(commentFilter)\n .map(item => {\n if (item.type === 'Expression') {\n const subNodes = item.value.filter(commentFilter);\n if (subNodes.length === 1) {\n return subNodes[0];\n } else {\n return new Expression(subNodes);\n }\n }\n return item;\n });\n\n if (evalArgs === false) {\n return this.func(this.context, ...args);\n }\n\n return this.func(...args);\n }\n}\n\nexport default functionCaller;\n","import Node from './node';\nimport Anonymous from './anonymous';\nimport FunctionCaller from '../functions/function-caller';\n\n//\n// A function call node.\n//\nconst Call = function(name, args, index, currentFileInfo) {\n this.name = name;\n this.args = args;\n this.calc = name === 'calc';\n this._index = index;\n this._fileInfo = currentFileInfo;\n}\n\nCall.prototype = Object.assign(new Node(), {\n type: 'Call',\n\n accept(visitor) {\n if (this.args) {\n this.args = visitor.visitArray(this.args);\n }\n },\n\n //\n // When evaluating a function call,\n // we either find the function in the functionRegistry,\n // in which case we call it, passing the evaluated arguments,\n // if this returns null or we cannot find the function, we\n // simply print it out as it appeared originally [2].\n //\n // The reason why we evaluate the arguments, is in the case where\n // we try to pass a variable to a function, like: `saturate(@color)`.\n // The function should receive the value, not the variable.\n //\n eval(context) {\n /**\n * Turn off math for calc(), and switch back on for evaluating nested functions\n */\n const currentMathContext = context.mathOn;\n context.mathOn = !this.calc;\n if (this.calc || context.inCalc) {\n context.enterCalc();\n }\n\n const exitCalc = () => {\n if (this.calc || context.inCalc) {\n context.exitCalc();\n }\n context.mathOn = currentMathContext;\n };\n\n let result;\n const funcCaller = new FunctionCaller(this.name, context, this.getIndex(), this.fileInfo());\n\n if (funcCaller.isValid()) {\n try {\n result = funcCaller.call(this.args);\n exitCalc();\n } catch (e) {\n if (e.hasOwnProperty('line') && e.hasOwnProperty('column')) {\n throw e;\n }\n throw { \n type: e.type || 'Runtime',\n message: `Error evaluating function \\`${this.name}\\`${e.message ? `: ${e.message}` : ''}`,\n index: this.getIndex(), \n filename: this.fileInfo().filename,\n line: e.lineNumber,\n column: e.columnNumber\n };\n }\n }\n\n if (result !== null && result !== undefined) {\n // Results that that are not nodes are cast as Anonymous nodes\n // Falsy values or booleans are returned as empty nodes\n if (!(result instanceof Node)) {\n if (!result || result === true) {\n result = new Anonymous(null); \n }\n else {\n result = new Anonymous(result.toString()); \n }\n \n }\n result._index = this._index;\n result._fileInfo = this._fileInfo;\n return result;\n }\n\n const args = this.args.map(a => a.eval(context));\n exitCalc();\n\n return new Call(this.name, args, this.getIndex(), this.fileInfo());\n },\n\n genCSS(context, output) {\n output.add(`${this.name}(`, this.fileInfo(), this.getIndex());\n\n for (let i = 0; i < this.args.length; i++) {\n this.args[i].genCSS(context, output);\n if (i + 1 < this.args.length) {\n output.add(', ');\n }\n }\n\n output.add(')');\n }\n});\n\nexport default Call;\n","import Node from './node';\nimport Call from './call';\n\nconst Variable = function(name, index, currentFileInfo) {\n this.name = name;\n this._index = index;\n this._fileInfo = currentFileInfo;\n};\n\nVariable.prototype = Object.assign(new Node(), {\n type: 'Variable',\n\n eval(context) {\n let variable, name = this.name;\n\n if (name.indexOf('@@') === 0) {\n name = `@${new Variable(name.slice(1), this.getIndex(), this.fileInfo()).eval(context).value}`;\n }\n\n if (this.evaluating) {\n throw { type: 'Name',\n message: `Recursive variable definition for ${name}`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n variable = this.find(context.frames, function (frame) {\n const v = frame.variable(name);\n if (v) {\n if (v.important) {\n const importantScope = context.importantScope[context.importantScope.length - 1];\n importantScope.important = v.important;\n }\n // If in calc, wrap vars in a function call to cascade evaluate args first\n if (context.inCalc) {\n return (new Call('_SELF', [v.value])).eval(context);\n }\n else {\n return v.value.eval(context);\n }\n }\n });\n if (variable) {\n this.evaluating = false;\n return variable;\n } else {\n throw { type: 'Name',\n message: `variable ${name} is undefined`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n },\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n});\n\nexport default Variable;\n","import Node from './node';\nimport Declaration from './declaration';\n\nconst Property = function(name, index, currentFileInfo) {\n this.name = name;\n this._index = index;\n this._fileInfo = currentFileInfo;\n};\n\nProperty.prototype = Object.assign(new Node(), {\n type: 'Property',\n\n eval(context) {\n let property;\n const name = this.name;\n // TODO: shorten this reference\n const mergeRules = context.pluginManager.less.visitors.ToCSSVisitor.prototype._mergeRules;\n\n if (this.evaluating) {\n throw { type: 'Name',\n message: `Recursive property reference for ${name}`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n property = this.find(context.frames, function (frame) {\n let v;\n const vArr = frame.property(name);\n if (vArr) {\n for (let i = 0; i < vArr.length; i++) {\n v = vArr[i];\n\n vArr[i] = new Declaration(v.name,\n v.value,\n v.important,\n v.merge,\n v.index,\n v.currentFileInfo,\n v.inline,\n v.variable\n );\n }\n mergeRules(vArr);\n\n v = vArr[vArr.length - 1];\n if (v.important) {\n const importantScope = context.importantScope[context.importantScope.length - 1];\n importantScope.important = v.important;\n }\n v = v.value.eval(context);\n return v;\n }\n });\n if (property) {\n this.evaluating = false;\n return property;\n } else {\n throw { type: 'Name',\n message: `Property '${name}' is undefined`,\n filename: this.currentFileInfo.filename,\n index: this.index };\n }\n },\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n});\n\nexport default Property;\n","import Node from './node';\n\nconst Attribute = function(key, op, value) {\n this.key = key;\n this.op = op;\n this.value = value;\n}\n\nAttribute.prototype = Object.assign(new Node(), {\n type: 'Attribute',\n\n eval(context) {\n return new Attribute(this.key.eval ? this.key.eval(context) : this.key,\n this.op, (this.value && this.value.eval) ? this.value.eval(context) : this.value);\n },\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n },\n\n toCSS(context) {\n let value = this.key.toCSS ? this.key.toCSS(context) : this.key;\n\n if (this.op) {\n value += this.op;\n value += (this.value.toCSS ? this.value.toCSS(context) : this.value);\n }\n\n return `[${value}]`;\n }\n})\n\nexport default Attribute;\n","import Node from './node';\nimport Variable from './variable';\nimport Property from './property';\n\n\nconst Quoted = function(str, content, escaped, index, currentFileInfo) {\n this.escaped = (escaped == null) ? true : escaped;\n this.value = content || '';\n this.quote = str.charAt(0);\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.variableRegex = /@\\{([\\w-]+)\\}/g;\n this.propRegex = /\\$\\{([\\w-]+)\\}/g;\n this.allowRoot = escaped;\n};\n\nQuoted.prototype = Object.assign(new Node(), {\n type: 'Quoted',\n\n genCSS(context, output) {\n if (!this.escaped) {\n output.add(this.quote, this.fileInfo(), this.getIndex());\n }\n output.add(this.value);\n if (!this.escaped) {\n output.add(this.quote);\n }\n },\n\n containsVariables() {\n return this.value.match(this.variableRegex);\n },\n\n eval(context) {\n const that = this;\n let value = this.value;\n const variableReplacement = function (_, name) {\n const v = new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v.value : v.toCSS();\n };\n const propertyReplacement = function (_, name) {\n const v = new Property(`$${name}`, that.getIndex(), that.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v.value : v.toCSS();\n };\n function iterativeReplace(value, regexp, replacementFnc) {\n let evaluatedValue = value;\n do {\n value = evaluatedValue.toString();\n evaluatedValue = value.replace(regexp, replacementFnc);\n } while (value !== evaluatedValue);\n return evaluatedValue;\n }\n value = iterativeReplace(value, this.variableRegex, variableReplacement);\n value = iterativeReplace(value, this.propRegex, propertyReplacement);\n return new Quoted(this.quote + value + this.quote, value, this.escaped, this.getIndex(), this.fileInfo());\n },\n\n compare(other) {\n // when comparing quoted strings allow the quote to differ\n if (other.type === 'Quoted' && !this.escaped && !other.escaped) {\n return Node.numericCompare(this.value, other.value);\n } else {\n return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n }\n }\n});\n\nexport default Quoted;\n","import Node from './node';\n\nfunction escapePath(path) {\n return path.replace(/[\\(\\)'\"\\s]/g, function(match) { return `\\\\${match}`; });\n}\n\nconst URL = function(val, index, currentFileInfo, isEvald) {\n this.value = val;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.isEvald = isEvald;\n};\n\nURL.prototype = Object.assign(new Node(), {\n type: 'URL',\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n },\n\n genCSS(context, output) {\n output.add('url(');\n this.value.genCSS(context, output);\n output.add(')');\n },\n\n eval(context) {\n const val = this.value.eval(context);\n let rootpath;\n\n if (!this.isEvald) {\n // Add the rootpath if the URL requires a rewrite\n rootpath = this.fileInfo() && this.fileInfo().rootpath;\n if (typeof rootpath === 'string' &&\n typeof val.value === 'string' &&\n context.pathRequiresRewrite(val.value)) {\n if (!val.quote) {\n rootpath = escapePath(rootpath);\n }\n val.value = context.rewritePath(val.value, rootpath);\n } else {\n val.value = context.normalizePath(val.value);\n }\n\n // Add url args if enabled\n if (context.urlArgs) {\n if (!val.value.match(/^\\s*data:/)) {\n const delimiter = val.value.indexOf('?') === -1 ? '?' : '&';\n const urlArgs = delimiter + context.urlArgs;\n if (val.value.indexOf('#') !== -1) {\n val.value = val.value.replace('#', `${urlArgs}#`);\n } else {\n val.value += urlArgs;\n }\n }\n }\n }\n\n return new URL(val, this.getIndex(), this.fileInfo(), true);\n }\n});\n\nexport default URL;\n","import Ruleset from './ruleset';\nimport Value from './value';\nimport Selector from './selector';\nimport Anonymous from './anonymous';\nimport Expression from './expression';\nimport AtRule from './atrule';\nimport * as utils from '../utils';\n\nconst Media = function(value, features, index, currentFileInfo, visibilityInfo) {\n this._index = index;\n this._fileInfo = currentFileInfo;\n\n const selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors();\n\n this.features = new Value(features);\n this.rules = [new Ruleset(selectors, value)];\n this.rules[0].allowImports = true;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n this.setParent(selectors, this);\n this.setParent(this.features, this);\n this.setParent(this.rules, this);\n};\n\nMedia.prototype = Object.assign(new AtRule(), {\n type: 'Media',\n\n isRulesetLike() {\n return true;\n },\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this.features);\n }\n if (this.rules) {\n this.rules = visitor.visitArray(this.rules);\n }\n },\n\n genCSS(context, output) {\n output.add('@media ', this._fileInfo, this._index);\n this.features.genCSS(context, output);\n this.outputRuleset(context, output, this.rules);\n },\n\n eval(context) {\n if (!context.mediaBlocks) {\n context.mediaBlocks = [];\n context.mediaPath = [];\n }\n\n const media = new Media(null, [], this._index, this._fileInfo, this.visibilityInfo());\n if (this.debugInfo) {\n this.rules[0].debugInfo = this.debugInfo;\n media.debugInfo = this.debugInfo;\n }\n \n media.features = this.features.eval(context);\n\n context.mediaPath.push(media);\n context.mediaBlocks.push(media);\n\n this.rules[0].functionRegistry = context.frames[0].functionRegistry.inherit();\n context.frames.unshift(this.rules[0]);\n media.rules = [this.rules[0].eval(context)];\n context.frames.shift();\n\n context.mediaPath.pop();\n\n return context.mediaPath.length === 0 ? media.evalTop(context) :\n media.evalNested(context);\n },\n\n evalTop(context) {\n let result = this;\n\n // Render all dependent Media blocks.\n if (context.mediaBlocks.length > 1) {\n const selectors = (new Selector([], null, null, this.getIndex(), this.fileInfo())).createEmptySelectors();\n result = new Ruleset(selectors, context.mediaBlocks);\n result.multiMedia = true;\n result.copyVisibilityInfo(this.visibilityInfo());\n this.setParent(result, this);\n }\n\n delete context.mediaBlocks;\n delete context.mediaPath;\n\n return result;\n },\n\n evalNested(context) {\n let i;\n let value;\n const path = context.mediaPath.concat([this]);\n\n // Extract the media-query conditions separated with `,` (OR).\n for (i = 0; i < path.length; i++) {\n value = path[i].features instanceof Value ?\n path[i].features.value : path[i].features;\n path[i] = Array.isArray(value) ? value : [value];\n }\n\n // Trace all permutations to generate the resulting media-query.\n //\n // (a, b and c) with nested (d, e) ->\n // a and d\n // a and e\n // b and c and d\n // b and c and e\n this.features = new Value(this.permute(path).map(path => {\n path = path.map(fragment => fragment.toCSS ? fragment : new Anonymous(fragment));\n\n for (i = path.length - 1; i > 0; i--) {\n path.splice(i, 0, new Anonymous('and'));\n }\n\n return new Expression(path);\n }));\n this.setParent(this.features, this);\n\n // Fake a tree-node that doesn't output anything.\n return new Ruleset([], []);\n },\n\n permute(arr) {\n if (arr.length === 0) {\n return [];\n } else if (arr.length === 1) {\n return arr[0];\n } else {\n const result = [];\n const rest = this.permute(arr.slice(1));\n for (let i = 0; i < rest.length; i++) {\n for (let j = 0; j < arr[0].length; j++) {\n result.push([arr[0][j]].concat(rest[i]));\n }\n }\n return result;\n }\n },\n\n bubbleSelectors(selectors) {\n if (!selectors) {\n return;\n }\n this.rules = [new Ruleset(utils.copyArray(selectors), [this.rules[0]])];\n this.setParent(this.rules, this);\n }\n});\n\nexport default Media;\n","import Node from './node';\nimport Media from './media';\nimport URL from './url';\nimport Quoted from './quoted';\nimport Ruleset from './ruleset';\nimport Anonymous from './anonymous';\nimport * as utils from '../utils';\nimport LessError from '../less-error';\n\n//\n// CSS @import node\n//\n// The general strategy here is that we don't want to wait\n// for the parsing to be completed, before we start importing\n// the file. That's because in the context of a browser,\n// most of the time will be spent waiting for the server to respond.\n//\n// On creation, we push the import path to our import queue, though\n// `import,push`, we also pass it a callback, which it'll call once\n// the file has been fetched, and parsed.\n//\nconst Import = function(path, features, options, index, currentFileInfo, visibilityInfo) {\n this.options = options;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.path = path;\n this.features = features;\n this.allowRoot = true;\n\n if (this.options.less !== undefined || this.options.inline) {\n this.css = !this.options.less || this.options.inline;\n } else {\n const pathValue = this.getPath();\n if (pathValue && /[#\\.\\&\\?]css([\\?;].*)?$/.test(pathValue)) {\n this.css = true;\n }\n }\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.features, this);\n this.setParent(this.path, this);\n};\n\nImport.prototype = Object.assign(new Node(), {\n type: 'Import',\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this.features);\n }\n this.path = visitor.visit(this.path);\n if (!this.options.isPlugin && !this.options.inline && this.root) {\n this.root = visitor.visit(this.root);\n }\n },\n\n genCSS(context, output) {\n if (this.css && this.path._fileInfo.reference === undefined) {\n output.add('@import ', this._fileInfo, this._index);\n this.path.genCSS(context, output);\n if (this.features) {\n output.add(' ');\n this.features.genCSS(context, output);\n }\n output.add(';');\n }\n },\n\n getPath() {\n return (this.path instanceof URL) ?\n this.path.value.value : this.path.value;\n },\n\n isVariableImport() {\n let path = this.path;\n if (path instanceof URL) {\n path = path.value;\n }\n if (path instanceof Quoted) {\n return path.containsVariables();\n }\n\n return true;\n },\n\n evalForImport(context) {\n let path = this.path;\n\n if (path instanceof URL) {\n path = path.value;\n }\n\n return new Import(path.eval(context), this.features, this.options, this._index, this._fileInfo, this.visibilityInfo());\n },\n\n evalPath(context) {\n const path = this.path.eval(context);\n const fileInfo = this._fileInfo;\n\n if (!(path instanceof URL)) {\n // Add the rootpath if the URL requires a rewrite\n const pathValue = path.value;\n if (fileInfo &&\n pathValue &&\n context.pathRequiresRewrite(pathValue)) {\n path.value = context.rewritePath(pathValue, fileInfo.rootpath);\n } else {\n path.value = context.normalizePath(path.value);\n }\n }\n\n return path;\n },\n\n eval(context) {\n const result = this.doEval(context);\n if (this.options.reference || this.blocksVisibility()) {\n if (result.length || result.length === 0) {\n result.forEach(function (node) {\n node.addVisibilityBlock();\n }\n );\n } else {\n result.addVisibilityBlock();\n }\n }\n return result;\n },\n\n doEval(context) {\n let ruleset;\n let registry;\n const features = this.features && this.features.eval(context);\n\n if (this.options.isPlugin) {\n if (this.root && this.root.eval) {\n try {\n this.root.eval(context);\n }\n catch (e) {\n e.message = 'Plugin error during evaluation';\n throw new LessError(e, this.root.imports, this.root.filename);\n }\n }\n registry = context.frames[0] && context.frames[0].functionRegistry;\n if ( registry && this.root && this.root.functions ) {\n registry.addMultiple( this.root.functions );\n }\n\n return [];\n }\n\n if (this.skip) {\n if (typeof this.skip === 'function') {\n this.skip = this.skip();\n }\n if (this.skip) {\n return [];\n }\n }\n if (this.options.inline) {\n const contents = new Anonymous(this.root, 0,\n {\n filename: this.importedFilename,\n reference: this.path._fileInfo && this.path._fileInfo.reference\n }, true, true);\n\n return this.features ? new Media([contents], this.features.value) : [contents];\n } else if (this.css) {\n const newImport = new Import(this.evalPath(context), features, this.options, this._index);\n if (!newImport.css && this.error) {\n throw this.error;\n }\n return newImport;\n } else if (this.root) {\n ruleset = new Ruleset(null, utils.copyArray(this.root.rules));\n ruleset.evalImports(context);\n\n return this.features ? new Media(ruleset.rules, this.features.value) : ruleset.rules;\n } else {\n return [];\n }\n }\n});\n\nexport default Import;\n","import Node from './node';\nimport Variable from './variable';\n\nconst JsEvalNode = function() {};\n\nJsEvalNode.prototype = Object.assign(new Node(), {\n evaluateJavaScript(expression, context) {\n let result;\n const that = this;\n const evalContext = {};\n\n if (!context.javascriptEnabled) {\n throw { message: 'Inline JavaScript is not enabled. Is it set in your options?',\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n expression = expression.replace(/@\\{([\\w-]+)\\}/g, function (_, name) {\n return that.jsify(new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context));\n });\n\n try {\n expression = new Function(`return (${expression})`);\n } catch (e) {\n throw { message: `JavaScript evaluation error: ${e.message} from \\`${expression}\\`` ,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n const variables = context.frames[0].variables();\n for (const k in variables) {\n if (variables.hasOwnProperty(k)) {\n /* jshint loopfunc:true */\n evalContext[k.slice(1)] = {\n value: variables[k].value,\n toJS: function () {\n return this.value.eval(context).toCSS();\n }\n };\n }\n }\n\n try {\n result = expression.call(evalContext);\n } catch (e) {\n throw { message: `JavaScript evaluation error: '${e.name}: ${e.message.replace(/[\"]/g, '\\'')}'` ,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n return result;\n },\n\n jsify(obj) {\n if (Array.isArray(obj.value) && (obj.value.length > 1)) {\n return `[${obj.value.map(function (v) { return v.toCSS(); }).join(', ')}]`;\n } else {\n return obj.toCSS();\n }\n }\n});\n\nexport default JsEvalNode;\n","import JsEvalNode from './js-eval-node';\nimport Dimension from './dimension';\nimport Quoted from './quoted';\nimport Anonymous from './anonymous';\n\nconst JavaScript = function(string, escaped, index, currentFileInfo) {\n this.escaped = escaped;\n this.expression = string;\n this._index = index;\n this._fileInfo = currentFileInfo;\n}\n\nJavaScript.prototype = Object.assign(new JsEvalNode(), {\n type: 'JavaScript',\n\n eval(context) {\n const result = this.evaluateJavaScript(this.expression, context);\n const type = typeof result;\n\n if (type === 'number' && !isNaN(result)) {\n return new Dimension(result);\n } else if (type === 'string') {\n return new Quoted(`\"${result}\"`, result, this.escaped, this._index);\n } else if (Array.isArray(result)) {\n return new Anonymous(result.join(', '));\n } else {\n return new Anonymous(result);\n }\n }\n});\n\nexport default JavaScript;\n","import Node from './node';\n\nconst Assignment = function(key, val) {\n this.key = key;\n this.value = val;\n}\n\nAssignment.prototype = Object.assign(new Node(), {\n type: 'Assignment',\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n },\n\n eval(context) {\n if (this.value.eval) {\n return new Assignment(this.key, this.value.eval(context));\n }\n return this;\n },\n\n genCSS(context, output) {\n output.add(`${this.key}=`);\n if (this.value.genCSS) {\n this.value.genCSS(context, output);\n } else {\n output.add(this.value);\n }\n }\n})\n\nexport default Assignment;\n","import Node from './node';\n\nconst Condition = function(op, l, r, i, negate) {\n this.op = op.trim();\n this.lvalue = l;\n this.rvalue = r;\n this._index = i;\n this.negate = negate;\n};\n\nCondition.prototype = Object.assign(new Node(), {\n type: 'Condition',\n\n accept(visitor) {\n this.lvalue = visitor.visit(this.lvalue);\n this.rvalue = visitor.visit(this.rvalue);\n },\n\n eval(context) {\n const result = (function (op, a, b) {\n switch (op) {\n case 'and': return a && b;\n case 'or': return a || b;\n default:\n switch (Node.compare(a, b)) {\n case -1:\n return op === '<' || op === '=<' || op === '<=';\n case 0:\n return op === '=' || op === '>=' || op === '=<' || op === '<=';\n case 1:\n return op === '>' || op === '>=';\n default:\n return false;\n }\n }\n })(this.op, this.lvalue.eval(context), this.rvalue.eval(context));\n\n return this.negate ? !result : result;\n }\n});\n\nexport default Condition;\n","import Node from './node';\n\nconst UnicodeDescriptor = function(value) {\n this.value = value;\n}\n\nUnicodeDescriptor.prototype = Object.assign(new Node(), {\n type: 'UnicodeDescriptor'\n})\n\nexport default UnicodeDescriptor;\n","import Node from './node';\nimport Operation from './operation';\nimport Dimension from './dimension';\n\nconst Negative = function(node) {\n this.value = node;\n};\n\nNegative.prototype = Object.assign(new Node(), {\n type: 'Negative',\n\n genCSS(context, output) {\n output.add('-');\n this.value.genCSS(context, output);\n },\n\n eval(context) {\n if (context.isMathOn()) {\n return (new Operation('*', [new Dimension(-1), this.value])).eval(context);\n }\n return new Negative(this.value.eval(context));\n }\n});\n\nexport default Negative;\n","import Node from './node';\nimport Selector from './selector';\n\nconst Extend = function(selector, option, index, currentFileInfo, visibilityInfo) {\n this.selector = selector;\n this.option = option;\n this.object_id = Extend.next_id++;\n this.parent_ids = [this.object_id];\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n\n switch (option) {\n case 'all':\n this.allowBefore = true;\n this.allowAfter = true;\n break;\n default:\n this.allowBefore = false;\n this.allowAfter = false;\n break;\n }\n this.setParent(this.selector, this);\n};\n\nExtend.prototype = Object.assign(new Node(), {\n type: 'Extend',\n\n accept(visitor) {\n this.selector = visitor.visit(this.selector);\n },\n\n eval(context) {\n return new Extend(this.selector.eval(context), this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n },\n\n clone(context) {\n return new Extend(this.selector, this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n },\n\n // it concatenates (joins) all selectors in selector array\n findSelfSelectors(selectors) {\n let selfElements = [], i, selectorElements;\n\n for (i = 0; i < selectors.length; i++) {\n selectorElements = selectors[i].elements;\n // duplicate the logic in genCSS function inside the selector node.\n // future TODO - move both logics into the selector joiner visitor\n if (i > 0 && selectorElements.length && selectorElements[0].combinator.value === '') {\n selectorElements[0].combinator.value = ' ';\n }\n selfElements = selfElements.concat(selectors[i].elements);\n }\n\n this.selfSelectors = [new Selector(selfElements)];\n this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo());\n }\n});\n\nExtend.next_id = 0;\nexport default Extend;\n","import Node from './node';\nimport Variable from './variable';\nimport Ruleset from './ruleset';\nimport DetachedRuleset from './detached-ruleset';\nimport LessError from '../less-error';\n\nconst VariableCall = function(variable, index, currentFileInfo) {\n this.variable = variable;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.allowRoot = true;\n};\n\nVariableCall.prototype = Object.assign(new Node(), {\n type: 'VariableCall',\n\n eval(context) {\n let rules;\n let detachedRuleset = new Variable(this.variable, this.getIndex(), this.fileInfo()).eval(context);\n const error = new LessError({message: `Could not evaluate variable call ${this.variable}`});\n\n if (!detachedRuleset.ruleset) {\n if (detachedRuleset.rules) {\n rules = detachedRuleset;\n }\n else if (Array.isArray(detachedRuleset)) {\n rules = new Ruleset('', detachedRuleset);\n }\n else if (Array.isArray(detachedRuleset.value)) {\n rules = new Ruleset('', detachedRuleset.value);\n }\n else {\n throw error;\n }\n detachedRuleset = new DetachedRuleset(rules);\n }\n\n if (detachedRuleset.ruleset) {\n return detachedRuleset.callEval(context);\n }\n throw error;\n }\n});\n\nexport default VariableCall;\n","import Node from './node';\nimport Variable from './variable';\nimport Ruleset from './ruleset';\nimport Selector from './selector';\n\nconst NamespaceValue = function(ruleCall, lookups, index, fileInfo) {\n this.value = ruleCall;\n this.lookups = lookups;\n this._index = index;\n this._fileInfo = fileInfo;\n};\n\nNamespaceValue.prototype = Object.assign(new Node(), {\n type: 'NamespaceValue',\n\n eval(context) {\n let i, j, name, rules = this.value.eval(context);\n \n for (i = 0; i < this.lookups.length; i++) {\n name = this.lookups[i];\n\n /**\n * Eval'd DRs return rulesets.\n * Eval'd mixins return rules, so let's make a ruleset if we need it.\n * We need to do this because of late parsing of values\n */\n if (Array.isArray(rules)) {\n rules = new Ruleset([new Selector()], rules);\n }\n\n if (name === '') {\n rules = rules.lastDeclaration();\n }\n else if (name.charAt(0) === '@') {\n if (name.charAt(1) === '@') {\n name = `@${new Variable(name.substr(1)).eval(context).value}`;\n }\n if (rules.variables) {\n rules = rules.variable(name);\n }\n \n if (!rules) {\n throw { type: 'Name',\n message: `variable ${name} not found`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n }\n else {\n if (name.substring(0, 2) === '$@') {\n name = `$${new Variable(name.substr(1)).eval(context).value}`;\n }\n else {\n name = name.charAt(0) === '$' ? name : `$${name}`;\n }\n if (rules.properties) {\n rules = rules.property(name);\n }\n \n if (!rules) {\n throw { type: 'Name',\n message: `property \"${name.substr(1)}\" not found`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n // Properties are an array of values, since a ruleset can have multiple props.\n // We pick the last one (the \"cascaded\" value)\n rules = rules[rules.length - 1];\n }\n\n if (rules.value) {\n rules = rules.eval(context).value;\n }\n if (rules.ruleset) {\n rules = rules.ruleset.eval(context);\n }\n }\n return rules;\n }\n});\n\nexport default NamespaceValue;\n","import Selector from './selector';\nimport Element from './element';\nimport Ruleset from './ruleset';\nimport Declaration from './declaration';\nimport DetachedRuleset from './detached-ruleset';\nimport Expression from './expression';\nimport contexts from '../contexts';\nimport * as utils from '../utils';\n\nconst Definition = function(name, params, rules, condition, variadic, frames, visibilityInfo) {\n this.name = name || 'anonymous mixin';\n this.selectors = [new Selector([new Element(null, name, false, this._index, this._fileInfo)])];\n this.params = params;\n this.condition = condition;\n this.variadic = variadic;\n this.arity = params.length;\n this.rules = rules;\n this._lookups = {};\n const optionalParameters = [];\n this.required = params.reduce(function (count, p) {\n if (!p.name || (p.name && !p.value)) {\n return count + 1;\n }\n else {\n optionalParameters.push(p.name);\n return count;\n }\n }, 0);\n this.optionalParameters = optionalParameters;\n this.frames = frames;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n}\n\nDefinition.prototype = Object.assign(new Ruleset(), {\n type: 'MixinDefinition',\n evalFirst: true,\n\n accept(visitor) {\n if (this.params && this.params.length) {\n this.params = visitor.visitArray(this.params);\n }\n this.rules = visitor.visitArray(this.rules);\n if (this.condition) {\n this.condition = visitor.visit(this.condition);\n }\n },\n\n evalParams(context, mixinEnv, args, evaldArguments) {\n /* jshint boss:true */\n const frame = new Ruleset(null, null);\n\n let varargs;\n let arg;\n const params = utils.copyArray(this.params);\n let i;\n let j;\n let val;\n let name;\n let isNamedFound;\n let argIndex;\n let argsLength = 0;\n\n if (mixinEnv.frames && mixinEnv.frames[0] && mixinEnv.frames[0].functionRegistry) {\n frame.functionRegistry = mixinEnv.frames[0].functionRegistry.inherit();\n }\n mixinEnv = new contexts.Eval(mixinEnv, [frame].concat(mixinEnv.frames));\n\n if (args) {\n args = utils.copyArray(args);\n argsLength = args.length;\n\n for (i = 0; i < argsLength; i++) {\n arg = args[i];\n if (name = (arg && arg.name)) {\n isNamedFound = false;\n for (j = 0; j < params.length; j++) {\n if (!evaldArguments[j] && name === params[j].name) {\n evaldArguments[j] = arg.value.eval(context);\n frame.prependRule(new Declaration(name, arg.value.eval(context)));\n isNamedFound = true;\n break;\n }\n }\n if (isNamedFound) {\n args.splice(i, 1);\n i--;\n continue;\n } else {\n throw { type: 'Runtime', message: `Named argument for ${this.name} ${args[i].name} not found` };\n }\n }\n }\n }\n argIndex = 0;\n for (i = 0; i < params.length; i++) {\n if (evaldArguments[i]) { continue; }\n\n arg = args && args[argIndex];\n\n if (name = params[i].name) {\n if (params[i].variadic) {\n varargs = [];\n for (j = argIndex; j < argsLength; j++) {\n varargs.push(args[j].value.eval(context));\n }\n frame.prependRule(new Declaration(name, new Expression(varargs).eval(context)));\n } else {\n val = arg && arg.value;\n if (val) {\n // This was a mixin call, pass in a detached ruleset of it's eval'd rules\n if (Array.isArray(val)) {\n val = new DetachedRuleset(new Ruleset('', val));\n }\n else {\n val = val.eval(context);\n }\n } else if (params[i].value) {\n val = params[i].value.eval(mixinEnv);\n frame.resetCache();\n } else {\n throw { type: 'Runtime', message: `wrong number of arguments for ${this.name} (${argsLength} for ${this.arity})` };\n }\n\n frame.prependRule(new Declaration(name, val));\n evaldArguments[i] = val;\n }\n }\n\n if (params[i].variadic && args) {\n for (j = argIndex; j < argsLength; j++) {\n evaldArguments[j] = args[j].value.eval(context);\n }\n }\n argIndex++;\n }\n\n return frame;\n },\n\n makeImportant() {\n const rules = !this.rules ? this.rules : this.rules.map(function (r) {\n if (r.makeImportant) {\n return r.makeImportant(true);\n } else {\n return r;\n }\n });\n const result = new Definition(this.name, this.params, rules, this.condition, this.variadic, this.frames);\n return result;\n },\n\n eval(context) {\n return new Definition(this.name, this.params, this.rules, this.condition, this.variadic, this.frames || utils.copyArray(context.frames));\n },\n\n evalCall(context, args, important) {\n const _arguments = [];\n const mixinFrames = this.frames ? this.frames.concat(context.frames) : context.frames;\n const frame = this.evalParams(context, new contexts.Eval(context, mixinFrames), args, _arguments);\n let rules;\n let ruleset;\n\n frame.prependRule(new Declaration('@arguments', new Expression(_arguments).eval(context)));\n\n rules = utils.copyArray(this.rules);\n\n ruleset = new Ruleset(null, rules);\n ruleset.originalRuleset = this;\n ruleset = ruleset.eval(new contexts.Eval(context, [this, frame].concat(mixinFrames)));\n if (important) {\n ruleset = ruleset.makeImportant();\n }\n return ruleset;\n },\n\n matchCondition(args, context) {\n if (this.condition && !this.condition.eval(\n new contexts.Eval(context,\n [this.evalParams(context, /* the parameter variables */\n new contexts.Eval(context, this.frames ? this.frames.concat(context.frames) : context.frames), args, [])]\n .concat(this.frames || []) // the parent namespace/mixin frames\n .concat(context.frames)))) { // the current environment frames\n return false;\n }\n return true;\n },\n\n matchArgs(args, context) {\n const allArgsCnt = (args && args.length) || 0;\n let len;\n const optionalParameters = this.optionalParameters;\n const requiredArgsCnt = !args ? 0 : args.reduce(function (count, p) {\n if (optionalParameters.indexOf(p.name) < 0) {\n return count + 1;\n } else {\n return count;\n }\n }, 0);\n\n if (!this.variadic) {\n if (requiredArgsCnt < this.required) {\n return false;\n }\n if (allArgsCnt > this.params.length) {\n return false;\n }\n } else {\n if (requiredArgsCnt < (this.required - 1)) {\n return false;\n }\n }\n\n // check patterns\n len = Math.min(requiredArgsCnt, this.arity);\n\n for (let i = 0; i < len; i++) {\n if (!this.params[i].name && !this.params[i].variadic) {\n if (args[i].value.eval(context).toCSS() != this.params[i].value.eval(context).toCSS()) {\n return false;\n }\n }\n }\n return true;\n }\n});\n\nexport default Definition;\n","import Node from './node';\nimport Selector from './selector';\nimport MixinDefinition from './mixin-definition';\nimport defaultFunc from '../functions/default';\n\nconst MixinCall = function(elements, args, index, currentFileInfo, important) {\n this.selector = new Selector(elements);\n this.arguments = args || [];\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.important = important;\n this.allowRoot = true;\n this.setParent(this.selector, this);\n};\n\nMixinCall.prototype = Object.assign(new Node(), {\n type: 'MixinCall',\n\n accept(visitor) {\n if (this.selector) {\n this.selector = visitor.visit(this.selector);\n }\n if (this.arguments.length) {\n this.arguments = visitor.visitArray(this.arguments);\n }\n },\n\n eval(context) {\n let mixins;\n let mixin;\n let mixinPath;\n const args = [];\n let arg;\n let argValue;\n const rules = [];\n let match = false;\n let i;\n let m;\n let f;\n let isRecursive;\n let isOneFound;\n const candidates = [];\n let candidate;\n const conditionResult = [];\n let defaultResult;\n const defFalseEitherCase = -1;\n const defNone = 0;\n const defTrue = 1;\n const defFalse = 2;\n let count;\n let originalRuleset;\n let noArgumentsFilter;\n\n this.selector = this.selector.eval(context);\n\n function calcDefGroup(mixin, mixinPath) {\n let f, p, namespace;\n\n for (f = 0; f < 2; f++) {\n conditionResult[f] = true;\n defaultFunc.value(f);\n for (p = 0; p < mixinPath.length && conditionResult[f]; p++) {\n namespace = mixinPath[p];\n if (namespace.matchCondition) {\n conditionResult[f] = conditionResult[f] && namespace.matchCondition(null, context);\n }\n }\n if (mixin.matchCondition) {\n conditionResult[f] = conditionResult[f] && mixin.matchCondition(args, context);\n }\n }\n if (conditionResult[0] || conditionResult[1]) {\n if (conditionResult[0] != conditionResult[1]) {\n return conditionResult[1] ?\n defTrue : defFalse;\n }\n\n return defNone;\n }\n return defFalseEitherCase;\n }\n\n for (i = 0; i < this.arguments.length; i++) {\n arg = this.arguments[i];\n argValue = arg.value.eval(context);\n if (arg.expand && Array.isArray(argValue.value)) {\n argValue = argValue.value;\n for (m = 0; m < argValue.length; m++) {\n args.push({value: argValue[m]});\n }\n } else {\n args.push({name: arg.name, value: argValue});\n }\n }\n\n noArgumentsFilter = function(rule) {return rule.matchArgs(null, context);};\n\n for (i = 0; i < context.frames.length; i++) {\n if ((mixins = context.frames[i].find(this.selector, null, noArgumentsFilter)).length > 0) {\n isOneFound = true;\n\n // To make `default()` function independent of definition order we have two \"subpasses\" here.\n // At first we evaluate each guard *twice* (with `default() == true` and `default() == false`),\n // and build candidate list with corresponding flags. Then, when we know all possible matches,\n // we make a final decision.\n\n for (m = 0; m < mixins.length; m++) {\n mixin = mixins[m].rule;\n mixinPath = mixins[m].path;\n isRecursive = false;\n for (f = 0; f < context.frames.length; f++) {\n if ((!(mixin instanceof MixinDefinition)) && mixin === (context.frames[f].originalRuleset || context.frames[f])) {\n isRecursive = true;\n break;\n }\n }\n if (isRecursive) {\n continue;\n }\n\n if (mixin.matchArgs(args, context)) {\n candidate = {mixin, group: calcDefGroup(mixin, mixinPath)};\n\n if (candidate.group !== defFalseEitherCase) {\n candidates.push(candidate);\n }\n\n match = true;\n }\n }\n\n defaultFunc.reset();\n\n count = [0, 0, 0];\n for (m = 0; m < candidates.length; m++) {\n count[candidates[m].group]++;\n }\n\n if (count[defNone] > 0) {\n defaultResult = defFalse;\n } else {\n defaultResult = defTrue;\n if ((count[defTrue] + count[defFalse]) > 1) {\n throw { type: 'Runtime',\n message: `Ambiguous use of \\`default()\\` found when matching for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n }\n\n for (m = 0; m < candidates.length; m++) {\n candidate = candidates[m].group;\n if ((candidate === defNone) || (candidate === defaultResult)) {\n try {\n mixin = candidates[m].mixin;\n if (!(mixin instanceof MixinDefinition)) {\n originalRuleset = mixin.originalRuleset || mixin;\n mixin = new MixinDefinition('', [], mixin.rules, null, false, null, originalRuleset.visibilityInfo());\n mixin.originalRuleset = originalRuleset;\n }\n const newRules = mixin.evalCall(context, args, this.important).rules;\n this._setVisibilityToReplacement(newRules);\n Array.prototype.push.apply(rules, newRules);\n } catch (e) {\n throw { message: e.message, index: this.getIndex(), filename: this.fileInfo().filename, stack: e.stack };\n }\n }\n }\n\n if (match) {\n return rules;\n }\n }\n }\n if (isOneFound) {\n throw { type: 'Runtime',\n message: `No matching definition was found for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n } else {\n throw { type: 'Name',\n message: `${this.selector.toCSS().trim()} is undefined`,\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n },\n\n _setVisibilityToReplacement(replacement) {\n let i, rule;\n if (this.blocksVisibility()) {\n for (i = 0; i < replacement.length; i++) {\n rule = replacement[i];\n rule.addVisibilityBlock();\n }\n }\n },\n\n format(args) {\n return `${this.selector.toCSS().trim()}(${args ? args.map(function (a) {\n let argValue = '';\n if (a.name) {\n argValue += `${a.name}:`;\n }\n if (a.value.toCSS) {\n argValue += a.value.toCSS();\n } else {\n argValue += '???';\n }\n return argValue;\n }).join(', ') : ''})`;\n }\n});\n\nexport default MixinCall;\n","import Node from './node';\nimport Color from './color';\nimport AtRule from './atrule';\nimport DetachedRuleset from './detached-ruleset';\nimport Operation from './operation';\nimport Dimension from './dimension';\nimport Unit from './unit';\nimport Keyword from './keyword';\nimport Variable from './variable';\nimport Property from './property';\nimport Ruleset from './ruleset';\nimport Element from './element';\nimport Attribute from './attribute';\nimport Combinator from './combinator';\nimport Selector from './selector';\nimport Quoted from './quoted';\nimport Expression from './expression';\nimport Declaration from './declaration';\nimport Call from './call';\nimport URL from './url';\nimport Import from './import';\nimport Comment from './comment';\nimport Anonymous from './anonymous';\nimport Value from './value';\nimport JavaScript from './javascript';\nimport Assignment from './assignment';\nimport Condition from './condition';\nimport Paren from './paren';\nimport Media from './media';\nimport UnicodeDescriptor from './unicode-descriptor';\nimport Negative from './negative';\nimport Extend from './extend';\nimport VariableCall from './variable-call';\nimport NamespaceValue from './namespace-value';\n\n// mixins\nimport MixinCall from './mixin-call';\nimport MixinDefinition from './mixin-definition';\n\nexport default {\n Node, Color, AtRule, DetachedRuleset, Operation,\n Dimension, Unit, Keyword, Variable, Property,\n Ruleset, Element, Attribute, Combinator, Selector,\n Quoted, Expression, Declaration, Call, URL, Import,\n Comment, Anonymous, Value, JavaScript, Assignment,\n Condition, Paren, Media, UnicodeDescriptor, Negative,\n Extend, VariableCall, NamespaceValue,\n mixin: {\n Call: MixinCall,\n Definition: MixinDefinition\n }\n};","class AbstractFileManager {\n getPath(filename) {\n let j = filename.lastIndexOf('?');\n if (j > 0) {\n filename = filename.slice(0, j);\n }\n j = filename.lastIndexOf('/');\n if (j < 0) {\n j = filename.lastIndexOf('\\\\');\n }\n if (j < 0) {\n return '';\n }\n return filename.slice(0, j + 1);\n }\n\n tryAppendExtension(path, ext) {\n return /(\\.[a-z]*$)|([\\?;].*)$/.test(path) ? path : path + ext;\n }\n\n tryAppendLessExtension(path) {\n return this.tryAppendExtension(path, '.less');\n }\n\n supportsSync() {\n return false;\n }\n\n alwaysMakePathsAbsolute() {\n return false;\n }\n\n isPathAbsolute(filename) {\n return (/^(?:[a-z-]+:|\\/|\\\\|#)/i).test(filename);\n }\n\n // TODO: pull out / replace?\n join(basePath, laterPath) {\n if (!basePath) {\n return laterPath;\n }\n return basePath + laterPath;\n }\n\n pathDiff(url, baseUrl) {\n // diff between two paths to create a relative path\n\n const urlParts = this.extractUrlParts(url);\n\n const baseUrlParts = this.extractUrlParts(baseUrl);\n let i;\n let max;\n let urlDirectories;\n let baseUrlDirectories;\n let diff = '';\n if (urlParts.hostPart !== baseUrlParts.hostPart) {\n return '';\n }\n max = Math.max(baseUrlParts.directories.length, urlParts.directories.length);\n for (i = 0; i < max; i++) {\n if (baseUrlParts.directories[i] !== urlParts.directories[i]) { break; }\n }\n baseUrlDirectories = baseUrlParts.directories.slice(i);\n urlDirectories = urlParts.directories.slice(i);\n for (i = 0; i < baseUrlDirectories.length - 1; i++) {\n diff += '../';\n }\n for (i = 0; i < urlDirectories.length - 1; i++) {\n diff += `${urlDirectories[i]}/`;\n }\n return diff;\n }\n\n // helper function, not part of API\n extractUrlParts(url, baseUrl) {\n // urlParts[1] = protocol://hostname/ OR /\n // urlParts[2] = / if path relative to host base\n // urlParts[3] = directories\n // urlParts[4] = filename\n // urlParts[5] = parameters\n\n const urlPartsRegex = /^((?:[a-z-]+:)?\\/{2}(?:[^\\/\\?#]*\\/)|([\\/\\\\]))?((?:[^\\/\\\\\\?#]*[\\/\\\\])*)([^\\/\\\\\\?#]*)([#\\?].*)?$/i;\n\n const urlParts = url.match(urlPartsRegex);\n const returner = {};\n let rawDirectories = [];\n const directories = [];\n let i;\n let baseUrlParts;\n\n if (!urlParts) {\n throw new Error(`Could not parse sheet href - '${url}'`);\n }\n\n // Stylesheets in IE don't always return the full path\n if (baseUrl && (!urlParts[1] || urlParts[2])) {\n baseUrlParts = baseUrl.match(urlPartsRegex);\n if (!baseUrlParts) {\n throw new Error(`Could not parse page url - '${baseUrl}'`);\n }\n urlParts[1] = urlParts[1] || baseUrlParts[1] || '';\n if (!urlParts[2]) {\n urlParts[3] = baseUrlParts[3] + urlParts[3];\n }\n }\n\n if (urlParts[3]) {\n rawDirectories = urlParts[3].replace(/\\\\/g, '/').split('/');\n\n // collapse '..' and skip '.'\n for (i = 0; i < rawDirectories.length; i++) {\n\n if (rawDirectories[i] === '..') {\n directories.pop();\n }\n else if (rawDirectories[i] !== '.') {\n directories.push(rawDirectories[i]);\n }\n \n }\n }\n\n returner.hostPart = urlParts[1];\n returner.directories = directories;\n returner.rawPath = (urlParts[1] || '') + rawDirectories.join('/');\n returner.path = (urlParts[1] || '') + directories.join('/');\n returner.filename = urlParts[4];\n returner.fileUrl = returner.path + (urlParts[4] || '');\n returner.url = returner.fileUrl + (urlParts[5] || '');\n return returner;\n }\n}\n\nexport default AbstractFileManager;\n","import functionRegistry from '../functions/function-registry';\nimport LessError from '../less-error';\n\nclass AbstractPluginLoader {\n constructor() {\n // Implemented by Node.js plugin loader\n this.require = function() {\n return null;\n }\n }\n\n evalPlugin(contents, context, imports, pluginOptions, fileInfo) {\n\n let loader, registry, pluginObj, localModule, pluginManager, filename, result;\n\n pluginManager = context.pluginManager;\n\n if (fileInfo) {\n if (typeof fileInfo === 'string') {\n filename = fileInfo;\n }\n else {\n filename = fileInfo.filename;\n }\n }\n const shortname = (new this.less.FileManager()).extractUrlParts(filename).filename;\n\n if (filename) {\n pluginObj = pluginManager.get(filename);\n\n if (pluginObj) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imports, filename);\n }\n return pluginObj;\n }\n }\n localModule = {\n exports: {},\n pluginManager,\n fileInfo\n };\n registry = functionRegistry.create();\n\n const registerPlugin = function(obj) {\n pluginObj = obj;\n };\n\n try {\n loader = new Function('module', 'require', 'registerPlugin', 'functions', 'tree', 'less', 'fileInfo', contents);\n loader(localModule, this.require(filename), registerPlugin, registry, this.less.tree, this.less, fileInfo);\n }\n catch (e) {\n return new LessError(e, imports, filename);\n }\n\n if (!pluginObj) {\n pluginObj = localModule.exports;\n }\n pluginObj = this.validatePlugin(pluginObj, filename, shortname);\n\n if (pluginObj instanceof LessError) {\n return pluginObj;\n }\n\n if (pluginObj) {\n pluginObj.imports = imports;\n pluginObj.filename = filename;\n\n // For < 3.x (or unspecified minVersion) - setOptions() before install()\n if (!pluginObj.minVersion || this.compareVersion('3.0.0', pluginObj.minVersion) < 0) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n\n if (result) {\n return result;\n }\n }\n\n // Run on first load\n pluginManager.addPlugin(pluginObj, fileInfo.filename, registry);\n pluginObj.functions = registry.getLocalFunctions();\n\n // Need to call setOptions again because the pluginObj might have functions\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n\n // Run every @plugin call\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imports, filename);\n }\n\n }\n else {\n return new LessError({ message: 'Not a valid plugin' }, imports, filename);\n }\n\n return pluginObj;\n\n }\n\n trySetOptions(plugin, filename, name, options) {\n if (options && !plugin.setOptions) {\n return new LessError({\n message: `Options have been provided but the plugin ${name} does not support any options.`\n });\n }\n try {\n plugin.setOptions && plugin.setOptions(options);\n }\n catch (e) {\n return new LessError(e);\n }\n }\n\n validatePlugin(plugin, filename, name) {\n if (plugin) {\n // support plugins being a function\n // so that the plugin can be more usable programmatically\n if (typeof plugin === 'function') {\n plugin = new plugin();\n }\n\n if (plugin.minVersion) {\n if (this.compareVersion(plugin.minVersion, this.less.version) < 0) {\n return new LessError({\n message: `Plugin ${name} requires version ${this.versionToString(plugin.minVersion)}`\n });\n }\n }\n return plugin;\n }\n return null;\n }\n\n compareVersion(aVersion, bVersion) {\n if (typeof aVersion === 'string') {\n aVersion = aVersion.match(/^(\\d+)\\.?(\\d+)?\\.?(\\d+)?/);\n aVersion.shift();\n }\n for (let i = 0; i < aVersion.length; i++) {\n if (aVersion[i] !== bVersion[i]) {\n return parseInt(aVersion[i]) > parseInt(bVersion[i]) ? -1 : 1;\n }\n }\n return 0;\n }\n\n versionToString(version) {\n let versionString = '';\n for (let i = 0; i < version.length; i++) {\n versionString += (versionString ? '.' : '') + version[i];\n }\n return versionString;\n }\n\n printUsage(plugins) {\n for (let i = 0; i < plugins.length; i++) {\n const plugin = plugins[i];\n if (plugin.printUsage) {\n plugin.printUsage();\n }\n }\n }\n}\n\nexport default AbstractPluginLoader;\n\n","import tree from '../tree';\n\nconst _visitArgs = { visitDeeper: true };\nlet _hasIndexed = false;\n\nfunction _noop(node) {\n return node;\n}\n\nfunction indexNodeTypes(parent, ticker) {\n // add .typeIndex to tree node types for lookup table\n let key, child;\n for (key in parent) { \n /* eslint guard-for-in: 0 */\n child = parent[key];\n switch (typeof child) {\n case 'function':\n // ignore bound functions directly on tree which do not have a prototype\n // or aren't nodes\n if (child.prototype && child.prototype.type) {\n child.prototype.typeIndex = ticker++;\n }\n break;\n case 'object':\n ticker = indexNodeTypes(child, ticker);\n break;\n \n }\n }\n return ticker;\n}\n\nclass Visitor {\n constructor(implementation) {\n this._implementation = implementation;\n this._visitInCache = {};\n this._visitOutCache = {};\n\n if (!_hasIndexed) {\n indexNodeTypes(tree, 1);\n _hasIndexed = true;\n }\n }\n\n visit(node) {\n if (!node) {\n return node;\n }\n\n const nodeTypeIndex = node.typeIndex;\n if (!nodeTypeIndex) {\n // MixinCall args aren't a node type?\n if (node.value && node.value.typeIndex) {\n this.visit(node.value);\n }\n return node;\n }\n\n const impl = this._implementation;\n let func = this._visitInCache[nodeTypeIndex];\n let funcOut = this._visitOutCache[nodeTypeIndex];\n const visitArgs = _visitArgs;\n let fnName;\n\n visitArgs.visitDeeper = true;\n\n if (!func) {\n fnName = `visit${node.type}`;\n func = impl[fnName] || _noop;\n funcOut = impl[`${fnName}Out`] || _noop;\n this._visitInCache[nodeTypeIndex] = func;\n this._visitOutCache[nodeTypeIndex] = funcOut;\n }\n\n if (func !== _noop) {\n const newNode = func.call(impl, node, visitArgs);\n if (node && impl.isReplacing) {\n node = newNode;\n }\n }\n\n if (visitArgs.visitDeeper && node) {\n if (node.length) {\n for (let i = 0, cnt = node.length; i < cnt; i++) {\n if (node[i].accept) {\n node[i].accept(this);\n }\n }\n } else if (node.accept) {\n node.accept(this);\n }\n }\n\n if (funcOut != _noop) {\n funcOut.call(impl, node);\n }\n\n return node;\n }\n\n visitArray(nodes, nonReplacing) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.length;\n let i;\n\n // Non-replacing\n if (nonReplacing || !this._implementation.isReplacing) {\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n // Replacing\n const out = [];\n for (i = 0; i < cnt; i++) {\n const evald = this.visit(nodes[i]);\n if (evald === undefined) { continue; }\n if (!evald.splice) {\n out.push(evald);\n } else if (evald.length) {\n this.flatten(evald, out);\n }\n }\n return out;\n }\n\n flatten(arr, out) {\n if (!out) {\n out = [];\n }\n\n let cnt, i, item, nestedCnt, j, nestedItem;\n\n for (i = 0, cnt = arr.length; i < cnt; i++) {\n item = arr[i];\n if (item === undefined) {\n continue;\n }\n if (!item.splice) {\n out.push(item);\n continue;\n }\n\n for (j = 0, nestedCnt = item.length; j < nestedCnt; j++) {\n nestedItem = item[j];\n if (nestedItem === undefined) {\n continue;\n }\n if (!nestedItem.splice) {\n out.push(nestedItem);\n } else if (nestedItem.length) {\n this.flatten(nestedItem, out);\n }\n }\n }\n\n return out;\n }\n}\n\nexport default Visitor;\n","class ImportSequencer {\n constructor(onSequencerEmpty) {\n this.imports = [];\n this.variableImports = [];\n this._onSequencerEmpty = onSequencerEmpty;\n this._currentDepth = 0;\n }\n\n addImport(callback) {\n const importSequencer = this,\n importItem = {\n callback,\n args: null,\n isReady: false\n };\n this.imports.push(importItem);\n return function() {\n importItem.args = Array.prototype.slice.call(arguments, 0);\n importItem.isReady = true;\n importSequencer.tryRun();\n };\n }\n\n addVariableImport(callback) {\n this.variableImports.push(callback);\n }\n\n tryRun() {\n this._currentDepth++;\n try {\n while (true) {\n while (this.imports.length > 0) {\n const importItem = this.imports[0];\n if (!importItem.isReady) {\n return;\n }\n this.imports = this.imports.slice(1);\n importItem.callback.apply(null, importItem.args);\n }\n if (this.variableImports.length === 0) {\n break;\n }\n const variableImport = this.variableImports[0];\n this.variableImports = this.variableImports.slice(1);\n variableImport();\n }\n } finally {\n this._currentDepth--;\n }\n if (this._currentDepth === 0 && this._onSequencerEmpty) {\n this._onSequencerEmpty();\n }\n }\n}\n\nexport default ImportSequencer;\n","import contexts from '../contexts';\nimport Visitor from './visitor';\nimport ImportSequencer from './import-sequencer';\nimport * as utils from '../utils';\n\nconst ImportVisitor = function(importer, finish) {\n\n this._visitor = new Visitor(this);\n this._importer = importer;\n this._finish = finish;\n this.context = new contexts.Eval();\n this.importCount = 0;\n this.onceFileDetectionMap = {};\n this.recursionDetector = {};\n this._sequencer = new ImportSequencer(this._onSequencerEmpty.bind(this));\n};\n\nImportVisitor.prototype = {\n isReplacing: false,\n run: function (root) {\n try {\n // process the contents\n this._visitor.visit(root);\n }\n catch (e) {\n this.error = e;\n }\n\n this.isFinished = true;\n this._sequencer.tryRun();\n },\n _onSequencerEmpty: function() {\n if (!this.isFinished) {\n return;\n }\n this._finish(this.error);\n },\n visitImport: function (importNode, visitArgs) {\n const inlineCSS = importNode.options.inline;\n\n if (!importNode.css || inlineCSS) {\n\n const context = new contexts.Eval(this.context, utils.copyArray(this.context.frames));\n const importParent = context.frames[0];\n\n this.importCount++;\n if (importNode.isVariableImport()) {\n this._sequencer.addVariableImport(this.processImportNode.bind(this, importNode, context, importParent));\n } else {\n this.processImportNode(importNode, context, importParent);\n }\n }\n visitArgs.visitDeeper = false;\n },\n processImportNode: function(importNode, context, importParent) {\n let evaldImportNode;\n const inlineCSS = importNode.options.inline;\n\n try {\n evaldImportNode = importNode.evalForImport(context);\n } catch (e) {\n if (!e.filename) { e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename; }\n // attempt to eval properly and treat as css\n importNode.css = true;\n // if that fails, this error will be thrown\n importNode.error = e;\n }\n\n if (evaldImportNode && (!evaldImportNode.css || inlineCSS)) {\n\n if (evaldImportNode.options.multiple) {\n context.importMultiple = true;\n }\n\n // try appending if we haven't determined if it is css or not\n const tryAppendLessExtension = evaldImportNode.css === undefined;\n\n for (let i = 0; i < importParent.rules.length; i++) {\n if (importParent.rules[i] === importNode) {\n importParent.rules[i] = evaldImportNode;\n break;\n }\n }\n\n const onImported = this.onImported.bind(this, evaldImportNode, context), sequencedOnImported = this._sequencer.addImport(onImported);\n\n this._importer.push(evaldImportNode.getPath(), tryAppendLessExtension, evaldImportNode.fileInfo(),\n evaldImportNode.options, sequencedOnImported);\n } else {\n this.importCount--;\n if (this.isFinished) {\n this._sequencer.tryRun();\n }\n }\n },\n onImported: function (importNode, context, e, root, importedAtRoot, fullPath) {\n if (e) {\n if (!e.filename) {\n e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename;\n }\n this.error = e;\n }\n\n const importVisitor = this, inlineCSS = importNode.options.inline, isPlugin = importNode.options.isPlugin, isOptional = importNode.options.optional, duplicateImport = importedAtRoot || fullPath in importVisitor.recursionDetector;\n\n if (!context.importMultiple) {\n if (duplicateImport) {\n importNode.skip = true;\n } else {\n importNode.skip = function() {\n if (fullPath in importVisitor.onceFileDetectionMap) {\n return true;\n }\n importVisitor.onceFileDetectionMap[fullPath] = true;\n return false;\n };\n }\n }\n\n if (!fullPath && isOptional) {\n importNode.skip = true;\n }\n\n if (root) {\n importNode.root = root;\n importNode.importedFilename = fullPath;\n\n if (!inlineCSS && !isPlugin && (context.importMultiple || !duplicateImport)) {\n importVisitor.recursionDetector[fullPath] = true;\n\n const oldContext = this.context;\n this.context = context;\n try {\n this._visitor.visit(root);\n } catch (e) {\n this.error = e;\n }\n this.context = oldContext;\n }\n }\n\n importVisitor.importCount--;\n\n if (importVisitor.isFinished) {\n importVisitor._sequencer.tryRun();\n }\n },\n visitDeclaration: function (declNode, visitArgs) {\n if (declNode.value.type === 'DetachedRuleset') {\n this.context.frames.unshift(declNode);\n } else {\n visitArgs.visitDeeper = false;\n }\n },\n visitDeclarationOut: function(declNode) {\n if (declNode.value.type === 'DetachedRuleset') {\n this.context.frames.shift();\n }\n },\n visitAtRule: function (atRuleNode, visitArgs) {\n this.context.frames.unshift(atRuleNode);\n },\n visitAtRuleOut: function (atRuleNode) {\n this.context.frames.shift();\n },\n visitMixinDefinition: function (mixinDefinitionNode, visitArgs) {\n this.context.frames.unshift(mixinDefinitionNode);\n },\n visitMixinDefinitionOut: function (mixinDefinitionNode) {\n this.context.frames.shift();\n },\n visitRuleset: function (rulesetNode, visitArgs) {\n this.context.frames.unshift(rulesetNode);\n },\n visitRulesetOut: function (rulesetNode) {\n this.context.frames.shift();\n },\n visitMedia: function (mediaNode, visitArgs) {\n this.context.frames.unshift(mediaNode.rules[0]);\n },\n visitMediaOut: function (mediaNode) {\n this.context.frames.shift();\n }\n};\nexport default ImportVisitor;\n","class SetTreeVisibilityVisitor {\n constructor(visible) {\n this.visible = visible;\n }\n\n run(root) {\n this.visit(root);\n }\n\n visitArray(nodes) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.length;\n let i;\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n visit(node) {\n if (!node) {\n return node;\n }\n if (node.constructor === Array) {\n return this.visitArray(node);\n }\n\n if (!node.blocksVisibility || node.blocksVisibility()) {\n return node;\n }\n if (this.visible) {\n node.ensureVisibility();\n } else {\n node.ensureInvisibility();\n }\n\n node.accept(this);\n return node;\n }\n}\n\nexport default SetTreeVisibilityVisitor;","import tree from '../tree';\nimport Visitor from './visitor';\nimport logger from '../logger';\nimport * as utils from '../utils';\n\n/* jshint loopfunc:true */\n\nclass ExtendFinderVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n this.contexts = [];\n this.allExtendsStack = [[]];\n }\n\n run(root) {\n root = this._visitor.visit(root);\n root.allExtends = this.allExtendsStack[0];\n return root;\n }\n\n visitDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n\n let i;\n let j;\n let extend;\n const allSelectorsExtendList = [];\n let extendList;\n\n // get &:extend(.a); rules which apply to all selectors in this ruleset\n const rules = rulesetNode.rules, ruleCnt = rules ? rules.length : 0;\n for (i = 0; i < ruleCnt; i++) {\n if (rulesetNode.rules[i] instanceof tree.Extend) {\n allSelectorsExtendList.push(rules[i]);\n rulesetNode.extendOnEveryPath = true;\n }\n }\n\n // now find every selector and apply the extends that apply to all extends\n // and the ones which apply to an individual extend\n const paths = rulesetNode.paths;\n for (i = 0; i < paths.length; i++) {\n const selectorPath = paths[i], selector = selectorPath[selectorPath.length - 1], selExtendList = selector.extendList;\n\n extendList = selExtendList ? utils.copyArray(selExtendList).concat(allSelectorsExtendList)\n : allSelectorsExtendList;\n\n if (extendList) {\n extendList = extendList.map(function(allSelectorsExtend) {\n return allSelectorsExtend.clone();\n });\n }\n\n for (j = 0; j < extendList.length; j++) {\n this.foundExtends = true;\n extend = extendList[j];\n extend.findSelfSelectors(selectorPath);\n extend.ruleset = rulesetNode;\n if (j === 0) { extend.firstExtendOnThisSelectorPath = true; }\n this.allExtendsStack[this.allExtendsStack.length - 1].push(extend);\n }\n }\n\n this.contexts.push(rulesetNode.selectors);\n }\n\n visitRulesetOut(rulesetNode) {\n if (!rulesetNode.root) {\n this.contexts.length = this.contexts.length - 1;\n }\n }\n\n visitMedia(mediaNode, visitArgs) {\n mediaNode.allExtends = [];\n this.allExtendsStack.push(mediaNode.allExtends);\n }\n\n visitMediaOut(mediaNode) {\n this.allExtendsStack.length = this.allExtendsStack.length - 1;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n atRuleNode.allExtends = [];\n this.allExtendsStack.push(atRuleNode.allExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n this.allExtendsStack.length = this.allExtendsStack.length - 1;\n }\n}\n\nclass ProcessExtendsVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n }\n\n run(root) {\n const extendFinder = new ExtendFinderVisitor();\n this.extendIndices = {};\n extendFinder.run(root);\n if (!extendFinder.foundExtends) { return root; }\n root.allExtends = root.allExtends.concat(this.doExtendChaining(root.allExtends, root.allExtends));\n this.allExtendsStack = [root.allExtends];\n const newRoot = this._visitor.visit(root);\n this.checkExtendsForNonMatched(root.allExtends);\n return newRoot;\n }\n\n checkExtendsForNonMatched(extendList) {\n const indices = this.extendIndices;\n extendList.filter(function(extend) {\n return !extend.hasFoundMatches && extend.parent_ids.length == 1;\n }).forEach(function(extend) {\n let selector = '_unknown_';\n try {\n selector = extend.selector.toCSS({});\n }\n catch (_) {}\n\n if (!indices[`${extend.index} ${selector}`]) {\n indices[`${extend.index} ${selector}`] = true;\n logger.warn(`extend '${selector}' has no matches`);\n }\n });\n }\n\n doExtendChaining(extendsList, extendsListTarget, iterationCount) {\n //\n // chaining is different from normal extension.. if we extend an extend then we are not just copying, altering\n // and pasting the selector we would do normally, but we are also adding an extend with the same target selector\n // this means this new extend can then go and alter other extends\n //\n // this method deals with all the chaining work - without it, extend is flat and doesn't work on other extend selectors\n // this is also the most expensive.. and a match on one selector can cause an extension of a selector we had already\n // processed if we look at each selector at a time, as is done in visitRuleset\n\n let extendIndex;\n\n let targetExtendIndex;\n let matches;\n const extendsToAdd = [];\n let newSelector;\n const extendVisitor = this;\n let selectorPath;\n let extend;\n let targetExtend;\n let newExtend;\n\n iterationCount = iterationCount || 0;\n\n // loop through comparing every extend with every target extend.\n // a target extend is the one on the ruleset we are looking at copy/edit/pasting in place\n // e.g. .a:extend(.b) {} and .b:extend(.c) {} then the first extend extends the second one\n // and the second is the target.\n // the separation into two lists allows us to process a subset of chains with a bigger set, as is the\n // case when processing media queries\n for (extendIndex = 0; extendIndex < extendsList.length; extendIndex++) {\n for (targetExtendIndex = 0; targetExtendIndex < extendsListTarget.length; targetExtendIndex++) {\n\n extend = extendsList[extendIndex];\n targetExtend = extendsListTarget[targetExtendIndex];\n\n // look for circular references\n if ( extend.parent_ids.indexOf( targetExtend.object_id ) >= 0 ) { continue; }\n\n // find a match in the target extends self selector (the bit before :extend)\n selectorPath = [targetExtend.selfSelectors[0]];\n matches = extendVisitor.findMatch(extend, selectorPath);\n\n if (matches.length) {\n extend.hasFoundMatches = true;\n\n // we found a match, so for each self selector..\n extend.selfSelectors.forEach(function(selfSelector) {\n const info = targetExtend.visibilityInfo();\n\n // process the extend as usual\n newSelector = extendVisitor.extendSelector(matches, selectorPath, selfSelector, extend.isVisible());\n\n // but now we create a new extend from it\n newExtend = new(tree.Extend)(targetExtend.selector, targetExtend.option, 0, targetExtend.fileInfo(), info);\n newExtend.selfSelectors = newSelector;\n\n // add the extend onto the list of extends for that selector\n newSelector[newSelector.length - 1].extendList = [newExtend];\n\n // record that we need to add it.\n extendsToAdd.push(newExtend);\n newExtend.ruleset = targetExtend.ruleset;\n\n // remember its parents for circular references\n newExtend.parent_ids = newExtend.parent_ids.concat(targetExtend.parent_ids, extend.parent_ids);\n\n // only process the selector once.. if we have :extend(.a,.b) then multiple\n // extends will look at the same selector path, so when extending\n // we know that any others will be duplicates in terms of what is added to the css\n if (targetExtend.firstExtendOnThisSelectorPath) {\n newExtend.firstExtendOnThisSelectorPath = true;\n targetExtend.ruleset.paths.push(newSelector);\n }\n });\n }\n }\n }\n\n if (extendsToAdd.length) {\n // try to detect circular references to stop a stack overflow.\n // may no longer be needed.\n this.extendChainCount++;\n if (iterationCount > 100) {\n let selectorOne = '{unable to calculate}';\n let selectorTwo = '{unable to calculate}';\n try {\n selectorOne = extendsToAdd[0].selfSelectors[0].toCSS();\n selectorTwo = extendsToAdd[0].selector.toCSS();\n }\n catch (e) {}\n throw { message: `extend circular reference detected. One of the circular extends is currently:${selectorOne}:extend(${selectorTwo})`};\n }\n\n // now process the new extends on the existing rules so that we can handle a extending b extending c extending\n // d extending e...\n return extendsToAdd.concat(extendVisitor.doExtendChaining(extendsToAdd, extendsListTarget, iterationCount + 1));\n } else {\n return extendsToAdd;\n }\n }\n\n visitDeclaration(ruleNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitSelector(selectorNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n let matches;\n let pathIndex;\n let extendIndex;\n const allExtends = this.allExtendsStack[this.allExtendsStack.length - 1];\n const selectorsToAdd = [];\n const extendVisitor = this;\n let selectorPath;\n\n // look at each selector path in the ruleset, find any extend matches and then copy, find and replace\n\n for (extendIndex = 0; extendIndex < allExtends.length; extendIndex++) {\n for (pathIndex = 0; pathIndex < rulesetNode.paths.length; pathIndex++) {\n selectorPath = rulesetNode.paths[pathIndex];\n\n // extending extends happens initially, before the main pass\n if (rulesetNode.extendOnEveryPath) { continue; }\n const extendList = selectorPath[selectorPath.length - 1].extendList;\n if (extendList && extendList.length) { continue; }\n\n matches = this.findMatch(allExtends[extendIndex], selectorPath);\n\n if (matches.length) {\n allExtends[extendIndex].hasFoundMatches = true;\n\n allExtends[extendIndex].selfSelectors.forEach(function(selfSelector) {\n let extendedSelectors;\n extendedSelectors = extendVisitor.extendSelector(matches, selectorPath, selfSelector, allExtends[extendIndex].isVisible());\n selectorsToAdd.push(extendedSelectors);\n });\n }\n }\n }\n rulesetNode.paths = rulesetNode.paths.concat(selectorsToAdd);\n }\n\n findMatch(extend, haystackSelectorPath) {\n //\n // look through the haystack selector path to try and find the needle - extend.selector\n // returns an array of selector matches that can then be replaced\n //\n let haystackSelectorIndex;\n\n let hackstackSelector;\n let hackstackElementIndex;\n let haystackElement;\n let targetCombinator;\n let i;\n const extendVisitor = this;\n const needleElements = extend.selector.elements;\n const potentialMatches = [];\n let potentialMatch;\n const matches = [];\n\n // loop through the haystack elements\n for (haystackSelectorIndex = 0; haystackSelectorIndex < haystackSelectorPath.length; haystackSelectorIndex++) {\n hackstackSelector = haystackSelectorPath[haystackSelectorIndex];\n\n for (hackstackElementIndex = 0; hackstackElementIndex < hackstackSelector.elements.length; hackstackElementIndex++) {\n\n haystackElement = hackstackSelector.elements[hackstackElementIndex];\n\n // if we allow elements before our match we can add a potential match every time. otherwise only at the first element.\n if (extend.allowBefore || (haystackSelectorIndex === 0 && hackstackElementIndex === 0)) {\n potentialMatches.push({pathIndex: haystackSelectorIndex, index: hackstackElementIndex, matched: 0,\n initialCombinator: haystackElement.combinator});\n }\n\n for (i = 0; i < potentialMatches.length; i++) {\n potentialMatch = potentialMatches[i];\n\n // selectors add \" \" onto the first element. When we use & it joins the selectors together, but if we don't\n // then each selector in haystackSelectorPath has a space before it added in the toCSS phase. so we need to\n // work out what the resulting combinator will be\n targetCombinator = haystackElement.combinator.value;\n if (targetCombinator === '' && hackstackElementIndex === 0) {\n targetCombinator = ' ';\n }\n\n // if we don't match, null our match to indicate failure\n if (!extendVisitor.isElementValuesEqual(needleElements[potentialMatch.matched].value, haystackElement.value) ||\n (potentialMatch.matched > 0 && needleElements[potentialMatch.matched].combinator.value !== targetCombinator)) {\n potentialMatch = null;\n } else {\n potentialMatch.matched++;\n }\n\n // if we are still valid and have finished, test whether we have elements after and whether these are allowed\n if (potentialMatch) {\n potentialMatch.finished = potentialMatch.matched === needleElements.length;\n if (potentialMatch.finished &&\n (!extend.allowAfter &&\n (hackstackElementIndex + 1 < hackstackSelector.elements.length || haystackSelectorIndex + 1 < haystackSelectorPath.length))) {\n potentialMatch = null;\n }\n }\n // if null we remove, if not, we are still valid, so either push as a valid match or continue\n if (potentialMatch) {\n if (potentialMatch.finished) {\n potentialMatch.length = needleElements.length;\n potentialMatch.endPathIndex = haystackSelectorIndex;\n potentialMatch.endPathElementIndex = hackstackElementIndex + 1; // index after end of match\n potentialMatches.length = 0; // we don't allow matches to overlap, so start matching again\n matches.push(potentialMatch);\n }\n } else {\n potentialMatches.splice(i, 1);\n i--;\n }\n }\n }\n }\n return matches;\n }\n\n isElementValuesEqual(elementValue1, elementValue2) {\n if (typeof elementValue1 === 'string' || typeof elementValue2 === 'string') {\n return elementValue1 === elementValue2;\n }\n if (elementValue1 instanceof tree.Attribute) {\n if (elementValue1.op !== elementValue2.op || elementValue1.key !== elementValue2.key) {\n return false;\n }\n if (!elementValue1.value || !elementValue2.value) {\n if (elementValue1.value || elementValue2.value) {\n return false;\n }\n return true;\n }\n elementValue1 = elementValue1.value.value || elementValue1.value;\n elementValue2 = elementValue2.value.value || elementValue2.value;\n return elementValue1 === elementValue2;\n }\n elementValue1 = elementValue1.value;\n elementValue2 = elementValue2.value;\n if (elementValue1 instanceof tree.Selector) {\n if (!(elementValue2 instanceof tree.Selector) || elementValue1.elements.length !== elementValue2.elements.length) {\n return false;\n }\n for (let i = 0; i < elementValue1.elements.length; i++) {\n if (elementValue1.elements[i].combinator.value !== elementValue2.elements[i].combinator.value) {\n if (i !== 0 || (elementValue1.elements[i].combinator.value || ' ') !== (elementValue2.elements[i].combinator.value || ' ')) {\n return false;\n }\n }\n if (!this.isElementValuesEqual(elementValue1.elements[i].value, elementValue2.elements[i].value)) {\n return false;\n }\n }\n return true;\n }\n return false;\n }\n\n extendSelector(matches, selectorPath, replacementSelector, isVisible) {\n\n // for a set of matches, replace each match with the replacement selector\n\n let currentSelectorPathIndex = 0, currentSelectorPathElementIndex = 0, path = [], matchIndex, selector, firstElement, match, newElements;\n\n for (matchIndex = 0; matchIndex < matches.length; matchIndex++) {\n match = matches[matchIndex];\n selector = selectorPath[match.pathIndex];\n firstElement = new tree.Element(\n match.initialCombinator,\n replacementSelector.elements[0].value,\n replacementSelector.elements[0].isVariable,\n replacementSelector.elements[0].getIndex(),\n replacementSelector.elements[0].fileInfo()\n );\n\n if (match.pathIndex > currentSelectorPathIndex && currentSelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n\n newElements = selector.elements\n .slice(currentSelectorPathElementIndex, match.index)\n .concat([firstElement])\n .concat(replacementSelector.elements.slice(1));\n\n if (currentSelectorPathIndex === match.pathIndex && matchIndex > 0) {\n path[path.length - 1].elements =\n path[path.length - 1].elements.concat(newElements);\n } else {\n path = path.concat(selectorPath.slice(currentSelectorPathIndex, match.pathIndex));\n\n path.push(new tree.Selector(\n newElements\n ));\n }\n currentSelectorPathIndex = match.endPathIndex;\n currentSelectorPathElementIndex = match.endPathElementIndex;\n if (currentSelectorPathElementIndex >= selectorPath[currentSelectorPathIndex].elements.length) {\n currentSelectorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n }\n\n if (currentSelectorPathIndex < selectorPath.length && currentSelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathIndex++;\n }\n\n path = path.concat(selectorPath.slice(currentSelectorPathIndex, selectorPath.length));\n path = path.map(function (currentValue) {\n // we can re-use elements here, because the visibility property matters only for selectors\n const derived = currentValue.createDerived(currentValue.elements);\n if (isVisible) {\n derived.ensureVisibility();\n } else {\n derived.ensureInvisibility();\n }\n return derived;\n });\n return path;\n }\n\n visitMedia(mediaNode, visitArgs) {\n let newAllExtends = mediaNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, mediaNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitMediaOut(mediaNode) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStack.length = lastIndex;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n let newAllExtends = atRuleNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, atRuleNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStack.length = lastIndex;\n }\n}\n\nexport default ProcessExtendsVisitor;\n","import Visitor from './visitor';\n\nclass JoinSelectorVisitor {\n constructor() {\n this.contexts = [[]];\n this._visitor = new Visitor(this);\n }\n\n run(root) {\n return this._visitor.visit(root);\n }\n\n visitDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n const paths = [];\n let selectors;\n\n this.contexts.push(paths);\n\n if (!rulesetNode.root) {\n selectors = rulesetNode.selectors;\n if (selectors) {\n selectors = selectors.filter(function(selector) { return selector.getIsOutput(); });\n rulesetNode.selectors = selectors.length ? selectors : (selectors = null);\n if (selectors) { rulesetNode.joinSelectors(paths, context, selectors); }\n }\n if (!selectors) { rulesetNode.rules = null; }\n rulesetNode.paths = paths;\n }\n }\n\n visitRulesetOut(rulesetNode) {\n this.contexts.length = this.contexts.length - 1;\n }\n\n visitMedia(mediaNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n mediaNode.rules[0].root = (context.length === 0 || context[0].multiMedia);\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n if (atRuleNode.rules && atRuleNode.rules.length) {\n atRuleNode.rules[0].root = (atRuleNode.isRooted || context.length === 0 || null);\n }\n }\n}\n\nexport default JoinSelectorVisitor;\n","import tree from '../tree';\nimport Visitor from './visitor';\n\nclass CSSVisitorUtils {\n constructor(context) {\n this._visitor = new Visitor(this);\n this._context = context;\n }\n\n containsSilentNonBlockedChild(bodyRules) {\n let rule;\n if (!bodyRules) {\n return false;\n }\n for (let r = 0; r < bodyRules.length; r++) {\n rule = bodyRules[r];\n if (rule.isSilent && rule.isSilent(this._context) && !rule.blocksVisibility()) {\n // the atrule contains something that was referenced (likely by extend)\n // therefore it needs to be shown in output too\n return true;\n }\n }\n return false;\n }\n\n keepOnlyVisibleChilds(owner) {\n if (owner && owner.rules) {\n owner.rules = owner.rules.filter(thing => thing.isVisible());\n }\n }\n\n isEmpty(owner) {\n return (owner && owner.rules) \n ? (owner.rules.length === 0) : true;\n }\n\n hasVisibleSelector(rulesetNode) {\n return (rulesetNode && rulesetNode.paths)\n ? (rulesetNode.paths.length > 0) : false;\n }\n\n resolveVisibility(node, originalRules) {\n if (!node.blocksVisibility()) {\n if (this.isEmpty(node) && !this.containsSilentNonBlockedChild(originalRules)) {\n return ;\n }\n\n return node;\n }\n\n const compiledRulesBody = node.rules[0];\n this.keepOnlyVisibleChilds(compiledRulesBody);\n\n if (this.isEmpty(compiledRulesBody)) {\n return ;\n }\n\n node.ensureVisibility();\n node.removeVisibilityBlock();\n\n return node;\n }\n\n isVisibleRuleset(rulesetNode) {\n if (rulesetNode.firstRoot) {\n return true;\n }\n\n if (this.isEmpty(rulesetNode)) {\n return false;\n }\n\n if (!rulesetNode.root && !this.hasVisibleSelector(rulesetNode)) {\n return false;\n }\n\n return true;\n }\n}\n\nconst ToCSSVisitor = function(context) {\n this._visitor = new Visitor(this);\n this._context = context;\n this.utils = new CSSVisitorUtils(context);\n};\n\nToCSSVisitor.prototype = {\n isReplacing: true,\n run: function (root) {\n return this._visitor.visit(root);\n },\n\n visitDeclaration: function (declNode, visitArgs) {\n if (declNode.blocksVisibility() || declNode.variable) {\n return;\n }\n return declNode;\n },\n\n visitMixinDefinition: function (mixinNode, visitArgs) {\n // mixin definitions do not get eval'd - this means they keep state\n // so we have to clear that state here so it isn't used if toCSS is called twice\n mixinNode.frames = [];\n },\n\n visitExtend: function (extendNode, visitArgs) {\n },\n\n visitComment: function (commentNode, visitArgs) {\n if (commentNode.blocksVisibility() || commentNode.isSilent(this._context)) {\n return;\n }\n return commentNode;\n },\n\n visitMedia: function(mediaNode, visitArgs) {\n const originalRules = mediaNode.rules[0].rules;\n mediaNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n\n return this.utils.resolveVisibility(mediaNode, originalRules);\n },\n\n visitImport: function (importNode, visitArgs) {\n if (importNode.blocksVisibility()) {\n return ;\n }\n return importNode;\n },\n\n visitAtRule: function(atRuleNode, visitArgs) {\n if (atRuleNode.rules && atRuleNode.rules.length) {\n return this.visitAtRuleWithBody(atRuleNode, visitArgs);\n } else {\n return this.visitAtRuleWithoutBody(atRuleNode, visitArgs);\n }\n },\n\n visitAnonymous: function(anonymousNode, visitArgs) {\n if (!anonymousNode.blocksVisibility()) {\n anonymousNode.accept(this._visitor);\n return anonymousNode;\n }\n },\n\n visitAtRuleWithBody: function(atRuleNode, visitArgs) {\n // if there is only one nested ruleset and that one has no path, then it is\n // just fake ruleset\n function hasFakeRuleset(atRuleNode) {\n const bodyRules = atRuleNode.rules;\n return bodyRules.length === 1 && (!bodyRules[0].paths || bodyRules[0].paths.length === 0);\n }\n function getBodyRules(atRuleNode) {\n const nodeRules = atRuleNode.rules;\n if (hasFakeRuleset(atRuleNode)) {\n return nodeRules[0].rules;\n }\n\n return nodeRules;\n }\n // it is still true that it is only one ruleset in array\n // this is last such moment\n // process childs\n const originalRules = getBodyRules(atRuleNode);\n atRuleNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n\n if (!this.utils.isEmpty(atRuleNode)) {\n this._mergeRules(atRuleNode.rules[0].rules);\n }\n\n return this.utils.resolveVisibility(atRuleNode, originalRules);\n },\n\n visitAtRuleWithoutBody: function(atRuleNode, visitArgs) {\n if (atRuleNode.blocksVisibility()) {\n return;\n }\n\n if (atRuleNode.name === '@charset') {\n // Only output the debug info together with subsequent @charset definitions\n // a comment (or @media statement) before the actual @charset atrule would\n // be considered illegal css as it has to be on the first line\n if (this.charset) {\n if (atRuleNode.debugInfo) {\n const comment = new tree.Comment(`/* ${atRuleNode.toCSS(this._context).replace(/\\n/g, '')} */\\n`);\n comment.debugInfo = atRuleNode.debugInfo;\n return this._visitor.visit(comment);\n }\n return;\n }\n this.charset = true;\n }\n\n return atRuleNode;\n },\n\n checkValidNodes: function(rules, isRoot) {\n if (!rules) {\n return;\n }\n\n for (let i = 0; i < rules.length; i++) {\n const ruleNode = rules[i];\n if (isRoot && ruleNode instanceof tree.Declaration && !ruleNode.variable) {\n throw { message: 'Properties must be inside selector blocks. They cannot be in the root',\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n if (ruleNode instanceof tree.Call) {\n throw { message: `Function '${ruleNode.name}' did not return a root node`,\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n if (ruleNode.type && !ruleNode.allowRoot) {\n throw { message: `${ruleNode.type} node returned by a function is not valid here`,\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n }\n },\n\n visitRuleset: function (rulesetNode, visitArgs) {\n // at this point rulesets are nested into each other\n let rule;\n\n const rulesets = [];\n\n this.checkValidNodes(rulesetNode.rules, rulesetNode.firstRoot);\n\n if (!rulesetNode.root) {\n // remove invisible paths\n this._compileRulesetPaths(rulesetNode);\n\n // remove rulesets from this ruleset body and compile them separately\n const nodeRules = rulesetNode.rules;\n\n let nodeRuleCnt = nodeRules ? nodeRules.length : 0;\n for (let i = 0; i < nodeRuleCnt; ) {\n rule = nodeRules[i];\n if (rule && rule.rules) {\n // visit because we are moving them out from being a child\n rulesets.push(this._visitor.visit(rule));\n nodeRules.splice(i, 1);\n nodeRuleCnt--;\n continue;\n }\n i++;\n }\n // accept the visitor to remove rules and refactor itself\n // then we can decide nogw whether we want it or not\n // compile body\n if (nodeRuleCnt > 0) {\n rulesetNode.accept(this._visitor);\n } else {\n rulesetNode.rules = null;\n }\n visitArgs.visitDeeper = false;\n } else { // if (! rulesetNode.root) {\n rulesetNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n }\n\n if (rulesetNode.rules) {\n this._mergeRules(rulesetNode.rules);\n this._removeDuplicateRules(rulesetNode.rules);\n }\n\n // now decide whether we keep the ruleset\n if (this.utils.isVisibleRuleset(rulesetNode)) {\n rulesetNode.ensureVisibility();\n rulesets.splice(0, 0, rulesetNode);\n }\n\n if (rulesets.length === 1) {\n return rulesets[0];\n }\n return rulesets;\n },\n\n _compileRulesetPaths: function(rulesetNode) {\n if (rulesetNode.paths) {\n rulesetNode.paths = rulesetNode.paths\n .filter(p => {\n let i;\n if (p[0].elements[0].combinator.value === ' ') {\n p[0].elements[0].combinator = new(tree.Combinator)('');\n }\n for (i = 0; i < p.length; i++) {\n if (p[i].isVisible() && p[i].getIsOutput()) {\n return true;\n }\n }\n return false;\n });\n }\n },\n\n _removeDuplicateRules: function(rules) {\n if (!rules) { return; }\n\n // remove duplicates\n const ruleCache = {};\n\n let ruleList;\n let rule;\n let i;\n\n for (i = rules.length - 1; i >= 0 ; i--) {\n rule = rules[i];\n if (rule instanceof tree.Declaration) {\n if (!ruleCache[rule.name]) {\n ruleCache[rule.name] = rule;\n } else {\n ruleList = ruleCache[rule.name];\n if (ruleList instanceof tree.Declaration) {\n ruleList = ruleCache[rule.name] = [ruleCache[rule.name].toCSS(this._context)];\n }\n const ruleCSS = rule.toCSS(this._context);\n if (ruleList.indexOf(ruleCSS) !== -1) {\n rules.splice(i, 1);\n } else {\n ruleList.push(ruleCSS);\n }\n }\n }\n }\n },\n\n _mergeRules: function(rules) {\n if (!rules) {\n return; \n }\n\n const groups = {};\n const groupsArr = [];\n\n for (let i = 0; i < rules.length; i++) {\n const rule = rules[i];\n if (rule.merge) {\n const key = rule.name;\n groups[key] ? rules.splice(i--, 1) : \n groupsArr.push(groups[key] = []);\n groups[key].push(rule);\n }\n }\n\n groupsArr.forEach(group => {\n if (group.length > 0) {\n const result = group[0];\n let space = [];\n const comma = [new tree.Expression(space)];\n group.forEach(rule => {\n if ((rule.merge === '+') && (space.length > 0)) {\n comma.push(new tree.Expression(space = []));\n }\n space.push(rule.value);\n result.important = result.important || rule.important;\n });\n result.value = new tree.Value(comma);\n }\n });\n }\n};\n\nexport default ToCSSVisitor;\n","import Visitor from './visitor';\nimport ImportVisitor from './import-visitor';\nimport MarkVisibleSelectorsVisitor from './set-tree-visibility-visitor';\nimport ExtendVisitor from './extend-visitor';\nimport JoinSelectorVisitor from './join-selector-visitor';\nimport ToCSSVisitor from './to-css-visitor';\n\nexport default {\n Visitor,\n ImportVisitor,\n MarkVisibleSelectorsVisitor,\n ExtendVisitor,\n JoinSelectorVisitor,\n ToCSSVisitor\n};\n","import chunker from './chunker';\n\nexport default () => {\n let // Less input string\n input;\n\n let // current chunk\n j;\n\n const // holds state for backtracking\n saveStack = [];\n\n let // furthest index the parser has gone to\n furthest;\n\n let // if this is furthest we got to, this is the probably cause\n furthestPossibleErrorMessage;\n\n let // chunkified input\n chunks;\n\n let // current chunk\n current;\n\n let // index of current chunk, in `input`\n currentPos;\n\n const parserInput = {};\n const CHARCODE_SPACE = 32;\n const CHARCODE_TAB = 9;\n const CHARCODE_LF = 10;\n const CHARCODE_CR = 13;\n const CHARCODE_PLUS = 43;\n const CHARCODE_COMMA = 44;\n const CHARCODE_FORWARD_SLASH = 47;\n const CHARCODE_9 = 57;\n\n function skipWhitespace(length) {\n const oldi = parserInput.i;\n const oldj = j;\n const curr = parserInput.i - currentPos;\n const endIndex = parserInput.i + current.length - curr;\n const mem = (parserInput.i += length);\n const inp = input;\n let c;\n let nextChar;\n let comment;\n\n for (; parserInput.i < endIndex; parserInput.i++) {\n c = inp.charCodeAt(parserInput.i);\n\n if (parserInput.autoCommentAbsorb && c === CHARCODE_FORWARD_SLASH) {\n nextChar = inp.charAt(parserInput.i + 1);\n if (nextChar === '/') {\n comment = {index: parserInput.i, isLineComment: true};\n let nextNewLine = inp.indexOf('\\n', parserInput.i + 2);\n if (nextNewLine < 0) {\n nextNewLine = endIndex;\n }\n parserInput.i = nextNewLine;\n comment.text = inp.substr(comment.index, parserInput.i - comment.index);\n parserInput.commentStore.push(comment);\n continue;\n } else if (nextChar === '*') {\n const nextStarSlash = inp.indexOf('*/', parserInput.i + 2);\n if (nextStarSlash >= 0) {\n comment = {\n index: parserInput.i,\n text: inp.substr(parserInput.i, nextStarSlash + 2 - parserInput.i),\n isLineComment: false\n };\n parserInput.i += comment.text.length - 1;\n parserInput.commentStore.push(comment);\n continue;\n }\n }\n break;\n }\n\n if ((c !== CHARCODE_SPACE) && (c !== CHARCODE_LF) && (c !== CHARCODE_TAB) && (c !== CHARCODE_CR)) {\n break;\n }\n }\n\n current = current.slice(length + parserInput.i - mem + curr);\n currentPos = parserInput.i;\n\n if (!current.length) {\n if (j < chunks.length - 1) {\n current = chunks[++j];\n skipWhitespace(0); // skip space at the beginning of a chunk\n return true; // things changed\n }\n parserInput.finished = true;\n }\n\n return oldi !== parserInput.i || oldj !== j;\n }\n\n parserInput.save = () => {\n currentPos = parserInput.i;\n saveStack.push( { current, i: parserInput.i, j });\n };\n parserInput.restore = possibleErrorMessage => {\n\n if (parserInput.i > furthest || (parserInput.i === furthest && possibleErrorMessage && !furthestPossibleErrorMessage)) {\n furthest = parserInput.i;\n furthestPossibleErrorMessage = possibleErrorMessage;\n }\n const state = saveStack.pop();\n current = state.current;\n currentPos = parserInput.i = state.i;\n j = state.j;\n };\n parserInput.forget = () => {\n saveStack.pop();\n };\n parserInput.isWhitespace = offset => {\n const pos = parserInput.i + (offset || 0);\n const code = input.charCodeAt(pos);\n return (code === CHARCODE_SPACE || code === CHARCODE_CR || code === CHARCODE_TAB || code === CHARCODE_LF);\n };\n\n // Specialization of $(tok)\n parserInput.$re = tok => {\n if (parserInput.i > currentPos) {\n current = current.slice(parserInput.i - currentPos);\n currentPos = parserInput.i;\n }\n\n const m = tok.exec(current);\n if (!m) {\n return null;\n }\n\n skipWhitespace(m[0].length);\n if (typeof m === 'string') {\n return m;\n }\n\n return m.length === 1 ? m[0] : m;\n };\n\n parserInput.$char = tok => {\n if (input.charAt(parserInput.i) !== tok) {\n return null;\n }\n skipWhitespace(1);\n return tok;\n };\n\n parserInput.$str = tok => {\n const tokLength = tok.length;\n\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tokLength; i++) {\n if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n return null;\n }\n }\n\n skipWhitespace(tokLength);\n return tok;\n };\n\n parserInput.$quoted = loc => {\n const pos = loc || parserInput.i;\n const startChar = input.charAt(pos);\n\n if (startChar !== '\\'' && startChar !== '\"') {\n return;\n }\n const length = input.length;\n const currentPosition = pos;\n\n for (let i = 1; i + currentPosition < length; i++) {\n const nextChar = input.charAt(i + currentPosition);\n switch (nextChar) {\n case '\\\\':\n i++;\n continue;\n case '\\r':\n case '\\n':\n break;\n case startChar:\n const str = input.substr(currentPosition, i + 1);\n if (!loc && loc !== 0) {\n skipWhitespace(i + 1);\n return str\n }\n return [startChar, str];\n default:\n }\n }\n return null;\n };\n\n /**\n * Permissive parsing. Ignores everything except matching {} [] () and quotes\n * until matching token (outside of blocks)\n */\n parserInput.$parseUntil = tok => {\n let quote = '';\n let returnVal = null;\n let inComment = false;\n let blockDepth = 0;\n const blockStack = [];\n const parseGroups = [];\n const length = input.length;\n const startPos = parserInput.i;\n let lastPos = parserInput.i;\n let i = parserInput.i;\n let loop = true;\n let testChar;\n\n if (typeof tok === 'string') {\n testChar = char => char === tok\n } else {\n testChar = char => tok.test(char)\n }\n\n do {\n let prevChar;\n let nextChar = input.charAt(i);\n if (blockDepth === 0 && testChar(nextChar)) {\n returnVal = input.substr(lastPos, i - lastPos);\n if (returnVal) {\n parseGroups.push(returnVal);\n }\n else {\n parseGroups.push(' ');\n }\n returnVal = parseGroups;\n skipWhitespace(i - startPos);\n loop = false\n } else {\n if (inComment) {\n if (nextChar === '*' && \n input.charAt(i + 1) === '/') {\n i++;\n blockDepth--;\n inComment = false;\n }\n i++;\n continue;\n }\n switch (nextChar) {\n case '\\\\':\n i++;\n nextChar = input.charAt(i);\n parseGroups.push(input.substr(lastPos, i - lastPos + 1));\n lastPos = i + 1;\n break;\n case '/':\n if (input.charAt(i + 1) === '*') {\n i++;\n inComment = true;\n blockDepth++;\n }\n break;\n case '\\'':\n case '\"':\n quote = parserInput.$quoted(i);\n if (quote) {\n parseGroups.push(input.substr(lastPos, i - lastPos), quote);\n i += quote[1].length - 1;\n lastPos = i + 1;\n }\n else {\n skipWhitespace(i - startPos);\n returnVal = nextChar;\n loop = false;\n }\n break;\n case '{':\n blockStack.push('}');\n blockDepth++;\n break;\n case '(':\n blockStack.push(')');\n blockDepth++;\n break;\n case '[':\n blockStack.push(']');\n blockDepth++;\n break;\n case '}':\n case ')':\n case ']':\n const expected = blockStack.pop();\n if (nextChar === expected) {\n blockDepth--;\n } else {\n // move the parser to the error and return expected\n skipWhitespace(i - startPos);\n returnVal = expected;\n loop = false;\n }\n }\n i++;\n if (i > length) {\n loop = false;\n }\n }\n prevChar = nextChar;\n } while (loop);\n\n return returnVal ? returnVal : null;\n }\n\n parserInput.autoCommentAbsorb = true;\n parserInput.commentStore = [];\n parserInput.finished = false;\n\n // Same as $(), but don't change the state of the parser,\n // just return the match.\n parserInput.peek = tok => {\n if (typeof tok === 'string') {\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tok.length; i++) {\n if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n return false;\n }\n }\n return true;\n } else {\n return tok.test(current);\n }\n };\n\n // Specialization of peek()\n // TODO remove or change some currentChar calls to peekChar\n parserInput.peekChar = tok => input.charAt(parserInput.i) === tok;\n\n parserInput.currentChar = () => input.charAt(parserInput.i);\n\n parserInput.prevChar = () => input.charAt(parserInput.i - 1);\n\n parserInput.getInput = () => input;\n\n parserInput.peekNotNumeric = () => {\n const c = input.charCodeAt(parserInput.i);\n // Is the first char of the dimension 0-9, '.', '+' or '-'\n return (c > CHARCODE_9 || c < CHARCODE_PLUS) || c === CHARCODE_FORWARD_SLASH || c === CHARCODE_COMMA;\n };\n\n parserInput.start = (str, chunkInput, failFunction) => {\n input = str;\n parserInput.i = j = currentPos = furthest = 0;\n\n // chunking apparently makes things quicker (but my tests indicate\n // it might actually make things slower in node at least)\n // and it is a non-perfect parse - it can't recognise\n // unquoted urls, meaning it can't distinguish comments\n // meaning comments with quotes or {}() in them get 'counted'\n // and then lead to parse errors.\n // In addition if the chunking chunks in the wrong place we might\n // not be able to parse a parser statement in one go\n // this is officially deprecated but can be switched on via an option\n // in the case it causes too much performance issues.\n if (chunkInput) {\n chunks = chunker(str, failFunction);\n } else {\n chunks = [str];\n }\n\n current = chunks[0];\n\n skipWhitespace(0);\n };\n\n parserInput.end = () => {\n let message;\n const isFinished = parserInput.i >= input.length;\n\n if (parserInput.i < furthest) {\n message = furthestPossibleErrorMessage;\n parserInput.i = furthest;\n }\n return {\n isFinished,\n furthest: parserInput.i,\n furthestPossibleErrorMessage: message,\n furthestReachedEnd: parserInput.i >= input.length - 1,\n furthestChar: input[parserInput.i]\n };\n };\n\n return parserInput;\n};\n","// Split the input into chunks.\nexport default function (input, fail) {\n const len = input.length;\n let level = 0;\n let parenLevel = 0;\n let lastOpening;\n let lastOpeningParen;\n let lastMultiComment;\n let lastMultiCommentEndBrace;\n const chunks = [];\n let emitFrom = 0;\n let chunkerCurrentIndex;\n let currentChunkStartIndex;\n let cc;\n let cc2;\n let matched;\n\n function emitChunk(force) {\n const len = chunkerCurrentIndex - emitFrom;\n if (((len < 512) && !force) || !len) {\n return;\n }\n chunks.push(input.slice(emitFrom, chunkerCurrentIndex + 1));\n emitFrom = chunkerCurrentIndex + 1;\n }\n\n for (chunkerCurrentIndex = 0; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc = input.charCodeAt(chunkerCurrentIndex);\n if (((cc >= 97) && (cc <= 122)) || (cc < 34)) {\n // a-z or whitespace\n continue;\n }\n\n switch (cc) {\n case 40: // (\n parenLevel++;\n lastOpeningParen = chunkerCurrentIndex;\n continue;\n case 41: // )\n if (--parenLevel < 0) {\n return fail('missing opening `(`', chunkerCurrentIndex);\n }\n continue;\n case 59: // ;\n if (!parenLevel) { emitChunk(); }\n continue;\n case 123: // {\n level++;\n lastOpening = chunkerCurrentIndex;\n continue;\n case 125: // }\n if (--level < 0) {\n return fail('missing opening `{`', chunkerCurrentIndex);\n }\n if (!level && !parenLevel) { emitChunk(); }\n continue;\n case 92: // \\\n if (chunkerCurrentIndex < len - 1) { chunkerCurrentIndex++; continue; }\n return fail('unescaped `\\\\`', chunkerCurrentIndex);\n case 34:\n case 39:\n case 96: // \", ' and `\n matched = 0;\n currentChunkStartIndex = chunkerCurrentIndex;\n for (chunkerCurrentIndex = chunkerCurrentIndex + 1; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if (cc2 > 96) { continue; }\n if (cc2 == cc) { matched = 1; break; }\n if (cc2 == 92) { // \\\n if (chunkerCurrentIndex == len - 1) {\n return fail('unescaped `\\\\`', chunkerCurrentIndex);\n }\n chunkerCurrentIndex++;\n }\n }\n if (matched) { continue; }\n return fail(`unmatched \\`${String.fromCharCode(cc)}\\``, currentChunkStartIndex);\n case 47: // /, check for comment\n if (parenLevel || (chunkerCurrentIndex == len - 1)) { continue; }\n cc2 = input.charCodeAt(chunkerCurrentIndex + 1);\n if (cc2 == 47) {\n // //, find lnfeed\n for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if ((cc2 <= 13) && ((cc2 == 10) || (cc2 == 13))) { break; }\n }\n } else if (cc2 == 42) {\n // /*, find */\n lastMultiComment = currentChunkStartIndex = chunkerCurrentIndex;\n for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len - 1; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if (cc2 == 125) { lastMultiCommentEndBrace = chunkerCurrentIndex; }\n if (cc2 != 42) { continue; }\n if (input.charCodeAt(chunkerCurrentIndex + 1) == 47) { break; }\n }\n if (chunkerCurrentIndex == len - 1) {\n return fail('missing closing `*/`', currentChunkStartIndex);\n }\n chunkerCurrentIndex++;\n }\n continue;\n case 42: // *, check for unmatched */\n if ((chunkerCurrentIndex < len - 1) && (input.charCodeAt(chunkerCurrentIndex + 1) == 47)) {\n return fail('unmatched `/*`', chunkerCurrentIndex);\n }\n continue;\n }\n }\n\n if (level !== 0) {\n if ((lastMultiComment > lastOpening) && (lastMultiCommentEndBrace > lastMultiComment)) {\n return fail('missing closing `}` or `*/`', lastOpening);\n } else {\n return fail('missing closing `}`', lastOpening);\n }\n } else if (parenLevel !== 0) {\n return fail('missing closing `)`', lastOpeningParen);\n }\n\n emitChunk(true);\n return chunks;\n};\n","import LessError from '../less-error';\nimport tree from '../tree';\nimport visitors from '../visitors';\nimport getParserInput from './parser-input';\nimport * as utils from '../utils';\nimport functionRegistry from '../functions/function-registry';\n\n//\n// less.js - parser\n//\n// A relatively straight-forward predictive parser.\n// There is no tokenization/lexing stage, the input is parsed\n// in one sweep.\n//\n// To make the parser fast enough to run in the browser, several\n// optimization had to be made:\n//\n// - Matching and slicing on a huge input is often cause of slowdowns.\n// The solution is to chunkify the input into smaller strings.\n// The chunks are stored in the `chunks` var,\n// `j` holds the current chunk index, and `currentPos` holds\n// the index of the current chunk in relation to `input`.\n// This gives us an almost 4x speed-up.\n//\n// - In many cases, we don't need to match individual tokens;\n// for example, if a value doesn't hold any variables, operations\n// or dynamic references, the parser can effectively 'skip' it,\n// treating it as a literal.\n// An example would be '1px solid #000' - which evaluates to itself,\n// we don't need to know what the individual components are.\n// The drawback, of course is that you don't get the benefits of\n// syntax-checking on the CSS. This gives us a 50% speed-up in the parser,\n// and a smaller speed-up in the code-gen.\n//\n//\n// Token matching is done with the `$` function, which either takes\n// a terminal string or regexp, or a non-terminal function to call.\n// It also takes care of moving all the indices forwards.\n//\n\nconst Parser = function Parser(context, imports, fileInfo) {\n let parsers;\n const parserInput = getParserInput();\n\n function error(msg, type) {\n throw new LessError(\n {\n index: parserInput.i,\n filename: fileInfo.filename,\n type: type || 'Syntax',\n message: msg\n },\n imports\n );\n }\n\n function expect(arg, msg) {\n // some older browsers return typeof 'function' for RegExp\n const result = (arg instanceof Function) ? arg.call(parsers) : parserInput.$re(arg);\n if (result) {\n return result;\n }\n \n error(msg || (typeof arg === 'string'\n ? `expected '${arg}' got '${parserInput.currentChar()}'`\n : 'unexpected token'));\n }\n\n // Specialization of expect()\n function expectChar(arg, msg) {\n if (parserInput.$char(arg)) {\n return arg;\n }\n error(msg || `expected '${arg}' got '${parserInput.currentChar()}'`);\n }\n\n function getDebugInfo(index) {\n const filename = fileInfo.filename;\n\n return {\n lineNumber: utils.getLocation(index, parserInput.getInput()).line + 1,\n fileName: filename\n };\n }\n\n /**\n * Used after initial parsing to create nodes on the fly\n * \n * @param {String} str - string to parse \n * @param {Array} parseList - array of parsers to run input through e.g. [\"value\", \"important\"]\n * @param {Number} currentIndex - start number to begin indexing\n * @param {Object} fileInfo - fileInfo to attach to created nodes\n */\n function parseNode(str, parseList, currentIndex, fileInfo, callback) {\n let result;\n const returnNodes = [];\n const parser = parserInput;\n\n try {\n parser.start(str, false, function fail(msg, index) {\n callback({\n message: msg,\n index: index + currentIndex\n });\n });\n for (let x = 0, p, i; (p = parseList[x]); x++) {\n i = parser.i;\n result = parsers[p]();\n if (result) {\n try {\n result._index = i + currentIndex;\n result._fileInfo = fileInfo;\n } catch (e) {}\n returnNodes.push(result);\n }\n else {\n returnNodes.push(null);\n }\n }\n\n const endInfo = parser.end();\n if (endInfo.isFinished) {\n callback(null, returnNodes);\n }\n else {\n callback(true, null);\n }\n } catch (e) {\n throw new LessError({\n index: e.index + currentIndex,\n message: e.message\n }, imports, fileInfo.filename);\n }\n }\n\n //\n // The Parser\n //\n return {\n parserInput,\n imports,\n fileInfo,\n parseNode,\n //\n // Parse an input string into an abstract syntax tree,\n // @param str A string containing 'less' markup\n // @param callback call `callback` when done.\n // @param [additionalData] An optional map which can contains vars - a map (key, value) of variables to apply\n //\n parse: function (str, callback, additionalData) {\n let root;\n let error = null;\n let globalVars;\n let modifyVars;\n let ignored;\n let preText = '';\n\n globalVars = (additionalData && additionalData.globalVars) ? `${Parser.serializeVars(additionalData.globalVars)}\\n` : '';\n modifyVars = (additionalData && additionalData.modifyVars) ? `\\n${Parser.serializeVars(additionalData.modifyVars)}` : '';\n\n if (context.pluginManager) {\n const preProcessors = context.pluginManager.getPreProcessors();\n for (let i = 0; i < preProcessors.length; i++) {\n str = preProcessors[i].process(str, { context, imports, fileInfo });\n }\n }\n\n if (globalVars || (additionalData && additionalData.banner)) {\n preText = ((additionalData && additionalData.banner) ? additionalData.banner : '') + globalVars;\n ignored = imports.contentsIgnoredChars;\n ignored[fileInfo.filename] = ignored[fileInfo.filename] || 0;\n ignored[fileInfo.filename] += preText.length;\n }\n\n str = str.replace(/\\r\\n?/g, '\\n');\n // Remove potential UTF Byte Order Mark\n str = preText + str.replace(/^\\uFEFF/, '') + modifyVars;\n imports.contents[fileInfo.filename] = str;\n\n // Start with the primary rule.\n // The whole syntax tree is held under a Ruleset node,\n // with the `root` property set to true, so no `{}` are\n // output. The callback is called when the input is parsed.\n try {\n parserInput.start(str, context.chunkInput, function fail(msg, index) {\n throw new LessError({\n index,\n type: 'Parse',\n message: msg,\n filename: fileInfo.filename\n }, imports);\n });\n\n tree.Node.prototype.parse = this;\n root = new tree.Ruleset(null, this.parsers.primary());\n tree.Node.prototype.rootNode = root;\n root.root = true;\n root.firstRoot = true;\n root.functionRegistry = functionRegistry.inherit();\n \n } catch (e) {\n return callback(new LessError(e, imports, fileInfo.filename));\n }\n\n // If `i` is smaller than the `input.length - 1`,\n // it means the parser wasn't able to parse the whole\n // string, so we've got a parsing error.\n //\n // We try to extract a \\n delimited string,\n // showing the line where the parse error occurred.\n // We split it up into two parts (the part which parsed,\n // and the part which didn't), so we can color them differently.\n const endInfo = parserInput.end();\n if (!endInfo.isFinished) {\n\n let message = endInfo.furthestPossibleErrorMessage;\n\n if (!message) {\n message = 'Unrecognised input';\n if (endInfo.furthestChar === '}') {\n message += '. Possibly missing opening \\'{\\'';\n } else if (endInfo.furthestChar === ')') {\n message += '. Possibly missing opening \\'(\\'';\n } else if (endInfo.furthestReachedEnd) {\n message += '. Possibly missing something';\n }\n }\n\n error = new LessError({\n type: 'Parse',\n message,\n index: endInfo.furthest,\n filename: fileInfo.filename\n }, imports);\n }\n\n const finish = e => {\n e = error || e || imports.error;\n\n if (e) {\n if (!(e instanceof LessError)) {\n e = new LessError(e, imports, fileInfo.filename);\n }\n\n return callback(e);\n }\n else {\n return callback(null, root);\n }\n };\n\n if (context.processImports !== false) {\n new visitors.ImportVisitor(imports, finish)\n .run(root);\n } else {\n return finish();\n }\n },\n\n //\n // Here in, the parsing rules/functions\n //\n // The basic structure of the syntax tree generated is as follows:\n //\n // Ruleset -> Declaration -> Value -> Expression -> Entity\n //\n // Here's some Less code:\n //\n // .class {\n // color: #fff;\n // border: 1px solid #000;\n // width: @w + 4px;\n // > .child {...}\n // }\n //\n // And here's what the parse tree might look like:\n //\n // Ruleset (Selector '.class', [\n // Declaration (\"color\", Value ([Expression [Color #fff]]))\n // Declaration (\"border\", Value ([Expression [Dimension 1px][Keyword \"solid\"][Color #000]]))\n // Declaration (\"width\", Value ([Expression [Operation \" + \" [Variable \"@w\"][Dimension 4px]]]))\n // Ruleset (Selector [Element '>', '.child'], [...])\n // ])\n //\n // In general, most rules will try to parse a token with the `$re()` function, and if the return\n // value is truly, will return a new node, of the relevant type. Sometimes, we need to check\n // first, before parsing, that's when we use `peek()`.\n //\n parsers: parsers = {\n //\n // The `primary` rule is the *entry* and *exit* point of the parser.\n // The rules here can appear at any level of the parse tree.\n //\n // The recursive nature of the grammar is an interplay between the `block`\n // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule,\n // as represented by this simplified grammar:\n //\n // primary → (ruleset | declaration)+\n // ruleset → selector+ block\n // block → '{' primary '}'\n //\n // Only at one point is the primary rule not called from the\n // block rule: at the root level.\n //\n primary: function () {\n const mixin = this.mixin;\n let root = [];\n let node;\n\n while (true) {\n while (true) {\n node = this.comment();\n if (!node) { break; }\n root.push(node);\n }\n // always process comments before deciding if finished\n if (parserInput.finished) {\n break;\n }\n if (parserInput.peek('}')) {\n break;\n }\n\n node = this.extendRule();\n if (node) {\n root = root.concat(node);\n continue;\n }\n\n node = mixin.definition() || this.declaration() || mixin.call(false, false) || \n this.ruleset() || this.variableCall() || this.entities.call() || this.atrule();\n if (node) {\n root.push(node);\n } else {\n let foundSemiColon = false;\n while (parserInput.$char(';')) {\n foundSemiColon = true;\n }\n if (!foundSemiColon) {\n break;\n }\n }\n }\n\n return root;\n },\n\n // comments are collected by the main parsing mechanism and then assigned to nodes\n // where the current structure allows it\n comment: function () {\n if (parserInput.commentStore.length) {\n const comment = parserInput.commentStore.shift();\n return new(tree.Comment)(comment.text, comment.isLineComment, comment.index, fileInfo);\n }\n },\n\n //\n // Entities are tokens which can be found inside an Expression\n //\n entities: {\n mixinLookup: function() {\n return parsers.mixin.call(true, true);\n },\n //\n // A string, which supports escaping \" and '\n //\n // \"milky way\" 'he\\'s the one!'\n //\n quoted: function (forceEscaped) {\n let str;\n const index = parserInput.i;\n let isEscaped = false;\n\n parserInput.save();\n if (parserInput.$char('~')) {\n isEscaped = true;\n } else if (forceEscaped) {\n parserInput.restore();\n return;\n }\n\n str = parserInput.$quoted();\n if (!str) {\n parserInput.restore();\n return;\n }\n parserInput.forget();\n\n return new(tree.Quoted)(str.charAt(0), str.substr(1, str.length - 2), isEscaped, index, fileInfo);\n },\n\n //\n // A catch-all word, such as:\n //\n // black border-collapse\n //\n keyword: function () {\n const k = parserInput.$char('%') || parserInput.$re(/^\\[?(?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+\\]?/);\n if (k) {\n return tree.Color.fromKeyword(k) || new(tree.Keyword)(k);\n }\n },\n\n //\n // A function call\n //\n // rgb(255, 0, 255)\n //\n // The arguments are parsed with the `entities.arguments` parser.\n //\n call: function () {\n let name;\n let args;\n let func;\n const index = parserInput.i;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (parserInput.peek(/^url\\(/i)) {\n return;\n }\n\n parserInput.save();\n\n name = parserInput.$re(/^([\\w-]+|%|~|progid:[\\w\\.]+)\\(/);\n if (!name) {\n parserInput.forget(); \n return;\n }\n\n name = name[1];\n func = this.customFuncCall(name);\n if (func) {\n args = func.parse();\n if (args && func.stop) {\n parserInput.forget();\n return args;\n }\n }\n\n args = this.arguments(args);\n\n if (!parserInput.$char(')')) {\n parserInput.restore('Could not parse call arguments or missing \\')\\'');\n return;\n }\n\n parserInput.forget();\n\n return new(tree.Call)(name, args, index, fileInfo);\n },\n \n //\n // Parsing rules for functions with non-standard args, e.g.:\n //\n // boolean(not(2 > 1))\n //\n // This is a quick prototype, to be modified/improved when\n // more custom-parsed funcs come (e.g. `selector(...)`)\n //\n\n customFuncCall: function (name) {\n /* Ideally the table is to be moved out of here for faster perf.,\n but it's quite tricky since it relies on all these `parsers`\n and `expect` available only here */\n return {\n alpha: f(parsers.ieAlpha, true),\n boolean: f(condition),\n 'if': f(condition)\n }[name.toLowerCase()];\n\n function f(parse, stop) {\n return {\n parse, // parsing function\n stop // when true - stop after parse() and return its result, \n // otherwise continue for plain args\n };\n }\n \n function condition() {\n return [expect(parsers.condition, 'expected condition')];\n }\n },\n\n arguments: function (prevArgs) {\n let argsComma = prevArgs || [];\n const argsSemiColon = [];\n let isSemiColonSeparated;\n let value;\n\n parserInput.save();\n\n while (true) {\n if (prevArgs) {\n prevArgs = false;\n } else {\n value = parsers.detachedRuleset() || this.assignment() || parsers.expression();\n if (!value) {\n break;\n }\n\n if (value.value && value.value.length == 1) {\n value = value.value[0];\n }\n\n argsComma.push(value);\n }\n\n if (parserInput.$char(',')) {\n continue;\n }\n\n if (parserInput.$char(';') || isSemiColonSeparated) {\n isSemiColonSeparated = true;\n value = (argsComma.length < 1) ? argsComma[0]\n : new tree.Value(argsComma);\n argsSemiColon.push(value);\n argsComma = [];\n }\n }\n\n parserInput.forget();\n return isSemiColonSeparated ? argsSemiColon : argsComma;\n },\n literal: function () {\n return this.dimension() ||\n this.color() ||\n this.quoted() ||\n this.unicodeDescriptor();\n },\n\n // Assignments are argument entities for calls.\n // They are present in ie filter properties as shown below.\n //\n // filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* )\n //\n\n assignment: function () {\n let key;\n let value;\n parserInput.save();\n key = parserInput.$re(/^\\w+(?=\\s?=)/i);\n if (!key) {\n parserInput.restore();\n return;\n }\n if (!parserInput.$char('=')) {\n parserInput.restore();\n return;\n }\n value = parsers.entity();\n if (value) {\n parserInput.forget();\n return new(tree.Assignment)(key, value);\n } else {\n parserInput.restore();\n }\n },\n\n //\n // Parse url() tokens\n //\n // We use a specific rule for urls, because they don't really behave like\n // standard function calls. The difference is that the argument doesn't have\n // to be enclosed within a string, so it can't be parsed as an Expression.\n //\n url: function () {\n let value;\n const index = parserInput.i;\n\n parserInput.autoCommentAbsorb = false;\n\n if (!parserInput.$str('url(')) {\n parserInput.autoCommentAbsorb = true;\n return;\n }\n\n value = this.quoted() || this.variable() || this.property() ||\n parserInput.$re(/^(?:(?:\\\\[\\(\\)'\"])|[^\\(\\)'\"])+/) || '';\n\n parserInput.autoCommentAbsorb = true;\n\n expectChar(')');\n\n return new(tree.URL)((value.value != null || \n value instanceof tree.Variable || \n value instanceof tree.Property) ?\n value : new(tree.Anonymous)(value, index), index, fileInfo);\n },\n\n //\n // A Variable entity, such as `@fink`, in\n //\n // width: @fink + 2px\n //\n // We use a different parser for variable definitions,\n // see `parsers.variable`.\n //\n variable: function () {\n let ch;\n let name;\n const index = parserInput.i;\n\n parserInput.save();\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^@@?[\\w-]+/))) {\n ch = parserInput.currentChar();\n if (ch === '(' || ch === '[' && !parserInput.prevChar().match(/^\\s/)) {\n // this may be a VariableCall lookup\n const result = parsers.variableCall(name);\n if (result) {\n parserInput.forget();\n return result;\n }\n }\n parserInput.forget();\n return new(tree.Variable)(name, index, fileInfo);\n }\n parserInput.restore();\n },\n\n // A variable entity using the protective {} e.g. @{var}\n variableCurly: function () {\n let curly;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '@' && (curly = parserInput.$re(/^@\\{([\\w-]+)\\}/))) {\n return new(tree.Variable)(`@${curly[1]}`, index, fileInfo);\n }\n },\n //\n // A Property accessor, such as `$color`, in\n //\n // background-color: $color\n //\n property: function () {\n let name;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' && (name = parserInput.$re(/^\\$[\\w-]+/))) {\n return new(tree.Property)(name, index, fileInfo);\n }\n },\n\n // A property entity useing the protective {} e.g. ${prop}\n propertyCurly: function () {\n let curly;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' && (curly = parserInput.$re(/^\\$\\{([\\w-]+)\\}/))) {\n return new(tree.Property)(`$${curly[1]}`, index, fileInfo);\n }\n },\n //\n // A Hexadecimal color\n //\n // #4F3C2F\n //\n // `rgb` and `hsl` colors are parsed through the `entities.call` parser.\n //\n color: function () {\n let rgb;\n parserInput.save();\n\n if (parserInput.currentChar() === '#' && (rgb = parserInput.$re(/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})([\\w.#\\[])?/))) {\n if (!rgb[2]) {\n parserInput.forget();\n return new(tree.Color)(rgb[1], undefined, rgb[0]);\n } \n }\n parserInput.restore();\n },\n\n colorKeyword: function () {\n parserInput.save();\n const autoCommentAbsorb = parserInput.autoCommentAbsorb;\n parserInput.autoCommentAbsorb = false;\n const k = parserInput.$re(/^[_A-Za-z-][_A-Za-z0-9-]+/);\n parserInput.autoCommentAbsorb = autoCommentAbsorb;\n if (!k) {\n parserInput.forget();\n return;\n }\n parserInput.restore();\n const color = tree.Color.fromKeyword(k);\n if (color) {\n parserInput.$str(k);\n return color;\n }\n },\n\n //\n // A Dimension, that is, a number and a unit\n //\n // 0.5em 95%\n //\n dimension: function () {\n if (parserInput.peekNotNumeric()) {\n return;\n }\n\n const value = parserInput.$re(/^([+-]?\\d*\\.?\\d+)(%|[a-z_]+)?/i);\n if (value) {\n return new(tree.Dimension)(value[1], value[2]);\n }\n },\n\n //\n // A unicode descriptor, as is used in unicode-range\n //\n // U+0?? or U+00A1-00A9\n //\n unicodeDescriptor: function () {\n let ud;\n\n ud = parserInput.$re(/^U\\+[0-9a-fA-F?]+(\\-[0-9a-fA-F?]+)?/);\n if (ud) {\n return new(tree.UnicodeDescriptor)(ud[0]);\n }\n },\n\n //\n // JavaScript code to be evaluated\n //\n // `window.location.href`\n //\n javascript: function () {\n let js;\n const index = parserInput.i;\n\n parserInput.save();\n\n const escape = parserInput.$char('~');\n const jsQuote = parserInput.$char('`');\n\n if (!jsQuote) {\n parserInput.restore();\n return;\n }\n\n js = parserInput.$re(/^[^`]*`/);\n if (js) {\n parserInput.forget();\n return new(tree.JavaScript)(js.substr(0, js.length - 1), Boolean(escape), index, fileInfo);\n }\n parserInput.restore('invalid javascript definition');\n }\n },\n\n //\n // The variable part of a variable definition. Used in the `rule` parser\n //\n // @fink:\n //\n variable: function () {\n let name;\n\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^(@[\\w-]+)\\s*:/))) { return name[1]; }\n },\n\n //\n // Call a variable value to retrieve a detached ruleset\n // or a value from a detached ruleset's rules.\n //\n // @fink();\n // @fink;\n // color: @fink[@color];\n //\n variableCall: function (parsedName) {\n let lookups;\n const i = parserInput.i;\n const inValue = !!parsedName;\n let name = parsedName;\n\n parserInput.save();\n\n if (name || (parserInput.currentChar() === '@'\n && (name = parserInput.$re(/^(@[\\w-]+)(\\(\\s*\\))?/)))) {\n\n lookups = this.mixin.ruleLookups();\n\n if (!lookups && ((inValue && parserInput.$str('()') !== '()') || (name[2] !== '()'))) {\n parserInput.restore('Missing \\'[...]\\' lookup in variable call');\n return;\n }\n\n if (!inValue) {\n name = name[1];\n }\n\n const call = new tree.VariableCall(name, i, fileInfo);\n if (!inValue && parsers.end()) {\n parserInput.forget();\n return call;\n }\n else {\n parserInput.forget();\n return new tree.NamespaceValue(call, lookups, i, fileInfo);\n }\n }\n\n parserInput.restore();\n },\n\n //\n // extend syntax - used to extend selectors\n //\n extend: function(isRule) {\n let elements;\n let e;\n const index = parserInput.i;\n let option;\n let extendList;\n let extend;\n\n if (!parserInput.$str(isRule ? '&:extend(' : ':extend(')) {\n return;\n }\n\n do {\n option = null;\n elements = null;\n while (!(option = parserInput.$re(/^(all)(?=\\s*(\\)|,))/))) {\n e = this.element();\n if (!e) {\n break;\n }\n if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n }\n\n option = option && option[1];\n if (!elements) {\n error('Missing target selector for :extend().');\n }\n extend = new(tree.Extend)(new(tree.Selector)(elements), option, index, fileInfo);\n if (extendList) {\n extendList.push(extend);\n } else {\n extendList = [ extend ];\n }\n } while (parserInput.$char(','));\n\n expect(/^\\)/);\n\n if (isRule) {\n expect(/^;/);\n }\n\n return extendList;\n },\n\n //\n // extendRule - used in a rule to extend all the parent selectors\n //\n extendRule: function() {\n return this.extend(true);\n },\n\n //\n // Mixins\n //\n mixin: {\n //\n // A Mixin call, with an optional argument list\n //\n // #mixins > .square(#fff);\n // #mixins.square(#fff);\n // .rounded(4px, black);\n // .button;\n //\n // We can lookup / return a value using the lookup syntax:\n //\n // color: #mixin.square(#fff)[@color];\n //\n // The `while` loop is there because mixins can be\n // namespaced, but we only support the child and descendant\n // selector for now.\n //\n call: function (inValue, getLookup) {\n const s = parserInput.currentChar();\n let important = false;\n let lookups;\n const index = parserInput.i;\n let elements;\n let args;\n let hasParens;\n\n if (s !== '.' && s !== '#') { return; }\n\n parserInput.save(); // stop us absorbing part of an invalid selector\n\n elements = this.elements();\n\n if (elements) {\n if (parserInput.$char('(')) {\n args = this.args(true).args;\n expectChar(')');\n hasParens = true;\n }\n\n if (getLookup !== false) {\n lookups = this.ruleLookups();\n }\n if (getLookup === true && !lookups) {\n parserInput.restore();\n return;\n }\n\n if (!lookups && !hasParens) {\n // This isn't a valid mixin call\n parserInput.restore('Unrecognized input. Possibly missing \\'(\\' in mixin call.');\n return;\n }\n\n if (!inValue && parsers.important()) {\n important = true;\n }\n\n if (inValue || parsers.end()) {\n parserInput.forget();\n const mixin = new(tree.mixin.Call)(elements, args, index, fileInfo, !lookups && important);\n if (lookups) {\n return new tree.NamespaceValue(mixin, lookups);\n }\n else {\n return mixin;\n }\n }\n }\n\n parserInput.restore();\n },\n /**\n * Matching elements for mixins\n * (Start with . or # and can have > )\n */\n elements: function() {\n let elements;\n let e;\n let c;\n let elem;\n let elemIndex;\n const re = /^[#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/;\n while (true) {\n elemIndex = parserInput.i;\n e = parserInput.$re(re);\n \n if (!e) {\n break;\n }\n elem = new(tree.Element)(c, e, false, elemIndex, fileInfo);\n if (elements) {\n elements.push(elem);\n } else {\n elements = [ elem ];\n }\n c = parserInput.$char('>');\n }\n return elements;\n },\n args: function (isCall) {\n const entities = parsers.entities;\n const returner = { args:null, variadic: false };\n let expressions = [];\n const argsSemiColon = [];\n const argsComma = [];\n let isSemiColonSeparated;\n let expressionContainsNamed;\n let name;\n let nameLoop;\n let value;\n let arg;\n let expand;\n let hasSep = true;\n\n parserInput.save();\n\n while (true) {\n if (isCall) {\n arg = parsers.detachedRuleset() || parsers.expression();\n } else {\n parserInput.commentStore.length = 0;\n if (parserInput.$str('...')) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ variadic: true });\n break;\n }\n arg = entities.variable() || entities.property() || entities.literal() || entities.keyword() || this.call(true);\n }\n\n if (!arg || !hasSep) {\n break;\n }\n\n nameLoop = null;\n if (arg.throwAwayComments) {\n arg.throwAwayComments();\n }\n value = arg;\n let val = null;\n\n if (isCall) {\n // Variable\n if (arg.value && arg.value.length == 1) {\n val = arg.value[0];\n }\n } else {\n val = arg;\n }\n\n if (val && (val instanceof tree.Variable || val instanceof tree.Property)) {\n if (parserInput.$char(':')) {\n if (expressions.length > 0) {\n if (isSemiColonSeparated) {\n error('Cannot mix ; and , as delimiter types');\n }\n expressionContainsNamed = true;\n }\n\n value = parsers.detachedRuleset() || parsers.expression();\n\n if (!value) {\n if (isCall) {\n error('could not understand value for named argument');\n } else {\n parserInput.restore();\n returner.args = [];\n return returner;\n }\n }\n nameLoop = (name = val.name);\n } else if (parserInput.$str('...')) {\n if (!isCall) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ name: arg.name, variadic: true });\n break;\n } else {\n expand = true;\n }\n } else if (!isCall) {\n name = nameLoop = val.name;\n value = null;\n }\n }\n\n if (value) {\n expressions.push(value);\n }\n\n argsComma.push({ name:nameLoop, value, expand });\n\n if (parserInput.$char(',')) {\n hasSep = true;\n continue;\n }\n hasSep = parserInput.$char(';') === ';';\n\n if (hasSep || isSemiColonSeparated) {\n\n if (expressionContainsNamed) {\n error('Cannot mix ; and , as delimiter types');\n }\n\n isSemiColonSeparated = true;\n\n if (expressions.length > 1) {\n value = new(tree.Value)(expressions);\n }\n argsSemiColon.push({ name, value, expand });\n\n name = null;\n expressions = [];\n expressionContainsNamed = false;\n }\n }\n\n parserInput.forget();\n returner.args = isSemiColonSeparated ? argsSemiColon : argsComma;\n return returner;\n },\n //\n // A Mixin definition, with a list of parameters\n //\n // .rounded (@radius: 2px, @color) {\n // ...\n // }\n //\n // Until we have a finer grained state-machine, we have to\n // do a look-ahead, to make sure we don't have a mixin call.\n // See the `rule` function for more information.\n //\n // We start by matching `.rounded (`, and then proceed on to\n // the argument list, which has optional default values.\n // We store the parameters in `params`, with a `value` key,\n // if there is a value, such as in the case of `@radius`.\n //\n // Once we've got our params list, and a closing `)`, we parse\n // the `{...}` block.\n //\n definition: function () {\n let name;\n let params = [];\n let match;\n let ruleset;\n let cond;\n let variadic = false;\n if ((parserInput.currentChar() !== '.' && parserInput.currentChar() !== '#') ||\n parserInput.peek(/^[^{]*\\}/)) {\n return;\n }\n\n parserInput.save();\n\n match = parserInput.$re(/^([#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\\s*\\(/);\n if (match) {\n name = match[1];\n\n const argInfo = this.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n\n // .mixincall(\"@{a}\");\n // looks a bit like a mixin definition..\n // also\n // .mixincall(@a: {rule: set;});\n // so we have to be nice and restore\n if (!parserInput.$char(')')) {\n parserInput.restore('Missing closing \\')\\'');\n return;\n }\n\n parserInput.commentStore.length = 0;\n\n if (parserInput.$str('when')) { // Guard\n cond = expect(parsers.conditions, 'expected condition');\n }\n\n ruleset = parsers.block();\n\n if (ruleset) {\n parserInput.forget();\n return new(tree.mixin.Definition)(name, params, ruleset, cond, variadic);\n } else {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n }\n },\n \n ruleLookups: function() {\n let rule;\n let args;\n const lookups = [];\n\n if (parserInput.currentChar() !== '[') { \n return;\n }\n\n while (true) {\n parserInput.save();\n args = null;\n rule = this.lookupValue();\n if (!rule && rule !== '') {\n parserInput.restore();\n break;\n }\n lookups.push(rule);\n parserInput.forget();\n }\n if (lookups.length > 0) {\n return lookups;\n }\n },\n \n lookupValue: function() {\n parserInput.save();\n \n if (!parserInput.$char('[')) { \n parserInput.restore();\n return;\n }\n \n const name = parserInput.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);\n \n if (!parserInput.$char(']')) {\n parserInput.restore();\n return;\n } \n\n if (name || name === '') {\n parserInput.forget();\n return name;\n }\n \n parserInput.restore();\n }\n },\n //\n // Entities are the smallest recognized token,\n // and can be found inside a rule's value.\n //\n entity: function () {\n const entities = this.entities;\n\n return this.comment() || entities.literal() || entities.variable() || entities.url() ||\n entities.property() || entities.call() || entities.keyword() || this.mixin.call(true) ||\n entities.javascript();\n },\n\n //\n // A Declaration terminator. Note that we use `peek()` to check for '}',\n // because the `block` rule will be expecting it, but we still need to make sure\n // it's there, if ';' was omitted.\n //\n end: function () {\n return parserInput.$char(';') || parserInput.peek('}');\n },\n\n //\n // IE's alpha function\n //\n // alpha(opacity=88)\n //\n ieAlpha: function () {\n let value;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (!parserInput.$re(/^opacity=/i)) { return; }\n value = parserInput.$re(/^\\d+/);\n if (!value) {\n value = expect(parsers.entities.variable, 'Could not parse alpha');\n value = `@{${value.name.slice(1)}}`;\n }\n expectChar(')');\n return new tree.Quoted('', `alpha(opacity=${value})`);\n },\n\n //\n // A Selector Element\n //\n // div\n // + h1\n // #socks\n // input[type=\"text\"]\n //\n // Elements are the building blocks for Selectors,\n // they are made out of a `Combinator` (see combinator rule),\n // and an element name, such as a tag a class, or `*`.\n //\n element: function () {\n let e;\n let c;\n let v;\n const index = parserInput.i;\n\n c = this.combinator();\n\n e = parserInput.$re(/^(?:\\d+\\.\\d+|\\d+)%/) ||\n parserInput.$re(/^(?:[.#]?|:*)(?:[\\w-]|[^\\x00-\\x9f]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/) ||\n parserInput.$char('*') || parserInput.$char('&') || this.attribute() ||\n parserInput.$re(/^\\([^&()@]+\\)/) || parserInput.$re(/^[\\.#:](?=@)/) ||\n this.entities.variableCurly();\n\n if (!e) {\n parserInput.save();\n if (parserInput.$char('(')) {\n if ((v = this.selector(false)) && parserInput.$char(')')) {\n e = new(tree.Paren)(v);\n parserInput.forget();\n } else {\n parserInput.restore('Missing closing \\')\\'');\n }\n } else {\n parserInput.forget();\n }\n }\n\n if (e) { return new(tree.Element)(c, e, e instanceof tree.Variable, index, fileInfo); }\n },\n\n //\n // Combinators combine elements together, in a Selector.\n //\n // Because our parser isn't white-space sensitive, special care\n // has to be taken, when parsing the descendant combinator, ` `,\n // as it's an empty space. We have to check the previous character\n // in the input, to see if it's a ` ` character. More info on how\n // we deal with this in *combinator.js*.\n //\n combinator: function () {\n let c = parserInput.currentChar();\n\n if (c === '/') {\n parserInput.save();\n const slashedCombinator = parserInput.$re(/^\\/[a-z]+\\//i);\n if (slashedCombinator) {\n parserInput.forget();\n return new(tree.Combinator)(slashedCombinator);\n }\n parserInput.restore();\n }\n\n if (c === '>' || c === '+' || c === '~' || c === '|' || c === '^') {\n parserInput.i++;\n if (c === '^' && parserInput.currentChar() === '^') {\n c = '^^';\n parserInput.i++;\n }\n while (parserInput.isWhitespace()) { parserInput.i++; }\n return new(tree.Combinator)(c);\n } else if (parserInput.isWhitespace(-1)) {\n return new(tree.Combinator)(' ');\n } else {\n return new(tree.Combinator)(null);\n }\n },\n //\n // A CSS Selector\n // with less extensions e.g. the ability to extend and guard\n //\n // .class > div + h1\n // li a:hover\n //\n // Selectors are made out of one or more Elements, see above.\n //\n selector: function (isLess) {\n const index = parserInput.i;\n let elements;\n let extendList;\n let c;\n let e;\n let allExtends;\n let when;\n let condition;\n isLess = isLess !== false;\n while ((isLess && (extendList = this.extend())) || (isLess && (when = parserInput.$str('when'))) || (e = this.element())) {\n if (when) {\n condition = expect(this.conditions, 'expected condition');\n } else if (condition) {\n error('CSS guard can only be used at the end of selector');\n } else if (extendList) {\n if (allExtends) {\n allExtends = allExtends.concat(extendList);\n } else {\n allExtends = extendList;\n }\n } else {\n if (allExtends) { error('Extend can only be used at the end of selector'); }\n c = parserInput.currentChar();\n if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n e = null;\n }\n if (c === '{' || c === '}' || c === ';' || c === ',' || c === ')') {\n break;\n }\n }\n\n if (elements) { return new(tree.Selector)(elements, allExtends, condition, index, fileInfo); }\n if (allExtends) { error('Extend must be used to extend a selector, it cannot be used on its own'); }\n },\n selectors: function () {\n let s;\n let selectors;\n while (true) {\n s = this.selector();\n if (!s) {\n break;\n }\n if (selectors) {\n selectors.push(s);\n } else {\n selectors = [ s ];\n }\n parserInput.commentStore.length = 0;\n if (s.condition && selectors.length > 1) {\n error(\"Guards are only currently allowed on a single selector.\");\n }\n if (!parserInput.$char(',')) { break; }\n if (s.condition) {\n error(\"Guards are only currently allowed on a single selector.\");\n }\n parserInput.commentStore.length = 0;\n }\n return selectors;\n },\n attribute: function () {\n if (!parserInput.$char('[')) { return; }\n\n const entities = this.entities;\n let key;\n let val;\n let op;\n\n if (!(key = entities.variableCurly())) {\n key = expect(/^(?:[_A-Za-z0-9-\\*]*\\|)?(?:[_A-Za-z0-9-]|\\\\.)+/);\n }\n\n op = parserInput.$re(/^[|~*$^]?=/);\n if (op) {\n val = entities.quoted() || parserInput.$re(/^[0-9]+%/) || parserInput.$re(/^[\\w-]+/) || entities.variableCurly();\n }\n\n expectChar(']');\n\n return new(tree.Attribute)(key, op, val);\n },\n\n //\n // The `block` rule is used by `ruleset` and `mixin.definition`.\n // It's a wrapper around the `primary` rule, with added `{}`.\n //\n block: function () {\n let content;\n if (parserInput.$char('{') && (content = this.primary()) && parserInput.$char('}')) {\n return content;\n }\n },\n\n blockRuleset: function() {\n let block = this.block();\n\n if (block) {\n block = new tree.Ruleset(null, block);\n }\n return block;\n },\n\n detachedRuleset: function() {\n let argInfo;\n let params;\n let variadic;\n\n parserInput.save();\n if (parserInput.$re(/^[.#]\\(/)) {\n /**\n * DR args currently only implemented for each() function, and not \n * yet settable as `@dr: #(@arg) {}`\n * This should be done when DRs are merged with mixins.\n * See: https://github.com/less/less-meta/issues/16\n */\n argInfo = this.mixin.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n if (!parserInput.$char(')')) {\n parserInput.restore();\n return;\n }\n }\n const blockRuleset = this.blockRuleset();\n if (blockRuleset) {\n parserInput.forget();\n if (params) {\n return new tree.mixin.Definition(null, params, blockRuleset, null, variadic);\n }\n return new tree.DetachedRuleset(blockRuleset);\n }\n parserInput.restore();\n },\n\n //\n // div, .class, body > p {...}\n //\n ruleset: function () {\n let selectors;\n let rules;\n let debugInfo;\n\n parserInput.save();\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(parserInput.i);\n }\n\n selectors = this.selectors();\n\n if (selectors && (rules = this.block())) {\n parserInput.forget();\n const ruleset = new(tree.Ruleset)(selectors, rules, context.strictImports);\n if (context.dumpLineNumbers) {\n ruleset.debugInfo = debugInfo;\n }\n return ruleset;\n } else {\n parserInput.restore();\n }\n },\n declaration: function () {\n let name;\n let value;\n const index = parserInput.i;\n let hasDR;\n const c = parserInput.currentChar();\n let important;\n let merge;\n let isVariable;\n\n if (c === '.' || c === '#' || c === '&' || c === ':') { return; }\n\n parserInput.save();\n\n name = this.variable() || this.ruleProperty();\n if (name) {\n isVariable = typeof name === 'string';\n\n if (isVariable) {\n value = this.detachedRuleset();\n if (value) {\n hasDR = true;\n }\n }\n\n parserInput.commentStore.length = 0;\n if (!value) {\n // a name returned by this.ruleProperty() is always an array of the form:\n // [string-1, ..., string-n, \"\"] or [string-1, ..., string-n, \"+\"]\n // where each item is a tree.Keyword or tree.Variable\n merge = !isVariable && name.length > 1 && name.pop().value;\n\n // Custom property values get permissive parsing\n if (name[0].value && name[0].value.slice(0, 2) === '--') {\n value = this.permissiveValue();\n }\n // Try to store values as anonymous\n // If we need the value later we'll re-parse it in ruleset.parseValue\n else {\n value = this.anonymousValue();\n }\n if (value) {\n parserInput.forget();\n // anonymous values absorb the end ';' which is required for them to work\n return new(tree.Declaration)(name, value, false, merge, index, fileInfo);\n }\n\n if (!value) {\n value = this.value();\n }\n\n if (value) {\n important = this.important();\n } else if (isVariable) {\n // As a last resort, try permissiveValue\n value = this.permissiveValue();\n }\n }\n\n if (value && (this.end() || hasDR)) {\n parserInput.forget();\n return new(tree.Declaration)(name, value, important, merge, index, fileInfo);\n }\n else {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n }\n },\n anonymousValue: function () {\n const index = parserInput.i;\n const match = parserInput.$re(/^([^.#@\\$+\\/'\"*`(;{}-]*);/);\n if (match) {\n return new(tree.Anonymous)(match[1], index);\n }\n },\n /**\n * Used for custom properties, at-rules, and variables (as fallback)\n * Parses almost anything inside of {} [] () \"\" blocks\n * until it reaches outer-most tokens.\n * \n * First, it will try to parse comments and entities to reach\n * the end. This is mostly like the Expression parser except no\n * math is allowed.\n */\n permissiveValue: function (untilTokens) {\n let i;\n let e;\n let done;\n let value;\n const tok = untilTokens || ';';\n const index = parserInput.i;\n const result = [];\n\n function testCurrentChar() {\n const char = parserInput.currentChar();\n if (typeof tok === 'string') {\n return char === tok;\n } else {\n return tok.test(char);\n }\n }\n if (testCurrentChar()) {\n return;\n }\n value = [];\n do {\n e = this.comment();\n if (e) {\n value.push(e);\n continue;\n }\n e = this.entity();\n if (e) {\n value.push(e);\n }\n } while (e);\n\n done = testCurrentChar();\n\n if (value.length > 0) {\n value = new(tree.Expression)(value);\n if (done) {\n return value;\n }\n else {\n result.push(value);\n }\n // Preserve space before $parseUntil as it will not\n if (parserInput.prevChar() === ' ') {\n result.push(new tree.Anonymous(' ', index));\n }\n }\n parserInput.save();\n\n value = parserInput.$parseUntil(tok);\n\n if (value) {\n if (typeof value === 'string') {\n error(`Expected '${value}'`, 'Parse');\n }\n if (value.length === 1 && value[0] === ' ') {\n parserInput.forget();\n return new tree.Anonymous('', index);\n }\n let item;\n for (i = 0; i < value.length; i++) {\n item = value[i];\n if (Array.isArray(item)) {\n // Treat actual quotes as normal quoted values\n result.push(new tree.Quoted(item[0], item[1], true, index, fileInfo));\n }\n else {\n if (i === value.length - 1) {\n item = item.trim();\n }\n // Treat like quoted values, but replace vars like unquoted expressions\n const quote = new tree.Quoted('\\'', item, true, index, fileInfo);\n quote.variableRegex = /@([\\w-]+)/g;\n quote.propRegex = /\\$([\\w-]+)/g;\n result.push(quote);\n }\n }\n parserInput.forget();\n return new tree.Expression(result, true);\n }\n parserInput.restore();\n },\n\n //\n // An @import atrule\n //\n // @import \"lib\";\n //\n // Depending on our environment, importing is done differently:\n // In the browser, it's an XHR request, in Node, it would be a\n // file-system operation. The function used for importing is\n // stored in `import`, which we pass to the Import constructor.\n //\n 'import': function () {\n let path;\n let features;\n const index = parserInput.i;\n\n const dir = parserInput.$re(/^@import?\\s+/);\n\n if (dir) {\n const options = (dir ? this.importOptions() : null) || {};\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n features = this.mediaFeatures();\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon or unrecognised media features on import');\n }\n features = features && new(tree.Value)(features);\n return new(tree.Import)(path, features, options, index, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed import statement');\n }\n }\n },\n\n importOptions: function() {\n let o;\n const options = {};\n let optionName;\n let value;\n\n // list of options, surrounded by parens\n if (!parserInput.$char('(')) { return null; }\n do {\n o = this.importOption();\n if (o) {\n optionName = o;\n value = true;\n switch (optionName) {\n case 'css':\n optionName = 'less';\n value = false;\n break;\n case 'once':\n optionName = 'multiple';\n value = false;\n break;\n }\n options[optionName] = value;\n if (!parserInput.$char(',')) { break; }\n }\n } while (o);\n expectChar(')');\n return options;\n },\n\n importOption: function() {\n const opt = parserInput.$re(/^(less|css|multiple|once|inline|reference|optional)/);\n if (opt) {\n return opt[1];\n }\n },\n\n mediaFeature: function () {\n const entities = this.entities;\n const nodes = [];\n let e;\n let p;\n parserInput.save();\n do {\n e = entities.keyword() || entities.variable() || entities.mixinLookup();\n if (e) {\n nodes.push(e);\n } else if (parserInput.$char('(')) {\n p = this.property();\n e = this.value();\n if (parserInput.$char(')')) {\n if (p && e) {\n nodes.push(new(tree.Paren)(new(tree.Declaration)(p, e, null, null, parserInput.i, fileInfo, true)));\n } else if (e) {\n nodes.push(new(tree.Paren)(e));\n } else {\n error('badly formed media feature definition');\n }\n } else {\n error('Missing closing \\')\\'', 'Parse');\n }\n }\n } while (e);\n\n parserInput.forget();\n if (nodes.length > 0) {\n return new(tree.Expression)(nodes);\n }\n },\n\n mediaFeatures: function () {\n const entities = this.entities;\n const features = [];\n let e;\n do {\n e = this.mediaFeature();\n if (e) {\n features.push(e);\n if (!parserInput.$char(',')) { break; }\n } else {\n e = entities.variable() || entities.mixinLookup();\n if (e) {\n features.push(e);\n if (!parserInput.$char(',')) { break; }\n }\n }\n } while (e);\n\n return features.length > 0 ? features : null;\n },\n\n media: function () {\n let features;\n let rules;\n let media;\n let debugInfo;\n const index = parserInput.i;\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(index);\n }\n\n parserInput.save();\n\n if (parserInput.$str('@media')) {\n features = this.mediaFeatures();\n\n rules = this.block();\n\n if (!rules) {\n error('media definitions require block statements after any features');\n }\n\n parserInput.forget();\n\n media = new(tree.Media)(rules, features, index, fileInfo);\n if (context.dumpLineNumbers) {\n media.debugInfo = debugInfo;\n }\n\n return media;\n }\n\n parserInput.restore();\n },\n\n //\n\n // A @plugin directive, used to import plugins dynamically.\n //\n // @plugin (args) \"lib\";\n //\n plugin: function () {\n let path;\n let args;\n let options;\n const index = parserInput.i;\n const dir = parserInput.$re(/^@plugin?\\s+/);\n\n if (dir) {\n args = this.pluginArgs();\n\n if (args) {\n options = {\n pluginArgs: args,\n isPlugin: true\n };\n }\n else {\n options = { isPlugin: true };\n }\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon on @plugin');\n }\n return new(tree.Import)(path, null, options, index, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed @plugin statement');\n }\n }\n },\n\n pluginArgs: function() {\n // list of options, surrounded by parens\n parserInput.save();\n if (!parserInput.$char('(')) {\n parserInput.restore();\n return null;\n }\n const args = parserInput.$re(/^\\s*([^\\);]+)\\)\\s*/);\n if (args[1]) {\n parserInput.forget();\n return args[1].trim();\n }\n else { \n parserInput.restore();\n return null;\n }\n },\n\n //\n // A CSS AtRule\n //\n // @charset \"utf-8\";\n //\n atrule: function () {\n const index = parserInput.i;\n let name;\n let value;\n let rules;\n let nonVendorSpecificName;\n let hasIdentifier;\n let hasExpression;\n let hasUnknown;\n let hasBlock = true;\n let isRooted = true;\n\n if (parserInput.currentChar() !== '@') { return; }\n\n value = this['import']() || this.plugin() || this.media();\n if (value) {\n return value;\n }\n\n parserInput.save();\n\n name = parserInput.$re(/^@[a-z-]+/);\n\n if (!name) { return; }\n\n nonVendorSpecificName = name;\n if (name.charAt(1) == '-' && name.indexOf('-', 2) > 0) {\n nonVendorSpecificName = `@${name.slice(name.indexOf('-', 2) + 1)}`;\n }\n\n switch (nonVendorSpecificName) {\n case '@charset':\n hasIdentifier = true;\n hasBlock = false;\n break;\n case '@namespace':\n hasExpression = true;\n hasBlock = false;\n break;\n case '@keyframes':\n case '@counter-style':\n hasIdentifier = true;\n break;\n case '@document':\n case '@supports':\n hasUnknown = true;\n isRooted = false;\n break;\n default:\n hasUnknown = true;\n break;\n }\n\n parserInput.commentStore.length = 0;\n\n if (hasIdentifier) {\n value = this.entity();\n if (!value) {\n error(`expected ${name} identifier`);\n }\n } else if (hasExpression) {\n value = this.expression();\n if (!value) {\n error(`expected ${name} expression`);\n }\n } else if (hasUnknown) {\n value = this.permissiveValue(/^[{;]/);\n hasBlock = (parserInput.currentChar() === '{');\n if (!value) {\n if (!hasBlock && parserInput.currentChar() !== ';') {\n error(`${name} rule is missing block or ending semi-colon`);\n }\n }\n else if (!value.value) {\n value = null;\n }\n }\n\n if (hasBlock) {\n rules = this.blockRuleset();\n }\n\n if (rules || (!hasBlock && value && parserInput.$char(';'))) {\n parserInput.forget();\n return new(tree.AtRule)(name, value, rules, index, fileInfo,\n context.dumpLineNumbers ? getDebugInfo(index) : null,\n isRooted\n );\n }\n\n parserInput.restore('at-rule options not recognised');\n },\n\n //\n // A Value is a comma-delimited list of Expressions\n //\n // font-family: Baskerville, Georgia, serif;\n //\n // In a Rule, a Value represents everything after the `:`,\n // and before the `;`.\n //\n value: function () {\n let e;\n const expressions = [];\n const index = parserInput.i;\n\n do {\n e = this.expression();\n if (e) {\n expressions.push(e);\n if (!parserInput.$char(',')) { break; }\n }\n } while (e);\n\n if (expressions.length > 0) {\n return new(tree.Value)(expressions, index);\n }\n },\n important: function () {\n if (parserInput.currentChar() === '!') {\n return parserInput.$re(/^! *important/);\n }\n },\n sub: function () {\n let a;\n let e;\n\n parserInput.save();\n if (parserInput.$char('(')) {\n a = this.addition();\n if (a && parserInput.$char(')')) {\n parserInput.forget();\n e = new(tree.Expression)([a]);\n e.parens = true;\n return e;\n }\n parserInput.restore('Expected \\')\\'');\n return;\n }\n parserInput.restore();\n },\n multiplication: function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.operand();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1);\n while (true) {\n if (parserInput.peek(/^\\/[*\\/]/)) {\n break;\n }\n\n parserInput.save();\n\n op = parserInput.$char('/') || parserInput.$char('*') || parserInput.$str('./');\n\n if (!op) { parserInput.forget(); break; }\n\n a = this.operand();\n\n if (!a) { parserInput.restore(); break; }\n parserInput.forget();\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n isSpaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n addition: function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.multiplication();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1);\n while (true) {\n op = parserInput.$re(/^[-+]\\s+/) || (!isSpaced && (parserInput.$char('+') || parserInput.$char('-')));\n if (!op) {\n break;\n }\n a = this.multiplication();\n if (!a) {\n break;\n }\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n isSpaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n conditions: function () {\n let a;\n let b;\n const index = parserInput.i;\n let condition;\n\n a = this.condition(true);\n if (a) {\n while (true) {\n if (!parserInput.peek(/^,\\s*(not\\s*)?\\(/) || !parserInput.$char(',')) {\n break;\n }\n b = this.condition(true);\n if (!b) {\n break;\n }\n condition = new(tree.Condition)('or', condition || a, b, index);\n }\n return condition || a;\n }\n },\n condition: function (needsParens) {\n let result;\n let logical;\n let next;\n function or() {\n return parserInput.$str('or');\n }\n\n result = this.conditionAnd(needsParens);\n if (!result) {\n return ;\n }\n logical = or();\n if (logical) {\n next = this.condition(needsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n }\n }\n return result;\n },\n conditionAnd: function (needsParens) {\n let result;\n let logical;\n let next;\n const self = this;\n function insideCondition() {\n const cond = self.negatedCondition(needsParens) || self.parenthesisCondition(needsParens);\n if (!cond && !needsParens) {\n return self.atomicCondition(needsParens);\n }\n return cond;\n }\n function and() {\n return parserInput.$str('and');\n }\n\n result = insideCondition();\n if (!result) {\n return ;\n }\n logical = and();\n if (logical) {\n next = this.conditionAnd(needsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n }\n }\n return result;\n },\n negatedCondition: function (needsParens) {\n if (parserInput.$str('not')) {\n const result = this.parenthesisCondition(needsParens);\n if (result) {\n result.negate = !result.negate;\n }\n return result;\n }\n },\n parenthesisCondition: function (needsParens) {\n function tryConditionFollowedByParenthesis(me) {\n let body;\n parserInput.save();\n body = me.condition(needsParens);\n if (!body) {\n parserInput.restore();\n return ;\n }\n if (!parserInput.$char(')')) {\n parserInput.restore();\n return ;\n }\n parserInput.forget();\n return body;\n }\n\n let body;\n parserInput.save();\n if (!parserInput.$str('(')) {\n parserInput.restore();\n return ;\n }\n body = tryConditionFollowedByParenthesis(this);\n if (body) {\n parserInput.forget();\n return body;\n }\n\n body = this.atomicCondition(needsParens);\n if (!body) {\n parserInput.restore();\n return ;\n }\n if (!parserInput.$char(')')) {\n parserInput.restore(`expected ')' got '${parserInput.currentChar()}'`);\n return ;\n }\n parserInput.forget();\n return body;\n },\n atomicCondition: function (needsParens) {\n const entities = this.entities;\n const index = parserInput.i;\n let a;\n let b;\n let c;\n let op;\n\n function cond() {\n return this.addition() || entities.keyword() || entities.quoted() || entities.mixinLookup();\n }\n cond = cond.bind(this);\n\n a = cond();\n if (a) {\n if (parserInput.$char('>')) {\n if (parserInput.$char('=')) {\n op = '>=';\n } else {\n op = '>';\n }\n } else\n if (parserInput.$char('<')) {\n if (parserInput.$char('=')) {\n op = '<=';\n } else {\n op = '<';\n }\n } else\n if (parserInput.$char('=')) {\n if (parserInput.$char('>')) {\n op = '=>';\n } else if (parserInput.$char('<')) {\n op = '=<';\n } else {\n op = '=';\n }\n }\n if (op) {\n b = cond();\n if (b) {\n c = new(tree.Condition)(op, a, b, index, false);\n } else {\n error('expected expression');\n }\n } else {\n c = new(tree.Condition)('=', a, new(tree.Keyword)('true'), index, false);\n }\n return c;\n }\n },\n\n //\n // An operand is anything that can be part of an operation,\n // such as a Color, or a Variable\n //\n operand: function () {\n const entities = this.entities;\n let negate;\n\n if (parserInput.peek(/^-[@\\$\\(]/)) {\n negate = parserInput.$char('-');\n }\n\n let o = this.sub() || entities.dimension() ||\n entities.color() || entities.variable() ||\n entities.property() || entities.call() ||\n entities.quoted(true) || entities.colorKeyword() ||\n entities.mixinLookup();\n\n if (negate) {\n o.parensInOp = true;\n o = new(tree.Negative)(o);\n }\n\n return o;\n },\n\n //\n // Expressions either represent mathematical operations,\n // or white-space delimited Entities.\n //\n // 1px solid black\n // @var * 2\n //\n expression: function () {\n const entities = [];\n let e;\n let delim;\n const index = parserInput.i;\n\n do {\n e = this.comment();\n if (e) {\n entities.push(e);\n continue;\n }\n e = this.addition() || this.entity();\n\n if (e instanceof tree.Comment) {\n e = null;\n }\n\n if (e) {\n entities.push(e);\n // operations do not allow keyword \"/\" dimension (e.g. small/20px) so we support that here\n if (!parserInput.peek(/^\\/[\\/*]/)) {\n delim = parserInput.$char('/');\n if (delim) {\n entities.push(new(tree.Anonymous)(delim, index));\n }\n }\n }\n } while (e);\n if (entities.length > 0) {\n return new(tree.Expression)(entities);\n }\n },\n property: function () {\n const name = parserInput.$re(/^(\\*?-?[_a-zA-Z0-9-]+)\\s*:/);\n if (name) {\n return name[1];\n }\n },\n ruleProperty: function () {\n let name = [];\n const index = [];\n let s;\n let k;\n\n parserInput.save();\n\n const simpleProperty = parserInput.$re(/^([_a-zA-Z0-9-]+)\\s*:/);\n if (simpleProperty) {\n name = [new(tree.Keyword)(simpleProperty[1])];\n parserInput.forget();\n return name;\n }\n\n function match(re) {\n const i = parserInput.i;\n const chunk = parserInput.$re(re);\n if (chunk) {\n index.push(i);\n return name.push(chunk[1]);\n }\n }\n\n match(/^(\\*?)/);\n while (true) {\n if (!match(/^((?:[\\w-]+)|(?:[@\\$]\\{[\\w-]+\\}))/)) {\n break;\n }\n }\n\n if ((name.length > 1) && match(/^((?:\\+_|\\+)?)\\s*:/)) {\n parserInput.forget();\n\n // at last, we have the complete match now. move forward,\n // convert name particles to tree objects and return:\n if (name[0] === '') {\n name.shift();\n index.shift();\n }\n for (k = 0; k < name.length; k++) {\n s = name[k];\n name[k] = (s.charAt(0) !== '@' && s.charAt(0) !== '$') ?\n new(tree.Keyword)(s) :\n (s.charAt(0) === '@' ?\n new(tree.Variable)(`@${s.slice(2, -1)}`, index[k], fileInfo) :\n new(tree.Property)(`$${s.slice(2, -1)}`, index[k], fileInfo));\n }\n return name;\n }\n parserInput.restore();\n }\n }\n };\n};\nParser.serializeVars = vars => {\n let s = '';\n\n for (const name in vars) {\n if (Object.hasOwnProperty.call(vars, name)) {\n const value = vars[name];\n s += `${((name[0] === '@') ? '' : '@') + name}: ${value}${(String(value).slice(-1) === ';') ? '' : ';'}`;\n }\n }\n\n return s;\n};\n\nexport default Parser;\n","import Anonymous from '../tree/anonymous';\nimport Keyword from '../tree/keyword';\n\nfunction boolean(condition) {\n return condition ? Keyword.True : Keyword.False;\n}\n\n/**\n * Functions with evalArgs set to false are sent context\n * as the first argument.\n */\nfunction If(context, condition, trueValue, falseValue) {\n return condition.eval(context) ? trueValue.eval(context)\n : (falseValue ? falseValue.eval(context) : new Anonymous);\n}\nIf.evalArgs = false\n\nexport default { boolean, 'if': If };\n","import Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport Expression from '../tree/expression';\nimport Operation from '../tree/operation';\nlet colorFunctions;\n\nfunction clamp(val) {\n return Math.min(1, Math.max(0, val));\n}\nfunction hsla(origColor, hsl) {\n const color = colorFunctions.hsla(hsl.h, hsl.s, hsl.l, hsl.a);\n if (color) {\n if (origColor.value && \n /^(rgb|hsl)/.test(origColor.value)) {\n color.value = origColor.value;\n } else {\n color.value = 'rgb';\n }\n return color;\n }\n}\nfunction toHSL(color) {\n if (color.toHSL) {\n return color.toHSL();\n } else {\n throw new Error('Argument cannot be evaluated to a color');\n }\n}\n\nfunction toHSV(color) {\n if (color.toHSV) {\n return color.toHSV();\n } else {\n throw new Error('Argument cannot be evaluated to a color');\n }\n}\n\nfunction number(n) {\n if (n instanceof Dimension) {\n return parseFloat(n.unit.is('%') ? n.value / 100 : n.value);\n } else if (typeof n === 'number') {\n return n;\n } else {\n throw {\n type: 'Argument',\n message: 'color functions take numbers as parameters'\n };\n }\n}\nfunction scaled(n, size) {\n if (n instanceof Dimension && n.unit.is('%')) {\n return parseFloat(n.value * size / 100);\n } else {\n return number(n);\n }\n}\ncolorFunctions = {\n rgb: function (r, g, b) {\n let a = 1\n /**\n * Comma-less syntax\n * e.g. rgb(0 128 255 / 50%)\n */\n if (r instanceof Expression) {\n const val = r.value\n r = val[0]\n g = val[1]\n b = val[2]\n /** \n * @todo - should this be normalized in\n * function caller? Or parsed differently?\n */\n if (b instanceof Operation) {\n const op = b\n b = op.operands[0]\n a = op.operands[1]\n }\n }\n const color = colorFunctions.rgba(r, g, b, a);\n if (color) {\n color.value = 'rgb';\n return color;\n }\n },\n rgba: function (r, g, b, a) {\n try {\n if (r instanceof Color) {\n if (g) {\n a = number(g);\n } else {\n a = r.alpha;\n }\n return new Color(r.rgb, a, 'rgba');\n }\n const rgb = [r, g, b].map(c => scaled(c, 255));\n a = number(a);\n return new Color(rgb, a, 'rgba');\n }\n catch (e) {}\n },\n hsl: function (h, s, l) {\n let a = 1\n if (h instanceof Expression) {\n const val = h.value\n h = val[0]\n s = val[1]\n l = val[2]\n\n if (l instanceof Operation) {\n const op = l\n l = op.operands[0]\n a = op.operands[1]\n }\n }\n const color = colorFunctions.hsla(h, s, l, a);\n if (color) {\n color.value = 'hsl';\n return color;\n }\n },\n hsla: function (h, s, l, a) {\n try {\n if (h instanceof Color) {\n if (s) {\n a = number(s);\n } else {\n a = h.alpha;\n }\n return new Color(h.rgb, a, 'hsla');\n }\n\n let m1;\n let m2;\n\n function hue(h) {\n h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h);\n if (h * 6 < 1) {\n return m1 + (m2 - m1) * h * 6;\n }\n else if (h * 2 < 1) {\n return m2;\n }\n else if (h * 3 < 2) {\n return m1 + (m2 - m1) * (2 / 3 - h) * 6;\n }\n else {\n return m1;\n }\n }\n\n h = (number(h) % 360) / 360;\n s = clamp(number(s));l = clamp(number(l));a = clamp(number(a));\n\n m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n m1 = l * 2 - m2;\n\n const rgb = [\n hue(h + 1 / 3) * 255,\n hue(h) * 255,\n hue(h - 1 / 3) * 255\n ];\n a = number(a);\n return new Color(rgb, a, 'hsla');\n }\n catch (e) {}\n },\n\n hsv: function(h, s, v) {\n return colorFunctions.hsva(h, s, v, 1.0);\n },\n\n hsva: function(h, s, v, a) {\n h = ((number(h) % 360) / 360) * 360;\n s = number(s);v = number(v);a = number(a);\n\n let i;\n let f;\n i = Math.floor((h / 60) % 6);\n f = (h / 60) - i;\n\n const vs = [v,\n v * (1 - s),\n v * (1 - f * s),\n v * (1 - (1 - f) * s)];\n const perm = [[0, 3, 1],\n [2, 0, 1],\n [1, 0, 3],\n [1, 2, 0],\n [3, 1, 0],\n [0, 1, 2]];\n\n return colorFunctions.rgba(vs[perm[i][0]] * 255,\n vs[perm[i][1]] * 255,\n vs[perm[i][2]] * 255,\n a);\n },\n\n hue: function (color) {\n return new Dimension(toHSL(color).h);\n },\n saturation: function (color) {\n return new Dimension(toHSL(color).s * 100, '%');\n },\n lightness: function (color) {\n return new Dimension(toHSL(color).l * 100, '%');\n },\n hsvhue: function(color) {\n return new Dimension(toHSV(color).h);\n },\n hsvsaturation: function (color) {\n return new Dimension(toHSV(color).s * 100, '%');\n },\n hsvvalue: function (color) {\n return new Dimension(toHSV(color).v * 100, '%');\n },\n red: function (color) {\n return new Dimension(color.rgb[0]);\n },\n green: function (color) {\n return new Dimension(color.rgb[1]);\n },\n blue: function (color) {\n return new Dimension(color.rgb[2]);\n },\n alpha: function (color) {\n return new Dimension(toHSL(color).a);\n },\n luma: function (color) {\n return new Dimension(color.luma() * color.alpha * 100, '%');\n },\n luminance: function (color) {\n const luminance =\n (0.2126 * color.rgb[0] / 255) +\n (0.7152 * color.rgb[1] / 255) +\n (0.0722 * color.rgb[2] / 255);\n\n return new Dimension(luminance * color.alpha * 100, '%');\n },\n saturate: function (color, amount, method) {\n // filter: saturate(3.2);\n // should be kept as is, so check for color\n if (!color.rgb) {\n return null;\n }\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.s += hsl.s * amount.value / 100;\n }\n else {\n hsl.s += amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n return hsla(color, hsl);\n },\n desaturate: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.s -= hsl.s * amount.value / 100;\n }\n else {\n hsl.s -= amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n return hsla(color, hsl);\n },\n lighten: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.l += hsl.l * amount.value / 100;\n }\n else {\n hsl.l += amount.value / 100;\n }\n hsl.l = clamp(hsl.l);\n return hsla(color, hsl);\n },\n darken: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.l -= hsl.l * amount.value / 100;\n }\n else {\n hsl.l -= amount.value / 100;\n }\n hsl.l = clamp(hsl.l);\n return hsla(color, hsl);\n },\n fadein: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.a += hsl.a * amount.value / 100;\n }\n else {\n hsl.a += amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fadeout: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.a -= hsl.a * amount.value / 100;\n }\n else {\n hsl.a -= amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fade: function (color, amount) {\n const hsl = toHSL(color);\n\n hsl.a = amount.value / 100;\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n spin: function (color, amount) {\n const hsl = toHSL(color);\n const hue = (hsl.h + amount.value) % 360;\n\n hsl.h = hue < 0 ? 360 + hue : hue;\n\n return hsla(color, hsl);\n },\n //\n // Copyright (c) 2006-2009 Hampton Catlin, Natalie Weizenbaum, and Chris Eppstein\n // http://sass-lang.com\n //\n mix: function (color1, color2, weight) {\n if (!weight) {\n weight = new Dimension(50);\n }\n const p = weight.value / 100.0;\n const w = p * 2 - 1;\n const a = toHSL(color1).a - toHSL(color2).a;\n\n const w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n const w2 = 1 - w1;\n\n const rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2,\n color1.rgb[1] * w1 + color2.rgb[1] * w2,\n color1.rgb[2] * w1 + color2.rgb[2] * w2];\n\n const alpha = color1.alpha * p + color2.alpha * (1 - p);\n\n return new Color(rgb, alpha);\n },\n greyscale: function (color) {\n return colorFunctions.desaturate(color, new Dimension(100));\n },\n contrast: function (color, dark, light, threshold) {\n // filter: contrast(3.2);\n // should be kept as is, so check for color\n if (!color.rgb) {\n return null;\n }\n if (typeof light === 'undefined') {\n light = colorFunctions.rgba(255, 255, 255, 1.0);\n }\n if (typeof dark === 'undefined') {\n dark = colorFunctions.rgba(0, 0, 0, 1.0);\n }\n // Figure out which is actually light and dark:\n if (dark.luma() > light.luma()) {\n const t = light;\n light = dark;\n dark = t;\n }\n if (typeof threshold === 'undefined') {\n threshold = 0.43;\n } else {\n threshold = number(threshold);\n }\n if (color.luma() < threshold) {\n return light;\n } else {\n return dark;\n }\n },\n // Changes made in 2.7.0 - Reverted in 3.0.0\n // contrast: function (color, color1, color2, threshold) {\n // // Return which of `color1` and `color2` has the greatest contrast with `color`\n // // according to the standard WCAG contrast ratio calculation.\n // // http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n // // The threshold param is no longer used, in line with SASS.\n // // filter: contrast(3.2);\n // // should be kept as is, so check for color\n // if (!color.rgb) {\n // return null;\n // }\n // if (typeof color1 === 'undefined') {\n // color1 = colorFunctions.rgba(0, 0, 0, 1.0);\n // }\n // if (typeof color2 === 'undefined') {\n // color2 = colorFunctions.rgba(255, 255, 255, 1.0);\n // }\n // var contrast1, contrast2;\n // var luma = color.luma();\n // var luma1 = color1.luma();\n // var luma2 = color2.luma();\n // // Calculate contrast ratios for each color\n // if (luma > luma1) {\n // contrast1 = (luma + 0.05) / (luma1 + 0.05);\n // } else {\n // contrast1 = (luma1 + 0.05) / (luma + 0.05);\n // }\n // if (luma > luma2) {\n // contrast2 = (luma + 0.05) / (luma2 + 0.05);\n // } else {\n // contrast2 = (luma2 + 0.05) / (luma + 0.05);\n // }\n // if (contrast1 > contrast2) {\n // return color1;\n // } else {\n // return color2;\n // }\n // },\n argb: function (color) {\n return new Anonymous(color.toARGB());\n },\n color: function(c) {\n if ((c instanceof Quoted) &&\n (/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})$/i.test(c.value))) {\n const val = c.value.slice(1);\n return new Color(val, undefined, `#${val}`);\n }\n if ((c instanceof Color) || (c = Color.fromKeyword(c.value))) {\n c.value = undefined;\n return c;\n }\n throw {\n type: 'Argument',\n message: 'argument must be a color keyword or 3|4|6|8 digit hex e.g. #FFF'\n };\n },\n tint: function(color, amount) {\n return colorFunctions.mix(colorFunctions.rgb(255, 255, 255), color, amount);\n },\n shade: function(color, amount) {\n return colorFunctions.mix(colorFunctions.rgb(0, 0, 0), color, amount);\n }\n};\n\nexport default colorFunctions;\n","import Color from '../tree/color';\n\n// Color Blending\n// ref: http://www.w3.org/TR/compositing-1\n\nfunction colorBlend(mode, color1, color2) {\n const ab = color1.alpha; // result\n\n let // backdrop\n cb;\n\n const as = color2.alpha;\n\n let // source\n cs;\n\n let ar;\n let cr;\n const r = [];\n\n ar = as + ab * (1 - as);\n for (let i = 0; i < 3; i++) {\n cb = color1.rgb[i] / 255;\n cs = color2.rgb[i] / 255;\n cr = mode(cb, cs);\n if (ar) {\n cr = (as * cs + ab * (cb -\n as * (cb + cs - cr))) / ar;\n }\n r[i] = cr * 255;\n }\n\n return new Color(r, ar);\n}\n\nconst colorBlendModeFunctions = {\n multiply: function(cb, cs) {\n return cb * cs;\n },\n screen: function(cb, cs) {\n return cb + cs - cb * cs;\n },\n overlay: function(cb, cs) {\n cb *= 2;\n return (cb <= 1) ?\n colorBlendModeFunctions.multiply(cb, cs) :\n colorBlendModeFunctions.screen(cb - 1, cs);\n },\n softlight: function(cb, cs) {\n let d = 1;\n let e = cb;\n if (cs > 0.5) {\n e = 1;\n d = (cb > 0.25) ? Math.sqrt(cb)\n : ((16 * cb - 12) * cb + 4) * cb;\n }\n return cb - (1 - 2 * cs) * e * (d - cb);\n },\n hardlight: function(cb, cs) {\n return colorBlendModeFunctions.overlay(cs, cb);\n },\n difference: function(cb, cs) {\n return Math.abs(cb - cs);\n },\n exclusion: function(cb, cs) {\n return cb + cs - 2 * cb * cs;\n },\n\n // non-w3c functions:\n average: function(cb, cs) {\n return (cb + cs) / 2;\n },\n negation: function(cb, cs) {\n return 1 - Math.abs(cb + cs - 1);\n }\n};\n\nfor (const f in colorBlendModeFunctions) {\n if (colorBlendModeFunctions.hasOwnProperty(f)) {\n colorBlend[f] = colorBlend.bind(null, colorBlendModeFunctions[f]);\n }\n}\n\nexport default colorBlend;\n","import Comment from '../tree/comment';\nimport Node from '../tree/node';\nimport Dimension from '../tree/dimension';\nimport Declaration from '../tree/declaration';\nimport Expression from '../tree/expression';\nimport Ruleset from '../tree/ruleset';\nimport Selector from '../tree/selector';\nimport Element from '../tree/element';\nimport Quote from '../tree/quoted';\nimport Value from '../tree/value';\n\nconst getItemsFromNode = node => {\n // handle non-array values as an array of length 1\n // return 'undefined' if index is invalid\n const items = Array.isArray(node.value) ?\n node.value : Array(node);\n\n return items;\n};\n\nexport default {\n _SELF: function(n) {\n return n;\n },\n '~': function(...expr) {\n if (expr.length === 1) {\n return expr[0];\n }\n return new Value(expr);\n },\n extract: function(values, index) {\n // (1-based index)\n index = index.value - 1;\n\n return getItemsFromNode(values)[index];\n },\n length: function(values) {\n return new Dimension(getItemsFromNode(values).length);\n },\n /**\n * Creates a Less list of incremental values.\n * Modeled after Lodash's range function, also exists natively in PHP\n * \n * @param {Dimension} [start=1]\n * @param {Dimension} end - e.g. 10 or 10px - unit is added to output\n * @param {Dimension} [step=1] \n */\n range: function(start, end, step) {\n let from;\n let to;\n let stepValue = 1;\n const list = [];\n if (end) {\n to = end;\n from = start.value;\n if (step) {\n stepValue = step.value;\n }\n }\n else {\n from = 1;\n to = start;\n }\n\n for (let i = from; i <= to.value; i += stepValue) {\n list.push(new Dimension(i, to.unit));\n }\n\n return new Expression(list);\n },\n each: function(list, rs) {\n const rules = [];\n let newRules;\n let iterator;\n\n const tryEval = val => {\n if (val instanceof Node) {\n return val.eval(this.context);\n }\n return val;\n };\n\n if (list.value && !(list instanceof Quote)) {\n if (Array.isArray(list.value)) {\n iterator = list.value.map(tryEval);\n } else {\n iterator = [tryEval(list.value)];\n }\n } else if (list.ruleset) {\n iterator = tryEval(list.ruleset).rules;\n } else if (list.rules) {\n iterator = list.rules.map(tryEval);\n } else if (Array.isArray(list)) {\n iterator = list.map(tryEval);\n } else {\n iterator = [tryEval(list)];\n }\n\n let valueName = '@value';\n let keyName = '@key';\n let indexName = '@index';\n\n if (rs.params) {\n valueName = rs.params[0] && rs.params[0].name;\n keyName = rs.params[1] && rs.params[1].name;\n indexName = rs.params[2] && rs.params[2].name;\n rs = rs.rules;\n } else {\n rs = rs.ruleset;\n }\n\n for (let i = 0; i < iterator.length; i++) {\n let key;\n let value;\n const item = iterator[i];\n if (item instanceof Declaration) {\n key = typeof item.name === 'string' ? item.name : item.name[0].value;\n value = item.value;\n } else {\n key = new Dimension(i + 1);\n value = item;\n }\n\n if (item instanceof Comment) {\n continue;\n }\n\n newRules = rs.rules.slice(0);\n if (valueName) {\n newRules.push(new Declaration(valueName,\n value,\n false, false, this.index, this.currentFileInfo));\n }\n if (indexName) {\n newRules.push(new Declaration(indexName,\n new Dimension(i + 1),\n false, false, this.index, this.currentFileInfo));\n }\n if (keyName) {\n newRules.push(new Declaration(keyName,\n key,\n false, false, this.index, this.currentFileInfo));\n }\n\n rules.push(new Ruleset([ new(Selector)([ new Element(\"\", '&') ]) ],\n newRules,\n rs.strictImports,\n rs.visibilityInfo()\n ));\n }\n\n return new Ruleset([ new(Selector)([ new Element(\"\", '&') ]) ],\n rules,\n rs.strictImports,\n rs.visibilityInfo()\n ).eval(this.context);\n }\n};\n","import Dimension from '../tree/dimension';\n\nconst MathHelper = (fn, unit, n) => {\n if (!(n instanceof Dimension)) {\n throw { type: 'Argument', message: 'argument must be a number' };\n }\n if (unit == null) {\n unit = n.unit;\n } else {\n n = n.unify();\n }\n return new Dimension(fn(parseFloat(n.value)), unit);\n};\n\nexport default MathHelper;","import mathHelper from './math-helper.js';\n\nconst mathFunctions = {\n // name, unit\n ceil: null,\n floor: null,\n sqrt: null,\n abs: null,\n tan: '',\n sin: '',\n cos: '',\n atan: 'rad',\n asin: 'rad',\n acos: 'rad'\n};\n\nfor (const f in mathFunctions) {\n if (mathFunctions.hasOwnProperty(f)) {\n mathFunctions[f] = mathHelper.bind(null, Math[f], mathFunctions[f]);\n }\n}\n\nmathFunctions.round = (n, f) => {\n const fraction = typeof f === 'undefined' ? 0 : f.value;\n return mathHelper(num => num.toFixed(fraction), null, n);\n};\n\nexport default mathFunctions;\n","import Dimension from '../tree/dimension';\nimport Anonymous from '../tree/anonymous';\nimport mathHelper from './math-helper.js';\n\nconst minMax = function (isMin, args) {\n args = Array.prototype.slice.call(args);\n switch (args.length) {\n case 0: throw { type: 'Argument', message: 'one or more arguments required' };\n }\n let i; // key is the unit.toString() for unified Dimension values,\n let j;\n let current;\n let currentUnified;\n let referenceUnified;\n let unit;\n let unitStatic;\n let unitClone;\n\n const // elems only contains original argument values.\n order = [];\n\n const values = {};\n // value is the index into the order array.\n for (i = 0; i < args.length; i++) {\n current = args[i];\n if (!(current instanceof Dimension)) {\n if (Array.isArray(args[i].value)) {\n Array.prototype.push.apply(args, Array.prototype.slice.call(args[i].value));\n }\n continue;\n }\n currentUnified = current.unit.toString() === '' && unitClone !== undefined ? new Dimension(current.value, unitClone).unify() : current.unify();\n unit = currentUnified.unit.toString() === '' && unitStatic !== undefined ? unitStatic : currentUnified.unit.toString();\n unitStatic = unit !== '' && unitStatic === undefined || unit !== '' && order[0].unify().unit.toString() === '' ? unit : unitStatic;\n unitClone = unit !== '' && unitClone === undefined ? current.unit.toString() : unitClone;\n j = values[''] !== undefined && unit !== '' && unit === unitStatic ? values[''] : values[unit];\n if (j === undefined) {\n if (unitStatic !== undefined && unit !== unitStatic) {\n throw { type: 'Argument', message: 'incompatible types' };\n }\n values[unit] = order.length;\n order.push(current);\n continue;\n }\n referenceUnified = order[j].unit.toString() === '' && unitClone !== undefined ? new Dimension(order[j].value, unitClone).unify() : order[j].unify();\n if ( isMin && currentUnified.value < referenceUnified.value ||\n !isMin && currentUnified.value > referenceUnified.value) {\n order[j] = current;\n }\n }\n if (order.length == 1) {\n return order[0];\n }\n args = order.map(function (a) { return a.toCSS(this.context); }).join(this.context.compress ? ',' : ', ');\n return new Anonymous(`${isMin ? 'min' : 'max'}(${args})`);\n};\n\nexport default {\n min: function(...args) {\n try {\n return minMax(true, args);\n } catch (e) {}\n },\n max: function(...args) {\n try {\n return minMax(false, args);\n } catch (e) {}\n },\n convert: function (val, unit) {\n return val.convertTo(unit.value);\n },\n pi: function () {\n return new Dimension(Math.PI);\n },\n mod: function(a, b) {\n return new Dimension(a.value % b.value, a.unit);\n },\n pow: function(x, y) {\n if (typeof x === 'number' && typeof y === 'number') {\n x = new Dimension(x);\n y = new Dimension(y);\n } else if (!(x instanceof Dimension) || !(y instanceof Dimension)) {\n throw { type: 'Argument', message: 'arguments must be numbers' };\n }\n\n return new Dimension(Math.pow(x.value, y.value), x.unit);\n },\n percentage: function (n) {\n const result = mathHelper(num => num * 100, '%', n);\n\n return result;\n }\n};\n","import Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport JavaScript from '../tree/javascript';\n\nexport default {\n e: function (str) {\n return new Quoted('\"', str instanceof JavaScript ? str.evaluated : str.value, true);\n },\n escape: function (str) {\n return new Anonymous(\n encodeURI(str.value).replace(/=/g, '%3D').replace(/:/g, '%3A').replace(/#/g, '%23').replace(/;/g, '%3B')\n .replace(/\\(/g, '%28').replace(/\\)/g, '%29'));\n },\n replace: function (string, pattern, replacement, flags) {\n let result = string.value;\n replacement = (replacement.type === 'Quoted') ?\n replacement.value : replacement.toCSS();\n result = result.replace(new RegExp(pattern.value, flags ? flags.value : ''), replacement);\n return new Quoted(string.quote || '', result, string.escaped);\n },\n '%': function (string /* arg, arg, ... */) {\n const args = Array.prototype.slice.call(arguments, 1);\n let result = string.value;\n\n for (let i = 0; i < args.length; i++) {\n /* jshint loopfunc:true */\n result = result.replace(/%[sda]/i, token => {\n const value = ((args[i].type === 'Quoted') &&\n token.match(/s/i)) ? args[i].value : args[i].toCSS();\n return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value;\n });\n }\n result = result.replace(/%%/g, '%');\n return new Quoted(string.quote || '', result, string.escaped);\n }\n};\n","import Keyword from '../tree/keyword';\nimport DetachedRuleset from '../tree/detached-ruleset';\nimport Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport URL from '../tree/url';\nimport Operation from '../tree/operation';\n\nconst isa = (n, Type) => (n instanceof Type) ? Keyword.True : Keyword.False;\nconst isunit = (n, unit) => {\n if (unit === undefined) {\n throw { type: 'Argument', message: 'missing the required second argument to isunit.' };\n }\n unit = typeof unit.value === 'string' ? unit.value : unit;\n if (typeof unit !== 'string') {\n throw { type: 'Argument', message: 'Second argument to isunit should be a unit or a string.' };\n }\n return (n instanceof Dimension) && n.unit.is(unit) ? Keyword.True : Keyword.False;\n};\n\nexport default {\n isruleset: function (n) {\n return isa(n, DetachedRuleset);\n },\n iscolor: function (n) {\n return isa(n, Color);\n },\n isnumber: function (n) {\n return isa(n, Dimension);\n },\n isstring: function (n) {\n return isa(n, Quoted);\n },\n iskeyword: function (n) {\n return isa(n, Keyword);\n },\n isurl: function (n) {\n return isa(n, URL);\n },\n ispixel: function (n) {\n return isunit(n, 'px');\n },\n ispercentage: function (n) {\n return isunit(n, '%');\n },\n isem: function (n) {\n return isunit(n, 'em');\n },\n isunit,\n unit: function (val, unit) {\n if (!(val instanceof Dimension)) {\n throw { type: 'Argument',\n message: `the first argument to unit must be a number${val instanceof Operation ? '. Have you forgotten parenthesis?' : ''}` };\n }\n if (unit) {\n if (unit instanceof Keyword) {\n unit = unit.value;\n } else {\n unit = unit.toCSS();\n }\n } else {\n unit = '';\n }\n return new Dimension(val.value, unit);\n },\n 'get-unit': function (n) {\n return new Anonymous(n.unit);\n }\n};\n","import functionRegistry from './function-registry';\nimport functionCaller from './function-caller';\n\nimport boolean from './boolean';\nimport defaultFunc from './default';\nimport color from './color';\nimport colorBlending from './color-blending';\nimport dataUri from './data-uri';\nimport list from './list';\nimport math from './math';\nimport number from './number';\nimport string from './string';\nimport svg from './svg';\nimport types from './types';\n\nexport default environment => {\n const functions = { functionRegistry, functionCaller };\n\n // register functions\n functionRegistry.addMultiple(boolean);\n functionRegistry.add('default', defaultFunc.eval.bind(defaultFunc));\n functionRegistry.addMultiple(color);\n functionRegistry.addMultiple(colorBlending);\n functionRegistry.addMultiple(dataUri(environment));\n functionRegistry.addMultiple(list);\n functionRegistry.addMultiple(math);\n functionRegistry.addMultiple(number);\n functionRegistry.addMultiple(string);\n functionRegistry.addMultiple(svg(environment));\n functionRegistry.addMultiple(types);\n\n return functions;\n};\n","import Quoted from '../tree/quoted';\nimport URL from '../tree/url';\nimport * as utils from '../utils';\nimport logger from '../logger';\n\nexport default environment => {\n \n const fallback = (functionThis, node) => new URL(node, functionThis.index, functionThis.currentFileInfo).eval(functionThis.context); \n\n return { 'data-uri': function(mimetypeNode, filePathNode) {\n\n if (!filePathNode) {\n filePathNode = mimetypeNode;\n mimetypeNode = null;\n }\n\n let mimetype = mimetypeNode && mimetypeNode.value;\n let filePath = filePathNode.value;\n const currentFileInfo = this.currentFileInfo;\n const currentDirectory = currentFileInfo.rewriteUrls ?\n currentFileInfo.currentDirectory : currentFileInfo.entryPath;\n\n const fragmentStart = filePath.indexOf('#');\n let fragment = '';\n if (fragmentStart !== -1) {\n fragment = filePath.slice(fragmentStart);\n filePath = filePath.slice(0, fragmentStart);\n }\n const context = utils.clone(this.context);\n context.rawBuffer = true;\n\n const fileManager = environment.getFileManager(filePath, currentDirectory, context, environment, true);\n\n if (!fileManager) {\n return fallback(this, filePathNode);\n }\n\n let useBase64 = false;\n\n // detect the mimetype if not given\n if (!mimetypeNode) {\n\n mimetype = environment.mimeLookup(filePath);\n\n if (mimetype === 'image/svg+xml') {\n useBase64 = false;\n } else {\n // use base 64 unless it's an ASCII or UTF-8 format\n const charset = environment.charsetLookup(mimetype);\n useBase64 = ['US-ASCII', 'UTF-8'].indexOf(charset) < 0;\n }\n if (useBase64) { mimetype += ';base64'; }\n }\n else {\n useBase64 = /;base64$/.test(mimetype);\n }\n\n const fileSync = fileManager.loadFileSync(filePath, currentDirectory, context, environment);\n if (!fileSync.contents) {\n logger.warn(`Skipped data-uri embedding of ${filePath} because file not found`);\n return fallback(this, filePathNode || mimetypeNode);\n }\n let buf = fileSync.contents;\n if (useBase64 && !environment.encodeBase64) {\n return fallback(this, filePathNode);\n }\n\n buf = useBase64 ? environment.encodeBase64(buf) : encodeURIComponent(buf);\n\n const uri = `data:${mimetype},${buf}${fragment}`;\n\n return new URL(new Quoted(`\"${uri}\"`, uri, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n }};\n};\n","import Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Expression from '../tree/expression';\nimport Quoted from '../tree/quoted';\nimport URL from '../tree/url';\n\nexport default environment => {\n return { 'svg-gradient': function(direction) {\n let stops;\n let gradientDirectionSvg;\n let gradientType = 'linear';\n let rectangleDimension = 'x=\"0\" y=\"0\" width=\"1\" height=\"1\"';\n const renderEnv = {compress: false};\n let returner;\n const directionValue = direction.toCSS(renderEnv);\n let i;\n let color;\n let position;\n let positionValue;\n let alpha;\n\n function throwArgumentDescriptor() {\n throw { type: 'Argument',\n message: 'svg-gradient expects direction, start_color [start_position], [color position,]...,' +\n ' end_color [end_position] or direction, color list' };\n }\n\n if (arguments.length == 2) {\n if (arguments[1].value.length < 2) {\n throwArgumentDescriptor();\n }\n stops = arguments[1].value;\n } else if (arguments.length < 3) {\n throwArgumentDescriptor();\n } else {\n stops = Array.prototype.slice.call(arguments, 1);\n }\n\n switch (directionValue) {\n case 'to bottom':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\"';\n break;\n case 'to right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'to bottom right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\"';\n break;\n case 'to top right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"100%\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'ellipse':\n case 'ellipse at center':\n gradientType = 'radial';\n gradientDirectionSvg = 'cx=\"50%\" cy=\"50%\" r=\"75%\"';\n rectangleDimension = 'x=\"-50\" y=\"-50\" width=\"101\" height=\"101\"';\n break;\n default:\n throw { type: 'Argument', message: 'svg-gradient direction must be \\'to bottom\\', \\'to right\\',' +\n ' \\'to bottom right\\', \\'to top right\\' or \\'ellipse at center\\'' };\n }\n returner = `<${gradientType}Gradient id=\"g\" ${gradientDirectionSvg}>`;\n\n for (i = 0; i < stops.length; i += 1) {\n if (stops[i] instanceof Expression) {\n color = stops[i].value[0];\n position = stops[i].value[1];\n } else {\n color = stops[i];\n position = undefined;\n }\n\n if (!(color instanceof Color) || (!((i === 0 || i + 1 === stops.length) && position === undefined) && !(position instanceof Dimension))) {\n throwArgumentDescriptor();\n }\n positionValue = position ? position.toCSS(renderEnv) : i === 0 ? '0%' : '100%';\n alpha = color.alpha;\n returner += ``;\n }\n returner += ``;\n\n returner = encodeURIComponent(returner);\n\n returner = `data:image/svg+xml,${returner}`;\n return new URL(new Quoted(`'${returner}'`, returner, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n }};\n};\n","import contexts from './contexts';\nimport visitor from './visitors';\nimport tree from './tree';\n\nexport default function(root, options) {\n options = options || {};\n let evaldRoot;\n let variables = options.variables;\n const evalEnv = new contexts.Eval(options);\n\n //\n // Allows setting variables with a hash, so:\n //\n // `{ color: new tree.Color('#f01') }` will become:\n //\n // new tree.Declaration('@color',\n // new tree.Value([\n // new tree.Expression([\n // new tree.Color('#f01')\n // ])\n // ])\n // )\n //\n if (typeof variables === 'object' && !Array.isArray(variables)) {\n variables = Object.keys(variables).map(function (k) {\n let value = variables[k];\n\n if (!(value instanceof tree.Value)) {\n if (!(value instanceof tree.Expression)) {\n value = new tree.Expression([value]);\n }\n value = new tree.Value([value]);\n }\n return new tree.Declaration(`@${k}`, value, false, null, 0);\n });\n evalEnv.frames = [new tree.Ruleset(null, variables)];\n }\n\n const visitors = [\n new visitor.JoinSelectorVisitor(),\n new visitor.MarkVisibleSelectorsVisitor(true),\n new visitor.ExtendVisitor(),\n new visitor.ToCSSVisitor({compress: Boolean(options.compress)})\n ];\n\n const preEvalVisitors = [];\n let v;\n let visitorIterator;\n\n /**\n * first() / get() allows visitors to be added while visiting\n * \n * @todo Add scoping for visitors just like functions for @plugin; right now they're global\n */\n if (options.pluginManager) {\n visitorIterator = options.pluginManager.visitor();\n for (var i = 0; i < 2; i++) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (v.isPreEvalVisitor) {\n if (i === 0 || preEvalVisitors.indexOf(v) === -1) {\n preEvalVisitors.push(v);\n v.run(root);\n }\n }\n else {\n if (i === 0 || visitors.indexOf(v) === -1) {\n if (v.isPreVisitor) {\n visitors.unshift(v);\n }\n else {\n visitors.push(v);\n }\n }\n }\n }\n }\n }\n\n evaldRoot = root.eval(evalEnv);\n\n for (var i = 0; i < visitors.length; i++) {\n visitors[i].run(evaldRoot);\n }\n\n // Run any remaining visitors added after eval pass\n if (options.pluginManager) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (visitors.indexOf(v) === -1 && preEvalVisitors.indexOf(v) === -1) {\n v.run(evaldRoot);\n }\n }\n }\n\n return evaldRoot;\n};\n","/**\n * Plugin Manager\n */\nclass PluginManager {\n constructor(less) {\n this.less = less;\n this.visitors = [];\n this.preProcessors = [];\n this.postProcessors = [];\n this.installedPlugins = [];\n this.fileManagers = [];\n this.iterator = -1;\n this.pluginCache = {};\n this.Loader = new less.PluginLoader(less);\n }\n\n /**\n * Adds all the plugins in the array\n * @param {Array} plugins\n */\n addPlugins(plugins) {\n if (plugins) {\n for (let i = 0; i < plugins.length; i++) {\n this.addPlugin(plugins[i]);\n }\n }\n }\n\n /**\n *\n * @param plugin\n * @param {String} filename\n */\n addPlugin(plugin, filename, functionRegistry) {\n this.installedPlugins.push(plugin);\n if (filename) {\n this.pluginCache[filename] = plugin;\n }\n if (plugin.install) {\n plugin.install(this.less, this, functionRegistry || this.less.functions.functionRegistry);\n }\n }\n\n /**\n *\n * @param filename\n */\n get(filename) {\n return this.pluginCache[filename];\n }\n\n /**\n * Adds a visitor. The visitor object has options on itself to determine\n * when it should run.\n * @param visitor\n */\n addVisitor(visitor) {\n this.visitors.push(visitor);\n }\n\n /**\n * Adds a pre processor object\n * @param {object} preProcessor\n * @param {number} priority - guidelines 1 = before import, 1000 = import, 2000 = after import\n */\n addPreProcessor(preProcessor, priority) {\n let indexToInsertAt;\n for (indexToInsertAt = 0; indexToInsertAt < this.preProcessors.length; indexToInsertAt++) {\n if (this.preProcessors[indexToInsertAt].priority >= priority) {\n break;\n }\n }\n this.preProcessors.splice(indexToInsertAt, 0, {preProcessor, priority});\n }\n\n /**\n * Adds a post processor object\n * @param {object} postProcessor\n * @param {number} priority - guidelines 1 = before compression, 1000 = compression, 2000 = after compression\n */\n addPostProcessor(postProcessor, priority) {\n let indexToInsertAt;\n for (indexToInsertAt = 0; indexToInsertAt < this.postProcessors.length; indexToInsertAt++) {\n if (this.postProcessors[indexToInsertAt].priority >= priority) {\n break;\n }\n }\n this.postProcessors.splice(indexToInsertAt, 0, {postProcessor, priority});\n }\n\n /**\n *\n * @param manager\n */\n addFileManager(manager) {\n this.fileManagers.push(manager);\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getPreProcessors() {\n const preProcessors = [];\n for (let i = 0; i < this.preProcessors.length; i++) {\n preProcessors.push(this.preProcessors[i].preProcessor);\n }\n return preProcessors;\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getPostProcessors() {\n const postProcessors = [];\n for (let i = 0; i < this.postProcessors.length; i++) {\n postProcessors.push(this.postProcessors[i].postProcessor);\n }\n return postProcessors;\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getVisitors() {\n return this.visitors;\n }\n\n visitor() {\n const self = this;\n return {\n first: function() {\n self.iterator = -1;\n return self.visitors[self.iterator];\n },\n get: function() {\n self.iterator += 1;\n return self.visitors[self.iterator];\n }\n };\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getFileManagers() {\n return this.fileManagers;\n }\n}\n\nlet pm;\n\nconst PluginManagerFactory = function(less, newFactory) {\n if (newFactory || !pm) {\n pm = new PluginManager(less);\n }\n return pm;\n};\n\n//\nexport default PluginManagerFactory;\n","/* global window, XMLHttpRequest */\n\nimport AbstractFileManager from '../less/environment/abstract-file-manager.js';\n\nlet options;\nlet logger;\nlet fileCache = {};\n\n// TODOS - move log somewhere. pathDiff and doing something similar in node. use pathDiff in the other browser file for the initial load\nconst FileManager = function() {}\nFileManager.prototype = Object.assign(new AbstractFileManager(), {\n alwaysMakePathsAbsolute() {\n return true;\n },\n\n join(basePath, laterPath) {\n if (!basePath) {\n return laterPath;\n }\n return this.extractUrlParts(laterPath, basePath).path;\n },\n\n doXHR(url, type, callback, errback) {\n const xhr = new XMLHttpRequest();\n const async = options.isFileProtocol ? options.fileAsync : true;\n\n if (typeof xhr.overrideMimeType === 'function') {\n xhr.overrideMimeType('text/css');\n }\n logger.debug(`XHR: Getting '${url}'`);\n xhr.open('GET', url, async);\n xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5');\n xhr.send(null);\n\n function handleResponse(xhr, callback, errback) {\n if (xhr.status >= 200 && xhr.status < 300) {\n callback(xhr.responseText,\n xhr.getResponseHeader('Last-Modified'));\n } else if (typeof errback === 'function') {\n errback(xhr.status, url);\n }\n }\n\n if (options.isFileProtocol && !options.fileAsync) {\n if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) {\n callback(xhr.responseText);\n } else {\n errback(xhr.status, url);\n }\n } else if (async) {\n xhr.onreadystatechange = () => {\n if (xhr.readyState == 4) {\n handleResponse(xhr, callback, errback);\n }\n };\n } else {\n handleResponse(xhr, callback, errback);\n }\n },\n\n supports() {\n return true;\n },\n\n clearFileCache() {\n fileCache = {};\n },\n\n loadFile(filename, currentDirectory, options, environment) {\n // TODO: Add prefix support like less-node?\n // What about multiple paths?\n\n if (currentDirectory && !this.isPathAbsolute(filename)) {\n filename = currentDirectory + filename;\n }\n\n filename = options.ext ? this.tryAppendExtension(filename, options.ext) : filename;\n\n options = options || {};\n\n // sheet may be set to the stylesheet for the initial load or a collection of properties including\n // some context variables for imports\n const hrefParts = this.extractUrlParts(filename, window.location.href);\n const href = hrefParts.url;\n const self = this;\n \n return new Promise((resolve, reject) => {\n if (options.useFileCache && fileCache[href]) {\n try {\n const lessText = fileCache[href];\n return resolve({ contents: lessText, filename: href, webInfo: { lastModified: new Date() }});\n } catch (e) {\n return reject({ filename: href, message: `Error loading file ${href} error was ${e.message}` });\n }\n }\n\n self.doXHR(href, options.mime, function doXHRCallback(data, lastModified) {\n // per file cache\n fileCache[href] = data;\n\n // Use remote copy (re-parse)\n resolve({ contents: data, filename: href, webInfo: { lastModified }});\n }, function doXHRError(status, url) {\n reject({ type: 'File', message: `'${url}' wasn't found (${status})`, href });\n });\n });\n }\n});\n\nexport default (opts, log) => {\n options = opts;\n logger = log;\n return FileManager;\n}\n","import Environment from './environment/environment';\nimport data from './data';\nimport tree from './tree';\nimport AbstractFileManager from './environment/abstract-file-manager';\nimport AbstractPluginLoader from './environment/abstract-plugin-loader';\nimport visitors from './visitors';\nimport Parser from './parser/parser';\nimport functions from './functions';\nimport contexts from './contexts';\nimport LessError from './less-error';\nimport transformTree from './transform-tree';\nimport * as utils from './utils';\nimport PluginManager from './plugin-manager';\nimport logger from './logger';\nimport SourceMapOutput from './source-map-output';\nimport SourceMapBuilder from './source-map-builder';\nimport ParseTree from './parse-tree';\nimport ImportManager from './import-manager';\nimport Parse from './parse';\nimport Render from './render';\n\nexport default function(environment, fileManagers) {\n let sourceMapOutput, sourceMapBuilder, parseTree, importManager;\n\n environment = new Environment(environment, fileManagers);\n sourceMapOutput = SourceMapOutput(environment);\n sourceMapBuilder = SourceMapBuilder(sourceMapOutput, environment);\n parseTree = ParseTree(sourceMapBuilder);\n importManager = ImportManager(environment);\n\n const render = Render(environment, parseTree, importManager);\n const parse = Parse(environment, parseTree, importManager);\n\n const initial = {\n version: [4, 0, 0],\n data,\n tree,\n Environment,\n AbstractFileManager,\n AbstractPluginLoader,\n environment,\n visitors,\n Parser,\n functions: functions(environment),\n contexts,\n SourceMapOutput: sourceMapOutput,\n SourceMapBuilder: sourceMapBuilder,\n ParseTree: parseTree,\n ImportManager: importManager,\n render,\n parse,\n LessError,\n transformTree,\n utils,\n PluginManager,\n logger\n };\n\n // Create a public API\n\n const ctor = function(t) {\n return function() {\n const obj = Object.create(t.prototype);\n t.apply(obj, Array.prototype.slice.call(arguments, 0));\n return obj;\n };\n };\n let t;\n const api = Object.create(initial);\n for (const n in initial.tree) {\n /* eslint guard-for-in: 0 */\n t = initial.tree[n];\n if (typeof t === 'function') {\n api[n.toLowerCase()] = ctor(t);\n }\n else {\n api[n] = Object.create(null);\n for (const o in t) {\n /* eslint guard-for-in: 0 */\n api[n][o.toLowerCase()] = ctor(t[o]);\n }\n }\n }\n\n /**\n * Some of the functions assume a `this` context of the API object,\n * which causes it to fail when wrapped for ES6 imports.\n * \n * An assumed `this` should be removed in the future.\n */\n initial.parse = initial.parse.bind(api);\n initial.render = initial.render.bind(api);\n\n return api;\n};\n","import LessError from './less-error';\nimport transformTree from './transform-tree';\nimport logger from './logger';\n\nexport default function(SourceMapBuilder) {\n class ParseTree {\n constructor(root, imports) {\n this.root = root;\n this.imports = imports;\n }\n\n toCSS(options) {\n let evaldRoot;\n const result = {};\n let sourceMapBuilder;\n try {\n evaldRoot = transformTree(this.root, options);\n } catch (e) {\n throw new LessError(e, this.imports);\n }\n\n try {\n const compress = Boolean(options.compress);\n if (compress) {\n logger.warn('The compress option has been deprecated. ' + \n 'We recommend you use a dedicated css minifier, for instance see less-plugin-clean-css.');\n }\n\n const toCSSOptions = {\n compress,\n dumpLineNumbers: options.dumpLineNumbers,\n strictUnits: Boolean(options.strictUnits),\n numPrecision: 8};\n\n if (options.sourceMap) {\n sourceMapBuilder = new SourceMapBuilder(options.sourceMap);\n result.css = sourceMapBuilder.toCSS(evaldRoot, toCSSOptions, this.imports);\n } else {\n result.css = evaldRoot.toCSS(toCSSOptions);\n }\n } catch (e) {\n throw new LessError(e, this.imports);\n }\n\n if (options.pluginManager) {\n const postProcessors = options.pluginManager.getPostProcessors();\n for (let i = 0; i < postProcessors.length; i++) {\n result.css = postProcessors[i].process(result.css, { sourceMap: sourceMapBuilder, options, imports: this.imports });\n }\n }\n if (options.sourceMap) {\n result.map = sourceMapBuilder.getExternalSourceMap();\n }\n\n result.imports = [];\n for (const file in this.imports.files) {\n if (this.imports.files.hasOwnProperty(file) && file !== this.imports.rootFilename) {\n result.imports.push(file);\n }\n }\n return result;\n }\n }\n\n return ParseTree;\n};\n","export default function (SourceMapOutput, environment) {\n class SourceMapBuilder {\n constructor(options) {\n this.options = options;\n }\n\n toCSS(rootNode, options, imports) {\n const sourceMapOutput = new SourceMapOutput(\n {\n contentsIgnoredCharsMap: imports.contentsIgnoredChars,\n rootNode,\n contentsMap: imports.contents,\n sourceMapFilename: this.options.sourceMapFilename,\n sourceMapURL: this.options.sourceMapURL,\n outputFilename: this.options.sourceMapOutputFilename,\n sourceMapBasepath: this.options.sourceMapBasepath,\n sourceMapRootpath: this.options.sourceMapRootpath,\n outputSourceFiles: this.options.outputSourceFiles,\n sourceMapGenerator: this.options.sourceMapGenerator,\n sourceMapFileInline: this.options.sourceMapFileInline, \n disableSourcemapAnnotation: this.options.disableSourcemapAnnotation\n });\n\n const css = sourceMapOutput.toCSS(options);\n this.sourceMap = sourceMapOutput.sourceMap;\n this.sourceMapURL = sourceMapOutput.sourceMapURL;\n if (this.options.sourceMapInputFilename) {\n this.sourceMapInputFilename = sourceMapOutput.normalizeFilename(this.options.sourceMapInputFilename);\n }\n if (this.options.sourceMapBasepath !== undefined && this.sourceMapURL !== undefined) {\n this.sourceMapURL = sourceMapOutput.removeBasepath(this.sourceMapURL);\n }\n return css + this.getCSSAppendage();\n }\n\n getCSSAppendage() {\n\n let sourceMapURL = this.sourceMapURL;\n if (this.options.sourceMapFileInline) {\n if (this.sourceMap === undefined) {\n return '';\n }\n sourceMapURL = `data:application/json;base64,${environment.encodeBase64(this.sourceMap)}`;\n }\n\n if (this.options.disableSourcemapAnnotation) {\n return '';\n }\n\n if (sourceMapURL) {\n return `/*# sourceMappingURL=${sourceMapURL} */`;\n }\n return '';\n }\n\n getExternalSourceMap() {\n return this.sourceMap;\n }\n\n setExternalSourceMap(sourceMap) {\n this.sourceMap = sourceMap;\n }\n\n isInline() {\n return this.options.sourceMapFileInline;\n }\n\n getSourceMapURL() {\n return this.sourceMapURL;\n }\n\n getOutputFilename() {\n return this.options.sourceMapOutputFilename;\n }\n\n getInputFilename() {\n return this.sourceMapInputFilename;\n }\n }\n\n return SourceMapBuilder;\n};\n","export default function (environment) {\n class SourceMapOutput {\n constructor(options) {\n this._css = [];\n this._rootNode = options.rootNode;\n this._contentsMap = options.contentsMap;\n this._contentsIgnoredCharsMap = options.contentsIgnoredCharsMap;\n if (options.sourceMapFilename) {\n this._sourceMapFilename = options.sourceMapFilename.replace(/\\\\/g, '/');\n }\n this._outputFilename = options.outputFilename;\n this.sourceMapURL = options.sourceMapURL;\n if (options.sourceMapBasepath) {\n this._sourceMapBasepath = options.sourceMapBasepath.replace(/\\\\/g, '/');\n }\n if (options.sourceMapRootpath) {\n this._sourceMapRootpath = options.sourceMapRootpath.replace(/\\\\/g, '/');\n if (this._sourceMapRootpath.charAt(this._sourceMapRootpath.length - 1) !== '/') {\n this._sourceMapRootpath += '/';\n }\n } else {\n this._sourceMapRootpath = '';\n }\n this._outputSourceFiles = options.outputSourceFiles;\n this._sourceMapGeneratorConstructor = environment.getSourceMapGenerator();\n\n this._lineNumber = 0;\n this._column = 0;\n }\n\n removeBasepath(path) {\n if (this._sourceMapBasepath && path.indexOf(this._sourceMapBasepath) === 0) {\n path = path.substring(this._sourceMapBasepath.length);\n if (path.charAt(0) === '\\\\' || path.charAt(0) === '/') {\n path = path.substring(1);\n }\n }\n\n return path;\n }\n\n normalizeFilename(filename) {\n filename = filename.replace(/\\\\/g, '/');\n filename = this.removeBasepath(filename);\n return (this._sourceMapRootpath || '') + filename;\n }\n\n add(chunk, fileInfo, index, mapLines) {\n\n // ignore adding empty strings\n if (!chunk) {\n return;\n }\n\n let lines, sourceLines, columns, sourceColumns, i;\n\n if (fileInfo && fileInfo.filename) {\n let inputSource = this._contentsMap[fileInfo.filename];\n\n // remove vars/banner added to the top of the file\n if (this._contentsIgnoredCharsMap[fileInfo.filename]) {\n // adjust the index\n index -= this._contentsIgnoredCharsMap[fileInfo.filename];\n if (index < 0) { index = 0; }\n // adjust the source\n inputSource = inputSource.slice(this._contentsIgnoredCharsMap[fileInfo.filename]);\n }\n\n // ignore empty content\n if (inputSource === undefined) {\n return;\n }\n\n inputSource = inputSource.substring(0, index);\n sourceLines = inputSource.split('\\n');\n sourceColumns = sourceLines[sourceLines.length - 1];\n }\n\n lines = chunk.split('\\n');\n columns = lines[lines.length - 1];\n\n if (fileInfo && fileInfo.filename) {\n if (!mapLines) {\n this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + 1, column: this._column},\n original: { line: sourceLines.length, column: sourceColumns.length},\n source: this.normalizeFilename(fileInfo.filename)});\n } else {\n for (i = 0; i < lines.length; i++) {\n this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + i + 1, column: i === 0 ? this._column : 0},\n original: { line: sourceLines.length + i, column: i === 0 ? sourceColumns.length : 0},\n source: this.normalizeFilename(fileInfo.filename)});\n }\n }\n }\n\n if (lines.length === 1) {\n this._column += columns.length;\n } else {\n this._lineNumber += lines.length - 1;\n this._column = columns.length;\n }\n\n this._css.push(chunk);\n }\n\n isEmpty() {\n return this._css.length === 0;\n }\n\n toCSS(context) {\n this._sourceMapGenerator = new this._sourceMapGeneratorConstructor({ file: this._outputFilename, sourceRoot: null });\n\n if (this._outputSourceFiles) {\n for (const filename in this._contentsMap) {\n if (this._contentsMap.hasOwnProperty(filename)) {\n let source = this._contentsMap[filename];\n if (this._contentsIgnoredCharsMap[filename]) {\n source = source.slice(this._contentsIgnoredCharsMap[filename]);\n }\n this._sourceMapGenerator.setSourceContent(this.normalizeFilename(filename), source);\n }\n }\n }\n\n this._rootNode.genCSS(context, this);\n\n if (this._css.length > 0) {\n let sourceMapURL;\n const sourceMapContent = JSON.stringify(this._sourceMapGenerator.toJSON());\n\n if (this.sourceMapURL) {\n sourceMapURL = this.sourceMapURL;\n } else if (this._sourceMapFilename) {\n sourceMapURL = this._sourceMapFilename;\n }\n this.sourceMapURL = sourceMapURL;\n\n this.sourceMap = sourceMapContent;\n }\n\n return this._css.join('');\n }\n }\n\n return SourceMapOutput;\n};\n","import contexts from './contexts';\nimport Parser from './parser/parser';\nimport LessError from './less-error';\nimport * as utils from './utils';\nimport logger from './logger';\n\nexport default function(environment) {\n // FileInfo = {\n // 'rewriteUrls' - option - whether to adjust URL's to be relative\n // 'filename' - full resolved filename of current file\n // 'rootpath' - path to append to normal URLs for this node\n // 'currentDirectory' - path to the current file, absolute\n // 'rootFilename' - filename of the base file\n // 'entryPath' - absolute path to the entry file\n // 'reference' - whether the file should not be output and only output parts that are referenced\n\n class ImportManager {\n constructor(less, context, rootFileInfo) {\n this.less = less;\n this.rootFilename = rootFileInfo.filename;\n this.paths = context.paths || []; // Search paths, when importing\n this.contents = {}; // map - filename to contents of all the files\n this.contentsIgnoredChars = {}; // map - filename to lines at the beginning of each file to ignore\n this.mime = context.mime;\n this.error = null;\n this.context = context;\n // Deprecated? Unused outside of here, could be useful.\n this.queue = []; // Files which haven't been imported yet\n this.files = {}; // Holds the imported parse trees.\n }\n\n /**\n * Add an import to be imported\n * @param path - the raw path\n * @param tryAppendExtension - whether to try appending a file extension (.less or .js if the path has no extension)\n * @param currentFileInfo - the current file info (used for instance to work out relative paths)\n * @param importOptions - import options\n * @param callback - callback for when it is imported\n */\n push(path, tryAppendExtension, currentFileInfo, importOptions, callback) {\n const importManager = this, pluginLoader = this.context.pluginManager.Loader;\n\n this.queue.push(path);\n\n const fileParsedFunc = function (e, root, fullPath) {\n importManager.queue.splice(importManager.queue.indexOf(path), 1); // Remove the path from the queue\n\n const importedEqualsRoot = fullPath === importManager.rootFilename;\n if (importOptions.optional && e) {\n callback(null, {rules:[]}, false, null);\n logger.info(`The file ${fullPath} was skipped because it was not found and the import was marked optional.`);\n }\n else {\n // Inline imports aren't cached here.\n // If we start to cache them, please make sure they won't conflict with non-inline imports of the\n // same name as they used to do before this comment and the condition below have been added.\n if (!importManager.files[fullPath] && !importOptions.inline) {\n importManager.files[fullPath] = { root, options: importOptions };\n }\n if (e && !importManager.error) { importManager.error = e; }\n callback(e, root, importedEqualsRoot, fullPath);\n }\n };\n\n const newFileInfo = {\n rewriteUrls: this.context.rewriteUrls,\n entryPath: currentFileInfo.entryPath,\n rootpath: currentFileInfo.rootpath,\n rootFilename: currentFileInfo.rootFilename\n };\n\n const fileManager = environment.getFileManager(path, currentFileInfo.currentDirectory, this.context, environment);\n\n if (!fileManager) {\n fileParsedFunc({ message: `Could not find a file-manager for ${path}` });\n return;\n }\n\n const loadFileCallback = function(loadedFile) {\n let plugin;\n const resolvedFilename = loadedFile.filename;\n const contents = loadedFile.contents.replace(/^\\uFEFF/, '');\n\n // Pass on an updated rootpath if path of imported file is relative and file\n // is in a (sub|sup) directory\n //\n // Examples:\n // - If path of imported file is 'module/nav/nav.less' and rootpath is 'less/',\n // then rootpath should become 'less/module/nav/'\n // - If path of imported file is '../mixins.less' and rootpath is 'less/',\n // then rootpath should become 'less/../'\n newFileInfo.currentDirectory = fileManager.getPath(resolvedFilename);\n if (newFileInfo.rewriteUrls) {\n newFileInfo.rootpath = fileManager.join(\n (importManager.context.rootpath || ''),\n fileManager.pathDiff(newFileInfo.currentDirectory, newFileInfo.entryPath));\n\n if (!fileManager.isPathAbsolute(newFileInfo.rootpath) && fileManager.alwaysMakePathsAbsolute()) {\n newFileInfo.rootpath = fileManager.join(newFileInfo.entryPath, newFileInfo.rootpath);\n }\n }\n newFileInfo.filename = resolvedFilename;\n\n const newEnv = new contexts.Parse(importManager.context);\n\n newEnv.processImports = false;\n importManager.contents[resolvedFilename] = contents;\n\n if (currentFileInfo.reference || importOptions.reference) {\n newFileInfo.reference = true;\n }\n\n if (importOptions.isPlugin) {\n plugin = pluginLoader.evalPlugin(contents, newEnv, importManager, importOptions.pluginArgs, newFileInfo);\n if (plugin instanceof LessError) {\n fileParsedFunc(plugin, null, resolvedFilename);\n }\n else {\n fileParsedFunc(null, plugin, resolvedFilename);\n }\n } else if (importOptions.inline) {\n fileParsedFunc(null, contents, resolvedFilename);\n } else {\n\n // import (multiple) parse trees apparently get altered and can't be cached.\n // TODO: investigate why this is\n if (importManager.files[resolvedFilename]\n && !importManager.files[resolvedFilename].options.multiple\n && !importOptions.multiple) {\n\n fileParsedFunc(null, importManager.files[resolvedFilename].root, resolvedFilename);\n }\n else {\n new Parser(newEnv, importManager, newFileInfo).parse(contents, function (e, root) {\n fileParsedFunc(e, root, resolvedFilename);\n });\n }\n }\n };\n let loadedFile;\n let promise;\n const context = utils.clone(this.context);\n\n if (tryAppendExtension) {\n context.ext = importOptions.isPlugin ? '.js' : '.less';\n }\n\n if (importOptions.isPlugin) {\n context.mime = 'application/javascript';\n\n if (context.syncImport) {\n loadedFile = pluginLoader.loadPluginSync(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n } else {\n promise = pluginLoader.loadPlugin(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n }\n }\n else {\n if (context.syncImport) {\n loadedFile = fileManager.loadFileSync(path, currentFileInfo.currentDirectory, context, environment);\n } else {\n promise = fileManager.loadFile(path, currentFileInfo.currentDirectory, context, environment,\n (err, loadedFile) => {\n if (err) {\n fileParsedFunc(err);\n } else {\n loadFileCallback(loadedFile);\n }\n });\n }\n }\n if (loadedFile) {\n if (!loadedFile.filename) {\n fileParsedFunc(loadedFile);\n } else {\n loadFileCallback(loadedFile);\n }\n } else if (promise) {\n promise.then(loadFileCallback, fileParsedFunc);\n }\n }\n }\n\n return ImportManager;\n};\n","import * as utils from './utils';\n\nexport default function(environment, ParseTree, ImportManager) {\n const render = function (input, options, callback) {\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(this.options, {});\n }\n else {\n options = utils.copyOptions(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n return new Promise(function (resolve, reject) {\n render.call(self, input, options, function(err, output) {\n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n this.parse(input, options, function(err, root, imports, options) {\n if (err) { return callback(err); }\n\n let result;\n try {\n const parseTree = new ParseTree(root, imports);\n result = parseTree.toCSS(options);\n }\n catch (err) { return callback(err); }\n\n callback(null, result);\n });\n }\n };\n\n return render;\n};\n","import contexts from './contexts';\nimport Parser from './parser/parser';\nimport PluginManager from './plugin-manager';\nimport LessError from './less-error';\nimport * as utils from './utils';\n\nexport default function(environment, ParseTree, ImportManager) {\n const parse = function (input, options, callback) {\n\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(this.options, {});\n }\n else {\n options = utils.copyOptions(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n return new Promise(function (resolve, reject) {\n parse.call(self, input, options, function(err, output) {\n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n let context;\n let rootFileInfo;\n const pluginManager = new PluginManager(this, !options.reUsePluginManager);\n\n options.pluginManager = pluginManager;\n\n context = new contexts.Parse(options);\n\n if (options.rootFileInfo) {\n rootFileInfo = options.rootFileInfo;\n } else {\n const filename = options.filename || 'input';\n const entryPath = filename.replace(/[^\\/\\\\]*$/, '');\n rootFileInfo = {\n filename,\n rewriteUrls: context.rewriteUrls,\n rootpath: context.rootpath || '',\n currentDirectory: entryPath,\n entryPath,\n rootFilename: filename\n };\n // add in a missing trailing slash\n if (rootFileInfo.rootpath && rootFileInfo.rootpath.slice(-1) !== '/') {\n rootFileInfo.rootpath += '/';\n }\n }\n\n const imports = new ImportManager(this, context, rootFileInfo);\n this.importManager = imports;\n\n // TODO: allow the plugins to be just a list of paths or names\n // Do an async plugin queue like lessc\n\n if (options.plugins) {\n options.plugins.forEach(function(plugin) {\n let evalResult, contents;\n if (plugin.fileContent) {\n contents = plugin.fileContent.replace(/^\\uFEFF/, '');\n evalResult = pluginManager.Loader.evalPlugin(contents, context, imports, plugin.options, plugin.filename);\n if (evalResult instanceof LessError) {\n return callback(evalResult);\n }\n }\n else {\n pluginManager.addPlugin(plugin);\n }\n });\n }\n\n new Parser(context, imports, rootFileInfo)\n .parse(input, function (e, root) {\n if (e) { return callback(e); }\n callback(null, root, imports, options);\n }, options);\n }\n };\n return parse;\n};\n","// TODO: Add tests for browser @plugin\n/* global window */\n\nimport AbstractPluginLoader from '../less/environment/abstract-plugin-loader.js';\n\n/**\n * Browser Plugin Loader\n */\nconst PluginLoader = function(less) {\n this.less = less;\n // Should we shim this.require for browser? Probably not?\n};\n\nPluginLoader.prototype = Object.assign(new AbstractPluginLoader(), {\n loadPlugin(filename, basePath, context, environment, fileManager) {\n return new Promise((fulfill, reject) => {\n fileManager.loadFile(filename, basePath, context, environment)\n .then(fulfill).catch(reject);\n });\n }\n});\n\nexport default PluginLoader;\n\n","import * as utils from './utils';\nimport browser from './browser';\n\nexport default (window, less, options) => {\n\n function errorHTML(e, rootHref) {\n const id = `less-error-message:${utils.extractId(rootHref || '')}`;\n const template = '
  • {content}
  • ';\n const elem = window.document.createElement('div');\n let timer;\n let content;\n const errors = [];\n const filename = e.filename || rootHref;\n const filenameNoPath = filename.match(/([^\\/]+(\\?.*)?)$/)[1];\n\n elem.id = id;\n elem.className = 'less-error-message';\n\n content = `

    ${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'}` + \n `

    in ${filenameNoPath} `;\n\n const errorline = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\{content\\}/, e.extract[i]));\n }\n };\n\n if (e.line) {\n errorline(e, 0, '');\n errorline(e, 1, 'line');\n errorline(e, 2, '');\n content += `on line ${e.line}, column ${e.column + 1}:

      ${errors.join('')}
    `;\n }\n if (e.stack && (e.extract || options.logLevel >= 4)) {\n content += `
    Stack Trace
    ${e.stack.split('\\n').slice(1).join('
    ')}`;\n }\n elem.innerHTML = content;\n\n // CSS for error messages\n browser.createCSS(window.document, [\n '.less-error-message ul, .less-error-message li {',\n 'list-style-type: none;',\n 'margin-right: 15px;',\n 'padding: 4px 0;',\n 'margin: 0;',\n '}',\n '.less-error-message label {',\n 'font-size: 12px;',\n 'margin-right: 15px;',\n 'padding: 4px 0;',\n 'color: #cc7777;',\n '}',\n '.less-error-message pre {',\n 'color: #dd6666;',\n 'padding: 4px 0;',\n 'margin: 0;',\n 'display: inline-block;',\n '}',\n '.less-error-message pre.line {',\n 'color: #ff0000;',\n '}',\n '.less-error-message h3 {',\n 'font-size: 20px;',\n 'font-weight: bold;',\n 'padding: 15px 0 5px 0;',\n 'margin: 0;',\n '}',\n '.less-error-message a {',\n 'color: #10a',\n '}',\n '.less-error-message .error {',\n 'color: red;',\n 'font-weight: bold;',\n 'padding-bottom: 2px;',\n 'border-bottom: 1px dashed red;',\n '}'\n ].join('\\n'), { title: 'error-message' });\n\n elem.style.cssText = [\n 'font-family: Arial, sans-serif',\n 'border: 1px solid #e00',\n 'background-color: #eee',\n 'border-radius: 5px',\n '-webkit-border-radius: 5px',\n '-moz-border-radius: 5px',\n 'color: #e00',\n 'padding: 15px',\n 'margin-bottom: 15px'\n ].join(';');\n\n if (options.env === 'development') {\n timer = setInterval(() => {\n const document = window.document;\n const body = document.body;\n if (body) {\n if (document.getElementById(id)) {\n body.replaceChild(elem, document.getElementById(id));\n } else {\n body.insertBefore(elem, body.firstChild);\n }\n clearInterval(timer);\n }\n }, 10);\n }\n }\n\n function removeErrorHTML(path) {\n const node = window.document.getElementById(`less-error-message:${utils.extractId(path)}`);\n if (node) {\n node.parentNode.removeChild(node);\n }\n }\n\n function removeErrorConsole(path) {\n // no action\n }\n\n function removeError(path) {\n if (!options.errorReporting || options.errorReporting === 'html') {\n removeErrorHTML(path);\n } else if (options.errorReporting === 'console') {\n removeErrorConsole(path);\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('remove', path);\n }\n }\n\n function errorConsole(e, rootHref) {\n const template = '{line} {content}';\n const filename = e.filename || rootHref;\n const errors = [];\n let content = `${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'} in ${filename}`;\n\n const errorline = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\{content\\}/, e.extract[i]));\n }\n };\n\n if (e.line) {\n errorline(e, 0, '');\n errorline(e, 1, 'line');\n errorline(e, 2, '');\n content += ` on line ${e.line}, column ${e.column + 1}:\\n${errors.join('\\n')}`;\n }\n if (e.stack && (e.extract || options.logLevel >= 4)) {\n content += `\\nStack Trace\\n${e.stack}`;\n }\n less.logger.error(content);\n }\n\n function error(e, rootHref) {\n if (!options.errorReporting || options.errorReporting === 'html') {\n errorHTML(e, rootHref);\n } else if (options.errorReporting === 'console') {\n errorConsole(e, rootHref);\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('add', e, rootHref);\n }\n }\n\n return {\n add: error,\n remove: removeError\n };\n};\n","/**\n * Kicks off less and compiles any stylesheets\n * used in the browser distributed version of less\n * to kick-start less using the browser api\n */\n/* global window, document */\n\nimport defaultOptions from '../less/default-options';\nimport addDefaultOptions from './add-default-options';\nimport root from './index';\n\nconst options = defaultOptions();\n\nif (window.less) {\n for (const key in window.less) {\n if (window.less.hasOwnProperty(key)) {\n options[key] = window.less[key];\n }\n }\n}\naddDefaultOptions(window, options);\n\noptions.plugins = options.plugins || [];\n\nif (window.LESS_PLUGINS) {\n options.plugins = options.plugins.concat(window.LESS_PLUGINS);\n}\n\nconst less = root(window, options);\nexport default less;\n\nwindow.less = less;\n\nlet css;\nlet head;\nlet style;\n\n// Always restore page visibility\nfunction resolveOrReject(data) {\n if (data.filename) {\n console.warn(data);\n }\n if (!options.async) {\n head.removeChild(style);\n }\n}\n\nif (options.onReady) {\n if (/!watch/.test(window.location.hash)) {\n less.watch();\n }\n // Simulate synchronous stylesheet loading by hiding page rendering\n if (!options.async) {\n css = 'body { display: none !important }';\n head = document.head || document.getElementsByTagName('head')[0];\n style = document.createElement('style');\n\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n\n head.appendChild(style);\n }\n less.registerStylesheetsImmediately();\n less.pageLoadFinished = less.refresh(less.env === 'development').then(resolveOrReject, resolveOrReject);\n}\n","// Export a new default each time\nexport default function() {\n return {\n /* Inline Javascript - @plugin still allowed */\n javascriptEnabled: false,\n\n /* Outputs a makefile import dependency list to stdout. */\n depends: false,\n\n /* (DEPRECATED) Compress using less built-in compression. \n * This does an okay job but does not utilise all the tricks of \n * dedicated css compression. */\n compress: false,\n\n /* Runs the less parser and just reports errors without any output. */\n lint: false,\n\n /* Sets available include paths.\n * If the file in an @import rule does not exist at that exact location, \n * less will look for it at the location(s) passed to this option. \n * You might use this for instance to specify a path to a library which \n * you want to be referenced simply and relatively in the less files. */\n paths: [],\n\n /* color output in the terminal */\n color: true,\n\n /* The strictImports controls whether the compiler will allow an @import inside of either \n * @media blocks or (a later addition) other selector blocks.\n * See: https://github.com/less/less.js/issues/656 */\n strictImports: false,\n\n /* Allow Imports from Insecure HTTPS Hosts */\n insecure: false,\n\n /* Allows you to add a path to every generated import and url in your css. \n * This does not affect less import statements that are processed, just ones \n * that are left in the output css. */\n rootpath: '',\n\n /* By default URLs are kept as-is, so if you import a file in a sub-directory \n * that references an image, exactly the same URL will be output in the css. \n * This option allows you to re-write URL's in imported files so that the \n * URL is always relative to the base imported file */\n rewriteUrls: false,\n\n /* How to process math \n * 0 always - eagerly try to solve all operations\n * 1 parens-division - require parens for division \"/\"\n * 2 parens | strict - require parens for all operations\n * 3 strict-legacy - legacy strict behavior (super-strict)\n */\n math: 1,\n\n /* Without this option, less attempts to guess at the output unit when it does maths. */\n strictUnits: false,\n\n /* Effectively the declaration is put at the top of your base Less file, \n * meaning it can be used but it also can be overridden if this variable \n * is defined in the file. */\n globalVars: null,\n\n /* As opposed to the global variable option, this puts the declaration at the\n * end of your base file, meaning it will override anything defined in your Less file. */\n modifyVars: null,\n\n /* This option allows you to specify a argument to go on to every URL. */\n urlArgs: ''\n }\n};","import {addDataAttr} from './utils';\nimport browser from './browser';\n\nexport default (window, options) => {\n\n // use options from the current script tag data attribues\n addDataAttr(options, browser.currentScript(window));\n\n if (options.isFileProtocol === undefined) {\n options.isFileProtocol = /^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(window.location.protocol);\n }\n\n // Load styles asynchronously (default: false)\n //\n // This is set to `false` by default, so that the body\n // doesn't start loading before the stylesheets are parsed.\n // Setting this to `true` can result in flickering.\n //\n options.async = options.async || false;\n options.fileAsync = options.fileAsync || false;\n\n // Interval between watch polls\n options.poll = options.poll || (options.isFileProtocol ? 1000 : 1500);\n\n options.env = options.env || (window.location.hostname == '127.0.0.1' ||\n window.location.hostname == '0.0.0.0' ||\n window.location.hostname == 'localhost' ||\n (window.location.port &&\n window.location.port.length > 0) ||\n options.isFileProtocol ? 'development'\n : 'production');\n\n const dumpLineNumbers = /!dumpLineNumbers:(comments|mediaquery|all)/.exec(window.location.hash);\n if (dumpLineNumbers) {\n options.dumpLineNumbers = dumpLineNumbers[1];\n }\n\n if (options.useFileCache === undefined) {\n options.useFileCache = true;\n }\n\n if (options.onReady === undefined) {\n options.onReady = true;\n }\n\n if (options.relativeUrls) {\n options.rewriteUrls = 'all';\n }\n};\n","//\n// index.js\n// Should expose the additional browser functions on to the less object\n//\nimport {addDataAttr} from './utils';\nimport lessRoot from '../less';\nimport browser from './browser';\nimport FM from './file-manager';\nimport PluginLoader from './plugin-loader';\nimport LogListener from './log-listener';\nimport ErrorReporting from './error-reporting';\nimport Cache from './cache';\nimport ImageSize from './image-size';\n\nexport default (window, options) => {\n const document = window.document;\n const less = lessRoot();\n\n less.options = options;\n const environment = less.environment;\n const FileManager = FM(options, less.logger);\n const fileManager = new FileManager();\n environment.addFileManager(fileManager);\n less.FileManager = FileManager;\n less.PluginLoader = PluginLoader;\n\n LogListener(less, options);\n const errors = ErrorReporting(window, less, options);\n const cache = less.cache = options.cache || Cache(window, options, less.logger);\n ImageSize(less.environment);\n\n // Setup user functions - Deprecate?\n if (options.functions) {\n less.functions.functionRegistry.addMultiple(options.functions);\n }\n\n const typePattern = /^text\\/(x-)?less$/;\n\n function clone(obj) {\n const cloned = {};\n for (const prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n cloned[prop] = obj[prop];\n }\n }\n return cloned;\n }\n\n // only really needed for phantom\n function bind(func, thisArg) {\n const curryArgs = Array.prototype.slice.call(arguments, 2);\n return function() {\n const args = curryArgs.concat(Array.prototype.slice.call(arguments, 0));\n return func.apply(thisArg, args);\n };\n }\n\n function loadStyles(modifyVars) {\n const styles = document.getElementsByTagName('style');\n let style;\n\n for (let i = 0; i < styles.length; i++) {\n style = styles[i];\n if (style.type.match(typePattern)) {\n const instanceOptions = clone(options);\n instanceOptions.modifyVars = modifyVars;\n const lessText = style.innerHTML || '';\n instanceOptions.filename = document.location.href.replace(/#.*$/, '');\n\n /* jshint loopfunc:true */\n // use closure to store current style\n less.render(lessText, instanceOptions,\n bind((style, e, result) => {\n if (e) {\n errors.add(e, 'inline');\n } else {\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = result.css;\n } else {\n style.innerHTML = result.css;\n }\n }\n }, null, style));\n }\n }\n }\n\n function loadStyleSheet(sheet, callback, reload, remaining, modifyVars) {\n\n const instanceOptions = clone(options);\n addDataAttr(instanceOptions, sheet);\n instanceOptions.mime = sheet.type;\n\n if (modifyVars) {\n instanceOptions.modifyVars = modifyVars;\n }\n\n function loadInitialFileCallback(loadedFile) {\n const data = loadedFile.contents;\n const path = loadedFile.filename;\n const webInfo = loadedFile.webInfo;\n\n const newFileInfo = {\n currentDirectory: fileManager.getPath(path),\n filename: path,\n rootFilename: path,\n rewriteUrls: instanceOptions.rewriteUrls\n };\n\n newFileInfo.entryPath = newFileInfo.currentDirectory;\n newFileInfo.rootpath = instanceOptions.rootpath || newFileInfo.currentDirectory;\n\n if (webInfo) {\n webInfo.remaining = remaining;\n\n const css = cache.getCSS(path, webInfo, instanceOptions.modifyVars);\n if (!reload && css) {\n webInfo.local = true;\n callback(null, css, data, sheet, webInfo, path);\n return;\n }\n\n }\n\n // TODO add tests around how this behaves when reloading\n errors.remove(path);\n\n instanceOptions.rootFileInfo = newFileInfo;\n less.render(data, instanceOptions, (e, result) => {\n if (e) {\n e.href = path;\n callback(e);\n } else {\n cache.setCSS(sheet.href, webInfo.lastModified, instanceOptions.modifyVars, result.css);\n callback(null, result.css, data, sheet, webInfo, path);\n }\n });\n }\n\n fileManager.loadFile(sheet.href, null, instanceOptions, environment)\n .then(loadedFile => {\n loadInitialFileCallback(loadedFile);\n }).catch(err => {\n console.log(err);\n callback(err);\n });\n\n }\n\n function loadStyleSheets(callback, reload, modifyVars) {\n for (let i = 0; i < less.sheets.length; i++) {\n loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1), modifyVars);\n }\n }\n\n function initRunningMode() {\n if (less.env === 'development') {\n less.watchTimer = setInterval(() => {\n if (less.watchMode) {\n fileManager.clearFileCache();\n loadStyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n } else if (css) {\n browser.createCSS(window.document, css, sheet);\n }\n });\n }\n }, options.poll);\n }\n }\n\n //\n // Watch mode\n //\n less.watch = function () {\n if (!less.watchMode ) {\n less.env = 'development';\n initRunningMode();\n }\n this.watchMode = true;\n return true;\n };\n\n less.unwatch = function () {clearInterval(less.watchTimer); this.watchMode = false; return false; };\n\n //\n // Synchronously get all tags with the 'rel' attribute set to\n // \"stylesheet/less\".\n //\n less.registerStylesheetsImmediately = () => {\n const links = document.getElementsByTagName('link');\n less.sheets = [];\n\n for (let i = 0; i < links.length; i++) {\n if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) &&\n (links[i].type.match(typePattern)))) {\n less.sheets.push(links[i]);\n }\n }\n };\n\n //\n // Asynchronously get all tags with the 'rel' attribute set to\n // \"stylesheet/less\", returning a Promise.\n //\n less.registerStylesheets = () => new Promise((resolve, reject) => {\n less.registerStylesheetsImmediately();\n resolve();\n });\n\n //\n // With this function, it's possible to alter variables and re-render\n // CSS without reloading less-files\n //\n less.modifyVars = record => less.refresh(true, record, false);\n\n less.refresh = (reload, modifyVars, clearFileCache) => {\n if ((reload || clearFileCache) && clearFileCache !== false) {\n fileManager.clearFileCache();\n }\n return new Promise((resolve, reject) => {\n let startTime;\n let endTime;\n let totalMilliseconds;\n let remainingSheets;\n startTime = endTime = new Date();\n\n // Set counter for remaining unprocessed sheets\n remainingSheets = less.sheets.length;\n\n if (remainingSheets === 0) {\n\n endTime = new Date();\n totalMilliseconds = endTime - startTime;\n less.logger.info('Less has finished and no sheets were loaded.');\n resolve({\n startTime,\n endTime,\n totalMilliseconds,\n sheets: less.sheets.length\n });\n\n } else {\n // Relies on less.sheets array, callback seems to be guaranteed to be called for every element of the array\n loadStyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n reject(e);\n return;\n }\n if (webInfo.local) {\n less.logger.info(`Loading ${sheet.href} from cache.`);\n } else {\n less.logger.info(`Rendered ${sheet.href} successfully.`);\n }\n browser.createCSS(window.document, css, sheet);\n less.logger.info(`CSS for ${sheet.href} generated in ${new Date() - endTime}ms`);\n\n // Count completed sheet\n remainingSheets--;\n\n // Check if the last remaining sheet was processed and then call the promise\n if (remainingSheets === 0) {\n totalMilliseconds = new Date() - startTime;\n less.logger.info(`Less has finished. CSS generated in ${totalMilliseconds}ms`);\n resolve({\n startTime,\n endTime,\n totalMilliseconds,\n sheets: less.sheets.length\n });\n }\n endTime = new Date();\n }, reload, modifyVars);\n }\n\n loadStyles(modifyVars);\n });\n };\n\n less.refreshStyles = loadStyles;\n return less;\n};\n","export default (less, options) => {\n const logLevel_debug = 4;\n const logLevel_info = 3;\n const logLevel_warn = 2;\n const logLevel_error = 1;\n\n // The amount of logging in the javascript console.\n // 3 - Debug, information and errors\n // 2 - Information and errors\n // 1 - Errors\n // 0 - None\n // Defaults to 2\n options.logLevel = typeof options.logLevel !== 'undefined' ? options.logLevel : (options.env === 'development' ? logLevel_info : logLevel_error);\n\n if (!options.loggers) {\n options.loggers = [{\n debug: function(msg) {\n if (options.logLevel >= logLevel_debug) {\n console.log(msg);\n }\n },\n info: function(msg) {\n if (options.logLevel >= logLevel_info) {\n console.log(msg);\n }\n },\n warn: function(msg) {\n if (options.logLevel >= logLevel_warn) {\n console.warn(msg);\n }\n },\n error: function(msg) {\n if (options.logLevel >= logLevel_error) {\n console.error(msg);\n }\n }\n }];\n }\n for (let i = 0; i < options.loggers.length; i++) {\n less.logger.addListener(options.loggers[i]);\n }\n};\n","// Cache system is a bit outdated and could do with work\n\nexport default (window, options, logger) => {\n let cache = null;\n if (options.env !== 'development') {\n try {\n cache = (typeof window.localStorage === 'undefined') ? null : window.localStorage;\n } catch (_) {}\n }\n return {\n setCSS: function(path, lastModified, modifyVars, styles) {\n if (cache) {\n logger.info(`saving ${path} to cache.`);\n try {\n cache.setItem(path, styles);\n cache.setItem(`${path}:timestamp`, lastModified);\n if (modifyVars) {\n cache.setItem(`${path}:vars`, JSON.stringify(modifyVars));\n }\n } catch (e) {\n // TODO - could do with adding more robust error handling\n logger.error(`failed to save \"${path}\" to local storage for caching.`);\n }\n }\n },\n getCSS: function(path, webInfo, modifyVars) {\n const css = cache && cache.getItem(path);\n const timestamp = cache && cache.getItem(`${path}:timestamp`);\n let vars = cache && cache.getItem(`${path}:vars`);\n\n modifyVars = modifyVars || {};\n vars = vars || \"{}\"; // if not set, treat as the JSON representation of an empty object\n\n if (timestamp && webInfo.lastModified &&\n (new Date(webInfo.lastModified).valueOf() ===\n new Date(timestamp).valueOf()) &&\n JSON.stringify(modifyVars) === vars) {\n // Use local copy\n return css;\n }\n }\n };\n};\n","\nimport functionRegistry from './../less/functions/function-registry';\n\nexport default () => {\n function imageSize() {\n throw {\n type: 'Runtime',\n message: 'Image size functions are not supported in browser version of less'\n };\n }\n\n const imageFunctions = {\n 'image-size': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n },\n 'image-width': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n },\n 'image-height': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n }\n };\n\n functionRegistry.addMultiple(imageFunctions);\n};\n"],"names":["extractId","href","replace","addDataAttr","options","tag","opt","dataset","hasOwnProperty","JSON","parse","_","document","styles","sheet","id","title","utils.extractId","oldStyleNode","getElementById","keepOldStyleNode","styleNode","createElement","setAttribute","media","styleSheet","appendChild","createTextNode","childNodes","length","firstChild","nodeValue","head","getElementsByTagName","nextEl","nextSibling","parentNode","insertBefore","removeChild","cssText","e","Error","window","scripts","currentScript","error","msg","this","_fireEvent","warn","info","debug","addListener","listener","_listeners","push","removeListener","i","splice","type","logFunction","externalEnvironment","fileManagers","requiredFunctions","functions","concat","propName","environmentFunc","bind","Environment","filename","currentDirectory","environment","isSync","logger","pluginManager","getFileManagers","fileManager","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","darkgrey","darkgreen","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","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","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","m","cm","mm","in","px","pt","pc","duration","s","ms","angle","rad","Math","PI","deg","grad","turn","colors","unitConversions","parent","visibilityBlocks","undefined","nodeVisible","rootNode","parsed","self","Object","defineProperty","get","fileInfo","getIndex","Node","nodes","set","node","Array","isArray","forEach","_index","_fileInfo","context","strs","genCSS","add","chunk","index","isEmpty","join","output","value","visitor","visit","op","a","b","precision","numPrecision","Number","toFixed","compare","Color","rgb","originalForm","match","map","c","parseInt","alpha","split","clamp","v","max","min","toHex","round","toString","prototype","assign","luma","r","g","pow","toCSS","doNotCompress","color","colorFunction","compress","args","fround","indexOf","toHSL","h","l","toRGB","splitcolor","operate","other","_operate","d","toHSV","toARGB","x","fromKeyword","keyword","key","toLowerCase","slice","Paren","eval","_noSpaceCombinators"," ","|","Combinator","emptyOrWhitespace","trim","spaceOrEmpty","Element","combinator","isVariable","currentFileInfo","visibilityInfo","copyVisibilityInfo","setParent","accept","clone","firstSelector","charAt","__assign","t","n","arguments","p","call","apply","ALWAYS","PARENS_DIVISION","PARENS","RewriteUrls","getLocation","inputStream","line","column","copyArray","arr","copy","obj","cloned","prop","defaults","obj1","obj2","newObj","_defaults","defaults_1","copyOptions","opts","strictMath","math","Constants.Math","relativeUrls","rewriteUrls","Constants.RewriteUrls","flattenArray","result","length_1","anonymousFunc","LessError","fileContentMap","currentFilename","message","stack","input","contents","loc","utils.getLocation","col","callLine","lines","found","func","Function","lineAdjust","callExtract","extract","create","F","constructor","stylize","str","errorTxt","substr","Selector","elements","extendList","condition","evaldCondition","getElements","mixinElements_","visitArray","createDerived","newSelector","mediaEmpty","els","parseNode","err","imports","createEmptySelectors","el","sels","olen","len","mixinElements","shift","isJustParentSelector","extend","getIsOutput","Value","Keyword","True","False","Anonymous","mapLines","rulesetLike","allowRoot","isRulesetLike","Boolean","MATH","Declaration","name","important","merge","inline","variable","lastRule","prevMath","evaldValue","mathBypass","evalName","importantScope","importantResult","pop","makeImportant","ctx","lineSeparator","dumpLineNumbers","debugInfo","asComment","asMediaQuery","lineNumber","fileName","filenameWithProtocol","test","Comment","isLineComment","getDebugInfo","isSilent","isCompressed","contexts","copyFromOriginal","original","destination","propertiesToCopy","parseCopyProperties","Parse","paths","evalCopyProperties","isPathRelative","path","isPathLocalRelative","Eval","frames","enterCalc","calcStack","inCalc","exitCalc","inParenthesis","parensStack","outOfParenthesis","mathOn","isMathOn","pathRequiresRewrite","rewritePath","rootpath","newPath","normalizePath","segment","segments","reverse","makeRegistry","base","_data","addMultiple","keys","_this","getLocalFunctions","inherit","defaultFunc","value_","error_","reset","Ruleset","selectors","rules","strictImports","_lookups","_variables","_properties","isRuleset","selCnt","selector","hasVariable","hasOnePassingSelector","j","toParseSelectors","utils.flattenArray","rule","subRule","utils.copyArray","ruleset","originalRuleset","root","firstRoot","allowImports","functionRegistry","globalFunctionRegistry","ctxFrames","unshift","ctxSelectors","evalImports","rsRules","evalFirst","mediaBlockCount","mediaBlocks","filter","resetCache","bubbleSelectors","importRules","matchArgs","matchCondition","lastSelector","_rulesets","variables","reduce","hash","vars","name_1","properties","name_2","decl","parseValue","property","lastDeclaration","toParse","transformDeclaration","nodes_1","rulesets","filtRules","prependRule","find","foundMixins","ruleNodes","tabLevel","sep","tabRuleStr","tabSetStr","charsetNodeIndex","importNodeIndex","isCharset","pathCnt","pathSubCnt","currentLastRule","isVisible","joinSelectors","joinSelector","createParenthesis","elementsToPak","originalElement","replacementParen","insideParent","createSelector","containedElement","element","addReplacementIntoPath","beginningPath","addPath","replacedElement","originalSelector","newSelectorPath","newJoinedSelector","parentEl","restOfPath","addAllReplacementsIntoPath","addPaths","mergeElementsOnToSelectors","sel","deriveSelector","deriveFrom","newPaths","replaceParentSelector","inSelector","k","currentElements","newSelectors","selectorsMultiplied","maybeSelector","hadParentSelector","nestedSelector","replaced","nestedPaths","replacedNewSelectors","concatenated","AtRule","isRooted","outputRuleset","mediaPathBackup","mediaBlocksBackup","mediaPath","ruleCnt","DetachedRuleset","callEval","Unit","numerator","denominator","backupUnit","sort","strictUnits","returnStr","is","unitString","toUpperCase","isLength","RegExp","isSingular","callback","usedUnits","group","mapUnit","groupName","atomicUnit","cancel","counter","count","Dimension","unit","parseFloat","isNaN","toColor","strValue","String","convertTo","unify","numericCompare","conversions","targetUnit","applyUnit","derivedConversions","Operation","operands","isSpaced","Expression","noSpacing","returnValue","parens","doubleParen","parensInOp","throwAwayComments","functionCaller","evalArgs","commentFilter","item","subNodes","il","jl","Call","calc","currentMathContext","funcCaller","FunctionCaller","isValid","columnNumber","Variable","evaluating","frame","fun","Property","mergeRules","less","visitors","ToCSSVisitor","_mergeRules","vArr","Attribute","Quoted","content","escaped","quote","variableRegex","propRegex","containsVariables","that","iterativeReplace","regexp","replacementFnc","evaluatedValue","URL","val","isEvald","urlArgs","Media","features","evalTop","evalNested","multiMedia","permute","fragment","rest","Import","css","pathValue","getPath","isPlugin","reference","isVariableImport","evalForImport","evalPath","doEval","blocksVisibility","addVisibilityBlock","registry","skip","importedFilename","newImport","JsEvalNode","evaluateJavaScript","expression","evalContext","javascriptEnabled","jsify","toJS","JavaScript","string","Assignment","Condition","negate","lvalue","rvalue","UnicodeDescriptor","Negative","Extend","option","object_id","next_id","parent_ids","allowBefore","allowAfter","findSelfSelectors","selectorElements","selfElements","selfSelectors","VariableCall","detachedRuleset","NamespaceValue","ruleCall","lookups","substring","Definition","params","variadic","arity","optionalParameters","required","evalParams","mixinEnv","evaldArguments","varargs","arg","isNamedFound","argIndex","argsLength","evalCall","_arguments","mixinFrames","allArgsCnt","requiredArgsCnt","MixinCall","mixins","mixin","mixinPath","argValue","f","isRecursive","isOneFound","candidate","defaultResult","noArgumentsFilter","candidates","conditionResult","calcDefGroup","namespace","expand","MixinDefinition","format","newRules","_setVisibilityToReplacement","replacement","AbstractFileManager","lastIndexOf","ext","tryAppendExtension","basePath","laterPath","url","baseUrl","urlDirectories","baseUrlDirectories","urlParts","extractUrlParts","baseUrlParts","diff","hostPart","directories","urlPartsRegex","returner","rawDirectories","rawPath","fileUrl","require","AbstractPluginLoader","pluginOptions","pluginObj","localModule","shortname","FileManager","trySetOptions","use","exports","loader","tree","validatePlugin","minVersion","compareVersion","addPlugin","plugin","setOptions","version","versionToString","aVersion","bVersion","versionString","plugins","printUsage","_visitArgs","visitDeeper","_hasIndexed","_noop","implementation","_implementation","_visitInCache","_visitOutCache","indexNodeTypes","ticker","child","typeIndex","Visitor","nodeTypeIndex","fnName","impl","funcOut","visitArgs","newNode","isReplacing","cnt","nonReplacing","out","evald","flatten","nestedCnt","nestedItem","onSequencerEmpty","variableImports","_onSequencerEmpty","_currentDepth","ImportSequencer","importSequencer","importItem","isReady","tryRun","variableImport","ImportVisitor","importer","finish","_visitor","_importer","_finish","importCount","onceFileDetectionMap","recursionDetector","_sequencer","run","isFinished","visitImport","importNode","inlineCSS","importParent","addVariableImport","processImportNode","evaldImportNode","multiple","importMultiple","tryAppendLessExtension","onImported","sequencedOnImported","addImport","importedAtRoot","fullPath","importVisitor","isOptional","optional","duplicateImport","oldContext","visitDeclaration","declNode","visitDeclarationOut","visitAtRule","atRuleNode","visitAtRuleOut","visitMixinDefinition","mixinDefinitionNode","visitMixinDefinitionOut","visitRuleset","rulesetNode","visitRulesetOut","visitMedia","mediaNode","visitMediaOut","visible","SetTreeVisibilityVisitor","ensureVisibility","ensureInvisibility","allExtendsStack","ExtendFinderVisitor","allExtends","allSelectorsExtendList","extendOnEveryPath","selectorPath","selExtendList","allSelectorsExtend","foundExtends","firstExtendOnThisSelectorPath","ProcessExtendsVisitor","extendFinder","extendIndices","doExtendChaining","newRoot","checkExtendsForNonMatched","indices","hasFoundMatches","extendsList","extendsListTarget","iterationCount","extendIndex","targetExtendIndex","matches","targetExtend","newExtend","extendsToAdd","extendVisitor","findMatch","selfSelector","extendSelector","extendChainCount","selectorOne","selectorTwo","ruleNode","selectorNode","pathIndex","selectorsToAdd","extendedSelectors","haystackSelectorPath","haystackSelectorIndex","hackstackSelector","hackstackElementIndex","haystackElement","targetCombinator","potentialMatch","needleElements","potentialMatches","matched","initialCombinator","isElementValuesEqual","finished","endPathIndex","endPathElementIndex","elementValue1","elementValue2","replacementSelector","matchIndex","firstElement","newElements","currentSelectorPathIndex","currentSelectorPathElementIndex","currentValue","derived","newAllExtends","lastIndex","JoinSelectorVisitor","_context","CSSVisitorUtils","bodyRules","owner","thing","originalRules","containsSilentNonBlockedChild","compiledRulesBody","keepOnlyVisibleChilds","removeVisibilityBlock","hasVisibleSelector","utils","mixinNode","visitExtend","extendNode","visitComment","commentNode","resolveVisibility","visitAtRuleWithBody","visitAtRuleWithoutBody","visitAnonymous","anonymousNode","nodeRules","hasFakeRuleset","getBodyRules","charset","comment","checkValidNodes","isRoot","_compileRulesetPaths","nodeRuleCnt","_removeDuplicateRules","isVisibleRuleset","ruleList","ruleCache","ruleCSS","groups","groupsArr","result_1","space_1","comma_1","MarkVisibleSelectorsVisitor","ExtendVisitor","furthest","furthestPossibleErrorMessage","chunks","current","currentPos","saveStack","parserInput","skipWhitespace","nextChar","oldi","oldj","curr","endIndex","mem","inp","charCodeAt","autoCommentAbsorb","nextNewLine","text","commentStore","nextStarSlash","save","restore","possibleErrorMessage","state","forget","isWhitespace","offset","pos","code","$re","tok","exec","$char","$str","tokLength","$quoted","startChar","currentPosition","$parseUntil","testChar","returnVal","inComment","blockDepth","blockStack","parseGroups","startPos","lastPos","loop","char","expected","peek","peekChar","currentChar","prevChar","getInput","peekNotNumeric","start","chunkInput","failFunction","fail","lastOpening","lastOpeningParen","lastMultiComment","lastMultiCommentEndBrace","chunkerCurrentIndex","currentChunkStartIndex","cc","cc2","level","parenLevel","emitFrom","emitChunk","force","fromCharCode","chunker","end","furthestReachedEnd","furthestChar","Parser","parsers","getParserInput","expect","expectChar","parseList","currentIndex","returnNodes","parser","additionalData","globalVars","modifyVars","ignored","preText","serializeVars","preProcessors","getPreProcessors","process","banner","contentsIgnoredChars","primary","endInfo","processImports","extendRule","definition","declaration","variableCall","entities","atrule","foundSemiColon","mixinLookup","quoted","forceEscaped","isEscaped","customFuncCall","stop","ieAlpha","boolean","if","prevArgs","isSemiColonSeparated","argsComma","argsSemiColon","assignment","literal","dimension","unicodeDescriptor","entity","ch","variableCurly","curly","propertyCurly","colorKeyword","ud","javascript","js","escape","parsedName","inValue","ruleLookups","isRule","getLookup","hasParens","elem","elemIndex","re","isCall","expressionContainsNamed","nameLoop","expressions","hasSep","cond","argInfo","conditions","block","lookupValue","attribute","slashedCombinator","isLess","when","blockRuleset","hasDR","ruleProperty","permissiveValue","anonymousValue","untilTokens","done","testCurrentChar","import","dir","importOptions","mediaFeatures","o","optionName","importOption","mediaFeature","pluginArgs","nonVendorSpecificName","hasIdentifier","hasExpression","hasUnknown","hasBlock","sub","addition","multiplication","operation","operand","needsParens","logical","next","conditionAnd","negatedCondition","parenthesisCondition","atomicCondition","body","me","tryConditionFollowedByParenthesis","delim","simpleProperty","If","trueValue","falseValue","colorFunctions","hsla","origColor","hsl","number","rgba","size","m1_1","m2_1","hue","hsv","hsva","vs","floor","perm","saturation","lightness","hsvhue","hsvsaturation","hsvvalue","luminance","saturate","amount","method","desaturate","lighten","darken","fadein","fadeout","fade","spin","mix","color1","color2","weight","w","w1","w2","greyscale","contrast","dark","light","threshold","argb","tint","shade","colorBlend","mode","cb","cs","ar","cr","ab","as","colorBlendModeFunctions","multiply","screen","overlay","softlight","sqrt","hardlight","difference","abs","exclusion","average","negation","getItemsFromNode","_SELF","~","_i","expr","values","range","step","from","to","stepValue","list","each","rs","iterator","tryEval","Quote","valueName","keyName","indexName","MathHelper","fn","mathFunctions","ceil","sin","cos","atan","asin","acos","mathHelper","fraction","num","minMax","isMin","currentUnified","referenceUnified","unitStatic","unitClone","order","convert","pi","mod","y","percentage","evaluated","encodeURI","pattern","flags","%","token","encodeURIComponent","isa","Type","isunit","isruleset","iscolor","isnumber","isstring","iskeyword","isurl","ispixel","ispercentage","isem","get-unit","colorBlending","fallback","functionThis","data-uri","mimetypeNode","filePathNode","mimetype","filePath","entryPath","fragmentStart","utils.clone","rawBuffer","getFileManager","useBase64","mimeLookup","charsetLookup","fileSync","loadFileSync","buf","encodeBase64","uri","dataUri","svg-gradient","direction","stops","gradientDirectionSvg","position","positionValue","gradientType","rectangleDimension","renderEnv","directionValue","throwArgumentDescriptor","types","evaldRoot","evalEnv","visitorIterator","preEvalVisitors","first","isPreEvalVisitor","isPreVisitor","pm","postProcessors","installedPlugins","pluginCache","Loader","PluginLoader","PluginManager","install","preProcessor","priority","indexToInsertAt","postProcessor","manager","PluginManagerFactory","newFactory","sourceMapOutput","sourceMapBuilder","parseTree","importManager","SourceMapBuilder","ParseTree","transformTree","toCSSOptions","sourceMap","getPostProcessors","file","getExternalSourceMap","files","rootFilename","SourceMapOutput","contentsIgnoredCharsMap","contentsMap","sourceMapFilename","sourceMapURL","outputFilename","sourceMapOutputFilename","sourceMapBasepath","sourceMapRootpath","outputSourceFiles","sourceMapGenerator","sourceMapFileInline","disableSourcemapAnnotation","sourceMapInputFilename","normalizeFilename","removeBasepath","getCSSAppendage","_css","_rootNode","_contentsMap","_contentsIgnoredCharsMap","_sourceMapFilename","_outputFilename","_sourceMapBasepath","_sourceMapRootpath","_outputSourceFiles","_sourceMapGeneratorConstructor","getSourceMapGenerator","_lineNumber","_column","sourceLines","columns","sourceColumns","inputSource","_sourceMapGenerator","addMapping","generated","source","sourceRoot","setSourceContent","sourceMapContent","stringify","toJSON","rootFileInfo","mime","queue","ImportManager","pluginLoader","fileParsedFunc","importedEqualsRoot","newFileInfo","loadedFile","promise","loadFileCallback","resolvedFilename","pathDiff","isPathAbsolute","alwaysMakePathsAbsolute","newEnv","evalPlugin","syncImport","loadPluginSync","loadPlugin","loadFile","then","render","utils.copyOptions","self_1","Promise","resolve","reject","Render","context_1","pluginManager_1","reUsePluginManager","imports_1","evalResult","fileContent","initial","data","ctor","api","fileCache","doXHR","errback","xhr","XMLHttpRequest","async","isFileProtocol","fileAsync","handleResponse","status","responseText","getResponseHeader","overrideMimeType","open","setRequestHeader","send","onreadystatechange","readyState","supports","clearFileCache","location","useFileCache","lessText","webInfo","lastModified","Date","log","fulfill","catch","rootHref","errorReporting","errors","errorline","classname","logLevel","errorConsole","timer","filenameNoPath","className","innerHTML","browser","style","env","setInterval","replaceChild","clearInterval","errorHTML","remove","removeErrorHTML","depends","lint","insecure","protocol","poll","hostname","port","onReady","addDefaultOptions","LESS_PLUGINS","lessRoot","FM","addFileManager","loggers","console","LogListener","ErrorReporting","cache","localStorage","setCSS","setItem","getCSS","getItem","timestamp","valueOf","Cache","imageSize","imageFunctions","image-size","image-width","image-height","ImageSize","typePattern","thisArg","curryArgs","loadStyles","instanceOptions","loadStyleSheet","reload","remaining","local","loadInitialFileCallback","loadStyleSheets","sheets","watch","watchMode","watchTimer","unwatch","registerStylesheetsImmediately","links","rel","registerStylesheets","record","refresh","startTime","endTime","totalMilliseconds","remainingSheets","refreshStyles","resolveOrReject","pageLoadFinished"],"mappings":"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"} \ No newline at end of file diff --git a/packages/less/src/less-browser/file-manager.js b/packages/less/src/less-browser/file-manager.js index 6a74aee99..fa8a8ea92 100644 --- a/packages/less/src/less-browser/file-manager.js +++ b/packages/less/src/less-browser/file-manager.js @@ -7,17 +7,18 @@ let logger; let fileCache = {}; // TODOS - move log somewhere. pathDiff and doing something similar in node. use pathDiff in the other browser file for the initial load -class FileManager extends AbstractFileManager { +const FileManager = function() {} +FileManager.prototype = Object.assign(new AbstractFileManager(), { alwaysMakePathsAbsolute() { return true; - } + }, join(basePath, laterPath) { if (!basePath) { return laterPath; } return this.extractUrlParts(laterPath, basePath).path; - } + }, doXHR(url, type, callback, errback) { const xhr = new XMLHttpRequest(); @@ -55,15 +56,15 @@ class FileManager extends AbstractFileManager { } else { handleResponse(xhr, callback, errback); } - } + }, supports() { return true; - } + }, clearFileCache() { fileCache = {}; - } + }, loadFile(filename, currentDirectory, options, environment) { // TODO: Add prefix support like less-node? @@ -104,7 +105,7 @@ class FileManager extends AbstractFileManager { }); }); } -} +}); export default (opts, log) => { options = opts; diff --git a/packages/less/src/less-browser/plugin-loader.js b/packages/less/src/less-browser/plugin-loader.js index 2ae1d7e75..be9a03dc2 100644 --- a/packages/less/src/less-browser/plugin-loader.js +++ b/packages/less/src/less-browser/plugin-loader.js @@ -6,21 +6,19 @@ import AbstractPluginLoader from '../less/environment/abstract-plugin-loader.js' /** * Browser Plugin Loader */ -class PluginLoader extends AbstractPluginLoader { - constructor(less) { - super(); - - this.less = less; - // Should we shim this.require for browser? Probably not? - } +const PluginLoader = function(less) { + this.less = less; + // Should we shim this.require for browser? Probably not? +}; +PluginLoader.prototype = Object.assign(new AbstractPluginLoader(), { loadPlugin(filename, basePath, context, environment, fileManager) { return new Promise((fulfill, reject) => { fileManager.loadFile(filename, basePath, context, environment) .then(fulfill).catch(reject); }); } -} +}); export default PluginLoader; diff --git a/packages/less/src/less-node/file-manager.js b/packages/less/src/less-node/file-manager.js index f816549ea..874f886b0 100644 --- a/packages/less/src/less-node/file-manager.js +++ b/packages/less/src/less-node/file-manager.js @@ -2,14 +2,15 @@ import path from 'path'; import fs from './fs'; import AbstractFileManager from '../less/environment/abstract-file-manager.js'; -class FileManager extends AbstractFileManager { +const FileManager = function() {} +FileManager.prototype = Object.assign(new AbstractFileManager(), { supports() { return true; - } + }, supportsSync() { return true; - } + }, loadFile(filename, currentDirectory, options, environment, callback) { let fullFilename; @@ -137,12 +138,12 @@ class FileManager extends AbstractFileManager { } }(0)); } - } + }, loadFileSync(filename, currentDirectory, options, environment) { options.syncImport = true; return this.loadFile(filename, currentDirectory, options, environment); } -} +}); export default FileManager; diff --git a/packages/less/src/less-node/plugin-loader.js b/packages/less/src/less-node/plugin-loader.js index e55218192..e9be545b7 100644 --- a/packages/less/src/less-node/plugin-loader.js +++ b/packages/less/src/less-node/plugin-loader.js @@ -4,25 +4,23 @@ import AbstractPluginLoader from '../less/environment/abstract-plugin-loader.js' /** * Node Plugin Loader */ -class PluginLoader extends AbstractPluginLoader { - constructor(less) { - super(); - - this.less = less; - this.require = prefix => { - prefix = path.dirname(prefix); - return id => { - const str = id.substr(0, 2); - if (str === '..' || str === './') { - return require(path.join(prefix, id)); - } - else { - return require(id); - } - }; +const PluginLoader = function(less) { + this.less = less; + this.require = prefix => { + prefix = path.dirname(prefix); + return id => { + const str = id.substr(0, 2); + if (str === '..' || str === './') { + return require(path.join(prefix, id)); + } + else { + return require(id); + } }; - } + }; +}; +PluginLoader.prototype = Object.assign(new AbstractPluginLoader(), { loadPlugin(filename, basePath, context, environment, fileManager) { const prefix = filename.slice(0, 1); const explicit = prefix === '.' || prefix === '/' || filename.slice(-3).toLowerCase() === '.js'; @@ -49,13 +47,13 @@ class PluginLoader extends AbstractPluginLoader { reject(err); }); }); - } + }, loadPluginSync(filename, basePath, context, environment, fileManager) { context.syncImport = true; return this.loadPlugin(filename, basePath, context, environment, fileManager); } -} +}); export default PluginLoader; diff --git a/packages/less/src/less-node/url-file-manager.js b/packages/less/src/less-node/url-file-manager.js index 733d78c86..728bc7afa 100644 --- a/packages/less/src/less-node/url-file-manager.js +++ b/packages/less/src/less-node/url-file-manager.js @@ -4,10 +4,11 @@ let request; import AbstractFileManager from '../less/environment/abstract-file-manager.js'; import logger from '../less/logger'; -class UrlFileManager extends AbstractFileManager { +const UrlFileManager = function() {} +UrlFileManager.prototype = Object.assign(new AbstractFileManager(), { supports(filename, currentDirectory, options, environment) { return isUrlRe.test( filename ) || isUrlRe.test(currentDirectory); - } + }, loadFile(filename, currentDirectory, options, environment) { return new Promise((fulfill, reject) => { @@ -41,6 +42,6 @@ class UrlFileManager extends AbstractFileManager { }); }); } -} +}); export default UrlFileManager; diff --git a/packages/less/src/less/tree/anonymous.js b/packages/less/src/less/tree/anonymous.js index 92bad4942..9c40a9526 100644 --- a/packages/less/src/less/tree/anonymous.js +++ b/packages/less/src/less/tree/anonymous.js @@ -1,37 +1,32 @@ import Node from './node'; -class Anonymous extends Node { - constructor(value, index, currentFileInfo, mapLines, rulesetLike, visibilityInfo) { - super(); - - this.value = value; - this._index = index; - this._fileInfo = currentFileInfo; - this.mapLines = mapLines; - this.rulesetLike = (typeof rulesetLike === 'undefined') ? false : rulesetLike; - this.allowRoot = true; - this.copyVisibilityInfo(visibilityInfo); - } +const Anonymous = function(value, index, currentFileInfo, mapLines, rulesetLike, visibilityInfo) { + this.value = value; + this._index = index; + this._fileInfo = currentFileInfo; + this.mapLines = mapLines; + this.rulesetLike = (typeof rulesetLike === 'undefined') ? false : rulesetLike; + this.allowRoot = true; + this.copyVisibilityInfo(visibilityInfo); +} +Anonymous.prototype = Object.assign(new Node(), { + type: 'Anonymous', eval() { return new Anonymous(this.value, this._index, this._fileInfo, this.mapLines, this.rulesetLike, this.visibilityInfo()); - } - + }, compare(other) { return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined; - } - + }, isRulesetLike() { return this.rulesetLike; - } - + }, genCSS(context, output) { this.nodeVisible = Boolean(this.value); if (this.nodeVisible) { output.add(this.value, this._fileInfo, this._index, this.mapLines); } } -} +}) -Anonymous.prototype.type = 'Anonymous'; export default Anonymous; diff --git a/packages/less/src/less/tree/assignment.js b/packages/less/src/less/tree/assignment.js index 0776f43a0..2f7769cb6 100644 --- a/packages/less/src/less/tree/assignment.js +++ b/packages/less/src/less/tree/assignment.js @@ -1,23 +1,23 @@ import Node from './node'; -class Assignment extends Node { - constructor(key, val) { - super(); +const Assignment = function(key, val) { + this.key = key; + this.value = val; +} - this.key = key; - this.value = val; - } +Assignment.prototype = Object.assign(new Node(), { + type: 'Assignment', accept(visitor) { this.value = visitor.visit(this.value); - } + }, eval(context) { if (this.value.eval) { return new Assignment(this.key, this.value.eval(context)); } return this; - } + }, genCSS(context, output) { output.add(`${this.key}=`); @@ -27,7 +27,6 @@ class Assignment extends Node { output.add(this.value); } } -} +}) -Assignment.prototype.type = 'Assignment'; export default Assignment; diff --git a/packages/less/src/less/tree/atrule.js b/packages/less/src/less/tree/atrule.js index 4bfb8f0b6..02d19f87f 100644 --- a/packages/less/src/less/tree/atrule.js +++ b/packages/less/src/less/tree/atrule.js @@ -3,43 +3,42 @@ import Selector from './selector'; import Ruleset from './ruleset'; import Anonymous from './anonymous'; -class AtRule extends Node { - constructor( - name, - value, - rules, - index, - currentFileInfo, - debugInfo, - isRooted, - visibilityInfo - ) { - super(); - - let i; - - this.name = name; - this.value = (value instanceof Node) ? value : (value ? new Anonymous(value) : value); - if (rules) { - if (Array.isArray(rules)) { - this.rules = rules; - } else { - this.rules = [rules]; - this.rules[0].selectors = (new Selector([], null, null, index, currentFileInfo)).createEmptySelectors(); - } - for (i = 0; i < this.rules.length; i++) { - this.rules[i].allowImports = true; - } - this.setParent(this.rules, this); +const AtRule = function( + name, + value, + rules, + index, + currentFileInfo, + debugInfo, + isRooted, + visibilityInfo +) { + let i; + + this.name = name; + this.value = (value instanceof Node) ? value : (value ? new Anonymous(value) : value); + if (rules) { + if (Array.isArray(rules)) { + this.rules = rules; + } else { + this.rules = [rules]; + this.rules[0].selectors = (new Selector([], null, null, index, currentFileInfo)).createEmptySelectors(); } - this._index = index; - this._fileInfo = currentFileInfo; - this.debugInfo = debugInfo; - this.isRooted = isRooted || false; - this.copyVisibilityInfo(visibilityInfo); - this.allowRoot = true; + for (i = 0; i < this.rules.length; i++) { + this.rules[i].allowImports = true; + } + this.setParent(this.rules, this); } + this._index = index; + this._fileInfo = currentFileInfo; + this.debugInfo = debugInfo; + this.isRooted = isRooted || false; + this.copyVisibilityInfo(visibilityInfo); + this.allowRoot = true; +} +AtRule.prototype = Object.assign(new Node(), { + type: 'AtRule', accept(visitor) { const value = this.value, rules = this.rules; if (rules) { @@ -48,15 +47,15 @@ class AtRule extends Node { if (value) { this.value = visitor.visit(value); } - } + }, isRulesetLike() { return this.rules || !this.isCharset(); - } + }, isCharset() { return '@charset' === this.name; - } + }, genCSS(context, output) { const value = this.value, rules = this.rules; @@ -70,7 +69,7 @@ class AtRule extends Node { } else { output.add(';'); } - } + }, eval(context) { let mediaPathBackup, mediaBlocksBackup, value = this.value, rules = this.rules; @@ -97,28 +96,28 @@ class AtRule extends Node { return new AtRule(this.name, value, rules, this.getIndex(), this.fileInfo(), this.debugInfo, this.isRooted, this.visibilityInfo()); - } + }, variable(name) { if (this.rules) { // assuming that there is only one rule at this point - that is how parser constructs the rule return Ruleset.prototype.variable.call(this.rules[0], name); } - } + }, find() { if (this.rules) { // assuming that there is only one rule at this point - that is how parser constructs the rule return Ruleset.prototype.find.apply(this.rules[0], arguments); } - } + }, rulesets() { if (this.rules) { // assuming that there is only one rule at this point - that is how parser constructs the rule return Ruleset.prototype.rulesets.apply(this.rules[0]); } - } + }, outputRuleset(context, output, rules) { const ruleCnt = rules.length; @@ -152,7 +151,6 @@ class AtRule extends Node { context.tabLevel--; } -} +}) -AtRule.prototype.type = 'AtRule'; export default AtRule; diff --git a/packages/less/src/less/tree/attribute.js b/packages/less/src/less/tree/attribute.js index 214803b2b..64f2cce21 100644 --- a/packages/less/src/less/tree/attribute.js +++ b/packages/less/src/less/tree/attribute.js @@ -1,22 +1,22 @@ import Node from './node'; -class Attribute extends Node { - constructor(key, op, value) { - super(); +const Attribute = function(key, op, value) { + this.key = key; + this.op = op; + this.value = value; +} - this.key = key; - this.op = op; - this.value = value; - } +Attribute.prototype = Object.assign(new Node(), { + type: 'Attribute', eval(context) { return new Attribute(this.key.eval ? this.key.eval(context) : this.key, this.op, (this.value && this.value.eval) ? this.value.eval(context) : this.value); - } + }, genCSS(context, output) { output.add(this.toCSS(context)); - } + }, toCSS(context) { let value = this.key.toCSS ? this.key.toCSS(context) : this.key; @@ -28,7 +28,6 @@ class Attribute extends Node { return `[${value}]`; } -} +}) -Attribute.prototype.type = 'Attribute'; export default Attribute; diff --git a/packages/less/src/less/tree/call.js b/packages/less/src/less/tree/call.js index e09062764..61ed0173c 100644 --- a/packages/less/src/less/tree/call.js +++ b/packages/less/src/less/tree/call.js @@ -1,27 +1,26 @@ import Node from './node'; import Anonymous from './anonymous'; import FunctionCaller from '../functions/function-caller'; -import logger from '../logger'; // // A function call node. // -class Call extends Node { - constructor(name, args, index, currentFileInfo) { - super(); +const Call = function(name, args, index, currentFileInfo) { + this.name = name; + this.args = args; + this.calc = name === 'calc'; + this._index = index; + this._fileInfo = currentFileInfo; +} - this.name = name; - this.args = args; - this.calc = name === 'calc'; - this._index = index; - this._fileInfo = currentFileInfo; - } +Call.prototype = Object.assign(new Node(), { + type: 'Call', accept(visitor) { if (this.args) { this.args = visitor.visitArray(this.args); } - } + }, // // When evaluating a function call, @@ -94,7 +93,7 @@ class Call extends Node { exitCalc(); return new Call(this.name, args, this.getIndex(), this.fileInfo()); - } + }, genCSS(context, output) { output.add(`${this.name}(`, this.fileInfo(), this.getIndex()); @@ -108,7 +107,6 @@ class Call extends Node { output.add(')'); } -} +}); -Call.prototype.type = 'Call'; export default Call; diff --git a/packages/less/src/less/tree/color.js b/packages/less/src/less/tree/color.js index e44af7079..bdfbeaaeb 100644 --- a/packages/less/src/less/tree/color.js +++ b/packages/less/src/less/tree/color.js @@ -4,43 +4,43 @@ import colors from '../data/colors'; // // RGB Colors - #ff0014, #eee // -class Color extends Node { - constructor(rgb, a, originalForm) { - super(); - - const self = this; - // - // The end goal here, is to parse the arguments - // into an integer triplet, such as `128, 255, 0` - // - // This facilitates operations and conversions. - // - if (Array.isArray(rgb)) { - this.rgb = rgb; - } else if (rgb.length >= 6) { - this.rgb = []; - rgb.match(/.{2}/g).map(function (c, i) { - if (i < 3) { - self.rgb.push(parseInt(c, 16)); - } else { - self.alpha = (parseInt(c, 16)) / 255; - } - }); - } else { - this.rgb = []; - rgb.split('').map(function (c, i) { - if (i < 3) { - self.rgb.push(parseInt(c + c, 16)); - } else { - self.alpha = (parseInt(c + c, 16)) / 255; - } - }); - } - this.alpha = this.alpha || (typeof a === 'number' ? a : 1); - if (typeof originalForm !== 'undefined') { - this.value = originalForm; - } +const Color = function(rgb, a, originalForm) { + const self = this; + // + // The end goal here, is to parse the arguments + // into an integer triplet, such as `128, 255, 0` + // + // This facilitates operations and conversions. + // + if (Array.isArray(rgb)) { + this.rgb = rgb; + } else if (rgb.length >= 6) { + this.rgb = []; + rgb.match(/.{2}/g).map(function (c, i) { + if (i < 3) { + self.rgb.push(parseInt(c, 16)); + } else { + self.alpha = (parseInt(c, 16)) / 255; + } + }); + } else { + this.rgb = []; + rgb.split('').map(function (c, i) { + if (i < 3) { + self.rgb.push(parseInt(c + c, 16)); + } else { + self.alpha = (parseInt(c + c, 16)) / 255; + } + }); } + this.alpha = this.alpha || (typeof a === 'number' ? a : 1); + if (typeof originalForm !== 'undefined') { + this.value = originalForm; + } +} + +Color.prototype = Object.assign(new Node(), { + type: 'Color', luma() { let r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255; @@ -50,11 +50,11 @@ class Color extends Node { b = (b <= 0.03928) ? b / 12.92 : Math.pow(((b + 0.055) / 1.055), 2.4); return 0.2126 * r + 0.7152 * g + 0.0722 * b; - } + }, genCSS(context, output) { output.add(this.toCSS(context)); - } + }, toCSS(context, doNotCompress) { const compress = context && context.compress && !doNotCompress; @@ -122,7 +122,7 @@ class Color extends Node { } return color; - } + }, // // Operations have to be done per-channel, if not, @@ -137,11 +137,11 @@ class Color extends Node { rgb[c] = this._operate(context, op, this.rgb[c], other.rgb[c]); } return new Color(rgb, alpha); - } + }, toRGB() { return toHex(this.rgb); - } + }, toHSL() { const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha; @@ -165,7 +165,7 @@ class Color extends Node { h /= 6; } return { h: h * 360, s, l, a }; - } + }, // Adapted from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript toHSV() { @@ -194,11 +194,11 @@ class Color extends Node { h /= 6; } return { h: h * 360, s, v, a }; - } + }, toARGB() { return toHex([this.alpha * 255].concat(this.rgb)); - } + }, compare(x) { return (x.rgb && @@ -207,25 +207,23 @@ class Color extends Node { x.rgb[2] === this.rgb[2] && x.alpha === this.alpha) ? 0 : undefined; } +}); - static fromKeyword(keyword) { - let c; - const key = keyword.toLowerCase(); - if (colors.hasOwnProperty(key)) { - c = new Color(colors[key].slice(1)); - } - else if (key === 'transparent') { - c = new Color([0, 0, 0], 0); - } - - if (c) { - c.value = keyword; - return c; - } +Color.fromKeyword = function(keyword) { + let c; + const key = keyword.toLowerCase(); + if (colors.hasOwnProperty(key)) { + c = new Color(colors[key].slice(1)); + } + else if (key === 'transparent') { + c = new Color([0, 0, 0], 0); } -} -Color.prototype.type = 'Color'; + if (c) { + c.value = keyword; + return c; + } +}; function clamp(v, max) { return Math.min(Math.max(v, 0), max); diff --git a/packages/less/src/less/tree/combinator.js b/packages/less/src/less/tree/combinator.js index 3740a3b5d..a98347699 100644 --- a/packages/less/src/less/tree/combinator.js +++ b/packages/less/src/less/tree/combinator.js @@ -5,25 +5,23 @@ const _noSpaceCombinators = { '|': true }; -class Combinator extends Node { - constructor(value) { - super(); - - if (value === ' ') { - this.value = ' '; - this.emptyOrWhitespace = true; - } else { - this.value = value ? value.trim() : ''; - this.emptyOrWhitespace = this.value === ''; - } +const Combinator = function(value) { + if (value === ' ') { + this.value = ' '; + this.emptyOrWhitespace = true; + } else { + this.value = value ? value.trim() : ''; + this.emptyOrWhitespace = this.value === ''; } +} + +Combinator.prototype = Object.assign(new Node(), { + type: 'Combinator', genCSS(context, output) { const spaceOrEmpty = (context.compress || _noSpaceCombinators[this.value]) ? '' : ' '; output.add(spaceOrEmpty + this.value + spaceOrEmpty); } -} - -Combinator.prototype.type = 'Combinator'; +}); export default Combinator; diff --git a/packages/less/src/less/tree/comment.js b/packages/less/src/less/tree/comment.js index 8ed53c97c..ce18c4e58 100644 --- a/packages/less/src/less/tree/comment.js +++ b/packages/less/src/less/tree/comment.js @@ -1,29 +1,28 @@ import Node from './node'; import getDebugInfo from './debug-info'; -class Comment extends Node { - constructor(value, isLineComment, index, currentFileInfo) { - super(); +const Comment = function(value, isLineComment, index, currentFileInfo) { + this.value = value; + this.isLineComment = isLineComment; + this._index = index; + this._fileInfo = currentFileInfo; + this.allowRoot = true; +} - this.value = value; - this.isLineComment = isLineComment; - this._index = index; - this._fileInfo = currentFileInfo; - this.allowRoot = true; - } +Comment.prototype = Object.assign(new Node(), { + type: 'Comment', genCSS(context, output) { if (this.debugInfo) { output.add(getDebugInfo(context, this), this.fileInfo(), this.getIndex()); } output.add(this.value); - } + }, isSilent(context) { const isCompressed = context.compress && this.value[2] !== '!'; return this.isLineComment || isCompressed; } -} +}); -Comment.prototype.type = 'Comment'; export default Comment; diff --git a/packages/less/src/less/tree/condition.js b/packages/less/src/less/tree/condition.js index 73d8a0464..4ae3beb43 100644 --- a/packages/less/src/less/tree/condition.js +++ b/packages/less/src/less/tree/condition.js @@ -1,20 +1,20 @@ import Node from './node'; -class Condition extends Node { - constructor(op, l, r, i, negate) { - super(); +const Condition = function(op, l, r, i, negate) { + this.op = op.trim(); + this.lvalue = l; + this.rvalue = r; + this._index = i; + this.negate = negate; +}; - this.op = op.trim(); - this.lvalue = l; - this.rvalue = r; - this._index = i; - this.negate = negate; - } +Condition.prototype = Object.assign(new Node(), { + type: 'Condition', accept(visitor) { this.lvalue = visitor.visit(this.lvalue); this.rvalue = visitor.visit(this.rvalue); - } + }, eval(context) { const result = (function (op, a, b) { @@ -37,7 +37,6 @@ class Condition extends Node { return this.negate ? !result : result; } -} +}); -Condition.prototype.type = 'Condition'; export default Condition; diff --git a/packages/less/src/less/tree/declaration.js b/packages/less/src/less/tree/declaration.js index e498ea4a7..9291f495e 100644 --- a/packages/less/src/less/tree/declaration.js +++ b/packages/less/src/less/tree/declaration.js @@ -5,22 +5,33 @@ import Anonymous from './anonymous'; import * as Constants from '../constants'; const MATH = Constants.Math; -class Declaration extends Node { - constructor(name, value, important, merge, index, currentFileInfo, inline, variable) { - super(); - - this.name = name; - this.value = (value instanceof Node) ? value : new Value([value ? new Anonymous(value) : null]); - this.important = important ? ` ${important.trim()}` : ''; - this.merge = merge; - this._index = index; - this._fileInfo = currentFileInfo; - this.inline = inline || false; - this.variable = (variable !== undefined) ? variable - : (name.charAt && (name.charAt(0) === '@')); - this.allowRoot = true; - this.setParent(this.value, this); +function evalName(context, name) { + let value = ''; + let i; + const n = name.length; + const output = {add: function (s) {value += s;}}; + for (i = 0; i < n; i++) { + name[i].eval(context).genCSS(context, output); } + return value; +} + +const Declaration = function(name, value, important, merge, index, currentFileInfo, inline, variable) { + this.name = name; + this.value = (value instanceof Node) ? value : new Value([value ? new Anonymous(value) : null]); + this.important = important ? ` ${important.trim()}` : ''; + this.merge = merge; + this._index = index; + this._fileInfo = currentFileInfo; + this.inline = inline || false; + this.variable = (variable !== undefined) ? variable + : (name.charAt && (name.charAt(0) === '@')); + this.allowRoot = true; + this.setParent(this.value, this); +}; + +Declaration.prototype = Object.assign(new Node(), { + type: 'Declaration', genCSS(context, output) { output.add(this.name + (context.compress ? ':' : ': '), this.fileInfo(), this.getIndex()); @@ -33,7 +44,7 @@ class Declaration extends Node { throw e; } output.add(this.important + ((this.inline || (context.lastRule && context.compress)) ? '' : ';'), this._fileInfo, this._index); - } + }, eval(context) { let mathBypass = false, prevMath, name = this.name, evaldValue, variable = this.variable; @@ -84,7 +95,7 @@ class Declaration extends Node { context.math = prevMath; } } - } + }, makeImportant() { return new Declaration(this.name, @@ -93,18 +104,6 @@ class Declaration extends Node { this.merge, this.getIndex(), this.fileInfo(), this.inline); } -} - -function evalName(context, name) { - let value = ''; - let i; - const n = name.length; - const output = {add: function (s) {value += s;}}; - for (i = 0; i < n; i++) { - name[i].eval(context).genCSS(context, output); - } - return value; -} +}); -Declaration.prototype.type = 'Declaration'; export default Declaration; \ No newline at end of file diff --git a/packages/less/src/less/tree/detached-ruleset.js b/packages/less/src/less/tree/detached-ruleset.js index 9448e1366..de5d91535 100644 --- a/packages/less/src/less/tree/detached-ruleset.js +++ b/packages/less/src/less/tree/detached-ruleset.js @@ -2,29 +2,28 @@ import Node from './node'; import contexts from '../contexts'; import * as utils from '../utils'; -class DetachedRuleset extends Node { - constructor(ruleset, frames) { - super(); +const DetachedRuleset = function(ruleset, frames) { + this.ruleset = ruleset; + this.frames = frames; + this.setParent(this.ruleset, this); +}; - this.ruleset = ruleset; - this.frames = frames; - this.setParent(this.ruleset, this); - } +DetachedRuleset.prototype = Object.assign(new Node(), { + type: 'DetachedRuleset', + evalFirst: true, accept(visitor) { this.ruleset = visitor.visit(this.ruleset); - } + }, eval(context) { const frames = this.frames || utils.copyArray(context.frames); return new DetachedRuleset(this.ruleset, frames); - } + }, callEval(context) { return this.ruleset.eval(this.frames ? new contexts.Eval(context, this.frames.concat(context.frames)) : context); } -} +}); -DetachedRuleset.prototype.type = 'DetachedRuleset'; -DetachedRuleset.prototype.evalFirst = true; export default DetachedRuleset; diff --git a/packages/less/src/less/tree/dimension.js b/packages/less/src/less/tree/dimension.js index d6b2a28c5..ce7a37ef5 100644 --- a/packages/less/src/less/tree/dimension.js +++ b/packages/less/src/less/tree/dimension.js @@ -6,30 +6,30 @@ import Color from './color'; // // A number with a unit // -class Dimension extends Node { - constructor(value, unit) { - super(); - - this.value = parseFloat(value); - if (isNaN(this.value)) { - throw new Error('Dimension is not a number.'); - } - this.unit = (unit && unit instanceof Unit) ? unit : - new Unit(unit ? [unit] : undefined); - this.setParent(this.unit, this); +const Dimension = function(value, unit) { + this.value = parseFloat(value); + if (isNaN(this.value)) { + throw new Error('Dimension is not a number.'); } + this.unit = (unit && unit instanceof Unit) ? unit : + new Unit(unit ? [unit] : undefined); + this.setParent(this.unit, this); +}; + +Dimension.prototype = Object.assign(new Node(), { + type: 'Dimension', accept(visitor) { this.unit = visitor.visit(this.unit); - } + }, eval(context) { return this; - } + }, toColor() { return new Color([this.value, this.value, this.value]); - } + }, genCSS(context, output) { if ((context && context.strictUnits) && !this.unit.isSingular()) { @@ -59,7 +59,7 @@ class Dimension extends Node { output.add(strValue); this.unit.genCSS(context, output); - } + }, // In an operation between two Dimensions, // we default to the first Dimension's unit, @@ -95,7 +95,7 @@ class Dimension extends Node { unit.cancel(); } return new Dimension(value, unit); - } + }, compare(other) { let a, b; @@ -116,11 +116,11 @@ class Dimension extends Node { } return Node.numericCompare(a.value, b.value); - } + }, unify() { return this.convertTo({ length: 'px', duration: 's', angle: 'rad' }); - } + }, convertTo(conversions) { let value = this.value; @@ -169,7 +169,6 @@ class Dimension extends Node { return new Dimension(value, unit); } -} +}); -Dimension.prototype.type = 'Dimension'; export default Dimension; diff --git a/packages/less/src/less/tree/element.js b/packages/less/src/less/tree/element.js index 8374fe20e..4331fbc44 100644 --- a/packages/less/src/less/tree/element.js +++ b/packages/less/src/less/tree/element.js @@ -2,26 +2,26 @@ import Node from './node'; import Paren from './paren'; import Combinator from './combinator'; -class Element extends Node { - constructor(combinator, value, isVariable, index, currentFileInfo, visibilityInfo) { - super(); +const Element = function(combinator, value, isVariable, index, currentFileInfo, visibilityInfo) { + this.combinator = combinator instanceof Combinator ? + combinator : new Combinator(combinator); - this.combinator = combinator instanceof Combinator ? - combinator : new Combinator(combinator); - - if (typeof value === 'string') { - this.value = value.trim(); - } else if (value) { - this.value = value; - } else { - this.value = ''; - } - this.isVariable = isVariable; - this._index = index; - this._fileInfo = currentFileInfo; - this.copyVisibilityInfo(visibilityInfo); - this.setParent(this.combinator, this); + if (typeof value === 'string') { + this.value = value.trim(); + } else if (value) { + this.value = value; + } else { + this.value = ''; } + this.isVariable = isVariable; + this._index = index; + this._fileInfo = currentFileInfo; + this.copyVisibilityInfo(visibilityInfo); + this.setParent(this.combinator, this); +} + +Element.prototype = Object.assign(new Node(), { + type: 'Element', accept(visitor) { const value = this.value; @@ -29,7 +29,7 @@ class Element extends Node { if (typeof value === 'object') { this.value = visitor.visit(value); } - } + }, eval(context) { return new Element(this.combinator, @@ -37,7 +37,7 @@ class Element extends Node { this.isVariable, this.getIndex(), this.fileInfo(), this.visibilityInfo()); - } + }, clone() { return new Element(this.combinator, @@ -45,11 +45,11 @@ class Element extends Node { this.isVariable, this.getIndex(), this.fileInfo(), this.visibilityInfo()); - } + }, genCSS(context, output) { output.add(this.toCSS(context), this.fileInfo(), this.getIndex()); - } + }, toCSS(context) { context = context || {}; @@ -68,7 +68,6 @@ class Element extends Node { return this.combinator.toCSS(context) + value; } } -} +}); -Element.prototype.type = 'Element'; export default Element; diff --git a/packages/less/src/less/tree/expression.js b/packages/less/src/less/tree/expression.js index 987c43252..bbbacc80f 100644 --- a/packages/less/src/less/tree/expression.js +++ b/packages/less/src/less/tree/expression.js @@ -5,20 +5,20 @@ import Dimension from './dimension'; import * as Constants from '../constants'; const MATH = Constants.Math; -class Expression extends Node { - constructor(value, noSpacing) { - super(); - - this.value = value; - this.noSpacing = noSpacing; - if (!value) { - throw new Error('Expression requires an array parameter'); - } +const Expression = function(value, noSpacing) { + this.value = value; + this.noSpacing = noSpacing; + if (!value) { + throw new Error('Expression requires an array parameter'); } +}; + +Expression.prototype = Object.assign(new Node(), { + type: 'Expression', accept(visitor) { this.value = visitor.visitArray(this.value); - } + }, eval(context) { let returnValue; @@ -52,7 +52,7 @@ class Expression extends Node { returnValue = new Paren(returnValue); } return returnValue; - } + }, genCSS(context, output) { for (let i = 0; i < this.value.length; i++) { @@ -61,14 +61,13 @@ class Expression extends Node { output.add(' '); } } - } + }, throwAwayComments() { this.value = this.value.filter(function(v) { return !(v instanceof Comment); }); } -} +}); -Expression.prototype.type = 'Expression'; export default Expression; diff --git a/packages/less/src/less/tree/extend.js b/packages/less/src/less/tree/extend.js index b3499a5ba..6e10246bf 100644 --- a/packages/less/src/less/tree/extend.js +++ b/packages/less/src/less/tree/extend.js @@ -1,43 +1,43 @@ import Node from './node'; import Selector from './selector'; -class Extend extends Node { - constructor(selector, option, index, currentFileInfo, visibilityInfo) { - super(); - - this.selector = selector; - this.option = option; - this.object_id = Extend.next_id++; - this.parent_ids = [this.object_id]; - this._index = index; - this._fileInfo = currentFileInfo; - this.copyVisibilityInfo(visibilityInfo); - this.allowRoot = true; - - switch (option) { - case 'all': - this.allowBefore = true; - this.allowAfter = true; - break; - default: - this.allowBefore = false; - this.allowAfter = false; - break; - } - this.setParent(this.selector, this); +const Extend = function(selector, option, index, currentFileInfo, visibilityInfo) { + this.selector = selector; + this.option = option; + this.object_id = Extend.next_id++; + this.parent_ids = [this.object_id]; + this._index = index; + this._fileInfo = currentFileInfo; + this.copyVisibilityInfo(visibilityInfo); + this.allowRoot = true; + + switch (option) { + case 'all': + this.allowBefore = true; + this.allowAfter = true; + break; + default: + this.allowBefore = false; + this.allowAfter = false; + break; } + this.setParent(this.selector, this); +}; + +Extend.prototype = Object.assign(new Node(), { + type: 'Extend', accept(visitor) { this.selector = visitor.visit(this.selector); - } + }, eval(context) { return new Extend(this.selector.eval(context), this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo()); - } + }, clone(context) { return new Extend(this.selector, this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo()); - } + }, // it concatenates (joins) all selectors in selector array findSelfSelectors(selectors) { @@ -56,9 +56,7 @@ class Extend extends Node { this.selfSelectors = [new Selector(selfElements)]; this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo()); } -} +}); Extend.next_id = 0; - -Extend.prototype.type = 'Extend'; export default Extend; diff --git a/packages/less/src/less/tree/import.js b/packages/less/src/less/tree/import.js index 1c32cc327..00cfc7037 100644 --- a/packages/less/src/less/tree/import.js +++ b/packages/less/src/less/tree/import.js @@ -19,29 +19,29 @@ import LessError from '../less-error'; // `import,push`, we also pass it a callback, which it'll call once // the file has been fetched, and parsed. // -class Import extends Node { - constructor(path, features, options, index, currentFileInfo, visibilityInfo) { - super(); - - this.options = options; - this._index = index; - this._fileInfo = currentFileInfo; - this.path = path; - this.features = features; - this.allowRoot = true; - - if (this.options.less !== undefined || this.options.inline) { - this.css = !this.options.less || this.options.inline; - } else { - const pathValue = this.getPath(); - if (pathValue && /[#\.\&\?]css([\?;].*)?$/.test(pathValue)) { - this.css = true; - } +const Import = function(path, features, options, index, currentFileInfo, visibilityInfo) { + this.options = options; + this._index = index; + this._fileInfo = currentFileInfo; + this.path = path; + this.features = features; + this.allowRoot = true; + + if (this.options.less !== undefined || this.options.inline) { + this.css = !this.options.less || this.options.inline; + } else { + const pathValue = this.getPath(); + if (pathValue && /[#\.\&\?]css([\?;].*)?$/.test(pathValue)) { + this.css = true; } - this.copyVisibilityInfo(visibilityInfo); - this.setParent(this.features, this); - this.setParent(this.path, this); } + this.copyVisibilityInfo(visibilityInfo); + this.setParent(this.features, this); + this.setParent(this.path, this); +}; + +Import.prototype = Object.assign(new Node(), { + type: 'Import', accept(visitor) { if (this.features) { @@ -51,7 +51,7 @@ class Import extends Node { if (!this.options.isPlugin && !this.options.inline && this.root) { this.root = visitor.visit(this.root); } - } + }, genCSS(context, output) { if (this.css && this.path._fileInfo.reference === undefined) { @@ -63,12 +63,12 @@ class Import extends Node { } output.add(';'); } - } + }, getPath() { return (this.path instanceof URL) ? this.path.value.value : this.path.value; - } + }, isVariableImport() { let path = this.path; @@ -80,7 +80,7 @@ class Import extends Node { } return true; - } + }, evalForImport(context) { let path = this.path; @@ -90,7 +90,7 @@ class Import extends Node { } return new Import(path.eval(context), this.features, this.options, this._index, this._fileInfo, this.visibilityInfo()); - } + }, evalPath(context) { const path = this.path.eval(context); @@ -109,7 +109,7 @@ class Import extends Node { } return path; - } + }, eval(context) { const result = this.doEval(context); @@ -124,7 +124,7 @@ class Import extends Node { } } return result; - } + }, doEval(context) { let ruleset; @@ -180,7 +180,6 @@ class Import extends Node { return []; } } -} +}); -Import.prototype.type = 'Import'; export default Import; diff --git a/packages/less/src/less/tree/javascript.js b/packages/less/src/less/tree/javascript.js index f4e373328..ebdeeed88 100644 --- a/packages/less/src/less/tree/javascript.js +++ b/packages/less/src/less/tree/javascript.js @@ -3,15 +3,15 @@ import Dimension from './dimension'; import Quoted from './quoted'; import Anonymous from './anonymous'; -class JavaScript extends JsEvalNode { - constructor(string, escaped, index, currentFileInfo) { - super(); +const JavaScript = function(string, escaped, index, currentFileInfo) { + this.escaped = escaped; + this.expression = string; + this._index = index; + this._fileInfo = currentFileInfo; +} - this.escaped = escaped; - this.expression = string; - this._index = index; - this._fileInfo = currentFileInfo; - } +JavaScript.prototype = Object.assign(new JsEvalNode(), { + type: 'JavaScript', eval(context) { const result = this.evaluateJavaScript(this.expression, context); @@ -27,7 +27,6 @@ class JavaScript extends JsEvalNode { return new Anonymous(result); } } -} +}); -JavaScript.prototype.type = 'JavaScript'; export default JavaScript; diff --git a/packages/less/src/less/tree/js-eval-node.js b/packages/less/src/less/tree/js-eval-node.js index 94680a8da..8874f5f18 100644 --- a/packages/less/src/less/tree/js-eval-node.js +++ b/packages/less/src/less/tree/js-eval-node.js @@ -1,7 +1,9 @@ import Node from './node'; import Variable from './variable'; -class JsEvalNode extends Node { +const JsEvalNode = function() {}; + +JsEvalNode.prototype = Object.assign(new Node(), { evaluateJavaScript(expression, context) { let result; const that = this; @@ -46,7 +48,7 @@ class JsEvalNode extends Node { index: this.getIndex() }; } return result; - } + }, jsify(obj) { if (Array.isArray(obj.value) && (obj.value.length > 1)) { @@ -55,6 +57,6 @@ class JsEvalNode extends Node { return obj.toCSS(); } } -} +}); export default JsEvalNode; diff --git a/packages/less/src/less/tree/keyword.js b/packages/less/src/less/tree/keyword.js index 20199f587..d3b3704e8 100644 --- a/packages/less/src/less/tree/keyword.js +++ b/packages/less/src/less/tree/keyword.js @@ -1,19 +1,17 @@ import Node from './node'; -class Keyword extends Node { - constructor(value) { - super(); +const Keyword = function(value) { + this.value = value; +}; - this.value = value; - } +Keyword.prototype = Object.assign(new Node(), { + type: 'Keyword', genCSS(context, output) { if (this.value === '%') { throw { type: 'Syntax', message: 'Invalid % without number' }; } output.add(this.value); } -} - -Keyword.prototype.type = 'Keyword'; +}); Keyword.True = new Keyword('true'); Keyword.False = new Keyword('false'); diff --git a/packages/less/src/less/tree/media.js b/packages/less/src/less/tree/media.js index 684537208..fd5c4f7c7 100644 --- a/packages/less/src/less/tree/media.js +++ b/packages/less/src/less/tree/media.js @@ -6,28 +6,28 @@ import Expression from './expression'; import AtRule from './atrule'; import * as utils from '../utils'; -class Media extends AtRule { - constructor(value, features, index, currentFileInfo, visibilityInfo) { - super(); +const Media = function(value, features, index, currentFileInfo, visibilityInfo) { + this._index = index; + this._fileInfo = currentFileInfo; - this._index = index; - this._fileInfo = currentFileInfo; + const selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors(); - const selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors(); + this.features = new Value(features); + this.rules = [new Ruleset(selectors, value)]; + this.rules[0].allowImports = true; + this.copyVisibilityInfo(visibilityInfo); + this.allowRoot = true; + this.setParent(selectors, this); + this.setParent(this.features, this); + this.setParent(this.rules, this); +}; - this.features = new Value(features); - this.rules = [new Ruleset(selectors, value)]; - this.rules[0].allowImports = true; - this.copyVisibilityInfo(visibilityInfo); - this.allowRoot = true; - this.setParent(selectors, this); - this.setParent(this.features, this); - this.setParent(this.rules, this); - } +Media.prototype = Object.assign(new AtRule(), { + type: 'Media', isRulesetLike() { return true; - } + }, accept(visitor) { if (this.features) { @@ -36,13 +36,13 @@ class Media extends AtRule { if (this.rules) { this.rules = visitor.visitArray(this.rules); } - } + }, genCSS(context, output) { output.add('@media ', this._fileInfo, this._index); this.features.genCSS(context, output); this.outputRuleset(context, output, this.rules); - } + }, eval(context) { if (!context.mediaBlocks) { @@ -70,7 +70,7 @@ class Media extends AtRule { return context.mediaPath.length === 0 ? media.evalTop(context) : media.evalNested(context); - } + }, evalTop(context) { let result = this; @@ -88,7 +88,7 @@ class Media extends AtRule { delete context.mediaPath; return result; - } + }, evalNested(context) { let i; @@ -122,7 +122,7 @@ class Media extends AtRule { // Fake a tree-node that doesn't output anything. return new Ruleset([], []); - } + }, permute(arr) { if (arr.length === 0) { @@ -139,7 +139,7 @@ class Media extends AtRule { } return result; } - } + }, bubbleSelectors(selectors) { if (!selectors) { @@ -148,7 +148,6 @@ class Media extends AtRule { this.rules = [new Ruleset(utils.copyArray(selectors), [this.rules[0]])]; this.setParent(this.rules, this); } -} +}); -Media.prototype.type = 'Media'; export default Media; diff --git a/packages/less/src/less/tree/mixin-call.js b/packages/less/src/less/tree/mixin-call.js index 63b86308c..78cbf790e 100644 --- a/packages/less/src/less/tree/mixin-call.js +++ b/packages/less/src/less/tree/mixin-call.js @@ -3,18 +3,18 @@ import Selector from './selector'; import MixinDefinition from './mixin-definition'; import defaultFunc from '../functions/default'; -class MixinCall extends Node { - constructor(elements, args, index, currentFileInfo, important) { - super(); - - this.selector = new Selector(elements); - this.arguments = args || []; - this._index = index; - this._fileInfo = currentFileInfo; - this.important = important; - this.allowRoot = true; - this.setParent(this.selector, this); - } +const MixinCall = function(elements, args, index, currentFileInfo, important) { + this.selector = new Selector(elements); + this.arguments = args || []; + this._index = index; + this._fileInfo = currentFileInfo; + this.important = important; + this.allowRoot = true; + this.setParent(this.selector, this); +}; + +MixinCall.prototype = Object.assign(new Node(), { + type: 'MixinCall', accept(visitor) { if (this.selector) { @@ -23,7 +23,7 @@ class MixinCall extends Node { if (this.arguments.length) { this.arguments = visitor.visitArray(this.arguments); } - } + }, eval(context) { let mixins; @@ -180,7 +180,7 @@ class MixinCall extends Node { message: `${this.selector.toCSS().trim()} is undefined`, index: this.getIndex(), filename: this.fileInfo().filename }; } - } + }, _setVisibilityToReplacement(replacement) { let i, rule; @@ -190,7 +190,7 @@ class MixinCall extends Node { rule.addVisibilityBlock(); } } - } + }, format(args) { return `${this.selector.toCSS().trim()}(${args ? args.map(function (a) { @@ -206,7 +206,6 @@ class MixinCall extends Node { return argValue; }).join(', ') : ''})`; } -} +}); -MixinCall.prototype.type = 'MixinCall'; export default MixinCall; diff --git a/packages/less/src/less/tree/mixin-definition.js b/packages/less/src/less/tree/mixin-definition.js index a10da6efe..eb22c44b0 100644 --- a/packages/less/src/less/tree/mixin-definition.js +++ b/packages/less/src/less/tree/mixin-definition.js @@ -7,33 +7,34 @@ import Expression from './expression'; import contexts from '../contexts'; import * as utils from '../utils'; -class Definition extends Ruleset { - constructor(name, params, rules, condition, variadic, frames, visibilityInfo) { - super(); - - this.name = name || 'anonymous mixin'; - this.selectors = [new Selector([new Element(null, name, false, this._index, this._fileInfo)])]; - this.params = params; - this.condition = condition; - this.variadic = variadic; - this.arity = params.length; - this.rules = rules; - this._lookups = {}; - const optionalParameters = []; - this.required = params.reduce(function (count, p) { - if (!p.name || (p.name && !p.value)) { - return count + 1; - } - else { - optionalParameters.push(p.name); - return count; - } - }, 0); - this.optionalParameters = optionalParameters; - this.frames = frames; - this.copyVisibilityInfo(visibilityInfo); - this.allowRoot = true; - } +const Definition = function(name, params, rules, condition, variadic, frames, visibilityInfo) { + this.name = name || 'anonymous mixin'; + this.selectors = [new Selector([new Element(null, name, false, this._index, this._fileInfo)])]; + this.params = params; + this.condition = condition; + this.variadic = variadic; + this.arity = params.length; + this.rules = rules; + this._lookups = {}; + const optionalParameters = []; + this.required = params.reduce(function (count, p) { + if (!p.name || (p.name && !p.value)) { + return count + 1; + } + else { + optionalParameters.push(p.name); + return count; + } + }, 0); + this.optionalParameters = optionalParameters; + this.frames = frames; + this.copyVisibilityInfo(visibilityInfo); + this.allowRoot = true; +} + +Definition.prototype = Object.assign(new Ruleset(), { + type: 'MixinDefinition', + evalFirst: true, accept(visitor) { if (this.params && this.params.length) { @@ -43,7 +44,7 @@ class Definition extends Ruleset { if (this.condition) { this.condition = visitor.visit(this.condition); } - } + }, evalParams(context, mixinEnv, args, evaldArguments) { /* jshint boss:true */ @@ -135,7 +136,7 @@ class Definition extends Ruleset { } return frame; - } + }, makeImportant() { const rules = !this.rules ? this.rules : this.rules.map(function (r) { @@ -147,11 +148,11 @@ class Definition extends Ruleset { }); const result = new Definition(this.name, this.params, rules, this.condition, this.variadic, this.frames); return result; - } + }, eval(context) { return new Definition(this.name, this.params, this.rules, this.condition, this.variadic, this.frames || utils.copyArray(context.frames)); - } + }, evalCall(context, args, important) { const _arguments = []; @@ -171,7 +172,7 @@ class Definition extends Ruleset { ruleset = ruleset.makeImportant(); } return ruleset; - } + }, matchCondition(args, context) { if (this.condition && !this.condition.eval( @@ -183,7 +184,7 @@ class Definition extends Ruleset { return false; } return true; - } + }, matchArgs(args, context) { const allArgsCnt = (args && args.length) || 0; @@ -222,8 +223,6 @@ class Definition extends Ruleset { } return true; } -} +}); -Definition.prototype.type = 'MixinDefinition'; -Definition.prototype.evalFirst = true; export default Definition; diff --git a/packages/less/src/less/tree/namespace-value.js b/packages/less/src/less/tree/namespace-value.js index 7cec6f190..adbd9ea36 100644 --- a/packages/less/src/less/tree/namespace-value.js +++ b/packages/less/src/less/tree/namespace-value.js @@ -3,15 +3,15 @@ import Variable from './variable'; import Ruleset from './ruleset'; import Selector from './selector'; -class NamespaceValue extends Node { - constructor(ruleCall, lookups, index, fileInfo) { - super(); +const NamespaceValue = function(ruleCall, lookups, index, fileInfo) { + this.value = ruleCall; + this.lookups = lookups; + this._index = index; + this._fileInfo = fileInfo; +}; - this.value = ruleCall; - this.lookups = lookups; - this._index = index; - this._fileInfo = fileInfo; - } +NamespaceValue.prototype = Object.assign(new Node(), { + type: 'NamespaceValue', eval(context) { let i, j, name, rules = this.value.eval(context); @@ -77,7 +77,6 @@ class NamespaceValue extends Node { } return rules; } -} +}); -NamespaceValue.prototype.type = 'NamespaceValue'; export default NamespaceValue; diff --git a/packages/less/src/less/tree/negative.js b/packages/less/src/less/tree/negative.js index 2e24c0e48..7e1bcf1b2 100644 --- a/packages/less/src/less/tree/negative.js +++ b/packages/less/src/less/tree/negative.js @@ -2,17 +2,17 @@ import Node from './node'; import Operation from './operation'; import Dimension from './dimension'; -class Negative extends Node { - constructor(node) { - super(); +const Negative = function(node) { + this.value = node; +}; - this.value = node; - } +Negative.prototype = Object.assign(new Node(), { + type: 'Negative', genCSS(context, output) { output.add('-'); this.value.genCSS(context, output); - } + }, eval(context) { if (context.isMathOn()) { @@ -20,7 +20,6 @@ class Negative extends Node { } return new Negative(this.value.eval(context)); } -} +}); -Negative.prototype.type = 'Negative'; export default Negative; diff --git a/packages/less/src/less/tree/operation.js b/packages/less/src/less/tree/operation.js index 12ce813c8..225da1ac0 100644 --- a/packages/less/src/less/tree/operation.js +++ b/packages/less/src/less/tree/operation.js @@ -5,18 +5,18 @@ import * as Constants from '../constants'; const MATH = Constants.Math; -class Operation extends Node { - constructor(op, operands, isSpaced) { - super(); +const Operation = function(op, operands, isSpaced) { + this.op = op.trim(); + this.operands = operands; + this.isSpaced = isSpaced; +}; - this.op = op.trim(); - this.operands = operands; - this.isSpaced = isSpaced; - } +Operation.prototype = Object.assign(new Node(), { + type: 'Operation', accept(visitor) { this.operands = visitor.visitArray(this.operands); - } + }, eval(context) { let a = this.operands[0].eval(context), b = this.operands[1].eval(context), op; @@ -41,7 +41,7 @@ class Operation extends Node { } else { return new Operation(this.op, [a, b], this.isSpaced); } - } + }, genCSS(context, output) { this.operands[0].genCSS(context, output); @@ -54,7 +54,6 @@ class Operation extends Node { } this.operands[1].genCSS(context, output); } -} +}); -Operation.prototype.type = 'Operation'; export default Operation; diff --git a/packages/less/src/less/tree/paren.js b/packages/less/src/less/tree/paren.js index 9fd712477..6e0d889a9 100644 --- a/packages/less/src/less/tree/paren.js +++ b/packages/less/src/less/tree/paren.js @@ -1,22 +1,21 @@ import Node from './node'; -class Paren extends Node { - constructor(node) { - super(); +const Paren = function(node) { + this.value = node; +}; - this.value = node; - } +Paren.prototype = Object.assign(new Node(), { + type: 'Paren', genCSS(context, output) { output.add('('); this.value.genCSS(context, output); output.add(')'); - } + }, eval(context) { return new Paren(this.value.eval(context)); } -} +}); -Paren.prototype.type = 'Paren'; export default Paren; diff --git a/packages/less/src/less/tree/property.js b/packages/less/src/less/tree/property.js index 34bea7245..d3b34fce7 100644 --- a/packages/less/src/less/tree/property.js +++ b/packages/less/src/less/tree/property.js @@ -1,14 +1,14 @@ import Node from './node'; import Declaration from './declaration'; -class Property extends Node { - constructor(name, index, currentFileInfo) { - super(); +const Property = function(name, index, currentFileInfo) { + this.name = name; + this._index = index; + this._fileInfo = currentFileInfo; +}; - this.name = name; - this._index = index; - this._fileInfo = currentFileInfo; - } +Property.prototype = Object.assign(new Node(), { + type: 'Property', eval(context) { let property; @@ -62,7 +62,7 @@ class Property extends Node { filename: this.currentFileInfo.filename, index: this.index }; } - } + }, find(obj, fun) { for (let i = 0, r; i < obj.length; i++) { @@ -71,7 +71,6 @@ class Property extends Node { } return null; } -} +}); -Property.prototype.type = 'Property'; export default Property; diff --git a/packages/less/src/less/tree/quoted.js b/packages/less/src/less/tree/quoted.js index b0df18b84..d73c40ca6 100644 --- a/packages/less/src/less/tree/quoted.js +++ b/packages/less/src/less/tree/quoted.js @@ -3,19 +3,19 @@ import Variable from './variable'; import Property from './property'; -class Quoted extends Node { - constructor(str, content, escaped, index, currentFileInfo) { - super(); +const Quoted = function(str, content, escaped, index, currentFileInfo) { + this.escaped = (escaped == null) ? true : escaped; + this.value = content || ''; + this.quote = str.charAt(0); + this._index = index; + this._fileInfo = currentFileInfo; + this.variableRegex = /@\{([\w-]+)\}/g; + this.propRegex = /\$\{([\w-]+)\}/g; + this.allowRoot = escaped; +}; - this.escaped = (escaped == null) ? true : escaped; - this.value = content || ''; - this.quote = str.charAt(0); - this._index = index; - this._fileInfo = currentFileInfo; - this.variableRegex = /@\{([\w-]+)\}/g; - this.propRegex = /\$\{([\w-]+)\}/g; - this.allowRoot = escaped; - } +Quoted.prototype = Object.assign(new Node(), { + type: 'Quoted', genCSS(context, output) { if (!this.escaped) { @@ -25,11 +25,11 @@ class Quoted extends Node { if (!this.escaped) { output.add(this.quote); } - } + }, containsVariables() { return this.value.match(this.variableRegex); - } + }, eval(context) { const that = this; @@ -53,7 +53,7 @@ class Quoted extends Node { value = iterativeReplace(value, this.variableRegex, variableReplacement); value = iterativeReplace(value, this.propRegex, propertyReplacement); return new Quoted(this.quote + value + this.quote, value, this.escaped, this.getIndex(), this.fileInfo()); - } + }, compare(other) { // when comparing quoted strings allow the quote to differ @@ -63,7 +63,6 @@ class Quoted extends Node { return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined; } } -} +}); -Quoted.prototype.type = 'Quoted'; export default Quoted; diff --git a/packages/less/src/less/tree/ruleset.js b/packages/less/src/less/tree/ruleset.js index 25a95f74e..3688ebffe 100644 --- a/packages/less/src/less/tree/ruleset.js +++ b/packages/less/src/less/tree/ruleset.js @@ -12,25 +12,25 @@ import defaultFunc from '../functions/default'; import getDebugInfo from './debug-info'; import * as utils from '../utils'; -class Ruleset extends Node { - constructor(selectors, rules, strictImports, visibilityInfo) { - super(); - - this.selectors = selectors; - this.rules = rules; - this._lookups = {}; - this._variables = null; - this._properties = null; - this.strictImports = strictImports; - this.copyVisibilityInfo(visibilityInfo); - this.allowRoot = true; - - this.setParent(this.selectors, this); - this.setParent(this.rules, this); +const Ruleset = function(selectors, rules, strictImports, visibilityInfo) { + this.selectors = selectors; + this.rules = rules; + this._lookups = {}; + this._variables = null; + this._properties = null; + this.strictImports = strictImports; + this.copyVisibilityInfo(visibilityInfo); + this.allowRoot = true; + + this.setParent(this.selectors, this); + this.setParent(this.rules, this); +} - } +Ruleset.prototype = Object.assign(new Node(), { + type: 'Ruleset', + isRuleset: true, - isRulesetLike() { return true; } + isRulesetLike() { return true; }, accept(visitor) { if (this.paths) { @@ -41,7 +41,7 @@ class Ruleset extends Node { if (this.rules && this.rules.length) { this.rules = visitor.visitArray(this.rules); } - } + }, eval(context) { const that = this; @@ -223,7 +223,7 @@ class Ruleset extends Node { } return ruleset; - } + }, evalImports(context) { const rules = this.rules; @@ -243,7 +243,7 @@ class Ruleset extends Node { this.resetCache(); } } - } + }, makeImportant() { const result = new Ruleset(this.selectors, this.rules.map(function (r) { @@ -255,11 +255,11 @@ class Ruleset extends Node { }), this.strictImports, this.visibilityInfo()); return result; - } + }, matchArgs(args) { return !args || args.length === 0; - } + }, // lets you call a css selector with a guard matchCondition(args, context) { @@ -274,14 +274,14 @@ class Ruleset extends Node { return false; } return true; - } + }, resetCache() { this._rulesets = null; this._variables = null; this._properties = null; this._lookups = {}; - } + }, variables() { if (!this._variables) { @@ -304,7 +304,7 @@ class Ruleset extends Node { }, {}); } return this._variables; - } + }, properties() { if (!this._properties) { @@ -324,21 +324,21 @@ class Ruleset extends Node { }, {}); } return this._properties; - } + }, variable(name) { const decl = this.variables()[name]; if (decl) { return this.parseValue(decl); } - } + }, property(name) { const decl = this.properties()[name]; if (decl) { return this.parseValue(decl); } - } + }, lastDeclaration() { for (let i = this.rules.length; i > 0; i--) { @@ -347,7 +347,7 @@ class Ruleset extends Node { return this.parseValue(decl); } } - } + }, parseValue(toParse) { const self = this; @@ -389,7 +389,7 @@ class Ruleset extends Node { }); return nodes; } - } + }, rulesets() { if (!this.rules) { return []; } @@ -406,7 +406,7 @@ class Ruleset extends Node { } return filtRules; - } + }, prependRule(rule) { const rules = this.rules; @@ -416,7 +416,7 @@ class Ruleset extends Node { this.rules = [ rule ]; } this.setParent(rule, this); - } + }, find(selector, self, filter) { self = self || this; @@ -450,7 +450,7 @@ class Ruleset extends Node { }); this._lookups[key] = rules; return rules; - } + }, genCSS(context, output) { let i; @@ -563,13 +563,13 @@ class Ruleset extends Node { if (!output.isEmpty() && !context.compress && this.firstRoot) { output.add('\n'); } - } + }, joinSelectors(paths, context, selectors) { for (let s = 0; s < selectors.length; s++) { this.joinSelector(paths, context, selectors[s]); } - } + }, joinSelector(paths, context, selector) { @@ -844,8 +844,6 @@ class Ruleset extends Node { } } -} +}); -Ruleset.prototype.type = 'Ruleset'; -Ruleset.prototype.isRuleset = true; export default Ruleset; diff --git a/packages/less/src/less/tree/selector.js b/packages/less/src/less/tree/selector.js index 03be0eec2..a198a7740 100644 --- a/packages/less/src/less/tree/selector.js +++ b/packages/less/src/less/tree/selector.js @@ -2,20 +2,20 @@ import Node from './node'; import Element from './element'; import LessError from '../less-error'; -class Selector extends Node { - constructor(elements, extendList, condition, index, currentFileInfo, visibilityInfo) { - super(); - - this.extendList = extendList; - this.condition = condition; - this.evaldCondition = !condition; - this._index = index; - this._fileInfo = currentFileInfo; - this.elements = this.getElements(elements); - this.mixinElements_ = undefined; - this.copyVisibilityInfo(visibilityInfo); - this.setParent(this.elements, this); - } +const Selector = function(elements, extendList, condition, index, currentFileInfo, visibilityInfo) { + this.extendList = extendList; + this.condition = condition; + this.evaldCondition = !condition; + this._index = index; + this._fileInfo = currentFileInfo; + this.elements = this.getElements(elements); + this.mixinElements_ = undefined; + this.copyVisibilityInfo(visibilityInfo); + this.setParent(this.elements, this); +}; + +Selector.prototype = Object.assign(new Node(), { + type: 'Selector', accept(visitor) { if (this.elements) { @@ -27,7 +27,7 @@ class Selector extends Node { if (this.condition) { this.condition = visitor.visit(this.condition); } - } + }, createDerived(elements, extendList, evaldCondition) { elements = this.getElements(elements); @@ -36,7 +36,7 @@ class Selector extends Node { newSelector.evaldCondition = (evaldCondition != null) ? evaldCondition : this.evaldCondition; newSelector.mediaEmpty = this.mediaEmpty; return newSelector; - } + }, getElements(els) { if (!els) { @@ -59,13 +59,13 @@ class Selector extends Node { }); } return els; - } + }, createEmptySelectors() { const el = new Element('', '&', false, this._index, this._fileInfo), sels = [new Selector([el], null, null, this._index, this._fileInfo)]; sels[0].mediaEmpty = true; return sels; - } + }, match(other) { const elements = this.elements; @@ -86,7 +86,7 @@ class Selector extends Node { } return olen; // return number of matched elements - } + }, mixinElements() { if (this.mixinElements_) { @@ -106,14 +106,14 @@ class Selector extends Node { } return (this.mixinElements_ = elements); - } + }, isJustParentSelector() { return !this.mediaEmpty && this.elements.length === 1 && this.elements[0].value === '&' && (this.elements[0].combinator.value === ' ' || this.elements[0].combinator.value === ''); - } + }, eval(context) { const evaldCondition = this.condition && this.condition.eval(context); @@ -124,7 +124,7 @@ class Selector extends Node { extendList = extendList && extendList.map(function(extend) { return extend.eval(context); }); return this.createDerived(elements, extendList, evaldCondition); - } + }, genCSS(context, output) { let i, element; @@ -135,12 +135,11 @@ class Selector extends Node { element = this.elements[i]; element.genCSS(context, output); } - } + }, getIsOutput() { return this.evaldCondition; } -} +}); -Selector.prototype.type = 'Selector'; export default Selector; diff --git a/packages/less/src/less/tree/unicode-descriptor.js b/packages/less/src/less/tree/unicode-descriptor.js index 662dae574..78a695065 100644 --- a/packages/less/src/less/tree/unicode-descriptor.js +++ b/packages/less/src/less/tree/unicode-descriptor.js @@ -1,13 +1,11 @@ import Node from './node'; -class UnicodeDescriptor extends Node { - constructor(value) { - super(); - - this.value = value; - } +const UnicodeDescriptor = function(value) { + this.value = value; } -UnicodeDescriptor.prototype.type = 'UnicodeDescriptor'; +UnicodeDescriptor.prototype = Object.assign(new Node(), { + type: 'UnicodeDescriptor' +}) export default UnicodeDescriptor; diff --git a/packages/less/src/less/tree/unit.js b/packages/less/src/less/tree/unit.js index aae8d0e8b..3943ad2c6 100644 --- a/packages/less/src/less/tree/unit.js +++ b/packages/less/src/less/tree/unit.js @@ -2,22 +2,22 @@ import Node from './node'; import unitConversions from '../data/unit-conversions'; import * as utils from '../utils'; -class Unit extends Node { - constructor(numerator, denominator, backupUnit) { - super(); - - this.numerator = numerator ? utils.copyArray(numerator).sort() : []; - this.denominator = denominator ? utils.copyArray(denominator).sort() : []; - if (backupUnit) { - this.backupUnit = backupUnit; - } else if (numerator && numerator.length) { - this.backupUnit = numerator[0]; - } +const Unit = function(numerator, denominator, backupUnit) { + this.numerator = numerator ? utils.copyArray(numerator).sort() : []; + this.denominator = denominator ? utils.copyArray(denominator).sort() : []; + if (backupUnit) { + this.backupUnit = backupUnit; + } else if (numerator && numerator.length) { + this.backupUnit = numerator[0]; } +}; + +Unit.prototype = Object.assign(new Node(), { + type: 'Unit', clone() { return new Unit(utils.copyArray(this.numerator), utils.copyArray(this.denominator), this.backupUnit); - } + }, genCSS(context, output) { // Dimension checks the unit is singular and throws an error if in strict math mode. @@ -29,7 +29,7 @@ class Unit extends Node { } else if (!strictUnits && this.denominator.length) { output.add(this.denominator[0]); } - } + }, toString() { let i, returnStr = this.numerator.join('*'); @@ -37,27 +37,27 @@ class Unit extends Node { returnStr += `/${this.denominator[i]}`; } return returnStr; - } + }, compare(other) { return this.is(other.toString()) ? 0 : undefined; - } + }, is(unitString) { return this.toString().toUpperCase() === unitString.toUpperCase(); - } + }, isLength() { return RegExp('^(px|em|ex|ch|rem|in|cm|mm|pc|pt|ex|vw|vh|vmin|vmax)$', 'gi').test(this.toCSS()); - } + }, isEmpty() { return this.numerator.length === 0 && this.denominator.length === 0; - } + }, isSingular() { return this.numerator.length <= 1 && this.denominator.length === 0; - } + }, map(callback) { let i; @@ -69,7 +69,7 @@ class Unit extends Node { for (i = 0; i < this.denominator.length; i++) { this.denominator[i] = callback(this.denominator[i], true); } - } + }, usedUnits() { let group; @@ -95,7 +95,7 @@ class Unit extends Node { } return result; - } + }, cancel() { const counter = {}; @@ -134,7 +134,6 @@ class Unit extends Node { this.numerator.sort(); this.denominator.sort(); } -} +}); -Unit.prototype.type = 'Unit'; export default Unit; diff --git a/packages/less/src/less/tree/url.js b/packages/less/src/less/tree/url.js index ccdf7f333..f0f329cab 100644 --- a/packages/less/src/less/tree/url.js +++ b/packages/less/src/less/tree/url.js @@ -1,24 +1,28 @@ import Node from './node'; -class URL extends Node { - constructor(val, index, currentFileInfo, isEvald) { - super(); +function escapePath(path) { + return path.replace(/[\(\)'"\s]/g, function(match) { return `\\${match}`; }); +} - this.value = val; - this._index = index; - this._fileInfo = currentFileInfo; - this.isEvald = isEvald; - } +const URL = function(val, index, currentFileInfo, isEvald) { + this.value = val; + this._index = index; + this._fileInfo = currentFileInfo; + this.isEvald = isEvald; +}; + +URL.prototype = Object.assign(new Node(), { + type: 'Url', accept(visitor) { this.value = visitor.visit(this.value); - } + }, genCSS(context, output) { output.add('url('); this.value.genCSS(context, output); output.add(')'); - } + }, eval(context) { const val = this.value.eval(context); @@ -54,12 +58,6 @@ class URL extends Node { return new URL(val, this.getIndex(), this.fileInfo(), true); } -} - -URL.prototype.type = 'Url'; - -function escapePath(path) { - return path.replace(/[\(\)'"\s]/g, function(match) { return `\\${match}`; }); -} +}); export default URL; diff --git a/packages/less/src/less/tree/value.js b/packages/less/src/less/tree/value.js index f98d62f88..b1eb57a89 100644 --- a/packages/less/src/less/tree/value.js +++ b/packages/less/src/less/tree/value.js @@ -1,25 +1,25 @@ import Node from './node'; -class Value extends Node { - constructor(value) { - super(); - - if (!value) { - throw new Error('Value requires an array argument'); - } - if (!Array.isArray(value)) { - this.value = [ value ]; - } - else { - this.value = value; - } +const Value = function(value) { + if (!value) { + throw new Error('Value requires an array argument'); + } + if (!Array.isArray(value)) { + this.value = [ value ]; } + else { + this.value = value; + } +}; + +Value.prototype = Object.assign(new Node(), { + type: 'Value', accept(visitor) { if (this.value) { this.value = visitor.visitArray(this.value); } - } + }, eval(context) { if (this.value.length === 1) { @@ -29,7 +29,7 @@ class Value extends Node { return v.eval(context); })); } - } + }, genCSS(context, output) { let i; @@ -40,7 +40,6 @@ class Value extends Node { } } } -} +}); -Value.prototype.type = 'Value'; export default Value; diff --git a/packages/less/src/less/tree/variable-call.js b/packages/less/src/less/tree/variable-call.js index c246d7d13..9d1e8b941 100644 --- a/packages/less/src/less/tree/variable-call.js +++ b/packages/less/src/less/tree/variable-call.js @@ -4,15 +4,15 @@ import Ruleset from './ruleset'; import DetachedRuleset from './detached-ruleset'; import LessError from '../less-error'; -class VariableCall extends Node { - constructor(variable, index, currentFileInfo) { - super(); +const VariableCall = function(variable, index, currentFileInfo) { + this.variable = variable; + this._index = index; + this._fileInfo = currentFileInfo; + this.allowRoot = true; +}; - this.variable = variable; - this._index = index; - this._fileInfo = currentFileInfo; - this.allowRoot = true; - } +VariableCall.prototype = Object.assign(new Node(), { + type: 'VariableCall', eval(context) { let rules; @@ -40,7 +40,6 @@ class VariableCall extends Node { } throw error; } -} +}); -VariableCall.prototype.type = 'VariableCall'; export default VariableCall; diff --git a/packages/less/src/less/tree/variable.js b/packages/less/src/less/tree/variable.js index 3b07e646a..a81e3ecef 100644 --- a/packages/less/src/less/tree/variable.js +++ b/packages/less/src/less/tree/variable.js @@ -1,14 +1,14 @@ import Node from './node'; import Call from './call'; -class Variable extends Node { - constructor(name, index, currentFileInfo) { - super(); +const Variable = function(name, index, currentFileInfo) { + this.name = name; + this._index = index; + this._fileInfo = currentFileInfo; +}; - this.name = name; - this._index = index; - this._fileInfo = currentFileInfo; - } +Variable.prototype = Object.assign(new Node(), { + type: 'Variable', eval(context) { let variable, name = this.name; @@ -51,7 +51,7 @@ class Variable extends Node { filename: this.fileInfo().filename, index: this.getIndex() }; } - } + }, find(obj, fun) { for (let i = 0, r; i < obj.length; i++) { @@ -60,7 +60,6 @@ class Variable extends Node { } return null; } -} +}); -Variable.prototype.type = 'Variable'; export default Variable; diff --git a/packages/less/tsconfig.json b/packages/less/tsconfig.json index 2c571b1aa..a0a698c78 100644 --- a/packages/less/tsconfig.json +++ b/packages/less/tsconfig.json @@ -6,6 +6,7 @@ "sourceMap": true, "inlineSources": true, "esModuleInterop": true, + "importHelpers": true, "target": "ES5" }, "include": ["src/**/*"], From 7573dafb75773da886e4b18008769a9d761d0bc0 Mon Sep 17 00:00:00 2001 From: Matthew Dean Date: Sun, 6 Dec 2020 08:22:39 -0800 Subject: [PATCH 15/19] Remove unworking browser benchmark --- packages/less/Gruntfile.js | 12 +- packages/less/benchmark/benchmark.css | 5323 --------------------- packages/less/benchmark/benchmark.less | 12 +- packages/less/benchmark/browseroptions.js | 4 - packages/less/benchmark/browserspec.js | 3 - 5 files changed, 7 insertions(+), 5347 deletions(-) delete mode 100644 packages/less/benchmark/benchmark.css delete mode 100644 packages/less/benchmark/browseroptions.js delete mode 100644 packages/less/benchmark/browserspec.js diff --git a/packages/less/Gruntfile.js b/packages/less/Gruntfile.js index bf967b102..7e2817367 100644 --- a/packages/less/Gruntfile.js +++ b/packages/less/Gruntfile.js @@ -243,9 +243,6 @@ module.exports = function(grunt) { benchmark: { command: "node benchmark/index.js" }, - benchmarkbrowser: { - command: "node test/browser/generator/runner.js benchmark" - }, opts: { // test running with all current options (using `opts` since `options` means something already) command: [ @@ -416,15 +413,8 @@ module.exports = function(grunt) { ]); // Run benchmark - grunt.registerTask("benchmark-node", [ + grunt.registerTask("benchmark", [ "shell:testcjs", "shell:benchmark" ]); - - // Run all browser tests - grunt.registerTask("benchmark", [ - "browsertest-lessjs", - "connect", - "shell:benchmarkbrowser" - ]); }; diff --git a/packages/less/benchmark/benchmark.css b/packages/less/benchmark/benchmark.css deleted file mode 100644 index aca398b03..000000000 --- a/packages/less/benchmark/benchmark.css +++ /dev/null @@ -1,5323 +0,0 @@ -@charset "utf-8"; -div.browse { - margin: 0 0 20px; -} -div.browse.class { - padding: 0; -} -div.browse div.header { - padding: 10px 10px 9px; - text-align: left; - background: #f01 url('/images/panel_header_bg.png') repeat-x top left; - border-bottom: 1px solid #a8000b; - line-height: 1; - height: 18px; - color: #eee; -} -div.browse div.header h3 { - font-size: 16px; - margin: 0; - color: #fff; -} -div.browse div.header span.filter { - float: left; - display: block; - overflow: hidden; - position: relative; - z-index: 5; -} -div.browse div.header span.filter a { - margin: 0 1px 0 0; - display: block; - float: left; - padding: 0 8px; - height: 18px; - font-weight: bold; - font-size: 10px; - line-height: 18px; - text-transform: uppercase; - background: url('/images/transparent_backgrounds/black_50.png'); - color: #eee; - text-decoration: none; - position: relative; - z-index: 3; -} -div.browse div.header span.filter a .active { - background: #fff; - color: #000; - z-index: 4; -} -div.browse div.header span.filter a .active :hover { - color: #000; -} -div.browse div.header span.filter a :hover { - color: #fff; -} -div.browse div.header span.filter a :last-child { - margin-right: 0; -} -div.browse div.header span.filter.dropdown { - margin: 0; - position: relative; - overflow: visible; -} -div.browse div.header span.filter.dropdown a { - background: #fff; - color: #000; - margin: 0; - position: relative; - padding-right: 25px; -} -div.browse div.header span.filter.dropdown a img { - float: left; - margin: 4px 5px 0 0; -} -div.browse div.header span.filter.dropdown a b.arrow { - float: right; - display: block; - height: 0; - width: 0; - border: 5px solid transparent; - border-top: 5px solid #000; - border-bottom: none; - position: absolute; - top: 6px; - right: 10px; -} -div.browse div.header span.filter.dropdown a :hover { - background: #000; - color: #fff; -} -div.browse div.header span.filter.dropdown a :hover b.arrow { - border-top: 5px solid #fff; -} -div.browse div.header span.filter.dropdown ul { - position: absolute; - top: 100%; - left: 0; - margin: 1px 0 0; - padding: 0; - background: #fff; -} -div.browse div.header span.filter.dropdown ul li { - list-style: none; - display: block; - padding: 0; - margin: 0; -} -div.browse div.header span.filter.dropdown ul li a { - display: block; - height: 18px; - line-height: 18px; - color: #000; - font-size: 10px; - text-transform: uppercase; - background: transparent; - border-bottom: 1px solid #f1f1f1; - float: none; - margin: 0; - white-space: nowrap; -} -div.browse div.header span.filter.dropdown ul li a :hover { - background: url('/images/transparent_backgrounds/accent_colour_25.png'); - color: #000; -} -div.browse div.header span.filter.dropdown ul li :last-child a { - border: none; -} -div.browse div.header span.filter.dropdown.sort { - float: left; - margin: 0 0 0 10px; -} -div.browse div.header span.filter.dropdown.localisation { - float: left; - margin: 0 0 0 10px; -} -div.browse div.header a.more { - float: right; - color: #fff; - font-size: 14px; - font-weight: bold; - position: relative; - top: 2px; -} -div.browse div.header a.more :hover { - text-decoration: none; -} -div.browse > ul { - margin: 0; - background: #fff; - padding: 10px 0 0 10px; - position: relative; -} -div.browse > ul li { - display: block; - float: left; - list-style: none; - margin: 0 10px 10px 0; - padding: 5px; - position: relative; - background: #fff; - width: 130px; - border: 1px solid #f7f7f7; -} -div.browse > ul li a.remove { - position: absolute; - height: 16px; - width: 16px; - padding: 3px; - background: #000; - display: none; - z-index: 3; - top: -8px; - right: -8px; -} -div.browse > ul li a.remove img { - vertical-align: middle; -} -div.browse > ul li div.thumbnail { - position: relative; - z-index: 3; -} -div.browse > ul li div.thumbnail .marker { - position: absolute; - padding: 2px; - z-index: 3; - background: url('/images/transparent_backgrounds/white_75.png'); - height: 12px; - width: 12px; -} -div.browse > ul li div.thumbnail .marker.coupon { - height: auto; - width: auto; - top: 10px; - right: -3px; - padding: 0; - background: transparent; - overflow: hidden; - position: absolute; -} -div.browse > ul li div.thumbnail .marker.coupon b { - display: block; - height: 0; - width: 0; - border: 14px solid transparent; - border-top: 14px solid #000; - border-bottom: none; - border-right: none; - float: left; -} -div.browse > ul li div.thumbnail .marker.coupon span { - color: #fff; - font-size: 10px; - font-weight: bold; - text-transform: uppercase; - height: 14px; - line-height: 14px; - display: block; - padding: 0 4px 0 2px; - background: #000; - margin: 0 0 0 14px; -} -div.browse > ul li div.thumbnail .marker.video { - position: absolute; - left: 50%; - top: 50%; - background: #fff; - width: 10px; - height: 10px; -} -div.browse > ul li div.thumbnail .marker.video b { - display: block; - width: 0; - height: 0; - border: 5px solid transparent; - border-left: 10px solid #000; - border-right: none; -} -div.browse > ul li div.thumbnail .marker.endorsed_by_me { - background: none; - padding: 0; - right: 0; - bottom: -32px; - background: #fff; -} -div.browse > ul li div.thumbnail a.thumbnail { - display: block; - overflow: hidden; - position: relative; - text-align: center; -} -div.browse > ul li div.thumbnail a.thumbnail img { - position: relative; - display: block; - margin: auto; -} -div.browse > ul li div.text { - margin: 3px 0 0; - display: block; -} -div.browse > ul li div.text a { - text-decoration: none; -} -div.browse > ul li div.text a.title { - display: block; - text-decoration: none; - font-weight: bold; - font-size: 12px; - line-height: 16px; - white-space: nowrap; - height: 16px; - overflow: hidden; -} -div.browse > ul li div.text a.title :before { - display: block; - height: 32px; - width: 20px; - content: " "; - float: right; - right: -15px; - top: -8px; - background: #fff; - position: relative; - z-index: 1; -} -div.browse > ul li div.text small { - font-size: 11px; - line-height: 13px; - color: #eee; - display: block; - height: 13px; - overflow: hidden; - white-space: nowrap; -} -div.browse > ul li div.text small a { - font-weight: bold; -} -div.browse > ul li div.text small :before { - display: block; - height: 32px; - width: 20px; - content: " "; - float: right; - right: -15px; - top: -8px; - background: #fff; - position: relative; - z-index: 1; -} -div.browse > ul li :hover { - background: #000; -} -div.browse > ul li :hover a.remove { - display: block; -} -div.browse > ul li :hover div.thumbnail a.marker.remove b, -div.browse > ul li :hover div.thumbnail a.marker.video b { - display: inline-block; -} -div.browse > ul li :hover div.text a { - color: #fff; -} -div.browse > ul li :hover div.text a.title:before { - background: #000; -} -div.browse > ul li :hover div.text small { - color: #bfbfbf; -} -div.browse > ul li :hover div.text small :before { - background: #000; -} -div.browse > ul li :hover div.footer a { - color: #fff; -} -div.browse > ul > li.ad div.thumbnail a.thumbnail { - width: 130px; - height: 97px; -} -div.browse > ul > li.ad div.thumbnail a.thumbnail img { - width: 100%; - height: 100%; -} -div.browse > ul > li.brand div.thumbnail a.thumbnail { - width: 120px; - height: 87px; - padding: 5px; - background: #fff; -} -div.browse > ul > li.brand div.thumbnail a.thumbnail img { - max-width: 120px; - max-height: 87px; -} -div.browse > ul li.paginate { - margin-bottom: 0; -} -div.browse > ul li.paginate a { - display: block; - position: relative; - text-decoration: none; - height: 131px; -} -div.browse > ul li.paginate a div.arrow { - background: #81c153 url('/images/button_bg.png') repeat-x left top; - border: 1px solid #000000; - height: 44px; - width: 44px; - margin: 0 auto; - position: relative; - top: 32px; -} -div.browse > ul li.paginate a div.arrow b { - text-indent: -9000px; - display: block; - border: 10px solid transparent; - width: 0; - height: 0; - position: relative; - top: 12px; -} -div.browse > ul li.paginate a div.label { - position: absolute; - bottom: 5px; - left: 0; - right: 0; - line-height: 13px; - color: #000000; - text-decoration: none; - font-weight: bold; - font-size: 12px; - text-align: center; -} -div.browse > ul li.paginate a :hover div.arrow { - background: #abd56e url('/images/button_bg.png') repeat-x left -44px; -} -div.browse > ul li.paginate :hover { - background: transparent; -} -div.browse > ul li.paginate.previous a div b { - border-right: 15px solid #fff; - border-left: none; - left: 12px; -} -div.browse > ul li.paginate.next a div b { - border-left: 15px solid #fff; - border-right: none; - left: 16px; -} -div.browse > div.footer { - padding: 9px 10px 10px; - background: #f2f2f2; - overflow: hidden; - border-top: 1px solid #eee; -} -div.browse > div.footer div.info { - float: left; - color: #eee; -} -div.browse > div.footer div.info strong { - color: #000; - font-weight: normal; -} -div.browse > div.footer div.pagination { - float: right; -} -div.browse > div.footer div.pagination > * { - display: inline-block; - line-height: 1; - padding: 0 6px; - line-height: 18px; - height: 18px; - background: #fff; - text-decoration: none; - font-weight: bold; - font-size: 10px; - text-transform: uppercase; -} -div.browse > div.footer div.pagination a { - color: #eee; -} -div.browse > div.footer div.pagination a:hover { - color: #000; -} -div.browse > div.footer div.pagination span.disabled { - color: #eee; -} -div.browse > div.footer div.pagination span.current { - color: #fff; - background: #f01; - border: none; -} -div.browse > div.footer div.pagination span.current:hover { - color: #fff; -} -div.browse.with_categories { - margin: 0 0 0 160px; -} -/* Browse List */ -div.browse.list > ul { - margin: 0; - min-height: 320px; - padding: 10px 0 0 10px; - overflow: hidden; -} -div.browse.list > ul > li { - display: block; - list-style: none; - margin: 0 10px 10px 0; - padding: 5px; - position: relative; - line-height: normal; -} -div.browse.list > ul > li .marker { - position: absolute; - padding: 2px; - background: url('/images/transparent_backgrounds/white_75.png'); -} -div.browse.list > ul > li .marker img { - height: 12px; - width: 12px; -} -div.browse.list > ul > li img.marker { - height: 12px; - width: 12px; -} -div.browse.list > ul > li span.marker.new { - color: black; - left: -5px; - top: -5px; - background: none; - background-color: #8f2e2e; - line-height: 1; - padding: 2px 5px; - font-weight: bold; -} -div.browse.list > ul > li a.marker.media_type { - display: inline-block; - text-decoration: none; - top: 39px; - left: 8px; - font-size: 10px; -} -div.browse.list > ul > li a.marker.media_type b { - font-weight: normal; - margin: 0 0 0 2px; - line-height: 1; - display: none; -} -div.browse.list > ul > li a.marker.media_type img { - vertical-align: middle; -} -div.browse.list > ul > li a.thumbnail { - float: left; - width: 68px; - display: block; - overflow: hidden; - border: 1px solid #eee; -} -div.browse.list > ul > li a.thumbnail :hover { - border-color: #000; -} -div.browse.list > ul > li span.title_brand { - display: block; - margin: 0 0 2px 75px; -} -div.browse.list > ul > li span.title_brand a { - margin: 0; - display: inline; -} -div.browse.list > ul > li span.title_brand a.brand_name { - font-weight: normal; - font-size: 12px; -} -div.browse.list > ul > li a.ad_title { - font-weight: bold; - font-size: 14px; - margin: 0 0 0 75px; - display: block; -} -div.browse.list > ul > li a.brand_name { - font-weight: bold; - font-size: 14px; - margin: 0 0 0 75px; - display: block; -} -div.browse.list > ul > li small { - display: block; - color: #eee; - margin: 0 0 0 75px; - font-size: 12px; -} -div.browse.list > ul > li small.brand_name { - display: inline; - margin: 0; -} -div.browse.list > ul > li ul.chart { - margin: 0 0 0 80px; - height: 39px; -} -div.browse.list > ul > li ul.networks { - margin: 3px 0 0 75px; - padding: 0; - overflow: hidden; -} -div.browse.list > ul > li ul.networks li { - display: block; - float: left; - margin: 0 5px 0 0; - line-height: 1; -} -div.browse.list > ul > li div.points { - display: none; - font-size: 12px; - text-align: right; -} -div.browse.list > ul > li div.points label { - color: #eee; -} -div.browse.list > ul > li a.remove { - bottom: -3px; - right: -3px; -} -div.browse.list > ul li.ad a.thumbnail { - height: 51px; -} -div.browse.list > ul li.ad span.title_brand small.brand_name { - display: block; -} -div.browse.list > ul li.brand a.thumbnail { - height: 68px; -} -div.browse.list.cols_2 > ul > li { - width: 285px; - float: left; -} -div.browse.list.cols_2 > ul > li :hover { - background: #fff; -} -div.browse.ads.list > ul > li { - height: 53px; -} -div.browse.ads.list > ul > li a.thumbnail { - height: 51px; -} -div.browse.brands.list > ul > li { - height: 68px; -} -div.browse.brands.list > ul > li a.thumbnail { - height: 66px; -} -/* Categories List */ -#categories { - margin: 40px 0 0; - width: 160px; - float: left; - position: relative; - z-index: 1; -} -#categories ul { - margin: 0; - padding: 10px 0 0; -} -#categories ul li { - list-style: none; - margin: 0; - padding: 0; - font-size: 14px; -} -#categories ul li a { - color: #eee; - display: block; - padding: 5px 10px 5px 15px; - text-decoration: none; -} -#categories ul li a:hover { - color: #000; - background: #fcfcfc; -} -#categories ul .all a { - font-weight: bold; -} -#categories ul .current a { - background: #fff; - color: #000; - border: 1px solid #fbfbfb; - border-right: none; - border-left: 5px solid #f01; - padding-left: 10px; -} -/* Ads > Show */ -#ad div.header { - overflow: hidden; -} -#ad div.header h3 { - font-size: 16px; - margin: 0 0 3px; -} -#ad div.header small a.category { - font-weight: bold; - color: #000; -} -#ad div.header small span.networks img { - position: relative; - top: 3px; -} -#ad div.header span.brand { - float: right; - color: #fff; -} -#ad div.header span.brand a.brand_name { - font-weight: bold; - color: #000; -} -#ad div.content { - padding: 0; - position: relative; -} -#ad div.content a.toggle_size { - display: block; - background-color: #000; - padding: 0 5px 0 26px; - background-position: 5px center; - background-repeat: no-repeat; - text-decoration: none; - margin: 5px 5px 0 0; - position: absolute; - top: 0; - right: 0; - line-height: 25px; - z-index: 45; -} -#ad div.content img.creative { - margin: 0 auto; - max-width: 540px; - display: block; -} -#ad div.content object { - position: relative; - z-index: 44; -} -#ad div.content object.video { - line-height: 0; - font-size: 0; -} -#ad div.content object embed { - position: relative; - z-index: 45; - line-height: 0; - font-size: 0; -} -#ad div.content.not_video { - padding: 40px; - text-align: center; -} -#ad div.content.not_video * { - margin-left: auto; - margin-right: auto; -} -#ad div.content.not_video object.flash { - margin-bottom: 0; -} -#ad div.footer { - padding: 0; -} -#ad div.footer div.vote_views { - padding: 5px 10px; - overflow: hidden; -} -#ad div.footer div.vote_views div.share { - float: right; - margin: 2px 0 0 0; -} -#ad div.footer div.vote_views #login_register_msg, -#ad div.footer div.vote_views #encourage_vote_msg { - line-height: 22px; - font-weight: bold; - color: #000; -} -#sidebar #meta table { - margin: 0; -} -#sidebar #meta table tr:last-child td { - padding-bottom: 0; -} -#sidebar #meta table td { - padding: 0 0 5px; -} -#sidebar #meta table td ul.networks { - margin: 0; - padding: 0; -} -#sidebar #meta table td ul.networks li { - list-style: none; - display: inline; -} -#sidebar #meta table td.label { - color: #eee; - white-space: nowrap; - width: 1%; - text-align: right; - padding-right: 5px; -} -/* Voting */ -div.voted { - font-size: 12px; - line-height: 22px; - color: #000; - display: inline-block; - font-weight: bold; -} -div.voted img { - float: left; - margin-right: 5px; - padding: 3px; -} -#voted_up img { - background: #cf0003; -} -#voted_down img { - background: #cf0003; -} -#encourage_comment { - display: inline-block; - line-height: 22px; - font-weight: bold; -} -#vote { - overflow: hidden; - font-size: 12px; - line-height: 22px; - color: #000; - float: left; -} -#vote a { - color: #fff; - font-weight: bold; - overflow: hidden; - display: block; - width: 16px; - text-decoration: none; - text-align: center; - font-size: 10px; - padding: 3px; - text-transform: uppercase; -} -#vote a.up { - float: left; - background: #cf0003; -} -#vote a.up :hover { - background: #ff0003; -} -#vote a.down { - float: left; - background: #cf0003; - margin: 0 5px 0 1px; -} -#vote a.down :hover { - background: #ff0003; -} -#vote.disabled a.up { - background: #e9cacb; -} -#vote.disabled a.up :hover { - background: #f2b3b3; -} -#vote.disabled a.down { - background: #e9cacb; -} -#vote.disabled a.down :hover { - background: #f2b3b3; -} -/* Panels */ -div.panel { - margin: 0 0 20px; - position: relative; -} -div.panel > div.header { - background: #f01 url('/images/panel_header_bg.png') repeat-x top left; - border-bottom: 1px solid #a8000b; - padding: 5px 10px 4px; - min-height: 18px; -} -div.panel > div.header h2 { - font-size: 16px; - margin: 0; - color: #fff; -} -div.panel > div.header h3 { - color: #fff; - font-size: 14px; - margin: 0; - line-height: 18px; -} -div.panel > div.header small { - display: block; - font-size: 12px; - color: #fbfbfb; -} -div.panel > div.header span.filter { - float: left; - display: block; - overflow: hidden; - position: relative; - z-index: 5; -} -div.panel > div.header span.filter a { - margin: 0 1px 0 0; - display: block; - float: left; - padding: 0 8px; - height: 18px; - font-weight: bold; - font-size: 10px; - line-height: 18px; - text-transform: uppercase; - background: url('/images/transparent_backgrounds/black_50.png'); - color: #eee; - text-decoration: none; - position: relative; - z-index: 3; -} -div.panel > div.header span.filter a:last-child { - margin-right: 0; -} -div.panel > div.header span.filter a.active { - background: #fff; - color: #000; - z-index: 4; -} -div.panel > div.header span.filter a:hover { - color: #fff; -} -div.panel > div.header span.filter a.active:hover { - color: #000; -} -div.panel > div.header span.filter.dropdown { - margin: 0; - position: relative; - overflow: visible; -} -div.panel > div.header span.filter.dropdown a { - background: #fff; - color: #000; - margin: 0; - position: relative; - padding-right: 25px; -} -div.panel > div.header span.filter.dropdown a img { - float: left; - margin: 4px 5px 0 0; -} -div.panel > div.header span.filter.dropdown a b.arrow { - float: right; - display: block; - height: 0; - width: 0; - border: 5px solid transparent; - border-top: 5px solid #000; - border-bottom: none; - position: absolute; - top: 6px; - right: 10px; -} -div.panel > div.header span.filter.dropdown a :hover { - background: #000; - color: #fff; -} -div.panel > div.header span.filter.dropdown a :hover b.arrow { - border-top: 5px solid #fff; -} -div.panel > div.header span.filter.dropdown ul { - position: absolute; - top: 100%; - left: 0; - margin: 1px 0 0; - padding: 0; - background: #fff; -} -div.panel > div.header span.filter.dropdown ul li { - list-style: none; - display: block; - padding: 0; - margin: 0; -} -div.panel > div.header span.filter.dropdown ul li a { - display: block; - height: 18px; - line-height: 18px; - color: #000; - font-size: 10px; - text-transform: uppercase; - background: transparent; - border-bottom: 1px solid #f1f1f1; - float: none; - margin: 0; - white-space: nowrap; -} -div.panel > div.header span.filter.dropdown ul li a :hover { - background: url('/images/transparent_backgrounds/accent_colour_25.png'); - color: #000; -} -div.panel > div.header span.filter.dropdown ul li:last-child a { - border: none; -} -div.panel > div.header span.filter.dropdown.sort { - float: left; - margin: 0 0 0 10px; -} -div.panel > div.header span.filter.dropdown.localisation { - float: left; - margin: 0 0 0 10px; -} -div.panel > div.header a.more { - float: right; - color: #fff; - font-size: 14px; - font-weight: bold; - position: relative; - top: 2px; -} -div.panel > div.header a.more :hover { - text-decoration: none; -} -div.panel > div.content { - background: #fff; - padding: 10px; -} -div.panel > div.content .no_padding { - padding: 0; -} -div.panel > div.footer { - background: #f7f7f7; - border-top: 1px solid #f7f7f7; - padding: 4px 10px 5px; -} -div.panel.collapsable div.header { - cursor: pointer; -} -div.panel.collapsable div.header b.toggle { - float: right; - border: 5px solid transparent; - border-bottom: 5px solid #fff; - border-top: none; - display: block; - width: 0; - height: 0; - margin: 6px 0 0 0; -} -div.panel.collapsable div.header:hover { - background-color: #ff404d; -} -div.panel.collapsed div.header { - border-bottom: none; -} -div.panel.collapsed div.header b.toggle { - border-bottom: none; - border-top: 5px solid #fff; -} -div.panel.collapsed div.blank { - border-bottom: none; -} -div.panel.collapsed div.content, -div.panel.collapsed div.footer { - display: none; -} -/* Sidebar Actions */ -#sidebar #actions div.content { - background: url('/images/transparent_backgrounds/accent_colour_10.png'); - text-align: center; -} -#sidebar #actions div.content p.endorsement { - margin: 0 0 10px; - font-size: 14px; - font-weight: bold; -} -#sidebar #actions div.content p.endorsement small { - font-weight: normal; - line-height: inherit; - margin: 10px 0 0; -} -#sidebar #actions div.content p.endorsement :last-child { - margin: 0; -} -#sidebar #actions div.content div.share { - margin: 5px 0 0; -} -#sidebar #actions div.content a.button, -#sidebar #actions div.content a.btn { - font-size: 16px; - line-height: normal; - height: auto; - padding: 5px 10px 5px 35px; - font-weight: bold; - margin: 0; - position: relative; -} -#sidebar #actions div.content a.button img, -#sidebar #actions div.content a.btn img { - position: absolute; - top: 3px; - left: 6px; -} -#sidebar #actions div.content div.flash.notice { - margin: 10px 0 0; - font-size: 22px; -} -#sidebar #actions div.content div.flash.notice small { - font-weight: normal; - margin: 0 0 10px; -} -#sidebar #actions div.content div.flash.notice.done { - margin: 0; -} -#sidebar #actions div.content small { - display: block; - margin: 10px 0 0; - font-size: 11px; - color: #808080; - line-height: 12px; -} -#sidebar #actions div.content small img.favicon { - vertical-align: middle; -} -#sidebar #actions div.content div.blank { - border: none; - background: none; - padding: 10px 0 0; - border-top: 1px solid #808080; - margin: 10px 0 0; -} -/* People Lists */ -ul.people { - margin: 0; - padding: 10px 0 0 10px; - background: #fff; -} -ul.people > li { - display: block; - margin: 0 10px 10px 0; - float: left; - padding: 2px; - width: 57px; - position: relative; - background: #fff; - list-style: none; - border: 1px solid #f7f7f7; -} -ul.people > li a.avatar { - display: block; - width: 59px; - height: 59px; - overflow: hidden; -} -ul.people > li a.avatar img { - width: 100%; - height: 100%; -} -ul.people > li a.name { - display: block; - font-size: 10px; - text-align: center; -} -ul.people > li :hover { - background: #000; -} -ul.people > li :hover a.name { - color: #fff; -} -ul.people.list { - padding: 0; -} -ul.people.list > li { - margin: 0 0 10px; - padding: 0 0 10px; - overflow: hidden; - float: none; - width: auto; - border: none; - border-bottom: 1px solid #f7f7f7; -} -ul.people.list > li span.points { - float: right; - display: block; - padding: 5px; - background: #fcfcfc; - line-height: 1; - text-align: center; - width: 50px; - height: 30px; - margin: 0 0 0 10px; -} -ul.people.list > li span.points strong { - display: block; - color: #000; - font-size: 16px; - margin: 2px 0 0; -} -ul.people.list > li span.points label { - color: #eee; - text-transform: uppercase; - font-size: 10px; -} -ul.people.list > li span.points label.long { - display: block; -} -ul.people.list > li span.points label.short { - display: none; -} -ul.people.list > li a.avatar { - float: left; - width: 40px; - height: 40px; -} -ul.people.list > li a.name { - font-size: 14px; - font-weight: bold; - margin: 0 0 0 50px; - text-align: left; -} -ul.people.list > li a.name.long { - display: inline; -} -ul.people.list > li a.name.short { - display: none; -} -ul.people.list > li span.networks { - display: block; - margin: 0 0 0 50px; -} -ul.people.list > li span.networks img.favicon { - vertical-align: middle; -} -ul.people.list > li :hover { - background: transparent; -} -ul.people.list > li :hover a.name { - color: #000000; -} -ul.people.list > li :last-child { - padding-bottom: 0; - border-bottom: none; - margin-bottom: 0; -} -ul.people.list.small > li span.points { - padding: 3px 6px; - height: 18px; - font-size: 9px; - line-height: 17px; - width: 60px; -} -ul.people.list.small > li span.points strong { - font-size: 12px; - margin: 0; - display: inline; -} -ul.people.list.small > li span.points label { - font-size: 9px; -} -ul.people.list.small > li span.points label.long { - display: none; -} -ul.people.list.small > li span.points label.short { - display: inline; -} -ul.people.list.small > li a.avatar { - width: 24px; - height: 24px; -} -ul.people.list.small > li a.name { - display: inline; - line-height: 24px; - margin: 0 0 0 5px; - font-size: 12px; - height: 24px; -} -ul.people.list.small > li a.name.long { - display: none; -} -ul.people.list.small > li a.name.short { - display: inline; -} -ul.people.list.small > li span.networks { - display: inline; - margin: 0; -} -ul.people.list.small > li :last-child { - padding-bottom: 0; - border-bottom: none; - margin-bottom: 0; -} -ul.people.tiled > li { - width: 28px; - padding: 2px; -} -ul.people.tiled > li a.avatar { - width: 24px; - height: 24px; - background: #fff; - padding: 2px; -} -ul.people.tiled > li a.name, -ul.people.tiled > li small, -ul.people.tiled > li span.networks, -ul.people.tiled > li span.points { - display: none; -} -/* Comments */ -#comments ul { - margin: 0 0 20px; - padding: 0; -} -#comments ul li { - display: block; - list-style: none; - padding: 0; - margin: 0 0 10px; -} -#comments ul li span.meta { - margin: 0; - overflow: hidden; - display: block; -} -#comments ul li span.meta small { - font-size: 12px; - color: #eee; - float: right; - line-height: 16px; - display: inline-block; -} -#comments ul li span.meta a.avatar { - display: inline-block; - height: 16px; - width: 16px; - position: relative; - top: 3px; -} -#comments ul li span.meta a.avatar img { - height: 100%; - width: 100%; -} -#comments ul li span.meta a.name { - font-weight: bold; - line-height: 16px; - display: inline-block; -} -#comments ul li span.meta span.inactive { - color: #eee; - font-weight: bold; - line-height: 16px; - display: inline-block; -} -#comments ul li b.tail { - display: block; - width: 0; - height: 0; - margin: 3px 0 0 10px; - border: 5px solid transparent; - border-top: none; - border-bottom: 5px solid #fff; - position: relative; - z-index: 2; -} -#comments ul li blockquote { - margin: 0; - padding: 10px; - font-style: normal; - background: #fff; - color: #eee; -} -#comments form { - margin: 0; -} -#comments form textarea { - width: 500px; -} -/* Sidebar Categories */ -#sidebar #categories { - margin: 0 0 20px; - width: auto; -} -#sidebar #categories p { - margin: 0; -} -#sidebar #ads > ul li, -#sidebar #recommendations > ul li { - width: 81px; -} -#sidebar #ads > ul li div.thumbnail a.thumbnail, -#sidebar #recommendations > ul li div.thumbnail a.thumbnail { - height: 60px; - width: 81px; -} -#sidebar #ads > ul li div.text a.title, -#sidebar #recommendations > ul li div.text a.title { - font-size: 11px; - height: 14px; - line-height: 14px; -} -#sidebar #ads > ul li div.text small, -#sidebar #recommendations > ul li div.text small { - display: none; -} -#sidebar #brands > ul li { - width: 55px; -} -#sidebar #brands > ul li div.thumbnail a.thumbnail { - height: 45px; - width: 45px; -} -#sidebar #brands > ul li div.thumbnail a.thumbnail img { - max-height: 45px; - max-width: 45px; -} -#sidebar #brands > ul li div.text { - display: none; -} -/* My Account */ -#accounts_controller #top #page_title #page_options a.button.public_profile, -#accounts_controller #top #page_title #page_options a.btn.public_profile { - float: right; - font-size: 16px; - line-height: 1; - height: auto; - padding: 8px 35px 8px 15px; - position: relative; -} -#accounts_controller #top #page_title #page_options a.button.public_profile b.arrow, -#accounts_controller #top #page_title #page_options a.btn.public_profile b.arrow { - display: block; - height: 0; - width: 0; - position: absolute; - top: 10px; - right: 15px; - border: 6px solid transparent; - border-right: none; - border-left: 6px solid #fff; - margin: 0; -} -#accounts_controller #top #page_title #page_options a.button.goto_dashboard, -#accounts_controller #top #page_title #page_options a.btn.goto_dashboard { - float: right; - font-size: 16px; - line-height: 1; - height: auto; - padding: 8px 15px 8px 35px; - margin-right: 5px; - position: relative; -} -#accounts_controller #top #page_title #page_options a.button.goto_dashboard b.arrow, -#accounts_controller #top #page_title #page_options a.btn.goto_dashboard b.arrow { - display: block; - height: 0; - width: 0; - position: absolute; - top: 10px; - left: 15px; - border: 6px solid transparent; - border-left: none; - border-right: 6px solid #fff; - margin: 0; -} -#accounts_controller #account_nav { - float: left; - width: 200px; - margin: 0 20px 0 0; -} -#accounts_controller #account_nav ul.nav { - margin: 0; - padding: 0; -} -#accounts_controller #account_nav ul.nav li { - margin: 0 0 5px; - display: block; - list-style: none; - padding: 0; -} -#accounts_controller #account_nav ul.nav li a { - display: block; - height: 30px; - text-decoration: none; - color: #fff; -} -#accounts_controller #account_nav ul.nav li a b { - border: 15px solid transparent; - border-right: none; - border-left: 10px solid transparent; - width: 0; - height: 0; - float: right; - display: none; -} -#accounts_controller #account_nav ul.nav li a span { - background: #f01; - display: block; - line-height: 30px; - padding: 0 10px; - font-size: 14px; - font-weight: bold; - margin: 0 10px 0 0; -} -#accounts_controller #account_nav ul.nav li :hover a { - color: #fff; -} -#accounts_controller #account_nav ul.nav li :hover a b { - border-left-color: #f01; - display: block; -} -#accounts_controller #account_nav ul.nav li :hover a span { - background: #f01; -} -#accounts_controller #account_nav ul.nav li.current a b { - border-left-color: #000; - display: block; -} -#accounts_controller #account_nav ul.nav li.current a span { - background: #000; - color: #fff; -} -#accounts_controller #main > div { - margin: 0 0 20px; -} -#accounts_controller #main > div form { - margin: 0; -} -#accounts_controller #main #profile a.avatar { - float: left; - display: block; - width: 70px; - overflow: hidden; - position: relative; - text-decoration: none; -} -#accounts_controller #main #profile a.avatar img { - width: 100%; -} -#accounts_controller #main #profile a.avatar span { - display: block; - line-height: 1; - padding: 3px; - margin: 5px 0 0; - color: #fff; - background: #000; - text-align: center; - font-size: 10px; - font-weight: bold; - text-transform: uppercase; -} -#accounts_controller #main #profile form { - margin: 0 0 0 90px; -} -#accounts_controller #main #profile form h4 { - margin: 10px 0 20px; - border-bottom: 1px solid #f7f7f7; - padding: 0; - color: #f01; - font-size: 16px; -} -#accounts_controller #main #profile form ul.choices li { - width: 30%; -} -#accounts_controller #main #profile form div.extra { - margin-top: 20px; -} -#accounts_controller #main #networks ul { - margin: 0 -10px -10px 0; - padding: 0; - overflow: hidden; -} -#accounts_controller #main #networks ul li:hover { - background: #eee; - display: block; - float: left; - width: 180px; - padding: 10px; - margin: 0 10px 10px 0; - list-style: none; - position: relative; -} -#accounts_controller #main #networks ul li:hover * { - line-height: normal; -} -#accounts_controller #main #networks ul li:hover img { - vertical-align: middle; - float: left; -} -#accounts_controller #main #networks ul li:hover .name { - font-weight: bold; - font-size: 14px; - display: block; - margin: -2px 0 0 42px; -} -#accounts_controller #main #networks ul li:hover small { - font-size: 12px; - color: #eee; - display: block; - margin-left: 42px; -} -#accounts_controller #main #networks ul li:hover small strong { - color: #000; - font-weight: normal; -} -#accounts_controller #main #networks ul li.installed { - background: #fff; - border: 2px solid #000; - padding: 8px; -} -#accounts_controller #main #networks ul li.unavailable .name { - color: #000; -} -#accounts_controller #main #networks ul li.unavailable :hover { - background: #eee; -} -#accounts_controller #main #networks ul li:hover { - background: #f7f7f7; -} -/* Shopping Style Panel */ -#shopping_style div.header a.button.small, -#shopping_style div.header a.btn.small { - float: right; -} -#shopping_style div.content p { - margin: 0 0 10px; -} -#shopping_style div.content p label { - text-transform: uppercase; - font-size: 11px; - display: block; - color: #f01; - font-weight: bold; -} -#shopping_style div.content p span { - color: #000; -} -#shopping_style div.content p span.toggle { - white-space: nowrap; - color: #eee; -} -#shopping_style div.content p :last-child { - margin: 0; -} -#shopping_style div.content p.more { - text-align: left; - font-weight: normal; -} -#shopping_style div.content p.less { - display: none; - margin: 0; -} -/* People Controller */ -#people_controller.index #main div.panel { - float: left; - width: 300px; - margin: 0 20px 0 0; -} -#people_controller.index #main div.panel :last-child { - margin-right: 0; -} -#people_controller.show #content #shopping_style { - float: left; - width: 240px; - margin: 0 20px 0 0; -} -#people_controller.show #content #main { - width: 360px; -} -/* Search Results */ -#search_results { - margin: 0 0 20px; -} -#search_results li :hover small { - color: #bfbfbf; -} -#search div.content { - padding: 20px; -} -#search div.content form { - margin: 0; - float: none; -} -#search div.content form span.submit_and_options { - display: block; -} -#search div.content p { - margin: 0 0 15px; -} -#search div.content h4 { - font-weight: normal; - margin: 0 0 5px; -} -/* Recommendations */ -#recommendations div.browse { - margin: 0; - padding: 0; - background: none; -} -#recommendations div.browse ul { - min-height: 0; -} -/* Blank States */ -div.blank { - padding: 20px; - background: #f2e6e6; - position: relative; - border: 1px solid #e6ccce; - z-index: 1; -} -div.blank h4 { - font-size: 18px; - margin: 0 0 10px; -} -div.blank h4:last-child { - margin: 0; -} -div.blank p { - font-size: 16px; - margin: 0 0 10px; -} -div.blank p:last-child { - margin: 0; -} -div.blank p.with_list_number.large span { - margin-left: 48px; - display: block; - color: #fff; -} -div.blank p.earn span { - font-size: 22px; - color: #fff; - line-height: 48px; - font-weight: bold; -} -div.blank a { - white-space: nowrap; -} -div.blank a.hide { - position: absolute; - top: -5px; - right: -5px; - display: block; - height: 16px; - width: 16px; - padding: 3px; - background: #E7E9F6; -} -div.blank.small { - padding: 10px 20px; -} -div.blank.small h4 { - font-weight: normal; - font-size: 16px; -} -div.blank.small p { - margin: 0; -} -div.blank.tiny { - padding: 10px 20px; -} -div.blank.tiny h4 { - font-weight: normal; - font-size: 14px; -} -div.blank.tiny p { - margin: 0; - font-size: 12px; -} -div.blank.rounded { - margin: 0 0 20px; -} -div.blank.with_border_bottom { - border-bottom: 1px solid #e6ccce; -} -div.blank.no_border_top { - border-top: none; -} -div.blank.no_border_bottom { - border-bottom: none; -} -div.blank.no_side_borders { - border-right: none; - border-left: none; -} -div.panel div.blank { - padding: 10px 20px; - overflow: hidden; - margin: 0; -} -div.panel div.blank h4 { - font-weight: normal; - font-size: 14px; -} -div.panel div.blank p, -div.panel div.blank ul { - margin: 0 0 10px; - font-size: 12px; -} -div.panel div.blank p:last-child, -div.panel div.blank ul:last-child { - margin: 0; -} -/* Sidebar Browse */ -#sidebar div.panel div.content.browse { - padding: 0; - margin: 0; -} -#sidebar div.panel div.content.browse > ul { - min-height: 0; -} -#sidebar div.panel div.content.browse > ul > li div.thumbnail a.thumbnail { - padding: 5px; -} -#sidebar div.panel div.content.browse > ul > li div.thumbnail img.marker.media_type { - top: 48px; - left: 8px; -} -#sidebar div.panel div.content.browse > ul > li div.footer a.title, -#sidebar div.panel div.content.browse > ul > li div.footer a.name { - font-size: 11px; - font-weight: normal; -} -#sidebar div.panel div.content.browse.ads > ul > li { - width: 93px; -} -#sidebar div.panel div.content.browse.ads > ul > li > div.thumbnail a.thumbnail { - width: 83px; - height: 62px; -} -#sidebar div.panel div.content.browse.brands > ul { - background: none; -} -#sidebar div.panel div.content.browse.brands > ul > li { - width: 52px; -} -#sidebar div.panel div.content.browse.brands > ul > li > div.thumbnail { - padding: 3px; -} -#sidebar div.panel div.content.browse.brands > ul > li > div.thumbnail a.thumbnail { - width: 42px; - height: 42px; - padding: 2px; -} -#sidebar div.panel div.content.browse.brands > ul > li li.active { - background: #000; -} -#sidebar div.panel div.footer div.info { - float: none; -} -#sidebar div.panel div.footer div.pagination { - float: none; - margin: 3px 0 0; -} -/* List Numbers */ -label.list_number { - float: left; - background: url('/images/transparent_backgrounds/black_15.png'); - padding: 2px; - width: 24px; - height: 24px; - display: block; -} -label.list_number b { - display: block; - font-weight: bold; - font-size: 14px; - color: #fff; - background: #000; - height: 20px; - width: 20px; - line-height: 20px; - text-align: center; - border: 2px solid #fff; -} -label.list_number.large { - padding: 4px; - width: 48px; - height: 48px; - position: relative; - left: -10px; -} -label.list_number.large b { - font-size: 28px; - height: 40px; - width: 40px; - line-height: 40px; - border-width: 4px; -} -/* Dashboard */ -#dashboard_controller #ads span.filter.state { - float: right; -} -#dashboard_controller #sidebar #shopping_style div.content p.less { - display: block; -} -#dashboard_controller #sidebar #shopping_style div.content p.more { - display: none; -} -#dashboard_controller #sidebar #influences div.header { - padding-bottom: 0; -} -#dashboard_controller #sidebar #influences div.header ul.tabs { - position: relative; - top: 1px; - z-index: 3; -} -#dashboard_controller #sidebar #influences div.header ul.tabs li { - margin: 0 5px 0 0; -} -#dashboard_controller #sidebar #influences div.header ul.tabs li a { - border: none; - background: url('/images/transparent_backgrounds/white_75.png'); -} -#dashboard_controller #sidebar #influences div.header ul.tabs li a :hover { - color: #000; -} -#dashboard_controller #sidebar #influences div.header ul.tabs li.active a { - background: #fff; - border: none; -} -#dashboard_controller #sidebar #influences div.header ul.tabs li.active a :hover { - color: #000; -} -#dashboard_controller #sidebar #influences div.tab_content { - overflow: hidden; - padding: 0; -} -#dashboard_controller #sidebar #influences div.tab_content > ul { - padding: 10px 10px 0; - max-height: 280px; - min-height: 120px; - overflow-y: scroll; -} -#dashboard_controller #sidebar #influences div.footer form p { - margin: 0 0 5px; -} -#dashboard_controller #sidebar #influences div.footer form p img.marker { - float: right; - margin: 5px 0 0 0; -} -#dashboard_controller #sidebar #influences div.footer form p span.invitee { - line-height: 26px; - padding: 3px 3px 0; - font-size: 14px; -} -#dashboard_controller #sidebar #influences div.footer form p span.invitee small { - color: #eee; - font-size: 12px; -} -#dashboard_controller #sidebar #influences div.footer form p.indent { - margin-left: 36px; -} -#dashboard_controller #sidebar #influences div.footer form p.submit { - margin-top: 10px; -} -#dashboard_controller div.panel.full > div.content { - margin: 0; - padding: 0; - background: none; -} -#dashboard_controller div.panel.full > div.content ul li { - width: 148px; -} -#dashboard_controller div.panel.full > div.content ul li div.thumbnail img.marker.media_type { - top: 90px; -} -#dashboard_controller div.panel.full > div.content ul li div.thumbnail a.thumbnail { - width: 138px; - height: 104px; -} -#dashboard_controller #people form { - padding: 0 0 5px; -} -#dashboard_controller #people form input { - width: 225px; - float: left; - margin: 0 5px 0 0; -} -#dashboard_controller #people form a.button, -#dashboard_controller #people form a.btn { - height: 23px; - line-height: 23px; - width: 60px; - padding: 0; - text-align: center; -} -/* Remove Pages Titles when Browsing */ -#ads_controller #page_title, -#brands_controller #page_title { - display: none; -} -/* Brands > Show */ -#brands_controller.show #ads div.filters h3 { - font-size: 16px; - margin: 0; -} -#brands_controller.show #ads div.filters span.show { - float: right; -} -#brands_controller.show #ads div.filters span.filter.dropdown.localisation { - float: right; - margin: 0 0 0 10px; -} -#brands_controller.show #ads div.filters span.filter.state { - float: right; - margin: 0 0 0 10px; -} -/* FAQ */ -#pages_controller.faq #answers h3 { - margin-top: 20px; - padding-top: 20px; - border-top: 1px solid #f2f2f2; -} -#pages_controller.faq #answers h3.first { - margin-top: 0; - padding-top: 0; - border: none; -} -#pages_controller.faq #questions div.content { - padding: 20px; -} -#pages_controller.faq #questions div.content ul { - margin: 0; - padding: 0; -} -#pages_controller.faq #questions div.content ul li { - margin: 0 0 10px; - list-style: none; - display: block; - padding: 0; -} -#pages_controller.faq #questions div.content ul li a { - font-size: 14px; -} -#pages_controller.faq #questions div.content ul li:last-child { - margin: 0; -} -/* Person Overview */ -#person_overview { - padding: 20px 10px; - position: relative; - z-index: 25; -} -#person_overview #person { - float: left; - width: 620px; -} -#person_overview #person a.avatar { - display: block; - float: left; - width: 60px; - height: 60px; -} -#person_overview #person a.avatar img { - height: 100%; - width: 100%; -} -#person_overview #person > div { - margin: 0 0 0 75px; - color: #fff; - font-size: 14px; -} -#person_overview #person div.name h2 { - margin: 0 0 5px; - display: inline; -} -#person_overview #person div.name h2 a { - font-size: 20px; - font-weight: bold; - line-height: 1; - color: #fff; - text-decoration: none; -} -#person_overview #person div.name h2 a :hover { - text-decoration: underline; -} -#person_overview #person div.name h2 a.button.small, -#person_overview #person div.name h2 a.btn.small { - font-size: 10px; -} -#person_overview #person div.name h2 a.button.small :hover, -#person_overview #person div.name h2 a.btn.small :hover { - text-decoration: none; -} -#person_overview #person div.name span.points { - float: right; - display: block; - padding: 5px 10px; - text-align: center; - background: #fff; - position: relative; - min-width: 45px; -} -#person_overview #person div.name span.points strong { - color: #000; - font-weight: bold; - font-size: 24px; - line-height: 1; - display: block; -} -#person_overview #person div.name span.points label { - font-size: 9px; - text-transform: uppercase; - color: #eee; - display: block; - font-weight: bold; -} -#person_overview #person div.name span.points.with_redeem a.button, -#person_overview #person div.name span.points.with_redeem a.btn { - display: block; - text-align: center; - font-size: 10px; - font-weight: bold; - padding: 0; - position: absolute; - height: 18px; - left: 0; - right: 0; - bottom: -19px; - line-height: 18px; - text-transform: uppercase; - border: none; -} -#person_overview #person div.name div.options { - margin: 0; -} -#person_overview #person div.meta { - color: #fca8ae; -} -#person_overview #person div.meta span { - color: #fff; -} -#person_overview #person div.meta label { - color: #fca8ae; -} -#person_overview #person div.meta ul.networks { - display: inline; - margin: 0; - padding: 0; -} -#person_overview #person div.meta ul.networks li { - display: inline; - line-height: 1; -} -#person_overview #person div.meta ul.networks li img { - position: relative; - vertical-align: middle; - top: -1px; -} -#person_overview #person div.extra { - font-size: 12px; - margin-top: 20px; - margin-bottom: 20px; -} -#person_overview #person div.extra span.toggle a { - font-size: 10px; - font-weight: bold; - text-transform: uppercase; - text-decoration: none; - color: #000; -} -#person_overview #person div.extra span.toggle b.arrow { - display: inline-block; - width: 0; - height: 0; - border: 5px solid transparent; - position: relative; - top: -2px; -} -#person_overview #person div.extra #less_info span.toggle b.arrow { - border-top: 5px solid #000; - border-bottom: 0; -} -#person_overview #person div.extra #more_info span.toggle { - float: right; -} -#person_overview #person div.extra #more_info span.toggle b.arrow { - border-bottom: 5px solid #000; - border-top: 0; -} -#person_overview #person div.extra #more_info h4 { - color: #fff; - margin: 0 0 10px 0; - border-bottom: 1px solid #ff404d; -} -#person_overview #person div.extra #more_info h4 span { - font-size: 12px; -} -#person_overview #person div.extra #more_info p { - margin: 0 0 5px; -} -#person_overview #person div.extra #more_info p label { - display: block; - float: left; - width: 120px; - color: #fca8ae; -} -#person_overview #person div.extra #more_info p span { - display: block; - margin: 0 0 0 130px; -} -#person_overview #person div.extra #more_info p:last-child { - margin: 0; -} -#person_overview #person div.login { - margin: 0 0 0 75px; -} -#person_overview #person div.login a.button, -#person_overview #person div.login a.btn { - font-weight: bold; -} -/* Dashboard Nav */ -#dashboard_nav { - position: absolute; - bottom: 0; - left: 10px; - margin: 0; - padding: 0; - overflow: hidden; -} -#dashboard_nav li { - display: block; - float: left; - margin: 0 5px 0 0; -} -#dashboard_nav li a { - display: block; - height: 28px; - padding: 0 10px; - line-height: 28px; - text-decoration: none; - color: #fff; - background: url('/images/transparent_backgrounds/accent_colour_30.png'); - font-size: 14px; - font-weight: bold; -} -#dashboard_nav li a :hover { - background: url('/images/transparent_backgrounds/accent_colour_45.png'); -} -#dashboard_nav li.active a { - background: #fff; - color: #000; -} -#dashboard_nav li.active a :hover { - color: #000; -} -/* Dwellometer */ -#dwellometer { - z-index: 45; - float: right; - margin: 0; -} -#dwellometer div.content { - text-align: center; - position: relative; -} -#dwellometer div.content object, -#dwellometer div.content object embed { - position: relative; - z-index: 46; - line-height: 0; -} -#dwellometer div.content div.title { - position: absolute; - bottom: 10px; - left: 0; - right: 0; - z-index: 50; -} -#dwellometer div.content div.title img { - width: 120px; - display: block; - margin: 0 auto; - position: relative; - left: -5px; -} -/* Activity Stream */ -#activity div.content ul.events { - padding: 0; - margin: 0 0 -10px; -} -#activity div.content ul.events li { - margin: 0; - padding: 10px 0; - border-bottom: 1px solid #f7f7f7; - list-style: none; - overflow: hidden; - /* Temporarily removed avatar and symbol */ - /* div.symbols a.agent, b { display: none; }*/ -} -#activity div.content ul.events li small.meta { - font-size: 12px; - color: #eee; - float: right; -} -#activity div.content ul.events li a.button, -#activity div.content ul.events li a.btn { - float: right; - margin: 0 0 10px 10px; -} -#activity div.content ul.events li a.avatar, -#activity div.content ul.events li a.logo, -#activity div.content ul.events li a.thumbnail { - height: 32px; - display: block; - float: left; -} -#activity div.content ul.events li a.avatar img, -#activity div.content ul.events li a.logo img, -#activity div.content ul.events li a.thumbnail img { - width: 100%; - height: 100%; -} -#activity div.content ul.events li a.avatar, -#activity div.content ul.events li a.logo, -#activity div.content ul.events li a.icon { - width: 32px; -} -#activity div.content ul.events li a.thumbnail { - width: 42px; -} -#activity div.content ul.events li div.symbols { - float: left; - overflow: hidden; -} -#activity div.content ul.events li div.symbols b { - display: block; - float: left; - margin: 10px 5px 0; -} -#activity div.content ul.events li div.symbols b img { - height: 12px; - width: 12px; -} -#activity div.content ul.events li div.symbols b.voted { - margin: 10px 3px 0; - padding: 2px; -} -#activity div.content ul.events li div.symbols b.voted.for { - background: #fca8a8; -} -#activity div.content ul.events li div.symbols b.voted.against { - background: #fca8a8; -} -#activity div.content ul.events li div.description { - font-size: 12px; - color: #eee; -} -#activity div.content ul.events li div.description a.agent { - font-weight: bold; -} -#activity div.content ul.events li div.comment { - margin-top: 2px; -} -#activity div.content ul.events li div.comment b.tail { - display: block; - margin: 0 0 0 10px; - width: 0; - height: 0; - border: 5px solid transparent; - border-top: none; - border-bottom: 5px solid #fbfbfb; -} -#activity div.content ul.events li div.comment blockquote { - margin: 0; - font-style: normal; - color: #eee; - background: #fbfbfb; - padding: 5px 10px; -} -#activity div.content ul.events li div.comment blockquote span.view_comment { - color: #eee; -} -#activity div.content ul.events li div.content { - overflow: hidden; -} -#activity div.content ul.events li.new_comment.ad, -#activity div.content ul.events li.endorsed.ad, -#activity div.content ul.events li.voted { - /* div.description, div.content { margin-left: 53px; }*/ -} -#activity div.content ul.events li.new_comment.ad div.description, -#activity div.content ul.events li.endorsed.ad div.description, -#activity div.content ul.events li.voted div.description, -#activity div.content ul.events li.new_comment.ad div.content, -#activity div.content ul.events li.endorsed.ad div.content, -#activity div.content ul.events li.voted div.content { - margin-left: 106px; -} -#activity div.content ul.events li.new_comment.brand, -#activity div.content ul.events li.replied_to, -#activity div.content ul.events li.endorsed.brand, -#activity div.content ul.events li.connected, -#activity div.content ul.events li.sn_setup { - /* div.description, div.content { margin-left: 43px; }*/ -} -#activity div.content ul.events li.new_comment.brand div.description, -#activity div.content ul.events li.replied_to div.description, -#activity div.content ul.events li.endorsed.brand div.description, -#activity div.content ul.events li.connected div.description, -#activity div.content ul.events li.sn_setup div.description, -#activity div.content ul.events li.new_comment.brand div.content, -#activity div.content ul.events li.replied_to div.content, -#activity div.content ul.events li.endorsed.brand div.content, -#activity div.content ul.events li.connected div.content, -#activity div.content ul.events li.sn_setup div.content { - margin-left: 96px; -} -#activity div.content ul.events li.replied_to div.content a.thumbnail, -#activity div.content ul.events li.replied_to div.content a.logo { - margin-top: 7px; -} -#activity div.content ul.events li.replied_to.ad div.content div.comment { - margin-left: 52px; -} -#activity div.content ul.events li.replied_to.brand div.content div.comment { - margin-left: 42px; -} -#activity div.content ul.events li.voted div.description span.action { - color: #eee; - padding: 0 3px; - white-space: nowrap; -} -#activity div.content ul.events li.voted.for div.description span.action { - background: #ffd9d9; -} -#activity div.content ul.events li.voted.against div.description span.action { - background: #ffd9d9; -} -#activity div.content ul.events li:first-child { - padding-top: 0; -} -#activity div.content ul.events li:last-child { - border-bottom: none; -} -/* Login/Register Modal */ -#login_register div.location_select, -#login_register div.location_search { - margin-left: 130px; -} -#login_register h3 small { - font-size: 14px; - font-weight: normal; - color: #eee; - text-align: left; - margin: 0; - display: block; -} -/* Contact Form in Pages */ -#pages_controller #sidebar #contact { - margin: 15px 0 0; -} -#pages_controller #sidebar #contact form label { - text-align: left; - float: none; - width: auto; - font-size: 12px; - font-weight: bold; - line-height: 1; - margin: 0 0 5px; -} -#pages_controller #sidebar #contact form p.submit.indent { - margin: 0; -} -#pages_controller #sidebar #contact form p.submit.indent span.with_cancel { - display: none; -} -/* Exclusive Offers */ -#offers div.content a.gift { - display: block; - text-align: center; -} -#offers div.content a.gift img { - height: 100px; -} -div.browse { - margin: 0 0 20px; -} -div.browse.class { - padding: 0; -} -div.browse div.header { - padding: 10px 10px 9px; - text-align: left; - background: #f01 url('/images/panel_header_bg.png') repeat-x top left; - border-bottom: 1px solid #a8000b; - line-height: 1; - height: 18px; - color: #eee; -} -div.browse div.header h3 { - font-size: 16px; - margin: 0; - color: #fff; -} -div.browse div.header span.filter { - float: left; - display: block; - overflow: hidden; - position: relative; - z-index: 5; -} -div.browse div.header span.filter a { - margin: 0 1px 0 0; - display: block; - float: left; - padding: 0 8px; - height: 18px; - font-weight: bold; - font-size: 10px; - line-height: 18px; - text-transform: uppercase; - background: url('/images/transparent_backgrounds/black_50.png'); - color: #eee; - text-decoration: none; - position: relative; - z-index: 3; -} -div.browse div.header span.filter a .active { - background: #fff; - color: #000; - z-index: 4; -} -div.browse div.header span.filter a .active :hover { - color: #000; -} -div.browse div.header span.filter a :hover { - color: #fff; -} -div.browse div.header span.filter a :last-child { - margin-right: 0; -} -div.browse div.header span.filter.dropdown { - margin: 0; - position: relative; - overflow: visible; -} -div.browse div.header span.filter.dropdown a { - background: #fff; - color: #000; - margin: 0; - position: relative; - padding-right: 25px; -} -div.browse div.header span.filter.dropdown a img { - float: left; - margin: 4px 5px 0 0; -} -div.browse div.header span.filter.dropdown a b.arrow { - float: right; - display: block; - height: 0; - width: 0; - border: 5px solid transparent; - border-top: 5px solid #000; - border-bottom: none; - position: absolute; - top: 6px; - right: 10px; -} -div.browse div.header span.filter.dropdown a :hover { - background: #000; - color: #fff; -} -div.browse div.header span.filter.dropdown a :hover b.arrow { - border-top: 5px solid #fff; -} -div.browse div.header span.filter.dropdown ul { - position: absolute; - top: 100%; - left: 0; - margin: 1px 0 0; - padding: 0; - background: #fff; -} -div.browse div.header span.filter.dropdown ul li { - list-style: none; - display: block; - padding: 0; - margin: 0; -} -div.browse div.header span.filter.dropdown ul li a { - display: block; - height: 18px; - line-height: 18px; - color: #000; - font-size: 10px; - text-transform: uppercase; - background: transparent; - border-bottom: 1px solid #f1f1f1; - float: none; - margin: 0; - white-space: nowrap; -} -div.browse div.header span.filter.dropdown ul li a :hover { - background: url('/images/transparent_backgrounds/accent_colour_25.png'); - color: #000; -} -div.browse div.header span.filter.dropdown ul li :last-child a { - border: none; -} -div.browse div.header span.filter.dropdown.sort { - float: left; - margin: 0 0 0 10px; -} -div.browse div.header span.filter.dropdown.localisation { - float: left; - margin: 0 0 0 10px; -} -div.browse div.header a.more { - float: right; - color: #fff; - font-size: 14px; - font-weight: bold; - position: relative; - top: 2px; -} -div.browse div.header a.more :hover { - text-decoration: none; -} -div.browse > ul { - margin: 0; - background: #fff; - padding: 10px 0 0 10px; - position: relative; -} -div.browse > ul li { - display: block; - float: left; - list-style: none; - margin: 0 10px 10px 0; - padding: 5px; - position: relative; - background: #fff; - width: 130px; - border: 1px solid #f7f7f7; -} -div.browse > ul li a.remove { - position: absolute; - height: 16px; - width: 16px; - padding: 3px; - background: #000; - display: none; - z-index: 3; - top: -8px; - right: -8px; -} -div.browse > ul li a.remove img { - vertical-align: middle; -} -div.browse > ul li div.thumbnail { - position: relative; - z-index: 3; -} -div.browse > ul li div.thumbnail .marker { - position: absolute; - padding: 2px; - z-index: 3; - background: url('/images/transparent_backgrounds/white_75.png'); - height: 12px; - width: 12px; -} -div.browse > ul li div.thumbnail .marker.coupon { - height: auto; - width: auto; - top: 10px; - right: -3px; - padding: 0; - background: transparent; - overflow: hidden; - position: absolute; -} -div.browse > ul li div.thumbnail .marker.coupon b { - display: block; - height: 0; - width: 0; - border: 14px solid transparent; - border-top: 14px solid #000; - border-bottom: none; - border-right: none; - float: left; -} -div.browse > ul li div.thumbnail .marker.coupon span { - color: #fff; - font-size: 10px; - font-weight: bold; - text-transform: uppercase; - height: 14px; - line-height: 14px; - display: block; - padding: 0 4px 0 2px; - background: #000; - margin: 0 0 0 14px; -} -div.browse > ul li div.thumbnail .marker.video { - position: absolute; - left: 50%; - top: 50%; - background: #fff; - width: 10px; - height: 10px; -} -div.browse > ul li div.thumbnail .marker.video b { - display: block; - width: 0; - height: 0; - border: 5px solid transparent; - border-left: 10px solid #000; - border-right: none; -} -div.browse > ul li div.thumbnail .marker.endorsed_by_me { - background: none; - padding: 0; - right: 0; - bottom: -32px; - background: #fff; -} -div.browse > ul li div.thumbnail a.thumbnail { - display: block; - overflow: hidden; - position: relative; - text-align: center; -} -div.browse > ul li div.thumbnail a.thumbnail img { - position: relative; - display: block; - margin: auto; -} -div.browse > ul li div.text { - margin: 3px 0 0; - display: block; -} -div.browse > ul li div.text a { - text-decoration: none; -} -div.browse > ul li div.text a.title { - display: block; - text-decoration: none; - font-weight: bold; - font-size: 12px; - line-height: 16px; - white-space: nowrap; - height: 16px; - overflow: hidden; -} -div.browse > ul li div.text a.title :before { - display: block; - height: 32px; - width: 20px; - content: " "; - float: right; - right: -15px; - top: -8px; - background: #fff; - position: relative; - z-index: 1; -} -div.browse > ul li div.text small { - font-size: 11px; - line-height: 13px; - color: #eee; - display: block; - height: 13px; - overflow: hidden; - white-space: nowrap; -} -div.browse > ul li div.text small a { - font-weight: bold; -} -div.browse > ul li div.text small :before { - display: block; - height: 32px; - width: 20px; - content: " "; - float: right; - right: -15px; - top: -8px; - background: #fff; - position: relative; - z-index: 1; -} -div.browse > ul li :hover { - background: #000; -} -div.browse > ul li :hover a.remove { - display: block; -} -div.browse > ul li :hover div.thumbnail a.marker.remove b, -div.browse > ul li :hover div.thumbnail a.marker.video b { - display: inline-block; -} -div.browse > ul li :hover div.text a { - color: #fff; -} -div.browse > ul li :hover div.text a.title:before { - background: #000; -} -div.browse > ul li :hover div.text small { - color: #bfbfbf; -} -div.browse > ul li :hover div.text small :before { - background: #000; -} -div.browse > ul li :hover div.footer a { - color: #fff; -} -div.browse > ul > li.ad div.thumbnail a.thumbnail { - width: 130px; - height: 97px; -} -div.browse > ul > li.ad div.thumbnail a.thumbnail img { - width: 100%; - height: 100%; -} -div.browse > ul > li.brand div.thumbnail a.thumbnail { - width: 120px; - height: 87px; - padding: 5px; - background: #fff; -} -div.browse > ul > li.brand div.thumbnail a.thumbnail img { - max-width: 120px; - max-height: 87px; -} -div.browse > ul li.paginate { - margin-bottom: 0; -} -div.browse > ul li.paginate a { - display: block; - position: relative; - text-decoration: none; - height: 131px; -} -div.browse > ul li.paginate a div.arrow { - background: #81c153 url('/images/button_bg.png') repeat-x left top; - border: 1px solid #000000; - height: 44px; - width: 44px; - margin: 0 auto; - position: relative; - top: 32px; -} -div.browse > ul li.paginate a div.arrow b { - text-indent: -9000px; - display: block; - border: 10px solid transparent; - width: 0; - height: 0; - position: relative; - top: 12px; -} -div.browse > ul li.paginate a div.label { - position: absolute; - bottom: 5px; - left: 0; - right: 0; - line-height: 13px; - color: #000000; - text-decoration: none; - font-weight: bold; - font-size: 12px; - text-align: center; -} -div.browse > ul li.paginate a :hover div.arrow { - background: #abd56e url('/images/button_bg.png') repeat-x left -44px; -} -div.browse > ul li.paginate :hover { - background: transparent; -} -div.browse > ul li.paginate.previous a div b { - border-right: 15px solid #fff; - border-left: none; - left: 12px; -} -div.browse > ul li.paginate.next a div b { - border-left: 15px solid #fff; - border-right: none; - left: 16px; -} -div.browse > div.footer { - padding: 9px 10px 10px; - background: #f2f2f2; - overflow: hidden; - border-top: 1px solid #eee; -} -div.browse > div.footer div.info { - float: left; - color: #eee; -} -div.browse > div.footer div.info strong { - color: #000; - font-weight: normal; -} -div.browse > div.footer div.pagination { - float: right; -} -div.browse > div.footer div.pagination > * { - display: inline-block; - line-height: 1; - padding: 0 6px; - line-height: 18px; - height: 18px; - background: #fff; - text-decoration: none; - font-weight: bold; - font-size: 10px; - text-transform: uppercase; -} -div.browse > div.footer div.pagination a { - color: #eee; -} -div.browse > div.footer div.pagination a:hover { - color: #000; -} -div.browse > div.footer div.pagination span.disabled { - color: #eee; -} -div.browse > div.footer div.pagination span.current { - color: #fff; - background: #f01; - border: none; -} -div.browse > div.footer div.pagination span.current:hover { - color: #fff; -} -div.browse.with_categories { - margin: 0 0 0 160px; -} -/* Browse List */ -div.browse.list > ul { - margin: 0; - min-height: 320px; - padding: 10px 0 0 10px; - overflow: hidden; -} -div.browse.list > ul > li { - display: block; - list-style: none; - margin: 0 10px 10px 0; - padding: 5px; - position: relative; - line-height: normal; -} -div.browse.list > ul > li .marker { - position: absolute; - padding: 2px; - background: url('/images/transparent_backgrounds/white_75.png'); -} -div.browse.list > ul > li .marker img { - height: 12px; - width: 12px; -} -div.browse.list > ul > li img.marker { - height: 12px; - width: 12px; -} -div.browse.list > ul > li span.marker.new { - color: black; - left: -5px; - top: -5px; - background: none; - background-color: #8f2e2e; - line-height: 1; - padding: 2px 5px; - font-weight: bold; -} -div.browse.list > ul > li a.marker.media_type { - display: inline-block; - text-decoration: none; - top: 39px; - left: 8px; - font-size: 10px; -} -div.browse.list > ul > li a.marker.media_type b { - font-weight: normal; - margin: 0 0 0 2px; - line-height: 1; - display: none; -} -div.browse.list > ul > li a.marker.media_type img { - vertical-align: middle; -} -div.browse.list > ul > li a.thumbnail { - float: left; - width: 68px; - display: block; - overflow: hidden; - border: 1px solid #eee; -} -div.browse.list > ul > li a.thumbnail :hover { - border-color: #000; -} -div.browse.list > ul > li span.title_brand { - display: block; - margin: 0 0 2px 75px; -} -div.browse.list > ul > li span.title_brand a { - margin: 0; - display: inline; -} -div.browse.list > ul > li span.title_brand a.brand_name { - font-weight: normal; - font-size: 12px; -} -div.browse.list > ul > li a.ad_title { - font-weight: bold; - font-size: 14px; - margin: 0 0 0 75px; - display: block; -} -div.browse.list > ul > li a.brand_name { - font-weight: bold; - font-size: 14px; - margin: 0 0 0 75px; - display: block; -} -div.browse.list > ul > li small { - display: block; - color: #eee; - margin: 0 0 0 75px; - font-size: 12px; -} -div.browse.list > ul > li small.brand_name { - display: inline; - margin: 0; -} -div.browse.list > ul > li ul.chart { - margin: 0 0 0 80px; - height: 39px; -} -div.browse.list > ul > li ul.networks { - margin: 3px 0 0 75px; - padding: 0; - overflow: hidden; -} -div.browse.list > ul > li ul.networks li { - display: block; - float: left; - margin: 0 5px 0 0; - line-height: 1; -} -div.browse.list > ul > li div.points { - display: none; - font-size: 12px; - text-align: right; -} -div.browse.list > ul > li div.points label { - color: #eee; -} -div.browse.list > ul > li a.remove { - bottom: -3px; - right: -3px; -} -div.browse.list > ul li.ad a.thumbnail { - height: 51px; -} -div.browse.list > ul li.ad span.title_brand small.brand_name { - display: block; -} -div.browse.list > ul li.brand a.thumbnail { - height: 68px; -} -div.browse.list.cols_2 > ul > li { - width: 285px; - float: left; -} -div.browse.list.cols_2 > ul > li :hover { - background: #fff; -} -div.browse.ads.list > ul > li { - height: 53px; -} -div.browse.ads.list > ul > li a.thumbnail { - height: 51px; -} -div.browse.brands.list > ul > li { - height: 68px; -} -div.browse.brands.list > ul > li a.thumbnail { - height: 66px; -} -/* Categories List */ -#categories { - margin: 40px 0 0; - width: 160px; - float: left; - position: relative; - z-index: 1; -} -#categories ul { - margin: 0; - padding: 10px 0 0; -} -#categories ul li { - list-style: none; - margin: 0; - padding: 0; - font-size: 14px; -} -#categories ul li a { - color: #eee; - display: block; - padding: 5px 10px 5px 15px; - text-decoration: none; -} -#categories ul li a:hover { - color: #000; - background: #fcfcfc; -} -#categories ul .all a { - font-weight: bold; -} -#categories ul .current a { - background: #fff; - color: #000; - border: 1px solid #fbfbfb; - border-right: none; - border-left: 5px solid #f01; - padding-left: 10px; -} -/* Ads > Show */ -#ad div.header { - overflow: hidden; -} -#ad div.header h3 { - font-size: 16px; - margin: 0 0 3px; -} -#ad div.header small a.category { - font-weight: bold; - color: #000; -} -#ad div.header small span.networks img { - position: relative; - top: 3px; -} -#ad div.header span.brand { - float: right; - color: #fff; -} -#ad div.header span.brand a.brand_name { - font-weight: bold; - color: #000; -} -#ad div.content { - padding: 0; - position: relative; -} -#ad div.content a.toggle_size { - display: block; - background-color: #000; - padding: 0 5px 0 26px; - background-position: 5px center; - background-repeat: no-repeat; - text-decoration: none; - margin: 5px 5px 0 0; - position: absolute; - top: 0; - right: 0; - line-height: 25px; - z-index: 45; -} -#ad div.content img.creative { - margin: 0 auto; - max-width: 540px; - display: block; -} -#ad div.content object { - position: relative; - z-index: 44; -} -#ad div.content object.video { - line-height: 0; - font-size: 0; -} -#ad div.content object embed { - position: relative; - z-index: 45; - line-height: 0; - font-size: 0; -} -#ad div.content.not_video { - padding: 40px; - text-align: center; -} -#ad div.content.not_video * { - margin-left: auto; - margin-right: auto; -} -#ad div.content.not_video object.flash { - margin-bottom: 0; -} -#ad div.footer { - padding: 0; -} -#ad div.footer div.vote_views { - padding: 5px 10px; - overflow: hidden; -} -#ad div.footer div.vote_views div.share { - float: right; - margin: 2px 0 0 0; -} -#ad div.footer div.vote_views #login_register_msg, -#ad div.footer div.vote_views #encourage_vote_msg { - line-height: 22px; - font-weight: bold; - color: #000; -} -#sidebar #meta table { - margin: 0; -} -#sidebar #meta table tr:last-child td { - padding-bottom: 0; -} -#sidebar #meta table td { - padding: 0 0 5px; -} -#sidebar #meta table td ul.networks { - margin: 0; - padding: 0; -} -#sidebar #meta table td ul.networks li { - list-style: none; - display: inline; -} -#sidebar #meta table td.label { - color: #eee; - white-space: nowrap; - width: 1%; - text-align: right; - padding-right: 5px; -} -/* Voting */ -div.voted { - font-size: 12px; - line-height: 22px; - color: #000; - display: inline-block; - font-weight: bold; -} -div.voted img { - float: left; - margin-right: 5px; - padding: 3px; -} -#voted_up img { - background: #cf0003; -} -#voted_down img { - background: #cf0003; -} -#encourage_comment { - display: inline-block; - line-height: 22px; - font-weight: bold; -} -#vote { - overflow: hidden; - font-size: 12px; - line-height: 22px; - color: #000; - float: left; -} -#vote a { - color: #fff; - font-weight: bold; - overflow: hidden; - display: block; - width: 16px; - text-decoration: none; - text-align: center; - font-size: 10px; - padding: 3px; - text-transform: uppercase; -} -#vote a.up { - float: left; - background: #cf0003; -} -#vote a.up :hover { - background: #ff0003; -} -#vote a.down { - float: left; - background: #cf0003; - margin: 0 5px 0 1px; -} -#vote a.down :hover { - background: #ff0003; -} -#vote.disabled a.up { - background: #e9cacb; -} -#vote.disabled a.up :hover { - background: #f2b3b3; -} -#vote.disabled a.down { - background: #e9cacb; -} -#vote.disabled a.down :hover { - background: #f2b3b3; -} -#sidebar #ads > ul li, -#sidebar #recommendations > ul li { - width: 81px; -} -#sidebar #ads > ul li div.thumbnail a.thumbnail, -#sidebar #recommendations > ul li div.thumbnail a.thumbnail { - height: 60px; - width: 81px; -} -#sidebar #ads > ul li div.text a.title, -#sidebar #recommendations > ul li div.text a.title { - font-size: 11px; - height: 14px; - line-height: 14px; -} -#sidebar #ads > ul li div.text small, -#sidebar #recommendations > ul li div.text small { - display: none; -} -#sidebar #brands > ul li { - width: 55px; -} -#sidebar #brands > ul li div.thumbnail a.thumbnail { - height: 45px; - width: 45px; -} -#sidebar #brands > ul li div.thumbnail a.thumbnail img { - max-height: 45px; - max-width: 45px; -} -#sidebar #brands > ul li div.text { - display: none; -} -/* My Account */ -#accounts_controller #top #page_title #page_options a.button.public_profile, -#accounts_controller #top #page_title #page_options a.btn.public_profile { - float: right; - font-size: 16px; - line-height: 1; - height: auto; - padding: 8px 35px 8px 15px; - position: relative; -} -#accounts_controller #top #page_title #page_options a.button.public_profile b.arrow, -#accounts_controller #top #page_title #page_options a.btn.public_profile b.arrow { - display: block; - height: 0; - width: 0; - position: absolute; - top: 10px; - right: 15px; - border: 6px solid transparent; - border-right: none; - border-left: 6px solid #fff; - margin: 0; -} -#accounts_controller #top #page_title #page_options a.button.goto_dashboard, -#accounts_controller #top #page_title #page_options a.btn.goto_dashboard { - float: right; - font-size: 16px; - line-height: 1; - height: auto; - padding: 8px 15px 8px 35px; - margin-right: 5px; - position: relative; -} -#accounts_controller #top #page_title #page_options a.button.goto_dashboard b.arrow, -#accounts_controller #top #page_title #page_options a.btn.goto_dashboard b.arrow { - display: block; - height: 0; - width: 0; - position: absolute; - top: 10px; - left: 15px; - border: 6px solid transparent; - border-left: none; - border-right: 6px solid #fff; - margin: 0; -} -#accounts_controller #account_nav { - float: left; - width: 200px; - margin: 0 20px 0 0; -} -#accounts_controller #account_nav ul.nav { - margin: 0; - padding: 0; -} -#accounts_controller #account_nav ul.nav li { - margin: 0 0 5px; - display: block; - list-style: none; - padding: 0; -} -#accounts_controller #account_nav ul.nav li a { - display: block; - height: 30px; - text-decoration: none; - color: #fff; -} -#accounts_controller #account_nav ul.nav li a b { - border: 15px solid transparent; - border-right: none; - border-left: 10px solid transparent; - width: 0; - height: 0; - float: right; - display: none; -} -#accounts_controller #account_nav ul.nav li a span { - background: #f01; - display: block; - line-height: 30px; - padding: 0 10px; - font-size: 14px; - font-weight: bold; - margin: 0 10px 0 0; -} -#accounts_controller #account_nav ul.nav li :hover a { - color: #fff; -} -#accounts_controller #account_nav ul.nav li :hover a b { - border-left-color: #f01; - display: block; -} -#accounts_controller #account_nav ul.nav li :hover a span { - background: #f01; -} -#accounts_controller #account_nav ul.nav li.current a b { - border-left-color: #000; - display: block; -} -#accounts_controller #account_nav ul.nav li.current a span { - background: #000; - color: #fff; -} -#accounts_controller #main > div { - margin: 0 0 20px; -} -#accounts_controller #main > div form { - margin: 0; -} -#accounts_controller #main #profile a.avatar { - float: left; - display: block; - width: 70px; - overflow: hidden; - position: relative; - text-decoration: none; -} -#accounts_controller #main #profile a.avatar img { - width: 100%; -} -#accounts_controller #main #profile a.avatar span { - display: block; - line-height: 1; - padding: 3px; - margin: 5px 0 0; - color: #fff; - background: #000; - text-align: center; - font-size: 10px; - font-weight: bold; - text-transform: uppercase; -} -#accounts_controller #main #profile form { - margin: 0 0 0 90px; -} -#accounts_controller #main #profile form h4 { - margin: 10px 0 20px; - border-bottom: 1px solid #f7f7f7; - padding: 0; - color: #f01; - font-size: 16px; -} -#accounts_controller #main #profile form ul.choices li { - width: 30%; -} -#accounts_controller #main #profile form div.extra { - margin-top: 20px; -} -#accounts_controller #main #networks ul { - margin: 0 -10px -10px 0; - padding: 0; - overflow: hidden; -} -#accounts_controller #main #networks ul li:hover { - background: #eee; - display: block; - float: left; - width: 180px; - padding: 10px; - margin: 0 10px 10px 0; - list-style: none; - position: relative; -} -#accounts_controller #main #networks ul li:hover * { - line-height: normal; -} -#accounts_controller #main #networks ul li:hover img { - vertical-align: middle; - float: left; -} -#accounts_controller #main #networks ul li:hover .name { - font-weight: bold; - font-size: 14px; - display: block; - margin: -2px 0 0 42px; -} -#accounts_controller #main #networks ul li:hover small { - font-size: 12px; - color: #eee; - display: block; - margin-left: 42px; -} -#accounts_controller #main #networks ul li:hover small strong { - color: #000; - font-weight: normal; -} -#accounts_controller #main #networks ul li.installed { - background: #fff; - border: 2px solid #000; - padding: 8px; -} -#accounts_controller #main #networks ul li.unavailable .name { - color: #000; -} -#accounts_controller #main #networks ul li.unavailable :hover { - background: #eee; -} -#accounts_controller #main #networks ul li:hover { - background: #f7f7f7; -} -/* Shopping Style Panel */ -#shopping_style div.header a.button.small, -#shopping_style div.header a.btn.small { - float: right; -} -#shopping_style div.content p { - margin: 0 0 10px; -} -#shopping_style div.content p label { - text-transform: uppercase; - font-size: 11px; - display: block; - color: #f01; - font-weight: bold; -} -#shopping_style div.content p span { - color: #000; -} -#shopping_style div.content p span.toggle { - white-space: nowrap; - color: #eee; -} -#shopping_style div.content p :last-child { - margin: 0; -} -#shopping_style div.content p.more { - text-align: left; - font-weight: normal; -} -#shopping_style div.content p.less { - display: none; - margin: 0; -} -/* People Controller */ -#people_controller.index #main div.panel { - float: left; - width: 300px; - margin: 0 20px 0 0; -} -#people_controller.index #main div.panel :last-child { - margin-right: 0; -} -#people_controller.show #content #shopping_style { - float: left; - width: 240px; - margin: 0 20px 0 0; -} -#people_controller.show #content #main { - width: 360px; -} -/* Search Results */ -#search_results { - margin: 0 0 20px; -} -#search_results li :hover small { - color: #bfbfbf; -} -#search div.content { - padding: 20px; -} -#search div.content form { - margin: 0; - float: none; -} -#search div.content form span.submit_and_options { - display: block; -} -#search div.content p { - margin: 0 0 15px; -} -#search div.content h4 { - font-weight: normal; - margin: 0 0 5px; -} -/* Recommendations */ -#recommendations div.browse { - margin: 0; - padding: 0; - background: none; -} -#recommendations div.browse ul { - min-height: 0; -} -/* Blank States */ -div.blank { - padding: 20px; - background: #f2e6e6; - position: relative; - border: 1px solid #e6ccce; - z-index: 1; -} -div.blank h4 { - font-size: 18px; - margin: 0 0 10px; -} -div.blank h4:last-child { - margin: 0; -} -div.blank p { - font-size: 16px; - margin: 0 0 10px; -} -div.blank p:last-child { - margin: 0; -} -div.blank p.with_list_number.large span { - margin-left: 48px; - display: block; - color: #fff; -} -div.blank p.earn span { - font-size: 22px; - color: #fff; - line-height: 48px; - font-weight: bold; -} -div.blank a { - white-space: nowrap; -} -div.blank a.hide { - position: absolute; - top: -5px; - right: -5px; - display: block; - height: 16px; - width: 16px; - padding: 3px; - background: #E7E9F6; -} -div.blank.small { - padding: 10px 20px; -} -div.blank.small h4 { - font-weight: normal; - font-size: 16px; -} -div.blank.small p { - margin: 0; -} -div.blank.tiny { - padding: 10px 20px; -} -div.blank.tiny h4 { - font-weight: normal; - font-size: 14px; -} -div.blank.tiny p { - margin: 0; - font-size: 12px; -} -div.blank.rounded { - margin: 0 0 20px; -} -div.blank.with_border_bottom { - border-bottom: 1px solid #e6ccce; -} -div.blank.no_border_top { - border-top: none; -} -div.blank.no_border_bottom { - border-bottom: none; -} -div.blank.no_side_borders { - border-right: none; - border-left: none; -} -div.panel div.blank { - padding: 10px 20px; - overflow: hidden; - margin: 0; -} -div.panel div.blank h4 { - font-weight: normal; - font-size: 14px; -} -div.panel div.blank p, -div.panel div.blank ul { - margin: 0 0 10px; - font-size: 12px; -} -div.panel div.blank p:last-child, -div.panel div.blank ul:last-child { - margin: 0; -} -#yelow #short { - color: #fea; -} -#yelow #long { - color: #ffeeaa; -} -#yelow #rgba { - color: rgba(255, 238, 170, 0.1); -} -#blue #short { - color: #00f; -} -#blue #long { - color: #0000ff; -} -#blue #rgba { - color: rgba(0, 0, 255, 0.1); -} -#overflow .a { - color: #000000; -} -#overflow .b { - color: #ffffff; -} -#overflow .c { - color: #ffffff; -} -#overflow .d { - color: #00ff00; -} -#grey { - color: #c8c8c8; -} -#808080 { - color: hsl(0, 0%, 50%); -} -#00ff00 { - color: hsl(120, 100%, 50%); -} -/******************\ -* * -* Comment Header * -* * -\******************/ -/* - - Comment - -*/ -/* - * Comment Test - * - * - cloudhead (http://cloudhead.net) - * - */ -/* Colors - * ------ - * #EDF8FC (background blue) - * #166C89 (darkest blue) - * - * Text: - * #333 (standard text) // A comment within a comment! - * #1F9EC9 (standard link) - * - */ -/* @group Variables -------------------- */ -#comments { - /**/ - color: red; - /* A C-style comment */ - background-color: orange; - font-size: 12px; - /* lost comment */ - content: 100%; - border: 1px solid black; - padding: 0; - margin: 2em; -} -/* commented out - #more-comments { - color: grey; - } -*/ -#last { - color: blue; -} -.comma-delimited { - background: url(http://localhost:8081/benchmark/bg.jpg) no-repeat, url(http://localhost:8081/benchmark/bg.png) repeat-x top left, url(http://localhost:8081/benchmark/bg); - text-shadow: -1px -1px 1px red, 6px 5px 5px yellow; - -moz-box-shadow: 0pt 0pt 2px rgba(255, 255, 255, 0.4) inset, 0pt 4px 6px rgba(255, 255, 255, 0.4) inset; -} -@font-face { - font-family: Headline; - src: local(Futura-Medium), url(http://localhost:8081/benchmark/fonts.svg#MyGeometricModern) format("svg"); -} -.other { - -moz-transform: translate(0, 11em) rotate(-90deg); -} -p:not([class*="lead"]) { - color: black; -} -input[type="text"].class#id[attr=32]:not(1) { - color: white; -} -div#id.class[a=1][b=2].class:not(1) { - color: white; -} -ul.comma > li:not(:only-child)::after { - color: white; -} -ol.comma > li:nth-last-child(2)::after { - color: white; -} -li:nth-child(4n+1), -li:nth-child(-5n), -li:nth-child(-n+2) { - color: white; -} -a[href^="http://"] { - color: black; -} -a[href$="http://"] { - color: black; -} -form[data-disabled] { - color: black; -} -p::before { - color: black; -} -div { - color: black; -} -div { - width: 99%; -} -* { - min-width: 45em; -} -h1, -h2 > a > p, -h3 { - color: none; -} -div.class { - color: blue; -} -div#id { - color: green; -} -.class#id { - color: purple; -} -.one.two.three { - color: grey; -} -@media print { - font-size: 3em; -} -@media screen { - font-size: 10px; -} -@font-face { - font-family: 'Garamond Pro'; - src: url("/fonts/garamond-pro.ttf"); -} -a:hover, -a:link { - color: #999; -} -p, -p:first-child { - text-transform: none; -} -q:lang(no) { - quotes: none; -} -p + h1 { - font-size: 2.2em; -} -#shorthands { - border: 1px solid #000; - font: 12px/16px Arial; - margin: 1px 0; - padding: 0 auto; - background: url("http://www.lesscss.org/spec.html") no-repeat 0 4px; -} -#more-shorthands { - margin: 0; - padding: 1px 0 2px 0; - font: normal small / 20px 'Trebuchet MS', Verdana, sans-serif; -} -.misc { - -moz-border-radius: 2px; - display: -moz-inline-stack; - width: 0.1em; - background-color: #009998; - background-image: url(http://localhost:8081/benchmark/images/image.jpg); - background: -webkit-gradient(linear, left top, left bottom, from(red), to(blue)); - margin: ; -} -#important { - color: red !important; - width: 100%!important; - height: 20px ! important; -} -#functions { - color: #ff0000; - width: increment(15); - height: undefined("self"); - border-width: add(2, 3); - variable: increment(10); -} -#built-in { - escaped: -Some::weird(#thing, y); - lighten: #ffffff; - darken: #000000; - saturate: #203c31; - desaturate: #29332f; - greyscale: #2e2e2e; - format: "rgb(32, 128, 64)"; - format-string: "hello world"; - eformat: rgb(32, 128, 64); -} -.lazy-eval { - width: 100%; -} -.two-args { - color: blue; - width: 10px; - height: 99%; - two: 2; - three: 3; - border: 2px dotted black; -} -.one-arg { - width: 15px; - height: 49%; - one: 1; - one-req: 1; - two: 2; - three: 3; -} -.no-parens { - border: 1px solid black; - width: 5px; - height: 49%; - zero: 0; - one: 1; - two: 2; - three: 3; -} -.no-args { - border: 1px solid black; - width: 5px; - height: 49%; - zero: 0; - one: 1; - two: 2; - three: 3; -} -.var-args { - width: 45; - height: 17%; - two: 2; - three: 3; -} -.multi-mix { - width: 10px; - height: 29%; - two: 2; - three: 3; - margin: 4; - padding: 5; -} -body { - padding: 30px; - color: #f00; -} -.scope-mix { - width: 8; -} -.content { - width: 600px; -} -.content .column { - margin: 600px; -} -.content .column { - margin: 600px; -} -.content .column { - margin: 600px; -} -#same-var-name { - radius: 5px; -} -#var-inside { - width: 10px; -} -.class .inner { - height: 300; -} -.class .inner .innest { - width: 30; - border-width: 60; -} -.class .inner { - height: 300; -} -.class .inner .innest { - width: 30; - border-width: 60; -} -.class .inner { - height: 300; -} -.class .inner .innest { - width: 30; - border-width: 60; -} -.zero { - border: 1px solid black; - width: 5px; - height: 49%; - zero: 0; - one: 1; - two: 2; - three: 3; -} -.one { - width: 5; - height: 49%; - one: 1; - one-req: 1; - two: 2; - three: 3; -} -.two { - width: 5; - height: 1%; - two: 2; - three: 3; -} -.three { - three-req: 3; - three: 3; -} -.left { - left: 1; -} -.right { - right: 1; -} -.border-right { - color: black; - border-right: 4px; -} -.border-left { - color: black; - border-left: 4px; -} -.only-right { - right: 33; -} -.only-left { - left: 33; -} -.left-right { - both: 330; -} -.mixin { - border: 1px solid black; -} -.mixout { - border-color: orange; -} -.borders { - border-style: dashed; -} -#namespace .borders { - border-style: dotted; -} -#namespace .biohazard { - content: "death"; -} -#namespace .biohazard .man { - color: transparent; -} -#theme > .mixin { - background-color: grey; -} -#container { - color: black; - border: 1px solid black; - width: 5px; - height: 49%; - zero: 0; - one: 1; - two: 2; - three: 3; - border-color: orange; - background-color: grey; -} -#header .milk { - color: white; - border: 1px solid black; - width: 5px; - height: 49%; - zero: 0; - one: 1; - two: 2; - three: 3; - background-color: grey; -} -#header #cookie { - border-style: dashed; -} -#header #cookie .chips { - border-style: dotted; -} -#header #cookie .chips .calories { - color: black; - border: 1px solid black; - width: 5px; - height: 49%; - zero: 0; - one: 1; - two: 2; - three: 3; - border-color: orange; - background-color: grey; -} -.secure-zone { - color: transparent; -} -.direct { - border-style: dotted; -} -#operations { - color: #111111; - height: 9px; - width: 3em; - subtraction: 0; - division: 1; -} -#operations .spacing { - height: 9px; - width: 3em; -} -.with-variables { - height: 20001%; - width: 10013%; - size: -9995cm; -} -.negative { - height: 30003px; - width: -29999px; -} -.shorthands { - padding: -1px 2px 0 -4px; -} -.colors { - color: #123; - border-color: #334455; - background-color: #000000; -} -.colors .other { - color: #222222; - border-color: #222222; -} -.parens { - border: 2px solid black; - margin: 1px 3px 16 3; - width: 36; - padding: 2px 36px; -} -.more-parens { - padding: 8 4 4 4px; - width: 96; - height: 113; - margin: 12; -} -.nested-parens { - width: 71; - height: 6; -} -.mixed-units { - margin: 2px 4em 1 5pc; - padding: 6px 1em 2px 2; -} -#first > .one { - font-size: 2em; -} -#first > .one > #second .two > #deux { - width: 50%; -} -#first > .one > #second .two > #deux #third { - height: 100%; -} -#first > .one > #second .two > #deux #third:focus { - color: black; -} -#first > .one > #second .two > #deux #third:focus #fifth > #sixth .seventh #eighth + #ninth { - color: purple; -} -#first > .one > #second .two > #deux #fourth, -#first > .one > #second .two > #deux #five, -#first > .one > #second .two > #deux #six { - color: #110000; -} -#first > .one > #second .two > #deux #fourth .seven, -#first > .one > #second .two > #deux #five .seven, -#first > .one > #second .two > #deux #six .seven, -#first > .one > #second .two > #deux #fourth .eight > #nine, -#first > .one > #second .two > #deux #five .eight > #nine, -#first > .one > #second .two > #deux #six .eight > #nine { - border: 1px solid black; -} -#first > .one > #second .two > #deux #fourth #ten, -#first > .one > #second .two > #deux #five #ten, -#first > .one > #second .two > #deux #six #ten { - color: red; -} -.tiny-scope { - color: #989; - border: 1px solid black; - width: 5px; - height: 49%; - zero: 0; - one: 1; - two: 2; - three: 3; -} -.scope1 { - color: 10000%; - border-color: black; -} -.scope1 .scope2 { - color: 10000%; -} -.scope1 .scope2 .scope3 { - color: red; - border-color: black; - background-color: white; -} -h1 a:hover, -h2 a:hover, -h3 a:hover, -h1 p:hover, -h2 p:hover, -h3 p:hover { - color: red; -} -#all { - color: blue; -} -#the { - color: blue; -} -#same { - color: blue; -} -ul, -li, -div, -q, -blockquote, -textarea { - margin: 0; -} -td { - margin: 0; - padding: 0; -} -td, -input { - line-height: 1em; -} -#strings { - background-image: url("http://son-of-a-banana.com"); - quotes: "~" "~"; - content: "#*%:&^,)!.(~*})"; - empty: ""; - brackets: "{" "}"; -} -#comments { - content: "/* hello */ // not-so-secret"; -} -#single-quote { - quotes: "'" "'"; - content: '""#!&""'; - empty: ''; -} -.variables { - width: 30002%; -} -.variables { - height: 11000%; - color: #888; - font-family: "Trebuchet MS", Verdana, sans-serif; - quotes: "~" "~"; -} -.redefinition { - three: 3; -} -.values { - font-family: 'Trebuchet', 'Trebuchet', 'Trebuchet'; -} -.whitespace { - color: white; -} -.whitespace { - color: white; -} -.whitespace { - color: white; -} -.whitespace { - color: white; -} -.whitespace { - color: white ; -} -.white, -.space, -.mania { - color: white; -} -.no-semi-column { - color: white; -} -.no-semi-column { - color: white; - white-space: pre; -} -.no-semi-column { - border: 2px solid white; -} -.newlines { - background: the, - great, - wall; - border: 2px - solid - black; -} -#yelow #short { - color: #fea; -} -#yelow #long { - color: #ffeeaa; -} -#yelow #rgba { - color: rgba(255, 238, 170, 0.1); -} -#blue #short { - color: #00f; -} -#blue #long { - color: #0000ff; -} -#blue #rgba { - color: rgba(0, 0, 255, 0.1); -} -#overflow .a { - color: #000000; -} -#overflow .b { - color: #ffffff; -} -#overflow .c { - color: #ffffff; -} -#overflow .d { - color: #00ff00; -} -#grey { - color: #c8c8c8; -} -#808080 { - color: hsl(0, 0%, 50%); -} -#00ff00 { - color: hsl(120, 100%, 50%); -} -/******************\ -* * -* Comment Header * -* * -\******************/ -/* - - Comment - -*/ -/* - * Comment Test - * - * - cloudhead (http://cloudhead.net) - * - */ -/* Colors - * ------ - * #EDF8FC (background blue) - * #166C89 (darkest blue) - * - * Text: - * #333 (standard text) // A comment within a comment! - * #1F9EC9 (standard link) - * - */ -/* @group Variables -------------------- */ -#comments { - /**/ - color: red; - /* A C-style comment */ - background-color: orange; - font-size: 12px; - /* lost comment */ - content: 100%; - border: 1px solid black; - padding: 0; - margin: 2em; -} -/* commented out - #more-comments { - color: grey; - } -*/ -#last { - color: blue; -} -.comma-delimited { - background: url(http://localhost:8081/benchmark/bg.jpg) no-repeat, url(http://localhost:8081/benchmark/bg.png) repeat-x top left, url(http://localhost:8081/benchmark/bg); - text-shadow: -1px -1px 1px red, 6px 5px 5px yellow; - -moz-box-shadow: 0pt 0pt 2px rgba(255, 255, 255, 0.4) inset, 0pt 4px 6px rgba(255, 255, 255, 0.4) inset; -} -@font-face { - font-family: Headline; - src: local(Futura-Medium), url(http://localhost:8081/benchmark/fonts.svg#MyGeometricModern) format("svg"); -} -.other { - -moz-transform: translate(0, 11em) rotate(-90deg); -} -p:not([class*="lead"]) { - color: black; -} -input[type="text"].class#id[attr=32]:not(1) { - color: white; -} -div#id.class[a=1][b=2].class:not(1) { - color: white; -} -ul.comma > li:not(:only-child)::after { - color: white; -} -ol.comma > li:nth-last-child(2)::after { - color: white; -} -li:nth-child(4n+1), -li:nth-child(-5n), -li:nth-child(-n+2) { - color: white; -} -a[href^="http://"] { - color: black; -} -a[href$="http://"] { - color: black; -} -form[data-disabled] { - color: black; -} -p::before { - color: black; -} -div { - color: black; -} -div { - width: 99%; -} -* { - min-width: 45em; -} -h1, -h2 > a > p, -h3 { - color: none; -} -div.class { - color: blue; -} -div#id { - color: green; -} -.class#id { - color: purple; -} -.one.two.three { - color: grey; -} -@media print { - font-size: 3em; -} -@media screen { - font-size: 10px; -} -@font-face { - font-family: 'Garamond Pro'; - src: url("/fonts/garamond-pro.ttf"); -} -a:hover, -a:link { - color: #999; -} -p, -p:first-child { - text-transform: none; -} -q:lang(no) { - quotes: none; -} -p + h1 { - font-size: 2.2em; -} -#shorthands { - border: 1px solid #000; - font: 12px/16px Arial; - margin: 1px 0; - padding: 0 auto; - background: url("http://www.lesscss.org/spec.html") no-repeat 0 4px; -} -#more-shorthands { - margin: 0; - padding: 1px 0 2px 0; - font: normal small / 20px 'Trebuchet MS', Verdana, sans-serif; -} -.misc { - -moz-border-radius: 2px; - display: -moz-inline-stack; - width: 0.1em; - background-color: #009998; - background-image: url(http://localhost:8081/benchmark/images/image.jpg); - background: -webkit-gradient(linear, left top, left bottom, from(red), to(blue)); - margin: ; -} -#important { - color: red !important; - width: 100%!important; - height: 20px ! important; -} -#functions { - color: #ff0000; - width: increment(15); - height: undefined("self"); - border-width: add(2, 3); - variable: increment(10); -} -#built-in { - escaped: -Some::weird(#thing, y); - lighten: #ffffff; - darken: #000000; - saturate: #203c31; - desaturate: #29332f; - greyscale: #2e2e2e; - format: "rgb(32, 128, 64)"; - format-string: "hello world"; - eformat: rgb(32, 128, 64); -} -.lazy-eval { - width: 100%; -} -.two-args { - color: blue; - width: 10px; - height: 99%; - two: 2; - three: 3; - border: 2px dotted black; -} -.one-arg { - width: 15px; - height: 49%; - one: 1; - one-req: 1; - two: 2; - three: 3; -} -.no-parens { - border: 1px solid black; - width: 5px; - height: 49%; - zero: 0; - one: 1; - two: 2; - three: 3; -} -.no-args { - border: 1px solid black; - width: 5px; - height: 49%; - zero: 0; - one: 1; - two: 2; - three: 3; -} -.var-args { - width: 45; - height: 17%; - two: 2; - three: 3; -} -.multi-mix { - width: 10px; - height: 29%; - two: 2; - three: 3; - margin: 4; - padding: 5; -} -body { - padding: 30px; - color: #f00; -} -.scope-mix { - width: 8; -} -.content { - width: 600px; -} -.content .column { - margin: 600px; -} -.content .column { - margin: 600px; -} -.content .column { - margin: 600px; -} -#same-var-name { - radius: 5px; -} -#var-inside { - width: 10px; -} -.class .inner { - height: 300; -} -.class .inner .innest { - width: 30; - border-width: 60; -} -.class .inner { - height: 300; -} -.class .inner .innest { - width: 30; - border-width: 60; -} -.class .inner { - height: 300; -} -.class .inner .innest { - width: 30; - border-width: 60; -} -.zero { - border: 1px solid black; - width: 5px; - height: 49%; - zero: 0; - one: 1; - two: 2; - three: 3; -} -.one { - width: 5; - height: 49%; - one: 1; - one-req: 1; - two: 2; - three: 3; -} -.two { - width: 5; - height: 1%; - two: 2; - three: 3; -} -.three { - three-req: 3; - three: 3; -} -.left { - left: 1; -} -.right { - right: 1; -} -.border-right { - color: black; - border-right: 4px; -} -.border-left { - color: black; - border-left: 4px; -} -.only-right { - right: 33; -} -.only-left { - left: 33; -} -.left-right { - both: 330; -} -.mixin { - border: 1px solid black; -} -.mixout { - border-color: orange; -} -.borders { - border-style: dashed; -} -#namespace .borders { - border-style: dotted; -} -#namespace .biohazard { - content: "death"; -} -#namespace .biohazard .man { - color: transparent; -} -#theme > .mixin { - background-color: grey; -} -#container { - color: black; - border: 1px solid black; - width: 5px; - height: 49%; - zero: 0; - one: 1; - two: 2; - three: 3; - border-color: orange; - background-color: grey; -} -#header .milk { - color: white; - border: 1px solid black; - width: 5px; - height: 49%; - zero: 0; - one: 1; - two: 2; - three: 3; - background-color: grey; -} -#header #cookie { - border-style: dashed; -} -#header #cookie .chips { - border-style: dotted; -} -#header #cookie .chips .calories { - color: black; - border: 1px solid black; - width: 5px; - height: 49%; - zero: 0; - one: 1; - two: 2; - three: 3; - border-color: orange; - background-color: grey; -} -.secure-zone { - color: transparent; -} -.direct { - border-style: dotted; -} -#operations { - color: #111111; - height: 9px; - width: 3em; - subtraction: 0; - division: 1; -} -#operations .spacing { - height: 9px; - width: 3em; -} -.with-variables { - height: 20001%; - width: 10013%; - size: -9995cm; -} -.negative { - height: 30003px; - width: -29999px; -} -.shorthands { - padding: -1px 2px 0 -4px; -} -.colors { - color: #123; - border-color: #334455; - background-color: #000000; -} -.colors .other { - color: #222222; - border-color: #222222; -} -.parens { - border: 2px solid black; - margin: 1px 3px 16 3; - width: 36; - padding: 2px 36px; -} -.more-parens { - padding: 8 4 4 4px; - width: 96; - height: 113; - margin: 12; -} -.nested-parens { - width: 71; - height: 6; -} -.mixed-units { - margin: 2px 4em 1 5pc; - padding: 6px 1em 2px 2; -} -#first > .one { - font-size: 2em; -} -#first > .one > #second .two > #deux { - width: 50%; -} -#first > .one > #second .two > #deux #third { - height: 100%; -} -#first > .one > #second .two > #deux #third:focus { - color: black; -} -#first > .one > #second .two > #deux #third:focus #fifth > #sixth .seventh #eighth + #ninth { - color: purple; -} -#first > .one > #second .two > #deux #fourth, -#first > .one > #second .two > #deux #five, -#first > .one > #second .two > #deux #six { - color: #110000; -} -#first > .one > #second .two > #deux #fourth .seven, -#first > .one > #second .two > #deux #five .seven, -#first > .one > #second .two > #deux #six .seven, -#first > .one > #second .two > #deux #fourth .eight > #nine, -#first > .one > #second .two > #deux #five .eight > #nine, -#first > .one > #second .two > #deux #six .eight > #nine { - border: 1px solid black; -} -#first > .one > #second .two > #deux #fourth #ten, -#first > .one > #second .two > #deux #five #ten, -#first > .one > #second .two > #deux #six #ten { - color: red; -} -.tiny-scope { - color: #989; - border: 1px solid black; - width: 5px; - height: 49%; - zero: 0; - one: 1; - two: 2; - three: 3; -} -.scope1 { - color: 10000%; - border-color: black; -} -.scope1 .scope2 { - color: 10000%; -} -.scope1 .scope2 .scope3 { - color: red; - border-color: black; - background-color: white; -} -h1 a:hover, -h2 a:hover, -h3 a:hover, -h1 p:hover, -h2 p:hover, -h3 p:hover { - color: red; -} -#all { - color: blue; -} -#the { - color: blue; -} -#same { - color: blue; -} -ul, -li, -div, -q, -blockquote, -textarea { - margin: 0; -} -td { - margin: 0; - padding: 0; -} -td, -input { - line-height: 1em; -} -#strings { - background-image: url("http://son-of-a-banana.com"); - quotes: "~" "~"; - content: "#*%:&^,)!.(~*})"; - empty: ""; - brackets: "{" "}"; -} -#comments { - content: "/* hello */ // not-so-secret"; -} -#single-quote { - quotes: "'" "'"; - content: '""#!&""'; - empty: ''; -} -.variables { - width: 30002%; -} -.variables { - height: 11000%; - color: #888; - font-family: "Trebuchet MS", Verdana, sans-serif; - quotes: "~" "~"; -} -.redefinition { - three: 3; -} -.values { - font-family: 'Trebuchet', 'Trebuchet', 'Trebuchet'; -} -.whitespace { - color: white; -} -.whitespace { - color: white; -} -.whitespace { - color: white; -} -.whitespace { - color: white; -} -.whitespace { - color: white ; -} -.white, -.space, -.mania { - color: white; -} -.no-semi-column { - color: white; -} -.no-semi-column { - color: white; - white-space: pre; -} -.no-semi-column { - border: 2px solid white; -} -.newlines { - background: the, - great, - wall; - border: 2px - solid - black; -} -#yelow #short { - color: #fea; -} -#yelow #long { - color: #ffeeaa; -} -#yelow #rgba { - color: rgba(255, 238, 170, 0.1); -} -#blue #short { - color: #00f; -} -#blue #long { - color: #0000ff; -} -#blue #rgba { - color: rgba(0, 0, 255, 0.1); -} -#overflow .a { - color: #000000; -} -#overflow .b { - color: #ffffff; -} -#overflow .c { - color: #ffffff; -} -#overflow .d { - color: #00ff00; -} -#grey { - color: #c8c8c8; -} -#808080 { - color: hsl(0, 0%, 50%); -} -#00ff00 { - color: hsl(120, 100%, 50%); -} -/******************\ -* * -* Comment Header * -* * -\******************/ -/* - - Comment - -*/ -/* - * Comment Test - * - * - cloudhead (http://cloudhead.net) - * - */ -/* Colors - * ------ - * #EDF8FC (background blue) - * #166C89 (darkest blue) - * - * Text: - * #333 (standard text) // A comment within a comment! - * #1F9EC9 (standard link) - * - */ -/* @group Variables -------------------- */ -#comments { - /**/ - color: red; - /* A C-style comment */ - background-color: orange; - font-size: 12px; - /* lost comment */ - content: 100%; - border: 1px solid black; - padding: 0; - margin: 2em; -} -/* commented out - #more-comments { - color: grey; - } -*/ -#last { - color: blue; -} -.comma-delimited { - background: url(http://localhost:8081/benchmark/bg.jpg) no-repeat, url(http://localhost:8081/benchmark/bg.png) repeat-x top left, url(http://localhost:8081/benchmark/bg); - text-shadow: -1px -1px 1px red, 6px 5px 5px yellow; - -moz-box-shadow: 0pt 0pt 2px rgba(255, 255, 255, 0.4) inset, 0pt 4px 6px rgba(255, 255, 255, 0.4) inset; -} -@font-face { - font-family: Headline; - src: local(Futura-Medium), url(http://localhost:8081/benchmark/fonts.svg#MyGeometricModern) format("svg"); -} -.other { - -moz-transform: translate(0, 11em) rotate(-90deg); -} -p:not([class*="lead"]) { - color: black; -} -input[type="text"].class#id[attr=32]:not(1) { - color: white; -} -div#id.class[a=1][b=2].class:not(1) { - color: white; -} -ul.comma > li:not(:only-child)::after { - color: white; -} -ol.comma > li:nth-last-child(2)::after { - color: white; -} -li:nth-child(4n+1), -li:nth-child(-5n), -li:nth-child(-n+2) { - color: white; -} -a[href^="http://"] { - color: black; -} -a[href$="http://"] { - color: black; -} -form[data-disabled] { - color: black; -} -p::before { - color: black; -} -div { - color: black; -} -div { - width: 99%; -} -* { - min-width: 45em; -} -h1, -h2 > a > p, -h3 { - color: none; -} -div.class { - color: blue; -} -div#id { - color: green; -} -.class#id { - color: purple; -} -.one.two.three { - color: grey; -} -@media print { - font-size: 3em; -} -@media screen { - font-size: 10px; -} -@font-face { - font-family: 'Garamond Pro'; - src: url("/fonts/garamond-pro.ttf"); -} -a:hover, -a:link { - color: #999; -} -p, -p:first-child { - text-transform: none; -} -q:lang(no) { - quotes: none; -} -p + h1 { - font-size: 2.2em; -} -#shorthands { - border: 1px solid #000; - font: 12px/16px Arial; - margin: 1px 0; - padding: 0 auto; - background: url("http://www.lesscss.org/spec.html") no-repeat 0 4px; -} -#more-shorthands { - margin: 0; - padding: 1px 0 2px 0; - font: normal small / 20px 'Trebuchet MS', Verdana, sans-serif; -} -.misc { - -moz-border-radius: 2px; - display: -moz-inline-stack; - width: 0.1em; - background-color: #009998; - background-image: url(http://localhost:8081/benchmark/images/image.jpg); - background: -webkit-gradient(linear, left top, left bottom, from(red), to(blue)); - margin: ; -} -#important { - color: red !important; - width: 100%!important; - height: 20px ! important; -} -#functions { - color: #ff0000; - width: increment(15); - height: undefined("self"); - border-width: add(2, 3); - variable: increment(10); -} -#built-in { - escaped: -Some::weird(#thing, y); - lighten: #ffffff; - darken: #000000; - saturate: #203c31; - desaturate: #29332f; - greyscale: #2e2e2e; - format: "rgb(32, 128, 64)"; - format-string: "hello world"; - eformat: rgb(32, 128, 64); -} -.lazy-eval { - width: 100%; -} -.two-args { - color: blue; - width: 10px; - height: 99%; - two: 2; - three: 3; - border: 2px dotted black; -} -.one-arg { - width: 15px; - height: 49%; - one: 1; - one-req: 1; - two: 2; - three: 3; -} -.no-parens { - border: 1px solid black; - width: 5px; - height: 49%; - zero: 0; - one: 1; - two: 2; - three: 3; -} -.no-args { - border: 1px solid black; - width: 5px; - height: 49%; - zero: 0; - one: 1; - two: 2; - three: 3; -} -.var-args { - width: 45; - height: 17%; - two: 2; - three: 3; -} -.multi-mix { - width: 10px; - height: 29%; - two: 2; - three: 3; - margin: 4; - padding: 5; -} -body { - padding: 30px; - color: #f00; -} -.scope-mix { - width: 8; -} -.content { - width: 600px; -} -.content .column { - margin: 600px; -} -.content .column { - margin: 600px; -} -.content .column { - margin: 600px; -} -#same-var-name { - radius: 5px; -} -#var-inside { - width: 10px; -} -.class .inner { - height: 300; -} -.class .inner .innest { - width: 30; - border-width: 60; -} -.class .inner { - height: 300; -} -.class .inner .innest { - width: 30; - border-width: 60; -} -.class .inner { - height: 300; -} -.class .inner .innest { - width: 30; - border-width: 60; -} -.zero { - border: 1px solid black; - width: 5px; - height: 49%; - zero: 0; - one: 1; - two: 2; - three: 3; -} -.one { - width: 5; - height: 49%; - one: 1; - one-req: 1; - two: 2; - three: 3; -} -.two { - width: 5; - height: 1%; - two: 2; - three: 3; -} -.three { - three-req: 3; - three: 3; -} diff --git a/packages/less/benchmark/benchmark.less b/packages/less/benchmark/benchmark.less index dfec2a6f1..997720578 100644 --- a/packages/less/benchmark/benchmark.less +++ b/packages/less/benchmark/benchmark.less @@ -2559,7 +2559,7 @@ body { width: 2 * 4-5em; } subtraction: 20 - 10 - 5 - 5; // 0 - division: 20 / 5 / 4; // 1 + division: (20 / 5 / 4); // 1 } @x: 4; @@ -2588,7 +2588,7 @@ body { background-color: #222222 - #fff; // #000000 .other { color: 2 * #111; // #222222 - border-color: #333333 / 3 + #111; // #222222 + border-color: (#333333 / 3) + #111; // #222222 } } .parens { @@ -2604,7 +2604,7 @@ body { padding: (2 * @var) 4 4 (@var * 1px); width: (@var * @var) * 6; height: (7 * 7) + (8 * 8); - margin: 4 * (5 + 5) / 2 - (@var * 2); + margin: 4 * ((5 + 5) / 2) - (@var * 2); //margin: (6 * 6)px; } @@ -3323,7 +3323,7 @@ body { width: 2 * 4-5em; } subtraction: 20 - 10 - 5 - 5; // 0 - division: 20 / 5 / 4; // 1 + division: (20 / 5 / 4); // 1 } @x: 4; @@ -3352,7 +3352,7 @@ body { background-color: #222222 - #fff; // #000000 .other { color: 2 * #111; // #222222 - border-color: #333333 / 3 + #111; // #222222 + border-color: (#333333 / 3) + #111; // #222222 } } .parens { @@ -3368,7 +3368,7 @@ body { padding: (2 * @var) 4 4 (@var * 1px); width: (@var * @var) * 6; height: (7 * 7) + (8 * 8); - margin: 4 * (5 + 5) / 2 - (@var * 2); + margin: 4 * ((5 + 5) / 2) - (@var * 2); //margin: (6 * 6)px; } diff --git a/packages/less/benchmark/browseroptions.js b/packages/less/benchmark/browseroptions.js deleted file mode 100644 index 8728e4d00..000000000 --- a/packages/less/benchmark/browseroptions.js +++ /dev/null @@ -1,4 +0,0 @@ -var less = { - logLevel: 4, - rewriteUrls: 0 -}; \ No newline at end of file diff --git a/packages/less/benchmark/browserspec.js b/packages/less/benchmark/browserspec.js deleted file mode 100644 index e8468905e..000000000 --- a/packages/less/benchmark/browserspec.js +++ /dev/null @@ -1,3 +0,0 @@ -describe('Benchmark', function() { - testLessEqualsInDocument(); -}); From 3b4a38508712229be04facc6cee137c25cf90968 Mon Sep 17 00:00:00 2001 From: Matthew Dean Date: Tue, 8 Dec 2020 16:36:39 -0800 Subject: [PATCH 16/19] Fix linting issues --- packages/less/Gruntfile.js | 2 +- packages/less/src/less/constants.js | 2 +- packages/less/src/less/transform-tree.js | 10 ++++----- packages/less/src/less/tree/color.js | 6 ++--- packages/less/src/less/tree/debug-info.js | 10 ++++----- packages/less/src/less/tree/dimension.js | 3 ++- packages/less/src/less/tree/mixin-call.js | 22 +++++++++---------- packages/less/src/less/tree/ruleset.js | 2 +- .../src/less/visitors/import-sequencer.js | 10 ++++----- .../less/src/less/visitors/import-visitor.js | 6 ++++- 10 files changed, 39 insertions(+), 34 deletions(-) diff --git a/packages/less/Gruntfile.js b/packages/less/Gruntfile.js index 7e2817367..83b06a5c8 100644 --- a/packages/less/Gruntfile.js +++ b/packages/less/Gruntfile.js @@ -283,7 +283,7 @@ module.exports = function(grunt) { eslint: { target: [ "test/**/*.js", - "lib/less*/**/*.js", + "src/less*/**/*.js", "!test/less/errors/plugin/plugin-error.js" ], options: { diff --git a/packages/less/src/less/constants.js b/packages/less/src/less/constants.js index 635583ae7..d095fc246 100644 --- a/packages/less/src/less/constants.js +++ b/packages/less/src/less/constants.js @@ -2,7 +2,7 @@ export const Math = { ALWAYS: 0, PARENS_DIVISION: 1, - PARENS: 2, + PARENS: 2 // removed - STRICT_LEGACY: 3 }; diff --git a/packages/less/src/less/transform-tree.js b/packages/less/src/less/transform-tree.js index f2197f2c4..92479b73c 100644 --- a/packages/less/src/less/transform-tree.js +++ b/packages/less/src/less/transform-tree.js @@ -37,11 +37,11 @@ export default function(root, options) { } const visitors = [ - new visitor.JoinSelectorVisitor(), - new visitor.MarkVisibleSelectorsVisitor(true), - new visitor.ExtendVisitor(), - new visitor.ToCSSVisitor({compress: Boolean(options.compress)}) - ]; + new visitor.JoinSelectorVisitor(), + new visitor.MarkVisibleSelectorsVisitor(true), + new visitor.ExtendVisitor(), + new visitor.ToCSSVisitor({compress: Boolean(options.compress)}) + ]; const preEvalVisitors = []; let v; diff --git a/packages/less/src/less/tree/color.js b/packages/less/src/less/tree/color.js index bdfbeaaeb..df068a59f 100644 --- a/packages/less/src/less/tree/color.js +++ b/packages/less/src/less/tree/color.js @@ -231,9 +231,9 @@ function clamp(v, max) { function toHex(v) { return `#${v.map(function (c) { - c = clamp(Math.round(c), 255); - return (c < 16 ? '0' : '') + c.toString(16); -}).join('')}`; + c = clamp(Math.round(c), 255); + return (c < 16 ? '0' : '') + c.toString(16); + }).join('')}`; } export default Color; diff --git a/packages/less/src/less/tree/debug-info.js b/packages/less/src/less/tree/debug-info.js index 654f16168..e23472190 100644 --- a/packages/less/src/less/tree/debug-info.js +++ b/packages/less/src/less/tree/debug-info.js @@ -27,11 +27,11 @@ class debugInfo { filenameWithProtocol = `file://${filenameWithProtocol}`; } return `@media -sass-debug-info{filename{font-family:${filenameWithProtocol.replace(/([.:\/\\])/g, function (a) { - if (a == '\\') { - a = '\/'; - } - return `\\${a}`; -})}}line{font-family:\\00003${ctx.debugInfo.lineNumber}}}\n`; + if (a == '\\') { + a = '\/'; + } + return `\\${a}`; + })}}line{font-family:\\00003${ctx.debugInfo.lineNumber}}}\n`; } } diff --git a/packages/less/src/less/tree/dimension.js b/packages/less/src/less/tree/dimension.js index ce7a37ef5..80e4a0607 100644 --- a/packages/less/src/less/tree/dimension.js +++ b/packages/less/src/less/tree/dimension.js @@ -80,7 +80,8 @@ Dimension.prototype = Object.assign(new Node(), { other = other.convertTo(this.unit.usedUnits()); if (context.strictUnits && other.unit.toString() !== unit.toString()) { - throw new Error(`Incompatible units. Change the units or use the unit function. Bad units: '${unit.toString()}' and '${other.unit.toString()}'.`); + throw new Error(`Incompatible units. Change the units or use the unit function. ` + + `Bad units: '${unit.toString()}' and '${other.unit.toString()}'.`); } value = this._operate(context, op, this.value, other.value); diff --git a/packages/less/src/less/tree/mixin-call.js b/packages/less/src/less/tree/mixin-call.js index 78cbf790e..36e6b41ff 100644 --- a/packages/less/src/less/tree/mixin-call.js +++ b/packages/less/src/less/tree/mixin-call.js @@ -194,17 +194,17 @@ MixinCall.prototype = Object.assign(new Node(), { format(args) { return `${this.selector.toCSS().trim()}(${args ? args.map(function (a) { - let argValue = ''; - if (a.name) { - argValue += `${a.name}:`; - } - if (a.value.toCSS) { - argValue += a.value.toCSS(); - } else { - argValue += '???'; - } - return argValue; - }).join(', ') : ''})`; + let argValue = ''; + if (a.name) { + argValue += `${a.name}:`; + } + if (a.value.toCSS) { + argValue += a.value.toCSS(); + } else { + argValue += '???'; + } + return argValue; + }).join(', ') : ''})`; } }); diff --git a/packages/less/src/less/tree/ruleset.js b/packages/less/src/less/tree/ruleset.js index 3688ebffe..22f68b75c 100644 --- a/packages/less/src/less/tree/ruleset.js +++ b/packages/less/src/less/tree/ruleset.js @@ -459,7 +459,7 @@ Ruleset.prototype = Object.assign(new Node(), { let ruleNodes = []; let // Line number debugging - debugInfo; + debugInfo; let rule; let path; diff --git a/packages/less/src/less/visitors/import-sequencer.js b/packages/less/src/less/visitors/import-sequencer.js index c2ddcc6e2..dc5d56430 100644 --- a/packages/less/src/less/visitors/import-sequencer.js +++ b/packages/less/src/less/visitors/import-sequencer.js @@ -8,11 +8,11 @@ class ImportSequencer { addImport(callback) { const importSequencer = this, - importItem = { - callback, - args: null, - isReady: false - }; + importItem = { + callback, + args: null, + isReady: false + }; this.imports.push(importItem); return function() { importItem.args = Array.prototype.slice.call(arguments, 0); diff --git a/packages/less/src/less/visitors/import-visitor.js b/packages/less/src/less/visitors/import-visitor.js index d177c434d..1f102d85f 100644 --- a/packages/less/src/less/visitors/import-visitor.js +++ b/packages/less/src/less/visitors/import-visitor.js @@ -101,7 +101,11 @@ ImportVisitor.prototype = { this.error = e; } - const importVisitor = this, inlineCSS = importNode.options.inline, isPlugin = importNode.options.isPlugin, isOptional = importNode.options.optional, duplicateImport = importedAtRoot || fullPath in importVisitor.recursionDetector; + const importVisitor = this, + inlineCSS = importNode.options.inline, + isPlugin = importNode.options.isPlugin, + isOptional = importNode.options.optional, + duplicateImport = importedAtRoot || fullPath in importVisitor.recursionDetector; if (!context.importMultiple) { if (duplicateImport) { From 4304557747f7922d5e3b2d244c375aa1e67876aa Mon Sep 17 00:00:00 2001 From: Matthew Dean Date: Sat, 12 Dec 2020 11:45:40 -0800 Subject: [PATCH 17/19] Update lock file --- packages/less/package-lock.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/less/package-lock.json b/packages/less/package-lock.json index 331a84616..0e27fee1b 100644 --- a/packages/less/package-lock.json +++ b/packages/less/package-lock.json @@ -1,10 +1,6 @@ { "name": "less", -<<<<<<< HEAD "version": "4.0.0", -======= - "version": "3.13.0", ->>>>>>> master "lockfileVersion": 1, "requires": true, "dependencies": { From e0edcb78f844403c6c2b722ecdd49499c139b68e Mon Sep 17 00:00:00 2001 From: Matthew Dean Date: Sat, 12 Dec 2020 14:30:29 -0800 Subject: [PATCH 18/19] Add isdefined() function --- packages/less/src/less/functions/boolean.js | 15 +++++++++++++-- packages/test-data/css/_main/functions.css | 2 ++ packages/test-data/less/_main/functions.less | 2 ++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/packages/less/src/less/functions/boolean.js b/packages/less/src/less/functions/boolean.js index 981fce8c8..e483bbb23 100644 --- a/packages/less/src/less/functions/boolean.js +++ b/packages/less/src/less/functions/boolean.js @@ -13,6 +13,17 @@ function If(context, condition, trueValue, falseValue) { return condition.eval(context) ? trueValue.eval(context) : (falseValue ? falseValue.eval(context) : new Anonymous); } -If.evalArgs = false +If.evalArgs = false; -export default { boolean, 'if': If }; +function isdefined(context, variable) { + try { + variable.eval(context); + return Keyword.True; + } catch (e) { + return Keyword.False; + } +} + +isdefined.evalArgs = false; + +export default { isdefined, boolean, 'if': If }; diff --git a/packages/test-data/css/_main/functions.css b/packages/test-data/css/_main/functions.css index 83a8e85af..56ab9ea02 100644 --- a/packages/test-data/css/_main/functions.css +++ b/packages/test-data/css/_main/functions.css @@ -140,6 +140,8 @@ mixt: rgba(255, 0, 0, 0.5); } #built-in .is-a { + rules-defined: true; + foo-defined: false; ruleset: true; color: true; color1: true; diff --git a/packages/test-data/less/_main/functions.less b/packages/test-data/less/_main/functions.less index c486cc4e8..bad7b5cdb 100644 --- a/packages/test-data/less/_main/functions.less +++ b/packages/test-data/less/_main/functions.less @@ -153,6 +153,8 @@ @rules: { color: red; }; + rules-defined: isdefined(@rules); + foo-defined: isdefined(@foo); ruleset: isruleset(@rules); color: iscolor(#ddd); color1: iscolor(red); From 8fa48a999c8515c0c34f66d8c8ea2c89bf1a8650 Mon Sep 17 00:00:00 2001 From: Matthew Dean Date: Fri, 18 Dec 2020 09:13:12 -0800 Subject: [PATCH 19/19] Get Less version from package.json --- dist/less.js | 21 +++++++++++++++- dist/less.min.js | 2 +- dist/less.min.js.map | 2 +- packages/less/build/rollup.js | 2 ++ packages/less/dist/less.js | 21 +++++++++++++++- packages/less/dist/less.min.js | 2 +- packages/less/dist/less.min.js.map | 2 +- packages/less/package-lock.json | 39 ++++++++++++++++++++++++++++++ packages/less/package.json | 2 ++ packages/less/src/less/index.js | 5 +++- 10 files changed, 91 insertions(+), 7 deletions(-) diff --git a/dist/less.js b/dist/less.js index d878afe48..e71e5fc5b 100644 --- a/dist/less.js +++ b/dist/less.js @@ -10511,6 +10511,24 @@ return render; } + var version = "4.0.0"; + + function parseNodeVersion(version) { + var match = version.match(/^v(\d{1,2})\.(\d{1,2})\.(\d{1,2})(?:-([0-9A-Za-z-.]+))?(?:\+([0-9A-Za-z-.]+))?$/); // eslint-disable-line max-len + if (!match) { + throw new Error('Unable to parse: ' + version); + } + var res = { + major: parseInt(match[1], 10), + minor: parseInt(match[2], 10), + patch: parseInt(match[3], 10), + pre: match[4] || '', + build: match[5] || '', + }; + return res; + } + var parseNodeVersion_1 = parseNodeVersion; + function lessRoot (environment, fileManagers) { var sourceMapOutput, sourceMapBuilder, parseTree, importManager; environment = new Environment(environment, fileManagers); @@ -10520,8 +10538,9 @@ importManager = ImportManager(environment); var render = Render(environment, parseTree); var parse = Parse(environment, parseTree, importManager); + var v = parseNodeVersion_1(version); var initial = { - version: [4, 0, 0], + version: [v.major, v.minor, v.patch], data: data, tree: tree, Environment: Environment, diff --git a/dist/less.min.js b/dist/less.min.js index a474c6d97..050af49bb 100644 --- a/dist/less.min.js +++ b/dist/less.min.js @@ -7,5 +7,5 @@ * * @license Apache-2.0 */ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).less=t()}(this,(function(){"use strict";function e(e){return e.replace(/^[a-z-]+:\/+?[^\/]+/,"").replace(/[\?\&]livereload=\w+/,"").replace(/^\//,"").replace(/\.[a-zA-Z]+$/,"").replace(/[^\.\w-]+/g,"-").replace(/\./g,":")}function t(e,t){for(var i in t.dataset)if(t.dataset.hasOwnProperty(i))if("env"===i||"dumpLineNumbers"===i||"rootpath"===i||"errorReporting"===i)e[i]=t.dataset[i];else try{e[i]=JSON.parse(t.dataset[i])}catch(e){}}var i=function(t,i,n){var r=n.href||"",s="less:"+(n.title||e(r)),o=t.getElementById(s),a=!1,l=t.createElement("style");l.setAttribute("type","text/css"),n.media&&l.setAttribute("media",n.media),l.id=s,l.styleSheet||(l.appendChild(t.createTextNode(i)),a=null!==o&&o.childNodes.length>0&&l.childNodes.length>0&&o.firstChild.nodeValue===l.firstChild.nodeValue);var u=t.getElementsByTagName("head")[0];if(null===o||!1===a){var c=n&&n.nextSibling||null;c?c.parentNode.insertBefore(l,c):u.appendChild(l)}if(o&&!1===a&&o.parentNode.removeChild(o),l.styleSheet)try{l.styleSheet.cssText=i}catch(e){throw new Error("Couldn't reassign styleSheet.cssText.")}},n=function(e){var t,i=e.document;return i.currentScript||(t=i.getElementsByTagName("script"))[t.length-1]},r={error:function(e){this._fireEvent("error",e)},warn:function(e){this._fireEvent("warn",e)},info:function(e){this._fireEvent("info",e)},debug:function(e){this._fireEvent("debug",e)},addListener:function(e){this._listeners.push(e)},removeListener:function(e){for(var t=0;t=0;a--){var l=o[a];if(l[s?"supportsSync":"supports"](e,t,i,n))return l}return null},e.prototype.addFileManager=function(e){this.fileManagers.push(e)},e.prototype.clearFileManagers=function(){this.fileManagers=[]},e}(),o={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",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:"#ff00ff",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:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",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:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",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:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},a={length:{m:1,cm:.01,mm:.001,in:.0254,px:.0254/96,pt:.0254/72,pc:.0254/72*12},duration:{s:1,ms:.001},angle:{rad:1/(2*Math.PI),deg:1/360,grad:1/400,turn:1}},l={colors:o,unitConversions:a},u=function(){function e(){this.parent=null,this.visibilityBlocks=void 0,this.nodeVisible=void 0,this.rootNode=null,this.parsed=null;var e=this;Object.defineProperty(this,"currentFileInfo",{get:function(){return e.fileInfo()}}),Object.defineProperty(this,"index",{get:function(){return e.getIndex()}})}return e.prototype.setParent=function(t,i){function n(t){t&&t instanceof e&&(t.parent=i)}Array.isArray(t)?t.forEach(n):n(t)},e.prototype.getIndex=function(){return this._index||this.parent&&this.parent.getIndex()||0},e.prototype.fileInfo=function(){return this._fileInfo||this.parent&&this.parent.fileInfo()||{}},e.prototype.isRulesetLike=function(){return!1},e.prototype.toCSS=function(e){var t=[];return this.genCSS(e,{add:function(e,i,n){t.push(e)},isEmpty:function(){return 0===t.length}}),t.join("")},e.prototype.genCSS=function(e,t){t.add(this.value)},e.prototype.accept=function(e){this.value=e.visit(this.value)},e.prototype.eval=function(){return this},e.prototype._operate=function(e,t,i,n){switch(t){case"+":return i+n;case"-":return i-n;case"*":return i*n;case"/":return i/n}},e.prototype.fround=function(e,t){var i=e&&e.numPrecision;return i?Number((t+2e-16).toFixed(i)):t},e.compare=function(t,i){if(t.compare&&"Quoted"!==i.type&&"Anonymous"!==i.type)return t.compare(i);if(i.compare)return-i.compare(t);if(t.type===i.type){if(t=t.value,i=i.value,!Array.isArray(t))return t===i?0:void 0;if(t.length===i.length){for(var n=0;nt?1:void 0},e.prototype.blocksVisibility=function(){return null==this.visibilityBlocks&&(this.visibilityBlocks=0),0!==this.visibilityBlocks},e.prototype.addVisibilityBlock=function(){null==this.visibilityBlocks&&(this.visibilityBlocks=0),this.visibilityBlocks=this.visibilityBlocks+1},e.prototype.removeVisibilityBlock=function(){null==this.visibilityBlocks&&(this.visibilityBlocks=0),this.visibilityBlocks=this.visibilityBlocks-1},e.prototype.ensureVisibility=function(){this.nodeVisible=!0},e.prototype.ensureInvisibility=function(){this.nodeVisible=!1},e.prototype.isVisible=function(){return this.nodeVisible},e.prototype.visibilityInfo=function(){return{visibilityBlocks:this.visibilityBlocks,nodeVisible:this.nodeVisible}},e.prototype.copyVisibilityInfo=function(e){e&&(this.visibilityBlocks=e.visibilityBlocks,this.nodeVisible=e.nodeVisible)},e}(),c=function(e,t,i){var n=this;Array.isArray(e)?this.rgb=e:e.length>=6?(this.rgb=[],e.match(/.{2}/g).map((function(e,t){t<3?n.rgb.push(parseInt(e,16)):n.alpha=parseInt(e,16)/255}))):(this.rgb=[],e.split("").map((function(e,t){t<3?n.rgb.push(parseInt(e+e,16)):n.alpha=parseInt(e+e,16)/255}))),this.alpha=this.alpha||("number"==typeof t?t:1),void 0!==i&&(this.value=i)};function h(e,t){return Math.min(Math.max(e,0),t)}function f(e){return"#"+e.map((function(e){return((e=h(Math.round(e),255))<16?"0":"")+e.toString(16)})).join("")}c.prototype=Object.assign(new u,{type:"Color",luma:function(){var e=this.rgb[0]/255,t=this.rgb[1]/255,i=this.rgb[2]/255;return.2126*(e=e<=.03928?e/12.92:Math.pow((e+.055)/1.055,2.4))+.7152*(t=t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4))+.0722*(i=i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4))},genCSS:function(e,t){t.add(this.toCSS(e))},toCSS:function(e,t){var i,n,r,s=e&&e.compress&&!t,o=[];if(n=this.fround(e,this.alpha),this.value)if(0===this.value.indexOf("rgb"))n<1&&(r="rgba");else{if(0!==this.value.indexOf("hsl"))return this.value;r=n<1?"hsla":"hsl"}else n<1&&(r="rgba");switch(r){case"rgba":o=this.rgb.map((function(e){return h(Math.round(e),255)})).concat(h(n,1));break;case"hsla":o.push(h(n,1));case"hsl":i=this.toHSL(),o=[this.fround(e,i.h),this.fround(e,100*i.s)+"%",this.fround(e,100*i.l)+"%"].concat(o)}if(r)return r+"("+o.join(","+(s?"":" "))+")";if(i=this.toRGB(),s){var a=i.split("");a[1]===a[2]&&a[3]===a[4]&&a[5]===a[6]&&(i="#"+a[1]+a[3]+a[5])}return i},operate:function(e,t,i){for(var n=new Array(3),r=this.alpha*(1-i.alpha)+i.alpha,s=0;s<3;s++)n[s]=this._operate(e,t,this.rgb[s],i.rgb[s]);return new c(n,r)},toRGB:function(){return f(this.rgb)},toHSL:function(){var e,t,i=this.rgb[0]/255,n=this.rgb[1]/255,r=this.rgb[2]/255,s=this.alpha,o=Math.max(i,n,r),a=Math.min(i,n,r),l=(o+a)/2,u=o-a;if(o===a)e=t=0;else{switch(t=l>.5?u/(2-o-a):u/(o+a),o){case i:e=(n-r)/u+(n=0&&"\n"!==t.charAt(i);)r++;return"number"==typeof e&&(n=(t.slice(0,e).match(/\n/g)||"").length),{line:n,column:r}}function k(e){var t,i=e.length,n=new Array(i);for(t=0;t|Function):(\d+):(\d+)/,O=function(e,t,i){Error.call(this);var n=e.filename||i;if(this.message=e.message,this.stack=e.stack,t&&n){var r=t.contents[n],s=C(e.index,r),o=s.line,a=s.column,l=e.call&&C(e.call,r).line,u=r?r.split("\n"):"";if(this.type=e.type||"Syntax",this.filename=n,this.index=e.index,this.line="number"==typeof o?o+1:null,this.column=a,!this.line&&this.stack){var c=this.stack.match(R),h=new Function("a","throw new Error()"),f=0;try{h()}catch(e){var p=e.stack.match(R);f=1-(o=parseInt(p[2]))}c&&(c[2]&&(this.line=parseInt(c[2])+f),c[3]&&(this.column=parseInt(c[3])))}this.callLine=l+1,this.callExtract=u[l],this.extract=[u[this.line-2],u[this.line-1],u[this.line]]}};if(void 0===Object.create){var V=function(){};V.prototype=Error.prototype,O.prototype=new V}else O.prototype=Object.create(Error.prototype);O.prototype.constructor=O,O.prototype.toString=function(e){e=e||{};var t="",i=this.extract||[],n=[],r=function(e){return e};if(e.stylize){var s=typeof e.stylize;if("function"!==s)throw Error("options.stylize should be a function, got a "+s+"!");r=e.stylize}if(null!==this.line){if("string"==typeof i[0]&&n.push(r(this.line-1+" "+i[0],"grey")),"string"==typeof i[1]){var o=this.line+" ";i[1]&&(o+=i[1].slice(0,this.column)+r(r(r(i[1].substr(this.column,1),"bold")+i[1].slice(this.column+1),"red"),"inverse")),n.push(o)}"string"==typeof i[2]&&n.push(r(this.line+1+" "+i[2],"grey")),n=n.join("\n")+r("","reset")+"\n"}return t+=r(this.type+"Error: "+this.message,"red"),this.filename&&(t+=r(" in ","red")+this.filename),this.line&&(t+=r(" on line "+this.line+", column "+(this.column+1)+":","grey")),t+="\n"+n,this.callLine&&(t+=r("from ","red")+(this.filename||"")+"/n",t+=r(this.callLine,"grey")+" "+this.callExtract+"/n"),t};var F=function(e,t,i,n,r,s){this.extendList=t,this.condition=i,this.evaldCondition=!i,this._index=n,this._fileInfo=r,this.elements=this.getElements(e),this.mixinElements_=void 0,this.copyVisibilityInfo(s),this.setParent(this.elements,this)};F.prototype=Object.assign(new u,{type:"Selector",accept:function(e){this.elements&&(this.elements=e.visitArray(this.elements)),this.extendList&&(this.extendList=e.visitArray(this.extendList)),this.condition&&(this.condition=e.visit(this.condition))},createDerived:function(e,t,i){e=this.getElements(e);var n=new F(e,t||this.extendList,null,this.getIndex(),this.fileInfo(),this.visibilityInfo());return n.evaldCondition=null!=i?i:this.evaldCondition,n.mediaEmpty=this.mediaEmpty,n},getElements:function(e){return e?("string"==typeof e&&this.parse.parseNode(e,["selector"],this._index,this._fileInfo,(function(t,i){if(t)throw new O({index:t.index,message:t.message},this.parse.imports,this._fileInfo.filename);e=i[0].elements})),e):[new m("","&",!1,this._index,this._fileInfo)]},createEmptySelectors:function(){var e=new m("","&",!1,this._index,this._fileInfo),t=[new F([e],null,null,this._index,this._fileInfo)];return t[0].mediaEmpty=!0,t},match:function(e){var t,i,n=this.elements,r=n.length;if(0===(t=(e=e.mixinElements()).length)||rg.PARENS_DIVISION)||this.parensStack&&this.parensStack.length))},q.Eval.prototype.pathRequiresRewrite=function(e){return(this.rewriteUrls===b?J:W)(e)},q.Eval.prototype.rewritePath=function(e,t){var i;return t=t||"",i=this.normalizePath(t+e),J(e)&&W(t)&&!1===J(i)&&(i="./"+i),i},q.Eval.prototype.normalizePath=function(e){var t,i=e.split("/").reverse();for(e=[];0!==i.length;)switch(t=i.pop()){case".":break;case"..":0===e.length||".."===e[e.length-1]?e.push(t):e.pop();break;default:e.push(t)}return e.join("/")};var H=function e(t){return{_data:{},add:function(e,t){e=e.toLowerCase(),this._data.hasOwnProperty(e),this._data[e]=t},addMultiple:function(e){var t=this;Object.keys(e).forEach((function(i){t.add(i,e[i])}))},get:function(e){return this._data[e]||t&&t.get(e)},getLocalFunctions:function(){return this._data},inherit:function(){return e(this)},create:function(t){return e(t)}}}(null),Q={eval:function(){var e=this.value_,t=this.error_;if(t)throw t;if(null!=e)return e?L.True:L.False},value:function(e){this.value_=e},error:function(e){this.error_=e},reset:function(){this.value_=this.error_=null}},K=function(e,t,i,n){this.selectors=e,this.rules=t,this._lookups={},this._variables=null,this._properties=null,this.strictImports=i,this.copyVisibilityInfo(n),this.allowRoot=!0,this.setParent(this.selectors,this),this.setParent(this.rules,this)};K.prototype=Object.assign(new u,{type:"Ruleset",isRuleset:!0,isRulesetLike:function(){return!0},accept:function(e){this.paths?this.paths=e.visitArray(this.paths,!0):this.selectors&&(this.selectors=e.visitArray(this.selectors)),this.rules&&this.rules.length&&(this.rules=e.visitArray(this.rules))},eval:function(e){var t,i,n,r,s,o=!1;if(this.selectors&&(i=this.selectors.length)){for(t=new Array(i),Q.error({type:"Syntax",message:"it is currently only allowed in parametric mixin guards,"}),r=0;r0;e--){var t=this.rules[e-1];if(t instanceof D)return this.parseValue(t)}},parseValue:function(e){var t=this;function i(e){return e.value instanceof j&&!e.parsed?("string"==typeof e.value.value?this.parse.parseNode(e.value.value,["value","important"],e.value.getIndex(),e.fileInfo(),(function(t,i){t&&(e.parsed=!0),i&&(e.value=i[0],e.important=i[1]||"",e.parsed=!0)})):e.parsed=!0,e):e}if(Array.isArray(e)){var n=[];return e.forEach((function(e){n.push(i.call(t,e))})),n}return i.call(t,e)},rulesets:function(){if(!this.rules)return[];var e,t,i=[],n=this.rules;for(e=0;t=n[e];e++)t.isRuleset&&i.push(t);return i},prependRule:function(e){var t=this.rules;t?t.unshift(e):this.rules=[e],this.setParent(e,this)},find:function(e,t,i){t=t||this;var n,r,s=[],o=e.toCSS();return o in this._lookups?this._lookups[o]:(this.rulesets().forEach((function(o){if(o!==t)for(var a=0;an){if(!i||i(o)){r=o.find(new F(e.elements.slice(n)),t,i);for(var l=0;l0&&t.add(l),e.firstSelector=!0,o[0].genCSS(e,t),e.firstSelector=!1,n=1;n0?(s=(r=k(e)).pop(),o=n.createDerived(k(s.elements))):o=n.createDerived([]),t.length>0){var a=i.combinator,l=t[0].elements[0];a.emptyOrWhitespace&&!l.combinator.emptyOrWhitespace&&(a=l.combinator),o.elements.push(new m(a,l.value,i.isVariable,i._index,i._fileInfo)),o.elements=o.elements.concat(t[0].elements.slice(1))}if(0!==o.elements.length&&r.push(o),t.length>1){var u=t.slice(1);u=u.map((function(e){return e.createDerived(e.elements,[])})),r=r.concat(u)}return r}function o(e,t,i,n,r){var o;for(o=0;o0?n[n.length-1]=n[n.length-1].createDerived(n[n.length-1].elements.concat(e)):n.push(new F(e));else t.push([new F(e)])}function l(e,t){var i=t.createDerived(t.elements,t.extendList,t.evaldCondition);return i.copyVisibilityInfo(e),i}var u,c;if(!function e(t,i,l){var u,c,h,f,v,d,g,y,b,w,x,S,I=!1;for(f=[],v=[[]],u=0;y=l.elements[u];u++)if("&"!==y.value){var C=(S=void 0,(x=y).value instanceof p&&(S=x.value.value)instanceof F?S:null);if(null!=C){a(f,v);var k,_=[],A=[];for(k=e(_,i,C),I=I||k,h=0;h<_.length;h++){o(v,[r(n(_[h],y),y)],y,l,A)}v=A,f=[]}else f.push(y)}else{for(I=!0,d=[],a(f,v),c=0;c0&&g[0].elements.push(new m(y.combinator,"",y.isVariable,y._index,y._fileInfo)),d.push(g);else for(h=0;h0&&(t.push(v[u]),w=v[u][b-1],v[u][b-1]=w.createDerived(w.elements,l.extendList));return I}(c=[],t,i))if(t.length>0)for(c=[],u=0;u0)for(t=0;t-1e-6&&(n=i.toFixed(20).replace(/0+$/,"")),e&&e.compress){if(0===i&&this.unit.isLength())return void t.add(n);i>0&&i<1&&(n=n.substr(1))}t.add(n),this.unit.genCSS(e,t)},operate:function(e,t,i){var n=this._operate(e,t,this.value,i.value),r=this.unit.clone();if("+"===t||"-"===t)if(0===r.numerator.length&&0===r.denominator.length)r=i.unit.clone(),this.unit.backupUnit&&(r.backupUnit=this.unit.backupUnit);else if(0===i.unit.numerator.length&&0===r.denominator.length);else{if(i=i.convertTo(this.unit.usedUnits()),e.strictUnits&&i.unit.toString()!==r.toString())throw new Error("Incompatible units. Change the units or use the unit function. Bad units: '"+r.toString()+"' and '"+i.unit.toString()+"'.");n=this._operate(e,t,this.value,i.value)}else"*"===t?(r.numerator=r.numerator.concat(i.unit.numerator).sort(),r.denominator=r.denominator.concat(i.unit.denominator).sort(),r.cancel()):"/"===t&&(r.numerator=r.numerator.concat(i.unit.denominator).sort(),r.denominator=r.denominator.concat(i.unit.numerator).sort(),r.cancel());return new ee(n,r)},compare:function(e){var t,i;if(e instanceof ee){if(this.unit.isEmpty()||e.unit.isEmpty())t=this,i=e;else if(t=this.unify(),i=e.unify(),0!==t.unit.compare(i.unit))return;return u.numericCompare(t.value,i.value)}},unify:function(){return this.convertTo({length:"px",duration:"s",angle:"rad"})},convertTo:function(e){var t,i,n,r,s,o=this.value,l=this.unit.clone(),u={};if("string"==typeof e){for(t in a)a[t].hasOwnProperty(e)&&((u={})[t]=e);e=u}for(i in s=function(e,t){return n.hasOwnProperty(e)?(t?o/=n[e]/n[r]:o*=n[e]/n[r],r):e},e)e.hasOwnProperty(i)&&(r=e[i],n=a[i],l.map(s));return l.cancel(),new ee(o,l)}});var te=g,ie=function(e,t,i){this.op=e.trim(),this.operands=t,this.isSpaced=i};ie.prototype=Object.assign(new u,{type:"Operation",accept:function(e){this.operands=e.visitArray(this.operands)},eval:function(e){var t,i=this.operands[0].eval(e),n=this.operands[1].eval(e);if(e.isMathOn(this.op)){if(t="./"===this.op?"/":this.op,i instanceof ee&&n instanceof c&&(i=i.toColor()),n instanceof ee&&i instanceof c&&(n=n.toColor()),!i.operate){if(i instanceof ie&&"/"===i.op&&e.math===te.PARENS_DIVISION)return new ie(this.op,[i,n],this.isSpaced);throw{type:"Operation",message:"Operation on an invalid type"}}return i.operate(e,t,n)}return new ie(this.op,[i,n],this.isSpaced)},genCSS:function(e,t){this.operands[0].genCSS(e,t),this.isSpaced&&t.add(" "),t.add(this.op),this.isSpaced&&t.add(" "),this.operands[1].genCSS(e,t)}});var ne=function(e,t){if(this.value=e,this.noSpacing=t,!e)throw new Error("Expression requires an array parameter")};ne.prototype=Object.assign(new u,{type:"Expression",accept:function(e){this.value=e.visitArray(this.value)},eval:function(e){var t,i=e.isMathOn(),n=this.parens,r=!1;return n&&e.inParenthesis(),this.value.length>1?t=new ne(this.value.map((function(t){return t.eval?t.eval(e):t})),this.noSpacing):1===this.value.length?(!this.value[0].parens||this.value[0].parensInOp||e.inCalc||(r=!0),t=this.value[0].eval(e)):t=this,n&&e.outOfParenthesis(),!this.parens||!this.parensInOp||i||r||t instanceof ee||(t=new p(t)),t},genCSS:function(e,t){for(var i=0;i1){var i=new F([],null,null,this.getIndex(),this.fileInfo()).createEmptySelectors();(t=new K(i,e.mediaBlocks)).multiMedia=!0,t.copyVisibilityInfo(this.visibilityInfo()),this.setParent(t,this)}return delete e.mediaBlocks,delete e.mediaPath,t},evalNested:function(e){var t,i,n=e.mediaPath.concat([this]);for(t=0;t0;t--)e.splice(t,0,new j("and"));return new ne(e)}))),this.setParent(this.features,this),new K([],[])},permute:function(e){if(0===e.length)return[];if(1===e.length)return e[0];for(var t=[],i=this.permute(e.slice(1)),n=0;n1?"["+e.value.map((function(e){return e.toCSS()})).join(", ")+"]":e.toCSS()}});var ve=function(e,t,i,n){this.escaped=t,this.expression=e,this._index=i,this._fileInfo=n};ve.prototype=Object.assign(new pe,{type:"JavaScript",eval:function(e){var t=this.evaluateJavaScript(this.expression,e),i=typeof t;return"number"!==i||isNaN(t)?"string"===i?new ue('"'+t+'"',t,this.escaped,this._index):Array.isArray(t)?new j(t.join(", ")):new j(t):new ee(t)}});var de=function(e,t){this.key=e,this.value=t};de.prototype=Object.assign(new u,{type:"Assignment",accept:function(e){this.value=e.visit(this.value)},eval:function(e){return this.value.eval?new de(this.key,this.value.eval(e)):this},genCSS:function(e,t){t.add(this.key+"="),this.value.genCSS?this.value.genCSS(e,t):t.add(this.value)}});var me=function(e,t,i,n,r){this.op=e.trim(),this.lvalue=t,this.rvalue=i,this._index=n,this.negate=r};me.prototype=Object.assign(new u,{type:"Condition",accept:function(e){this.lvalue=e.visit(this.lvalue),this.rvalue=e.visit(this.rvalue)},eval:function(e){var t=function(e,t,i){switch(e){case"and":return t&&i;case"or":return t||i;default:switch(u.compare(t,i)){case-1:return"<"===e||"=<"===e||"<="===e;case 0:return"="===e||">="===e||"=<"===e||"<="===e;case 1:return">"===e||">="===e;default:return!1}}}(this.op,this.lvalue.eval(e),this.rvalue.eval(e));return this.negate?!t:t}});var ge=function(e){this.value=e};ge.prototype=Object.assign(new u,{type:"UnicodeDescriptor"});var ye=function(e){this.value=e};ye.prototype=Object.assign(new u,{type:"Negative",genCSS:function(e,t){t.add("-"),this.value.genCSS(e,t)},eval:function(e){return e.isMathOn()?new ie("*",[new ee(-1),this.value]).eval(e):new ye(this.value.eval(e))}});var be=function(e,t,i,n,r){switch(this.selector=e,this.option=t,this.object_id=be.next_id++,this.parent_ids=[this.object_id],this._index=i,this._fileInfo=n,this.copyVisibilityInfo(r),this.allowRoot=!0,t){case"all":this.allowBefore=!0,this.allowAfter=!0;break;default:this.allowBefore=!1,this.allowAfter=!1}this.setParent(this.selector,this)};be.prototype=Object.assign(new u,{type:"Extend",accept:function(e){this.selector=e.visit(this.selector)},eval:function(e){return new be(this.selector.eval(e),this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},clone:function(e){return new be(this.selector,this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},findSelfSelectors:function(e){var t,i,n=[];for(t=0;t0&&i.length&&""===i[0].combinator.value&&(i[0].combinator.value=" "),n=n.concat(e[t].elements);this.selfSelectors=[new F(n)],this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo())}}),be.next_id=0;var we=function(e,t,i){this.variable=e,this._index=t,this._fileInfo=i,this.allowRoot=!0};we.prototype=Object.assign(new u,{type:"VariableCall",eval:function(e){var t,i=new oe(this.variable,this.getIndex(),this.fileInfo()).eval(e),n=new O({message:"Could not evaluate variable call "+this.variable});if(!i.ruleset){if(i.rules)t=i;else if(Array.isArray(i))t=new K("",i);else{if(!Array.isArray(i.value))throw n;t=new K("",i.value)}i=new X(t)}if(i.ruleset)return i.callEval(e);throw n}});var xe=function(e,t,i,n){this.value=e,this.lookups=t,this._index=i,this._fileInfo=n};xe.prototype=Object.assign(new u,{type:"NamespaceValue",eval:function(e){var t,i,n=this.value.eval(e);for(t=0;tthis.params.length)return!1}i=Math.min(s,this.arity);for(var o=0;o0){for(c=!0,a=0;a0)f=2;else if(f=1,p[1]+p[2]>1)throw{type:"Runtime",message:"Ambiguous use of `default()` found when matching for `"+this.format(m)+"`",index:this.getIndex(),filename:this.fileInfo().filename};for(a=0;a0&&(e=e.slice(0,t)),(t=e.lastIndexOf("/"))<0&&(t=e.lastIndexOf("\\")),t<0?"":e.slice(0,t+1)},e.prototype.tryAppendExtension=function(e,t){return/(\.[a-z]*$)|([\?;].*)$/.test(e)?e:e+t},e.prototype.tryAppendLessExtension=function(e){return this.tryAppendExtension(e,".less")},e.prototype.supportsSync=function(){return!1},e.prototype.alwaysMakePathsAbsolute=function(){return!1},e.prototype.isPathAbsolute=function(e){return/^(?:[a-z-]+:|\/|\\|#)/i.test(e)},e.prototype.join=function(e,t){return e?e+t:t},e.prototype.pathDiff=function(e,t){var i,n,r,s,o=this.extractUrlParts(e),a=this.extractUrlParts(t),l="";if(o.hostPart!==a.hostPart)return"";for(n=Math.max(a.directories.length,o.directories.length),i=0;iparseInt(t[i])?-1:1;return 0},e.prototype.versionToString=function(e){for(var t="",i=0;i0;){var e=this.imports[0];if(!e.isReady)return;this.imports=this.imports.slice(1),e.callback.apply(null,e.args)}if(0===this.variableImports.length)break;var t=this.variableImports[0];this.variableImports=this.variableImports.slice(1),t()}}finally{this._currentDepth--}0===this._currentDepth&&this._onSequencerEmpty&&this._onSequencerEmpty()},e}(),Oe=function(e,t){this._visitor=new Pe(this),this._importer=e,this._finish=t,this.context=new q.Eval,this.importCount=0,this.onceFileDetectionMap={},this.recursionDetector={},this._sequencer=new Re(this._onSequencerEmpty.bind(this))};Oe.prototype={isReplacing:!1,run:function(e){try{this._visitor.visit(e)}catch(e){this.error=e}this.isFinished=!0,this._sequencer.tryRun()},_onSequencerEmpty:function(){this.isFinished&&this._finish(this.error)},visitImport:function(e,t){var i=e.options.inline;if(!e.css||i){var n=new q.Eval(this.context,k(this.context.frames)),r=n.frames[0];this.importCount++,e.isVariableImport()?this._sequencer.addVariableImport(this.processImportNode.bind(this,e,n,r)):this.processImportNode(e,n,r)}t.visitDeeper=!1},processImportNode:function(e,t,i){var n,r=e.options.inline;try{n=e.evalForImport(t)}catch(t){t.filename||(t.index=e.getIndex(),t.filename=e.fileInfo().filename),e.css=!0,e.error=t}if(!n||n.css&&!r)this.importCount--,this.isFinished&&this._sequencer.tryRun();else{n.options.multiple&&(t.importMultiple=!0);for(var s=void 0===n.css,o=0;o=0||(a=[u.selfSelectors[0]],(s=f.findMatch(l,a)).length&&(l.hasFoundMatches=!0,l.selfSelectors.forEach((function(e){var t=u.visibilityInfo();o=f.extendSelector(s,a,e,l.isVisible()),(c=new Ce.Extend(u.selector,u.option,0,u.fileInfo(),t)).selfSelectors=o,o[o.length-1].extendList=[c],h.push(c),c.ruleset=u.ruleset,c.parent_ids=c.parent_ids.concat(u.parent_ids,l.parent_ids),u.firstExtendOnThisSelectorPath&&(c.firstExtendOnThisSelectorPath=!0,u.ruleset.paths.push(o))}))));if(h.length){if(this.extendChainCount++,i>100){var p="{unable to calculate}",v="{unable to calculate}";try{p=h[0].selfSelectors[0].toCSS(),v=h[0].selector.toCSS()}catch(e){}throw{message:"extend circular reference detected. One of the circular extends is currently:"+p+":extend("+v+")"}}return h.concat(f.doExtendChaining(h,t,i+1))}return h},e.prototype.visitDeclaration=function(e,t){t.visitDeeper=!1},e.prototype.visitMixinDefinition=function(e,t){t.visitDeeper=!1},e.prototype.visitSelector=function(e,t){t.visitDeeper=!1},e.prototype.visitRuleset=function(e,t){if(!e.root){var i,n,r,s,o=this.allExtendsStack[this.allExtendsStack.length-1],a=[],l=this;for(r=0;r0&&u[l.matched].combinator.value!==o?l=null:l.matched++,l&&(l.finished=l.matched===u.length,l.finished&&!e.allowAfter&&(r+1u&&c>0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[u].elements.slice(c)),c=0,u++),l=s.elements.slice(c,a.index).concat([o]).concat(i.elements.slice(1)),u===a.pathIndex&&r>0?h[h.length-1].elements=h[h.length-1].elements.concat(l):(h=h.concat(t.slice(u,a.pathIndex))).push(new Ce.Selector(l)),u=a.endPathIndex,(c=a.endPathElementIndex)>=t[u].elements.length&&(c=0,u++);return u0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[u].elements.slice(c)),u++),h=(h=h.concat(t.slice(u,t.length))).map((function(e){var t=e.createDerived(e.elements);return n?t.ensureVisibility():t.ensureInvisibility(),t}))},e.prototype.visitMedia=function(e,t){var i=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);i=i.concat(this.doExtendChaining(i,e.allExtends)),this.allExtendsStack.push(i)},e.prototype.visitMediaOut=function(e){var t=this.allExtendsStack.length-1;this.allExtendsStack.length=t},e.prototype.visitAtRule=function(e,t){var i=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);i=i.concat(this.doExtendChaining(i,e.allExtends)),this.allExtendsStack.push(i)},e.prototype.visitAtRuleOut=function(e){var t=this.allExtendsStack.length-1;this.allExtendsStack.length=t},e}(),Le=function(){function e(){this.contexts=[[]],this._visitor=new Pe(this)}return e.prototype.run=function(e){return this._visitor.visit(e)},e.prototype.visitDeclaration=function(e,t){t.visitDeeper=!1},e.prototype.visitMixinDefinition=function(e,t){t.visitDeeper=!1},e.prototype.visitRuleset=function(e,t){var i,n=this.contexts[this.contexts.length-1],r=[];this.contexts.push(r),e.root||((i=e.selectors)&&(i=i.filter((function(e){return e.getIsOutput()})),e.selectors=i.length?i:i=null,i&&e.joinSelectors(r,n,i)),i||(e.rules=null),e.paths=r)},e.prototype.visitRulesetOut=function(e){this.contexts.length=this.contexts.length-1},e.prototype.visitMedia=function(e,t){var i=this.contexts[this.contexts.length-1];e.rules[0].root=0===i.length||i[0].multiMedia},e.prototype.visitAtRule=function(e,t){var i=this.contexts[this.contexts.length-1];e.rules&&e.rules.length&&(e.rules[0].root=e.isRooted||0===i.length||null)},e}(),je=function(){function e(e){this._visitor=new Pe(this),this._context=e}return e.prototype.containsSilentNonBlockedChild=function(e){var t;if(!e)return!1;for(var i=0;i0},e.prototype.resolveVisibility=function(e,t){if(!e.blocksVisibility()){if(this.isEmpty(e)&&!this.containsSilentNonBlockedChild(t))return;return e}var i=e.rules[0];if(this.keepOnlyVisibleChilds(i),!this.isEmpty(i))return e.ensureVisibility(),e.removeVisibilityBlock(),e},e.prototype.isVisibleRuleset=function(e){return!!e.firstRoot||!this.isEmpty(e)&&!(!e.root&&!this.hasVisibleSelector(e))},e}(),Ne=function(e){this._visitor=new Pe(this),this._context=e,this.utils=new je(e)};Ne.prototype={isReplacing:!0,run:function(e){return this._visitor.visit(e)},visitDeclaration:function(e,t){if(!e.blocksVisibility()&&!e.variable)return e},visitMixinDefinition:function(e,t){e.frames=[]},visitExtend:function(e,t){},visitComment:function(e,t){if(!e.blocksVisibility()&&!e.isSilent(this._context))return e},visitMedia:function(e,t){var i=e.rules[0].rules;return e.accept(this._visitor),t.visitDeeper=!1,this.utils.resolveVisibility(e,i)},visitImport:function(e,t){if(!e.blocksVisibility())return e},visitAtRule:function(e,t){return e.rules&&e.rules.length?this.visitAtRuleWithBody(e,t):this.visitAtRuleWithoutBody(e,t)},visitAnonymous:function(e,t){if(!e.blocksVisibility())return e.accept(this._visitor),e},visitAtRuleWithBody:function(e,t){var i=function(e){var t=e.rules;return function(e){var t=e.rules;return 1===t.length&&(!t[0].paths||0===t[0].paths.length)}(e)?t[0].rules:t}(e);return e.accept(this._visitor),t.visitDeeper=!1,this.utils.isEmpty(e)||this._mergeRules(e.rules[0].rules),this.utils.resolveVisibility(e,i)},visitAtRuleWithoutBody:function(e,t){if(!e.blocksVisibility()){if("@charset"===e.name){if(this.charset){if(e.debugInfo){var i=new Ce.Comment("/* "+e.toCSS(this._context).replace(/\n/g,"")+" */\n");return i.debugInfo=e.debugInfo,this._visitor.visit(i)}return}this.charset=!0}return e}},checkValidNodes:function(e,t){if(e)for(var i=0;i0?e.accept(this._visitor):e.rules=null,t.visitDeeper=!1}return e.rules&&(this._mergeRules(e.rules),this._removeDuplicateRules(e.rules)),this.utils.isVisibleRuleset(e)&&(e.ensureVisibility(),n.splice(0,0,e)),1===n.length?n[0]:n},_compileRulesetPaths:function(e){e.paths&&(e.paths=e.paths.filter((function(e){var t;for(" "===e[0].elements[0].combinator.value&&(e[0].elements[0].combinator=new Ce.Combinator("")),t=0;t=0;n--)if((i=e[n])instanceof Ce.Declaration)if(r[i.name]){(t=r[i.name])instanceof Ce.Declaration&&(t=r[i.name]=[r[i.name].toCSS(this._context)]);var s=i.toCSS(this._context);-1!==t.indexOf(s)?e.splice(n,1):t.push(s)}else r[i.name]=i}},_mergeRules:function(e){if(e){for(var t={},i=[],n=0;n0){var t=e[0],i=[],n=[new Ce.Expression(i)];e.forEach((function(e){"+"===e.merge&&i.length>0&&n.push(new Ce.Expression(i=[])),i.push(e.value),t.important=t.important||e.important})),t.value=new Ce.Value(n)}}))}}};var De={Visitor:Pe,ImportVisitor:Oe,MarkVisibleSelectorsVisitor:Ve,ExtendVisitor:$e,JoinSelectorVisitor:Le,ToCSSVisitor:Ne};var Be=function(){var e,t,i,n,r,s,o,a=[],l={};function u(i){for(var n,a,c,h=l.i,f=t,p=l.i-o,v=l.i+s.length-p,d=l.i+=i,m=e;l.i=0){c={index:l.i,text:m.substr(l.i,y+2-l.i),isLineComment:!1},l.i+=c.text.length-1,l.commentStore.push(c);continue}}break}if(32!==n&&10!==n&&9!==n&&13!==n)break}if(s=s.slice(i+l.i-d+p),o=l.i,!s.length){if(ti||l.i===i&&e&&!n)&&(i=l.i,n=e);var r=a.pop();s=r.current,o=l.i=r.i,t=r.j},l.forget=function(){a.pop()},l.isWhitespace=function(t){var i=l.i+(t||0),n=e.charCodeAt(i);return 32===n||13===n||9===n||10===n},l.$re=function(e){l.i>o&&(s=s.slice(l.i-o),o=l.i);var t=e.exec(s);return t?(u(t[0].length),"string"==typeof t?t:1===t.length?t[0]:t):null},l.$char=function(t){return e.charAt(l.i)!==t?null:(u(1),t)},l.$str=function(t){for(var i=t.length,n=0;nh&&(d=!1)}}while(d);return r||null},l.autoCommentAbsorb=!0,l.commentStore=[],l.finished=!1,l.peek=function(t){if("string"==typeof t){for(var i=0;i57||t<43||47===t||44===t},l.start=function(n,a,c){e=n,l.i=t=o=i=0,r=a?function(e,t){var i,n,r,s,o,a,l,u,c,h=e.length,f=0,p=0,v=[],d=0;function m(t){var i=o-d;i<512&&!t||!i||(v.push(e.slice(d,o+1)),d=o+1)}for(o=0;o=97&&l<=122||l<34))switch(l){case 40:p++,n=o;continue;case 41:if(--p<0)return t("missing opening `(`",o);continue;case 59:p||m();continue;case 123:f++,i=o;continue;case 125:if(--f<0)return t("missing opening `{`",o);f||p||m();continue;case 92:if(o96)){if(u==l){c=1;break}if(92==u){if(o==h-1)return t("unescaped `\\`",o);o++}}if(c)continue;return t("unmatched `"+String.fromCharCode(l)+"`",a);case 47:if(p||o==h-1)continue;if(47==(u=e.charCodeAt(o+1)))for(o+=2;oi&&s>r?"missing closing `}` or `*/`":"missing closing `}`",i):0!==p?t("missing closing `)`",n):(m(!0),v)}(n,c):[n],s=r[0],u(0)},l.end=function(){var t,r=l.i>=e.length;return l.i=e.length-1,furthestChar:e[l.i]}},l},Ue=function e(t,i,n){var r,s=Be();function o(e,t){throw new O({index:s.i,filename:n.filename,type:t||"Syntax",message:e},i)}function a(e,t){var i=e instanceof Function?e.call(r):s.$re(e);if(i)return i;o(t||("string"==typeof e?"expected '"+e+"' got '"+s.currentChar()+"'":"unexpected token"))}function l(e,t){if(s.$char(e))return e;o(t||"expected '"+e+"' got '"+s.currentChar()+"'")}function u(e){var t=n.filename;return{lineNumber:C(e,s.getInput()).line+1,fileName:t}}return{parserInput:s,imports:i,fileInfo:n,parseNode:function(e,t,n,o,a){var l,u=[],c=s;try{c.start(e,!1,(function(e,t){a({message:e,index:t+n})}));for(var h=0,f=void 0,p=void 0;f=t[h];h++)if(p=c.i,l=r[f]()){try{l._index=p+n,l._fileInfo=o}catch(e){}u.push(l)}else u.push(null);c.end().isFinished?a(null,u):a(!0,null)}catch(e){throw new O({index:e.index+n,message:e.message},i,o.filename)}},parse:function(r,o,a){var l,u,c,h,f=null,p="";if(u=a&&a.globalVars?e.serializeVars(a.globalVars)+"\n":"",c=a&&a.modifyVars?"\n"+e.serializeVars(a.modifyVars):"",t.pluginManager)for(var v=t.pluginManager.getPreProcessors(),d=0;d");return e},args:function(e){var t,i,n,a,l,u,c,h=r.entities,f={args:null,variadic:!1},p=[],v=[],d=[],m=!0;for(s.save();;){if(e)u=r.detachedRuleset()||r.expression();else{if(s.commentStore.length=0,s.$str("...")){f.variadic=!0,s.$char(";")&&!t&&(t=!0),(t?v:d).push({variadic:!0});break}u=h.variable()||h.property()||h.literal()||h.keyword()||this.call(!0)}if(!u||!m)break;a=null,u.throwAwayComments&&u.throwAwayComments(),l=u;var g=null;if(e?u.value&&1==u.value.length&&(g=u.value[0]):g=u,g&&(g instanceof Ce.Variable||g instanceof Ce.Property))if(s.$char(":")){if(p.length>0&&(t&&o("Cannot mix ; and , as delimiter types"),i=!0),!(l=r.detachedRuleset()||r.expression())){if(!e)return s.restore(),f.args=[],f;o("could not understand value for named argument")}a=n=g.name}else if(s.$str("...")){if(!e){f.variadic=!0,s.$char(";")&&!t&&(t=!0),(t?v:d).push({name:u.name,variadic:!0});break}c=!0}else e||(n=a=g.name,l=null);l&&p.push(l),d.push({name:a,value:l,expand:c}),s.$char(",")?m=!0:((m=";"===s.$char(";"))||t)&&(i&&o("Cannot mix ; and , as delimiter types"),t=!0,p.length>1&&(l=new Ce.Value(p)),v.push({name:n,value:l,expand:c}),n=null,p=[],i=!1)}return s.forget(),f.args=t?v:d,f},definition:function(){var e,t,i,n,o=[],l=!1;if(!("."!==s.currentChar()&&"#"!==s.currentChar()||s.peek(/^[^{]*\}/)))if(s.save(),t=s.$re(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/)){e=t[1];var u=this.args(!1);if(o=u.args,l=u.variadic,!s.$char(")"))return void s.restore("Missing closing ')'");if(s.commentStore.length=0,s.$str("when")&&(n=a(r.conditions,"expected condition")),i=r.block())return s.forget(),new Ce.mixin.Definition(e,o,i,n,l);s.restore()}else s.restore()},ruleLookups:function(){var e,t=[];if("["===s.currentChar()){for(;;){if(s.save(),!(e=this.lookupValue())&&""!==e){s.restore();break}t.push(e),s.forget()}return t.length>0?t:void 0}},lookupValue:function(){if(s.save(),s.$char("[")){var e=s.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);if(s.$char("]"))return e||""===e?(s.forget(),e):void s.restore();s.restore()}else s.restore()}},entity:function(){var e=this.entities;return this.comment()||e.literal()||e.variable()||e.url()||e.property()||e.call()||e.keyword()||this.mixin.call(!0)||e.javascript()},end:function(){return s.$char(";")||s.peek("}")},ieAlpha:function(){var e;if(s.$re(/^opacity=/i))return(e=s.$re(/^\d+/))||(e="@{"+(e=a(r.entities.variable,"Could not parse alpha")).name.slice(1)+"}"),l(")"),new Ce.Quoted("","alpha(opacity="+e+")")},element:function(){var e,t,i,r=s.i;if(t=this.combinator(),(e=s.$re(/^(?:\d+\.\d+|\d+)%/)||s.$re(/^(?:[.#]?|:*)(?:[\w-]|[^\x00-\x9f]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/)||s.$char("*")||s.$char("&")||this.attribute()||s.$re(/^\([^&()@]+\)/)||s.$re(/^[\.#:](?=@)/)||this.entities.variableCurly())||(s.save(),s.$char("(")?(i=this.selector(!1))&&s.$char(")")?(e=new Ce.Paren(i),s.forget()):s.restore("Missing closing ')'"):s.forget()),e)return new Ce.Element(t,e,e instanceof Ce.Variable,r,n)},combinator:function(){var e=s.currentChar();if("/"===e){s.save();var t=s.$re(/^\/[a-z]+\//i);if(t)return s.forget(),new Ce.Combinator(t);s.restore()}if(">"===e||"+"===e||"~"===e||"|"===e||"^"===e){for(s.i++,"^"===e&&"^"===s.currentChar()&&(e="^^",s.i++);s.isWhitespace();)s.i++;return new Ce.Combinator(e)}return s.isWhitespace(-1)?new Ce.Combinator(" "):new Ce.Combinator(null)},selector:function(e){var t,i,r,l,u,c,h,f=s.i;for(e=!1!==e;(e&&(i=this.extend())||e&&(c=s.$str("when"))||(l=this.element()))&&(c?h=a(this.conditions,"expected condition"):h?o("CSS guard can only be used at the end of selector"):i?u=u?u.concat(i):i:(u&&o("Extend can only be used at the end of selector"),r=s.currentChar(),t?t.push(l):t=[l],l=null),"{"!==r&&"}"!==r&&";"!==r&&","!==r&&")"!==r););if(t)return new Ce.Selector(t,u,h,f,n);u&&o("Extend must be used to extend a selector, it cannot be used on its own")},selectors:function(){for(var e,t;(e=this.selector())&&(t?t.push(e):t=[e],s.commentStore.length=0,e.condition&&t.length>1&&o("Guards are only currently allowed on a single selector."),s.$char(","));)e.condition&&o("Guards are only currently allowed on a single selector."),s.commentStore.length=0;return t},attribute:function(){if(s.$char("[")){var e,t,i,n=this.entities;return(e=n.variableCurly())||(e=a(/^(?:[_A-Za-z0-9-\*]*\|)?(?:[_A-Za-z0-9-]|\\.)+/)),(i=s.$re(/^[|~*$^]?=/))&&(t=n.quoted()||s.$re(/^[0-9]+%/)||s.$re(/^[\w-]+/)||n.variableCurly()),l("]"),new Ce.Attribute(e,i,t)}},block:function(){var e;if(s.$char("{")&&(e=this.primary())&&s.$char("}"))return e},blockRuleset:function(){var e=this.block();return e&&(e=new Ce.Ruleset(null,e)),e},detachedRuleset:function(){var e,t,i;if(s.save(),!s.$re(/^[.#]\(/)||(t=(e=this.mixin.args(!1)).args,i=e.variadic,s.$char(")"))){var n=this.blockRuleset();if(n)return s.forget(),t?new Ce.mixin.Definition(null,t,n,null,i):new Ce.DetachedRuleset(n);s.restore()}else s.restore()},ruleset:function(){var e,i,n;if(s.save(),t.dumpLineNumbers&&(n=u(s.i)),(e=this.selectors())&&(i=this.block())){s.forget();var r=new Ce.Ruleset(e,i,t.strictImports);return t.dumpLineNumbers&&(r.debugInfo=n),r}s.restore()},declaration:function(){var e,t,i,r,o,a,l=s.i,u=s.currentChar();if("."!==u&&"#"!==u&&"&"!==u&&":"!==u)if(s.save(),e=this.variable()||this.ruleProperty()){if((a="string"==typeof e)&&(t=this.detachedRuleset())&&(i=!0),s.commentStore.length=0,!t){if(o=!a&&e.length>1&&e.pop().value,t=e[0].value&&"--"===e[0].value.slice(0,2)?this.permissiveValue():this.anonymousValue())return s.forget(),new Ce.Declaration(e,t,!1,o,l,n);t||(t=this.value()),t?r=this.important():a&&(t=this.permissiveValue())}if(t&&(this.end()||i))return s.forget(),new Ce.Declaration(e,t,r,o,l,n);s.restore()}else s.restore()},anonymousValue:function(){var e=s.i,t=s.$re(/^([^.#@\$+\/'"*`(;{}-]*);/);if(t)return new Ce.Anonymous(t[1],e)},permissiveValue:function(e){var t,i,r,a,l=e||";",u=s.i,c=[];function h(){var e=s.currentChar();return"string"==typeof l?e===l:l.test(e)}if(!h()){a=[];do{((i=this.comment())||(i=this.entity()))&&a.push(i)}while(i);if(r=h(),a.length>0){if(a=new Ce.Expression(a),r)return a;c.push(a)," "===s.prevChar()&&c.push(new Ce.Anonymous(" ",u))}if(s.save(),a=s.$parseUntil(l)){if("string"==typeof a&&o("Expected '"+a+"'","Parse"),1===a.length&&" "===a[0])return s.forget(),new Ce.Anonymous("",u);var f=void 0;for(t=0;t0)return new Ce.Expression(r)},mediaFeatures:function(){var e,t=this.entities,i=[];do{if(e=this.mediaFeature()){if(i.push(e),!s.$char(","))break}else if((e=t.variable()||t.mixinLookup())&&(i.push(e),!s.$char(",")))break}while(e);return i.length>0?i:null},media:function(){var e,i,r,a,l=s.i;if(t.dumpLineNumbers&&(a=u(l)),s.save(),s.$str("@media"))return e=this.mediaFeatures(),(i=this.block())||o("media definitions require block statements after any features"),s.forget(),r=new Ce.Media(i,e,l,n),t.dumpLineNumbers&&(r.debugInfo=a),r;s.restore()},plugin:function(){var e,t,i,r=s.i;if(s.$re(/^@plugin?\s+/)){if(i=(t=this.pluginArgs())?{pluginArgs:t,isPlugin:!0}:{isPlugin:!0},e=this.entities.quoted()||this.entities.url())return s.$char(";")||(s.i=r,o("missing semi-colon on @plugin")),new Ce.Import(e,null,i,r,n);s.i=r,o("malformed @plugin statement")}},pluginArgs:function(){if(s.save(),!s.$char("("))return s.restore(),null;var e=s.$re(/^\s*([^\);]+)\)\s*/);return e[1]?(s.forget(),e[1].trim()):(s.restore(),null)},atrule:function(){var e,i,r,a,l,c,h,f=s.i,p=!0,v=!0;if("@"===s.currentChar()){if(i=this.import()||this.plugin()||this.media())return i;if(s.save(),e=s.$re(/^@[a-z-]+/)){switch(a=e,"-"==e.charAt(1)&&e.indexOf("-",2)>0&&(a="@"+e.slice(e.indexOf("-",2)+1)),a){case"@charset":l=!0,p=!1;break;case"@namespace":c=!0,p=!1;break;case"@keyframes":case"@counter-style":l=!0;break;case"@document":case"@supports":h=!0,v=!1;break;default:h=!0}if(s.commentStore.length=0,l?(i=this.entity())||o("expected "+e+" identifier"):c?(i=this.expression())||o("expected "+e+" expression"):h&&(i=this.permissiveValue(/^[{;]/),p="{"===s.currentChar(),i?i.value||(i=null):p||";"===s.currentChar()||o(e+" rule is missing block or ending semi-colon")),p&&(r=this.blockRuleset()),r||!p&&i&&s.$char(";"))return s.forget(),new Ce.AtRule(e,i,r,f,n,t.dumpLineNumbers?u(f):null,v);s.restore("at-rule options not recognised")}}},value:function(){var e,t=[],i=s.i;do{if((e=this.expression())&&(t.push(e),!s.$char(",")))break}while(e);if(t.length>0)return new Ce.Value(t,i)},important:function(){if("!"===s.currentChar())return s.$re(/^! *important/)},sub:function(){var e,t;if(s.save(),s.$char("("))return(e=this.addition())&&s.$char(")")?(s.forget(),(t=new Ce.Expression([e])).parens=!0,t):void s.restore("Expected ')'");s.restore()},multiplication:function(){var e,t,i,n,r;if(e=this.operand()){for(r=s.isWhitespace(-1);!s.peek(/^\/[*\/]/);){if(s.save(),!(i=s.$char("/")||s.$char("*")||s.$str("./"))){s.forget();break}if(!(t=this.operand())){s.restore();break}s.forget(),e.parensInOp=!0,t.parensInOp=!0,n=new Ce.Operation(i,[n||e,t],r),r=s.isWhitespace(-1)}return n||e}},addition:function(){var e,t,i,n,r;if(e=this.multiplication()){for(r=s.isWhitespace(-1);(i=s.$re(/^[-+]\s+/)||!r&&(s.$char("+")||s.$char("-")))&&(t=this.multiplication());)e.parensInOp=!0,t.parensInOp=!0,n=new Ce.Operation(i,[n||e,t],r),r=s.isWhitespace(-1);return n||e}},conditions:function(){var e,t,i,n=s.i;if(e=this.condition(!0)){for(;s.peek(/^,\s*(not\s*)?\(/)&&s.$char(",")&&(t=this.condition(!0));)i=new Ce.Condition("or",i||e,t,n);return i||e}},condition:function(e){var t,i,n;if(t=this.conditionAnd(e)){if(i=s.$str("or")){if(!(n=this.condition(e)))return;t=new Ce.Condition(i,t,n)}return t}},conditionAnd:function(e){var t,i,n,r,o=this;if(t=(r=o.negatedCondition(e)||o.parenthesisCondition(e))||e?r:o.atomicCondition(e)){if(i=s.$str("and")){if(!(n=this.conditionAnd(e)))return;t=new Ce.Condition(i,t,n)}return t}},negatedCondition:function(e){if(s.$str("not")){var t=this.parenthesisCondition(e);return t&&(t.negate=!t.negate),t}},parenthesisCondition:function(e){var t;if(s.save(),s.$str("(")){if(t=function(t){var i;if(s.save(),i=t.condition(e)){if(s.$char(")"))return s.forget(),i;s.restore()}else s.restore()}(this))return s.forget(),t;if(t=this.atomicCondition(e)){if(s.$char(")"))return s.forget(),t;s.restore("expected ')' got '"+s.currentChar()+"'")}else s.restore()}else s.restore()},atomicCondition:function(e){var t,i,n,r,a=this.entities,l=s.i;function u(){return this.addition()||a.keyword()||a.quoted()||a.mixinLookup()}if(t=(u=u.bind(this))())return s.$char(">")?r=s.$char("=")?">=":">":s.$char("<")?r=s.$char("=")?"<=":"<":s.$char("=")&&(r=s.$char(">")?"=>":s.$char("<")?"=<":"="),r?(i=u())?n=new Ce.Condition(r,t,i,l,!1):o("expected expression"):n=new Ce.Condition("=",t,new Ce.Keyword("true"),l,!1),n},operand:function(){var e,t=this.entities;s.peek(/^-[@\$\(]/)&&(e=s.$char("-"));var i=this.sub()||t.dimension()||t.color()||t.variable()||t.property()||t.call()||t.quoted(!0)||t.colorKeyword()||t.mixinLookup();return e&&(i.parensInOp=!0,i=new Ce.Negative(i)),i},expression:function(){var e,t,i=[],n=s.i;do{(e=this.comment())?i.push(e):((e=this.addition()||this.entity())instanceof Ce.Comment&&(e=null),e&&(i.push(e),s.peek(/^\/[\/*]/)||(t=s.$char("/"))&&i.push(new Ce.Anonymous(t,n))))}while(e);if(i.length>0)return new Ce.Expression(i)},property:function(){var e=s.$re(/^(\*?-?[_a-zA-Z0-9-]+)\s*:/);if(e)return e[1]},ruleProperty:function(){var e,t,i=[],r=[];s.save();var o=s.$re(/^([_a-zA-Z0-9-]+)\s*:/);if(o)return i=[new Ce.Keyword(o[1])],s.forget(),i;function a(e){var t=s.i,n=s.$re(e);if(n)return r.push(t),i.push(n[1])}for(a(/^(\*?)/);a(/^((?:[\w-]+)|(?:[@\$]\{[\w-]+\}))/););if(i.length>1&&a(/^((?:\+_|\+)?)\s*:/)){for(s.forget(),""===i[0]&&(i.shift(),r.shift()),t=0;t1?e-1:e)<1?r+(s-r)*e*6:2*e<1?s:3*e<2?r+(s-r)*(2/3-e)*6:r}e=Ke(e)%360/360,t=We(Ke(t)),i=We(Ke(i)),n=We(Ke(n)),r=2*i-(s=i<=.5?i*(t+1):i+t-i*t);var a=[255*o(e+1/3),255*o(e),255*o(e-1/3)];return n=Ke(n),new c(a,n,"hsla")}catch(e){}},hsv:function(e,t,i){return ze.hsva(e,t,i,1)},hsva:function(e,t,i,n){var r,s;e=Ke(e)%360/360*360,t=Ke(t),i=Ke(i),n=Ke(n);var o=[i,i*(1-t),i*(1-(s=e/60-(r=Math.floor(e/60%6)))*t),i*(1-(1-s)*t)],a=[[0,3,1],[2,0,1],[1,0,3],[1,2,0],[3,1,0],[0,1,2]];return ze.rgba(255*o[a[r][0]],255*o[a[r][1]],255*o[a[r][2]],n)},hue:function(e){return new ee(He(e).h)},saturation:function(e){return new ee(100*He(e).s,"%")},lightness:function(e){return new ee(100*He(e).l,"%")},hsvhue:function(e){return new ee(Qe(e).h)},hsvsaturation:function(e){return new ee(100*Qe(e).s,"%")},hsvvalue:function(e){return new ee(100*Qe(e).v,"%")},red:function(e){return new ee(e.rgb[0])},green:function(e){return new ee(e.rgb[1])},blue:function(e){return new ee(e.rgb[2])},alpha:function(e){return new ee(He(e).a)},luma:function(e){return new ee(e.luma()*e.alpha*100,"%")},luminance:function(e){var t=.2126*e.rgb[0]/255+.7152*e.rgb[1]/255+.0722*e.rgb[2]/255;return new ee(t*e.alpha*100,"%")},saturate:function(e,t,i){if(!e.rgb)return null;var n=He(e);return void 0!==i&&"relative"===i.value?n.s+=n.s*t.value/100:n.s+=t.value/100,n.s=We(n.s),Je(e,n)},desaturate:function(e,t,i){var n=He(e);return void 0!==i&&"relative"===i.value?n.s-=n.s*t.value/100:n.s-=t.value/100,n.s=We(n.s),Je(e,n)},lighten:function(e,t,i){var n=He(e);return void 0!==i&&"relative"===i.value?n.l+=n.l*t.value/100:n.l+=t.value/100,n.l=We(n.l),Je(e,n)},darken:function(e,t,i){var n=He(e);return void 0!==i&&"relative"===i.value?n.l-=n.l*t.value/100:n.l-=t.value/100,n.l=We(n.l),Je(e,n)},fadein:function(e,t,i){var n=He(e);return void 0!==i&&"relative"===i.value?n.a+=n.a*t.value/100:n.a+=t.value/100,n.a=We(n.a),Je(e,n)},fadeout:function(e,t,i){var n=He(e);return void 0!==i&&"relative"===i.value?n.a-=n.a*t.value/100:n.a-=t.value/100,n.a=We(n.a),Je(e,n)},fade:function(e,t){var i=He(e);return i.a=t.value/100,i.a=We(i.a),Je(e,i)},spin:function(e,t){var i=He(e),n=(i.h+t.value)%360;return i.h=n<0?360+n:n,Je(e,i)},mix:function(e,t,i){i||(i=new ee(50));var n=i.value/100,r=2*n-1,s=He(e).a-He(t).a,o=((r*s==-1?r:(r+s)/(1+r*s))+1)/2,a=1-o,l=[e.rgb[0]*o+t.rgb[0]*a,e.rgb[1]*o+t.rgb[1]*a,e.rgb[2]*o+t.rgb[2]*a],u=e.alpha*n+t.alpha*(1-n);return new c(l,u)},greyscale:function(e){return ze.desaturate(e,new ee(100))},contrast:function(e,t,i,n){if(!e.rgb)return null;if(void 0===i&&(i=ze.rgba(255,255,255,1)),void 0===t&&(t=ze.rgba(0,0,0,1)),t.luma()>i.luma()){var r=i;i=t,t=r}return n=void 0===n?.43:Ke(n),e.luma().5&&(n=1,i=e>.25?Math.sqrt(e):((16*e-12)*e+4)*e),e-(1-2*t)*n*(i-e)},hardlight:function(e,t){return Ye.overlay(t,e)},difference:function(e,t){return Math.abs(e-t)},exclusion:function(e,t){return e+t-2*e*t},average:function(e,t){return(e+t)/2},negation:function(e,t){return 1-Math.abs(e+t-1)}};for(var et in Ye)Ye.hasOwnProperty(et)&&(Xe[et]=Xe.bind(null,Ye[et]));var tt=function(e){return Array.isArray(e.value)?e.value:Array(e)},it={_SELF:function(e){return e},"~":function(){for(var e=[],t=0;to.value)&&(c[n]=r);else{if(void 0!==l&&a!==l)throw{type:"Argument",message:"incompatible types"};h[a]=c.length,c.push(r)}else Array.isArray(t[i].value)&&Array.prototype.push.apply(t,Array.prototype.slice.call(t[i].value));return 1==c.length?c[0]:(t=c.map((function(e){return e.toCSS(this.context)})).join(this.context.compress?",":", "),new j((e?"min":"max")+"("+t+")"))},at={min:function(){for(var e=[],t=0;t",r=0;r";return n+="',n=encodeURIComponent(n),new ce(new ue("'"+(n="data:image/svg+xml,"+n)+"'",n,!1,this.index,this.currentFileInfo),this.index,this.currentFileInfo)}}),H.addMultiple(ht),t};function pt(e,t){var i,n=(t=t||{}).variables,r=new q.Eval(t);"object"!=typeof n||Array.isArray(n)||(n=Object.keys(n).map((function(e){var t=n[e];return t instanceof Ce.Value||(t instanceof Ce.Expression||(t=new Ce.Expression([t])),t=new Ce.Value([t])),new Ce.Declaration("@"+e,t,!1,null,0)})),r.frames=[new Ce.Ruleset(null,n)]);var s,o,a=[new De.JoinSelectorVisitor,new De.MarkVisibleSelectorsVisitor(!0),new De.ExtendVisitor,new De.ToCSSVisitor({compress:Boolean(t.compress)})],l=[];if(t.pluginManager){o=t.pluginManager.visitor();for(var u=0;u<2;u++)for(o.first();s=o.get();)s.isPreEvalVisitor?0!==u&&-1!==l.indexOf(s)||(l.push(s),s.run(e)):0!==u&&-1!==a.indexOf(s)||(s.isPreVisitor?a.unshift(s):a.push(s))}i=e.eval(r);for(u=0;u=t);i++);this.preProcessors.splice(i,0,{preProcessor:e,priority:t})},e.prototype.addPostProcessor=function(e,t){var i;for(i=0;i=t);i++);this.postProcessors.splice(i,0,{postProcessor:e,priority:t})},e.prototype.addFileManager=function(e){this.fileManagers.push(e)},e.prototype.getPreProcessors=function(){for(var e=[],t=0;t0){var n=void 0,r=JSON.stringify(this._sourceMapGenerator.toJSON());this.sourceMapURL?n=this.sourceMapURL:this._sourceMapFilename&&(n=this._sourceMapFilename),this.sourceMapURL=n,this.sourceMap=r}return this._css.join("")},t}()}(e=new s(e,t)),e)),a=function(e){return function(){function t(e,t,i){this.less=e,this.rootFilename=i.filename,this.paths=t.paths||[],this.contents={},this.contentsIgnoredChars={},this.mime=t.mime,this.error=null,this.context=t,this.queue=[],this.files={}}return t.prototype.push=function(t,i,n,s,o){var a=this,l=this.context.pluginManager.Loader;this.queue.push(t);var u=function(e,i,n){a.queue.splice(a.queue.indexOf(t),1);var l=n===a.rootFilename;s.optional&&e?(o(null,{rules:[]},!1,null),r.info("The file "+n+" was skipped because it was not found and the import was marked optional.")):(a.files[n]||s.inline||(a.files[n]={root:i,options:s}),e&&!a.error&&(a.error=e),o(e,i,l,n))},c={rewriteUrls:this.context.rewriteUrls,entryPath:n.entryPath,rootpath:n.rootpath,rootFilename:n.rootFilename},h=e.getFileManager(t,n.currentDirectory,this.context,e);if(h){var f,p,v=function(e){var t,i=e.filename,r=e.contents.replace(/^\uFEFF/,"");c.currentDirectory=h.getPath(i),c.rewriteUrls&&(c.rootpath=h.join(a.context.rootpath||"",h.pathDiff(c.currentDirectory,c.entryPath)),!h.isPathAbsolute(c.rootpath)&&h.alwaysMakePathsAbsolute()&&(c.rootpath=h.join(c.entryPath,c.rootpath))),c.filename=i;var o=new q.Parse(a.context);o.processImports=!1,a.contents[i]=r,(n.reference||s.reference)&&(c.reference=!0),s.isPlugin?(t=l.evalPlugin(r,o,a,s.pluginArgs,c))instanceof O?u(t,null,i):u(null,t,i):s.inline?u(null,r,i):!a.files[i]||a.files[i].options.multiple||s.multiple?new Ue(o,a,c).parse(r,(function(e,t){u(e,t,i)})):u(null,a.files[i].root,i)},d=_(this.context);i&&(d.ext=s.isPlugin?".js":".less"),s.isPlugin?(d.mime="application/javascript",d.syncImport?f=l.loadPluginSync(t,n.currentDirectory,d,e,h):p=l.loadPlugin(t,n.currentDirectory,d,e,h)):d.syncImport?f=h.loadFileSync(t,n.currentDirectory,d,e):p=h.loadFile(t,n.currentDirectory,d,e,(function(e,t){e?u(e):v(t)})),f?f.filename?v(f):u(f):p&&p.then(v,u)}else u({message:"Could not find a file-manager for "+t})},t}()}(e);var u,c=function(e,t,i){var n=function(e,i,r){if("function"==typeof i?(r=i,i=M(this.options,{})):i=M(this.options,i||{}),!r){var s=this;return new Promise((function(t,r){n.call(s,e,i,(function(e,i){e?r(e):t(i)}))}))}this.parse(e,i,(function(e,i,n,s){if(e)return r(e);var o;try{o=new t(i,n).toCSS(s)}catch(e){return r(e)}r(null,o)}))};return n}(0,o),h=function(e,t,i){var n=function(e,t,r){if("function"==typeof t?(r=t,t=M(this.options,{})):t=M(this.options,t||{}),!r){var s=this;return new Promise((function(i,r){n.call(s,e,t,(function(e,t){e?r(e):i(t)}))}))}var o,a=void 0,l=new yt(this,!t.reUsePluginManager);if(t.pluginManager=l,o=new q.Parse(t),t.rootFileInfo)a=t.rootFileInfo;else{var u=t.filename||"input",c=u.replace(/[^\/\\]*$/,"");(a={filename:u,rewriteUrls:o.rewriteUrls,rootpath:o.rootpath||"",currentDirectory:c,entryPath:c,rootFilename:u}).rootpath&&"/"!==a.rootpath.slice(-1)&&(a.rootpath+="/")}var h=new i(this,o,a);this.importManager=h,t.plugins&&t.plugins.forEach((function(e){var t,i;if(e.fileContent){if(i=e.fileContent.replace(/^\uFEFF/,""),(t=l.Loader.evalPlugin(i,o,h,e.options,e.filename))instanceof O)return r(t)}else l.addPlugin(e)})),new Ue(o,h,a).parse(e,(function(e,i){if(e)return r(e);r(null,i,h,t)}),t)};return n}(0,0,a),f={version:[4,0,0],data:l,tree:Ce,Environment:s,AbstractFileManager:ke,AbstractPluginLoader:_e,environment:e,visitors:De,Parser:Ue,functions:ft(e),contexts:q,SourceMapOutput:i,SourceMapBuilder:n,ParseTree:o,ImportManager:a,render:c,parse:h,LessError:O,transformTree:pt,utils:P,PluginManager:yt,logger:r},p=function(e){return function(){var t=Object.create(e.prototype);return e.apply(t,Array.prototype.slice.call(arguments,0)),t}},v=Object.create(f);for(var d in f.tree)if("function"==typeof(u=f.tree[d]))v[d.toLowerCase()]=p(u);else for(var m in v[d]=Object.create(null),u)v[d][m.toLowerCase()]=p(u[m]);return f.parse=f.parse.bind(v),f.render=f.render.bind(v),v}var wt={},xt=function(){};xt.prototype=Object.assign(new ke,{alwaysMakePathsAbsolute:function(){return!0},join:function(e,t){return e?this.extractUrlParts(t,e).path:t},doXHR:function(e,t,i,n){var r=new XMLHttpRequest,s=!dt.isFileProtocol||dt.fileAsync;function o(t,i,n){t.status>=200&&t.status<300?i(t.responseText,t.getResponseHeader("Last-Modified")):"function"==typeof n&&n(t.status,e)}"function"==typeof r.overrideMimeType&&r.overrideMimeType("text/css"),mt.debug("XHR: Getting '"+e+"'"),r.open("GET",e,s),r.setRequestHeader("Accept",t||"text/x-less, text/css; q=0.9, */*; q=0.5"),r.send(null),dt.isFileProtocol&&!dt.fileAsync?0===r.status||r.status>=200&&r.status<300?i(r.responseText):n(r.status,e):s?r.onreadystatechange=function(){4==r.readyState&&o(r,i,n)}:o(r,i,n)},supports:function(){return!0},clearFileCache:function(){wt={}},loadFile:function(e,t,i,n){t&&!this.isPathAbsolute(e)&&(e=t+e),e=i.ext?this.tryAppendExtension(e,i.ext):e,i=i||{};var r=this.extractUrlParts(e,window.location.href).url,s=this;return new Promise((function(e,t){if(i.useFileCache&&wt[r])try{var n=wt[r];return e({contents:n,filename:r,webInfo:{lastModified:new Date}})}catch(e){return t({filename:r,message:"Error loading file "+r+" error was "+e.message})}s.doXHR(r,i.mime,(function(t,i){wt[r]=t,e({contents:t,filename:r,webInfo:{lastModified:i}})}),(function(e,i){t({type:"File",message:"'"+i+"' wasn't found ("+e+")",href:r})}))}))}});var St=function(e,t){return dt=e,mt=t,xt},It=function(e){this.less=e};It.prototype=Object.assign(new _e,{loadPlugin:function(e,t,i,n,r){return new Promise((function(s,o){r.loadFile(e,t,i,n).then(s).catch(o)}))}});var Ct=function(t,n,r){return{add:function(s,o){r.errorReporting&&"html"!==r.errorReporting?"console"===r.errorReporting?function(e,t){var i=e.filename||t,s=[],o=(e.type||"Syntax")+"Error: "+(e.message||"There is an error in your .less file")+" in "+i,a=function(e,t,i){void 0!==e.extract[t]&&s.push("{line} {content}".replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,i).replace(/\{content\}/,e.extract[t]))};e.line&&(a(e,0,""),a(e,1,"line"),a(e,2,""),o+=" on line "+e.line+", column "+(e.column+1)+":\n"+s.join("\n")),e.stack&&(e.extract||r.logLevel>=4)&&(o+="\nStack Trace\n"+e.stack),n.logger.error(o)}(s,o):"function"==typeof r.errorReporting&&r.errorReporting("add",s,o):function(n,s){var o,a,l="less-error-message:"+e(s||""),u=t.document.createElement("div"),c=[],h=n.filename||s,f=h.match(/([^\/]+(\?.*)?)$/)[1];u.id=l,u.className="less-error-message",a="

    "+(n.type||"Syntax")+"Error: "+(n.message||"There is an error in your .less file")+'

    in '+f+" ";var p=function(e,t,i){void 0!==e.extract[t]&&c.push('

  • {content}
  • '.replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,i).replace(/\{content\}/,e.extract[t]))};n.line&&(p(n,0,""),p(n,1,"line"),p(n,2,""),a+="on line "+n.line+", column "+(n.column+1)+":

      "+c.join("")+"
    "),n.stack&&(n.extract||r.logLevel>=4)&&(a+="
    Stack Trace
    "+n.stack.split("\n").slice(1).join("
    ")),u.innerHTML=a,i(t.document,[".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #dd6666;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.line {","color: #ff0000;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),u.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),"development"===r.env&&(o=setInterval((function(){var e=t.document,i=e.body;i&&(e.getElementById(l)?i.replaceChild(u,e.getElementById(l)):i.insertBefore(u,i.firstChild),clearInterval(o))}),10))}(s,o)},remove:function(i){r.errorReporting&&"html"!==r.errorReporting?"console"===r.errorReporting||"function"==typeof r.errorReporting&&r.errorReporting("remove",i):function(i){var n=t.document.getElementById("less-error-message:"+e(i));n&&n.parentNode.removeChild(n)}(i)}}},kt={javascriptEnabled:!1,depends:!1,compress:!1,lint:!1,paths:[],color:!0,strictImports:!1,insecure:!1,rootpath:"",rewriteUrls:!1,math:1,strictUnits:!1,globalVars:null,modifyVars:null,urlArgs:""};if(window.less)for(var _t in window.less)window.less.hasOwnProperty(_t)&&(kt[_t]=window.less[_t]);!function(e,i){t(i,n(e)),void 0===i.isFileProtocol&&(i.isFileProtocol=/^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(e.location.protocol)),i.async=i.async||!1,i.fileAsync=i.fileAsync||!1,i.poll=i.poll||(i.isFileProtocol?1e3:1500),i.env=i.env||("127.0.0.1"==e.location.hostname||"0.0.0.0"==e.location.hostname||"localhost"==e.location.hostname||e.location.port&&e.location.port.length>0||i.isFileProtocol?"development":"production");var r=/!dumpLineNumbers:(comments|mediaquery|all)/.exec(e.location.hash);r&&(i.dumpLineNumbers=r[1]),void 0===i.useFileCache&&(i.useFileCache=!0),void 0===i.onReady&&(i.onReady=!0),i.relativeUrls&&(i.rewriteUrls="all")}(window,kt),kt.plugins=kt.plugins||[],window.LESS_PLUGINS&&(kt.plugins=kt.plugins.concat(window.LESS_PLUGINS));var At,Mt,Et,Pt=function(e,n){var r=e.document,s=bt();s.options=n;var o=s.environment,a=St(n,s.logger),l=new a;o.addFileManager(l),s.FileManager=a,s.PluginLoader=It,function(e,t){t.logLevel=void 0!==t.logLevel?t.logLevel:"development"===t.env?3:1,t.loggers||(t.loggers=[{debug:function(e){t.logLevel>=4&&console.log(e)},info:function(e){t.logLevel>=3&&console.log(e)},warn:function(e){t.logLevel>=2&&console.warn(e)},error:function(e){t.logLevel>=1&&console.error(e)}}]);for(var i=0;i0&&l.childNodes.length>0&&o.firstChild.nodeValue===l.firstChild.nodeValue);var u=t.getElementsByTagName("head")[0];if(null===o||!1===a){var c=n&&n.nextSibling||null;c?c.parentNode.insertBefore(l,c):u.appendChild(l)}if(o&&!1===a&&o.parentNode.removeChild(o),l.styleSheet)try{l.styleSheet.cssText=i}catch(e){throw new Error("Couldn't reassign styleSheet.cssText.")}},n=function(e){var t,i=e.document;return i.currentScript||(t=i.getElementsByTagName("script"))[t.length-1]},r={error:function(e){this._fireEvent("error",e)},warn:function(e){this._fireEvent("warn",e)},info:function(e){this._fireEvent("info",e)},debug:function(e){this._fireEvent("debug",e)},addListener:function(e){this._listeners.push(e)},removeListener:function(e){for(var t=0;t=0;a--){var l=o[a];if(l[s?"supportsSync":"supports"](e,t,i,n))return l}return null},e.prototype.addFileManager=function(e){this.fileManagers.push(e)},e.prototype.clearFileManagers=function(){this.fileManagers=[]},e}(),o={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",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:"#ff00ff",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:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",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:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",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:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},a={length:{m:1,cm:.01,mm:.001,in:.0254,px:.0254/96,pt:.0254/72,pc:.0254/72*12},duration:{s:1,ms:.001},angle:{rad:1/(2*Math.PI),deg:1/360,grad:1/400,turn:1}},l={colors:o,unitConversions:a},u=function(){function e(){this.parent=null,this.visibilityBlocks=void 0,this.nodeVisible=void 0,this.rootNode=null,this.parsed=null;var e=this;Object.defineProperty(this,"currentFileInfo",{get:function(){return e.fileInfo()}}),Object.defineProperty(this,"index",{get:function(){return e.getIndex()}})}return e.prototype.setParent=function(t,i){function n(t){t&&t instanceof e&&(t.parent=i)}Array.isArray(t)?t.forEach(n):n(t)},e.prototype.getIndex=function(){return this._index||this.parent&&this.parent.getIndex()||0},e.prototype.fileInfo=function(){return this._fileInfo||this.parent&&this.parent.fileInfo()||{}},e.prototype.isRulesetLike=function(){return!1},e.prototype.toCSS=function(e){var t=[];return this.genCSS(e,{add:function(e,i,n){t.push(e)},isEmpty:function(){return 0===t.length}}),t.join("")},e.prototype.genCSS=function(e,t){t.add(this.value)},e.prototype.accept=function(e){this.value=e.visit(this.value)},e.prototype.eval=function(){return this},e.prototype._operate=function(e,t,i,n){switch(t){case"+":return i+n;case"-":return i-n;case"*":return i*n;case"/":return i/n}},e.prototype.fround=function(e,t){var i=e&&e.numPrecision;return i?Number((t+2e-16).toFixed(i)):t},e.compare=function(t,i){if(t.compare&&"Quoted"!==i.type&&"Anonymous"!==i.type)return t.compare(i);if(i.compare)return-i.compare(t);if(t.type===i.type){if(t=t.value,i=i.value,!Array.isArray(t))return t===i?0:void 0;if(t.length===i.length){for(var n=0;nt?1:void 0},e.prototype.blocksVisibility=function(){return null==this.visibilityBlocks&&(this.visibilityBlocks=0),0!==this.visibilityBlocks},e.prototype.addVisibilityBlock=function(){null==this.visibilityBlocks&&(this.visibilityBlocks=0),this.visibilityBlocks=this.visibilityBlocks+1},e.prototype.removeVisibilityBlock=function(){null==this.visibilityBlocks&&(this.visibilityBlocks=0),this.visibilityBlocks=this.visibilityBlocks-1},e.prototype.ensureVisibility=function(){this.nodeVisible=!0},e.prototype.ensureInvisibility=function(){this.nodeVisible=!1},e.prototype.isVisible=function(){return this.nodeVisible},e.prototype.visibilityInfo=function(){return{visibilityBlocks:this.visibilityBlocks,nodeVisible:this.nodeVisible}},e.prototype.copyVisibilityInfo=function(e){e&&(this.visibilityBlocks=e.visibilityBlocks,this.nodeVisible=e.nodeVisible)},e}(),c=function(e,t,i){var n=this;Array.isArray(e)?this.rgb=e:e.length>=6?(this.rgb=[],e.match(/.{2}/g).map((function(e,t){t<3?n.rgb.push(parseInt(e,16)):n.alpha=parseInt(e,16)/255}))):(this.rgb=[],e.split("").map((function(e,t){t<3?n.rgb.push(parseInt(e+e,16)):n.alpha=parseInt(e+e,16)/255}))),this.alpha=this.alpha||("number"==typeof t?t:1),void 0!==i&&(this.value=i)};function h(e,t){return Math.min(Math.max(e,0),t)}function f(e){return"#"+e.map((function(e){return((e=h(Math.round(e),255))<16?"0":"")+e.toString(16)})).join("")}c.prototype=Object.assign(new u,{type:"Color",luma:function(){var e=this.rgb[0]/255,t=this.rgb[1]/255,i=this.rgb[2]/255;return.2126*(e=e<=.03928?e/12.92:Math.pow((e+.055)/1.055,2.4))+.7152*(t=t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4))+.0722*(i=i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4))},genCSS:function(e,t){t.add(this.toCSS(e))},toCSS:function(e,t){var i,n,r,s=e&&e.compress&&!t,o=[];if(n=this.fround(e,this.alpha),this.value)if(0===this.value.indexOf("rgb"))n<1&&(r="rgba");else{if(0!==this.value.indexOf("hsl"))return this.value;r=n<1?"hsla":"hsl"}else n<1&&(r="rgba");switch(r){case"rgba":o=this.rgb.map((function(e){return h(Math.round(e),255)})).concat(h(n,1));break;case"hsla":o.push(h(n,1));case"hsl":i=this.toHSL(),o=[this.fround(e,i.h),this.fround(e,100*i.s)+"%",this.fround(e,100*i.l)+"%"].concat(o)}if(r)return r+"("+o.join(","+(s?"":" "))+")";if(i=this.toRGB(),s){var a=i.split("");a[1]===a[2]&&a[3]===a[4]&&a[5]===a[6]&&(i="#"+a[1]+a[3]+a[5])}return i},operate:function(e,t,i){for(var n=new Array(3),r=this.alpha*(1-i.alpha)+i.alpha,s=0;s<3;s++)n[s]=this._operate(e,t,this.rgb[s],i.rgb[s]);return new c(n,r)},toRGB:function(){return f(this.rgb)},toHSL:function(){var e,t,i=this.rgb[0]/255,n=this.rgb[1]/255,r=this.rgb[2]/255,s=this.alpha,o=Math.max(i,n,r),a=Math.min(i,n,r),l=(o+a)/2,u=o-a;if(o===a)e=t=0;else{switch(t=l>.5?u/(2-o-a):u/(o+a),o){case i:e=(n-r)/u+(n=0&&"\n"!==t.charAt(i);)r++;return"number"==typeof e&&(n=(t.slice(0,e).match(/\n/g)||"").length),{line:n,column:r}}function k(e){var t,i=e.length,n=new Array(i);for(t=0;t|Function):(\d+):(\d+)/,O=function(e,t,i){Error.call(this);var n=e.filename||i;if(this.message=e.message,this.stack=e.stack,t&&n){var r=t.contents[n],s=C(e.index,r),o=s.line,a=s.column,l=e.call&&C(e.call,r).line,u=r?r.split("\n"):"";if(this.type=e.type||"Syntax",this.filename=n,this.index=e.index,this.line="number"==typeof o?o+1:null,this.column=a,!this.line&&this.stack){var c=this.stack.match(R),h=new Function("a","throw new Error()"),f=0;try{h()}catch(e){var p=e.stack.match(R);f=1-(o=parseInt(p[2]))}c&&(c[2]&&(this.line=parseInt(c[2])+f),c[3]&&(this.column=parseInt(c[3])))}this.callLine=l+1,this.callExtract=u[l],this.extract=[u[this.line-2],u[this.line-1],u[this.line]]}};if(void 0===Object.create){var V=function(){};V.prototype=Error.prototype,O.prototype=new V}else O.prototype=Object.create(Error.prototype);O.prototype.constructor=O,O.prototype.toString=function(e){e=e||{};var t="",i=this.extract||[],n=[],r=function(e){return e};if(e.stylize){var s=typeof e.stylize;if("function"!==s)throw Error("options.stylize should be a function, got a "+s+"!");r=e.stylize}if(null!==this.line){if("string"==typeof i[0]&&n.push(r(this.line-1+" "+i[0],"grey")),"string"==typeof i[1]){var o=this.line+" ";i[1]&&(o+=i[1].slice(0,this.column)+r(r(r(i[1].substr(this.column,1),"bold")+i[1].slice(this.column+1),"red"),"inverse")),n.push(o)}"string"==typeof i[2]&&n.push(r(this.line+1+" "+i[2],"grey")),n=n.join("\n")+r("","reset")+"\n"}return t+=r(this.type+"Error: "+this.message,"red"),this.filename&&(t+=r(" in ","red")+this.filename),this.line&&(t+=r(" on line "+this.line+", column "+(this.column+1)+":","grey")),t+="\n"+n,this.callLine&&(t+=r("from ","red")+(this.filename||"")+"/n",t+=r(this.callLine,"grey")+" "+this.callExtract+"/n"),t};var F=function(e,t,i,n,r,s){this.extendList=t,this.condition=i,this.evaldCondition=!i,this._index=n,this._fileInfo=r,this.elements=this.getElements(e),this.mixinElements_=void 0,this.copyVisibilityInfo(s),this.setParent(this.elements,this)};F.prototype=Object.assign(new u,{type:"Selector",accept:function(e){this.elements&&(this.elements=e.visitArray(this.elements)),this.extendList&&(this.extendList=e.visitArray(this.extendList)),this.condition&&(this.condition=e.visit(this.condition))},createDerived:function(e,t,i){e=this.getElements(e);var n=new F(e,t||this.extendList,null,this.getIndex(),this.fileInfo(),this.visibilityInfo());return n.evaldCondition=null!=i?i:this.evaldCondition,n.mediaEmpty=this.mediaEmpty,n},getElements:function(e){return e?("string"==typeof e&&this.parse.parseNode(e,["selector"],this._index,this._fileInfo,(function(t,i){if(t)throw new O({index:t.index,message:t.message},this.parse.imports,this._fileInfo.filename);e=i[0].elements})),e):[new m("","&",!1,this._index,this._fileInfo)]},createEmptySelectors:function(){var e=new m("","&",!1,this._index,this._fileInfo),t=[new F([e],null,null,this._index,this._fileInfo)];return t[0].mediaEmpty=!0,t},match:function(e){var t,i,n=this.elements,r=n.length;if(0===(t=(e=e.mixinElements()).length)||rg.PARENS_DIVISION)||this.parensStack&&this.parensStack.length))},q.Eval.prototype.pathRequiresRewrite=function(e){return(this.rewriteUrls===b?J:W)(e)},q.Eval.prototype.rewritePath=function(e,t){var i;return t=t||"",i=this.normalizePath(t+e),J(e)&&W(t)&&!1===J(i)&&(i="./"+i),i},q.Eval.prototype.normalizePath=function(e){var t,i=e.split("/").reverse();for(e=[];0!==i.length;)switch(t=i.pop()){case".":break;case"..":0===e.length||".."===e[e.length-1]?e.push(t):e.pop();break;default:e.push(t)}return e.join("/")};var H=function e(t){return{_data:{},add:function(e,t){e=e.toLowerCase(),this._data.hasOwnProperty(e),this._data[e]=t},addMultiple:function(e){var t=this;Object.keys(e).forEach((function(i){t.add(i,e[i])}))},get:function(e){return this._data[e]||t&&t.get(e)},getLocalFunctions:function(){return this._data},inherit:function(){return e(this)},create:function(t){return e(t)}}}(null),Q={eval:function(){var e=this.value_,t=this.error_;if(t)throw t;if(null!=e)return e?L.True:L.False},value:function(e){this.value_=e},error:function(e){this.error_=e},reset:function(){this.value_=this.error_=null}},K=function(e,t,i,n){this.selectors=e,this.rules=t,this._lookups={},this._variables=null,this._properties=null,this.strictImports=i,this.copyVisibilityInfo(n),this.allowRoot=!0,this.setParent(this.selectors,this),this.setParent(this.rules,this)};K.prototype=Object.assign(new u,{type:"Ruleset",isRuleset:!0,isRulesetLike:function(){return!0},accept:function(e){this.paths?this.paths=e.visitArray(this.paths,!0):this.selectors&&(this.selectors=e.visitArray(this.selectors)),this.rules&&this.rules.length&&(this.rules=e.visitArray(this.rules))},eval:function(e){var t,i,n,r,s,o=!1;if(this.selectors&&(i=this.selectors.length)){for(t=new Array(i),Q.error({type:"Syntax",message:"it is currently only allowed in parametric mixin guards,"}),r=0;r0;e--){var t=this.rules[e-1];if(t instanceof D)return this.parseValue(t)}},parseValue:function(e){var t=this;function i(e){return e.value instanceof j&&!e.parsed?("string"==typeof e.value.value?this.parse.parseNode(e.value.value,["value","important"],e.value.getIndex(),e.fileInfo(),(function(t,i){t&&(e.parsed=!0),i&&(e.value=i[0],e.important=i[1]||"",e.parsed=!0)})):e.parsed=!0,e):e}if(Array.isArray(e)){var n=[];return e.forEach((function(e){n.push(i.call(t,e))})),n}return i.call(t,e)},rulesets:function(){if(!this.rules)return[];var e,t,i=[],n=this.rules;for(e=0;t=n[e];e++)t.isRuleset&&i.push(t);return i},prependRule:function(e){var t=this.rules;t?t.unshift(e):this.rules=[e],this.setParent(e,this)},find:function(e,t,i){t=t||this;var n,r,s=[],o=e.toCSS();return o in this._lookups?this._lookups[o]:(this.rulesets().forEach((function(o){if(o!==t)for(var a=0;an){if(!i||i(o)){r=o.find(new F(e.elements.slice(n)),t,i);for(var l=0;l0&&t.add(l),e.firstSelector=!0,o[0].genCSS(e,t),e.firstSelector=!1,n=1;n0?(s=(r=k(e)).pop(),o=n.createDerived(k(s.elements))):o=n.createDerived([]),t.length>0){var a=i.combinator,l=t[0].elements[0];a.emptyOrWhitespace&&!l.combinator.emptyOrWhitespace&&(a=l.combinator),o.elements.push(new m(a,l.value,i.isVariable,i._index,i._fileInfo)),o.elements=o.elements.concat(t[0].elements.slice(1))}if(0!==o.elements.length&&r.push(o),t.length>1){var u=t.slice(1);u=u.map((function(e){return e.createDerived(e.elements,[])})),r=r.concat(u)}return r}function o(e,t,i,n,r){var o;for(o=0;o0?n[n.length-1]=n[n.length-1].createDerived(n[n.length-1].elements.concat(e)):n.push(new F(e));else t.push([new F(e)])}function l(e,t){var i=t.createDerived(t.elements,t.extendList,t.evaldCondition);return i.copyVisibilityInfo(e),i}var u,c;if(!function e(t,i,l){var u,c,h,f,v,d,g,y,b,w,x,S,I=!1;for(f=[],v=[[]],u=0;y=l.elements[u];u++)if("&"!==y.value){var C=(S=void 0,(x=y).value instanceof p&&(S=x.value.value)instanceof F?S:null);if(null!=C){a(f,v);var k,_=[],A=[];for(k=e(_,i,C),I=I||k,h=0;h<_.length;h++){o(v,[r(n(_[h],y),y)],y,l,A)}v=A,f=[]}else f.push(y)}else{for(I=!0,d=[],a(f,v),c=0;c0&&g[0].elements.push(new m(y.combinator,"",y.isVariable,y._index,y._fileInfo)),d.push(g);else for(h=0;h0&&(t.push(v[u]),w=v[u][b-1],v[u][b-1]=w.createDerived(w.elements,l.extendList));return I}(c=[],t,i))if(t.length>0)for(c=[],u=0;u0)for(t=0;t-1e-6&&(n=i.toFixed(20).replace(/0+$/,"")),e&&e.compress){if(0===i&&this.unit.isLength())return void t.add(n);i>0&&i<1&&(n=n.substr(1))}t.add(n),this.unit.genCSS(e,t)},operate:function(e,t,i){var n=this._operate(e,t,this.value,i.value),r=this.unit.clone();if("+"===t||"-"===t)if(0===r.numerator.length&&0===r.denominator.length)r=i.unit.clone(),this.unit.backupUnit&&(r.backupUnit=this.unit.backupUnit);else if(0===i.unit.numerator.length&&0===r.denominator.length);else{if(i=i.convertTo(this.unit.usedUnits()),e.strictUnits&&i.unit.toString()!==r.toString())throw new Error("Incompatible units. Change the units or use the unit function. Bad units: '"+r.toString()+"' and '"+i.unit.toString()+"'.");n=this._operate(e,t,this.value,i.value)}else"*"===t?(r.numerator=r.numerator.concat(i.unit.numerator).sort(),r.denominator=r.denominator.concat(i.unit.denominator).sort(),r.cancel()):"/"===t&&(r.numerator=r.numerator.concat(i.unit.denominator).sort(),r.denominator=r.denominator.concat(i.unit.numerator).sort(),r.cancel());return new ee(n,r)},compare:function(e){var t,i;if(e instanceof ee){if(this.unit.isEmpty()||e.unit.isEmpty())t=this,i=e;else if(t=this.unify(),i=e.unify(),0!==t.unit.compare(i.unit))return;return u.numericCompare(t.value,i.value)}},unify:function(){return this.convertTo({length:"px",duration:"s",angle:"rad"})},convertTo:function(e){var t,i,n,r,s,o=this.value,l=this.unit.clone(),u={};if("string"==typeof e){for(t in a)a[t].hasOwnProperty(e)&&((u={})[t]=e);e=u}for(i in s=function(e,t){return n.hasOwnProperty(e)?(t?o/=n[e]/n[r]:o*=n[e]/n[r],r):e},e)e.hasOwnProperty(i)&&(r=e[i],n=a[i],l.map(s));return l.cancel(),new ee(o,l)}});var te=g,ie=function(e,t,i){this.op=e.trim(),this.operands=t,this.isSpaced=i};ie.prototype=Object.assign(new u,{type:"Operation",accept:function(e){this.operands=e.visitArray(this.operands)},eval:function(e){var t,i=this.operands[0].eval(e),n=this.operands[1].eval(e);if(e.isMathOn(this.op)){if(t="./"===this.op?"/":this.op,i instanceof ee&&n instanceof c&&(i=i.toColor()),n instanceof ee&&i instanceof c&&(n=n.toColor()),!i.operate){if(i instanceof ie&&"/"===i.op&&e.math===te.PARENS_DIVISION)return new ie(this.op,[i,n],this.isSpaced);throw{type:"Operation",message:"Operation on an invalid type"}}return i.operate(e,t,n)}return new ie(this.op,[i,n],this.isSpaced)},genCSS:function(e,t){this.operands[0].genCSS(e,t),this.isSpaced&&t.add(" "),t.add(this.op),this.isSpaced&&t.add(" "),this.operands[1].genCSS(e,t)}});var ne=function(e,t){if(this.value=e,this.noSpacing=t,!e)throw new Error("Expression requires an array parameter")};ne.prototype=Object.assign(new u,{type:"Expression",accept:function(e){this.value=e.visitArray(this.value)},eval:function(e){var t,i=e.isMathOn(),n=this.parens,r=!1;return n&&e.inParenthesis(),this.value.length>1?t=new ne(this.value.map((function(t){return t.eval?t.eval(e):t})),this.noSpacing):1===this.value.length?(!this.value[0].parens||this.value[0].parensInOp||e.inCalc||(r=!0),t=this.value[0].eval(e)):t=this,n&&e.outOfParenthesis(),!this.parens||!this.parensInOp||i||r||t instanceof ee||(t=new p(t)),t},genCSS:function(e,t){for(var i=0;i1){var i=new F([],null,null,this.getIndex(),this.fileInfo()).createEmptySelectors();(t=new K(i,e.mediaBlocks)).multiMedia=!0,t.copyVisibilityInfo(this.visibilityInfo()),this.setParent(t,this)}return delete e.mediaBlocks,delete e.mediaPath,t},evalNested:function(e){var t,i,n=e.mediaPath.concat([this]);for(t=0;t0;t--)e.splice(t,0,new j("and"));return new ne(e)}))),this.setParent(this.features,this),new K([],[])},permute:function(e){if(0===e.length)return[];if(1===e.length)return e[0];for(var t=[],i=this.permute(e.slice(1)),n=0;n1?"["+e.value.map((function(e){return e.toCSS()})).join(", ")+"]":e.toCSS()}});var ve=function(e,t,i,n){this.escaped=t,this.expression=e,this._index=i,this._fileInfo=n};ve.prototype=Object.assign(new pe,{type:"JavaScript",eval:function(e){var t=this.evaluateJavaScript(this.expression,e),i=typeof t;return"number"!==i||isNaN(t)?"string"===i?new ue('"'+t+'"',t,this.escaped,this._index):Array.isArray(t)?new j(t.join(", ")):new j(t):new ee(t)}});var de=function(e,t){this.key=e,this.value=t};de.prototype=Object.assign(new u,{type:"Assignment",accept:function(e){this.value=e.visit(this.value)},eval:function(e){return this.value.eval?new de(this.key,this.value.eval(e)):this},genCSS:function(e,t){t.add(this.key+"="),this.value.genCSS?this.value.genCSS(e,t):t.add(this.value)}});var me=function(e,t,i,n,r){this.op=e.trim(),this.lvalue=t,this.rvalue=i,this._index=n,this.negate=r};me.prototype=Object.assign(new u,{type:"Condition",accept:function(e){this.lvalue=e.visit(this.lvalue),this.rvalue=e.visit(this.rvalue)},eval:function(e){var t=function(e,t,i){switch(e){case"and":return t&&i;case"or":return t||i;default:switch(u.compare(t,i)){case-1:return"<"===e||"=<"===e||"<="===e;case 0:return"="===e||">="===e||"=<"===e||"<="===e;case 1:return">"===e||">="===e;default:return!1}}}(this.op,this.lvalue.eval(e),this.rvalue.eval(e));return this.negate?!t:t}});var ge=function(e){this.value=e};ge.prototype=Object.assign(new u,{type:"UnicodeDescriptor"});var ye=function(e){this.value=e};ye.prototype=Object.assign(new u,{type:"Negative",genCSS:function(e,t){t.add("-"),this.value.genCSS(e,t)},eval:function(e){return e.isMathOn()?new ie("*",[new ee(-1),this.value]).eval(e):new ye(this.value.eval(e))}});var be=function(e,t,i,n,r){switch(this.selector=e,this.option=t,this.object_id=be.next_id++,this.parent_ids=[this.object_id],this._index=i,this._fileInfo=n,this.copyVisibilityInfo(r),this.allowRoot=!0,t){case"all":this.allowBefore=!0,this.allowAfter=!0;break;default:this.allowBefore=!1,this.allowAfter=!1}this.setParent(this.selector,this)};be.prototype=Object.assign(new u,{type:"Extend",accept:function(e){this.selector=e.visit(this.selector)},eval:function(e){return new be(this.selector.eval(e),this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},clone:function(e){return new be(this.selector,this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},findSelfSelectors:function(e){var t,i,n=[];for(t=0;t0&&i.length&&""===i[0].combinator.value&&(i[0].combinator.value=" "),n=n.concat(e[t].elements);this.selfSelectors=[new F(n)],this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo())}}),be.next_id=0;var we=function(e,t,i){this.variable=e,this._index=t,this._fileInfo=i,this.allowRoot=!0};we.prototype=Object.assign(new u,{type:"VariableCall",eval:function(e){var t,i=new oe(this.variable,this.getIndex(),this.fileInfo()).eval(e),n=new O({message:"Could not evaluate variable call "+this.variable});if(!i.ruleset){if(i.rules)t=i;else if(Array.isArray(i))t=new K("",i);else{if(!Array.isArray(i.value))throw n;t=new K("",i.value)}i=new X(t)}if(i.ruleset)return i.callEval(e);throw n}});var xe=function(e,t,i,n){this.value=e,this.lookups=t,this._index=i,this._fileInfo=n};xe.prototype=Object.assign(new u,{type:"NamespaceValue",eval:function(e){var t,i,n=this.value.eval(e);for(t=0;tthis.params.length)return!1}i=Math.min(s,this.arity);for(var o=0;o0){for(c=!0,a=0;a0)f=2;else if(f=1,p[1]+p[2]>1)throw{type:"Runtime",message:"Ambiguous use of `default()` found when matching for `"+this.format(m)+"`",index:this.getIndex(),filename:this.fileInfo().filename};for(a=0;a0&&(e=e.slice(0,t)),(t=e.lastIndexOf("/"))<0&&(t=e.lastIndexOf("\\")),t<0?"":e.slice(0,t+1)},e.prototype.tryAppendExtension=function(e,t){return/(\.[a-z]*$)|([\?;].*)$/.test(e)?e:e+t},e.prototype.tryAppendLessExtension=function(e){return this.tryAppendExtension(e,".less")},e.prototype.supportsSync=function(){return!1},e.prototype.alwaysMakePathsAbsolute=function(){return!1},e.prototype.isPathAbsolute=function(e){return/^(?:[a-z-]+:|\/|\\|#)/i.test(e)},e.prototype.join=function(e,t){return e?e+t:t},e.prototype.pathDiff=function(e,t){var i,n,r,s,o=this.extractUrlParts(e),a=this.extractUrlParts(t),l="";if(o.hostPart!==a.hostPart)return"";for(n=Math.max(a.directories.length,o.directories.length),i=0;iparseInt(t[i])?-1:1;return 0},e.prototype.versionToString=function(e){for(var t="",i=0;i0;){var e=this.imports[0];if(!e.isReady)return;this.imports=this.imports.slice(1),e.callback.apply(null,e.args)}if(0===this.variableImports.length)break;var t=this.variableImports[0];this.variableImports=this.variableImports.slice(1),t()}}finally{this._currentDepth--}0===this._currentDepth&&this._onSequencerEmpty&&this._onSequencerEmpty()},e}(),Oe=function(e,t){this._visitor=new Pe(this),this._importer=e,this._finish=t,this.context=new q.Eval,this.importCount=0,this.onceFileDetectionMap={},this.recursionDetector={},this._sequencer=new Re(this._onSequencerEmpty.bind(this))};Oe.prototype={isReplacing:!1,run:function(e){try{this._visitor.visit(e)}catch(e){this.error=e}this.isFinished=!0,this._sequencer.tryRun()},_onSequencerEmpty:function(){this.isFinished&&this._finish(this.error)},visitImport:function(e,t){var i=e.options.inline;if(!e.css||i){var n=new q.Eval(this.context,k(this.context.frames)),r=n.frames[0];this.importCount++,e.isVariableImport()?this._sequencer.addVariableImport(this.processImportNode.bind(this,e,n,r)):this.processImportNode(e,n,r)}t.visitDeeper=!1},processImportNode:function(e,t,i){var n,r=e.options.inline;try{n=e.evalForImport(t)}catch(t){t.filename||(t.index=e.getIndex(),t.filename=e.fileInfo().filename),e.css=!0,e.error=t}if(!n||n.css&&!r)this.importCount--,this.isFinished&&this._sequencer.tryRun();else{n.options.multiple&&(t.importMultiple=!0);for(var s=void 0===n.css,o=0;o=0||(a=[u.selfSelectors[0]],(s=f.findMatch(l,a)).length&&(l.hasFoundMatches=!0,l.selfSelectors.forEach((function(e){var t=u.visibilityInfo();o=f.extendSelector(s,a,e,l.isVisible()),(c=new Ce.Extend(u.selector,u.option,0,u.fileInfo(),t)).selfSelectors=o,o[o.length-1].extendList=[c],h.push(c),c.ruleset=u.ruleset,c.parent_ids=c.parent_ids.concat(u.parent_ids,l.parent_ids),u.firstExtendOnThisSelectorPath&&(c.firstExtendOnThisSelectorPath=!0,u.ruleset.paths.push(o))}))));if(h.length){if(this.extendChainCount++,i>100){var p="{unable to calculate}",v="{unable to calculate}";try{p=h[0].selfSelectors[0].toCSS(),v=h[0].selector.toCSS()}catch(e){}throw{message:"extend circular reference detected. One of the circular extends is currently:"+p+":extend("+v+")"}}return h.concat(f.doExtendChaining(h,t,i+1))}return h},e.prototype.visitDeclaration=function(e,t){t.visitDeeper=!1},e.prototype.visitMixinDefinition=function(e,t){t.visitDeeper=!1},e.prototype.visitSelector=function(e,t){t.visitDeeper=!1},e.prototype.visitRuleset=function(e,t){if(!e.root){var i,n,r,s,o=this.allExtendsStack[this.allExtendsStack.length-1],a=[],l=this;for(r=0;r0&&u[l.matched].combinator.value!==o?l=null:l.matched++,l&&(l.finished=l.matched===u.length,l.finished&&!e.allowAfter&&(r+1u&&c>0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[u].elements.slice(c)),c=0,u++),l=s.elements.slice(c,a.index).concat([o]).concat(i.elements.slice(1)),u===a.pathIndex&&r>0?h[h.length-1].elements=h[h.length-1].elements.concat(l):(h=h.concat(t.slice(u,a.pathIndex))).push(new Ce.Selector(l)),u=a.endPathIndex,(c=a.endPathElementIndex)>=t[u].elements.length&&(c=0,u++);return u0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[u].elements.slice(c)),u++),h=(h=h.concat(t.slice(u,t.length))).map((function(e){var t=e.createDerived(e.elements);return n?t.ensureVisibility():t.ensureInvisibility(),t}))},e.prototype.visitMedia=function(e,t){var i=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);i=i.concat(this.doExtendChaining(i,e.allExtends)),this.allExtendsStack.push(i)},e.prototype.visitMediaOut=function(e){var t=this.allExtendsStack.length-1;this.allExtendsStack.length=t},e.prototype.visitAtRule=function(e,t){var i=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);i=i.concat(this.doExtendChaining(i,e.allExtends)),this.allExtendsStack.push(i)},e.prototype.visitAtRuleOut=function(e){var t=this.allExtendsStack.length-1;this.allExtendsStack.length=t},e}(),Le=function(){function e(){this.contexts=[[]],this._visitor=new Pe(this)}return e.prototype.run=function(e){return this._visitor.visit(e)},e.prototype.visitDeclaration=function(e,t){t.visitDeeper=!1},e.prototype.visitMixinDefinition=function(e,t){t.visitDeeper=!1},e.prototype.visitRuleset=function(e,t){var i,n=this.contexts[this.contexts.length-1],r=[];this.contexts.push(r),e.root||((i=e.selectors)&&(i=i.filter((function(e){return e.getIsOutput()})),e.selectors=i.length?i:i=null,i&&e.joinSelectors(r,n,i)),i||(e.rules=null),e.paths=r)},e.prototype.visitRulesetOut=function(e){this.contexts.length=this.contexts.length-1},e.prototype.visitMedia=function(e,t){var i=this.contexts[this.contexts.length-1];e.rules[0].root=0===i.length||i[0].multiMedia},e.prototype.visitAtRule=function(e,t){var i=this.contexts[this.contexts.length-1];e.rules&&e.rules.length&&(e.rules[0].root=e.isRooted||0===i.length||null)},e}(),je=function(){function e(e){this._visitor=new Pe(this),this._context=e}return e.prototype.containsSilentNonBlockedChild=function(e){var t;if(!e)return!1;for(var i=0;i0},e.prototype.resolveVisibility=function(e,t){if(!e.blocksVisibility()){if(this.isEmpty(e)&&!this.containsSilentNonBlockedChild(t))return;return e}var i=e.rules[0];if(this.keepOnlyVisibleChilds(i),!this.isEmpty(i))return e.ensureVisibility(),e.removeVisibilityBlock(),e},e.prototype.isVisibleRuleset=function(e){return!!e.firstRoot||!this.isEmpty(e)&&!(!e.root&&!this.hasVisibleSelector(e))},e}(),Ne=function(e){this._visitor=new Pe(this),this._context=e,this.utils=new je(e)};Ne.prototype={isReplacing:!0,run:function(e){return this._visitor.visit(e)},visitDeclaration:function(e,t){if(!e.blocksVisibility()&&!e.variable)return e},visitMixinDefinition:function(e,t){e.frames=[]},visitExtend:function(e,t){},visitComment:function(e,t){if(!e.blocksVisibility()&&!e.isSilent(this._context))return e},visitMedia:function(e,t){var i=e.rules[0].rules;return e.accept(this._visitor),t.visitDeeper=!1,this.utils.resolveVisibility(e,i)},visitImport:function(e,t){if(!e.blocksVisibility())return e},visitAtRule:function(e,t){return e.rules&&e.rules.length?this.visitAtRuleWithBody(e,t):this.visitAtRuleWithoutBody(e,t)},visitAnonymous:function(e,t){if(!e.blocksVisibility())return e.accept(this._visitor),e},visitAtRuleWithBody:function(e,t){var i=function(e){var t=e.rules;return function(e){var t=e.rules;return 1===t.length&&(!t[0].paths||0===t[0].paths.length)}(e)?t[0].rules:t}(e);return e.accept(this._visitor),t.visitDeeper=!1,this.utils.isEmpty(e)||this._mergeRules(e.rules[0].rules),this.utils.resolveVisibility(e,i)},visitAtRuleWithoutBody:function(e,t){if(!e.blocksVisibility()){if("@charset"===e.name){if(this.charset){if(e.debugInfo){var i=new Ce.Comment("/* "+e.toCSS(this._context).replace(/\n/g,"")+" */\n");return i.debugInfo=e.debugInfo,this._visitor.visit(i)}return}this.charset=!0}return e}},checkValidNodes:function(e,t){if(e)for(var i=0;i0?e.accept(this._visitor):e.rules=null,t.visitDeeper=!1}return e.rules&&(this._mergeRules(e.rules),this._removeDuplicateRules(e.rules)),this.utils.isVisibleRuleset(e)&&(e.ensureVisibility(),n.splice(0,0,e)),1===n.length?n[0]:n},_compileRulesetPaths:function(e){e.paths&&(e.paths=e.paths.filter((function(e){var t;for(" "===e[0].elements[0].combinator.value&&(e[0].elements[0].combinator=new Ce.Combinator("")),t=0;t=0;n--)if((i=e[n])instanceof Ce.Declaration)if(r[i.name]){(t=r[i.name])instanceof Ce.Declaration&&(t=r[i.name]=[r[i.name].toCSS(this._context)]);var s=i.toCSS(this._context);-1!==t.indexOf(s)?e.splice(n,1):t.push(s)}else r[i.name]=i}},_mergeRules:function(e){if(e){for(var t={},i=[],n=0;n0){var t=e[0],i=[],n=[new Ce.Expression(i)];e.forEach((function(e){"+"===e.merge&&i.length>0&&n.push(new Ce.Expression(i=[])),i.push(e.value),t.important=t.important||e.important})),t.value=new Ce.Value(n)}}))}}};var De={Visitor:Pe,ImportVisitor:Oe,MarkVisibleSelectorsVisitor:Ve,ExtendVisitor:$e,JoinSelectorVisitor:Le,ToCSSVisitor:Ne};var Ue=function(){var e,t,i,n,r,s,o,a=[],l={};function u(i){for(var n,a,c,h=l.i,f=t,p=l.i-o,v=l.i+s.length-p,d=l.i+=i,m=e;l.i=0){c={index:l.i,text:m.substr(l.i,y+2-l.i),isLineComment:!1},l.i+=c.text.length-1,l.commentStore.push(c);continue}}break}if(32!==n&&10!==n&&9!==n&&13!==n)break}if(s=s.slice(i+l.i-d+p),o=l.i,!s.length){if(ti||l.i===i&&e&&!n)&&(i=l.i,n=e);var r=a.pop();s=r.current,o=l.i=r.i,t=r.j},l.forget=function(){a.pop()},l.isWhitespace=function(t){var i=l.i+(t||0),n=e.charCodeAt(i);return 32===n||13===n||9===n||10===n},l.$re=function(e){l.i>o&&(s=s.slice(l.i-o),o=l.i);var t=e.exec(s);return t?(u(t[0].length),"string"==typeof t?t:1===t.length?t[0]:t):null},l.$char=function(t){return e.charAt(l.i)!==t?null:(u(1),t)},l.$str=function(t){for(var i=t.length,n=0;nh&&(d=!1)}}while(d);return r||null},l.autoCommentAbsorb=!0,l.commentStore=[],l.finished=!1,l.peek=function(t){if("string"==typeof t){for(var i=0;i57||t<43||47===t||44===t},l.start=function(n,a,c){e=n,l.i=t=o=i=0,r=a?function(e,t){var i,n,r,s,o,a,l,u,c,h=e.length,f=0,p=0,v=[],d=0;function m(t){var i=o-d;i<512&&!t||!i||(v.push(e.slice(d,o+1)),d=o+1)}for(o=0;o=97&&l<=122||l<34))switch(l){case 40:p++,n=o;continue;case 41:if(--p<0)return t("missing opening `(`",o);continue;case 59:p||m();continue;case 123:f++,i=o;continue;case 125:if(--f<0)return t("missing opening `{`",o);f||p||m();continue;case 92:if(o96)){if(u==l){c=1;break}if(92==u){if(o==h-1)return t("unescaped `\\`",o);o++}}if(c)continue;return t("unmatched `"+String.fromCharCode(l)+"`",a);case 47:if(p||o==h-1)continue;if(47==(u=e.charCodeAt(o+1)))for(o+=2;oi&&s>r?"missing closing `}` or `*/`":"missing closing `}`",i):0!==p?t("missing closing `)`",n):(m(!0),v)}(n,c):[n],s=r[0],u(0)},l.end=function(){var t,r=l.i>=e.length;return l.i=e.length-1,furthestChar:e[l.i]}},l},Be=function e(t,i,n){var r,s=Ue();function o(e,t){throw new O({index:s.i,filename:n.filename,type:t||"Syntax",message:e},i)}function a(e,t){var i=e instanceof Function?e.call(r):s.$re(e);if(i)return i;o(t||("string"==typeof e?"expected '"+e+"' got '"+s.currentChar()+"'":"unexpected token"))}function l(e,t){if(s.$char(e))return e;o(t||"expected '"+e+"' got '"+s.currentChar()+"'")}function u(e){var t=n.filename;return{lineNumber:C(e,s.getInput()).line+1,fileName:t}}return{parserInput:s,imports:i,fileInfo:n,parseNode:function(e,t,n,o,a){var l,u=[],c=s;try{c.start(e,!1,(function(e,t){a({message:e,index:t+n})}));for(var h=0,f=void 0,p=void 0;f=t[h];h++)if(p=c.i,l=r[f]()){try{l._index=p+n,l._fileInfo=o}catch(e){}u.push(l)}else u.push(null);c.end().isFinished?a(null,u):a(!0,null)}catch(e){throw new O({index:e.index+n,message:e.message},i,o.filename)}},parse:function(r,o,a){var l,u,c,h,f=null,p="";if(u=a&&a.globalVars?e.serializeVars(a.globalVars)+"\n":"",c=a&&a.modifyVars?"\n"+e.serializeVars(a.modifyVars):"",t.pluginManager)for(var v=t.pluginManager.getPreProcessors(),d=0;d");return e},args:function(e){var t,i,n,a,l,u,c,h=r.entities,f={args:null,variadic:!1},p=[],v=[],d=[],m=!0;for(s.save();;){if(e)u=r.detachedRuleset()||r.expression();else{if(s.commentStore.length=0,s.$str("...")){f.variadic=!0,s.$char(";")&&!t&&(t=!0),(t?v:d).push({variadic:!0});break}u=h.variable()||h.property()||h.literal()||h.keyword()||this.call(!0)}if(!u||!m)break;a=null,u.throwAwayComments&&u.throwAwayComments(),l=u;var g=null;if(e?u.value&&1==u.value.length&&(g=u.value[0]):g=u,g&&(g instanceof Ce.Variable||g instanceof Ce.Property))if(s.$char(":")){if(p.length>0&&(t&&o("Cannot mix ; and , as delimiter types"),i=!0),!(l=r.detachedRuleset()||r.expression())){if(!e)return s.restore(),f.args=[],f;o("could not understand value for named argument")}a=n=g.name}else if(s.$str("...")){if(!e){f.variadic=!0,s.$char(";")&&!t&&(t=!0),(t?v:d).push({name:u.name,variadic:!0});break}c=!0}else e||(n=a=g.name,l=null);l&&p.push(l),d.push({name:a,value:l,expand:c}),s.$char(",")?m=!0:((m=";"===s.$char(";"))||t)&&(i&&o("Cannot mix ; and , as delimiter types"),t=!0,p.length>1&&(l=new Ce.Value(p)),v.push({name:n,value:l,expand:c}),n=null,p=[],i=!1)}return s.forget(),f.args=t?v:d,f},definition:function(){var e,t,i,n,o=[],l=!1;if(!("."!==s.currentChar()&&"#"!==s.currentChar()||s.peek(/^[^{]*\}/)))if(s.save(),t=s.$re(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/)){e=t[1];var u=this.args(!1);if(o=u.args,l=u.variadic,!s.$char(")"))return void s.restore("Missing closing ')'");if(s.commentStore.length=0,s.$str("when")&&(n=a(r.conditions,"expected condition")),i=r.block())return s.forget(),new Ce.mixin.Definition(e,o,i,n,l);s.restore()}else s.restore()},ruleLookups:function(){var e,t=[];if("["===s.currentChar()){for(;;){if(s.save(),!(e=this.lookupValue())&&""!==e){s.restore();break}t.push(e),s.forget()}return t.length>0?t:void 0}},lookupValue:function(){if(s.save(),s.$char("[")){var e=s.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);if(s.$char("]"))return e||""===e?(s.forget(),e):void s.restore();s.restore()}else s.restore()}},entity:function(){var e=this.entities;return this.comment()||e.literal()||e.variable()||e.url()||e.property()||e.call()||e.keyword()||this.mixin.call(!0)||e.javascript()},end:function(){return s.$char(";")||s.peek("}")},ieAlpha:function(){var e;if(s.$re(/^opacity=/i))return(e=s.$re(/^\d+/))||(e="@{"+(e=a(r.entities.variable,"Could not parse alpha")).name.slice(1)+"}"),l(")"),new Ce.Quoted("","alpha(opacity="+e+")")},element:function(){var e,t,i,r=s.i;if(t=this.combinator(),(e=s.$re(/^(?:\d+\.\d+|\d+)%/)||s.$re(/^(?:[.#]?|:*)(?:[\w-]|[^\x00-\x9f]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/)||s.$char("*")||s.$char("&")||this.attribute()||s.$re(/^\([^&()@]+\)/)||s.$re(/^[\.#:](?=@)/)||this.entities.variableCurly())||(s.save(),s.$char("(")?(i=this.selector(!1))&&s.$char(")")?(e=new Ce.Paren(i),s.forget()):s.restore("Missing closing ')'"):s.forget()),e)return new Ce.Element(t,e,e instanceof Ce.Variable,r,n)},combinator:function(){var e=s.currentChar();if("/"===e){s.save();var t=s.$re(/^\/[a-z]+\//i);if(t)return s.forget(),new Ce.Combinator(t);s.restore()}if(">"===e||"+"===e||"~"===e||"|"===e||"^"===e){for(s.i++,"^"===e&&"^"===s.currentChar()&&(e="^^",s.i++);s.isWhitespace();)s.i++;return new Ce.Combinator(e)}return s.isWhitespace(-1)?new Ce.Combinator(" "):new Ce.Combinator(null)},selector:function(e){var t,i,r,l,u,c,h,f=s.i;for(e=!1!==e;(e&&(i=this.extend())||e&&(c=s.$str("when"))||(l=this.element()))&&(c?h=a(this.conditions,"expected condition"):h?o("CSS guard can only be used at the end of selector"):i?u=u?u.concat(i):i:(u&&o("Extend can only be used at the end of selector"),r=s.currentChar(),t?t.push(l):t=[l],l=null),"{"!==r&&"}"!==r&&";"!==r&&","!==r&&")"!==r););if(t)return new Ce.Selector(t,u,h,f,n);u&&o("Extend must be used to extend a selector, it cannot be used on its own")},selectors:function(){for(var e,t;(e=this.selector())&&(t?t.push(e):t=[e],s.commentStore.length=0,e.condition&&t.length>1&&o("Guards are only currently allowed on a single selector."),s.$char(","));)e.condition&&o("Guards are only currently allowed on a single selector."),s.commentStore.length=0;return t},attribute:function(){if(s.$char("[")){var e,t,i,n=this.entities;return(e=n.variableCurly())||(e=a(/^(?:[_A-Za-z0-9-\*]*\|)?(?:[_A-Za-z0-9-]|\\.)+/)),(i=s.$re(/^[|~*$^]?=/))&&(t=n.quoted()||s.$re(/^[0-9]+%/)||s.$re(/^[\w-]+/)||n.variableCurly()),l("]"),new Ce.Attribute(e,i,t)}},block:function(){var e;if(s.$char("{")&&(e=this.primary())&&s.$char("}"))return e},blockRuleset:function(){var e=this.block();return e&&(e=new Ce.Ruleset(null,e)),e},detachedRuleset:function(){var e,t,i;if(s.save(),!s.$re(/^[.#]\(/)||(t=(e=this.mixin.args(!1)).args,i=e.variadic,s.$char(")"))){var n=this.blockRuleset();if(n)return s.forget(),t?new Ce.mixin.Definition(null,t,n,null,i):new Ce.DetachedRuleset(n);s.restore()}else s.restore()},ruleset:function(){var e,i,n;if(s.save(),t.dumpLineNumbers&&(n=u(s.i)),(e=this.selectors())&&(i=this.block())){s.forget();var r=new Ce.Ruleset(e,i,t.strictImports);return t.dumpLineNumbers&&(r.debugInfo=n),r}s.restore()},declaration:function(){var e,t,i,r,o,a,l=s.i,u=s.currentChar();if("."!==u&&"#"!==u&&"&"!==u&&":"!==u)if(s.save(),e=this.variable()||this.ruleProperty()){if((a="string"==typeof e)&&(t=this.detachedRuleset())&&(i=!0),s.commentStore.length=0,!t){if(o=!a&&e.length>1&&e.pop().value,t=e[0].value&&"--"===e[0].value.slice(0,2)?this.permissiveValue():this.anonymousValue())return s.forget(),new Ce.Declaration(e,t,!1,o,l,n);t||(t=this.value()),t?r=this.important():a&&(t=this.permissiveValue())}if(t&&(this.end()||i))return s.forget(),new Ce.Declaration(e,t,r,o,l,n);s.restore()}else s.restore()},anonymousValue:function(){var e=s.i,t=s.$re(/^([^.#@\$+\/'"*`(;{}-]*);/);if(t)return new Ce.Anonymous(t[1],e)},permissiveValue:function(e){var t,i,r,a,l=e||";",u=s.i,c=[];function h(){var e=s.currentChar();return"string"==typeof l?e===l:l.test(e)}if(!h()){a=[];do{((i=this.comment())||(i=this.entity()))&&a.push(i)}while(i);if(r=h(),a.length>0){if(a=new Ce.Expression(a),r)return a;c.push(a)," "===s.prevChar()&&c.push(new Ce.Anonymous(" ",u))}if(s.save(),a=s.$parseUntil(l)){if("string"==typeof a&&o("Expected '"+a+"'","Parse"),1===a.length&&" "===a[0])return s.forget(),new Ce.Anonymous("",u);var f=void 0;for(t=0;t0)return new Ce.Expression(r)},mediaFeatures:function(){var e,t=this.entities,i=[];do{if(e=this.mediaFeature()){if(i.push(e),!s.$char(","))break}else if((e=t.variable()||t.mixinLookup())&&(i.push(e),!s.$char(",")))break}while(e);return i.length>0?i:null},media:function(){var e,i,r,a,l=s.i;if(t.dumpLineNumbers&&(a=u(l)),s.save(),s.$str("@media"))return e=this.mediaFeatures(),(i=this.block())||o("media definitions require block statements after any features"),s.forget(),r=new Ce.Media(i,e,l,n),t.dumpLineNumbers&&(r.debugInfo=a),r;s.restore()},plugin:function(){var e,t,i,r=s.i;if(s.$re(/^@plugin?\s+/)){if(i=(t=this.pluginArgs())?{pluginArgs:t,isPlugin:!0}:{isPlugin:!0},e=this.entities.quoted()||this.entities.url())return s.$char(";")||(s.i=r,o("missing semi-colon on @plugin")),new Ce.Import(e,null,i,r,n);s.i=r,o("malformed @plugin statement")}},pluginArgs:function(){if(s.save(),!s.$char("("))return s.restore(),null;var e=s.$re(/^\s*([^\);]+)\)\s*/);return e[1]?(s.forget(),e[1].trim()):(s.restore(),null)},atrule:function(){var e,i,r,a,l,c,h,f=s.i,p=!0,v=!0;if("@"===s.currentChar()){if(i=this.import()||this.plugin()||this.media())return i;if(s.save(),e=s.$re(/^@[a-z-]+/)){switch(a=e,"-"==e.charAt(1)&&e.indexOf("-",2)>0&&(a="@"+e.slice(e.indexOf("-",2)+1)),a){case"@charset":l=!0,p=!1;break;case"@namespace":c=!0,p=!1;break;case"@keyframes":case"@counter-style":l=!0;break;case"@document":case"@supports":h=!0,v=!1;break;default:h=!0}if(s.commentStore.length=0,l?(i=this.entity())||o("expected "+e+" identifier"):c?(i=this.expression())||o("expected "+e+" expression"):h&&(i=this.permissiveValue(/^[{;]/),p="{"===s.currentChar(),i?i.value||(i=null):p||";"===s.currentChar()||o(e+" rule is missing block or ending semi-colon")),p&&(r=this.blockRuleset()),r||!p&&i&&s.$char(";"))return s.forget(),new Ce.AtRule(e,i,r,f,n,t.dumpLineNumbers?u(f):null,v);s.restore("at-rule options not recognised")}}},value:function(){var e,t=[],i=s.i;do{if((e=this.expression())&&(t.push(e),!s.$char(",")))break}while(e);if(t.length>0)return new Ce.Value(t,i)},important:function(){if("!"===s.currentChar())return s.$re(/^! *important/)},sub:function(){var e,t;if(s.save(),s.$char("("))return(e=this.addition())&&s.$char(")")?(s.forget(),(t=new Ce.Expression([e])).parens=!0,t):void s.restore("Expected ')'");s.restore()},multiplication:function(){var e,t,i,n,r;if(e=this.operand()){for(r=s.isWhitespace(-1);!s.peek(/^\/[*\/]/);){if(s.save(),!(i=s.$char("/")||s.$char("*")||s.$str("./"))){s.forget();break}if(!(t=this.operand())){s.restore();break}s.forget(),e.parensInOp=!0,t.parensInOp=!0,n=new Ce.Operation(i,[n||e,t],r),r=s.isWhitespace(-1)}return n||e}},addition:function(){var e,t,i,n,r;if(e=this.multiplication()){for(r=s.isWhitespace(-1);(i=s.$re(/^[-+]\s+/)||!r&&(s.$char("+")||s.$char("-")))&&(t=this.multiplication());)e.parensInOp=!0,t.parensInOp=!0,n=new Ce.Operation(i,[n||e,t],r),r=s.isWhitespace(-1);return n||e}},conditions:function(){var e,t,i,n=s.i;if(e=this.condition(!0)){for(;s.peek(/^,\s*(not\s*)?\(/)&&s.$char(",")&&(t=this.condition(!0));)i=new Ce.Condition("or",i||e,t,n);return i||e}},condition:function(e){var t,i,n;if(t=this.conditionAnd(e)){if(i=s.$str("or")){if(!(n=this.condition(e)))return;t=new Ce.Condition(i,t,n)}return t}},conditionAnd:function(e){var t,i,n,r,o=this;if(t=(r=o.negatedCondition(e)||o.parenthesisCondition(e))||e?r:o.atomicCondition(e)){if(i=s.$str("and")){if(!(n=this.conditionAnd(e)))return;t=new Ce.Condition(i,t,n)}return t}},negatedCondition:function(e){if(s.$str("not")){var t=this.parenthesisCondition(e);return t&&(t.negate=!t.negate),t}},parenthesisCondition:function(e){var t;if(s.save(),s.$str("(")){if(t=function(t){var i;if(s.save(),i=t.condition(e)){if(s.$char(")"))return s.forget(),i;s.restore()}else s.restore()}(this))return s.forget(),t;if(t=this.atomicCondition(e)){if(s.$char(")"))return s.forget(),t;s.restore("expected ')' got '"+s.currentChar()+"'")}else s.restore()}else s.restore()},atomicCondition:function(e){var t,i,n,r,a=this.entities,l=s.i;function u(){return this.addition()||a.keyword()||a.quoted()||a.mixinLookup()}if(t=(u=u.bind(this))())return s.$char(">")?r=s.$char("=")?">=":">":s.$char("<")?r=s.$char("=")?"<=":"<":s.$char("=")&&(r=s.$char(">")?"=>":s.$char("<")?"=<":"="),r?(i=u())?n=new Ce.Condition(r,t,i,l,!1):o("expected expression"):n=new Ce.Condition("=",t,new Ce.Keyword("true"),l,!1),n},operand:function(){var e,t=this.entities;s.peek(/^-[@\$\(]/)&&(e=s.$char("-"));var i=this.sub()||t.dimension()||t.color()||t.variable()||t.property()||t.call()||t.quoted(!0)||t.colorKeyword()||t.mixinLookup();return e&&(i.parensInOp=!0,i=new Ce.Negative(i)),i},expression:function(){var e,t,i=[],n=s.i;do{(e=this.comment())?i.push(e):((e=this.addition()||this.entity())instanceof Ce.Comment&&(e=null),e&&(i.push(e),s.peek(/^\/[\/*]/)||(t=s.$char("/"))&&i.push(new Ce.Anonymous(t,n))))}while(e);if(i.length>0)return new Ce.Expression(i)},property:function(){var e=s.$re(/^(\*?-?[_a-zA-Z0-9-]+)\s*:/);if(e)return e[1]},ruleProperty:function(){var e,t,i=[],r=[];s.save();var o=s.$re(/^([_a-zA-Z0-9-]+)\s*:/);if(o)return i=[new Ce.Keyword(o[1])],s.forget(),i;function a(e){var t=s.i,n=s.$re(e);if(n)return r.push(t),i.push(n[1])}for(a(/^(\*?)/);a(/^((?:[\w-]+)|(?:[@\$]\{[\w-]+\}))/););if(i.length>1&&a(/^((?:\+_|\+)?)\s*:/)){for(s.forget(),""===i[0]&&(i.shift(),r.shift()),t=0;t1?e-1:e)<1?r+(s-r)*e*6:2*e<1?s:3*e<2?r+(s-r)*(2/3-e)*6:r}e=Ke(e)%360/360,t=We(Ke(t)),i=We(Ke(i)),n=We(Ke(n)),r=2*i-(s=i<=.5?i*(t+1):i+t-i*t);var a=[255*o(e+1/3),255*o(e),255*o(e-1/3)];return n=Ke(n),new c(a,n,"hsla")}catch(e){}},hsv:function(e,t,i){return ze.hsva(e,t,i,1)},hsva:function(e,t,i,n){var r,s;e=Ke(e)%360/360*360,t=Ke(t),i=Ke(i),n=Ke(n);var o=[i,i*(1-t),i*(1-(s=e/60-(r=Math.floor(e/60%6)))*t),i*(1-(1-s)*t)],a=[[0,3,1],[2,0,1],[1,0,3],[1,2,0],[3,1,0],[0,1,2]];return ze.rgba(255*o[a[r][0]],255*o[a[r][1]],255*o[a[r][2]],n)},hue:function(e){return new ee(He(e).h)},saturation:function(e){return new ee(100*He(e).s,"%")},lightness:function(e){return new ee(100*He(e).l,"%")},hsvhue:function(e){return new ee(Qe(e).h)},hsvsaturation:function(e){return new ee(100*Qe(e).s,"%")},hsvvalue:function(e){return new ee(100*Qe(e).v,"%")},red:function(e){return new ee(e.rgb[0])},green:function(e){return new ee(e.rgb[1])},blue:function(e){return new ee(e.rgb[2])},alpha:function(e){return new ee(He(e).a)},luma:function(e){return new ee(e.luma()*e.alpha*100,"%")},luminance:function(e){var t=.2126*e.rgb[0]/255+.7152*e.rgb[1]/255+.0722*e.rgb[2]/255;return new ee(t*e.alpha*100,"%")},saturate:function(e,t,i){if(!e.rgb)return null;var n=He(e);return void 0!==i&&"relative"===i.value?n.s+=n.s*t.value/100:n.s+=t.value/100,n.s=We(n.s),Je(e,n)},desaturate:function(e,t,i){var n=He(e);return void 0!==i&&"relative"===i.value?n.s-=n.s*t.value/100:n.s-=t.value/100,n.s=We(n.s),Je(e,n)},lighten:function(e,t,i){var n=He(e);return void 0!==i&&"relative"===i.value?n.l+=n.l*t.value/100:n.l+=t.value/100,n.l=We(n.l),Je(e,n)},darken:function(e,t,i){var n=He(e);return void 0!==i&&"relative"===i.value?n.l-=n.l*t.value/100:n.l-=t.value/100,n.l=We(n.l),Je(e,n)},fadein:function(e,t,i){var n=He(e);return void 0!==i&&"relative"===i.value?n.a+=n.a*t.value/100:n.a+=t.value/100,n.a=We(n.a),Je(e,n)},fadeout:function(e,t,i){var n=He(e);return void 0!==i&&"relative"===i.value?n.a-=n.a*t.value/100:n.a-=t.value/100,n.a=We(n.a),Je(e,n)},fade:function(e,t){var i=He(e);return i.a=t.value/100,i.a=We(i.a),Je(e,i)},spin:function(e,t){var i=He(e),n=(i.h+t.value)%360;return i.h=n<0?360+n:n,Je(e,i)},mix:function(e,t,i){i||(i=new ee(50));var n=i.value/100,r=2*n-1,s=He(e).a-He(t).a,o=((r*s==-1?r:(r+s)/(1+r*s))+1)/2,a=1-o,l=[e.rgb[0]*o+t.rgb[0]*a,e.rgb[1]*o+t.rgb[1]*a,e.rgb[2]*o+t.rgb[2]*a],u=e.alpha*n+t.alpha*(1-n);return new c(l,u)},greyscale:function(e){return ze.desaturate(e,new ee(100))},contrast:function(e,t,i,n){if(!e.rgb)return null;if(void 0===i&&(i=ze.rgba(255,255,255,1)),void 0===t&&(t=ze.rgba(0,0,0,1)),t.luma()>i.luma()){var r=i;i=t,t=r}return n=void 0===n?.43:Ke(n),e.luma().5&&(n=1,i=e>.25?Math.sqrt(e):((16*e-12)*e+4)*e),e-(1-2*t)*n*(i-e)},hardlight:function(e,t){return Ye.overlay(t,e)},difference:function(e,t){return Math.abs(e-t)},exclusion:function(e,t){return e+t-2*e*t},average:function(e,t){return(e+t)/2},negation:function(e,t){return 1-Math.abs(e+t-1)}};for(var et in Ye)Ye.hasOwnProperty(et)&&(Xe[et]=Xe.bind(null,Ye[et]));var tt=function(e){return Array.isArray(e.value)?e.value:Array(e)},it={_SELF:function(e){return e},"~":function(){for(var e=[],t=0;to.value)&&(c[n]=r);else{if(void 0!==l&&a!==l)throw{type:"Argument",message:"incompatible types"};h[a]=c.length,c.push(r)}else Array.isArray(t[i].value)&&Array.prototype.push.apply(t,Array.prototype.slice.call(t[i].value));return 1==c.length?c[0]:(t=c.map((function(e){return e.toCSS(this.context)})).join(this.context.compress?",":", "),new j((e?"min":"max")+"("+t+")"))},at={min:function(){for(var e=[],t=0;t",r=0;r";return n+="',n=encodeURIComponent(n),new ce(new ue("'"+(n="data:image/svg+xml,"+n)+"'",n,!1,this.index,this.currentFileInfo),this.index,this.currentFileInfo)}}),H.addMultiple(ht),t};function pt(e,t){var i,n=(t=t||{}).variables,r=new q.Eval(t);"object"!=typeof n||Array.isArray(n)||(n=Object.keys(n).map((function(e){var t=n[e];return t instanceof Ce.Value||(t instanceof Ce.Expression||(t=new Ce.Expression([t])),t=new Ce.Value([t])),new Ce.Declaration("@"+e,t,!1,null,0)})),r.frames=[new Ce.Ruleset(null,n)]);var s,o,a=[new De.JoinSelectorVisitor,new De.MarkVisibleSelectorsVisitor(!0),new De.ExtendVisitor,new De.ToCSSVisitor({compress:Boolean(t.compress)})],l=[];if(t.pluginManager){o=t.pluginManager.visitor();for(var u=0;u<2;u++)for(o.first();s=o.get();)s.isPreEvalVisitor?0!==u&&-1!==l.indexOf(s)||(l.push(s),s.run(e)):0!==u&&-1!==a.indexOf(s)||(s.isPreVisitor?a.unshift(s):a.push(s))}i=e.eval(r);for(u=0;u=t);i++);this.preProcessors.splice(i,0,{preProcessor:e,priority:t})},e.prototype.addPostProcessor=function(e,t){var i;for(i=0;i=t);i++);this.postProcessors.splice(i,0,{postProcessor:e,priority:t})},e.prototype.addFileManager=function(e){this.fileManagers.push(e)},e.prototype.getPreProcessors=function(){for(var e=[],t=0;t0){var n=void 0,r=JSON.stringify(this._sourceMapGenerator.toJSON());this.sourceMapURL?n=this.sourceMapURL:this._sourceMapFilename&&(n=this._sourceMapFilename),this.sourceMapURL=n,this.sourceMap=r}return this._css.join("")},t}()}(e=new s(e,t)),e)),a=function(e){return function(){function t(e,t,i){this.less=e,this.rootFilename=i.filename,this.paths=t.paths||[],this.contents={},this.contentsIgnoredChars={},this.mime=t.mime,this.error=null,this.context=t,this.queue=[],this.files={}}return t.prototype.push=function(t,i,n,s,o){var a=this,l=this.context.pluginManager.Loader;this.queue.push(t);var u=function(e,i,n){a.queue.splice(a.queue.indexOf(t),1);var l=n===a.rootFilename;s.optional&&e?(o(null,{rules:[]},!1,null),r.info("The file "+n+" was skipped because it was not found and the import was marked optional.")):(a.files[n]||s.inline||(a.files[n]={root:i,options:s}),e&&!a.error&&(a.error=e),o(e,i,l,n))},c={rewriteUrls:this.context.rewriteUrls,entryPath:n.entryPath,rootpath:n.rootpath,rootFilename:n.rootFilename},h=e.getFileManager(t,n.currentDirectory,this.context,e);if(h){var f,p,v=function(e){var t,i=e.filename,r=e.contents.replace(/^\uFEFF/,"");c.currentDirectory=h.getPath(i),c.rewriteUrls&&(c.rootpath=h.join(a.context.rootpath||"",h.pathDiff(c.currentDirectory,c.entryPath)),!h.isPathAbsolute(c.rootpath)&&h.alwaysMakePathsAbsolute()&&(c.rootpath=h.join(c.entryPath,c.rootpath))),c.filename=i;var o=new q.Parse(a.context);o.processImports=!1,a.contents[i]=r,(n.reference||s.reference)&&(c.reference=!0),s.isPlugin?(t=l.evalPlugin(r,o,a,s.pluginArgs,c))instanceof O?u(t,null,i):u(null,t,i):s.inline?u(null,r,i):!a.files[i]||a.files[i].options.multiple||s.multiple?new Be(o,a,c).parse(r,(function(e,t){u(e,t,i)})):u(null,a.files[i].root,i)},d=_(this.context);i&&(d.ext=s.isPlugin?".js":".less"),s.isPlugin?(d.mime="application/javascript",d.syncImport?f=l.loadPluginSync(t,n.currentDirectory,d,e,h):p=l.loadPlugin(t,n.currentDirectory,d,e,h)):d.syncImport?f=h.loadFileSync(t,n.currentDirectory,d,e):p=h.loadFile(t,n.currentDirectory,d,e,(function(e,t){e?u(e):v(t)})),f?f.filename?v(f):u(f):p&&p.then(v,u)}else u({message:"Could not find a file-manager for "+t})},t}()}(e);var u,c=function(e,t,i){var n=function(e,i,r){if("function"==typeof i?(r=i,i=M(this.options,{})):i=M(this.options,i||{}),!r){var s=this;return new Promise((function(t,r){n.call(s,e,i,(function(e,i){e?r(e):t(i)}))}))}this.parse(e,i,(function(e,i,n,s){if(e)return r(e);var o;try{o=new t(i,n).toCSS(s)}catch(e){return r(e)}r(null,o)}))};return n}(0,o),h=function(e,t,i){var n=function(e,t,r){if("function"==typeof t?(r=t,t=M(this.options,{})):t=M(this.options,t||{}),!r){var s=this;return new Promise((function(i,r){n.call(s,e,t,(function(e,t){e?r(e):i(t)}))}))}var o,a=void 0,l=new mt(this,!t.reUsePluginManager);if(t.pluginManager=l,o=new q.Parse(t),t.rootFileInfo)a=t.rootFileInfo;else{var u=t.filename||"input",c=u.replace(/[^\/\\]*$/,"");(a={filename:u,rewriteUrls:o.rewriteUrls,rootpath:o.rootpath||"",currentDirectory:c,entryPath:c,rootFilename:u}).rootpath&&"/"!==a.rootpath.slice(-1)&&(a.rootpath+="/")}var h=new i(this,o,a);this.importManager=h,t.plugins&&t.plugins.forEach((function(e){var t,i;if(e.fileContent){if(i=e.fileContent.replace(/^\uFEFF/,""),(t=l.Loader.evalPlugin(i,o,h,e.options,e.filename))instanceof O)return r(t)}else l.addPlugin(e)})),new Be(o,h,a).parse(e,(function(e,i){if(e)return r(e);r(null,i,h,t)}),t)};return n}(0,0,a),f=bt("4.0.0"),p={version:[f.major,f.minor,f.patch],data:l,tree:Ce,Environment:s,AbstractFileManager:ke,AbstractPluginLoader:_e,environment:e,visitors:De,Parser:Be,functions:ft(e),contexts:q,SourceMapOutput:i,SourceMapBuilder:n,ParseTree:o,ImportManager:a,render:c,parse:h,LessError:O,transformTree:pt,utils:P,PluginManager:mt,logger:r},v=function(e){return function(){var t=Object.create(e.prototype);return e.apply(t,Array.prototype.slice.call(arguments,0)),t}},d=Object.create(p);for(var m in p.tree)if("function"==typeof(u=p.tree[m]))d[m.toLowerCase()]=v(u);else for(var g in d[m]=Object.create(null),u)d[m][g.toLowerCase()]=v(u[g]);return p.parse=p.parse.bind(d),p.render=p.render.bind(d),d}var xt={},St=function(){};St.prototype=Object.assign(new ke,{alwaysMakePathsAbsolute:function(){return!0},join:function(e,t){return e?this.extractUrlParts(t,e).path:t},doXHR:function(e,t,i,n){var r=new XMLHttpRequest,s=!gt.isFileProtocol||gt.fileAsync;function o(t,i,n){t.status>=200&&t.status<300?i(t.responseText,t.getResponseHeader("Last-Modified")):"function"==typeof n&&n(t.status,e)}"function"==typeof r.overrideMimeType&&r.overrideMimeType("text/css"),yt.debug("XHR: Getting '"+e+"'"),r.open("GET",e,s),r.setRequestHeader("Accept",t||"text/x-less, text/css; q=0.9, */*; q=0.5"),r.send(null),gt.isFileProtocol&&!gt.fileAsync?0===r.status||r.status>=200&&r.status<300?i(r.responseText):n(r.status,e):s?r.onreadystatechange=function(){4==r.readyState&&o(r,i,n)}:o(r,i,n)},supports:function(){return!0},clearFileCache:function(){xt={}},loadFile:function(e,t,i,n){t&&!this.isPathAbsolute(e)&&(e=t+e),e=i.ext?this.tryAppendExtension(e,i.ext):e,i=i||{};var r=this.extractUrlParts(e,window.location.href).url,s=this;return new Promise((function(e,t){if(i.useFileCache&&xt[r])try{var n=xt[r];return e({contents:n,filename:r,webInfo:{lastModified:new Date}})}catch(e){return t({filename:r,message:"Error loading file "+r+" error was "+e.message})}s.doXHR(r,i.mime,(function(t,i){xt[r]=t,e({contents:t,filename:r,webInfo:{lastModified:i}})}),(function(e,i){t({type:"File",message:"'"+i+"' wasn't found ("+e+")",href:r})}))}))}});var It=function(e,t){return gt=e,yt=t,St},Ct=function(e){this.less=e};Ct.prototype=Object.assign(new _e,{loadPlugin:function(e,t,i,n,r){return new Promise((function(s,o){r.loadFile(e,t,i,n).then(s).catch(o)}))}});var kt=function(t,n,r){return{add:function(s,o){r.errorReporting&&"html"!==r.errorReporting?"console"===r.errorReporting?function(e,t){var i=e.filename||t,s=[],o=(e.type||"Syntax")+"Error: "+(e.message||"There is an error in your .less file")+" in "+i,a=function(e,t,i){void 0!==e.extract[t]&&s.push("{line} {content}".replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,i).replace(/\{content\}/,e.extract[t]))};e.line&&(a(e,0,""),a(e,1,"line"),a(e,2,""),o+=" on line "+e.line+", column "+(e.column+1)+":\n"+s.join("\n")),e.stack&&(e.extract||r.logLevel>=4)&&(o+="\nStack Trace\n"+e.stack),n.logger.error(o)}(s,o):"function"==typeof r.errorReporting&&r.errorReporting("add",s,o):function(n,s){var o,a,l="less-error-message:"+e(s||""),u=t.document.createElement("div"),c=[],h=n.filename||s,f=h.match(/([^\/]+(\?.*)?)$/)[1];u.id=l,u.className="less-error-message",a="

    "+(n.type||"Syntax")+"Error: "+(n.message||"There is an error in your .less file")+'

    in '+f+" ";var p=function(e,t,i){void 0!==e.extract[t]&&c.push('

  • {content}
  • '.replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,i).replace(/\{content\}/,e.extract[t]))};n.line&&(p(n,0,""),p(n,1,"line"),p(n,2,""),a+="on line "+n.line+", column "+(n.column+1)+":

      "+c.join("")+"
    "),n.stack&&(n.extract||r.logLevel>=4)&&(a+="
    Stack Trace
    "+n.stack.split("\n").slice(1).join("
    ")),u.innerHTML=a,i(t.document,[".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #dd6666;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.line {","color: #ff0000;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),u.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),"development"===r.env&&(o=setInterval((function(){var e=t.document,i=e.body;i&&(e.getElementById(l)?i.replaceChild(u,e.getElementById(l)):i.insertBefore(u,i.firstChild),clearInterval(o))}),10))}(s,o)},remove:function(i){r.errorReporting&&"html"!==r.errorReporting?"console"===r.errorReporting||"function"==typeof r.errorReporting&&r.errorReporting("remove",i):function(i){var n=t.document.getElementById("less-error-message:"+e(i));n&&n.parentNode.removeChild(n)}(i)}}},_t={javascriptEnabled:!1,depends:!1,compress:!1,lint:!1,paths:[],color:!0,strictImports:!1,insecure:!1,rootpath:"",rewriteUrls:!1,math:1,strictUnits:!1,globalVars:null,modifyVars:null,urlArgs:""};if(window.less)for(var At in window.less)window.less.hasOwnProperty(At)&&(_t[At]=window.less[At]);!function(e,i){t(i,n(e)),void 0===i.isFileProtocol&&(i.isFileProtocol=/^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(e.location.protocol)),i.async=i.async||!1,i.fileAsync=i.fileAsync||!1,i.poll=i.poll||(i.isFileProtocol?1e3:1500),i.env=i.env||("127.0.0.1"==e.location.hostname||"0.0.0.0"==e.location.hostname||"localhost"==e.location.hostname||e.location.port&&e.location.port.length>0||i.isFileProtocol?"development":"production");var r=/!dumpLineNumbers:(comments|mediaquery|all)/.exec(e.location.hash);r&&(i.dumpLineNumbers=r[1]),void 0===i.useFileCache&&(i.useFileCache=!0),void 0===i.onReady&&(i.onReady=!0),i.relativeUrls&&(i.rewriteUrls="all")}(window,_t),_t.plugins=_t.plugins||[],window.LESS_PLUGINS&&(_t.plugins=_t.plugins.concat(window.LESS_PLUGINS));var Mt,Et,Pt,Rt=function(e,n){var r=e.document,s=wt();s.options=n;var o=s.environment,a=It(n,s.logger),l=new a;o.addFileManager(l),s.FileManager=a,s.PluginLoader=Ct,function(e,t){t.logLevel=void 0!==t.logLevel?t.logLevel:"development"===t.env?3:1,t.loggers||(t.loggers=[{debug:function(e){t.logLevel>=4&&console.log(e)},info:function(e){t.logLevel>=3&&console.log(e)},warn:function(e){t.logLevel>=2&&console.warn(e)},error:function(e){t.logLevel>=1&&console.error(e)}}]);for(var i=0;i 0 && styleNode.childNodes.length > 0 &&\n oldStyleNode.firstChild.nodeValue === styleNode.firstChild.nodeValue);\n }\n\n const head = document.getElementsByTagName('head')[0];\n\n // If there is no oldStyleNode, just append; otherwise, only append if we need\n // to replace oldStyleNode with an updated stylesheet\n if (oldStyleNode === null || keepOldStyleNode === false) {\n const nextEl = sheet && sheet.nextSibling || null;\n if (nextEl) {\n nextEl.parentNode.insertBefore(styleNode, nextEl);\n } else {\n head.appendChild(styleNode);\n }\n }\n if (oldStyleNode && keepOldStyleNode === false) {\n oldStyleNode.parentNode.removeChild(oldStyleNode);\n }\n\n // For IE.\n // This needs to happen *after* the style element is added to the DOM, otherwise IE 7 and 8 may crash.\n // See http://social.msdn.microsoft.com/Forums/en-US/7e081b65-878a-4c22-8e68-c10d39c2ed32/internet-explorer-crashes-appending-style-element-to-head\n if (styleNode.styleSheet) {\n try {\n styleNode.styleSheet.cssText = styles;\n } catch (e) {\n throw new Error('Couldn\\'t reassign styleSheet.cssText.');\n }\n }\n },\n currentScript: function(window) {\n const document = window.document;\n return document.currentScript || (() => {\n const scripts = document.getElementsByTagName('script');\n return scripts[scripts.length - 1];\n })();\n }\n};\n","export default {\n error: function(msg) {\n this._fireEvent('error', msg);\n },\n warn: function(msg) {\n this._fireEvent('warn', msg);\n },\n info: function(msg) {\n this._fireEvent('info', msg);\n },\n debug: function(msg) {\n this._fireEvent('debug', msg);\n },\n addListener: function(listener) {\n this._listeners.push(listener);\n },\n removeListener: function(listener) {\n for (let i = 0; i < this._listeners.length; i++) {\n if (this._listeners[i] === listener) {\n this._listeners.splice(i, 1);\n return;\n }\n }\n },\n _fireEvent: function(type, msg) {\n for (let i = 0; i < this._listeners.length; i++) {\n const logFunction = this._listeners[i][type];\n if (logFunction) {\n logFunction(msg);\n }\n }\n },\n _listeners: []\n};\n","/**\n * @todo Document why this abstraction exists, and the relationship between\n * environment, file managers, and plugin manager\n */\n\nimport logger from '../logger';\n\nclass Environment {\n constructor(externalEnvironment, fileManagers) {\n this.fileManagers = fileManagers || [];\n externalEnvironment = externalEnvironment || {};\n\n const optionalFunctions = ['encodeBase64', 'mimeLookup', 'charsetLookup', 'getSourceMapGenerator'];\n const requiredFunctions = [];\n const functions = requiredFunctions.concat(optionalFunctions);\n\n for (let i = 0; i < functions.length; i++) {\n const propName = functions[i];\n const environmentFunc = externalEnvironment[propName];\n if (environmentFunc) {\n this[propName] = environmentFunc.bind(externalEnvironment);\n } else if (i < requiredFunctions.length) {\n this.warn(`missing required function in environment - ${propName}`);\n }\n }\n }\n\n getFileManager(filename, currentDirectory, options, environment, isSync) {\n\n if (!filename) {\n logger.warn('getFileManager called with no filename.. Please report this issue. continuing.');\n }\n if (currentDirectory == null) {\n logger.warn('getFileManager called with null directory.. Please report this issue. continuing.');\n }\n\n let fileManagers = this.fileManagers;\n if (options.pluginManager) {\n fileManagers = [].concat(fileManagers).concat(options.pluginManager.getFileManagers());\n }\n for (let i = fileManagers.length - 1; i >= 0 ; i--) {\n const fileManager = fileManagers[i];\n if (fileManager[isSync ? 'supportsSync' : 'supports'](filename, currentDirectory, options, environment)) {\n return fileManager;\n }\n }\n return null;\n }\n\n addFileManager(fileManager) {\n this.fileManagers.push(fileManager);\n }\n\n clearFileManagers() {\n this.fileManagers = [];\n }\n}\n\nexport default Environment;\n","export default {\n 'aliceblue':'#f0f8ff',\n 'antiquewhite':'#faebd7',\n 'aqua':'#00ffff',\n 'aquamarine':'#7fffd4',\n 'azure':'#f0ffff',\n 'beige':'#f5f5dc',\n 'bisque':'#ffe4c4',\n 'black':'#000000',\n 'blanchedalmond':'#ffebcd',\n 'blue':'#0000ff',\n 'blueviolet':'#8a2be2',\n 'brown':'#a52a2a',\n 'burlywood':'#deb887',\n 'cadetblue':'#5f9ea0',\n 'chartreuse':'#7fff00',\n 'chocolate':'#d2691e',\n 'coral':'#ff7f50',\n 'cornflowerblue':'#6495ed',\n 'cornsilk':'#fff8dc',\n 'crimson':'#dc143c',\n 'cyan':'#00ffff',\n 'darkblue':'#00008b',\n 'darkcyan':'#008b8b',\n 'darkgoldenrod':'#b8860b',\n 'darkgray':'#a9a9a9',\n 'darkgrey':'#a9a9a9',\n 'darkgreen':'#006400',\n 'darkkhaki':'#bdb76b',\n 'darkmagenta':'#8b008b',\n 'darkolivegreen':'#556b2f',\n 'darkorange':'#ff8c00',\n 'darkorchid':'#9932cc',\n 'darkred':'#8b0000',\n 'darksalmon':'#e9967a',\n 'darkseagreen':'#8fbc8f',\n 'darkslateblue':'#483d8b',\n 'darkslategray':'#2f4f4f',\n 'darkslategrey':'#2f4f4f',\n 'darkturquoise':'#00ced1',\n 'darkviolet':'#9400d3',\n 'deeppink':'#ff1493',\n 'deepskyblue':'#00bfff',\n 'dimgray':'#696969',\n 'dimgrey':'#696969',\n 'dodgerblue':'#1e90ff',\n 'firebrick':'#b22222',\n 'floralwhite':'#fffaf0',\n 'forestgreen':'#228b22',\n 'fuchsia':'#ff00ff',\n 'gainsboro':'#dcdcdc',\n 'ghostwhite':'#f8f8ff',\n 'gold':'#ffd700',\n 'goldenrod':'#daa520',\n 'gray':'#808080',\n 'grey':'#808080',\n 'green':'#008000',\n 'greenyellow':'#adff2f',\n 'honeydew':'#f0fff0',\n 'hotpink':'#ff69b4',\n 'indianred':'#cd5c5c',\n 'indigo':'#4b0082',\n 'ivory':'#fffff0',\n 'khaki':'#f0e68c',\n 'lavender':'#e6e6fa',\n 'lavenderblush':'#fff0f5',\n 'lawngreen':'#7cfc00',\n 'lemonchiffon':'#fffacd',\n 'lightblue':'#add8e6',\n 'lightcoral':'#f08080',\n 'lightcyan':'#e0ffff',\n 'lightgoldenrodyellow':'#fafad2',\n 'lightgray':'#d3d3d3',\n 'lightgrey':'#d3d3d3',\n 'lightgreen':'#90ee90',\n 'lightpink':'#ffb6c1',\n 'lightsalmon':'#ffa07a',\n 'lightseagreen':'#20b2aa',\n 'lightskyblue':'#87cefa',\n 'lightslategray':'#778899',\n 'lightslategrey':'#778899',\n 'lightsteelblue':'#b0c4de',\n 'lightyellow':'#ffffe0',\n 'lime':'#00ff00',\n 'limegreen':'#32cd32',\n 'linen':'#faf0e6',\n 'magenta':'#ff00ff',\n 'maroon':'#800000',\n 'mediumaquamarine':'#66cdaa',\n 'mediumblue':'#0000cd',\n 'mediumorchid':'#ba55d3',\n 'mediumpurple':'#9370d8',\n 'mediumseagreen':'#3cb371',\n 'mediumslateblue':'#7b68ee',\n 'mediumspringgreen':'#00fa9a',\n 'mediumturquoise':'#48d1cc',\n 'mediumvioletred':'#c71585',\n 'midnightblue':'#191970',\n 'mintcream':'#f5fffa',\n 'mistyrose':'#ffe4e1',\n 'moccasin':'#ffe4b5',\n 'navajowhite':'#ffdead',\n 'navy':'#000080',\n 'oldlace':'#fdf5e6',\n 'olive':'#808000',\n 'olivedrab':'#6b8e23',\n 'orange':'#ffa500',\n 'orangered':'#ff4500',\n 'orchid':'#da70d6',\n 'palegoldenrod':'#eee8aa',\n 'palegreen':'#98fb98',\n 'paleturquoise':'#afeeee',\n 'palevioletred':'#d87093',\n 'papayawhip':'#ffefd5',\n 'peachpuff':'#ffdab9',\n 'peru':'#cd853f',\n 'pink':'#ffc0cb',\n 'plum':'#dda0dd',\n 'powderblue':'#b0e0e6',\n 'purple':'#800080',\n 'rebeccapurple':'#663399',\n 'red':'#ff0000',\n 'rosybrown':'#bc8f8f',\n 'royalblue':'#4169e1',\n 'saddlebrown':'#8b4513',\n 'salmon':'#fa8072',\n 'sandybrown':'#f4a460',\n 'seagreen':'#2e8b57',\n 'seashell':'#fff5ee',\n 'sienna':'#a0522d',\n 'silver':'#c0c0c0',\n 'skyblue':'#87ceeb',\n 'slateblue':'#6a5acd',\n 'slategray':'#708090',\n 'slategrey':'#708090',\n 'snow':'#fffafa',\n 'springgreen':'#00ff7f',\n 'steelblue':'#4682b4',\n 'tan':'#d2b48c',\n 'teal':'#008080',\n 'thistle':'#d8bfd8',\n 'tomato':'#ff6347',\n 'turquoise':'#40e0d0',\n 'violet':'#ee82ee',\n 'wheat':'#f5deb3',\n 'white':'#ffffff',\n 'whitesmoke':'#f5f5f5',\n 'yellow':'#ffff00',\n 'yellowgreen':'#9acd32'\n};","export default {\n length: {\n 'm': 1,\n 'cm': 0.01,\n 'mm': 0.001,\n 'in': 0.0254,\n 'px': 0.0254 / 96,\n 'pt': 0.0254 / 72,\n 'pc': 0.0254 / 72 * 12\n },\n duration: {\n 's': 1,\n 'ms': 0.001\n },\n angle: {\n 'rad': 1 / (2 * Math.PI),\n 'deg': 1 / 360,\n 'grad': 1 / 400,\n 'turn': 1\n }\n};","import colors from './colors';\nimport unitConversions from './unit-conversions';\n\nexport default { colors, unitConversions };\n","/**\n * The reason why Node is a class and other nodes simply do not extend\n * from Node (since we're transpiling) is due to this issue:\n * \n * https://github.com/less/less.js/issues/3434\n */\nclass Node {\n constructor() {\n this.parent = null;\n this.visibilityBlocks = undefined;\n this.nodeVisible = undefined;\n this.rootNode = null;\n this.parsed = null;\n\n const self = this;\n Object.defineProperty(this, 'currentFileInfo', {\n get: function() { return self.fileInfo(); }\n });\n Object.defineProperty(this, 'index', {\n get: function() { return self.getIndex(); }\n });\n\n }\n\n setParent(nodes, parent) {\n function set(node) {\n if (node && node instanceof Node) {\n node.parent = parent;\n }\n }\n if (Array.isArray(nodes)) {\n nodes.forEach(set);\n }\n else {\n set(nodes);\n }\n }\n\n getIndex() {\n return this._index || (this.parent && this.parent.getIndex()) || 0;\n }\n\n fileInfo() {\n return this._fileInfo || (this.parent && this.parent.fileInfo()) || {};\n }\n\n isRulesetLike() { return false; }\n\n toCSS(context) {\n const strs = [];\n this.genCSS(context, {\n add: function(chunk, fileInfo, index) {\n strs.push(chunk);\n },\n isEmpty: function () {\n return strs.length === 0;\n }\n });\n return strs.join('');\n }\n\n genCSS(context, output) {\n output.add(this.value);\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n eval() { return this; }\n\n _operate(context, op, a, b) {\n switch (op) {\n case '+': return a + b;\n case '-': return a - b;\n case '*': return a * b;\n case '/': return a / b;\n }\n }\n\n fround(context, value) {\n const precision = context && context.numPrecision;\n // add \"epsilon\" to ensure numbers like 1.000000005 (represented as 1.000000004999...) are properly rounded:\n return (precision) ? Number((value + 2e-16).toFixed(precision)) : value;\n }\n\n static compare(a, b) {\n /* returns:\n -1: a < b\n 0: a = b\n 1: a > b\n and *any* other value for a != b (e.g. undefined, NaN, -2 etc.) */\n\n if ((a.compare) &&\n // for \"symmetric results\" force toCSS-based comparison\n // of Quoted or Anonymous if either value is one of those\n !(b.type === 'Quoted' || b.type === 'Anonymous')) {\n return a.compare(b);\n } else if (b.compare) {\n return -b.compare(a);\n } else if (a.type !== b.type) {\n return undefined;\n }\n\n a = a.value;\n b = b.value;\n if (!Array.isArray(a)) {\n return a === b ? 0 : undefined;\n }\n if (a.length !== b.length) {\n return undefined;\n }\n for (let i = 0; i < a.length; i++) {\n if (Node.compare(a[i], b[i]) !== 0) {\n return undefined;\n }\n }\n return 0;\n }\n\n static numericCompare(a, b) {\n return a < b ? -1\n : a === b ? 0\n : a > b ? 1 : undefined;\n }\n\n // Returns true if this node represents root of ast imported by reference\n blocksVisibility() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n return this.visibilityBlocks !== 0;\n }\n\n addVisibilityBlock() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks + 1;\n }\n\n removeVisibilityBlock() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks - 1;\n }\n\n // Turns on node visibility - if called node will be shown in output regardless\n // of whether it comes from import by reference or not\n ensureVisibility() {\n this.nodeVisible = true;\n }\n\n // Turns off node visibility - if called node will NOT be shown in output regardless\n // of whether it comes from import by reference or not\n ensureInvisibility() {\n this.nodeVisible = false;\n }\n\n // return values:\n // false - the node must not be visible\n // true - the node must be visible\n // undefined or null - the node has the same visibility as its parent\n isVisible() {\n return this.nodeVisible;\n }\n\n visibilityInfo() {\n return {\n visibilityBlocks: this.visibilityBlocks,\n nodeVisible: this.nodeVisible\n };\n }\n\n copyVisibilityInfo(info) {\n if (!info) {\n return;\n }\n this.visibilityBlocks = info.visibilityBlocks;\n this.nodeVisible = info.nodeVisible;\n }\n}\n\nexport default Node;\n","import Node from './node';\nimport colors from '../data/colors';\n\n//\n// RGB Colors - #ff0014, #eee\n//\nconst Color = function(rgb, a, originalForm) {\n const self = this;\n //\n // The end goal here, is to parse the arguments\n // into an integer triplet, such as `128, 255, 0`\n //\n // This facilitates operations and conversions.\n //\n if (Array.isArray(rgb)) {\n this.rgb = rgb;\n } else if (rgb.length >= 6) {\n this.rgb = [];\n rgb.match(/.{2}/g).map(function (c, i) {\n if (i < 3) {\n self.rgb.push(parseInt(c, 16));\n } else {\n self.alpha = (parseInt(c, 16)) / 255;\n }\n });\n } else {\n this.rgb = [];\n rgb.split('').map(function (c, i) {\n if (i < 3) {\n self.rgb.push(parseInt(c + c, 16));\n } else {\n self.alpha = (parseInt(c + c, 16)) / 255;\n }\n });\n }\n this.alpha = this.alpha || (typeof a === 'number' ? a : 1);\n if (typeof originalForm !== 'undefined') {\n this.value = originalForm;\n }\n}\n\nColor.prototype = Object.assign(new Node(), {\n type: 'Color',\n\n luma() {\n let r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255;\n\n r = (r <= 0.03928) ? r / 12.92 : Math.pow(((r + 0.055) / 1.055), 2.4);\n g = (g <= 0.03928) ? g / 12.92 : Math.pow(((g + 0.055) / 1.055), 2.4);\n b = (b <= 0.03928) ? b / 12.92 : Math.pow(((b + 0.055) / 1.055), 2.4);\n\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n },\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n },\n\n toCSS(context, doNotCompress) {\n const compress = context && context.compress && !doNotCompress;\n let color;\n let alpha;\n let colorFunction;\n let args = [];\n\n // `value` is set if this color was originally\n // converted from a named color string so we need\n // to respect this and try to output named color too.\n alpha = this.fround(context, this.alpha);\n\n if (this.value) {\n if (this.value.indexOf('rgb') === 0) {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n } else if (this.value.indexOf('hsl') === 0) {\n if (alpha < 1) {\n colorFunction = 'hsla';\n } else {\n colorFunction = 'hsl';\n }\n } else {\n return this.value;\n }\n } else {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n }\n\n switch (colorFunction) {\n case 'rgba':\n args = this.rgb.map(function (c) {\n return clamp(Math.round(c), 255);\n }).concat(clamp(alpha, 1));\n break;\n case 'hsla':\n args.push(clamp(alpha, 1));\n case 'hsl':\n color = this.toHSL();\n args = [\n this.fround(context, color.h),\n `${this.fround(context, color.s * 100)}%`,\n `${this.fround(context, color.l * 100)}%`\n ].concat(args);\n }\n\n if (colorFunction) {\n // Values are capped between `0` and `255`, rounded and zero-padded.\n return `${colorFunction}(${args.join(`,${compress ? '' : ' '}`)})`;\n }\n\n color = this.toRGB();\n\n if (compress) {\n const splitcolor = color.split('');\n\n // Convert color to short format\n if (splitcolor[1] === splitcolor[2] && splitcolor[3] === splitcolor[4] && splitcolor[5] === splitcolor[6]) {\n color = `#${splitcolor[1]}${splitcolor[3]}${splitcolor[5]}`;\n }\n }\n\n return color;\n },\n\n //\n // Operations have to be done per-channel, if not,\n // channels will spill onto each other. Once we have\n // our result, in the form of an integer triplet,\n // we create a new Color node to hold the result.\n //\n operate(context, op, other) {\n const rgb = new Array(3);\n const alpha = this.alpha * (1 - other.alpha) + other.alpha;\n for (let c = 0; c < 3; c++) {\n rgb[c] = this._operate(context, op, this.rgb[c], other.rgb[c]);\n }\n return new Color(rgb, alpha);\n },\n\n toRGB() {\n return toHex(this.rgb);\n },\n\n toHSL() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h;\n let s;\n const l = (max + min) / 2;\n const d = max - min;\n\n if (max === min) {\n h = s = 0;\n } else {\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, l, a };\n },\n\n // Adapted from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript\n toHSV() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h;\n let s;\n const v = max;\n\n const d = max - min;\n if (max === 0) {\n s = 0;\n } else {\n s = d / max;\n }\n\n if (max === min) {\n h = 0;\n } else {\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, v, a };\n },\n\n toARGB() {\n return toHex([this.alpha * 255].concat(this.rgb));\n },\n\n compare(x) {\n return (x.rgb &&\n x.rgb[0] === this.rgb[0] &&\n x.rgb[1] === this.rgb[1] &&\n x.rgb[2] === this.rgb[2] &&\n x.alpha === this.alpha) ? 0 : undefined;\n }\n});\n\nColor.fromKeyword = function(keyword) {\n let c;\n const key = keyword.toLowerCase();\n if (colors.hasOwnProperty(key)) {\n c = new Color(colors[key].slice(1));\n }\n else if (key === 'transparent') {\n c = new Color([0, 0, 0], 0);\n }\n\n if (c) {\n c.value = keyword;\n return c;\n }\n};\n\nfunction clamp(v, max) {\n return Math.min(Math.max(v, 0), max);\n}\n\nfunction toHex(v) {\n return `#${v.map(function (c) {\n c = clamp(Math.round(c), 255);\n return (c < 16 ? '0' : '') + c.toString(16);\n }).join('')}`;\n}\n\nexport default Color;\n","import Node from './node';\n\nconst Paren = function(node) {\n this.value = node;\n};\n\nParen.prototype = Object.assign(new Node(), {\n type: 'Paren',\n\n genCSS(context, output) {\n output.add('(');\n this.value.genCSS(context, output);\n output.add(')');\n },\n\n eval(context) {\n return new Paren(this.value.eval(context));\n }\n});\n\nexport default Paren;\n","import Node from './node';\nconst _noSpaceCombinators = {\n '': true,\n ' ': true,\n '|': true\n};\n\nconst Combinator = function(value) {\n if (value === ' ') {\n this.value = ' ';\n this.emptyOrWhitespace = true;\n } else {\n this.value = value ? value.trim() : '';\n this.emptyOrWhitespace = this.value === '';\n }\n}\n\nCombinator.prototype = Object.assign(new Node(), {\n type: 'Combinator',\n\n genCSS(context, output) {\n const spaceOrEmpty = (context.compress || _noSpaceCombinators[this.value]) ? '' : ' ';\n output.add(spaceOrEmpty + this.value + spaceOrEmpty);\n }\n});\n\nexport default Combinator;\n","import Node from './node';\nimport Paren from './paren';\nimport Combinator from './combinator';\n\nconst Element = function(combinator, value, isVariable, index, currentFileInfo, visibilityInfo) {\n this.combinator = combinator instanceof Combinator ?\n combinator : new Combinator(combinator);\n\n if (typeof value === 'string') {\n this.value = value.trim();\n } else if (value) {\n this.value = value;\n } else {\n this.value = '';\n }\n this.isVariable = isVariable;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.combinator, this);\n}\n\nElement.prototype = Object.assign(new Node(), {\n type: 'Element',\n\n accept(visitor) {\n const value = this.value;\n this.combinator = visitor.visit(this.combinator);\n if (typeof value === 'object') {\n this.value = visitor.visit(value);\n }\n },\n\n eval(context) {\n return new Element(this.combinator,\n this.value.eval ? this.value.eval(context) : this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n },\n\n clone() {\n return new Element(this.combinator,\n this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n },\n\n genCSS(context, output) {\n output.add(this.toCSS(context), this.fileInfo(), this.getIndex());\n },\n\n toCSS(context) {\n context = context || {};\n let value = this.value;\n const firstSelector = context.firstSelector;\n if (value instanceof Paren) {\n // selector in parens should not be affected by outer selector\n // flags (breaks only interpolated selectors - see #1973)\n context.firstSelector = true;\n }\n value = value.toCSS ? value.toCSS(context) : value;\n context.firstSelector = firstSelector;\n if (value === '' && this.combinator.value.charAt(0) === '&') {\n return '';\n } else {\n return this.combinator.toCSS(context) + value;\n }\n }\n});\n\nexport default Element;\n","\nexport const Math = {\n ALWAYS: 0,\n PARENS_DIVISION: 1,\n PARENS: 2\n // removed - STRICT_LEGACY: 3\n};\n\nexport const RewriteUrls = {\n OFF: 0,\n LOCAL: 1,\n ALL: 2\n};","/**\r\n * Returns the object type of the given payload\r\n *\r\n * @param {*} payload\r\n * @returns {string}\r\n */\r\nfunction getType(payload) {\r\n return Object.prototype.toString.call(payload).slice(8, -1);\r\n}\r\n/**\r\n * Returns whether the payload is undefined\r\n *\r\n * @param {*} payload\r\n * @returns {payload is undefined}\r\n */\r\nfunction isUndefined(payload) {\r\n return getType(payload) === 'Undefined';\r\n}\r\n/**\r\n * Returns whether the payload is null\r\n *\r\n * @param {*} payload\r\n * @returns {payload is null}\r\n */\r\nfunction isNull(payload) {\r\n return getType(payload) === 'Null';\r\n}\r\n/**\r\n * Returns whether the payload is a plain JavaScript object (excluding special classes or objects with other prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Record}\r\n */\r\nfunction isPlainObject(payload) {\r\n if (getType(payload) !== 'Object')\r\n return false;\r\n return payload.constructor === Object && Object.getPrototypeOf(payload) === Object.prototype;\r\n}\r\n/**\r\n * Returns whether the payload is a plain JavaScript object (excluding special classes or objects with other prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Record}\r\n */\r\nfunction isObject(payload) {\r\n return isPlainObject(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a an empty object (excluding special classes or objects with other prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is { [K in any]: never }}\r\n */\r\nfunction isEmptyObject(payload) {\r\n return isPlainObject(payload) && Object.keys(payload).length === 0;\r\n}\r\n/**\r\n * Returns whether the payload is an any kind of object (including special classes or objects with different prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Record}\r\n */\r\nfunction isAnyObject(payload) {\r\n return getType(payload) === 'Object';\r\n}\r\n/**\r\n * Returns whether the payload is an object like a type passed in < >\r\n *\r\n * Usage: isObjectLike<{id: any}>(payload) // will make sure it's an object and has an `id` prop.\r\n *\r\n * @template T this must be passed in < >\r\n * @param {*} payload\r\n * @returns {payload is T}\r\n */\r\nfunction isObjectLike(payload) {\r\n return isAnyObject(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a function (regular or async)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is AnyFunction}\r\n */\r\nfunction isFunction(payload) {\r\n return typeof payload === \"function\";\r\n}\r\n/**\r\n * Returns whether the payload is an array\r\n *\r\n * @param {any} payload\r\n * @returns {payload is any[]}\r\n */\r\nfunction isArray(payload) {\r\n return getType(payload) === 'Array';\r\n}\r\n/**\r\n * Returns whether the payload is a an array with at least 1 item\r\n *\r\n * @param {*} payload\r\n * @returns {payload is any[]}\r\n */\r\nfunction isFullArray(payload) {\r\n return isArray(payload) && payload.length > 0;\r\n}\r\n/**\r\n * Returns whether the payload is a an empty array\r\n *\r\n * @param {*} payload\r\n * @returns {payload is []}\r\n */\r\nfunction isEmptyArray(payload) {\r\n return isArray(payload) && payload.length === 0;\r\n}\r\n/**\r\n * Returns whether the payload is a string\r\n *\r\n * @param {*} payload\r\n * @returns {payload is string}\r\n */\r\nfunction isString(payload) {\r\n return getType(payload) === 'String';\r\n}\r\n/**\r\n * Returns whether the payload is a string, BUT returns false for ''\r\n *\r\n * @param {*} payload\r\n * @returns {payload is string}\r\n */\r\nfunction isFullString(payload) {\r\n return isString(payload) && payload !== '';\r\n}\r\n/**\r\n * Returns whether the payload is ''\r\n *\r\n * @param {*} payload\r\n * @returns {payload is string}\r\n */\r\nfunction isEmptyString(payload) {\r\n return payload === '';\r\n}\r\n/**\r\n * Returns whether the payload is a number (but not NaN)\r\n *\r\n * This will return `false` for `NaN`!!\r\n *\r\n * @param {*} payload\r\n * @returns {payload is number}\r\n */\r\nfunction isNumber(payload) {\r\n return getType(payload) === 'Number' && !isNaN(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a boolean\r\n *\r\n * @param {*} payload\r\n * @returns {payload is boolean}\r\n */\r\nfunction isBoolean(payload) {\r\n return getType(payload) === 'Boolean';\r\n}\r\n/**\r\n * Returns whether the payload is a regular expression (RegExp)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is RegExp}\r\n */\r\nfunction isRegExp(payload) {\r\n return getType(payload) === 'RegExp';\r\n}\r\n/**\r\n * Returns whether the payload is a Map\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Map}\r\n */\r\nfunction isMap(payload) {\r\n return getType(payload) === 'Map';\r\n}\r\n/**\r\n * Returns whether the payload is a WeakMap\r\n *\r\n * @param {*} payload\r\n * @returns {payload is WeakMap}\r\n */\r\nfunction isWeakMap(payload) {\r\n return getType(payload) === 'WeakMap';\r\n}\r\n/**\r\n * Returns whether the payload is a Set\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Set}\r\n */\r\nfunction isSet(payload) {\r\n return getType(payload) === 'Set';\r\n}\r\n/**\r\n * Returns whether the payload is a WeakSet\r\n *\r\n * @param {*} payload\r\n * @returns {payload is WeakSet}\r\n */\r\nfunction isWeakSet(payload) {\r\n return getType(payload) === 'WeakSet';\r\n}\r\n/**\r\n * Returns whether the payload is a Symbol\r\n *\r\n * @param {*} payload\r\n * @returns {payload is symbol}\r\n */\r\nfunction isSymbol(payload) {\r\n return getType(payload) === 'Symbol';\r\n}\r\n/**\r\n * Returns whether the payload is a Date, and that the date is valid\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Date}\r\n */\r\nfunction isDate(payload) {\r\n return getType(payload) === 'Date' && !isNaN(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a Blob\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Blob}\r\n */\r\nfunction isBlob(payload) {\r\n return getType(payload) === 'Blob';\r\n}\r\n/**\r\n * Returns whether the payload is a File\r\n *\r\n * @param {*} payload\r\n * @returns {payload is File}\r\n */\r\nfunction isFile(payload) {\r\n return getType(payload) === 'File';\r\n}\r\n/**\r\n * Returns whether the payload is a Promise\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Promise}\r\n */\r\nfunction isPromise(payload) {\r\n return getType(payload) === 'Promise';\r\n}\r\n/**\r\n * Returns whether the payload is an Error\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Error}\r\n */\r\nfunction isError(payload) {\r\n return getType(payload) === 'Error';\r\n}\r\n/**\r\n * Returns whether the payload is literally the value `NaN` (it's `NaN` and also a `number`)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is typeof NaN}\r\n */\r\nfunction isNaNValue(payload) {\r\n return getType(payload) === 'Number' && isNaN(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a primitive type (eg. Boolean | Null | Undefined | Number | String | Symbol)\r\n *\r\n * @param {*} payload\r\n * @returns {(payload is boolean | null | undefined | number | string | symbol)}\r\n */\r\nfunction isPrimitive(payload) {\r\n return (isBoolean(payload) ||\r\n isNull(payload) ||\r\n isUndefined(payload) ||\r\n isNumber(payload) ||\r\n isString(payload) ||\r\n isSymbol(payload));\r\n}\r\n/**\r\n * Returns true whether the payload is null or undefined\r\n *\r\n * @param {*} payload\r\n * @returns {(payload is null | undefined)}\r\n */\r\nfunction isNullOrUndefined(payload) {\r\n return isNull(payload) || isUndefined(payload);\r\n}\r\n/**\r\n * Does a generic check to check that the given payload is of a given type.\r\n * In cases like Number, it will return true for NaN as NaN is a Number (thanks javascript!);\r\n * It will, however, differentiate between object and null\r\n *\r\n * @template T\r\n * @param {*} payload\r\n * @param {T} type\r\n * @throws {TypeError} Will throw type error if type is an invalid type\r\n * @returns {payload is T}\r\n */\r\nfunction isType(payload, type) {\r\n if (!(type instanceof Function)) {\r\n throw new TypeError('Type must be a function');\r\n }\r\n if (!Object.prototype.hasOwnProperty.call(type, 'prototype')) {\r\n throw new TypeError('Type is not a class');\r\n }\r\n // Classes usually have names (as functions usually have names)\r\n var name = type.name;\r\n return getType(payload) === name || Boolean(payload && payload.constructor === type);\r\n}\n\nexport { getType, isAnyObject, isArray, isBlob, isBoolean, isDate, isEmptyArray, isEmptyObject, isEmptyString, isError, isFile, isFullArray, isFullString, isFunction, isMap, isNaNValue, isNull, isNullOrUndefined, isNumber, isObject, isObjectLike, isPlainObject, isPrimitive, isPromise, isRegExp, isSet, isString, isSymbol, isType, isUndefined, isWeakMap, isWeakSet };\n","import { isArray, isPlainObject } from 'is-what';\n\n/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n\r\nfunction __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\n\nfunction assignProp(carry, key, newVal, originalObject, includeNonenumerable) {\r\n var propType = {}.propertyIsEnumerable.call(originalObject, key)\r\n ? 'enumerable'\r\n : 'nonenumerable';\r\n if (propType === 'enumerable')\r\n carry[key] = newVal;\r\n if (includeNonenumerable && propType === 'nonenumerable') {\r\n Object.defineProperty(carry, key, {\r\n value: newVal,\r\n enumerable: false,\r\n writable: true,\r\n configurable: true,\r\n });\r\n }\r\n}\r\n/**\r\n * Copy (clone) an object and all its props recursively to get rid of any prop referenced of the original object. Arrays are also cloned, however objects inside arrays are still linked.\r\n *\r\n * @export\r\n * @template T\r\n * @param {T} target Target can be anything\r\n * @param {Options} [options={}] Options can be `props` or `nonenumerable`\r\n * @returns {T} the target with replaced values\r\n * @export\r\n */\r\nfunction copy(target, options) {\r\n if (options === void 0) { options = {}; }\r\n if (isArray(target))\r\n return target.map(function (i) { return copy(i, options); });\r\n if (!isPlainObject(target))\r\n return target;\r\n var props = Object.getOwnPropertyNames(target);\r\n var symbols = Object.getOwnPropertySymbols(target);\r\n return __spreadArrays(props, symbols).reduce(function (carry, key) {\r\n if (isArray(options.props) && !options.props.includes(key)) {\r\n return carry;\r\n }\r\n var val = target[key];\r\n var newVal = copy(val, options);\r\n assignProp(carry, key, newVal, target, options.nonenumerable);\r\n return carry;\r\n }, {});\r\n}\n\nexport { copy };\n","/* jshint proto: true */\nimport * as Constants from './constants';\nimport { copy } from 'copy-anything';\n\nexport function getLocation(index, inputStream) {\n let n = index + 1;\n let line = null;\n let column = -1;\n\n while (--n >= 0 && inputStream.charAt(n) !== '\\n') {\n column++;\n }\n\n if (typeof index === 'number') {\n line = (inputStream.slice(0, index).match(/\\n/g) || '').length;\n }\n\n return {\n line,\n column\n };\n}\n\nexport function copyArray(arr) {\n let i;\n const length = arr.length;\n const copy = new Array(length);\n\n for (i = 0; i < length; i++) {\n copy[i] = arr[i];\n }\n return copy;\n}\n\nexport function clone(obj) {\n const cloned = {};\n for (const prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n cloned[prop] = obj[prop];\n }\n }\n return cloned;\n}\n\nexport function defaults(obj1, obj2) {\n let newObj = obj2 || {};\n if (!obj2._defaults) {\n newObj = {};\n const defaults = copy(obj1);\n newObj._defaults = defaults;\n const cloned = obj2 ? copy(obj2) : {};\n Object.assign(newObj, defaults, cloned);\n }\n return newObj;\n}\n\nexport function copyOptions(obj1, obj2) {\n if (obj2 && obj2._defaults) {\n return obj2;\n }\n const opts = defaults(obj1, obj2);\n if (opts.strictMath) {\n opts.math = Constants.Math.PARENS;\n }\n // Back compat with changed relativeUrls option\n if (opts.relativeUrls) {\n opts.rewriteUrls = Constants.RewriteUrls.ALL;\n }\n if (typeof opts.math === 'string') {\n switch (opts.math.toLowerCase()) {\n case 'always':\n opts.math = Constants.Math.ALWAYS;\n break;\n case 'parens-division':\n opts.math = Constants.Math.PARENS_DIVISION;\n break;\n case 'strict':\n case 'parens':\n opts.math = Constants.Math.PARENS;\n break;\n default:\n opts.math = Constants.Math.PARENS;\n }\n }\n if (typeof opts.rewriteUrls === 'string') {\n switch (opts.rewriteUrls.toLowerCase()) {\n case 'off':\n opts.rewriteUrls = Constants.RewriteUrls.OFF;\n break;\n case 'local':\n opts.rewriteUrls = Constants.RewriteUrls.LOCAL;\n break;\n case 'all':\n opts.rewriteUrls = Constants.RewriteUrls.ALL;\n break;\n }\n }\n return opts;\n}\n\nexport function merge(obj1, obj2) {\n for (const prop in obj2) {\n if (obj2.hasOwnProperty(prop)) {\n obj1[prop] = obj2[prop];\n }\n }\n return obj1;\n}\n\nexport function flattenArray(arr, result = []) {\n for (let i = 0, length = arr.length; i < length; i++) {\n const value = arr[i];\n if (Array.isArray(value)) {\n flattenArray(value, result);\n } else {\n if (value !== undefined) {\n result.push(value);\n }\n }\n }\n return result;\n}","import * as utils from './utils';\n\nconst anonymousFunc = /(|Function):(\\d+):(\\d+)/;\n\n/**\n * This is a centralized class of any error that could be thrown internally (mostly by the parser).\n * Besides standard .message it keeps some additional data like a path to the file where the error\n * occurred along with line and column numbers.\n *\n * @class\n * @extends Error\n * @type {module.LessError}\n *\n * @prop {string} type\n * @prop {string} filename\n * @prop {number} index\n * @prop {number} line\n * @prop {number} column\n * @prop {number} callLine\n * @prop {number} callExtract\n * @prop {string[]} extract\n *\n * @param {Object} e - An error object to wrap around or just a descriptive object\n * @param {Object} fileContentMap - An object with file contents in 'contents' property (like importManager) @todo - move to fileManager?\n * @param {string} [currentFilename]\n */\nconst LessError = function(e, fileContentMap, currentFilename) {\n Error.call(this);\n\n const filename = e.filename || currentFilename;\n\n this.message = e.message;\n this.stack = e.stack;\n\n if (fileContentMap && filename) {\n const input = fileContentMap.contents[filename];\n const loc = utils.getLocation(e.index, input);\n var line = loc.line;\n const col = loc.column;\n const callLine = e.call && utils.getLocation(e.call, input).line;\n const lines = input ? input.split('\\n') : '';\n\n this.type = e.type || 'Syntax';\n this.filename = filename;\n this.index = e.index;\n this.line = typeof line === 'number' ? line + 1 : null;\n this.column = col;\n\n if (!this.line && this.stack) {\n const found = this.stack.match(anonymousFunc);\n\n /**\n * We have to figure out how this environment stringifies anonymous functions\n * so we can correctly map plugin errors.\n * \n * Note, in Node 8, the output of anonymous funcs varied based on parameters\n * being present or not, so we inject dummy params.\n */\n const func = new Function('a', 'throw new Error()');\n let lineAdjust = 0;\n try {\n func();\n } catch (e) {\n const match = e.stack.match(anonymousFunc);\n var line = parseInt(match[2]);\n lineAdjust = 1 - line;\n }\n\n if (found) {\n if (found[2]) {\n this.line = parseInt(found[2]) + lineAdjust;\n }\n if (found[3]) {\n this.column = parseInt(found[3]);\n }\n }\n }\n\n this.callLine = callLine + 1;\n this.callExtract = lines[callLine];\n\n this.extract = [\n lines[this.line - 2],\n lines[this.line - 1],\n lines[this.line]\n ];\n }\n\n};\n\nif (typeof Object.create === 'undefined') {\n const F = function () {};\n F.prototype = Error.prototype;\n LessError.prototype = new F();\n} else {\n LessError.prototype = Object.create(Error.prototype);\n}\n\nLessError.prototype.constructor = LessError;\n\n/**\n * An overridden version of the default Object.prototype.toString\n * which uses additional information to create a helpful message.\n *\n * @param {Object} options\n * @returns {string}\n */\nLessError.prototype.toString = function(options) {\n options = options || {};\n\n let message = '';\n const extract = this.extract || [];\n let error = [];\n let stylize = function (str) { return str; };\n if (options.stylize) {\n const type = typeof options.stylize;\n if (type !== 'function') {\n throw Error(`options.stylize should be a function, got a ${type}!`);\n }\n stylize = options.stylize;\n }\n\n if (this.line !== null) {\n if (typeof extract[0] === 'string') {\n error.push(stylize(`${this.line - 1} ${extract[0]}`, 'grey'));\n }\n\n if (typeof extract[1] === 'string') {\n let errorTxt = `${this.line} `;\n if (extract[1]) {\n errorTxt += extract[1].slice(0, this.column) +\n stylize(stylize(stylize(extract[1].substr(this.column, 1), 'bold') +\n extract[1].slice(this.column + 1), 'red'), 'inverse');\n }\n error.push(errorTxt);\n }\n\n if (typeof extract[2] === 'string') {\n error.push(stylize(`${this.line + 1} ${extract[2]}`, 'grey'));\n }\n error = `${error.join('\\n') + stylize('', 'reset')}\\n`;\n }\n\n message += stylize(`${this.type}Error: ${this.message}`, 'red');\n if (this.filename) {\n message += stylize(' in ', 'red') + this.filename;\n }\n if (this.line) {\n message += stylize(` on line ${this.line}, column ${this.column + 1}:`, 'grey');\n }\n\n message += `\\n${error}`;\n\n if (this.callLine) {\n message += `${stylize('from ', 'red') + (this.filename || '')}/n`;\n message += `${stylize(this.callLine, 'grey')} ${this.callExtract}/n`;\n }\n\n return message;\n};\n\nexport default LessError;","import Node from './node';\nimport Element from './element';\nimport LessError from '../less-error';\n\nconst Selector = function(elements, extendList, condition, index, currentFileInfo, visibilityInfo) {\n this.extendList = extendList;\n this.condition = condition;\n this.evaldCondition = !condition;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.elements = this.getElements(elements);\n this.mixinElements_ = undefined;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.elements, this);\n};\n\nSelector.prototype = Object.assign(new Node(), {\n type: 'Selector',\n\n accept(visitor) {\n if (this.elements) {\n this.elements = visitor.visitArray(this.elements);\n }\n if (this.extendList) {\n this.extendList = visitor.visitArray(this.extendList);\n }\n if (this.condition) {\n this.condition = visitor.visit(this.condition);\n }\n },\n\n createDerived(elements, extendList, evaldCondition) {\n elements = this.getElements(elements);\n const newSelector = new Selector(elements, extendList || this.extendList,\n null, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n newSelector.evaldCondition = (evaldCondition != null) ? evaldCondition : this.evaldCondition;\n newSelector.mediaEmpty = this.mediaEmpty;\n return newSelector;\n },\n\n getElements(els) {\n if (!els) {\n return [new Element('', '&', false, this._index, this._fileInfo)];\n }\n if (typeof els === 'string') {\n this.parse.parseNode(\n els, \n ['selector'],\n this._index, \n this._fileInfo, \n function(err, result) {\n if (err) {\n throw new LessError({\n index: err.index,\n message: err.message\n }, this.parse.imports, this._fileInfo.filename);\n }\n els = result[0].elements;\n });\n }\n return els;\n },\n\n createEmptySelectors() {\n const el = new Element('', '&', false, this._index, this._fileInfo), sels = [new Selector([el], null, null, this._index, this._fileInfo)];\n sels[0].mediaEmpty = true;\n return sels;\n },\n\n match(other) {\n const elements = this.elements;\n const len = elements.length;\n let olen;\n let i;\n\n other = other.mixinElements();\n olen = other.length;\n if (olen === 0 || len < olen) {\n return 0;\n } else {\n for (i = 0; i < olen; i++) {\n if (elements[i].value !== other[i]) {\n return 0;\n }\n }\n }\n\n return olen; // return number of matched elements\n },\n\n mixinElements() {\n if (this.mixinElements_) {\n return this.mixinElements_;\n }\n\n let elements = this.elements.map( function(v) {\n return v.combinator.value + (v.value.value || v.value);\n }).join('').match(/[,&#\\*\\.\\w-]([\\w-]|(\\\\.))*/g);\n\n if (elements) {\n if (elements[0] === '&') {\n elements.shift();\n }\n } else {\n elements = [];\n }\n\n return (this.mixinElements_ = elements);\n },\n\n isJustParentSelector() {\n return !this.mediaEmpty &&\n this.elements.length === 1 &&\n this.elements[0].value === '&' &&\n (this.elements[0].combinator.value === ' ' || this.elements[0].combinator.value === '');\n },\n\n eval(context) {\n const evaldCondition = this.condition && this.condition.eval(context);\n let elements = this.elements;\n let extendList = this.extendList;\n\n elements = elements && elements.map(function (e) { return e.eval(context); });\n extendList = extendList && extendList.map(function(extend) { return extend.eval(context); });\n\n return this.createDerived(elements, extendList, evaldCondition);\n },\n\n genCSS(context, output) {\n let i, element;\n if ((!context || !context.firstSelector) && this.elements[0].combinator.value === '') {\n output.add(' ', this.fileInfo(), this.getIndex());\n }\n for (i = 0; i < this.elements.length; i++) {\n element = this.elements[i];\n element.genCSS(context, output);\n }\n },\n\n getIsOutput() {\n return this.evaldCondition;\n }\n});\n\nexport default Selector;\n","import Node from './node';\n\nconst Value = function(value) {\n if (!value) {\n throw new Error('Value requires an array argument');\n }\n if (!Array.isArray(value)) {\n this.value = [ value ];\n }\n else {\n this.value = value;\n }\n};\n\nValue.prototype = Object.assign(new Node(), {\n type: 'Value',\n\n accept(visitor) {\n if (this.value) {\n this.value = visitor.visitArray(this.value);\n }\n },\n\n eval(context) {\n if (this.value.length === 1) {\n return this.value[0].eval(context);\n } else {\n return new Value(this.value.map(function (v) {\n return v.eval(context);\n }));\n }\n },\n\n genCSS(context, output) {\n let i;\n for (i = 0; i < this.value.length; i++) {\n this.value[i].genCSS(context, output);\n if (i + 1 < this.value.length) {\n output.add((context && context.compress) ? ',' : ', ');\n }\n }\n }\n});\n\nexport default Value;\n","import Node from './node';\n\nconst Keyword = function(value) {\n this.value = value;\n};\n\nKeyword.prototype = Object.assign(new Node(), {\n type: 'Keyword',\n\n genCSS(context, output) {\n if (this.value === '%') { throw { type: 'Syntax', message: 'Invalid % without number' }; }\n output.add(this.value);\n }\n});\n\nKeyword.True = new Keyword('true');\nKeyword.False = new Keyword('false');\n\nexport default Keyword;\n","import Node from './node';\n\nconst Anonymous = function(value, index, currentFileInfo, mapLines, rulesetLike, visibilityInfo) {\n this.value = value;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.mapLines = mapLines;\n this.rulesetLike = (typeof rulesetLike === 'undefined') ? false : rulesetLike;\n this.allowRoot = true;\n this.copyVisibilityInfo(visibilityInfo);\n}\n\nAnonymous.prototype = Object.assign(new Node(), {\n type: 'Anonymous',\n eval() {\n return new Anonymous(this.value, this._index, this._fileInfo, this.mapLines, this.rulesetLike, this.visibilityInfo());\n },\n compare(other) {\n return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n },\n isRulesetLike() {\n return this.rulesetLike;\n },\n genCSS(context, output) {\n this.nodeVisible = Boolean(this.value);\n if (this.nodeVisible) {\n output.add(this.value, this._fileInfo, this._index, this.mapLines);\n }\n }\n})\n\nexport default Anonymous;\n","import Node from './node';\nimport Value from './value';\nimport Keyword from './keyword';\nimport Anonymous from './anonymous';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\nfunction evalName(context, name) {\n let value = '';\n let i;\n const n = name.length;\n const output = {add: function (s) {value += s;}};\n for (i = 0; i < n; i++) {\n name[i].eval(context).genCSS(context, output);\n }\n return value;\n}\n\nconst Declaration = function(name, value, important, merge, index, currentFileInfo, inline, variable) {\n this.name = name;\n this.value = (value instanceof Node) ? value : new Value([value ? new Anonymous(value) : null]);\n this.important = important ? ` ${important.trim()}` : '';\n this.merge = merge;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.inline = inline || false;\n this.variable = (variable !== undefined) ? variable\n : (name.charAt && (name.charAt(0) === '@'));\n this.allowRoot = true;\n this.setParent(this.value, this);\n};\n\nDeclaration.prototype = Object.assign(new Node(), {\n type: 'Declaration',\n\n genCSS(context, output) {\n output.add(this.name + (context.compress ? ':' : ': '), this.fileInfo(), this.getIndex());\n try {\n this.value.genCSS(context, output);\n }\n catch (e) {\n e.index = this._index;\n e.filename = this._fileInfo.filename;\n throw e;\n }\n output.add(this.important + ((this.inline || (context.lastRule && context.compress)) ? '' : ';'), this._fileInfo, this._index);\n },\n\n eval(context) {\n let mathBypass = false, prevMath, name = this.name, evaldValue, variable = this.variable;\n if (typeof name !== 'string') {\n // expand 'primitive' name directly to get\n // things faster (~10% for benchmark.less):\n name = (name.length === 1) && (name[0] instanceof Keyword) ?\n name[0].value : evalName(context, name);\n variable = false; // never treat expanded interpolation as new variable name\n }\n\n // @todo remove when parens-division is default\n if (name === 'font' && context.math === MATH.ALWAYS) {\n mathBypass = true;\n prevMath = context.math;\n context.math = MATH.PARENS_DIVISION;\n }\n try {\n context.importantScope.push({});\n evaldValue = this.value.eval(context);\n\n if (!this.variable && evaldValue.type === 'DetachedRuleset') {\n throw { message: 'Rulesets cannot be evaluated on a property.',\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n let important = this.important;\n const importantResult = context.importantScope.pop();\n if (!important && importantResult.important) {\n important = importantResult.important;\n }\n\n return new Declaration(name,\n evaldValue,\n important,\n this.merge,\n this.getIndex(), this.fileInfo(), this.inline,\n variable);\n }\n catch (e) {\n if (typeof e.index !== 'number') {\n e.index = this.getIndex();\n e.filename = this.fileInfo().filename;\n }\n throw e;\n }\n finally {\n if (mathBypass) {\n context.math = prevMath;\n }\n }\n },\n\n makeImportant() {\n return new Declaration(this.name,\n this.value,\n '!important',\n this.merge,\n this.getIndex(), this.fileInfo(), this.inline);\n }\n});\n\nexport default Declaration;","class debugInfo {\n constructor(context, ctx, lineSeparator) {\n let result = '';\n if (context.dumpLineNumbers && !context.compress) {\n switch (context.dumpLineNumbers) {\n case 'comments':\n result = debugInfo.asComment(ctx);\n break;\n case 'mediaquery':\n result = debugInfo.asMediaQuery(ctx);\n break;\n case 'all':\n result = debugInfo.asComment(ctx) + (lineSeparator || '') + debugInfo.asMediaQuery(ctx);\n break;\n }\n }\n return result;\n }\n\n static asComment(ctx) {\n return `/* line ${ctx.debugInfo.lineNumber}, ${ctx.debugInfo.fileName} */\\n`;\n }\n\n static asMediaQuery(ctx) {\n let filenameWithProtocol = ctx.debugInfo.fileName;\n if (!/^[a-z]+:\\/\\//i.test(filenameWithProtocol)) {\n filenameWithProtocol = `file://${filenameWithProtocol}`;\n }\n return `@media -sass-debug-info{filename{font-family:${filenameWithProtocol.replace(/([.:\\/\\\\])/g, function (a) {\n if (a == '\\\\') {\n a = '\\/';\n }\n return `\\\\${a}`;\n })}}line{font-family:\\\\00003${ctx.debugInfo.lineNumber}}}\\n`;\n }\n}\n\nexport default debugInfo;\n","import Node from './node';\nimport getDebugInfo from './debug-info';\n\nconst Comment = function(value, isLineComment, index, currentFileInfo) {\n this.value = value;\n this.isLineComment = isLineComment;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.allowRoot = true;\n}\n\nComment.prototype = Object.assign(new Node(), {\n type: 'Comment',\n\n genCSS(context, output) {\n if (this.debugInfo) {\n output.add(getDebugInfo(context, this), this.fileInfo(), this.getIndex());\n }\n output.add(this.value);\n },\n\n isSilent(context) {\n const isCompressed = context.compress && this.value[2] !== '!';\n return this.isLineComment || isCompressed;\n }\n});\n\nexport default Comment;\n","const contexts = {};\nexport default contexts;\nimport * as Constants from './constants';\n\nconst copyFromOriginal = function copyFromOriginal(original, destination, propertiesToCopy) {\n if (!original) { return; }\n\n for (let i = 0; i < propertiesToCopy.length; i++) {\n if (original.hasOwnProperty(propertiesToCopy[i])) {\n destination[propertiesToCopy[i]] = original[propertiesToCopy[i]];\n }\n }\n};\n\n/*\n parse is used whilst parsing\n */\nconst parseCopyProperties = [\n // options\n 'paths', // option - unmodified - paths to search for imports on\n 'rewriteUrls', // option - whether to adjust URL's to be relative\n 'rootpath', // option - rootpath to append to URL's\n 'strictImports', // option -\n 'insecure', // option - whether to allow imports from insecure ssl hosts\n 'dumpLineNumbers', // option - whether to dump line numbers\n 'compress', // option - whether to compress\n 'syncImport', // option - whether to import synchronously\n 'chunkInput', // option - whether to chunk input. more performant but causes parse issues.\n 'mime', // browser only - mime type for sheet import\n 'useFileCache', // browser only - whether to use the per file session cache\n // context\n 'processImports', // option & context - whether to process imports. if false then imports will not be imported.\n // Used by the import manager to stop multiple import visitors being created.\n 'pluginManager' // Used as the plugin manager for the session\n];\n\ncontexts.Parse = function(options) {\n copyFromOriginal(options, this, parseCopyProperties);\n\n if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n};\n\nconst evalCopyProperties = [\n 'paths', // additional include paths\n 'compress', // whether to compress\n 'math', // whether math has to be within parenthesis\n 'strictUnits', // whether units need to evaluate correctly\n 'sourceMap', // whether to output a source map\n 'importMultiple', // whether we are currently importing multiple copies\n 'urlArgs', // whether to add args into url tokens\n 'javascriptEnabled', // option - whether Inline JavaScript is enabled. if undefined, defaults to false\n 'pluginManager', // Used as the plugin manager for the session\n 'importantScope', // used to bubble up !important statements\n 'rewriteUrls' // option - whether to adjust URL's to be relative\n];\n\ncontexts.Eval = function(options, frames) {\n copyFromOriginal(options, this, evalCopyProperties);\n\n if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n\n this.frames = frames || [];\n this.importantScope = this.importantScope || [];\n};\n\ncontexts.Eval.prototype.enterCalc = function () {\n if (!this.calcStack) {\n this.calcStack = [];\n }\n this.calcStack.push(true);\n this.inCalc = true;\n};\n\ncontexts.Eval.prototype.exitCalc = function () {\n this.calcStack.pop();\n if (!this.calcStack.length) {\n this.inCalc = false;\n }\n};\n\ncontexts.Eval.prototype.inParenthesis = function () {\n if (!this.parensStack) {\n this.parensStack = [];\n }\n this.parensStack.push(true);\n};\n\ncontexts.Eval.prototype.outOfParenthesis = function () {\n this.parensStack.pop();\n};\n\ncontexts.Eval.prototype.inCalc = false;\ncontexts.Eval.prototype.mathOn = true;\ncontexts.Eval.prototype.isMathOn = function (op) {\n if (!this.mathOn) {\n return false;\n }\n if (op === '/' && this.math !== Constants.Math.ALWAYS && (!this.parensStack || !this.parensStack.length)) {\n return false;\n }\n if (this.math > Constants.Math.PARENS_DIVISION) {\n return this.parensStack && this.parensStack.length;\n }\n return true;\n};\n\ncontexts.Eval.prototype.pathRequiresRewrite = function (path) {\n const isRelative = this.rewriteUrls === Constants.RewriteUrls.LOCAL ? isPathLocalRelative : isPathRelative;\n\n return isRelative(path);\n};\n\ncontexts.Eval.prototype.rewritePath = function (path, rootpath) {\n let newPath;\n\n rootpath = rootpath || '';\n newPath = this.normalizePath(rootpath + path);\n\n // If a path was explicit relative and the rootpath was not an absolute path\n // we must ensure that the new path is also explicit relative.\n if (isPathLocalRelative(path) &&\n isPathRelative(rootpath) &&\n isPathLocalRelative(newPath) === false) {\n newPath = `./${newPath}`;\n }\n\n return newPath;\n};\n\ncontexts.Eval.prototype.normalizePath = function (path) {\n const segments = path.split('/').reverse();\n let segment;\n\n path = [];\n while (segments.length !== 0) {\n segment = segments.pop();\n switch ( segment ) {\n case '.':\n break;\n case '..':\n if ((path.length === 0) || (path[path.length - 1] === '..')) {\n path.push( segment );\n } else {\n path.pop();\n }\n break;\n default:\n path.push(segment);\n break;\n }\n }\n\n return path.join('/');\n};\n\nfunction isPathRelative(path) {\n return !/^(?:[a-z-]+:|\\/|#)/i.test(path);\n}\n\nfunction isPathLocalRelative(path) {\n return path.charAt(0) === '.';\n}\n\n// todo - do the same for the toCSS ?\n","function makeRegistry( base ) {\n return {\n _data: {},\n add: function(name, func) {\n // precautionary case conversion, as later querying of\n // the registry by function-caller uses lower case as well.\n name = name.toLowerCase();\n\n if (this._data.hasOwnProperty(name)) {\n // TODO warn\n }\n this._data[name] = func;\n },\n addMultiple: function(functions) {\n Object.keys(functions).forEach(\n name => {\n this.add(name, functions[name]);\n });\n },\n get: function(name) {\n return this._data[name] || ( base && base.get( name ));\n },\n getLocalFunctions: function() {\n return this._data;\n },\n inherit: function() {\n return makeRegistry( this );\n },\n create: function(base) {\n return makeRegistry(base);\n }\n };\n}\n\nexport default makeRegistry( null );","import Keyword from '../tree/keyword';\n\nconst defaultFunc = {\n eval: function () {\n const v = this.value_;\n const e = this.error_;\n if (e) {\n throw e;\n }\n if (v != null) {\n return v ? Keyword.True : Keyword.False;\n }\n },\n value: function (v) {\n this.value_ = v;\n },\n error: function (e) {\n this.error_ = e;\n },\n reset: function () {\n this.value_ = this.error_ = null;\n }\n};\n\nexport default defaultFunc;\n","import Node from './node';\nimport Declaration from './declaration';\nimport Keyword from './keyword';\nimport Comment from './comment';\nimport Paren from './paren';\nimport Selector from './selector';\nimport Element from './element';\nimport Anonymous from './anonymous';\nimport contexts from '../contexts';\nimport globalFunctionRegistry from '../functions/function-registry';\nimport defaultFunc from '../functions/default';\nimport getDebugInfo from './debug-info';\nimport * as utils from '../utils';\n\nconst Ruleset = function(selectors, rules, strictImports, visibilityInfo) {\n this.selectors = selectors;\n this.rules = rules;\n this._lookups = {};\n this._variables = null;\n this._properties = null;\n this.strictImports = strictImports;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n\n this.setParent(this.selectors, this);\n this.setParent(this.rules, this);\n}\n\nRuleset.prototype = Object.assign(new Node(), {\n type: 'Ruleset',\n isRuleset: true,\n\n isRulesetLike() { return true; },\n\n accept(visitor) {\n if (this.paths) {\n this.paths = visitor.visitArray(this.paths, true);\n } else if (this.selectors) {\n this.selectors = visitor.visitArray(this.selectors);\n }\n if (this.rules && this.rules.length) {\n this.rules = visitor.visitArray(this.rules);\n }\n },\n\n eval(context) {\n const that = this;\n let selectors;\n let selCnt;\n let selector;\n let i;\n let hasVariable;\n let hasOnePassingSelector = false;\n\n if (this.selectors && (selCnt = this.selectors.length)) {\n selectors = new Array(selCnt);\n defaultFunc.error({\n type: 'Syntax',\n message: 'it is currently only allowed in parametric mixin guards,'\n });\n\n for (i = 0; i < selCnt; i++) {\n selector = this.selectors[i].eval(context);\n for (var j = 0; j < selector.elements.length; j++) {\n if (selector.elements[j].isVariable) {\n hasVariable = true;\n break;\n }\n }\n selectors[i] = selector;\n if (selector.evaldCondition) {\n hasOnePassingSelector = true;\n }\n }\n\n if (hasVariable) {\n const toParseSelectors = new Array(selCnt);\n for (i = 0; i < selCnt; i++) {\n selector = selectors[i];\n toParseSelectors[i] = selector.toCSS(context);\n }\n this.parse.parseNode(\n toParseSelectors.join(','),\n [\"selectors\"], \n selectors[0].getIndex(), \n selectors[0].fileInfo(), \n function(err, result) {\n if (result) {\n selectors = utils.flattenArray(result);\n }\n });\n }\n\n defaultFunc.reset();\n } else {\n hasOnePassingSelector = true;\n }\n\n let rules = this.rules ? utils.copyArray(this.rules) : null;\n const ruleset = new Ruleset(selectors, rules, this.strictImports, this.visibilityInfo());\n let rule;\n let subRule;\n\n ruleset.originalRuleset = this;\n ruleset.root = this.root;\n ruleset.firstRoot = this.firstRoot;\n ruleset.allowImports = this.allowImports;\n\n if (this.debugInfo) {\n ruleset.debugInfo = this.debugInfo;\n }\n\n if (!hasOnePassingSelector) {\n rules.length = 0;\n }\n\n // inherit a function registry from the frames stack when possible;\n // otherwise from the global registry\n ruleset.functionRegistry = (function (frames) {\n let i = 0;\n const n = frames.length;\n let found;\n for ( ; i !== n ; ++i ) {\n found = frames[ i ].functionRegistry;\n if ( found ) { return found; }\n }\n return globalFunctionRegistry;\n }(context.frames)).inherit();\n\n // push the current ruleset to the frames stack\n const ctxFrames = context.frames;\n ctxFrames.unshift(ruleset);\n\n // currrent selectors\n let ctxSelectors = context.selectors;\n if (!ctxSelectors) {\n context.selectors = ctxSelectors = [];\n }\n ctxSelectors.unshift(this.selectors);\n\n // Evaluate imports\n if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) {\n ruleset.evalImports(context);\n }\n\n // Store the frames around mixin definitions,\n // so they can be evaluated like closures when the time comes.\n const rsRules = ruleset.rules;\n for (i = 0; (rule = rsRules[i]); i++) {\n if (rule.evalFirst) {\n rsRules[i] = rule.eval(context);\n }\n }\n\n const mediaBlockCount = (context.mediaBlocks && context.mediaBlocks.length) || 0;\n\n // Evaluate mixin calls.\n for (i = 0; (rule = rsRules[i]); i++) {\n if (rule.type === 'MixinCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).filter(function(r) {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope if the variable is\n // already there. consider returning false here\n // but we need a way to \"return\" variable from mixins\n return !(ruleset.variable(r.name));\n }\n return true;\n });\n rsRules.splice.apply(rsRules, [i, 1].concat(rules));\n i += rules.length - 1;\n ruleset.resetCache();\n } else if (rule.type === 'VariableCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).rules.filter(function(r) {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope at all\n return false;\n }\n return true;\n });\n rsRules.splice.apply(rsRules, [i, 1].concat(rules));\n i += rules.length - 1;\n ruleset.resetCache();\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n if (!rule.evalFirst) {\n rsRules[i] = rule = rule.eval ? rule.eval(context) : rule;\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n // for rulesets, check if it is a css guard and can be removed\n if (rule instanceof Ruleset && rule.selectors && rule.selectors.length === 1) {\n // check if it can be folded in (e.g. & where)\n if (rule.selectors[0] && rule.selectors[0].isJustParentSelector()) {\n rsRules.splice(i--, 1);\n\n for (var j = 0; (subRule = rule.rules[j]); j++) {\n if (subRule instanceof Node) {\n subRule.copyVisibilityInfo(rule.visibilityInfo());\n if (!(subRule instanceof Declaration) || !subRule.variable) {\n rsRules.splice(++i, 0, subRule);\n }\n }\n }\n }\n }\n }\n\n // Pop the stack\n ctxFrames.shift();\n ctxSelectors.shift();\n\n if (context.mediaBlocks) {\n for (i = mediaBlockCount; i < context.mediaBlocks.length; i++) {\n context.mediaBlocks[i].bubbleSelectors(selectors);\n }\n }\n\n return ruleset;\n },\n\n evalImports(context) {\n const rules = this.rules;\n let i;\n let importRules;\n if (!rules) { return; }\n\n for (i = 0; i < rules.length; i++) {\n if (rules[i].type === 'Import') {\n importRules = rules[i].eval(context);\n if (importRules && (importRules.length || importRules.length === 0)) {\n rules.splice.apply(rules, [i, 1].concat(importRules));\n i += importRules.length - 1;\n } else {\n rules.splice(i, 1, importRules);\n }\n this.resetCache();\n }\n }\n },\n\n makeImportant() {\n const result = new Ruleset(this.selectors, this.rules.map(function (r) {\n if (r.makeImportant) {\n return r.makeImportant();\n } else {\n return r;\n }\n }), this.strictImports, this.visibilityInfo());\n\n return result;\n },\n\n matchArgs(args) {\n return !args || args.length === 0;\n },\n\n // lets you call a css selector with a guard\n matchCondition(args, context) {\n const lastSelector = this.selectors[this.selectors.length - 1];\n if (!lastSelector.evaldCondition) {\n return false;\n }\n if (lastSelector.condition &&\n !lastSelector.condition.eval(\n new contexts.Eval(context,\n context.frames))) {\n return false;\n }\n return true;\n },\n\n resetCache() {\n this._rulesets = null;\n this._variables = null;\n this._properties = null;\n this._lookups = {};\n },\n\n variables() {\n if (!this._variables) {\n this._variables = !this.rules ? {} : this.rules.reduce(function (hash, r) {\n if (r instanceof Declaration && r.variable === true) {\n hash[r.name] = r;\n }\n // when evaluating variables in an import statement, imports have not been eval'd\n // so we need to go inside import statements.\n // guard against root being a string (in the case of inlined less)\n if (r.type === 'Import' && r.root && r.root.variables) {\n const vars = r.root.variables();\n for (const name in vars) {\n if (vars.hasOwnProperty(name)) {\n hash[name] = r.root.variable(name);\n }\n }\n }\n return hash;\n }, {});\n }\n return this._variables;\n },\n\n properties() {\n if (!this._properties) {\n this._properties = !this.rules ? {} : this.rules.reduce(function (hash, r) {\n if (r instanceof Declaration && r.variable !== true) {\n const name = (r.name.length === 1) && (r.name[0] instanceof Keyword) ?\n r.name[0].value : r.name;\n // Properties don't overwrite as they can merge\n if (!hash[`$${name}`]) {\n hash[`$${name}`] = [ r ];\n }\n else {\n hash[`$${name}`].push(r);\n }\n }\n return hash;\n }, {});\n }\n return this._properties;\n },\n\n variable(name) {\n const decl = this.variables()[name];\n if (decl) {\n return this.parseValue(decl);\n }\n },\n\n property(name) {\n const decl = this.properties()[name];\n if (decl) {\n return this.parseValue(decl);\n }\n },\n\n lastDeclaration() {\n for (let i = this.rules.length; i > 0; i--) {\n const decl = this.rules[i - 1];\n if (decl instanceof Declaration) {\n return this.parseValue(decl);\n }\n }\n },\n\n parseValue(toParse) {\n const self = this;\n function transformDeclaration(decl) {\n if (decl.value instanceof Anonymous && !decl.parsed) {\n if (typeof decl.value.value === 'string') {\n this.parse.parseNode(\n decl.value.value,\n ['value', 'important'], \n decl.value.getIndex(), \n decl.fileInfo(), \n function(err, result) {\n if (err) {\n decl.parsed = true;\n }\n if (result) {\n decl.value = result[0];\n decl.important = result[1] || '';\n decl.parsed = true;\n }\n });\n } else {\n decl.parsed = true;\n }\n\n return decl;\n }\n else {\n return decl;\n }\n }\n if (!Array.isArray(toParse)) {\n return transformDeclaration.call(self, toParse);\n }\n else {\n const nodes = [];\n toParse.forEach(function(n) {\n nodes.push(transformDeclaration.call(self, n));\n });\n return nodes;\n }\n },\n\n rulesets() {\n if (!this.rules) { return []; }\n\n const filtRules = [];\n const rules = this.rules;\n let i;\n let rule;\n\n for (i = 0; (rule = rules[i]); i++) {\n if (rule.isRuleset) {\n filtRules.push(rule);\n }\n }\n\n return filtRules;\n },\n\n prependRule(rule) {\n const rules = this.rules;\n if (rules) {\n rules.unshift(rule);\n } else {\n this.rules = [ rule ];\n }\n this.setParent(rule, this);\n },\n\n find(selector, self, filter) {\n self = self || this;\n const rules = [];\n let match;\n let foundMixins;\n const key = selector.toCSS();\n\n if (key in this._lookups) { return this._lookups[key]; }\n\n this.rulesets().forEach(function (rule) {\n if (rule !== self) {\n for (let j = 0; j < rule.selectors.length; j++) {\n match = selector.match(rule.selectors[j]);\n if (match) {\n if (selector.elements.length > match) {\n if (!filter || filter(rule)) {\n foundMixins = rule.find(new Selector(selector.elements.slice(match)), self, filter);\n for (let i = 0; i < foundMixins.length; ++i) {\n foundMixins[i].path.push(rule);\n }\n Array.prototype.push.apply(rules, foundMixins);\n }\n } else {\n rules.push({ rule, path: []});\n }\n break;\n }\n }\n }\n });\n this._lookups[key] = rules;\n return rules;\n },\n\n genCSS(context, output) {\n let i;\n let j;\n const charsetRuleNodes = [];\n let ruleNodes = [];\n\n let // Line number debugging\n debugInfo;\n\n let rule;\n let path;\n\n context.tabLevel = (context.tabLevel || 0);\n\n if (!this.root) {\n context.tabLevel++;\n }\n\n const tabRuleStr = context.compress ? '' : Array(context.tabLevel + 1).join(' ');\n const tabSetStr = context.compress ? '' : Array(context.tabLevel).join(' ');\n let sep;\n\n let charsetNodeIndex = 0;\n let importNodeIndex = 0;\n for (i = 0; (rule = this.rules[i]); i++) {\n if (rule instanceof Comment) {\n if (importNodeIndex === i) {\n importNodeIndex++;\n }\n ruleNodes.push(rule);\n } else if (rule.isCharset && rule.isCharset()) {\n ruleNodes.splice(charsetNodeIndex, 0, rule);\n charsetNodeIndex++;\n importNodeIndex++;\n } else if (rule.type === 'Import') {\n ruleNodes.splice(importNodeIndex, 0, rule);\n importNodeIndex++;\n } else {\n ruleNodes.push(rule);\n }\n }\n ruleNodes = charsetRuleNodes.concat(ruleNodes);\n\n // If this is the root node, we don't render\n // a selector, or {}.\n if (!this.root) {\n debugInfo = getDebugInfo(context, this, tabSetStr);\n\n if (debugInfo) {\n output.add(debugInfo);\n output.add(tabSetStr);\n }\n\n const paths = this.paths;\n const pathCnt = paths.length;\n let pathSubCnt;\n\n sep = context.compress ? ',' : (`,\\n${tabSetStr}`);\n\n for (i = 0; i < pathCnt; i++) {\n path = paths[i];\n if (!(pathSubCnt = path.length)) { continue; }\n if (i > 0) { output.add(sep); }\n\n context.firstSelector = true;\n path[0].genCSS(context, output);\n\n context.firstSelector = false;\n for (j = 1; j < pathSubCnt; j++) {\n path[j].genCSS(context, output);\n }\n }\n\n output.add((context.compress ? '{' : ' {\\n') + tabRuleStr);\n }\n\n // Compile rules and rulesets\n for (i = 0; (rule = ruleNodes[i]); i++) {\n\n if (i + 1 === ruleNodes.length) {\n context.lastRule = true;\n }\n\n const currentLastRule = context.lastRule;\n if (rule.isRulesetLike(rule)) {\n context.lastRule = false;\n }\n\n if (rule.genCSS) {\n rule.genCSS(context, output);\n } else if (rule.value) {\n output.add(rule.value.toString());\n }\n\n context.lastRule = currentLastRule;\n\n if (!context.lastRule && rule.isVisible()) {\n output.add(context.compress ? '' : (`\\n${tabRuleStr}`));\n } else {\n context.lastRule = false;\n }\n }\n\n if (!this.root) {\n output.add((context.compress ? '}' : `\\n${tabSetStr}}`));\n context.tabLevel--;\n }\n\n if (!output.isEmpty() && !context.compress && this.firstRoot) {\n output.add('\\n');\n }\n },\n\n joinSelectors(paths, context, selectors) {\n for (let s = 0; s < selectors.length; s++) {\n this.joinSelector(paths, context, selectors[s]);\n }\n },\n\n joinSelector(paths, context, selector) {\n\n function createParenthesis(elementsToPak, originalElement) {\n let replacementParen, j;\n if (elementsToPak.length === 0) {\n replacementParen = new Paren(elementsToPak[0]);\n } else {\n const insideParent = new Array(elementsToPak.length);\n for (j = 0; j < elementsToPak.length; j++) {\n insideParent[j] = new Element(\n null,\n elementsToPak[j],\n originalElement.isVariable,\n originalElement._index,\n originalElement._fileInfo\n );\n }\n replacementParen = new Paren(new Selector(insideParent));\n }\n return replacementParen;\n }\n\n function createSelector(containedElement, originalElement) {\n let element, selector;\n element = new Element(null, containedElement, originalElement.isVariable, originalElement._index, originalElement._fileInfo);\n selector = new Selector([element]);\n return selector;\n }\n\n // joins selector path from `beginningPath` with selector path in `addPath`\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns concatenated path\n function addReplacementIntoPath(beginningPath, addPath, replacedElement, originalSelector) {\n let newSelectorPath, lastSelector, newJoinedSelector;\n // our new selector path\n newSelectorPath = [];\n\n // construct the joined selector - if & is the first thing this will be empty,\n // if not newJoinedSelector will be the last set of elements in the selector\n if (beginningPath.length > 0) {\n newSelectorPath = utils.copyArray(beginningPath);\n lastSelector = newSelectorPath.pop();\n newJoinedSelector = originalSelector.createDerived(utils.copyArray(lastSelector.elements));\n }\n else {\n newJoinedSelector = originalSelector.createDerived([]);\n }\n\n if (addPath.length > 0) {\n // /deep/ is a CSS4 selector - (removed, so should deprecate)\n // that is valid without anything in front of it\n // so if the & does not have a combinator that is \"\" or \" \" then\n // and there is a combinator on the parent, then grab that.\n // this also allows + a { & .b { .a & { ... though not sure why you would want to do that\n let combinator = replacedElement.combinator;\n\n const parentEl = addPath[0].elements[0];\n if (combinator.emptyOrWhitespace && !parentEl.combinator.emptyOrWhitespace) {\n combinator = parentEl.combinator;\n }\n // join the elements so far with the first part of the parent\n newJoinedSelector.elements.push(new Element(\n combinator,\n parentEl.value,\n replacedElement.isVariable,\n replacedElement._index,\n replacedElement._fileInfo\n ));\n newJoinedSelector.elements = newJoinedSelector.elements.concat(addPath[0].elements.slice(1));\n }\n\n // now add the joined selector - but only if it is not empty\n if (newJoinedSelector.elements.length !== 0) {\n newSelectorPath.push(newJoinedSelector);\n }\n\n // put together the parent selectors after the join (e.g. the rest of the parent)\n if (addPath.length > 1) {\n let restOfPath = addPath.slice(1);\n restOfPath = restOfPath.map(function (selector) {\n return selector.createDerived(selector.elements, []);\n });\n newSelectorPath = newSelectorPath.concat(restOfPath);\n }\n return newSelectorPath;\n }\n\n // joins selector path from `beginningPath` with every selector path in `addPaths` array\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns array with all concatenated paths\n function addAllReplacementsIntoPath( beginningPath, addPaths, replacedElement, originalSelector, result) {\n let j;\n for (j = 0; j < beginningPath.length; j++) {\n const newSelectorPath = addReplacementIntoPath(beginningPath[j], addPaths, replacedElement, originalSelector);\n result.push(newSelectorPath);\n }\n return result;\n }\n\n function mergeElementsOnToSelectors(elements, selectors) {\n let i, sel;\n\n if (elements.length === 0) {\n return ;\n }\n if (selectors.length === 0) {\n selectors.push([ new Selector(elements) ]);\n return;\n }\n\n for (i = 0; (sel = selectors[i]); i++) {\n // if the previous thing in sel is a parent this needs to join on to it\n if (sel.length > 0) {\n sel[sel.length - 1] = sel[sel.length - 1].createDerived(sel[sel.length - 1].elements.concat(elements));\n }\n else {\n sel.push(new Selector(elements));\n }\n }\n }\n\n // replace all parent selectors inside `inSelector` by content of `context` array\n // resulting selectors are returned inside `paths` array\n // returns true if `inSelector` contained at least one parent selector\n function replaceParentSelector(paths, context, inSelector) {\n // The paths are [[Selector]]\n // The first list is a list of comma separated selectors\n // The inner list is a list of inheritance separated selectors\n // e.g.\n // .a, .b {\n // .c {\n // }\n // }\n // == [[.a] [.c]] [[.b] [.c]]\n //\n let i, j, k, currentElements, newSelectors, selectorsMultiplied, sel, el, hadParentSelector = false, length, lastSelector;\n function findNestedSelector(element) {\n let maybeSelector;\n if (!(element.value instanceof Paren)) {\n return null;\n }\n\n maybeSelector = element.value.value;\n if (!(maybeSelector instanceof Selector)) {\n return null;\n }\n\n return maybeSelector;\n }\n\n // the elements from the current selector so far\n currentElements = [];\n // the current list of new selectors to add to the path.\n // We will build it up. We initiate it with one empty selector as we \"multiply\" the new selectors\n // by the parents\n newSelectors = [\n []\n ];\n\n for (i = 0; (el = inSelector.elements[i]); i++) {\n // non parent reference elements just get added\n if (el.value !== '&') {\n const nestedSelector = findNestedSelector(el);\n if (nestedSelector != null) {\n // merge the current list of non parent selector elements\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n const nestedPaths = [];\n let replaced;\n const replacedNewSelectors = [];\n replaced = replaceParentSelector(nestedPaths, context, nestedSelector);\n hadParentSelector = hadParentSelector || replaced;\n // the nestedPaths array should have only one member - replaceParentSelector does not multiply selectors\n for (k = 0; k < nestedPaths.length; k++) {\n const replacementSelector = createSelector(createParenthesis(nestedPaths[k], el), el);\n addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors);\n }\n newSelectors = replacedNewSelectors;\n currentElements = [];\n } else {\n currentElements.push(el);\n }\n\n } else {\n hadParentSelector = true;\n // the new list of selectors to add\n selectorsMultiplied = [];\n\n // merge the current list of non parent selector elements\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n // loop through our current selectors\n for (j = 0; j < newSelectors.length; j++) {\n sel = newSelectors[j];\n // if we don't have any parent paths, the & might be in a mixin so that it can be used\n // whether there are parents or not\n if (context.length === 0) {\n // the combinator used on el should now be applied to the next element instead so that\n // it is not lost\n if (sel.length > 0) {\n sel[0].elements.push(new Element(el.combinator, '', el.isVariable, el._index, el._fileInfo));\n }\n selectorsMultiplied.push(sel);\n }\n else {\n // and the parent selectors\n for (k = 0; k < context.length; k++) {\n // We need to put the current selectors\n // then join the last selector's elements on to the parents selectors\n const newSelectorPath = addReplacementIntoPath(sel, context[k], el, inSelector);\n // add that to our new set of selectors\n selectorsMultiplied.push(newSelectorPath);\n }\n }\n }\n\n // our new selectors has been multiplied, so reset the state\n newSelectors = selectorsMultiplied;\n currentElements = [];\n }\n }\n\n // if we have any elements left over (e.g. .a& .b == .b)\n // add them on to all the current selectors\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n for (i = 0; i < newSelectors.length; i++) {\n length = newSelectors[i].length;\n if (length > 0) {\n paths.push(newSelectors[i]);\n lastSelector = newSelectors[i][length - 1];\n newSelectors[i][length - 1] = lastSelector.createDerived(lastSelector.elements, inSelector.extendList);\n }\n }\n\n return hadParentSelector;\n }\n\n function deriveSelector(visibilityInfo, deriveFrom) {\n const newSelector = deriveFrom.createDerived(deriveFrom.elements, deriveFrom.extendList, deriveFrom.evaldCondition);\n newSelector.copyVisibilityInfo(visibilityInfo);\n return newSelector;\n }\n\n // joinSelector code follows\n let i, newPaths, hadParentSelector;\n\n newPaths = [];\n hadParentSelector = replaceParentSelector(newPaths, context, selector);\n\n if (!hadParentSelector) {\n if (context.length > 0) {\n newPaths = [];\n for (i = 0; i < context.length; i++) {\n\n const concatenated = context[i].map(deriveSelector.bind(this, selector.visibilityInfo()));\n\n concatenated.push(selector);\n newPaths.push(concatenated);\n }\n }\n else {\n newPaths = [[selector]];\n }\n }\n\n for (i = 0; i < newPaths.length; i++) {\n paths.push(newPaths[i]);\n }\n\n }\n});\n\nexport default Ruleset;\n","import Node from './node';\nimport Selector from './selector';\nimport Ruleset from './ruleset';\nimport Anonymous from './anonymous';\n\nconst AtRule = function(\n name,\n value,\n rules,\n index,\n currentFileInfo,\n debugInfo,\n isRooted,\n visibilityInfo\n) {\n let i;\n\n this.name = name;\n this.value = (value instanceof Node) ? value : (value ? new Anonymous(value) : value);\n if (rules) {\n if (Array.isArray(rules)) {\n this.rules = rules;\n } else {\n this.rules = [rules];\n this.rules[0].selectors = (new Selector([], null, null, index, currentFileInfo)).createEmptySelectors();\n }\n for (i = 0; i < this.rules.length; i++) {\n this.rules[i].allowImports = true;\n }\n this.setParent(this.rules, this);\n }\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.debugInfo = debugInfo;\n this.isRooted = isRooted || false;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n}\n\nAtRule.prototype = Object.assign(new Node(), {\n type: 'AtRule',\n accept(visitor) {\n const value = this.value, rules = this.rules;\n if (rules) {\n this.rules = visitor.visitArray(rules);\n }\n if (value) {\n this.value = visitor.visit(value);\n }\n },\n\n isRulesetLike() {\n return this.rules || !this.isCharset();\n },\n\n isCharset() {\n return '@charset' === this.name;\n },\n\n genCSS(context, output) {\n const value = this.value, rules = this.rules;\n output.add(this.name, this.fileInfo(), this.getIndex());\n if (value) {\n output.add(' ');\n value.genCSS(context, output);\n }\n if (rules) {\n this.outputRuleset(context, output, rules);\n } else {\n output.add(';');\n }\n },\n\n eval(context) {\n let mediaPathBackup, mediaBlocksBackup, value = this.value, rules = this.rules;\n\n // media stored inside other atrule should not bubble over it\n // backpup media bubbling information\n mediaPathBackup = context.mediaPath;\n mediaBlocksBackup = context.mediaBlocks;\n // deleted media bubbling information\n context.mediaPath = [];\n context.mediaBlocks = [];\n\n if (value) {\n value = value.eval(context);\n }\n if (rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n rules = [rules[0].eval(context)];\n rules[0].root = true;\n }\n // restore media bubbling information\n context.mediaPath = mediaPathBackup;\n context.mediaBlocks = mediaBlocksBackup;\n\n return new AtRule(this.name, value, rules,\n this.getIndex(), this.fileInfo(), this.debugInfo, this.isRooted, this.visibilityInfo());\n },\n\n variable(name) {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.variable.call(this.rules[0], name);\n }\n },\n\n find() {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.find.apply(this.rules[0], arguments);\n }\n },\n\n rulesets() {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.rulesets.apply(this.rules[0]);\n }\n },\n\n outputRuleset(context, output, rules) {\n const ruleCnt = rules.length;\n let i;\n context.tabLevel = (context.tabLevel | 0) + 1;\n\n // Compressed\n if (context.compress) {\n output.add('{');\n for (i = 0; i < ruleCnt; i++) {\n rules[i].genCSS(context, output);\n }\n output.add('}');\n context.tabLevel--;\n return;\n }\n\n // Non-compressed\n const tabSetStr = `\\n${Array(context.tabLevel).join(' ')}`, tabRuleStr = `${tabSetStr} `;\n if (!ruleCnt) {\n output.add(` {${tabSetStr}}`);\n } else {\n output.add(` {${tabRuleStr}`);\n rules[0].genCSS(context, output);\n for (i = 1; i < ruleCnt; i++) {\n output.add(tabRuleStr);\n rules[i].genCSS(context, output);\n }\n output.add(`${tabSetStr}}`);\n }\n\n context.tabLevel--;\n }\n});\n\nexport default AtRule;\n","import Node from './node';\nimport contexts from '../contexts';\nimport * as utils from '../utils';\n\nconst DetachedRuleset = function(ruleset, frames) {\n this.ruleset = ruleset;\n this.frames = frames;\n this.setParent(this.ruleset, this);\n};\n\nDetachedRuleset.prototype = Object.assign(new Node(), {\n type: 'DetachedRuleset',\n evalFirst: true,\n\n accept(visitor) {\n this.ruleset = visitor.visit(this.ruleset);\n },\n\n eval(context) {\n const frames = this.frames || utils.copyArray(context.frames);\n return new DetachedRuleset(this.ruleset, frames);\n },\n\n callEval(context) {\n return this.ruleset.eval(this.frames ? new contexts.Eval(context, this.frames.concat(context.frames)) : context);\n }\n});\n\nexport default DetachedRuleset;\n","import Node from './node';\nimport unitConversions from '../data/unit-conversions';\nimport * as utils from '../utils';\n\nconst Unit = function(numerator, denominator, backupUnit) {\n this.numerator = numerator ? utils.copyArray(numerator).sort() : [];\n this.denominator = denominator ? utils.copyArray(denominator).sort() : [];\n if (backupUnit) {\n this.backupUnit = backupUnit;\n } else if (numerator && numerator.length) {\n this.backupUnit = numerator[0];\n }\n};\n\nUnit.prototype = Object.assign(new Node(), {\n type: 'Unit',\n\n clone() {\n return new Unit(utils.copyArray(this.numerator), utils.copyArray(this.denominator), this.backupUnit);\n },\n\n genCSS(context, output) {\n // Dimension checks the unit is singular and throws an error if in strict math mode.\n const strictUnits = context && context.strictUnits;\n if (this.numerator.length === 1) {\n output.add(this.numerator[0]); // the ideal situation\n } else if (!strictUnits && this.backupUnit) {\n output.add(this.backupUnit);\n } else if (!strictUnits && this.denominator.length) {\n output.add(this.denominator[0]);\n }\n },\n\n toString() {\n let i, returnStr = this.numerator.join('*');\n for (i = 0; i < this.denominator.length; i++) {\n returnStr += `/${this.denominator[i]}`;\n }\n return returnStr;\n },\n\n compare(other) {\n return this.is(other.toString()) ? 0 : undefined;\n },\n\n is(unitString) {\n return this.toString().toUpperCase() === unitString.toUpperCase();\n },\n\n isLength() {\n return RegExp('^(px|em|ex|ch|rem|in|cm|mm|pc|pt|ex|vw|vh|vmin|vmax)$', 'gi').test(this.toCSS());\n },\n\n isEmpty() {\n return this.numerator.length === 0 && this.denominator.length === 0;\n },\n\n isSingular() {\n return this.numerator.length <= 1 && this.denominator.length === 0;\n },\n\n map(callback) {\n let i;\n\n for (i = 0; i < this.numerator.length; i++) {\n this.numerator[i] = callback(this.numerator[i], false);\n }\n\n for (i = 0; i < this.denominator.length; i++) {\n this.denominator[i] = callback(this.denominator[i], true);\n }\n },\n\n usedUnits() {\n let group;\n const result = {};\n let mapUnit;\n let groupName;\n\n mapUnit = function (atomicUnit) {\n /* jshint loopfunc:true */\n if (group.hasOwnProperty(atomicUnit) && !result[groupName]) {\n result[groupName] = atomicUnit;\n }\n\n return atomicUnit;\n };\n\n for (groupName in unitConversions) {\n if (unitConversions.hasOwnProperty(groupName)) {\n group = unitConversions[groupName];\n\n this.map(mapUnit);\n }\n }\n\n return result;\n },\n\n cancel() {\n const counter = {};\n let atomicUnit;\n let i;\n\n for (i = 0; i < this.numerator.length; i++) {\n atomicUnit = this.numerator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) + 1;\n }\n\n for (i = 0; i < this.denominator.length; i++) {\n atomicUnit = this.denominator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) - 1;\n }\n\n this.numerator = [];\n this.denominator = [];\n\n for (atomicUnit in counter) {\n if (counter.hasOwnProperty(atomicUnit)) {\n const count = counter[atomicUnit];\n\n if (count > 0) {\n for (i = 0; i < count; i++) {\n this.numerator.push(atomicUnit);\n }\n } else if (count < 0) {\n for (i = 0; i < -count; i++) {\n this.denominator.push(atomicUnit);\n }\n }\n }\n }\n\n this.numerator.sort();\n this.denominator.sort();\n }\n});\n\nexport default Unit;\n","import Node from './node';\nimport unitConversions from '../data/unit-conversions';\nimport Unit from './unit';\nimport Color from './color';\n\n//\n// A number with a unit\n//\nconst Dimension = function(value, unit) {\n this.value = parseFloat(value);\n if (isNaN(this.value)) {\n throw new Error('Dimension is not a number.');\n }\n this.unit = (unit && unit instanceof Unit) ? unit :\n new Unit(unit ? [unit] : undefined);\n this.setParent(this.unit, this);\n};\n\nDimension.prototype = Object.assign(new Node(), {\n type: 'Dimension',\n\n accept(visitor) {\n this.unit = visitor.visit(this.unit);\n },\n\n eval(context) {\n return this;\n },\n\n toColor() {\n return new Color([this.value, this.value, this.value]);\n },\n\n genCSS(context, output) {\n if ((context && context.strictUnits) && !this.unit.isSingular()) {\n throw new Error(`Multiple units in dimension. Correct the units or use the unit function. Bad unit: ${this.unit.toString()}`);\n }\n\n const value = this.fround(context, this.value);\n let strValue = String(value);\n\n if (value !== 0 && value < 0.000001 && value > -0.000001) {\n // would be output 1e-6 etc.\n strValue = value.toFixed(20).replace(/0+$/, '');\n }\n\n if (context && context.compress) {\n // Zero values doesn't need a unit\n if (value === 0 && this.unit.isLength()) {\n output.add(strValue);\n return;\n }\n\n // Float values doesn't need a leading zero\n if (value > 0 && value < 1) {\n strValue = (strValue).substr(1);\n }\n }\n\n output.add(strValue);\n this.unit.genCSS(context, output);\n },\n\n // In an operation between two Dimensions,\n // we default to the first Dimension's unit,\n // so `1px + 2` will yield `3px`.\n operate(context, op, other) {\n /* jshint noempty:false */\n let value = this._operate(context, op, this.value, other.value), unit = this.unit.clone();\n\n if (op === '+' || op === '-') {\n if (unit.numerator.length === 0 && unit.denominator.length === 0) {\n unit = other.unit.clone();\n if (this.unit.backupUnit) {\n unit.backupUnit = this.unit.backupUnit;\n }\n } else if (other.unit.numerator.length === 0 && unit.denominator.length === 0) {\n // do nothing\n } else {\n other = other.convertTo(this.unit.usedUnits());\n\n if (context.strictUnits && other.unit.toString() !== unit.toString()) {\n throw new Error(`Incompatible units. Change the units or use the unit function. `\n + `Bad units: '${unit.toString()}' and '${other.unit.toString()}'.`);\n }\n\n value = this._operate(context, op, this.value, other.value);\n }\n } else if (op === '*') {\n unit.numerator = unit.numerator.concat(other.unit.numerator).sort();\n unit.denominator = unit.denominator.concat(other.unit.denominator).sort();\n unit.cancel();\n } else if (op === '/') {\n unit.numerator = unit.numerator.concat(other.unit.denominator).sort();\n unit.denominator = unit.denominator.concat(other.unit.numerator).sort();\n unit.cancel();\n }\n return new Dimension(value, unit);\n },\n\n compare(other) {\n let a, b;\n\n if (!(other instanceof Dimension)) {\n return undefined;\n }\n\n if (this.unit.isEmpty() || other.unit.isEmpty()) {\n a = this;\n b = other;\n } else {\n a = this.unify();\n b = other.unify();\n if (a.unit.compare(b.unit) !== 0) {\n return undefined;\n }\n }\n\n return Node.numericCompare(a.value, b.value);\n },\n\n unify() {\n return this.convertTo({ length: 'px', duration: 's', angle: 'rad' });\n },\n\n convertTo(conversions) {\n let value = this.value;\n const unit = this.unit.clone();\n let i;\n let groupName;\n let group;\n let targetUnit;\n let derivedConversions = {};\n let applyUnit;\n\n if (typeof conversions === 'string') {\n for (i in unitConversions) {\n if (unitConversions[i].hasOwnProperty(conversions)) {\n derivedConversions = {};\n derivedConversions[i] = conversions;\n }\n }\n conversions = derivedConversions;\n }\n applyUnit = function (atomicUnit, denominator) {\n /* jshint loopfunc:true */\n if (group.hasOwnProperty(atomicUnit)) {\n if (denominator) {\n value = value / (group[atomicUnit] / group[targetUnit]);\n } else {\n value = value * (group[atomicUnit] / group[targetUnit]);\n }\n\n return targetUnit;\n }\n\n return atomicUnit;\n };\n\n for (groupName in conversions) {\n if (conversions.hasOwnProperty(groupName)) {\n targetUnit = conversions[groupName];\n group = unitConversions[groupName];\n\n unit.map(applyUnit);\n }\n }\n\n unit.cancel();\n\n return new Dimension(value, unit);\n }\n});\n\nexport default Dimension;\n","import Node from './node';\nimport Color from './color';\nimport Dimension from './dimension';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\n\nconst Operation = function(op, operands, isSpaced) {\n this.op = op.trim();\n this.operands = operands;\n this.isSpaced = isSpaced;\n};\n\nOperation.prototype = Object.assign(new Node(), {\n type: 'Operation',\n\n accept(visitor) {\n this.operands = visitor.visitArray(this.operands);\n },\n\n eval(context) {\n let a = this.operands[0].eval(context), b = this.operands[1].eval(context), op;\n\n if (context.isMathOn(this.op)) {\n op = this.op === './' ? '/' : this.op;\n if (a instanceof Dimension && b instanceof Color) {\n a = a.toColor();\n }\n if (b instanceof Dimension && a instanceof Color) {\n b = b.toColor();\n }\n if (!a.operate) {\n if (a instanceof Operation && a.op === '/' && context.math === MATH.PARENS_DIVISION) {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n throw { type: 'Operation',\n message: 'Operation on an invalid type' };\n }\n\n return a.operate(context, op, b);\n } else {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n },\n\n genCSS(context, output) {\n this.operands[0].genCSS(context, output);\n if (this.isSpaced) {\n output.add(' ');\n }\n output.add(this.op);\n if (this.isSpaced) {\n output.add(' ');\n }\n this.operands[1].genCSS(context, output);\n }\n});\n\nexport default Operation;\n","import Node from './node';\nimport Paren from './paren';\nimport Comment from './comment';\nimport Dimension from './dimension';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\nconst Expression = function(value, noSpacing) {\n this.value = value;\n this.noSpacing = noSpacing;\n if (!value) {\n throw new Error('Expression requires an array parameter');\n }\n};\n\nExpression.prototype = Object.assign(new Node(), {\n type: 'Expression',\n\n accept(visitor) {\n this.value = visitor.visitArray(this.value);\n },\n\n eval(context) {\n let returnValue;\n const mathOn = context.isMathOn();\n const inParenthesis = this.parens;\n\n let doubleParen = false;\n if (inParenthesis) {\n context.inParenthesis();\n }\n if (this.value.length > 1) {\n returnValue = new Expression(this.value.map(function (e) {\n if (!e.eval) {\n return e;\n }\n return e.eval(context);\n }), this.noSpacing);\n } else if (this.value.length === 1) {\n if (this.value[0].parens && !this.value[0].parensInOp && !context.inCalc) {\n doubleParen = true;\n }\n returnValue = this.value[0].eval(context);\n } else {\n returnValue = this;\n }\n if (inParenthesis) {\n context.outOfParenthesis();\n }\n if (this.parens && this.parensInOp && !mathOn && !doubleParen \n && (!(returnValue instanceof Dimension))) {\n returnValue = new Paren(returnValue);\n }\n return returnValue;\n },\n\n genCSS(context, output) {\n for (let i = 0; i < this.value.length; i++) {\n this.value[i].genCSS(context, output);\n if (!this.noSpacing && i + 1 < this.value.length) {\n output.add(' ');\n }\n }\n },\n\n throwAwayComments() {\n this.value = this.value.filter(function(v) {\n return !(v instanceof Comment);\n });\n }\n});\n\nexport default Expression;\n","import Expression from '../tree/expression';\n\nclass functionCaller {\n constructor(name, context, index, currentFileInfo) {\n this.name = name.toLowerCase();\n this.index = index;\n this.context = context;\n this.currentFileInfo = currentFileInfo;\n\n this.func = context.frames[0].functionRegistry.get(this.name);\n }\n\n isValid() {\n return Boolean(this.func);\n }\n\n call(args) {\n if (!(Array.isArray(args))) {\n args = [args];\n }\n const evalArgs = this.func.evalArgs;\n if (evalArgs !== false) {\n args = args.map(a => a.eval(this.context));\n }\n const commentFilter = item => !(item.type === 'Comment');\n\n // This code is terrible and should be replaced as per this issue...\n // https://github.com/less/less.js/issues/2477\n args = args\n .filter(commentFilter)\n .map(item => {\n if (item.type === 'Expression') {\n const subNodes = item.value.filter(commentFilter);\n if (subNodes.length === 1) {\n return subNodes[0];\n } else {\n return new Expression(subNodes);\n }\n }\n return item;\n });\n\n if (evalArgs === false) {\n return this.func(this.context, ...args);\n }\n\n return this.func(...args);\n }\n}\n\nexport default functionCaller;\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import Node from './node';\nimport Anonymous from './anonymous';\nimport FunctionCaller from '../functions/function-caller';\n\n//\n// A function call node.\n//\nconst Call = function(name, args, index, currentFileInfo) {\n this.name = name;\n this.args = args;\n this.calc = name === 'calc';\n this._index = index;\n this._fileInfo = currentFileInfo;\n}\n\nCall.prototype = Object.assign(new Node(), {\n type: 'Call',\n\n accept(visitor) {\n if (this.args) {\n this.args = visitor.visitArray(this.args);\n }\n },\n\n //\n // When evaluating a function call,\n // we either find the function in the functionRegistry,\n // in which case we call it, passing the evaluated arguments,\n // if this returns null or we cannot find the function, we\n // simply print it out as it appeared originally [2].\n //\n // The reason why we evaluate the arguments, is in the case where\n // we try to pass a variable to a function, like: `saturate(@color)`.\n // The function should receive the value, not the variable.\n //\n eval(context) {\n /**\n * Turn off math for calc(), and switch back on for evaluating nested functions\n */\n const currentMathContext = context.mathOn;\n context.mathOn = !this.calc;\n if (this.calc || context.inCalc) {\n context.enterCalc();\n }\n\n const exitCalc = () => {\n if (this.calc || context.inCalc) {\n context.exitCalc();\n }\n context.mathOn = currentMathContext;\n };\n\n let result;\n const funcCaller = new FunctionCaller(this.name, context, this.getIndex(), this.fileInfo());\n\n if (funcCaller.isValid()) {\n try {\n result = funcCaller.call(this.args);\n exitCalc();\n } catch (e) {\n if (e.hasOwnProperty('line') && e.hasOwnProperty('column')) {\n throw e;\n }\n throw { \n type: e.type || 'Runtime',\n message: `Error evaluating function \\`${this.name}\\`${e.message ? `: ${e.message}` : ''}`,\n index: this.getIndex(), \n filename: this.fileInfo().filename,\n line: e.lineNumber,\n column: e.columnNumber\n };\n }\n }\n\n if (result !== null && result !== undefined) {\n // Results that that are not nodes are cast as Anonymous nodes\n // Falsy values or booleans are returned as empty nodes\n if (!(result instanceof Node)) {\n if (!result || result === true) {\n result = new Anonymous(null); \n }\n else {\n result = new Anonymous(result.toString()); \n }\n \n }\n result._index = this._index;\n result._fileInfo = this._fileInfo;\n return result;\n }\n\n const args = this.args.map(a => a.eval(context));\n exitCalc();\n\n return new Call(this.name, args, this.getIndex(), this.fileInfo());\n },\n\n genCSS(context, output) {\n output.add(`${this.name}(`, this.fileInfo(), this.getIndex());\n\n for (let i = 0; i < this.args.length; i++) {\n this.args[i].genCSS(context, output);\n if (i + 1 < this.args.length) {\n output.add(', ');\n }\n }\n\n output.add(')');\n }\n});\n\nexport default Call;\n","import Node from './node';\nimport Call from './call';\n\nconst Variable = function(name, index, currentFileInfo) {\n this.name = name;\n this._index = index;\n this._fileInfo = currentFileInfo;\n};\n\nVariable.prototype = Object.assign(new Node(), {\n type: 'Variable',\n\n eval(context) {\n let variable, name = this.name;\n\n if (name.indexOf('@@') === 0) {\n name = `@${new Variable(name.slice(1), this.getIndex(), this.fileInfo()).eval(context).value}`;\n }\n\n if (this.evaluating) {\n throw { type: 'Name',\n message: `Recursive variable definition for ${name}`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n variable = this.find(context.frames, function (frame) {\n const v = frame.variable(name);\n if (v) {\n if (v.important) {\n const importantScope = context.importantScope[context.importantScope.length - 1];\n importantScope.important = v.important;\n }\n // If in calc, wrap vars in a function call to cascade evaluate args first\n if (context.inCalc) {\n return (new Call('_SELF', [v.value])).eval(context);\n }\n else {\n return v.value.eval(context);\n }\n }\n });\n if (variable) {\n this.evaluating = false;\n return variable;\n } else {\n throw { type: 'Name',\n message: `variable ${name} is undefined`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n },\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n});\n\nexport default Variable;\n","import Node from './node';\nimport Declaration from './declaration';\n\nconst Property = function(name, index, currentFileInfo) {\n this.name = name;\n this._index = index;\n this._fileInfo = currentFileInfo;\n};\n\nProperty.prototype = Object.assign(new Node(), {\n type: 'Property',\n\n eval(context) {\n let property;\n const name = this.name;\n // TODO: shorten this reference\n const mergeRules = context.pluginManager.less.visitors.ToCSSVisitor.prototype._mergeRules;\n\n if (this.evaluating) {\n throw { type: 'Name',\n message: `Recursive property reference for ${name}`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n property = this.find(context.frames, function (frame) {\n let v;\n const vArr = frame.property(name);\n if (vArr) {\n for (let i = 0; i < vArr.length; i++) {\n v = vArr[i];\n\n vArr[i] = new Declaration(v.name,\n v.value,\n v.important,\n v.merge,\n v.index,\n v.currentFileInfo,\n v.inline,\n v.variable\n );\n }\n mergeRules(vArr);\n\n v = vArr[vArr.length - 1];\n if (v.important) {\n const importantScope = context.importantScope[context.importantScope.length - 1];\n importantScope.important = v.important;\n }\n v = v.value.eval(context);\n return v;\n }\n });\n if (property) {\n this.evaluating = false;\n return property;\n } else {\n throw { type: 'Name',\n message: `Property '${name}' is undefined`,\n filename: this.currentFileInfo.filename,\n index: this.index };\n }\n },\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n});\n\nexport default Property;\n","import Node from './node';\n\nconst Attribute = function(key, op, value) {\n this.key = key;\n this.op = op;\n this.value = value;\n}\n\nAttribute.prototype = Object.assign(new Node(), {\n type: 'Attribute',\n\n eval(context) {\n return new Attribute(this.key.eval ? this.key.eval(context) : this.key,\n this.op, (this.value && this.value.eval) ? this.value.eval(context) : this.value);\n },\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n },\n\n toCSS(context) {\n let value = this.key.toCSS ? this.key.toCSS(context) : this.key;\n\n if (this.op) {\n value += this.op;\n value += (this.value.toCSS ? this.value.toCSS(context) : this.value);\n }\n\n return `[${value}]`;\n }\n});\n\nexport default Attribute;\n","import Node from './node';\nimport Variable from './variable';\nimport Property from './property';\n\n\nconst Quoted = function(str, content, escaped, index, currentFileInfo) {\n this.escaped = (escaped == null) ? true : escaped;\n this.value = content || '';\n this.quote = str.charAt(0);\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.variableRegex = /@\\{([\\w-]+)\\}/g;\n this.propRegex = /\\$\\{([\\w-]+)\\}/g;\n this.allowRoot = escaped;\n};\n\nQuoted.prototype = Object.assign(new Node(), {\n type: 'Quoted',\n\n genCSS(context, output) {\n if (!this.escaped) {\n output.add(this.quote, this.fileInfo(), this.getIndex());\n }\n output.add(this.value);\n if (!this.escaped) {\n output.add(this.quote);\n }\n },\n\n containsVariables() {\n return this.value.match(this.variableRegex);\n },\n\n eval(context) {\n const that = this;\n let value = this.value;\n const variableReplacement = function (_, name) {\n const v = new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v.value : v.toCSS();\n };\n const propertyReplacement = function (_, name) {\n const v = new Property(`$${name}`, that.getIndex(), that.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v.value : v.toCSS();\n };\n function iterativeReplace(value, regexp, replacementFnc) {\n let evaluatedValue = value;\n do {\n value = evaluatedValue.toString();\n evaluatedValue = value.replace(regexp, replacementFnc);\n } while (value !== evaluatedValue);\n return evaluatedValue;\n }\n value = iterativeReplace(value, this.variableRegex, variableReplacement);\n value = iterativeReplace(value, this.propRegex, propertyReplacement);\n return new Quoted(this.quote + value + this.quote, value, this.escaped, this.getIndex(), this.fileInfo());\n },\n\n compare(other) {\n // when comparing quoted strings allow the quote to differ\n if (other.type === 'Quoted' && !this.escaped && !other.escaped) {\n return Node.numericCompare(this.value, other.value);\n } else {\n return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n }\n }\n});\n\nexport default Quoted;\n","import Node from './node';\n\nfunction escapePath(path) {\n return path.replace(/[\\(\\)'\"\\s]/g, function(match) { return `\\\\${match}`; });\n}\n\nconst URL = function(val, index, currentFileInfo, isEvald) {\n this.value = val;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.isEvald = isEvald;\n};\n\nURL.prototype = Object.assign(new Node(), {\n type: 'Url',\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n },\n\n genCSS(context, output) {\n output.add('url(');\n this.value.genCSS(context, output);\n output.add(')');\n },\n\n eval(context) {\n const val = this.value.eval(context);\n let rootpath;\n\n if (!this.isEvald) {\n // Add the rootpath if the URL requires a rewrite\n rootpath = this.fileInfo() && this.fileInfo().rootpath;\n if (typeof rootpath === 'string' &&\n typeof val.value === 'string' &&\n context.pathRequiresRewrite(val.value)) {\n if (!val.quote) {\n rootpath = escapePath(rootpath);\n }\n val.value = context.rewritePath(val.value, rootpath);\n } else {\n val.value = context.normalizePath(val.value);\n }\n\n // Add url args if enabled\n if (context.urlArgs) {\n if (!val.value.match(/^\\s*data:/)) {\n const delimiter = val.value.indexOf('?') === -1 ? '?' : '&';\n const urlArgs = delimiter + context.urlArgs;\n if (val.value.indexOf('#') !== -1) {\n val.value = val.value.replace('#', `${urlArgs}#`);\n } else {\n val.value += urlArgs;\n }\n }\n }\n }\n\n return new URL(val, this.getIndex(), this.fileInfo(), true);\n }\n});\n\nexport default URL;\n","import Ruleset from './ruleset';\nimport Value from './value';\nimport Selector from './selector';\nimport Anonymous from './anonymous';\nimport Expression from './expression';\nimport AtRule from './atrule';\nimport * as utils from '../utils';\n\nconst Media = function(value, features, index, currentFileInfo, visibilityInfo) {\n this._index = index;\n this._fileInfo = currentFileInfo;\n\n const selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors();\n\n this.features = new Value(features);\n this.rules = [new Ruleset(selectors, value)];\n this.rules[0].allowImports = true;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n this.setParent(selectors, this);\n this.setParent(this.features, this);\n this.setParent(this.rules, this);\n};\n\nMedia.prototype = Object.assign(new AtRule(), {\n type: 'Media',\n\n isRulesetLike() {\n return true;\n },\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this.features);\n }\n if (this.rules) {\n this.rules = visitor.visitArray(this.rules);\n }\n },\n\n genCSS(context, output) {\n output.add('@media ', this._fileInfo, this._index);\n this.features.genCSS(context, output);\n this.outputRuleset(context, output, this.rules);\n },\n\n eval(context) {\n if (!context.mediaBlocks) {\n context.mediaBlocks = [];\n context.mediaPath = [];\n }\n\n const media = new Media(null, [], this._index, this._fileInfo, this.visibilityInfo());\n if (this.debugInfo) {\n this.rules[0].debugInfo = this.debugInfo;\n media.debugInfo = this.debugInfo;\n }\n \n media.features = this.features.eval(context);\n\n context.mediaPath.push(media);\n context.mediaBlocks.push(media);\n\n this.rules[0].functionRegistry = context.frames[0].functionRegistry.inherit();\n context.frames.unshift(this.rules[0]);\n media.rules = [this.rules[0].eval(context)];\n context.frames.shift();\n\n context.mediaPath.pop();\n\n return context.mediaPath.length === 0 ? media.evalTop(context) :\n media.evalNested(context);\n },\n\n evalTop(context) {\n let result = this;\n\n // Render all dependent Media blocks.\n if (context.mediaBlocks.length > 1) {\n const selectors = (new Selector([], null, null, this.getIndex(), this.fileInfo())).createEmptySelectors();\n result = new Ruleset(selectors, context.mediaBlocks);\n result.multiMedia = true;\n result.copyVisibilityInfo(this.visibilityInfo());\n this.setParent(result, this);\n }\n\n delete context.mediaBlocks;\n delete context.mediaPath;\n\n return result;\n },\n\n evalNested(context) {\n let i;\n let value;\n const path = context.mediaPath.concat([this]);\n\n // Extract the media-query conditions separated with `,` (OR).\n for (i = 0; i < path.length; i++) {\n value = path[i].features instanceof Value ?\n path[i].features.value : path[i].features;\n path[i] = Array.isArray(value) ? value : [value];\n }\n\n // Trace all permutations to generate the resulting media-query.\n //\n // (a, b and c) with nested (d, e) ->\n // a and d\n // a and e\n // b and c and d\n // b and c and e\n this.features = new Value(this.permute(path).map(path => {\n path = path.map(fragment => fragment.toCSS ? fragment : new Anonymous(fragment));\n\n for (i = path.length - 1; i > 0; i--) {\n path.splice(i, 0, new Anonymous('and'));\n }\n\n return new Expression(path);\n }));\n this.setParent(this.features, this);\n\n // Fake a tree-node that doesn't output anything.\n return new Ruleset([], []);\n },\n\n permute(arr) {\n if (arr.length === 0) {\n return [];\n } else if (arr.length === 1) {\n return arr[0];\n } else {\n const result = [];\n const rest = this.permute(arr.slice(1));\n for (let i = 0; i < rest.length; i++) {\n for (let j = 0; j < arr[0].length; j++) {\n result.push([arr[0][j]].concat(rest[i]));\n }\n }\n return result;\n }\n },\n\n bubbleSelectors(selectors) {\n if (!selectors) {\n return;\n }\n this.rules = [new Ruleset(utils.copyArray(selectors), [this.rules[0]])];\n this.setParent(this.rules, this);\n }\n});\n\nexport default Media;\n","import Node from './node';\nimport Media from './media';\nimport URL from './url';\nimport Quoted from './quoted';\nimport Ruleset from './ruleset';\nimport Anonymous from './anonymous';\nimport * as utils from '../utils';\nimport LessError from '../less-error';\n\n//\n// CSS @import node\n//\n// The general strategy here is that we don't want to wait\n// for the parsing to be completed, before we start importing\n// the file. That's because in the context of a browser,\n// most of the time will be spent waiting for the server to respond.\n//\n// On creation, we push the import path to our import queue, though\n// `import,push`, we also pass it a callback, which it'll call once\n// the file has been fetched, and parsed.\n//\nconst Import = function(path, features, options, index, currentFileInfo, visibilityInfo) {\n this.options = options;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.path = path;\n this.features = features;\n this.allowRoot = true;\n\n if (this.options.less !== undefined || this.options.inline) {\n this.css = !this.options.less || this.options.inline;\n } else {\n const pathValue = this.getPath();\n if (pathValue && /[#\\.\\&\\?]css([\\?;].*)?$/.test(pathValue)) {\n this.css = true;\n }\n }\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.features, this);\n this.setParent(this.path, this);\n};\n\nImport.prototype = Object.assign(new Node(), {\n type: 'Import',\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this.features);\n }\n this.path = visitor.visit(this.path);\n if (!this.options.isPlugin && !this.options.inline && this.root) {\n this.root = visitor.visit(this.root);\n }\n },\n\n genCSS(context, output) {\n if (this.css && this.path._fileInfo.reference === undefined) {\n output.add('@import ', this._fileInfo, this._index);\n this.path.genCSS(context, output);\n if (this.features) {\n output.add(' ');\n this.features.genCSS(context, output);\n }\n output.add(';');\n }\n },\n\n getPath() {\n return (this.path instanceof URL) ?\n this.path.value.value : this.path.value;\n },\n\n isVariableImport() {\n let path = this.path;\n if (path instanceof URL) {\n path = path.value;\n }\n if (path instanceof Quoted) {\n return path.containsVariables();\n }\n\n return true;\n },\n\n evalForImport(context) {\n let path = this.path;\n\n if (path instanceof URL) {\n path = path.value;\n }\n\n return new Import(path.eval(context), this.features, this.options, this._index, this._fileInfo, this.visibilityInfo());\n },\n\n evalPath(context) {\n const path = this.path.eval(context);\n const fileInfo = this._fileInfo;\n\n if (!(path instanceof URL)) {\n // Add the rootpath if the URL requires a rewrite\n const pathValue = path.value;\n if (fileInfo &&\n pathValue &&\n context.pathRequiresRewrite(pathValue)) {\n path.value = context.rewritePath(pathValue, fileInfo.rootpath);\n } else {\n path.value = context.normalizePath(path.value);\n }\n }\n\n return path;\n },\n\n eval(context) {\n const result = this.doEval(context);\n if (this.options.reference || this.blocksVisibility()) {\n if (result.length || result.length === 0) {\n result.forEach(function (node) {\n node.addVisibilityBlock();\n }\n );\n } else {\n result.addVisibilityBlock();\n }\n }\n return result;\n },\n\n doEval(context) {\n let ruleset;\n let registry;\n const features = this.features && this.features.eval(context);\n\n if (this.options.isPlugin) {\n if (this.root && this.root.eval) {\n try {\n this.root.eval(context);\n }\n catch (e) {\n e.message = 'Plugin error during evaluation';\n throw new LessError(e, this.root.imports, this.root.filename);\n }\n }\n registry = context.frames[0] && context.frames[0].functionRegistry;\n if ( registry && this.root && this.root.functions ) {\n registry.addMultiple( this.root.functions );\n }\n\n return [];\n }\n\n if (this.skip) {\n if (typeof this.skip === 'function') {\n this.skip = this.skip();\n }\n if (this.skip) {\n return [];\n }\n }\n if (this.options.inline) {\n const contents = new Anonymous(this.root, 0,\n {\n filename: this.importedFilename,\n reference: this.path._fileInfo && this.path._fileInfo.reference\n }, true, true);\n\n return this.features ? new Media([contents], this.features.value) : [contents];\n } else if (this.css) {\n const newImport = new Import(this.evalPath(context), features, this.options, this._index);\n if (!newImport.css && this.error) {\n throw this.error;\n }\n return newImport;\n } else if (this.root) {\n ruleset = new Ruleset(null, utils.copyArray(this.root.rules));\n ruleset.evalImports(context);\n\n return this.features ? new Media(ruleset.rules, this.features.value) : ruleset.rules;\n } else {\n return [];\n }\n }\n});\n\nexport default Import;\n","import Node from './node';\nimport Variable from './variable';\n\nconst JsEvalNode = function() {};\n\nJsEvalNode.prototype = Object.assign(new Node(), {\n evaluateJavaScript(expression, context) {\n let result;\n const that = this;\n const evalContext = {};\n\n if (!context.javascriptEnabled) {\n throw { message: 'Inline JavaScript is not enabled. Is it set in your options?',\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n expression = expression.replace(/@\\{([\\w-]+)\\}/g, function (_, name) {\n return that.jsify(new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context));\n });\n\n try {\n expression = new Function(`return (${expression})`);\n } catch (e) {\n throw { message: `JavaScript evaluation error: ${e.message} from \\`${expression}\\`` ,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n const variables = context.frames[0].variables();\n for (const k in variables) {\n if (variables.hasOwnProperty(k)) {\n /* jshint loopfunc:true */\n evalContext[k.slice(1)] = {\n value: variables[k].value,\n toJS: function () {\n return this.value.eval(context).toCSS();\n }\n };\n }\n }\n\n try {\n result = expression.call(evalContext);\n } catch (e) {\n throw { message: `JavaScript evaluation error: '${e.name}: ${e.message.replace(/[\"]/g, '\\'')}'` ,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n return result;\n },\n\n jsify(obj) {\n if (Array.isArray(obj.value) && (obj.value.length > 1)) {\n return `[${obj.value.map(function (v) { return v.toCSS(); }).join(', ')}]`;\n } else {\n return obj.toCSS();\n }\n }\n});\n\nexport default JsEvalNode;\n","import JsEvalNode from './js-eval-node';\nimport Dimension from './dimension';\nimport Quoted from './quoted';\nimport Anonymous from './anonymous';\n\nconst JavaScript = function(string, escaped, index, currentFileInfo) {\n this.escaped = escaped;\n this.expression = string;\n this._index = index;\n this._fileInfo = currentFileInfo;\n}\n\nJavaScript.prototype = Object.assign(new JsEvalNode(), {\n type: 'JavaScript',\n\n eval(context) {\n const result = this.evaluateJavaScript(this.expression, context);\n const type = typeof result;\n\n if (type === 'number' && !isNaN(result)) {\n return new Dimension(result);\n } else if (type === 'string') {\n return new Quoted(`\"${result}\"`, result, this.escaped, this._index);\n } else if (Array.isArray(result)) {\n return new Anonymous(result.join(', '));\n } else {\n return new Anonymous(result);\n }\n }\n});\n\nexport default JavaScript;\n","import Node from './node';\n\nconst Assignment = function(key, val) {\n this.key = key;\n this.value = val;\n}\n\nAssignment.prototype = Object.assign(new Node(), {\n type: 'Assignment',\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n },\n\n eval(context) {\n if (this.value.eval) {\n return new Assignment(this.key, this.value.eval(context));\n }\n return this;\n },\n\n genCSS(context, output) {\n output.add(`${this.key}=`);\n if (this.value.genCSS) {\n this.value.genCSS(context, output);\n } else {\n output.add(this.value);\n }\n }\n});\n\nexport default Assignment;\n","import Node from './node';\n\nconst Condition = function(op, l, r, i, negate) {\n this.op = op.trim();\n this.lvalue = l;\n this.rvalue = r;\n this._index = i;\n this.negate = negate;\n};\n\nCondition.prototype = Object.assign(new Node(), {\n type: 'Condition',\n\n accept(visitor) {\n this.lvalue = visitor.visit(this.lvalue);\n this.rvalue = visitor.visit(this.rvalue);\n },\n\n eval(context) {\n const result = (function (op, a, b) {\n switch (op) {\n case 'and': return a && b;\n case 'or': return a || b;\n default:\n switch (Node.compare(a, b)) {\n case -1:\n return op === '<' || op === '=<' || op === '<=';\n case 0:\n return op === '=' || op === '>=' || op === '=<' || op === '<=';\n case 1:\n return op === '>' || op === '>=';\n default:\n return false;\n }\n }\n })(this.op, this.lvalue.eval(context), this.rvalue.eval(context));\n\n return this.negate ? !result : result;\n }\n});\n\nexport default Condition;\n","import Node from './node';\n\nconst UnicodeDescriptor = function(value) {\n this.value = value;\n}\n\nUnicodeDescriptor.prototype = Object.assign(new Node(), {\n type: 'UnicodeDescriptor'\n})\n\nexport default UnicodeDescriptor;\n","import Node from './node';\nimport Operation from './operation';\nimport Dimension from './dimension';\n\nconst Negative = function(node) {\n this.value = node;\n};\n\nNegative.prototype = Object.assign(new Node(), {\n type: 'Negative',\n\n genCSS(context, output) {\n output.add('-');\n this.value.genCSS(context, output);\n },\n\n eval(context) {\n if (context.isMathOn()) {\n return (new Operation('*', [new Dimension(-1), this.value])).eval(context);\n }\n return new Negative(this.value.eval(context));\n }\n});\n\nexport default Negative;\n","import Node from './node';\nimport Selector from './selector';\n\nconst Extend = function(selector, option, index, currentFileInfo, visibilityInfo) {\n this.selector = selector;\n this.option = option;\n this.object_id = Extend.next_id++;\n this.parent_ids = [this.object_id];\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n\n switch (option) {\n case 'all':\n this.allowBefore = true;\n this.allowAfter = true;\n break;\n default:\n this.allowBefore = false;\n this.allowAfter = false;\n break;\n }\n this.setParent(this.selector, this);\n};\n\nExtend.prototype = Object.assign(new Node(), {\n type: 'Extend',\n\n accept(visitor) {\n this.selector = visitor.visit(this.selector);\n },\n\n eval(context) {\n return new Extend(this.selector.eval(context), this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n },\n\n clone(context) {\n return new Extend(this.selector, this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n },\n\n // it concatenates (joins) all selectors in selector array\n findSelfSelectors(selectors) {\n let selfElements = [], i, selectorElements;\n\n for (i = 0; i < selectors.length; i++) {\n selectorElements = selectors[i].elements;\n // duplicate the logic in genCSS function inside the selector node.\n // future TODO - move both logics into the selector joiner visitor\n if (i > 0 && selectorElements.length && selectorElements[0].combinator.value === '') {\n selectorElements[0].combinator.value = ' ';\n }\n selfElements = selfElements.concat(selectors[i].elements);\n }\n\n this.selfSelectors = [new Selector(selfElements)];\n this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo());\n }\n});\n\nExtend.next_id = 0;\nexport default Extend;\n","import Node from './node';\nimport Variable from './variable';\nimport Ruleset from './ruleset';\nimport DetachedRuleset from './detached-ruleset';\nimport LessError from '../less-error';\n\nconst VariableCall = function(variable, index, currentFileInfo) {\n this.variable = variable;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.allowRoot = true;\n};\n\nVariableCall.prototype = Object.assign(new Node(), {\n type: 'VariableCall',\n\n eval(context) {\n let rules;\n let detachedRuleset = new Variable(this.variable, this.getIndex(), this.fileInfo()).eval(context);\n const error = new LessError({message: `Could not evaluate variable call ${this.variable}`});\n\n if (!detachedRuleset.ruleset) {\n if (detachedRuleset.rules) {\n rules = detachedRuleset;\n }\n else if (Array.isArray(detachedRuleset)) {\n rules = new Ruleset('', detachedRuleset);\n }\n else if (Array.isArray(detachedRuleset.value)) {\n rules = new Ruleset('', detachedRuleset.value);\n }\n else {\n throw error;\n }\n detachedRuleset = new DetachedRuleset(rules);\n }\n\n if (detachedRuleset.ruleset) {\n return detachedRuleset.callEval(context);\n }\n throw error;\n }\n});\n\nexport default VariableCall;\n","import Node from './node';\nimport Variable from './variable';\nimport Ruleset from './ruleset';\nimport Selector from './selector';\n\nconst NamespaceValue = function(ruleCall, lookups, index, fileInfo) {\n this.value = ruleCall;\n this.lookups = lookups;\n this._index = index;\n this._fileInfo = fileInfo;\n};\n\nNamespaceValue.prototype = Object.assign(new Node(), {\n type: 'NamespaceValue',\n\n eval(context) {\n let i, j, name, rules = this.value.eval(context);\n \n for (i = 0; i < this.lookups.length; i++) {\n name = this.lookups[i];\n\n /**\n * Eval'd DRs return rulesets.\n * Eval'd mixins return rules, so let's make a ruleset if we need it.\n * We need to do this because of late parsing of values\n */\n if (Array.isArray(rules)) {\n rules = new Ruleset([new Selector()], rules);\n }\n\n if (name === '') {\n rules = rules.lastDeclaration();\n }\n else if (name.charAt(0) === '@') {\n if (name.charAt(1) === '@') {\n name = `@${new Variable(name.substr(1)).eval(context).value}`;\n }\n if (rules.variables) {\n rules = rules.variable(name);\n }\n \n if (!rules) {\n throw { type: 'Name',\n message: `variable ${name} not found`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n }\n else {\n if (name.substring(0, 2) === '$@') {\n name = `$${new Variable(name.substr(1)).eval(context).value}`;\n }\n else {\n name = name.charAt(0) === '$' ? name : `$${name}`;\n }\n if (rules.properties) {\n rules = rules.property(name);\n }\n \n if (!rules) {\n throw { type: 'Name',\n message: `property \"${name.substr(1)}\" not found`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n // Properties are an array of values, since a ruleset can have multiple props.\n // We pick the last one (the \"cascaded\" value)\n rules = rules[rules.length - 1];\n }\n\n if (rules.value) {\n rules = rules.eval(context).value;\n }\n if (rules.ruleset) {\n rules = rules.ruleset.eval(context);\n }\n }\n return rules;\n }\n});\n\nexport default NamespaceValue;\n","import Selector from './selector';\nimport Element from './element';\nimport Ruleset from './ruleset';\nimport Declaration from './declaration';\nimport DetachedRuleset from './detached-ruleset';\nimport Expression from './expression';\nimport contexts from '../contexts';\nimport * as utils from '../utils';\n\nconst Definition = function(name, params, rules, condition, variadic, frames, visibilityInfo) {\n this.name = name || 'anonymous mixin';\n this.selectors = [new Selector([new Element(null, name, false, this._index, this._fileInfo)])];\n this.params = params;\n this.condition = condition;\n this.variadic = variadic;\n this.arity = params.length;\n this.rules = rules;\n this._lookups = {};\n const optionalParameters = [];\n this.required = params.reduce(function (count, p) {\n if (!p.name || (p.name && !p.value)) {\n return count + 1;\n }\n else {\n optionalParameters.push(p.name);\n return count;\n }\n }, 0);\n this.optionalParameters = optionalParameters;\n this.frames = frames;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n}\n\nDefinition.prototype = Object.assign(new Ruleset(), {\n type: 'MixinDefinition',\n evalFirst: true,\n\n accept(visitor) {\n if (this.params && this.params.length) {\n this.params = visitor.visitArray(this.params);\n }\n this.rules = visitor.visitArray(this.rules);\n if (this.condition) {\n this.condition = visitor.visit(this.condition);\n }\n },\n\n evalParams(context, mixinEnv, args, evaldArguments) {\n /* jshint boss:true */\n const frame = new Ruleset(null, null);\n\n let varargs;\n let arg;\n const params = utils.copyArray(this.params);\n let i;\n let j;\n let val;\n let name;\n let isNamedFound;\n let argIndex;\n let argsLength = 0;\n\n if (mixinEnv.frames && mixinEnv.frames[0] && mixinEnv.frames[0].functionRegistry) {\n frame.functionRegistry = mixinEnv.frames[0].functionRegistry.inherit();\n }\n mixinEnv = new contexts.Eval(mixinEnv, [frame].concat(mixinEnv.frames));\n\n if (args) {\n args = utils.copyArray(args);\n argsLength = args.length;\n\n for (i = 0; i < argsLength; i++) {\n arg = args[i];\n if (name = (arg && arg.name)) {\n isNamedFound = false;\n for (j = 0; j < params.length; j++) {\n if (!evaldArguments[j] && name === params[j].name) {\n evaldArguments[j] = arg.value.eval(context);\n frame.prependRule(new Declaration(name, arg.value.eval(context)));\n isNamedFound = true;\n break;\n }\n }\n if (isNamedFound) {\n args.splice(i, 1);\n i--;\n continue;\n } else {\n throw { type: 'Runtime', message: `Named argument for ${this.name} ${args[i].name} not found` };\n }\n }\n }\n }\n argIndex = 0;\n for (i = 0; i < params.length; i++) {\n if (evaldArguments[i]) { continue; }\n\n arg = args && args[argIndex];\n\n if (name = params[i].name) {\n if (params[i].variadic) {\n varargs = [];\n for (j = argIndex; j < argsLength; j++) {\n varargs.push(args[j].value.eval(context));\n }\n frame.prependRule(new Declaration(name, new Expression(varargs).eval(context)));\n } else {\n val = arg && arg.value;\n if (val) {\n // This was a mixin call, pass in a detached ruleset of it's eval'd rules\n if (Array.isArray(val)) {\n val = new DetachedRuleset(new Ruleset('', val));\n }\n else {\n val = val.eval(context);\n }\n } else if (params[i].value) {\n val = params[i].value.eval(mixinEnv);\n frame.resetCache();\n } else {\n throw { type: 'Runtime', message: `wrong number of arguments for ${this.name} (${argsLength} for ${this.arity})` };\n }\n\n frame.prependRule(new Declaration(name, val));\n evaldArguments[i] = val;\n }\n }\n\n if (params[i].variadic && args) {\n for (j = argIndex; j < argsLength; j++) {\n evaldArguments[j] = args[j].value.eval(context);\n }\n }\n argIndex++;\n }\n\n return frame;\n },\n\n makeImportant() {\n const rules = !this.rules ? this.rules : this.rules.map(function (r) {\n if (r.makeImportant) {\n return r.makeImportant(true);\n } else {\n return r;\n }\n });\n const result = new Definition(this.name, this.params, rules, this.condition, this.variadic, this.frames);\n return result;\n },\n\n eval(context) {\n return new Definition(this.name, this.params, this.rules, this.condition, this.variadic, this.frames || utils.copyArray(context.frames));\n },\n\n evalCall(context, args, important) {\n const _arguments = [];\n const mixinFrames = this.frames ? this.frames.concat(context.frames) : context.frames;\n const frame = this.evalParams(context, new contexts.Eval(context, mixinFrames), args, _arguments);\n let rules;\n let ruleset;\n\n frame.prependRule(new Declaration('@arguments', new Expression(_arguments).eval(context)));\n\n rules = utils.copyArray(this.rules);\n\n ruleset = new Ruleset(null, rules);\n ruleset.originalRuleset = this;\n ruleset = ruleset.eval(new contexts.Eval(context, [this, frame].concat(mixinFrames)));\n if (important) {\n ruleset = ruleset.makeImportant();\n }\n return ruleset;\n },\n\n matchCondition(args, context) {\n if (this.condition && !this.condition.eval(\n new contexts.Eval(context,\n [this.evalParams(context, /* the parameter variables */\n new contexts.Eval(context, this.frames ? this.frames.concat(context.frames) : context.frames), args, [])]\n .concat(this.frames || []) // the parent namespace/mixin frames\n .concat(context.frames)))) { // the current environment frames\n return false;\n }\n return true;\n },\n\n matchArgs(args, context) {\n const allArgsCnt = (args && args.length) || 0;\n let len;\n const optionalParameters = this.optionalParameters;\n const requiredArgsCnt = !args ? 0 : args.reduce(function (count, p) {\n if (optionalParameters.indexOf(p.name) < 0) {\n return count + 1;\n } else {\n return count;\n }\n }, 0);\n\n if (!this.variadic) {\n if (requiredArgsCnt < this.required) {\n return false;\n }\n if (allArgsCnt > this.params.length) {\n return false;\n }\n } else {\n if (requiredArgsCnt < (this.required - 1)) {\n return false;\n }\n }\n\n // check patterns\n len = Math.min(requiredArgsCnt, this.arity);\n\n for (let i = 0; i < len; i++) {\n if (!this.params[i].name && !this.params[i].variadic) {\n if (args[i].value.eval(context).toCSS() != this.params[i].value.eval(context).toCSS()) {\n return false;\n }\n }\n }\n return true;\n }\n});\n\nexport default Definition;\n","import Node from './node';\nimport Selector from './selector';\nimport MixinDefinition from './mixin-definition';\nimport defaultFunc from '../functions/default';\n\nconst MixinCall = function(elements, args, index, currentFileInfo, important) {\n this.selector = new Selector(elements);\n this.arguments = args || [];\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.important = important;\n this.allowRoot = true;\n this.setParent(this.selector, this);\n};\n\nMixinCall.prototype = Object.assign(new Node(), {\n type: 'MixinCall',\n\n accept(visitor) {\n if (this.selector) {\n this.selector = visitor.visit(this.selector);\n }\n if (this.arguments.length) {\n this.arguments = visitor.visitArray(this.arguments);\n }\n },\n\n eval(context) {\n let mixins;\n let mixin;\n let mixinPath;\n const args = [];\n let arg;\n let argValue;\n const rules = [];\n let match = false;\n let i;\n let m;\n let f;\n let isRecursive;\n let isOneFound;\n const candidates = [];\n let candidate;\n const conditionResult = [];\n let defaultResult;\n const defFalseEitherCase = -1;\n const defNone = 0;\n const defTrue = 1;\n const defFalse = 2;\n let count;\n let originalRuleset;\n let noArgumentsFilter;\n\n this.selector = this.selector.eval(context);\n\n function calcDefGroup(mixin, mixinPath) {\n let f, p, namespace;\n\n for (f = 0; f < 2; f++) {\n conditionResult[f] = true;\n defaultFunc.value(f);\n for (p = 0; p < mixinPath.length && conditionResult[f]; p++) {\n namespace = mixinPath[p];\n if (namespace.matchCondition) {\n conditionResult[f] = conditionResult[f] && namespace.matchCondition(null, context);\n }\n }\n if (mixin.matchCondition) {\n conditionResult[f] = conditionResult[f] && mixin.matchCondition(args, context);\n }\n }\n if (conditionResult[0] || conditionResult[1]) {\n if (conditionResult[0] != conditionResult[1]) {\n return conditionResult[1] ?\n defTrue : defFalse;\n }\n\n return defNone;\n }\n return defFalseEitherCase;\n }\n\n for (i = 0; i < this.arguments.length; i++) {\n arg = this.arguments[i];\n argValue = arg.value.eval(context);\n if (arg.expand && Array.isArray(argValue.value)) {\n argValue = argValue.value;\n for (m = 0; m < argValue.length; m++) {\n args.push({value: argValue[m]});\n }\n } else {\n args.push({name: arg.name, value: argValue});\n }\n }\n\n noArgumentsFilter = function(rule) {return rule.matchArgs(null, context);};\n\n for (i = 0; i < context.frames.length; i++) {\n if ((mixins = context.frames[i].find(this.selector, null, noArgumentsFilter)).length > 0) {\n isOneFound = true;\n\n // To make `default()` function independent of definition order we have two \"subpasses\" here.\n // At first we evaluate each guard *twice* (with `default() == true` and `default() == false`),\n // and build candidate list with corresponding flags. Then, when we know all possible matches,\n // we make a final decision.\n\n for (m = 0; m < mixins.length; m++) {\n mixin = mixins[m].rule;\n mixinPath = mixins[m].path;\n isRecursive = false;\n for (f = 0; f < context.frames.length; f++) {\n if ((!(mixin instanceof MixinDefinition)) && mixin === (context.frames[f].originalRuleset || context.frames[f])) {\n isRecursive = true;\n break;\n }\n }\n if (isRecursive) {\n continue;\n }\n\n if (mixin.matchArgs(args, context)) {\n candidate = {mixin, group: calcDefGroup(mixin, mixinPath)};\n\n if (candidate.group !== defFalseEitherCase) {\n candidates.push(candidate);\n }\n\n match = true;\n }\n }\n\n defaultFunc.reset();\n\n count = [0, 0, 0];\n for (m = 0; m < candidates.length; m++) {\n count[candidates[m].group]++;\n }\n\n if (count[defNone] > 0) {\n defaultResult = defFalse;\n } else {\n defaultResult = defTrue;\n if ((count[defTrue] + count[defFalse]) > 1) {\n throw { type: 'Runtime',\n message: `Ambiguous use of \\`default()\\` found when matching for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n }\n\n for (m = 0; m < candidates.length; m++) {\n candidate = candidates[m].group;\n if ((candidate === defNone) || (candidate === defaultResult)) {\n try {\n mixin = candidates[m].mixin;\n if (!(mixin instanceof MixinDefinition)) {\n originalRuleset = mixin.originalRuleset || mixin;\n mixin = new MixinDefinition('', [], mixin.rules, null, false, null, originalRuleset.visibilityInfo());\n mixin.originalRuleset = originalRuleset;\n }\n const newRules = mixin.evalCall(context, args, this.important).rules;\n this._setVisibilityToReplacement(newRules);\n Array.prototype.push.apply(rules, newRules);\n } catch (e) {\n throw { message: e.message, index: this.getIndex(), filename: this.fileInfo().filename, stack: e.stack };\n }\n }\n }\n\n if (match) {\n return rules;\n }\n }\n }\n if (isOneFound) {\n throw { type: 'Runtime',\n message: `No matching definition was found for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n } else {\n throw { type: 'Name',\n message: `${this.selector.toCSS().trim()} is undefined`,\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n },\n\n _setVisibilityToReplacement(replacement) {\n let i, rule;\n if (this.blocksVisibility()) {\n for (i = 0; i < replacement.length; i++) {\n rule = replacement[i];\n rule.addVisibilityBlock();\n }\n }\n },\n\n format(args) {\n return `${this.selector.toCSS().trim()}(${args ? args.map(function (a) {\n let argValue = '';\n if (a.name) {\n argValue += `${a.name}:`;\n }\n if (a.value.toCSS) {\n argValue += a.value.toCSS();\n } else {\n argValue += '???';\n }\n return argValue;\n }).join(', ') : ''})`;\n }\n});\n\nexport default MixinCall;\n","import Node from './node';\nimport Color from './color';\nimport AtRule from './atrule';\nimport DetachedRuleset from './detached-ruleset';\nimport Operation from './operation';\nimport Dimension from './dimension';\nimport Unit from './unit';\nimport Keyword from './keyword';\nimport Variable from './variable';\nimport Property from './property';\nimport Ruleset from './ruleset';\nimport Element from './element';\nimport Attribute from './attribute';\nimport Combinator from './combinator';\nimport Selector from './selector';\nimport Quoted from './quoted';\nimport Expression from './expression';\nimport Declaration from './declaration';\nimport Call from './call';\nimport URL from './url';\nimport Import from './import';\nimport Comment from './comment';\nimport Anonymous from './anonymous';\nimport Value from './value';\nimport JavaScript from './javascript';\nimport Assignment from './assignment';\nimport Condition from './condition';\nimport Paren from './paren';\nimport Media from './media';\nimport UnicodeDescriptor from './unicode-descriptor';\nimport Negative from './negative';\nimport Extend from './extend';\nimport VariableCall from './variable-call';\nimport NamespaceValue from './namespace-value';\n\n// mixins\nimport MixinCall from './mixin-call';\nimport MixinDefinition from './mixin-definition';\n\nexport default {\n Node, Color, AtRule, DetachedRuleset, Operation,\n Dimension, Unit, Keyword, Variable, Property,\n Ruleset, Element, Attribute, Combinator, Selector,\n Quoted, Expression, Declaration, Call, URL, Import,\n Comment, Anonymous, Value, JavaScript, Assignment,\n Condition, Paren, Media, UnicodeDescriptor, Negative,\n Extend, VariableCall, NamespaceValue,\n mixin: {\n Call: MixinCall,\n Definition: MixinDefinition\n }\n};","class AbstractFileManager {\n getPath(filename) {\n let j = filename.lastIndexOf('?');\n if (j > 0) {\n filename = filename.slice(0, j);\n }\n j = filename.lastIndexOf('/');\n if (j < 0) {\n j = filename.lastIndexOf('\\\\');\n }\n if (j < 0) {\n return '';\n }\n return filename.slice(0, j + 1);\n }\n\n tryAppendExtension(path, ext) {\n return /(\\.[a-z]*$)|([\\?;].*)$/.test(path) ? path : path + ext;\n }\n\n tryAppendLessExtension(path) {\n return this.tryAppendExtension(path, '.less');\n }\n\n supportsSync() {\n return false;\n }\n\n alwaysMakePathsAbsolute() {\n return false;\n }\n\n isPathAbsolute(filename) {\n return (/^(?:[a-z-]+:|\\/|\\\\|#)/i).test(filename);\n }\n\n // TODO: pull out / replace?\n join(basePath, laterPath) {\n if (!basePath) {\n return laterPath;\n }\n return basePath + laterPath;\n }\n\n pathDiff(url, baseUrl) {\n // diff between two paths to create a relative path\n\n const urlParts = this.extractUrlParts(url);\n\n const baseUrlParts = this.extractUrlParts(baseUrl);\n let i;\n let max;\n let urlDirectories;\n let baseUrlDirectories;\n let diff = '';\n if (urlParts.hostPart !== baseUrlParts.hostPart) {\n return '';\n }\n max = Math.max(baseUrlParts.directories.length, urlParts.directories.length);\n for (i = 0; i < max; i++) {\n if (baseUrlParts.directories[i] !== urlParts.directories[i]) { break; }\n }\n baseUrlDirectories = baseUrlParts.directories.slice(i);\n urlDirectories = urlParts.directories.slice(i);\n for (i = 0; i < baseUrlDirectories.length - 1; i++) {\n diff += '../';\n }\n for (i = 0; i < urlDirectories.length - 1; i++) {\n diff += `${urlDirectories[i]}/`;\n }\n return diff;\n }\n\n // helper function, not part of API\n extractUrlParts(url, baseUrl) {\n // urlParts[1] = protocol://hostname/ OR /\n // urlParts[2] = / if path relative to host base\n // urlParts[3] = directories\n // urlParts[4] = filename\n // urlParts[5] = parameters\n\n const urlPartsRegex = /^((?:[a-z-]+:)?\\/{2}(?:[^\\/\\?#]*\\/)|([\\/\\\\]))?((?:[^\\/\\\\\\?#]*[\\/\\\\])*)([^\\/\\\\\\?#]*)([#\\?].*)?$/i;\n\n const urlParts = url.match(urlPartsRegex);\n const returner = {};\n let rawDirectories = [];\n const directories = [];\n let i;\n let baseUrlParts;\n\n if (!urlParts) {\n throw new Error(`Could not parse sheet href - '${url}'`);\n }\n\n // Stylesheets in IE don't always return the full path\n if (baseUrl && (!urlParts[1] || urlParts[2])) {\n baseUrlParts = baseUrl.match(urlPartsRegex);\n if (!baseUrlParts) {\n throw new Error(`Could not parse page url - '${baseUrl}'`);\n }\n urlParts[1] = urlParts[1] || baseUrlParts[1] || '';\n if (!urlParts[2]) {\n urlParts[3] = baseUrlParts[3] + urlParts[3];\n }\n }\n\n if (urlParts[3]) {\n rawDirectories = urlParts[3].replace(/\\\\/g, '/').split('/');\n\n // collapse '..' and skip '.'\n for (i = 0; i < rawDirectories.length; i++) {\n\n if (rawDirectories[i] === '..') {\n directories.pop();\n }\n else if (rawDirectories[i] !== '.') {\n directories.push(rawDirectories[i]);\n }\n \n }\n }\n\n returner.hostPart = urlParts[1];\n returner.directories = directories;\n returner.rawPath = (urlParts[1] || '') + rawDirectories.join('/');\n returner.path = (urlParts[1] || '') + directories.join('/');\n returner.filename = urlParts[4];\n returner.fileUrl = returner.path + (urlParts[4] || '');\n returner.url = returner.fileUrl + (urlParts[5] || '');\n return returner;\n }\n}\n\nexport default AbstractFileManager;\n","import functionRegistry from '../functions/function-registry';\nimport LessError from '../less-error';\n\nclass AbstractPluginLoader {\n constructor() {\n // Implemented by Node.js plugin loader\n this.require = function() {\n return null;\n }\n }\n\n evalPlugin(contents, context, imports, pluginOptions, fileInfo) {\n\n let loader, registry, pluginObj, localModule, pluginManager, filename, result;\n\n pluginManager = context.pluginManager;\n\n if (fileInfo) {\n if (typeof fileInfo === 'string') {\n filename = fileInfo;\n }\n else {\n filename = fileInfo.filename;\n }\n }\n const shortname = (new this.less.FileManager()).extractUrlParts(filename).filename;\n\n if (filename) {\n pluginObj = pluginManager.get(filename);\n\n if (pluginObj) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imports, filename);\n }\n return pluginObj;\n }\n }\n localModule = {\n exports: {},\n pluginManager,\n fileInfo\n };\n registry = functionRegistry.create();\n\n const registerPlugin = function(obj) {\n pluginObj = obj;\n };\n\n try {\n loader = new Function('module', 'require', 'registerPlugin', 'functions', 'tree', 'less', 'fileInfo', contents);\n loader(localModule, this.require(filename), registerPlugin, registry, this.less.tree, this.less, fileInfo);\n }\n catch (e) {\n return new LessError(e, imports, filename);\n }\n\n if (!pluginObj) {\n pluginObj = localModule.exports;\n }\n pluginObj = this.validatePlugin(pluginObj, filename, shortname);\n\n if (pluginObj instanceof LessError) {\n return pluginObj;\n }\n\n if (pluginObj) {\n pluginObj.imports = imports;\n pluginObj.filename = filename;\n\n // For < 3.x (or unspecified minVersion) - setOptions() before install()\n if (!pluginObj.minVersion || this.compareVersion('3.0.0', pluginObj.minVersion) < 0) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n\n if (result) {\n return result;\n }\n }\n\n // Run on first load\n pluginManager.addPlugin(pluginObj, fileInfo.filename, registry);\n pluginObj.functions = registry.getLocalFunctions();\n\n // Need to call setOptions again because the pluginObj might have functions\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n\n // Run every @plugin call\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imports, filename);\n }\n\n }\n else {\n return new LessError({ message: 'Not a valid plugin' }, imports, filename);\n }\n\n return pluginObj;\n\n }\n\n trySetOptions(plugin, filename, name, options) {\n if (options && !plugin.setOptions) {\n return new LessError({\n message: `Options have been provided but the plugin ${name} does not support any options.`\n });\n }\n try {\n plugin.setOptions && plugin.setOptions(options);\n }\n catch (e) {\n return new LessError(e);\n }\n }\n\n validatePlugin(plugin, filename, name) {\n if (plugin) {\n // support plugins being a function\n // so that the plugin can be more usable programmatically\n if (typeof plugin === 'function') {\n plugin = new plugin();\n }\n\n if (plugin.minVersion) {\n if (this.compareVersion(plugin.minVersion, this.less.version) < 0) {\n return new LessError({\n message: `Plugin ${name} requires version ${this.versionToString(plugin.minVersion)}`\n });\n }\n }\n return plugin;\n }\n return null;\n }\n\n compareVersion(aVersion, bVersion) {\n if (typeof aVersion === 'string') {\n aVersion = aVersion.match(/^(\\d+)\\.?(\\d+)?\\.?(\\d+)?/);\n aVersion.shift();\n }\n for (let i = 0; i < aVersion.length; i++) {\n if (aVersion[i] !== bVersion[i]) {\n return parseInt(aVersion[i]) > parseInt(bVersion[i]) ? -1 : 1;\n }\n }\n return 0;\n }\n\n versionToString(version) {\n let versionString = '';\n for (let i = 0; i < version.length; i++) {\n versionString += (versionString ? '.' : '') + version[i];\n }\n return versionString;\n }\n\n printUsage(plugins) {\n for (let i = 0; i < plugins.length; i++) {\n const plugin = plugins[i];\n if (plugin.printUsage) {\n plugin.printUsage();\n }\n }\n }\n}\n\nexport default AbstractPluginLoader;\n\n","import tree from '../tree';\n\nconst _visitArgs = { visitDeeper: true };\nlet _hasIndexed = false;\n\nfunction _noop(node) {\n return node;\n}\n\nfunction indexNodeTypes(parent, ticker) {\n // add .typeIndex to tree node types for lookup table\n let key, child;\n for (key in parent) { \n /* eslint guard-for-in: 0 */\n child = parent[key];\n switch (typeof child) {\n case 'function':\n // ignore bound functions directly on tree which do not have a prototype\n // or aren't nodes\n if (child.prototype && child.prototype.type) {\n child.prototype.typeIndex = ticker++;\n }\n break;\n case 'object':\n ticker = indexNodeTypes(child, ticker);\n break;\n \n }\n }\n return ticker;\n}\n\nclass Visitor {\n constructor(implementation) {\n this._implementation = implementation;\n this._visitInCache = {};\n this._visitOutCache = {};\n\n if (!_hasIndexed) {\n indexNodeTypes(tree, 1);\n _hasIndexed = true;\n }\n }\n\n visit(node) {\n if (!node) {\n return node;\n }\n\n const nodeTypeIndex = node.typeIndex;\n if (!nodeTypeIndex) {\n // MixinCall args aren't a node type?\n if (node.value && node.value.typeIndex) {\n this.visit(node.value);\n }\n return node;\n }\n\n const impl = this._implementation;\n let func = this._visitInCache[nodeTypeIndex];\n let funcOut = this._visitOutCache[nodeTypeIndex];\n const visitArgs = _visitArgs;\n let fnName;\n\n visitArgs.visitDeeper = true;\n\n if (!func) {\n fnName = `visit${node.type}`;\n func = impl[fnName] || _noop;\n funcOut = impl[`${fnName}Out`] || _noop;\n this._visitInCache[nodeTypeIndex] = func;\n this._visitOutCache[nodeTypeIndex] = funcOut;\n }\n\n if (func !== _noop) {\n const newNode = func.call(impl, node, visitArgs);\n if (node && impl.isReplacing) {\n node = newNode;\n }\n }\n\n if (visitArgs.visitDeeper && node) {\n if (node.length) {\n for (let i = 0, cnt = node.length; i < cnt; i++) {\n if (node[i].accept) {\n node[i].accept(this);\n }\n }\n } else if (node.accept) {\n node.accept(this);\n }\n }\n\n if (funcOut != _noop) {\n funcOut.call(impl, node);\n }\n\n return node;\n }\n\n visitArray(nodes, nonReplacing) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.length;\n let i;\n\n // Non-replacing\n if (nonReplacing || !this._implementation.isReplacing) {\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n // Replacing\n const out = [];\n for (i = 0; i < cnt; i++) {\n const evald = this.visit(nodes[i]);\n if (evald === undefined) { continue; }\n if (!evald.splice) {\n out.push(evald);\n } else if (evald.length) {\n this.flatten(evald, out);\n }\n }\n return out;\n }\n\n flatten(arr, out) {\n if (!out) {\n out = [];\n }\n\n let cnt, i, item, nestedCnt, j, nestedItem;\n\n for (i = 0, cnt = arr.length; i < cnt; i++) {\n item = arr[i];\n if (item === undefined) {\n continue;\n }\n if (!item.splice) {\n out.push(item);\n continue;\n }\n\n for (j = 0, nestedCnt = item.length; j < nestedCnt; j++) {\n nestedItem = item[j];\n if (nestedItem === undefined) {\n continue;\n }\n if (!nestedItem.splice) {\n out.push(nestedItem);\n } else if (nestedItem.length) {\n this.flatten(nestedItem, out);\n }\n }\n }\n\n return out;\n }\n}\n\nexport default Visitor;\n","class ImportSequencer {\n constructor(onSequencerEmpty) {\n this.imports = [];\n this.variableImports = [];\n this._onSequencerEmpty = onSequencerEmpty;\n this._currentDepth = 0;\n }\n\n addImport(callback) {\n const importSequencer = this,\n importItem = {\n callback,\n args: null,\n isReady: false\n };\n this.imports.push(importItem);\n return function() {\n importItem.args = Array.prototype.slice.call(arguments, 0);\n importItem.isReady = true;\n importSequencer.tryRun();\n };\n }\n\n addVariableImport(callback) {\n this.variableImports.push(callback);\n }\n\n tryRun() {\n this._currentDepth++;\n try {\n while (true) {\n while (this.imports.length > 0) {\n const importItem = this.imports[0];\n if (!importItem.isReady) {\n return;\n }\n this.imports = this.imports.slice(1);\n importItem.callback.apply(null, importItem.args);\n }\n if (this.variableImports.length === 0) {\n break;\n }\n const variableImport = this.variableImports[0];\n this.variableImports = this.variableImports.slice(1);\n variableImport();\n }\n } finally {\n this._currentDepth--;\n }\n if (this._currentDepth === 0 && this._onSequencerEmpty) {\n this._onSequencerEmpty();\n }\n }\n}\n\nexport default ImportSequencer;\n","import contexts from '../contexts';\nimport Visitor from './visitor';\nimport ImportSequencer from './import-sequencer';\nimport * as utils from '../utils';\n\nconst ImportVisitor = function(importer, finish) {\n\n this._visitor = new Visitor(this);\n this._importer = importer;\n this._finish = finish;\n this.context = new contexts.Eval();\n this.importCount = 0;\n this.onceFileDetectionMap = {};\n this.recursionDetector = {};\n this._sequencer = new ImportSequencer(this._onSequencerEmpty.bind(this));\n};\n\nImportVisitor.prototype = {\n isReplacing: false,\n run: function (root) {\n try {\n // process the contents\n this._visitor.visit(root);\n }\n catch (e) {\n this.error = e;\n }\n\n this.isFinished = true;\n this._sequencer.tryRun();\n },\n _onSequencerEmpty: function() {\n if (!this.isFinished) {\n return;\n }\n this._finish(this.error);\n },\n visitImport: function (importNode, visitArgs) {\n const inlineCSS = importNode.options.inline;\n\n if (!importNode.css || inlineCSS) {\n\n const context = new contexts.Eval(this.context, utils.copyArray(this.context.frames));\n const importParent = context.frames[0];\n\n this.importCount++;\n if (importNode.isVariableImport()) {\n this._sequencer.addVariableImport(this.processImportNode.bind(this, importNode, context, importParent));\n } else {\n this.processImportNode(importNode, context, importParent);\n }\n }\n visitArgs.visitDeeper = false;\n },\n processImportNode: function(importNode, context, importParent) {\n let evaldImportNode;\n const inlineCSS = importNode.options.inline;\n\n try {\n evaldImportNode = importNode.evalForImport(context);\n } catch (e) {\n if (!e.filename) { e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename; }\n // attempt to eval properly and treat as css\n importNode.css = true;\n // if that fails, this error will be thrown\n importNode.error = e;\n }\n\n if (evaldImportNode && (!evaldImportNode.css || inlineCSS)) {\n\n if (evaldImportNode.options.multiple) {\n context.importMultiple = true;\n }\n\n // try appending if we haven't determined if it is css or not\n const tryAppendLessExtension = evaldImportNode.css === undefined;\n\n for (let i = 0; i < importParent.rules.length; i++) {\n if (importParent.rules[i] === importNode) {\n importParent.rules[i] = evaldImportNode;\n break;\n }\n }\n\n const onImported = this.onImported.bind(this, evaldImportNode, context), sequencedOnImported = this._sequencer.addImport(onImported);\n\n this._importer.push(evaldImportNode.getPath(), tryAppendLessExtension, evaldImportNode.fileInfo(),\n evaldImportNode.options, sequencedOnImported);\n } else {\n this.importCount--;\n if (this.isFinished) {\n this._sequencer.tryRun();\n }\n }\n },\n onImported: function (importNode, context, e, root, importedAtRoot, fullPath) {\n if (e) {\n if (!e.filename) {\n e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename;\n }\n this.error = e;\n }\n\n const importVisitor = this,\n inlineCSS = importNode.options.inline,\n isPlugin = importNode.options.isPlugin,\n isOptional = importNode.options.optional,\n duplicateImport = importedAtRoot || fullPath in importVisitor.recursionDetector;\n\n if (!context.importMultiple) {\n if (duplicateImport) {\n importNode.skip = true;\n } else {\n importNode.skip = function() {\n if (fullPath in importVisitor.onceFileDetectionMap) {\n return true;\n }\n importVisitor.onceFileDetectionMap[fullPath] = true;\n return false;\n };\n }\n }\n\n if (!fullPath && isOptional) {\n importNode.skip = true;\n }\n\n if (root) {\n importNode.root = root;\n importNode.importedFilename = fullPath;\n\n if (!inlineCSS && !isPlugin && (context.importMultiple || !duplicateImport)) {\n importVisitor.recursionDetector[fullPath] = true;\n\n const oldContext = this.context;\n this.context = context;\n try {\n this._visitor.visit(root);\n } catch (e) {\n this.error = e;\n }\n this.context = oldContext;\n }\n }\n\n importVisitor.importCount--;\n\n if (importVisitor.isFinished) {\n importVisitor._sequencer.tryRun();\n }\n },\n visitDeclaration: function (declNode, visitArgs) {\n if (declNode.value.type === 'DetachedRuleset') {\n this.context.frames.unshift(declNode);\n } else {\n visitArgs.visitDeeper = false;\n }\n },\n visitDeclarationOut: function(declNode) {\n if (declNode.value.type === 'DetachedRuleset') {\n this.context.frames.shift();\n }\n },\n visitAtRule: function (atRuleNode, visitArgs) {\n this.context.frames.unshift(atRuleNode);\n },\n visitAtRuleOut: function (atRuleNode) {\n this.context.frames.shift();\n },\n visitMixinDefinition: function (mixinDefinitionNode, visitArgs) {\n this.context.frames.unshift(mixinDefinitionNode);\n },\n visitMixinDefinitionOut: function (mixinDefinitionNode) {\n this.context.frames.shift();\n },\n visitRuleset: function (rulesetNode, visitArgs) {\n this.context.frames.unshift(rulesetNode);\n },\n visitRulesetOut: function (rulesetNode) {\n this.context.frames.shift();\n },\n visitMedia: function (mediaNode, visitArgs) {\n this.context.frames.unshift(mediaNode.rules[0]);\n },\n visitMediaOut: function (mediaNode) {\n this.context.frames.shift();\n }\n};\nexport default ImportVisitor;\n","class SetTreeVisibilityVisitor {\n constructor(visible) {\n this.visible = visible;\n }\n\n run(root) {\n this.visit(root);\n }\n\n visitArray(nodes) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.length;\n let i;\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n visit(node) {\n if (!node) {\n return node;\n }\n if (node.constructor === Array) {\n return this.visitArray(node);\n }\n\n if (!node.blocksVisibility || node.blocksVisibility()) {\n return node;\n }\n if (this.visible) {\n node.ensureVisibility();\n } else {\n node.ensureInvisibility();\n }\n\n node.accept(this);\n return node;\n }\n}\n\nexport default SetTreeVisibilityVisitor;","import tree from '../tree';\nimport Visitor from './visitor';\nimport logger from '../logger';\nimport * as utils from '../utils';\n\n/* jshint loopfunc:true */\n\nclass ExtendFinderVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n this.contexts = [];\n this.allExtendsStack = [[]];\n }\n\n run(root) {\n root = this._visitor.visit(root);\n root.allExtends = this.allExtendsStack[0];\n return root;\n }\n\n visitDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n\n let i;\n let j;\n let extend;\n const allSelectorsExtendList = [];\n let extendList;\n\n // get &:extend(.a); rules which apply to all selectors in this ruleset\n const rules = rulesetNode.rules, ruleCnt = rules ? rules.length : 0;\n for (i = 0; i < ruleCnt; i++) {\n if (rulesetNode.rules[i] instanceof tree.Extend) {\n allSelectorsExtendList.push(rules[i]);\n rulesetNode.extendOnEveryPath = true;\n }\n }\n\n // now find every selector and apply the extends that apply to all extends\n // and the ones which apply to an individual extend\n const paths = rulesetNode.paths;\n for (i = 0; i < paths.length; i++) {\n const selectorPath = paths[i], selector = selectorPath[selectorPath.length - 1], selExtendList = selector.extendList;\n\n extendList = selExtendList ? utils.copyArray(selExtendList).concat(allSelectorsExtendList)\n : allSelectorsExtendList;\n\n if (extendList) {\n extendList = extendList.map(function(allSelectorsExtend) {\n return allSelectorsExtend.clone();\n });\n }\n\n for (j = 0; j < extendList.length; j++) {\n this.foundExtends = true;\n extend = extendList[j];\n extend.findSelfSelectors(selectorPath);\n extend.ruleset = rulesetNode;\n if (j === 0) { extend.firstExtendOnThisSelectorPath = true; }\n this.allExtendsStack[this.allExtendsStack.length - 1].push(extend);\n }\n }\n\n this.contexts.push(rulesetNode.selectors);\n }\n\n visitRulesetOut(rulesetNode) {\n if (!rulesetNode.root) {\n this.contexts.length = this.contexts.length - 1;\n }\n }\n\n visitMedia(mediaNode, visitArgs) {\n mediaNode.allExtends = [];\n this.allExtendsStack.push(mediaNode.allExtends);\n }\n\n visitMediaOut(mediaNode) {\n this.allExtendsStack.length = this.allExtendsStack.length - 1;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n atRuleNode.allExtends = [];\n this.allExtendsStack.push(atRuleNode.allExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n this.allExtendsStack.length = this.allExtendsStack.length - 1;\n }\n}\n\nclass ProcessExtendsVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n }\n\n run(root) {\n const extendFinder = new ExtendFinderVisitor();\n this.extendIndices = {};\n extendFinder.run(root);\n if (!extendFinder.foundExtends) { return root; }\n root.allExtends = root.allExtends.concat(this.doExtendChaining(root.allExtends, root.allExtends));\n this.allExtendsStack = [root.allExtends];\n const newRoot = this._visitor.visit(root);\n this.checkExtendsForNonMatched(root.allExtends);\n return newRoot;\n }\n\n checkExtendsForNonMatched(extendList) {\n const indices = this.extendIndices;\n extendList.filter(function(extend) {\n return !extend.hasFoundMatches && extend.parent_ids.length == 1;\n }).forEach(function(extend) {\n let selector = '_unknown_';\n try {\n selector = extend.selector.toCSS({});\n }\n catch (_) {}\n\n if (!indices[`${extend.index} ${selector}`]) {\n indices[`${extend.index} ${selector}`] = true;\n logger.warn(`extend '${selector}' has no matches`);\n }\n });\n }\n\n doExtendChaining(extendsList, extendsListTarget, iterationCount) {\n //\n // chaining is different from normal extension.. if we extend an extend then we are not just copying, altering\n // and pasting the selector we would do normally, but we are also adding an extend with the same target selector\n // this means this new extend can then go and alter other extends\n //\n // this method deals with all the chaining work - without it, extend is flat and doesn't work on other extend selectors\n // this is also the most expensive.. and a match on one selector can cause an extension of a selector we had already\n // processed if we look at each selector at a time, as is done in visitRuleset\n\n let extendIndex;\n\n let targetExtendIndex;\n let matches;\n const extendsToAdd = [];\n let newSelector;\n const extendVisitor = this;\n let selectorPath;\n let extend;\n let targetExtend;\n let newExtend;\n\n iterationCount = iterationCount || 0;\n\n // loop through comparing every extend with every target extend.\n // a target extend is the one on the ruleset we are looking at copy/edit/pasting in place\n // e.g. .a:extend(.b) {} and .b:extend(.c) {} then the first extend extends the second one\n // and the second is the target.\n // the separation into two lists allows us to process a subset of chains with a bigger set, as is the\n // case when processing media queries\n for (extendIndex = 0; extendIndex < extendsList.length; extendIndex++) {\n for (targetExtendIndex = 0; targetExtendIndex < extendsListTarget.length; targetExtendIndex++) {\n\n extend = extendsList[extendIndex];\n targetExtend = extendsListTarget[targetExtendIndex];\n\n // look for circular references\n if ( extend.parent_ids.indexOf( targetExtend.object_id ) >= 0 ) { continue; }\n\n // find a match in the target extends self selector (the bit before :extend)\n selectorPath = [targetExtend.selfSelectors[0]];\n matches = extendVisitor.findMatch(extend, selectorPath);\n\n if (matches.length) {\n extend.hasFoundMatches = true;\n\n // we found a match, so for each self selector..\n extend.selfSelectors.forEach(function(selfSelector) {\n const info = targetExtend.visibilityInfo();\n\n // process the extend as usual\n newSelector = extendVisitor.extendSelector(matches, selectorPath, selfSelector, extend.isVisible());\n\n // but now we create a new extend from it\n newExtend = new(tree.Extend)(targetExtend.selector, targetExtend.option, 0, targetExtend.fileInfo(), info);\n newExtend.selfSelectors = newSelector;\n\n // add the extend onto the list of extends for that selector\n newSelector[newSelector.length - 1].extendList = [newExtend];\n\n // record that we need to add it.\n extendsToAdd.push(newExtend);\n newExtend.ruleset = targetExtend.ruleset;\n\n // remember its parents for circular references\n newExtend.parent_ids = newExtend.parent_ids.concat(targetExtend.parent_ids, extend.parent_ids);\n\n // only process the selector once.. if we have :extend(.a,.b) then multiple\n // extends will look at the same selector path, so when extending\n // we know that any others will be duplicates in terms of what is added to the css\n if (targetExtend.firstExtendOnThisSelectorPath) {\n newExtend.firstExtendOnThisSelectorPath = true;\n targetExtend.ruleset.paths.push(newSelector);\n }\n });\n }\n }\n }\n\n if (extendsToAdd.length) {\n // try to detect circular references to stop a stack overflow.\n // may no longer be needed.\n this.extendChainCount++;\n if (iterationCount > 100) {\n let selectorOne = '{unable to calculate}';\n let selectorTwo = '{unable to calculate}';\n try {\n selectorOne = extendsToAdd[0].selfSelectors[0].toCSS();\n selectorTwo = extendsToAdd[0].selector.toCSS();\n }\n catch (e) {}\n throw { message: `extend circular reference detected. One of the circular extends is currently:${selectorOne}:extend(${selectorTwo})`};\n }\n\n // now process the new extends on the existing rules so that we can handle a extending b extending c extending\n // d extending e...\n return extendsToAdd.concat(extendVisitor.doExtendChaining(extendsToAdd, extendsListTarget, iterationCount + 1));\n } else {\n return extendsToAdd;\n }\n }\n\n visitDeclaration(ruleNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitSelector(selectorNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n let matches;\n let pathIndex;\n let extendIndex;\n const allExtends = this.allExtendsStack[this.allExtendsStack.length - 1];\n const selectorsToAdd = [];\n const extendVisitor = this;\n let selectorPath;\n\n // look at each selector path in the ruleset, find any extend matches and then copy, find and replace\n\n for (extendIndex = 0; extendIndex < allExtends.length; extendIndex++) {\n for (pathIndex = 0; pathIndex < rulesetNode.paths.length; pathIndex++) {\n selectorPath = rulesetNode.paths[pathIndex];\n\n // extending extends happens initially, before the main pass\n if (rulesetNode.extendOnEveryPath) { continue; }\n const extendList = selectorPath[selectorPath.length - 1].extendList;\n if (extendList && extendList.length) { continue; }\n\n matches = this.findMatch(allExtends[extendIndex], selectorPath);\n\n if (matches.length) {\n allExtends[extendIndex].hasFoundMatches = true;\n\n allExtends[extendIndex].selfSelectors.forEach(function(selfSelector) {\n let extendedSelectors;\n extendedSelectors = extendVisitor.extendSelector(matches, selectorPath, selfSelector, allExtends[extendIndex].isVisible());\n selectorsToAdd.push(extendedSelectors);\n });\n }\n }\n }\n rulesetNode.paths = rulesetNode.paths.concat(selectorsToAdd);\n }\n\n findMatch(extend, haystackSelectorPath) {\n //\n // look through the haystack selector path to try and find the needle - extend.selector\n // returns an array of selector matches that can then be replaced\n //\n let haystackSelectorIndex;\n\n let hackstackSelector;\n let hackstackElementIndex;\n let haystackElement;\n let targetCombinator;\n let i;\n const extendVisitor = this;\n const needleElements = extend.selector.elements;\n const potentialMatches = [];\n let potentialMatch;\n const matches = [];\n\n // loop through the haystack elements\n for (haystackSelectorIndex = 0; haystackSelectorIndex < haystackSelectorPath.length; haystackSelectorIndex++) {\n hackstackSelector = haystackSelectorPath[haystackSelectorIndex];\n\n for (hackstackElementIndex = 0; hackstackElementIndex < hackstackSelector.elements.length; hackstackElementIndex++) {\n\n haystackElement = hackstackSelector.elements[hackstackElementIndex];\n\n // if we allow elements before our match we can add a potential match every time. otherwise only at the first element.\n if (extend.allowBefore || (haystackSelectorIndex === 0 && hackstackElementIndex === 0)) {\n potentialMatches.push({pathIndex: haystackSelectorIndex, index: hackstackElementIndex, matched: 0,\n initialCombinator: haystackElement.combinator});\n }\n\n for (i = 0; i < potentialMatches.length; i++) {\n potentialMatch = potentialMatches[i];\n\n // selectors add \" \" onto the first element. When we use & it joins the selectors together, but if we don't\n // then each selector in haystackSelectorPath has a space before it added in the toCSS phase. so we need to\n // work out what the resulting combinator will be\n targetCombinator = haystackElement.combinator.value;\n if (targetCombinator === '' && hackstackElementIndex === 0) {\n targetCombinator = ' ';\n }\n\n // if we don't match, null our match to indicate failure\n if (!extendVisitor.isElementValuesEqual(needleElements[potentialMatch.matched].value, haystackElement.value) ||\n (potentialMatch.matched > 0 && needleElements[potentialMatch.matched].combinator.value !== targetCombinator)) {\n potentialMatch = null;\n } else {\n potentialMatch.matched++;\n }\n\n // if we are still valid and have finished, test whether we have elements after and whether these are allowed\n if (potentialMatch) {\n potentialMatch.finished = potentialMatch.matched === needleElements.length;\n if (potentialMatch.finished &&\n (!extend.allowAfter &&\n (hackstackElementIndex + 1 < hackstackSelector.elements.length || haystackSelectorIndex + 1 < haystackSelectorPath.length))) {\n potentialMatch = null;\n }\n }\n // if null we remove, if not, we are still valid, so either push as a valid match or continue\n if (potentialMatch) {\n if (potentialMatch.finished) {\n potentialMatch.length = needleElements.length;\n potentialMatch.endPathIndex = haystackSelectorIndex;\n potentialMatch.endPathElementIndex = hackstackElementIndex + 1; // index after end of match\n potentialMatches.length = 0; // we don't allow matches to overlap, so start matching again\n matches.push(potentialMatch);\n }\n } else {\n potentialMatches.splice(i, 1);\n i--;\n }\n }\n }\n }\n return matches;\n }\n\n isElementValuesEqual(elementValue1, elementValue2) {\n if (typeof elementValue1 === 'string' || typeof elementValue2 === 'string') {\n return elementValue1 === elementValue2;\n }\n if (elementValue1 instanceof tree.Attribute) {\n if (elementValue1.op !== elementValue2.op || elementValue1.key !== elementValue2.key) {\n return false;\n }\n if (!elementValue1.value || !elementValue2.value) {\n if (elementValue1.value || elementValue2.value) {\n return false;\n }\n return true;\n }\n elementValue1 = elementValue1.value.value || elementValue1.value;\n elementValue2 = elementValue2.value.value || elementValue2.value;\n return elementValue1 === elementValue2;\n }\n elementValue1 = elementValue1.value;\n elementValue2 = elementValue2.value;\n if (elementValue1 instanceof tree.Selector) {\n if (!(elementValue2 instanceof tree.Selector) || elementValue1.elements.length !== elementValue2.elements.length) {\n return false;\n }\n for (let i = 0; i < elementValue1.elements.length; i++) {\n if (elementValue1.elements[i].combinator.value !== elementValue2.elements[i].combinator.value) {\n if (i !== 0 || (elementValue1.elements[i].combinator.value || ' ') !== (elementValue2.elements[i].combinator.value || ' ')) {\n return false;\n }\n }\n if (!this.isElementValuesEqual(elementValue1.elements[i].value, elementValue2.elements[i].value)) {\n return false;\n }\n }\n return true;\n }\n return false;\n }\n\n extendSelector(matches, selectorPath, replacementSelector, isVisible) {\n\n // for a set of matches, replace each match with the replacement selector\n\n let currentSelectorPathIndex = 0, currentSelectorPathElementIndex = 0, path = [], matchIndex, selector, firstElement, match, newElements;\n\n for (matchIndex = 0; matchIndex < matches.length; matchIndex++) {\n match = matches[matchIndex];\n selector = selectorPath[match.pathIndex];\n firstElement = new tree.Element(\n match.initialCombinator,\n replacementSelector.elements[0].value,\n replacementSelector.elements[0].isVariable,\n replacementSelector.elements[0].getIndex(),\n replacementSelector.elements[0].fileInfo()\n );\n\n if (match.pathIndex > currentSelectorPathIndex && currentSelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n\n newElements = selector.elements\n .slice(currentSelectorPathElementIndex, match.index)\n .concat([firstElement])\n .concat(replacementSelector.elements.slice(1));\n\n if (currentSelectorPathIndex === match.pathIndex && matchIndex > 0) {\n path[path.length - 1].elements =\n path[path.length - 1].elements.concat(newElements);\n } else {\n path = path.concat(selectorPath.slice(currentSelectorPathIndex, match.pathIndex));\n\n path.push(new tree.Selector(\n newElements\n ));\n }\n currentSelectorPathIndex = match.endPathIndex;\n currentSelectorPathElementIndex = match.endPathElementIndex;\n if (currentSelectorPathElementIndex >= selectorPath[currentSelectorPathIndex].elements.length) {\n currentSelectorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n }\n\n if (currentSelectorPathIndex < selectorPath.length && currentSelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathIndex++;\n }\n\n path = path.concat(selectorPath.slice(currentSelectorPathIndex, selectorPath.length));\n path = path.map(function (currentValue) {\n // we can re-use elements here, because the visibility property matters only for selectors\n const derived = currentValue.createDerived(currentValue.elements);\n if (isVisible) {\n derived.ensureVisibility();\n } else {\n derived.ensureInvisibility();\n }\n return derived;\n });\n return path;\n }\n\n visitMedia(mediaNode, visitArgs) {\n let newAllExtends = mediaNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, mediaNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitMediaOut(mediaNode) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStack.length = lastIndex;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n let newAllExtends = atRuleNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, atRuleNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStack.length = lastIndex;\n }\n}\n\nexport default ProcessExtendsVisitor;\n","import Visitor from './visitor';\n\nclass JoinSelectorVisitor {\n constructor() {\n this.contexts = [[]];\n this._visitor = new Visitor(this);\n }\n\n run(root) {\n return this._visitor.visit(root);\n }\n\n visitDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n const paths = [];\n let selectors;\n\n this.contexts.push(paths);\n\n if (!rulesetNode.root) {\n selectors = rulesetNode.selectors;\n if (selectors) {\n selectors = selectors.filter(function(selector) { return selector.getIsOutput(); });\n rulesetNode.selectors = selectors.length ? selectors : (selectors = null);\n if (selectors) { rulesetNode.joinSelectors(paths, context, selectors); }\n }\n if (!selectors) { rulesetNode.rules = null; }\n rulesetNode.paths = paths;\n }\n }\n\n visitRulesetOut(rulesetNode) {\n this.contexts.length = this.contexts.length - 1;\n }\n\n visitMedia(mediaNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n mediaNode.rules[0].root = (context.length === 0 || context[0].multiMedia);\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n if (atRuleNode.rules && atRuleNode.rules.length) {\n atRuleNode.rules[0].root = (atRuleNode.isRooted || context.length === 0 || null);\n }\n }\n}\n\nexport default JoinSelectorVisitor;\n","import tree from '../tree';\nimport Visitor from './visitor';\n\nclass CSSVisitorUtils {\n constructor(context) {\n this._visitor = new Visitor(this);\n this._context = context;\n }\n\n containsSilentNonBlockedChild(bodyRules) {\n let rule;\n if (!bodyRules) {\n return false;\n }\n for (let r = 0; r < bodyRules.length; r++) {\n rule = bodyRules[r];\n if (rule.isSilent && rule.isSilent(this._context) && !rule.blocksVisibility()) {\n // the atrule contains something that was referenced (likely by extend)\n // therefore it needs to be shown in output too\n return true;\n }\n }\n return false;\n }\n\n keepOnlyVisibleChilds(owner) {\n if (owner && owner.rules) {\n owner.rules = owner.rules.filter(thing => thing.isVisible());\n }\n }\n\n isEmpty(owner) {\n return (owner && owner.rules) \n ? (owner.rules.length === 0) : true;\n }\n\n hasVisibleSelector(rulesetNode) {\n return (rulesetNode && rulesetNode.paths)\n ? (rulesetNode.paths.length > 0) : false;\n }\n\n resolveVisibility(node, originalRules) {\n if (!node.blocksVisibility()) {\n if (this.isEmpty(node) && !this.containsSilentNonBlockedChild(originalRules)) {\n return ;\n }\n\n return node;\n }\n\n const compiledRulesBody = node.rules[0];\n this.keepOnlyVisibleChilds(compiledRulesBody);\n\n if (this.isEmpty(compiledRulesBody)) {\n return ;\n }\n\n node.ensureVisibility();\n node.removeVisibilityBlock();\n\n return node;\n }\n\n isVisibleRuleset(rulesetNode) {\n if (rulesetNode.firstRoot) {\n return true;\n }\n\n if (this.isEmpty(rulesetNode)) {\n return false;\n }\n\n if (!rulesetNode.root && !this.hasVisibleSelector(rulesetNode)) {\n return false;\n }\n\n return true;\n }\n}\n\nconst ToCSSVisitor = function(context) {\n this._visitor = new Visitor(this);\n this._context = context;\n this.utils = new CSSVisitorUtils(context);\n};\n\nToCSSVisitor.prototype = {\n isReplacing: true,\n run: function (root) {\n return this._visitor.visit(root);\n },\n\n visitDeclaration: function (declNode, visitArgs) {\n if (declNode.blocksVisibility() || declNode.variable) {\n return;\n }\n return declNode;\n },\n\n visitMixinDefinition: function (mixinNode, visitArgs) {\n // mixin definitions do not get eval'd - this means they keep state\n // so we have to clear that state here so it isn't used if toCSS is called twice\n mixinNode.frames = [];\n },\n\n visitExtend: function (extendNode, visitArgs) {\n },\n\n visitComment: function (commentNode, visitArgs) {\n if (commentNode.blocksVisibility() || commentNode.isSilent(this._context)) {\n return;\n }\n return commentNode;\n },\n\n visitMedia: function(mediaNode, visitArgs) {\n const originalRules = mediaNode.rules[0].rules;\n mediaNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n\n return this.utils.resolveVisibility(mediaNode, originalRules);\n },\n\n visitImport: function (importNode, visitArgs) {\n if (importNode.blocksVisibility()) {\n return ;\n }\n return importNode;\n },\n\n visitAtRule: function(atRuleNode, visitArgs) {\n if (atRuleNode.rules && atRuleNode.rules.length) {\n return this.visitAtRuleWithBody(atRuleNode, visitArgs);\n } else {\n return this.visitAtRuleWithoutBody(atRuleNode, visitArgs);\n }\n },\n\n visitAnonymous: function(anonymousNode, visitArgs) {\n if (!anonymousNode.blocksVisibility()) {\n anonymousNode.accept(this._visitor);\n return anonymousNode;\n }\n },\n\n visitAtRuleWithBody: function(atRuleNode, visitArgs) {\n // if there is only one nested ruleset and that one has no path, then it is\n // just fake ruleset\n function hasFakeRuleset(atRuleNode) {\n const bodyRules = atRuleNode.rules;\n return bodyRules.length === 1 && (!bodyRules[0].paths || bodyRules[0].paths.length === 0);\n }\n function getBodyRules(atRuleNode) {\n const nodeRules = atRuleNode.rules;\n if (hasFakeRuleset(atRuleNode)) {\n return nodeRules[0].rules;\n }\n\n return nodeRules;\n }\n // it is still true that it is only one ruleset in array\n // this is last such moment\n // process childs\n const originalRules = getBodyRules(atRuleNode);\n atRuleNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n\n if (!this.utils.isEmpty(atRuleNode)) {\n this._mergeRules(atRuleNode.rules[0].rules);\n }\n\n return this.utils.resolveVisibility(atRuleNode, originalRules);\n },\n\n visitAtRuleWithoutBody: function(atRuleNode, visitArgs) {\n if (atRuleNode.blocksVisibility()) {\n return;\n }\n\n if (atRuleNode.name === '@charset') {\n // Only output the debug info together with subsequent @charset definitions\n // a comment (or @media statement) before the actual @charset atrule would\n // be considered illegal css as it has to be on the first line\n if (this.charset) {\n if (atRuleNode.debugInfo) {\n const comment = new tree.Comment(`/* ${atRuleNode.toCSS(this._context).replace(/\\n/g, '')} */\\n`);\n comment.debugInfo = atRuleNode.debugInfo;\n return this._visitor.visit(comment);\n }\n return;\n }\n this.charset = true;\n }\n\n return atRuleNode;\n },\n\n checkValidNodes: function(rules, isRoot) {\n if (!rules) {\n return;\n }\n\n for (let i = 0; i < rules.length; i++) {\n const ruleNode = rules[i];\n if (isRoot && ruleNode instanceof tree.Declaration && !ruleNode.variable) {\n throw { message: 'Properties must be inside selector blocks. They cannot be in the root',\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n if (ruleNode instanceof tree.Call) {\n throw { message: `Function '${ruleNode.name}' did not return a root node`,\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n if (ruleNode.type && !ruleNode.allowRoot) {\n throw { message: `${ruleNode.type} node returned by a function is not valid here`,\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n }\n },\n\n visitRuleset: function (rulesetNode, visitArgs) {\n // at this point rulesets are nested into each other\n let rule;\n\n const rulesets = [];\n\n this.checkValidNodes(rulesetNode.rules, rulesetNode.firstRoot);\n\n if (!rulesetNode.root) {\n // remove invisible paths\n this._compileRulesetPaths(rulesetNode);\n\n // remove rulesets from this ruleset body and compile them separately\n const nodeRules = rulesetNode.rules;\n\n let nodeRuleCnt = nodeRules ? nodeRules.length : 0;\n for (let i = 0; i < nodeRuleCnt; ) {\n rule = nodeRules[i];\n if (rule && rule.rules) {\n // visit because we are moving them out from being a child\n rulesets.push(this._visitor.visit(rule));\n nodeRules.splice(i, 1);\n nodeRuleCnt--;\n continue;\n }\n i++;\n }\n // accept the visitor to remove rules and refactor itself\n // then we can decide nogw whether we want it or not\n // compile body\n if (nodeRuleCnt > 0) {\n rulesetNode.accept(this._visitor);\n } else {\n rulesetNode.rules = null;\n }\n visitArgs.visitDeeper = false;\n } else { // if (! rulesetNode.root) {\n rulesetNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n }\n\n if (rulesetNode.rules) {\n this._mergeRules(rulesetNode.rules);\n this._removeDuplicateRules(rulesetNode.rules);\n }\n\n // now decide whether we keep the ruleset\n if (this.utils.isVisibleRuleset(rulesetNode)) {\n rulesetNode.ensureVisibility();\n rulesets.splice(0, 0, rulesetNode);\n }\n\n if (rulesets.length === 1) {\n return rulesets[0];\n }\n return rulesets;\n },\n\n _compileRulesetPaths: function(rulesetNode) {\n if (rulesetNode.paths) {\n rulesetNode.paths = rulesetNode.paths\n .filter(p => {\n let i;\n if (p[0].elements[0].combinator.value === ' ') {\n p[0].elements[0].combinator = new(tree.Combinator)('');\n }\n for (i = 0; i < p.length; i++) {\n if (p[i].isVisible() && p[i].getIsOutput()) {\n return true;\n }\n }\n return false;\n });\n }\n },\n\n _removeDuplicateRules: function(rules) {\n if (!rules) { return; }\n\n // remove duplicates\n const ruleCache = {};\n\n let ruleList;\n let rule;\n let i;\n\n for (i = rules.length - 1; i >= 0 ; i--) {\n rule = rules[i];\n if (rule instanceof tree.Declaration) {\n if (!ruleCache[rule.name]) {\n ruleCache[rule.name] = rule;\n } else {\n ruleList = ruleCache[rule.name];\n if (ruleList instanceof tree.Declaration) {\n ruleList = ruleCache[rule.name] = [ruleCache[rule.name].toCSS(this._context)];\n }\n const ruleCSS = rule.toCSS(this._context);\n if (ruleList.indexOf(ruleCSS) !== -1) {\n rules.splice(i, 1);\n } else {\n ruleList.push(ruleCSS);\n }\n }\n }\n }\n },\n\n _mergeRules: function(rules) {\n if (!rules) {\n return; \n }\n\n const groups = {};\n const groupsArr = [];\n\n for (let i = 0; i < rules.length; i++) {\n const rule = rules[i];\n if (rule.merge) {\n const key = rule.name;\n groups[key] ? rules.splice(i--, 1) : \n groupsArr.push(groups[key] = []);\n groups[key].push(rule);\n }\n }\n\n groupsArr.forEach(group => {\n if (group.length > 0) {\n const result = group[0];\n let space = [];\n const comma = [new tree.Expression(space)];\n group.forEach(rule => {\n if ((rule.merge === '+') && (space.length > 0)) {\n comma.push(new tree.Expression(space = []));\n }\n space.push(rule.value);\n result.important = result.important || rule.important;\n });\n result.value = new tree.Value(comma);\n }\n });\n }\n};\n\nexport default ToCSSVisitor;\n","import Visitor from './visitor';\nimport ImportVisitor from './import-visitor';\nimport MarkVisibleSelectorsVisitor from './set-tree-visibility-visitor';\nimport ExtendVisitor from './extend-visitor';\nimport JoinSelectorVisitor from './join-selector-visitor';\nimport ToCSSVisitor from './to-css-visitor';\n\nexport default {\n Visitor,\n ImportVisitor,\n MarkVisibleSelectorsVisitor,\n ExtendVisitor,\n JoinSelectorVisitor,\n ToCSSVisitor\n};\n","import chunker from './chunker';\n\nexport default () => {\n let // Less input string\n input;\n\n let // current chunk\n j;\n\n const // holds state for backtracking\n saveStack = [];\n\n let // furthest index the parser has gone to\n furthest;\n\n let // if this is furthest we got to, this is the probably cause\n furthestPossibleErrorMessage;\n\n let // chunkified input\n chunks;\n\n let // current chunk\n current;\n\n let // index of current chunk, in `input`\n currentPos;\n\n const parserInput = {};\n const CHARCODE_SPACE = 32;\n const CHARCODE_TAB = 9;\n const CHARCODE_LF = 10;\n const CHARCODE_CR = 13;\n const CHARCODE_PLUS = 43;\n const CHARCODE_COMMA = 44;\n const CHARCODE_FORWARD_SLASH = 47;\n const CHARCODE_9 = 57;\n\n function skipWhitespace(length) {\n const oldi = parserInput.i;\n const oldj = j;\n const curr = parserInput.i - currentPos;\n const endIndex = parserInput.i + current.length - curr;\n const mem = (parserInput.i += length);\n const inp = input;\n let c;\n let nextChar;\n let comment;\n\n for (; parserInput.i < endIndex; parserInput.i++) {\n c = inp.charCodeAt(parserInput.i);\n\n if (parserInput.autoCommentAbsorb && c === CHARCODE_FORWARD_SLASH) {\n nextChar = inp.charAt(parserInput.i + 1);\n if (nextChar === '/') {\n comment = {index: parserInput.i, isLineComment: true};\n let nextNewLine = inp.indexOf('\\n', parserInput.i + 2);\n if (nextNewLine < 0) {\n nextNewLine = endIndex;\n }\n parserInput.i = nextNewLine;\n comment.text = inp.substr(comment.index, parserInput.i - comment.index);\n parserInput.commentStore.push(comment);\n continue;\n } else if (nextChar === '*') {\n const nextStarSlash = inp.indexOf('*/', parserInput.i + 2);\n if (nextStarSlash >= 0) {\n comment = {\n index: parserInput.i,\n text: inp.substr(parserInput.i, nextStarSlash + 2 - parserInput.i),\n isLineComment: false\n };\n parserInput.i += comment.text.length - 1;\n parserInput.commentStore.push(comment);\n continue;\n }\n }\n break;\n }\n\n if ((c !== CHARCODE_SPACE) && (c !== CHARCODE_LF) && (c !== CHARCODE_TAB) && (c !== CHARCODE_CR)) {\n break;\n }\n }\n\n current = current.slice(length + parserInput.i - mem + curr);\n currentPos = parserInput.i;\n\n if (!current.length) {\n if (j < chunks.length - 1) {\n current = chunks[++j];\n skipWhitespace(0); // skip space at the beginning of a chunk\n return true; // things changed\n }\n parserInput.finished = true;\n }\n\n return oldi !== parserInput.i || oldj !== j;\n }\n\n parserInput.save = () => {\n currentPos = parserInput.i;\n saveStack.push( { current, i: parserInput.i, j });\n };\n parserInput.restore = possibleErrorMessage => {\n\n if (parserInput.i > furthest || (parserInput.i === furthest && possibleErrorMessage && !furthestPossibleErrorMessage)) {\n furthest = parserInput.i;\n furthestPossibleErrorMessage = possibleErrorMessage;\n }\n const state = saveStack.pop();\n current = state.current;\n currentPos = parserInput.i = state.i;\n j = state.j;\n };\n parserInput.forget = () => {\n saveStack.pop();\n };\n parserInput.isWhitespace = offset => {\n const pos = parserInput.i + (offset || 0);\n const code = input.charCodeAt(pos);\n return (code === CHARCODE_SPACE || code === CHARCODE_CR || code === CHARCODE_TAB || code === CHARCODE_LF);\n };\n\n // Specialization of $(tok)\n parserInput.$re = tok => {\n if (parserInput.i > currentPos) {\n current = current.slice(parserInput.i - currentPos);\n currentPos = parserInput.i;\n }\n\n const m = tok.exec(current);\n if (!m) {\n return null;\n }\n\n skipWhitespace(m[0].length);\n if (typeof m === 'string') {\n return m;\n }\n\n return m.length === 1 ? m[0] : m;\n };\n\n parserInput.$char = tok => {\n if (input.charAt(parserInput.i) !== tok) {\n return null;\n }\n skipWhitespace(1);\n return tok;\n };\n\n parserInput.$str = tok => {\n const tokLength = tok.length;\n\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tokLength; i++) {\n if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n return null;\n }\n }\n\n skipWhitespace(tokLength);\n return tok;\n };\n\n parserInput.$quoted = loc => {\n const pos = loc || parserInput.i;\n const startChar = input.charAt(pos);\n\n if (startChar !== '\\'' && startChar !== '\"') {\n return;\n }\n const length = input.length;\n const currentPosition = pos;\n\n for (let i = 1; i + currentPosition < length; i++) {\n const nextChar = input.charAt(i + currentPosition);\n switch (nextChar) {\n case '\\\\':\n i++;\n continue;\n case '\\r':\n case '\\n':\n break;\n case startChar:\n const str = input.substr(currentPosition, i + 1);\n if (!loc && loc !== 0) {\n skipWhitespace(i + 1);\n return str\n }\n return [startChar, str];\n default:\n }\n }\n return null;\n };\n\n /**\n * Permissive parsing. Ignores everything except matching {} [] () and quotes\n * until matching token (outside of blocks)\n */\n parserInput.$parseUntil = tok => {\n let quote = '';\n let returnVal = null;\n let inComment = false;\n let blockDepth = 0;\n const blockStack = [];\n const parseGroups = [];\n const length = input.length;\n const startPos = parserInput.i;\n let lastPos = parserInput.i;\n let i = parserInput.i;\n let loop = true;\n let testChar;\n\n if (typeof tok === 'string') {\n testChar = char => char === tok\n } else {\n testChar = char => tok.test(char)\n }\n\n do {\n let prevChar;\n let nextChar = input.charAt(i);\n if (blockDepth === 0 && testChar(nextChar)) {\n returnVal = input.substr(lastPos, i - lastPos);\n if (returnVal) {\n parseGroups.push(returnVal);\n }\n else {\n parseGroups.push(' ');\n }\n returnVal = parseGroups;\n skipWhitespace(i - startPos);\n loop = false\n } else {\n if (inComment) {\n if (nextChar === '*' && \n input.charAt(i + 1) === '/') {\n i++;\n blockDepth--;\n inComment = false;\n }\n i++;\n continue;\n }\n switch (nextChar) {\n case '\\\\':\n i++;\n nextChar = input.charAt(i);\n parseGroups.push(input.substr(lastPos, i - lastPos + 1));\n lastPos = i + 1;\n break;\n case '/':\n if (input.charAt(i + 1) === '*') {\n i++;\n inComment = true;\n blockDepth++;\n }\n break;\n case '\\'':\n case '\"':\n quote = parserInput.$quoted(i);\n if (quote) {\n parseGroups.push(input.substr(lastPos, i - lastPos), quote);\n i += quote[1].length - 1;\n lastPos = i + 1;\n }\n else {\n skipWhitespace(i - startPos);\n returnVal = nextChar;\n loop = false;\n }\n break;\n case '{':\n blockStack.push('}');\n blockDepth++;\n break;\n case '(':\n blockStack.push(')');\n blockDepth++;\n break;\n case '[':\n blockStack.push(']');\n blockDepth++;\n break;\n case '}':\n case ')':\n case ']':\n const expected = blockStack.pop();\n if (nextChar === expected) {\n blockDepth--;\n } else {\n // move the parser to the error and return expected\n skipWhitespace(i - startPos);\n returnVal = expected;\n loop = false;\n }\n }\n i++;\n if (i > length) {\n loop = false;\n }\n }\n prevChar = nextChar;\n } while (loop);\n\n return returnVal ? returnVal : null;\n }\n\n parserInput.autoCommentAbsorb = true;\n parserInput.commentStore = [];\n parserInput.finished = false;\n\n // Same as $(), but don't change the state of the parser,\n // just return the match.\n parserInput.peek = tok => {\n if (typeof tok === 'string') {\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tok.length; i++) {\n if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n return false;\n }\n }\n return true;\n } else {\n return tok.test(current);\n }\n };\n\n // Specialization of peek()\n // TODO remove or change some currentChar calls to peekChar\n parserInput.peekChar = tok => input.charAt(parserInput.i) === tok;\n\n parserInput.currentChar = () => input.charAt(parserInput.i);\n\n parserInput.prevChar = () => input.charAt(parserInput.i - 1);\n\n parserInput.getInput = () => input;\n\n parserInput.peekNotNumeric = () => {\n const c = input.charCodeAt(parserInput.i);\n // Is the first char of the dimension 0-9, '.', '+' or '-'\n return (c > CHARCODE_9 || c < CHARCODE_PLUS) || c === CHARCODE_FORWARD_SLASH || c === CHARCODE_COMMA;\n };\n\n parserInput.start = (str, chunkInput, failFunction) => {\n input = str;\n parserInput.i = j = currentPos = furthest = 0;\n\n // chunking apparently makes things quicker (but my tests indicate\n // it might actually make things slower in node at least)\n // and it is a non-perfect parse - it can't recognise\n // unquoted urls, meaning it can't distinguish comments\n // meaning comments with quotes or {}() in them get 'counted'\n // and then lead to parse errors.\n // In addition if the chunking chunks in the wrong place we might\n // not be able to parse a parser statement in one go\n // this is officially deprecated but can be switched on via an option\n // in the case it causes too much performance issues.\n if (chunkInput) {\n chunks = chunker(str, failFunction);\n } else {\n chunks = [str];\n }\n\n current = chunks[0];\n\n skipWhitespace(0);\n };\n\n parserInput.end = () => {\n let message;\n const isFinished = parserInput.i >= input.length;\n\n if (parserInput.i < furthest) {\n message = furthestPossibleErrorMessage;\n parserInput.i = furthest;\n }\n return {\n isFinished,\n furthest: parserInput.i,\n furthestPossibleErrorMessage: message,\n furthestReachedEnd: parserInput.i >= input.length - 1,\n furthestChar: input[parserInput.i]\n };\n };\n\n return parserInput;\n};\n","// Split the input into chunks.\nexport default function (input, fail) {\n const len = input.length;\n let level = 0;\n let parenLevel = 0;\n let lastOpening;\n let lastOpeningParen;\n let lastMultiComment;\n let lastMultiCommentEndBrace;\n const chunks = [];\n let emitFrom = 0;\n let chunkerCurrentIndex;\n let currentChunkStartIndex;\n let cc;\n let cc2;\n let matched;\n\n function emitChunk(force) {\n const len = chunkerCurrentIndex - emitFrom;\n if (((len < 512) && !force) || !len) {\n return;\n }\n chunks.push(input.slice(emitFrom, chunkerCurrentIndex + 1));\n emitFrom = chunkerCurrentIndex + 1;\n }\n\n for (chunkerCurrentIndex = 0; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc = input.charCodeAt(chunkerCurrentIndex);\n if (((cc >= 97) && (cc <= 122)) || (cc < 34)) {\n // a-z or whitespace\n continue;\n }\n\n switch (cc) {\n case 40: // (\n parenLevel++;\n lastOpeningParen = chunkerCurrentIndex;\n continue;\n case 41: // )\n if (--parenLevel < 0) {\n return fail('missing opening `(`', chunkerCurrentIndex);\n }\n continue;\n case 59: // ;\n if (!parenLevel) { emitChunk(); }\n continue;\n case 123: // {\n level++;\n lastOpening = chunkerCurrentIndex;\n continue;\n case 125: // }\n if (--level < 0) {\n return fail('missing opening `{`', chunkerCurrentIndex);\n }\n if (!level && !parenLevel) { emitChunk(); }\n continue;\n case 92: // \\\n if (chunkerCurrentIndex < len - 1) { chunkerCurrentIndex++; continue; }\n return fail('unescaped `\\\\`', chunkerCurrentIndex);\n case 34:\n case 39:\n case 96: // \", ' and `\n matched = 0;\n currentChunkStartIndex = chunkerCurrentIndex;\n for (chunkerCurrentIndex = chunkerCurrentIndex + 1; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if (cc2 > 96) { continue; }\n if (cc2 == cc) { matched = 1; break; }\n if (cc2 == 92) { // \\\n if (chunkerCurrentIndex == len - 1) {\n return fail('unescaped `\\\\`', chunkerCurrentIndex);\n }\n chunkerCurrentIndex++;\n }\n }\n if (matched) { continue; }\n return fail(`unmatched \\`${String.fromCharCode(cc)}\\``, currentChunkStartIndex);\n case 47: // /, check for comment\n if (parenLevel || (chunkerCurrentIndex == len - 1)) { continue; }\n cc2 = input.charCodeAt(chunkerCurrentIndex + 1);\n if (cc2 == 47) {\n // //, find lnfeed\n for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if ((cc2 <= 13) && ((cc2 == 10) || (cc2 == 13))) { break; }\n }\n } else if (cc2 == 42) {\n // /*, find */\n lastMultiComment = currentChunkStartIndex = chunkerCurrentIndex;\n for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len - 1; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if (cc2 == 125) { lastMultiCommentEndBrace = chunkerCurrentIndex; }\n if (cc2 != 42) { continue; }\n if (input.charCodeAt(chunkerCurrentIndex + 1) == 47) { break; }\n }\n if (chunkerCurrentIndex == len - 1) {\n return fail('missing closing `*/`', currentChunkStartIndex);\n }\n chunkerCurrentIndex++;\n }\n continue;\n case 42: // *, check for unmatched */\n if ((chunkerCurrentIndex < len - 1) && (input.charCodeAt(chunkerCurrentIndex + 1) == 47)) {\n return fail('unmatched `/*`', chunkerCurrentIndex);\n }\n continue;\n }\n }\n\n if (level !== 0) {\n if ((lastMultiComment > lastOpening) && (lastMultiCommentEndBrace > lastMultiComment)) {\n return fail('missing closing `}` or `*/`', lastOpening);\n } else {\n return fail('missing closing `}`', lastOpening);\n }\n } else if (parenLevel !== 0) {\n return fail('missing closing `)`', lastOpeningParen);\n }\n\n emitChunk(true);\n return chunks;\n};\n","import LessError from '../less-error';\nimport tree from '../tree';\nimport visitors from '../visitors';\nimport getParserInput from './parser-input';\nimport * as utils from '../utils';\nimport functionRegistry from '../functions/function-registry';\n\n//\n// less.js - parser\n//\n// A relatively straight-forward predictive parser.\n// There is no tokenization/lexing stage, the input is parsed\n// in one sweep.\n//\n// To make the parser fast enough to run in the browser, several\n// optimization had to be made:\n//\n// - Matching and slicing on a huge input is often cause of slowdowns.\n// The solution is to chunkify the input into smaller strings.\n// The chunks are stored in the `chunks` var,\n// `j` holds the current chunk index, and `currentPos` holds\n// the index of the current chunk in relation to `input`.\n// This gives us an almost 4x speed-up.\n//\n// - In many cases, we don't need to match individual tokens;\n// for example, if a value doesn't hold any variables, operations\n// or dynamic references, the parser can effectively 'skip' it,\n// treating it as a literal.\n// An example would be '1px solid #000' - which evaluates to itself,\n// we don't need to know what the individual components are.\n// The drawback, of course is that you don't get the benefits of\n// syntax-checking on the CSS. This gives us a 50% speed-up in the parser,\n// and a smaller speed-up in the code-gen.\n//\n//\n// Token matching is done with the `$` function, which either takes\n// a terminal string or regexp, or a non-terminal function to call.\n// It also takes care of moving all the indices forwards.\n//\n\nconst Parser = function Parser(context, imports, fileInfo) {\n let parsers;\n const parserInput = getParserInput();\n\n function error(msg, type) {\n throw new LessError(\n {\n index: parserInput.i,\n filename: fileInfo.filename,\n type: type || 'Syntax',\n message: msg\n },\n imports\n );\n }\n\n function expect(arg, msg) {\n // some older browsers return typeof 'function' for RegExp\n const result = (arg instanceof Function) ? arg.call(parsers) : parserInput.$re(arg);\n if (result) {\n return result;\n }\n \n error(msg || (typeof arg === 'string'\n ? `expected '${arg}' got '${parserInput.currentChar()}'`\n : 'unexpected token'));\n }\n\n // Specialization of expect()\n function expectChar(arg, msg) {\n if (parserInput.$char(arg)) {\n return arg;\n }\n error(msg || `expected '${arg}' got '${parserInput.currentChar()}'`);\n }\n\n function getDebugInfo(index) {\n const filename = fileInfo.filename;\n\n return {\n lineNumber: utils.getLocation(index, parserInput.getInput()).line + 1,\n fileName: filename\n };\n }\n\n /**\n * Used after initial parsing to create nodes on the fly\n * \n * @param {String} str - string to parse \n * @param {Array} parseList - array of parsers to run input through e.g. [\"value\", \"important\"]\n * @param {Number} currentIndex - start number to begin indexing\n * @param {Object} fileInfo - fileInfo to attach to created nodes\n */\n function parseNode(str, parseList, currentIndex, fileInfo, callback) {\n let result;\n const returnNodes = [];\n const parser = parserInput;\n\n try {\n parser.start(str, false, function fail(msg, index) {\n callback({\n message: msg,\n index: index + currentIndex\n });\n });\n for (let x = 0, p, i; (p = parseList[x]); x++) {\n i = parser.i;\n result = parsers[p]();\n if (result) {\n try {\n result._index = i + currentIndex;\n result._fileInfo = fileInfo;\n } catch (e) {}\n returnNodes.push(result);\n }\n else {\n returnNodes.push(null);\n }\n }\n\n const endInfo = parser.end();\n if (endInfo.isFinished) {\n callback(null, returnNodes);\n }\n else {\n callback(true, null);\n }\n } catch (e) {\n throw new LessError({\n index: e.index + currentIndex,\n message: e.message\n }, imports, fileInfo.filename);\n }\n }\n\n //\n // The Parser\n //\n return {\n parserInput,\n imports,\n fileInfo,\n parseNode,\n //\n // Parse an input string into an abstract syntax tree,\n // @param str A string containing 'less' markup\n // @param callback call `callback` when done.\n // @param [additionalData] An optional map which can contains vars - a map (key, value) of variables to apply\n //\n parse: function (str, callback, additionalData) {\n let root;\n let error = null;\n let globalVars;\n let modifyVars;\n let ignored;\n let preText = '';\n\n globalVars = (additionalData && additionalData.globalVars) ? `${Parser.serializeVars(additionalData.globalVars)}\\n` : '';\n modifyVars = (additionalData && additionalData.modifyVars) ? `\\n${Parser.serializeVars(additionalData.modifyVars)}` : '';\n\n if (context.pluginManager) {\n const preProcessors = context.pluginManager.getPreProcessors();\n for (let i = 0; i < preProcessors.length; i++) {\n str = preProcessors[i].process(str, { context, imports, fileInfo });\n }\n }\n\n if (globalVars || (additionalData && additionalData.banner)) {\n preText = ((additionalData && additionalData.banner) ? additionalData.banner : '') + globalVars;\n ignored = imports.contentsIgnoredChars;\n ignored[fileInfo.filename] = ignored[fileInfo.filename] || 0;\n ignored[fileInfo.filename] += preText.length;\n }\n\n str = str.replace(/\\r\\n?/g, '\\n');\n // Remove potential UTF Byte Order Mark\n str = preText + str.replace(/^\\uFEFF/, '') + modifyVars;\n imports.contents[fileInfo.filename] = str;\n\n // Start with the primary rule.\n // The whole syntax tree is held under a Ruleset node,\n // with the `root` property set to true, so no `{}` are\n // output. The callback is called when the input is parsed.\n try {\n parserInput.start(str, context.chunkInput, function fail(msg, index) {\n throw new LessError({\n index,\n type: 'Parse',\n message: msg,\n filename: fileInfo.filename\n }, imports);\n });\n\n tree.Node.prototype.parse = this;\n root = new tree.Ruleset(null, this.parsers.primary());\n tree.Node.prototype.rootNode = root;\n root.root = true;\n root.firstRoot = true;\n root.functionRegistry = functionRegistry.inherit();\n \n } catch (e) {\n return callback(new LessError(e, imports, fileInfo.filename));\n }\n\n // If `i` is smaller than the `input.length - 1`,\n // it means the parser wasn't able to parse the whole\n // string, so we've got a parsing error.\n //\n // We try to extract a \\n delimited string,\n // showing the line where the parse error occurred.\n // We split it up into two parts (the part which parsed,\n // and the part which didn't), so we can color them differently.\n const endInfo = parserInput.end();\n if (!endInfo.isFinished) {\n\n let message = endInfo.furthestPossibleErrorMessage;\n\n if (!message) {\n message = 'Unrecognised input';\n if (endInfo.furthestChar === '}') {\n message += '. Possibly missing opening \\'{\\'';\n } else if (endInfo.furthestChar === ')') {\n message += '. Possibly missing opening \\'(\\'';\n } else if (endInfo.furthestReachedEnd) {\n message += '. Possibly missing something';\n }\n }\n\n error = new LessError({\n type: 'Parse',\n message,\n index: endInfo.furthest,\n filename: fileInfo.filename\n }, imports);\n }\n\n const finish = e => {\n e = error || e || imports.error;\n\n if (e) {\n if (!(e instanceof LessError)) {\n e = new LessError(e, imports, fileInfo.filename);\n }\n\n return callback(e);\n }\n else {\n return callback(null, root);\n }\n };\n\n if (context.processImports !== false) {\n new visitors.ImportVisitor(imports, finish)\n .run(root);\n } else {\n return finish();\n }\n },\n\n //\n // Here in, the parsing rules/functions\n //\n // The basic structure of the syntax tree generated is as follows:\n //\n // Ruleset -> Declaration -> Value -> Expression -> Entity\n //\n // Here's some Less code:\n //\n // .class {\n // color: #fff;\n // border: 1px solid #000;\n // width: @w + 4px;\n // > .child {...}\n // }\n //\n // And here's what the parse tree might look like:\n //\n // Ruleset (Selector '.class', [\n // Declaration (\"color\", Value ([Expression [Color #fff]]))\n // Declaration (\"border\", Value ([Expression [Dimension 1px][Keyword \"solid\"][Color #000]]))\n // Declaration (\"width\", Value ([Expression [Operation \" + \" [Variable \"@w\"][Dimension 4px]]]))\n // Ruleset (Selector [Element '>', '.child'], [...])\n // ])\n //\n // In general, most rules will try to parse a token with the `$re()` function, and if the return\n // value is truly, will return a new node, of the relevant type. Sometimes, we need to check\n // first, before parsing, that's when we use `peek()`.\n //\n parsers: parsers = {\n //\n // The `primary` rule is the *entry* and *exit* point of the parser.\n // The rules here can appear at any level of the parse tree.\n //\n // The recursive nature of the grammar is an interplay between the `block`\n // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule,\n // as represented by this simplified grammar:\n //\n // primary → (ruleset | declaration)+\n // ruleset → selector+ block\n // block → '{' primary '}'\n //\n // Only at one point is the primary rule not called from the\n // block rule: at the root level.\n //\n primary: function () {\n const mixin = this.mixin;\n let root = [];\n let node;\n\n while (true) {\n while (true) {\n node = this.comment();\n if (!node) { break; }\n root.push(node);\n }\n // always process comments before deciding if finished\n if (parserInput.finished) {\n break;\n }\n if (parserInput.peek('}')) {\n break;\n }\n\n node = this.extendRule();\n if (node) {\n root = root.concat(node);\n continue;\n }\n\n node = mixin.definition() || this.declaration() || mixin.call(false, false) || \n this.ruleset() || this.variableCall() || this.entities.call() || this.atrule();\n if (node) {\n root.push(node);\n } else {\n let foundSemiColon = false;\n while (parserInput.$char(';')) {\n foundSemiColon = true;\n }\n if (!foundSemiColon) {\n break;\n }\n }\n }\n\n return root;\n },\n\n // comments are collected by the main parsing mechanism and then assigned to nodes\n // where the current structure allows it\n comment: function () {\n if (parserInput.commentStore.length) {\n const comment = parserInput.commentStore.shift();\n return new(tree.Comment)(comment.text, comment.isLineComment, comment.index, fileInfo);\n }\n },\n\n //\n // Entities are tokens which can be found inside an Expression\n //\n entities: {\n mixinLookup: function() {\n return parsers.mixin.call(true, true);\n },\n //\n // A string, which supports escaping \" and '\n //\n // \"milky way\" 'he\\'s the one!'\n //\n quoted: function (forceEscaped) {\n let str;\n const index = parserInput.i;\n let isEscaped = false;\n\n parserInput.save();\n if (parserInput.$char('~')) {\n isEscaped = true;\n } else if (forceEscaped) {\n parserInput.restore();\n return;\n }\n\n str = parserInput.$quoted();\n if (!str) {\n parserInput.restore();\n return;\n }\n parserInput.forget();\n\n return new(tree.Quoted)(str.charAt(0), str.substr(1, str.length - 2), isEscaped, index, fileInfo);\n },\n\n //\n // A catch-all word, such as:\n //\n // black border-collapse\n //\n keyword: function () {\n const k = parserInput.$char('%') || parserInput.$re(/^\\[?(?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+\\]?/);\n if (k) {\n return tree.Color.fromKeyword(k) || new(tree.Keyword)(k);\n }\n },\n\n //\n // A function call\n //\n // rgb(255, 0, 255)\n //\n // The arguments are parsed with the `entities.arguments` parser.\n //\n call: function () {\n let name;\n let args;\n let func;\n const index = parserInput.i;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (parserInput.peek(/^url\\(/i)) {\n return;\n }\n\n parserInput.save();\n\n name = parserInput.$re(/^([\\w-]+|%|~|progid:[\\w\\.]+)\\(/);\n if (!name) {\n parserInput.forget(); \n return;\n }\n\n name = name[1];\n func = this.customFuncCall(name);\n if (func) {\n args = func.parse();\n if (args && func.stop) {\n parserInput.forget();\n return args;\n }\n }\n\n args = this.arguments(args);\n\n if (!parserInput.$char(')')) {\n parserInput.restore('Could not parse call arguments or missing \\')\\'');\n return;\n }\n\n parserInput.forget();\n\n return new(tree.Call)(name, args, index, fileInfo);\n },\n \n //\n // Parsing rules for functions with non-standard args, e.g.:\n //\n // boolean(not(2 > 1))\n //\n // This is a quick prototype, to be modified/improved when\n // more custom-parsed funcs come (e.g. `selector(...)`)\n //\n\n customFuncCall: function (name) {\n /* Ideally the table is to be moved out of here for faster perf.,\n but it's quite tricky since it relies on all these `parsers`\n and `expect` available only here */\n return {\n alpha: f(parsers.ieAlpha, true),\n boolean: f(condition),\n 'if': f(condition)\n }[name.toLowerCase()];\n\n function f(parse, stop) {\n return {\n parse, // parsing function\n stop // when true - stop after parse() and return its result, \n // otherwise continue for plain args\n };\n }\n \n function condition() {\n return [expect(parsers.condition, 'expected condition')];\n }\n },\n\n arguments: function (prevArgs) {\n let argsComma = prevArgs || [];\n const argsSemiColon = [];\n let isSemiColonSeparated;\n let value;\n\n parserInput.save();\n\n while (true) {\n if (prevArgs) {\n prevArgs = false;\n } else {\n value = parsers.detachedRuleset() || this.assignment() || parsers.expression();\n if (!value) {\n break;\n }\n\n if (value.value && value.value.length == 1) {\n value = value.value[0];\n }\n\n argsComma.push(value);\n }\n\n if (parserInput.$char(',')) {\n continue;\n }\n\n if (parserInput.$char(';') || isSemiColonSeparated) {\n isSemiColonSeparated = true;\n value = (argsComma.length < 1) ? argsComma[0]\n : new tree.Value(argsComma);\n argsSemiColon.push(value);\n argsComma = [];\n }\n }\n\n parserInput.forget();\n return isSemiColonSeparated ? argsSemiColon : argsComma;\n },\n literal: function () {\n return this.dimension() ||\n this.color() ||\n this.quoted() ||\n this.unicodeDescriptor();\n },\n\n // Assignments are argument entities for calls.\n // They are present in ie filter properties as shown below.\n //\n // filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* )\n //\n\n assignment: function () {\n let key;\n let value;\n parserInput.save();\n key = parserInput.$re(/^\\w+(?=\\s?=)/i);\n if (!key) {\n parserInput.restore();\n return;\n }\n if (!parserInput.$char('=')) {\n parserInput.restore();\n return;\n }\n value = parsers.entity();\n if (value) {\n parserInput.forget();\n return new(tree.Assignment)(key, value);\n } else {\n parserInput.restore();\n }\n },\n\n //\n // Parse url() tokens\n //\n // We use a specific rule for urls, because they don't really behave like\n // standard function calls. The difference is that the argument doesn't have\n // to be enclosed within a string, so it can't be parsed as an Expression.\n //\n url: function () {\n let value;\n const index = parserInput.i;\n\n parserInput.autoCommentAbsorb = false;\n\n if (!parserInput.$str('url(')) {\n parserInput.autoCommentAbsorb = true;\n return;\n }\n\n value = this.quoted() || this.variable() || this.property() ||\n parserInput.$re(/^(?:(?:\\\\[\\(\\)'\"])|[^\\(\\)'\"])+/) || '';\n\n parserInput.autoCommentAbsorb = true;\n\n expectChar(')');\n\n return new(tree.URL)((value.value != null || \n value instanceof tree.Variable || \n value instanceof tree.Property) ?\n value : new(tree.Anonymous)(value, index), index, fileInfo);\n },\n\n //\n // A Variable entity, such as `@fink`, in\n //\n // width: @fink + 2px\n //\n // We use a different parser for variable definitions,\n // see `parsers.variable`.\n //\n variable: function () {\n let ch;\n let name;\n const index = parserInput.i;\n\n parserInput.save();\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^@@?[\\w-]+/))) {\n ch = parserInput.currentChar();\n if (ch === '(' || ch === '[' && !parserInput.prevChar().match(/^\\s/)) {\n // this may be a VariableCall lookup\n const result = parsers.variableCall(name);\n if (result) {\n parserInput.forget();\n return result;\n }\n }\n parserInput.forget();\n return new(tree.Variable)(name, index, fileInfo);\n }\n parserInput.restore();\n },\n\n // A variable entity using the protective {} e.g. @{var}\n variableCurly: function () {\n let curly;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '@' && (curly = parserInput.$re(/^@\\{([\\w-]+)\\}/))) {\n return new(tree.Variable)(`@${curly[1]}`, index, fileInfo);\n }\n },\n //\n // A Property accessor, such as `$color`, in\n //\n // background-color: $color\n //\n property: function () {\n let name;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' && (name = parserInput.$re(/^\\$[\\w-]+/))) {\n return new(tree.Property)(name, index, fileInfo);\n }\n },\n\n // A property entity useing the protective {} e.g. ${prop}\n propertyCurly: function () {\n let curly;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' && (curly = parserInput.$re(/^\\$\\{([\\w-]+)\\}/))) {\n return new(tree.Property)(`$${curly[1]}`, index, fileInfo);\n }\n },\n //\n // A Hexadecimal color\n //\n // #4F3C2F\n //\n // `rgb` and `hsl` colors are parsed through the `entities.call` parser.\n //\n color: function () {\n let rgb;\n parserInput.save();\n\n if (parserInput.currentChar() === '#' && (rgb = parserInput.$re(/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})([\\w.#\\[])?/))) {\n if (!rgb[2]) {\n parserInput.forget();\n return new(tree.Color)(rgb[1], undefined, rgb[0]);\n } \n }\n parserInput.restore();\n },\n\n colorKeyword: function () {\n parserInput.save();\n const autoCommentAbsorb = parserInput.autoCommentAbsorb;\n parserInput.autoCommentAbsorb = false;\n const k = parserInput.$re(/^[_A-Za-z-][_A-Za-z0-9-]+/);\n parserInput.autoCommentAbsorb = autoCommentAbsorb;\n if (!k) {\n parserInput.forget();\n return;\n }\n parserInput.restore();\n const color = tree.Color.fromKeyword(k);\n if (color) {\n parserInput.$str(k);\n return color;\n }\n },\n\n //\n // A Dimension, that is, a number and a unit\n //\n // 0.5em 95%\n //\n dimension: function () {\n if (parserInput.peekNotNumeric()) {\n return;\n }\n\n const value = parserInput.$re(/^([+-]?\\d*\\.?\\d+)(%|[a-z_]+)?/i);\n if (value) {\n return new(tree.Dimension)(value[1], value[2]);\n }\n },\n\n //\n // A unicode descriptor, as is used in unicode-range\n //\n // U+0?? or U+00A1-00A9\n //\n unicodeDescriptor: function () {\n let ud;\n\n ud = parserInput.$re(/^U\\+[0-9a-fA-F?]+(\\-[0-9a-fA-F?]+)?/);\n if (ud) {\n return new(tree.UnicodeDescriptor)(ud[0]);\n }\n },\n\n //\n // JavaScript code to be evaluated\n //\n // `window.location.href`\n //\n javascript: function () {\n let js;\n const index = parserInput.i;\n\n parserInput.save();\n\n const escape = parserInput.$char('~');\n const jsQuote = parserInput.$char('`');\n\n if (!jsQuote) {\n parserInput.restore();\n return;\n }\n\n js = parserInput.$re(/^[^`]*`/);\n if (js) {\n parserInput.forget();\n return new(tree.JavaScript)(js.substr(0, js.length - 1), Boolean(escape), index, fileInfo);\n }\n parserInput.restore('invalid javascript definition');\n }\n },\n\n //\n // The variable part of a variable definition. Used in the `rule` parser\n //\n // @fink:\n //\n variable: function () {\n let name;\n\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^(@[\\w-]+)\\s*:/))) { return name[1]; }\n },\n\n //\n // Call a variable value to retrieve a detached ruleset\n // or a value from a detached ruleset's rules.\n //\n // @fink();\n // @fink;\n // color: @fink[@color];\n //\n variableCall: function (parsedName) {\n let lookups;\n const i = parserInput.i;\n const inValue = !!parsedName;\n let name = parsedName;\n\n parserInput.save();\n\n if (name || (parserInput.currentChar() === '@'\n && (name = parserInput.$re(/^(@[\\w-]+)(\\(\\s*\\))?/)))) {\n\n lookups = this.mixin.ruleLookups();\n\n if (!lookups && ((inValue && parserInput.$str('()') !== '()') || (name[2] !== '()'))) {\n parserInput.restore('Missing \\'[...]\\' lookup in variable call');\n return;\n }\n\n if (!inValue) {\n name = name[1];\n }\n\n const call = new tree.VariableCall(name, i, fileInfo);\n if (!inValue && parsers.end()) {\n parserInput.forget();\n return call;\n }\n else {\n parserInput.forget();\n return new tree.NamespaceValue(call, lookups, i, fileInfo);\n }\n }\n\n parserInput.restore();\n },\n\n //\n // extend syntax - used to extend selectors\n //\n extend: function(isRule) {\n let elements;\n let e;\n const index = parserInput.i;\n let option;\n let extendList;\n let extend;\n\n if (!parserInput.$str(isRule ? '&:extend(' : ':extend(')) {\n return;\n }\n\n do {\n option = null;\n elements = null;\n while (!(option = parserInput.$re(/^(all)(?=\\s*(\\)|,))/))) {\n e = this.element();\n if (!e) {\n break;\n }\n if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n }\n\n option = option && option[1];\n if (!elements) {\n error('Missing target selector for :extend().');\n }\n extend = new(tree.Extend)(new(tree.Selector)(elements), option, index, fileInfo);\n if (extendList) {\n extendList.push(extend);\n } else {\n extendList = [ extend ];\n }\n } while (parserInput.$char(','));\n\n expect(/^\\)/);\n\n if (isRule) {\n expect(/^;/);\n }\n\n return extendList;\n },\n\n //\n // extendRule - used in a rule to extend all the parent selectors\n //\n extendRule: function() {\n return this.extend(true);\n },\n\n //\n // Mixins\n //\n mixin: {\n //\n // A Mixin call, with an optional argument list\n //\n // #mixins > .square(#fff);\n // #mixins.square(#fff);\n // .rounded(4px, black);\n // .button;\n //\n // We can lookup / return a value using the lookup syntax:\n //\n // color: #mixin.square(#fff)[@color];\n //\n // The `while` loop is there because mixins can be\n // namespaced, but we only support the child and descendant\n // selector for now.\n //\n call: function (inValue, getLookup) {\n const s = parserInput.currentChar();\n let important = false;\n let lookups;\n const index = parserInput.i;\n let elements;\n let args;\n let hasParens;\n\n if (s !== '.' && s !== '#') { return; }\n\n parserInput.save(); // stop us absorbing part of an invalid selector\n\n elements = this.elements();\n\n if (elements) {\n if (parserInput.$char('(')) {\n args = this.args(true).args;\n expectChar(')');\n hasParens = true;\n }\n\n if (getLookup !== false) {\n lookups = this.ruleLookups();\n }\n if (getLookup === true && !lookups) {\n parserInput.restore();\n return;\n }\n\n if (!lookups && !hasParens) {\n // This isn't a valid mixin call\n parserInput.restore('Unrecognized input. Possibly missing \\'(\\' in mixin call.');\n return;\n }\n\n if (!inValue && parsers.important()) {\n important = true;\n }\n\n if (inValue || parsers.end()) {\n parserInput.forget();\n const mixin = new(tree.mixin.Call)(elements, args, index, fileInfo, !lookups && important);\n if (lookups) {\n return new tree.NamespaceValue(mixin, lookups);\n }\n else {\n return mixin;\n }\n }\n }\n\n parserInput.restore();\n },\n /**\n * Matching elements for mixins\n * (Start with . or # and can have > )\n */\n elements: function() {\n let elements;\n let e;\n let c;\n let elem;\n let elemIndex;\n const re = /^[#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/;\n while (true) {\n elemIndex = parserInput.i;\n e = parserInput.$re(re);\n \n if (!e) {\n break;\n }\n elem = new(tree.Element)(c, e, false, elemIndex, fileInfo);\n if (elements) {\n elements.push(elem);\n } else {\n elements = [ elem ];\n }\n c = parserInput.$char('>');\n }\n return elements;\n },\n args: function (isCall) {\n const entities = parsers.entities;\n const returner = { args:null, variadic: false };\n let expressions = [];\n const argsSemiColon = [];\n const argsComma = [];\n let isSemiColonSeparated;\n let expressionContainsNamed;\n let name;\n let nameLoop;\n let value;\n let arg;\n let expand;\n let hasSep = true;\n\n parserInput.save();\n\n while (true) {\n if (isCall) {\n arg = parsers.detachedRuleset() || parsers.expression();\n } else {\n parserInput.commentStore.length = 0;\n if (parserInput.$str('...')) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ variadic: true });\n break;\n }\n arg = entities.variable() || entities.property() || entities.literal() || entities.keyword() || this.call(true);\n }\n\n if (!arg || !hasSep) {\n break;\n }\n\n nameLoop = null;\n if (arg.throwAwayComments) {\n arg.throwAwayComments();\n }\n value = arg;\n let val = null;\n\n if (isCall) {\n // Variable\n if (arg.value && arg.value.length == 1) {\n val = arg.value[0];\n }\n } else {\n val = arg;\n }\n\n if (val && (val instanceof tree.Variable || val instanceof tree.Property)) {\n if (parserInput.$char(':')) {\n if (expressions.length > 0) {\n if (isSemiColonSeparated) {\n error('Cannot mix ; and , as delimiter types');\n }\n expressionContainsNamed = true;\n }\n\n value = parsers.detachedRuleset() || parsers.expression();\n\n if (!value) {\n if (isCall) {\n error('could not understand value for named argument');\n } else {\n parserInput.restore();\n returner.args = [];\n return returner;\n }\n }\n nameLoop = (name = val.name);\n } else if (parserInput.$str('...')) {\n if (!isCall) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ name: arg.name, variadic: true });\n break;\n } else {\n expand = true;\n }\n } else if (!isCall) {\n name = nameLoop = val.name;\n value = null;\n }\n }\n\n if (value) {\n expressions.push(value);\n }\n\n argsComma.push({ name:nameLoop, value, expand });\n\n if (parserInput.$char(',')) {\n hasSep = true;\n continue;\n }\n hasSep = parserInput.$char(';') === ';';\n\n if (hasSep || isSemiColonSeparated) {\n\n if (expressionContainsNamed) {\n error('Cannot mix ; and , as delimiter types');\n }\n\n isSemiColonSeparated = true;\n\n if (expressions.length > 1) {\n value = new(tree.Value)(expressions);\n }\n argsSemiColon.push({ name, value, expand });\n\n name = null;\n expressions = [];\n expressionContainsNamed = false;\n }\n }\n\n parserInput.forget();\n returner.args = isSemiColonSeparated ? argsSemiColon : argsComma;\n return returner;\n },\n //\n // A Mixin definition, with a list of parameters\n //\n // .rounded (@radius: 2px, @color) {\n // ...\n // }\n //\n // Until we have a finer grained state-machine, we have to\n // do a look-ahead, to make sure we don't have a mixin call.\n // See the `rule` function for more information.\n //\n // We start by matching `.rounded (`, and then proceed on to\n // the argument list, which has optional default values.\n // We store the parameters in `params`, with a `value` key,\n // if there is a value, such as in the case of `@radius`.\n //\n // Once we've got our params list, and a closing `)`, we parse\n // the `{...}` block.\n //\n definition: function () {\n let name;\n let params = [];\n let match;\n let ruleset;\n let cond;\n let variadic = false;\n if ((parserInput.currentChar() !== '.' && parserInput.currentChar() !== '#') ||\n parserInput.peek(/^[^{]*\\}/)) {\n return;\n }\n\n parserInput.save();\n\n match = parserInput.$re(/^([#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\\s*\\(/);\n if (match) {\n name = match[1];\n\n const argInfo = this.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n\n // .mixincall(\"@{a}\");\n // looks a bit like a mixin definition..\n // also\n // .mixincall(@a: {rule: set;});\n // so we have to be nice and restore\n if (!parserInput.$char(')')) {\n parserInput.restore('Missing closing \\')\\'');\n return;\n }\n\n parserInput.commentStore.length = 0;\n\n if (parserInput.$str('when')) { // Guard\n cond = expect(parsers.conditions, 'expected condition');\n }\n\n ruleset = parsers.block();\n\n if (ruleset) {\n parserInput.forget();\n return new(tree.mixin.Definition)(name, params, ruleset, cond, variadic);\n } else {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n }\n },\n \n ruleLookups: function() {\n let rule;\n let args;\n const lookups = [];\n\n if (parserInput.currentChar() !== '[') { \n return;\n }\n\n while (true) {\n parserInput.save();\n args = null;\n rule = this.lookupValue();\n if (!rule && rule !== '') {\n parserInput.restore();\n break;\n }\n lookups.push(rule);\n parserInput.forget();\n }\n if (lookups.length > 0) {\n return lookups;\n }\n },\n \n lookupValue: function() {\n parserInput.save();\n \n if (!parserInput.$char('[')) { \n parserInput.restore();\n return;\n }\n \n const name = parserInput.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);\n \n if (!parserInput.$char(']')) {\n parserInput.restore();\n return;\n } \n\n if (name || name === '') {\n parserInput.forget();\n return name;\n }\n \n parserInput.restore();\n }\n },\n //\n // Entities are the smallest recognized token,\n // and can be found inside a rule's value.\n //\n entity: function () {\n const entities = this.entities;\n\n return this.comment() || entities.literal() || entities.variable() || entities.url() ||\n entities.property() || entities.call() || entities.keyword() || this.mixin.call(true) ||\n entities.javascript();\n },\n\n //\n // A Declaration terminator. Note that we use `peek()` to check for '}',\n // because the `block` rule will be expecting it, but we still need to make sure\n // it's there, if ';' was omitted.\n //\n end: function () {\n return parserInput.$char(';') || parserInput.peek('}');\n },\n\n //\n // IE's alpha function\n //\n // alpha(opacity=88)\n //\n ieAlpha: function () {\n let value;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (!parserInput.$re(/^opacity=/i)) { return; }\n value = parserInput.$re(/^\\d+/);\n if (!value) {\n value = expect(parsers.entities.variable, 'Could not parse alpha');\n value = `@{${value.name.slice(1)}}`;\n }\n expectChar(')');\n return new tree.Quoted('', `alpha(opacity=${value})`);\n },\n\n //\n // A Selector Element\n //\n // div\n // + h1\n // #socks\n // input[type=\"text\"]\n //\n // Elements are the building blocks for Selectors,\n // they are made out of a `Combinator` (see combinator rule),\n // and an element name, such as a tag a class, or `*`.\n //\n element: function () {\n let e;\n let c;\n let v;\n const index = parserInput.i;\n\n c = this.combinator();\n\n e = parserInput.$re(/^(?:\\d+\\.\\d+|\\d+)%/) ||\n parserInput.$re(/^(?:[.#]?|:*)(?:[\\w-]|[^\\x00-\\x9f]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/) ||\n parserInput.$char('*') || parserInput.$char('&') || this.attribute() ||\n parserInput.$re(/^\\([^&()@]+\\)/) || parserInput.$re(/^[\\.#:](?=@)/) ||\n this.entities.variableCurly();\n\n if (!e) {\n parserInput.save();\n if (parserInput.$char('(')) {\n if ((v = this.selector(false)) && parserInput.$char(')')) {\n e = new(tree.Paren)(v);\n parserInput.forget();\n } else {\n parserInput.restore('Missing closing \\')\\'');\n }\n } else {\n parserInput.forget();\n }\n }\n\n if (e) { return new(tree.Element)(c, e, e instanceof tree.Variable, index, fileInfo); }\n },\n\n //\n // Combinators combine elements together, in a Selector.\n //\n // Because our parser isn't white-space sensitive, special care\n // has to be taken, when parsing the descendant combinator, ` `,\n // as it's an empty space. We have to check the previous character\n // in the input, to see if it's a ` ` character. More info on how\n // we deal with this in *combinator.js*.\n //\n combinator: function () {\n let c = parserInput.currentChar();\n\n if (c === '/') {\n parserInput.save();\n const slashedCombinator = parserInput.$re(/^\\/[a-z]+\\//i);\n if (slashedCombinator) {\n parserInput.forget();\n return new(tree.Combinator)(slashedCombinator);\n }\n parserInput.restore();\n }\n\n if (c === '>' || c === '+' || c === '~' || c === '|' || c === '^') {\n parserInput.i++;\n if (c === '^' && parserInput.currentChar() === '^') {\n c = '^^';\n parserInput.i++;\n }\n while (parserInput.isWhitespace()) { parserInput.i++; }\n return new(tree.Combinator)(c);\n } else if (parserInput.isWhitespace(-1)) {\n return new(tree.Combinator)(' ');\n } else {\n return new(tree.Combinator)(null);\n }\n },\n //\n // A CSS Selector\n // with less extensions e.g. the ability to extend and guard\n //\n // .class > div + h1\n // li a:hover\n //\n // Selectors are made out of one or more Elements, see above.\n //\n selector: function (isLess) {\n const index = parserInput.i;\n let elements;\n let extendList;\n let c;\n let e;\n let allExtends;\n let when;\n let condition;\n isLess = isLess !== false;\n while ((isLess && (extendList = this.extend())) || (isLess && (when = parserInput.$str('when'))) || (e = this.element())) {\n if (when) {\n condition = expect(this.conditions, 'expected condition');\n } else if (condition) {\n error('CSS guard can only be used at the end of selector');\n } else if (extendList) {\n if (allExtends) {\n allExtends = allExtends.concat(extendList);\n } else {\n allExtends = extendList;\n }\n } else {\n if (allExtends) { error('Extend can only be used at the end of selector'); }\n c = parserInput.currentChar();\n if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n e = null;\n }\n if (c === '{' || c === '}' || c === ';' || c === ',' || c === ')') {\n break;\n }\n }\n\n if (elements) { return new(tree.Selector)(elements, allExtends, condition, index, fileInfo); }\n if (allExtends) { error('Extend must be used to extend a selector, it cannot be used on its own'); }\n },\n selectors: function () {\n let s;\n let selectors;\n while (true) {\n s = this.selector();\n if (!s) {\n break;\n }\n if (selectors) {\n selectors.push(s);\n } else {\n selectors = [ s ];\n }\n parserInput.commentStore.length = 0;\n if (s.condition && selectors.length > 1) {\n error(\"Guards are only currently allowed on a single selector.\");\n }\n if (!parserInput.$char(',')) { break; }\n if (s.condition) {\n error(\"Guards are only currently allowed on a single selector.\");\n }\n parserInput.commentStore.length = 0;\n }\n return selectors;\n },\n attribute: function () {\n if (!parserInput.$char('[')) { return; }\n\n const entities = this.entities;\n let key;\n let val;\n let op;\n\n if (!(key = entities.variableCurly())) {\n key = expect(/^(?:[_A-Za-z0-9-\\*]*\\|)?(?:[_A-Za-z0-9-]|\\\\.)+/);\n }\n\n op = parserInput.$re(/^[|~*$^]?=/);\n if (op) {\n val = entities.quoted() || parserInput.$re(/^[0-9]+%/) || parserInput.$re(/^[\\w-]+/) || entities.variableCurly();\n }\n\n expectChar(']');\n\n return new(tree.Attribute)(key, op, val);\n },\n\n //\n // The `block` rule is used by `ruleset` and `mixin.definition`.\n // It's a wrapper around the `primary` rule, with added `{}`.\n //\n block: function () {\n let content;\n if (parserInput.$char('{') && (content = this.primary()) && parserInput.$char('}')) {\n return content;\n }\n },\n\n blockRuleset: function() {\n let block = this.block();\n\n if (block) {\n block = new tree.Ruleset(null, block);\n }\n return block;\n },\n\n detachedRuleset: function() {\n let argInfo;\n let params;\n let variadic;\n\n parserInput.save();\n if (parserInput.$re(/^[.#]\\(/)) {\n /**\n * DR args currently only implemented for each() function, and not \n * yet settable as `@dr: #(@arg) {}`\n * This should be done when DRs are merged with mixins.\n * See: https://github.com/less/less-meta/issues/16\n */\n argInfo = this.mixin.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n if (!parserInput.$char(')')) {\n parserInput.restore();\n return;\n }\n }\n const blockRuleset = this.blockRuleset();\n if (blockRuleset) {\n parserInput.forget();\n if (params) {\n return new tree.mixin.Definition(null, params, blockRuleset, null, variadic);\n }\n return new tree.DetachedRuleset(blockRuleset);\n }\n parserInput.restore();\n },\n\n //\n // div, .class, body > p {...}\n //\n ruleset: function () {\n let selectors;\n let rules;\n let debugInfo;\n\n parserInput.save();\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(parserInput.i);\n }\n\n selectors = this.selectors();\n\n if (selectors && (rules = this.block())) {\n parserInput.forget();\n const ruleset = new(tree.Ruleset)(selectors, rules, context.strictImports);\n if (context.dumpLineNumbers) {\n ruleset.debugInfo = debugInfo;\n }\n return ruleset;\n } else {\n parserInput.restore();\n }\n },\n declaration: function () {\n let name;\n let value;\n const index = parserInput.i;\n let hasDR;\n const c = parserInput.currentChar();\n let important;\n let merge;\n let isVariable;\n\n if (c === '.' || c === '#' || c === '&' || c === ':') { return; }\n\n parserInput.save();\n\n name = this.variable() || this.ruleProperty();\n if (name) {\n isVariable = typeof name === 'string';\n\n if (isVariable) {\n value = this.detachedRuleset();\n if (value) {\n hasDR = true;\n }\n }\n\n parserInput.commentStore.length = 0;\n if (!value) {\n // a name returned by this.ruleProperty() is always an array of the form:\n // [string-1, ..., string-n, \"\"] or [string-1, ..., string-n, \"+\"]\n // where each item is a tree.Keyword or tree.Variable\n merge = !isVariable && name.length > 1 && name.pop().value;\n\n // Custom property values get permissive parsing\n if (name[0].value && name[0].value.slice(0, 2) === '--') {\n value = this.permissiveValue();\n }\n // Try to store values as anonymous\n // If we need the value later we'll re-parse it in ruleset.parseValue\n else {\n value = this.anonymousValue();\n }\n if (value) {\n parserInput.forget();\n // anonymous values absorb the end ';' which is required for them to work\n return new(tree.Declaration)(name, value, false, merge, index, fileInfo);\n }\n\n if (!value) {\n value = this.value();\n }\n\n if (value) {\n important = this.important();\n } else if (isVariable) {\n // As a last resort, try permissiveValue\n value = this.permissiveValue();\n }\n }\n\n if (value && (this.end() || hasDR)) {\n parserInput.forget();\n return new(tree.Declaration)(name, value, important, merge, index, fileInfo);\n }\n else {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n }\n },\n anonymousValue: function () {\n const index = parserInput.i;\n const match = parserInput.$re(/^([^.#@\\$+\\/'\"*`(;{}-]*);/);\n if (match) {\n return new(tree.Anonymous)(match[1], index);\n }\n },\n /**\n * Used for custom properties, at-rules, and variables (as fallback)\n * Parses almost anything inside of {} [] () \"\" blocks\n * until it reaches outer-most tokens.\n * \n * First, it will try to parse comments and entities to reach\n * the end. This is mostly like the Expression parser except no\n * math is allowed.\n */\n permissiveValue: function (untilTokens) {\n let i;\n let e;\n let done;\n let value;\n const tok = untilTokens || ';';\n const index = parserInput.i;\n const result = [];\n\n function testCurrentChar() {\n const char = parserInput.currentChar();\n if (typeof tok === 'string') {\n return char === tok;\n } else {\n return tok.test(char);\n }\n }\n if (testCurrentChar()) {\n return;\n }\n value = [];\n do {\n e = this.comment();\n if (e) {\n value.push(e);\n continue;\n }\n e = this.entity();\n if (e) {\n value.push(e);\n }\n } while (e);\n\n done = testCurrentChar();\n\n if (value.length > 0) {\n value = new(tree.Expression)(value);\n if (done) {\n return value;\n }\n else {\n result.push(value);\n }\n // Preserve space before $parseUntil as it will not\n if (parserInput.prevChar() === ' ') {\n result.push(new tree.Anonymous(' ', index));\n }\n }\n parserInput.save();\n\n value = parserInput.$parseUntil(tok);\n\n if (value) {\n if (typeof value === 'string') {\n error(`Expected '${value}'`, 'Parse');\n }\n if (value.length === 1 && value[0] === ' ') {\n parserInput.forget();\n return new tree.Anonymous('', index);\n }\n let item;\n for (i = 0; i < value.length; i++) {\n item = value[i];\n if (Array.isArray(item)) {\n // Treat actual quotes as normal quoted values\n result.push(new tree.Quoted(item[0], item[1], true, index, fileInfo));\n }\n else {\n if (i === value.length - 1) {\n item = item.trim();\n }\n // Treat like quoted values, but replace vars like unquoted expressions\n const quote = new tree.Quoted('\\'', item, true, index, fileInfo);\n quote.variableRegex = /@([\\w-]+)/g;\n quote.propRegex = /\\$([\\w-]+)/g;\n result.push(quote);\n }\n }\n parserInput.forget();\n return new tree.Expression(result, true);\n }\n parserInput.restore();\n },\n\n //\n // An @import atrule\n //\n // @import \"lib\";\n //\n // Depending on our environment, importing is done differently:\n // In the browser, it's an XHR request, in Node, it would be a\n // file-system operation. The function used for importing is\n // stored in `import`, which we pass to the Import constructor.\n //\n 'import': function () {\n let path;\n let features;\n const index = parserInput.i;\n\n const dir = parserInput.$re(/^@import?\\s+/);\n\n if (dir) {\n const options = (dir ? this.importOptions() : null) || {};\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n features = this.mediaFeatures();\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon or unrecognised media features on import');\n }\n features = features && new(tree.Value)(features);\n return new(tree.Import)(path, features, options, index, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed import statement');\n }\n }\n },\n\n importOptions: function() {\n let o;\n const options = {};\n let optionName;\n let value;\n\n // list of options, surrounded by parens\n if (!parserInput.$char('(')) { return null; }\n do {\n o = this.importOption();\n if (o) {\n optionName = o;\n value = true;\n switch (optionName) {\n case 'css':\n optionName = 'less';\n value = false;\n break;\n case 'once':\n optionName = 'multiple';\n value = false;\n break;\n }\n options[optionName] = value;\n if (!parserInput.$char(',')) { break; }\n }\n } while (o);\n expectChar(')');\n return options;\n },\n\n importOption: function() {\n const opt = parserInput.$re(/^(less|css|multiple|once|inline|reference|optional)/);\n if (opt) {\n return opt[1];\n }\n },\n\n mediaFeature: function () {\n const entities = this.entities;\n const nodes = [];\n let e;\n let p;\n parserInput.save();\n do {\n e = entities.keyword() || entities.variable() || entities.mixinLookup();\n if (e) {\n nodes.push(e);\n } else if (parserInput.$char('(')) {\n p = this.property();\n e = this.value();\n if (parserInput.$char(')')) {\n if (p && e) {\n nodes.push(new(tree.Paren)(new(tree.Declaration)(p, e, null, null, parserInput.i, fileInfo, true)));\n } else if (e) {\n nodes.push(new(tree.Paren)(e));\n } else {\n error('badly formed media feature definition');\n }\n } else {\n error('Missing closing \\')\\'', 'Parse');\n }\n }\n } while (e);\n\n parserInput.forget();\n if (nodes.length > 0) {\n return new(tree.Expression)(nodes);\n }\n },\n\n mediaFeatures: function () {\n const entities = this.entities;\n const features = [];\n let e;\n do {\n e = this.mediaFeature();\n if (e) {\n features.push(e);\n if (!parserInput.$char(',')) { break; }\n } else {\n e = entities.variable() || entities.mixinLookup();\n if (e) {\n features.push(e);\n if (!parserInput.$char(',')) { break; }\n }\n }\n } while (e);\n\n return features.length > 0 ? features : null;\n },\n\n media: function () {\n let features;\n let rules;\n let media;\n let debugInfo;\n const index = parserInput.i;\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(index);\n }\n\n parserInput.save();\n\n if (parserInput.$str('@media')) {\n features = this.mediaFeatures();\n\n rules = this.block();\n\n if (!rules) {\n error('media definitions require block statements after any features');\n }\n\n parserInput.forget();\n\n media = new(tree.Media)(rules, features, index, fileInfo);\n if (context.dumpLineNumbers) {\n media.debugInfo = debugInfo;\n }\n\n return media;\n }\n\n parserInput.restore();\n },\n\n //\n\n // A @plugin directive, used to import plugins dynamically.\n //\n // @plugin (args) \"lib\";\n //\n plugin: function () {\n let path;\n let args;\n let options;\n const index = parserInput.i;\n const dir = parserInput.$re(/^@plugin?\\s+/);\n\n if (dir) {\n args = this.pluginArgs();\n\n if (args) {\n options = {\n pluginArgs: args,\n isPlugin: true\n };\n }\n else {\n options = { isPlugin: true };\n }\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon on @plugin');\n }\n return new(tree.Import)(path, null, options, index, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed @plugin statement');\n }\n }\n },\n\n pluginArgs: function() {\n // list of options, surrounded by parens\n parserInput.save();\n if (!parserInput.$char('(')) {\n parserInput.restore();\n return null;\n }\n const args = parserInput.$re(/^\\s*([^\\);]+)\\)\\s*/);\n if (args[1]) {\n parserInput.forget();\n return args[1].trim();\n }\n else { \n parserInput.restore();\n return null;\n }\n },\n\n //\n // A CSS AtRule\n //\n // @charset \"utf-8\";\n //\n atrule: function () {\n const index = parserInput.i;\n let name;\n let value;\n let rules;\n let nonVendorSpecificName;\n let hasIdentifier;\n let hasExpression;\n let hasUnknown;\n let hasBlock = true;\n let isRooted = true;\n\n if (parserInput.currentChar() !== '@') { return; }\n\n value = this['import']() || this.plugin() || this.media();\n if (value) {\n return value;\n }\n\n parserInput.save();\n\n name = parserInput.$re(/^@[a-z-]+/);\n\n if (!name) { return; }\n\n nonVendorSpecificName = name;\n if (name.charAt(1) == '-' && name.indexOf('-', 2) > 0) {\n nonVendorSpecificName = `@${name.slice(name.indexOf('-', 2) + 1)}`;\n }\n\n switch (nonVendorSpecificName) {\n case '@charset':\n hasIdentifier = true;\n hasBlock = false;\n break;\n case '@namespace':\n hasExpression = true;\n hasBlock = false;\n break;\n case '@keyframes':\n case '@counter-style':\n hasIdentifier = true;\n break;\n case '@document':\n case '@supports':\n hasUnknown = true;\n isRooted = false;\n break;\n default:\n hasUnknown = true;\n break;\n }\n\n parserInput.commentStore.length = 0;\n\n if (hasIdentifier) {\n value = this.entity();\n if (!value) {\n error(`expected ${name} identifier`);\n }\n } else if (hasExpression) {\n value = this.expression();\n if (!value) {\n error(`expected ${name} expression`);\n }\n } else if (hasUnknown) {\n value = this.permissiveValue(/^[{;]/);\n hasBlock = (parserInput.currentChar() === '{');\n if (!value) {\n if (!hasBlock && parserInput.currentChar() !== ';') {\n error(`${name} rule is missing block or ending semi-colon`);\n }\n }\n else if (!value.value) {\n value = null;\n }\n }\n\n if (hasBlock) {\n rules = this.blockRuleset();\n }\n\n if (rules || (!hasBlock && value && parserInput.$char(';'))) {\n parserInput.forget();\n return new(tree.AtRule)(name, value, rules, index, fileInfo,\n context.dumpLineNumbers ? getDebugInfo(index) : null,\n isRooted\n );\n }\n\n parserInput.restore('at-rule options not recognised');\n },\n\n //\n // A Value is a comma-delimited list of Expressions\n //\n // font-family: Baskerville, Georgia, serif;\n //\n // In a Rule, a Value represents everything after the `:`,\n // and before the `;`.\n //\n value: function () {\n let e;\n const expressions = [];\n const index = parserInput.i;\n\n do {\n e = this.expression();\n if (e) {\n expressions.push(e);\n if (!parserInput.$char(',')) { break; }\n }\n } while (e);\n\n if (expressions.length > 0) {\n return new(tree.Value)(expressions, index);\n }\n },\n important: function () {\n if (parserInput.currentChar() === '!') {\n return parserInput.$re(/^! *important/);\n }\n },\n sub: function () {\n let a;\n let e;\n\n parserInput.save();\n if (parserInput.$char('(')) {\n a = this.addition();\n if (a && parserInput.$char(')')) {\n parserInput.forget();\n e = new(tree.Expression)([a]);\n e.parens = true;\n return e;\n }\n parserInput.restore('Expected \\')\\'');\n return;\n }\n parserInput.restore();\n },\n multiplication: function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.operand();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1);\n while (true) {\n if (parserInput.peek(/^\\/[*\\/]/)) {\n break;\n }\n\n parserInput.save();\n\n op = parserInput.$char('/') || parserInput.$char('*') || parserInput.$str('./');\n\n if (!op) { parserInput.forget(); break; }\n\n a = this.operand();\n\n if (!a) { parserInput.restore(); break; }\n parserInput.forget();\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n isSpaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n addition: function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.multiplication();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1);\n while (true) {\n op = parserInput.$re(/^[-+]\\s+/) || (!isSpaced && (parserInput.$char('+') || parserInput.$char('-')));\n if (!op) {\n break;\n }\n a = this.multiplication();\n if (!a) {\n break;\n }\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n isSpaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n conditions: function () {\n let a;\n let b;\n const index = parserInput.i;\n let condition;\n\n a = this.condition(true);\n if (a) {\n while (true) {\n if (!parserInput.peek(/^,\\s*(not\\s*)?\\(/) || !parserInput.$char(',')) {\n break;\n }\n b = this.condition(true);\n if (!b) {\n break;\n }\n condition = new(tree.Condition)('or', condition || a, b, index);\n }\n return condition || a;\n }\n },\n condition: function (needsParens) {\n let result;\n let logical;\n let next;\n function or() {\n return parserInput.$str('or');\n }\n\n result = this.conditionAnd(needsParens);\n if (!result) {\n return ;\n }\n logical = or();\n if (logical) {\n next = this.condition(needsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n }\n }\n return result;\n },\n conditionAnd: function (needsParens) {\n let result;\n let logical;\n let next;\n const self = this;\n function insideCondition() {\n const cond = self.negatedCondition(needsParens) || self.parenthesisCondition(needsParens);\n if (!cond && !needsParens) {\n return self.atomicCondition(needsParens);\n }\n return cond;\n }\n function and() {\n return parserInput.$str('and');\n }\n\n result = insideCondition();\n if (!result) {\n return ;\n }\n logical = and();\n if (logical) {\n next = this.conditionAnd(needsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n }\n }\n return result;\n },\n negatedCondition: function (needsParens) {\n if (parserInput.$str('not')) {\n const result = this.parenthesisCondition(needsParens);\n if (result) {\n result.negate = !result.negate;\n }\n return result;\n }\n },\n parenthesisCondition: function (needsParens) {\n function tryConditionFollowedByParenthesis(me) {\n let body;\n parserInput.save();\n body = me.condition(needsParens);\n if (!body) {\n parserInput.restore();\n return ;\n }\n if (!parserInput.$char(')')) {\n parserInput.restore();\n return ;\n }\n parserInput.forget();\n return body;\n }\n\n let body;\n parserInput.save();\n if (!parserInput.$str('(')) {\n parserInput.restore();\n return ;\n }\n body = tryConditionFollowedByParenthesis(this);\n if (body) {\n parserInput.forget();\n return body;\n }\n\n body = this.atomicCondition(needsParens);\n if (!body) {\n parserInput.restore();\n return ;\n }\n if (!parserInput.$char(')')) {\n parserInput.restore(`expected ')' got '${parserInput.currentChar()}'`);\n return ;\n }\n parserInput.forget();\n return body;\n },\n atomicCondition: function (needsParens) {\n const entities = this.entities;\n const index = parserInput.i;\n let a;\n let b;\n let c;\n let op;\n\n function cond() {\n return this.addition() || entities.keyword() || entities.quoted() || entities.mixinLookup();\n }\n cond = cond.bind(this);\n\n a = cond();\n if (a) {\n if (parserInput.$char('>')) {\n if (parserInput.$char('=')) {\n op = '>=';\n } else {\n op = '>';\n }\n } else\n if (parserInput.$char('<')) {\n if (parserInput.$char('=')) {\n op = '<=';\n } else {\n op = '<';\n }\n } else\n if (parserInput.$char('=')) {\n if (parserInput.$char('>')) {\n op = '=>';\n } else if (parserInput.$char('<')) {\n op = '=<';\n } else {\n op = '=';\n }\n }\n if (op) {\n b = cond();\n if (b) {\n c = new(tree.Condition)(op, a, b, index, false);\n } else {\n error('expected expression');\n }\n } else {\n c = new(tree.Condition)('=', a, new(tree.Keyword)('true'), index, false);\n }\n return c;\n }\n },\n\n //\n // An operand is anything that can be part of an operation,\n // such as a Color, or a Variable\n //\n operand: function () {\n const entities = this.entities;\n let negate;\n\n if (parserInput.peek(/^-[@\\$\\(]/)) {\n negate = parserInput.$char('-');\n }\n\n let o = this.sub() || entities.dimension() ||\n entities.color() || entities.variable() ||\n entities.property() || entities.call() ||\n entities.quoted(true) || entities.colorKeyword() ||\n entities.mixinLookup();\n\n if (negate) {\n o.parensInOp = true;\n o = new(tree.Negative)(o);\n }\n\n return o;\n },\n\n //\n // Expressions either represent mathematical operations,\n // or white-space delimited Entities.\n //\n // 1px solid black\n // @var * 2\n //\n expression: function () {\n const entities = [];\n let e;\n let delim;\n const index = parserInput.i;\n\n do {\n e = this.comment();\n if (e) {\n entities.push(e);\n continue;\n }\n e = this.addition() || this.entity();\n\n if (e instanceof tree.Comment) {\n e = null;\n }\n\n if (e) {\n entities.push(e);\n // operations do not allow keyword \"/\" dimension (e.g. small/20px) so we support that here\n if (!parserInput.peek(/^\\/[\\/*]/)) {\n delim = parserInput.$char('/');\n if (delim) {\n entities.push(new(tree.Anonymous)(delim, index));\n }\n }\n }\n } while (e);\n if (entities.length > 0) {\n return new(tree.Expression)(entities);\n }\n },\n property: function () {\n const name = parserInput.$re(/^(\\*?-?[_a-zA-Z0-9-]+)\\s*:/);\n if (name) {\n return name[1];\n }\n },\n ruleProperty: function () {\n let name = [];\n const index = [];\n let s;\n let k;\n\n parserInput.save();\n\n const simpleProperty = parserInput.$re(/^([_a-zA-Z0-9-]+)\\s*:/);\n if (simpleProperty) {\n name = [new(tree.Keyword)(simpleProperty[1])];\n parserInput.forget();\n return name;\n }\n\n function match(re) {\n const i = parserInput.i;\n const chunk = parserInput.$re(re);\n if (chunk) {\n index.push(i);\n return name.push(chunk[1]);\n }\n }\n\n match(/^(\\*?)/);\n while (true) {\n if (!match(/^((?:[\\w-]+)|(?:[@\\$]\\{[\\w-]+\\}))/)) {\n break;\n }\n }\n\n if ((name.length > 1) && match(/^((?:\\+_|\\+)?)\\s*:/)) {\n parserInput.forget();\n\n // at last, we have the complete match now. move forward,\n // convert name particles to tree objects and return:\n if (name[0] === '') {\n name.shift();\n index.shift();\n }\n for (k = 0; k < name.length; k++) {\n s = name[k];\n name[k] = (s.charAt(0) !== '@' && s.charAt(0) !== '$') ?\n new(tree.Keyword)(s) :\n (s.charAt(0) === '@' ?\n new(tree.Variable)(`@${s.slice(2, -1)}`, index[k], fileInfo) :\n new(tree.Property)(`$${s.slice(2, -1)}`, index[k], fileInfo));\n }\n return name;\n }\n parserInput.restore();\n }\n }\n };\n};\nParser.serializeVars = vars => {\n let s = '';\n\n for (const name in vars) {\n if (Object.hasOwnProperty.call(vars, name)) {\n const value = vars[name];\n s += `${((name[0] === '@') ? '' : '@') + name}: ${value}${(String(value).slice(-1) === ';') ? '' : ';'}`;\n }\n }\n\n return s;\n};\n\nexport default Parser;\n","import Anonymous from '../tree/anonymous';\nimport Keyword from '../tree/keyword';\n\nfunction boolean(condition) {\n return condition ? Keyword.True : Keyword.False;\n}\n\n/**\n * Functions with evalArgs set to false are sent context\n * as the first argument.\n */\nfunction If(context, condition, trueValue, falseValue) {\n return condition.eval(context) ? trueValue.eval(context)\n : (falseValue ? falseValue.eval(context) : new Anonymous);\n}\nIf.evalArgs = false;\n\nfunction isdefined(context, variable) {\n try {\n variable.eval(context);\n return Keyword.True;\n } catch (e) {\n return Keyword.False;\n }\n}\n\nisdefined.evalArgs = false;\n\nexport default { isdefined, boolean, 'if': If };\n","import Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport Expression from '../tree/expression';\nimport Operation from '../tree/operation';\nlet colorFunctions;\n\nfunction clamp(val) {\n return Math.min(1, Math.max(0, val));\n}\nfunction hsla(origColor, hsl) {\n const color = colorFunctions.hsla(hsl.h, hsl.s, hsl.l, hsl.a);\n if (color) {\n if (origColor.value && \n /^(rgb|hsl)/.test(origColor.value)) {\n color.value = origColor.value;\n } else {\n color.value = 'rgb';\n }\n return color;\n }\n}\nfunction toHSL(color) {\n if (color.toHSL) {\n return color.toHSL();\n } else {\n throw new Error('Argument cannot be evaluated to a color');\n }\n}\n\nfunction toHSV(color) {\n if (color.toHSV) {\n return color.toHSV();\n } else {\n throw new Error('Argument cannot be evaluated to a color');\n }\n}\n\nfunction number(n) {\n if (n instanceof Dimension) {\n return parseFloat(n.unit.is('%') ? n.value / 100 : n.value);\n } else if (typeof n === 'number') {\n return n;\n } else {\n throw {\n type: 'Argument',\n message: 'color functions take numbers as parameters'\n };\n }\n}\nfunction scaled(n, size) {\n if (n instanceof Dimension && n.unit.is('%')) {\n return parseFloat(n.value * size / 100);\n } else {\n return number(n);\n }\n}\ncolorFunctions = {\n rgb: function (r, g, b) {\n let a = 1\n /**\n * Comma-less syntax\n * e.g. rgb(0 128 255 / 50%)\n */\n if (r instanceof Expression) {\n const val = r.value\n r = val[0]\n g = val[1]\n b = val[2]\n /** \n * @todo - should this be normalized in\n * function caller? Or parsed differently?\n */\n if (b instanceof Operation) {\n const op = b\n b = op.operands[0]\n a = op.operands[1]\n }\n }\n const color = colorFunctions.rgba(r, g, b, a);\n if (color) {\n color.value = 'rgb';\n return color;\n }\n },\n rgba: function (r, g, b, a) {\n try {\n if (r instanceof Color) {\n if (g) {\n a = number(g);\n } else {\n a = r.alpha;\n }\n return new Color(r.rgb, a, 'rgba');\n }\n const rgb = [r, g, b].map(c => scaled(c, 255));\n a = number(a);\n return new Color(rgb, a, 'rgba');\n }\n catch (e) {}\n },\n hsl: function (h, s, l) {\n let a = 1\n if (h instanceof Expression) {\n const val = h.value\n h = val[0]\n s = val[1]\n l = val[2]\n\n if (l instanceof Operation) {\n const op = l\n l = op.operands[0]\n a = op.operands[1]\n }\n }\n const color = colorFunctions.hsla(h, s, l, a);\n if (color) {\n color.value = 'hsl';\n return color;\n }\n },\n hsla: function (h, s, l, a) {\n try {\n if (h instanceof Color) {\n if (s) {\n a = number(s);\n } else {\n a = h.alpha;\n }\n return new Color(h.rgb, a, 'hsla');\n }\n\n let m1;\n let m2;\n\n function hue(h) {\n h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h);\n if (h * 6 < 1) {\n return m1 + (m2 - m1) * h * 6;\n }\n else if (h * 2 < 1) {\n return m2;\n }\n else if (h * 3 < 2) {\n return m1 + (m2 - m1) * (2 / 3 - h) * 6;\n }\n else {\n return m1;\n }\n }\n\n h = (number(h) % 360) / 360;\n s = clamp(number(s));l = clamp(number(l));a = clamp(number(a));\n\n m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n m1 = l * 2 - m2;\n\n const rgb = [\n hue(h + 1 / 3) * 255,\n hue(h) * 255,\n hue(h - 1 / 3) * 255\n ];\n a = number(a);\n return new Color(rgb, a, 'hsla');\n }\n catch (e) {}\n },\n\n hsv: function(h, s, v) {\n return colorFunctions.hsva(h, s, v, 1.0);\n },\n\n hsva: function(h, s, v, a) {\n h = ((number(h) % 360) / 360) * 360;\n s = number(s);v = number(v);a = number(a);\n\n let i;\n let f;\n i = Math.floor((h / 60) % 6);\n f = (h / 60) - i;\n\n const vs = [v,\n v * (1 - s),\n v * (1 - f * s),\n v * (1 - (1 - f) * s)];\n const perm = [[0, 3, 1],\n [2, 0, 1],\n [1, 0, 3],\n [1, 2, 0],\n [3, 1, 0],\n [0, 1, 2]];\n\n return colorFunctions.rgba(vs[perm[i][0]] * 255,\n vs[perm[i][1]] * 255,\n vs[perm[i][2]] * 255,\n a);\n },\n\n hue: function (color) {\n return new Dimension(toHSL(color).h);\n },\n saturation: function (color) {\n return new Dimension(toHSL(color).s * 100, '%');\n },\n lightness: function (color) {\n return new Dimension(toHSL(color).l * 100, '%');\n },\n hsvhue: function(color) {\n return new Dimension(toHSV(color).h);\n },\n hsvsaturation: function (color) {\n return new Dimension(toHSV(color).s * 100, '%');\n },\n hsvvalue: function (color) {\n return new Dimension(toHSV(color).v * 100, '%');\n },\n red: function (color) {\n return new Dimension(color.rgb[0]);\n },\n green: function (color) {\n return new Dimension(color.rgb[1]);\n },\n blue: function (color) {\n return new Dimension(color.rgb[2]);\n },\n alpha: function (color) {\n return new Dimension(toHSL(color).a);\n },\n luma: function (color) {\n return new Dimension(color.luma() * color.alpha * 100, '%');\n },\n luminance: function (color) {\n const luminance =\n (0.2126 * color.rgb[0] / 255) +\n (0.7152 * color.rgb[1] / 255) +\n (0.0722 * color.rgb[2] / 255);\n\n return new Dimension(luminance * color.alpha * 100, '%');\n },\n saturate: function (color, amount, method) {\n // filter: saturate(3.2);\n // should be kept as is, so check for color\n if (!color.rgb) {\n return null;\n }\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.s += hsl.s * amount.value / 100;\n }\n else {\n hsl.s += amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n return hsla(color, hsl);\n },\n desaturate: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.s -= hsl.s * amount.value / 100;\n }\n else {\n hsl.s -= amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n return hsla(color, hsl);\n },\n lighten: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.l += hsl.l * amount.value / 100;\n }\n else {\n hsl.l += amount.value / 100;\n }\n hsl.l = clamp(hsl.l);\n return hsla(color, hsl);\n },\n darken: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.l -= hsl.l * amount.value / 100;\n }\n else {\n hsl.l -= amount.value / 100;\n }\n hsl.l = clamp(hsl.l);\n return hsla(color, hsl);\n },\n fadein: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.a += hsl.a * amount.value / 100;\n }\n else {\n hsl.a += amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fadeout: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.a -= hsl.a * amount.value / 100;\n }\n else {\n hsl.a -= amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fade: function (color, amount) {\n const hsl = toHSL(color);\n\n hsl.a = amount.value / 100;\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n spin: function (color, amount) {\n const hsl = toHSL(color);\n const hue = (hsl.h + amount.value) % 360;\n\n hsl.h = hue < 0 ? 360 + hue : hue;\n\n return hsla(color, hsl);\n },\n //\n // Copyright (c) 2006-2009 Hampton Catlin, Natalie Weizenbaum, and Chris Eppstein\n // http://sass-lang.com\n //\n mix: function (color1, color2, weight) {\n if (!weight) {\n weight = new Dimension(50);\n }\n const p = weight.value / 100.0;\n const w = p * 2 - 1;\n const a = toHSL(color1).a - toHSL(color2).a;\n\n const w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n const w2 = 1 - w1;\n\n const rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2,\n color1.rgb[1] * w1 + color2.rgb[1] * w2,\n color1.rgb[2] * w1 + color2.rgb[2] * w2];\n\n const alpha = color1.alpha * p + color2.alpha * (1 - p);\n\n return new Color(rgb, alpha);\n },\n greyscale: function (color) {\n return colorFunctions.desaturate(color, new Dimension(100));\n },\n contrast: function (color, dark, light, threshold) {\n // filter: contrast(3.2);\n // should be kept as is, so check for color\n if (!color.rgb) {\n return null;\n }\n if (typeof light === 'undefined') {\n light = colorFunctions.rgba(255, 255, 255, 1.0);\n }\n if (typeof dark === 'undefined') {\n dark = colorFunctions.rgba(0, 0, 0, 1.0);\n }\n // Figure out which is actually light and dark:\n if (dark.luma() > light.luma()) {\n const t = light;\n light = dark;\n dark = t;\n }\n if (typeof threshold === 'undefined') {\n threshold = 0.43;\n } else {\n threshold = number(threshold);\n }\n if (color.luma() < threshold) {\n return light;\n } else {\n return dark;\n }\n },\n // Changes made in 2.7.0 - Reverted in 3.0.0\n // contrast: function (color, color1, color2, threshold) {\n // // Return which of `color1` and `color2` has the greatest contrast with `color`\n // // according to the standard WCAG contrast ratio calculation.\n // // http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n // // The threshold param is no longer used, in line with SASS.\n // // filter: contrast(3.2);\n // // should be kept as is, so check for color\n // if (!color.rgb) {\n // return null;\n // }\n // if (typeof color1 === 'undefined') {\n // color1 = colorFunctions.rgba(0, 0, 0, 1.0);\n // }\n // if (typeof color2 === 'undefined') {\n // color2 = colorFunctions.rgba(255, 255, 255, 1.0);\n // }\n // var contrast1, contrast2;\n // var luma = color.luma();\n // var luma1 = color1.luma();\n // var luma2 = color2.luma();\n // // Calculate contrast ratios for each color\n // if (luma > luma1) {\n // contrast1 = (luma + 0.05) / (luma1 + 0.05);\n // } else {\n // contrast1 = (luma1 + 0.05) / (luma + 0.05);\n // }\n // if (luma > luma2) {\n // contrast2 = (luma + 0.05) / (luma2 + 0.05);\n // } else {\n // contrast2 = (luma2 + 0.05) / (luma + 0.05);\n // }\n // if (contrast1 > contrast2) {\n // return color1;\n // } else {\n // return color2;\n // }\n // },\n argb: function (color) {\n return new Anonymous(color.toARGB());\n },\n color: function(c) {\n if ((c instanceof Quoted) &&\n (/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})$/i.test(c.value))) {\n const val = c.value.slice(1);\n return new Color(val, undefined, `#${val}`);\n }\n if ((c instanceof Color) || (c = Color.fromKeyword(c.value))) {\n c.value = undefined;\n return c;\n }\n throw {\n type: 'Argument',\n message: 'argument must be a color keyword or 3|4|6|8 digit hex e.g. #FFF'\n };\n },\n tint: function(color, amount) {\n return colorFunctions.mix(colorFunctions.rgb(255, 255, 255), color, amount);\n },\n shade: function(color, amount) {\n return colorFunctions.mix(colorFunctions.rgb(0, 0, 0), color, amount);\n }\n};\n\nexport default colorFunctions;\n","import Color from '../tree/color';\n\n// Color Blending\n// ref: http://www.w3.org/TR/compositing-1\n\nfunction colorBlend(mode, color1, color2) {\n const ab = color1.alpha; // result\n\n let // backdrop\n cb;\n\n const as = color2.alpha;\n\n let // source\n cs;\n\n let ar;\n let cr;\n const r = [];\n\n ar = as + ab * (1 - as);\n for (let i = 0; i < 3; i++) {\n cb = color1.rgb[i] / 255;\n cs = color2.rgb[i] / 255;\n cr = mode(cb, cs);\n if (ar) {\n cr = (as * cs + ab * (cb -\n as * (cb + cs - cr))) / ar;\n }\n r[i] = cr * 255;\n }\n\n return new Color(r, ar);\n}\n\nconst colorBlendModeFunctions = {\n multiply: function(cb, cs) {\n return cb * cs;\n },\n screen: function(cb, cs) {\n return cb + cs - cb * cs;\n },\n overlay: function(cb, cs) {\n cb *= 2;\n return (cb <= 1) ?\n colorBlendModeFunctions.multiply(cb, cs) :\n colorBlendModeFunctions.screen(cb - 1, cs);\n },\n softlight: function(cb, cs) {\n let d = 1;\n let e = cb;\n if (cs > 0.5) {\n e = 1;\n d = (cb > 0.25) ? Math.sqrt(cb)\n : ((16 * cb - 12) * cb + 4) * cb;\n }\n return cb - (1 - 2 * cs) * e * (d - cb);\n },\n hardlight: function(cb, cs) {\n return colorBlendModeFunctions.overlay(cs, cb);\n },\n difference: function(cb, cs) {\n return Math.abs(cb - cs);\n },\n exclusion: function(cb, cs) {\n return cb + cs - 2 * cb * cs;\n },\n\n // non-w3c functions:\n average: function(cb, cs) {\n return (cb + cs) / 2;\n },\n negation: function(cb, cs) {\n return 1 - Math.abs(cb + cs - 1);\n }\n};\n\nfor (const f in colorBlendModeFunctions) {\n if (colorBlendModeFunctions.hasOwnProperty(f)) {\n colorBlend[f] = colorBlend.bind(null, colorBlendModeFunctions[f]);\n }\n}\n\nexport default colorBlend;\n","import Comment from '../tree/comment';\nimport Node from '../tree/node';\nimport Dimension from '../tree/dimension';\nimport Declaration from '../tree/declaration';\nimport Expression from '../tree/expression';\nimport Ruleset from '../tree/ruleset';\nimport Selector from '../tree/selector';\nimport Element from '../tree/element';\nimport Quote from '../tree/quoted';\nimport Value from '../tree/value';\n\nconst getItemsFromNode = node => {\n // handle non-array values as an array of length 1\n // return 'undefined' if index is invalid\n const items = Array.isArray(node.value) ?\n node.value : Array(node);\n\n return items;\n};\n\nexport default {\n _SELF: function(n) {\n return n;\n },\n '~': function(...expr) {\n if (expr.length === 1) {\n return expr[0];\n }\n return new Value(expr);\n },\n extract: function(values, index) {\n // (1-based index)\n index = index.value - 1;\n\n return getItemsFromNode(values)[index];\n },\n length: function(values) {\n return new Dimension(getItemsFromNode(values).length);\n },\n /**\n * Creates a Less list of incremental values.\n * Modeled after Lodash's range function, also exists natively in PHP\n * \n * @param {Dimension} [start=1]\n * @param {Dimension} end - e.g. 10 or 10px - unit is added to output\n * @param {Dimension} [step=1] \n */\n range: function(start, end, step) {\n let from;\n let to;\n let stepValue = 1;\n const list = [];\n if (end) {\n to = end;\n from = start.value;\n if (step) {\n stepValue = step.value;\n }\n }\n else {\n from = 1;\n to = start;\n }\n\n for (let i = from; i <= to.value; i += stepValue) {\n list.push(new Dimension(i, to.unit));\n }\n\n return new Expression(list);\n },\n each: function(list, rs) {\n const rules = [];\n let newRules;\n let iterator;\n\n const tryEval = val => {\n if (val instanceof Node) {\n return val.eval(this.context);\n }\n return val;\n };\n\n if (list.value && !(list instanceof Quote)) {\n if (Array.isArray(list.value)) {\n iterator = list.value.map(tryEval);\n } else {\n iterator = [tryEval(list.value)];\n }\n } else if (list.ruleset) {\n iterator = tryEval(list.ruleset).rules;\n } else if (list.rules) {\n iterator = list.rules.map(tryEval);\n } else if (Array.isArray(list)) {\n iterator = list.map(tryEval);\n } else {\n iterator = [tryEval(list)];\n }\n\n let valueName = '@value';\n let keyName = '@key';\n let indexName = '@index';\n\n if (rs.params) {\n valueName = rs.params[0] && rs.params[0].name;\n keyName = rs.params[1] && rs.params[1].name;\n indexName = rs.params[2] && rs.params[2].name;\n rs = rs.rules;\n } else {\n rs = rs.ruleset;\n }\n\n for (let i = 0; i < iterator.length; i++) {\n let key;\n let value;\n const item = iterator[i];\n if (item instanceof Declaration) {\n key = typeof item.name === 'string' ? item.name : item.name[0].value;\n value = item.value;\n } else {\n key = new Dimension(i + 1);\n value = item;\n }\n\n if (item instanceof Comment) {\n continue;\n }\n\n newRules = rs.rules.slice(0);\n if (valueName) {\n newRules.push(new Declaration(valueName,\n value,\n false, false, this.index, this.currentFileInfo));\n }\n if (indexName) {\n newRules.push(new Declaration(indexName,\n new Dimension(i + 1),\n false, false, this.index, this.currentFileInfo));\n }\n if (keyName) {\n newRules.push(new Declaration(keyName,\n key,\n false, false, this.index, this.currentFileInfo));\n }\n\n rules.push(new Ruleset([ new(Selector)([ new Element(\"\", '&') ]) ],\n newRules,\n rs.strictImports,\n rs.visibilityInfo()\n ));\n }\n\n return new Ruleset([ new(Selector)([ new Element(\"\", '&') ]) ],\n rules,\n rs.strictImports,\n rs.visibilityInfo()\n ).eval(this.context);\n }\n};\n","import Dimension from '../tree/dimension';\n\nconst MathHelper = (fn, unit, n) => {\n if (!(n instanceof Dimension)) {\n throw { type: 'Argument', message: 'argument must be a number' };\n }\n if (unit == null) {\n unit = n.unit;\n } else {\n n = n.unify();\n }\n return new Dimension(fn(parseFloat(n.value)), unit);\n};\n\nexport default MathHelper;","import mathHelper from './math-helper.js';\n\nconst mathFunctions = {\n // name, unit\n ceil: null,\n floor: null,\n sqrt: null,\n abs: null,\n tan: '',\n sin: '',\n cos: '',\n atan: 'rad',\n asin: 'rad',\n acos: 'rad'\n};\n\nfor (const f in mathFunctions) {\n if (mathFunctions.hasOwnProperty(f)) {\n mathFunctions[f] = mathHelper.bind(null, Math[f], mathFunctions[f]);\n }\n}\n\nmathFunctions.round = (n, f) => {\n const fraction = typeof f === 'undefined' ? 0 : f.value;\n return mathHelper(num => num.toFixed(fraction), null, n);\n};\n\nexport default mathFunctions;\n","import Dimension from '../tree/dimension';\nimport Anonymous from '../tree/anonymous';\nimport mathHelper from './math-helper.js';\n\nconst minMax = function (isMin, args) {\n args = Array.prototype.slice.call(args);\n switch (args.length) {\n case 0: throw { type: 'Argument', message: 'one or more arguments required' };\n }\n let i; // key is the unit.toString() for unified Dimension values,\n let j;\n let current;\n let currentUnified;\n let referenceUnified;\n let unit;\n let unitStatic;\n let unitClone;\n\n const // elems only contains original argument values.\n order = [];\n\n const values = {};\n // value is the index into the order array.\n for (i = 0; i < args.length; i++) {\n current = args[i];\n if (!(current instanceof Dimension)) {\n if (Array.isArray(args[i].value)) {\n Array.prototype.push.apply(args, Array.prototype.slice.call(args[i].value));\n }\n continue;\n }\n currentUnified = current.unit.toString() === '' && unitClone !== undefined ? new Dimension(current.value, unitClone).unify() : current.unify();\n unit = currentUnified.unit.toString() === '' && unitStatic !== undefined ? unitStatic : currentUnified.unit.toString();\n unitStatic = unit !== '' && unitStatic === undefined || unit !== '' && order[0].unify().unit.toString() === '' ? unit : unitStatic;\n unitClone = unit !== '' && unitClone === undefined ? current.unit.toString() : unitClone;\n j = values[''] !== undefined && unit !== '' && unit === unitStatic ? values[''] : values[unit];\n if (j === undefined) {\n if (unitStatic !== undefined && unit !== unitStatic) {\n throw { type: 'Argument', message: 'incompatible types' };\n }\n values[unit] = order.length;\n order.push(current);\n continue;\n }\n referenceUnified = order[j].unit.toString() === '' && unitClone !== undefined ? new Dimension(order[j].value, unitClone).unify() : order[j].unify();\n if ( isMin && currentUnified.value < referenceUnified.value ||\n !isMin && currentUnified.value > referenceUnified.value) {\n order[j] = current;\n }\n }\n if (order.length == 1) {\n return order[0];\n }\n args = order.map(function (a) { return a.toCSS(this.context); }).join(this.context.compress ? ',' : ', ');\n return new Anonymous(`${isMin ? 'min' : 'max'}(${args})`);\n};\n\nexport default {\n min: function(...args) {\n try {\n return minMax(true, args);\n } catch (e) {}\n },\n max: function(...args) {\n try {\n return minMax(false, args);\n } catch (e) {}\n },\n convert: function (val, unit) {\n return val.convertTo(unit.value);\n },\n pi: function () {\n return new Dimension(Math.PI);\n },\n mod: function(a, b) {\n return new Dimension(a.value % b.value, a.unit);\n },\n pow: function(x, y) {\n if (typeof x === 'number' && typeof y === 'number') {\n x = new Dimension(x);\n y = new Dimension(y);\n } else if (!(x instanceof Dimension) || !(y instanceof Dimension)) {\n throw { type: 'Argument', message: 'arguments must be numbers' };\n }\n\n return new Dimension(Math.pow(x.value, y.value), x.unit);\n },\n percentage: function (n) {\n const result = mathHelper(num => num * 100, '%', n);\n\n return result;\n }\n};\n","import Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport JavaScript from '../tree/javascript';\n\nexport default {\n e: function (str) {\n return new Quoted('\"', str instanceof JavaScript ? str.evaluated : str.value, true);\n },\n escape: function (str) {\n return new Anonymous(\n encodeURI(str.value).replace(/=/g, '%3D').replace(/:/g, '%3A').replace(/#/g, '%23').replace(/;/g, '%3B')\n .replace(/\\(/g, '%28').replace(/\\)/g, '%29'));\n },\n replace: function (string, pattern, replacement, flags) {\n let result = string.value;\n replacement = (replacement.type === 'Quoted') ?\n replacement.value : replacement.toCSS();\n result = result.replace(new RegExp(pattern.value, flags ? flags.value : ''), replacement);\n return new Quoted(string.quote || '', result, string.escaped);\n },\n '%': function (string /* arg, arg, ... */) {\n const args = Array.prototype.slice.call(arguments, 1);\n let result = string.value;\n\n for (let i = 0; i < args.length; i++) {\n /* jshint loopfunc:true */\n result = result.replace(/%[sda]/i, token => {\n const value = ((args[i].type === 'Quoted') &&\n token.match(/s/i)) ? args[i].value : args[i].toCSS();\n return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value;\n });\n }\n result = result.replace(/%%/g, '%');\n return new Quoted(string.quote || '', result, string.escaped);\n }\n};\n","import Keyword from '../tree/keyword';\nimport DetachedRuleset from '../tree/detached-ruleset';\nimport Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport URL from '../tree/url';\nimport Operation from '../tree/operation';\n\nconst isa = (n, Type) => (n instanceof Type) ? Keyword.True : Keyword.False;\nconst isunit = (n, unit) => {\n if (unit === undefined) {\n throw { type: 'Argument', message: 'missing the required second argument to isunit.' };\n }\n unit = typeof unit.value === 'string' ? unit.value : unit;\n if (typeof unit !== 'string') {\n throw { type: 'Argument', message: 'Second argument to isunit should be a unit or a string.' };\n }\n return (n instanceof Dimension) && n.unit.is(unit) ? Keyword.True : Keyword.False;\n};\n\nexport default {\n isruleset: function (n) {\n return isa(n, DetachedRuleset);\n },\n iscolor: function (n) {\n return isa(n, Color);\n },\n isnumber: function (n) {\n return isa(n, Dimension);\n },\n isstring: function (n) {\n return isa(n, Quoted);\n },\n iskeyword: function (n) {\n return isa(n, Keyword);\n },\n isurl: function (n) {\n return isa(n, URL);\n },\n ispixel: function (n) {\n return isunit(n, 'px');\n },\n ispercentage: function (n) {\n return isunit(n, '%');\n },\n isem: function (n) {\n return isunit(n, 'em');\n },\n isunit,\n unit: function (val, unit) {\n if (!(val instanceof Dimension)) {\n throw { type: 'Argument',\n message: `the first argument to unit must be a number${val instanceof Operation ? '. Have you forgotten parenthesis?' : ''}` };\n }\n if (unit) {\n if (unit instanceof Keyword) {\n unit = unit.value;\n } else {\n unit = unit.toCSS();\n }\n } else {\n unit = '';\n }\n return new Dimension(val.value, unit);\n },\n 'get-unit': function (n) {\n return new Anonymous(n.unit);\n }\n};\n","import functionRegistry from './function-registry';\nimport functionCaller from './function-caller';\n\nimport boolean from './boolean';\nimport defaultFunc from './default';\nimport color from './color';\nimport colorBlending from './color-blending';\nimport dataUri from './data-uri';\nimport list from './list';\nimport math from './math';\nimport number from './number';\nimport string from './string';\nimport svg from './svg';\nimport types from './types';\n\nexport default environment => {\n const functions = { functionRegistry, functionCaller };\n\n // register functions\n functionRegistry.addMultiple(boolean);\n functionRegistry.add('default', defaultFunc.eval.bind(defaultFunc));\n functionRegistry.addMultiple(color);\n functionRegistry.addMultiple(colorBlending);\n functionRegistry.addMultiple(dataUri(environment));\n functionRegistry.addMultiple(list);\n functionRegistry.addMultiple(math);\n functionRegistry.addMultiple(number);\n functionRegistry.addMultiple(string);\n functionRegistry.addMultiple(svg(environment));\n functionRegistry.addMultiple(types);\n\n return functions;\n};\n","import Quoted from '../tree/quoted';\nimport URL from '../tree/url';\nimport * as utils from '../utils';\nimport logger from '../logger';\n\nexport default environment => {\n \n const fallback = (functionThis, node) => new URL(node, functionThis.index, functionThis.currentFileInfo).eval(functionThis.context); \n\n return { 'data-uri': function(mimetypeNode, filePathNode) {\n\n if (!filePathNode) {\n filePathNode = mimetypeNode;\n mimetypeNode = null;\n }\n\n let mimetype = mimetypeNode && mimetypeNode.value;\n let filePath = filePathNode.value;\n const currentFileInfo = this.currentFileInfo;\n const currentDirectory = currentFileInfo.rewriteUrls ?\n currentFileInfo.currentDirectory : currentFileInfo.entryPath;\n\n const fragmentStart = filePath.indexOf('#');\n let fragment = '';\n if (fragmentStart !== -1) {\n fragment = filePath.slice(fragmentStart);\n filePath = filePath.slice(0, fragmentStart);\n }\n const context = utils.clone(this.context);\n context.rawBuffer = true;\n\n const fileManager = environment.getFileManager(filePath, currentDirectory, context, environment, true);\n\n if (!fileManager) {\n return fallback(this, filePathNode);\n }\n\n let useBase64 = false;\n\n // detect the mimetype if not given\n if (!mimetypeNode) {\n\n mimetype = environment.mimeLookup(filePath);\n\n if (mimetype === 'image/svg+xml') {\n useBase64 = false;\n } else {\n // use base 64 unless it's an ASCII or UTF-8 format\n const charset = environment.charsetLookup(mimetype);\n useBase64 = ['US-ASCII', 'UTF-8'].indexOf(charset) < 0;\n }\n if (useBase64) { mimetype += ';base64'; }\n }\n else {\n useBase64 = /;base64$/.test(mimetype);\n }\n\n const fileSync = fileManager.loadFileSync(filePath, currentDirectory, context, environment);\n if (!fileSync.contents) {\n logger.warn(`Skipped data-uri embedding of ${filePath} because file not found`);\n return fallback(this, filePathNode || mimetypeNode);\n }\n let buf = fileSync.contents;\n if (useBase64 && !environment.encodeBase64) {\n return fallback(this, filePathNode);\n }\n\n buf = useBase64 ? environment.encodeBase64(buf) : encodeURIComponent(buf);\n\n const uri = `data:${mimetype},${buf}${fragment}`;\n\n return new URL(new Quoted(`\"${uri}\"`, uri, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n }};\n};\n","import Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Expression from '../tree/expression';\nimport Quoted from '../tree/quoted';\nimport URL from '../tree/url';\n\nexport default environment => {\n return { 'svg-gradient': function(direction) {\n let stops;\n let gradientDirectionSvg;\n let gradientType = 'linear';\n let rectangleDimension = 'x=\"0\" y=\"0\" width=\"1\" height=\"1\"';\n const renderEnv = {compress: false};\n let returner;\n const directionValue = direction.toCSS(renderEnv);\n let i;\n let color;\n let position;\n let positionValue;\n let alpha;\n\n function throwArgumentDescriptor() {\n throw { type: 'Argument',\n message: 'svg-gradient expects direction, start_color [start_position], [color position,]...,' +\n ' end_color [end_position] or direction, color list' };\n }\n\n if (arguments.length == 2) {\n if (arguments[1].value.length < 2) {\n throwArgumentDescriptor();\n }\n stops = arguments[1].value;\n } else if (arguments.length < 3) {\n throwArgumentDescriptor();\n } else {\n stops = Array.prototype.slice.call(arguments, 1);\n }\n\n switch (directionValue) {\n case 'to bottom':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\"';\n break;\n case 'to right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'to bottom right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\"';\n break;\n case 'to top right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"100%\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'ellipse':\n case 'ellipse at center':\n gradientType = 'radial';\n gradientDirectionSvg = 'cx=\"50%\" cy=\"50%\" r=\"75%\"';\n rectangleDimension = 'x=\"-50\" y=\"-50\" width=\"101\" height=\"101\"';\n break;\n default:\n throw { type: 'Argument', message: 'svg-gradient direction must be \\'to bottom\\', \\'to right\\',' +\n ' \\'to bottom right\\', \\'to top right\\' or \\'ellipse at center\\'' };\n }\n returner = `<${gradientType}Gradient id=\"g\" ${gradientDirectionSvg}>`;\n\n for (i = 0; i < stops.length; i += 1) {\n if (stops[i] instanceof Expression) {\n color = stops[i].value[0];\n position = stops[i].value[1];\n } else {\n color = stops[i];\n position = undefined;\n }\n\n if (!(color instanceof Color) || (!((i === 0 || i + 1 === stops.length) && position === undefined) && !(position instanceof Dimension))) {\n throwArgumentDescriptor();\n }\n positionValue = position ? position.toCSS(renderEnv) : i === 0 ? '0%' : '100%';\n alpha = color.alpha;\n returner += ``;\n }\n returner += ``;\n\n returner = encodeURIComponent(returner);\n\n returner = `data:image/svg+xml,${returner}`;\n return new URL(new Quoted(`'${returner}'`, returner, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n }};\n};\n","import contexts from './contexts';\nimport visitor from './visitors';\nimport tree from './tree';\n\nexport default function(root, options) {\n options = options || {};\n let evaldRoot;\n let variables = options.variables;\n const evalEnv = new contexts.Eval(options);\n\n //\n // Allows setting variables with a hash, so:\n //\n // `{ color: new tree.Color('#f01') }` will become:\n //\n // new tree.Declaration('@color',\n // new tree.Value([\n // new tree.Expression([\n // new tree.Color('#f01')\n // ])\n // ])\n // )\n //\n if (typeof variables === 'object' && !Array.isArray(variables)) {\n variables = Object.keys(variables).map(function (k) {\n let value = variables[k];\n\n if (!(value instanceof tree.Value)) {\n if (!(value instanceof tree.Expression)) {\n value = new tree.Expression([value]);\n }\n value = new tree.Value([value]);\n }\n return new tree.Declaration(`@${k}`, value, false, null, 0);\n });\n evalEnv.frames = [new tree.Ruleset(null, variables)];\n }\n\n const visitors = [\n new visitor.JoinSelectorVisitor(),\n new visitor.MarkVisibleSelectorsVisitor(true),\n new visitor.ExtendVisitor(),\n new visitor.ToCSSVisitor({compress: Boolean(options.compress)})\n ];\n\n const preEvalVisitors = [];\n let v;\n let visitorIterator;\n\n /**\n * first() / get() allows visitors to be added while visiting\n * \n * @todo Add scoping for visitors just like functions for @plugin; right now they're global\n */\n if (options.pluginManager) {\n visitorIterator = options.pluginManager.visitor();\n for (var i = 0; i < 2; i++) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (v.isPreEvalVisitor) {\n if (i === 0 || preEvalVisitors.indexOf(v) === -1) {\n preEvalVisitors.push(v);\n v.run(root);\n }\n }\n else {\n if (i === 0 || visitors.indexOf(v) === -1) {\n if (v.isPreVisitor) {\n visitors.unshift(v);\n }\n else {\n visitors.push(v);\n }\n }\n }\n }\n }\n }\n\n evaldRoot = root.eval(evalEnv);\n\n for (var i = 0; i < visitors.length; i++) {\n visitors[i].run(evaldRoot);\n }\n\n // Run any remaining visitors added after eval pass\n if (options.pluginManager) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (visitors.indexOf(v) === -1 && preEvalVisitors.indexOf(v) === -1) {\n v.run(evaldRoot);\n }\n }\n }\n\n return evaldRoot;\n};\n","/**\n * Plugin Manager\n */\nclass PluginManager {\n constructor(less) {\n this.less = less;\n this.visitors = [];\n this.preProcessors = [];\n this.postProcessors = [];\n this.installedPlugins = [];\n this.fileManagers = [];\n this.iterator = -1;\n this.pluginCache = {};\n this.Loader = new less.PluginLoader(less);\n }\n\n /**\n * Adds all the plugins in the array\n * @param {Array} plugins\n */\n addPlugins(plugins) {\n if (plugins) {\n for (let i = 0; i < plugins.length; i++) {\n this.addPlugin(plugins[i]);\n }\n }\n }\n\n /**\n *\n * @param plugin\n * @param {String} filename\n */\n addPlugin(plugin, filename, functionRegistry) {\n this.installedPlugins.push(plugin);\n if (filename) {\n this.pluginCache[filename] = plugin;\n }\n if (plugin.install) {\n plugin.install(this.less, this, functionRegistry || this.less.functions.functionRegistry);\n }\n }\n\n /**\n *\n * @param filename\n */\n get(filename) {\n return this.pluginCache[filename];\n }\n\n /**\n * Adds a visitor. The visitor object has options on itself to determine\n * when it should run.\n * @param visitor\n */\n addVisitor(visitor) {\n this.visitors.push(visitor);\n }\n\n /**\n * Adds a pre processor object\n * @param {object} preProcessor\n * @param {number} priority - guidelines 1 = before import, 1000 = import, 2000 = after import\n */\n addPreProcessor(preProcessor, priority) {\n let indexToInsertAt;\n for (indexToInsertAt = 0; indexToInsertAt < this.preProcessors.length; indexToInsertAt++) {\n if (this.preProcessors[indexToInsertAt].priority >= priority) {\n break;\n }\n }\n this.preProcessors.splice(indexToInsertAt, 0, {preProcessor, priority});\n }\n\n /**\n * Adds a post processor object\n * @param {object} postProcessor\n * @param {number} priority - guidelines 1 = before compression, 1000 = compression, 2000 = after compression\n */\n addPostProcessor(postProcessor, priority) {\n let indexToInsertAt;\n for (indexToInsertAt = 0; indexToInsertAt < this.postProcessors.length; indexToInsertAt++) {\n if (this.postProcessors[indexToInsertAt].priority >= priority) {\n break;\n }\n }\n this.postProcessors.splice(indexToInsertAt, 0, {postProcessor, priority});\n }\n\n /**\n *\n * @param manager\n */\n addFileManager(manager) {\n this.fileManagers.push(manager);\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getPreProcessors() {\n const preProcessors = [];\n for (let i = 0; i < this.preProcessors.length; i++) {\n preProcessors.push(this.preProcessors[i].preProcessor);\n }\n return preProcessors;\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getPostProcessors() {\n const postProcessors = [];\n for (let i = 0; i < this.postProcessors.length; i++) {\n postProcessors.push(this.postProcessors[i].postProcessor);\n }\n return postProcessors;\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getVisitors() {\n return this.visitors;\n }\n\n visitor() {\n const self = this;\n return {\n first: function() {\n self.iterator = -1;\n return self.visitors[self.iterator];\n },\n get: function() {\n self.iterator += 1;\n return self.visitors[self.iterator];\n }\n };\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getFileManagers() {\n return this.fileManagers;\n }\n}\n\nlet pm;\n\nconst PluginManagerFactory = function(less, newFactory) {\n if (newFactory || !pm) {\n pm = new PluginManager(less);\n }\n return pm;\n};\n\n//\nexport default PluginManagerFactory;\n","/* global window, XMLHttpRequest */\n\nimport AbstractFileManager from '../less/environment/abstract-file-manager.js';\n\nlet options;\nlet logger;\nlet fileCache = {};\n\n// TODOS - move log somewhere. pathDiff and doing something similar in node. use pathDiff in the other browser file for the initial load\nconst FileManager = function() {}\nFileManager.prototype = Object.assign(new AbstractFileManager(), {\n alwaysMakePathsAbsolute() {\n return true;\n },\n\n join(basePath, laterPath) {\n if (!basePath) {\n return laterPath;\n }\n return this.extractUrlParts(laterPath, basePath).path;\n },\n\n doXHR(url, type, callback, errback) {\n const xhr = new XMLHttpRequest();\n const async = options.isFileProtocol ? options.fileAsync : true;\n\n if (typeof xhr.overrideMimeType === 'function') {\n xhr.overrideMimeType('text/css');\n }\n logger.debug(`XHR: Getting '${url}'`);\n xhr.open('GET', url, async);\n xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5');\n xhr.send(null);\n\n function handleResponse(xhr, callback, errback) {\n if (xhr.status >= 200 && xhr.status < 300) {\n callback(xhr.responseText,\n xhr.getResponseHeader('Last-Modified'));\n } else if (typeof errback === 'function') {\n errback(xhr.status, url);\n }\n }\n\n if (options.isFileProtocol && !options.fileAsync) {\n if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) {\n callback(xhr.responseText);\n } else {\n errback(xhr.status, url);\n }\n } else if (async) {\n xhr.onreadystatechange = () => {\n if (xhr.readyState == 4) {\n handleResponse(xhr, callback, errback);\n }\n };\n } else {\n handleResponse(xhr, callback, errback);\n }\n },\n\n supports() {\n return true;\n },\n\n clearFileCache() {\n fileCache = {};\n },\n\n loadFile(filename, currentDirectory, options, environment) {\n // TODO: Add prefix support like less-node?\n // What about multiple paths?\n\n if (currentDirectory && !this.isPathAbsolute(filename)) {\n filename = currentDirectory + filename;\n }\n\n filename = options.ext ? this.tryAppendExtension(filename, options.ext) : filename;\n\n options = options || {};\n\n // sheet may be set to the stylesheet for the initial load or a collection of properties including\n // some context variables for imports\n const hrefParts = this.extractUrlParts(filename, window.location.href);\n const href = hrefParts.url;\n const self = this;\n \n return new Promise((resolve, reject) => {\n if (options.useFileCache && fileCache[href]) {\n try {\n const lessText = fileCache[href];\n return resolve({ contents: lessText, filename: href, webInfo: { lastModified: new Date() }});\n } catch (e) {\n return reject({ filename: href, message: `Error loading file ${href} error was ${e.message}` });\n }\n }\n\n self.doXHR(href, options.mime, function doXHRCallback(data, lastModified) {\n // per file cache\n fileCache[href] = data;\n\n // Use remote copy (re-parse)\n resolve({ contents: data, filename: href, webInfo: { lastModified }});\n }, function doXHRError(status, url) {\n reject({ type: 'File', message: `'${url}' wasn't found (${status})`, href });\n });\n });\n }\n});\n\nexport default (opts, log) => {\n options = opts;\n logger = log;\n return FileManager;\n}\n","import Environment from './environment/environment';\nimport data from './data';\nimport tree from './tree';\nimport AbstractFileManager from './environment/abstract-file-manager';\nimport AbstractPluginLoader from './environment/abstract-plugin-loader';\nimport visitors from './visitors';\nimport Parser from './parser/parser';\nimport functions from './functions';\nimport contexts from './contexts';\nimport LessError from './less-error';\nimport transformTree from './transform-tree';\nimport * as utils from './utils';\nimport PluginManager from './plugin-manager';\nimport logger from './logger';\nimport SourceMapOutput from './source-map-output';\nimport SourceMapBuilder from './source-map-builder';\nimport ParseTree from './parse-tree';\nimport ImportManager from './import-manager';\nimport Parse from './parse';\nimport Render from './render';\n\nexport default function(environment, fileManagers) {\n let sourceMapOutput, sourceMapBuilder, parseTree, importManager;\n\n environment = new Environment(environment, fileManagers);\n sourceMapOutput = SourceMapOutput(environment);\n sourceMapBuilder = SourceMapBuilder(sourceMapOutput, environment);\n parseTree = ParseTree(sourceMapBuilder);\n importManager = ImportManager(environment);\n\n const render = Render(environment, parseTree, importManager);\n const parse = Parse(environment, parseTree, importManager);\n\n const initial = {\n version: [4, 0, 0],\n data,\n tree,\n Environment,\n AbstractFileManager,\n AbstractPluginLoader,\n environment,\n visitors,\n Parser,\n functions: functions(environment),\n contexts,\n SourceMapOutput: sourceMapOutput,\n SourceMapBuilder: sourceMapBuilder,\n ParseTree: parseTree,\n ImportManager: importManager,\n render,\n parse,\n LessError,\n transformTree,\n utils,\n PluginManager,\n logger\n };\n\n // Create a public API\n\n const ctor = function(t) {\n return function() {\n const obj = Object.create(t.prototype);\n t.apply(obj, Array.prototype.slice.call(arguments, 0));\n return obj;\n };\n };\n let t;\n const api = Object.create(initial);\n for (const n in initial.tree) {\n /* eslint guard-for-in: 0 */\n t = initial.tree[n];\n if (typeof t === 'function') {\n api[n.toLowerCase()] = ctor(t);\n }\n else {\n api[n] = Object.create(null);\n for (const o in t) {\n /* eslint guard-for-in: 0 */\n api[n][o.toLowerCase()] = ctor(t[o]);\n }\n }\n }\n\n /**\n * Some of the functions assume a `this` context of the API object,\n * which causes it to fail when wrapped for ES6 imports.\n * \n * An assumed `this` should be removed in the future.\n */\n initial.parse = initial.parse.bind(api);\n initial.render = initial.render.bind(api);\n\n return api;\n};\n","import LessError from './less-error';\nimport transformTree from './transform-tree';\nimport logger from './logger';\n\nexport default function(SourceMapBuilder) {\n class ParseTree {\n constructor(root, imports) {\n this.root = root;\n this.imports = imports;\n }\n\n toCSS(options) {\n let evaldRoot;\n const result = {};\n let sourceMapBuilder;\n try {\n evaldRoot = transformTree(this.root, options);\n } catch (e) {\n throw new LessError(e, this.imports);\n }\n\n try {\n const compress = Boolean(options.compress);\n if (compress) {\n logger.warn('The compress option has been deprecated. ' + \n 'We recommend you use a dedicated css minifier, for instance see less-plugin-clean-css.');\n }\n\n const toCSSOptions = {\n compress,\n dumpLineNumbers: options.dumpLineNumbers,\n strictUnits: Boolean(options.strictUnits),\n numPrecision: 8};\n\n if (options.sourceMap) {\n sourceMapBuilder = new SourceMapBuilder(options.sourceMap);\n result.css = sourceMapBuilder.toCSS(evaldRoot, toCSSOptions, this.imports);\n } else {\n result.css = evaldRoot.toCSS(toCSSOptions);\n }\n } catch (e) {\n throw new LessError(e, this.imports);\n }\n\n if (options.pluginManager) {\n const postProcessors = options.pluginManager.getPostProcessors();\n for (let i = 0; i < postProcessors.length; i++) {\n result.css = postProcessors[i].process(result.css, { sourceMap: sourceMapBuilder, options, imports: this.imports });\n }\n }\n if (options.sourceMap) {\n result.map = sourceMapBuilder.getExternalSourceMap();\n }\n\n result.imports = [];\n for (const file in this.imports.files) {\n if (this.imports.files.hasOwnProperty(file) && file !== this.imports.rootFilename) {\n result.imports.push(file);\n }\n }\n return result;\n }\n }\n\n return ParseTree;\n};\n","export default function (SourceMapOutput, environment) {\n class SourceMapBuilder {\n constructor(options) {\n this.options = options;\n }\n\n toCSS(rootNode, options, imports) {\n const sourceMapOutput = new SourceMapOutput(\n {\n contentsIgnoredCharsMap: imports.contentsIgnoredChars,\n rootNode,\n contentsMap: imports.contents,\n sourceMapFilename: this.options.sourceMapFilename,\n sourceMapURL: this.options.sourceMapURL,\n outputFilename: this.options.sourceMapOutputFilename,\n sourceMapBasepath: this.options.sourceMapBasepath,\n sourceMapRootpath: this.options.sourceMapRootpath,\n outputSourceFiles: this.options.outputSourceFiles,\n sourceMapGenerator: this.options.sourceMapGenerator,\n sourceMapFileInline: this.options.sourceMapFileInline, \n disableSourcemapAnnotation: this.options.disableSourcemapAnnotation\n });\n\n const css = sourceMapOutput.toCSS(options);\n this.sourceMap = sourceMapOutput.sourceMap;\n this.sourceMapURL = sourceMapOutput.sourceMapURL;\n if (this.options.sourceMapInputFilename) {\n this.sourceMapInputFilename = sourceMapOutput.normalizeFilename(this.options.sourceMapInputFilename);\n }\n if (this.options.sourceMapBasepath !== undefined && this.sourceMapURL !== undefined) {\n this.sourceMapURL = sourceMapOutput.removeBasepath(this.sourceMapURL);\n }\n return css + this.getCSSAppendage();\n }\n\n getCSSAppendage() {\n\n let sourceMapURL = this.sourceMapURL;\n if (this.options.sourceMapFileInline) {\n if (this.sourceMap === undefined) {\n return '';\n }\n sourceMapURL = `data:application/json;base64,${environment.encodeBase64(this.sourceMap)}`;\n }\n\n if (this.options.disableSourcemapAnnotation) {\n return '';\n }\n\n if (sourceMapURL) {\n return `/*# sourceMappingURL=${sourceMapURL} */`;\n }\n return '';\n }\n\n getExternalSourceMap() {\n return this.sourceMap;\n }\n\n setExternalSourceMap(sourceMap) {\n this.sourceMap = sourceMap;\n }\n\n isInline() {\n return this.options.sourceMapFileInline;\n }\n\n getSourceMapURL() {\n return this.sourceMapURL;\n }\n\n getOutputFilename() {\n return this.options.sourceMapOutputFilename;\n }\n\n getInputFilename() {\n return this.sourceMapInputFilename;\n }\n }\n\n return SourceMapBuilder;\n};\n","export default function (environment) {\n class SourceMapOutput {\n constructor(options) {\n this._css = [];\n this._rootNode = options.rootNode;\n this._contentsMap = options.contentsMap;\n this._contentsIgnoredCharsMap = options.contentsIgnoredCharsMap;\n if (options.sourceMapFilename) {\n this._sourceMapFilename = options.sourceMapFilename.replace(/\\\\/g, '/');\n }\n this._outputFilename = options.outputFilename;\n this.sourceMapURL = options.sourceMapURL;\n if (options.sourceMapBasepath) {\n this._sourceMapBasepath = options.sourceMapBasepath.replace(/\\\\/g, '/');\n }\n if (options.sourceMapRootpath) {\n this._sourceMapRootpath = options.sourceMapRootpath.replace(/\\\\/g, '/');\n if (this._sourceMapRootpath.charAt(this._sourceMapRootpath.length - 1) !== '/') {\n this._sourceMapRootpath += '/';\n }\n } else {\n this._sourceMapRootpath = '';\n }\n this._outputSourceFiles = options.outputSourceFiles;\n this._sourceMapGeneratorConstructor = environment.getSourceMapGenerator();\n\n this._lineNumber = 0;\n this._column = 0;\n }\n\n removeBasepath(path) {\n if (this._sourceMapBasepath && path.indexOf(this._sourceMapBasepath) === 0) {\n path = path.substring(this._sourceMapBasepath.length);\n if (path.charAt(0) === '\\\\' || path.charAt(0) === '/') {\n path = path.substring(1);\n }\n }\n\n return path;\n }\n\n normalizeFilename(filename) {\n filename = filename.replace(/\\\\/g, '/');\n filename = this.removeBasepath(filename);\n return (this._sourceMapRootpath || '') + filename;\n }\n\n add(chunk, fileInfo, index, mapLines) {\n\n // ignore adding empty strings\n if (!chunk) {\n return;\n }\n\n let lines, sourceLines, columns, sourceColumns, i;\n\n if (fileInfo && fileInfo.filename) {\n let inputSource = this._contentsMap[fileInfo.filename];\n\n // remove vars/banner added to the top of the file\n if (this._contentsIgnoredCharsMap[fileInfo.filename]) {\n // adjust the index\n index -= this._contentsIgnoredCharsMap[fileInfo.filename];\n if (index < 0) { index = 0; }\n // adjust the source\n inputSource = inputSource.slice(this._contentsIgnoredCharsMap[fileInfo.filename]);\n }\n\n /** \n * ignore empty content, or failsafe\n * if contents map is incorrect\n */\n if (inputSource === undefined) {\n this._css.push(chunk);\n return;\n }\n\n inputSource = inputSource.substring(0, index);\n sourceLines = inputSource.split('\\n');\n sourceColumns = sourceLines[sourceLines.length - 1];\n }\n\n lines = chunk.split('\\n');\n columns = lines[lines.length - 1];\n\n if (fileInfo && fileInfo.filename) {\n if (!mapLines) {\n this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + 1, column: this._column},\n original: { line: sourceLines.length, column: sourceColumns.length},\n source: this.normalizeFilename(fileInfo.filename)});\n } else {\n for (i = 0; i < lines.length; i++) {\n this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + i + 1, column: i === 0 ? this._column : 0},\n original: { line: sourceLines.length + i, column: i === 0 ? sourceColumns.length : 0},\n source: this.normalizeFilename(fileInfo.filename)});\n }\n }\n }\n\n if (lines.length === 1) {\n this._column += columns.length;\n } else {\n this._lineNumber += lines.length - 1;\n this._column = columns.length;\n }\n\n this._css.push(chunk);\n }\n\n isEmpty() {\n return this._css.length === 0;\n }\n\n toCSS(context) {\n this._sourceMapGenerator = new this._sourceMapGeneratorConstructor({ file: this._outputFilename, sourceRoot: null });\n\n if (this._outputSourceFiles) {\n for (const filename in this._contentsMap) {\n if (this._contentsMap.hasOwnProperty(filename)) {\n let source = this._contentsMap[filename];\n if (this._contentsIgnoredCharsMap[filename]) {\n source = source.slice(this._contentsIgnoredCharsMap[filename]);\n }\n this._sourceMapGenerator.setSourceContent(this.normalizeFilename(filename), source);\n }\n }\n }\n\n this._rootNode.genCSS(context, this);\n\n if (this._css.length > 0) {\n let sourceMapURL;\n const sourceMapContent = JSON.stringify(this._sourceMapGenerator.toJSON());\n\n if (this.sourceMapURL) {\n sourceMapURL = this.sourceMapURL;\n } else if (this._sourceMapFilename) {\n sourceMapURL = this._sourceMapFilename;\n }\n this.sourceMapURL = sourceMapURL;\n\n this.sourceMap = sourceMapContent;\n }\n\n return this._css.join('');\n }\n }\n\n return SourceMapOutput;\n};\n","import contexts from './contexts';\nimport Parser from './parser/parser';\nimport LessError from './less-error';\nimport * as utils from './utils';\nimport logger from './logger';\n\nexport default function(environment) {\n // FileInfo = {\n // 'rewriteUrls' - option - whether to adjust URL's to be relative\n // 'filename' - full resolved filename of current file\n // 'rootpath' - path to append to normal URLs for this node\n // 'currentDirectory' - path to the current file, absolute\n // 'rootFilename' - filename of the base file\n // 'entryPath' - absolute path to the entry file\n // 'reference' - whether the file should not be output and only output parts that are referenced\n\n class ImportManager {\n constructor(less, context, rootFileInfo) {\n this.less = less;\n this.rootFilename = rootFileInfo.filename;\n this.paths = context.paths || []; // Search paths, when importing\n this.contents = {}; // map - filename to contents of all the files\n this.contentsIgnoredChars = {}; // map - filename to lines at the beginning of each file to ignore\n this.mime = context.mime;\n this.error = null;\n this.context = context;\n // Deprecated? Unused outside of here, could be useful.\n this.queue = []; // Files which haven't been imported yet\n this.files = {}; // Holds the imported parse trees.\n }\n\n /**\n * Add an import to be imported\n * @param path - the raw path\n * @param tryAppendExtension - whether to try appending a file extension (.less or .js if the path has no extension)\n * @param currentFileInfo - the current file info (used for instance to work out relative paths)\n * @param importOptions - import options\n * @param callback - callback for when it is imported\n */\n push(path, tryAppendExtension, currentFileInfo, importOptions, callback) {\n const importManager = this, pluginLoader = this.context.pluginManager.Loader;\n\n this.queue.push(path);\n\n const fileParsedFunc = function (e, root, fullPath) {\n importManager.queue.splice(importManager.queue.indexOf(path), 1); // Remove the path from the queue\n\n const importedEqualsRoot = fullPath === importManager.rootFilename;\n if (importOptions.optional && e) {\n callback(null, {rules:[]}, false, null);\n logger.info(`The file ${fullPath} was skipped because it was not found and the import was marked optional.`);\n }\n else {\n // Inline imports aren't cached here.\n // If we start to cache them, please make sure they won't conflict with non-inline imports of the\n // same name as they used to do before this comment and the condition below have been added.\n if (!importManager.files[fullPath] && !importOptions.inline) {\n importManager.files[fullPath] = { root, options: importOptions };\n }\n if (e && !importManager.error) { importManager.error = e; }\n callback(e, root, importedEqualsRoot, fullPath);\n }\n };\n\n const newFileInfo = {\n rewriteUrls: this.context.rewriteUrls,\n entryPath: currentFileInfo.entryPath,\n rootpath: currentFileInfo.rootpath,\n rootFilename: currentFileInfo.rootFilename\n };\n\n const fileManager = environment.getFileManager(path, currentFileInfo.currentDirectory, this.context, environment);\n\n if (!fileManager) {\n fileParsedFunc({ message: `Could not find a file-manager for ${path}` });\n return;\n }\n\n const loadFileCallback = function(loadedFile) {\n let plugin;\n const resolvedFilename = loadedFile.filename;\n const contents = loadedFile.contents.replace(/^\\uFEFF/, '');\n\n // Pass on an updated rootpath if path of imported file is relative and file\n // is in a (sub|sup) directory\n //\n // Examples:\n // - If path of imported file is 'module/nav/nav.less' and rootpath is 'less/',\n // then rootpath should become 'less/module/nav/'\n // - If path of imported file is '../mixins.less' and rootpath is 'less/',\n // then rootpath should become 'less/../'\n newFileInfo.currentDirectory = fileManager.getPath(resolvedFilename);\n if (newFileInfo.rewriteUrls) {\n newFileInfo.rootpath = fileManager.join(\n (importManager.context.rootpath || ''),\n fileManager.pathDiff(newFileInfo.currentDirectory, newFileInfo.entryPath));\n\n if (!fileManager.isPathAbsolute(newFileInfo.rootpath) && fileManager.alwaysMakePathsAbsolute()) {\n newFileInfo.rootpath = fileManager.join(newFileInfo.entryPath, newFileInfo.rootpath);\n }\n }\n newFileInfo.filename = resolvedFilename;\n\n const newEnv = new contexts.Parse(importManager.context);\n\n newEnv.processImports = false;\n importManager.contents[resolvedFilename] = contents;\n\n if (currentFileInfo.reference || importOptions.reference) {\n newFileInfo.reference = true;\n }\n\n if (importOptions.isPlugin) {\n plugin = pluginLoader.evalPlugin(contents, newEnv, importManager, importOptions.pluginArgs, newFileInfo);\n if (plugin instanceof LessError) {\n fileParsedFunc(plugin, null, resolvedFilename);\n }\n else {\n fileParsedFunc(null, plugin, resolvedFilename);\n }\n } else if (importOptions.inline) {\n fileParsedFunc(null, contents, resolvedFilename);\n } else {\n // import (multiple) parse trees apparently get altered and can't be cached.\n // TODO: investigate why this is\n if (importManager.files[resolvedFilename]\n && !importManager.files[resolvedFilename].options.multiple\n && !importOptions.multiple) {\n\n fileParsedFunc(null, importManager.files[resolvedFilename].root, resolvedFilename);\n }\n else {\n new Parser(newEnv, importManager, newFileInfo).parse(contents, function (e, root) {\n fileParsedFunc(e, root, resolvedFilename);\n });\n }\n }\n };\n let loadedFile;\n let promise;\n const context = utils.clone(this.context);\n\n if (tryAppendExtension) {\n context.ext = importOptions.isPlugin ? '.js' : '.less';\n }\n\n if (importOptions.isPlugin) {\n context.mime = 'application/javascript';\n\n if (context.syncImport) {\n loadedFile = pluginLoader.loadPluginSync(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n } else {\n promise = pluginLoader.loadPlugin(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n }\n }\n else {\n if (context.syncImport) {\n loadedFile = fileManager.loadFileSync(path, currentFileInfo.currentDirectory, context, environment);\n } else {\n promise = fileManager.loadFile(path, currentFileInfo.currentDirectory, context, environment,\n (err, loadedFile) => {\n if (err) {\n fileParsedFunc(err);\n } else {\n loadFileCallback(loadedFile);\n }\n });\n }\n }\n if (loadedFile) {\n if (!loadedFile.filename) {\n fileParsedFunc(loadedFile);\n } else {\n loadFileCallback(loadedFile);\n }\n } else if (promise) {\n promise.then(loadFileCallback, fileParsedFunc);\n }\n }\n }\n\n return ImportManager;\n};\n","import * as utils from './utils';\n\nexport default function(environment, ParseTree, ImportManager) {\n const render = function (input, options, callback) {\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(this.options, {});\n }\n else {\n options = utils.copyOptions(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n return new Promise(function (resolve, reject) {\n render.call(self, input, options, function(err, output) {\n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n this.parse(input, options, function(err, root, imports, options) {\n if (err) { return callback(err); }\n\n let result;\n try {\n const parseTree = new ParseTree(root, imports);\n result = parseTree.toCSS(options);\n }\n catch (err) { return callback(err); }\n\n callback(null, result);\n });\n }\n };\n\n return render;\n};\n","import contexts from './contexts';\nimport Parser from './parser/parser';\nimport PluginManager from './plugin-manager';\nimport LessError from './less-error';\nimport * as utils from './utils';\n\nexport default function(environment, ParseTree, ImportManager) {\n const parse = function (input, options, callback) {\n\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(this.options, {});\n }\n else {\n options = utils.copyOptions(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n return new Promise(function (resolve, reject) {\n parse.call(self, input, options, function(err, output) {\n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n let context;\n let rootFileInfo;\n const pluginManager = new PluginManager(this, !options.reUsePluginManager);\n\n options.pluginManager = pluginManager;\n\n context = new contexts.Parse(options);\n\n if (options.rootFileInfo) {\n rootFileInfo = options.rootFileInfo;\n } else {\n const filename = options.filename || 'input';\n const entryPath = filename.replace(/[^\\/\\\\]*$/, '');\n rootFileInfo = {\n filename,\n rewriteUrls: context.rewriteUrls,\n rootpath: context.rootpath || '',\n currentDirectory: entryPath,\n entryPath,\n rootFilename: filename\n };\n // add in a missing trailing slash\n if (rootFileInfo.rootpath && rootFileInfo.rootpath.slice(-1) !== '/') {\n rootFileInfo.rootpath += '/';\n }\n }\n\n const imports = new ImportManager(this, context, rootFileInfo);\n this.importManager = imports;\n\n // TODO: allow the plugins to be just a list of paths or names\n // Do an async plugin queue like lessc\n\n if (options.plugins) {\n options.plugins.forEach(function(plugin) {\n let evalResult, contents;\n if (plugin.fileContent) {\n contents = plugin.fileContent.replace(/^\\uFEFF/, '');\n evalResult = pluginManager.Loader.evalPlugin(contents, context, imports, plugin.options, plugin.filename);\n if (evalResult instanceof LessError) {\n return callback(evalResult);\n }\n }\n else {\n pluginManager.addPlugin(plugin);\n }\n });\n }\n\n new Parser(context, imports, rootFileInfo)\n .parse(input, function (e, root) {\n if (e) { return callback(e); }\n callback(null, root, imports, options);\n }, options);\n }\n };\n return parse;\n};\n","// TODO: Add tests for browser @plugin\n/* global window */\n\nimport AbstractPluginLoader from '../less/environment/abstract-plugin-loader.js';\n\n/**\n * Browser Plugin Loader\n */\nconst PluginLoader = function(less) {\n this.less = less;\n // Should we shim this.require for browser? Probably not?\n};\n\nPluginLoader.prototype = Object.assign(new AbstractPluginLoader(), {\n loadPlugin(filename, basePath, context, environment, fileManager) {\n return new Promise((fulfill, reject) => {\n fileManager.loadFile(filename, basePath, context, environment)\n .then(fulfill).catch(reject);\n });\n }\n});\n\nexport default PluginLoader;\n\n","import * as utils from './utils';\nimport browser from './browser';\n\nexport default (window, less, options) => {\n\n function errorHTML(e, rootHref) {\n const id = `less-error-message:${utils.extractId(rootHref || '')}`;\n const template = '
  • {content}
  • ';\n const elem = window.document.createElement('div');\n let timer;\n let content;\n const errors = [];\n const filename = e.filename || rootHref;\n const filenameNoPath = filename.match(/([^\\/]+(\\?.*)?)$/)[1];\n\n elem.id = id;\n elem.className = 'less-error-message';\n\n content = `

    ${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'}` + \n `

    in ${filenameNoPath} `;\n\n const errorline = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\{content\\}/, e.extract[i]));\n }\n };\n\n if (e.line) {\n errorline(e, 0, '');\n errorline(e, 1, 'line');\n errorline(e, 2, '');\n content += `on line ${e.line}, column ${e.column + 1}:

      ${errors.join('')}
    `;\n }\n if (e.stack && (e.extract || options.logLevel >= 4)) {\n content += `
    Stack Trace
    ${e.stack.split('\\n').slice(1).join('
    ')}`;\n }\n elem.innerHTML = content;\n\n // CSS for error messages\n browser.createCSS(window.document, [\n '.less-error-message ul, .less-error-message li {',\n 'list-style-type: none;',\n 'margin-right: 15px;',\n 'padding: 4px 0;',\n 'margin: 0;',\n '}',\n '.less-error-message label {',\n 'font-size: 12px;',\n 'margin-right: 15px;',\n 'padding: 4px 0;',\n 'color: #cc7777;',\n '}',\n '.less-error-message pre {',\n 'color: #dd6666;',\n 'padding: 4px 0;',\n 'margin: 0;',\n 'display: inline-block;',\n '}',\n '.less-error-message pre.line {',\n 'color: #ff0000;',\n '}',\n '.less-error-message h3 {',\n 'font-size: 20px;',\n 'font-weight: bold;',\n 'padding: 15px 0 5px 0;',\n 'margin: 0;',\n '}',\n '.less-error-message a {',\n 'color: #10a',\n '}',\n '.less-error-message .error {',\n 'color: red;',\n 'font-weight: bold;',\n 'padding-bottom: 2px;',\n 'border-bottom: 1px dashed red;',\n '}'\n ].join('\\n'), { title: 'error-message' });\n\n elem.style.cssText = [\n 'font-family: Arial, sans-serif',\n 'border: 1px solid #e00',\n 'background-color: #eee',\n 'border-radius: 5px',\n '-webkit-border-radius: 5px',\n '-moz-border-radius: 5px',\n 'color: #e00',\n 'padding: 15px',\n 'margin-bottom: 15px'\n ].join(';');\n\n if (options.env === 'development') {\n timer = setInterval(() => {\n const document = window.document;\n const body = document.body;\n if (body) {\n if (document.getElementById(id)) {\n body.replaceChild(elem, document.getElementById(id));\n } else {\n body.insertBefore(elem, body.firstChild);\n }\n clearInterval(timer);\n }\n }, 10);\n }\n }\n\n function removeErrorHTML(path) {\n const node = window.document.getElementById(`less-error-message:${utils.extractId(path)}`);\n if (node) {\n node.parentNode.removeChild(node);\n }\n }\n\n function removeErrorConsole(path) {\n // no action\n }\n\n function removeError(path) {\n if (!options.errorReporting || options.errorReporting === 'html') {\n removeErrorHTML(path);\n } else if (options.errorReporting === 'console') {\n removeErrorConsole(path);\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('remove', path);\n }\n }\n\n function errorConsole(e, rootHref) {\n const template = '{line} {content}';\n const filename = e.filename || rootHref;\n const errors = [];\n let content = `${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'} in ${filename}`;\n\n const errorline = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\{content\\}/, e.extract[i]));\n }\n };\n\n if (e.line) {\n errorline(e, 0, '');\n errorline(e, 1, 'line');\n errorline(e, 2, '');\n content += ` on line ${e.line}, column ${e.column + 1}:\\n${errors.join('\\n')}`;\n }\n if (e.stack && (e.extract || options.logLevel >= 4)) {\n content += `\\nStack Trace\\n${e.stack}`;\n }\n less.logger.error(content);\n }\n\n function error(e, rootHref) {\n if (!options.errorReporting || options.errorReporting === 'html') {\n errorHTML(e, rootHref);\n } else if (options.errorReporting === 'console') {\n errorConsole(e, rootHref);\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('add', e, rootHref);\n }\n }\n\n return {\n add: error,\n remove: removeError\n };\n};\n","/**\n * Kicks off less and compiles any stylesheets\n * used in the browser distributed version of less\n * to kick-start less using the browser api\n */\n/* global window, document */\n\nimport defaultOptions from '../less/default-options';\nimport addDefaultOptions from './add-default-options';\nimport root from './index';\n\nconst options = defaultOptions();\n\nif (window.less) {\n for (const key in window.less) {\n if (window.less.hasOwnProperty(key)) {\n options[key] = window.less[key];\n }\n }\n}\naddDefaultOptions(window, options);\n\noptions.plugins = options.plugins || [];\n\nif (window.LESS_PLUGINS) {\n options.plugins = options.plugins.concat(window.LESS_PLUGINS);\n}\n\nconst less = root(window, options);\nexport default less;\n\nwindow.less = less;\n\nlet css;\nlet head;\nlet style;\n\n// Always restore page visibility\nfunction resolveOrReject(data) {\n if (data.filename) {\n console.warn(data);\n }\n if (!options.async) {\n head.removeChild(style);\n }\n}\n\nif (options.onReady) {\n if (/!watch/.test(window.location.hash)) {\n less.watch();\n }\n // Simulate synchronous stylesheet loading by hiding page rendering\n if (!options.async) {\n css = 'body { display: none !important }';\n head = document.head || document.getElementsByTagName('head')[0];\n style = document.createElement('style');\n\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n\n head.appendChild(style);\n }\n less.registerStylesheetsImmediately();\n less.pageLoadFinished = less.refresh(less.env === 'development').then(resolveOrReject, resolveOrReject);\n}\n","// Export a new default each time\nexport default function() {\n return {\n /* Inline Javascript - @plugin still allowed */\n javascriptEnabled: false,\n\n /* Outputs a makefile import dependency list to stdout. */\n depends: false,\n\n /* (DEPRECATED) Compress using less built-in compression. \n * This does an okay job but does not utilise all the tricks of \n * dedicated css compression. */\n compress: false,\n\n /* Runs the less parser and just reports errors without any output. */\n lint: false,\n\n /* Sets available include paths.\n * If the file in an @import rule does not exist at that exact location, \n * less will look for it at the location(s) passed to this option. \n * You might use this for instance to specify a path to a library which \n * you want to be referenced simply and relatively in the less files. */\n paths: [],\n\n /* color output in the terminal */\n color: true,\n\n /* The strictImports controls whether the compiler will allow an @import inside of either \n * @media blocks or (a later addition) other selector blocks.\n * See: https://github.com/less/less.js/issues/656 */\n strictImports: false,\n\n /* Allow Imports from Insecure HTTPS Hosts */\n insecure: false,\n\n /* Allows you to add a path to every generated import and url in your css. \n * This does not affect less import statements that are processed, just ones \n * that are left in the output css. */\n rootpath: '',\n\n /* By default URLs are kept as-is, so if you import a file in a sub-directory \n * that references an image, exactly the same URL will be output in the css. \n * This option allows you to re-write URL's in imported files so that the \n * URL is always relative to the base imported file */\n rewriteUrls: false,\n\n /* How to process math \n * 0 always - eagerly try to solve all operations\n * 1 parens-division - require parens for division \"/\"\n * 2 parens | strict - require parens for all operations\n * 3 strict-legacy - legacy strict behavior (super-strict)\n */\n math: 1,\n\n /* Without this option, less attempts to guess at the output unit when it does maths. */\n strictUnits: false,\n\n /* Effectively the declaration is put at the top of your base Less file, \n * meaning it can be used but it also can be overridden if this variable \n * is defined in the file. */\n globalVars: null,\n\n /* As opposed to the global variable option, this puts the declaration at the\n * end of your base file, meaning it will override anything defined in your Less file. */\n modifyVars: null,\n\n /* This option allows you to specify a argument to go on to every URL. */\n urlArgs: ''\n }\n};","import {addDataAttr} from './utils';\nimport browser from './browser';\n\nexport default (window, options) => {\n\n // use options from the current script tag data attribues\n addDataAttr(options, browser.currentScript(window));\n\n if (options.isFileProtocol === undefined) {\n options.isFileProtocol = /^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(window.location.protocol);\n }\n\n // Load styles asynchronously (default: false)\n //\n // This is set to `false` by default, so that the body\n // doesn't start loading before the stylesheets are parsed.\n // Setting this to `true` can result in flickering.\n //\n options.async = options.async || false;\n options.fileAsync = options.fileAsync || false;\n\n // Interval between watch polls\n options.poll = options.poll || (options.isFileProtocol ? 1000 : 1500);\n\n options.env = options.env || (window.location.hostname == '127.0.0.1' ||\n window.location.hostname == '0.0.0.0' ||\n window.location.hostname == 'localhost' ||\n (window.location.port &&\n window.location.port.length > 0) ||\n options.isFileProtocol ? 'development'\n : 'production');\n\n const dumpLineNumbers = /!dumpLineNumbers:(comments|mediaquery|all)/.exec(window.location.hash);\n if (dumpLineNumbers) {\n options.dumpLineNumbers = dumpLineNumbers[1];\n }\n\n if (options.useFileCache === undefined) {\n options.useFileCache = true;\n }\n\n if (options.onReady === undefined) {\n options.onReady = true;\n }\n\n if (options.relativeUrls) {\n options.rewriteUrls = 'all';\n }\n};\n","//\n// index.js\n// Should expose the additional browser functions on to the less object\n//\nimport {addDataAttr} from './utils';\nimport lessRoot from '../less';\nimport browser from './browser';\nimport FM from './file-manager';\nimport PluginLoader from './plugin-loader';\nimport LogListener from './log-listener';\nimport ErrorReporting from './error-reporting';\nimport Cache from './cache';\nimport ImageSize from './image-size';\n\nexport default (window, options) => {\n const document = window.document;\n const less = lessRoot();\n\n less.options = options;\n const environment = less.environment;\n const FileManager = FM(options, less.logger);\n const fileManager = new FileManager();\n environment.addFileManager(fileManager);\n less.FileManager = FileManager;\n less.PluginLoader = PluginLoader;\n\n LogListener(less, options);\n const errors = ErrorReporting(window, less, options);\n const cache = less.cache = options.cache || Cache(window, options, less.logger);\n ImageSize(less.environment);\n\n // Setup user functions - Deprecate?\n if (options.functions) {\n less.functions.functionRegistry.addMultiple(options.functions);\n }\n\n const typePattern = /^text\\/(x-)?less$/;\n\n function clone(obj) {\n const cloned = {};\n for (const prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n cloned[prop] = obj[prop];\n }\n }\n return cloned;\n }\n\n // only really needed for phantom\n function bind(func, thisArg) {\n const curryArgs = Array.prototype.slice.call(arguments, 2);\n return function() {\n const args = curryArgs.concat(Array.prototype.slice.call(arguments, 0));\n return func.apply(thisArg, args);\n };\n }\n\n function loadStyles(modifyVars) {\n const styles = document.getElementsByTagName('style');\n let style;\n\n for (let i = 0; i < styles.length; i++) {\n style = styles[i];\n if (style.type.match(typePattern)) {\n const instanceOptions = clone(options);\n instanceOptions.modifyVars = modifyVars;\n const lessText = style.innerHTML || '';\n instanceOptions.filename = document.location.href.replace(/#.*$/, '');\n\n /* jshint loopfunc:true */\n // use closure to store current style\n less.render(lessText, instanceOptions,\n bind((style, e, result) => {\n if (e) {\n errors.add(e, 'inline');\n } else {\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = result.css;\n } else {\n style.innerHTML = result.css;\n }\n }\n }, null, style));\n }\n }\n }\n\n function loadStyleSheet(sheet, callback, reload, remaining, modifyVars) {\n\n const instanceOptions = clone(options);\n addDataAttr(instanceOptions, sheet);\n instanceOptions.mime = sheet.type;\n\n if (modifyVars) {\n instanceOptions.modifyVars = modifyVars;\n }\n\n function loadInitialFileCallback(loadedFile) {\n const data = loadedFile.contents;\n const path = loadedFile.filename;\n const webInfo = loadedFile.webInfo;\n\n const newFileInfo = {\n currentDirectory: fileManager.getPath(path),\n filename: path,\n rootFilename: path,\n rewriteUrls: instanceOptions.rewriteUrls\n };\n\n newFileInfo.entryPath = newFileInfo.currentDirectory;\n newFileInfo.rootpath = instanceOptions.rootpath || newFileInfo.currentDirectory;\n\n if (webInfo) {\n webInfo.remaining = remaining;\n\n const css = cache.getCSS(path, webInfo, instanceOptions.modifyVars);\n if (!reload && css) {\n webInfo.local = true;\n callback(null, css, data, sheet, webInfo, path);\n return;\n }\n\n }\n\n // TODO add tests around how this behaves when reloading\n errors.remove(path);\n\n instanceOptions.rootFileInfo = newFileInfo;\n less.render(data, instanceOptions, (e, result) => {\n if (e) {\n e.href = path;\n callback(e);\n } else {\n cache.setCSS(sheet.href, webInfo.lastModified, instanceOptions.modifyVars, result.css);\n callback(null, result.css, data, sheet, webInfo, path);\n }\n });\n }\n\n fileManager.loadFile(sheet.href, null, instanceOptions, environment)\n .then(loadedFile => {\n loadInitialFileCallback(loadedFile);\n }).catch(err => {\n console.log(err);\n callback(err);\n });\n\n }\n\n function loadStyleSheets(callback, reload, modifyVars) {\n for (let i = 0; i < less.sheets.length; i++) {\n loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1), modifyVars);\n }\n }\n\n function initRunningMode() {\n if (less.env === 'development') {\n less.watchTimer = setInterval(() => {\n if (less.watchMode) {\n fileManager.clearFileCache();\n loadStyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n } else if (css) {\n browser.createCSS(window.document, css, sheet);\n }\n });\n }\n }, options.poll);\n }\n }\n\n //\n // Watch mode\n //\n less.watch = function () {\n if (!less.watchMode ) {\n less.env = 'development';\n initRunningMode();\n }\n this.watchMode = true;\n return true;\n };\n\n less.unwatch = function () {clearInterval(less.watchTimer); this.watchMode = false; return false; };\n\n //\n // Synchronously get all tags with the 'rel' attribute set to\n // \"stylesheet/less\".\n //\n less.registerStylesheetsImmediately = () => {\n const links = document.getElementsByTagName('link');\n less.sheets = [];\n\n for (let i = 0; i < links.length; i++) {\n if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) &&\n (links[i].type.match(typePattern)))) {\n less.sheets.push(links[i]);\n }\n }\n };\n\n //\n // Asynchronously get all tags with the 'rel' attribute set to\n // \"stylesheet/less\", returning a Promise.\n //\n less.registerStylesheets = () => new Promise((resolve, reject) => {\n less.registerStylesheetsImmediately();\n resolve();\n });\n\n //\n // With this function, it's possible to alter variables and re-render\n // CSS without reloading less-files\n //\n less.modifyVars = record => less.refresh(true, record, false);\n\n less.refresh = (reload, modifyVars, clearFileCache) => {\n if ((reload || clearFileCache) && clearFileCache !== false) {\n fileManager.clearFileCache();\n }\n return new Promise((resolve, reject) => {\n let startTime;\n let endTime;\n let totalMilliseconds;\n let remainingSheets;\n startTime = endTime = new Date();\n\n // Set counter for remaining unprocessed sheets\n remainingSheets = less.sheets.length;\n\n if (remainingSheets === 0) {\n\n endTime = new Date();\n totalMilliseconds = endTime - startTime;\n less.logger.info('Less has finished and no sheets were loaded.');\n resolve({\n startTime,\n endTime,\n totalMilliseconds,\n sheets: less.sheets.length\n });\n\n } else {\n // Relies on less.sheets array, callback seems to be guaranteed to be called for every element of the array\n loadStyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n reject(e);\n return;\n }\n if (webInfo.local) {\n less.logger.info(`Loading ${sheet.href} from cache.`);\n } else {\n less.logger.info(`Rendered ${sheet.href} successfully.`);\n }\n browser.createCSS(window.document, css, sheet);\n less.logger.info(`CSS for ${sheet.href} generated in ${new Date() - endTime}ms`);\n\n // Count completed sheet\n remainingSheets--;\n\n // Check if the last remaining sheet was processed and then call the promise\n if (remainingSheets === 0) {\n totalMilliseconds = new Date() - startTime;\n less.logger.info(`Less has finished. CSS generated in ${totalMilliseconds}ms`);\n resolve({\n startTime,\n endTime,\n totalMilliseconds,\n sheets: less.sheets.length\n });\n }\n endTime = new Date();\n }, reload, modifyVars);\n }\n\n loadStyles(modifyVars);\n });\n };\n\n less.refreshStyles = loadStyles;\n return less;\n};\n","export default (less, options) => {\n const logLevel_debug = 4;\n const logLevel_info = 3;\n const logLevel_warn = 2;\n const logLevel_error = 1;\n\n // The amount of logging in the javascript console.\n // 3 - Debug, information and errors\n // 2 - Information and errors\n // 1 - Errors\n // 0 - None\n // Defaults to 2\n options.logLevel = typeof options.logLevel !== 'undefined' ? options.logLevel : (options.env === 'development' ? logLevel_info : logLevel_error);\n\n if (!options.loggers) {\n options.loggers = [{\n debug: function(msg) {\n if (options.logLevel >= logLevel_debug) {\n console.log(msg);\n }\n },\n info: function(msg) {\n if (options.logLevel >= logLevel_info) {\n console.log(msg);\n }\n },\n warn: function(msg) {\n if (options.logLevel >= logLevel_warn) {\n console.warn(msg);\n }\n },\n error: function(msg) {\n if (options.logLevel >= logLevel_error) {\n console.error(msg);\n }\n }\n }];\n }\n for (let i = 0; i < options.loggers.length; i++) {\n less.logger.addListener(options.loggers[i]);\n }\n};\n","// Cache system is a bit outdated and could do with work\n\nexport default (window, options, logger) => {\n let cache = null;\n if (options.env !== 'development') {\n try {\n cache = (typeof window.localStorage === 'undefined') ? null : window.localStorage;\n } catch (_) {}\n }\n return {\n setCSS: function(path, lastModified, modifyVars, styles) {\n if (cache) {\n logger.info(`saving ${path} to cache.`);\n try {\n cache.setItem(path, styles);\n cache.setItem(`${path}:timestamp`, lastModified);\n if (modifyVars) {\n cache.setItem(`${path}:vars`, JSON.stringify(modifyVars));\n }\n } catch (e) {\n // TODO - could do with adding more robust error handling\n logger.error(`failed to save \"${path}\" to local storage for caching.`);\n }\n }\n },\n getCSS: function(path, webInfo, modifyVars) {\n const css = cache && cache.getItem(path);\n const timestamp = cache && cache.getItem(`${path}:timestamp`);\n let vars = cache && cache.getItem(`${path}:vars`);\n\n modifyVars = modifyVars || {};\n vars = vars || \"{}\"; // if not set, treat as the JSON representation of an empty object\n\n if (timestamp && webInfo.lastModified &&\n (new Date(webInfo.lastModified).valueOf() ===\n new Date(timestamp).valueOf()) &&\n JSON.stringify(modifyVars) === vars) {\n // Use local copy\n return css;\n }\n }\n };\n};\n","\nimport functionRegistry from './../less/functions/function-registry';\n\nexport default () => {\n function imageSize() {\n throw {\n type: 'Runtime',\n message: 'Image size functions are not supported in browser version of less'\n };\n }\n\n const imageFunctions = {\n 'image-size': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n },\n 'image-width': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n },\n 'image-height': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n }\n };\n\n functionRegistry.addMultiple(imageFunctions);\n};\n"],"names":["extractId","href","replace","addDataAttr","options","tag","opt","dataset","hasOwnProperty","JSON","parse","_","document","styles","sheet","id","title","utils.extractId","oldStyleNode","getElementById","keepOldStyleNode","styleNode","createElement","setAttribute","media","styleSheet","appendChild","createTextNode","childNodes","length","firstChild","nodeValue","head","getElementsByTagName","nextEl","nextSibling","parentNode","insertBefore","removeChild","cssText","e","Error","window","scripts","currentScript","error","msg","this","_fireEvent","warn","info","debug","addListener","listener","_listeners","push","removeListener","i","splice","type","logFunction","externalEnvironment","fileManagers","requiredFunctions","functions","concat","propName","environmentFunc","bind","Environment","filename","currentDirectory","environment","isSync","logger","pluginManager","getFileManagers","fileManager","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","darkgrey","darkgreen","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","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","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","m","cm","mm","in","px","pt","pc","duration","s","ms","angle","rad","Math","PI","deg","grad","turn","colors","unitConversions","parent","visibilityBlocks","undefined","nodeVisible","rootNode","parsed","self","Object","defineProperty","get","fileInfo","getIndex","Node","nodes","set","node","Array","isArray","forEach","_index","_fileInfo","context","strs","genCSS","add","chunk","index","isEmpty","join","output","value","visitor","visit","op","a","b","precision","numPrecision","Number","toFixed","compare","Color","rgb","originalForm","match","map","c","parseInt","alpha","split","clamp","v","max","min","toHex","round","toString","prototype","assign","luma","r","g","pow","toCSS","doNotCompress","color","colorFunction","compress","args","fround","indexOf","toHSL","h","l","toRGB","splitcolor","operate","other","_operate","d","toHSV","toARGB","x","fromKeyword","keyword","key","toLowerCase","slice","Paren","eval","_noSpaceCombinators"," ","|","Combinator","emptyOrWhitespace","trim","spaceOrEmpty","Element","combinator","isVariable","currentFileInfo","visibilityInfo","copyVisibilityInfo","setParent","accept","clone","firstSelector","charAt","ALWAYS","PARENS_DIVISION","PARENS","RewriteUrls","getType","payload","call","copy","target","constructor","getPrototypeOf","il","arguments","k","j","jl","__spreadArrays","getOwnPropertyNames","getOwnPropertySymbols","reduce","carry","props","includes","newVal","originalObject","includeNonenumerable","propType","propertyIsEnumerable","enumerable","writable","configurable","assignProp","nonenumerable","getLocation","inputStream","n","line","column","copyArray","arr","obj","cloned","prop","defaults","obj1","obj2","newObj","_defaults","defaults_1","copyOptions","opts","strictMath","math","Constants.Math","relativeUrls","rewriteUrls","Constants.RewriteUrls","flattenArray","result","length_1","anonymousFunc","LessError","fileContentMap","currentFilename","message","stack","input","contents","loc","utils.getLocation","col","callLine","lines","found","func","Function","lineAdjust","callExtract","extract","create","F","stylize","str","errorTxt","substr","Selector","elements","extendList","condition","evaldCondition","getElements","mixinElements_","visitArray","createDerived","newSelector","mediaEmpty","els","parseNode","err","imports","createEmptySelectors","el","sels","olen","len","mixinElements","shift","isJustParentSelector","extend","getIsOutput","Value","Keyword","True","False","Anonymous","mapLines","rulesetLike","allowRoot","isRulesetLike","Boolean","MATH","Declaration","name","important","merge","inline","variable","lastRule","prevMath","evaldValue","mathBypass","evalName","importantScope","importantResult","pop","makeImportant","ctx","lineSeparator","dumpLineNumbers","debugInfo","asComment","asMediaQuery","lineNumber","fileName","filenameWithProtocol","test","Comment","isLineComment","getDebugInfo","isSilent","isCompressed","contexts","copyFromOriginal","original","destination","propertiesToCopy","parseCopyProperties","Parse","paths","evalCopyProperties","isPathRelative","path","isPathLocalRelative","Eval","frames","enterCalc","calcStack","inCalc","exitCalc","inParenthesis","parensStack","outOfParenthesis","mathOn","isMathOn","pathRequiresRewrite","rewritePath","rootpath","newPath","normalizePath","segment","segments","reverse","makeRegistry","base","_data","addMultiple","keys","_this","getLocalFunctions","inherit","defaultFunc","value_","error_","reset","Ruleset","selectors","rules","strictImports","_lookups","_variables","_properties","isRuleset","selCnt","selector","hasVariable","hasOnePassingSelector","toParseSelectors","utils.flattenArray","rule","subRule","utils.copyArray","ruleset","originalRuleset","root","firstRoot","allowImports","functionRegistry","globalFunctionRegistry","ctxFrames","unshift","ctxSelectors","evalImports","rsRules","evalFirst","mediaBlockCount","mediaBlocks","filter","apply","resetCache","bubbleSelectors","importRules","matchArgs","matchCondition","lastSelector","_rulesets","variables","hash","vars","name_1","properties","name_2","decl","parseValue","property","lastDeclaration","toParse","transformDeclaration","nodes_1","rulesets","filtRules","prependRule","find","foundMixins","ruleNodes","tabLevel","sep","tabRuleStr","tabSetStr","charsetNodeIndex","importNodeIndex","isCharset","pathCnt","pathSubCnt","currentLastRule","isVisible","joinSelectors","joinSelector","createParenthesis","elementsToPak","originalElement","replacementParen","insideParent","createSelector","containedElement","element","addReplacementIntoPath","beginningPath","addPath","replacedElement","originalSelector","newSelectorPath","newJoinedSelector","parentEl","restOfPath","addAllReplacementsIntoPath","addPaths","mergeElementsOnToSelectors","sel","deriveSelector","deriveFrom","newPaths","replaceParentSelector","inSelector","currentElements","newSelectors","selectorsMultiplied","maybeSelector","hadParentSelector","nestedSelector","replaced","nestedPaths","replacedNewSelectors","concatenated","AtRule","isRooted","outputRuleset","mediaPathBackup","mediaBlocksBackup","mediaPath","ruleCnt","DetachedRuleset","callEval","Unit","numerator","denominator","backupUnit","sort","strictUnits","returnStr","is","unitString","toUpperCase","isLength","RegExp","isSingular","callback","usedUnits","group","mapUnit","groupName","atomicUnit","cancel","counter","count","Dimension","unit","parseFloat","isNaN","toColor","strValue","String","convertTo","unify","numericCompare","conversions","targetUnit","applyUnit","derivedConversions","Operation","operands","isSpaced","Expression","noSpacing","returnValue","parens","doubleParen","parensInOp","throwAwayComments","functionCaller","evalArgs","commentFilter","item","subNodes","Call","calc","currentMathContext","funcCaller","FunctionCaller","isValid","columnNumber","Variable","evaluating","frame","fun","Property","mergeRules","less","visitors","ToCSSVisitor","_mergeRules","vArr","Attribute","Quoted","content","escaped","quote","variableRegex","propRegex","containsVariables","that","iterativeReplace","regexp","replacementFnc","evaluatedValue","URL","val","isEvald","urlArgs","Media","features","evalTop","evalNested","multiMedia","permute","fragment","rest","Import","css","pathValue","getPath","isPlugin","reference","isVariableImport","evalForImport","evalPath","doEval","blocksVisibility","addVisibilityBlock","registry","skip","importedFilename","newImport","JsEvalNode","evaluateJavaScript","expression","evalContext","javascriptEnabled","jsify","toJS","JavaScript","string","Assignment","Condition","negate","lvalue","rvalue","UnicodeDescriptor","Negative","Extend","option","object_id","next_id","parent_ids","allowBefore","allowAfter","findSelfSelectors","selectorElements","selfElements","selfSelectors","VariableCall","detachedRuleset","NamespaceValue","ruleCall","lookups","substring","Definition","params","variadic","arity","optionalParameters","required","p","evalParams","mixinEnv","evaldArguments","varargs","arg","isNamedFound","argIndex","argsLength","evalCall","_arguments","mixinFrames","allArgsCnt","requiredArgsCnt","MixinCall","mixins","mixin","mixinPath","argValue","f","isRecursive","isOneFound","candidate","defaultResult","noArgumentsFilter","candidates","conditionResult","calcDefGroup","namespace","expand","MixinDefinition","format","newRules","_setVisibilityToReplacement","replacement","AbstractFileManager","lastIndexOf","ext","tryAppendExtension","basePath","laterPath","url","baseUrl","urlDirectories","baseUrlDirectories","urlParts","extractUrlParts","baseUrlParts","diff","hostPart","directories","urlPartsRegex","returner","rawDirectories","rawPath","fileUrl","require","AbstractPluginLoader","pluginOptions","pluginObj","localModule","shortname","FileManager","trySetOptions","use","exports","loader","tree","validatePlugin","minVersion","compareVersion","addPlugin","plugin","setOptions","version","versionToString","aVersion","bVersion","versionString","plugins","printUsage","_visitArgs","visitDeeper","_hasIndexed","_noop","implementation","_implementation","_visitInCache","_visitOutCache","indexNodeTypes","ticker","child","typeIndex","Visitor","nodeTypeIndex","fnName","impl","funcOut","visitArgs","newNode","isReplacing","cnt","nonReplacing","out","evald","flatten","nestedCnt","nestedItem","onSequencerEmpty","variableImports","_onSequencerEmpty","_currentDepth","ImportSequencer","importSequencer","importItem","isReady","tryRun","variableImport","ImportVisitor","importer","finish","_visitor","_importer","_finish","importCount","onceFileDetectionMap","recursionDetector","_sequencer","run","isFinished","visitImport","importNode","inlineCSS","importParent","addVariableImport","processImportNode","evaldImportNode","multiple","importMultiple","tryAppendLessExtension","onImported","sequencedOnImported","addImport","importedAtRoot","fullPath","importVisitor","isOptional","optional","duplicateImport","oldContext","visitDeclaration","declNode","visitDeclarationOut","visitAtRule","atRuleNode","visitAtRuleOut","visitMixinDefinition","mixinDefinitionNode","visitMixinDefinitionOut","visitRuleset","rulesetNode","visitRulesetOut","visitMedia","mediaNode","visitMediaOut","visible","SetTreeVisibilityVisitor","ensureVisibility","ensureInvisibility","allExtendsStack","ExtendFinderVisitor","allExtends","allSelectorsExtendList","extendOnEveryPath","selectorPath","selExtendList","allSelectorsExtend","foundExtends","firstExtendOnThisSelectorPath","ProcessExtendsVisitor","extendFinder","extendIndices","doExtendChaining","newRoot","checkExtendsForNonMatched","indices","hasFoundMatches","extendsList","extendsListTarget","iterationCount","extendIndex","targetExtendIndex","matches","targetExtend","newExtend","extendsToAdd","extendVisitor","findMatch","selfSelector","extendSelector","extendChainCount","selectorOne","selectorTwo","ruleNode","selectorNode","pathIndex","selectorsToAdd","extendedSelectors","haystackSelectorPath","haystackSelectorIndex","hackstackSelector","hackstackElementIndex","haystackElement","targetCombinator","potentialMatch","needleElements","potentialMatches","matched","initialCombinator","isElementValuesEqual","finished","endPathIndex","endPathElementIndex","elementValue1","elementValue2","replacementSelector","matchIndex","firstElement","newElements","currentSelectorPathIndex","currentSelectorPathElementIndex","currentValue","derived","newAllExtends","lastIndex","JoinSelectorVisitor","_context","CSSVisitorUtils","bodyRules","owner","thing","originalRules","containsSilentNonBlockedChild","compiledRulesBody","keepOnlyVisibleChilds","removeVisibilityBlock","hasVisibleSelector","utils","mixinNode","visitExtend","extendNode","visitComment","commentNode","resolveVisibility","visitAtRuleWithBody","visitAtRuleWithoutBody","visitAnonymous","anonymousNode","nodeRules","hasFakeRuleset","getBodyRules","charset","comment","checkValidNodes","isRoot","_compileRulesetPaths","nodeRuleCnt","_removeDuplicateRules","isVisibleRuleset","ruleList","ruleCache","ruleCSS","groups","groupsArr","result_1","space_1","comma_1","MarkVisibleSelectorsVisitor","ExtendVisitor","furthest","furthestPossibleErrorMessage","chunks","current","currentPos","saveStack","parserInput","skipWhitespace","nextChar","oldi","oldj","curr","endIndex","mem","inp","charCodeAt","autoCommentAbsorb","nextNewLine","text","commentStore","nextStarSlash","save","restore","possibleErrorMessage","state","forget","isWhitespace","offset","pos","code","$re","tok","exec","$char","$str","tokLength","$quoted","startChar","currentPosition","$parseUntil","testChar","returnVal","inComment","blockDepth","blockStack","parseGroups","startPos","lastPos","loop","char","expected","peek","peekChar","currentChar","prevChar","getInput","peekNotNumeric","start","chunkInput","failFunction","fail","lastOpening","lastOpeningParen","lastMultiComment","lastMultiCommentEndBrace","chunkerCurrentIndex","currentChunkStartIndex","cc","cc2","level","parenLevel","emitFrom","emitChunk","force","fromCharCode","chunker","end","furthestReachedEnd","furthestChar","Parser","parsers","getParserInput","expect","expectChar","parseList","currentIndex","returnNodes","parser","additionalData","globalVars","modifyVars","ignored","preText","serializeVars","preProcessors","getPreProcessors","process","banner","contentsIgnoredChars","primary","endInfo","processImports","extendRule","definition","declaration","variableCall","entities","atrule","foundSemiColon","mixinLookup","quoted","forceEscaped","isEscaped","customFuncCall","stop","ieAlpha","boolean","if","prevArgs","isSemiColonSeparated","argsComma","argsSemiColon","assignment","literal","dimension","unicodeDescriptor","entity","ch","variableCurly","curly","propertyCurly","colorKeyword","ud","javascript","js","escape","parsedName","inValue","ruleLookups","isRule","getLookup","hasParens","elem","elemIndex","re","isCall","expressionContainsNamed","nameLoop","expressions","hasSep","cond","argInfo","conditions","block","lookupValue","attribute","slashedCombinator","isLess","when","blockRuleset","hasDR","ruleProperty","permissiveValue","anonymousValue","untilTokens","done","testCurrentChar","import","dir","importOptions","mediaFeatures","o","optionName","importOption","mediaFeature","pluginArgs","nonVendorSpecificName","hasIdentifier","hasExpression","hasUnknown","hasBlock","sub","addition","multiplication","operation","operand","needsParens","logical","next","conditionAnd","negatedCondition","parenthesisCondition","atomicCondition","body","me","tryConditionFollowedByParenthesis","delim","simpleProperty","If","trueValue","falseValue","isdefined","colorFunctions","hsla","origColor","hsl","number","rgba","size","m1_1","m2_1","hue","hsv","hsva","vs","floor","perm","saturation","lightness","hsvhue","hsvsaturation","hsvvalue","luminance","saturate","amount","method","desaturate","lighten","darken","fadein","fadeout","fade","spin","mix","color1","color2","weight","w","w1","w2","greyscale","contrast","dark","light","threshold","t","argb","tint","shade","colorBlend","mode","cb","cs","ar","cr","ab","as","colorBlendModeFunctions","multiply","screen","overlay","softlight","sqrt","hardlight","difference","abs","exclusion","average","negation","getItemsFromNode","_SELF","~","_i","expr","values","range","step","from","to","stepValue","list","each","rs","iterator","tryEval","Quote","valueName","keyName","indexName","MathHelper","fn","mathFunctions","ceil","sin","cos","atan","asin","acos","mathHelper","fraction","num","minMax","isMin","currentUnified","referenceUnified","unitStatic","unitClone","order","convert","pi","mod","y","percentage","evaluated","encodeURI","pattern","flags","%","token","encodeURIComponent","isa","Type","isunit","isruleset","iscolor","isnumber","isstring","iskeyword","isurl","ispixel","ispercentage","isem","get-unit","colorBlending","fallback","functionThis","data-uri","mimetypeNode","filePathNode","mimetype","filePath","entryPath","fragmentStart","utils.clone","rawBuffer","getFileManager","useBase64","mimeLookup","charsetLookup","fileSync","loadFileSync","buf","encodeBase64","uri","dataUri","svg-gradient","direction","stops","gradientDirectionSvg","position","positionValue","gradientType","rectangleDimension","renderEnv","directionValue","throwArgumentDescriptor","types","evaldRoot","evalEnv","visitorIterator","preEvalVisitors","first","isPreEvalVisitor","isPreVisitor","pm","postProcessors","installedPlugins","pluginCache","Loader","PluginLoader","PluginManager","install","preProcessor","priority","indexToInsertAt","postProcessor","manager","PluginManagerFactory","newFactory","sourceMapOutput","sourceMapBuilder","parseTree","importManager","SourceMapBuilder","ParseTree","transformTree","toCSSOptions","sourceMap","getPostProcessors","file","getExternalSourceMap","files","rootFilename","SourceMapOutput","contentsIgnoredCharsMap","contentsMap","sourceMapFilename","sourceMapURL","outputFilename","sourceMapOutputFilename","sourceMapBasepath","sourceMapRootpath","outputSourceFiles","sourceMapGenerator","sourceMapFileInline","disableSourcemapAnnotation","sourceMapInputFilename","normalizeFilename","removeBasepath","getCSSAppendage","_css","_rootNode","_contentsMap","_contentsIgnoredCharsMap","_sourceMapFilename","_outputFilename","_sourceMapBasepath","_sourceMapRootpath","_outputSourceFiles","_sourceMapGeneratorConstructor","getSourceMapGenerator","_lineNumber","_column","sourceLines","columns","sourceColumns","inputSource","_sourceMapGenerator","addMapping","generated","source","sourceRoot","setSourceContent","sourceMapContent","stringify","toJSON","rootFileInfo","mime","queue","ImportManager","pluginLoader","fileParsedFunc","importedEqualsRoot","newFileInfo","loadedFile","promise","loadFileCallback","resolvedFilename","pathDiff","isPathAbsolute","alwaysMakePathsAbsolute","newEnv","evalPlugin","syncImport","loadPluginSync","loadPlugin","loadFile","then","render","utils.copyOptions","self_1","Promise","resolve","reject","Render","context_1","pluginManager_1","reUsePluginManager","imports_1","evalResult","fileContent","initial","data","ctor","api","fileCache","doXHR","errback","xhr","XMLHttpRequest","async","isFileProtocol","fileAsync","handleResponse","status","responseText","getResponseHeader","overrideMimeType","open","setRequestHeader","send","onreadystatechange","readyState","supports","clearFileCache","location","useFileCache","lessText","webInfo","lastModified","Date","log","fulfill","catch","rootHref","errorReporting","errors","errorline","classname","logLevel","errorConsole","timer","filenameNoPath","className","innerHTML","browser","style","env","setInterval","replaceChild","clearInterval","errorHTML","remove","removeErrorHTML","depends","lint","insecure","protocol","poll","hostname","port","onReady","addDefaultOptions","LESS_PLUGINS","lessRoot","FM","addFileManager","loggers","console","LogListener","ErrorReporting","cache","localStorage","setCSS","setItem","getCSS","getItem","timestamp","valueOf","Cache","imageSize","imageFunctions","image-size","image-width","image-height","ImageSize","typePattern","thisArg","curryArgs","loadStyles","instanceOptions","loadStyleSheet","reload","remaining","local","loadInitialFileCallback","loadStyleSheets","sheets","watch","watchMode","watchTimer","unwatch","registerStylesheetsImmediately","links","rel","registerStylesheets","record","refresh","startTime","endTime","totalMilliseconds","remainingSheets","refreshStyles","resolveOrReject","pageLoadFinished"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"less.min.js","sources":["../src/less-browser/utils.js","../src/less-browser/browser.js","../src/less/logger.js","../src/less/environment/environment.js","../src/less/data/colors.js","../src/less/data/unit-conversions.js","../src/less/data/index.js","../src/less/tree/node.js","../src/less/tree/color.js","../src/less/tree/paren.js","../src/less/tree/combinator.js","../src/less/tree/element.js","../src/less/constants.js","../node_modules/is-what/dist/index.esm.js","../node_modules/copy-anything/dist/index.esm.js","../src/less/utils.js","../src/less/less-error.js","../src/less/tree/selector.js","../src/less/tree/value.js","../src/less/tree/keyword.js","../src/less/tree/anonymous.js","../src/less/tree/declaration.js","../src/less/tree/debug-info.js","../src/less/tree/comment.js","../src/less/contexts.js","../src/less/functions/function-registry.js","../src/less/functions/default.js","../src/less/tree/ruleset.js","../src/less/tree/atrule.js","../src/less/tree/detached-ruleset.js","../src/less/tree/unit.js","../src/less/tree/dimension.js","../src/less/tree/operation.js","../src/less/tree/expression.js","../src/less/functions/function-caller.js","../node_modules/tslib/tslib.es6.js","../src/less/tree/call.js","../src/less/tree/variable.js","../src/less/tree/property.js","../src/less/tree/attribute.js","../src/less/tree/quoted.js","../src/less/tree/url.js","../src/less/tree/media.js","../src/less/tree/import.js","../src/less/tree/js-eval-node.js","../src/less/tree/javascript.js","../src/less/tree/assignment.js","../src/less/tree/condition.js","../src/less/tree/unicode-descriptor.js","../src/less/tree/negative.js","../src/less/tree/extend.js","../src/less/tree/variable-call.js","../src/less/tree/namespace-value.js","../src/less/tree/mixin-definition.js","../src/less/tree/mixin-call.js","../src/less/tree/index.js","../src/less/environment/abstract-file-manager.js","../src/less/environment/abstract-plugin-loader.js","../src/less/visitors/visitor.js","../src/less/visitors/import-sequencer.js","../src/less/visitors/import-visitor.js","../src/less/visitors/set-tree-visibility-visitor.js","../src/less/visitors/extend-visitor.js","../src/less/visitors/join-selector-visitor.js","../src/less/visitors/to-css-visitor.js","../src/less/visitors/index.js","../src/less/parser/parser-input.js","../src/less/parser/chunker.js","../src/less/parser/parser.js","../src/less/functions/boolean.js","../src/less/functions/color.js","../src/less/functions/color-blending.js","../src/less/functions/list.js","../src/less/functions/math-helper.js","../src/less/functions/math.js","../src/less/functions/number.js","../src/less/functions/string.js","../src/less/functions/types.js","../src/less/functions/index.js","../src/less/functions/data-uri.js","../src/less/functions/svg.js","../src/less/transform-tree.js","../src/less/plugin-manager.js","../node_modules/parse-node-version/index.js","../src/less-browser/file-manager.js","../src/less/index.js","../src/less/parse-tree.js","../src/less/source-map-builder.js","../src/less/source-map-output.js","../src/less/import-manager.js","../src/less/render.js","../src/less/parse.js","../src/less-browser/plugin-loader.js","../src/less-browser/error-reporting.js","../src/less-browser/bootstrap.js","../src/less/default-options.js","../src/less-browser/add-default-options.js","../src/less-browser/index.js","../src/less-browser/log-listener.js","../src/less-browser/cache.js","../src/less-browser/image-size.js"],"sourcesContent":["\nexport function extractId(href) {\n return href.replace(/^[a-z-]+:\\/+?[^\\/]+/, '') // Remove protocol & domain\n .replace(/[\\?\\&]livereload=\\w+/, '') // Remove LiveReload cachebuster\n .replace(/^\\//, '') // Remove root /\n .replace(/\\.[a-zA-Z]+$/, '') // Remove simple extension\n .replace(/[^\\.\\w-]+/g, '-') // Replace illegal characters\n .replace(/\\./g, ':'); // Replace dots with colons(for valid id)\n}\n\nexport function addDataAttr(options, tag) {\n for (const opt in tag.dataset) {\n if (tag.dataset.hasOwnProperty(opt)) {\n if (opt === 'env' || opt === 'dumpLineNumbers' || opt === 'rootpath' || opt === 'errorReporting') {\n options[opt] = tag.dataset[opt];\n } else {\n try {\n options[opt] = JSON.parse(tag.dataset[opt]);\n }\n catch (_) {}\n }\n }\n }\n}\n","import * as utils from './utils';\n\nexport default {\n createCSS: function (document, styles, sheet) {\n // Strip the query-string\n const href = sheet.href || '';\n\n // If there is no title set, use the filename, minus the extension\n const id = `less:${sheet.title || utils.extractId(href)}`;\n\n // If this has already been inserted into the DOM, we may need to replace it\n const oldStyleNode = document.getElementById(id);\n let keepOldStyleNode = false;\n\n // Create a new stylesheet node for insertion or (if necessary) replacement\n const styleNode = document.createElement('style');\n styleNode.setAttribute('type', 'text/css');\n if (sheet.media) {\n styleNode.setAttribute('media', sheet.media);\n }\n styleNode.id = id;\n\n if (!styleNode.styleSheet) {\n styleNode.appendChild(document.createTextNode(styles));\n\n // If new contents match contents of oldStyleNode, don't replace oldStyleNode\n keepOldStyleNode = (oldStyleNode !== null && oldStyleNode.childNodes.length > 0 && styleNode.childNodes.length > 0 &&\n oldStyleNode.firstChild.nodeValue === styleNode.firstChild.nodeValue);\n }\n\n const head = document.getElementsByTagName('head')[0];\n\n // If there is no oldStyleNode, just append; otherwise, only append if we need\n // to replace oldStyleNode with an updated stylesheet\n if (oldStyleNode === null || keepOldStyleNode === false) {\n const nextEl = sheet && sheet.nextSibling || null;\n if (nextEl) {\n nextEl.parentNode.insertBefore(styleNode, nextEl);\n } else {\n head.appendChild(styleNode);\n }\n }\n if (oldStyleNode && keepOldStyleNode === false) {\n oldStyleNode.parentNode.removeChild(oldStyleNode);\n }\n\n // For IE.\n // This needs to happen *after* the style element is added to the DOM, otherwise IE 7 and 8 may crash.\n // See http://social.msdn.microsoft.com/Forums/en-US/7e081b65-878a-4c22-8e68-c10d39c2ed32/internet-explorer-crashes-appending-style-element-to-head\n if (styleNode.styleSheet) {\n try {\n styleNode.styleSheet.cssText = styles;\n } catch (e) {\n throw new Error('Couldn\\'t reassign styleSheet.cssText.');\n }\n }\n },\n currentScript: function(window) {\n const document = window.document;\n return document.currentScript || (() => {\n const scripts = document.getElementsByTagName('script');\n return scripts[scripts.length - 1];\n })();\n }\n};\n","export default {\n error: function(msg) {\n this._fireEvent('error', msg);\n },\n warn: function(msg) {\n this._fireEvent('warn', msg);\n },\n info: function(msg) {\n this._fireEvent('info', msg);\n },\n debug: function(msg) {\n this._fireEvent('debug', msg);\n },\n addListener: function(listener) {\n this._listeners.push(listener);\n },\n removeListener: function(listener) {\n for (let i = 0; i < this._listeners.length; i++) {\n if (this._listeners[i] === listener) {\n this._listeners.splice(i, 1);\n return;\n }\n }\n },\n _fireEvent: function(type, msg) {\n for (let i = 0; i < this._listeners.length; i++) {\n const logFunction = this._listeners[i][type];\n if (logFunction) {\n logFunction(msg);\n }\n }\n },\n _listeners: []\n};\n","/**\n * @todo Document why this abstraction exists, and the relationship between\n * environment, file managers, and plugin manager\n */\n\nimport logger from '../logger';\n\nclass Environment {\n constructor(externalEnvironment, fileManagers) {\n this.fileManagers = fileManagers || [];\n externalEnvironment = externalEnvironment || {};\n\n const optionalFunctions = ['encodeBase64', 'mimeLookup', 'charsetLookup', 'getSourceMapGenerator'];\n const requiredFunctions = [];\n const functions = requiredFunctions.concat(optionalFunctions);\n\n for (let i = 0; i < functions.length; i++) {\n const propName = functions[i];\n const environmentFunc = externalEnvironment[propName];\n if (environmentFunc) {\n this[propName] = environmentFunc.bind(externalEnvironment);\n } else if (i < requiredFunctions.length) {\n this.warn(`missing required function in environment - ${propName}`);\n }\n }\n }\n\n getFileManager(filename, currentDirectory, options, environment, isSync) {\n\n if (!filename) {\n logger.warn('getFileManager called with no filename.. Please report this issue. continuing.');\n }\n if (currentDirectory == null) {\n logger.warn('getFileManager called with null directory.. Please report this issue. continuing.');\n }\n\n let fileManagers = this.fileManagers;\n if (options.pluginManager) {\n fileManagers = [].concat(fileManagers).concat(options.pluginManager.getFileManagers());\n }\n for (let i = fileManagers.length - 1; i >= 0 ; i--) {\n const fileManager = fileManagers[i];\n if (fileManager[isSync ? 'supportsSync' : 'supports'](filename, currentDirectory, options, environment)) {\n return fileManager;\n }\n }\n return null;\n }\n\n addFileManager(fileManager) {\n this.fileManagers.push(fileManager);\n }\n\n clearFileManagers() {\n this.fileManagers = [];\n }\n}\n\nexport default Environment;\n","export default {\n 'aliceblue':'#f0f8ff',\n 'antiquewhite':'#faebd7',\n 'aqua':'#00ffff',\n 'aquamarine':'#7fffd4',\n 'azure':'#f0ffff',\n 'beige':'#f5f5dc',\n 'bisque':'#ffe4c4',\n 'black':'#000000',\n 'blanchedalmond':'#ffebcd',\n 'blue':'#0000ff',\n 'blueviolet':'#8a2be2',\n 'brown':'#a52a2a',\n 'burlywood':'#deb887',\n 'cadetblue':'#5f9ea0',\n 'chartreuse':'#7fff00',\n 'chocolate':'#d2691e',\n 'coral':'#ff7f50',\n 'cornflowerblue':'#6495ed',\n 'cornsilk':'#fff8dc',\n 'crimson':'#dc143c',\n 'cyan':'#00ffff',\n 'darkblue':'#00008b',\n 'darkcyan':'#008b8b',\n 'darkgoldenrod':'#b8860b',\n 'darkgray':'#a9a9a9',\n 'darkgrey':'#a9a9a9',\n 'darkgreen':'#006400',\n 'darkkhaki':'#bdb76b',\n 'darkmagenta':'#8b008b',\n 'darkolivegreen':'#556b2f',\n 'darkorange':'#ff8c00',\n 'darkorchid':'#9932cc',\n 'darkred':'#8b0000',\n 'darksalmon':'#e9967a',\n 'darkseagreen':'#8fbc8f',\n 'darkslateblue':'#483d8b',\n 'darkslategray':'#2f4f4f',\n 'darkslategrey':'#2f4f4f',\n 'darkturquoise':'#00ced1',\n 'darkviolet':'#9400d3',\n 'deeppink':'#ff1493',\n 'deepskyblue':'#00bfff',\n 'dimgray':'#696969',\n 'dimgrey':'#696969',\n 'dodgerblue':'#1e90ff',\n 'firebrick':'#b22222',\n 'floralwhite':'#fffaf0',\n 'forestgreen':'#228b22',\n 'fuchsia':'#ff00ff',\n 'gainsboro':'#dcdcdc',\n 'ghostwhite':'#f8f8ff',\n 'gold':'#ffd700',\n 'goldenrod':'#daa520',\n 'gray':'#808080',\n 'grey':'#808080',\n 'green':'#008000',\n 'greenyellow':'#adff2f',\n 'honeydew':'#f0fff0',\n 'hotpink':'#ff69b4',\n 'indianred':'#cd5c5c',\n 'indigo':'#4b0082',\n 'ivory':'#fffff0',\n 'khaki':'#f0e68c',\n 'lavender':'#e6e6fa',\n 'lavenderblush':'#fff0f5',\n 'lawngreen':'#7cfc00',\n 'lemonchiffon':'#fffacd',\n 'lightblue':'#add8e6',\n 'lightcoral':'#f08080',\n 'lightcyan':'#e0ffff',\n 'lightgoldenrodyellow':'#fafad2',\n 'lightgray':'#d3d3d3',\n 'lightgrey':'#d3d3d3',\n 'lightgreen':'#90ee90',\n 'lightpink':'#ffb6c1',\n 'lightsalmon':'#ffa07a',\n 'lightseagreen':'#20b2aa',\n 'lightskyblue':'#87cefa',\n 'lightslategray':'#778899',\n 'lightslategrey':'#778899',\n 'lightsteelblue':'#b0c4de',\n 'lightyellow':'#ffffe0',\n 'lime':'#00ff00',\n 'limegreen':'#32cd32',\n 'linen':'#faf0e6',\n 'magenta':'#ff00ff',\n 'maroon':'#800000',\n 'mediumaquamarine':'#66cdaa',\n 'mediumblue':'#0000cd',\n 'mediumorchid':'#ba55d3',\n 'mediumpurple':'#9370d8',\n 'mediumseagreen':'#3cb371',\n 'mediumslateblue':'#7b68ee',\n 'mediumspringgreen':'#00fa9a',\n 'mediumturquoise':'#48d1cc',\n 'mediumvioletred':'#c71585',\n 'midnightblue':'#191970',\n 'mintcream':'#f5fffa',\n 'mistyrose':'#ffe4e1',\n 'moccasin':'#ffe4b5',\n 'navajowhite':'#ffdead',\n 'navy':'#000080',\n 'oldlace':'#fdf5e6',\n 'olive':'#808000',\n 'olivedrab':'#6b8e23',\n 'orange':'#ffa500',\n 'orangered':'#ff4500',\n 'orchid':'#da70d6',\n 'palegoldenrod':'#eee8aa',\n 'palegreen':'#98fb98',\n 'paleturquoise':'#afeeee',\n 'palevioletred':'#d87093',\n 'papayawhip':'#ffefd5',\n 'peachpuff':'#ffdab9',\n 'peru':'#cd853f',\n 'pink':'#ffc0cb',\n 'plum':'#dda0dd',\n 'powderblue':'#b0e0e6',\n 'purple':'#800080',\n 'rebeccapurple':'#663399',\n 'red':'#ff0000',\n 'rosybrown':'#bc8f8f',\n 'royalblue':'#4169e1',\n 'saddlebrown':'#8b4513',\n 'salmon':'#fa8072',\n 'sandybrown':'#f4a460',\n 'seagreen':'#2e8b57',\n 'seashell':'#fff5ee',\n 'sienna':'#a0522d',\n 'silver':'#c0c0c0',\n 'skyblue':'#87ceeb',\n 'slateblue':'#6a5acd',\n 'slategray':'#708090',\n 'slategrey':'#708090',\n 'snow':'#fffafa',\n 'springgreen':'#00ff7f',\n 'steelblue':'#4682b4',\n 'tan':'#d2b48c',\n 'teal':'#008080',\n 'thistle':'#d8bfd8',\n 'tomato':'#ff6347',\n 'turquoise':'#40e0d0',\n 'violet':'#ee82ee',\n 'wheat':'#f5deb3',\n 'white':'#ffffff',\n 'whitesmoke':'#f5f5f5',\n 'yellow':'#ffff00',\n 'yellowgreen':'#9acd32'\n};","export default {\n length: {\n 'm': 1,\n 'cm': 0.01,\n 'mm': 0.001,\n 'in': 0.0254,\n 'px': 0.0254 / 96,\n 'pt': 0.0254 / 72,\n 'pc': 0.0254 / 72 * 12\n },\n duration: {\n 's': 1,\n 'ms': 0.001\n },\n angle: {\n 'rad': 1 / (2 * Math.PI),\n 'deg': 1 / 360,\n 'grad': 1 / 400,\n 'turn': 1\n }\n};","import colors from './colors';\nimport unitConversions from './unit-conversions';\n\nexport default { colors, unitConversions };\n","/**\n * The reason why Node is a class and other nodes simply do not extend\n * from Node (since we're transpiling) is due to this issue:\n * \n * https://github.com/less/less.js/issues/3434\n */\nclass Node {\n constructor() {\n this.parent = null;\n this.visibilityBlocks = undefined;\n this.nodeVisible = undefined;\n this.rootNode = null;\n this.parsed = null;\n\n const self = this;\n Object.defineProperty(this, 'currentFileInfo', {\n get: function() { return self.fileInfo(); }\n });\n Object.defineProperty(this, 'index', {\n get: function() { return self.getIndex(); }\n });\n\n }\n\n setParent(nodes, parent) {\n function set(node) {\n if (node && node instanceof Node) {\n node.parent = parent;\n }\n }\n if (Array.isArray(nodes)) {\n nodes.forEach(set);\n }\n else {\n set(nodes);\n }\n }\n\n getIndex() {\n return this._index || (this.parent && this.parent.getIndex()) || 0;\n }\n\n fileInfo() {\n return this._fileInfo || (this.parent && this.parent.fileInfo()) || {};\n }\n\n isRulesetLike() { return false; }\n\n toCSS(context) {\n const strs = [];\n this.genCSS(context, {\n add: function(chunk, fileInfo, index) {\n strs.push(chunk);\n },\n isEmpty: function () {\n return strs.length === 0;\n }\n });\n return strs.join('');\n }\n\n genCSS(context, output) {\n output.add(this.value);\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n eval() { return this; }\n\n _operate(context, op, a, b) {\n switch (op) {\n case '+': return a + b;\n case '-': return a - b;\n case '*': return a * b;\n case '/': return a / b;\n }\n }\n\n fround(context, value) {\n const precision = context && context.numPrecision;\n // add \"epsilon\" to ensure numbers like 1.000000005 (represented as 1.000000004999...) are properly rounded:\n return (precision) ? Number((value + 2e-16).toFixed(precision)) : value;\n }\n\n static compare(a, b) {\n /* returns:\n -1: a < b\n 0: a = b\n 1: a > b\n and *any* other value for a != b (e.g. undefined, NaN, -2 etc.) */\n\n if ((a.compare) &&\n // for \"symmetric results\" force toCSS-based comparison\n // of Quoted or Anonymous if either value is one of those\n !(b.type === 'Quoted' || b.type === 'Anonymous')) {\n return a.compare(b);\n } else if (b.compare) {\n return -b.compare(a);\n } else if (a.type !== b.type) {\n return undefined;\n }\n\n a = a.value;\n b = b.value;\n if (!Array.isArray(a)) {\n return a === b ? 0 : undefined;\n }\n if (a.length !== b.length) {\n return undefined;\n }\n for (let i = 0; i < a.length; i++) {\n if (Node.compare(a[i], b[i]) !== 0) {\n return undefined;\n }\n }\n return 0;\n }\n\n static numericCompare(a, b) {\n return a < b ? -1\n : a === b ? 0\n : a > b ? 1 : undefined;\n }\n\n // Returns true if this node represents root of ast imported by reference\n blocksVisibility() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n return this.visibilityBlocks !== 0;\n }\n\n addVisibilityBlock() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks + 1;\n }\n\n removeVisibilityBlock() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks - 1;\n }\n\n // Turns on node visibility - if called node will be shown in output regardless\n // of whether it comes from import by reference or not\n ensureVisibility() {\n this.nodeVisible = true;\n }\n\n // Turns off node visibility - if called node will NOT be shown in output regardless\n // of whether it comes from import by reference or not\n ensureInvisibility() {\n this.nodeVisible = false;\n }\n\n // return values:\n // false - the node must not be visible\n // true - the node must be visible\n // undefined or null - the node has the same visibility as its parent\n isVisible() {\n return this.nodeVisible;\n }\n\n visibilityInfo() {\n return {\n visibilityBlocks: this.visibilityBlocks,\n nodeVisible: this.nodeVisible\n };\n }\n\n copyVisibilityInfo(info) {\n if (!info) {\n return;\n }\n this.visibilityBlocks = info.visibilityBlocks;\n this.nodeVisible = info.nodeVisible;\n }\n}\n\nexport default Node;\n","import Node from './node';\nimport colors from '../data/colors';\n\n//\n// RGB Colors - #ff0014, #eee\n//\nconst Color = function(rgb, a, originalForm) {\n const self = this;\n //\n // The end goal here, is to parse the arguments\n // into an integer triplet, such as `128, 255, 0`\n //\n // This facilitates operations and conversions.\n //\n if (Array.isArray(rgb)) {\n this.rgb = rgb;\n } else if (rgb.length >= 6) {\n this.rgb = [];\n rgb.match(/.{2}/g).map(function (c, i) {\n if (i < 3) {\n self.rgb.push(parseInt(c, 16));\n } else {\n self.alpha = (parseInt(c, 16)) / 255;\n }\n });\n } else {\n this.rgb = [];\n rgb.split('').map(function (c, i) {\n if (i < 3) {\n self.rgb.push(parseInt(c + c, 16));\n } else {\n self.alpha = (parseInt(c + c, 16)) / 255;\n }\n });\n }\n this.alpha = this.alpha || (typeof a === 'number' ? a : 1);\n if (typeof originalForm !== 'undefined') {\n this.value = originalForm;\n }\n}\n\nColor.prototype = Object.assign(new Node(), {\n type: 'Color',\n\n luma() {\n let r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255;\n\n r = (r <= 0.03928) ? r / 12.92 : Math.pow(((r + 0.055) / 1.055), 2.4);\n g = (g <= 0.03928) ? g / 12.92 : Math.pow(((g + 0.055) / 1.055), 2.4);\n b = (b <= 0.03928) ? b / 12.92 : Math.pow(((b + 0.055) / 1.055), 2.4);\n\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n },\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n },\n\n toCSS(context, doNotCompress) {\n const compress = context && context.compress && !doNotCompress;\n let color;\n let alpha;\n let colorFunction;\n let args = [];\n\n // `value` is set if this color was originally\n // converted from a named color string so we need\n // to respect this and try to output named color too.\n alpha = this.fround(context, this.alpha);\n\n if (this.value) {\n if (this.value.indexOf('rgb') === 0) {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n } else if (this.value.indexOf('hsl') === 0) {\n if (alpha < 1) {\n colorFunction = 'hsla';\n } else {\n colorFunction = 'hsl';\n }\n } else {\n return this.value;\n }\n } else {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n }\n\n switch (colorFunction) {\n case 'rgba':\n args = this.rgb.map(function (c) {\n return clamp(Math.round(c), 255);\n }).concat(clamp(alpha, 1));\n break;\n case 'hsla':\n args.push(clamp(alpha, 1));\n case 'hsl':\n color = this.toHSL();\n args = [\n this.fround(context, color.h),\n `${this.fround(context, color.s * 100)}%`,\n `${this.fround(context, color.l * 100)}%`\n ].concat(args);\n }\n\n if (colorFunction) {\n // Values are capped between `0` and `255`, rounded and zero-padded.\n return `${colorFunction}(${args.join(`,${compress ? '' : ' '}`)})`;\n }\n\n color = this.toRGB();\n\n if (compress) {\n const splitcolor = color.split('');\n\n // Convert color to short format\n if (splitcolor[1] === splitcolor[2] && splitcolor[3] === splitcolor[4] && splitcolor[5] === splitcolor[6]) {\n color = `#${splitcolor[1]}${splitcolor[3]}${splitcolor[5]}`;\n }\n }\n\n return color;\n },\n\n //\n // Operations have to be done per-channel, if not,\n // channels will spill onto each other. Once we have\n // our result, in the form of an integer triplet,\n // we create a new Color node to hold the result.\n //\n operate(context, op, other) {\n const rgb = new Array(3);\n const alpha = this.alpha * (1 - other.alpha) + other.alpha;\n for (let c = 0; c < 3; c++) {\n rgb[c] = this._operate(context, op, this.rgb[c], other.rgb[c]);\n }\n return new Color(rgb, alpha);\n },\n\n toRGB() {\n return toHex(this.rgb);\n },\n\n toHSL() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h;\n let s;\n const l = (max + min) / 2;\n const d = max - min;\n\n if (max === min) {\n h = s = 0;\n } else {\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, l, a };\n },\n\n // Adapted from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript\n toHSV() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h;\n let s;\n const v = max;\n\n const d = max - min;\n if (max === 0) {\n s = 0;\n } else {\n s = d / max;\n }\n\n if (max === min) {\n h = 0;\n } else {\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, v, a };\n },\n\n toARGB() {\n return toHex([this.alpha * 255].concat(this.rgb));\n },\n\n compare(x) {\n return (x.rgb &&\n x.rgb[0] === this.rgb[0] &&\n x.rgb[1] === this.rgb[1] &&\n x.rgb[2] === this.rgb[2] &&\n x.alpha === this.alpha) ? 0 : undefined;\n }\n});\n\nColor.fromKeyword = function(keyword) {\n let c;\n const key = keyword.toLowerCase();\n if (colors.hasOwnProperty(key)) {\n c = new Color(colors[key].slice(1));\n }\n else if (key === 'transparent') {\n c = new Color([0, 0, 0], 0);\n }\n\n if (c) {\n c.value = keyword;\n return c;\n }\n};\n\nfunction clamp(v, max) {\n return Math.min(Math.max(v, 0), max);\n}\n\nfunction toHex(v) {\n return `#${v.map(function (c) {\n c = clamp(Math.round(c), 255);\n return (c < 16 ? '0' : '') + c.toString(16);\n }).join('')}`;\n}\n\nexport default Color;\n","import Node from './node';\n\nconst Paren = function(node) {\n this.value = node;\n};\n\nParen.prototype = Object.assign(new Node(), {\n type: 'Paren',\n\n genCSS(context, output) {\n output.add('(');\n this.value.genCSS(context, output);\n output.add(')');\n },\n\n eval(context) {\n return new Paren(this.value.eval(context));\n }\n});\n\nexport default Paren;\n","import Node from './node';\nconst _noSpaceCombinators = {\n '': true,\n ' ': true,\n '|': true\n};\n\nconst Combinator = function(value) {\n if (value === ' ') {\n this.value = ' ';\n this.emptyOrWhitespace = true;\n } else {\n this.value = value ? value.trim() : '';\n this.emptyOrWhitespace = this.value === '';\n }\n}\n\nCombinator.prototype = Object.assign(new Node(), {\n type: 'Combinator',\n\n genCSS(context, output) {\n const spaceOrEmpty = (context.compress || _noSpaceCombinators[this.value]) ? '' : ' ';\n output.add(spaceOrEmpty + this.value + spaceOrEmpty);\n }\n});\n\nexport default Combinator;\n","import Node from './node';\nimport Paren from './paren';\nimport Combinator from './combinator';\n\nconst Element = function(combinator, value, isVariable, index, currentFileInfo, visibilityInfo) {\n this.combinator = combinator instanceof Combinator ?\n combinator : new Combinator(combinator);\n\n if (typeof value === 'string') {\n this.value = value.trim();\n } else if (value) {\n this.value = value;\n } else {\n this.value = '';\n }\n this.isVariable = isVariable;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.combinator, this);\n}\n\nElement.prototype = Object.assign(new Node(), {\n type: 'Element',\n\n accept(visitor) {\n const value = this.value;\n this.combinator = visitor.visit(this.combinator);\n if (typeof value === 'object') {\n this.value = visitor.visit(value);\n }\n },\n\n eval(context) {\n return new Element(this.combinator,\n this.value.eval ? this.value.eval(context) : this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n },\n\n clone() {\n return new Element(this.combinator,\n this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n },\n\n genCSS(context, output) {\n output.add(this.toCSS(context), this.fileInfo(), this.getIndex());\n },\n\n toCSS(context) {\n context = context || {};\n let value = this.value;\n const firstSelector = context.firstSelector;\n if (value instanceof Paren) {\n // selector in parens should not be affected by outer selector\n // flags (breaks only interpolated selectors - see #1973)\n context.firstSelector = true;\n }\n value = value.toCSS ? value.toCSS(context) : value;\n context.firstSelector = firstSelector;\n if (value === '' && this.combinator.value.charAt(0) === '&') {\n return '';\n } else {\n return this.combinator.toCSS(context) + value;\n }\n }\n});\n\nexport default Element;\n","\nexport const Math = {\n ALWAYS: 0,\n PARENS_DIVISION: 1,\n PARENS: 2\n // removed - STRICT_LEGACY: 3\n};\n\nexport const RewriteUrls = {\n OFF: 0,\n LOCAL: 1,\n ALL: 2\n};","/**\r\n * Returns the object type of the given payload\r\n *\r\n * @param {*} payload\r\n * @returns {string}\r\n */\r\nfunction getType(payload) {\r\n return Object.prototype.toString.call(payload).slice(8, -1);\r\n}\r\n/**\r\n * Returns whether the payload is undefined\r\n *\r\n * @param {*} payload\r\n * @returns {payload is undefined}\r\n */\r\nfunction isUndefined(payload) {\r\n return getType(payload) === 'Undefined';\r\n}\r\n/**\r\n * Returns whether the payload is null\r\n *\r\n * @param {*} payload\r\n * @returns {payload is null}\r\n */\r\nfunction isNull(payload) {\r\n return getType(payload) === 'Null';\r\n}\r\n/**\r\n * Returns whether the payload is a plain JavaScript object (excluding special classes or objects with other prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Record}\r\n */\r\nfunction isPlainObject(payload) {\r\n if (getType(payload) !== 'Object')\r\n return false;\r\n return payload.constructor === Object && Object.getPrototypeOf(payload) === Object.prototype;\r\n}\r\n/**\r\n * Returns whether the payload is a plain JavaScript object (excluding special classes or objects with other prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Record}\r\n */\r\nfunction isObject(payload) {\r\n return isPlainObject(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a an empty object (excluding special classes or objects with other prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is { [K in any]: never }}\r\n */\r\nfunction isEmptyObject(payload) {\r\n return isPlainObject(payload) && Object.keys(payload).length === 0;\r\n}\r\n/**\r\n * Returns whether the payload is an any kind of object (including special classes or objects with different prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Record}\r\n */\r\nfunction isAnyObject(payload) {\r\n return getType(payload) === 'Object';\r\n}\r\n/**\r\n * Returns whether the payload is an object like a type passed in < >\r\n *\r\n * Usage: isObjectLike<{id: any}>(payload) // will make sure it's an object and has an `id` prop.\r\n *\r\n * @template T this must be passed in < >\r\n * @param {*} payload\r\n * @returns {payload is T}\r\n */\r\nfunction isObjectLike(payload) {\r\n return isAnyObject(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a function (regular or async)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is AnyFunction}\r\n */\r\nfunction isFunction(payload) {\r\n return typeof payload === \"function\";\r\n}\r\n/**\r\n * Returns whether the payload is an array\r\n *\r\n * @param {any} payload\r\n * @returns {payload is any[]}\r\n */\r\nfunction isArray(payload) {\r\n return getType(payload) === 'Array';\r\n}\r\n/**\r\n * Returns whether the payload is a an array with at least 1 item\r\n *\r\n * @param {*} payload\r\n * @returns {payload is any[]}\r\n */\r\nfunction isFullArray(payload) {\r\n return isArray(payload) && payload.length > 0;\r\n}\r\n/**\r\n * Returns whether the payload is a an empty array\r\n *\r\n * @param {*} payload\r\n * @returns {payload is []}\r\n */\r\nfunction isEmptyArray(payload) {\r\n return isArray(payload) && payload.length === 0;\r\n}\r\n/**\r\n * Returns whether the payload is a string\r\n *\r\n * @param {*} payload\r\n * @returns {payload is string}\r\n */\r\nfunction isString(payload) {\r\n return getType(payload) === 'String';\r\n}\r\n/**\r\n * Returns whether the payload is a string, BUT returns false for ''\r\n *\r\n * @param {*} payload\r\n * @returns {payload is string}\r\n */\r\nfunction isFullString(payload) {\r\n return isString(payload) && payload !== '';\r\n}\r\n/**\r\n * Returns whether the payload is ''\r\n *\r\n * @param {*} payload\r\n * @returns {payload is string}\r\n */\r\nfunction isEmptyString(payload) {\r\n return payload === '';\r\n}\r\n/**\r\n * Returns whether the payload is a number (but not NaN)\r\n *\r\n * This will return `false` for `NaN`!!\r\n *\r\n * @param {*} payload\r\n * @returns {payload is number}\r\n */\r\nfunction isNumber(payload) {\r\n return getType(payload) === 'Number' && !isNaN(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a boolean\r\n *\r\n * @param {*} payload\r\n * @returns {payload is boolean}\r\n */\r\nfunction isBoolean(payload) {\r\n return getType(payload) === 'Boolean';\r\n}\r\n/**\r\n * Returns whether the payload is a regular expression (RegExp)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is RegExp}\r\n */\r\nfunction isRegExp(payload) {\r\n return getType(payload) === 'RegExp';\r\n}\r\n/**\r\n * Returns whether the payload is a Map\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Map}\r\n */\r\nfunction isMap(payload) {\r\n return getType(payload) === 'Map';\r\n}\r\n/**\r\n * Returns whether the payload is a WeakMap\r\n *\r\n * @param {*} payload\r\n * @returns {payload is WeakMap}\r\n */\r\nfunction isWeakMap(payload) {\r\n return getType(payload) === 'WeakMap';\r\n}\r\n/**\r\n * Returns whether the payload is a Set\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Set}\r\n */\r\nfunction isSet(payload) {\r\n return getType(payload) === 'Set';\r\n}\r\n/**\r\n * Returns whether the payload is a WeakSet\r\n *\r\n * @param {*} payload\r\n * @returns {payload is WeakSet}\r\n */\r\nfunction isWeakSet(payload) {\r\n return getType(payload) === 'WeakSet';\r\n}\r\n/**\r\n * Returns whether the payload is a Symbol\r\n *\r\n * @param {*} payload\r\n * @returns {payload is symbol}\r\n */\r\nfunction isSymbol(payload) {\r\n return getType(payload) === 'Symbol';\r\n}\r\n/**\r\n * Returns whether the payload is a Date, and that the date is valid\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Date}\r\n */\r\nfunction isDate(payload) {\r\n return getType(payload) === 'Date' && !isNaN(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a Blob\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Blob}\r\n */\r\nfunction isBlob(payload) {\r\n return getType(payload) === 'Blob';\r\n}\r\n/**\r\n * Returns whether the payload is a File\r\n *\r\n * @param {*} payload\r\n * @returns {payload is File}\r\n */\r\nfunction isFile(payload) {\r\n return getType(payload) === 'File';\r\n}\r\n/**\r\n * Returns whether the payload is a Promise\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Promise}\r\n */\r\nfunction isPromise(payload) {\r\n return getType(payload) === 'Promise';\r\n}\r\n/**\r\n * Returns whether the payload is an Error\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Error}\r\n */\r\nfunction isError(payload) {\r\n return getType(payload) === 'Error';\r\n}\r\n/**\r\n * Returns whether the payload is literally the value `NaN` (it's `NaN` and also a `number`)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is typeof NaN}\r\n */\r\nfunction isNaNValue(payload) {\r\n return getType(payload) === 'Number' && isNaN(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a primitive type (eg. Boolean | Null | Undefined | Number | String | Symbol)\r\n *\r\n * @param {*} payload\r\n * @returns {(payload is boolean | null | undefined | number | string | symbol)}\r\n */\r\nfunction isPrimitive(payload) {\r\n return (isBoolean(payload) ||\r\n isNull(payload) ||\r\n isUndefined(payload) ||\r\n isNumber(payload) ||\r\n isString(payload) ||\r\n isSymbol(payload));\r\n}\r\n/**\r\n * Returns true whether the payload is null or undefined\r\n *\r\n * @param {*} payload\r\n * @returns {(payload is null | undefined)}\r\n */\r\nfunction isNullOrUndefined(payload) {\r\n return isNull(payload) || isUndefined(payload);\r\n}\r\n/**\r\n * Does a generic check to check that the given payload is of a given type.\r\n * In cases like Number, it will return true for NaN as NaN is a Number (thanks javascript!);\r\n * It will, however, differentiate between object and null\r\n *\r\n * @template T\r\n * @param {*} payload\r\n * @param {T} type\r\n * @throws {TypeError} Will throw type error if type is an invalid type\r\n * @returns {payload is T}\r\n */\r\nfunction isType(payload, type) {\r\n if (!(type instanceof Function)) {\r\n throw new TypeError('Type must be a function');\r\n }\r\n if (!Object.prototype.hasOwnProperty.call(type, 'prototype')) {\r\n throw new TypeError('Type is not a class');\r\n }\r\n // Classes usually have names (as functions usually have names)\r\n var name = type.name;\r\n return getType(payload) === name || Boolean(payload && payload.constructor === type);\r\n}\n\nexport { getType, isAnyObject, isArray, isBlob, isBoolean, isDate, isEmptyArray, isEmptyObject, isEmptyString, isError, isFile, isFullArray, isFullString, isFunction, isMap, isNaNValue, isNull, isNullOrUndefined, isNumber, isObject, isObjectLike, isPlainObject, isPrimitive, isPromise, isRegExp, isSet, isString, isSymbol, isType, isUndefined, isWeakMap, isWeakSet };\n","import { isArray, isPlainObject } from 'is-what';\n\n/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n\r\nfunction __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\n\nfunction assignProp(carry, key, newVal, originalObject, includeNonenumerable) {\r\n var propType = {}.propertyIsEnumerable.call(originalObject, key)\r\n ? 'enumerable'\r\n : 'nonenumerable';\r\n if (propType === 'enumerable')\r\n carry[key] = newVal;\r\n if (includeNonenumerable && propType === 'nonenumerable') {\r\n Object.defineProperty(carry, key, {\r\n value: newVal,\r\n enumerable: false,\r\n writable: true,\r\n configurable: true,\r\n });\r\n }\r\n}\r\n/**\r\n * Copy (clone) an object and all its props recursively to get rid of any prop referenced of the original object. Arrays are also cloned, however objects inside arrays are still linked.\r\n *\r\n * @export\r\n * @template T\r\n * @param {T} target Target can be anything\r\n * @param {Options} [options={}] Options can be `props` or `nonenumerable`\r\n * @returns {T} the target with replaced values\r\n * @export\r\n */\r\nfunction copy(target, options) {\r\n if (options === void 0) { options = {}; }\r\n if (isArray(target))\r\n return target.map(function (i) { return copy(i, options); });\r\n if (!isPlainObject(target))\r\n return target;\r\n var props = Object.getOwnPropertyNames(target);\r\n var symbols = Object.getOwnPropertySymbols(target);\r\n return __spreadArrays(props, symbols).reduce(function (carry, key) {\r\n if (isArray(options.props) && !options.props.includes(key)) {\r\n return carry;\r\n }\r\n var val = target[key];\r\n var newVal = copy(val, options);\r\n assignProp(carry, key, newVal, target, options.nonenumerable);\r\n return carry;\r\n }, {});\r\n}\n\nexport { copy };\n","/* jshint proto: true */\nimport * as Constants from './constants';\nimport { copy } from 'copy-anything';\n\nexport function getLocation(index, inputStream) {\n let n = index + 1;\n let line = null;\n let column = -1;\n\n while (--n >= 0 && inputStream.charAt(n) !== '\\n') {\n column++;\n }\n\n if (typeof index === 'number') {\n line = (inputStream.slice(0, index).match(/\\n/g) || '').length;\n }\n\n return {\n line,\n column\n };\n}\n\nexport function copyArray(arr) {\n let i;\n const length = arr.length;\n const copy = new Array(length);\n\n for (i = 0; i < length; i++) {\n copy[i] = arr[i];\n }\n return copy;\n}\n\nexport function clone(obj) {\n const cloned = {};\n for (const prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n cloned[prop] = obj[prop];\n }\n }\n return cloned;\n}\n\nexport function defaults(obj1, obj2) {\n let newObj = obj2 || {};\n if (!obj2._defaults) {\n newObj = {};\n const defaults = copy(obj1);\n newObj._defaults = defaults;\n const cloned = obj2 ? copy(obj2) : {};\n Object.assign(newObj, defaults, cloned);\n }\n return newObj;\n}\n\nexport function copyOptions(obj1, obj2) {\n if (obj2 && obj2._defaults) {\n return obj2;\n }\n const opts = defaults(obj1, obj2);\n if (opts.strictMath) {\n opts.math = Constants.Math.PARENS;\n }\n // Back compat with changed relativeUrls option\n if (opts.relativeUrls) {\n opts.rewriteUrls = Constants.RewriteUrls.ALL;\n }\n if (typeof opts.math === 'string') {\n switch (opts.math.toLowerCase()) {\n case 'always':\n opts.math = Constants.Math.ALWAYS;\n break;\n case 'parens-division':\n opts.math = Constants.Math.PARENS_DIVISION;\n break;\n case 'strict':\n case 'parens':\n opts.math = Constants.Math.PARENS;\n break;\n default:\n opts.math = Constants.Math.PARENS;\n }\n }\n if (typeof opts.rewriteUrls === 'string') {\n switch (opts.rewriteUrls.toLowerCase()) {\n case 'off':\n opts.rewriteUrls = Constants.RewriteUrls.OFF;\n break;\n case 'local':\n opts.rewriteUrls = Constants.RewriteUrls.LOCAL;\n break;\n case 'all':\n opts.rewriteUrls = Constants.RewriteUrls.ALL;\n break;\n }\n }\n return opts;\n}\n\nexport function merge(obj1, obj2) {\n for (const prop in obj2) {\n if (obj2.hasOwnProperty(prop)) {\n obj1[prop] = obj2[prop];\n }\n }\n return obj1;\n}\n\nexport function flattenArray(arr, result = []) {\n for (let i = 0, length = arr.length; i < length; i++) {\n const value = arr[i];\n if (Array.isArray(value)) {\n flattenArray(value, result);\n } else {\n if (value !== undefined) {\n result.push(value);\n }\n }\n }\n return result;\n}","import * as utils from './utils';\n\nconst anonymousFunc = /(|Function):(\\d+):(\\d+)/;\n\n/**\n * This is a centralized class of any error that could be thrown internally (mostly by the parser).\n * Besides standard .message it keeps some additional data like a path to the file where the error\n * occurred along with line and column numbers.\n *\n * @class\n * @extends Error\n * @type {module.LessError}\n *\n * @prop {string} type\n * @prop {string} filename\n * @prop {number} index\n * @prop {number} line\n * @prop {number} column\n * @prop {number} callLine\n * @prop {number} callExtract\n * @prop {string[]} extract\n *\n * @param {Object} e - An error object to wrap around or just a descriptive object\n * @param {Object} fileContentMap - An object with file contents in 'contents' property (like importManager) @todo - move to fileManager?\n * @param {string} [currentFilename]\n */\nconst LessError = function(e, fileContentMap, currentFilename) {\n Error.call(this);\n\n const filename = e.filename || currentFilename;\n\n this.message = e.message;\n this.stack = e.stack;\n\n if (fileContentMap && filename) {\n const input = fileContentMap.contents[filename];\n const loc = utils.getLocation(e.index, input);\n var line = loc.line;\n const col = loc.column;\n const callLine = e.call && utils.getLocation(e.call, input).line;\n const lines = input ? input.split('\\n') : '';\n\n this.type = e.type || 'Syntax';\n this.filename = filename;\n this.index = e.index;\n this.line = typeof line === 'number' ? line + 1 : null;\n this.column = col;\n\n if (!this.line && this.stack) {\n const found = this.stack.match(anonymousFunc);\n\n /**\n * We have to figure out how this environment stringifies anonymous functions\n * so we can correctly map plugin errors.\n * \n * Note, in Node 8, the output of anonymous funcs varied based on parameters\n * being present or not, so we inject dummy params.\n */\n const func = new Function('a', 'throw new Error()');\n let lineAdjust = 0;\n try {\n func();\n } catch (e) {\n const match = e.stack.match(anonymousFunc);\n var line = parseInt(match[2]);\n lineAdjust = 1 - line;\n }\n\n if (found) {\n if (found[2]) {\n this.line = parseInt(found[2]) + lineAdjust;\n }\n if (found[3]) {\n this.column = parseInt(found[3]);\n }\n }\n }\n\n this.callLine = callLine + 1;\n this.callExtract = lines[callLine];\n\n this.extract = [\n lines[this.line - 2],\n lines[this.line - 1],\n lines[this.line]\n ];\n }\n\n};\n\nif (typeof Object.create === 'undefined') {\n const F = function () {};\n F.prototype = Error.prototype;\n LessError.prototype = new F();\n} else {\n LessError.prototype = Object.create(Error.prototype);\n}\n\nLessError.prototype.constructor = LessError;\n\n/**\n * An overridden version of the default Object.prototype.toString\n * which uses additional information to create a helpful message.\n *\n * @param {Object} options\n * @returns {string}\n */\nLessError.prototype.toString = function(options) {\n options = options || {};\n\n let message = '';\n const extract = this.extract || [];\n let error = [];\n let stylize = function (str) { return str; };\n if (options.stylize) {\n const type = typeof options.stylize;\n if (type !== 'function') {\n throw Error(`options.stylize should be a function, got a ${type}!`);\n }\n stylize = options.stylize;\n }\n\n if (this.line !== null) {\n if (typeof extract[0] === 'string') {\n error.push(stylize(`${this.line - 1} ${extract[0]}`, 'grey'));\n }\n\n if (typeof extract[1] === 'string') {\n let errorTxt = `${this.line} `;\n if (extract[1]) {\n errorTxt += extract[1].slice(0, this.column) +\n stylize(stylize(stylize(extract[1].substr(this.column, 1), 'bold') +\n extract[1].slice(this.column + 1), 'red'), 'inverse');\n }\n error.push(errorTxt);\n }\n\n if (typeof extract[2] === 'string') {\n error.push(stylize(`${this.line + 1} ${extract[2]}`, 'grey'));\n }\n error = `${error.join('\\n') + stylize('', 'reset')}\\n`;\n }\n\n message += stylize(`${this.type}Error: ${this.message}`, 'red');\n if (this.filename) {\n message += stylize(' in ', 'red') + this.filename;\n }\n if (this.line) {\n message += stylize(` on line ${this.line}, column ${this.column + 1}:`, 'grey');\n }\n\n message += `\\n${error}`;\n\n if (this.callLine) {\n message += `${stylize('from ', 'red') + (this.filename || '')}/n`;\n message += `${stylize(this.callLine, 'grey')} ${this.callExtract}/n`;\n }\n\n return message;\n};\n\nexport default LessError;","import Node from './node';\nimport Element from './element';\nimport LessError from '../less-error';\n\nconst Selector = function(elements, extendList, condition, index, currentFileInfo, visibilityInfo) {\n this.extendList = extendList;\n this.condition = condition;\n this.evaldCondition = !condition;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.elements = this.getElements(elements);\n this.mixinElements_ = undefined;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.elements, this);\n};\n\nSelector.prototype = Object.assign(new Node(), {\n type: 'Selector',\n\n accept(visitor) {\n if (this.elements) {\n this.elements = visitor.visitArray(this.elements);\n }\n if (this.extendList) {\n this.extendList = visitor.visitArray(this.extendList);\n }\n if (this.condition) {\n this.condition = visitor.visit(this.condition);\n }\n },\n\n createDerived(elements, extendList, evaldCondition) {\n elements = this.getElements(elements);\n const newSelector = new Selector(elements, extendList || this.extendList,\n null, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n newSelector.evaldCondition = (evaldCondition != null) ? evaldCondition : this.evaldCondition;\n newSelector.mediaEmpty = this.mediaEmpty;\n return newSelector;\n },\n\n getElements(els) {\n if (!els) {\n return [new Element('', '&', false, this._index, this._fileInfo)];\n }\n if (typeof els === 'string') {\n this.parse.parseNode(\n els, \n ['selector'],\n this._index, \n this._fileInfo, \n function(err, result) {\n if (err) {\n throw new LessError({\n index: err.index,\n message: err.message\n }, this.parse.imports, this._fileInfo.filename);\n }\n els = result[0].elements;\n });\n }\n return els;\n },\n\n createEmptySelectors() {\n const el = new Element('', '&', false, this._index, this._fileInfo), sels = [new Selector([el], null, null, this._index, this._fileInfo)];\n sels[0].mediaEmpty = true;\n return sels;\n },\n\n match(other) {\n const elements = this.elements;\n const len = elements.length;\n let olen;\n let i;\n\n other = other.mixinElements();\n olen = other.length;\n if (olen === 0 || len < olen) {\n return 0;\n } else {\n for (i = 0; i < olen; i++) {\n if (elements[i].value !== other[i]) {\n return 0;\n }\n }\n }\n\n return olen; // return number of matched elements\n },\n\n mixinElements() {\n if (this.mixinElements_) {\n return this.mixinElements_;\n }\n\n let elements = this.elements.map( function(v) {\n return v.combinator.value + (v.value.value || v.value);\n }).join('').match(/[,&#\\*\\.\\w-]([\\w-]|(\\\\.))*/g);\n\n if (elements) {\n if (elements[0] === '&') {\n elements.shift();\n }\n } else {\n elements = [];\n }\n\n return (this.mixinElements_ = elements);\n },\n\n isJustParentSelector() {\n return !this.mediaEmpty &&\n this.elements.length === 1 &&\n this.elements[0].value === '&' &&\n (this.elements[0].combinator.value === ' ' || this.elements[0].combinator.value === '');\n },\n\n eval(context) {\n const evaldCondition = this.condition && this.condition.eval(context);\n let elements = this.elements;\n let extendList = this.extendList;\n\n elements = elements && elements.map(function (e) { return e.eval(context); });\n extendList = extendList && extendList.map(function(extend) { return extend.eval(context); });\n\n return this.createDerived(elements, extendList, evaldCondition);\n },\n\n genCSS(context, output) {\n let i, element;\n if ((!context || !context.firstSelector) && this.elements[0].combinator.value === '') {\n output.add(' ', this.fileInfo(), this.getIndex());\n }\n for (i = 0; i < this.elements.length; i++) {\n element = this.elements[i];\n element.genCSS(context, output);\n }\n },\n\n getIsOutput() {\n return this.evaldCondition;\n }\n});\n\nexport default Selector;\n","import Node from './node';\n\nconst Value = function(value) {\n if (!value) {\n throw new Error('Value requires an array argument');\n }\n if (!Array.isArray(value)) {\n this.value = [ value ];\n }\n else {\n this.value = value;\n }\n};\n\nValue.prototype = Object.assign(new Node(), {\n type: 'Value',\n\n accept(visitor) {\n if (this.value) {\n this.value = visitor.visitArray(this.value);\n }\n },\n\n eval(context) {\n if (this.value.length === 1) {\n return this.value[0].eval(context);\n } else {\n return new Value(this.value.map(function (v) {\n return v.eval(context);\n }));\n }\n },\n\n genCSS(context, output) {\n let i;\n for (i = 0; i < this.value.length; i++) {\n this.value[i].genCSS(context, output);\n if (i + 1 < this.value.length) {\n output.add((context && context.compress) ? ',' : ', ');\n }\n }\n }\n});\n\nexport default Value;\n","import Node from './node';\n\nconst Keyword = function(value) {\n this.value = value;\n};\n\nKeyword.prototype = Object.assign(new Node(), {\n type: 'Keyword',\n\n genCSS(context, output) {\n if (this.value === '%') { throw { type: 'Syntax', message: 'Invalid % without number' }; }\n output.add(this.value);\n }\n});\n\nKeyword.True = new Keyword('true');\nKeyword.False = new Keyword('false');\n\nexport default Keyword;\n","import Node from './node';\n\nconst Anonymous = function(value, index, currentFileInfo, mapLines, rulesetLike, visibilityInfo) {\n this.value = value;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.mapLines = mapLines;\n this.rulesetLike = (typeof rulesetLike === 'undefined') ? false : rulesetLike;\n this.allowRoot = true;\n this.copyVisibilityInfo(visibilityInfo);\n}\n\nAnonymous.prototype = Object.assign(new Node(), {\n type: 'Anonymous',\n eval() {\n return new Anonymous(this.value, this._index, this._fileInfo, this.mapLines, this.rulesetLike, this.visibilityInfo());\n },\n compare(other) {\n return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n },\n isRulesetLike() {\n return this.rulesetLike;\n },\n genCSS(context, output) {\n this.nodeVisible = Boolean(this.value);\n if (this.nodeVisible) {\n output.add(this.value, this._fileInfo, this._index, this.mapLines);\n }\n }\n})\n\nexport default Anonymous;\n","import Node from './node';\nimport Value from './value';\nimport Keyword from './keyword';\nimport Anonymous from './anonymous';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\nfunction evalName(context, name) {\n let value = '';\n let i;\n const n = name.length;\n const output = {add: function (s) {value += s;}};\n for (i = 0; i < n; i++) {\n name[i].eval(context).genCSS(context, output);\n }\n return value;\n}\n\nconst Declaration = function(name, value, important, merge, index, currentFileInfo, inline, variable) {\n this.name = name;\n this.value = (value instanceof Node) ? value : new Value([value ? new Anonymous(value) : null]);\n this.important = important ? ` ${important.trim()}` : '';\n this.merge = merge;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.inline = inline || false;\n this.variable = (variable !== undefined) ? variable\n : (name.charAt && (name.charAt(0) === '@'));\n this.allowRoot = true;\n this.setParent(this.value, this);\n};\n\nDeclaration.prototype = Object.assign(new Node(), {\n type: 'Declaration',\n\n genCSS(context, output) {\n output.add(this.name + (context.compress ? ':' : ': '), this.fileInfo(), this.getIndex());\n try {\n this.value.genCSS(context, output);\n }\n catch (e) {\n e.index = this._index;\n e.filename = this._fileInfo.filename;\n throw e;\n }\n output.add(this.important + ((this.inline || (context.lastRule && context.compress)) ? '' : ';'), this._fileInfo, this._index);\n },\n\n eval(context) {\n let mathBypass = false, prevMath, name = this.name, evaldValue, variable = this.variable;\n if (typeof name !== 'string') {\n // expand 'primitive' name directly to get\n // things faster (~10% for benchmark.less):\n name = (name.length === 1) && (name[0] instanceof Keyword) ?\n name[0].value : evalName(context, name);\n variable = false; // never treat expanded interpolation as new variable name\n }\n\n // @todo remove when parens-division is default\n if (name === 'font' && context.math === MATH.ALWAYS) {\n mathBypass = true;\n prevMath = context.math;\n context.math = MATH.PARENS_DIVISION;\n }\n try {\n context.importantScope.push({});\n evaldValue = this.value.eval(context);\n\n if (!this.variable && evaldValue.type === 'DetachedRuleset') {\n throw { message: 'Rulesets cannot be evaluated on a property.',\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n let important = this.important;\n const importantResult = context.importantScope.pop();\n if (!important && importantResult.important) {\n important = importantResult.important;\n }\n\n return new Declaration(name,\n evaldValue,\n important,\n this.merge,\n this.getIndex(), this.fileInfo(), this.inline,\n variable);\n }\n catch (e) {\n if (typeof e.index !== 'number') {\n e.index = this.getIndex();\n e.filename = this.fileInfo().filename;\n }\n throw e;\n }\n finally {\n if (mathBypass) {\n context.math = prevMath;\n }\n }\n },\n\n makeImportant() {\n return new Declaration(this.name,\n this.value,\n '!important',\n this.merge,\n this.getIndex(), this.fileInfo(), this.inline);\n }\n});\n\nexport default Declaration;","class debugInfo {\n constructor(context, ctx, lineSeparator) {\n let result = '';\n if (context.dumpLineNumbers && !context.compress) {\n switch (context.dumpLineNumbers) {\n case 'comments':\n result = debugInfo.asComment(ctx);\n break;\n case 'mediaquery':\n result = debugInfo.asMediaQuery(ctx);\n break;\n case 'all':\n result = debugInfo.asComment(ctx) + (lineSeparator || '') + debugInfo.asMediaQuery(ctx);\n break;\n }\n }\n return result;\n }\n\n static asComment(ctx) {\n return `/* line ${ctx.debugInfo.lineNumber}, ${ctx.debugInfo.fileName} */\\n`;\n }\n\n static asMediaQuery(ctx) {\n let filenameWithProtocol = ctx.debugInfo.fileName;\n if (!/^[a-z]+:\\/\\//i.test(filenameWithProtocol)) {\n filenameWithProtocol = `file://${filenameWithProtocol}`;\n }\n return `@media -sass-debug-info{filename{font-family:${filenameWithProtocol.replace(/([.:\\/\\\\])/g, function (a) {\n if (a == '\\\\') {\n a = '\\/';\n }\n return `\\\\${a}`;\n })}}line{font-family:\\\\00003${ctx.debugInfo.lineNumber}}}\\n`;\n }\n}\n\nexport default debugInfo;\n","import Node from './node';\nimport getDebugInfo from './debug-info';\n\nconst Comment = function(value, isLineComment, index, currentFileInfo) {\n this.value = value;\n this.isLineComment = isLineComment;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.allowRoot = true;\n}\n\nComment.prototype = Object.assign(new Node(), {\n type: 'Comment',\n\n genCSS(context, output) {\n if (this.debugInfo) {\n output.add(getDebugInfo(context, this), this.fileInfo(), this.getIndex());\n }\n output.add(this.value);\n },\n\n isSilent(context) {\n const isCompressed = context.compress && this.value[2] !== '!';\n return this.isLineComment || isCompressed;\n }\n});\n\nexport default Comment;\n","const contexts = {};\nexport default contexts;\nimport * as Constants from './constants';\n\nconst copyFromOriginal = function copyFromOriginal(original, destination, propertiesToCopy) {\n if (!original) { return; }\n\n for (let i = 0; i < propertiesToCopy.length; i++) {\n if (original.hasOwnProperty(propertiesToCopy[i])) {\n destination[propertiesToCopy[i]] = original[propertiesToCopy[i]];\n }\n }\n};\n\n/*\n parse is used whilst parsing\n */\nconst parseCopyProperties = [\n // options\n 'paths', // option - unmodified - paths to search for imports on\n 'rewriteUrls', // option - whether to adjust URL's to be relative\n 'rootpath', // option - rootpath to append to URL's\n 'strictImports', // option -\n 'insecure', // option - whether to allow imports from insecure ssl hosts\n 'dumpLineNumbers', // option - whether to dump line numbers\n 'compress', // option - whether to compress\n 'syncImport', // option - whether to import synchronously\n 'chunkInput', // option - whether to chunk input. more performant but causes parse issues.\n 'mime', // browser only - mime type for sheet import\n 'useFileCache', // browser only - whether to use the per file session cache\n // context\n 'processImports', // option & context - whether to process imports. if false then imports will not be imported.\n // Used by the import manager to stop multiple import visitors being created.\n 'pluginManager' // Used as the plugin manager for the session\n];\n\ncontexts.Parse = function(options) {\n copyFromOriginal(options, this, parseCopyProperties);\n\n if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n};\n\nconst evalCopyProperties = [\n 'paths', // additional include paths\n 'compress', // whether to compress\n 'math', // whether math has to be within parenthesis\n 'strictUnits', // whether units need to evaluate correctly\n 'sourceMap', // whether to output a source map\n 'importMultiple', // whether we are currently importing multiple copies\n 'urlArgs', // whether to add args into url tokens\n 'javascriptEnabled', // option - whether Inline JavaScript is enabled. if undefined, defaults to false\n 'pluginManager', // Used as the plugin manager for the session\n 'importantScope', // used to bubble up !important statements\n 'rewriteUrls' // option - whether to adjust URL's to be relative\n];\n\ncontexts.Eval = function(options, frames) {\n copyFromOriginal(options, this, evalCopyProperties);\n\n if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n\n this.frames = frames || [];\n this.importantScope = this.importantScope || [];\n};\n\ncontexts.Eval.prototype.enterCalc = function () {\n if (!this.calcStack) {\n this.calcStack = [];\n }\n this.calcStack.push(true);\n this.inCalc = true;\n};\n\ncontexts.Eval.prototype.exitCalc = function () {\n this.calcStack.pop();\n if (!this.calcStack.length) {\n this.inCalc = false;\n }\n};\n\ncontexts.Eval.prototype.inParenthesis = function () {\n if (!this.parensStack) {\n this.parensStack = [];\n }\n this.parensStack.push(true);\n};\n\ncontexts.Eval.prototype.outOfParenthesis = function () {\n this.parensStack.pop();\n};\n\ncontexts.Eval.prototype.inCalc = false;\ncontexts.Eval.prototype.mathOn = true;\ncontexts.Eval.prototype.isMathOn = function (op) {\n if (!this.mathOn) {\n return false;\n }\n if (op === '/' && this.math !== Constants.Math.ALWAYS && (!this.parensStack || !this.parensStack.length)) {\n return false;\n }\n if (this.math > Constants.Math.PARENS_DIVISION) {\n return this.parensStack && this.parensStack.length;\n }\n return true;\n};\n\ncontexts.Eval.prototype.pathRequiresRewrite = function (path) {\n const isRelative = this.rewriteUrls === Constants.RewriteUrls.LOCAL ? isPathLocalRelative : isPathRelative;\n\n return isRelative(path);\n};\n\ncontexts.Eval.prototype.rewritePath = function (path, rootpath) {\n let newPath;\n\n rootpath = rootpath || '';\n newPath = this.normalizePath(rootpath + path);\n\n // If a path was explicit relative and the rootpath was not an absolute path\n // we must ensure that the new path is also explicit relative.\n if (isPathLocalRelative(path) &&\n isPathRelative(rootpath) &&\n isPathLocalRelative(newPath) === false) {\n newPath = `./${newPath}`;\n }\n\n return newPath;\n};\n\ncontexts.Eval.prototype.normalizePath = function (path) {\n const segments = path.split('/').reverse();\n let segment;\n\n path = [];\n while (segments.length !== 0) {\n segment = segments.pop();\n switch ( segment ) {\n case '.':\n break;\n case '..':\n if ((path.length === 0) || (path[path.length - 1] === '..')) {\n path.push( segment );\n } else {\n path.pop();\n }\n break;\n default:\n path.push(segment);\n break;\n }\n }\n\n return path.join('/');\n};\n\nfunction isPathRelative(path) {\n return !/^(?:[a-z-]+:|\\/|#)/i.test(path);\n}\n\nfunction isPathLocalRelative(path) {\n return path.charAt(0) === '.';\n}\n\n// todo - do the same for the toCSS ?\n","function makeRegistry( base ) {\n return {\n _data: {},\n add: function(name, func) {\n // precautionary case conversion, as later querying of\n // the registry by function-caller uses lower case as well.\n name = name.toLowerCase();\n\n if (this._data.hasOwnProperty(name)) {\n // TODO warn\n }\n this._data[name] = func;\n },\n addMultiple: function(functions) {\n Object.keys(functions).forEach(\n name => {\n this.add(name, functions[name]);\n });\n },\n get: function(name) {\n return this._data[name] || ( base && base.get( name ));\n },\n getLocalFunctions: function() {\n return this._data;\n },\n inherit: function() {\n return makeRegistry( this );\n },\n create: function(base) {\n return makeRegistry(base);\n }\n };\n}\n\nexport default makeRegistry( null );","import Keyword from '../tree/keyword';\n\nconst defaultFunc = {\n eval: function () {\n const v = this.value_;\n const e = this.error_;\n if (e) {\n throw e;\n }\n if (v != null) {\n return v ? Keyword.True : Keyword.False;\n }\n },\n value: function (v) {\n this.value_ = v;\n },\n error: function (e) {\n this.error_ = e;\n },\n reset: function () {\n this.value_ = this.error_ = null;\n }\n};\n\nexport default defaultFunc;\n","import Node from './node';\nimport Declaration from './declaration';\nimport Keyword from './keyword';\nimport Comment from './comment';\nimport Paren from './paren';\nimport Selector from './selector';\nimport Element from './element';\nimport Anonymous from './anonymous';\nimport contexts from '../contexts';\nimport globalFunctionRegistry from '../functions/function-registry';\nimport defaultFunc from '../functions/default';\nimport getDebugInfo from './debug-info';\nimport * as utils from '../utils';\n\nconst Ruleset = function(selectors, rules, strictImports, visibilityInfo) {\n this.selectors = selectors;\n this.rules = rules;\n this._lookups = {};\n this._variables = null;\n this._properties = null;\n this.strictImports = strictImports;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n\n this.setParent(this.selectors, this);\n this.setParent(this.rules, this);\n}\n\nRuleset.prototype = Object.assign(new Node(), {\n type: 'Ruleset',\n isRuleset: true,\n\n isRulesetLike() { return true; },\n\n accept(visitor) {\n if (this.paths) {\n this.paths = visitor.visitArray(this.paths, true);\n } else if (this.selectors) {\n this.selectors = visitor.visitArray(this.selectors);\n }\n if (this.rules && this.rules.length) {\n this.rules = visitor.visitArray(this.rules);\n }\n },\n\n eval(context) {\n const that = this;\n let selectors;\n let selCnt;\n let selector;\n let i;\n let hasVariable;\n let hasOnePassingSelector = false;\n\n if (this.selectors && (selCnt = this.selectors.length)) {\n selectors = new Array(selCnt);\n defaultFunc.error({\n type: 'Syntax',\n message: 'it is currently only allowed in parametric mixin guards,'\n });\n\n for (i = 0; i < selCnt; i++) {\n selector = this.selectors[i].eval(context);\n for (var j = 0; j < selector.elements.length; j++) {\n if (selector.elements[j].isVariable) {\n hasVariable = true;\n break;\n }\n }\n selectors[i] = selector;\n if (selector.evaldCondition) {\n hasOnePassingSelector = true;\n }\n }\n\n if (hasVariable) {\n const toParseSelectors = new Array(selCnt);\n for (i = 0; i < selCnt; i++) {\n selector = selectors[i];\n toParseSelectors[i] = selector.toCSS(context);\n }\n this.parse.parseNode(\n toParseSelectors.join(','),\n [\"selectors\"], \n selectors[0].getIndex(), \n selectors[0].fileInfo(), \n function(err, result) {\n if (result) {\n selectors = utils.flattenArray(result);\n }\n });\n }\n\n defaultFunc.reset();\n } else {\n hasOnePassingSelector = true;\n }\n\n let rules = this.rules ? utils.copyArray(this.rules) : null;\n const ruleset = new Ruleset(selectors, rules, this.strictImports, this.visibilityInfo());\n let rule;\n let subRule;\n\n ruleset.originalRuleset = this;\n ruleset.root = this.root;\n ruleset.firstRoot = this.firstRoot;\n ruleset.allowImports = this.allowImports;\n\n if (this.debugInfo) {\n ruleset.debugInfo = this.debugInfo;\n }\n\n if (!hasOnePassingSelector) {\n rules.length = 0;\n }\n\n // inherit a function registry from the frames stack when possible;\n // otherwise from the global registry\n ruleset.functionRegistry = (function (frames) {\n let i = 0;\n const n = frames.length;\n let found;\n for ( ; i !== n ; ++i ) {\n found = frames[ i ].functionRegistry;\n if ( found ) { return found; }\n }\n return globalFunctionRegistry;\n }(context.frames)).inherit();\n\n // push the current ruleset to the frames stack\n const ctxFrames = context.frames;\n ctxFrames.unshift(ruleset);\n\n // currrent selectors\n let ctxSelectors = context.selectors;\n if (!ctxSelectors) {\n context.selectors = ctxSelectors = [];\n }\n ctxSelectors.unshift(this.selectors);\n\n // Evaluate imports\n if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) {\n ruleset.evalImports(context);\n }\n\n // Store the frames around mixin definitions,\n // so they can be evaluated like closures when the time comes.\n const rsRules = ruleset.rules;\n for (i = 0; (rule = rsRules[i]); i++) {\n if (rule.evalFirst) {\n rsRules[i] = rule.eval(context);\n }\n }\n\n const mediaBlockCount = (context.mediaBlocks && context.mediaBlocks.length) || 0;\n\n // Evaluate mixin calls.\n for (i = 0; (rule = rsRules[i]); i++) {\n if (rule.type === 'MixinCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).filter(function(r) {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope if the variable is\n // already there. consider returning false here\n // but we need a way to \"return\" variable from mixins\n return !(ruleset.variable(r.name));\n }\n return true;\n });\n rsRules.splice.apply(rsRules, [i, 1].concat(rules));\n i += rules.length - 1;\n ruleset.resetCache();\n } else if (rule.type === 'VariableCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).rules.filter(function(r) {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope at all\n return false;\n }\n return true;\n });\n rsRules.splice.apply(rsRules, [i, 1].concat(rules));\n i += rules.length - 1;\n ruleset.resetCache();\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n if (!rule.evalFirst) {\n rsRules[i] = rule = rule.eval ? rule.eval(context) : rule;\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n // for rulesets, check if it is a css guard and can be removed\n if (rule instanceof Ruleset && rule.selectors && rule.selectors.length === 1) {\n // check if it can be folded in (e.g. & where)\n if (rule.selectors[0] && rule.selectors[0].isJustParentSelector()) {\n rsRules.splice(i--, 1);\n\n for (var j = 0; (subRule = rule.rules[j]); j++) {\n if (subRule instanceof Node) {\n subRule.copyVisibilityInfo(rule.visibilityInfo());\n if (!(subRule instanceof Declaration) || !subRule.variable) {\n rsRules.splice(++i, 0, subRule);\n }\n }\n }\n }\n }\n }\n\n // Pop the stack\n ctxFrames.shift();\n ctxSelectors.shift();\n\n if (context.mediaBlocks) {\n for (i = mediaBlockCount; i < context.mediaBlocks.length; i++) {\n context.mediaBlocks[i].bubbleSelectors(selectors);\n }\n }\n\n return ruleset;\n },\n\n evalImports(context) {\n const rules = this.rules;\n let i;\n let importRules;\n if (!rules) { return; }\n\n for (i = 0; i < rules.length; i++) {\n if (rules[i].type === 'Import') {\n importRules = rules[i].eval(context);\n if (importRules && (importRules.length || importRules.length === 0)) {\n rules.splice.apply(rules, [i, 1].concat(importRules));\n i += importRules.length - 1;\n } else {\n rules.splice(i, 1, importRules);\n }\n this.resetCache();\n }\n }\n },\n\n makeImportant() {\n const result = new Ruleset(this.selectors, this.rules.map(function (r) {\n if (r.makeImportant) {\n return r.makeImportant();\n } else {\n return r;\n }\n }), this.strictImports, this.visibilityInfo());\n\n return result;\n },\n\n matchArgs(args) {\n return !args || args.length === 0;\n },\n\n // lets you call a css selector with a guard\n matchCondition(args, context) {\n const lastSelector = this.selectors[this.selectors.length - 1];\n if (!lastSelector.evaldCondition) {\n return false;\n }\n if (lastSelector.condition &&\n !lastSelector.condition.eval(\n new contexts.Eval(context,\n context.frames))) {\n return false;\n }\n return true;\n },\n\n resetCache() {\n this._rulesets = null;\n this._variables = null;\n this._properties = null;\n this._lookups = {};\n },\n\n variables() {\n if (!this._variables) {\n this._variables = !this.rules ? {} : this.rules.reduce(function (hash, r) {\n if (r instanceof Declaration && r.variable === true) {\n hash[r.name] = r;\n }\n // when evaluating variables in an import statement, imports have not been eval'd\n // so we need to go inside import statements.\n // guard against root being a string (in the case of inlined less)\n if (r.type === 'Import' && r.root && r.root.variables) {\n const vars = r.root.variables();\n for (const name in vars) {\n if (vars.hasOwnProperty(name)) {\n hash[name] = r.root.variable(name);\n }\n }\n }\n return hash;\n }, {});\n }\n return this._variables;\n },\n\n properties() {\n if (!this._properties) {\n this._properties = !this.rules ? {} : this.rules.reduce(function (hash, r) {\n if (r instanceof Declaration && r.variable !== true) {\n const name = (r.name.length === 1) && (r.name[0] instanceof Keyword) ?\n r.name[0].value : r.name;\n // Properties don't overwrite as they can merge\n if (!hash[`$${name}`]) {\n hash[`$${name}`] = [ r ];\n }\n else {\n hash[`$${name}`].push(r);\n }\n }\n return hash;\n }, {});\n }\n return this._properties;\n },\n\n variable(name) {\n const decl = this.variables()[name];\n if (decl) {\n return this.parseValue(decl);\n }\n },\n\n property(name) {\n const decl = this.properties()[name];\n if (decl) {\n return this.parseValue(decl);\n }\n },\n\n lastDeclaration() {\n for (let i = this.rules.length; i > 0; i--) {\n const decl = this.rules[i - 1];\n if (decl instanceof Declaration) {\n return this.parseValue(decl);\n }\n }\n },\n\n parseValue(toParse) {\n const self = this;\n function transformDeclaration(decl) {\n if (decl.value instanceof Anonymous && !decl.parsed) {\n if (typeof decl.value.value === 'string') {\n this.parse.parseNode(\n decl.value.value,\n ['value', 'important'], \n decl.value.getIndex(), \n decl.fileInfo(), \n function(err, result) {\n if (err) {\n decl.parsed = true;\n }\n if (result) {\n decl.value = result[0];\n decl.important = result[1] || '';\n decl.parsed = true;\n }\n });\n } else {\n decl.parsed = true;\n }\n\n return decl;\n }\n else {\n return decl;\n }\n }\n if (!Array.isArray(toParse)) {\n return transformDeclaration.call(self, toParse);\n }\n else {\n const nodes = [];\n toParse.forEach(function(n) {\n nodes.push(transformDeclaration.call(self, n));\n });\n return nodes;\n }\n },\n\n rulesets() {\n if (!this.rules) { return []; }\n\n const filtRules = [];\n const rules = this.rules;\n let i;\n let rule;\n\n for (i = 0; (rule = rules[i]); i++) {\n if (rule.isRuleset) {\n filtRules.push(rule);\n }\n }\n\n return filtRules;\n },\n\n prependRule(rule) {\n const rules = this.rules;\n if (rules) {\n rules.unshift(rule);\n } else {\n this.rules = [ rule ];\n }\n this.setParent(rule, this);\n },\n\n find(selector, self, filter) {\n self = self || this;\n const rules = [];\n let match;\n let foundMixins;\n const key = selector.toCSS();\n\n if (key in this._lookups) { return this._lookups[key]; }\n\n this.rulesets().forEach(function (rule) {\n if (rule !== self) {\n for (let j = 0; j < rule.selectors.length; j++) {\n match = selector.match(rule.selectors[j]);\n if (match) {\n if (selector.elements.length > match) {\n if (!filter || filter(rule)) {\n foundMixins = rule.find(new Selector(selector.elements.slice(match)), self, filter);\n for (let i = 0; i < foundMixins.length; ++i) {\n foundMixins[i].path.push(rule);\n }\n Array.prototype.push.apply(rules, foundMixins);\n }\n } else {\n rules.push({ rule, path: []});\n }\n break;\n }\n }\n }\n });\n this._lookups[key] = rules;\n return rules;\n },\n\n genCSS(context, output) {\n let i;\n let j;\n const charsetRuleNodes = [];\n let ruleNodes = [];\n\n let // Line number debugging\n debugInfo;\n\n let rule;\n let path;\n\n context.tabLevel = (context.tabLevel || 0);\n\n if (!this.root) {\n context.tabLevel++;\n }\n\n const tabRuleStr = context.compress ? '' : Array(context.tabLevel + 1).join(' ');\n const tabSetStr = context.compress ? '' : Array(context.tabLevel).join(' ');\n let sep;\n\n let charsetNodeIndex = 0;\n let importNodeIndex = 0;\n for (i = 0; (rule = this.rules[i]); i++) {\n if (rule instanceof Comment) {\n if (importNodeIndex === i) {\n importNodeIndex++;\n }\n ruleNodes.push(rule);\n } else if (rule.isCharset && rule.isCharset()) {\n ruleNodes.splice(charsetNodeIndex, 0, rule);\n charsetNodeIndex++;\n importNodeIndex++;\n } else if (rule.type === 'Import') {\n ruleNodes.splice(importNodeIndex, 0, rule);\n importNodeIndex++;\n } else {\n ruleNodes.push(rule);\n }\n }\n ruleNodes = charsetRuleNodes.concat(ruleNodes);\n\n // If this is the root node, we don't render\n // a selector, or {}.\n if (!this.root) {\n debugInfo = getDebugInfo(context, this, tabSetStr);\n\n if (debugInfo) {\n output.add(debugInfo);\n output.add(tabSetStr);\n }\n\n const paths = this.paths;\n const pathCnt = paths.length;\n let pathSubCnt;\n\n sep = context.compress ? ',' : (`,\\n${tabSetStr}`);\n\n for (i = 0; i < pathCnt; i++) {\n path = paths[i];\n if (!(pathSubCnt = path.length)) { continue; }\n if (i > 0) { output.add(sep); }\n\n context.firstSelector = true;\n path[0].genCSS(context, output);\n\n context.firstSelector = false;\n for (j = 1; j < pathSubCnt; j++) {\n path[j].genCSS(context, output);\n }\n }\n\n output.add((context.compress ? '{' : ' {\\n') + tabRuleStr);\n }\n\n // Compile rules and rulesets\n for (i = 0; (rule = ruleNodes[i]); i++) {\n\n if (i + 1 === ruleNodes.length) {\n context.lastRule = true;\n }\n\n const currentLastRule = context.lastRule;\n if (rule.isRulesetLike(rule)) {\n context.lastRule = false;\n }\n\n if (rule.genCSS) {\n rule.genCSS(context, output);\n } else if (rule.value) {\n output.add(rule.value.toString());\n }\n\n context.lastRule = currentLastRule;\n\n if (!context.lastRule && rule.isVisible()) {\n output.add(context.compress ? '' : (`\\n${tabRuleStr}`));\n } else {\n context.lastRule = false;\n }\n }\n\n if (!this.root) {\n output.add((context.compress ? '}' : `\\n${tabSetStr}}`));\n context.tabLevel--;\n }\n\n if (!output.isEmpty() && !context.compress && this.firstRoot) {\n output.add('\\n');\n }\n },\n\n joinSelectors(paths, context, selectors) {\n for (let s = 0; s < selectors.length; s++) {\n this.joinSelector(paths, context, selectors[s]);\n }\n },\n\n joinSelector(paths, context, selector) {\n\n function createParenthesis(elementsToPak, originalElement) {\n let replacementParen, j;\n if (elementsToPak.length === 0) {\n replacementParen = new Paren(elementsToPak[0]);\n } else {\n const insideParent = new Array(elementsToPak.length);\n for (j = 0; j < elementsToPak.length; j++) {\n insideParent[j] = new Element(\n null,\n elementsToPak[j],\n originalElement.isVariable,\n originalElement._index,\n originalElement._fileInfo\n );\n }\n replacementParen = new Paren(new Selector(insideParent));\n }\n return replacementParen;\n }\n\n function createSelector(containedElement, originalElement) {\n let element, selector;\n element = new Element(null, containedElement, originalElement.isVariable, originalElement._index, originalElement._fileInfo);\n selector = new Selector([element]);\n return selector;\n }\n\n // joins selector path from `beginningPath` with selector path in `addPath`\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns concatenated path\n function addReplacementIntoPath(beginningPath, addPath, replacedElement, originalSelector) {\n let newSelectorPath, lastSelector, newJoinedSelector;\n // our new selector path\n newSelectorPath = [];\n\n // construct the joined selector - if & is the first thing this will be empty,\n // if not newJoinedSelector will be the last set of elements in the selector\n if (beginningPath.length > 0) {\n newSelectorPath = utils.copyArray(beginningPath);\n lastSelector = newSelectorPath.pop();\n newJoinedSelector = originalSelector.createDerived(utils.copyArray(lastSelector.elements));\n }\n else {\n newJoinedSelector = originalSelector.createDerived([]);\n }\n\n if (addPath.length > 0) {\n // /deep/ is a CSS4 selector - (removed, so should deprecate)\n // that is valid without anything in front of it\n // so if the & does not have a combinator that is \"\" or \" \" then\n // and there is a combinator on the parent, then grab that.\n // this also allows + a { & .b { .a & { ... though not sure why you would want to do that\n let combinator = replacedElement.combinator;\n\n const parentEl = addPath[0].elements[0];\n if (combinator.emptyOrWhitespace && !parentEl.combinator.emptyOrWhitespace) {\n combinator = parentEl.combinator;\n }\n // join the elements so far with the first part of the parent\n newJoinedSelector.elements.push(new Element(\n combinator,\n parentEl.value,\n replacedElement.isVariable,\n replacedElement._index,\n replacedElement._fileInfo\n ));\n newJoinedSelector.elements = newJoinedSelector.elements.concat(addPath[0].elements.slice(1));\n }\n\n // now add the joined selector - but only if it is not empty\n if (newJoinedSelector.elements.length !== 0) {\n newSelectorPath.push(newJoinedSelector);\n }\n\n // put together the parent selectors after the join (e.g. the rest of the parent)\n if (addPath.length > 1) {\n let restOfPath = addPath.slice(1);\n restOfPath = restOfPath.map(function (selector) {\n return selector.createDerived(selector.elements, []);\n });\n newSelectorPath = newSelectorPath.concat(restOfPath);\n }\n return newSelectorPath;\n }\n\n // joins selector path from `beginningPath` with every selector path in `addPaths` array\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns array with all concatenated paths\n function addAllReplacementsIntoPath( beginningPath, addPaths, replacedElement, originalSelector, result) {\n let j;\n for (j = 0; j < beginningPath.length; j++) {\n const newSelectorPath = addReplacementIntoPath(beginningPath[j], addPaths, replacedElement, originalSelector);\n result.push(newSelectorPath);\n }\n return result;\n }\n\n function mergeElementsOnToSelectors(elements, selectors) {\n let i, sel;\n\n if (elements.length === 0) {\n return ;\n }\n if (selectors.length === 0) {\n selectors.push([ new Selector(elements) ]);\n return;\n }\n\n for (i = 0; (sel = selectors[i]); i++) {\n // if the previous thing in sel is a parent this needs to join on to it\n if (sel.length > 0) {\n sel[sel.length - 1] = sel[sel.length - 1].createDerived(sel[sel.length - 1].elements.concat(elements));\n }\n else {\n sel.push(new Selector(elements));\n }\n }\n }\n\n // replace all parent selectors inside `inSelector` by content of `context` array\n // resulting selectors are returned inside `paths` array\n // returns true if `inSelector` contained at least one parent selector\n function replaceParentSelector(paths, context, inSelector) {\n // The paths are [[Selector]]\n // The first list is a list of comma separated selectors\n // The inner list is a list of inheritance separated selectors\n // e.g.\n // .a, .b {\n // .c {\n // }\n // }\n // == [[.a] [.c]] [[.b] [.c]]\n //\n let i, j, k, currentElements, newSelectors, selectorsMultiplied, sel, el, hadParentSelector = false, length, lastSelector;\n function findNestedSelector(element) {\n let maybeSelector;\n if (!(element.value instanceof Paren)) {\n return null;\n }\n\n maybeSelector = element.value.value;\n if (!(maybeSelector instanceof Selector)) {\n return null;\n }\n\n return maybeSelector;\n }\n\n // the elements from the current selector so far\n currentElements = [];\n // the current list of new selectors to add to the path.\n // We will build it up. We initiate it with one empty selector as we \"multiply\" the new selectors\n // by the parents\n newSelectors = [\n []\n ];\n\n for (i = 0; (el = inSelector.elements[i]); i++) {\n // non parent reference elements just get added\n if (el.value !== '&') {\n const nestedSelector = findNestedSelector(el);\n if (nestedSelector != null) {\n // merge the current list of non parent selector elements\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n const nestedPaths = [];\n let replaced;\n const replacedNewSelectors = [];\n replaced = replaceParentSelector(nestedPaths, context, nestedSelector);\n hadParentSelector = hadParentSelector || replaced;\n // the nestedPaths array should have only one member - replaceParentSelector does not multiply selectors\n for (k = 0; k < nestedPaths.length; k++) {\n const replacementSelector = createSelector(createParenthesis(nestedPaths[k], el), el);\n addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors);\n }\n newSelectors = replacedNewSelectors;\n currentElements = [];\n } else {\n currentElements.push(el);\n }\n\n } else {\n hadParentSelector = true;\n // the new list of selectors to add\n selectorsMultiplied = [];\n\n // merge the current list of non parent selector elements\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n // loop through our current selectors\n for (j = 0; j < newSelectors.length; j++) {\n sel = newSelectors[j];\n // if we don't have any parent paths, the & might be in a mixin so that it can be used\n // whether there are parents or not\n if (context.length === 0) {\n // the combinator used on el should now be applied to the next element instead so that\n // it is not lost\n if (sel.length > 0) {\n sel[0].elements.push(new Element(el.combinator, '', el.isVariable, el._index, el._fileInfo));\n }\n selectorsMultiplied.push(sel);\n }\n else {\n // and the parent selectors\n for (k = 0; k < context.length; k++) {\n // We need to put the current selectors\n // then join the last selector's elements on to the parents selectors\n const newSelectorPath = addReplacementIntoPath(sel, context[k], el, inSelector);\n // add that to our new set of selectors\n selectorsMultiplied.push(newSelectorPath);\n }\n }\n }\n\n // our new selectors has been multiplied, so reset the state\n newSelectors = selectorsMultiplied;\n currentElements = [];\n }\n }\n\n // if we have any elements left over (e.g. .a& .b == .b)\n // add them on to all the current selectors\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n for (i = 0; i < newSelectors.length; i++) {\n length = newSelectors[i].length;\n if (length > 0) {\n paths.push(newSelectors[i]);\n lastSelector = newSelectors[i][length - 1];\n newSelectors[i][length - 1] = lastSelector.createDerived(lastSelector.elements, inSelector.extendList);\n }\n }\n\n return hadParentSelector;\n }\n\n function deriveSelector(visibilityInfo, deriveFrom) {\n const newSelector = deriveFrom.createDerived(deriveFrom.elements, deriveFrom.extendList, deriveFrom.evaldCondition);\n newSelector.copyVisibilityInfo(visibilityInfo);\n return newSelector;\n }\n\n // joinSelector code follows\n let i, newPaths, hadParentSelector;\n\n newPaths = [];\n hadParentSelector = replaceParentSelector(newPaths, context, selector);\n\n if (!hadParentSelector) {\n if (context.length > 0) {\n newPaths = [];\n for (i = 0; i < context.length; i++) {\n\n const concatenated = context[i].map(deriveSelector.bind(this, selector.visibilityInfo()));\n\n concatenated.push(selector);\n newPaths.push(concatenated);\n }\n }\n else {\n newPaths = [[selector]];\n }\n }\n\n for (i = 0; i < newPaths.length; i++) {\n paths.push(newPaths[i]);\n }\n\n }\n});\n\nexport default Ruleset;\n","import Node from './node';\nimport Selector from './selector';\nimport Ruleset from './ruleset';\nimport Anonymous from './anonymous';\n\nconst AtRule = function(\n name,\n value,\n rules,\n index,\n currentFileInfo,\n debugInfo,\n isRooted,\n visibilityInfo\n) {\n let i;\n\n this.name = name;\n this.value = (value instanceof Node) ? value : (value ? new Anonymous(value) : value);\n if (rules) {\n if (Array.isArray(rules)) {\n this.rules = rules;\n } else {\n this.rules = [rules];\n this.rules[0].selectors = (new Selector([], null, null, index, currentFileInfo)).createEmptySelectors();\n }\n for (i = 0; i < this.rules.length; i++) {\n this.rules[i].allowImports = true;\n }\n this.setParent(this.rules, this);\n }\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.debugInfo = debugInfo;\n this.isRooted = isRooted || false;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n}\n\nAtRule.prototype = Object.assign(new Node(), {\n type: 'AtRule',\n accept(visitor) {\n const value = this.value, rules = this.rules;\n if (rules) {\n this.rules = visitor.visitArray(rules);\n }\n if (value) {\n this.value = visitor.visit(value);\n }\n },\n\n isRulesetLike() {\n return this.rules || !this.isCharset();\n },\n\n isCharset() {\n return '@charset' === this.name;\n },\n\n genCSS(context, output) {\n const value = this.value, rules = this.rules;\n output.add(this.name, this.fileInfo(), this.getIndex());\n if (value) {\n output.add(' ');\n value.genCSS(context, output);\n }\n if (rules) {\n this.outputRuleset(context, output, rules);\n } else {\n output.add(';');\n }\n },\n\n eval(context) {\n let mediaPathBackup, mediaBlocksBackup, value = this.value, rules = this.rules;\n\n // media stored inside other atrule should not bubble over it\n // backpup media bubbling information\n mediaPathBackup = context.mediaPath;\n mediaBlocksBackup = context.mediaBlocks;\n // deleted media bubbling information\n context.mediaPath = [];\n context.mediaBlocks = [];\n\n if (value) {\n value = value.eval(context);\n }\n if (rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n rules = [rules[0].eval(context)];\n rules[0].root = true;\n }\n // restore media bubbling information\n context.mediaPath = mediaPathBackup;\n context.mediaBlocks = mediaBlocksBackup;\n\n return new AtRule(this.name, value, rules,\n this.getIndex(), this.fileInfo(), this.debugInfo, this.isRooted, this.visibilityInfo());\n },\n\n variable(name) {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.variable.call(this.rules[0], name);\n }\n },\n\n find() {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.find.apply(this.rules[0], arguments);\n }\n },\n\n rulesets() {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.rulesets.apply(this.rules[0]);\n }\n },\n\n outputRuleset(context, output, rules) {\n const ruleCnt = rules.length;\n let i;\n context.tabLevel = (context.tabLevel | 0) + 1;\n\n // Compressed\n if (context.compress) {\n output.add('{');\n for (i = 0; i < ruleCnt; i++) {\n rules[i].genCSS(context, output);\n }\n output.add('}');\n context.tabLevel--;\n return;\n }\n\n // Non-compressed\n const tabSetStr = `\\n${Array(context.tabLevel).join(' ')}`, tabRuleStr = `${tabSetStr} `;\n if (!ruleCnt) {\n output.add(` {${tabSetStr}}`);\n } else {\n output.add(` {${tabRuleStr}`);\n rules[0].genCSS(context, output);\n for (i = 1; i < ruleCnt; i++) {\n output.add(tabRuleStr);\n rules[i].genCSS(context, output);\n }\n output.add(`${tabSetStr}}`);\n }\n\n context.tabLevel--;\n }\n});\n\nexport default AtRule;\n","import Node from './node';\nimport contexts from '../contexts';\nimport * as utils from '../utils';\n\nconst DetachedRuleset = function(ruleset, frames) {\n this.ruleset = ruleset;\n this.frames = frames;\n this.setParent(this.ruleset, this);\n};\n\nDetachedRuleset.prototype = Object.assign(new Node(), {\n type: 'DetachedRuleset',\n evalFirst: true,\n\n accept(visitor) {\n this.ruleset = visitor.visit(this.ruleset);\n },\n\n eval(context) {\n const frames = this.frames || utils.copyArray(context.frames);\n return new DetachedRuleset(this.ruleset, frames);\n },\n\n callEval(context) {\n return this.ruleset.eval(this.frames ? new contexts.Eval(context, this.frames.concat(context.frames)) : context);\n }\n});\n\nexport default DetachedRuleset;\n","import Node from './node';\nimport unitConversions from '../data/unit-conversions';\nimport * as utils from '../utils';\n\nconst Unit = function(numerator, denominator, backupUnit) {\n this.numerator = numerator ? utils.copyArray(numerator).sort() : [];\n this.denominator = denominator ? utils.copyArray(denominator).sort() : [];\n if (backupUnit) {\n this.backupUnit = backupUnit;\n } else if (numerator && numerator.length) {\n this.backupUnit = numerator[0];\n }\n};\n\nUnit.prototype = Object.assign(new Node(), {\n type: 'Unit',\n\n clone() {\n return new Unit(utils.copyArray(this.numerator), utils.copyArray(this.denominator), this.backupUnit);\n },\n\n genCSS(context, output) {\n // Dimension checks the unit is singular and throws an error if in strict math mode.\n const strictUnits = context && context.strictUnits;\n if (this.numerator.length === 1) {\n output.add(this.numerator[0]); // the ideal situation\n } else if (!strictUnits && this.backupUnit) {\n output.add(this.backupUnit);\n } else if (!strictUnits && this.denominator.length) {\n output.add(this.denominator[0]);\n }\n },\n\n toString() {\n let i, returnStr = this.numerator.join('*');\n for (i = 0; i < this.denominator.length; i++) {\n returnStr += `/${this.denominator[i]}`;\n }\n return returnStr;\n },\n\n compare(other) {\n return this.is(other.toString()) ? 0 : undefined;\n },\n\n is(unitString) {\n return this.toString().toUpperCase() === unitString.toUpperCase();\n },\n\n isLength() {\n return RegExp('^(px|em|ex|ch|rem|in|cm|mm|pc|pt|ex|vw|vh|vmin|vmax)$', 'gi').test(this.toCSS());\n },\n\n isEmpty() {\n return this.numerator.length === 0 && this.denominator.length === 0;\n },\n\n isSingular() {\n return this.numerator.length <= 1 && this.denominator.length === 0;\n },\n\n map(callback) {\n let i;\n\n for (i = 0; i < this.numerator.length; i++) {\n this.numerator[i] = callback(this.numerator[i], false);\n }\n\n for (i = 0; i < this.denominator.length; i++) {\n this.denominator[i] = callback(this.denominator[i], true);\n }\n },\n\n usedUnits() {\n let group;\n const result = {};\n let mapUnit;\n let groupName;\n\n mapUnit = function (atomicUnit) {\n /* jshint loopfunc:true */\n if (group.hasOwnProperty(atomicUnit) && !result[groupName]) {\n result[groupName] = atomicUnit;\n }\n\n return atomicUnit;\n };\n\n for (groupName in unitConversions) {\n if (unitConversions.hasOwnProperty(groupName)) {\n group = unitConversions[groupName];\n\n this.map(mapUnit);\n }\n }\n\n return result;\n },\n\n cancel() {\n const counter = {};\n let atomicUnit;\n let i;\n\n for (i = 0; i < this.numerator.length; i++) {\n atomicUnit = this.numerator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) + 1;\n }\n\n for (i = 0; i < this.denominator.length; i++) {\n atomicUnit = this.denominator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) - 1;\n }\n\n this.numerator = [];\n this.denominator = [];\n\n for (atomicUnit in counter) {\n if (counter.hasOwnProperty(atomicUnit)) {\n const count = counter[atomicUnit];\n\n if (count > 0) {\n for (i = 0; i < count; i++) {\n this.numerator.push(atomicUnit);\n }\n } else if (count < 0) {\n for (i = 0; i < -count; i++) {\n this.denominator.push(atomicUnit);\n }\n }\n }\n }\n\n this.numerator.sort();\n this.denominator.sort();\n }\n});\n\nexport default Unit;\n","import Node from './node';\nimport unitConversions from '../data/unit-conversions';\nimport Unit from './unit';\nimport Color from './color';\n\n//\n// A number with a unit\n//\nconst Dimension = function(value, unit) {\n this.value = parseFloat(value);\n if (isNaN(this.value)) {\n throw new Error('Dimension is not a number.');\n }\n this.unit = (unit && unit instanceof Unit) ? unit :\n new Unit(unit ? [unit] : undefined);\n this.setParent(this.unit, this);\n};\n\nDimension.prototype = Object.assign(new Node(), {\n type: 'Dimension',\n\n accept(visitor) {\n this.unit = visitor.visit(this.unit);\n },\n\n eval(context) {\n return this;\n },\n\n toColor() {\n return new Color([this.value, this.value, this.value]);\n },\n\n genCSS(context, output) {\n if ((context && context.strictUnits) && !this.unit.isSingular()) {\n throw new Error(`Multiple units in dimension. Correct the units or use the unit function. Bad unit: ${this.unit.toString()}`);\n }\n\n const value = this.fround(context, this.value);\n let strValue = String(value);\n\n if (value !== 0 && value < 0.000001 && value > -0.000001) {\n // would be output 1e-6 etc.\n strValue = value.toFixed(20).replace(/0+$/, '');\n }\n\n if (context && context.compress) {\n // Zero values doesn't need a unit\n if (value === 0 && this.unit.isLength()) {\n output.add(strValue);\n return;\n }\n\n // Float values doesn't need a leading zero\n if (value > 0 && value < 1) {\n strValue = (strValue).substr(1);\n }\n }\n\n output.add(strValue);\n this.unit.genCSS(context, output);\n },\n\n // In an operation between two Dimensions,\n // we default to the first Dimension's unit,\n // so `1px + 2` will yield `3px`.\n operate(context, op, other) {\n /* jshint noempty:false */\n let value = this._operate(context, op, this.value, other.value), unit = this.unit.clone();\n\n if (op === '+' || op === '-') {\n if (unit.numerator.length === 0 && unit.denominator.length === 0) {\n unit = other.unit.clone();\n if (this.unit.backupUnit) {\n unit.backupUnit = this.unit.backupUnit;\n }\n } else if (other.unit.numerator.length === 0 && unit.denominator.length === 0) {\n // do nothing\n } else {\n other = other.convertTo(this.unit.usedUnits());\n\n if (context.strictUnits && other.unit.toString() !== unit.toString()) {\n throw new Error(`Incompatible units. Change the units or use the unit function. `\n + `Bad units: '${unit.toString()}' and '${other.unit.toString()}'.`);\n }\n\n value = this._operate(context, op, this.value, other.value);\n }\n } else if (op === '*') {\n unit.numerator = unit.numerator.concat(other.unit.numerator).sort();\n unit.denominator = unit.denominator.concat(other.unit.denominator).sort();\n unit.cancel();\n } else if (op === '/') {\n unit.numerator = unit.numerator.concat(other.unit.denominator).sort();\n unit.denominator = unit.denominator.concat(other.unit.numerator).sort();\n unit.cancel();\n }\n return new Dimension(value, unit);\n },\n\n compare(other) {\n let a, b;\n\n if (!(other instanceof Dimension)) {\n return undefined;\n }\n\n if (this.unit.isEmpty() || other.unit.isEmpty()) {\n a = this;\n b = other;\n } else {\n a = this.unify();\n b = other.unify();\n if (a.unit.compare(b.unit) !== 0) {\n return undefined;\n }\n }\n\n return Node.numericCompare(a.value, b.value);\n },\n\n unify() {\n return this.convertTo({ length: 'px', duration: 's', angle: 'rad' });\n },\n\n convertTo(conversions) {\n let value = this.value;\n const unit = this.unit.clone();\n let i;\n let groupName;\n let group;\n let targetUnit;\n let derivedConversions = {};\n let applyUnit;\n\n if (typeof conversions === 'string') {\n for (i in unitConversions) {\n if (unitConversions[i].hasOwnProperty(conversions)) {\n derivedConversions = {};\n derivedConversions[i] = conversions;\n }\n }\n conversions = derivedConversions;\n }\n applyUnit = function (atomicUnit, denominator) {\n /* jshint loopfunc:true */\n if (group.hasOwnProperty(atomicUnit)) {\n if (denominator) {\n value = value / (group[atomicUnit] / group[targetUnit]);\n } else {\n value = value * (group[atomicUnit] / group[targetUnit]);\n }\n\n return targetUnit;\n }\n\n return atomicUnit;\n };\n\n for (groupName in conversions) {\n if (conversions.hasOwnProperty(groupName)) {\n targetUnit = conversions[groupName];\n group = unitConversions[groupName];\n\n unit.map(applyUnit);\n }\n }\n\n unit.cancel();\n\n return new Dimension(value, unit);\n }\n});\n\nexport default Dimension;\n","import Node from './node';\nimport Color from './color';\nimport Dimension from './dimension';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\n\nconst Operation = function(op, operands, isSpaced) {\n this.op = op.trim();\n this.operands = operands;\n this.isSpaced = isSpaced;\n};\n\nOperation.prototype = Object.assign(new Node(), {\n type: 'Operation',\n\n accept(visitor) {\n this.operands = visitor.visitArray(this.operands);\n },\n\n eval(context) {\n let a = this.operands[0].eval(context), b = this.operands[1].eval(context), op;\n\n if (context.isMathOn(this.op)) {\n op = this.op === './' ? '/' : this.op;\n if (a instanceof Dimension && b instanceof Color) {\n a = a.toColor();\n }\n if (b instanceof Dimension && a instanceof Color) {\n b = b.toColor();\n }\n if (!a.operate) {\n if (a instanceof Operation && a.op === '/' && context.math === MATH.PARENS_DIVISION) {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n throw { type: 'Operation',\n message: 'Operation on an invalid type' };\n }\n\n return a.operate(context, op, b);\n } else {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n },\n\n genCSS(context, output) {\n this.operands[0].genCSS(context, output);\n if (this.isSpaced) {\n output.add(' ');\n }\n output.add(this.op);\n if (this.isSpaced) {\n output.add(' ');\n }\n this.operands[1].genCSS(context, output);\n }\n});\n\nexport default Operation;\n","import Node from './node';\nimport Paren from './paren';\nimport Comment from './comment';\nimport Dimension from './dimension';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\nconst Expression = function(value, noSpacing) {\n this.value = value;\n this.noSpacing = noSpacing;\n if (!value) {\n throw new Error('Expression requires an array parameter');\n }\n};\n\nExpression.prototype = Object.assign(new Node(), {\n type: 'Expression',\n\n accept(visitor) {\n this.value = visitor.visitArray(this.value);\n },\n\n eval(context) {\n let returnValue;\n const mathOn = context.isMathOn();\n const inParenthesis = this.parens;\n\n let doubleParen = false;\n if (inParenthesis) {\n context.inParenthesis();\n }\n if (this.value.length > 1) {\n returnValue = new Expression(this.value.map(function (e) {\n if (!e.eval) {\n return e;\n }\n return e.eval(context);\n }), this.noSpacing);\n } else if (this.value.length === 1) {\n if (this.value[0].parens && !this.value[0].parensInOp && !context.inCalc) {\n doubleParen = true;\n }\n returnValue = this.value[0].eval(context);\n } else {\n returnValue = this;\n }\n if (inParenthesis) {\n context.outOfParenthesis();\n }\n if (this.parens && this.parensInOp && !mathOn && !doubleParen \n && (!(returnValue instanceof Dimension))) {\n returnValue = new Paren(returnValue);\n }\n return returnValue;\n },\n\n genCSS(context, output) {\n for (let i = 0; i < this.value.length; i++) {\n this.value[i].genCSS(context, output);\n if (!this.noSpacing && i + 1 < this.value.length) {\n output.add(' ');\n }\n }\n },\n\n throwAwayComments() {\n this.value = this.value.filter(function(v) {\n return !(v instanceof Comment);\n });\n }\n});\n\nexport default Expression;\n","import Expression from '../tree/expression';\n\nclass functionCaller {\n constructor(name, context, index, currentFileInfo) {\n this.name = name.toLowerCase();\n this.index = index;\n this.context = context;\n this.currentFileInfo = currentFileInfo;\n\n this.func = context.frames[0].functionRegistry.get(this.name);\n }\n\n isValid() {\n return Boolean(this.func);\n }\n\n call(args) {\n if (!(Array.isArray(args))) {\n args = [args];\n }\n const evalArgs = this.func.evalArgs;\n if (evalArgs !== false) {\n args = args.map(a => a.eval(this.context));\n }\n const commentFilter = item => !(item.type === 'Comment');\n\n // This code is terrible and should be replaced as per this issue...\n // https://github.com/less/less.js/issues/2477\n args = args\n .filter(commentFilter)\n .map(item => {\n if (item.type === 'Expression') {\n const subNodes = item.value.filter(commentFilter);\n if (subNodes.length === 1) {\n return subNodes[0];\n } else {\n return new Expression(subNodes);\n }\n }\n return item;\n });\n\n if (evalArgs === false) {\n return this.func(this.context, ...args);\n }\n\n return this.func(...args);\n }\n}\n\nexport default functionCaller;\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import Node from './node';\nimport Anonymous from './anonymous';\nimport FunctionCaller from '../functions/function-caller';\n\n//\n// A function call node.\n//\nconst Call = function(name, args, index, currentFileInfo) {\n this.name = name;\n this.args = args;\n this.calc = name === 'calc';\n this._index = index;\n this._fileInfo = currentFileInfo;\n}\n\nCall.prototype = Object.assign(new Node(), {\n type: 'Call',\n\n accept(visitor) {\n if (this.args) {\n this.args = visitor.visitArray(this.args);\n }\n },\n\n //\n // When evaluating a function call,\n // we either find the function in the functionRegistry,\n // in which case we call it, passing the evaluated arguments,\n // if this returns null or we cannot find the function, we\n // simply print it out as it appeared originally [2].\n //\n // The reason why we evaluate the arguments, is in the case where\n // we try to pass a variable to a function, like: `saturate(@color)`.\n // The function should receive the value, not the variable.\n //\n eval(context) {\n /**\n * Turn off math for calc(), and switch back on for evaluating nested functions\n */\n const currentMathContext = context.mathOn;\n context.mathOn = !this.calc;\n if (this.calc || context.inCalc) {\n context.enterCalc();\n }\n\n const exitCalc = () => {\n if (this.calc || context.inCalc) {\n context.exitCalc();\n }\n context.mathOn = currentMathContext;\n };\n\n let result;\n const funcCaller = new FunctionCaller(this.name, context, this.getIndex(), this.fileInfo());\n\n if (funcCaller.isValid()) {\n try {\n result = funcCaller.call(this.args);\n exitCalc();\n } catch (e) {\n if (e.hasOwnProperty('line') && e.hasOwnProperty('column')) {\n throw e;\n }\n throw { \n type: e.type || 'Runtime',\n message: `Error evaluating function \\`${this.name}\\`${e.message ? `: ${e.message}` : ''}`,\n index: this.getIndex(), \n filename: this.fileInfo().filename,\n line: e.lineNumber,\n column: e.columnNumber\n };\n }\n }\n\n if (result !== null && result !== undefined) {\n // Results that that are not nodes are cast as Anonymous nodes\n // Falsy values or booleans are returned as empty nodes\n if (!(result instanceof Node)) {\n if (!result || result === true) {\n result = new Anonymous(null); \n }\n else {\n result = new Anonymous(result.toString()); \n }\n \n }\n result._index = this._index;\n result._fileInfo = this._fileInfo;\n return result;\n }\n\n const args = this.args.map(a => a.eval(context));\n exitCalc();\n\n return new Call(this.name, args, this.getIndex(), this.fileInfo());\n },\n\n genCSS(context, output) {\n output.add(`${this.name}(`, this.fileInfo(), this.getIndex());\n\n for (let i = 0; i < this.args.length; i++) {\n this.args[i].genCSS(context, output);\n if (i + 1 < this.args.length) {\n output.add(', ');\n }\n }\n\n output.add(')');\n }\n});\n\nexport default Call;\n","import Node from './node';\nimport Call from './call';\n\nconst Variable = function(name, index, currentFileInfo) {\n this.name = name;\n this._index = index;\n this._fileInfo = currentFileInfo;\n};\n\nVariable.prototype = Object.assign(new Node(), {\n type: 'Variable',\n\n eval(context) {\n let variable, name = this.name;\n\n if (name.indexOf('@@') === 0) {\n name = `@${new Variable(name.slice(1), this.getIndex(), this.fileInfo()).eval(context).value}`;\n }\n\n if (this.evaluating) {\n throw { type: 'Name',\n message: `Recursive variable definition for ${name}`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n variable = this.find(context.frames, function (frame) {\n const v = frame.variable(name);\n if (v) {\n if (v.important) {\n const importantScope = context.importantScope[context.importantScope.length - 1];\n importantScope.important = v.important;\n }\n // If in calc, wrap vars in a function call to cascade evaluate args first\n if (context.inCalc) {\n return (new Call('_SELF', [v.value])).eval(context);\n }\n else {\n return v.value.eval(context);\n }\n }\n });\n if (variable) {\n this.evaluating = false;\n return variable;\n } else {\n throw { type: 'Name',\n message: `variable ${name} is undefined`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n },\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n});\n\nexport default Variable;\n","import Node from './node';\nimport Declaration from './declaration';\n\nconst Property = function(name, index, currentFileInfo) {\n this.name = name;\n this._index = index;\n this._fileInfo = currentFileInfo;\n};\n\nProperty.prototype = Object.assign(new Node(), {\n type: 'Property',\n\n eval(context) {\n let property;\n const name = this.name;\n // TODO: shorten this reference\n const mergeRules = context.pluginManager.less.visitors.ToCSSVisitor.prototype._mergeRules;\n\n if (this.evaluating) {\n throw { type: 'Name',\n message: `Recursive property reference for ${name}`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n property = this.find(context.frames, function (frame) {\n let v;\n const vArr = frame.property(name);\n if (vArr) {\n for (let i = 0; i < vArr.length; i++) {\n v = vArr[i];\n\n vArr[i] = new Declaration(v.name,\n v.value,\n v.important,\n v.merge,\n v.index,\n v.currentFileInfo,\n v.inline,\n v.variable\n );\n }\n mergeRules(vArr);\n\n v = vArr[vArr.length - 1];\n if (v.important) {\n const importantScope = context.importantScope[context.importantScope.length - 1];\n importantScope.important = v.important;\n }\n v = v.value.eval(context);\n return v;\n }\n });\n if (property) {\n this.evaluating = false;\n return property;\n } else {\n throw { type: 'Name',\n message: `Property '${name}' is undefined`,\n filename: this.currentFileInfo.filename,\n index: this.index };\n }\n },\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n});\n\nexport default Property;\n","import Node from './node';\n\nconst Attribute = function(key, op, value) {\n this.key = key;\n this.op = op;\n this.value = value;\n}\n\nAttribute.prototype = Object.assign(new Node(), {\n type: 'Attribute',\n\n eval(context) {\n return new Attribute(this.key.eval ? this.key.eval(context) : this.key,\n this.op, (this.value && this.value.eval) ? this.value.eval(context) : this.value);\n },\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n },\n\n toCSS(context) {\n let value = this.key.toCSS ? this.key.toCSS(context) : this.key;\n\n if (this.op) {\n value += this.op;\n value += (this.value.toCSS ? this.value.toCSS(context) : this.value);\n }\n\n return `[${value}]`;\n }\n});\n\nexport default Attribute;\n","import Node from './node';\nimport Variable from './variable';\nimport Property from './property';\n\n\nconst Quoted = function(str, content, escaped, index, currentFileInfo) {\n this.escaped = (escaped == null) ? true : escaped;\n this.value = content || '';\n this.quote = str.charAt(0);\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.variableRegex = /@\\{([\\w-]+)\\}/g;\n this.propRegex = /\\$\\{([\\w-]+)\\}/g;\n this.allowRoot = escaped;\n};\n\nQuoted.prototype = Object.assign(new Node(), {\n type: 'Quoted',\n\n genCSS(context, output) {\n if (!this.escaped) {\n output.add(this.quote, this.fileInfo(), this.getIndex());\n }\n output.add(this.value);\n if (!this.escaped) {\n output.add(this.quote);\n }\n },\n\n containsVariables() {\n return this.value.match(this.variableRegex);\n },\n\n eval(context) {\n const that = this;\n let value = this.value;\n const variableReplacement = function (_, name) {\n const v = new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v.value : v.toCSS();\n };\n const propertyReplacement = function (_, name) {\n const v = new Property(`$${name}`, that.getIndex(), that.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v.value : v.toCSS();\n };\n function iterativeReplace(value, regexp, replacementFnc) {\n let evaluatedValue = value;\n do {\n value = evaluatedValue.toString();\n evaluatedValue = value.replace(regexp, replacementFnc);\n } while (value !== evaluatedValue);\n return evaluatedValue;\n }\n value = iterativeReplace(value, this.variableRegex, variableReplacement);\n value = iterativeReplace(value, this.propRegex, propertyReplacement);\n return new Quoted(this.quote + value + this.quote, value, this.escaped, this.getIndex(), this.fileInfo());\n },\n\n compare(other) {\n // when comparing quoted strings allow the quote to differ\n if (other.type === 'Quoted' && !this.escaped && !other.escaped) {\n return Node.numericCompare(this.value, other.value);\n } else {\n return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n }\n }\n});\n\nexport default Quoted;\n","import Node from './node';\n\nfunction escapePath(path) {\n return path.replace(/[\\(\\)'\"\\s]/g, function(match) { return `\\\\${match}`; });\n}\n\nconst URL = function(val, index, currentFileInfo, isEvald) {\n this.value = val;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.isEvald = isEvald;\n};\n\nURL.prototype = Object.assign(new Node(), {\n type: 'Url',\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n },\n\n genCSS(context, output) {\n output.add('url(');\n this.value.genCSS(context, output);\n output.add(')');\n },\n\n eval(context) {\n const val = this.value.eval(context);\n let rootpath;\n\n if (!this.isEvald) {\n // Add the rootpath if the URL requires a rewrite\n rootpath = this.fileInfo() && this.fileInfo().rootpath;\n if (typeof rootpath === 'string' &&\n typeof val.value === 'string' &&\n context.pathRequiresRewrite(val.value)) {\n if (!val.quote) {\n rootpath = escapePath(rootpath);\n }\n val.value = context.rewritePath(val.value, rootpath);\n } else {\n val.value = context.normalizePath(val.value);\n }\n\n // Add url args if enabled\n if (context.urlArgs) {\n if (!val.value.match(/^\\s*data:/)) {\n const delimiter = val.value.indexOf('?') === -1 ? '?' : '&';\n const urlArgs = delimiter + context.urlArgs;\n if (val.value.indexOf('#') !== -1) {\n val.value = val.value.replace('#', `${urlArgs}#`);\n } else {\n val.value += urlArgs;\n }\n }\n }\n }\n\n return new URL(val, this.getIndex(), this.fileInfo(), true);\n }\n});\n\nexport default URL;\n","import Ruleset from './ruleset';\nimport Value from './value';\nimport Selector from './selector';\nimport Anonymous from './anonymous';\nimport Expression from './expression';\nimport AtRule from './atrule';\nimport * as utils from '../utils';\n\nconst Media = function(value, features, index, currentFileInfo, visibilityInfo) {\n this._index = index;\n this._fileInfo = currentFileInfo;\n\n const selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors();\n\n this.features = new Value(features);\n this.rules = [new Ruleset(selectors, value)];\n this.rules[0].allowImports = true;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n this.setParent(selectors, this);\n this.setParent(this.features, this);\n this.setParent(this.rules, this);\n};\n\nMedia.prototype = Object.assign(new AtRule(), {\n type: 'Media',\n\n isRulesetLike() {\n return true;\n },\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this.features);\n }\n if (this.rules) {\n this.rules = visitor.visitArray(this.rules);\n }\n },\n\n genCSS(context, output) {\n output.add('@media ', this._fileInfo, this._index);\n this.features.genCSS(context, output);\n this.outputRuleset(context, output, this.rules);\n },\n\n eval(context) {\n if (!context.mediaBlocks) {\n context.mediaBlocks = [];\n context.mediaPath = [];\n }\n\n const media = new Media(null, [], this._index, this._fileInfo, this.visibilityInfo());\n if (this.debugInfo) {\n this.rules[0].debugInfo = this.debugInfo;\n media.debugInfo = this.debugInfo;\n }\n \n media.features = this.features.eval(context);\n\n context.mediaPath.push(media);\n context.mediaBlocks.push(media);\n\n this.rules[0].functionRegistry = context.frames[0].functionRegistry.inherit();\n context.frames.unshift(this.rules[0]);\n media.rules = [this.rules[0].eval(context)];\n context.frames.shift();\n\n context.mediaPath.pop();\n\n return context.mediaPath.length === 0 ? media.evalTop(context) :\n media.evalNested(context);\n },\n\n evalTop(context) {\n let result = this;\n\n // Render all dependent Media blocks.\n if (context.mediaBlocks.length > 1) {\n const selectors = (new Selector([], null, null, this.getIndex(), this.fileInfo())).createEmptySelectors();\n result = new Ruleset(selectors, context.mediaBlocks);\n result.multiMedia = true;\n result.copyVisibilityInfo(this.visibilityInfo());\n this.setParent(result, this);\n }\n\n delete context.mediaBlocks;\n delete context.mediaPath;\n\n return result;\n },\n\n evalNested(context) {\n let i;\n let value;\n const path = context.mediaPath.concat([this]);\n\n // Extract the media-query conditions separated with `,` (OR).\n for (i = 0; i < path.length; i++) {\n value = path[i].features instanceof Value ?\n path[i].features.value : path[i].features;\n path[i] = Array.isArray(value) ? value : [value];\n }\n\n // Trace all permutations to generate the resulting media-query.\n //\n // (a, b and c) with nested (d, e) ->\n // a and d\n // a and e\n // b and c and d\n // b and c and e\n this.features = new Value(this.permute(path).map(path => {\n path = path.map(fragment => fragment.toCSS ? fragment : new Anonymous(fragment));\n\n for (i = path.length - 1; i > 0; i--) {\n path.splice(i, 0, new Anonymous('and'));\n }\n\n return new Expression(path);\n }));\n this.setParent(this.features, this);\n\n // Fake a tree-node that doesn't output anything.\n return new Ruleset([], []);\n },\n\n permute(arr) {\n if (arr.length === 0) {\n return [];\n } else if (arr.length === 1) {\n return arr[0];\n } else {\n const result = [];\n const rest = this.permute(arr.slice(1));\n for (let i = 0; i < rest.length; i++) {\n for (let j = 0; j < arr[0].length; j++) {\n result.push([arr[0][j]].concat(rest[i]));\n }\n }\n return result;\n }\n },\n\n bubbleSelectors(selectors) {\n if (!selectors) {\n return;\n }\n this.rules = [new Ruleset(utils.copyArray(selectors), [this.rules[0]])];\n this.setParent(this.rules, this);\n }\n});\n\nexport default Media;\n","import Node from './node';\nimport Media from './media';\nimport URL from './url';\nimport Quoted from './quoted';\nimport Ruleset from './ruleset';\nimport Anonymous from './anonymous';\nimport * as utils from '../utils';\nimport LessError from '../less-error';\n\n//\n// CSS @import node\n//\n// The general strategy here is that we don't want to wait\n// for the parsing to be completed, before we start importing\n// the file. That's because in the context of a browser,\n// most of the time will be spent waiting for the server to respond.\n//\n// On creation, we push the import path to our import queue, though\n// `import,push`, we also pass it a callback, which it'll call once\n// the file has been fetched, and parsed.\n//\nconst Import = function(path, features, options, index, currentFileInfo, visibilityInfo) {\n this.options = options;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.path = path;\n this.features = features;\n this.allowRoot = true;\n\n if (this.options.less !== undefined || this.options.inline) {\n this.css = !this.options.less || this.options.inline;\n } else {\n const pathValue = this.getPath();\n if (pathValue && /[#\\.\\&\\?]css([\\?;].*)?$/.test(pathValue)) {\n this.css = true;\n }\n }\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.features, this);\n this.setParent(this.path, this);\n};\n\nImport.prototype = Object.assign(new Node(), {\n type: 'Import',\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this.features);\n }\n this.path = visitor.visit(this.path);\n if (!this.options.isPlugin && !this.options.inline && this.root) {\n this.root = visitor.visit(this.root);\n }\n },\n\n genCSS(context, output) {\n if (this.css && this.path._fileInfo.reference === undefined) {\n output.add('@import ', this._fileInfo, this._index);\n this.path.genCSS(context, output);\n if (this.features) {\n output.add(' ');\n this.features.genCSS(context, output);\n }\n output.add(';');\n }\n },\n\n getPath() {\n return (this.path instanceof URL) ?\n this.path.value.value : this.path.value;\n },\n\n isVariableImport() {\n let path = this.path;\n if (path instanceof URL) {\n path = path.value;\n }\n if (path instanceof Quoted) {\n return path.containsVariables();\n }\n\n return true;\n },\n\n evalForImport(context) {\n let path = this.path;\n\n if (path instanceof URL) {\n path = path.value;\n }\n\n return new Import(path.eval(context), this.features, this.options, this._index, this._fileInfo, this.visibilityInfo());\n },\n\n evalPath(context) {\n const path = this.path.eval(context);\n const fileInfo = this._fileInfo;\n\n if (!(path instanceof URL)) {\n // Add the rootpath if the URL requires a rewrite\n const pathValue = path.value;\n if (fileInfo &&\n pathValue &&\n context.pathRequiresRewrite(pathValue)) {\n path.value = context.rewritePath(pathValue, fileInfo.rootpath);\n } else {\n path.value = context.normalizePath(path.value);\n }\n }\n\n return path;\n },\n\n eval(context) {\n const result = this.doEval(context);\n if (this.options.reference || this.blocksVisibility()) {\n if (result.length || result.length === 0) {\n result.forEach(function (node) {\n node.addVisibilityBlock();\n }\n );\n } else {\n result.addVisibilityBlock();\n }\n }\n return result;\n },\n\n doEval(context) {\n let ruleset;\n let registry;\n const features = this.features && this.features.eval(context);\n\n if (this.options.isPlugin) {\n if (this.root && this.root.eval) {\n try {\n this.root.eval(context);\n }\n catch (e) {\n e.message = 'Plugin error during evaluation';\n throw new LessError(e, this.root.imports, this.root.filename);\n }\n }\n registry = context.frames[0] && context.frames[0].functionRegistry;\n if ( registry && this.root && this.root.functions ) {\n registry.addMultiple( this.root.functions );\n }\n\n return [];\n }\n\n if (this.skip) {\n if (typeof this.skip === 'function') {\n this.skip = this.skip();\n }\n if (this.skip) {\n return [];\n }\n }\n if (this.options.inline) {\n const contents = new Anonymous(this.root, 0,\n {\n filename: this.importedFilename,\n reference: this.path._fileInfo && this.path._fileInfo.reference\n }, true, true);\n\n return this.features ? new Media([contents], this.features.value) : [contents];\n } else if (this.css) {\n const newImport = new Import(this.evalPath(context), features, this.options, this._index);\n if (!newImport.css && this.error) {\n throw this.error;\n }\n return newImport;\n } else if (this.root) {\n ruleset = new Ruleset(null, utils.copyArray(this.root.rules));\n ruleset.evalImports(context);\n\n return this.features ? new Media(ruleset.rules, this.features.value) : ruleset.rules;\n } else {\n return [];\n }\n }\n});\n\nexport default Import;\n","import Node from './node';\nimport Variable from './variable';\n\nconst JsEvalNode = function() {};\n\nJsEvalNode.prototype = Object.assign(new Node(), {\n evaluateJavaScript(expression, context) {\n let result;\n const that = this;\n const evalContext = {};\n\n if (!context.javascriptEnabled) {\n throw { message: 'Inline JavaScript is not enabled. Is it set in your options?',\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n expression = expression.replace(/@\\{([\\w-]+)\\}/g, function (_, name) {\n return that.jsify(new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context));\n });\n\n try {\n expression = new Function(`return (${expression})`);\n } catch (e) {\n throw { message: `JavaScript evaluation error: ${e.message} from \\`${expression}\\`` ,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n const variables = context.frames[0].variables();\n for (const k in variables) {\n if (variables.hasOwnProperty(k)) {\n /* jshint loopfunc:true */\n evalContext[k.slice(1)] = {\n value: variables[k].value,\n toJS: function () {\n return this.value.eval(context).toCSS();\n }\n };\n }\n }\n\n try {\n result = expression.call(evalContext);\n } catch (e) {\n throw { message: `JavaScript evaluation error: '${e.name}: ${e.message.replace(/[\"]/g, '\\'')}'` ,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n return result;\n },\n\n jsify(obj) {\n if (Array.isArray(obj.value) && (obj.value.length > 1)) {\n return `[${obj.value.map(function (v) { return v.toCSS(); }).join(', ')}]`;\n } else {\n return obj.toCSS();\n }\n }\n});\n\nexport default JsEvalNode;\n","import JsEvalNode from './js-eval-node';\nimport Dimension from './dimension';\nimport Quoted from './quoted';\nimport Anonymous from './anonymous';\n\nconst JavaScript = function(string, escaped, index, currentFileInfo) {\n this.escaped = escaped;\n this.expression = string;\n this._index = index;\n this._fileInfo = currentFileInfo;\n}\n\nJavaScript.prototype = Object.assign(new JsEvalNode(), {\n type: 'JavaScript',\n\n eval(context) {\n const result = this.evaluateJavaScript(this.expression, context);\n const type = typeof result;\n\n if (type === 'number' && !isNaN(result)) {\n return new Dimension(result);\n } else if (type === 'string') {\n return new Quoted(`\"${result}\"`, result, this.escaped, this._index);\n } else if (Array.isArray(result)) {\n return new Anonymous(result.join(', '));\n } else {\n return new Anonymous(result);\n }\n }\n});\n\nexport default JavaScript;\n","import Node from './node';\n\nconst Assignment = function(key, val) {\n this.key = key;\n this.value = val;\n}\n\nAssignment.prototype = Object.assign(new Node(), {\n type: 'Assignment',\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n },\n\n eval(context) {\n if (this.value.eval) {\n return new Assignment(this.key, this.value.eval(context));\n }\n return this;\n },\n\n genCSS(context, output) {\n output.add(`${this.key}=`);\n if (this.value.genCSS) {\n this.value.genCSS(context, output);\n } else {\n output.add(this.value);\n }\n }\n});\n\nexport default Assignment;\n","import Node from './node';\n\nconst Condition = function(op, l, r, i, negate) {\n this.op = op.trim();\n this.lvalue = l;\n this.rvalue = r;\n this._index = i;\n this.negate = negate;\n};\n\nCondition.prototype = Object.assign(new Node(), {\n type: 'Condition',\n\n accept(visitor) {\n this.lvalue = visitor.visit(this.lvalue);\n this.rvalue = visitor.visit(this.rvalue);\n },\n\n eval(context) {\n const result = (function (op, a, b) {\n switch (op) {\n case 'and': return a && b;\n case 'or': return a || b;\n default:\n switch (Node.compare(a, b)) {\n case -1:\n return op === '<' || op === '=<' || op === '<=';\n case 0:\n return op === '=' || op === '>=' || op === '=<' || op === '<=';\n case 1:\n return op === '>' || op === '>=';\n default:\n return false;\n }\n }\n })(this.op, this.lvalue.eval(context), this.rvalue.eval(context));\n\n return this.negate ? !result : result;\n }\n});\n\nexport default Condition;\n","import Node from './node';\n\nconst UnicodeDescriptor = function(value) {\n this.value = value;\n}\n\nUnicodeDescriptor.prototype = Object.assign(new Node(), {\n type: 'UnicodeDescriptor'\n})\n\nexport default UnicodeDescriptor;\n","import Node from './node';\nimport Operation from './operation';\nimport Dimension from './dimension';\n\nconst Negative = function(node) {\n this.value = node;\n};\n\nNegative.prototype = Object.assign(new Node(), {\n type: 'Negative',\n\n genCSS(context, output) {\n output.add('-');\n this.value.genCSS(context, output);\n },\n\n eval(context) {\n if (context.isMathOn()) {\n return (new Operation('*', [new Dimension(-1), this.value])).eval(context);\n }\n return new Negative(this.value.eval(context));\n }\n});\n\nexport default Negative;\n","import Node from './node';\nimport Selector from './selector';\n\nconst Extend = function(selector, option, index, currentFileInfo, visibilityInfo) {\n this.selector = selector;\n this.option = option;\n this.object_id = Extend.next_id++;\n this.parent_ids = [this.object_id];\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n\n switch (option) {\n case 'all':\n this.allowBefore = true;\n this.allowAfter = true;\n break;\n default:\n this.allowBefore = false;\n this.allowAfter = false;\n break;\n }\n this.setParent(this.selector, this);\n};\n\nExtend.prototype = Object.assign(new Node(), {\n type: 'Extend',\n\n accept(visitor) {\n this.selector = visitor.visit(this.selector);\n },\n\n eval(context) {\n return new Extend(this.selector.eval(context), this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n },\n\n clone(context) {\n return new Extend(this.selector, this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n },\n\n // it concatenates (joins) all selectors in selector array\n findSelfSelectors(selectors) {\n let selfElements = [], i, selectorElements;\n\n for (i = 0; i < selectors.length; i++) {\n selectorElements = selectors[i].elements;\n // duplicate the logic in genCSS function inside the selector node.\n // future TODO - move both logics into the selector joiner visitor\n if (i > 0 && selectorElements.length && selectorElements[0].combinator.value === '') {\n selectorElements[0].combinator.value = ' ';\n }\n selfElements = selfElements.concat(selectors[i].elements);\n }\n\n this.selfSelectors = [new Selector(selfElements)];\n this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo());\n }\n});\n\nExtend.next_id = 0;\nexport default Extend;\n","import Node from './node';\nimport Variable from './variable';\nimport Ruleset from './ruleset';\nimport DetachedRuleset from './detached-ruleset';\nimport LessError from '../less-error';\n\nconst VariableCall = function(variable, index, currentFileInfo) {\n this.variable = variable;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.allowRoot = true;\n};\n\nVariableCall.prototype = Object.assign(new Node(), {\n type: 'VariableCall',\n\n eval(context) {\n let rules;\n let detachedRuleset = new Variable(this.variable, this.getIndex(), this.fileInfo()).eval(context);\n const error = new LessError({message: `Could not evaluate variable call ${this.variable}`});\n\n if (!detachedRuleset.ruleset) {\n if (detachedRuleset.rules) {\n rules = detachedRuleset;\n }\n else if (Array.isArray(detachedRuleset)) {\n rules = new Ruleset('', detachedRuleset);\n }\n else if (Array.isArray(detachedRuleset.value)) {\n rules = new Ruleset('', detachedRuleset.value);\n }\n else {\n throw error;\n }\n detachedRuleset = new DetachedRuleset(rules);\n }\n\n if (detachedRuleset.ruleset) {\n return detachedRuleset.callEval(context);\n }\n throw error;\n }\n});\n\nexport default VariableCall;\n","import Node from './node';\nimport Variable from './variable';\nimport Ruleset from './ruleset';\nimport Selector from './selector';\n\nconst NamespaceValue = function(ruleCall, lookups, index, fileInfo) {\n this.value = ruleCall;\n this.lookups = lookups;\n this._index = index;\n this._fileInfo = fileInfo;\n};\n\nNamespaceValue.prototype = Object.assign(new Node(), {\n type: 'NamespaceValue',\n\n eval(context) {\n let i, j, name, rules = this.value.eval(context);\n \n for (i = 0; i < this.lookups.length; i++) {\n name = this.lookups[i];\n\n /**\n * Eval'd DRs return rulesets.\n * Eval'd mixins return rules, so let's make a ruleset if we need it.\n * We need to do this because of late parsing of values\n */\n if (Array.isArray(rules)) {\n rules = new Ruleset([new Selector()], rules);\n }\n\n if (name === '') {\n rules = rules.lastDeclaration();\n }\n else if (name.charAt(0) === '@') {\n if (name.charAt(1) === '@') {\n name = `@${new Variable(name.substr(1)).eval(context).value}`;\n }\n if (rules.variables) {\n rules = rules.variable(name);\n }\n \n if (!rules) {\n throw { type: 'Name',\n message: `variable ${name} not found`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n }\n else {\n if (name.substring(0, 2) === '$@') {\n name = `$${new Variable(name.substr(1)).eval(context).value}`;\n }\n else {\n name = name.charAt(0) === '$' ? name : `$${name}`;\n }\n if (rules.properties) {\n rules = rules.property(name);\n }\n \n if (!rules) {\n throw { type: 'Name',\n message: `property \"${name.substr(1)}\" not found`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n // Properties are an array of values, since a ruleset can have multiple props.\n // We pick the last one (the \"cascaded\" value)\n rules = rules[rules.length - 1];\n }\n\n if (rules.value) {\n rules = rules.eval(context).value;\n }\n if (rules.ruleset) {\n rules = rules.ruleset.eval(context);\n }\n }\n return rules;\n }\n});\n\nexport default NamespaceValue;\n","import Selector from './selector';\nimport Element from './element';\nimport Ruleset from './ruleset';\nimport Declaration from './declaration';\nimport DetachedRuleset from './detached-ruleset';\nimport Expression from './expression';\nimport contexts from '../contexts';\nimport * as utils from '../utils';\n\nconst Definition = function(name, params, rules, condition, variadic, frames, visibilityInfo) {\n this.name = name || 'anonymous mixin';\n this.selectors = [new Selector([new Element(null, name, false, this._index, this._fileInfo)])];\n this.params = params;\n this.condition = condition;\n this.variadic = variadic;\n this.arity = params.length;\n this.rules = rules;\n this._lookups = {};\n const optionalParameters = [];\n this.required = params.reduce(function (count, p) {\n if (!p.name || (p.name && !p.value)) {\n return count + 1;\n }\n else {\n optionalParameters.push(p.name);\n return count;\n }\n }, 0);\n this.optionalParameters = optionalParameters;\n this.frames = frames;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n}\n\nDefinition.prototype = Object.assign(new Ruleset(), {\n type: 'MixinDefinition',\n evalFirst: true,\n\n accept(visitor) {\n if (this.params && this.params.length) {\n this.params = visitor.visitArray(this.params);\n }\n this.rules = visitor.visitArray(this.rules);\n if (this.condition) {\n this.condition = visitor.visit(this.condition);\n }\n },\n\n evalParams(context, mixinEnv, args, evaldArguments) {\n /* jshint boss:true */\n const frame = new Ruleset(null, null);\n\n let varargs;\n let arg;\n const params = utils.copyArray(this.params);\n let i;\n let j;\n let val;\n let name;\n let isNamedFound;\n let argIndex;\n let argsLength = 0;\n\n if (mixinEnv.frames && mixinEnv.frames[0] && mixinEnv.frames[0].functionRegistry) {\n frame.functionRegistry = mixinEnv.frames[0].functionRegistry.inherit();\n }\n mixinEnv = new contexts.Eval(mixinEnv, [frame].concat(mixinEnv.frames));\n\n if (args) {\n args = utils.copyArray(args);\n argsLength = args.length;\n\n for (i = 0; i < argsLength; i++) {\n arg = args[i];\n if (name = (arg && arg.name)) {\n isNamedFound = false;\n for (j = 0; j < params.length; j++) {\n if (!evaldArguments[j] && name === params[j].name) {\n evaldArguments[j] = arg.value.eval(context);\n frame.prependRule(new Declaration(name, arg.value.eval(context)));\n isNamedFound = true;\n break;\n }\n }\n if (isNamedFound) {\n args.splice(i, 1);\n i--;\n continue;\n } else {\n throw { type: 'Runtime', message: `Named argument for ${this.name} ${args[i].name} not found` };\n }\n }\n }\n }\n argIndex = 0;\n for (i = 0; i < params.length; i++) {\n if (evaldArguments[i]) { continue; }\n\n arg = args && args[argIndex];\n\n if (name = params[i].name) {\n if (params[i].variadic) {\n varargs = [];\n for (j = argIndex; j < argsLength; j++) {\n varargs.push(args[j].value.eval(context));\n }\n frame.prependRule(new Declaration(name, new Expression(varargs).eval(context)));\n } else {\n val = arg && arg.value;\n if (val) {\n // This was a mixin call, pass in a detached ruleset of it's eval'd rules\n if (Array.isArray(val)) {\n val = new DetachedRuleset(new Ruleset('', val));\n }\n else {\n val = val.eval(context);\n }\n } else if (params[i].value) {\n val = params[i].value.eval(mixinEnv);\n frame.resetCache();\n } else {\n throw { type: 'Runtime', message: `wrong number of arguments for ${this.name} (${argsLength} for ${this.arity})` };\n }\n\n frame.prependRule(new Declaration(name, val));\n evaldArguments[i] = val;\n }\n }\n\n if (params[i].variadic && args) {\n for (j = argIndex; j < argsLength; j++) {\n evaldArguments[j] = args[j].value.eval(context);\n }\n }\n argIndex++;\n }\n\n return frame;\n },\n\n makeImportant() {\n const rules = !this.rules ? this.rules : this.rules.map(function (r) {\n if (r.makeImportant) {\n return r.makeImportant(true);\n } else {\n return r;\n }\n });\n const result = new Definition(this.name, this.params, rules, this.condition, this.variadic, this.frames);\n return result;\n },\n\n eval(context) {\n return new Definition(this.name, this.params, this.rules, this.condition, this.variadic, this.frames || utils.copyArray(context.frames));\n },\n\n evalCall(context, args, important) {\n const _arguments = [];\n const mixinFrames = this.frames ? this.frames.concat(context.frames) : context.frames;\n const frame = this.evalParams(context, new contexts.Eval(context, mixinFrames), args, _arguments);\n let rules;\n let ruleset;\n\n frame.prependRule(new Declaration('@arguments', new Expression(_arguments).eval(context)));\n\n rules = utils.copyArray(this.rules);\n\n ruleset = new Ruleset(null, rules);\n ruleset.originalRuleset = this;\n ruleset = ruleset.eval(new contexts.Eval(context, [this, frame].concat(mixinFrames)));\n if (important) {\n ruleset = ruleset.makeImportant();\n }\n return ruleset;\n },\n\n matchCondition(args, context) {\n if (this.condition && !this.condition.eval(\n new contexts.Eval(context,\n [this.evalParams(context, /* the parameter variables */\n new contexts.Eval(context, this.frames ? this.frames.concat(context.frames) : context.frames), args, [])]\n .concat(this.frames || []) // the parent namespace/mixin frames\n .concat(context.frames)))) { // the current environment frames\n return false;\n }\n return true;\n },\n\n matchArgs(args, context) {\n const allArgsCnt = (args && args.length) || 0;\n let len;\n const optionalParameters = this.optionalParameters;\n const requiredArgsCnt = !args ? 0 : args.reduce(function (count, p) {\n if (optionalParameters.indexOf(p.name) < 0) {\n return count + 1;\n } else {\n return count;\n }\n }, 0);\n\n if (!this.variadic) {\n if (requiredArgsCnt < this.required) {\n return false;\n }\n if (allArgsCnt > this.params.length) {\n return false;\n }\n } else {\n if (requiredArgsCnt < (this.required - 1)) {\n return false;\n }\n }\n\n // check patterns\n len = Math.min(requiredArgsCnt, this.arity);\n\n for (let i = 0; i < len; i++) {\n if (!this.params[i].name && !this.params[i].variadic) {\n if (args[i].value.eval(context).toCSS() != this.params[i].value.eval(context).toCSS()) {\n return false;\n }\n }\n }\n return true;\n }\n});\n\nexport default Definition;\n","import Node from './node';\nimport Selector from './selector';\nimport MixinDefinition from './mixin-definition';\nimport defaultFunc from '../functions/default';\n\nconst MixinCall = function(elements, args, index, currentFileInfo, important) {\n this.selector = new Selector(elements);\n this.arguments = args || [];\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.important = important;\n this.allowRoot = true;\n this.setParent(this.selector, this);\n};\n\nMixinCall.prototype = Object.assign(new Node(), {\n type: 'MixinCall',\n\n accept(visitor) {\n if (this.selector) {\n this.selector = visitor.visit(this.selector);\n }\n if (this.arguments.length) {\n this.arguments = visitor.visitArray(this.arguments);\n }\n },\n\n eval(context) {\n let mixins;\n let mixin;\n let mixinPath;\n const args = [];\n let arg;\n let argValue;\n const rules = [];\n let match = false;\n let i;\n let m;\n let f;\n let isRecursive;\n let isOneFound;\n const candidates = [];\n let candidate;\n const conditionResult = [];\n let defaultResult;\n const defFalseEitherCase = -1;\n const defNone = 0;\n const defTrue = 1;\n const defFalse = 2;\n let count;\n let originalRuleset;\n let noArgumentsFilter;\n\n this.selector = this.selector.eval(context);\n\n function calcDefGroup(mixin, mixinPath) {\n let f, p, namespace;\n\n for (f = 0; f < 2; f++) {\n conditionResult[f] = true;\n defaultFunc.value(f);\n for (p = 0; p < mixinPath.length && conditionResult[f]; p++) {\n namespace = mixinPath[p];\n if (namespace.matchCondition) {\n conditionResult[f] = conditionResult[f] && namespace.matchCondition(null, context);\n }\n }\n if (mixin.matchCondition) {\n conditionResult[f] = conditionResult[f] && mixin.matchCondition(args, context);\n }\n }\n if (conditionResult[0] || conditionResult[1]) {\n if (conditionResult[0] != conditionResult[1]) {\n return conditionResult[1] ?\n defTrue : defFalse;\n }\n\n return defNone;\n }\n return defFalseEitherCase;\n }\n\n for (i = 0; i < this.arguments.length; i++) {\n arg = this.arguments[i];\n argValue = arg.value.eval(context);\n if (arg.expand && Array.isArray(argValue.value)) {\n argValue = argValue.value;\n for (m = 0; m < argValue.length; m++) {\n args.push({value: argValue[m]});\n }\n } else {\n args.push({name: arg.name, value: argValue});\n }\n }\n\n noArgumentsFilter = function(rule) {return rule.matchArgs(null, context);};\n\n for (i = 0; i < context.frames.length; i++) {\n if ((mixins = context.frames[i].find(this.selector, null, noArgumentsFilter)).length > 0) {\n isOneFound = true;\n\n // To make `default()` function independent of definition order we have two \"subpasses\" here.\n // At first we evaluate each guard *twice* (with `default() == true` and `default() == false`),\n // and build candidate list with corresponding flags. Then, when we know all possible matches,\n // we make a final decision.\n\n for (m = 0; m < mixins.length; m++) {\n mixin = mixins[m].rule;\n mixinPath = mixins[m].path;\n isRecursive = false;\n for (f = 0; f < context.frames.length; f++) {\n if ((!(mixin instanceof MixinDefinition)) && mixin === (context.frames[f].originalRuleset || context.frames[f])) {\n isRecursive = true;\n break;\n }\n }\n if (isRecursive) {\n continue;\n }\n\n if (mixin.matchArgs(args, context)) {\n candidate = {mixin, group: calcDefGroup(mixin, mixinPath)};\n\n if (candidate.group !== defFalseEitherCase) {\n candidates.push(candidate);\n }\n\n match = true;\n }\n }\n\n defaultFunc.reset();\n\n count = [0, 0, 0];\n for (m = 0; m < candidates.length; m++) {\n count[candidates[m].group]++;\n }\n\n if (count[defNone] > 0) {\n defaultResult = defFalse;\n } else {\n defaultResult = defTrue;\n if ((count[defTrue] + count[defFalse]) > 1) {\n throw { type: 'Runtime',\n message: `Ambiguous use of \\`default()\\` found when matching for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n }\n\n for (m = 0; m < candidates.length; m++) {\n candidate = candidates[m].group;\n if ((candidate === defNone) || (candidate === defaultResult)) {\n try {\n mixin = candidates[m].mixin;\n if (!(mixin instanceof MixinDefinition)) {\n originalRuleset = mixin.originalRuleset || mixin;\n mixin = new MixinDefinition('', [], mixin.rules, null, false, null, originalRuleset.visibilityInfo());\n mixin.originalRuleset = originalRuleset;\n }\n const newRules = mixin.evalCall(context, args, this.important).rules;\n this._setVisibilityToReplacement(newRules);\n Array.prototype.push.apply(rules, newRules);\n } catch (e) {\n throw { message: e.message, index: this.getIndex(), filename: this.fileInfo().filename, stack: e.stack };\n }\n }\n }\n\n if (match) {\n return rules;\n }\n }\n }\n if (isOneFound) {\n throw { type: 'Runtime',\n message: `No matching definition was found for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n } else {\n throw { type: 'Name',\n message: `${this.selector.toCSS().trim()} is undefined`,\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n },\n\n _setVisibilityToReplacement(replacement) {\n let i, rule;\n if (this.blocksVisibility()) {\n for (i = 0; i < replacement.length; i++) {\n rule = replacement[i];\n rule.addVisibilityBlock();\n }\n }\n },\n\n format(args) {\n return `${this.selector.toCSS().trim()}(${args ? args.map(function (a) {\n let argValue = '';\n if (a.name) {\n argValue += `${a.name}:`;\n }\n if (a.value.toCSS) {\n argValue += a.value.toCSS();\n } else {\n argValue += '???';\n }\n return argValue;\n }).join(', ') : ''})`;\n }\n});\n\nexport default MixinCall;\n","import Node from './node';\nimport Color from './color';\nimport AtRule from './atrule';\nimport DetachedRuleset from './detached-ruleset';\nimport Operation from './operation';\nimport Dimension from './dimension';\nimport Unit from './unit';\nimport Keyword from './keyword';\nimport Variable from './variable';\nimport Property from './property';\nimport Ruleset from './ruleset';\nimport Element from './element';\nimport Attribute from './attribute';\nimport Combinator from './combinator';\nimport Selector from './selector';\nimport Quoted from './quoted';\nimport Expression from './expression';\nimport Declaration from './declaration';\nimport Call from './call';\nimport URL from './url';\nimport Import from './import';\nimport Comment from './comment';\nimport Anonymous from './anonymous';\nimport Value from './value';\nimport JavaScript from './javascript';\nimport Assignment from './assignment';\nimport Condition from './condition';\nimport Paren from './paren';\nimport Media from './media';\nimport UnicodeDescriptor from './unicode-descriptor';\nimport Negative from './negative';\nimport Extend from './extend';\nimport VariableCall from './variable-call';\nimport NamespaceValue from './namespace-value';\n\n// mixins\nimport MixinCall from './mixin-call';\nimport MixinDefinition from './mixin-definition';\n\nexport default {\n Node, Color, AtRule, DetachedRuleset, Operation,\n Dimension, Unit, Keyword, Variable, Property,\n Ruleset, Element, Attribute, Combinator, Selector,\n Quoted, Expression, Declaration, Call, URL, Import,\n Comment, Anonymous, Value, JavaScript, Assignment,\n Condition, Paren, Media, UnicodeDescriptor, Negative,\n Extend, VariableCall, NamespaceValue,\n mixin: {\n Call: MixinCall,\n Definition: MixinDefinition\n }\n};","class AbstractFileManager {\n getPath(filename) {\n let j = filename.lastIndexOf('?');\n if (j > 0) {\n filename = filename.slice(0, j);\n }\n j = filename.lastIndexOf('/');\n if (j < 0) {\n j = filename.lastIndexOf('\\\\');\n }\n if (j < 0) {\n return '';\n }\n return filename.slice(0, j + 1);\n }\n\n tryAppendExtension(path, ext) {\n return /(\\.[a-z]*$)|([\\?;].*)$/.test(path) ? path : path + ext;\n }\n\n tryAppendLessExtension(path) {\n return this.tryAppendExtension(path, '.less');\n }\n\n supportsSync() {\n return false;\n }\n\n alwaysMakePathsAbsolute() {\n return false;\n }\n\n isPathAbsolute(filename) {\n return (/^(?:[a-z-]+:|\\/|\\\\|#)/i).test(filename);\n }\n\n // TODO: pull out / replace?\n join(basePath, laterPath) {\n if (!basePath) {\n return laterPath;\n }\n return basePath + laterPath;\n }\n\n pathDiff(url, baseUrl) {\n // diff between two paths to create a relative path\n\n const urlParts = this.extractUrlParts(url);\n\n const baseUrlParts = this.extractUrlParts(baseUrl);\n let i;\n let max;\n let urlDirectories;\n let baseUrlDirectories;\n let diff = '';\n if (urlParts.hostPart !== baseUrlParts.hostPart) {\n return '';\n }\n max = Math.max(baseUrlParts.directories.length, urlParts.directories.length);\n for (i = 0; i < max; i++) {\n if (baseUrlParts.directories[i] !== urlParts.directories[i]) { break; }\n }\n baseUrlDirectories = baseUrlParts.directories.slice(i);\n urlDirectories = urlParts.directories.slice(i);\n for (i = 0; i < baseUrlDirectories.length - 1; i++) {\n diff += '../';\n }\n for (i = 0; i < urlDirectories.length - 1; i++) {\n diff += `${urlDirectories[i]}/`;\n }\n return diff;\n }\n\n // helper function, not part of API\n extractUrlParts(url, baseUrl) {\n // urlParts[1] = protocol://hostname/ OR /\n // urlParts[2] = / if path relative to host base\n // urlParts[3] = directories\n // urlParts[4] = filename\n // urlParts[5] = parameters\n\n const urlPartsRegex = /^((?:[a-z-]+:)?\\/{2}(?:[^\\/\\?#]*\\/)|([\\/\\\\]))?((?:[^\\/\\\\\\?#]*[\\/\\\\])*)([^\\/\\\\\\?#]*)([#\\?].*)?$/i;\n\n const urlParts = url.match(urlPartsRegex);\n const returner = {};\n let rawDirectories = [];\n const directories = [];\n let i;\n let baseUrlParts;\n\n if (!urlParts) {\n throw new Error(`Could not parse sheet href - '${url}'`);\n }\n\n // Stylesheets in IE don't always return the full path\n if (baseUrl && (!urlParts[1] || urlParts[2])) {\n baseUrlParts = baseUrl.match(urlPartsRegex);\n if (!baseUrlParts) {\n throw new Error(`Could not parse page url - '${baseUrl}'`);\n }\n urlParts[1] = urlParts[1] || baseUrlParts[1] || '';\n if (!urlParts[2]) {\n urlParts[3] = baseUrlParts[3] + urlParts[3];\n }\n }\n\n if (urlParts[3]) {\n rawDirectories = urlParts[3].replace(/\\\\/g, '/').split('/');\n\n // collapse '..' and skip '.'\n for (i = 0; i < rawDirectories.length; i++) {\n\n if (rawDirectories[i] === '..') {\n directories.pop();\n }\n else if (rawDirectories[i] !== '.') {\n directories.push(rawDirectories[i]);\n }\n \n }\n }\n\n returner.hostPart = urlParts[1];\n returner.directories = directories;\n returner.rawPath = (urlParts[1] || '') + rawDirectories.join('/');\n returner.path = (urlParts[1] || '') + directories.join('/');\n returner.filename = urlParts[4];\n returner.fileUrl = returner.path + (urlParts[4] || '');\n returner.url = returner.fileUrl + (urlParts[5] || '');\n return returner;\n }\n}\n\nexport default AbstractFileManager;\n","import functionRegistry from '../functions/function-registry';\nimport LessError from '../less-error';\n\nclass AbstractPluginLoader {\n constructor() {\n // Implemented by Node.js plugin loader\n this.require = function() {\n return null;\n }\n }\n\n evalPlugin(contents, context, imports, pluginOptions, fileInfo) {\n\n let loader, registry, pluginObj, localModule, pluginManager, filename, result;\n\n pluginManager = context.pluginManager;\n\n if (fileInfo) {\n if (typeof fileInfo === 'string') {\n filename = fileInfo;\n }\n else {\n filename = fileInfo.filename;\n }\n }\n const shortname = (new this.less.FileManager()).extractUrlParts(filename).filename;\n\n if (filename) {\n pluginObj = pluginManager.get(filename);\n\n if (pluginObj) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imports, filename);\n }\n return pluginObj;\n }\n }\n localModule = {\n exports: {},\n pluginManager,\n fileInfo\n };\n registry = functionRegistry.create();\n\n const registerPlugin = function(obj) {\n pluginObj = obj;\n };\n\n try {\n loader = new Function('module', 'require', 'registerPlugin', 'functions', 'tree', 'less', 'fileInfo', contents);\n loader(localModule, this.require(filename), registerPlugin, registry, this.less.tree, this.less, fileInfo);\n }\n catch (e) {\n return new LessError(e, imports, filename);\n }\n\n if (!pluginObj) {\n pluginObj = localModule.exports;\n }\n pluginObj = this.validatePlugin(pluginObj, filename, shortname);\n\n if (pluginObj instanceof LessError) {\n return pluginObj;\n }\n\n if (pluginObj) {\n pluginObj.imports = imports;\n pluginObj.filename = filename;\n\n // For < 3.x (or unspecified minVersion) - setOptions() before install()\n if (!pluginObj.minVersion || this.compareVersion('3.0.0', pluginObj.minVersion) < 0) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n\n if (result) {\n return result;\n }\n }\n\n // Run on first load\n pluginManager.addPlugin(pluginObj, fileInfo.filename, registry);\n pluginObj.functions = registry.getLocalFunctions();\n\n // Need to call setOptions again because the pluginObj might have functions\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n\n // Run every @plugin call\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imports, filename);\n }\n\n }\n else {\n return new LessError({ message: 'Not a valid plugin' }, imports, filename);\n }\n\n return pluginObj;\n\n }\n\n trySetOptions(plugin, filename, name, options) {\n if (options && !plugin.setOptions) {\n return new LessError({\n message: `Options have been provided but the plugin ${name} does not support any options.`\n });\n }\n try {\n plugin.setOptions && plugin.setOptions(options);\n }\n catch (e) {\n return new LessError(e);\n }\n }\n\n validatePlugin(plugin, filename, name) {\n if (plugin) {\n // support plugins being a function\n // so that the plugin can be more usable programmatically\n if (typeof plugin === 'function') {\n plugin = new plugin();\n }\n\n if (plugin.minVersion) {\n if (this.compareVersion(plugin.minVersion, this.less.version) < 0) {\n return new LessError({\n message: `Plugin ${name} requires version ${this.versionToString(plugin.minVersion)}`\n });\n }\n }\n return plugin;\n }\n return null;\n }\n\n compareVersion(aVersion, bVersion) {\n if (typeof aVersion === 'string') {\n aVersion = aVersion.match(/^(\\d+)\\.?(\\d+)?\\.?(\\d+)?/);\n aVersion.shift();\n }\n for (let i = 0; i < aVersion.length; i++) {\n if (aVersion[i] !== bVersion[i]) {\n return parseInt(aVersion[i]) > parseInt(bVersion[i]) ? -1 : 1;\n }\n }\n return 0;\n }\n\n versionToString(version) {\n let versionString = '';\n for (let i = 0; i < version.length; i++) {\n versionString += (versionString ? '.' : '') + version[i];\n }\n return versionString;\n }\n\n printUsage(plugins) {\n for (let i = 0; i < plugins.length; i++) {\n const plugin = plugins[i];\n if (plugin.printUsage) {\n plugin.printUsage();\n }\n }\n }\n}\n\nexport default AbstractPluginLoader;\n\n","import tree from '../tree';\n\nconst _visitArgs = { visitDeeper: true };\nlet _hasIndexed = false;\n\nfunction _noop(node) {\n return node;\n}\n\nfunction indexNodeTypes(parent, ticker) {\n // add .typeIndex to tree node types for lookup table\n let key, child;\n for (key in parent) { \n /* eslint guard-for-in: 0 */\n child = parent[key];\n switch (typeof child) {\n case 'function':\n // ignore bound functions directly on tree which do not have a prototype\n // or aren't nodes\n if (child.prototype && child.prototype.type) {\n child.prototype.typeIndex = ticker++;\n }\n break;\n case 'object':\n ticker = indexNodeTypes(child, ticker);\n break;\n \n }\n }\n return ticker;\n}\n\nclass Visitor {\n constructor(implementation) {\n this._implementation = implementation;\n this._visitInCache = {};\n this._visitOutCache = {};\n\n if (!_hasIndexed) {\n indexNodeTypes(tree, 1);\n _hasIndexed = true;\n }\n }\n\n visit(node) {\n if (!node) {\n return node;\n }\n\n const nodeTypeIndex = node.typeIndex;\n if (!nodeTypeIndex) {\n // MixinCall args aren't a node type?\n if (node.value && node.value.typeIndex) {\n this.visit(node.value);\n }\n return node;\n }\n\n const impl = this._implementation;\n let func = this._visitInCache[nodeTypeIndex];\n let funcOut = this._visitOutCache[nodeTypeIndex];\n const visitArgs = _visitArgs;\n let fnName;\n\n visitArgs.visitDeeper = true;\n\n if (!func) {\n fnName = `visit${node.type}`;\n func = impl[fnName] || _noop;\n funcOut = impl[`${fnName}Out`] || _noop;\n this._visitInCache[nodeTypeIndex] = func;\n this._visitOutCache[nodeTypeIndex] = funcOut;\n }\n\n if (func !== _noop) {\n const newNode = func.call(impl, node, visitArgs);\n if (node && impl.isReplacing) {\n node = newNode;\n }\n }\n\n if (visitArgs.visitDeeper && node) {\n if (node.length) {\n for (let i = 0, cnt = node.length; i < cnt; i++) {\n if (node[i].accept) {\n node[i].accept(this);\n }\n }\n } else if (node.accept) {\n node.accept(this);\n }\n }\n\n if (funcOut != _noop) {\n funcOut.call(impl, node);\n }\n\n return node;\n }\n\n visitArray(nodes, nonReplacing) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.length;\n let i;\n\n // Non-replacing\n if (nonReplacing || !this._implementation.isReplacing) {\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n // Replacing\n const out = [];\n for (i = 0; i < cnt; i++) {\n const evald = this.visit(nodes[i]);\n if (evald === undefined) { continue; }\n if (!evald.splice) {\n out.push(evald);\n } else if (evald.length) {\n this.flatten(evald, out);\n }\n }\n return out;\n }\n\n flatten(arr, out) {\n if (!out) {\n out = [];\n }\n\n let cnt, i, item, nestedCnt, j, nestedItem;\n\n for (i = 0, cnt = arr.length; i < cnt; i++) {\n item = arr[i];\n if (item === undefined) {\n continue;\n }\n if (!item.splice) {\n out.push(item);\n continue;\n }\n\n for (j = 0, nestedCnt = item.length; j < nestedCnt; j++) {\n nestedItem = item[j];\n if (nestedItem === undefined) {\n continue;\n }\n if (!nestedItem.splice) {\n out.push(nestedItem);\n } else if (nestedItem.length) {\n this.flatten(nestedItem, out);\n }\n }\n }\n\n return out;\n }\n}\n\nexport default Visitor;\n","class ImportSequencer {\n constructor(onSequencerEmpty) {\n this.imports = [];\n this.variableImports = [];\n this._onSequencerEmpty = onSequencerEmpty;\n this._currentDepth = 0;\n }\n\n addImport(callback) {\n const importSequencer = this,\n importItem = {\n callback,\n args: null,\n isReady: false\n };\n this.imports.push(importItem);\n return function() {\n importItem.args = Array.prototype.slice.call(arguments, 0);\n importItem.isReady = true;\n importSequencer.tryRun();\n };\n }\n\n addVariableImport(callback) {\n this.variableImports.push(callback);\n }\n\n tryRun() {\n this._currentDepth++;\n try {\n while (true) {\n while (this.imports.length > 0) {\n const importItem = this.imports[0];\n if (!importItem.isReady) {\n return;\n }\n this.imports = this.imports.slice(1);\n importItem.callback.apply(null, importItem.args);\n }\n if (this.variableImports.length === 0) {\n break;\n }\n const variableImport = this.variableImports[0];\n this.variableImports = this.variableImports.slice(1);\n variableImport();\n }\n } finally {\n this._currentDepth--;\n }\n if (this._currentDepth === 0 && this._onSequencerEmpty) {\n this._onSequencerEmpty();\n }\n }\n}\n\nexport default ImportSequencer;\n","import contexts from '../contexts';\nimport Visitor from './visitor';\nimport ImportSequencer from './import-sequencer';\nimport * as utils from '../utils';\n\nconst ImportVisitor = function(importer, finish) {\n\n this._visitor = new Visitor(this);\n this._importer = importer;\n this._finish = finish;\n this.context = new contexts.Eval();\n this.importCount = 0;\n this.onceFileDetectionMap = {};\n this.recursionDetector = {};\n this._sequencer = new ImportSequencer(this._onSequencerEmpty.bind(this));\n};\n\nImportVisitor.prototype = {\n isReplacing: false,\n run: function (root) {\n try {\n // process the contents\n this._visitor.visit(root);\n }\n catch (e) {\n this.error = e;\n }\n\n this.isFinished = true;\n this._sequencer.tryRun();\n },\n _onSequencerEmpty: function() {\n if (!this.isFinished) {\n return;\n }\n this._finish(this.error);\n },\n visitImport: function (importNode, visitArgs) {\n const inlineCSS = importNode.options.inline;\n\n if (!importNode.css || inlineCSS) {\n\n const context = new contexts.Eval(this.context, utils.copyArray(this.context.frames));\n const importParent = context.frames[0];\n\n this.importCount++;\n if (importNode.isVariableImport()) {\n this._sequencer.addVariableImport(this.processImportNode.bind(this, importNode, context, importParent));\n } else {\n this.processImportNode(importNode, context, importParent);\n }\n }\n visitArgs.visitDeeper = false;\n },\n processImportNode: function(importNode, context, importParent) {\n let evaldImportNode;\n const inlineCSS = importNode.options.inline;\n\n try {\n evaldImportNode = importNode.evalForImport(context);\n } catch (e) {\n if (!e.filename) { e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename; }\n // attempt to eval properly and treat as css\n importNode.css = true;\n // if that fails, this error will be thrown\n importNode.error = e;\n }\n\n if (evaldImportNode && (!evaldImportNode.css || inlineCSS)) {\n\n if (evaldImportNode.options.multiple) {\n context.importMultiple = true;\n }\n\n // try appending if we haven't determined if it is css or not\n const tryAppendLessExtension = evaldImportNode.css === undefined;\n\n for (let i = 0; i < importParent.rules.length; i++) {\n if (importParent.rules[i] === importNode) {\n importParent.rules[i] = evaldImportNode;\n break;\n }\n }\n\n const onImported = this.onImported.bind(this, evaldImportNode, context), sequencedOnImported = this._sequencer.addImport(onImported);\n\n this._importer.push(evaldImportNode.getPath(), tryAppendLessExtension, evaldImportNode.fileInfo(),\n evaldImportNode.options, sequencedOnImported);\n } else {\n this.importCount--;\n if (this.isFinished) {\n this._sequencer.tryRun();\n }\n }\n },\n onImported: function (importNode, context, e, root, importedAtRoot, fullPath) {\n if (e) {\n if (!e.filename) {\n e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename;\n }\n this.error = e;\n }\n\n const importVisitor = this,\n inlineCSS = importNode.options.inline,\n isPlugin = importNode.options.isPlugin,\n isOptional = importNode.options.optional,\n duplicateImport = importedAtRoot || fullPath in importVisitor.recursionDetector;\n\n if (!context.importMultiple) {\n if (duplicateImport) {\n importNode.skip = true;\n } else {\n importNode.skip = function() {\n if (fullPath in importVisitor.onceFileDetectionMap) {\n return true;\n }\n importVisitor.onceFileDetectionMap[fullPath] = true;\n return false;\n };\n }\n }\n\n if (!fullPath && isOptional) {\n importNode.skip = true;\n }\n\n if (root) {\n importNode.root = root;\n importNode.importedFilename = fullPath;\n\n if (!inlineCSS && !isPlugin && (context.importMultiple || !duplicateImport)) {\n importVisitor.recursionDetector[fullPath] = true;\n\n const oldContext = this.context;\n this.context = context;\n try {\n this._visitor.visit(root);\n } catch (e) {\n this.error = e;\n }\n this.context = oldContext;\n }\n }\n\n importVisitor.importCount--;\n\n if (importVisitor.isFinished) {\n importVisitor._sequencer.tryRun();\n }\n },\n visitDeclaration: function (declNode, visitArgs) {\n if (declNode.value.type === 'DetachedRuleset') {\n this.context.frames.unshift(declNode);\n } else {\n visitArgs.visitDeeper = false;\n }\n },\n visitDeclarationOut: function(declNode) {\n if (declNode.value.type === 'DetachedRuleset') {\n this.context.frames.shift();\n }\n },\n visitAtRule: function (atRuleNode, visitArgs) {\n this.context.frames.unshift(atRuleNode);\n },\n visitAtRuleOut: function (atRuleNode) {\n this.context.frames.shift();\n },\n visitMixinDefinition: function (mixinDefinitionNode, visitArgs) {\n this.context.frames.unshift(mixinDefinitionNode);\n },\n visitMixinDefinitionOut: function (mixinDefinitionNode) {\n this.context.frames.shift();\n },\n visitRuleset: function (rulesetNode, visitArgs) {\n this.context.frames.unshift(rulesetNode);\n },\n visitRulesetOut: function (rulesetNode) {\n this.context.frames.shift();\n },\n visitMedia: function (mediaNode, visitArgs) {\n this.context.frames.unshift(mediaNode.rules[0]);\n },\n visitMediaOut: function (mediaNode) {\n this.context.frames.shift();\n }\n};\nexport default ImportVisitor;\n","class SetTreeVisibilityVisitor {\n constructor(visible) {\n this.visible = visible;\n }\n\n run(root) {\n this.visit(root);\n }\n\n visitArray(nodes) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.length;\n let i;\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n visit(node) {\n if (!node) {\n return node;\n }\n if (node.constructor === Array) {\n return this.visitArray(node);\n }\n\n if (!node.blocksVisibility || node.blocksVisibility()) {\n return node;\n }\n if (this.visible) {\n node.ensureVisibility();\n } else {\n node.ensureInvisibility();\n }\n\n node.accept(this);\n return node;\n }\n}\n\nexport default SetTreeVisibilityVisitor;","import tree from '../tree';\nimport Visitor from './visitor';\nimport logger from '../logger';\nimport * as utils from '../utils';\n\n/* jshint loopfunc:true */\n\nclass ExtendFinderVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n this.contexts = [];\n this.allExtendsStack = [[]];\n }\n\n run(root) {\n root = this._visitor.visit(root);\n root.allExtends = this.allExtendsStack[0];\n return root;\n }\n\n visitDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n\n let i;\n let j;\n let extend;\n const allSelectorsExtendList = [];\n let extendList;\n\n // get &:extend(.a); rules which apply to all selectors in this ruleset\n const rules = rulesetNode.rules, ruleCnt = rules ? rules.length : 0;\n for (i = 0; i < ruleCnt; i++) {\n if (rulesetNode.rules[i] instanceof tree.Extend) {\n allSelectorsExtendList.push(rules[i]);\n rulesetNode.extendOnEveryPath = true;\n }\n }\n\n // now find every selector and apply the extends that apply to all extends\n // and the ones which apply to an individual extend\n const paths = rulesetNode.paths;\n for (i = 0; i < paths.length; i++) {\n const selectorPath = paths[i], selector = selectorPath[selectorPath.length - 1], selExtendList = selector.extendList;\n\n extendList = selExtendList ? utils.copyArray(selExtendList).concat(allSelectorsExtendList)\n : allSelectorsExtendList;\n\n if (extendList) {\n extendList = extendList.map(function(allSelectorsExtend) {\n return allSelectorsExtend.clone();\n });\n }\n\n for (j = 0; j < extendList.length; j++) {\n this.foundExtends = true;\n extend = extendList[j];\n extend.findSelfSelectors(selectorPath);\n extend.ruleset = rulesetNode;\n if (j === 0) { extend.firstExtendOnThisSelectorPath = true; }\n this.allExtendsStack[this.allExtendsStack.length - 1].push(extend);\n }\n }\n\n this.contexts.push(rulesetNode.selectors);\n }\n\n visitRulesetOut(rulesetNode) {\n if (!rulesetNode.root) {\n this.contexts.length = this.contexts.length - 1;\n }\n }\n\n visitMedia(mediaNode, visitArgs) {\n mediaNode.allExtends = [];\n this.allExtendsStack.push(mediaNode.allExtends);\n }\n\n visitMediaOut(mediaNode) {\n this.allExtendsStack.length = this.allExtendsStack.length - 1;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n atRuleNode.allExtends = [];\n this.allExtendsStack.push(atRuleNode.allExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n this.allExtendsStack.length = this.allExtendsStack.length - 1;\n }\n}\n\nclass ProcessExtendsVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n }\n\n run(root) {\n const extendFinder = new ExtendFinderVisitor();\n this.extendIndices = {};\n extendFinder.run(root);\n if (!extendFinder.foundExtends) { return root; }\n root.allExtends = root.allExtends.concat(this.doExtendChaining(root.allExtends, root.allExtends));\n this.allExtendsStack = [root.allExtends];\n const newRoot = this._visitor.visit(root);\n this.checkExtendsForNonMatched(root.allExtends);\n return newRoot;\n }\n\n checkExtendsForNonMatched(extendList) {\n const indices = this.extendIndices;\n extendList.filter(function(extend) {\n return !extend.hasFoundMatches && extend.parent_ids.length == 1;\n }).forEach(function(extend) {\n let selector = '_unknown_';\n try {\n selector = extend.selector.toCSS({});\n }\n catch (_) {}\n\n if (!indices[`${extend.index} ${selector}`]) {\n indices[`${extend.index} ${selector}`] = true;\n logger.warn(`extend '${selector}' has no matches`);\n }\n });\n }\n\n doExtendChaining(extendsList, extendsListTarget, iterationCount) {\n //\n // chaining is different from normal extension.. if we extend an extend then we are not just copying, altering\n // and pasting the selector we would do normally, but we are also adding an extend with the same target selector\n // this means this new extend can then go and alter other extends\n //\n // this method deals with all the chaining work - without it, extend is flat and doesn't work on other extend selectors\n // this is also the most expensive.. and a match on one selector can cause an extension of a selector we had already\n // processed if we look at each selector at a time, as is done in visitRuleset\n\n let extendIndex;\n\n let targetExtendIndex;\n let matches;\n const extendsToAdd = [];\n let newSelector;\n const extendVisitor = this;\n let selectorPath;\n let extend;\n let targetExtend;\n let newExtend;\n\n iterationCount = iterationCount || 0;\n\n // loop through comparing every extend with every target extend.\n // a target extend is the one on the ruleset we are looking at copy/edit/pasting in place\n // e.g. .a:extend(.b) {} and .b:extend(.c) {} then the first extend extends the second one\n // and the second is the target.\n // the separation into two lists allows us to process a subset of chains with a bigger set, as is the\n // case when processing media queries\n for (extendIndex = 0; extendIndex < extendsList.length; extendIndex++) {\n for (targetExtendIndex = 0; targetExtendIndex < extendsListTarget.length; targetExtendIndex++) {\n\n extend = extendsList[extendIndex];\n targetExtend = extendsListTarget[targetExtendIndex];\n\n // look for circular references\n if ( extend.parent_ids.indexOf( targetExtend.object_id ) >= 0 ) { continue; }\n\n // find a match in the target extends self selector (the bit before :extend)\n selectorPath = [targetExtend.selfSelectors[0]];\n matches = extendVisitor.findMatch(extend, selectorPath);\n\n if (matches.length) {\n extend.hasFoundMatches = true;\n\n // we found a match, so for each self selector..\n extend.selfSelectors.forEach(function(selfSelector) {\n const info = targetExtend.visibilityInfo();\n\n // process the extend as usual\n newSelector = extendVisitor.extendSelector(matches, selectorPath, selfSelector, extend.isVisible());\n\n // but now we create a new extend from it\n newExtend = new(tree.Extend)(targetExtend.selector, targetExtend.option, 0, targetExtend.fileInfo(), info);\n newExtend.selfSelectors = newSelector;\n\n // add the extend onto the list of extends for that selector\n newSelector[newSelector.length - 1].extendList = [newExtend];\n\n // record that we need to add it.\n extendsToAdd.push(newExtend);\n newExtend.ruleset = targetExtend.ruleset;\n\n // remember its parents for circular references\n newExtend.parent_ids = newExtend.parent_ids.concat(targetExtend.parent_ids, extend.parent_ids);\n\n // only process the selector once.. if we have :extend(.a,.b) then multiple\n // extends will look at the same selector path, so when extending\n // we know that any others will be duplicates in terms of what is added to the css\n if (targetExtend.firstExtendOnThisSelectorPath) {\n newExtend.firstExtendOnThisSelectorPath = true;\n targetExtend.ruleset.paths.push(newSelector);\n }\n });\n }\n }\n }\n\n if (extendsToAdd.length) {\n // try to detect circular references to stop a stack overflow.\n // may no longer be needed.\n this.extendChainCount++;\n if (iterationCount > 100) {\n let selectorOne = '{unable to calculate}';\n let selectorTwo = '{unable to calculate}';\n try {\n selectorOne = extendsToAdd[0].selfSelectors[0].toCSS();\n selectorTwo = extendsToAdd[0].selector.toCSS();\n }\n catch (e) {}\n throw { message: `extend circular reference detected. One of the circular extends is currently:${selectorOne}:extend(${selectorTwo})`};\n }\n\n // now process the new extends on the existing rules so that we can handle a extending b extending c extending\n // d extending e...\n return extendsToAdd.concat(extendVisitor.doExtendChaining(extendsToAdd, extendsListTarget, iterationCount + 1));\n } else {\n return extendsToAdd;\n }\n }\n\n visitDeclaration(ruleNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitSelector(selectorNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n let matches;\n let pathIndex;\n let extendIndex;\n const allExtends = this.allExtendsStack[this.allExtendsStack.length - 1];\n const selectorsToAdd = [];\n const extendVisitor = this;\n let selectorPath;\n\n // look at each selector path in the ruleset, find any extend matches and then copy, find and replace\n\n for (extendIndex = 0; extendIndex < allExtends.length; extendIndex++) {\n for (pathIndex = 0; pathIndex < rulesetNode.paths.length; pathIndex++) {\n selectorPath = rulesetNode.paths[pathIndex];\n\n // extending extends happens initially, before the main pass\n if (rulesetNode.extendOnEveryPath) { continue; }\n const extendList = selectorPath[selectorPath.length - 1].extendList;\n if (extendList && extendList.length) { continue; }\n\n matches = this.findMatch(allExtends[extendIndex], selectorPath);\n\n if (matches.length) {\n allExtends[extendIndex].hasFoundMatches = true;\n\n allExtends[extendIndex].selfSelectors.forEach(function(selfSelector) {\n let extendedSelectors;\n extendedSelectors = extendVisitor.extendSelector(matches, selectorPath, selfSelector, allExtends[extendIndex].isVisible());\n selectorsToAdd.push(extendedSelectors);\n });\n }\n }\n }\n rulesetNode.paths = rulesetNode.paths.concat(selectorsToAdd);\n }\n\n findMatch(extend, haystackSelectorPath) {\n //\n // look through the haystack selector path to try and find the needle - extend.selector\n // returns an array of selector matches that can then be replaced\n //\n let haystackSelectorIndex;\n\n let hackstackSelector;\n let hackstackElementIndex;\n let haystackElement;\n let targetCombinator;\n let i;\n const extendVisitor = this;\n const needleElements = extend.selector.elements;\n const potentialMatches = [];\n let potentialMatch;\n const matches = [];\n\n // loop through the haystack elements\n for (haystackSelectorIndex = 0; haystackSelectorIndex < haystackSelectorPath.length; haystackSelectorIndex++) {\n hackstackSelector = haystackSelectorPath[haystackSelectorIndex];\n\n for (hackstackElementIndex = 0; hackstackElementIndex < hackstackSelector.elements.length; hackstackElementIndex++) {\n\n haystackElement = hackstackSelector.elements[hackstackElementIndex];\n\n // if we allow elements before our match we can add a potential match every time. otherwise only at the first element.\n if (extend.allowBefore || (haystackSelectorIndex === 0 && hackstackElementIndex === 0)) {\n potentialMatches.push({pathIndex: haystackSelectorIndex, index: hackstackElementIndex, matched: 0,\n initialCombinator: haystackElement.combinator});\n }\n\n for (i = 0; i < potentialMatches.length; i++) {\n potentialMatch = potentialMatches[i];\n\n // selectors add \" \" onto the first element. When we use & it joins the selectors together, but if we don't\n // then each selector in haystackSelectorPath has a space before it added in the toCSS phase. so we need to\n // work out what the resulting combinator will be\n targetCombinator = haystackElement.combinator.value;\n if (targetCombinator === '' && hackstackElementIndex === 0) {\n targetCombinator = ' ';\n }\n\n // if we don't match, null our match to indicate failure\n if (!extendVisitor.isElementValuesEqual(needleElements[potentialMatch.matched].value, haystackElement.value) ||\n (potentialMatch.matched > 0 && needleElements[potentialMatch.matched].combinator.value !== targetCombinator)) {\n potentialMatch = null;\n } else {\n potentialMatch.matched++;\n }\n\n // if we are still valid and have finished, test whether we have elements after and whether these are allowed\n if (potentialMatch) {\n potentialMatch.finished = potentialMatch.matched === needleElements.length;\n if (potentialMatch.finished &&\n (!extend.allowAfter &&\n (hackstackElementIndex + 1 < hackstackSelector.elements.length || haystackSelectorIndex + 1 < haystackSelectorPath.length))) {\n potentialMatch = null;\n }\n }\n // if null we remove, if not, we are still valid, so either push as a valid match or continue\n if (potentialMatch) {\n if (potentialMatch.finished) {\n potentialMatch.length = needleElements.length;\n potentialMatch.endPathIndex = haystackSelectorIndex;\n potentialMatch.endPathElementIndex = hackstackElementIndex + 1; // index after end of match\n potentialMatches.length = 0; // we don't allow matches to overlap, so start matching again\n matches.push(potentialMatch);\n }\n } else {\n potentialMatches.splice(i, 1);\n i--;\n }\n }\n }\n }\n return matches;\n }\n\n isElementValuesEqual(elementValue1, elementValue2) {\n if (typeof elementValue1 === 'string' || typeof elementValue2 === 'string') {\n return elementValue1 === elementValue2;\n }\n if (elementValue1 instanceof tree.Attribute) {\n if (elementValue1.op !== elementValue2.op || elementValue1.key !== elementValue2.key) {\n return false;\n }\n if (!elementValue1.value || !elementValue2.value) {\n if (elementValue1.value || elementValue2.value) {\n return false;\n }\n return true;\n }\n elementValue1 = elementValue1.value.value || elementValue1.value;\n elementValue2 = elementValue2.value.value || elementValue2.value;\n return elementValue1 === elementValue2;\n }\n elementValue1 = elementValue1.value;\n elementValue2 = elementValue2.value;\n if (elementValue1 instanceof tree.Selector) {\n if (!(elementValue2 instanceof tree.Selector) || elementValue1.elements.length !== elementValue2.elements.length) {\n return false;\n }\n for (let i = 0; i < elementValue1.elements.length; i++) {\n if (elementValue1.elements[i].combinator.value !== elementValue2.elements[i].combinator.value) {\n if (i !== 0 || (elementValue1.elements[i].combinator.value || ' ') !== (elementValue2.elements[i].combinator.value || ' ')) {\n return false;\n }\n }\n if (!this.isElementValuesEqual(elementValue1.elements[i].value, elementValue2.elements[i].value)) {\n return false;\n }\n }\n return true;\n }\n return false;\n }\n\n extendSelector(matches, selectorPath, replacementSelector, isVisible) {\n\n // for a set of matches, replace each match with the replacement selector\n\n let currentSelectorPathIndex = 0, currentSelectorPathElementIndex = 0, path = [], matchIndex, selector, firstElement, match, newElements;\n\n for (matchIndex = 0; matchIndex < matches.length; matchIndex++) {\n match = matches[matchIndex];\n selector = selectorPath[match.pathIndex];\n firstElement = new tree.Element(\n match.initialCombinator,\n replacementSelector.elements[0].value,\n replacementSelector.elements[0].isVariable,\n replacementSelector.elements[0].getIndex(),\n replacementSelector.elements[0].fileInfo()\n );\n\n if (match.pathIndex > currentSelectorPathIndex && currentSelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n\n newElements = selector.elements\n .slice(currentSelectorPathElementIndex, match.index)\n .concat([firstElement])\n .concat(replacementSelector.elements.slice(1));\n\n if (currentSelectorPathIndex === match.pathIndex && matchIndex > 0) {\n path[path.length - 1].elements =\n path[path.length - 1].elements.concat(newElements);\n } else {\n path = path.concat(selectorPath.slice(currentSelectorPathIndex, match.pathIndex));\n\n path.push(new tree.Selector(\n newElements\n ));\n }\n currentSelectorPathIndex = match.endPathIndex;\n currentSelectorPathElementIndex = match.endPathElementIndex;\n if (currentSelectorPathElementIndex >= selectorPath[currentSelectorPathIndex].elements.length) {\n currentSelectorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n }\n\n if (currentSelectorPathIndex < selectorPath.length && currentSelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathIndex++;\n }\n\n path = path.concat(selectorPath.slice(currentSelectorPathIndex, selectorPath.length));\n path = path.map(function (currentValue) {\n // we can re-use elements here, because the visibility property matters only for selectors\n const derived = currentValue.createDerived(currentValue.elements);\n if (isVisible) {\n derived.ensureVisibility();\n } else {\n derived.ensureInvisibility();\n }\n return derived;\n });\n return path;\n }\n\n visitMedia(mediaNode, visitArgs) {\n let newAllExtends = mediaNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, mediaNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitMediaOut(mediaNode) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStack.length = lastIndex;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n let newAllExtends = atRuleNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, atRuleNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStack.length = lastIndex;\n }\n}\n\nexport default ProcessExtendsVisitor;\n","import Visitor from './visitor';\n\nclass JoinSelectorVisitor {\n constructor() {\n this.contexts = [[]];\n this._visitor = new Visitor(this);\n }\n\n run(root) {\n return this._visitor.visit(root);\n }\n\n visitDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n const paths = [];\n let selectors;\n\n this.contexts.push(paths);\n\n if (!rulesetNode.root) {\n selectors = rulesetNode.selectors;\n if (selectors) {\n selectors = selectors.filter(function(selector) { return selector.getIsOutput(); });\n rulesetNode.selectors = selectors.length ? selectors : (selectors = null);\n if (selectors) { rulesetNode.joinSelectors(paths, context, selectors); }\n }\n if (!selectors) { rulesetNode.rules = null; }\n rulesetNode.paths = paths;\n }\n }\n\n visitRulesetOut(rulesetNode) {\n this.contexts.length = this.contexts.length - 1;\n }\n\n visitMedia(mediaNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n mediaNode.rules[0].root = (context.length === 0 || context[0].multiMedia);\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n if (atRuleNode.rules && atRuleNode.rules.length) {\n atRuleNode.rules[0].root = (atRuleNode.isRooted || context.length === 0 || null);\n }\n }\n}\n\nexport default JoinSelectorVisitor;\n","import tree from '../tree';\nimport Visitor from './visitor';\n\nclass CSSVisitorUtils {\n constructor(context) {\n this._visitor = new Visitor(this);\n this._context = context;\n }\n\n containsSilentNonBlockedChild(bodyRules) {\n let rule;\n if (!bodyRules) {\n return false;\n }\n for (let r = 0; r < bodyRules.length; r++) {\n rule = bodyRules[r];\n if (rule.isSilent && rule.isSilent(this._context) && !rule.blocksVisibility()) {\n // the atrule contains something that was referenced (likely by extend)\n // therefore it needs to be shown in output too\n return true;\n }\n }\n return false;\n }\n\n keepOnlyVisibleChilds(owner) {\n if (owner && owner.rules) {\n owner.rules = owner.rules.filter(thing => thing.isVisible());\n }\n }\n\n isEmpty(owner) {\n return (owner && owner.rules) \n ? (owner.rules.length === 0) : true;\n }\n\n hasVisibleSelector(rulesetNode) {\n return (rulesetNode && rulesetNode.paths)\n ? (rulesetNode.paths.length > 0) : false;\n }\n\n resolveVisibility(node, originalRules) {\n if (!node.blocksVisibility()) {\n if (this.isEmpty(node) && !this.containsSilentNonBlockedChild(originalRules)) {\n return ;\n }\n\n return node;\n }\n\n const compiledRulesBody = node.rules[0];\n this.keepOnlyVisibleChilds(compiledRulesBody);\n\n if (this.isEmpty(compiledRulesBody)) {\n return ;\n }\n\n node.ensureVisibility();\n node.removeVisibilityBlock();\n\n return node;\n }\n\n isVisibleRuleset(rulesetNode) {\n if (rulesetNode.firstRoot) {\n return true;\n }\n\n if (this.isEmpty(rulesetNode)) {\n return false;\n }\n\n if (!rulesetNode.root && !this.hasVisibleSelector(rulesetNode)) {\n return false;\n }\n\n return true;\n }\n}\n\nconst ToCSSVisitor = function(context) {\n this._visitor = new Visitor(this);\n this._context = context;\n this.utils = new CSSVisitorUtils(context);\n};\n\nToCSSVisitor.prototype = {\n isReplacing: true,\n run: function (root) {\n return this._visitor.visit(root);\n },\n\n visitDeclaration: function (declNode, visitArgs) {\n if (declNode.blocksVisibility() || declNode.variable) {\n return;\n }\n return declNode;\n },\n\n visitMixinDefinition: function (mixinNode, visitArgs) {\n // mixin definitions do not get eval'd - this means they keep state\n // so we have to clear that state here so it isn't used if toCSS is called twice\n mixinNode.frames = [];\n },\n\n visitExtend: function (extendNode, visitArgs) {\n },\n\n visitComment: function (commentNode, visitArgs) {\n if (commentNode.blocksVisibility() || commentNode.isSilent(this._context)) {\n return;\n }\n return commentNode;\n },\n\n visitMedia: function(mediaNode, visitArgs) {\n const originalRules = mediaNode.rules[0].rules;\n mediaNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n\n return this.utils.resolveVisibility(mediaNode, originalRules);\n },\n\n visitImport: function (importNode, visitArgs) {\n if (importNode.blocksVisibility()) {\n return ;\n }\n return importNode;\n },\n\n visitAtRule: function(atRuleNode, visitArgs) {\n if (atRuleNode.rules && atRuleNode.rules.length) {\n return this.visitAtRuleWithBody(atRuleNode, visitArgs);\n } else {\n return this.visitAtRuleWithoutBody(atRuleNode, visitArgs);\n }\n },\n\n visitAnonymous: function(anonymousNode, visitArgs) {\n if (!anonymousNode.blocksVisibility()) {\n anonymousNode.accept(this._visitor);\n return anonymousNode;\n }\n },\n\n visitAtRuleWithBody: function(atRuleNode, visitArgs) {\n // if there is only one nested ruleset and that one has no path, then it is\n // just fake ruleset\n function hasFakeRuleset(atRuleNode) {\n const bodyRules = atRuleNode.rules;\n return bodyRules.length === 1 && (!bodyRules[0].paths || bodyRules[0].paths.length === 0);\n }\n function getBodyRules(atRuleNode) {\n const nodeRules = atRuleNode.rules;\n if (hasFakeRuleset(atRuleNode)) {\n return nodeRules[0].rules;\n }\n\n return nodeRules;\n }\n // it is still true that it is only one ruleset in array\n // this is last such moment\n // process childs\n const originalRules = getBodyRules(atRuleNode);\n atRuleNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n\n if (!this.utils.isEmpty(atRuleNode)) {\n this._mergeRules(atRuleNode.rules[0].rules);\n }\n\n return this.utils.resolveVisibility(atRuleNode, originalRules);\n },\n\n visitAtRuleWithoutBody: function(atRuleNode, visitArgs) {\n if (atRuleNode.blocksVisibility()) {\n return;\n }\n\n if (atRuleNode.name === '@charset') {\n // Only output the debug info together with subsequent @charset definitions\n // a comment (or @media statement) before the actual @charset atrule would\n // be considered illegal css as it has to be on the first line\n if (this.charset) {\n if (atRuleNode.debugInfo) {\n const comment = new tree.Comment(`/* ${atRuleNode.toCSS(this._context).replace(/\\n/g, '')} */\\n`);\n comment.debugInfo = atRuleNode.debugInfo;\n return this._visitor.visit(comment);\n }\n return;\n }\n this.charset = true;\n }\n\n return atRuleNode;\n },\n\n checkValidNodes: function(rules, isRoot) {\n if (!rules) {\n return;\n }\n\n for (let i = 0; i < rules.length; i++) {\n const ruleNode = rules[i];\n if (isRoot && ruleNode instanceof tree.Declaration && !ruleNode.variable) {\n throw { message: 'Properties must be inside selector blocks. They cannot be in the root',\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n if (ruleNode instanceof tree.Call) {\n throw { message: `Function '${ruleNode.name}' did not return a root node`,\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n if (ruleNode.type && !ruleNode.allowRoot) {\n throw { message: `${ruleNode.type} node returned by a function is not valid here`,\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n }\n },\n\n visitRuleset: function (rulesetNode, visitArgs) {\n // at this point rulesets are nested into each other\n let rule;\n\n const rulesets = [];\n\n this.checkValidNodes(rulesetNode.rules, rulesetNode.firstRoot);\n\n if (!rulesetNode.root) {\n // remove invisible paths\n this._compileRulesetPaths(rulesetNode);\n\n // remove rulesets from this ruleset body and compile them separately\n const nodeRules = rulesetNode.rules;\n\n let nodeRuleCnt = nodeRules ? nodeRules.length : 0;\n for (let i = 0; i < nodeRuleCnt; ) {\n rule = nodeRules[i];\n if (rule && rule.rules) {\n // visit because we are moving them out from being a child\n rulesets.push(this._visitor.visit(rule));\n nodeRules.splice(i, 1);\n nodeRuleCnt--;\n continue;\n }\n i++;\n }\n // accept the visitor to remove rules and refactor itself\n // then we can decide nogw whether we want it or not\n // compile body\n if (nodeRuleCnt > 0) {\n rulesetNode.accept(this._visitor);\n } else {\n rulesetNode.rules = null;\n }\n visitArgs.visitDeeper = false;\n } else { // if (! rulesetNode.root) {\n rulesetNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n }\n\n if (rulesetNode.rules) {\n this._mergeRules(rulesetNode.rules);\n this._removeDuplicateRules(rulesetNode.rules);\n }\n\n // now decide whether we keep the ruleset\n if (this.utils.isVisibleRuleset(rulesetNode)) {\n rulesetNode.ensureVisibility();\n rulesets.splice(0, 0, rulesetNode);\n }\n\n if (rulesets.length === 1) {\n return rulesets[0];\n }\n return rulesets;\n },\n\n _compileRulesetPaths: function(rulesetNode) {\n if (rulesetNode.paths) {\n rulesetNode.paths = rulesetNode.paths\n .filter(p => {\n let i;\n if (p[0].elements[0].combinator.value === ' ') {\n p[0].elements[0].combinator = new(tree.Combinator)('');\n }\n for (i = 0; i < p.length; i++) {\n if (p[i].isVisible() && p[i].getIsOutput()) {\n return true;\n }\n }\n return false;\n });\n }\n },\n\n _removeDuplicateRules: function(rules) {\n if (!rules) { return; }\n\n // remove duplicates\n const ruleCache = {};\n\n let ruleList;\n let rule;\n let i;\n\n for (i = rules.length - 1; i >= 0 ; i--) {\n rule = rules[i];\n if (rule instanceof tree.Declaration) {\n if (!ruleCache[rule.name]) {\n ruleCache[rule.name] = rule;\n } else {\n ruleList = ruleCache[rule.name];\n if (ruleList instanceof tree.Declaration) {\n ruleList = ruleCache[rule.name] = [ruleCache[rule.name].toCSS(this._context)];\n }\n const ruleCSS = rule.toCSS(this._context);\n if (ruleList.indexOf(ruleCSS) !== -1) {\n rules.splice(i, 1);\n } else {\n ruleList.push(ruleCSS);\n }\n }\n }\n }\n },\n\n _mergeRules: function(rules) {\n if (!rules) {\n return; \n }\n\n const groups = {};\n const groupsArr = [];\n\n for (let i = 0; i < rules.length; i++) {\n const rule = rules[i];\n if (rule.merge) {\n const key = rule.name;\n groups[key] ? rules.splice(i--, 1) : \n groupsArr.push(groups[key] = []);\n groups[key].push(rule);\n }\n }\n\n groupsArr.forEach(group => {\n if (group.length > 0) {\n const result = group[0];\n let space = [];\n const comma = [new tree.Expression(space)];\n group.forEach(rule => {\n if ((rule.merge === '+') && (space.length > 0)) {\n comma.push(new tree.Expression(space = []));\n }\n space.push(rule.value);\n result.important = result.important || rule.important;\n });\n result.value = new tree.Value(comma);\n }\n });\n }\n};\n\nexport default ToCSSVisitor;\n","import Visitor from './visitor';\nimport ImportVisitor from './import-visitor';\nimport MarkVisibleSelectorsVisitor from './set-tree-visibility-visitor';\nimport ExtendVisitor from './extend-visitor';\nimport JoinSelectorVisitor from './join-selector-visitor';\nimport ToCSSVisitor from './to-css-visitor';\n\nexport default {\n Visitor,\n ImportVisitor,\n MarkVisibleSelectorsVisitor,\n ExtendVisitor,\n JoinSelectorVisitor,\n ToCSSVisitor\n};\n","import chunker from './chunker';\n\nexport default () => {\n let // Less input string\n input;\n\n let // current chunk\n j;\n\n const // holds state for backtracking\n saveStack = [];\n\n let // furthest index the parser has gone to\n furthest;\n\n let // if this is furthest we got to, this is the probably cause\n furthestPossibleErrorMessage;\n\n let // chunkified input\n chunks;\n\n let // current chunk\n current;\n\n let // index of current chunk, in `input`\n currentPos;\n\n const parserInput = {};\n const CHARCODE_SPACE = 32;\n const CHARCODE_TAB = 9;\n const CHARCODE_LF = 10;\n const CHARCODE_CR = 13;\n const CHARCODE_PLUS = 43;\n const CHARCODE_COMMA = 44;\n const CHARCODE_FORWARD_SLASH = 47;\n const CHARCODE_9 = 57;\n\n function skipWhitespace(length) {\n const oldi = parserInput.i;\n const oldj = j;\n const curr = parserInput.i - currentPos;\n const endIndex = parserInput.i + current.length - curr;\n const mem = (parserInput.i += length);\n const inp = input;\n let c;\n let nextChar;\n let comment;\n\n for (; parserInput.i < endIndex; parserInput.i++) {\n c = inp.charCodeAt(parserInput.i);\n\n if (parserInput.autoCommentAbsorb && c === CHARCODE_FORWARD_SLASH) {\n nextChar = inp.charAt(parserInput.i + 1);\n if (nextChar === '/') {\n comment = {index: parserInput.i, isLineComment: true};\n let nextNewLine = inp.indexOf('\\n', parserInput.i + 2);\n if (nextNewLine < 0) {\n nextNewLine = endIndex;\n }\n parserInput.i = nextNewLine;\n comment.text = inp.substr(comment.index, parserInput.i - comment.index);\n parserInput.commentStore.push(comment);\n continue;\n } else if (nextChar === '*') {\n const nextStarSlash = inp.indexOf('*/', parserInput.i + 2);\n if (nextStarSlash >= 0) {\n comment = {\n index: parserInput.i,\n text: inp.substr(parserInput.i, nextStarSlash + 2 - parserInput.i),\n isLineComment: false\n };\n parserInput.i += comment.text.length - 1;\n parserInput.commentStore.push(comment);\n continue;\n }\n }\n break;\n }\n\n if ((c !== CHARCODE_SPACE) && (c !== CHARCODE_LF) && (c !== CHARCODE_TAB) && (c !== CHARCODE_CR)) {\n break;\n }\n }\n\n current = current.slice(length + parserInput.i - mem + curr);\n currentPos = parserInput.i;\n\n if (!current.length) {\n if (j < chunks.length - 1) {\n current = chunks[++j];\n skipWhitespace(0); // skip space at the beginning of a chunk\n return true; // things changed\n }\n parserInput.finished = true;\n }\n\n return oldi !== parserInput.i || oldj !== j;\n }\n\n parserInput.save = () => {\n currentPos = parserInput.i;\n saveStack.push( { current, i: parserInput.i, j });\n };\n parserInput.restore = possibleErrorMessage => {\n\n if (parserInput.i > furthest || (parserInput.i === furthest && possibleErrorMessage && !furthestPossibleErrorMessage)) {\n furthest = parserInput.i;\n furthestPossibleErrorMessage = possibleErrorMessage;\n }\n const state = saveStack.pop();\n current = state.current;\n currentPos = parserInput.i = state.i;\n j = state.j;\n };\n parserInput.forget = () => {\n saveStack.pop();\n };\n parserInput.isWhitespace = offset => {\n const pos = parserInput.i + (offset || 0);\n const code = input.charCodeAt(pos);\n return (code === CHARCODE_SPACE || code === CHARCODE_CR || code === CHARCODE_TAB || code === CHARCODE_LF);\n };\n\n // Specialization of $(tok)\n parserInput.$re = tok => {\n if (parserInput.i > currentPos) {\n current = current.slice(parserInput.i - currentPos);\n currentPos = parserInput.i;\n }\n\n const m = tok.exec(current);\n if (!m) {\n return null;\n }\n\n skipWhitespace(m[0].length);\n if (typeof m === 'string') {\n return m;\n }\n\n return m.length === 1 ? m[0] : m;\n };\n\n parserInput.$char = tok => {\n if (input.charAt(parserInput.i) !== tok) {\n return null;\n }\n skipWhitespace(1);\n return tok;\n };\n\n parserInput.$str = tok => {\n const tokLength = tok.length;\n\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tokLength; i++) {\n if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n return null;\n }\n }\n\n skipWhitespace(tokLength);\n return tok;\n };\n\n parserInput.$quoted = loc => {\n const pos = loc || parserInput.i;\n const startChar = input.charAt(pos);\n\n if (startChar !== '\\'' && startChar !== '\"') {\n return;\n }\n const length = input.length;\n const currentPosition = pos;\n\n for (let i = 1; i + currentPosition < length; i++) {\n const nextChar = input.charAt(i + currentPosition);\n switch (nextChar) {\n case '\\\\':\n i++;\n continue;\n case '\\r':\n case '\\n':\n break;\n case startChar:\n const str = input.substr(currentPosition, i + 1);\n if (!loc && loc !== 0) {\n skipWhitespace(i + 1);\n return str\n }\n return [startChar, str];\n default:\n }\n }\n return null;\n };\n\n /**\n * Permissive parsing. Ignores everything except matching {} [] () and quotes\n * until matching token (outside of blocks)\n */\n parserInput.$parseUntil = tok => {\n let quote = '';\n let returnVal = null;\n let inComment = false;\n let blockDepth = 0;\n const blockStack = [];\n const parseGroups = [];\n const length = input.length;\n const startPos = parserInput.i;\n let lastPos = parserInput.i;\n let i = parserInput.i;\n let loop = true;\n let testChar;\n\n if (typeof tok === 'string') {\n testChar = char => char === tok\n } else {\n testChar = char => tok.test(char)\n }\n\n do {\n let prevChar;\n let nextChar = input.charAt(i);\n if (blockDepth === 0 && testChar(nextChar)) {\n returnVal = input.substr(lastPos, i - lastPos);\n if (returnVal) {\n parseGroups.push(returnVal);\n }\n else {\n parseGroups.push(' ');\n }\n returnVal = parseGroups;\n skipWhitespace(i - startPos);\n loop = false\n } else {\n if (inComment) {\n if (nextChar === '*' && \n input.charAt(i + 1) === '/') {\n i++;\n blockDepth--;\n inComment = false;\n }\n i++;\n continue;\n }\n switch (nextChar) {\n case '\\\\':\n i++;\n nextChar = input.charAt(i);\n parseGroups.push(input.substr(lastPos, i - lastPos + 1));\n lastPos = i + 1;\n break;\n case '/':\n if (input.charAt(i + 1) === '*') {\n i++;\n inComment = true;\n blockDepth++;\n }\n break;\n case '\\'':\n case '\"':\n quote = parserInput.$quoted(i);\n if (quote) {\n parseGroups.push(input.substr(lastPos, i - lastPos), quote);\n i += quote[1].length - 1;\n lastPos = i + 1;\n }\n else {\n skipWhitespace(i - startPos);\n returnVal = nextChar;\n loop = false;\n }\n break;\n case '{':\n blockStack.push('}');\n blockDepth++;\n break;\n case '(':\n blockStack.push(')');\n blockDepth++;\n break;\n case '[':\n blockStack.push(']');\n blockDepth++;\n break;\n case '}':\n case ')':\n case ']':\n const expected = blockStack.pop();\n if (nextChar === expected) {\n blockDepth--;\n } else {\n // move the parser to the error and return expected\n skipWhitespace(i - startPos);\n returnVal = expected;\n loop = false;\n }\n }\n i++;\n if (i > length) {\n loop = false;\n }\n }\n prevChar = nextChar;\n } while (loop);\n\n return returnVal ? returnVal : null;\n }\n\n parserInput.autoCommentAbsorb = true;\n parserInput.commentStore = [];\n parserInput.finished = false;\n\n // Same as $(), but don't change the state of the parser,\n // just return the match.\n parserInput.peek = tok => {\n if (typeof tok === 'string') {\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tok.length; i++) {\n if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n return false;\n }\n }\n return true;\n } else {\n return tok.test(current);\n }\n };\n\n // Specialization of peek()\n // TODO remove or change some currentChar calls to peekChar\n parserInput.peekChar = tok => input.charAt(parserInput.i) === tok;\n\n parserInput.currentChar = () => input.charAt(parserInput.i);\n\n parserInput.prevChar = () => input.charAt(parserInput.i - 1);\n\n parserInput.getInput = () => input;\n\n parserInput.peekNotNumeric = () => {\n const c = input.charCodeAt(parserInput.i);\n // Is the first char of the dimension 0-9, '.', '+' or '-'\n return (c > CHARCODE_9 || c < CHARCODE_PLUS) || c === CHARCODE_FORWARD_SLASH || c === CHARCODE_COMMA;\n };\n\n parserInput.start = (str, chunkInput, failFunction) => {\n input = str;\n parserInput.i = j = currentPos = furthest = 0;\n\n // chunking apparently makes things quicker (but my tests indicate\n // it might actually make things slower in node at least)\n // and it is a non-perfect parse - it can't recognise\n // unquoted urls, meaning it can't distinguish comments\n // meaning comments with quotes or {}() in them get 'counted'\n // and then lead to parse errors.\n // In addition if the chunking chunks in the wrong place we might\n // not be able to parse a parser statement in one go\n // this is officially deprecated but can be switched on via an option\n // in the case it causes too much performance issues.\n if (chunkInput) {\n chunks = chunker(str, failFunction);\n } else {\n chunks = [str];\n }\n\n current = chunks[0];\n\n skipWhitespace(0);\n };\n\n parserInput.end = () => {\n let message;\n const isFinished = parserInput.i >= input.length;\n\n if (parserInput.i < furthest) {\n message = furthestPossibleErrorMessage;\n parserInput.i = furthest;\n }\n return {\n isFinished,\n furthest: parserInput.i,\n furthestPossibleErrorMessage: message,\n furthestReachedEnd: parserInput.i >= input.length - 1,\n furthestChar: input[parserInput.i]\n };\n };\n\n return parserInput;\n};\n","// Split the input into chunks.\nexport default function (input, fail) {\n const len = input.length;\n let level = 0;\n let parenLevel = 0;\n let lastOpening;\n let lastOpeningParen;\n let lastMultiComment;\n let lastMultiCommentEndBrace;\n const chunks = [];\n let emitFrom = 0;\n let chunkerCurrentIndex;\n let currentChunkStartIndex;\n let cc;\n let cc2;\n let matched;\n\n function emitChunk(force) {\n const len = chunkerCurrentIndex - emitFrom;\n if (((len < 512) && !force) || !len) {\n return;\n }\n chunks.push(input.slice(emitFrom, chunkerCurrentIndex + 1));\n emitFrom = chunkerCurrentIndex + 1;\n }\n\n for (chunkerCurrentIndex = 0; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc = input.charCodeAt(chunkerCurrentIndex);\n if (((cc >= 97) && (cc <= 122)) || (cc < 34)) {\n // a-z or whitespace\n continue;\n }\n\n switch (cc) {\n case 40: // (\n parenLevel++;\n lastOpeningParen = chunkerCurrentIndex;\n continue;\n case 41: // )\n if (--parenLevel < 0) {\n return fail('missing opening `(`', chunkerCurrentIndex);\n }\n continue;\n case 59: // ;\n if (!parenLevel) { emitChunk(); }\n continue;\n case 123: // {\n level++;\n lastOpening = chunkerCurrentIndex;\n continue;\n case 125: // }\n if (--level < 0) {\n return fail('missing opening `{`', chunkerCurrentIndex);\n }\n if (!level && !parenLevel) { emitChunk(); }\n continue;\n case 92: // \\\n if (chunkerCurrentIndex < len - 1) { chunkerCurrentIndex++; continue; }\n return fail('unescaped `\\\\`', chunkerCurrentIndex);\n case 34:\n case 39:\n case 96: // \", ' and `\n matched = 0;\n currentChunkStartIndex = chunkerCurrentIndex;\n for (chunkerCurrentIndex = chunkerCurrentIndex + 1; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if (cc2 > 96) { continue; }\n if (cc2 == cc) { matched = 1; break; }\n if (cc2 == 92) { // \\\n if (chunkerCurrentIndex == len - 1) {\n return fail('unescaped `\\\\`', chunkerCurrentIndex);\n }\n chunkerCurrentIndex++;\n }\n }\n if (matched) { continue; }\n return fail(`unmatched \\`${String.fromCharCode(cc)}\\``, currentChunkStartIndex);\n case 47: // /, check for comment\n if (parenLevel || (chunkerCurrentIndex == len - 1)) { continue; }\n cc2 = input.charCodeAt(chunkerCurrentIndex + 1);\n if (cc2 == 47) {\n // //, find lnfeed\n for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if ((cc2 <= 13) && ((cc2 == 10) || (cc2 == 13))) { break; }\n }\n } else if (cc2 == 42) {\n // /*, find */\n lastMultiComment = currentChunkStartIndex = chunkerCurrentIndex;\n for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len - 1; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if (cc2 == 125) { lastMultiCommentEndBrace = chunkerCurrentIndex; }\n if (cc2 != 42) { continue; }\n if (input.charCodeAt(chunkerCurrentIndex + 1) == 47) { break; }\n }\n if (chunkerCurrentIndex == len - 1) {\n return fail('missing closing `*/`', currentChunkStartIndex);\n }\n chunkerCurrentIndex++;\n }\n continue;\n case 42: // *, check for unmatched */\n if ((chunkerCurrentIndex < len - 1) && (input.charCodeAt(chunkerCurrentIndex + 1) == 47)) {\n return fail('unmatched `/*`', chunkerCurrentIndex);\n }\n continue;\n }\n }\n\n if (level !== 0) {\n if ((lastMultiComment > lastOpening) && (lastMultiCommentEndBrace > lastMultiComment)) {\n return fail('missing closing `}` or `*/`', lastOpening);\n } else {\n return fail('missing closing `}`', lastOpening);\n }\n } else if (parenLevel !== 0) {\n return fail('missing closing `)`', lastOpeningParen);\n }\n\n emitChunk(true);\n return chunks;\n};\n","import LessError from '../less-error';\nimport tree from '../tree';\nimport visitors from '../visitors';\nimport getParserInput from './parser-input';\nimport * as utils from '../utils';\nimport functionRegistry from '../functions/function-registry';\n\n//\n// less.js - parser\n//\n// A relatively straight-forward predictive parser.\n// There is no tokenization/lexing stage, the input is parsed\n// in one sweep.\n//\n// To make the parser fast enough to run in the browser, several\n// optimization had to be made:\n//\n// - Matching and slicing on a huge input is often cause of slowdowns.\n// The solution is to chunkify the input into smaller strings.\n// The chunks are stored in the `chunks` var,\n// `j` holds the current chunk index, and `currentPos` holds\n// the index of the current chunk in relation to `input`.\n// This gives us an almost 4x speed-up.\n//\n// - In many cases, we don't need to match individual tokens;\n// for example, if a value doesn't hold any variables, operations\n// or dynamic references, the parser can effectively 'skip' it,\n// treating it as a literal.\n// An example would be '1px solid #000' - which evaluates to itself,\n// we don't need to know what the individual components are.\n// The drawback, of course is that you don't get the benefits of\n// syntax-checking on the CSS. This gives us a 50% speed-up in the parser,\n// and a smaller speed-up in the code-gen.\n//\n//\n// Token matching is done with the `$` function, which either takes\n// a terminal string or regexp, or a non-terminal function to call.\n// It also takes care of moving all the indices forwards.\n//\n\nconst Parser = function Parser(context, imports, fileInfo) {\n let parsers;\n const parserInput = getParserInput();\n\n function error(msg, type) {\n throw new LessError(\n {\n index: parserInput.i,\n filename: fileInfo.filename,\n type: type || 'Syntax',\n message: msg\n },\n imports\n );\n }\n\n function expect(arg, msg) {\n // some older browsers return typeof 'function' for RegExp\n const result = (arg instanceof Function) ? arg.call(parsers) : parserInput.$re(arg);\n if (result) {\n return result;\n }\n \n error(msg || (typeof arg === 'string'\n ? `expected '${arg}' got '${parserInput.currentChar()}'`\n : 'unexpected token'));\n }\n\n // Specialization of expect()\n function expectChar(arg, msg) {\n if (parserInput.$char(arg)) {\n return arg;\n }\n error(msg || `expected '${arg}' got '${parserInput.currentChar()}'`);\n }\n\n function getDebugInfo(index) {\n const filename = fileInfo.filename;\n\n return {\n lineNumber: utils.getLocation(index, parserInput.getInput()).line + 1,\n fileName: filename\n };\n }\n\n /**\n * Used after initial parsing to create nodes on the fly\n * \n * @param {String} str - string to parse \n * @param {Array} parseList - array of parsers to run input through e.g. [\"value\", \"important\"]\n * @param {Number} currentIndex - start number to begin indexing\n * @param {Object} fileInfo - fileInfo to attach to created nodes\n */\n function parseNode(str, parseList, currentIndex, fileInfo, callback) {\n let result;\n const returnNodes = [];\n const parser = parserInput;\n\n try {\n parser.start(str, false, function fail(msg, index) {\n callback({\n message: msg,\n index: index + currentIndex\n });\n });\n for (let x = 0, p, i; (p = parseList[x]); x++) {\n i = parser.i;\n result = parsers[p]();\n if (result) {\n try {\n result._index = i + currentIndex;\n result._fileInfo = fileInfo;\n } catch (e) {}\n returnNodes.push(result);\n }\n else {\n returnNodes.push(null);\n }\n }\n\n const endInfo = parser.end();\n if (endInfo.isFinished) {\n callback(null, returnNodes);\n }\n else {\n callback(true, null);\n }\n } catch (e) {\n throw new LessError({\n index: e.index + currentIndex,\n message: e.message\n }, imports, fileInfo.filename);\n }\n }\n\n //\n // The Parser\n //\n return {\n parserInput,\n imports,\n fileInfo,\n parseNode,\n //\n // Parse an input string into an abstract syntax tree,\n // @param str A string containing 'less' markup\n // @param callback call `callback` when done.\n // @param [additionalData] An optional map which can contains vars - a map (key, value) of variables to apply\n //\n parse: function (str, callback, additionalData) {\n let root;\n let error = null;\n let globalVars;\n let modifyVars;\n let ignored;\n let preText = '';\n\n globalVars = (additionalData && additionalData.globalVars) ? `${Parser.serializeVars(additionalData.globalVars)}\\n` : '';\n modifyVars = (additionalData && additionalData.modifyVars) ? `\\n${Parser.serializeVars(additionalData.modifyVars)}` : '';\n\n if (context.pluginManager) {\n const preProcessors = context.pluginManager.getPreProcessors();\n for (let i = 0; i < preProcessors.length; i++) {\n str = preProcessors[i].process(str, { context, imports, fileInfo });\n }\n }\n\n if (globalVars || (additionalData && additionalData.banner)) {\n preText = ((additionalData && additionalData.banner) ? additionalData.banner : '') + globalVars;\n ignored = imports.contentsIgnoredChars;\n ignored[fileInfo.filename] = ignored[fileInfo.filename] || 0;\n ignored[fileInfo.filename] += preText.length;\n }\n\n str = str.replace(/\\r\\n?/g, '\\n');\n // Remove potential UTF Byte Order Mark\n str = preText + str.replace(/^\\uFEFF/, '') + modifyVars;\n imports.contents[fileInfo.filename] = str;\n\n // Start with the primary rule.\n // The whole syntax tree is held under a Ruleset node,\n // with the `root` property set to true, so no `{}` are\n // output. The callback is called when the input is parsed.\n try {\n parserInput.start(str, context.chunkInput, function fail(msg, index) {\n throw new LessError({\n index,\n type: 'Parse',\n message: msg,\n filename: fileInfo.filename\n }, imports);\n });\n\n tree.Node.prototype.parse = this;\n root = new tree.Ruleset(null, this.parsers.primary());\n tree.Node.prototype.rootNode = root;\n root.root = true;\n root.firstRoot = true;\n root.functionRegistry = functionRegistry.inherit();\n \n } catch (e) {\n return callback(new LessError(e, imports, fileInfo.filename));\n }\n\n // If `i` is smaller than the `input.length - 1`,\n // it means the parser wasn't able to parse the whole\n // string, so we've got a parsing error.\n //\n // We try to extract a \\n delimited string,\n // showing the line where the parse error occurred.\n // We split it up into two parts (the part which parsed,\n // and the part which didn't), so we can color them differently.\n const endInfo = parserInput.end();\n if (!endInfo.isFinished) {\n\n let message = endInfo.furthestPossibleErrorMessage;\n\n if (!message) {\n message = 'Unrecognised input';\n if (endInfo.furthestChar === '}') {\n message += '. Possibly missing opening \\'{\\'';\n } else if (endInfo.furthestChar === ')') {\n message += '. Possibly missing opening \\'(\\'';\n } else if (endInfo.furthestReachedEnd) {\n message += '. Possibly missing something';\n }\n }\n\n error = new LessError({\n type: 'Parse',\n message,\n index: endInfo.furthest,\n filename: fileInfo.filename\n }, imports);\n }\n\n const finish = e => {\n e = error || e || imports.error;\n\n if (e) {\n if (!(e instanceof LessError)) {\n e = new LessError(e, imports, fileInfo.filename);\n }\n\n return callback(e);\n }\n else {\n return callback(null, root);\n }\n };\n\n if (context.processImports !== false) {\n new visitors.ImportVisitor(imports, finish)\n .run(root);\n } else {\n return finish();\n }\n },\n\n //\n // Here in, the parsing rules/functions\n //\n // The basic structure of the syntax tree generated is as follows:\n //\n // Ruleset -> Declaration -> Value -> Expression -> Entity\n //\n // Here's some Less code:\n //\n // .class {\n // color: #fff;\n // border: 1px solid #000;\n // width: @w + 4px;\n // > .child {...}\n // }\n //\n // And here's what the parse tree might look like:\n //\n // Ruleset (Selector '.class', [\n // Declaration (\"color\", Value ([Expression [Color #fff]]))\n // Declaration (\"border\", Value ([Expression [Dimension 1px][Keyword \"solid\"][Color #000]]))\n // Declaration (\"width\", Value ([Expression [Operation \" + \" [Variable \"@w\"][Dimension 4px]]]))\n // Ruleset (Selector [Element '>', '.child'], [...])\n // ])\n //\n // In general, most rules will try to parse a token with the `$re()` function, and if the return\n // value is truly, will return a new node, of the relevant type. Sometimes, we need to check\n // first, before parsing, that's when we use `peek()`.\n //\n parsers: parsers = {\n //\n // The `primary` rule is the *entry* and *exit* point of the parser.\n // The rules here can appear at any level of the parse tree.\n //\n // The recursive nature of the grammar is an interplay between the `block`\n // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule,\n // as represented by this simplified grammar:\n //\n // primary → (ruleset | declaration)+\n // ruleset → selector+ block\n // block → '{' primary '}'\n //\n // Only at one point is the primary rule not called from the\n // block rule: at the root level.\n //\n primary: function () {\n const mixin = this.mixin;\n let root = [];\n let node;\n\n while (true) {\n while (true) {\n node = this.comment();\n if (!node) { break; }\n root.push(node);\n }\n // always process comments before deciding if finished\n if (parserInput.finished) {\n break;\n }\n if (parserInput.peek('}')) {\n break;\n }\n\n node = this.extendRule();\n if (node) {\n root = root.concat(node);\n continue;\n }\n\n node = mixin.definition() || this.declaration() || mixin.call(false, false) || \n this.ruleset() || this.variableCall() || this.entities.call() || this.atrule();\n if (node) {\n root.push(node);\n } else {\n let foundSemiColon = false;\n while (parserInput.$char(';')) {\n foundSemiColon = true;\n }\n if (!foundSemiColon) {\n break;\n }\n }\n }\n\n return root;\n },\n\n // comments are collected by the main parsing mechanism and then assigned to nodes\n // where the current structure allows it\n comment: function () {\n if (parserInput.commentStore.length) {\n const comment = parserInput.commentStore.shift();\n return new(tree.Comment)(comment.text, comment.isLineComment, comment.index, fileInfo);\n }\n },\n\n //\n // Entities are tokens which can be found inside an Expression\n //\n entities: {\n mixinLookup: function() {\n return parsers.mixin.call(true, true);\n },\n //\n // A string, which supports escaping \" and '\n //\n // \"milky way\" 'he\\'s the one!'\n //\n quoted: function (forceEscaped) {\n let str;\n const index = parserInput.i;\n let isEscaped = false;\n\n parserInput.save();\n if (parserInput.$char('~')) {\n isEscaped = true;\n } else if (forceEscaped) {\n parserInput.restore();\n return;\n }\n\n str = parserInput.$quoted();\n if (!str) {\n parserInput.restore();\n return;\n }\n parserInput.forget();\n\n return new(tree.Quoted)(str.charAt(0), str.substr(1, str.length - 2), isEscaped, index, fileInfo);\n },\n\n //\n // A catch-all word, such as:\n //\n // black border-collapse\n //\n keyword: function () {\n const k = parserInput.$char('%') || parserInput.$re(/^\\[?(?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+\\]?/);\n if (k) {\n return tree.Color.fromKeyword(k) || new(tree.Keyword)(k);\n }\n },\n\n //\n // A function call\n //\n // rgb(255, 0, 255)\n //\n // The arguments are parsed with the `entities.arguments` parser.\n //\n call: function () {\n let name;\n let args;\n let func;\n const index = parserInput.i;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (parserInput.peek(/^url\\(/i)) {\n return;\n }\n\n parserInput.save();\n\n name = parserInput.$re(/^([\\w-]+|%|~|progid:[\\w\\.]+)\\(/);\n if (!name) {\n parserInput.forget(); \n return;\n }\n\n name = name[1];\n func = this.customFuncCall(name);\n if (func) {\n args = func.parse();\n if (args && func.stop) {\n parserInput.forget();\n return args;\n }\n }\n\n args = this.arguments(args);\n\n if (!parserInput.$char(')')) {\n parserInput.restore('Could not parse call arguments or missing \\')\\'');\n return;\n }\n\n parserInput.forget();\n\n return new(tree.Call)(name, args, index, fileInfo);\n },\n \n //\n // Parsing rules for functions with non-standard args, e.g.:\n //\n // boolean(not(2 > 1))\n //\n // This is a quick prototype, to be modified/improved when\n // more custom-parsed funcs come (e.g. `selector(...)`)\n //\n\n customFuncCall: function (name) {\n /* Ideally the table is to be moved out of here for faster perf.,\n but it's quite tricky since it relies on all these `parsers`\n and `expect` available only here */\n return {\n alpha: f(parsers.ieAlpha, true),\n boolean: f(condition),\n 'if': f(condition)\n }[name.toLowerCase()];\n\n function f(parse, stop) {\n return {\n parse, // parsing function\n stop // when true - stop after parse() and return its result, \n // otherwise continue for plain args\n };\n }\n \n function condition() {\n return [expect(parsers.condition, 'expected condition')];\n }\n },\n\n arguments: function (prevArgs) {\n let argsComma = prevArgs || [];\n const argsSemiColon = [];\n let isSemiColonSeparated;\n let value;\n\n parserInput.save();\n\n while (true) {\n if (prevArgs) {\n prevArgs = false;\n } else {\n value = parsers.detachedRuleset() || this.assignment() || parsers.expression();\n if (!value) {\n break;\n }\n\n if (value.value && value.value.length == 1) {\n value = value.value[0];\n }\n\n argsComma.push(value);\n }\n\n if (parserInput.$char(',')) {\n continue;\n }\n\n if (parserInput.$char(';') || isSemiColonSeparated) {\n isSemiColonSeparated = true;\n value = (argsComma.length < 1) ? argsComma[0]\n : new tree.Value(argsComma);\n argsSemiColon.push(value);\n argsComma = [];\n }\n }\n\n parserInput.forget();\n return isSemiColonSeparated ? argsSemiColon : argsComma;\n },\n literal: function () {\n return this.dimension() ||\n this.color() ||\n this.quoted() ||\n this.unicodeDescriptor();\n },\n\n // Assignments are argument entities for calls.\n // They are present in ie filter properties as shown below.\n //\n // filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* )\n //\n\n assignment: function () {\n let key;\n let value;\n parserInput.save();\n key = parserInput.$re(/^\\w+(?=\\s?=)/i);\n if (!key) {\n parserInput.restore();\n return;\n }\n if (!parserInput.$char('=')) {\n parserInput.restore();\n return;\n }\n value = parsers.entity();\n if (value) {\n parserInput.forget();\n return new(tree.Assignment)(key, value);\n } else {\n parserInput.restore();\n }\n },\n\n //\n // Parse url() tokens\n //\n // We use a specific rule for urls, because they don't really behave like\n // standard function calls. The difference is that the argument doesn't have\n // to be enclosed within a string, so it can't be parsed as an Expression.\n //\n url: function () {\n let value;\n const index = parserInput.i;\n\n parserInput.autoCommentAbsorb = false;\n\n if (!parserInput.$str('url(')) {\n parserInput.autoCommentAbsorb = true;\n return;\n }\n\n value = this.quoted() || this.variable() || this.property() ||\n parserInput.$re(/^(?:(?:\\\\[\\(\\)'\"])|[^\\(\\)'\"])+/) || '';\n\n parserInput.autoCommentAbsorb = true;\n\n expectChar(')');\n\n return new(tree.URL)((value.value != null || \n value instanceof tree.Variable || \n value instanceof tree.Property) ?\n value : new(tree.Anonymous)(value, index), index, fileInfo);\n },\n\n //\n // A Variable entity, such as `@fink`, in\n //\n // width: @fink + 2px\n //\n // We use a different parser for variable definitions,\n // see `parsers.variable`.\n //\n variable: function () {\n let ch;\n let name;\n const index = parserInput.i;\n\n parserInput.save();\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^@@?[\\w-]+/))) {\n ch = parserInput.currentChar();\n if (ch === '(' || ch === '[' && !parserInput.prevChar().match(/^\\s/)) {\n // this may be a VariableCall lookup\n const result = parsers.variableCall(name);\n if (result) {\n parserInput.forget();\n return result;\n }\n }\n parserInput.forget();\n return new(tree.Variable)(name, index, fileInfo);\n }\n parserInput.restore();\n },\n\n // A variable entity using the protective {} e.g. @{var}\n variableCurly: function () {\n let curly;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '@' && (curly = parserInput.$re(/^@\\{([\\w-]+)\\}/))) {\n return new(tree.Variable)(`@${curly[1]}`, index, fileInfo);\n }\n },\n //\n // A Property accessor, such as `$color`, in\n //\n // background-color: $color\n //\n property: function () {\n let name;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' && (name = parserInput.$re(/^\\$[\\w-]+/))) {\n return new(tree.Property)(name, index, fileInfo);\n }\n },\n\n // A property entity useing the protective {} e.g. ${prop}\n propertyCurly: function () {\n let curly;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' && (curly = parserInput.$re(/^\\$\\{([\\w-]+)\\}/))) {\n return new(tree.Property)(`$${curly[1]}`, index, fileInfo);\n }\n },\n //\n // A Hexadecimal color\n //\n // #4F3C2F\n //\n // `rgb` and `hsl` colors are parsed through the `entities.call` parser.\n //\n color: function () {\n let rgb;\n parserInput.save();\n\n if (parserInput.currentChar() === '#' && (rgb = parserInput.$re(/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})([\\w.#\\[])?/))) {\n if (!rgb[2]) {\n parserInput.forget();\n return new(tree.Color)(rgb[1], undefined, rgb[0]);\n } \n }\n parserInput.restore();\n },\n\n colorKeyword: function () {\n parserInput.save();\n const autoCommentAbsorb = parserInput.autoCommentAbsorb;\n parserInput.autoCommentAbsorb = false;\n const k = parserInput.$re(/^[_A-Za-z-][_A-Za-z0-9-]+/);\n parserInput.autoCommentAbsorb = autoCommentAbsorb;\n if (!k) {\n parserInput.forget();\n return;\n }\n parserInput.restore();\n const color = tree.Color.fromKeyword(k);\n if (color) {\n parserInput.$str(k);\n return color;\n }\n },\n\n //\n // A Dimension, that is, a number and a unit\n //\n // 0.5em 95%\n //\n dimension: function () {\n if (parserInput.peekNotNumeric()) {\n return;\n }\n\n const value = parserInput.$re(/^([+-]?\\d*\\.?\\d+)(%|[a-z_]+)?/i);\n if (value) {\n return new(tree.Dimension)(value[1], value[2]);\n }\n },\n\n //\n // A unicode descriptor, as is used in unicode-range\n //\n // U+0?? or U+00A1-00A9\n //\n unicodeDescriptor: function () {\n let ud;\n\n ud = parserInput.$re(/^U\\+[0-9a-fA-F?]+(\\-[0-9a-fA-F?]+)?/);\n if (ud) {\n return new(tree.UnicodeDescriptor)(ud[0]);\n }\n },\n\n //\n // JavaScript code to be evaluated\n //\n // `window.location.href`\n //\n javascript: function () {\n let js;\n const index = parserInput.i;\n\n parserInput.save();\n\n const escape = parserInput.$char('~');\n const jsQuote = parserInput.$char('`');\n\n if (!jsQuote) {\n parserInput.restore();\n return;\n }\n\n js = parserInput.$re(/^[^`]*`/);\n if (js) {\n parserInput.forget();\n return new(tree.JavaScript)(js.substr(0, js.length - 1), Boolean(escape), index, fileInfo);\n }\n parserInput.restore('invalid javascript definition');\n }\n },\n\n //\n // The variable part of a variable definition. Used in the `rule` parser\n //\n // @fink:\n //\n variable: function () {\n let name;\n\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^(@[\\w-]+)\\s*:/))) { return name[1]; }\n },\n\n //\n // Call a variable value to retrieve a detached ruleset\n // or a value from a detached ruleset's rules.\n //\n // @fink();\n // @fink;\n // color: @fink[@color];\n //\n variableCall: function (parsedName) {\n let lookups;\n const i = parserInput.i;\n const inValue = !!parsedName;\n let name = parsedName;\n\n parserInput.save();\n\n if (name || (parserInput.currentChar() === '@'\n && (name = parserInput.$re(/^(@[\\w-]+)(\\(\\s*\\))?/)))) {\n\n lookups = this.mixin.ruleLookups();\n\n if (!lookups && ((inValue && parserInput.$str('()') !== '()') || (name[2] !== '()'))) {\n parserInput.restore('Missing \\'[...]\\' lookup in variable call');\n return;\n }\n\n if (!inValue) {\n name = name[1];\n }\n\n const call = new tree.VariableCall(name, i, fileInfo);\n if (!inValue && parsers.end()) {\n parserInput.forget();\n return call;\n }\n else {\n parserInput.forget();\n return new tree.NamespaceValue(call, lookups, i, fileInfo);\n }\n }\n\n parserInput.restore();\n },\n\n //\n // extend syntax - used to extend selectors\n //\n extend: function(isRule) {\n let elements;\n let e;\n const index = parserInput.i;\n let option;\n let extendList;\n let extend;\n\n if (!parserInput.$str(isRule ? '&:extend(' : ':extend(')) {\n return;\n }\n\n do {\n option = null;\n elements = null;\n while (!(option = parserInput.$re(/^(all)(?=\\s*(\\)|,))/))) {\n e = this.element();\n if (!e) {\n break;\n }\n if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n }\n\n option = option && option[1];\n if (!elements) {\n error('Missing target selector for :extend().');\n }\n extend = new(tree.Extend)(new(tree.Selector)(elements), option, index, fileInfo);\n if (extendList) {\n extendList.push(extend);\n } else {\n extendList = [ extend ];\n }\n } while (parserInput.$char(','));\n\n expect(/^\\)/);\n\n if (isRule) {\n expect(/^;/);\n }\n\n return extendList;\n },\n\n //\n // extendRule - used in a rule to extend all the parent selectors\n //\n extendRule: function() {\n return this.extend(true);\n },\n\n //\n // Mixins\n //\n mixin: {\n //\n // A Mixin call, with an optional argument list\n //\n // #mixins > .square(#fff);\n // #mixins.square(#fff);\n // .rounded(4px, black);\n // .button;\n //\n // We can lookup / return a value using the lookup syntax:\n //\n // color: #mixin.square(#fff)[@color];\n //\n // The `while` loop is there because mixins can be\n // namespaced, but we only support the child and descendant\n // selector for now.\n //\n call: function (inValue, getLookup) {\n const s = parserInput.currentChar();\n let important = false;\n let lookups;\n const index = parserInput.i;\n let elements;\n let args;\n let hasParens;\n\n if (s !== '.' && s !== '#') { return; }\n\n parserInput.save(); // stop us absorbing part of an invalid selector\n\n elements = this.elements();\n\n if (elements) {\n if (parserInput.$char('(')) {\n args = this.args(true).args;\n expectChar(')');\n hasParens = true;\n }\n\n if (getLookup !== false) {\n lookups = this.ruleLookups();\n }\n if (getLookup === true && !lookups) {\n parserInput.restore();\n return;\n }\n\n if (!lookups && !hasParens) {\n // This isn't a valid mixin call\n parserInput.restore('Unrecognized input. Possibly missing \\'(\\' in mixin call.');\n return;\n }\n\n if (!inValue && parsers.important()) {\n important = true;\n }\n\n if (inValue || parsers.end()) {\n parserInput.forget();\n const mixin = new(tree.mixin.Call)(elements, args, index, fileInfo, !lookups && important);\n if (lookups) {\n return new tree.NamespaceValue(mixin, lookups);\n }\n else {\n return mixin;\n }\n }\n }\n\n parserInput.restore();\n },\n /**\n * Matching elements for mixins\n * (Start with . or # and can have > )\n */\n elements: function() {\n let elements;\n let e;\n let c;\n let elem;\n let elemIndex;\n const re = /^[#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/;\n while (true) {\n elemIndex = parserInput.i;\n e = parserInput.$re(re);\n \n if (!e) {\n break;\n }\n elem = new(tree.Element)(c, e, false, elemIndex, fileInfo);\n if (elements) {\n elements.push(elem);\n } else {\n elements = [ elem ];\n }\n c = parserInput.$char('>');\n }\n return elements;\n },\n args: function (isCall) {\n const entities = parsers.entities;\n const returner = { args:null, variadic: false };\n let expressions = [];\n const argsSemiColon = [];\n const argsComma = [];\n let isSemiColonSeparated;\n let expressionContainsNamed;\n let name;\n let nameLoop;\n let value;\n let arg;\n let expand;\n let hasSep = true;\n\n parserInput.save();\n\n while (true) {\n if (isCall) {\n arg = parsers.detachedRuleset() || parsers.expression();\n } else {\n parserInput.commentStore.length = 0;\n if (parserInput.$str('...')) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ variadic: true });\n break;\n }\n arg = entities.variable() || entities.property() || entities.literal() || entities.keyword() || this.call(true);\n }\n\n if (!arg || !hasSep) {\n break;\n }\n\n nameLoop = null;\n if (arg.throwAwayComments) {\n arg.throwAwayComments();\n }\n value = arg;\n let val = null;\n\n if (isCall) {\n // Variable\n if (arg.value && arg.value.length == 1) {\n val = arg.value[0];\n }\n } else {\n val = arg;\n }\n\n if (val && (val instanceof tree.Variable || val instanceof tree.Property)) {\n if (parserInput.$char(':')) {\n if (expressions.length > 0) {\n if (isSemiColonSeparated) {\n error('Cannot mix ; and , as delimiter types');\n }\n expressionContainsNamed = true;\n }\n\n value = parsers.detachedRuleset() || parsers.expression();\n\n if (!value) {\n if (isCall) {\n error('could not understand value for named argument');\n } else {\n parserInput.restore();\n returner.args = [];\n return returner;\n }\n }\n nameLoop = (name = val.name);\n } else if (parserInput.$str('...')) {\n if (!isCall) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ name: arg.name, variadic: true });\n break;\n } else {\n expand = true;\n }\n } else if (!isCall) {\n name = nameLoop = val.name;\n value = null;\n }\n }\n\n if (value) {\n expressions.push(value);\n }\n\n argsComma.push({ name:nameLoop, value, expand });\n\n if (parserInput.$char(',')) {\n hasSep = true;\n continue;\n }\n hasSep = parserInput.$char(';') === ';';\n\n if (hasSep || isSemiColonSeparated) {\n\n if (expressionContainsNamed) {\n error('Cannot mix ; and , as delimiter types');\n }\n\n isSemiColonSeparated = true;\n\n if (expressions.length > 1) {\n value = new(tree.Value)(expressions);\n }\n argsSemiColon.push({ name, value, expand });\n\n name = null;\n expressions = [];\n expressionContainsNamed = false;\n }\n }\n\n parserInput.forget();\n returner.args = isSemiColonSeparated ? argsSemiColon : argsComma;\n return returner;\n },\n //\n // A Mixin definition, with a list of parameters\n //\n // .rounded (@radius: 2px, @color) {\n // ...\n // }\n //\n // Until we have a finer grained state-machine, we have to\n // do a look-ahead, to make sure we don't have a mixin call.\n // See the `rule` function for more information.\n //\n // We start by matching `.rounded (`, and then proceed on to\n // the argument list, which has optional default values.\n // We store the parameters in `params`, with a `value` key,\n // if there is a value, such as in the case of `@radius`.\n //\n // Once we've got our params list, and a closing `)`, we parse\n // the `{...}` block.\n //\n definition: function () {\n let name;\n let params = [];\n let match;\n let ruleset;\n let cond;\n let variadic = false;\n if ((parserInput.currentChar() !== '.' && parserInput.currentChar() !== '#') ||\n parserInput.peek(/^[^{]*\\}/)) {\n return;\n }\n\n parserInput.save();\n\n match = parserInput.$re(/^([#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\\s*\\(/);\n if (match) {\n name = match[1];\n\n const argInfo = this.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n\n // .mixincall(\"@{a}\");\n // looks a bit like a mixin definition..\n // also\n // .mixincall(@a: {rule: set;});\n // so we have to be nice and restore\n if (!parserInput.$char(')')) {\n parserInput.restore('Missing closing \\')\\'');\n return;\n }\n\n parserInput.commentStore.length = 0;\n\n if (parserInput.$str('when')) { // Guard\n cond = expect(parsers.conditions, 'expected condition');\n }\n\n ruleset = parsers.block();\n\n if (ruleset) {\n parserInput.forget();\n return new(tree.mixin.Definition)(name, params, ruleset, cond, variadic);\n } else {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n }\n },\n \n ruleLookups: function() {\n let rule;\n let args;\n const lookups = [];\n\n if (parserInput.currentChar() !== '[') { \n return;\n }\n\n while (true) {\n parserInput.save();\n args = null;\n rule = this.lookupValue();\n if (!rule && rule !== '') {\n parserInput.restore();\n break;\n }\n lookups.push(rule);\n parserInput.forget();\n }\n if (lookups.length > 0) {\n return lookups;\n }\n },\n \n lookupValue: function() {\n parserInput.save();\n \n if (!parserInput.$char('[')) { \n parserInput.restore();\n return;\n }\n \n const name = parserInput.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);\n \n if (!parserInput.$char(']')) {\n parserInput.restore();\n return;\n } \n\n if (name || name === '') {\n parserInput.forget();\n return name;\n }\n \n parserInput.restore();\n }\n },\n //\n // Entities are the smallest recognized token,\n // and can be found inside a rule's value.\n //\n entity: function () {\n const entities = this.entities;\n\n return this.comment() || entities.literal() || entities.variable() || entities.url() ||\n entities.property() || entities.call() || entities.keyword() || this.mixin.call(true) ||\n entities.javascript();\n },\n\n //\n // A Declaration terminator. Note that we use `peek()` to check for '}',\n // because the `block` rule will be expecting it, but we still need to make sure\n // it's there, if ';' was omitted.\n //\n end: function () {\n return parserInput.$char(';') || parserInput.peek('}');\n },\n\n //\n // IE's alpha function\n //\n // alpha(opacity=88)\n //\n ieAlpha: function () {\n let value;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (!parserInput.$re(/^opacity=/i)) { return; }\n value = parserInput.$re(/^\\d+/);\n if (!value) {\n value = expect(parsers.entities.variable, 'Could not parse alpha');\n value = `@{${value.name.slice(1)}}`;\n }\n expectChar(')');\n return new tree.Quoted('', `alpha(opacity=${value})`);\n },\n\n //\n // A Selector Element\n //\n // div\n // + h1\n // #socks\n // input[type=\"text\"]\n //\n // Elements are the building blocks for Selectors,\n // they are made out of a `Combinator` (see combinator rule),\n // and an element name, such as a tag a class, or `*`.\n //\n element: function () {\n let e;\n let c;\n let v;\n const index = parserInput.i;\n\n c = this.combinator();\n\n e = parserInput.$re(/^(?:\\d+\\.\\d+|\\d+)%/) ||\n parserInput.$re(/^(?:[.#]?|:*)(?:[\\w-]|[^\\x00-\\x9f]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/) ||\n parserInput.$char('*') || parserInput.$char('&') || this.attribute() ||\n parserInput.$re(/^\\([^&()@]+\\)/) || parserInput.$re(/^[\\.#:](?=@)/) ||\n this.entities.variableCurly();\n\n if (!e) {\n parserInput.save();\n if (parserInput.$char('(')) {\n if ((v = this.selector(false)) && parserInput.$char(')')) {\n e = new(tree.Paren)(v);\n parserInput.forget();\n } else {\n parserInput.restore('Missing closing \\')\\'');\n }\n } else {\n parserInput.forget();\n }\n }\n\n if (e) { return new(tree.Element)(c, e, e instanceof tree.Variable, index, fileInfo); }\n },\n\n //\n // Combinators combine elements together, in a Selector.\n //\n // Because our parser isn't white-space sensitive, special care\n // has to be taken, when parsing the descendant combinator, ` `,\n // as it's an empty space. We have to check the previous character\n // in the input, to see if it's a ` ` character. More info on how\n // we deal with this in *combinator.js*.\n //\n combinator: function () {\n let c = parserInput.currentChar();\n\n if (c === '/') {\n parserInput.save();\n const slashedCombinator = parserInput.$re(/^\\/[a-z]+\\//i);\n if (slashedCombinator) {\n parserInput.forget();\n return new(tree.Combinator)(slashedCombinator);\n }\n parserInput.restore();\n }\n\n if (c === '>' || c === '+' || c === '~' || c === '|' || c === '^') {\n parserInput.i++;\n if (c === '^' && parserInput.currentChar() === '^') {\n c = '^^';\n parserInput.i++;\n }\n while (parserInput.isWhitespace()) { parserInput.i++; }\n return new(tree.Combinator)(c);\n } else if (parserInput.isWhitespace(-1)) {\n return new(tree.Combinator)(' ');\n } else {\n return new(tree.Combinator)(null);\n }\n },\n //\n // A CSS Selector\n // with less extensions e.g. the ability to extend and guard\n //\n // .class > div + h1\n // li a:hover\n //\n // Selectors are made out of one or more Elements, see above.\n //\n selector: function (isLess) {\n const index = parserInput.i;\n let elements;\n let extendList;\n let c;\n let e;\n let allExtends;\n let when;\n let condition;\n isLess = isLess !== false;\n while ((isLess && (extendList = this.extend())) || (isLess && (when = parserInput.$str('when'))) || (e = this.element())) {\n if (when) {\n condition = expect(this.conditions, 'expected condition');\n } else if (condition) {\n error('CSS guard can only be used at the end of selector');\n } else if (extendList) {\n if (allExtends) {\n allExtends = allExtends.concat(extendList);\n } else {\n allExtends = extendList;\n }\n } else {\n if (allExtends) { error('Extend can only be used at the end of selector'); }\n c = parserInput.currentChar();\n if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n e = null;\n }\n if (c === '{' || c === '}' || c === ';' || c === ',' || c === ')') {\n break;\n }\n }\n\n if (elements) { return new(tree.Selector)(elements, allExtends, condition, index, fileInfo); }\n if (allExtends) { error('Extend must be used to extend a selector, it cannot be used on its own'); }\n },\n selectors: function () {\n let s;\n let selectors;\n while (true) {\n s = this.selector();\n if (!s) {\n break;\n }\n if (selectors) {\n selectors.push(s);\n } else {\n selectors = [ s ];\n }\n parserInput.commentStore.length = 0;\n if (s.condition && selectors.length > 1) {\n error(\"Guards are only currently allowed on a single selector.\");\n }\n if (!parserInput.$char(',')) { break; }\n if (s.condition) {\n error(\"Guards are only currently allowed on a single selector.\");\n }\n parserInput.commentStore.length = 0;\n }\n return selectors;\n },\n attribute: function () {\n if (!parserInput.$char('[')) { return; }\n\n const entities = this.entities;\n let key;\n let val;\n let op;\n\n if (!(key = entities.variableCurly())) {\n key = expect(/^(?:[_A-Za-z0-9-\\*]*\\|)?(?:[_A-Za-z0-9-]|\\\\.)+/);\n }\n\n op = parserInput.$re(/^[|~*$^]?=/);\n if (op) {\n val = entities.quoted() || parserInput.$re(/^[0-9]+%/) || parserInput.$re(/^[\\w-]+/) || entities.variableCurly();\n }\n\n expectChar(']');\n\n return new(tree.Attribute)(key, op, val);\n },\n\n //\n // The `block` rule is used by `ruleset` and `mixin.definition`.\n // It's a wrapper around the `primary` rule, with added `{}`.\n //\n block: function () {\n let content;\n if (parserInput.$char('{') && (content = this.primary()) && parserInput.$char('}')) {\n return content;\n }\n },\n\n blockRuleset: function() {\n let block = this.block();\n\n if (block) {\n block = new tree.Ruleset(null, block);\n }\n return block;\n },\n\n detachedRuleset: function() {\n let argInfo;\n let params;\n let variadic;\n\n parserInput.save();\n if (parserInput.$re(/^[.#]\\(/)) {\n /**\n * DR args currently only implemented for each() function, and not \n * yet settable as `@dr: #(@arg) {}`\n * This should be done when DRs are merged with mixins.\n * See: https://github.com/less/less-meta/issues/16\n */\n argInfo = this.mixin.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n if (!parserInput.$char(')')) {\n parserInput.restore();\n return;\n }\n }\n const blockRuleset = this.blockRuleset();\n if (blockRuleset) {\n parserInput.forget();\n if (params) {\n return new tree.mixin.Definition(null, params, blockRuleset, null, variadic);\n }\n return new tree.DetachedRuleset(blockRuleset);\n }\n parserInput.restore();\n },\n\n //\n // div, .class, body > p {...}\n //\n ruleset: function () {\n let selectors;\n let rules;\n let debugInfo;\n\n parserInput.save();\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(parserInput.i);\n }\n\n selectors = this.selectors();\n\n if (selectors && (rules = this.block())) {\n parserInput.forget();\n const ruleset = new(tree.Ruleset)(selectors, rules, context.strictImports);\n if (context.dumpLineNumbers) {\n ruleset.debugInfo = debugInfo;\n }\n return ruleset;\n } else {\n parserInput.restore();\n }\n },\n declaration: function () {\n let name;\n let value;\n const index = parserInput.i;\n let hasDR;\n const c = parserInput.currentChar();\n let important;\n let merge;\n let isVariable;\n\n if (c === '.' || c === '#' || c === '&' || c === ':') { return; }\n\n parserInput.save();\n\n name = this.variable() || this.ruleProperty();\n if (name) {\n isVariable = typeof name === 'string';\n\n if (isVariable) {\n value = this.detachedRuleset();\n if (value) {\n hasDR = true;\n }\n }\n\n parserInput.commentStore.length = 0;\n if (!value) {\n // a name returned by this.ruleProperty() is always an array of the form:\n // [string-1, ..., string-n, \"\"] or [string-1, ..., string-n, \"+\"]\n // where each item is a tree.Keyword or tree.Variable\n merge = !isVariable && name.length > 1 && name.pop().value;\n\n // Custom property values get permissive parsing\n if (name[0].value && name[0].value.slice(0, 2) === '--') {\n value = this.permissiveValue();\n }\n // Try to store values as anonymous\n // If we need the value later we'll re-parse it in ruleset.parseValue\n else {\n value = this.anonymousValue();\n }\n if (value) {\n parserInput.forget();\n // anonymous values absorb the end ';' which is required for them to work\n return new(tree.Declaration)(name, value, false, merge, index, fileInfo);\n }\n\n if (!value) {\n value = this.value();\n }\n\n if (value) {\n important = this.important();\n } else if (isVariable) {\n // As a last resort, try permissiveValue\n value = this.permissiveValue();\n }\n }\n\n if (value && (this.end() || hasDR)) {\n parserInput.forget();\n return new(tree.Declaration)(name, value, important, merge, index, fileInfo);\n }\n else {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n }\n },\n anonymousValue: function () {\n const index = parserInput.i;\n const match = parserInput.$re(/^([^.#@\\$+\\/'\"*`(;{}-]*);/);\n if (match) {\n return new(tree.Anonymous)(match[1], index);\n }\n },\n /**\n * Used for custom properties, at-rules, and variables (as fallback)\n * Parses almost anything inside of {} [] () \"\" blocks\n * until it reaches outer-most tokens.\n * \n * First, it will try to parse comments and entities to reach\n * the end. This is mostly like the Expression parser except no\n * math is allowed.\n */\n permissiveValue: function (untilTokens) {\n let i;\n let e;\n let done;\n let value;\n const tok = untilTokens || ';';\n const index = parserInput.i;\n const result = [];\n\n function testCurrentChar() {\n const char = parserInput.currentChar();\n if (typeof tok === 'string') {\n return char === tok;\n } else {\n return tok.test(char);\n }\n }\n if (testCurrentChar()) {\n return;\n }\n value = [];\n do {\n e = this.comment();\n if (e) {\n value.push(e);\n continue;\n }\n e = this.entity();\n if (e) {\n value.push(e);\n }\n } while (e);\n\n done = testCurrentChar();\n\n if (value.length > 0) {\n value = new(tree.Expression)(value);\n if (done) {\n return value;\n }\n else {\n result.push(value);\n }\n // Preserve space before $parseUntil as it will not\n if (parserInput.prevChar() === ' ') {\n result.push(new tree.Anonymous(' ', index));\n }\n }\n parserInput.save();\n\n value = parserInput.$parseUntil(tok);\n\n if (value) {\n if (typeof value === 'string') {\n error(`Expected '${value}'`, 'Parse');\n }\n if (value.length === 1 && value[0] === ' ') {\n parserInput.forget();\n return new tree.Anonymous('', index);\n }\n let item;\n for (i = 0; i < value.length; i++) {\n item = value[i];\n if (Array.isArray(item)) {\n // Treat actual quotes as normal quoted values\n result.push(new tree.Quoted(item[0], item[1], true, index, fileInfo));\n }\n else {\n if (i === value.length - 1) {\n item = item.trim();\n }\n // Treat like quoted values, but replace vars like unquoted expressions\n const quote = new tree.Quoted('\\'', item, true, index, fileInfo);\n quote.variableRegex = /@([\\w-]+)/g;\n quote.propRegex = /\\$([\\w-]+)/g;\n result.push(quote);\n }\n }\n parserInput.forget();\n return new tree.Expression(result, true);\n }\n parserInput.restore();\n },\n\n //\n // An @import atrule\n //\n // @import \"lib\";\n //\n // Depending on our environment, importing is done differently:\n // In the browser, it's an XHR request, in Node, it would be a\n // file-system operation. The function used for importing is\n // stored in `import`, which we pass to the Import constructor.\n //\n 'import': function () {\n let path;\n let features;\n const index = parserInput.i;\n\n const dir = parserInput.$re(/^@import?\\s+/);\n\n if (dir) {\n const options = (dir ? this.importOptions() : null) || {};\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n features = this.mediaFeatures();\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon or unrecognised media features on import');\n }\n features = features && new(tree.Value)(features);\n return new(tree.Import)(path, features, options, index, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed import statement');\n }\n }\n },\n\n importOptions: function() {\n let o;\n const options = {};\n let optionName;\n let value;\n\n // list of options, surrounded by parens\n if (!parserInput.$char('(')) { return null; }\n do {\n o = this.importOption();\n if (o) {\n optionName = o;\n value = true;\n switch (optionName) {\n case 'css':\n optionName = 'less';\n value = false;\n break;\n case 'once':\n optionName = 'multiple';\n value = false;\n break;\n }\n options[optionName] = value;\n if (!parserInput.$char(',')) { break; }\n }\n } while (o);\n expectChar(')');\n return options;\n },\n\n importOption: function() {\n const opt = parserInput.$re(/^(less|css|multiple|once|inline|reference|optional)/);\n if (opt) {\n return opt[1];\n }\n },\n\n mediaFeature: function () {\n const entities = this.entities;\n const nodes = [];\n let e;\n let p;\n parserInput.save();\n do {\n e = entities.keyword() || entities.variable() || entities.mixinLookup();\n if (e) {\n nodes.push(e);\n } else if (parserInput.$char('(')) {\n p = this.property();\n e = this.value();\n if (parserInput.$char(')')) {\n if (p && e) {\n nodes.push(new(tree.Paren)(new(tree.Declaration)(p, e, null, null, parserInput.i, fileInfo, true)));\n } else if (e) {\n nodes.push(new(tree.Paren)(e));\n } else {\n error('badly formed media feature definition');\n }\n } else {\n error('Missing closing \\')\\'', 'Parse');\n }\n }\n } while (e);\n\n parserInput.forget();\n if (nodes.length > 0) {\n return new(tree.Expression)(nodes);\n }\n },\n\n mediaFeatures: function () {\n const entities = this.entities;\n const features = [];\n let e;\n do {\n e = this.mediaFeature();\n if (e) {\n features.push(e);\n if (!parserInput.$char(',')) { break; }\n } else {\n e = entities.variable() || entities.mixinLookup();\n if (e) {\n features.push(e);\n if (!parserInput.$char(',')) { break; }\n }\n }\n } while (e);\n\n return features.length > 0 ? features : null;\n },\n\n media: function () {\n let features;\n let rules;\n let media;\n let debugInfo;\n const index = parserInput.i;\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(index);\n }\n\n parserInput.save();\n\n if (parserInput.$str('@media')) {\n features = this.mediaFeatures();\n\n rules = this.block();\n\n if (!rules) {\n error('media definitions require block statements after any features');\n }\n\n parserInput.forget();\n\n media = new(tree.Media)(rules, features, index, fileInfo);\n if (context.dumpLineNumbers) {\n media.debugInfo = debugInfo;\n }\n\n return media;\n }\n\n parserInput.restore();\n },\n\n //\n\n // A @plugin directive, used to import plugins dynamically.\n //\n // @plugin (args) \"lib\";\n //\n plugin: function () {\n let path;\n let args;\n let options;\n const index = parserInput.i;\n const dir = parserInput.$re(/^@plugin?\\s+/);\n\n if (dir) {\n args = this.pluginArgs();\n\n if (args) {\n options = {\n pluginArgs: args,\n isPlugin: true\n };\n }\n else {\n options = { isPlugin: true };\n }\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon on @plugin');\n }\n return new(tree.Import)(path, null, options, index, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed @plugin statement');\n }\n }\n },\n\n pluginArgs: function() {\n // list of options, surrounded by parens\n parserInput.save();\n if (!parserInput.$char('(')) {\n parserInput.restore();\n return null;\n }\n const args = parserInput.$re(/^\\s*([^\\);]+)\\)\\s*/);\n if (args[1]) {\n parserInput.forget();\n return args[1].trim();\n }\n else { \n parserInput.restore();\n return null;\n }\n },\n\n //\n // A CSS AtRule\n //\n // @charset \"utf-8\";\n //\n atrule: function () {\n const index = parserInput.i;\n let name;\n let value;\n let rules;\n let nonVendorSpecificName;\n let hasIdentifier;\n let hasExpression;\n let hasUnknown;\n let hasBlock = true;\n let isRooted = true;\n\n if (parserInput.currentChar() !== '@') { return; }\n\n value = this['import']() || this.plugin() || this.media();\n if (value) {\n return value;\n }\n\n parserInput.save();\n\n name = parserInput.$re(/^@[a-z-]+/);\n\n if (!name) { return; }\n\n nonVendorSpecificName = name;\n if (name.charAt(1) == '-' && name.indexOf('-', 2) > 0) {\n nonVendorSpecificName = `@${name.slice(name.indexOf('-', 2) + 1)}`;\n }\n\n switch (nonVendorSpecificName) {\n case '@charset':\n hasIdentifier = true;\n hasBlock = false;\n break;\n case '@namespace':\n hasExpression = true;\n hasBlock = false;\n break;\n case '@keyframes':\n case '@counter-style':\n hasIdentifier = true;\n break;\n case '@document':\n case '@supports':\n hasUnknown = true;\n isRooted = false;\n break;\n default:\n hasUnknown = true;\n break;\n }\n\n parserInput.commentStore.length = 0;\n\n if (hasIdentifier) {\n value = this.entity();\n if (!value) {\n error(`expected ${name} identifier`);\n }\n } else if (hasExpression) {\n value = this.expression();\n if (!value) {\n error(`expected ${name} expression`);\n }\n } else if (hasUnknown) {\n value = this.permissiveValue(/^[{;]/);\n hasBlock = (parserInput.currentChar() === '{');\n if (!value) {\n if (!hasBlock && parserInput.currentChar() !== ';') {\n error(`${name} rule is missing block or ending semi-colon`);\n }\n }\n else if (!value.value) {\n value = null;\n }\n }\n\n if (hasBlock) {\n rules = this.blockRuleset();\n }\n\n if (rules || (!hasBlock && value && parserInput.$char(';'))) {\n parserInput.forget();\n return new(tree.AtRule)(name, value, rules, index, fileInfo,\n context.dumpLineNumbers ? getDebugInfo(index) : null,\n isRooted\n );\n }\n\n parserInput.restore('at-rule options not recognised');\n },\n\n //\n // A Value is a comma-delimited list of Expressions\n //\n // font-family: Baskerville, Georgia, serif;\n //\n // In a Rule, a Value represents everything after the `:`,\n // and before the `;`.\n //\n value: function () {\n let e;\n const expressions = [];\n const index = parserInput.i;\n\n do {\n e = this.expression();\n if (e) {\n expressions.push(e);\n if (!parserInput.$char(',')) { break; }\n }\n } while (e);\n\n if (expressions.length > 0) {\n return new(tree.Value)(expressions, index);\n }\n },\n important: function () {\n if (parserInput.currentChar() === '!') {\n return parserInput.$re(/^! *important/);\n }\n },\n sub: function () {\n let a;\n let e;\n\n parserInput.save();\n if (parserInput.$char('(')) {\n a = this.addition();\n if (a && parserInput.$char(')')) {\n parserInput.forget();\n e = new(tree.Expression)([a]);\n e.parens = true;\n return e;\n }\n parserInput.restore('Expected \\')\\'');\n return;\n }\n parserInput.restore();\n },\n multiplication: function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.operand();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1);\n while (true) {\n if (parserInput.peek(/^\\/[*\\/]/)) {\n break;\n }\n\n parserInput.save();\n\n op = parserInput.$char('/') || parserInput.$char('*') || parserInput.$str('./');\n\n if (!op) { parserInput.forget(); break; }\n\n a = this.operand();\n\n if (!a) { parserInput.restore(); break; }\n parserInput.forget();\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n isSpaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n addition: function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.multiplication();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1);\n while (true) {\n op = parserInput.$re(/^[-+]\\s+/) || (!isSpaced && (parserInput.$char('+') || parserInput.$char('-')));\n if (!op) {\n break;\n }\n a = this.multiplication();\n if (!a) {\n break;\n }\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n isSpaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n conditions: function () {\n let a;\n let b;\n const index = parserInput.i;\n let condition;\n\n a = this.condition(true);\n if (a) {\n while (true) {\n if (!parserInput.peek(/^,\\s*(not\\s*)?\\(/) || !parserInput.$char(',')) {\n break;\n }\n b = this.condition(true);\n if (!b) {\n break;\n }\n condition = new(tree.Condition)('or', condition || a, b, index);\n }\n return condition || a;\n }\n },\n condition: function (needsParens) {\n let result;\n let logical;\n let next;\n function or() {\n return parserInput.$str('or');\n }\n\n result = this.conditionAnd(needsParens);\n if (!result) {\n return ;\n }\n logical = or();\n if (logical) {\n next = this.condition(needsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n }\n }\n return result;\n },\n conditionAnd: function (needsParens) {\n let result;\n let logical;\n let next;\n const self = this;\n function insideCondition() {\n const cond = self.negatedCondition(needsParens) || self.parenthesisCondition(needsParens);\n if (!cond && !needsParens) {\n return self.atomicCondition(needsParens);\n }\n return cond;\n }\n function and() {\n return parserInput.$str('and');\n }\n\n result = insideCondition();\n if (!result) {\n return ;\n }\n logical = and();\n if (logical) {\n next = this.conditionAnd(needsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n }\n }\n return result;\n },\n negatedCondition: function (needsParens) {\n if (parserInput.$str('not')) {\n const result = this.parenthesisCondition(needsParens);\n if (result) {\n result.negate = !result.negate;\n }\n return result;\n }\n },\n parenthesisCondition: function (needsParens) {\n function tryConditionFollowedByParenthesis(me) {\n let body;\n parserInput.save();\n body = me.condition(needsParens);\n if (!body) {\n parserInput.restore();\n return ;\n }\n if (!parserInput.$char(')')) {\n parserInput.restore();\n return ;\n }\n parserInput.forget();\n return body;\n }\n\n let body;\n parserInput.save();\n if (!parserInput.$str('(')) {\n parserInput.restore();\n return ;\n }\n body = tryConditionFollowedByParenthesis(this);\n if (body) {\n parserInput.forget();\n return body;\n }\n\n body = this.atomicCondition(needsParens);\n if (!body) {\n parserInput.restore();\n return ;\n }\n if (!parserInput.$char(')')) {\n parserInput.restore(`expected ')' got '${parserInput.currentChar()}'`);\n return ;\n }\n parserInput.forget();\n return body;\n },\n atomicCondition: function (needsParens) {\n const entities = this.entities;\n const index = parserInput.i;\n let a;\n let b;\n let c;\n let op;\n\n function cond() {\n return this.addition() || entities.keyword() || entities.quoted() || entities.mixinLookup();\n }\n cond = cond.bind(this);\n\n a = cond();\n if (a) {\n if (parserInput.$char('>')) {\n if (parserInput.$char('=')) {\n op = '>=';\n } else {\n op = '>';\n }\n } else\n if (parserInput.$char('<')) {\n if (parserInput.$char('=')) {\n op = '<=';\n } else {\n op = '<';\n }\n } else\n if (parserInput.$char('=')) {\n if (parserInput.$char('>')) {\n op = '=>';\n } else if (parserInput.$char('<')) {\n op = '=<';\n } else {\n op = '=';\n }\n }\n if (op) {\n b = cond();\n if (b) {\n c = new(tree.Condition)(op, a, b, index, false);\n } else {\n error('expected expression');\n }\n } else {\n c = new(tree.Condition)('=', a, new(tree.Keyword)('true'), index, false);\n }\n return c;\n }\n },\n\n //\n // An operand is anything that can be part of an operation,\n // such as a Color, or a Variable\n //\n operand: function () {\n const entities = this.entities;\n let negate;\n\n if (parserInput.peek(/^-[@\\$\\(]/)) {\n negate = parserInput.$char('-');\n }\n\n let o = this.sub() || entities.dimension() ||\n entities.color() || entities.variable() ||\n entities.property() || entities.call() ||\n entities.quoted(true) || entities.colorKeyword() ||\n entities.mixinLookup();\n\n if (negate) {\n o.parensInOp = true;\n o = new(tree.Negative)(o);\n }\n\n return o;\n },\n\n //\n // Expressions either represent mathematical operations,\n // or white-space delimited Entities.\n //\n // 1px solid black\n // @var * 2\n //\n expression: function () {\n const entities = [];\n let e;\n let delim;\n const index = parserInput.i;\n\n do {\n e = this.comment();\n if (e) {\n entities.push(e);\n continue;\n }\n e = this.addition() || this.entity();\n\n if (e instanceof tree.Comment) {\n e = null;\n }\n\n if (e) {\n entities.push(e);\n // operations do not allow keyword \"/\" dimension (e.g. small/20px) so we support that here\n if (!parserInput.peek(/^\\/[\\/*]/)) {\n delim = parserInput.$char('/');\n if (delim) {\n entities.push(new(tree.Anonymous)(delim, index));\n }\n }\n }\n } while (e);\n if (entities.length > 0) {\n return new(tree.Expression)(entities);\n }\n },\n property: function () {\n const name = parserInput.$re(/^(\\*?-?[_a-zA-Z0-9-]+)\\s*:/);\n if (name) {\n return name[1];\n }\n },\n ruleProperty: function () {\n let name = [];\n const index = [];\n let s;\n let k;\n\n parserInput.save();\n\n const simpleProperty = parserInput.$re(/^([_a-zA-Z0-9-]+)\\s*:/);\n if (simpleProperty) {\n name = [new(tree.Keyword)(simpleProperty[1])];\n parserInput.forget();\n return name;\n }\n\n function match(re) {\n const i = parserInput.i;\n const chunk = parserInput.$re(re);\n if (chunk) {\n index.push(i);\n return name.push(chunk[1]);\n }\n }\n\n match(/^(\\*?)/);\n while (true) {\n if (!match(/^((?:[\\w-]+)|(?:[@\\$]\\{[\\w-]+\\}))/)) {\n break;\n }\n }\n\n if ((name.length > 1) && match(/^((?:\\+_|\\+)?)\\s*:/)) {\n parserInput.forget();\n\n // at last, we have the complete match now. move forward,\n // convert name particles to tree objects and return:\n if (name[0] === '') {\n name.shift();\n index.shift();\n }\n for (k = 0; k < name.length; k++) {\n s = name[k];\n name[k] = (s.charAt(0) !== '@' && s.charAt(0) !== '$') ?\n new(tree.Keyword)(s) :\n (s.charAt(0) === '@' ?\n new(tree.Variable)(`@${s.slice(2, -1)}`, index[k], fileInfo) :\n new(tree.Property)(`$${s.slice(2, -1)}`, index[k], fileInfo));\n }\n return name;\n }\n parserInput.restore();\n }\n }\n };\n};\nParser.serializeVars = vars => {\n let s = '';\n\n for (const name in vars) {\n if (Object.hasOwnProperty.call(vars, name)) {\n const value = vars[name];\n s += `${((name[0] === '@') ? '' : '@') + name}: ${value}${(String(value).slice(-1) === ';') ? '' : ';'}`;\n }\n }\n\n return s;\n};\n\nexport default Parser;\n","import Anonymous from '../tree/anonymous';\nimport Keyword from '../tree/keyword';\n\nfunction boolean(condition) {\n return condition ? Keyword.True : Keyword.False;\n}\n\n/**\n * Functions with evalArgs set to false are sent context\n * as the first argument.\n */\nfunction If(context, condition, trueValue, falseValue) {\n return condition.eval(context) ? trueValue.eval(context)\n : (falseValue ? falseValue.eval(context) : new Anonymous);\n}\nIf.evalArgs = false;\n\nfunction isdefined(context, variable) {\n try {\n variable.eval(context);\n return Keyword.True;\n } catch (e) {\n return Keyword.False;\n }\n}\n\nisdefined.evalArgs = false;\n\nexport default { isdefined, boolean, 'if': If };\n","import Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport Expression from '../tree/expression';\nimport Operation from '../tree/operation';\nlet colorFunctions;\n\nfunction clamp(val) {\n return Math.min(1, Math.max(0, val));\n}\nfunction hsla(origColor, hsl) {\n const color = colorFunctions.hsla(hsl.h, hsl.s, hsl.l, hsl.a);\n if (color) {\n if (origColor.value && \n /^(rgb|hsl)/.test(origColor.value)) {\n color.value = origColor.value;\n } else {\n color.value = 'rgb';\n }\n return color;\n }\n}\nfunction toHSL(color) {\n if (color.toHSL) {\n return color.toHSL();\n } else {\n throw new Error('Argument cannot be evaluated to a color');\n }\n}\n\nfunction toHSV(color) {\n if (color.toHSV) {\n return color.toHSV();\n } else {\n throw new Error('Argument cannot be evaluated to a color');\n }\n}\n\nfunction number(n) {\n if (n instanceof Dimension) {\n return parseFloat(n.unit.is('%') ? n.value / 100 : n.value);\n } else if (typeof n === 'number') {\n return n;\n } else {\n throw {\n type: 'Argument',\n message: 'color functions take numbers as parameters'\n };\n }\n}\nfunction scaled(n, size) {\n if (n instanceof Dimension && n.unit.is('%')) {\n return parseFloat(n.value * size / 100);\n } else {\n return number(n);\n }\n}\ncolorFunctions = {\n rgb: function (r, g, b) {\n let a = 1\n /**\n * Comma-less syntax\n * e.g. rgb(0 128 255 / 50%)\n */\n if (r instanceof Expression) {\n const val = r.value\n r = val[0]\n g = val[1]\n b = val[2]\n /** \n * @todo - should this be normalized in\n * function caller? Or parsed differently?\n */\n if (b instanceof Operation) {\n const op = b\n b = op.operands[0]\n a = op.operands[1]\n }\n }\n const color = colorFunctions.rgba(r, g, b, a);\n if (color) {\n color.value = 'rgb';\n return color;\n }\n },\n rgba: function (r, g, b, a) {\n try {\n if (r instanceof Color) {\n if (g) {\n a = number(g);\n } else {\n a = r.alpha;\n }\n return new Color(r.rgb, a, 'rgba');\n }\n const rgb = [r, g, b].map(c => scaled(c, 255));\n a = number(a);\n return new Color(rgb, a, 'rgba');\n }\n catch (e) {}\n },\n hsl: function (h, s, l) {\n let a = 1\n if (h instanceof Expression) {\n const val = h.value\n h = val[0]\n s = val[1]\n l = val[2]\n\n if (l instanceof Operation) {\n const op = l\n l = op.operands[0]\n a = op.operands[1]\n }\n }\n const color = colorFunctions.hsla(h, s, l, a);\n if (color) {\n color.value = 'hsl';\n return color;\n }\n },\n hsla: function (h, s, l, a) {\n try {\n if (h instanceof Color) {\n if (s) {\n a = number(s);\n } else {\n a = h.alpha;\n }\n return new Color(h.rgb, a, 'hsla');\n }\n\n let m1;\n let m2;\n\n function hue(h) {\n h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h);\n if (h * 6 < 1) {\n return m1 + (m2 - m1) * h * 6;\n }\n else if (h * 2 < 1) {\n return m2;\n }\n else if (h * 3 < 2) {\n return m1 + (m2 - m1) * (2 / 3 - h) * 6;\n }\n else {\n return m1;\n }\n }\n\n h = (number(h) % 360) / 360;\n s = clamp(number(s));l = clamp(number(l));a = clamp(number(a));\n\n m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n m1 = l * 2 - m2;\n\n const rgb = [\n hue(h + 1 / 3) * 255,\n hue(h) * 255,\n hue(h - 1 / 3) * 255\n ];\n a = number(a);\n return new Color(rgb, a, 'hsla');\n }\n catch (e) {}\n },\n\n hsv: function(h, s, v) {\n return colorFunctions.hsva(h, s, v, 1.0);\n },\n\n hsva: function(h, s, v, a) {\n h = ((number(h) % 360) / 360) * 360;\n s = number(s);v = number(v);a = number(a);\n\n let i;\n let f;\n i = Math.floor((h / 60) % 6);\n f = (h / 60) - i;\n\n const vs = [v,\n v * (1 - s),\n v * (1 - f * s),\n v * (1 - (1 - f) * s)];\n const perm = [[0, 3, 1],\n [2, 0, 1],\n [1, 0, 3],\n [1, 2, 0],\n [3, 1, 0],\n [0, 1, 2]];\n\n return colorFunctions.rgba(vs[perm[i][0]] * 255,\n vs[perm[i][1]] * 255,\n vs[perm[i][2]] * 255,\n a);\n },\n\n hue: function (color) {\n return new Dimension(toHSL(color).h);\n },\n saturation: function (color) {\n return new Dimension(toHSL(color).s * 100, '%');\n },\n lightness: function (color) {\n return new Dimension(toHSL(color).l * 100, '%');\n },\n hsvhue: function(color) {\n return new Dimension(toHSV(color).h);\n },\n hsvsaturation: function (color) {\n return new Dimension(toHSV(color).s * 100, '%');\n },\n hsvvalue: function (color) {\n return new Dimension(toHSV(color).v * 100, '%');\n },\n red: function (color) {\n return new Dimension(color.rgb[0]);\n },\n green: function (color) {\n return new Dimension(color.rgb[1]);\n },\n blue: function (color) {\n return new Dimension(color.rgb[2]);\n },\n alpha: function (color) {\n return new Dimension(toHSL(color).a);\n },\n luma: function (color) {\n return new Dimension(color.luma() * color.alpha * 100, '%');\n },\n luminance: function (color) {\n const luminance =\n (0.2126 * color.rgb[0] / 255) +\n (0.7152 * color.rgb[1] / 255) +\n (0.0722 * color.rgb[2] / 255);\n\n return new Dimension(luminance * color.alpha * 100, '%');\n },\n saturate: function (color, amount, method) {\n // filter: saturate(3.2);\n // should be kept as is, so check for color\n if (!color.rgb) {\n return null;\n }\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.s += hsl.s * amount.value / 100;\n }\n else {\n hsl.s += amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n return hsla(color, hsl);\n },\n desaturate: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.s -= hsl.s * amount.value / 100;\n }\n else {\n hsl.s -= amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n return hsla(color, hsl);\n },\n lighten: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.l += hsl.l * amount.value / 100;\n }\n else {\n hsl.l += amount.value / 100;\n }\n hsl.l = clamp(hsl.l);\n return hsla(color, hsl);\n },\n darken: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.l -= hsl.l * amount.value / 100;\n }\n else {\n hsl.l -= amount.value / 100;\n }\n hsl.l = clamp(hsl.l);\n return hsla(color, hsl);\n },\n fadein: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.a += hsl.a * amount.value / 100;\n }\n else {\n hsl.a += amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fadeout: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.a -= hsl.a * amount.value / 100;\n }\n else {\n hsl.a -= amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fade: function (color, amount) {\n const hsl = toHSL(color);\n\n hsl.a = amount.value / 100;\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n spin: function (color, amount) {\n const hsl = toHSL(color);\n const hue = (hsl.h + amount.value) % 360;\n\n hsl.h = hue < 0 ? 360 + hue : hue;\n\n return hsla(color, hsl);\n },\n //\n // Copyright (c) 2006-2009 Hampton Catlin, Natalie Weizenbaum, and Chris Eppstein\n // http://sass-lang.com\n //\n mix: function (color1, color2, weight) {\n if (!weight) {\n weight = new Dimension(50);\n }\n const p = weight.value / 100.0;\n const w = p * 2 - 1;\n const a = toHSL(color1).a - toHSL(color2).a;\n\n const w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n const w2 = 1 - w1;\n\n const rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2,\n color1.rgb[1] * w1 + color2.rgb[1] * w2,\n color1.rgb[2] * w1 + color2.rgb[2] * w2];\n\n const alpha = color1.alpha * p + color2.alpha * (1 - p);\n\n return new Color(rgb, alpha);\n },\n greyscale: function (color) {\n return colorFunctions.desaturate(color, new Dimension(100));\n },\n contrast: function (color, dark, light, threshold) {\n // filter: contrast(3.2);\n // should be kept as is, so check for color\n if (!color.rgb) {\n return null;\n }\n if (typeof light === 'undefined') {\n light = colorFunctions.rgba(255, 255, 255, 1.0);\n }\n if (typeof dark === 'undefined') {\n dark = colorFunctions.rgba(0, 0, 0, 1.0);\n }\n // Figure out which is actually light and dark:\n if (dark.luma() > light.luma()) {\n const t = light;\n light = dark;\n dark = t;\n }\n if (typeof threshold === 'undefined') {\n threshold = 0.43;\n } else {\n threshold = number(threshold);\n }\n if (color.luma() < threshold) {\n return light;\n } else {\n return dark;\n }\n },\n // Changes made in 2.7.0 - Reverted in 3.0.0\n // contrast: function (color, color1, color2, threshold) {\n // // Return which of `color1` and `color2` has the greatest contrast with `color`\n // // according to the standard WCAG contrast ratio calculation.\n // // http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n // // The threshold param is no longer used, in line with SASS.\n // // filter: contrast(3.2);\n // // should be kept as is, so check for color\n // if (!color.rgb) {\n // return null;\n // }\n // if (typeof color1 === 'undefined') {\n // color1 = colorFunctions.rgba(0, 0, 0, 1.0);\n // }\n // if (typeof color2 === 'undefined') {\n // color2 = colorFunctions.rgba(255, 255, 255, 1.0);\n // }\n // var contrast1, contrast2;\n // var luma = color.luma();\n // var luma1 = color1.luma();\n // var luma2 = color2.luma();\n // // Calculate contrast ratios for each color\n // if (luma > luma1) {\n // contrast1 = (luma + 0.05) / (luma1 + 0.05);\n // } else {\n // contrast1 = (luma1 + 0.05) / (luma + 0.05);\n // }\n // if (luma > luma2) {\n // contrast2 = (luma + 0.05) / (luma2 + 0.05);\n // } else {\n // contrast2 = (luma2 + 0.05) / (luma + 0.05);\n // }\n // if (contrast1 > contrast2) {\n // return color1;\n // } else {\n // return color2;\n // }\n // },\n argb: function (color) {\n return new Anonymous(color.toARGB());\n },\n color: function(c) {\n if ((c instanceof Quoted) &&\n (/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})$/i.test(c.value))) {\n const val = c.value.slice(1);\n return new Color(val, undefined, `#${val}`);\n }\n if ((c instanceof Color) || (c = Color.fromKeyword(c.value))) {\n c.value = undefined;\n return c;\n }\n throw {\n type: 'Argument',\n message: 'argument must be a color keyword or 3|4|6|8 digit hex e.g. #FFF'\n };\n },\n tint: function(color, amount) {\n return colorFunctions.mix(colorFunctions.rgb(255, 255, 255), color, amount);\n },\n shade: function(color, amount) {\n return colorFunctions.mix(colorFunctions.rgb(0, 0, 0), color, amount);\n }\n};\n\nexport default colorFunctions;\n","import Color from '../tree/color';\n\n// Color Blending\n// ref: http://www.w3.org/TR/compositing-1\n\nfunction colorBlend(mode, color1, color2) {\n const ab = color1.alpha; // result\n\n let // backdrop\n cb;\n\n const as = color2.alpha;\n\n let // source\n cs;\n\n let ar;\n let cr;\n const r = [];\n\n ar = as + ab * (1 - as);\n for (let i = 0; i < 3; i++) {\n cb = color1.rgb[i] / 255;\n cs = color2.rgb[i] / 255;\n cr = mode(cb, cs);\n if (ar) {\n cr = (as * cs + ab * (cb -\n as * (cb + cs - cr))) / ar;\n }\n r[i] = cr * 255;\n }\n\n return new Color(r, ar);\n}\n\nconst colorBlendModeFunctions = {\n multiply: function(cb, cs) {\n return cb * cs;\n },\n screen: function(cb, cs) {\n return cb + cs - cb * cs;\n },\n overlay: function(cb, cs) {\n cb *= 2;\n return (cb <= 1) ?\n colorBlendModeFunctions.multiply(cb, cs) :\n colorBlendModeFunctions.screen(cb - 1, cs);\n },\n softlight: function(cb, cs) {\n let d = 1;\n let e = cb;\n if (cs > 0.5) {\n e = 1;\n d = (cb > 0.25) ? Math.sqrt(cb)\n : ((16 * cb - 12) * cb + 4) * cb;\n }\n return cb - (1 - 2 * cs) * e * (d - cb);\n },\n hardlight: function(cb, cs) {\n return colorBlendModeFunctions.overlay(cs, cb);\n },\n difference: function(cb, cs) {\n return Math.abs(cb - cs);\n },\n exclusion: function(cb, cs) {\n return cb + cs - 2 * cb * cs;\n },\n\n // non-w3c functions:\n average: function(cb, cs) {\n return (cb + cs) / 2;\n },\n negation: function(cb, cs) {\n return 1 - Math.abs(cb + cs - 1);\n }\n};\n\nfor (const f in colorBlendModeFunctions) {\n if (colorBlendModeFunctions.hasOwnProperty(f)) {\n colorBlend[f] = colorBlend.bind(null, colorBlendModeFunctions[f]);\n }\n}\n\nexport default colorBlend;\n","import Comment from '../tree/comment';\nimport Node from '../tree/node';\nimport Dimension from '../tree/dimension';\nimport Declaration from '../tree/declaration';\nimport Expression from '../tree/expression';\nimport Ruleset from '../tree/ruleset';\nimport Selector from '../tree/selector';\nimport Element from '../tree/element';\nimport Quote from '../tree/quoted';\nimport Value from '../tree/value';\n\nconst getItemsFromNode = node => {\n // handle non-array values as an array of length 1\n // return 'undefined' if index is invalid\n const items = Array.isArray(node.value) ?\n node.value : Array(node);\n\n return items;\n};\n\nexport default {\n _SELF: function(n) {\n return n;\n },\n '~': function(...expr) {\n if (expr.length === 1) {\n return expr[0];\n }\n return new Value(expr);\n },\n extract: function(values, index) {\n // (1-based index)\n index = index.value - 1;\n\n return getItemsFromNode(values)[index];\n },\n length: function(values) {\n return new Dimension(getItemsFromNode(values).length);\n },\n /**\n * Creates a Less list of incremental values.\n * Modeled after Lodash's range function, also exists natively in PHP\n * \n * @param {Dimension} [start=1]\n * @param {Dimension} end - e.g. 10 or 10px - unit is added to output\n * @param {Dimension} [step=1] \n */\n range: function(start, end, step) {\n let from;\n let to;\n let stepValue = 1;\n const list = [];\n if (end) {\n to = end;\n from = start.value;\n if (step) {\n stepValue = step.value;\n }\n }\n else {\n from = 1;\n to = start;\n }\n\n for (let i = from; i <= to.value; i += stepValue) {\n list.push(new Dimension(i, to.unit));\n }\n\n return new Expression(list);\n },\n each: function(list, rs) {\n const rules = [];\n let newRules;\n let iterator;\n\n const tryEval = val => {\n if (val instanceof Node) {\n return val.eval(this.context);\n }\n return val;\n };\n\n if (list.value && !(list instanceof Quote)) {\n if (Array.isArray(list.value)) {\n iterator = list.value.map(tryEval);\n } else {\n iterator = [tryEval(list.value)];\n }\n } else if (list.ruleset) {\n iterator = tryEval(list.ruleset).rules;\n } else if (list.rules) {\n iterator = list.rules.map(tryEval);\n } else if (Array.isArray(list)) {\n iterator = list.map(tryEval);\n } else {\n iterator = [tryEval(list)];\n }\n\n let valueName = '@value';\n let keyName = '@key';\n let indexName = '@index';\n\n if (rs.params) {\n valueName = rs.params[0] && rs.params[0].name;\n keyName = rs.params[1] && rs.params[1].name;\n indexName = rs.params[2] && rs.params[2].name;\n rs = rs.rules;\n } else {\n rs = rs.ruleset;\n }\n\n for (let i = 0; i < iterator.length; i++) {\n let key;\n let value;\n const item = iterator[i];\n if (item instanceof Declaration) {\n key = typeof item.name === 'string' ? item.name : item.name[0].value;\n value = item.value;\n } else {\n key = new Dimension(i + 1);\n value = item;\n }\n\n if (item instanceof Comment) {\n continue;\n }\n\n newRules = rs.rules.slice(0);\n if (valueName) {\n newRules.push(new Declaration(valueName,\n value,\n false, false, this.index, this.currentFileInfo));\n }\n if (indexName) {\n newRules.push(new Declaration(indexName,\n new Dimension(i + 1),\n false, false, this.index, this.currentFileInfo));\n }\n if (keyName) {\n newRules.push(new Declaration(keyName,\n key,\n false, false, this.index, this.currentFileInfo));\n }\n\n rules.push(new Ruleset([ new(Selector)([ new Element(\"\", '&') ]) ],\n newRules,\n rs.strictImports,\n rs.visibilityInfo()\n ));\n }\n\n return new Ruleset([ new(Selector)([ new Element(\"\", '&') ]) ],\n rules,\n rs.strictImports,\n rs.visibilityInfo()\n ).eval(this.context);\n }\n};\n","import Dimension from '../tree/dimension';\n\nconst MathHelper = (fn, unit, n) => {\n if (!(n instanceof Dimension)) {\n throw { type: 'Argument', message: 'argument must be a number' };\n }\n if (unit == null) {\n unit = n.unit;\n } else {\n n = n.unify();\n }\n return new Dimension(fn(parseFloat(n.value)), unit);\n};\n\nexport default MathHelper;","import mathHelper from './math-helper.js';\n\nconst mathFunctions = {\n // name, unit\n ceil: null,\n floor: null,\n sqrt: null,\n abs: null,\n tan: '',\n sin: '',\n cos: '',\n atan: 'rad',\n asin: 'rad',\n acos: 'rad'\n};\n\nfor (const f in mathFunctions) {\n if (mathFunctions.hasOwnProperty(f)) {\n mathFunctions[f] = mathHelper.bind(null, Math[f], mathFunctions[f]);\n }\n}\n\nmathFunctions.round = (n, f) => {\n const fraction = typeof f === 'undefined' ? 0 : f.value;\n return mathHelper(num => num.toFixed(fraction), null, n);\n};\n\nexport default mathFunctions;\n","import Dimension from '../tree/dimension';\nimport Anonymous from '../tree/anonymous';\nimport mathHelper from './math-helper.js';\n\nconst minMax = function (isMin, args) {\n args = Array.prototype.slice.call(args);\n switch (args.length) {\n case 0: throw { type: 'Argument', message: 'one or more arguments required' };\n }\n let i; // key is the unit.toString() for unified Dimension values,\n let j;\n let current;\n let currentUnified;\n let referenceUnified;\n let unit;\n let unitStatic;\n let unitClone;\n\n const // elems only contains original argument values.\n order = [];\n\n const values = {};\n // value is the index into the order array.\n for (i = 0; i < args.length; i++) {\n current = args[i];\n if (!(current instanceof Dimension)) {\n if (Array.isArray(args[i].value)) {\n Array.prototype.push.apply(args, Array.prototype.slice.call(args[i].value));\n }\n continue;\n }\n currentUnified = current.unit.toString() === '' && unitClone !== undefined ? new Dimension(current.value, unitClone).unify() : current.unify();\n unit = currentUnified.unit.toString() === '' && unitStatic !== undefined ? unitStatic : currentUnified.unit.toString();\n unitStatic = unit !== '' && unitStatic === undefined || unit !== '' && order[0].unify().unit.toString() === '' ? unit : unitStatic;\n unitClone = unit !== '' && unitClone === undefined ? current.unit.toString() : unitClone;\n j = values[''] !== undefined && unit !== '' && unit === unitStatic ? values[''] : values[unit];\n if (j === undefined) {\n if (unitStatic !== undefined && unit !== unitStatic) {\n throw { type: 'Argument', message: 'incompatible types' };\n }\n values[unit] = order.length;\n order.push(current);\n continue;\n }\n referenceUnified = order[j].unit.toString() === '' && unitClone !== undefined ? new Dimension(order[j].value, unitClone).unify() : order[j].unify();\n if ( isMin && currentUnified.value < referenceUnified.value ||\n !isMin && currentUnified.value > referenceUnified.value) {\n order[j] = current;\n }\n }\n if (order.length == 1) {\n return order[0];\n }\n args = order.map(function (a) { return a.toCSS(this.context); }).join(this.context.compress ? ',' : ', ');\n return new Anonymous(`${isMin ? 'min' : 'max'}(${args})`);\n};\n\nexport default {\n min: function(...args) {\n try {\n return minMax(true, args);\n } catch (e) {}\n },\n max: function(...args) {\n try {\n return minMax(false, args);\n } catch (e) {}\n },\n convert: function (val, unit) {\n return val.convertTo(unit.value);\n },\n pi: function () {\n return new Dimension(Math.PI);\n },\n mod: function(a, b) {\n return new Dimension(a.value % b.value, a.unit);\n },\n pow: function(x, y) {\n if (typeof x === 'number' && typeof y === 'number') {\n x = new Dimension(x);\n y = new Dimension(y);\n } else if (!(x instanceof Dimension) || !(y instanceof Dimension)) {\n throw { type: 'Argument', message: 'arguments must be numbers' };\n }\n\n return new Dimension(Math.pow(x.value, y.value), x.unit);\n },\n percentage: function (n) {\n const result = mathHelper(num => num * 100, '%', n);\n\n return result;\n }\n};\n","import Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport JavaScript from '../tree/javascript';\n\nexport default {\n e: function (str) {\n return new Quoted('\"', str instanceof JavaScript ? str.evaluated : str.value, true);\n },\n escape: function (str) {\n return new Anonymous(\n encodeURI(str.value).replace(/=/g, '%3D').replace(/:/g, '%3A').replace(/#/g, '%23').replace(/;/g, '%3B')\n .replace(/\\(/g, '%28').replace(/\\)/g, '%29'));\n },\n replace: function (string, pattern, replacement, flags) {\n let result = string.value;\n replacement = (replacement.type === 'Quoted') ?\n replacement.value : replacement.toCSS();\n result = result.replace(new RegExp(pattern.value, flags ? flags.value : ''), replacement);\n return new Quoted(string.quote || '', result, string.escaped);\n },\n '%': function (string /* arg, arg, ... */) {\n const args = Array.prototype.slice.call(arguments, 1);\n let result = string.value;\n\n for (let i = 0; i < args.length; i++) {\n /* jshint loopfunc:true */\n result = result.replace(/%[sda]/i, token => {\n const value = ((args[i].type === 'Quoted') &&\n token.match(/s/i)) ? args[i].value : args[i].toCSS();\n return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value;\n });\n }\n result = result.replace(/%%/g, '%');\n return new Quoted(string.quote || '', result, string.escaped);\n }\n};\n","import Keyword from '../tree/keyword';\nimport DetachedRuleset from '../tree/detached-ruleset';\nimport Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport URL from '../tree/url';\nimport Operation from '../tree/operation';\n\nconst isa = (n, Type) => (n instanceof Type) ? Keyword.True : Keyword.False;\nconst isunit = (n, unit) => {\n if (unit === undefined) {\n throw { type: 'Argument', message: 'missing the required second argument to isunit.' };\n }\n unit = typeof unit.value === 'string' ? unit.value : unit;\n if (typeof unit !== 'string') {\n throw { type: 'Argument', message: 'Second argument to isunit should be a unit or a string.' };\n }\n return (n instanceof Dimension) && n.unit.is(unit) ? Keyword.True : Keyword.False;\n};\n\nexport default {\n isruleset: function (n) {\n return isa(n, DetachedRuleset);\n },\n iscolor: function (n) {\n return isa(n, Color);\n },\n isnumber: function (n) {\n return isa(n, Dimension);\n },\n isstring: function (n) {\n return isa(n, Quoted);\n },\n iskeyword: function (n) {\n return isa(n, Keyword);\n },\n isurl: function (n) {\n return isa(n, URL);\n },\n ispixel: function (n) {\n return isunit(n, 'px');\n },\n ispercentage: function (n) {\n return isunit(n, '%');\n },\n isem: function (n) {\n return isunit(n, 'em');\n },\n isunit,\n unit: function (val, unit) {\n if (!(val instanceof Dimension)) {\n throw { type: 'Argument',\n message: `the first argument to unit must be a number${val instanceof Operation ? '. Have you forgotten parenthesis?' : ''}` };\n }\n if (unit) {\n if (unit instanceof Keyword) {\n unit = unit.value;\n } else {\n unit = unit.toCSS();\n }\n } else {\n unit = '';\n }\n return new Dimension(val.value, unit);\n },\n 'get-unit': function (n) {\n return new Anonymous(n.unit);\n }\n};\n","import functionRegistry from './function-registry';\nimport functionCaller from './function-caller';\n\nimport boolean from './boolean';\nimport defaultFunc from './default';\nimport color from './color';\nimport colorBlending from './color-blending';\nimport dataUri from './data-uri';\nimport list from './list';\nimport math from './math';\nimport number from './number';\nimport string from './string';\nimport svg from './svg';\nimport types from './types';\n\nexport default environment => {\n const functions = { functionRegistry, functionCaller };\n\n // register functions\n functionRegistry.addMultiple(boolean);\n functionRegistry.add('default', defaultFunc.eval.bind(defaultFunc));\n functionRegistry.addMultiple(color);\n functionRegistry.addMultiple(colorBlending);\n functionRegistry.addMultiple(dataUri(environment));\n functionRegistry.addMultiple(list);\n functionRegistry.addMultiple(math);\n functionRegistry.addMultiple(number);\n functionRegistry.addMultiple(string);\n functionRegistry.addMultiple(svg(environment));\n functionRegistry.addMultiple(types);\n\n return functions;\n};\n","import Quoted from '../tree/quoted';\nimport URL from '../tree/url';\nimport * as utils from '../utils';\nimport logger from '../logger';\n\nexport default environment => {\n \n const fallback = (functionThis, node) => new URL(node, functionThis.index, functionThis.currentFileInfo).eval(functionThis.context); \n\n return { 'data-uri': function(mimetypeNode, filePathNode) {\n\n if (!filePathNode) {\n filePathNode = mimetypeNode;\n mimetypeNode = null;\n }\n\n let mimetype = mimetypeNode && mimetypeNode.value;\n let filePath = filePathNode.value;\n const currentFileInfo = this.currentFileInfo;\n const currentDirectory = currentFileInfo.rewriteUrls ?\n currentFileInfo.currentDirectory : currentFileInfo.entryPath;\n\n const fragmentStart = filePath.indexOf('#');\n let fragment = '';\n if (fragmentStart !== -1) {\n fragment = filePath.slice(fragmentStart);\n filePath = filePath.slice(0, fragmentStart);\n }\n const context = utils.clone(this.context);\n context.rawBuffer = true;\n\n const fileManager = environment.getFileManager(filePath, currentDirectory, context, environment, true);\n\n if (!fileManager) {\n return fallback(this, filePathNode);\n }\n\n let useBase64 = false;\n\n // detect the mimetype if not given\n if (!mimetypeNode) {\n\n mimetype = environment.mimeLookup(filePath);\n\n if (mimetype === 'image/svg+xml') {\n useBase64 = false;\n } else {\n // use base 64 unless it's an ASCII or UTF-8 format\n const charset = environment.charsetLookup(mimetype);\n useBase64 = ['US-ASCII', 'UTF-8'].indexOf(charset) < 0;\n }\n if (useBase64) { mimetype += ';base64'; }\n }\n else {\n useBase64 = /;base64$/.test(mimetype);\n }\n\n const fileSync = fileManager.loadFileSync(filePath, currentDirectory, context, environment);\n if (!fileSync.contents) {\n logger.warn(`Skipped data-uri embedding of ${filePath} because file not found`);\n return fallback(this, filePathNode || mimetypeNode);\n }\n let buf = fileSync.contents;\n if (useBase64 && !environment.encodeBase64) {\n return fallback(this, filePathNode);\n }\n\n buf = useBase64 ? environment.encodeBase64(buf) : encodeURIComponent(buf);\n\n const uri = `data:${mimetype},${buf}${fragment}`;\n\n return new URL(new Quoted(`\"${uri}\"`, uri, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n }};\n};\n","import Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Expression from '../tree/expression';\nimport Quoted from '../tree/quoted';\nimport URL from '../tree/url';\n\nexport default environment => {\n return { 'svg-gradient': function(direction) {\n let stops;\n let gradientDirectionSvg;\n let gradientType = 'linear';\n let rectangleDimension = 'x=\"0\" y=\"0\" width=\"1\" height=\"1\"';\n const renderEnv = {compress: false};\n let returner;\n const directionValue = direction.toCSS(renderEnv);\n let i;\n let color;\n let position;\n let positionValue;\n let alpha;\n\n function throwArgumentDescriptor() {\n throw { type: 'Argument',\n message: 'svg-gradient expects direction, start_color [start_position], [color position,]...,' +\n ' end_color [end_position] or direction, color list' };\n }\n\n if (arguments.length == 2) {\n if (arguments[1].value.length < 2) {\n throwArgumentDescriptor();\n }\n stops = arguments[1].value;\n } else if (arguments.length < 3) {\n throwArgumentDescriptor();\n } else {\n stops = Array.prototype.slice.call(arguments, 1);\n }\n\n switch (directionValue) {\n case 'to bottom':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\"';\n break;\n case 'to right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'to bottom right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\"';\n break;\n case 'to top right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"100%\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'ellipse':\n case 'ellipse at center':\n gradientType = 'radial';\n gradientDirectionSvg = 'cx=\"50%\" cy=\"50%\" r=\"75%\"';\n rectangleDimension = 'x=\"-50\" y=\"-50\" width=\"101\" height=\"101\"';\n break;\n default:\n throw { type: 'Argument', message: 'svg-gradient direction must be \\'to bottom\\', \\'to right\\',' +\n ' \\'to bottom right\\', \\'to top right\\' or \\'ellipse at center\\'' };\n }\n returner = `<${gradientType}Gradient id=\"g\" ${gradientDirectionSvg}>`;\n\n for (i = 0; i < stops.length; i += 1) {\n if (stops[i] instanceof Expression) {\n color = stops[i].value[0];\n position = stops[i].value[1];\n } else {\n color = stops[i];\n position = undefined;\n }\n\n if (!(color instanceof Color) || (!((i === 0 || i + 1 === stops.length) && position === undefined) && !(position instanceof Dimension))) {\n throwArgumentDescriptor();\n }\n positionValue = position ? position.toCSS(renderEnv) : i === 0 ? '0%' : '100%';\n alpha = color.alpha;\n returner += ``;\n }\n returner += ``;\n\n returner = encodeURIComponent(returner);\n\n returner = `data:image/svg+xml,${returner}`;\n return new URL(new Quoted(`'${returner}'`, returner, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n }};\n};\n","import contexts from './contexts';\nimport visitor from './visitors';\nimport tree from './tree';\n\nexport default function(root, options) {\n options = options || {};\n let evaldRoot;\n let variables = options.variables;\n const evalEnv = new contexts.Eval(options);\n\n //\n // Allows setting variables with a hash, so:\n //\n // `{ color: new tree.Color('#f01') }` will become:\n //\n // new tree.Declaration('@color',\n // new tree.Value([\n // new tree.Expression([\n // new tree.Color('#f01')\n // ])\n // ])\n // )\n //\n if (typeof variables === 'object' && !Array.isArray(variables)) {\n variables = Object.keys(variables).map(function (k) {\n let value = variables[k];\n\n if (!(value instanceof tree.Value)) {\n if (!(value instanceof tree.Expression)) {\n value = new tree.Expression([value]);\n }\n value = new tree.Value([value]);\n }\n return new tree.Declaration(`@${k}`, value, false, null, 0);\n });\n evalEnv.frames = [new tree.Ruleset(null, variables)];\n }\n\n const visitors = [\n new visitor.JoinSelectorVisitor(),\n new visitor.MarkVisibleSelectorsVisitor(true),\n new visitor.ExtendVisitor(),\n new visitor.ToCSSVisitor({compress: Boolean(options.compress)})\n ];\n\n const preEvalVisitors = [];\n let v;\n let visitorIterator;\n\n /**\n * first() / get() allows visitors to be added while visiting\n * \n * @todo Add scoping for visitors just like functions for @plugin; right now they're global\n */\n if (options.pluginManager) {\n visitorIterator = options.pluginManager.visitor();\n for (var i = 0; i < 2; i++) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (v.isPreEvalVisitor) {\n if (i === 0 || preEvalVisitors.indexOf(v) === -1) {\n preEvalVisitors.push(v);\n v.run(root);\n }\n }\n else {\n if (i === 0 || visitors.indexOf(v) === -1) {\n if (v.isPreVisitor) {\n visitors.unshift(v);\n }\n else {\n visitors.push(v);\n }\n }\n }\n }\n }\n }\n\n evaldRoot = root.eval(evalEnv);\n\n for (var i = 0; i < visitors.length; i++) {\n visitors[i].run(evaldRoot);\n }\n\n // Run any remaining visitors added after eval pass\n if (options.pluginManager) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (visitors.indexOf(v) === -1 && preEvalVisitors.indexOf(v) === -1) {\n v.run(evaldRoot);\n }\n }\n }\n\n return evaldRoot;\n};\n","/**\n * Plugin Manager\n */\nclass PluginManager {\n constructor(less) {\n this.less = less;\n this.visitors = [];\n this.preProcessors = [];\n this.postProcessors = [];\n this.installedPlugins = [];\n this.fileManagers = [];\n this.iterator = -1;\n this.pluginCache = {};\n this.Loader = new less.PluginLoader(less);\n }\n\n /**\n * Adds all the plugins in the array\n * @param {Array} plugins\n */\n addPlugins(plugins) {\n if (plugins) {\n for (let i = 0; i < plugins.length; i++) {\n this.addPlugin(plugins[i]);\n }\n }\n }\n\n /**\n *\n * @param plugin\n * @param {String} filename\n */\n addPlugin(plugin, filename, functionRegistry) {\n this.installedPlugins.push(plugin);\n if (filename) {\n this.pluginCache[filename] = plugin;\n }\n if (plugin.install) {\n plugin.install(this.less, this, functionRegistry || this.less.functions.functionRegistry);\n }\n }\n\n /**\n *\n * @param filename\n */\n get(filename) {\n return this.pluginCache[filename];\n }\n\n /**\n * Adds a visitor. The visitor object has options on itself to determine\n * when it should run.\n * @param visitor\n */\n addVisitor(visitor) {\n this.visitors.push(visitor);\n }\n\n /**\n * Adds a pre processor object\n * @param {object} preProcessor\n * @param {number} priority - guidelines 1 = before import, 1000 = import, 2000 = after import\n */\n addPreProcessor(preProcessor, priority) {\n let indexToInsertAt;\n for (indexToInsertAt = 0; indexToInsertAt < this.preProcessors.length; indexToInsertAt++) {\n if (this.preProcessors[indexToInsertAt].priority >= priority) {\n break;\n }\n }\n this.preProcessors.splice(indexToInsertAt, 0, {preProcessor, priority});\n }\n\n /**\n * Adds a post processor object\n * @param {object} postProcessor\n * @param {number} priority - guidelines 1 = before compression, 1000 = compression, 2000 = after compression\n */\n addPostProcessor(postProcessor, priority) {\n let indexToInsertAt;\n for (indexToInsertAt = 0; indexToInsertAt < this.postProcessors.length; indexToInsertAt++) {\n if (this.postProcessors[indexToInsertAt].priority >= priority) {\n break;\n }\n }\n this.postProcessors.splice(indexToInsertAt, 0, {postProcessor, priority});\n }\n\n /**\n *\n * @param manager\n */\n addFileManager(manager) {\n this.fileManagers.push(manager);\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getPreProcessors() {\n const preProcessors = [];\n for (let i = 0; i < this.preProcessors.length; i++) {\n preProcessors.push(this.preProcessors[i].preProcessor);\n }\n return preProcessors;\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getPostProcessors() {\n const postProcessors = [];\n for (let i = 0; i < this.postProcessors.length; i++) {\n postProcessors.push(this.postProcessors[i].postProcessor);\n }\n return postProcessors;\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getVisitors() {\n return this.visitors;\n }\n\n visitor() {\n const self = this;\n return {\n first: function() {\n self.iterator = -1;\n return self.visitors[self.iterator];\n },\n get: function() {\n self.iterator += 1;\n return self.visitors[self.iterator];\n }\n };\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getFileManagers() {\n return this.fileManagers;\n }\n}\n\nlet pm;\n\nconst PluginManagerFactory = function(less, newFactory) {\n if (newFactory || !pm) {\n pm = new PluginManager(less);\n }\n return pm;\n};\n\n//\nexport default PluginManagerFactory;\n","'use strict';\n\nfunction parseNodeVersion(version) {\n var match = version.match(/^v(\\d{1,2})\\.(\\d{1,2})\\.(\\d{1,2})(?:-([0-9A-Za-z-.]+))?(?:\\+([0-9A-Za-z-.]+))?$/); // eslint-disable-line max-len\n if (!match) {\n throw new Error('Unable to parse: ' + version);\n }\n\n var res = {\n major: parseInt(match[1], 10),\n minor: parseInt(match[2], 10),\n patch: parseInt(match[3], 10),\n pre: match[4] || '',\n build: match[5] || '',\n };\n\n return res;\n}\n\nmodule.exports = parseNodeVersion;\n","/* global window, XMLHttpRequest */\n\nimport AbstractFileManager from '../less/environment/abstract-file-manager.js';\n\nlet options;\nlet logger;\nlet fileCache = {};\n\n// TODOS - move log somewhere. pathDiff and doing something similar in node. use pathDiff in the other browser file for the initial load\nconst FileManager = function() {}\nFileManager.prototype = Object.assign(new AbstractFileManager(), {\n alwaysMakePathsAbsolute() {\n return true;\n },\n\n join(basePath, laterPath) {\n if (!basePath) {\n return laterPath;\n }\n return this.extractUrlParts(laterPath, basePath).path;\n },\n\n doXHR(url, type, callback, errback) {\n const xhr = new XMLHttpRequest();\n const async = options.isFileProtocol ? options.fileAsync : true;\n\n if (typeof xhr.overrideMimeType === 'function') {\n xhr.overrideMimeType('text/css');\n }\n logger.debug(`XHR: Getting '${url}'`);\n xhr.open('GET', url, async);\n xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5');\n xhr.send(null);\n\n function handleResponse(xhr, callback, errback) {\n if (xhr.status >= 200 && xhr.status < 300) {\n callback(xhr.responseText,\n xhr.getResponseHeader('Last-Modified'));\n } else if (typeof errback === 'function') {\n errback(xhr.status, url);\n }\n }\n\n if (options.isFileProtocol && !options.fileAsync) {\n if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) {\n callback(xhr.responseText);\n } else {\n errback(xhr.status, url);\n }\n } else if (async) {\n xhr.onreadystatechange = () => {\n if (xhr.readyState == 4) {\n handleResponse(xhr, callback, errback);\n }\n };\n } else {\n handleResponse(xhr, callback, errback);\n }\n },\n\n supports() {\n return true;\n },\n\n clearFileCache() {\n fileCache = {};\n },\n\n loadFile(filename, currentDirectory, options, environment) {\n // TODO: Add prefix support like less-node?\n // What about multiple paths?\n\n if (currentDirectory && !this.isPathAbsolute(filename)) {\n filename = currentDirectory + filename;\n }\n\n filename = options.ext ? this.tryAppendExtension(filename, options.ext) : filename;\n\n options = options || {};\n\n // sheet may be set to the stylesheet for the initial load or a collection of properties including\n // some context variables for imports\n const hrefParts = this.extractUrlParts(filename, window.location.href);\n const href = hrefParts.url;\n const self = this;\n \n return new Promise((resolve, reject) => {\n if (options.useFileCache && fileCache[href]) {\n try {\n const lessText = fileCache[href];\n return resolve({ contents: lessText, filename: href, webInfo: { lastModified: new Date() }});\n } catch (e) {\n return reject({ filename: href, message: `Error loading file ${href} error was ${e.message}` });\n }\n }\n\n self.doXHR(href, options.mime, function doXHRCallback(data, lastModified) {\n // per file cache\n fileCache[href] = data;\n\n // Use remote copy (re-parse)\n resolve({ contents: data, filename: href, webInfo: { lastModified }});\n }, function doXHRError(status, url) {\n reject({ type: 'File', message: `'${url}' wasn't found (${status})`, href });\n });\n });\n }\n});\n\nexport default (opts, log) => {\n options = opts;\n logger = log;\n return FileManager;\n}\n","import Environment from './environment/environment';\nimport data from './data';\nimport tree from './tree';\nimport AbstractFileManager from './environment/abstract-file-manager';\nimport AbstractPluginLoader from './environment/abstract-plugin-loader';\nimport visitors from './visitors';\nimport Parser from './parser/parser';\nimport functions from './functions';\nimport contexts from './contexts';\nimport LessError from './less-error';\nimport transformTree from './transform-tree';\nimport * as utils from './utils';\nimport PluginManager from './plugin-manager';\nimport logger from './logger';\nimport SourceMapOutput from './source-map-output';\nimport SourceMapBuilder from './source-map-builder';\nimport ParseTree from './parse-tree';\nimport ImportManager from './import-manager';\nimport Parse from './parse';\nimport Render from './render';\nimport { version } from '../../package.json';\nimport parseVersion from 'parse-node-version';\n\nexport default function(environment, fileManagers) {\n let sourceMapOutput, sourceMapBuilder, parseTree, importManager;\n\n environment = new Environment(environment, fileManagers);\n sourceMapOutput = SourceMapOutput(environment);\n sourceMapBuilder = SourceMapBuilder(sourceMapOutput, environment);\n parseTree = ParseTree(sourceMapBuilder);\n importManager = ImportManager(environment);\n\n const render = Render(environment, parseTree, importManager);\n const parse = Parse(environment, parseTree, importManager);\n\n const v = parseVersion(version);\n const initial = {\n version: [v.major, v.minor, v.patch],\n data,\n tree,\n Environment,\n AbstractFileManager,\n AbstractPluginLoader,\n environment,\n visitors,\n Parser,\n functions: functions(environment),\n contexts,\n SourceMapOutput: sourceMapOutput,\n SourceMapBuilder: sourceMapBuilder,\n ParseTree: parseTree,\n ImportManager: importManager,\n render,\n parse,\n LessError,\n transformTree,\n utils,\n PluginManager,\n logger\n };\n\n // Create a public API\n\n const ctor = function(t) {\n return function() {\n const obj = Object.create(t.prototype);\n t.apply(obj, Array.prototype.slice.call(arguments, 0));\n return obj;\n };\n };\n let t;\n const api = Object.create(initial);\n for (const n in initial.tree) {\n /* eslint guard-for-in: 0 */\n t = initial.tree[n];\n if (typeof t === 'function') {\n api[n.toLowerCase()] = ctor(t);\n }\n else {\n api[n] = Object.create(null);\n for (const o in t) {\n /* eslint guard-for-in: 0 */\n api[n][o.toLowerCase()] = ctor(t[o]);\n }\n }\n }\n\n /**\n * Some of the functions assume a `this` context of the API object,\n * which causes it to fail when wrapped for ES6 imports.\n * \n * An assumed `this` should be removed in the future.\n */\n initial.parse = initial.parse.bind(api);\n initial.render = initial.render.bind(api);\n\n return api;\n};\n","import LessError from './less-error';\nimport transformTree from './transform-tree';\nimport logger from './logger';\n\nexport default function(SourceMapBuilder) {\n class ParseTree {\n constructor(root, imports) {\n this.root = root;\n this.imports = imports;\n }\n\n toCSS(options) {\n let evaldRoot;\n const result = {};\n let sourceMapBuilder;\n try {\n evaldRoot = transformTree(this.root, options);\n } catch (e) {\n throw new LessError(e, this.imports);\n }\n\n try {\n const compress = Boolean(options.compress);\n if (compress) {\n logger.warn('The compress option has been deprecated. ' + \n 'We recommend you use a dedicated css minifier, for instance see less-plugin-clean-css.');\n }\n\n const toCSSOptions = {\n compress,\n dumpLineNumbers: options.dumpLineNumbers,\n strictUnits: Boolean(options.strictUnits),\n numPrecision: 8};\n\n if (options.sourceMap) {\n sourceMapBuilder = new SourceMapBuilder(options.sourceMap);\n result.css = sourceMapBuilder.toCSS(evaldRoot, toCSSOptions, this.imports);\n } else {\n result.css = evaldRoot.toCSS(toCSSOptions);\n }\n } catch (e) {\n throw new LessError(e, this.imports);\n }\n\n if (options.pluginManager) {\n const postProcessors = options.pluginManager.getPostProcessors();\n for (let i = 0; i < postProcessors.length; i++) {\n result.css = postProcessors[i].process(result.css, { sourceMap: sourceMapBuilder, options, imports: this.imports });\n }\n }\n if (options.sourceMap) {\n result.map = sourceMapBuilder.getExternalSourceMap();\n }\n\n result.imports = [];\n for (const file in this.imports.files) {\n if (this.imports.files.hasOwnProperty(file) && file !== this.imports.rootFilename) {\n result.imports.push(file);\n }\n }\n return result;\n }\n }\n\n return ParseTree;\n};\n","export default function (SourceMapOutput, environment) {\n class SourceMapBuilder {\n constructor(options) {\n this.options = options;\n }\n\n toCSS(rootNode, options, imports) {\n const sourceMapOutput = new SourceMapOutput(\n {\n contentsIgnoredCharsMap: imports.contentsIgnoredChars,\n rootNode,\n contentsMap: imports.contents,\n sourceMapFilename: this.options.sourceMapFilename,\n sourceMapURL: this.options.sourceMapURL,\n outputFilename: this.options.sourceMapOutputFilename,\n sourceMapBasepath: this.options.sourceMapBasepath,\n sourceMapRootpath: this.options.sourceMapRootpath,\n outputSourceFiles: this.options.outputSourceFiles,\n sourceMapGenerator: this.options.sourceMapGenerator,\n sourceMapFileInline: this.options.sourceMapFileInline, \n disableSourcemapAnnotation: this.options.disableSourcemapAnnotation\n });\n\n const css = sourceMapOutput.toCSS(options);\n this.sourceMap = sourceMapOutput.sourceMap;\n this.sourceMapURL = sourceMapOutput.sourceMapURL;\n if (this.options.sourceMapInputFilename) {\n this.sourceMapInputFilename = sourceMapOutput.normalizeFilename(this.options.sourceMapInputFilename);\n }\n if (this.options.sourceMapBasepath !== undefined && this.sourceMapURL !== undefined) {\n this.sourceMapURL = sourceMapOutput.removeBasepath(this.sourceMapURL);\n }\n return css + this.getCSSAppendage();\n }\n\n getCSSAppendage() {\n\n let sourceMapURL = this.sourceMapURL;\n if (this.options.sourceMapFileInline) {\n if (this.sourceMap === undefined) {\n return '';\n }\n sourceMapURL = `data:application/json;base64,${environment.encodeBase64(this.sourceMap)}`;\n }\n\n if (this.options.disableSourcemapAnnotation) {\n return '';\n }\n\n if (sourceMapURL) {\n return `/*# sourceMappingURL=${sourceMapURL} */`;\n }\n return '';\n }\n\n getExternalSourceMap() {\n return this.sourceMap;\n }\n\n setExternalSourceMap(sourceMap) {\n this.sourceMap = sourceMap;\n }\n\n isInline() {\n return this.options.sourceMapFileInline;\n }\n\n getSourceMapURL() {\n return this.sourceMapURL;\n }\n\n getOutputFilename() {\n return this.options.sourceMapOutputFilename;\n }\n\n getInputFilename() {\n return this.sourceMapInputFilename;\n }\n }\n\n return SourceMapBuilder;\n};\n","export default function (environment) {\n class SourceMapOutput {\n constructor(options) {\n this._css = [];\n this._rootNode = options.rootNode;\n this._contentsMap = options.contentsMap;\n this._contentsIgnoredCharsMap = options.contentsIgnoredCharsMap;\n if (options.sourceMapFilename) {\n this._sourceMapFilename = options.sourceMapFilename.replace(/\\\\/g, '/');\n }\n this._outputFilename = options.outputFilename;\n this.sourceMapURL = options.sourceMapURL;\n if (options.sourceMapBasepath) {\n this._sourceMapBasepath = options.sourceMapBasepath.replace(/\\\\/g, '/');\n }\n if (options.sourceMapRootpath) {\n this._sourceMapRootpath = options.sourceMapRootpath.replace(/\\\\/g, '/');\n if (this._sourceMapRootpath.charAt(this._sourceMapRootpath.length - 1) !== '/') {\n this._sourceMapRootpath += '/';\n }\n } else {\n this._sourceMapRootpath = '';\n }\n this._outputSourceFiles = options.outputSourceFiles;\n this._sourceMapGeneratorConstructor = environment.getSourceMapGenerator();\n\n this._lineNumber = 0;\n this._column = 0;\n }\n\n removeBasepath(path) {\n if (this._sourceMapBasepath && path.indexOf(this._sourceMapBasepath) === 0) {\n path = path.substring(this._sourceMapBasepath.length);\n if (path.charAt(0) === '\\\\' || path.charAt(0) === '/') {\n path = path.substring(1);\n }\n }\n\n return path;\n }\n\n normalizeFilename(filename) {\n filename = filename.replace(/\\\\/g, '/');\n filename = this.removeBasepath(filename);\n return (this._sourceMapRootpath || '') + filename;\n }\n\n add(chunk, fileInfo, index, mapLines) {\n\n // ignore adding empty strings\n if (!chunk) {\n return;\n }\n\n let lines, sourceLines, columns, sourceColumns, i;\n\n if (fileInfo && fileInfo.filename) {\n let inputSource = this._contentsMap[fileInfo.filename];\n\n // remove vars/banner added to the top of the file\n if (this._contentsIgnoredCharsMap[fileInfo.filename]) {\n // adjust the index\n index -= this._contentsIgnoredCharsMap[fileInfo.filename];\n if (index < 0) { index = 0; }\n // adjust the source\n inputSource = inputSource.slice(this._contentsIgnoredCharsMap[fileInfo.filename]);\n }\n\n /** \n * ignore empty content, or failsafe\n * if contents map is incorrect\n */\n if (inputSource === undefined) {\n this._css.push(chunk);\n return;\n }\n\n inputSource = inputSource.substring(0, index);\n sourceLines = inputSource.split('\\n');\n sourceColumns = sourceLines[sourceLines.length - 1];\n }\n\n lines = chunk.split('\\n');\n columns = lines[lines.length - 1];\n\n if (fileInfo && fileInfo.filename) {\n if (!mapLines) {\n this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + 1, column: this._column},\n original: { line: sourceLines.length, column: sourceColumns.length},\n source: this.normalizeFilename(fileInfo.filename)});\n } else {\n for (i = 0; i < lines.length; i++) {\n this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + i + 1, column: i === 0 ? this._column : 0},\n original: { line: sourceLines.length + i, column: i === 0 ? sourceColumns.length : 0},\n source: this.normalizeFilename(fileInfo.filename)});\n }\n }\n }\n\n if (lines.length === 1) {\n this._column += columns.length;\n } else {\n this._lineNumber += lines.length - 1;\n this._column = columns.length;\n }\n\n this._css.push(chunk);\n }\n\n isEmpty() {\n return this._css.length === 0;\n }\n\n toCSS(context) {\n this._sourceMapGenerator = new this._sourceMapGeneratorConstructor({ file: this._outputFilename, sourceRoot: null });\n\n if (this._outputSourceFiles) {\n for (const filename in this._contentsMap) {\n if (this._contentsMap.hasOwnProperty(filename)) {\n let source = this._contentsMap[filename];\n if (this._contentsIgnoredCharsMap[filename]) {\n source = source.slice(this._contentsIgnoredCharsMap[filename]);\n }\n this._sourceMapGenerator.setSourceContent(this.normalizeFilename(filename), source);\n }\n }\n }\n\n this._rootNode.genCSS(context, this);\n\n if (this._css.length > 0) {\n let sourceMapURL;\n const sourceMapContent = JSON.stringify(this._sourceMapGenerator.toJSON());\n\n if (this.sourceMapURL) {\n sourceMapURL = this.sourceMapURL;\n } else if (this._sourceMapFilename) {\n sourceMapURL = this._sourceMapFilename;\n }\n this.sourceMapURL = sourceMapURL;\n\n this.sourceMap = sourceMapContent;\n }\n\n return this._css.join('');\n }\n }\n\n return SourceMapOutput;\n};\n","import contexts from './contexts';\nimport Parser from './parser/parser';\nimport LessError from './less-error';\nimport * as utils from './utils';\nimport logger from './logger';\n\nexport default function(environment) {\n // FileInfo = {\n // 'rewriteUrls' - option - whether to adjust URL's to be relative\n // 'filename' - full resolved filename of current file\n // 'rootpath' - path to append to normal URLs for this node\n // 'currentDirectory' - path to the current file, absolute\n // 'rootFilename' - filename of the base file\n // 'entryPath' - absolute path to the entry file\n // 'reference' - whether the file should not be output and only output parts that are referenced\n\n class ImportManager {\n constructor(less, context, rootFileInfo) {\n this.less = less;\n this.rootFilename = rootFileInfo.filename;\n this.paths = context.paths || []; // Search paths, when importing\n this.contents = {}; // map - filename to contents of all the files\n this.contentsIgnoredChars = {}; // map - filename to lines at the beginning of each file to ignore\n this.mime = context.mime;\n this.error = null;\n this.context = context;\n // Deprecated? Unused outside of here, could be useful.\n this.queue = []; // Files which haven't been imported yet\n this.files = {}; // Holds the imported parse trees.\n }\n\n /**\n * Add an import to be imported\n * @param path - the raw path\n * @param tryAppendExtension - whether to try appending a file extension (.less or .js if the path has no extension)\n * @param currentFileInfo - the current file info (used for instance to work out relative paths)\n * @param importOptions - import options\n * @param callback - callback for when it is imported\n */\n push(path, tryAppendExtension, currentFileInfo, importOptions, callback) {\n const importManager = this, pluginLoader = this.context.pluginManager.Loader;\n\n this.queue.push(path);\n\n const fileParsedFunc = function (e, root, fullPath) {\n importManager.queue.splice(importManager.queue.indexOf(path), 1); // Remove the path from the queue\n\n const importedEqualsRoot = fullPath === importManager.rootFilename;\n if (importOptions.optional && e) {\n callback(null, {rules:[]}, false, null);\n logger.info(`The file ${fullPath} was skipped because it was not found and the import was marked optional.`);\n }\n else {\n // Inline imports aren't cached here.\n // If we start to cache them, please make sure they won't conflict with non-inline imports of the\n // same name as they used to do before this comment and the condition below have been added.\n if (!importManager.files[fullPath] && !importOptions.inline) {\n importManager.files[fullPath] = { root, options: importOptions };\n }\n if (e && !importManager.error) { importManager.error = e; }\n callback(e, root, importedEqualsRoot, fullPath);\n }\n };\n\n const newFileInfo = {\n rewriteUrls: this.context.rewriteUrls,\n entryPath: currentFileInfo.entryPath,\n rootpath: currentFileInfo.rootpath,\n rootFilename: currentFileInfo.rootFilename\n };\n\n const fileManager = environment.getFileManager(path, currentFileInfo.currentDirectory, this.context, environment);\n\n if (!fileManager) {\n fileParsedFunc({ message: `Could not find a file-manager for ${path}` });\n return;\n }\n\n const loadFileCallback = function(loadedFile) {\n let plugin;\n const resolvedFilename = loadedFile.filename;\n const contents = loadedFile.contents.replace(/^\\uFEFF/, '');\n\n // Pass on an updated rootpath if path of imported file is relative and file\n // is in a (sub|sup) directory\n //\n // Examples:\n // - If path of imported file is 'module/nav/nav.less' and rootpath is 'less/',\n // then rootpath should become 'less/module/nav/'\n // - If path of imported file is '../mixins.less' and rootpath is 'less/',\n // then rootpath should become 'less/../'\n newFileInfo.currentDirectory = fileManager.getPath(resolvedFilename);\n if (newFileInfo.rewriteUrls) {\n newFileInfo.rootpath = fileManager.join(\n (importManager.context.rootpath || ''),\n fileManager.pathDiff(newFileInfo.currentDirectory, newFileInfo.entryPath));\n\n if (!fileManager.isPathAbsolute(newFileInfo.rootpath) && fileManager.alwaysMakePathsAbsolute()) {\n newFileInfo.rootpath = fileManager.join(newFileInfo.entryPath, newFileInfo.rootpath);\n }\n }\n newFileInfo.filename = resolvedFilename;\n\n const newEnv = new contexts.Parse(importManager.context);\n\n newEnv.processImports = false;\n importManager.contents[resolvedFilename] = contents;\n\n if (currentFileInfo.reference || importOptions.reference) {\n newFileInfo.reference = true;\n }\n\n if (importOptions.isPlugin) {\n plugin = pluginLoader.evalPlugin(contents, newEnv, importManager, importOptions.pluginArgs, newFileInfo);\n if (plugin instanceof LessError) {\n fileParsedFunc(plugin, null, resolvedFilename);\n }\n else {\n fileParsedFunc(null, plugin, resolvedFilename);\n }\n } else if (importOptions.inline) {\n fileParsedFunc(null, contents, resolvedFilename);\n } else {\n // import (multiple) parse trees apparently get altered and can't be cached.\n // TODO: investigate why this is\n if (importManager.files[resolvedFilename]\n && !importManager.files[resolvedFilename].options.multiple\n && !importOptions.multiple) {\n\n fileParsedFunc(null, importManager.files[resolvedFilename].root, resolvedFilename);\n }\n else {\n new Parser(newEnv, importManager, newFileInfo).parse(contents, function (e, root) {\n fileParsedFunc(e, root, resolvedFilename);\n });\n }\n }\n };\n let loadedFile;\n let promise;\n const context = utils.clone(this.context);\n\n if (tryAppendExtension) {\n context.ext = importOptions.isPlugin ? '.js' : '.less';\n }\n\n if (importOptions.isPlugin) {\n context.mime = 'application/javascript';\n\n if (context.syncImport) {\n loadedFile = pluginLoader.loadPluginSync(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n } else {\n promise = pluginLoader.loadPlugin(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n }\n }\n else {\n if (context.syncImport) {\n loadedFile = fileManager.loadFileSync(path, currentFileInfo.currentDirectory, context, environment);\n } else {\n promise = fileManager.loadFile(path, currentFileInfo.currentDirectory, context, environment,\n (err, loadedFile) => {\n if (err) {\n fileParsedFunc(err);\n } else {\n loadFileCallback(loadedFile);\n }\n });\n }\n }\n if (loadedFile) {\n if (!loadedFile.filename) {\n fileParsedFunc(loadedFile);\n } else {\n loadFileCallback(loadedFile);\n }\n } else if (promise) {\n promise.then(loadFileCallback, fileParsedFunc);\n }\n }\n }\n\n return ImportManager;\n};\n","import * as utils from './utils';\n\nexport default function(environment, ParseTree, ImportManager) {\n const render = function (input, options, callback) {\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(this.options, {});\n }\n else {\n options = utils.copyOptions(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n return new Promise(function (resolve, reject) {\n render.call(self, input, options, function(err, output) {\n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n this.parse(input, options, function(err, root, imports, options) {\n if (err) { return callback(err); }\n\n let result;\n try {\n const parseTree = new ParseTree(root, imports);\n result = parseTree.toCSS(options);\n }\n catch (err) { return callback(err); }\n\n callback(null, result);\n });\n }\n };\n\n return render;\n};\n","import contexts from './contexts';\nimport Parser from './parser/parser';\nimport PluginManager from './plugin-manager';\nimport LessError from './less-error';\nimport * as utils from './utils';\n\nexport default function(environment, ParseTree, ImportManager) {\n const parse = function (input, options, callback) {\n\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(this.options, {});\n }\n else {\n options = utils.copyOptions(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n return new Promise(function (resolve, reject) {\n parse.call(self, input, options, function(err, output) {\n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n let context;\n let rootFileInfo;\n const pluginManager = new PluginManager(this, !options.reUsePluginManager);\n\n options.pluginManager = pluginManager;\n\n context = new contexts.Parse(options);\n\n if (options.rootFileInfo) {\n rootFileInfo = options.rootFileInfo;\n } else {\n const filename = options.filename || 'input';\n const entryPath = filename.replace(/[^\\/\\\\]*$/, '');\n rootFileInfo = {\n filename,\n rewriteUrls: context.rewriteUrls,\n rootpath: context.rootpath || '',\n currentDirectory: entryPath,\n entryPath,\n rootFilename: filename\n };\n // add in a missing trailing slash\n if (rootFileInfo.rootpath && rootFileInfo.rootpath.slice(-1) !== '/') {\n rootFileInfo.rootpath += '/';\n }\n }\n\n const imports = new ImportManager(this, context, rootFileInfo);\n this.importManager = imports;\n\n // TODO: allow the plugins to be just a list of paths or names\n // Do an async plugin queue like lessc\n\n if (options.plugins) {\n options.plugins.forEach(function(plugin) {\n let evalResult, contents;\n if (plugin.fileContent) {\n contents = plugin.fileContent.replace(/^\\uFEFF/, '');\n evalResult = pluginManager.Loader.evalPlugin(contents, context, imports, plugin.options, plugin.filename);\n if (evalResult instanceof LessError) {\n return callback(evalResult);\n }\n }\n else {\n pluginManager.addPlugin(plugin);\n }\n });\n }\n\n new Parser(context, imports, rootFileInfo)\n .parse(input, function (e, root) {\n if (e) { return callback(e); }\n callback(null, root, imports, options);\n }, options);\n }\n };\n return parse;\n};\n","// TODO: Add tests for browser @plugin\n/* global window */\n\nimport AbstractPluginLoader from '../less/environment/abstract-plugin-loader.js';\n\n/**\n * Browser Plugin Loader\n */\nconst PluginLoader = function(less) {\n this.less = less;\n // Should we shim this.require for browser? Probably not?\n};\n\nPluginLoader.prototype = Object.assign(new AbstractPluginLoader(), {\n loadPlugin(filename, basePath, context, environment, fileManager) {\n return new Promise((fulfill, reject) => {\n fileManager.loadFile(filename, basePath, context, environment)\n .then(fulfill).catch(reject);\n });\n }\n});\n\nexport default PluginLoader;\n\n","import * as utils from './utils';\nimport browser from './browser';\n\nexport default (window, less, options) => {\n\n function errorHTML(e, rootHref) {\n const id = `less-error-message:${utils.extractId(rootHref || '')}`;\n const template = '
  • {content}
  • ';\n const elem = window.document.createElement('div');\n let timer;\n let content;\n const errors = [];\n const filename = e.filename || rootHref;\n const filenameNoPath = filename.match(/([^\\/]+(\\?.*)?)$/)[1];\n\n elem.id = id;\n elem.className = 'less-error-message';\n\n content = `

    ${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'}` + \n `

    in ${filenameNoPath} `;\n\n const errorline = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\{content\\}/, e.extract[i]));\n }\n };\n\n if (e.line) {\n errorline(e, 0, '');\n errorline(e, 1, 'line');\n errorline(e, 2, '');\n content += `on line ${e.line}, column ${e.column + 1}:

      ${errors.join('')}
    `;\n }\n if (e.stack && (e.extract || options.logLevel >= 4)) {\n content += `
    Stack Trace
    ${e.stack.split('\\n').slice(1).join('
    ')}`;\n }\n elem.innerHTML = content;\n\n // CSS for error messages\n browser.createCSS(window.document, [\n '.less-error-message ul, .less-error-message li {',\n 'list-style-type: none;',\n 'margin-right: 15px;',\n 'padding: 4px 0;',\n 'margin: 0;',\n '}',\n '.less-error-message label {',\n 'font-size: 12px;',\n 'margin-right: 15px;',\n 'padding: 4px 0;',\n 'color: #cc7777;',\n '}',\n '.less-error-message pre {',\n 'color: #dd6666;',\n 'padding: 4px 0;',\n 'margin: 0;',\n 'display: inline-block;',\n '}',\n '.less-error-message pre.line {',\n 'color: #ff0000;',\n '}',\n '.less-error-message h3 {',\n 'font-size: 20px;',\n 'font-weight: bold;',\n 'padding: 15px 0 5px 0;',\n 'margin: 0;',\n '}',\n '.less-error-message a {',\n 'color: #10a',\n '}',\n '.less-error-message .error {',\n 'color: red;',\n 'font-weight: bold;',\n 'padding-bottom: 2px;',\n 'border-bottom: 1px dashed red;',\n '}'\n ].join('\\n'), { title: 'error-message' });\n\n elem.style.cssText = [\n 'font-family: Arial, sans-serif',\n 'border: 1px solid #e00',\n 'background-color: #eee',\n 'border-radius: 5px',\n '-webkit-border-radius: 5px',\n '-moz-border-radius: 5px',\n 'color: #e00',\n 'padding: 15px',\n 'margin-bottom: 15px'\n ].join(';');\n\n if (options.env === 'development') {\n timer = setInterval(() => {\n const document = window.document;\n const body = document.body;\n if (body) {\n if (document.getElementById(id)) {\n body.replaceChild(elem, document.getElementById(id));\n } else {\n body.insertBefore(elem, body.firstChild);\n }\n clearInterval(timer);\n }\n }, 10);\n }\n }\n\n function removeErrorHTML(path) {\n const node = window.document.getElementById(`less-error-message:${utils.extractId(path)}`);\n if (node) {\n node.parentNode.removeChild(node);\n }\n }\n\n function removeErrorConsole(path) {\n // no action\n }\n\n function removeError(path) {\n if (!options.errorReporting || options.errorReporting === 'html') {\n removeErrorHTML(path);\n } else if (options.errorReporting === 'console') {\n removeErrorConsole(path);\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('remove', path);\n }\n }\n\n function errorConsole(e, rootHref) {\n const template = '{line} {content}';\n const filename = e.filename || rootHref;\n const errors = [];\n let content = `${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'} in ${filename}`;\n\n const errorline = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\{content\\}/, e.extract[i]));\n }\n };\n\n if (e.line) {\n errorline(e, 0, '');\n errorline(e, 1, 'line');\n errorline(e, 2, '');\n content += ` on line ${e.line}, column ${e.column + 1}:\\n${errors.join('\\n')}`;\n }\n if (e.stack && (e.extract || options.logLevel >= 4)) {\n content += `\\nStack Trace\\n${e.stack}`;\n }\n less.logger.error(content);\n }\n\n function error(e, rootHref) {\n if (!options.errorReporting || options.errorReporting === 'html') {\n errorHTML(e, rootHref);\n } else if (options.errorReporting === 'console') {\n errorConsole(e, rootHref);\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('add', e, rootHref);\n }\n }\n\n return {\n add: error,\n remove: removeError\n };\n};\n","/**\n * Kicks off less and compiles any stylesheets\n * used in the browser distributed version of less\n * to kick-start less using the browser api\n */\n/* global window, document */\n\nimport defaultOptions from '../less/default-options';\nimport addDefaultOptions from './add-default-options';\nimport root from './index';\n\nconst options = defaultOptions();\n\nif (window.less) {\n for (const key in window.less) {\n if (window.less.hasOwnProperty(key)) {\n options[key] = window.less[key];\n }\n }\n}\naddDefaultOptions(window, options);\n\noptions.plugins = options.plugins || [];\n\nif (window.LESS_PLUGINS) {\n options.plugins = options.plugins.concat(window.LESS_PLUGINS);\n}\n\nconst less = root(window, options);\nexport default less;\n\nwindow.less = less;\n\nlet css;\nlet head;\nlet style;\n\n// Always restore page visibility\nfunction resolveOrReject(data) {\n if (data.filename) {\n console.warn(data);\n }\n if (!options.async) {\n head.removeChild(style);\n }\n}\n\nif (options.onReady) {\n if (/!watch/.test(window.location.hash)) {\n less.watch();\n }\n // Simulate synchronous stylesheet loading by hiding page rendering\n if (!options.async) {\n css = 'body { display: none !important }';\n head = document.head || document.getElementsByTagName('head')[0];\n style = document.createElement('style');\n\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n\n head.appendChild(style);\n }\n less.registerStylesheetsImmediately();\n less.pageLoadFinished = less.refresh(less.env === 'development').then(resolveOrReject, resolveOrReject);\n}\n","// Export a new default each time\nexport default function() {\n return {\n /* Inline Javascript - @plugin still allowed */\n javascriptEnabled: false,\n\n /* Outputs a makefile import dependency list to stdout. */\n depends: false,\n\n /* (DEPRECATED) Compress using less built-in compression. \n * This does an okay job but does not utilise all the tricks of \n * dedicated css compression. */\n compress: false,\n\n /* Runs the less parser and just reports errors without any output. */\n lint: false,\n\n /* Sets available include paths.\n * If the file in an @import rule does not exist at that exact location, \n * less will look for it at the location(s) passed to this option. \n * You might use this for instance to specify a path to a library which \n * you want to be referenced simply and relatively in the less files. */\n paths: [],\n\n /* color output in the terminal */\n color: true,\n\n /* The strictImports controls whether the compiler will allow an @import inside of either \n * @media blocks or (a later addition) other selector blocks.\n * See: https://github.com/less/less.js/issues/656 */\n strictImports: false,\n\n /* Allow Imports from Insecure HTTPS Hosts */\n insecure: false,\n\n /* Allows you to add a path to every generated import and url in your css. \n * This does not affect less import statements that are processed, just ones \n * that are left in the output css. */\n rootpath: '',\n\n /* By default URLs are kept as-is, so if you import a file in a sub-directory \n * that references an image, exactly the same URL will be output in the css. \n * This option allows you to re-write URL's in imported files so that the \n * URL is always relative to the base imported file */\n rewriteUrls: false,\n\n /* How to process math \n * 0 always - eagerly try to solve all operations\n * 1 parens-division - require parens for division \"/\"\n * 2 parens | strict - require parens for all operations\n * 3 strict-legacy - legacy strict behavior (super-strict)\n */\n math: 1,\n\n /* Without this option, less attempts to guess at the output unit when it does maths. */\n strictUnits: false,\n\n /* Effectively the declaration is put at the top of your base Less file, \n * meaning it can be used but it also can be overridden if this variable \n * is defined in the file. */\n globalVars: null,\n\n /* As opposed to the global variable option, this puts the declaration at the\n * end of your base file, meaning it will override anything defined in your Less file. */\n modifyVars: null,\n\n /* This option allows you to specify a argument to go on to every URL. */\n urlArgs: ''\n }\n};","import {addDataAttr} from './utils';\nimport browser from './browser';\n\nexport default (window, options) => {\n\n // use options from the current script tag data attribues\n addDataAttr(options, browser.currentScript(window));\n\n if (options.isFileProtocol === undefined) {\n options.isFileProtocol = /^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(window.location.protocol);\n }\n\n // Load styles asynchronously (default: false)\n //\n // This is set to `false` by default, so that the body\n // doesn't start loading before the stylesheets are parsed.\n // Setting this to `true` can result in flickering.\n //\n options.async = options.async || false;\n options.fileAsync = options.fileAsync || false;\n\n // Interval between watch polls\n options.poll = options.poll || (options.isFileProtocol ? 1000 : 1500);\n\n options.env = options.env || (window.location.hostname == '127.0.0.1' ||\n window.location.hostname == '0.0.0.0' ||\n window.location.hostname == 'localhost' ||\n (window.location.port &&\n window.location.port.length > 0) ||\n options.isFileProtocol ? 'development'\n : 'production');\n\n const dumpLineNumbers = /!dumpLineNumbers:(comments|mediaquery|all)/.exec(window.location.hash);\n if (dumpLineNumbers) {\n options.dumpLineNumbers = dumpLineNumbers[1];\n }\n\n if (options.useFileCache === undefined) {\n options.useFileCache = true;\n }\n\n if (options.onReady === undefined) {\n options.onReady = true;\n }\n\n if (options.relativeUrls) {\n options.rewriteUrls = 'all';\n }\n};\n","//\n// index.js\n// Should expose the additional browser functions on to the less object\n//\nimport {addDataAttr} from './utils';\nimport lessRoot from '../less';\nimport browser from './browser';\nimport FM from './file-manager';\nimport PluginLoader from './plugin-loader';\nimport LogListener from './log-listener';\nimport ErrorReporting from './error-reporting';\nimport Cache from './cache';\nimport ImageSize from './image-size';\n\nexport default (window, options) => {\n const document = window.document;\n const less = lessRoot();\n\n less.options = options;\n const environment = less.environment;\n const FileManager = FM(options, less.logger);\n const fileManager = new FileManager();\n environment.addFileManager(fileManager);\n less.FileManager = FileManager;\n less.PluginLoader = PluginLoader;\n\n LogListener(less, options);\n const errors = ErrorReporting(window, less, options);\n const cache = less.cache = options.cache || Cache(window, options, less.logger);\n ImageSize(less.environment);\n\n // Setup user functions - Deprecate?\n if (options.functions) {\n less.functions.functionRegistry.addMultiple(options.functions);\n }\n\n const typePattern = /^text\\/(x-)?less$/;\n\n function clone(obj) {\n const cloned = {};\n for (const prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n cloned[prop] = obj[prop];\n }\n }\n return cloned;\n }\n\n // only really needed for phantom\n function bind(func, thisArg) {\n const curryArgs = Array.prototype.slice.call(arguments, 2);\n return function() {\n const args = curryArgs.concat(Array.prototype.slice.call(arguments, 0));\n return func.apply(thisArg, args);\n };\n }\n\n function loadStyles(modifyVars) {\n const styles = document.getElementsByTagName('style');\n let style;\n\n for (let i = 0; i < styles.length; i++) {\n style = styles[i];\n if (style.type.match(typePattern)) {\n const instanceOptions = clone(options);\n instanceOptions.modifyVars = modifyVars;\n const lessText = style.innerHTML || '';\n instanceOptions.filename = document.location.href.replace(/#.*$/, '');\n\n /* jshint loopfunc:true */\n // use closure to store current style\n less.render(lessText, instanceOptions,\n bind((style, e, result) => {\n if (e) {\n errors.add(e, 'inline');\n } else {\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = result.css;\n } else {\n style.innerHTML = result.css;\n }\n }\n }, null, style));\n }\n }\n }\n\n function loadStyleSheet(sheet, callback, reload, remaining, modifyVars) {\n\n const instanceOptions = clone(options);\n addDataAttr(instanceOptions, sheet);\n instanceOptions.mime = sheet.type;\n\n if (modifyVars) {\n instanceOptions.modifyVars = modifyVars;\n }\n\n function loadInitialFileCallback(loadedFile) {\n const data = loadedFile.contents;\n const path = loadedFile.filename;\n const webInfo = loadedFile.webInfo;\n\n const newFileInfo = {\n currentDirectory: fileManager.getPath(path),\n filename: path,\n rootFilename: path,\n rewriteUrls: instanceOptions.rewriteUrls\n };\n\n newFileInfo.entryPath = newFileInfo.currentDirectory;\n newFileInfo.rootpath = instanceOptions.rootpath || newFileInfo.currentDirectory;\n\n if (webInfo) {\n webInfo.remaining = remaining;\n\n const css = cache.getCSS(path, webInfo, instanceOptions.modifyVars);\n if (!reload && css) {\n webInfo.local = true;\n callback(null, css, data, sheet, webInfo, path);\n return;\n }\n\n }\n\n // TODO add tests around how this behaves when reloading\n errors.remove(path);\n\n instanceOptions.rootFileInfo = newFileInfo;\n less.render(data, instanceOptions, (e, result) => {\n if (e) {\n e.href = path;\n callback(e);\n } else {\n cache.setCSS(sheet.href, webInfo.lastModified, instanceOptions.modifyVars, result.css);\n callback(null, result.css, data, sheet, webInfo, path);\n }\n });\n }\n\n fileManager.loadFile(sheet.href, null, instanceOptions, environment)\n .then(loadedFile => {\n loadInitialFileCallback(loadedFile);\n }).catch(err => {\n console.log(err);\n callback(err);\n });\n\n }\n\n function loadStyleSheets(callback, reload, modifyVars) {\n for (let i = 0; i < less.sheets.length; i++) {\n loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1), modifyVars);\n }\n }\n\n function initRunningMode() {\n if (less.env === 'development') {\n less.watchTimer = setInterval(() => {\n if (less.watchMode) {\n fileManager.clearFileCache();\n loadStyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n } else if (css) {\n browser.createCSS(window.document, css, sheet);\n }\n });\n }\n }, options.poll);\n }\n }\n\n //\n // Watch mode\n //\n less.watch = function () {\n if (!less.watchMode ) {\n less.env = 'development';\n initRunningMode();\n }\n this.watchMode = true;\n return true;\n };\n\n less.unwatch = function () {clearInterval(less.watchTimer); this.watchMode = false; return false; };\n\n //\n // Synchronously get all tags with the 'rel' attribute set to\n // \"stylesheet/less\".\n //\n less.registerStylesheetsImmediately = () => {\n const links = document.getElementsByTagName('link');\n less.sheets = [];\n\n for (let i = 0; i < links.length; i++) {\n if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) &&\n (links[i].type.match(typePattern)))) {\n less.sheets.push(links[i]);\n }\n }\n };\n\n //\n // Asynchronously get all tags with the 'rel' attribute set to\n // \"stylesheet/less\", returning a Promise.\n //\n less.registerStylesheets = () => new Promise((resolve, reject) => {\n less.registerStylesheetsImmediately();\n resolve();\n });\n\n //\n // With this function, it's possible to alter variables and re-render\n // CSS without reloading less-files\n //\n less.modifyVars = record => less.refresh(true, record, false);\n\n less.refresh = (reload, modifyVars, clearFileCache) => {\n if ((reload || clearFileCache) && clearFileCache !== false) {\n fileManager.clearFileCache();\n }\n return new Promise((resolve, reject) => {\n let startTime;\n let endTime;\n let totalMilliseconds;\n let remainingSheets;\n startTime = endTime = new Date();\n\n // Set counter for remaining unprocessed sheets\n remainingSheets = less.sheets.length;\n\n if (remainingSheets === 0) {\n\n endTime = new Date();\n totalMilliseconds = endTime - startTime;\n less.logger.info('Less has finished and no sheets were loaded.');\n resolve({\n startTime,\n endTime,\n totalMilliseconds,\n sheets: less.sheets.length\n });\n\n } else {\n // Relies on less.sheets array, callback seems to be guaranteed to be called for every element of the array\n loadStyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n reject(e);\n return;\n }\n if (webInfo.local) {\n less.logger.info(`Loading ${sheet.href} from cache.`);\n } else {\n less.logger.info(`Rendered ${sheet.href} successfully.`);\n }\n browser.createCSS(window.document, css, sheet);\n less.logger.info(`CSS for ${sheet.href} generated in ${new Date() - endTime}ms`);\n\n // Count completed sheet\n remainingSheets--;\n\n // Check if the last remaining sheet was processed and then call the promise\n if (remainingSheets === 0) {\n totalMilliseconds = new Date() - startTime;\n less.logger.info(`Less has finished. CSS generated in ${totalMilliseconds}ms`);\n resolve({\n startTime,\n endTime,\n totalMilliseconds,\n sheets: less.sheets.length\n });\n }\n endTime = new Date();\n }, reload, modifyVars);\n }\n\n loadStyles(modifyVars);\n });\n };\n\n less.refreshStyles = loadStyles;\n return less;\n};\n","export default (less, options) => {\n const logLevel_debug = 4;\n const logLevel_info = 3;\n const logLevel_warn = 2;\n const logLevel_error = 1;\n\n // The amount of logging in the javascript console.\n // 3 - Debug, information and errors\n // 2 - Information and errors\n // 1 - Errors\n // 0 - None\n // Defaults to 2\n options.logLevel = typeof options.logLevel !== 'undefined' ? options.logLevel : (options.env === 'development' ? logLevel_info : logLevel_error);\n\n if (!options.loggers) {\n options.loggers = [{\n debug: function(msg) {\n if (options.logLevel >= logLevel_debug) {\n console.log(msg);\n }\n },\n info: function(msg) {\n if (options.logLevel >= logLevel_info) {\n console.log(msg);\n }\n },\n warn: function(msg) {\n if (options.logLevel >= logLevel_warn) {\n console.warn(msg);\n }\n },\n error: function(msg) {\n if (options.logLevel >= logLevel_error) {\n console.error(msg);\n }\n }\n }];\n }\n for (let i = 0; i < options.loggers.length; i++) {\n less.logger.addListener(options.loggers[i]);\n }\n};\n","// Cache system is a bit outdated and could do with work\n\nexport default (window, options, logger) => {\n let cache = null;\n if (options.env !== 'development') {\n try {\n cache = (typeof window.localStorage === 'undefined') ? null : window.localStorage;\n } catch (_) {}\n }\n return {\n setCSS: function(path, lastModified, modifyVars, styles) {\n if (cache) {\n logger.info(`saving ${path} to cache.`);\n try {\n cache.setItem(path, styles);\n cache.setItem(`${path}:timestamp`, lastModified);\n if (modifyVars) {\n cache.setItem(`${path}:vars`, JSON.stringify(modifyVars));\n }\n } catch (e) {\n // TODO - could do with adding more robust error handling\n logger.error(`failed to save \"${path}\" to local storage for caching.`);\n }\n }\n },\n getCSS: function(path, webInfo, modifyVars) {\n const css = cache && cache.getItem(path);\n const timestamp = cache && cache.getItem(`${path}:timestamp`);\n let vars = cache && cache.getItem(`${path}:vars`);\n\n modifyVars = modifyVars || {};\n vars = vars || \"{}\"; // if not set, treat as the JSON representation of an empty object\n\n if (timestamp && webInfo.lastModified &&\n (new Date(webInfo.lastModified).valueOf() ===\n new Date(timestamp).valueOf()) &&\n JSON.stringify(modifyVars) === vars) {\n // Use local copy\n return css;\n }\n }\n };\n};\n","\nimport functionRegistry from './../less/functions/function-registry';\n\nexport default () => {\n function imageSize() {\n throw {\n type: 'Runtime',\n message: 'Image size functions are not supported in browser version of less'\n };\n }\n\n const imageFunctions = {\n 'image-size': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n },\n 'image-width': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n },\n 'image-height': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n }\n };\n\n functionRegistry.addMultiple(imageFunctions);\n};\n"],"names":["extractId","href","replace","addDataAttr","options","tag","opt","dataset","hasOwnProperty","JSON","parse","_","document","styles","sheet","id","title","utils.extractId","oldStyleNode","getElementById","keepOldStyleNode","styleNode","createElement","setAttribute","media","styleSheet","appendChild","createTextNode","childNodes","length","firstChild","nodeValue","head","getElementsByTagName","nextEl","nextSibling","parentNode","insertBefore","removeChild","cssText","e","Error","window","scripts","currentScript","error","msg","this","_fireEvent","warn","info","debug","addListener","listener","_listeners","push","removeListener","i","splice","type","logFunction","externalEnvironment","fileManagers","requiredFunctions","functions","concat","propName","environmentFunc","bind","Environment","filename","currentDirectory","environment","isSync","logger","pluginManager","getFileManagers","fileManager","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","darkgrey","darkgreen","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","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","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","m","cm","mm","in","px","pt","pc","duration","s","ms","angle","rad","Math","PI","deg","grad","turn","colors","unitConversions","parent","visibilityBlocks","undefined","nodeVisible","rootNode","parsed","self","Object","defineProperty","get","fileInfo","getIndex","Node","nodes","set","node","Array","isArray","forEach","_index","_fileInfo","context","strs","genCSS","add","chunk","index","isEmpty","join","output","value","visitor","visit","op","a","b","precision","numPrecision","Number","toFixed","compare","Color","rgb","originalForm","match","map","c","parseInt","alpha","split","clamp","v","max","min","toHex","round","toString","prototype","assign","luma","r","g","pow","toCSS","doNotCompress","color","colorFunction","compress","args","fround","indexOf","toHSL","h","l","toRGB","splitcolor","operate","other","_operate","d","toHSV","toARGB","x","fromKeyword","keyword","key","toLowerCase","slice","Paren","eval","_noSpaceCombinators"," ","|","Combinator","emptyOrWhitespace","trim","spaceOrEmpty","Element","combinator","isVariable","currentFileInfo","visibilityInfo","copyVisibilityInfo","setParent","accept","clone","firstSelector","charAt","ALWAYS","PARENS_DIVISION","PARENS","RewriteUrls","getType","payload","call","copy","target","constructor","getPrototypeOf","il","arguments","k","j","jl","__spreadArrays","getOwnPropertyNames","getOwnPropertySymbols","reduce","carry","props","includes","newVal","originalObject","includeNonenumerable","propType","propertyIsEnumerable","enumerable","writable","configurable","assignProp","nonenumerable","getLocation","inputStream","n","line","column","copyArray","arr","obj","cloned","prop","defaults","obj1","obj2","newObj","_defaults","defaults_1","copyOptions","opts","strictMath","math","Constants.Math","relativeUrls","rewriteUrls","Constants.RewriteUrls","flattenArray","result","length_1","anonymousFunc","LessError","fileContentMap","currentFilename","message","stack","input","contents","loc","utils.getLocation","col","callLine","lines","found","func","Function","lineAdjust","callExtract","extract","create","F","stylize","str","errorTxt","substr","Selector","elements","extendList","condition","evaldCondition","getElements","mixinElements_","visitArray","createDerived","newSelector","mediaEmpty","els","parseNode","err","imports","createEmptySelectors","el","sels","olen","len","mixinElements","shift","isJustParentSelector","extend","getIsOutput","Value","Keyword","True","False","Anonymous","mapLines","rulesetLike","allowRoot","isRulesetLike","Boolean","MATH","Declaration","name","important","merge","inline","variable","lastRule","prevMath","evaldValue","mathBypass","evalName","importantScope","importantResult","pop","makeImportant","ctx","lineSeparator","dumpLineNumbers","debugInfo","asComment","asMediaQuery","lineNumber","fileName","filenameWithProtocol","test","Comment","isLineComment","getDebugInfo","isSilent","isCompressed","contexts","copyFromOriginal","original","destination","propertiesToCopy","parseCopyProperties","Parse","paths","evalCopyProperties","isPathRelative","path","isPathLocalRelative","Eval","frames","enterCalc","calcStack","inCalc","exitCalc","inParenthesis","parensStack","outOfParenthesis","mathOn","isMathOn","pathRequiresRewrite","rewritePath","rootpath","newPath","normalizePath","segment","segments","reverse","makeRegistry","base","_data","addMultiple","keys","_this","getLocalFunctions","inherit","defaultFunc","value_","error_","reset","Ruleset","selectors","rules","strictImports","_lookups","_variables","_properties","isRuleset","selCnt","selector","hasVariable","hasOnePassingSelector","toParseSelectors","utils.flattenArray","rule","subRule","utils.copyArray","ruleset","originalRuleset","root","firstRoot","allowImports","functionRegistry","globalFunctionRegistry","ctxFrames","unshift","ctxSelectors","evalImports","rsRules","evalFirst","mediaBlockCount","mediaBlocks","filter","apply","resetCache","bubbleSelectors","importRules","matchArgs","matchCondition","lastSelector","_rulesets","variables","hash","vars","name_1","properties","name_2","decl","parseValue","property","lastDeclaration","toParse","transformDeclaration","nodes_1","rulesets","filtRules","prependRule","find","foundMixins","ruleNodes","tabLevel","sep","tabRuleStr","tabSetStr","charsetNodeIndex","importNodeIndex","isCharset","pathCnt","pathSubCnt","currentLastRule","isVisible","joinSelectors","joinSelector","createParenthesis","elementsToPak","originalElement","replacementParen","insideParent","createSelector","containedElement","element","addReplacementIntoPath","beginningPath","addPath","replacedElement","originalSelector","newSelectorPath","newJoinedSelector","parentEl","restOfPath","addAllReplacementsIntoPath","addPaths","mergeElementsOnToSelectors","sel","deriveSelector","deriveFrom","newPaths","replaceParentSelector","inSelector","currentElements","newSelectors","selectorsMultiplied","maybeSelector","hadParentSelector","nestedSelector","replaced","nestedPaths","replacedNewSelectors","concatenated","AtRule","isRooted","outputRuleset","mediaPathBackup","mediaBlocksBackup","mediaPath","ruleCnt","DetachedRuleset","callEval","Unit","numerator","denominator","backupUnit","sort","strictUnits","returnStr","is","unitString","toUpperCase","isLength","RegExp","isSingular","callback","usedUnits","group","mapUnit","groupName","atomicUnit","cancel","counter","count","Dimension","unit","parseFloat","isNaN","toColor","strValue","String","convertTo","unify","numericCompare","conversions","targetUnit","applyUnit","derivedConversions","Operation","operands","isSpaced","Expression","noSpacing","returnValue","parens","doubleParen","parensInOp","throwAwayComments","functionCaller","evalArgs","commentFilter","item","subNodes","Call","calc","currentMathContext","funcCaller","FunctionCaller","isValid","columnNumber","Variable","evaluating","frame","fun","Property","mergeRules","less","visitors","ToCSSVisitor","_mergeRules","vArr","Attribute","Quoted","content","escaped","quote","variableRegex","propRegex","containsVariables","that","iterativeReplace","regexp","replacementFnc","evaluatedValue","URL","val","isEvald","urlArgs","Media","features","evalTop","evalNested","multiMedia","permute","fragment","rest","Import","css","pathValue","getPath","isPlugin","reference","isVariableImport","evalForImport","evalPath","doEval","blocksVisibility","addVisibilityBlock","registry","skip","importedFilename","newImport","JsEvalNode","evaluateJavaScript","expression","evalContext","javascriptEnabled","jsify","toJS","JavaScript","string","Assignment","Condition","negate","lvalue","rvalue","UnicodeDescriptor","Negative","Extend","option","object_id","next_id","parent_ids","allowBefore","allowAfter","findSelfSelectors","selectorElements","selfElements","selfSelectors","VariableCall","detachedRuleset","NamespaceValue","ruleCall","lookups","substring","Definition","params","variadic","arity","optionalParameters","required","p","evalParams","mixinEnv","evaldArguments","varargs","arg","isNamedFound","argIndex","argsLength","evalCall","_arguments","mixinFrames","allArgsCnt","requiredArgsCnt","MixinCall","mixins","mixin","mixinPath","argValue","f","isRecursive","isOneFound","candidate","defaultResult","noArgumentsFilter","candidates","conditionResult","calcDefGroup","namespace","expand","MixinDefinition","format","newRules","_setVisibilityToReplacement","replacement","AbstractFileManager","lastIndexOf","ext","tryAppendExtension","basePath","laterPath","url","baseUrl","urlDirectories","baseUrlDirectories","urlParts","extractUrlParts","baseUrlParts","diff","hostPart","directories","urlPartsRegex","returner","rawDirectories","rawPath","fileUrl","require","AbstractPluginLoader","pluginOptions","pluginObj","localModule","shortname","FileManager","trySetOptions","use","exports","loader","tree","validatePlugin","minVersion","compareVersion","addPlugin","plugin","setOptions","version","versionToString","aVersion","bVersion","versionString","plugins","printUsage","_visitArgs","visitDeeper","_hasIndexed","_noop","implementation","_implementation","_visitInCache","_visitOutCache","indexNodeTypes","ticker","child","typeIndex","Visitor","nodeTypeIndex","fnName","impl","funcOut","visitArgs","newNode","isReplacing","cnt","nonReplacing","out","evald","flatten","nestedCnt","nestedItem","onSequencerEmpty","variableImports","_onSequencerEmpty","_currentDepth","ImportSequencer","importSequencer","importItem","isReady","tryRun","variableImport","ImportVisitor","importer","finish","_visitor","_importer","_finish","importCount","onceFileDetectionMap","recursionDetector","_sequencer","run","isFinished","visitImport","importNode","inlineCSS","importParent","addVariableImport","processImportNode","evaldImportNode","multiple","importMultiple","tryAppendLessExtension","onImported","sequencedOnImported","addImport","importedAtRoot","fullPath","importVisitor","isOptional","optional","duplicateImport","oldContext","visitDeclaration","declNode","visitDeclarationOut","visitAtRule","atRuleNode","visitAtRuleOut","visitMixinDefinition","mixinDefinitionNode","visitMixinDefinitionOut","visitRuleset","rulesetNode","visitRulesetOut","visitMedia","mediaNode","visitMediaOut","visible","SetTreeVisibilityVisitor","ensureVisibility","ensureInvisibility","allExtendsStack","ExtendFinderVisitor","allExtends","allSelectorsExtendList","extendOnEveryPath","selectorPath","selExtendList","allSelectorsExtend","foundExtends","firstExtendOnThisSelectorPath","ProcessExtendsVisitor","extendFinder","extendIndices","doExtendChaining","newRoot","checkExtendsForNonMatched","indices","hasFoundMatches","extendsList","extendsListTarget","iterationCount","extendIndex","targetExtendIndex","matches","targetExtend","newExtend","extendsToAdd","extendVisitor","findMatch","selfSelector","extendSelector","extendChainCount","selectorOne","selectorTwo","ruleNode","selectorNode","pathIndex","selectorsToAdd","extendedSelectors","haystackSelectorPath","haystackSelectorIndex","hackstackSelector","hackstackElementIndex","haystackElement","targetCombinator","potentialMatch","needleElements","potentialMatches","matched","initialCombinator","isElementValuesEqual","finished","endPathIndex","endPathElementIndex","elementValue1","elementValue2","replacementSelector","matchIndex","firstElement","newElements","currentSelectorPathIndex","currentSelectorPathElementIndex","currentValue","derived","newAllExtends","lastIndex","JoinSelectorVisitor","_context","CSSVisitorUtils","bodyRules","owner","thing","originalRules","containsSilentNonBlockedChild","compiledRulesBody","keepOnlyVisibleChilds","removeVisibilityBlock","hasVisibleSelector","utils","mixinNode","visitExtend","extendNode","visitComment","commentNode","resolveVisibility","visitAtRuleWithBody","visitAtRuleWithoutBody","visitAnonymous","anonymousNode","nodeRules","hasFakeRuleset","getBodyRules","charset","comment","checkValidNodes","isRoot","_compileRulesetPaths","nodeRuleCnt","_removeDuplicateRules","isVisibleRuleset","ruleList","ruleCache","ruleCSS","groups","groupsArr","result_1","space_1","comma_1","MarkVisibleSelectorsVisitor","ExtendVisitor","furthest","furthestPossibleErrorMessage","chunks","current","currentPos","saveStack","parserInput","skipWhitespace","nextChar","oldi","oldj","curr","endIndex","mem","inp","charCodeAt","autoCommentAbsorb","nextNewLine","text","commentStore","nextStarSlash","save","restore","possibleErrorMessage","state","forget","isWhitespace","offset","pos","code","$re","tok","exec","$char","$str","tokLength","$quoted","startChar","currentPosition","$parseUntil","testChar","returnVal","inComment","blockDepth","blockStack","parseGroups","startPos","lastPos","loop","char","expected","peek","peekChar","currentChar","prevChar","getInput","peekNotNumeric","start","chunkInput","failFunction","fail","lastOpening","lastOpeningParen","lastMultiComment","lastMultiCommentEndBrace","chunkerCurrentIndex","currentChunkStartIndex","cc","cc2","level","parenLevel","emitFrom","emitChunk","force","fromCharCode","chunker","end","furthestReachedEnd","furthestChar","Parser","parsers","getParserInput","expect","expectChar","parseList","currentIndex","returnNodes","parser","additionalData","globalVars","modifyVars","ignored","preText","serializeVars","preProcessors","getPreProcessors","process","banner","contentsIgnoredChars","primary","endInfo","processImports","extendRule","definition","declaration","variableCall","entities","atrule","foundSemiColon","mixinLookup","quoted","forceEscaped","isEscaped","customFuncCall","stop","ieAlpha","boolean","if","prevArgs","isSemiColonSeparated","argsComma","argsSemiColon","assignment","literal","dimension","unicodeDescriptor","entity","ch","variableCurly","curly","propertyCurly","colorKeyword","ud","javascript","js","escape","parsedName","inValue","ruleLookups","isRule","getLookup","hasParens","elem","elemIndex","re","isCall","expressionContainsNamed","nameLoop","expressions","hasSep","cond","argInfo","conditions","block","lookupValue","attribute","slashedCombinator","isLess","when","blockRuleset","hasDR","ruleProperty","permissiveValue","anonymousValue","untilTokens","done","testCurrentChar","import","dir","importOptions","mediaFeatures","o","optionName","importOption","mediaFeature","pluginArgs","nonVendorSpecificName","hasIdentifier","hasExpression","hasUnknown","hasBlock","sub","addition","multiplication","operation","operand","needsParens","logical","next","conditionAnd","negatedCondition","parenthesisCondition","atomicCondition","body","me","tryConditionFollowedByParenthesis","delim","simpleProperty","If","trueValue","falseValue","isdefined","colorFunctions","hsla","origColor","hsl","number","rgba","size","m1_1","m2_1","hue","hsv","hsva","vs","floor","perm","saturation","lightness","hsvhue","hsvsaturation","hsvvalue","luminance","saturate","amount","method","desaturate","lighten","darken","fadein","fadeout","fade","spin","mix","color1","color2","weight","w","w1","w2","greyscale","contrast","dark","light","threshold","t","argb","tint","shade","colorBlend","mode","cb","cs","ar","cr","ab","as","colorBlendModeFunctions","multiply","screen","overlay","softlight","sqrt","hardlight","difference","abs","exclusion","average","negation","getItemsFromNode","_SELF","~","_i","expr","values","range","step","from","to","stepValue","list","each","rs","iterator","tryEval","Quote","valueName","keyName","indexName","MathHelper","fn","mathFunctions","ceil","sin","cos","atan","asin","acos","mathHelper","fraction","num","minMax","isMin","currentUnified","referenceUnified","unitStatic","unitClone","order","convert","pi","mod","y","percentage","evaluated","encodeURI","pattern","flags","%","token","encodeURIComponent","isa","Type","isunit","isruleset","iscolor","isnumber","isstring","iskeyword","isurl","ispixel","ispercentage","isem","get-unit","colorBlending","fallback","functionThis","data-uri","mimetypeNode","filePathNode","mimetype","filePath","entryPath","fragmentStart","utils.clone","rawBuffer","getFileManager","useBase64","mimeLookup","charsetLookup","fileSync","loadFileSync","buf","encodeBase64","uri","dataUri","svg-gradient","direction","stops","gradientDirectionSvg","position","positionValue","gradientType","rectangleDimension","renderEnv","directionValue","throwArgumentDescriptor","types","evaldRoot","evalEnv","visitorIterator","preEvalVisitors","first","isPreEvalVisitor","isPreVisitor","pm","postProcessors","installedPlugins","pluginCache","Loader","PluginLoader","PluginManager","install","preProcessor","priority","indexToInsertAt","postProcessor","manager","PluginManagerFactory","newFactory","major","minor","patch","pre","build","sourceMapOutput","sourceMapBuilder","parseTree","importManager","SourceMapBuilder","ParseTree","transformTree","toCSSOptions","sourceMap","getPostProcessors","file","getExternalSourceMap","files","rootFilename","SourceMapOutput","contentsIgnoredCharsMap","contentsMap","sourceMapFilename","sourceMapURL","outputFilename","sourceMapOutputFilename","sourceMapBasepath","sourceMapRootpath","outputSourceFiles","sourceMapGenerator","sourceMapFileInline","disableSourcemapAnnotation","sourceMapInputFilename","normalizeFilename","removeBasepath","getCSSAppendage","_css","_rootNode","_contentsMap","_contentsIgnoredCharsMap","_sourceMapFilename","_outputFilename","_sourceMapBasepath","_sourceMapRootpath","_outputSourceFiles","_sourceMapGeneratorConstructor","getSourceMapGenerator","_lineNumber","_column","sourceLines","columns","sourceColumns","inputSource","_sourceMapGenerator","addMapping","generated","source","sourceRoot","setSourceContent","sourceMapContent","stringify","toJSON","rootFileInfo","mime","queue","ImportManager","pluginLoader","fileParsedFunc","importedEqualsRoot","newFileInfo","loadedFile","promise","loadFileCallback","resolvedFilename","pathDiff","isPathAbsolute","alwaysMakePathsAbsolute","newEnv","evalPlugin","syncImport","loadPluginSync","loadPlugin","loadFile","then","render","utils.copyOptions","self_1","Promise","resolve","reject","Render","context_1","pluginManager_1","reUsePluginManager","imports_1","evalResult","fileContent","parseVersion","initial","data","ctor","api","fileCache","doXHR","errback","xhr","XMLHttpRequest","async","isFileProtocol","fileAsync","handleResponse","status","responseText","getResponseHeader","overrideMimeType","open","setRequestHeader","send","onreadystatechange","readyState","supports","clearFileCache","location","useFileCache","lessText","webInfo","lastModified","Date","log","fulfill","catch","rootHref","errorReporting","errors","errorline","classname","logLevel","errorConsole","timer","filenameNoPath","className","innerHTML","browser","style","env","setInterval","replaceChild","clearInterval","errorHTML","remove","removeErrorHTML","depends","lint","insecure","protocol","poll","hostname","port","onReady","addDefaultOptions","LESS_PLUGINS","lessRoot","FM","addFileManager","loggers","console","LogListener","ErrorReporting","cache","localStorage","setCSS","setItem","getCSS","getItem","timestamp","valueOf","Cache","imageSize","imageFunctions","image-size","image-width","image-height","ImageSize","typePattern","thisArg","curryArgs","loadStyles","instanceOptions","loadStyleSheet","reload","remaining","local","loadInitialFileCallback","loadStyleSheets","sheets","watch","watchMode","watchTimer","unwatch","registerStylesheetsImmediately","links","rel","registerStylesheets","record","refresh","startTime","endTime","totalMilliseconds","remainingSheets","refreshStyles","resolveOrReject","pageLoadFinished"],"mappings":";;;;;;;;;oMACgBA,EAAUC,GACtB,OAAOA,EAAKC,QAAQ,sBAAuB,IACtCA,QAAQ,uBAAwB,IAChCA,QAAQ,MAAO,IACfA,QAAQ,eAAgB,IACxBA,QAAQ,aAAc,KACtBA,QAAQ,MAAO,cAGRC,EAAYC,EAASC,GACjC,IAAK,IAAMC,KAAOD,EAAIE,QAClB,GAAIF,EAAIE,QAAQC,eAAeF,GAC3B,GAAY,QAARA,GAAyB,oBAARA,GAAqC,aAARA,GAA8B,mBAARA,EACpEF,EAAQE,GAAOD,EAAIE,QAAQD,QAE3B,IACIF,EAAQE,GAAOG,KAAKC,MAAML,EAAIE,QAAQD,IAE1C,MAAOK,WChBR,SAAUC,EAAUC,EAAQC,GAEnC,IAAMb,EAAOa,EAAMb,MAAQ,GAGrBc,EAAK,SAAQD,EAAME,OAASC,EAAgBhB,IAG5CiB,EAAeN,EAASO,eAAeJ,GACzCK,GAAmB,EAGjBC,EAAYT,EAASU,cAAc,SACzCD,EAAUE,aAAa,OAAQ,YAC3BT,EAAMU,OACNH,EAAUE,aAAa,QAAST,EAAMU,OAE1CH,EAAUN,GAAKA,EAEVM,EAAUI,aACXJ,EAAUK,YAAYd,EAASe,eAAed,IAG9CO,EAAqC,OAAjBF,GAAyBA,EAAaU,WAAWC,OAAS,GAAKR,EAAUO,WAAWC,OAAS,GAC7GX,EAAaY,WAAWC,YAAcV,EAAUS,WAAWC,WAGnE,IAAMC,EAAOpB,EAASqB,qBAAqB,QAAQ,GAInD,GAAqB,OAAjBf,IAA8C,IAArBE,EAA4B,CACrD,IAAMc,EAASpB,GAASA,EAAMqB,aAAe,KACzCD,EACAA,EAAOE,WAAWC,aAAahB,EAAWa,GAE1CF,EAAKN,YAAYL,GAUzB,GAPIH,IAAqC,IAArBE,GAChBF,EAAakB,WAAWE,YAAYpB,GAMpCG,EAAUI,WACV,IACIJ,EAAUI,WAAWc,QAAU1B,EACjC,MAAO2B,GACL,MAAM,IAAIC,MAAM,6CAIb,SAASC,GACpB,IAEUC,EAFJ/B,EAAW8B,EAAO9B,SACxB,OAAOA,EAASgC,gBACND,EAAU/B,EAASqB,qBAAqB,WAC/BU,EAAQd,OAAS,MC7D7B,CACXgB,MAAO,SAASC,GACZC,KAAKC,WAAW,QAASF,IAE7BG,KAAM,SAASH,GACXC,KAAKC,WAAW,OAAQF,IAE5BI,KAAM,SAASJ,GACXC,KAAKC,WAAW,OAAQF,IAE5BK,MAAO,SAASL,GACZC,KAAKC,WAAW,QAASF,IAE7BM,YAAa,SAASC,GAClBN,KAAKO,WAAWC,KAAKF,IAEzBG,eAAgB,SAASH,GACrB,IAAK,IAAII,EAAI,EAAGA,EAAIV,KAAKO,WAAWzB,OAAQ4B,IACxC,GAAIV,KAAKO,WAAWG,KAAOJ,EAEvB,YADAN,KAAKO,WAAWI,OAAOD,EAAG,IAKtCT,WAAY,SAASW,EAAMb,GACvB,IAAK,IAAIW,EAAI,EAAGA,EAAIV,KAAKO,WAAWzB,OAAQ4B,IAAK,CAC7C,IAAMG,EAAcb,KAAKO,WAAWG,GAAGE,GACnCC,GACAA,EAAYd,KAIxBQ,WAAY,iBCxBZ,WAAYO,EAAqBC,GAC7Bf,KAAKe,aAAeA,GAAgB,GACpCD,EAAsBA,GAAuB,GAM7C,IAJA,IACME,EAAoB,GACpBC,EAAYD,EAAkBE,OAFV,CAAC,eAAgB,aAAc,gBAAiB,0BAIjER,EAAI,EAAGA,EAAIO,EAAUnC,OAAQ4B,IAAK,CACvC,IAAMS,EAAWF,EAAUP,GACrBU,EAAkBN,EAAoBK,GACxCC,EACApB,KAAKmB,GAAYC,EAAgBC,KAAKP,GAC/BJ,EAAIM,EAAkBlC,QAC7BkB,KAAKE,KAAK,8CAA8CiB,IAkCxE,OA7BIG,2BAAA,SAAeC,EAAUC,EAAkBnE,EAASoE,EAAaC,GAExDH,GACDI,EAAOzB,KAAK,kFAEQ,MAApBsB,GACAG,EAAOzB,KAAK,qFAGhB,IAAIa,EAAef,KAAKe,aACpB1D,EAAQuE,gBACRb,EAAe,GAAGG,OAAOH,GAAcG,OAAO7D,EAAQuE,cAAcC,oBAExE,IAAK,IAAInB,EAAIK,EAAajC,OAAS,EAAG4B,GAAK,EAAIA,IAAK,CAChD,IAAMoB,EAAcf,EAAaL,GACjC,GAAIoB,EAAYJ,EAAS,eAAiB,YAAYH,EAAUC,EAAkBnE,EAASoE,GACvF,OAAOK,EAGf,OAAO,MAGXR,2BAAA,SAAeQ,GACX9B,KAAKe,aAAaP,KAAKsB,IAG3BR,8BAAA,WACItB,KAAKe,aAAe,WCtDb,CACXgB,UAAY,UACZC,aAAe,UACfC,KAAO,UACPC,WAAa,UACbC,MAAQ,UACRC,MAAQ,UACRC,OAAS,UACTC,MAAQ,UACRC,eAAiB,UACjBC,KAAO,UACPC,WAAa,UACbC,MAAQ,UACRC,UAAY,UACZC,UAAY,UACZC,WAAa,UACbC,UAAY,UACZC,MAAQ,UACRC,eAAiB,UACjBC,SAAW,UACXC,QAAU,UACVC,KAAO,UACPC,SAAW,UACXC,SAAW,UACXC,cAAgB,UAChBC,SAAW,UACXC,SAAW,UACXC,UAAY,UACZC,UAAY,UACZC,YAAc,UACdC,eAAiB,UACjBC,WAAa,UACbC,WAAa,UACbC,QAAU,UACVC,WAAa,UACbC,aAAe,UACfC,cAAgB,UAChBC,cAAgB,UAChBC,cAAgB,UAChBC,cAAgB,UAChBC,WAAa,UACbC,SAAW,UACXC,YAAc,UACdC,QAAU,UACVC,QAAU,UACVC,WAAa,UACbC,UAAY,UACZC,YAAc,UACdC,YAAc,UACdC,QAAU,UACVC,UAAY,UACZC,WAAa,UACbC,KAAO,UACPC,UAAY,UACZC,KAAO,UACPC,KAAO,UACPC,MAAQ,UACRC,YAAc,UACdC,SAAW,UACXC,QAAU,UACVC,UAAY,UACZC,OAAS,UACTC,MAAQ,UACRC,MAAQ,UACRC,SAAW,UACXC,cAAgB,UAChBC,UAAY,UACZC,aAAe,UACfC,UAAY,UACZC,WAAa,UACbC,UAAY,UACZC,qBAAuB,UACvBC,UAAY,UACZC,UAAY,UACZC,WAAa,UACbC,UAAY,UACZC,YAAc,UACdC,cAAgB,UAChBC,aAAe,UACfC,eAAiB,UACjBC,eAAiB,UACjBC,eAAiB,UACjBC,YAAc,UACdC,KAAO,UACPC,UAAY,UACZC,MAAQ,UACRC,QAAU,UACVC,OAAS,UACTC,iBAAmB,UACnBC,WAAa,UACbC,aAAe,UACfC,aAAe,UACfC,eAAiB,UACjBC,gBAAkB,UAClBC,kBAAoB,UACpBC,gBAAkB,UAClBC,gBAAkB,UAClBC,aAAe,UACfC,UAAY,UACZC,UAAY,UACZC,SAAW,UACXC,YAAc,UACdC,KAAO,UACPC,QAAU,UACVC,MAAQ,UACRC,UAAY,UACZC,OAAS,UACTC,UAAY,UACZC,OAAS,UACTC,cAAgB,UAChBC,UAAY,UACZC,cAAgB,UAChBC,cAAgB,UAChBC,WAAa,UACbC,UAAY,UACZC,KAAO,UACPC,KAAO,UACPC,KAAO,UACPC,WAAa,UACbC,OAAS,UACTC,cAAgB,UAChBC,IAAM,UACNC,UAAY,UACZC,UAAY,UACZC,YAAc,UACdC,OAAS,UACTC,WAAa,UACbC,SAAW,UACXC,SAAW,UACXC,OAAS,UACTC,OAAS,UACTC,QAAU,UACVC,UAAY,UACZC,UAAY,UACZC,UAAY,UACZC,KAAO,UACPC,YAAc,UACdC,UAAY,UACZC,IAAM,UACNC,KAAO,UACPC,QAAU,UACVC,OAAS,UACTC,UAAY,UACZC,OAAS,UACTC,MAAQ,UACRC,MAAQ,UACRC,WAAa,UACbC,OAAS,UACTC,YAAc,aCpJH,CACXpM,OAAQ,CACJqM,EAAK,EACLC,GAAM,IACNC,GAAM,KACNC,GAAM,MACNC,GAAM,MAAS,GACfC,GAAM,MAAS,GACfC,GAAM,MAAS,GAAK,IAExBC,SAAU,CACNC,EAAK,EACLC,GAAM,MAEVC,MAAO,CACHC,IAAO,GAAK,EAAIC,KAAKC,IACrBC,IAAO,EAAI,IACXC,KAAQ,EAAI,IACZC,KAAQ,MCfD,CAAEC,SAAQC,gCCIrB,aACIrM,KAAKsM,OAAS,KACdtM,KAAKuM,sBAAmBC,EACxBxM,KAAKyM,iBAAcD,EACnBxM,KAAK0M,SAAW,KAChB1M,KAAK2M,OAAS,KAEd,IAAMC,EAAO5M,KACb6M,OAAOC,eAAe9M,KAAM,kBAAmB,CAC3C+M,IAAK,WAAa,OAAOH,EAAKI,cAElCH,OAAOC,eAAe9M,KAAM,QAAS,CACjC+M,IAAK,WAAa,OAAOH,EAAKK,cAmK1C,OA9JIC,sBAAA,SAAUC,EAAOb,GACb,SAASc,EAAIC,GACLA,GAAQA,aAAgBH,IACxBG,EAAKf,OAASA,GAGlBgB,MAAMC,QAAQJ,GACdA,EAAMK,QAAQJ,GAGdA,EAAID,IAIZD,qBAAA,WACI,OAAOlN,KAAKyN,QAAWzN,KAAKsM,QAAUtM,KAAKsM,OAAOW,YAAe,GAGrEC,qBAAA,WACI,OAAOlN,KAAK0N,WAAc1N,KAAKsM,QAAUtM,KAAKsM,OAAOU,YAAe,IAGxEE,0BAAA,WAAkB,OAAO,GAEzBA,kBAAA,SAAMS,GACF,IAAMC,EAAO,GASb,OARA5N,KAAK6N,OAAOF,EAAS,CACjBG,IAAK,SAASC,EAAOf,EAAUgB,GAC3BJ,EAAKpN,KAAKuN,IAEdE,QAAS,WACL,OAAuB,IAAhBL,EAAK9O,UAGb8O,EAAKM,KAAK,KAGrBhB,mBAAA,SAAOS,EAASQ,GACZA,EAAOL,IAAI9N,KAAKoO,QAGpBlB,mBAAA,SAAOmB,GACHrO,KAAKoO,MAAQC,EAAQC,MAAMtO,KAAKoO,QAGpClB,iBAAA,WAAS,OAAOlN,MAEhBkN,qBAAA,SAASS,EAASY,EAAIC,EAAGC,GACrB,OAAQF,GACJ,IAAK,IAAK,OAAOC,EAAIC,EACrB,IAAK,IAAK,OAAOD,EAAIC,EACrB,IAAK,IAAK,OAAOD,EAAIC,EACrB,IAAK,IAAK,OAAOD,EAAIC,IAI7BvB,mBAAA,SAAOS,EAASS,GACZ,IAAMM,EAAYf,GAAWA,EAAQgB,aAErC,OAAO,EAAcC,QAAQR,EAAQ,OAAOS,QAAQH,IAAcN,GAG/DlB,UAAP,SAAesB,EAAGC,GAOd,GAAKD,EAAS,SAGG,WAAXC,EAAE7N,MAAgC,cAAX6N,EAAE7N,KAC3B,OAAO4N,EAAEM,QAAQL,GACd,GAAIA,EAAEK,QACT,OAAQL,EAAEK,QAAQN,GACf,GAAIA,EAAE5N,OAAS6N,EAAE7N,KAAjB,CAMP,GAFA4N,EAAIA,EAAEJ,MACNK,EAAIA,EAAEL,OACDd,MAAMC,QAAQiB,GACf,OAAOA,IAAMC,EAAI,OAAIjC,EAEzB,GAAIgC,EAAE1P,SAAW2P,EAAE3P,OAAnB,CAGA,IAAK,IAAI4B,EAAI,EAAGA,EAAI8N,EAAE1P,OAAQ4B,IAC1B,GAAiC,IAA7BwM,EAAK4B,QAAQN,EAAE9N,GAAI+N,EAAE/N,IACrB,OAGR,OAAO,KAGJwM,iBAAP,SAAsBsB,EAAGC,GACrB,OAAOD,EAAMC,GAAK,EACZD,IAAMC,EAAK,EACPD,EAAMC,EAAK,OAAIjC,GAI7BU,6BAAA,WAII,OAH6B,MAAzBlN,KAAKuM,mBACLvM,KAAKuM,iBAAmB,GAEK,IAA1BvM,KAAKuM,kBAGhBW,+BAAA,WACiC,MAAzBlN,KAAKuM,mBACLvM,KAAKuM,iBAAmB,GAE5BvM,KAAKuM,iBAAmBvM,KAAKuM,iBAAmB,GAGpDW,kCAAA,WACiC,MAAzBlN,KAAKuM,mBACLvM,KAAKuM,iBAAmB,GAE5BvM,KAAKuM,iBAAmBvM,KAAKuM,iBAAmB,GAKpDW,6BAAA,WACIlN,KAAKyM,aAAc,GAKvBS,+BAAA,WACIlN,KAAKyM,aAAc,GAOvBS,sBAAA,WACI,OAAOlN,KAAKyM,aAGhBS,2BAAA,WACI,MAAO,CACHX,iBAAkBvM,KAAKuM,iBACvBE,YAAazM,KAAKyM,cAI1BS,+BAAA,SAAmB/M,GACVA,IAGLH,KAAKuM,iBAAmBpM,EAAKoM,iBAC7BvM,KAAKyM,YAActM,EAAKsM,mBC9K1BsC,EAAQ,SAASC,EAAKR,EAAGS,GAC3B,IAAMrC,EAAO5M,KAOTsN,MAAMC,QAAQyB,GACdhP,KAAKgP,IAAMA,EACJA,EAAIlQ,QAAU,GACrBkB,KAAKgP,IAAM,GACXA,EAAIE,MAAM,SAASC,KAAI,SAAUC,EAAG1O,GAC5BA,EAAI,EACJkM,EAAKoC,IAAIxO,KAAK6O,SAASD,EAAG,KAE1BxC,EAAK0C,MAASD,SAASD,EAAG,IAAO,SAIzCpP,KAAKgP,IAAM,GACXA,EAAIO,MAAM,IAAIJ,KAAI,SAAUC,EAAG1O,GACvBA,EAAI,EACJkM,EAAKoC,IAAIxO,KAAK6O,SAASD,EAAIA,EAAG,KAE9BxC,EAAK0C,MAASD,SAASD,EAAIA,EAAG,IAAO,QAIjDpP,KAAKsP,MAAQtP,KAAKsP,QAAuB,iBAANd,EAAiBA,EAAI,QAC5B,IAAjBS,IACPjP,KAAKoO,MAAQa,IA8LrB,SAASO,EAAMC,EAAGC,GACd,OAAO3D,KAAK4D,IAAI5D,KAAK2D,IAAID,EAAG,GAAIC,GAGpC,SAASE,EAAMH,GACX,MAAO,IAAIA,EAAEN,KAAI,SAAUC,GAEvB,QADAA,EAAII,EAAMzD,KAAK8D,MAAMT,GAAI,MACb,GAAK,IAAM,IAAMA,EAAEU,SAAS,OACzC5B,KAAK,IAlMZa,EAAMgB,UAAYlD,OAAOmD,OAAO,IAAI9C,EAAQ,CACxCtM,KAAM,QAENqP,gBACI,IAAIC,EAAIlQ,KAAKgP,IAAI,GAAK,IAAKmB,EAAInQ,KAAKgP,IAAI,GAAK,IAAKP,EAAIzO,KAAKgP,IAAI,GAAK,IAMpE,MAAO,OAJPkB,EAAKA,GAAK,OAAWA,EAAI,MAAQnE,KAAKqE,KAAMF,EAAI,MAAS,MAAQ,MAI7C,OAHpBC,EAAKA,GAAK,OAAWA,EAAI,MAAQpE,KAAKqE,KAAMD,EAAI,MAAS,MAAQ,MAGhC,OAFjC1B,EAAKA,GAAK,OAAWA,EAAI,MAAQ1C,KAAKqE,KAAM3B,EAAI,MAAS,MAAQ,OAKrEZ,gBAAOF,EAASQ,GACZA,EAAOL,IAAI9N,KAAKqQ,MAAM1C,KAG1B0C,eAAM1C,EAAS2C,GACX,IACIC,EACAjB,EACAkB,EAHEC,EAAW9C,GAAWA,EAAQ8C,WAAaH,EAI7CI,EAAO,GAOX,GAFApB,EAAQtP,KAAK2Q,OAAOhD,EAAS3N,KAAKsP,OAE9BtP,KAAKoO,MACL,GAAkC,IAA9BpO,KAAKoO,MAAMwC,QAAQ,OACftB,EAAQ,IACRkB,EAAgB,YAEjB,CAAA,GAAkC,IAA9BxQ,KAAKoO,MAAMwC,QAAQ,OAO1B,OAAO5Q,KAAKoO,MALRoC,EADAlB,EAAQ,EACQ,OAEA,WAMpBA,EAAQ,IACRkB,EAAgB,QAIxB,OAAQA,GACJ,IAAK,OACDE,EAAO1Q,KAAKgP,IAAIG,KAAI,SAAUC,GAC1B,OAAOI,EAAMzD,KAAK8D,MAAMT,GAAI,QAC7BlO,OAAOsO,EAAMF,EAAO,IACvB,MACJ,IAAK,OACDoB,EAAKlQ,KAAKgP,EAAMF,EAAO,IAC3B,IAAK,MACDiB,EAAQvQ,KAAK6Q,QACbH,EAAO,CACH1Q,KAAK2Q,OAAOhD,EAAS4C,EAAMO,GACxB9Q,KAAK2Q,OAAOhD,EAAmB,IAAV4C,EAAM5E,OAC3B3L,KAAK2Q,OAAOhD,EAAmB,IAAV4C,EAAMQ,QAChC7P,OAAOwP,GAGjB,GAAIF,EAEA,OAAUA,MAAiBE,EAAKxC,KAAK,KAAIuC,EAAW,GAAK,UAK7D,GAFAF,EAAQvQ,KAAKgR,QAETP,EAAU,CACV,IAAMQ,EAAaV,EAAMhB,MAAM,IAG3B0B,EAAW,KAAOA,EAAW,IAAMA,EAAW,KAAOA,EAAW,IAAMA,EAAW,KAAOA,EAAW,KACnGV,EAAQ,IAAIU,EAAW,GAAKA,EAAW,GAAKA,EAAW,IAI/D,OAAOV,GASXW,iBAAQvD,EAASY,EAAI4C,GAGjB,IAFA,IAAMnC,EAAM,IAAI1B,MAAM,GAChBgC,EAAQtP,KAAKsP,OAAS,EAAI6B,EAAM7B,OAAS6B,EAAM7B,MAC5CF,EAAI,EAAGA,EAAI,EAAGA,IACnBJ,EAAII,GAAKpP,KAAKoR,SAASzD,EAASY,EAAIvO,KAAKgP,IAAII,GAAI+B,EAAMnC,IAAII,IAE/D,OAAO,IAAIL,EAAMC,EAAKM,IAG1B0B,iBACI,OAAOpB,EAAM5P,KAAKgP,MAGtB6B,iBACI,IAGIC,EACAnF,EAJEuE,EAAIlQ,KAAKgP,IAAI,GAAK,IAAKmB,EAAInQ,KAAKgP,IAAI,GAAK,IAAKP,EAAIzO,KAAKgP,IAAI,GAAK,IAAKR,EAAIxO,KAAKsP,MAE9EI,EAAM3D,KAAK2D,IAAIQ,EAAGC,EAAG1B,GAAIkB,EAAM5D,KAAK4D,IAAIO,EAAGC,EAAG1B,GAG9CsC,GAAKrB,EAAMC,GAAO,EAClB0B,EAAI3B,EAAMC,EAEhB,GAAID,IAAQC,EACRmB,EAAInF,EAAI,MACL,CAGH,OAFAA,EAAIoF,EAAI,GAAMM,GAAK,EAAI3B,EAAMC,GAAO0B,GAAK3B,EAAMC,GAEvCD,GACJ,KAAKQ,EAAGY,GAAKX,EAAI1B,GAAK4C,GAAKlB,EAAI1B,EAAI,EAAI,GAAI,MAC3C,KAAK0B,EAAGW,GAAKrC,EAAIyB,GAAKmB,EAAI,EAAiB,MAC3C,KAAK5C,EAAGqC,GAAKZ,EAAIC,GAAKkB,EAAI,EAE9BP,GAAK,EAET,MAAO,CAAEA,EAAO,IAAJA,EAASnF,IAAGoF,IAAGvC,MAI/B8C,iBACI,IAGIR,EACAnF,EAJEuE,EAAIlQ,KAAKgP,IAAI,GAAK,IAAKmB,EAAInQ,KAAKgP,IAAI,GAAK,IAAKP,EAAIzO,KAAKgP,IAAI,GAAK,IAAKR,EAAIxO,KAAKsP,MAE9EI,EAAM3D,KAAK2D,IAAIQ,EAAGC,EAAG1B,GAAIkB,EAAM5D,KAAK4D,IAAIO,EAAGC,EAAG1B,GAG9CgB,EAAIC,EAEJ2B,EAAI3B,EAAMC,EAOhB,GALIhE,EADQ,IAAR+D,EACI,EAEA2B,EAAI3B,EAGRA,IAAQC,EACRmB,EAAI,MACD,CACH,OAAQpB,GACJ,KAAKQ,EAAGY,GAAKX,EAAI1B,GAAK4C,GAAKlB,EAAI1B,EAAI,EAAI,GAAI,MAC3C,KAAK0B,EAAGW,GAAKrC,EAAIyB,GAAKmB,EAAI,EAAG,MAC7B,KAAK5C,EAAGqC,GAAKZ,EAAIC,GAAKkB,EAAI,EAE9BP,GAAK,EAET,MAAO,CAAEA,EAAO,IAAJA,EAASnF,IAAG8D,IAAGjB,MAG/B+C,kBACI,OAAO3B,EAAM,CAAc,IAAb5P,KAAKsP,OAAapO,OAAOlB,KAAKgP,OAGhDF,iBAAQ0C,GACJ,OAAQA,EAAExC,KACNwC,EAAExC,IAAI,KAAOhP,KAAKgP,IAAI,IACtBwC,EAAExC,IAAI,KAAOhP,KAAKgP,IAAI,IACtBwC,EAAExC,IAAI,KAAOhP,KAAKgP,IAAI,IACtBwC,EAAElC,QAAWtP,KAAKsP,MAAS,OAAI9C,KAI3CuC,EAAM0C,YAAc,SAASC,GACzB,IAAItC,EACEuC,EAAMD,EAAQE,cAQpB,GAPIxF,EAAO3O,eAAekU,GACtBvC,EAAI,IAAIL,EAAM3C,EAAOuF,GAAKE,MAAM,IAEnB,gBAARF,IACLvC,EAAI,IAAIL,EAAM,CAAC,EAAG,EAAG,GAAI,IAGzBK,EAEA,OADAA,EAAEhB,MAAQsD,EACHtC,GC7Nf,IAAM0C,EAAQ,SAASzE,GACnBrN,KAAKoO,MAAQf,GAGjByE,EAAM/B,UAAYlD,OAAOmD,OAAO,IAAI9C,EAAQ,CACxCtM,KAAM,QAENiN,gBAAOF,EAASQ,GACZA,EAAOL,IAAI,KACX9N,KAAKoO,MAAMP,OAAOF,EAASQ,GAC3BA,EAAOL,IAAI,MAGfiE,cAAKpE,GACD,OAAO,IAAImE,EAAM9R,KAAKoO,MAAM2D,KAAKpE,OCfzC,IAAMqE,EAAsB,CACxB,IAAI,EACJC,KAAK,EACLC,KAAK,GAGHC,EAAa,SAAS/D,GACV,MAAVA,GACApO,KAAKoO,MAAQ,IACbpO,KAAKoS,mBAAoB,IAEzBpS,KAAKoO,MAAQA,EAAQA,EAAMiE,OAAS,GACpCrS,KAAKoS,kBAAmC,KAAfpS,KAAKoO,QAItC+D,EAAWpC,UAAYlD,OAAOmD,OAAO,IAAI9C,EAAQ,CAC7CtM,KAAM,aAENiN,gBAAOF,EAASQ,GACZ,IAAMmE,EAAgB3E,EAAQ8C,UAAYuB,EAAoBhS,KAAKoO,OAAU,GAAK,IAClFD,EAAOL,IAAIwE,EAAetS,KAAKoO,MAAQkE,MClB/C,IAAMC,EAAU,SAASC,EAAYpE,EAAOqE,EAAYzE,EAAO0E,EAAiBC,GAC5E3S,KAAKwS,WAAaA,aAAsBL,EACpCK,EAAa,IAAIL,EAAWK,GAG5BxS,KAAKoO,MADY,iBAAVA,EACMA,EAAMiE,OACZjE,GAGM,GAEjBpO,KAAKyS,WAAaA,EAClBzS,KAAKyN,OAASO,EACdhO,KAAK0N,UAAYgF,EACjB1S,KAAK4S,mBAAmBD,GACxB3S,KAAK6S,UAAU7S,KAAKwS,WAAYxS,OAGpCuS,EAAQxC,UAAYlD,OAAOmD,OAAO,IAAI9C,EAAQ,CAC1CtM,KAAM,UAENkS,gBAAOzE,GACH,IAAMD,EAAQpO,KAAKoO,MACnBpO,KAAKwS,WAAanE,EAAQC,MAAMtO,KAAKwS,YAChB,iBAAVpE,IACPpO,KAAKoO,MAAQC,EAAQC,MAAMF,KAInC2D,cAAKpE,GACD,OAAO,IAAI4E,EAAQvS,KAAKwS,WACpBxS,KAAKoO,MAAM2D,KAAO/R,KAAKoO,MAAM2D,KAAKpE,GAAW3N,KAAKoO,MAClDpO,KAAKyS,WACLzS,KAAKiN,WACLjN,KAAKgN,WAAYhN,KAAK2S,mBAG9BI,iBACI,OAAO,IAAIR,EAAQvS,KAAKwS,WACpBxS,KAAKoO,MACLpO,KAAKyS,WACLzS,KAAKiN,WACLjN,KAAKgN,WAAYhN,KAAK2S,mBAG9B9E,gBAAOF,EAASQ,GACZA,EAAOL,IAAI9N,KAAKqQ,MAAM1C,GAAU3N,KAAKgN,WAAYhN,KAAKiN,aAG1DoD,eAAM1C,GACFA,EAAUA,GAAW,GACrB,IAAIS,EAAQpO,KAAKoO,MACX4E,EAAgBrF,EAAQqF,cAQ9B,OAPI5E,aAAiB0D,IAGjBnE,EAAQqF,eAAgB,GAE5B5E,EAAQA,EAAMiC,MAAQjC,EAAMiC,MAAM1C,GAAWS,EAC7CT,EAAQqF,cAAgBA,EACV,KAAV5E,GAAoD,MAApCpO,KAAKwS,WAAWpE,MAAM6E,OAAO,GACtC,GAEAjT,KAAKwS,WAAWnC,MAAM1C,GAAWS,KClE7C,IAAMrC,EAAO,CAChBmH,OAAQ,EACRC,gBAAiB,EACjBC,OAAQ,GAICC,EACJ,EADIA,EAEF,EAFEA,EAGJ,ECLT,SAASC,EAAQC,GACb,OAAO1G,OAAOkD,UAAUD,SAAS0D,KAAKD,GAAS1B,MAAM,GAAI,GAqF7D,SAAStE,EAAQgG,GACb,MAA4B,UAArBD,EAAQC,GC3CnB,SAASE,EAAKC,EAAQrW,GAElB,YADgB,IAAZA,IAAsBA,EAAU,IAChCkQ,EAAQmG,GACDA,EAAOvE,KAAI,SAAUzO,GAAK,OAAO+S,EAAK/S,EAAGrD,MDnB3B,WAArBiW,EADeC,ECqBAG,IDlBZH,EAAQI,cAAgB9G,QAAUA,OAAO+G,eAAeL,KAAa1G,OAAOkD,UCmBxE2D,EAtCf,WACI,IAAK,IAAI/H,EAAI,EAAGjL,EAAI,EAAGmT,EAAKC,UAAUhV,OAAQ4B,EAAImT,EAAInT,IAAKiL,GAAKmI,UAAUpT,GAAG5B,OACxE,IAAIoR,EAAI5C,MAAM3B,GAAIoI,EAAI,EAA3B,IAA8BrT,EAAI,EAAGA,EAAImT,EAAInT,IACzC,IAAK,IAAI8N,EAAIsF,UAAUpT,GAAIsT,EAAI,EAAGC,EAAKzF,EAAE1P,OAAQkV,EAAIC,EAAID,IAAKD,IAC1D7D,EAAE6D,GAAKvF,EAAEwF,GACjB,OAAO9D,EAoCAgE,CAFKrH,OAAOsH,oBAAoBT,GACzB7G,OAAOuH,sBAAsBV,IACLW,QAAO,SAAUC,EAAO3C,GAC1D,OAAIpE,EAAQlQ,EAAQkX,SAAWlX,EAAQkX,MAAMC,SAAS7C,IAlC9D,SAAoB2C,EAAO3C,EAAK8C,EAAQC,EAAgBC,GACpD,IAAIC,EAAW,GAAGC,qBAAqBrB,KAAKkB,EAAgB/C,GACtD,aACA,gBACW,eAAbiD,IACAN,EAAM3C,GAAO8C,GACbE,GAAqC,kBAAbC,GACxB/H,OAAOC,eAAewH,EAAO3C,EAAK,CAC9BvD,MAAOqG,EACPK,YAAY,EACZC,UAAU,EACVC,cAAc,IA4BlBC,CAAWX,EAAO3C,EADL8B,EADHC,EAAO/B,GACMtU,GACQqW,EAAQrW,EAAQ6X,eAJpCZ,IAMZ,IDjCP,IAAuBf,WE7BP4B,EAAYnH,EAAOoH,GAK/B,IAJA,IAAIC,EAAIrH,EAAQ,EACZsH,EAAO,KACPC,GAAU,IAELF,GAAK,GAA+B,OAA1BD,EAAYnC,OAAOoC,IAClCE,IAOJ,MAJqB,iBAAVvH,IACPsH,GAAQF,EAAYvD,MAAM,EAAG7D,GAAOkB,MAAM,QAAU,IAAIpQ,QAGrD,CACHwW,OACAC,mBAIQC,EAAUC,GACtB,IAAI/U,EACE5B,EAAS2W,EAAI3W,OACb2U,EAAO,IAAInG,MAAMxO,GAEvB,IAAK4B,EAAI,EAAGA,EAAI5B,EAAQ4B,IACpB+S,EAAK/S,GAAK+U,EAAI/U,GAElB,OAAO+S,WAGKV,EAAM2C,GAClB,IAAMC,EAAS,GACf,IAAK,IAAMC,KAAQF,EACXA,EAAIjY,eAAemY,KACnBD,EAAOC,GAAQF,EAAIE,IAG3B,OAAOD,WAGKE,EAASC,EAAMC,GAC3B,IAAIC,EAASD,GAAQ,GACrB,IAAKA,EAAKE,UAAW,CACjBD,EAAS,GACT,IAAME,EAAWzC,EAAKqC,GACtBE,EAAOC,UAAYC,EACnB,IAAMP,EAASI,EAAOtC,EAAKsC,GAAQ,GACnClJ,OAAOmD,OAAOgG,EAAQE,EAAUP,GAEpC,OAAOK,WAGKG,EAAYL,EAAMC,GAC9B,GAAIA,GAAQA,EAAKE,UACb,OAAOF,EAEX,IAAMK,EAAOP,EAASC,EAAMC,GAQ5B,GAPIK,EAAKC,aACLD,EAAKE,KAAOC,EAAenD,QAG3BgD,EAAKI,eACLJ,EAAKK,YAAcC,GAEE,iBAAdN,EAAKE,KACZ,OAAQF,EAAKE,KAAK1E,eACd,IAAK,SACDwE,EAAKE,KAAOC,EAAerD,OAC3B,MACJ,IAAK,kBACDkD,EAAKE,KAAOC,EAAepD,gBAC3B,MACJ,IAAK,SACL,IAAK,SACDiD,EAAKE,KAAOC,EAAenD,OAC3B,MACJ,QACIgD,EAAKE,KAAOC,EAAenD,OAGvC,GAAgC,iBAArBgD,EAAKK,YACZ,OAAQL,EAAKK,YAAY7E,eACrB,IAAK,MACDwE,EAAKK,YAAcC,EACnB,MACJ,IAAK,QACDN,EAAKK,YAAcC,EACnB,MACJ,IAAK,MACDN,EAAKK,YAAcC,EAI/B,OAAON,WAYKO,EAAalB,EAAKmB,gBAAAA,MAC9B,IAAK,IAAIlW,EAAI,EAAGmW,EAASpB,EAAI3W,OAAQ4B,EAAImW,EAAQnW,IAAK,CAClD,IAAM0N,EAAQqH,EAAI/U,GACd4M,MAAMC,QAAQa,GACduI,EAAavI,EAAOwI,QAENpK,IAAV4B,GACAwI,EAAOpW,KAAK4N,GAIxB,OAAOwI,gHApBWd,EAAMC,GACxB,IAAK,IAAMH,KAAQG,EACXA,EAAKtY,eAAemY,KACpBE,EAAKF,GAAQG,EAAKH,IAG1B,OAAOE,oBCxGLgB,EAAgB,qCAwBhBC,EAAY,SAAStX,EAAGuX,EAAgBC,GAC1CvX,MAAM8T,KAAKxT,MAEX,IAAMuB,EAAW9B,EAAE8B,UAAY0V,EAK/B,GAHAjX,KAAKkX,QAAUzX,EAAEyX,QACjBlX,KAAKmX,MAAQ1X,EAAE0X,MAEXH,GAAkBzV,EAAU,CAC5B,IAAM6V,EAAQJ,EAAeK,SAAS9V,GAChC+V,EAAMC,EAAkB9X,EAAEuO,MAAOoJ,GACnC9B,EAAOgC,EAAIhC,KACTkC,EAAOF,EAAI/B,OACXkC,EAAWhY,EAAE+T,MAAQ+D,EAAkB9X,EAAE+T,KAAM4D,GAAO9B,KACtDoC,EAAQN,EAAQA,EAAM7H,MAAM,MAAQ,GAQ1C,GANAvP,KAAKY,KAAOnB,EAAEmB,MAAQ,SACtBZ,KAAKuB,SAAWA,EAChBvB,KAAKgO,MAAQvO,EAAEuO,MACfhO,KAAKsV,KAAuB,iBAATA,EAAoBA,EAAO,EAAI,KAClDtV,KAAKuV,OAASiC,GAETxX,KAAKsV,MAAQtV,KAAKmX,MAAO,CAC1B,IAAMQ,EAAQ3X,KAAKmX,MAAMjI,MAAM4H,GASzBc,EAAO,IAAIC,SAAS,IAAK,qBAC3BC,EAAa,EACjB,IACIF,IACF,MAAOnY,GACL,IAAMyP,EAAQzP,EAAE0X,MAAMjI,MAAM4H,GAE5BgB,EAAa,GADTxC,EAAOjG,SAASH,EAAM,KAI1ByI,IACIA,EAAM,KACN3X,KAAKsV,KAAOjG,SAASsI,EAAM,IAAMG,GAEjCH,EAAM,KACN3X,KAAKuV,OAASlG,SAASsI,EAAM,MAKzC3X,KAAKyX,SAAWA,EAAW,EAC3BzX,KAAK+X,YAAcL,EAAMD,GAEzBzX,KAAKgY,QAAU,CACXN,EAAM1X,KAAKsV,KAAO,GAClBoC,EAAM1X,KAAKsV,KAAO,GAClBoC,EAAM1X,KAAKsV,SAMvB,QAA6B,IAAlBzI,OAAOoL,OAAwB,CACtC,IAAMC,EAAI,aACVA,EAAEnI,UAAYrQ,MAAMqQ,UACpBgH,EAAUhH,UAAY,IAAImI,OAE1BnB,EAAUhH,UAAYlD,OAAOoL,OAAOvY,MAAMqQ,WAG9CgH,EAAUhH,UAAU4D,YAAcoD,EASlCA,EAAUhH,UAAUD,SAAW,SAASzS,GACpCA,EAAUA,GAAW,GAErB,IAAI6Z,EAAU,GACRc,EAAUhY,KAAKgY,SAAW,GAC5BlY,EAAQ,GACRqY,EAAU,SAAUC,GAAO,OAAOA,GACtC,GAAI/a,EAAQ8a,QAAS,CACjB,IAAMvX,SAAcvD,EAAQ8a,QAC5B,GAAa,aAATvX,EACA,MAAMlB,MAAM,+CAA+CkB,OAE/DuX,EAAU9a,EAAQ8a,QAGtB,GAAkB,OAAdnY,KAAKsV,KAAe,CAKpB,GAJ0B,iBAAf0C,EAAQ,IACflY,EAAMU,KAAK2X,EAAWnY,KAAKsV,KAAO,MAAK0C,EAAQ,GAAM,SAG/B,iBAAfA,EAAQ,GAAiB,CAChC,IAAIK,EAAcrY,KAAKsV,SACnB0C,EAAQ,KACRK,GAAYL,EAAQ,GAAGnG,MAAM,EAAG7R,KAAKuV,QACjC4C,EAAQA,EAAQA,EAAQH,EAAQ,GAAGM,OAAOtY,KAAKuV,OAAQ,GAAI,QACvDyC,EAAQ,GAAGnG,MAAM7R,KAAKuV,OAAS,GAAI,OAAQ,YAEvDzV,EAAMU,KAAK6X,GAGW,iBAAfL,EAAQ,IACflY,EAAMU,KAAK2X,EAAWnY,KAAKsV,KAAO,MAAK0C,EAAQ,GAAM,SAEzDlY,EAAWA,EAAMoO,KAAK,MAAQiK,EAAQ,GAAI,cAkB9C,OAfAjB,GAAWiB,EAAWnY,KAAKY,eAAcZ,KAAKkX,QAAW,OACrDlX,KAAKuB,WACL2V,GAAWiB,EAAQ,OAAQ,OAASnY,KAAKuB,UAEzCvB,KAAKsV,OACL4B,GAAWiB,EAAQ,YAAYnY,KAAKsV,kBAAgBtV,KAAKuV,OAAS,OAAM,SAG5E2B,GAAW,KAAKpX,EAEZE,KAAKyX,WACLP,GAAciB,EAAQ,QAAS,QAAUnY,KAAKuB,UAAY,SAC1D2V,GAAciB,EAAQnY,KAAKyX,SAAU,YAAWzX,KAAK+X,kBAGlDb,GC1JX,IAAMqB,EAAW,SAASC,EAAUC,EAAYC,EAAW1K,EAAO0E,EAAiBC,GAC/E3S,KAAKyY,WAAaA,EAClBzY,KAAK0Y,UAAYA,EACjB1Y,KAAK2Y,gBAAkBD,EACvB1Y,KAAKyN,OAASO,EACdhO,KAAK0N,UAAYgF,EACjB1S,KAAKwY,SAAWxY,KAAK4Y,YAAYJ,GACjCxY,KAAK6Y,oBAAiBrM,EACtBxM,KAAK4S,mBAAmBD,GACxB3S,KAAK6S,UAAU7S,KAAKwY,SAAUxY,OAGlCuY,EAASxI,UAAYlD,OAAOmD,OAAO,IAAI9C,EAAQ,CAC3CtM,KAAM,WAENkS,gBAAOzE,GACCrO,KAAKwY,WACLxY,KAAKwY,SAAWnK,EAAQyK,WAAW9Y,KAAKwY,WAExCxY,KAAKyY,aACLzY,KAAKyY,WAAapK,EAAQyK,WAAW9Y,KAAKyY,aAE1CzY,KAAK0Y,YACL1Y,KAAK0Y,UAAYrK,EAAQC,MAAMtO,KAAK0Y,aAI5CK,uBAAcP,EAAUC,EAAYE,GAChCH,EAAWxY,KAAK4Y,YAAYJ,GAC5B,IAAMQ,EAAc,IAAIT,EAASC,EAAUC,GAAczY,KAAKyY,WAC1D,KAAMzY,KAAKiN,WAAYjN,KAAKgN,WAAYhN,KAAK2S,kBAGjD,OAFAqG,EAAYL,eAAoC,MAAlBA,EAA0BA,EAAiB3Y,KAAK2Y,eAC9EK,EAAYC,WAAajZ,KAAKiZ,WACvBD,GAGXJ,qBAAYM,GACR,OAAKA,GAGc,iBAARA,GACPlZ,KAAKrC,MAAMwb,UACPD,EACA,CAAC,YACDlZ,KAAKyN,OACLzN,KAAK0N,WACL,SAAS0L,EAAKxC,GACV,GAAIwC,EACA,MAAM,IAAIrC,EAAU,CAChB/I,MAAOoL,EAAIpL,MACXkJ,QAASkC,EAAIlC,SACdlX,KAAKrC,MAAM0b,QAASrZ,KAAK0N,UAAUnM,UAE1C2X,EAAMtC,EAAO,GAAG4B,YAGrBU,GAlBI,CAAC,IAAI3G,EAAQ,GAAI,KAAK,EAAOvS,KAAKyN,OAAQzN,KAAK0N,aAqB9D4L,gCACI,IAAMC,EAAK,IAAIhH,EAAQ,GAAI,KAAK,EAAOvS,KAAKyN,OAAQzN,KAAK0N,WAAY8L,EAAO,CAAC,IAAIjB,EAAS,CAACgB,GAAK,KAAM,KAAMvZ,KAAKyN,OAAQzN,KAAK0N,YAE9H,OADA8L,EAAK,GAAGP,YAAa,EACdO,GAGXtK,eAAMiC,GACF,IAEIsI,EACA/Y,EAHE8X,EAAWxY,KAAKwY,SAChBkB,EAAMlB,EAAS1Z,OAMrB,GAAa,KADb2a,GADAtI,EAAQA,EAAMwI,iBACD7a,SACK4a,EAAMD,EACpB,OAAO,EAEP,IAAK/Y,EAAI,EAAGA,EAAI+Y,EAAM/Y,IAClB,GAAI8X,EAAS9X,GAAG0N,QAAU+C,EAAMzQ,GAC5B,OAAO,EAKnB,OAAO+Y,GAGXE,yBACI,GAAI3Z,KAAK6Y,eACL,OAAO7Y,KAAK6Y,eAGhB,IAAIL,EAAWxY,KAAKwY,SAASrJ,KAAK,SAASM,GACvC,OAAOA,EAAE+C,WAAWpE,OAASqB,EAAErB,MAAMA,OAASqB,EAAErB,UACjDF,KAAK,IAAIgB,MAAM,+BAUlB,OARIsJ,EACoB,MAAhBA,EAAS,IACTA,EAASoB,QAGbpB,EAAW,GAGPxY,KAAK6Y,eAAiBL,GAGlCqB,gCACI,OAAQ7Z,KAAKiZ,YACgB,IAAzBjZ,KAAKwY,SAAS1Z,QACa,MAA3BkB,KAAKwY,SAAS,GAAGpK,QACsB,MAAtCpO,KAAKwY,SAAS,GAAGhG,WAAWpE,OAAuD,KAAtCpO,KAAKwY,SAAS,GAAGhG,WAAWpE,QAGlF2D,cAAKpE,GACD,IAAMgL,EAAiB3Y,KAAK0Y,WAAa1Y,KAAK0Y,UAAU3G,KAAKpE,GACzD6K,EAAWxY,KAAKwY,SAChBC,EAAazY,KAAKyY,WAKtB,OAHAD,EAAWA,GAAYA,EAASrJ,KAAI,SAAU1P,GAAK,OAAOA,EAAEsS,KAAKpE,MACjE8K,EAAaA,GAAcA,EAAWtJ,KAAI,SAAS2K,GAAU,OAAOA,EAAO/H,KAAKpE,MAEzE3N,KAAK+Y,cAAcP,EAAUC,EAAYE,IAGpD9K,gBAAOF,EAASQ,GACZ,IAAIzN,EAIJ,IAHMiN,GAAYA,EAAQqF,eAAwD,KAAtChT,KAAKwY,SAAS,GAAGhG,WAAWpE,OACpED,EAAOL,IAAI,IAAK9N,KAAKgN,WAAYhN,KAAKiN,YAErCvM,EAAI,EAAGA,EAAIV,KAAKwY,SAAS1Z,OAAQ4B,IACxBV,KAAKwY,SAAS9X,GAChBmN,OAAOF,EAASQ,IAIhC4L,uBACI,OAAO/Z,KAAK2Y,kBC1IpB,IAAMqB,EAAQ,SAAS5L,GACnB,IAAKA,EACD,MAAM,IAAI1O,MAAM,oCAEf4N,MAAMC,QAAQa,GAIfpO,KAAKoO,MAAQA,EAHbpO,KAAKoO,MAAQ,CAAEA,IAOvB4L,EAAMjK,UAAYlD,OAAOmD,OAAO,IAAI9C,EAAQ,CACxCtM,KAAM,QAENkS,gBAAOzE,GACCrO,KAAKoO,QACLpO,KAAKoO,MAAQC,EAAQyK,WAAW9Y,KAAKoO,SAI7C2D,cAAKpE,GACD,OAA0B,IAAtB3N,KAAKoO,MAAMtP,OACJkB,KAAKoO,MAAM,GAAG2D,KAAKpE,GAEnB,IAAIqM,EAAMha,KAAKoO,MAAMe,KAAI,SAAUM,GACtC,OAAOA,EAAEsC,KAAKpE,QAK1BE,gBAAOF,EAASQ,GACZ,IAAIzN,EACJ,IAAKA,EAAI,EAAGA,EAAIV,KAAKoO,MAAMtP,OAAQ4B,IAC/BV,KAAKoO,MAAM1N,GAAGmN,OAAOF,EAASQ,GAC1BzN,EAAI,EAAIV,KAAKoO,MAAMtP,QACnBqP,EAAOL,IAAKH,GAAWA,EAAQ8C,SAAY,IAAM,SCpCjE,IAAMwJ,EAAU,SAAS7L,GACrBpO,KAAKoO,MAAQA,GAGjB6L,EAAQlK,UAAYlD,OAAOmD,OAAO,IAAI9C,EAAQ,CAC1CtM,KAAM,UAENiN,gBAAOF,EAASQ,GACZ,GAAmB,MAAfnO,KAAKoO,MAAiB,KAAM,CAAExN,KAAM,SAAUsW,QAAS,4BAC3D/I,EAAOL,IAAI9N,KAAKoO,UAIxB6L,EAAQC,KAAO,IAAID,EAAQ,QAC3BA,EAAQE,MAAQ,IAAIF,EAAQ,SCd5B,IAAMG,EAAY,SAAShM,EAAOJ,EAAO0E,EAAiB2H,EAAUC,EAAa3H,GAC7E3S,KAAKoO,MAAQA,EACbpO,KAAKyN,OAASO,EACdhO,KAAK0N,UAAYgF,EACjB1S,KAAKqa,SAAWA,EAChBra,KAAKsa,iBAAsC,IAAhBA,GAAuCA,EAClEta,KAAKua,WAAY,EACjBva,KAAK4S,mBAAmBD,IAG5ByH,EAAUrK,UAAYlD,OAAOmD,OAAO,IAAI9C,EAAQ,CAC5CtM,KAAM,YACNmR,gBACI,OAAO,IAAIqI,EAAUpa,KAAKoO,MAAOpO,KAAKyN,OAAQzN,KAAK0N,UAAW1N,KAAKqa,SAAUra,KAAKsa,YAAata,KAAK2S,mBAExG7D,iBAAQqC,GACJ,OAAOA,EAAMd,OAASrQ,KAAKqQ,UAAYc,EAAMd,QAAU,OAAI7D,GAE/DgO,yBACI,OAAOxa,KAAKsa,aAEhBzM,gBAAOF,EAASQ,GACZnO,KAAKyM,YAAcgO,QAAQza,KAAKoO,OAC5BpO,KAAKyM,aACL0B,EAAOL,IAAI9N,KAAKoO,MAAOpO,KAAK0N,UAAW1N,KAAKyN,OAAQzN,KAAKqa,aCrBrE,IAAMK,EAAOnE,EAab,IAAMoE,EAAc,SAASC,EAAMxM,EAAOyM,EAAWC,EAAO9M,EAAO0E,EAAiBqI,EAAQC,GACxFhb,KAAK4a,KAAOA,EACZ5a,KAAKoO,MAASA,aAAiBlB,EAAQkB,EAAQ,IAAI4L,EAAM,CAAC5L,EAAQ,IAAIgM,EAAUhM,GAAS,OACzFpO,KAAK6a,UAAYA,EAAY,IAAIA,EAAUxI,OAAW,GACtDrS,KAAK8a,MAAQA,EACb9a,KAAKyN,OAASO,EACdhO,KAAK0N,UAAYgF,EACjB1S,KAAK+a,OAASA,IAAU,EACxB/a,KAAKgb,cAAyBxO,IAAbwO,EAA0BA,EACpCJ,EAAK3H,QAA8B,MAAnB2H,EAAK3H,OAAO,GACnCjT,KAAKua,WAAY,EACjBva,KAAK6S,UAAU7S,KAAKoO,MAAOpO,OAG/B2a,EAAY5K,UAAYlD,OAAOmD,OAAO,IAAI9C,EAAQ,CAC9CtM,KAAM,cAENiN,gBAAOF,EAASQ,GACZA,EAAOL,IAAI9N,KAAK4a,MAAQjN,EAAQ8C,SAAW,IAAM,MAAOzQ,KAAKgN,WAAYhN,KAAKiN,YAC9E,IACIjN,KAAKoO,MAAMP,OAAOF,EAASQ,GAE/B,MAAO1O,GAGH,MAFAA,EAAEuO,MAAQhO,KAAKyN,OACfhO,EAAE8B,SAAWvB,KAAK0N,UAAUnM,SACtB9B,EAEV0O,EAAOL,IAAI9N,KAAK6a,WAAc7a,KAAK+a,QAAWpN,EAAQsN,UAAYtN,EAAQ8C,SAAa,GAAK,KAAMzQ,KAAK0N,UAAW1N,KAAKyN,SAG3HsE,cAAKpE,GACD,IAAwBuN,EAA4BC,EAAhDC,GAAa,EAAiBR,EAAO5a,KAAK4a,KAAkBI,EAAWhb,KAAKgb,SAC5D,iBAATJ,IAGPA,EAAwB,IAAhBA,EAAK9b,QAAkB8b,EAAK,aAAcX,EAC9CW,EAAK,GAAGxM,MA/CxB,SAAkBT,EAASiN,GACvB,IACIla,EADA0N,EAAQ,GAENiH,EAAIuF,EAAK9b,OACTqP,EAAS,CAACL,IAAK,SAAUnC,GAAIyC,GAASzC,IAC5C,IAAKjL,EAAI,EAAGA,EAAI2U,EAAG3U,IACfka,EAAKla,GAAGqR,KAAKpE,GAASE,OAAOF,EAASQ,GAE1C,OAAOC,EAuCqBiN,CAAS1N,EAASiN,GACtCI,GAAW,GAIF,SAATJ,GAAmBjN,EAAQ2I,OAASoE,EAAKxH,SACzCkI,GAAa,EACbF,EAAWvN,EAAQ2I,KACnB3I,EAAQ2I,KAAOoE,EAAKvH,iBAExB,IAII,GAHAxF,EAAQ2N,eAAe9a,KAAK,IAC5B2a,EAAanb,KAAKoO,MAAM2D,KAAKpE,IAExB3N,KAAKgb,UAAgC,oBAApBG,EAAWva,KAC7B,KAAM,CAAEsW,QAAS,8CACblJ,MAAOhO,KAAKiN,WAAY1L,SAAUvB,KAAKgN,WAAWzL,UAE1D,IAAIsZ,EAAY7a,KAAK6a,UACfU,EAAkB5N,EAAQ2N,eAAeE,MAK/C,OAJKX,GAAaU,EAAgBV,YAC9BA,EAAYU,EAAgBV,WAGzB,IAAIF,EAAYC,EACnBO,EACAN,EACA7a,KAAK8a,MACL9a,KAAKiN,WAAYjN,KAAKgN,WAAYhN,KAAK+a,OACvCC,GAER,MAAOvb,GAKH,KAJuB,iBAAZA,EAAEuO,QACTvO,EAAEuO,MAAQhO,KAAKiN,WACfxN,EAAE8B,SAAWvB,KAAKgN,WAAWzL,UAE3B9B,UAGF2b,IACAzN,EAAQ2I,KAAO4E,KAK3BO,yBACI,OAAO,IAAId,EAAY3a,KAAK4a,KACxB5a,KAAKoO,MACL,aACApO,KAAK8a,MACL9a,KAAKiN,WAAYjN,KAAKgN,WAAYhN,KAAK+a,WCxGnD,iBACI,WAAYpN,EAAS+N,EAAKC,GACtB,IAAI/E,EAAS,GACb,GAAIjJ,EAAQiO,kBAAoBjO,EAAQ8C,SACpC,OAAQ9C,EAAQiO,iBACZ,IAAK,WACDhF,EAASiF,EAAUC,UAAUJ,GAC7B,MACJ,IAAK,aACD9E,EAASiF,EAAUE,aAAaL,GAChC,MACJ,IAAK,MACD9E,EAASiF,EAAUC,UAAUJ,IAAQC,GAAiB,IAAME,EAAUE,aAAaL,GAI/F,OAAO9E,EAmBf,OAhBWiF,YAAP,SAAiBH,GACb,MAAO,WAAWA,EAAIG,UAAUG,gBAAeN,EAAIG,UAAUI,kBAG1DJ,eAAP,SAAoBH,GAChB,IAAIQ,EAAuBR,EAAIG,UAAUI,SAIzC,MAHK,gBAAgBE,KAAKD,KACtBA,EAAuB,UAAUA,GAE9B,gDAAgDA,EAAqB/e,QAAQ,eAAe,SAAUqR,GAIzG,MAHS,MAALA,IACAA,EAAI,KAED,KAAKA,iCACckN,EAAIG,UAAUG,wBC9B9CI,EAAU,SAAShO,EAAOiO,EAAerO,EAAO0E,GAClD1S,KAAKoO,MAAQA,EACbpO,KAAKqc,cAAgBA,EACrBrc,KAAKyN,OAASO,EACdhO,KAAK0N,UAAYgF,EACjB1S,KAAKua,WAAY,GAGrB6B,EAAQrM,UAAYlD,OAAOmD,OAAO,IAAI9C,EAAQ,CAC1CtM,KAAM,UAENiN,gBAAOF,EAASQ,GACRnO,KAAK6b,WACL1N,EAAOL,IAAIwO,EAAa3O,EAAS3N,MAAOA,KAAKgN,WAAYhN,KAAKiN,YAElEkB,EAAOL,IAAI9N,KAAKoO,QAGpBmO,kBAAS5O,GACL,IAAM6O,EAAe7O,EAAQ8C,UAA8B,MAAlBzQ,KAAKoO,MAAM,GACpD,OAAOpO,KAAKqc,eAAiBG,KCvBrC,IAAMC,EAAW,GAIXC,EAAmB,SAA0BC,EAAUC,EAAaC,GACtE,GAAKF,EAEL,IAAK,IAAIjc,EAAI,EAAGA,EAAImc,EAAiB/d,OAAQ4B,IACrCic,EAASlf,eAAeof,EAAiBnc,MACzCkc,EAAYC,EAAiBnc,IAAMic,EAASE,EAAiBnc,MAQnEoc,EAAsB,CAExB,QACA,cACA,WACA,gBACA,WACA,kBACA,WACA,aACA,aACA,OACA,eAEA,iBAEA,iBAGJL,EAASM,MAAQ,SAAS1f,GACtBqf,EAAiBrf,EAAS2C,KAAM8c,GAEN,iBAAf9c,KAAKgd,QAAsBhd,KAAKgd,MAAQ,CAAChd,KAAKgd,SAG7D,IAAMC,EAAqB,CACvB,QACA,WACA,OACA,cACA,YACA,iBACA,UACA,oBACA,gBACA,iBACA,eAsGJ,SAASC,EAAeC,GACpB,OAAQ,sBAAsBhB,KAAKgB,GAGvC,SAASC,EAAoBD,GACzB,MAA0B,MAAnBA,EAAKlK,OAAO,GAxGvBwJ,EAASY,KAAO,SAAShgB,EAASigB,GAC9BZ,EAAiBrf,EAAS2C,KAAMid,GAEN,iBAAfjd,KAAKgd,QAAsBhd,KAAKgd,MAAQ,CAAChd,KAAKgd,QAEzDhd,KAAKsd,OAASA,GAAU,GACxBtd,KAAKsb,eAAiBtb,KAAKsb,gBAAkB,IAGjDmB,EAASY,KAAKtN,UAAUwN,UAAY,WAC3Bvd,KAAKwd,YACNxd,KAAKwd,UAAY,IAErBxd,KAAKwd,UAAUhd,MAAK,GACpBR,KAAKyd,QAAS,GAGlBhB,EAASY,KAAKtN,UAAU2N,SAAW,WAC/B1d,KAAKwd,UAAUhC,MACVxb,KAAKwd,UAAU1e,SAChBkB,KAAKyd,QAAS,IAItBhB,EAASY,KAAKtN,UAAU4N,cAAgB,WAC/B3d,KAAK4d,cACN5d,KAAK4d,YAAc,IAEvB5d,KAAK4d,YAAYpd,MAAK,IAG1Bic,EAASY,KAAKtN,UAAU8N,iBAAmB,WACvC7d,KAAK4d,YAAYpC,OAGrBiB,EAASY,KAAKtN,UAAU0N,QAAS,EACjChB,EAASY,KAAKtN,UAAU+N,QAAS,EACjCrB,EAASY,KAAKtN,UAAUgO,SAAW,SAAUxP,GACzC,QAAKvO,KAAK8d,YAGC,MAAPvP,GAAcvO,KAAKsW,OAASC,EAAerD,QAAYlT,KAAK4d,aAAgB5d,KAAK4d,YAAY9e,YAG7FkB,KAAKsW,KAAOC,EAAepD,kBACpBnT,KAAK4d,aAAe5d,KAAK4d,YAAY9e,UAKpD2d,EAASY,KAAKtN,UAAUiO,oBAAsB,SAAUb,GAGpD,OAFmBnd,KAAKyW,cAAgBC,EAA8B0G,EAAsBF,GAE1EC,IAGtBV,EAASY,KAAKtN,UAAUkO,YAAc,SAAUd,EAAMe,GAClD,IAAIC,EAaJ,OAXAD,EAAWA,GAAY,GACvBC,EAAUne,KAAKoe,cAAcF,EAAWf,GAIpCC,EAAoBD,IACpBD,EAAegB,KACkB,IAAjCd,EAAoBe,KACpBA,EAAU,KAAKA,GAGZA,GAGX1B,EAASY,KAAKtN,UAAUqO,cAAgB,SAAUjB,GAC9C,IACIkB,EADEC,EAAWnB,EAAK5N,MAAM,KAAKgP,UAIjC,IADApB,EAAO,GACoB,IAApBmB,EAASxf,QAEZ,OADAuf,EAAUC,EAAS9C,OAEf,IAAK,IACD,MACJ,IAAK,KACoB,IAAhB2B,EAAKre,QAA4C,OAA1Bqe,EAAKA,EAAKre,OAAS,GAC3Cqe,EAAK3c,KAAM6d,GAEXlB,EAAK3B,MAET,MACJ,QACI2B,EAAK3c,KAAK6d,GAKtB,OAAOlB,EAAKjP,KAAK,YCxJrB,SAASsQ,EAAcC,GACnB,MAAO,CACHC,MAAO,GACP5Q,IAAK,SAAS8M,EAAMhD,GAGhBgD,EAAOA,EAAKhJ,cAER5R,KAAK0e,MAAMjhB,eAAemd,GAG9B5a,KAAK0e,MAAM9D,GAAQhD,GAEvB+G,YAAa,SAAS1d,GAAT,WACT4L,OAAO+R,KAAK3d,GAAWuM,SACnB,SAAAoN,GACIiE,EAAK/Q,IAAI8M,EAAM3Z,EAAU2Z,QAGrC7N,IAAK,SAAS6N,GACV,OAAO5a,KAAK0e,MAAM9D,IAAW6D,GAAQA,EAAK1R,IAAK6N,IAEnDkE,kBAAmB,WACf,OAAO9e,KAAK0e,OAEhBK,QAAS,WACL,OAAOP,EAAcxe,OAEzBiY,OAAQ,SAASwG,GACb,OAAOD,EAAaC,KAKjBD,CAAc,MChCvBQ,EAAc,CAChBjN,KAAM,WACF,IAAMtC,EAAIzP,KAAKif,OACTxf,EAAIO,KAAKkf,OACf,GAAIzf,EACA,MAAMA,EAEV,GAAS,MAALgQ,EACA,OAAOA,EAAIwK,EAAQC,KAAOD,EAAQE,OAG1C/L,MAAO,SAAUqB,GACbzP,KAAKif,OAASxP,GAElB3P,MAAO,SAAUL,GACbO,KAAKkf,OAASzf,GAElB0f,MAAO,WACHnf,KAAKif,OAASjf,KAAKkf,OAAS,OCN9BE,EAAU,SAASC,EAAWC,EAAOC,EAAe5M,GACtD3S,KAAKqf,UAAYA,EACjBrf,KAAKsf,MAAQA,EACbtf,KAAKwf,SAAW,GAChBxf,KAAKyf,WAAa,KAClBzf,KAAK0f,YAAc,KACnB1f,KAAKuf,cAAgBA,EACrBvf,KAAK4S,mBAAmBD,GACxB3S,KAAKua,WAAY,EAEjBva,KAAK6S,UAAU7S,KAAKqf,UAAWrf,MAC/BA,KAAK6S,UAAU7S,KAAKsf,MAAOtf,OAG/Bof,EAAQrP,UAAYlD,OAAOmD,OAAO,IAAI9C,EAAQ,CAC1CtM,KAAM,UACN+e,WAAW,EAEXnF,yBAAkB,OAAO,GAEzB1H,gBAAOzE,GACCrO,KAAKgd,MACLhd,KAAKgd,MAAQ3O,EAAQyK,WAAW9Y,KAAKgd,OAAO,GACrChd,KAAKqf,YACZrf,KAAKqf,UAAYhR,EAAQyK,WAAW9Y,KAAKqf,YAEzCrf,KAAKsf,OAAStf,KAAKsf,MAAMxgB,SACzBkB,KAAKsf,MAAQjR,EAAQyK,WAAW9Y,KAAKsf,SAI7CvN,cAAKpE,GAED,IAAI0R,EACAO,EACAC,EACAnf,EACAof,EACAC,GAAwB,EAE5B,GAAI/f,KAAKqf,YAAcO,EAAS5f,KAAKqf,UAAUvgB,QAAS,CAOpD,IANAugB,EAAY,IAAI/R,MAAMsS,GACtBZ,EAAYlf,MAAM,CACdc,KAAM,SACNsW,QAAS,6DAGRxW,EAAI,EAAGA,EAAIkf,EAAQlf,IAAK,CACzBmf,EAAW7f,KAAKqf,UAAU3e,GAAGqR,KAAKpE,GAClC,IAAK,IAAIqG,EAAI,EAAGA,EAAI6L,EAASrH,SAAS1Z,OAAQkV,IAC1C,GAAI6L,EAASrH,SAASxE,GAAGvB,WAAY,CACjCqN,GAAc,EACd,MAGRT,EAAU3e,GAAKmf,EACXA,EAASlH,iBACToH,GAAwB,GAIhC,GAAID,EAAa,CACb,IAAME,EAAmB,IAAI1S,MAAMsS,GACnC,IAAKlf,EAAI,EAAGA,EAAIkf,EAAQlf,IACpBmf,EAAWR,EAAU3e,GACrBsf,EAAiBtf,GAAKmf,EAASxP,MAAM1C,GAEzC3N,KAAKrC,MAAMwb,UACP6G,EAAiB9R,KAAK,KACtB,CAAC,aACDmR,EAAU,GAAGpS,WACboS,EAAU,GAAGrS,YACb,SAASoM,EAAKxC,GACNA,IACAyI,EAAYY,EAAmBrJ,OAK/CoI,EAAYG,aAEZY,GAAwB,EAG5B,IAEIG,EACAC,EAHAb,EAAQtf,KAAKsf,MAAQc,EAAgBpgB,KAAKsf,OAAS,KACjDe,EAAU,IAAIjB,EAAQC,EAAWC,EAAOtf,KAAKuf,cAAevf,KAAK2S,kBAIvE0N,EAAQC,gBAAkBtgB,KAC1BqgB,EAAQE,KAAOvgB,KAAKugB,KACpBF,EAAQG,UAAYxgB,KAAKwgB,UACzBH,EAAQI,aAAezgB,KAAKygB,aAExBzgB,KAAK6b,YACLwE,EAAQxE,UAAY7b,KAAK6b,WAGxBkE,IACDT,EAAMxgB,OAAS,GAKnBuhB,EAAQK,iBAAoB,SAAUpD,GAIlC,IAHA,IAEI3F,EAFAjX,EAAI,EACF2U,EAAIiI,EAAOxe,OAET4B,IAAM2U,IAAM3U,EAEhB,GADAiX,EAAQ2F,EAAQ5c,GAAIggB,iBACL,OAAO/I,EAE1B,OAAOgJ,EARgB,CASzBhT,EAAQ2P,QAASyB,UAGnB,IAAM6B,EAAYjT,EAAQ2P,OAC1BsD,EAAUC,QAAQR,GAGlB,IAAIS,EAAenT,EAAQ0R,UACtByB,IACDnT,EAAQ0R,UAAYyB,EAAe,IAEvCA,EAAaD,QAAQ7gB,KAAKqf,YAGtBgB,EAAQE,MAAQF,EAAQI,eAAiBJ,EAAQd,gBACjDc,EAAQU,YAAYpT,GAKxB,IAAMqT,EAAUX,EAAQf,MACxB,IAAK5e,EAAI,EAAIwf,EAAOc,EAAQtgB,GAAKA,IACzBwf,EAAKe,YACLD,EAAQtgB,GAAKwf,EAAKnO,KAAKpE,IAI/B,IAAMuT,EAAmBvT,EAAQwT,aAAexT,EAAQwT,YAAYriB,QAAW,EAG/E,IAAK4B,EAAI,EAAIwf,EAAOc,EAAQtgB,GAAKA,IACX,cAAdwf,EAAKtf,MAEL0e,EAAQY,EAAKnO,KAAKpE,GAASyT,QAAO,SAASlR,GACvC,QAAKA,aAAayK,GAAgBzK,EAAE8K,YAIvBqF,EAAQrF,SAAS9K,EAAE0K,SAIpCoG,EAAQrgB,OAAO0gB,MAAML,EAAS,CAACtgB,EAAG,GAAGQ,OAAOoe,IAC5C5e,GAAK4e,EAAMxgB,OAAS,EACpBuhB,EAAQiB,cACc,iBAAfpB,EAAKtf,OAEZ0e,EAAQY,EAAKnO,KAAKpE,GAAS2R,MAAM8B,QAAO,SAASlR,GAC7C,QAAKA,aAAayK,GAAgBzK,EAAE8K,aAMxCgG,EAAQrgB,OAAO0gB,MAAML,EAAS,CAACtgB,EAAG,GAAGQ,OAAOoe,IAC5C5e,GAAK4e,EAAMxgB,OAAS,EACpBuhB,EAAQiB,cAKhB,IAAK5gB,EAAI,EAAIwf,EAAOc,EAAQtgB,GAAKA,IACxBwf,EAAKe,YACND,EAAQtgB,GAAKwf,EAAOA,EAAKnO,KAAOmO,EAAKnO,KAAKpE,GAAWuS,GAK7D,IAAKxf,EAAI,EAAIwf,EAAOc,EAAQtgB,GAAKA,IAE7B,GAAIwf,aAAgBd,GAAWc,EAAKb,WAAuC,IAA1Ba,EAAKb,UAAUvgB,QAExDohB,EAAKb,UAAU,IAAMa,EAAKb,UAAU,GAAGxF,uBAAwB,CAC/DmH,EAAQrgB,OAAOD,IAAK,GAEpB,IAASsT,EAAI,EAAImM,EAAUD,EAAKZ,MAAMtL,GAAKA,IACnCmM,aAAmBjT,IACnBiT,EAAQvN,mBAAmBsN,EAAKvN,kBAC1BwN,aAAmBxF,GAAiBwF,EAAQnF,UAC9CgG,EAAQrgB,SAASD,EAAG,EAAGyf,IAY/C,GAHAS,EAAUhH,QACVkH,EAAalH,QAETjM,EAAQwT,YACR,IAAKzgB,EAAIwgB,EAAiBxgB,EAAIiN,EAAQwT,YAAYriB,OAAQ4B,IACtDiN,EAAQwT,YAAYzgB,GAAG6gB,gBAAgBlC,GAI/C,OAAOgB,GAGXU,qBAAYpT,GACR,IACIjN,EACA8gB,EAFElC,EAAQtf,KAAKsf,MAGnB,GAAKA,EAEL,IAAK5e,EAAI,EAAGA,EAAI4e,EAAMxgB,OAAQ4B,IACJ,WAAlB4e,EAAM5e,GAAGE,QACT4gB,EAAclC,EAAM5e,GAAGqR,KAAKpE,MACR6T,EAAY1iB,QAAiC,IAAvB0iB,EAAY1iB,SAClDwgB,EAAM3e,OAAO0gB,MAAM/B,EAAO,CAAC5e,EAAG,GAAGQ,OAAOsgB,IACxC9gB,GAAK8gB,EAAY1iB,OAAS,GAE1BwgB,EAAM3e,OAAOD,EAAG,EAAG8gB,GAEvBxhB,KAAKshB,eAKjB7F,yBASI,OARe,IAAI2D,EAAQpf,KAAKqf,UAAWrf,KAAKsf,MAAMnQ,KAAI,SAAUe,GAChE,OAAIA,EAAEuL,cACKvL,EAAEuL,gBAEFvL,KAEXlQ,KAAKuf,cAAevf,KAAK2S,mBAKjC8O,mBAAU/Q,GACN,OAAQA,GAAwB,IAAhBA,EAAK5R,QAIzB4iB,wBAAehR,EAAM/C,GACjB,IAAMgU,EAAe3hB,KAAKqf,UAAUrf,KAAKqf,UAAUvgB,OAAS,GAC5D,QAAK6iB,EAAahJ,kBAGdgJ,EAAajJ,YACZiJ,EAAajJ,UAAU3G,KACpB,IAAI0K,EAASY,KAAK1P,EACdA,EAAQ2P,WAMxBgE,sBACIthB,KAAK4hB,UAAY,KACjB5hB,KAAKyf,WAAa,KAClBzf,KAAK0f,YAAc,KACnB1f,KAAKwf,SAAW,IAGpBqC,qBAoBI,OAnBK7hB,KAAKyf,aACNzf,KAAKyf,WAAczf,KAAKsf,MAAatf,KAAKsf,MAAMjL,QAAO,SAAUyN,EAAM5R,GAOnE,GANIA,aAAayK,IAA8B,IAAfzK,EAAE8K,WAC9B8G,EAAK5R,EAAE0K,MAAQ1K,GAKJ,WAAXA,EAAEtP,MAAqBsP,EAAEqQ,MAAQrQ,EAAEqQ,KAAKsB,UAAW,CACnD,IAAME,EAAO7R,EAAEqQ,KAAKsB,YACpB,IAAK,IAAMG,KAAQD,EACXA,EAAKtkB,eAAeukB,KACpBF,EAAKE,GAAQ9R,EAAEqQ,KAAKvF,SAASgH,IAIzC,OAAOF,IACR,IAhB6B,IAkB7B9hB,KAAKyf,YAGhBwC,sBAiBI,OAhBKjiB,KAAK0f,cACN1f,KAAK0f,YAAe1f,KAAKsf,MAAatf,KAAKsf,MAAMjL,QAAO,SAAUyN,EAAM5R,GACpE,GAAIA,aAAayK,IAA8B,IAAfzK,EAAE8K,SAAmB,CACjD,IAAMkH,EAA0B,IAAlBhS,EAAE0K,KAAK9b,QAAkBoR,EAAE0K,KAAK,aAAcX,EACxD/J,EAAE0K,KAAK,GAAGxM,MAAQ8B,EAAE0K,KAEnBkH,EAAK,IAAII,GAIVJ,EAAK,IAAII,GAAQ1hB,KAAK0P,GAHtB4R,EAAK,IAAII,GAAU,CAAEhS,GAM7B,OAAO4R,IACR,IAb8B,IAe9B9hB,KAAK0f,aAGhB1E,kBAASJ,GACL,IAAMuH,EAAOniB,KAAK6hB,YAAYjH,GAC9B,GAAIuH,EACA,OAAOniB,KAAKoiB,WAAWD,IAI/BE,kBAASzH,GACL,IAAMuH,EAAOniB,KAAKiiB,aAAarH,GAC/B,GAAIuH,EACA,OAAOniB,KAAKoiB,WAAWD,IAI/BG,2BACI,IAAK,IAAI5hB,EAAIV,KAAKsf,MAAMxgB,OAAQ4B,EAAI,EAAGA,IAAK,CACxC,IAAMyhB,EAAOniB,KAAKsf,MAAM5e,EAAI,GAC5B,GAAIyhB,aAAgBxH,EAChB,OAAO3a,KAAKoiB,WAAWD,KAKnCC,oBAAWG,GACP,IAAM3V,EAAO5M,KACb,SAASwiB,EAAqBL,GAC1B,OAAIA,EAAK/T,iBAAiBgM,IAAc+H,EAAKxV,QACT,iBAArBwV,EAAK/T,MAAMA,MAClBpO,KAAKrC,MAAMwb,UACPgJ,EAAK/T,MAAMA,MACX,CAAC,QAAS,aACV+T,EAAK/T,MAAMnB,WACXkV,EAAKnV,YACL,SAASoM,EAAKxC,GACNwC,IACA+I,EAAKxV,QAAS,GAEdiK,IACAuL,EAAK/T,MAAQwI,EAAO,GACpBuL,EAAKtH,UAAYjE,EAAO,IAAM,GAC9BuL,EAAKxV,QAAS,MAI1BwV,EAAKxV,QAAS,EAGXwV,GAGAA,EAGf,GAAK7U,MAAMC,QAAQgV,GAGd,CACD,IAAME,EAAQ,GAId,OAHAF,EAAQ/U,SAAQ,SAAS6H,GACrBoN,EAAMjiB,KAAKgiB,EAAqBhP,KAAK5G,EAAMyI,OAExCoN,EAPP,OAAOD,EAAqBhP,KAAK5G,EAAM2V,IAW/CG,oBACI,IAAK1iB,KAAKsf,MAAS,MAAO,GAE1B,IAEI5e,EACAwf,EAHEyC,EAAY,GACZrD,EAAQtf,KAAKsf,MAInB,IAAK5e,EAAI,EAAIwf,EAAOZ,EAAM5e,GAAKA,IACvBwf,EAAKP,WACLgD,EAAUniB,KAAK0f,GAIvB,OAAOyC,GAGXC,qBAAY1C,GACR,IAAMZ,EAAQtf,KAAKsf,MACfA,EACAA,EAAMuB,QAAQX,GAEdlgB,KAAKsf,MAAQ,CAAEY,GAEnBlgB,KAAK6S,UAAUqN,EAAMlgB,OAGzB6iB,cAAKhD,EAAUjT,EAAMwU,GACjBxU,EAAOA,GAAQ5M,KACf,IACIkP,EACA4T,EAFExD,EAAQ,GAGR3N,EAAMkO,EAASxP,QAErB,OAAIsB,KAAO3R,KAAKwf,SAAmBxf,KAAKwf,SAAS7N,IAEjD3R,KAAK0iB,WAAWlV,SAAQ,SAAU0S,GAC9B,GAAIA,IAAStT,EACT,IAAK,IAAIoH,EAAI,EAAGA,EAAIkM,EAAKb,UAAUvgB,OAAQkV,IAEvC,GADA9E,EAAQ2Q,EAAS3Q,MAAMgR,EAAKb,UAAUrL,IAC3B,CACP,GAAI6L,EAASrH,SAAS1Z,OAASoQ,GAC3B,IAAKkS,GAAUA,EAAOlB,GAAO,CACzB4C,EAAc5C,EAAK2C,KAAK,IAAItK,EAASsH,EAASrH,SAAS3G,MAAM3C,IAAStC,EAAMwU,GAC5E,IAAK,IAAI1gB,EAAI,EAAGA,EAAIoiB,EAAYhkB,SAAU4B,EACtCoiB,EAAYpiB,GAAGyc,KAAK3c,KAAK0f,GAE7B5S,MAAMyC,UAAUvP,KAAK6gB,MAAM/B,EAAOwD,SAGtCxD,EAAM9e,KAAK,CAAE0f,OAAM/C,KAAM,KAE7B,UAKhBnd,KAAKwf,SAAS7N,GAAO2N,EACdA,IAGXzR,gBAAOF,EAASQ,GACZ,IAAIzN,EACAsT,EAKA6H,EAEAqE,EACA/C,EANA4F,EAAY,GAQhBpV,EAAQqV,SAAYrV,EAAQqV,UAAY,EAEnChjB,KAAKugB,MACN5S,EAAQqV,WAGZ,IAEIC,EAFEC,EAAavV,EAAQ8C,SAAW,GAAKnD,MAAMK,EAAQqV,SAAW,GAAG9U,KAAK,MACtEiV,EAAYxV,EAAQ8C,SAAW,GAAKnD,MAAMK,EAAQqV,UAAU9U,KAAK,MAGnEkV,EAAmB,EACnBC,EAAkB,EACtB,IAAK3iB,EAAI,EAAIwf,EAAOlgB,KAAKsf,MAAM5e,GAAKA,IAC5Bwf,aAAgB9D,GACZiH,IAAoB3iB,GACpB2iB,IAEJN,EAAUviB,KAAK0f,IACRA,EAAKoD,WAAapD,EAAKoD,aAC9BP,EAAUpiB,OAAOyiB,EAAkB,EAAGlD,GACtCkD,IACAC,KACqB,WAAdnD,EAAKtf,MACZmiB,EAAUpiB,OAAO0iB,EAAiB,EAAGnD,GACrCmD,KAEAN,EAAUviB,KAAK0f,GAOvB,GAJA6C,EAtCyB,GAsCI7hB,OAAO6hB,IAI/B/iB,KAAKugB,KAAM,EACZ1E,EAAYS,EAAa3O,EAAS3N,KAAMmjB,MAGpChV,EAAOL,IAAI+N,GACX1N,EAAOL,IAAIqV,IAGf,IAAMnG,EAAQhd,KAAKgd,MACbuG,EAAUvG,EAAMle,OAClB0kB,SAIJ,IAFAP,EAAMtV,EAAQ8C,SAAW,IAAO,MAAM0S,EAEjCziB,EAAI,EAAGA,EAAI6iB,EAAS7iB,IAErB,GAAM8iB,GADNrG,EAAOH,EAAMtc,IACW5B,OAOxB,IANI4B,EAAI,GAAKyN,EAAOL,IAAImV,GAExBtV,EAAQqF,eAAgB,EACxBmK,EAAK,GAAGtP,OAAOF,EAASQ,GAExBR,EAAQqF,eAAgB,EACnBgB,EAAI,EAAGA,EAAIwP,EAAYxP,IACxBmJ,EAAKnJ,GAAGnG,OAAOF,EAASQ,GAIhCA,EAAOL,KAAKH,EAAQ8C,SAAW,IAAM,QAAUyS,GAInD,IAAKxiB,EAAI,EAAIwf,EAAO6C,EAAUriB,GAAKA,IAAK,CAEhCA,EAAI,IAAMqiB,EAAUjkB,SACpB6O,EAAQsN,UAAW,GAGvB,IAAMwI,EAAkB9V,EAAQsN,SAC5BiF,EAAK1F,cAAc0F,KACnBvS,EAAQsN,UAAW,GAGnBiF,EAAKrS,OACLqS,EAAKrS,OAAOF,EAASQ,GACd+R,EAAK9R,OACZD,EAAOL,IAAIoS,EAAK9R,MAAM0B,YAG1BnC,EAAQsN,SAAWwI,GAEd9V,EAAQsN,UAAYiF,EAAKwD,YAC1BvV,EAAOL,IAAIH,EAAQ8C,SAAW,GAAM,KAAKyS,GAEzCvV,EAAQsN,UAAW,EAItBjb,KAAKugB,OACNpS,EAAOL,IAAKH,EAAQ8C,SAAW,IAAM,KAAK0S,OAC1CxV,EAAQqV,YAGP7U,EAAOF,WAAcN,EAAQ8C,WAAYzQ,KAAKwgB,WAC/CrS,EAAOL,IAAI,OAInB6V,uBAAc3G,EAAOrP,EAAS0R,GAC1B,IAAK,IAAI1T,EAAI,EAAGA,EAAI0T,EAAUvgB,OAAQ6M,IAClC3L,KAAK4jB,aAAa5G,EAAOrP,EAAS0R,EAAU1T,KAIpDiY,sBAAa5G,EAAOrP,EAASkS,GAEzB,SAASgE,EAAkBC,EAAeC,GACtC,IAAIC,EAAkBhQ,EACtB,GAA6B,IAAzB8P,EAAchlB,OACdklB,EAAmB,IAAIlS,EAAMgS,EAAc,QACxC,CACH,IAAMG,EAAe,IAAI3W,MAAMwW,EAAchlB,QAC7C,IAAKkV,EAAI,EAAGA,EAAI8P,EAAchlB,OAAQkV,IAClCiQ,EAAajQ,GAAK,IAAIzB,EAClB,KACAuR,EAAc9P,GACd+P,EAAgBtR,WAChBsR,EAAgBtW,OAChBsW,EAAgBrW,WAGxBsW,EAAmB,IAAIlS,EAAM,IAAIyG,EAAS0L,IAE9C,OAAOD,EAGX,SAASE,EAAeC,EAAkBJ,GACtC,IAAIK,EAGJ,OAFAA,EAAU,IAAI7R,EAAQ,KAAM4R,EAAkBJ,EAAgBtR,WAAYsR,EAAgBtW,OAAQsW,EAAgBrW,WACvG,IAAI6K,EAAS,CAAC6L,IAO7B,SAASC,EAAuBC,EAAeC,EAASC,EAAiBC,GACrE,IAAIC,EAAiB/C,EAAcgD,EAenC,GAbAD,EAAkB,GAIdJ,EAAcxlB,OAAS,GAEvB6iB,GADA+C,EAAkBtE,EAAgBkE,IACH9I,MAC/BmJ,EAAoBF,EAAiB1L,cAAcqH,EAAgBuB,EAAanJ,YAGhFmM,EAAoBF,EAAiB1L,cAAc,IAGnDwL,EAAQzlB,OAAS,EAAG,CAMpB,IAAI0T,EAAagS,EAAgBhS,WAE3BoS,EAAWL,EAAQ,GAAG/L,SAAS,GACjChG,EAAWJ,oBAAsBwS,EAASpS,WAAWJ,oBACrDI,EAAaoS,EAASpS,YAG1BmS,EAAkBnM,SAAShY,KAAK,IAAI+R,EAChCC,EACAoS,EAASxW,MACToW,EAAgB/R,WAChB+R,EAAgB/W,OAChB+W,EAAgB9W,YAEpBiX,EAAkBnM,SAAWmM,EAAkBnM,SAAStX,OAAOqjB,EAAQ,GAAG/L,SAAS3G,MAAM,IAS7F,GAL0C,IAAtC8S,EAAkBnM,SAAS1Z,QAC3B4lB,EAAgBlkB,KAAKmkB,GAIrBJ,EAAQzlB,OAAS,EAAG,CACpB,IAAI+lB,EAAaN,EAAQ1S,MAAM,GAC/BgT,EAAaA,EAAW1V,KAAI,SAAU0Q,GAClC,OAAOA,EAAS9G,cAAc8G,EAASrH,SAAU,OAErDkM,EAAkBA,EAAgBxjB,OAAO2jB,GAE7C,OAAOH,EAMX,SAASI,EAA4BR,EAAeS,EAAUP,EAAiBC,EAAkB7N,GAC7F,IAAI5C,EACJ,IAAKA,EAAI,EAAGA,EAAIsQ,EAAcxlB,OAAQkV,IAAK,CACvC,IAAM0Q,EAAkBL,EAAuBC,EAActQ,GAAI+Q,EAAUP,EAAiBC,GAC5F7N,EAAOpW,KAAKkkB,GAEhB,OAAO9N,EAGX,SAASoO,EAA2BxM,EAAU6G,GAC1C,IAAI3e,EAAGukB,EAEP,GAAwB,IAApBzM,EAAS1Z,OAGb,GAAyB,IAArBugB,EAAUvgB,OAKd,IAAK4B,EAAI,EAAIukB,EAAM5F,EAAU3e,GAAKA,IAE1BukB,EAAInmB,OAAS,EACbmmB,EAAIA,EAAInmB,OAAS,GAAKmmB,EAAIA,EAAInmB,OAAS,GAAGia,cAAckM,EAAIA,EAAInmB,OAAS,GAAG0Z,SAAStX,OAAOsX,IAG5FyM,EAAIzkB,KAAK,IAAI+X,EAASC,SAV1B6G,EAAU7e,KAAK,CAAE,IAAI+X,EAASC,KAsItC,SAAS0M,EAAevS,EAAgBwS,GACpC,IAAMnM,EAAcmM,EAAWpM,cAAcoM,EAAW3M,SAAU2M,EAAW1M,WAAY0M,EAAWxM,gBAEpG,OADAK,EAAYpG,mBAAmBD,GACxBqG,EAIX,IAAItY,EAAG0kB,EAKP,IAhIA,SAASC,EAAsBrI,EAAOrP,EAAS2X,GAW3C,IAAI5kB,EAAGsT,EAAGD,EAAGwR,EAAiBC,EAAcC,EAAqBR,EAAK1L,EAA+Bza,EAAQ6iB,EACjFyC,EACpBsB,EAFkEC,GAAoB,EAwB9F,IARAJ,EAAkB,GAIlBC,EAAe,CACX,IAGC9kB,EAAI,EAAI6Y,EAAK+L,EAAW9M,SAAS9X,GAAKA,IAEvC,GAAiB,MAAb6Y,EAAGnL,MAAe,CAClB,IAAMwX,GAzBNF,OAAAA,GADoBtB,EA0BsB7K,GAxBhCnL,iBAAiB0D,IAI/B4T,EAAgBtB,EAAQhW,MAAMA,iBACCmK,EAIxBmN,EARI,MAwBP,GAAsB,MAAlBE,EAAwB,CAGxBZ,EAA2BO,EAAiBC,GAE5C,IACIK,EADEC,EAAc,GAEdC,EAAuB,GAI7B,IAHAF,EAAWR,EAAsBS,EAAanY,EAASiY,GACvDD,EAAoBA,GAAqBE,EAEpC9R,EAAI,EAAGA,EAAI+R,EAAYhnB,OAAQiV,IAAK,CAErC+Q,EAA2BU,EAAc,CADbtB,EAAeL,EAAkBiC,EAAY/R,GAAIwF,GAAKA,IAClBA,EAAI+L,EAAYS,GAEpFP,EAAeO,EACfR,EAAkB,QAElBA,EAAgB/kB,KAAK+Y,OAGtB,CAUH,IATAoM,GAAoB,EAEpBF,EAAsB,GAItBT,EAA2BO,EAAiBC,GAGvCxR,EAAI,EAAGA,EAAIwR,EAAa1mB,OAAQkV,IAIjC,GAHAiR,EAAMO,EAAaxR,GAGI,IAAnBrG,EAAQ7O,OAGJmmB,EAAInmB,OAAS,GACbmmB,EAAI,GAAGzM,SAAShY,KAAK,IAAI+R,EAAQgH,EAAG/G,WAAY,GAAI+G,EAAG9G,WAAY8G,EAAG9L,OAAQ8L,EAAG7L,YAErF+X,EAAoBjlB,KAAKykB,QAIzB,IAAKlR,EAAI,EAAGA,EAAIpG,EAAQ7O,OAAQiV,IAAK,CAGjC,IAAM2Q,EAAkBL,EAAuBY,EAAKtX,EAAQoG,GAAIwF,EAAI+L,GAEpEG,EAAoBjlB,KAAKkkB,GAMrCc,EAAeC,EACfF,EAAkB,GAQ1B,IAFAP,EAA2BO,EAAiBC,GAEvC9kB,EAAI,EAAGA,EAAI8kB,EAAa1mB,OAAQ4B,KACjC5B,EAAS0mB,EAAa9kB,GAAG5B,QACZ,IACTke,EAAMxc,KAAKglB,EAAa9kB,IACxBihB,EAAe6D,EAAa9kB,GAAG5B,EAAS,GACxC0mB,EAAa9kB,GAAG5B,EAAS,GAAK6iB,EAAa5I,cAAc4I,EAAanJ,SAAU8M,EAAW7M,aAInG,OAAOkN,EAaSN,CADpBD,EAAW,GACyCzX,EAASkS,GAGzD,GAAIlS,EAAQ7O,OAAS,EAEjB,IADAsmB,EAAW,GACN1kB,EAAI,EAAGA,EAAIiN,EAAQ7O,OAAQ4B,IAAK,CAEjC,IAAMslB,EAAerY,EAAQjN,GAAGyO,IAAI+V,EAAe7jB,KAAKrB,KAAM6f,EAASlN,mBAEvEqT,EAAaxlB,KAAKqf,GAClBuF,EAAS5kB,KAAKwlB,QAIlBZ,EAAW,CAAC,CAACvF,IAIrB,IAAKnf,EAAI,EAAGA,EAAI0kB,EAAStmB,OAAQ4B,IAC7Bsc,EAAMxc,KAAK4kB,EAAS1kB,OCr0BhC,IAAMulB,EAAS,SACXrL,EACAxM,EACAkR,EACAtR,EACA0E,EACAmJ,EACAqK,EACAvT,GAEA,IAAIjS,EAIJ,GAFAV,KAAK4a,KAAQA,EACb5a,KAAKoO,MAASA,aAAiBlB,EAAQkB,EAASA,EAAQ,IAAIgM,EAAUhM,GAASA,EAC3EkR,EAAO,CAOP,IANIhS,MAAMC,QAAQ+R,GACdtf,KAAKsf,MAAQA,GAEbtf,KAAKsf,MAAQ,CAACA,GACdtf,KAAKsf,MAAM,GAAGD,UAAY,IAAK9G,EAAS,GAAI,KAAM,KAAMvK,EAAO0E,GAAkB4G,wBAEhF5Y,EAAI,EAAGA,EAAIV,KAAKsf,MAAMxgB,OAAQ4B,IAC/BV,KAAKsf,MAAM5e,GAAG+f,cAAe,EAEjCzgB,KAAK6S,UAAU7S,KAAKsf,MAAOtf,MAE/BA,KAAKyN,OAASO,EACdhO,KAAK0N,UAAYgF,EACjB1S,KAAK6b,UAAYA,EACjB7b,KAAKkmB,SAAWA,IAAY,EAC5BlmB,KAAK4S,mBAAmBD,GACxB3S,KAAKua,WAAY,GAGrB0L,EAAOlW,UAAYlD,OAAOmD,OAAO,IAAI9C,EAAQ,CACzCtM,KAAM,SACNkS,gBAAOzE,GACH,IAAMD,EAAQpO,KAAKoO,MAAOkR,EAAQtf,KAAKsf,MACnCA,IACAtf,KAAKsf,MAAQjR,EAAQyK,WAAWwG,IAEhClR,IACApO,KAAKoO,MAAQC,EAAQC,MAAMF,KAInCoM,yBACI,OAAOxa,KAAKsf,QAAUtf,KAAKsjB,aAG/BA,qBACI,MAAO,aAAetjB,KAAK4a,MAG/B/M,gBAAOF,EAASQ,GACZ,IAAMC,EAAQpO,KAAKoO,MAAOkR,EAAQtf,KAAKsf,MACvCnR,EAAOL,IAAI9N,KAAK4a,KAAM5a,KAAKgN,WAAYhN,KAAKiN,YACxCmB,IACAD,EAAOL,IAAI,KACXM,EAAMP,OAAOF,EAASQ,IAEtBmR,EACAtf,KAAKmmB,cAAcxY,EAASQ,EAAQmR,GAEpCnR,EAAOL,IAAI,MAInBiE,cAAKpE,GACD,IAAIyY,EAAiBC,EAAmBjY,EAAQpO,KAAKoO,MAAOkR,EAAQtf,KAAKsf,MAsBzE,OAlBA8G,EAAkBzY,EAAQ2Y,UAC1BD,EAAoB1Y,EAAQwT,YAE5BxT,EAAQ2Y,UAAY,GACpB3Y,EAAQwT,YAAc,GAElB/S,IACAA,EAAQA,EAAM2D,KAAKpE,IAEnB2R,KAEAA,EAAQ,CAACA,EAAM,GAAGvN,KAAKpE,KACjB,GAAG4S,MAAO,GAGpB5S,EAAQ2Y,UAAYF,EACpBzY,EAAQwT,YAAckF,EAEf,IAAIJ,EAAOjmB,KAAK4a,KAAMxM,EAAOkR,EAChCtf,KAAKiN,WAAYjN,KAAKgN,WAAYhN,KAAK6b,UAAW7b,KAAKkmB,SAAUlmB,KAAK2S,mBAG9EqI,kBAASJ,GACL,GAAI5a,KAAKsf,MAEL,OAAOF,EAAQrP,UAAUiL,SAASxH,KAAKxT,KAAKsf,MAAM,GAAI1E,IAI9DiI,gBACI,GAAI7iB,KAAKsf,MAEL,OAAOF,EAAQrP,UAAU8S,KAAKxB,MAAMrhB,KAAKsf,MAAM,GAAIxL,YAI3D4O,oBACI,GAAI1iB,KAAKsf,MAEL,OAAOF,EAAQrP,UAAU2S,SAASrB,MAAMrhB,KAAKsf,MAAM,KAI3D6G,uBAAcxY,EAASQ,EAAQmR,GAC3B,IACI5e,EADE6lB,EAAUjH,EAAMxgB,OAKtB,GAHA6O,EAAQqV,SAAoC,GAAL,EAAnBrV,EAAQqV,UAGxBrV,EAAQ8C,SAAU,CAElB,IADAtC,EAAOL,IAAI,KACNpN,EAAI,EAAGA,EAAI6lB,EAAS7lB,IACrB4e,EAAM5e,GAAGmN,OAAOF,EAASQ,GAI7B,OAFAA,EAAOL,IAAI,UACXH,EAAQqV,WAKZ,IAAMG,EAAY,KAAK7V,MAAMK,EAAQqV,UAAU9U,KAAK,MAASgV,EAAgBC,OAC7E,GAAKoD,EAEE,CAGH,IAFApY,EAAOL,IAAI,KAAKoV,GAChB5D,EAAM,GAAGzR,OAAOF,EAASQ,GACpBzN,EAAI,EAAGA,EAAI6lB,EAAS7lB,IACrByN,EAAOL,IAAIoV,GACX5D,EAAM5e,GAAGmN,OAAOF,EAASQ,GAE7BA,EAAOL,IAAOqV,YARdhV,EAAOL,IAAI,KAAKqV,OAWpBxV,EAAQqV,cCnJhB,IAAMwD,EAAkB,SAASnG,EAAS/C,GACtCtd,KAAKqgB,QAAUA,EACfrgB,KAAKsd,OAASA,EACdtd,KAAK6S,UAAU7S,KAAKqgB,QAASrgB,OAGjCwmB,EAAgBzW,UAAYlD,OAAOmD,OAAO,IAAI9C,EAAQ,CAClDtM,KAAM,kBACNqgB,WAAW,EAEXnO,gBAAOzE,GACHrO,KAAKqgB,QAAUhS,EAAQC,MAAMtO,KAAKqgB,UAGtCtO,cAAKpE,GACD,IAAM2P,EAAStd,KAAKsd,QAAU8C,EAAgBzS,EAAQ2P,QACtD,OAAO,IAAIkJ,EAAgBxmB,KAAKqgB,QAAS/C,IAG7CmJ,kBAAS9Y,GACL,OAAO3N,KAAKqgB,QAAQtO,KAAK/R,KAAKsd,OAAS,IAAIb,EAASY,KAAK1P,EAAS3N,KAAKsd,OAAOpc,OAAOyM,EAAQ2P,SAAW3P,MCpBhH,IAAM+Y,EAAO,SAASC,EAAWC,EAAaC,GAC1C7mB,KAAK2mB,UAAYA,EAAYvG,EAAgBuG,GAAWG,OAAS,GACjE9mB,KAAK4mB,YAAcA,EAAcxG,EAAgBwG,GAAaE,OAAS,GACnED,EACA7mB,KAAK6mB,WAAaA,EACXF,GAAaA,EAAU7nB,SAC9BkB,KAAK6mB,WAAaF,EAAU,KAIpCD,EAAK3W,UAAYlD,OAAOmD,OAAO,IAAI9C,EAAQ,CACvCtM,KAAM,OAENmS,iBACI,OAAO,IAAI2T,EAAKtG,EAAgBpgB,KAAK2mB,WAAYvG,EAAgBpgB,KAAK4mB,aAAc5mB,KAAK6mB,aAG7FhZ,gBAAOF,EAASQ,GAEZ,IAAM4Y,EAAcpZ,GAAWA,EAAQoZ,YACT,IAA1B/mB,KAAK2mB,UAAU7nB,OACfqP,EAAOL,IAAI9N,KAAK2mB,UAAU,KAClBI,GAAe/mB,KAAK6mB,WAC5B1Y,EAAOL,IAAI9N,KAAK6mB,aACRE,GAAe/mB,KAAK4mB,YAAY9nB,QACxCqP,EAAOL,IAAI9N,KAAK4mB,YAAY,KAIpC9W,oBACI,IAAIpP,EAAGsmB,EAAYhnB,KAAK2mB,UAAUzY,KAAK,KACvC,IAAKxN,EAAI,EAAGA,EAAIV,KAAK4mB,YAAY9nB,OAAQ4B,IACrCsmB,GAAa,IAAIhnB,KAAK4mB,YAAYlmB,GAEtC,OAAOsmB,GAGXlY,iBAAQqC,GACJ,OAAOnR,KAAKinB,GAAG9V,EAAMrB,YAAc,OAAItD,GAG3Cya,YAAGC,GACC,OAAOlnB,KAAK8P,WAAWqX,gBAAkBD,EAAWC,eAGxDC,oBACI,OAAOC,OAAO,wDAAyD,MAAMlL,KAAKnc,KAAKqQ,UAG3FpC,mBACI,OAAiC,IAA1BjO,KAAK2mB,UAAU7nB,QAA4C,IAA5BkB,KAAK4mB,YAAY9nB,QAG3DwoB,sBACI,OAAOtnB,KAAK2mB,UAAU7nB,QAAU,GAAiC,IAA5BkB,KAAK4mB,YAAY9nB,QAG1DqQ,aAAIoY,GACA,IAAI7mB,EAEJ,IAAKA,EAAI,EAAGA,EAAIV,KAAK2mB,UAAU7nB,OAAQ4B,IACnCV,KAAK2mB,UAAUjmB,GAAK6mB,EAASvnB,KAAK2mB,UAAUjmB,IAAI,GAGpD,IAAKA,EAAI,EAAGA,EAAIV,KAAK4mB,YAAY9nB,OAAQ4B,IACrCV,KAAK4mB,YAAYlmB,GAAK6mB,EAASvnB,KAAK4mB,YAAYlmB,IAAI,IAI5D8mB,qBACI,IAAIC,EAEAC,EACAC,EAFE/Q,EAAS,GAaf,IAAK+Q,KATLD,EAAU,SAAUE,GAMhB,OAJIH,EAAMhqB,eAAemqB,KAAgBhR,EAAO+Q,KAC5C/Q,EAAO+Q,GAAaC,GAGjBA,GAGOvb,EACVA,EAAgB5O,eAAekqB,KAC/BF,EAAQpb,EAAgBsb,GAExB3nB,KAAKmP,IAAIuY,IAIjB,OAAO9Q,GAGXiR,kBACI,IACID,EACAlnB,EAFEonB,EAAU,GAIhB,IAAKpnB,EAAI,EAAGA,EAAIV,KAAK2mB,UAAU7nB,OAAQ4B,IAEnConB,EADAF,EAAa5nB,KAAK2mB,UAAUjmB,KACLonB,EAAQF,IAAe,GAAK,EAGvD,IAAKlnB,EAAI,EAAGA,EAAIV,KAAK4mB,YAAY9nB,OAAQ4B,IAErConB,EADAF,EAAa5nB,KAAK4mB,YAAYlmB,KACPonB,EAAQF,IAAe,GAAK,EAMvD,IAAKA,KAHL5nB,KAAK2mB,UAAY,GACjB3mB,KAAK4mB,YAAc,GAEAkB,EACf,GAAIA,EAAQrqB,eAAemqB,GAAa,CACpC,IAAMG,EAAQD,EAAQF,GAEtB,GAAIG,EAAQ,EACR,IAAKrnB,EAAI,EAAGA,EAAIqnB,EAAOrnB,IACnBV,KAAK2mB,UAAUnmB,KAAKonB,QAErB,GAAIG,EAAQ,EACf,IAAKrnB,EAAI,EAAGA,GAAKqnB,EAAOrnB,IACpBV,KAAK4mB,YAAYpmB,KAAKonB,GAMtC5nB,KAAK2mB,UAAUG,OACf9mB,KAAK4mB,YAAYE,UC9HzB,IAAMkB,GAAY,SAAS5Z,EAAO6Z,GAE9B,GADAjoB,KAAKoO,MAAQ8Z,WAAW9Z,GACpB+Z,MAAMnoB,KAAKoO,OACX,MAAM,IAAI1O,MAAM,8BAEpBM,KAAKioB,KAAQA,GAAQA,aAAgBvB,EAAQuB,EACzC,IAAIvB,EAAKuB,EAAO,CAACA,QAAQzb,GAC7BxM,KAAK6S,UAAU7S,KAAKioB,KAAMjoB,OAG9BgoB,GAAUjY,UAAYlD,OAAOmD,OAAO,IAAI9C,EAAQ,CAC5CtM,KAAM,YAENkS,gBAAOzE,GACHrO,KAAKioB,KAAO5Z,EAAQC,MAAMtO,KAAKioB,OAGnClW,cAAKpE,GACD,OAAO3N,MAGXooB,mBACI,OAAO,IAAIrZ,EAAM,CAAC/O,KAAKoO,MAAOpO,KAAKoO,MAAOpO,KAAKoO,SAGnDP,gBAAOF,EAASQ,GACZ,GAAKR,GAAWA,EAAQoZ,cAAiB/mB,KAAKioB,KAAKX,aAC/C,MAAM,IAAI5nB,MAAM,sFAAsFM,KAAKioB,KAAKnY,YAGpH,IAAM1B,EAAQpO,KAAK2Q,OAAOhD,EAAS3N,KAAKoO,OACpCia,EAAWC,OAAOla,GAOtB,GALc,IAAVA,GAAeA,EAAQ,MAAYA,GAAS,OAE5Cia,EAAWja,EAAMS,QAAQ,IAAI1R,QAAQ,MAAO,KAG5CwQ,GAAWA,EAAQ8C,SAAU,CAE7B,GAAc,IAAVrC,GAAepO,KAAKioB,KAAKb,WAEzB,YADAjZ,EAAOL,IAAIua,GAKXja,EAAQ,GAAKA,EAAQ,IACrBia,EAAW,EAAW/P,OAAO,IAIrCnK,EAAOL,IAAIua,GACXroB,KAAKioB,KAAKpa,OAAOF,EAASQ,IAM9B+C,iBAAQvD,EAASY,EAAI4C,GAEjB,IAAI/C,EAAQpO,KAAKoR,SAASzD,EAASY,EAAIvO,KAAKoO,MAAO+C,EAAM/C,OAAQ6Z,EAAOjoB,KAAKioB,KAAKlV,QAElF,GAAW,MAAPxE,GAAqB,MAAPA,EACd,GAA8B,IAA1B0Z,EAAKtB,UAAU7nB,QAA4C,IAA5BmpB,EAAKrB,YAAY9nB,OAChDmpB,EAAO9W,EAAM8W,KAAKlV,QACd/S,KAAKioB,KAAKpB,aACVoB,EAAKpB,WAAa7mB,KAAKioB,KAAKpB,iBAE7B,GAAoC,IAAhC1V,EAAM8W,KAAKtB,UAAU7nB,QAA4C,IAA5BmpB,EAAKrB,YAAY9nB,YAE1D,CAGH,GAFAqS,EAAQA,EAAMoX,UAAUvoB,KAAKioB,KAAKT,aAE9B7Z,EAAQoZ,aAAe5V,EAAM8W,KAAKnY,aAAemY,EAAKnY,WACtD,MAAM,IAAIpQ,MAAM,8EACKuoB,EAAKnY,qBAAoBqB,EAAM8W,KAAKnY,iBAG7D1B,EAAQpO,KAAKoR,SAASzD,EAASY,EAAIvO,KAAKoO,MAAO+C,EAAM/C,WAE3C,MAAPG,GACP0Z,EAAKtB,UAAYsB,EAAKtB,UAAUzlB,OAAOiQ,EAAM8W,KAAKtB,WAAWG,OAC7DmB,EAAKrB,YAAcqB,EAAKrB,YAAY1lB,OAAOiQ,EAAM8W,KAAKrB,aAAaE,OACnEmB,EAAKJ,UACS,MAAPtZ,IACP0Z,EAAKtB,UAAYsB,EAAKtB,UAAUzlB,OAAOiQ,EAAM8W,KAAKrB,aAAaE,OAC/DmB,EAAKrB,YAAcqB,EAAKrB,YAAY1lB,OAAOiQ,EAAM8W,KAAKtB,WAAWG,OACjEmB,EAAKJ,UAET,OAAO,IAAIG,GAAU5Z,EAAO6Z,IAGhCnZ,iBAAQqC,GACJ,IAAI3C,EAAGC,EAEP,GAAM0C,aAAiB6W,GAAvB,CAIA,GAAIhoB,KAAKioB,KAAKha,WAAakD,EAAM8W,KAAKha,UAClCO,EAAIxO,KACJyO,EAAI0C,OAIJ,GAFA3C,EAAIxO,KAAKwoB,QACT/Z,EAAI0C,EAAMqX,QACqB,IAA3Bha,EAAEyZ,KAAKnZ,QAAQL,EAAEwZ,MACjB,OAIR,OAAO/a,EAAKub,eAAeja,EAAEJ,MAAOK,EAAEL,SAG1Coa,iBACI,OAAOxoB,KAAKuoB,UAAU,CAAEzpB,OAAQ,KAAM4M,SAAU,IAAKG,MAAO,SAGhE0c,mBAAUG,GACN,IAEIhoB,EACAinB,EACAF,EACAkB,EAEAC,EAPAxa,EAAQpO,KAAKoO,MACX6Z,EAAOjoB,KAAKioB,KAAKlV,QAKnB8V,EAAqB,GAGzB,GAA2B,iBAAhBH,EAA0B,CACjC,IAAKhoB,KAAK2L,EACFA,EAAgB3L,GAAGjD,eAAeirB,MAClCG,EAAqB,IACFnoB,GAAKgoB,GAGhCA,EAAcG,EAiBlB,IAAKlB,KAfLiB,EAAY,SAAUhB,EAAYhB,GAE9B,OAAIa,EAAMhqB,eAAemqB,IACjBhB,EACAxY,GAAiBqZ,EAAMG,GAAcH,EAAMkB,GAE3Cva,GAAiBqZ,EAAMG,GAAcH,EAAMkB,GAGxCA,GAGJf,GAGOc,EACVA,EAAYjrB,eAAekqB,KAC3BgB,EAAaD,EAAYf,GACzBF,EAAQpb,EAAgBsb,GAExBM,EAAK9Y,IAAIyZ,IAMjB,OAFAX,EAAKJ,SAEE,IAAIG,GAAU5Z,EAAO6Z,MCtKpC,IAAMvN,GAAOnE,EAGPuS,GAAY,SAASva,EAAIwa,EAAUC,GACrChpB,KAAKuO,GAAKA,EAAG8D,OACbrS,KAAK+oB,SAAWA,EAChB/oB,KAAKgpB,SAAWA,GAGpBF,GAAU/Y,UAAYlD,OAAOmD,OAAO,IAAI9C,EAAQ,CAC5CtM,KAAM,YAENkS,gBAAOzE,GACHrO,KAAK+oB,SAAW1a,EAAQyK,WAAW9Y,KAAK+oB,WAG5ChX,cAAKpE,GACD,IAA4EY,EAAxEC,EAAIxO,KAAK+oB,SAAS,GAAGhX,KAAKpE,GAAUc,EAAIzO,KAAK+oB,SAAS,GAAGhX,KAAKpE,GAElE,GAAIA,EAAQoQ,SAAS/d,KAAKuO,IAAK,CAQ3B,GAPAA,EAAiB,OAAZvO,KAAKuO,GAAc,IAAMvO,KAAKuO,GAC/BC,aAAawZ,IAAavZ,aAAaM,IACvCP,EAAIA,EAAE4Z,WAEN3Z,aAAauZ,IAAaxZ,aAAaO,IACvCN,EAAIA,EAAE2Z,YAEL5Z,EAAE0C,QAAS,CACZ,GAAI1C,aAAasa,IAAsB,MAATta,EAAED,IAAcZ,EAAQ2I,OAASoE,GAAKvH,gBAChE,OAAO,IAAI2V,GAAU9oB,KAAKuO,GAAI,CAACC,EAAGC,GAAIzO,KAAKgpB,UAE/C,KAAM,CAAEpoB,KAAM,YACVsW,QAAS,gCAGjB,OAAO1I,EAAE0C,QAAQvD,EAASY,EAAIE,GAE9B,OAAO,IAAIqa,GAAU9oB,KAAKuO,GAAI,CAACC,EAAGC,GAAIzO,KAAKgpB,WAInDnb,gBAAOF,EAASQ,GACZnO,KAAK+oB,SAAS,GAAGlb,OAAOF,EAASQ,GAC7BnO,KAAKgpB,UACL7a,EAAOL,IAAI,KAEfK,EAAOL,IAAI9N,KAAKuO,IACZvO,KAAKgpB,UACL7a,EAAOL,IAAI,KAEf9N,KAAK+oB,SAAS,GAAGlb,OAAOF,EAASQ,MC/CzC,IAAM8a,GAAa,SAAS7a,EAAO8a,GAG/B,GAFAlpB,KAAKoO,MAAQA,EACbpO,KAAKkpB,UAAYA,GACZ9a,EACD,MAAM,IAAI1O,MAAM,2CAIxBupB,GAAWlZ,UAAYlD,OAAOmD,OAAO,IAAI9C,EAAQ,CAC7CtM,KAAM,aAENkS,gBAAOzE,GACHrO,KAAKoO,MAAQC,EAAQyK,WAAW9Y,KAAKoO,QAGzC2D,cAAKpE,GACD,IAAIwb,EACErL,EAASnQ,EAAQoQ,WACjBJ,EAAgB3d,KAAKopB,OAEvBC,GAAc,EA0BlB,OAzBI1L,GACAhQ,EAAQgQ,gBAER3d,KAAKoO,MAAMtP,OAAS,EACpBqqB,EAAc,IAAIF,GAAWjpB,KAAKoO,MAAMe,KAAI,SAAU1P,GAClD,OAAKA,EAAEsS,KAGAtS,EAAEsS,KAAKpE,GAFHlO,KAGXO,KAAKkpB,WACoB,IAAtBlpB,KAAKoO,MAAMtP,SACdkB,KAAKoO,MAAM,GAAGgb,QAAWppB,KAAKoO,MAAM,GAAGkb,YAAe3b,EAAQ8P,SAC9D4L,GAAc,GAElBF,EAAcnpB,KAAKoO,MAAM,GAAG2D,KAAKpE,IAEjCwb,EAAcnpB,KAEd2d,GACAhQ,EAAQkQ,oBAER7d,KAAKopB,SAAUppB,KAAKspB,YAAexL,GAAWuL,GACxCF,aAAuBnB,KAC7BmB,EAAc,IAAIrX,EAAMqX,IAErBA,GAGXtb,gBAAOF,EAASQ,GACZ,IAAK,IAAIzN,EAAI,EAAGA,EAAIV,KAAKoO,MAAMtP,OAAQ4B,IACnCV,KAAKoO,MAAM1N,GAAGmN,OAAOF,EAASQ,IACzBnO,KAAKkpB,WAAaxoB,EAAI,EAAIV,KAAKoO,MAAMtP,QACtCqP,EAAOL,IAAI,MAKvByb,6BACIvpB,KAAKoO,MAAQpO,KAAKoO,MAAMgT,QAAO,SAAS3R,GACpC,QAASA,aAAa2M,SCjElC,kBACI,WAAYxB,EAAMjN,EAASK,EAAO0E,GAC9B1S,KAAK4a,KAAOA,EAAKhJ,cACjB5R,KAAKgO,MAAQA,EACbhO,KAAK2N,QAAUA,EACf3N,KAAK0S,gBAAkBA,EAEvB1S,KAAK4X,KAAOjK,EAAQ2P,OAAO,GAAGoD,iBAAiB3T,IAAI/M,KAAK4a,MAuChE,OApCI4O,oBAAA,WACI,OAAO/O,QAAQza,KAAK4X,OAGxB4R,iBAAA,SAAK9Y,GAAL,WACUpD,MAAMC,QAAQmD,KAChBA,EAAO,CAACA,IAEZ,IAAM+Y,EAAWzpB,KAAK4X,KAAK6R,UACV,IAAbA,IACA/Y,EAAOA,EAAKvB,KAAI,SAAAX,GAAK,OAAAA,EAAEuD,KAAK8M,EAAKlR,aAErC,IAAM+b,EAAgB,SAAAC,GAAQ,QAAgB,YAAdA,EAAK/oB,OAkBrC,OAdA8P,EAAOA,EACF0Q,OAAOsI,GACPva,KAAI,SAAAwa,GACD,GAAkB,eAAdA,EAAK/oB,KAAuB,CAC5B,IAAMgpB,EAAWD,EAAKvb,MAAMgT,OAAOsI,GACnC,OAAwB,IAApBE,EAAS9qB,OACF8qB,EAAS,GAET,IAAIX,GAAWW,GAG9B,OAAOD,MAGE,IAAbF,EACOzpB,KAAK4X,WAAL5X,gBC2Gf,IAAK,IAAI2L,EAAI,EAAGjL,EAAI,EAAGmT,EAAKC,UAAUhV,OAAQ4B,EAAImT,EAAInT,IAAKiL,GAAKmI,UAAUpT,GAAG5B,OACxE,IAAIoR,EAAI5C,MAAM3B,GAAIoI,EAAI,EAA3B,IAA8BrT,EAAI,EAAGA,EAAImT,EAAInT,IACzC,IAAK,IAAI8N,EAAIsF,UAAUpT,GAAIsT,EAAI,EAAGC,EAAKzF,EAAE1P,OAAQkV,EAAIC,EAAID,IAAKD,IAC1D7D,EAAE6D,GAAKvF,EAAEwF,GACjB,OAAO9D,ID/GkBlQ,KAAK2N,SAAY+C,IAG/B1Q,KAAK4X,WAAL5X,KAAa0Q,SEvCtBmZ,GAAO,SAASjP,EAAMlK,EAAM1C,EAAO0E,GACrC1S,KAAK4a,KAAOA,EACZ5a,KAAK0Q,KAAOA,EACZ1Q,KAAK8pB,KAAgB,SAATlP,EACZ5a,KAAKyN,OAASO,EACdhO,KAAK0N,UAAYgF,GAGrBmX,GAAK9Z,UAAYlD,OAAOmD,OAAO,IAAI9C,EAAQ,CACvCtM,KAAM,OAENkS,gBAAOzE,GACCrO,KAAK0Q,OACL1Q,KAAK0Q,KAAOrC,EAAQyK,WAAW9Y,KAAK0Q,QAe5CqB,cAAKpE,GAAL,WAIUoc,EAAqBpc,EAAQmQ,OACnCnQ,EAAQmQ,QAAU9d,KAAK8pB,MACnB9pB,KAAK8pB,MAAQnc,EAAQ8P,SACrB9P,EAAQ4P,YAGZ,IAOI3G,EAPE8G,EAAW,YACTmB,EAAKiL,MAAQnc,EAAQ8P,SACrB9P,EAAQ+P,WAEZ/P,EAAQmQ,OAASiM,GAIfC,EAAa,IAAIC,GAAejqB,KAAK4a,KAAMjN,EAAS3N,KAAKiN,WAAYjN,KAAKgN,YAEhF,GAAIgd,EAAWE,UACX,IACItT,EAASoT,EAAWxW,KAAKxT,KAAK0Q,MAC9BgN,IACF,MAAOje,GACL,GAAIA,EAAEhC,eAAe,SAAWgC,EAAEhC,eAAe,UAC7C,MAAMgC,EAEV,KAAM,CACFmB,KAAMnB,EAAEmB,MAAQ,UAChBsW,QAAS,8BAA+BlX,KAAK4a,UAASnb,EAAEyX,QAAU,KAAKzX,EAAEyX,QAAY,IACrFlJ,MAAOhO,KAAKiN,WACZ1L,SAAUvB,KAAKgN,WAAWzL,SAC1B+T,KAAM7V,EAAEuc,WACRzG,OAAQ9V,EAAE0qB,cAKtB,GAAIvT,MAAAA,EAcA,OAXMA,aAAkB1J,IAKhB0J,EAAS,IAAIwD,EAJZxD,IAAqB,IAAXA,EAIYA,EAAO9G,WAHP,OAO/B8G,EAAOnJ,OAASzN,KAAKyN,OACrBmJ,EAAOlJ,UAAY1N,KAAK0N,UACjBkJ,EAGX,IAAMlG,EAAO1Q,KAAK0Q,KAAKvB,KAAI,SAAAX,GAAK,OAAAA,EAAEuD,KAAKpE,MAGvC,OAFA+P,IAEO,IAAImM,GAAK7pB,KAAK4a,KAAMlK,EAAM1Q,KAAKiN,WAAYjN,KAAKgN,aAG3Da,gBAAOF,EAASQ,GACZA,EAAOL,IAAO9N,KAAK4a,SAAS5a,KAAKgN,WAAYhN,KAAKiN,YAElD,IAAK,IAAIvM,EAAI,EAAGA,EAAIV,KAAK0Q,KAAK5R,OAAQ4B,IAClCV,KAAK0Q,KAAKhQ,GAAGmN,OAAOF,EAASQ,GACzBzN,EAAI,EAAIV,KAAK0Q,KAAK5R,QAClBqP,EAAOL,IAAI,MAInBK,EAAOL,IAAI,QCxGnB,IAAMsc,GAAW,SAASxP,EAAM5M,EAAO0E,GACnC1S,KAAK4a,KAAOA,EACZ5a,KAAKyN,OAASO,EACdhO,KAAK0N,UAAYgF,GAGrB0X,GAASra,UAAYlD,OAAOmD,OAAO,IAAI9C,EAAQ,CAC3CtM,KAAM,WAENmR,cAAKpE,GACD,IAAIqN,EAAUJ,EAAO5a,KAAK4a,KAM1B,GAJ2B,IAAvBA,EAAKhK,QAAQ,QACbgK,EAAO,IAAI,IAAIwP,GAASxP,EAAK/I,MAAM,GAAI7R,KAAKiN,WAAYjN,KAAKgN,YAAY+E,KAAKpE,GAASS,OAGvFpO,KAAKqqB,WACL,KAAM,CAAEzpB,KAAM,OACVsW,QAAS,qCAAqC0D,EAC9CrZ,SAAUvB,KAAKgN,WAAWzL,SAC1ByM,MAAOhO,KAAKiN,YAqBpB,GAlBAjN,KAAKqqB,YAAa,EAElBrP,EAAWhb,KAAK6iB,KAAKlV,EAAQ2P,QAAQ,SAAUgN,GAC3C,IAAM7a,EAAI6a,EAAMtP,SAASJ,GACzB,GAAInL,EAAG,CACH,GAAIA,EAAEoL,UACqBlN,EAAQ2N,eAAe3N,EAAQ2N,eAAexc,OAAS,GAC/D+b,UAAYpL,EAAEoL,UAGjC,OAAIlN,EAAQ8P,OACD,IAAKoM,GAAK,QAAS,CAACpa,EAAErB,QAAS2D,KAAKpE,GAGpC8B,EAAErB,MAAM2D,KAAKpE,OAM5B,OADA3N,KAAKqqB,YAAa,EACXrP,EAEP,KAAM,CAAEpa,KAAM,OACVsW,QAAS,YAAY0D,kBACrBrZ,SAAUvB,KAAKgN,WAAWzL,SAC1ByM,MAAOhO,KAAKiN,aAIxB4V,cAAKnN,EAAK6U,GACN,IAAK,IAAI7pB,EAAI,EAAGwP,SAAGxP,EAAIgV,EAAI5W,OAAQ4B,IAE/B,GADAwP,EAAIqa,EAAI/W,KAAKkC,EAAKA,EAAIhV,IACb,OAAOwP,EAEpB,OAAO,QCzDf,IAAMsa,GAAW,SAAS5P,EAAM5M,EAAO0E,GACnC1S,KAAK4a,KAAOA,EACZ5a,KAAKyN,OAASO,EACdhO,KAAK0N,UAAYgF,GAGrB8X,GAASza,UAAYlD,OAAOmD,OAAO,IAAI9C,EAAQ,CAC3CtM,KAAM,WAENmR,cAAKpE,GACD,IAAI0U,EACEzH,EAAO5a,KAAK4a,KAEZ6P,EAAa9c,EAAQ/L,cAAc8oB,KAAKC,SAASC,aAAa7a,UAAU8a,YAE9E,GAAI7qB,KAAKqqB,WACL,KAAM,CAAEzpB,KAAM,OACVsW,QAAS,oCAAoC0D,EAC7CrZ,SAAUvB,KAAKgN,WAAWzL,SAC1ByM,MAAOhO,KAAKiN,YAiCpB,GA9BAjN,KAAKqqB,YAAa,EAElBhI,EAAWriB,KAAK6iB,KAAKlV,EAAQ2P,QAAQ,SAAUgN,GAC3C,IAAI7a,EACEqb,EAAOR,EAAMjI,SAASzH,GAC5B,GAAIkQ,EAAM,CACN,IAAK,IAAIpqB,EAAI,EAAGA,EAAIoqB,EAAKhsB,OAAQ4B,IAC7B+O,EAAIqb,EAAKpqB,GAEToqB,EAAKpqB,GAAK,IAAIia,EAAYlL,EAAEmL,KACxBnL,EAAErB,MACFqB,EAAEoL,UACFpL,EAAEqL,MACFrL,EAAEzB,MACFyB,EAAEiD,gBACFjD,EAAEsL,OACFtL,EAAEuL,UAMV,GAHAyP,EAAWK,IAEXrb,EAAIqb,EAAKA,EAAKhsB,OAAS,IACjB+b,UACqBlN,EAAQ2N,eAAe3N,EAAQ2N,eAAexc,OAAS,GAC/D+b,UAAYpL,EAAEoL,UAGjC,OADApL,EAAIA,EAAErB,MAAM2D,KAAKpE,OAMrB,OADA3N,KAAKqqB,YAAa,EACXhI,EAEP,KAAM,CAAEzhB,KAAM,OACVsW,QAAS,aAAa0D,mBACtBrZ,SAAUvB,KAAK0S,gBAAgBnR,SAC/ByM,MAAOhO,KAAKgO,QAIxB6U,cAAKnN,EAAK6U,GACN,IAAK,IAAI7pB,EAAI,EAAGwP,SAAGxP,EAAIgV,EAAI5W,OAAQ4B,IAE/B,GADAwP,EAAIqa,EAAI/W,KAAKkC,EAAKA,EAAIhV,IACb,OAAOwP,EAEpB,OAAO,QCrEf,IAAM6a,GAAY,SAASpZ,EAAKpD,EAAIH,GAChCpO,KAAK2R,IAAMA,EACX3R,KAAKuO,GAAKA,EACVvO,KAAKoO,MAAQA,GAGjB2c,GAAUhb,UAAYlD,OAAOmD,OAAO,IAAI9C,EAAQ,CAC5CtM,KAAM,YAENmR,cAAKpE,GACD,OAAO,IAAIod,GAAU/qB,KAAK2R,IAAII,KAAO/R,KAAK2R,IAAII,KAAKpE,GAAW3N,KAAK2R,IAC/D3R,KAAKuO,GAAKvO,KAAKoO,OAASpO,KAAKoO,MAAM2D,KAAQ/R,KAAKoO,MAAM2D,KAAKpE,GAAW3N,KAAKoO,QAGnFP,gBAAOF,EAASQ,GACZA,EAAOL,IAAI9N,KAAKqQ,MAAM1C,KAG1B0C,eAAM1C,GACF,IAAIS,EAAQpO,KAAK2R,IAAItB,MAAQrQ,KAAK2R,IAAItB,MAAM1C,GAAW3N,KAAK2R,IAO5D,OALI3R,KAAKuO,KACLH,GAASpO,KAAKuO,GACdH,GAAUpO,KAAKoO,MAAMiC,MAAQrQ,KAAKoO,MAAMiC,MAAM1C,GAAW3N,KAAKoO,OAG3D,IAAIA,SCvBnB,IAAM4c,GAAS,SAAS5S,EAAK6S,EAASC,EAASld,EAAO0E,GAClD1S,KAAKkrB,QAAsB,MAAXA,GAA0BA,EAC1ClrB,KAAKoO,MAAQ6c,GAAW,GACxBjrB,KAAKmrB,MAAQ/S,EAAInF,OAAO,GACxBjT,KAAKyN,OAASO,EACdhO,KAAK0N,UAAYgF,EACjB1S,KAAKorB,cAAgB,iBACrBprB,KAAKqrB,UAAY,kBACjBrrB,KAAKua,UAAY2Q,GAGrBF,GAAOjb,UAAYlD,OAAOmD,OAAO,IAAI9C,EAAQ,CACzCtM,KAAM,SAENiN,gBAAOF,EAASQ,GACPnO,KAAKkrB,SACN/c,EAAOL,IAAI9N,KAAKmrB,MAAOnrB,KAAKgN,WAAYhN,KAAKiN,YAEjDkB,EAAOL,IAAI9N,KAAKoO,OACXpO,KAAKkrB,SACN/c,EAAOL,IAAI9N,KAAKmrB,QAIxBG,6BACI,OAAOtrB,KAAKoO,MAAMc,MAAMlP,KAAKorB,gBAGjCrZ,cAAKpE,GACD,IAAM4d,EAAOvrB,KACToO,EAAQpO,KAAKoO,MASjB,SAASod,EAAiBpd,EAAOqd,EAAQC,GACrC,IAAIC,EAAiBvd,EACrB,GACIA,EAAQud,EAAe7b,WACvB6b,EAAiBvd,EAAMjR,QAAQsuB,EAAQC,SAClCtd,IAAUud,GACnB,OAAOA,EAIX,OAFAvd,EAAQod,EAAiBpd,EAAOpO,KAAKorB,eAhBT,SAAUxtB,EAAGgd,GACrC,IAAMnL,EAAI,IAAI2a,GAAS,IAAIxP,EAAQ2Q,EAAKte,WAAYse,EAAKve,YAAY+E,KAAKpE,GAAS,GACnF,OAAQ8B,aAAaub,GAAUvb,EAAErB,MAAQqB,EAAEY,WAe/CjC,EAAQod,EAAiBpd,EAAOpO,KAAKqrB,WAbT,SAAUztB,EAAGgd,GACrC,IAAMnL,EAAI,IAAI+a,GAAS,IAAI5P,EAAQ2Q,EAAKte,WAAYse,EAAKve,YAAY+E,KAAKpE,GAAS,GACnF,OAAQ8B,aAAaub,GAAUvb,EAAErB,MAAQqB,EAAEY,WAYxC,IAAI2a,GAAOhrB,KAAKmrB,MAAQ/c,EAAQpO,KAAKmrB,MAAO/c,EAAOpO,KAAKkrB,QAASlrB,KAAKiN,WAAYjN,KAAKgN,aAGlG8B,iBAAQqC,GAEJ,MAAmB,WAAfA,EAAMvQ,MAAsBZ,KAAKkrB,SAAY/Z,EAAM+Z,QAG5C/Z,EAAMd,OAASrQ,KAAKqQ,UAAYc,EAAMd,QAAU,OAAI7D,EAFpDU,EAAKub,eAAezoB,KAAKoO,MAAO+C,EAAM/C,UCtDzD,IAAMwd,GAAM,SAASC,EAAK7d,EAAO0E,EAAiBoZ,GAC9C9rB,KAAKoO,MAAQyd,EACb7rB,KAAKyN,OAASO,EACdhO,KAAK0N,UAAYgF,EACjB1S,KAAK8rB,QAAUA,GAGnBF,GAAI7b,UAAYlD,OAAOmD,OAAO,IAAI9C,EAAQ,CACtCtM,KAAM,MAENkS,gBAAOzE,GACHrO,KAAKoO,MAAQC,EAAQC,MAAMtO,KAAKoO,QAGpCP,gBAAOF,EAASQ,GACZA,EAAOL,IAAI,QACX9N,KAAKoO,MAAMP,OAAOF,EAASQ,GAC3BA,EAAOL,IAAI,MAGfiE,cAAKpE,GACD,IACIuQ,EADE2N,EAAM7rB,KAAKoO,MAAM2D,KAAKpE,GAG5B,IAAK3N,KAAK8rB,UAGkB,iBADxB5N,EAAWle,KAAKgN,YAAchN,KAAKgN,WAAWkR,WAErB,iBAAd2N,EAAIzd,OACXT,EAAQqQ,oBAAoB6N,EAAIzd,QAC3Byd,EAAIV,QACLjN,EAAsBA,EAlC1B/gB,QAAQ,eAAe,SAAS+R,GAAS,MAAO,KAAKA,MAoCrD2c,EAAIzd,MAAQT,EAAQsQ,YAAY4N,EAAIzd,MAAO8P,IAE3C2N,EAAIzd,MAAQT,EAAQyQ,cAAcyN,EAAIzd,OAItCT,EAAQoe,UACHF,EAAIzd,MAAMc,MAAM,cAAc,CAC/B,IACM6c,IADwC,IAA5BF,EAAIzd,MAAMwC,QAAQ,KAAc,IAAM,KAC5BjD,EAAQoe,SACJ,IAA5BF,EAAIzd,MAAMwC,QAAQ,KAClBib,EAAIzd,MAAQyd,EAAIzd,MAAMjR,QAAQ,IAAQ4uB,OAEtCF,EAAIzd,OAAS2d,EAM7B,OAAO,IAAIH,GAAIC,EAAK7rB,KAAKiN,WAAYjN,KAAKgN,YAAY,MClD9D,IAAMgf,GAAQ,SAAS5d,EAAO6d,EAAUje,EAAO0E,EAAiBC,GAC5D3S,KAAKyN,OAASO,EACdhO,KAAK0N,UAAYgF,EAEjB,IAAM2M,EAAY,IAAK9G,EAAS,GAAI,KAAM,KAAMvY,KAAKyN,OAAQzN,KAAK0N,WAAY4L,uBAE9EtZ,KAAKisB,SAAW,IAAIjS,EAAMiS,GAC1BjsB,KAAKsf,MAAQ,CAAC,IAAIF,EAAQC,EAAWjR,IACrCpO,KAAKsf,MAAM,GAAGmB,cAAe,EAC7BzgB,KAAK4S,mBAAmBD,GACxB3S,KAAKua,WAAY,EACjBva,KAAK6S,UAAUwM,EAAWrf,MAC1BA,KAAK6S,UAAU7S,KAAKisB,SAAUjsB,MAC9BA,KAAK6S,UAAU7S,KAAKsf,MAAOtf,OAG/BgsB,GAAMjc,UAAYlD,OAAOmD,OAAO,IAAIiW,EAAU,CAC1CrlB,KAAM,QAEN4Z,yBACI,OAAO,GAGX1H,gBAAOzE,GACCrO,KAAKisB,WACLjsB,KAAKisB,SAAW5d,EAAQC,MAAMtO,KAAKisB,WAEnCjsB,KAAKsf,QACLtf,KAAKsf,MAAQjR,EAAQyK,WAAW9Y,KAAKsf,SAI7CzR,gBAAOF,EAASQ,GACZA,EAAOL,IAAI,UAAW9N,KAAK0N,UAAW1N,KAAKyN,QAC3CzN,KAAKisB,SAASpe,OAAOF,EAASQ,GAC9BnO,KAAKmmB,cAAcxY,EAASQ,EAAQnO,KAAKsf,QAG7CvN,cAAKpE,GACIA,EAAQwT,cACTxT,EAAQwT,YAAc,GACtBxT,EAAQ2Y,UAAY,IAGxB,IAAM7nB,EAAQ,IAAIutB,GAAM,KAAM,GAAIhsB,KAAKyN,OAAQzN,KAAK0N,UAAW1N,KAAK2S,kBAkBpE,OAjBI3S,KAAK6b,YACL7b,KAAKsf,MAAM,GAAGzD,UAAY7b,KAAK6b,UAC/Bpd,EAAMod,UAAY7b,KAAK6b,WAG3Bpd,EAAMwtB,SAAWjsB,KAAKisB,SAASla,KAAKpE,GAEpCA,EAAQ2Y,UAAU9lB,KAAK/B,GACvBkP,EAAQwT,YAAY3gB,KAAK/B,GAEzBuB,KAAKsf,MAAM,GAAGoB,iBAAmB/S,EAAQ2P,OAAO,GAAGoD,iBAAiB3B,UACpEpR,EAAQ2P,OAAOuD,QAAQ7gB,KAAKsf,MAAM,IAClC7gB,EAAM6gB,MAAQ,CAACtf,KAAKsf,MAAM,GAAGvN,KAAKpE,IAClCA,EAAQ2P,OAAO1D,QAEfjM,EAAQ2Y,UAAU9K,MAEkB,IAA7B7N,EAAQ2Y,UAAUxnB,OAAeL,EAAMytB,QAAQve,GAClDlP,EAAM0tB,WAAWxe,IAGzBue,iBAAQve,GACJ,IAAIiJ,EAAS5W,KAGb,GAAI2N,EAAQwT,YAAYriB,OAAS,EAAG,CAChC,IAAMugB,EAAY,IAAK9G,EAAS,GAAI,KAAM,KAAMvY,KAAKiN,WAAYjN,KAAKgN,YAAasM,wBACnF1C,EAAS,IAAIwI,EAAQC,EAAW1R,EAAQwT,cACjCiL,YAAa,EACpBxV,EAAOhE,mBAAmB5S,KAAK2S,kBAC/B3S,KAAK6S,UAAU+D,EAAQ5W,MAM3B,cAHO2N,EAAQwT,mBACRxT,EAAQ2Y,UAER1P,GAGXuV,oBAAWxe,GACP,IAAIjN,EACA0N,EACE+O,EAAOxP,EAAQ2Y,UAAUplB,OAAO,CAAClB,OAGvC,IAAKU,EAAI,EAAGA,EAAIyc,EAAKre,OAAQ4B,IACzB0N,EAAQ+O,EAAKzc,GAAGurB,oBAAoBjS,EAChCmD,EAAKzc,GAAGurB,SAAS7d,MAAQ+O,EAAKzc,GAAGurB,SACrC9O,EAAKzc,GAAK4M,MAAMC,QAAQa,GAASA,EAAQ,CAACA,GAsB9C,OAZApO,KAAKisB,SAAW,IAAIjS,EAAMha,KAAKqsB,QAAQlP,GAAMhO,KAAI,SAAAgO,GAG7C,IAFAA,EAAOA,EAAKhO,KAAI,SAAAmd,GAAY,OAAAA,EAASjc,MAAQic,EAAW,IAAIlS,EAAUkS,MAEjE5rB,EAAIyc,EAAKre,OAAS,EAAG4B,EAAI,EAAGA,IAC7Byc,EAAKxc,OAAOD,EAAG,EAAG,IAAI0Z,EAAU,QAGpC,OAAO,IAAI6O,GAAW9L,OAE1Bnd,KAAK6S,UAAU7S,KAAKisB,SAAUjsB,MAGvB,IAAIof,EAAQ,GAAI,KAG3BiN,iBAAQ5W,GACJ,GAAmB,IAAfA,EAAI3W,OACJ,MAAO,GACJ,GAAmB,IAAf2W,EAAI3W,OACX,OAAO2W,EAAI,GAIX,IAFA,IAAMmB,EAAS,GACT2V,EAAOvsB,KAAKqsB,QAAQ5W,EAAI5D,MAAM,IAC3BnR,EAAI,EAAGA,EAAI6rB,EAAKztB,OAAQ4B,IAC7B,IAAK,IAAIsT,EAAI,EAAGA,EAAIyB,EAAI,GAAG3W,OAAQkV,IAC/B4C,EAAOpW,KAAK,CAACiV,EAAI,GAAGzB,IAAI9S,OAAOqrB,EAAK7rB,KAG5C,OAAOkW,GAIf2K,yBAAgBlC,GACPA,IAGLrf,KAAKsf,MAAQ,CAAC,IAAIF,EAAQgB,EAAgBf,GAAY,CAACrf,KAAKsf,MAAM,MAClEtf,KAAK6S,UAAU7S,KAAKsf,MAAOtf,UC/HnC,IAAMwsB,GAAS,SAASrP,EAAM8O,EAAU5uB,EAAS2Q,EAAO0E,EAAiBC,GAQrE,GAPA3S,KAAK3C,QAAUA,EACf2C,KAAKyN,OAASO,EACdhO,KAAK0N,UAAYgF,EACjB1S,KAAKmd,KAAOA,EACZnd,KAAKisB,SAAWA,EAChBjsB,KAAKua,WAAY,OAES/N,IAAtBxM,KAAK3C,QAAQqtB,MAAsB1qB,KAAK3C,QAAQ0d,OAChD/a,KAAKysB,KAAOzsB,KAAK3C,QAAQqtB,MAAQ1qB,KAAK3C,QAAQ0d,WAC3C,CACH,IAAM2R,EAAY1sB,KAAK2sB,UACnBD,GAAa,0BAA0BvQ,KAAKuQ,KAC5C1sB,KAAKysB,KAAM,GAGnBzsB,KAAK4S,mBAAmBD,GACxB3S,KAAK6S,UAAU7S,KAAKisB,SAAUjsB,MAC9BA,KAAK6S,UAAU7S,KAAKmd,KAAMnd,OAG9BwsB,GAAOzc,UAAYlD,OAAOmD,OAAO,IAAI9C,EAAQ,CACzCtM,KAAM,SAENkS,gBAAOzE,GACCrO,KAAKisB,WACLjsB,KAAKisB,SAAW5d,EAAQC,MAAMtO,KAAKisB,WAEvCjsB,KAAKmd,KAAO9O,EAAQC,MAAMtO,KAAKmd,MAC1Bnd,KAAK3C,QAAQuvB,UAAa5sB,KAAK3C,QAAQ0d,SAAU/a,KAAKugB,OACvDvgB,KAAKugB,KAAOlS,EAAQC,MAAMtO,KAAKugB,QAIvC1S,gBAAOF,EAASQ,GACRnO,KAAKysB,UAAyCjgB,IAAlCxM,KAAKmd,KAAKzP,UAAUmf,YAChC1e,EAAOL,IAAI,WAAY9N,KAAK0N,UAAW1N,KAAKyN,QAC5CzN,KAAKmd,KAAKtP,OAAOF,EAASQ,GACtBnO,KAAKisB,WACL9d,EAAOL,IAAI,KACX9N,KAAKisB,SAASpe,OAAOF,EAASQ,IAElCA,EAAOL,IAAI,OAInB6e,mBACI,OAAQ3sB,KAAKmd,gBAAgByO,GACzB5rB,KAAKmd,KAAK/O,MAAMA,MAAQpO,KAAKmd,KAAK/O,OAG1C0e,4BACI,IAAI3P,EAAOnd,KAAKmd,KAIhB,OAHIA,aAAgByO,KAChBzO,EAAOA,EAAK/O,SAEZ+O,aAAgB6N,KACT7N,EAAKmO,qBAMpByB,uBAAcpf,GACV,IAAIwP,EAAOnd,KAAKmd,KAMhB,OAJIA,aAAgByO,KAChBzO,EAAOA,EAAK/O,OAGT,IAAIoe,GAAOrP,EAAKpL,KAAKpE,GAAU3N,KAAKisB,SAAUjsB,KAAK3C,QAAS2C,KAAKyN,OAAQzN,KAAK0N,UAAW1N,KAAK2S,mBAGzGqa,kBAASrf,GACL,IAAMwP,EAAOnd,KAAKmd,KAAKpL,KAAKpE,GACtBX,EAAWhN,KAAK0N,UAEtB,KAAMyP,aAAgByO,IAAM,CAExB,IAAMc,EAAYvP,EAAK/O,MACnBpB,GACA0f,GACA/e,EAAQqQ,oBAAoB0O,GAC5BvP,EAAK/O,MAAQT,EAAQsQ,YAAYyO,EAAW1f,EAASkR,UAErDf,EAAK/O,MAAQT,EAAQyQ,cAAcjB,EAAK/O,OAIhD,OAAO+O,GAGXpL,cAAKpE,GACD,IAAMiJ,EAAS5W,KAAKitB,OAAOtf,GAW3B,OAVI3N,KAAK3C,QAAQwvB,WAAa7sB,KAAKktB,sBAC3BtW,EAAO9X,QAA4B,IAAlB8X,EAAO9X,OACxB8X,EAAOpJ,SAAQ,SAAUH,GACrBA,EAAK8f,wBAITvW,EAAOuW,sBAGRvW,GAGXqW,gBAAOtf,GACH,IAAI0S,EACA+M,EACEnB,EAAWjsB,KAAKisB,UAAYjsB,KAAKisB,SAASla,KAAKpE,GAErD,GAAI3N,KAAK3C,QAAQuvB,SAAU,CACvB,GAAI5sB,KAAKugB,MAAQvgB,KAAKugB,KAAKxO,KACvB,IACI/R,KAAKugB,KAAKxO,KAAKpE,GAEnB,MAAOlO,GAEH,MADAA,EAAEyX,QAAU,iCACN,IAAIH,EAAUtX,EAAGO,KAAKugB,KAAKlH,QAASrZ,KAAKugB,KAAKhf,UAQ5D,OALA6rB,EAAWzf,EAAQ2P,OAAO,IAAM3P,EAAQ2P,OAAO,GAAGoD,mBACjC1gB,KAAKugB,MAAQvgB,KAAKugB,KAAKtf,WACpCmsB,EAASzO,YAAa3e,KAAKugB,KAAKtf,WAG7B,GAGX,GAAIjB,KAAKqtB,OACoB,mBAAdrtB,KAAKqtB,OACZrtB,KAAKqtB,KAAOrtB,KAAKqtB,QAEjBrtB,KAAKqtB,MACL,MAAO,GAGf,GAAIrtB,KAAK3C,QAAQ0d,OAAQ,CACrB,IAAM1D,EAAW,IAAI+C,EAAUpa,KAAKugB,KAAM,EACtC,CACIhf,SAAUvB,KAAKstB,iBACfT,UAAW7sB,KAAKmd,KAAKzP,WAAa1N,KAAKmd,KAAKzP,UAAUmf,YACvD,GAAM,GAEb,OAAO7sB,KAAKisB,SAAW,IAAID,GAAM,CAAC3U,GAAWrX,KAAKisB,SAAS7d,OAAS,CAACiJ,GAClE,GAAIrX,KAAKysB,IAAK,CACjB,IAAMc,EAAY,IAAIf,GAAOxsB,KAAKgtB,SAASrf,GAAUse,EAAUjsB,KAAK3C,QAAS2C,KAAKyN,QAClF,IAAK8f,EAAUd,KAAOzsB,KAAKF,MACvB,MAAME,KAAKF,MAEf,OAAOytB,EACJ,OAAIvtB,KAAKugB,OACZF,EAAU,IAAIjB,EAAQ,KAAMgB,EAAgBpgB,KAAKugB,KAAKjB,SAC9CyB,YAAYpT,GAEb3N,KAAKisB,SAAW,IAAID,GAAM3L,EAAQf,MAAOtf,KAAKisB,SAAS7d,OAASiS,EAAQf,OAExE,MChLnB,IAAMkO,GAAa,aAEnBA,GAAWzd,UAAYlD,OAAOmD,OAAO,IAAI9C,EAAQ,CAC7CugB,4BAAmBC,EAAY/f,GAC3B,IAAIiJ,EACE2U,EAAOvrB,KACP2tB,EAAc,GAEpB,IAAKhgB,EAAQigB,kBACT,KAAM,CAAE1W,QAAS,+DACb3V,SAAUvB,KAAKgN,WAAWzL,SAC1ByM,MAAOhO,KAAKiN,YAGpBygB,EAAaA,EAAWvwB,QAAQ,kBAAkB,SAAUS,EAAGgd,GAC3D,OAAO2Q,EAAKsC,MAAM,IAAIzD,GAAS,IAAIxP,EAAQ2Q,EAAKte,WAAYse,EAAKve,YAAY+E,KAAKpE,OAGtF,IACI+f,EAAa,IAAI7V,SAAS,WAAW6V,OACvC,MAAOjuB,GACL,KAAM,CAAEyX,QAAS,gCAAgCzX,EAAEyX,kBAAkBwW,MACjEnsB,SAAUvB,KAAKgN,WAAWzL,SAC1ByM,MAAOhO,KAAKiN,YAGpB,IAAM4U,EAAYlU,EAAQ2P,OAAO,GAAGuE,YACpC,IAAK,IAAM9N,KAAK8N,EACRA,EAAUpkB,eAAesW,KAEzB4Z,EAAY5Z,EAAElC,MAAM,IAAM,CACtBzD,MAAOyT,EAAU9N,GAAG3F,MACpB0f,KAAM,WACF,OAAO9tB,KAAKoO,MAAM2D,KAAKpE,GAAS0C,WAMhD,IACIuG,EAAS8W,EAAWla,KAAKma,GAC3B,MAAOluB,GACL,KAAM,CAAEyX,QAAS,iCAAiCzX,EAAEmb,UAASnb,EAAEyX,QAAQ/Z,QAAQ,OAAQ,SACnFoE,SAAUvB,KAAKgN,WAAWzL,SAC1ByM,MAAOhO,KAAKiN,YAEpB,OAAO2J,GAGXiX,eAAMnY,GACF,OAAIpI,MAAMC,QAAQmI,EAAItH,QAAWsH,EAAItH,MAAMtP,OAAS,EACzC,IAAI4W,EAAItH,MAAMe,KAAI,SAAUM,GAAK,OAAOA,EAAEY,WAAYnC,KAAK,UAE3DwH,EAAIrF,WCnDvB,IAAM0d,GAAa,SAASC,EAAQ9C,EAASld,EAAO0E,GAChD1S,KAAKkrB,QAAUA,EACflrB,KAAK0tB,WAAaM,EAClBhuB,KAAKyN,OAASO,EACdhO,KAAK0N,UAAYgF,GAGrBqb,GAAWhe,UAAYlD,OAAOmD,OAAO,IAAIwd,GAAc,CACnD5sB,KAAM,aAENmR,cAAKpE,GACD,IAAMiJ,EAAS5W,KAAKytB,mBAAmBztB,KAAK0tB,WAAY/f,GAClD/M,SAAcgW,EAEpB,MAAa,WAAThW,GAAsBunB,MAAMvR,GAEZ,WAAThW,EACA,IAAIoqB,GAAO,IAAIpU,MAAWA,EAAQ5W,KAAKkrB,QAASlrB,KAAKyN,QACrDH,MAAMC,QAAQqJ,GACd,IAAIwD,EAAUxD,EAAO1I,KAAK,OAE1B,IAAIkM,EAAUxD,GANd,IAAIoR,GAAUpR,MClBjC,IAAMqX,GAAa,SAAStc,EAAKka,GAC7B7rB,KAAK2R,IAAMA,EACX3R,KAAKoO,MAAQyd,GAGjBoC,GAAWle,UAAYlD,OAAOmD,OAAO,IAAI9C,EAAQ,CAC7CtM,KAAM,aAENkS,gBAAOzE,GACHrO,KAAKoO,MAAQC,EAAQC,MAAMtO,KAAKoO,QAGpC2D,cAAKpE,GACD,OAAI3N,KAAKoO,MAAM2D,KACJ,IAAIkc,GAAWjuB,KAAK2R,IAAK3R,KAAKoO,MAAM2D,KAAKpE,IAE7C3N,MAGX6N,gBAAOF,EAASQ,GACZA,EAAOL,IAAO9N,KAAK2R,SACf3R,KAAKoO,MAAMP,OACX7N,KAAKoO,MAAMP,OAAOF,EAASQ,GAE3BA,EAAOL,IAAI9N,KAAKoO,UCxB5B,IAAM8f,GAAY,SAAS3f,EAAIwC,EAAGb,EAAGxP,EAAGytB,GACpCnuB,KAAKuO,GAAKA,EAAG8D,OACbrS,KAAKouB,OAASrd,EACd/Q,KAAKquB,OAASne,EACdlQ,KAAKyN,OAAS/M,EACdV,KAAKmuB,OAASA,GAGlBD,GAAUne,UAAYlD,OAAOmD,OAAO,IAAI9C,EAAQ,CAC5CtM,KAAM,YAENkS,gBAAOzE,GACHrO,KAAKouB,OAAS/f,EAAQC,MAAMtO,KAAKouB,QACjCpuB,KAAKquB,OAAShgB,EAAQC,MAAMtO,KAAKquB,SAGrCtc,cAAKpE,GACD,IAAMiJ,EAAS,SAAWrI,EAAIC,EAAGC,GAC7B,OAAQF,GACJ,IAAK,MAAO,OAAOC,GAAKC,EACxB,IAAK,KAAO,OAAOD,GAAKC,EACxB,QACI,OAAQvB,EAAK4B,QAAQN,EAAGC,IACpB,KAAM,EACF,MAAc,MAAPF,GAAqB,OAAPA,GAAsB,OAAPA,EACxC,KAAK,EACD,MAAc,MAAPA,GAAqB,OAAPA,GAAsB,OAAPA,GAAsB,OAAPA,EACvD,KAAK,EACD,MAAc,MAAPA,GAAqB,OAAPA,EACzB,QACI,OAAO,IAbZ,CAgBZvO,KAAKuO,GAAIvO,KAAKouB,OAAOrc,KAAKpE,GAAU3N,KAAKquB,OAAOtc,KAAKpE,IAExD,OAAO3N,KAAKmuB,QAAUvX,EAASA,KCnCvC,IAAM0X,GAAoB,SAASlgB,GAC/BpO,KAAKoO,MAAQA,GAGjBkgB,GAAkBve,UAAYlD,OAAOmD,OAAO,IAAI9C,EAAQ,CACpDtM,KAAM,sBCHV,IAAM2tB,GAAW,SAASlhB,GACtBrN,KAAKoO,MAAQf,GAGjBkhB,GAASxe,UAAYlD,OAAOmD,OAAO,IAAI9C,EAAQ,CAC3CtM,KAAM,WAENiN,gBAAOF,EAASQ,GACZA,EAAOL,IAAI,KACX9N,KAAKoO,MAAMP,OAAOF,EAASQ,IAG/B4D,cAAKpE,GACD,OAAIA,EAAQoQ,WACD,IAAK+K,GAAU,IAAK,CAAC,IAAId,IAAW,GAAIhoB,KAAKoO,QAAS2D,KAAKpE,GAE/D,IAAI4gB,GAASvuB,KAAKoO,MAAM2D,KAAKpE,OCjB5C,IAAM6gB,GAAS,SAAS3O,EAAU4O,EAAQzgB,EAAO0E,EAAiBC,GAU9D,OATA3S,KAAK6f,SAAWA,EAChB7f,KAAKyuB,OAASA,EACdzuB,KAAK0uB,UAAYF,GAAOG,UACxB3uB,KAAK4uB,WAAa,CAAC5uB,KAAK0uB,WACxB1uB,KAAKyN,OAASO,EACdhO,KAAK0N,UAAYgF,EACjB1S,KAAK4S,mBAAmBD,GACxB3S,KAAKua,WAAY,EAETkU,GACJ,IAAK,MACDzuB,KAAK6uB,aAAc,EACnB7uB,KAAK8uB,YAAa,EAClB,MACJ,QACI9uB,KAAK6uB,aAAc,EACnB7uB,KAAK8uB,YAAa,EAG1B9uB,KAAK6S,UAAU7S,KAAK6f,SAAU7f,OAGlCwuB,GAAOze,UAAYlD,OAAOmD,OAAO,IAAI9C,EAAQ,CACzCtM,KAAM,SAENkS,gBAAOzE,GACHrO,KAAK6f,SAAWxR,EAAQC,MAAMtO,KAAK6f,WAGvC9N,cAAKpE,GACD,OAAO,IAAI6gB,GAAOxuB,KAAK6f,SAAS9N,KAAKpE,GAAU3N,KAAKyuB,OAAQzuB,KAAKiN,WAAYjN,KAAKgN,WAAYhN,KAAK2S,mBAGvGI,eAAMpF,GACF,OAAO,IAAI6gB,GAAOxuB,KAAK6f,SAAU7f,KAAKyuB,OAAQzuB,KAAKiN,WAAYjN,KAAKgN,WAAYhN,KAAK2S,mBAIzFoc,2BAAkB1P,GACd,IAAuB3e,EAAGsuB,EAAtBC,EAAe,GAEnB,IAAKvuB,EAAI,EAAGA,EAAI2e,EAAUvgB,OAAQ4B,IAC9BsuB,EAAmB3P,EAAU3e,GAAG8X,SAG5B9X,EAAI,GAAKsuB,EAAiBlwB,QAAmD,KAAzCkwB,EAAiB,GAAGxc,WAAWpE,QACnE4gB,EAAiB,GAAGxc,WAAWpE,MAAQ,KAE3C6gB,EAAeA,EAAa/tB,OAAOme,EAAU3e,GAAG8X,UAGpDxY,KAAKkvB,cAAgB,CAAC,IAAI3W,EAAS0W,IACnCjvB,KAAKkvB,cAAc,GAAGtc,mBAAmB5S,KAAK2S,qBAItD6b,GAAOG,QAAU,ECtDjB,IAAMQ,GAAe,SAASnU,EAAUhN,EAAO0E,GAC3C1S,KAAKgb,SAAWA,EAChBhb,KAAKyN,OAASO,EACdhO,KAAK0N,UAAYgF,EACjB1S,KAAKua,WAAY,GAGrB4U,GAAapf,UAAYlD,OAAOmD,OAAO,IAAI9C,EAAQ,CAC/CtM,KAAM,eAENmR,cAAKpE,GACD,IAAI2R,EACA8P,EAAkB,IAAIhF,GAASpqB,KAAKgb,SAAUhb,KAAKiN,WAAYjN,KAAKgN,YAAY+E,KAAKpE,GACnF7N,EAAQ,IAAIiX,EAAU,CAACG,QAAS,oCAAoClX,KAAKgb,WAE/E,IAAKoU,EAAgB/O,QAAS,CAC1B,GAAI+O,EAAgB9P,MAChBA,EAAQ8P,OAEP,GAAI9hB,MAAMC,QAAQ6hB,GACnB9P,EAAQ,IAAIF,EAAQ,GAAIgQ,OAEvB,CAAA,IAAI9hB,MAAMC,QAAQ6hB,EAAgBhhB,OAInC,MAAMtO,EAHNwf,EAAQ,IAAIF,EAAQ,GAAIgQ,EAAgBhhB,OAK5CghB,EAAkB,IAAI5I,EAAgBlH,GAG1C,GAAI8P,EAAgB/O,QAChB,OAAO+O,EAAgB3I,SAAS9Y,GAEpC,MAAM7N,KCnCd,IAAMuvB,GAAiB,SAASC,EAAUC,EAASvhB,EAAOhB,GACtDhN,KAAKoO,MAAQkhB,EACbtvB,KAAKuvB,QAAUA,EACfvvB,KAAKyN,OAASO,EACdhO,KAAK0N,UAAYV,GAGrBqiB,GAAetf,UAAYlD,OAAOmD,OAAO,IAAI9C,EAAQ,CACjDtM,KAAM,iBAENmR,cAAKpE,GACD,IAAIjN,EAAMka,EAAM0E,EAAQtf,KAAKoO,MAAM2D,KAAKpE,GAExC,IAAKjN,EAAI,EAAGA,EAAIV,KAAKuvB,QAAQzwB,OAAQ4B,IAAK,CAYtC,GAXAka,EAAO5a,KAAKuvB,QAAQ7uB,GAOhB4M,MAAMC,QAAQ+R,KACdA,EAAQ,IAAIF,EAAQ,CAAC,IAAI7G,GAAa+G,IAG7B,KAAT1E,EACA0E,EAAQA,EAAMgD,uBAEb,GAAuB,MAAnB1H,EAAK3H,OAAO,IAQjB,GAPuB,MAAnB2H,EAAK3H,OAAO,KACZ2H,EAAO,IAAI,IAAIwP,GAASxP,EAAKtC,OAAO,IAAIvG,KAAKpE,GAASS,OAEtDkR,EAAMuC,YACNvC,EAAQA,EAAMtE,SAASJ,KAGtB0E,EACD,KAAM,CAAE1e,KAAM,OACVsW,QAAS,YAAY0D,eACrBrZ,SAAUvB,KAAKgN,WAAWzL,SAC1ByM,MAAOhO,KAAKiN,gBAGnB,CAWD,GATI2N,EADyB,OAAzBA,EAAK4U,UAAU,EAAG,GACX,IAAI,IAAIpF,GAASxP,EAAKtC,OAAO,IAAIvG,KAAKpE,GAASS,MAG5B,MAAnBwM,EAAK3H,OAAO,GAAa2H,EAAO,IAAIA,EAE3C0E,EAAM2C,aACN3C,EAAQA,EAAM+C,SAASzH,KAGtB0E,EACD,KAAM,CAAE1e,KAAM,OACVsW,QAAS,aAAa0D,EAAKtC,OAAO,iBAClC/W,SAAUvB,KAAKgN,WAAWzL,SAC1ByM,MAAOhO,KAAKiN,YAIpBqS,EAAQA,EAAMA,EAAMxgB,OAAS,GAG7BwgB,EAAMlR,QACNkR,EAAQA,EAAMvN,KAAKpE,GAASS,OAE5BkR,EAAMe,UACNf,EAAQA,EAAMe,QAAQtO,KAAKpE,IAGnC,OAAO2R,KCpEf,IAAMmQ,GAAa,SAAS7U,EAAM8U,EAAQpQ,EAAO5G,EAAWiX,EAAUrS,EAAQ3K,GAC1E3S,KAAK4a,KAAOA,GAAQ,kBACpB5a,KAAKqf,UAAY,CAAC,IAAI9G,EAAS,CAAC,IAAIhG,EAAQ,KAAMqI,GAAM,EAAO5a,KAAKyN,OAAQzN,KAAK0N,cACjF1N,KAAK0vB,OAASA,EACd1vB,KAAK0Y,UAAYA,EACjB1Y,KAAK2vB,SAAWA,EAChB3vB,KAAK4vB,MAAQF,EAAO5wB,OACpBkB,KAAKsf,MAAQA,EACbtf,KAAKwf,SAAW,GAChB,IAAMqQ,EAAqB,GAC3B7vB,KAAK8vB,SAAWJ,EAAOrb,QAAO,SAAU0T,EAAOgI,GAC3C,OAAKA,EAAEnV,MAASmV,EAAEnV,OAASmV,EAAE3hB,MAClB2Z,EAAQ,GAGf8H,EAAmBrvB,KAAKuvB,EAAEnV,MACnBmN,KAEZ,GACH/nB,KAAK6vB,mBAAqBA,EAC1B7vB,KAAKsd,OAASA,EACdtd,KAAK4S,mBAAmBD,GACxB3S,KAAKua,WAAY,GAGrBkV,GAAW1f,UAAYlD,OAAOmD,OAAO,IAAIoP,EAAW,CAChDxe,KAAM,kBACNqgB,WAAW,EAEXnO,gBAAOzE,GACCrO,KAAK0vB,QAAU1vB,KAAK0vB,OAAO5wB,SAC3BkB,KAAK0vB,OAASrhB,EAAQyK,WAAW9Y,KAAK0vB,SAE1C1vB,KAAKsf,MAAQjR,EAAQyK,WAAW9Y,KAAKsf,OACjCtf,KAAK0Y,YACL1Y,KAAK0Y,UAAYrK,EAAQC,MAAMtO,KAAK0Y,aAI5CsX,oBAAWriB,EAASsiB,EAAUvf,EAAMwf,GAEhC,IAEIC,EACAC,EAEA1vB,EACAsT,EACA6X,EACAjR,EACAyV,EACAC,EAVEhG,EAAQ,IAAIlL,EAAQ,KAAM,MAI1BsQ,EAAStP,EAAgBpgB,KAAK0vB,QAOhCa,EAAa,EAOjB,GALIN,EAAS3S,QAAU2S,EAAS3S,OAAO,IAAM2S,EAAS3S,OAAO,GAAGoD,mBAC5D4J,EAAM5J,iBAAmBuP,EAAS3S,OAAO,GAAGoD,iBAAiB3B,WAEjEkR,EAAW,IAAIxT,EAASY,KAAK4S,EAAU,CAAC3F,GAAOppB,OAAO+uB,EAAS3S,SAE3D5M,EAIA,IAFA6f,GADA7f,EAAO0P,EAAgB1P,IACL5R,OAEb4B,EAAI,EAAGA,EAAI6vB,EAAY7vB,IAExB,GAAIka,GADJwV,EAAM1f,EAAKhQ,KACQ0vB,EAAIxV,KAAO,CAE1B,IADAyV,GAAe,EACVrc,EAAI,EAAGA,EAAI0b,EAAO5wB,OAAQkV,IAC3B,IAAKkc,EAAelc,IAAM4G,IAAS8U,EAAO1b,GAAG4G,KAAM,CAC/CsV,EAAelc,GAAKoc,EAAIhiB,MAAM2D,KAAKpE,GACnC2c,EAAM1H,YAAY,IAAIjI,EAAYC,EAAMwV,EAAIhiB,MAAM2D,KAAKpE,KACvD0iB,GAAe,EACf,MAGR,GAAIA,EAAc,CACd3f,EAAK/P,OAAOD,EAAG,GACfA,IACA,SAEA,KAAM,CAAEE,KAAM,UAAWsW,QAAS,sBAAsBlX,KAAK4a,SAAQlK,EAAKhQ,GAAGka,mBAM7F,IADA0V,EAAW,EACN5vB,EAAI,EAAGA,EAAIgvB,EAAO5wB,OAAQ4B,IAC3B,IAAIwvB,EAAexvB,GAAnB,CAIA,GAFA0vB,EAAM1f,GAAQA,EAAK4f,GAEf1V,EAAO8U,EAAOhvB,GAAGka,KACjB,GAAI8U,EAAOhvB,GAAGivB,SAAU,CAEpB,IADAQ,EAAU,GACLnc,EAAIsc,EAAUtc,EAAIuc,EAAYvc,IAC/Bmc,EAAQ3vB,KAAKkQ,EAAKsD,GAAG5F,MAAM2D,KAAKpE,IAEpC2c,EAAM1H,YAAY,IAAIjI,EAAYC,EAAM,IAAIqO,GAAWkH,GAASpe,KAAKpE,SAClE,CAEH,GADAke,EAAMuE,GAAOA,EAAIhiB,MAITyd,EADAve,MAAMC,QAAQse,GACR,IAAIrF,EAAgB,IAAIpH,EAAQ,GAAIyM,IAGpCA,EAAI9Z,KAAKpE,OAEhB,CAAA,IAAI+hB,EAAOhvB,GAAG0N,MAIjB,KAAM,CAAExN,KAAM,UAAWsW,QAAS,iCAAiClX,KAAK4a,UAAS2V,UAAkBvwB,KAAK4vB,WAHxG/D,EAAM6D,EAAOhvB,GAAG0N,MAAM2D,KAAKke,GAC3B3F,EAAMhJ,aAKVgJ,EAAM1H,YAAY,IAAIjI,EAAYC,EAAMiR,IACxCqE,EAAexvB,GAAKmrB,EAI5B,GAAI6D,EAAOhvB,GAAGivB,UAAYjf,EACtB,IAAKsD,EAAIsc,EAAUtc,EAAIuc,EAAYvc,IAC/Bkc,EAAelc,GAAKtD,EAAKsD,GAAG5F,MAAM2D,KAAKpE,GAG/C2iB,IAGJ,OAAOhG,GAGX7O,yBACI,IAAM6D,EAAStf,KAAKsf,MAAqBtf,KAAKsf,MAAMnQ,KAAI,SAAUe,GAC9D,OAAIA,EAAEuL,cACKvL,EAAEuL,eAAc,GAEhBvL,KAJalQ,KAAKsf,MAQjC,OADe,IAAImQ,GAAWzvB,KAAK4a,KAAM5a,KAAK0vB,OAAQpQ,EAAOtf,KAAK0Y,UAAW1Y,KAAK2vB,SAAU3vB,KAAKsd,SAIrGvL,cAAKpE,GACD,OAAO,IAAI8hB,GAAWzvB,KAAK4a,KAAM5a,KAAK0vB,OAAQ1vB,KAAKsf,MAAOtf,KAAK0Y,UAAW1Y,KAAK2vB,SAAU3vB,KAAKsd,QAAU8C,EAAgBzS,EAAQ2P,UAGpIkT,kBAAS7iB,EAAS+C,EAAMmK,GACpB,IAGIyE,EACAe,EAJEoQ,EAAa,GACbC,EAAc1wB,KAAKsd,OAAStd,KAAKsd,OAAOpc,OAAOyM,EAAQ2P,QAAU3P,EAAQ2P,OACzEgN,EAAQtqB,KAAKgwB,WAAWriB,EAAS,IAAI8O,EAASY,KAAK1P,EAAS+iB,GAAchgB,EAAM+f,GActF,OAVAnG,EAAM1H,YAAY,IAAIjI,EAAY,aAAc,IAAIsO,GAAWwH,GAAY1e,KAAKpE,KAEhF2R,EAAQc,EAAgBpgB,KAAKsf,QAE7Be,EAAU,IAAIjB,EAAQ,KAAME,IACpBgB,gBAAkBtgB,KAC1BqgB,EAAUA,EAAQtO,KAAK,IAAI0K,EAASY,KAAK1P,EAAS,CAAC3N,KAAMsqB,GAAOppB,OAAOwvB,KACnE7V,IACAwF,EAAUA,EAAQ5E,iBAEf4E,GAGXqB,wBAAehR,EAAM/C,GACjB,QAAI3N,KAAK0Y,YAAc1Y,KAAK0Y,UAAU3G,KAClC,IAAI0K,EAASY,KAAK1P,EACd,CAAC3N,KAAKgwB,WAAWriB,EACb,IAAI8O,EAASY,KAAK1P,EAAS3N,KAAKsd,OAAStd,KAAKsd,OAAOpc,OAAOyM,EAAQ2P,QAAU3P,EAAQ2P,QAAS5M,EAAM,KACpGxP,OAAOlB,KAAKsd,QAAU,IACtBpc,OAAOyM,EAAQ2P,YAMhCmE,mBAAU/Q,EAAM/C,GACZ,IACI+L,EADEiX,EAAcjgB,GAAQA,EAAK5R,QAAW,EAEtC+wB,EAAqB7vB,KAAK6vB,mBAC1Be,EAAmBlgB,EAAWA,EAAK2D,QAAO,SAAU0T,EAAOgI,GAC7D,OAAIF,EAAmBjf,QAAQmf,EAAEnV,MAAQ,EAC9BmN,EAAQ,EAERA,IAEZ,GAN6B,EAQhC,GAAK/nB,KAAK2vB,UAQN,GAAIiB,EAAmB5wB,KAAK8vB,SAAW,EACnC,OAAO,MATK,CAChB,GAAIc,EAAkB5wB,KAAK8vB,SACvB,OAAO,EAEX,GAAIa,EAAa3wB,KAAK0vB,OAAO5wB,OACzB,OAAO,EASf4a,EAAM3N,KAAK4D,IAAIihB,EAAiB5wB,KAAK4vB,OAErC,IAAK,IAAIlvB,EAAI,EAAGA,EAAIgZ,EAAKhZ,IACrB,IAAKV,KAAK0vB,OAAOhvB,GAAGka,OAAS5a,KAAK0vB,OAAOhvB,GAAGivB,UACpCjf,EAAKhQ,GAAG0N,MAAM2D,KAAKpE,GAAS0C,SAAWrQ,KAAK0vB,OAAOhvB,GAAG0N,MAAM2D,KAAKpE,GAAS0C,QAC1E,OAAO,EAInB,OAAO,KC1Nf,IAAMwgB,GAAY,SAASrY,EAAU9H,EAAM1C,EAAO0E,EAAiBmI,GAC/D7a,KAAK6f,SAAW,IAAItH,EAASC,GAC7BxY,KAAK8T,UAAYpD,GAAQ,GACzB1Q,KAAKyN,OAASO,EACdhO,KAAK0N,UAAYgF,EACjB1S,KAAK6a,UAAYA,EACjB7a,KAAKua,WAAY,EACjBva,KAAK6S,UAAU7S,KAAK6f,SAAU7f,OAGlC6wB,GAAU9gB,UAAYlD,OAAOmD,OAAO,IAAI9C,EAAQ,CAC5CtM,KAAM,YAENkS,gBAAOzE,GACCrO,KAAK6f,WACL7f,KAAK6f,SAAWxR,EAAQC,MAAMtO,KAAK6f,WAEnC7f,KAAK8T,UAAUhV,SACfkB,KAAK8T,UAAYzF,EAAQyK,WAAW9Y,KAAK8T,aAIjD/B,cAAKpE,GACD,IAAImjB,EACAC,EACAC,EAEAZ,EACAa,EAGAvwB,EACAyK,EACA+lB,EACAC,EACAC,EAEAC,EAEAC,EAKAvJ,EACAzH,EACAiR,EApBE7gB,EAAO,GAGP4O,EAAQ,GACVpQ,GAAQ,EAMNsiB,EAAa,GAEbC,EAAkB,GAYxB,SAASC,EAAaX,EAAOC,GACzB,IAAIE,EAAGnB,EAAG4B,EAEV,IAAKT,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAGpB,IAFAO,EAAgBP,IAAK,EACrBlS,EAAY5Q,MAAM8iB,GACbnB,EAAI,EAAGA,EAAIiB,EAAUlyB,QAAU2yB,EAAgBP,GAAInB,KACpD4B,EAAYX,EAAUjB,IACRrO,iBACV+P,EAAgBP,GAAKO,EAAgBP,IAAMS,EAAUjQ,eAAe,KAAM/T,IAG9EojB,EAAMrP,iBACN+P,EAAgBP,GAAKO,EAAgBP,IAAMH,EAAMrP,eAAehR,EAAM/C,IAG9E,OAAI8jB,EAAgB,IAAMA,EAAgB,GAClCA,EAAgB,IAAMA,EAAgB,GAC/BA,EAAgB,GA1BnB,EACC,EAFD,GADW,EAqC3B,IA7BAzxB,KAAK6f,SAAW7f,KAAK6f,SAAS9N,KAAKpE,GA6B9BjN,EAAI,EAAGA,EAAIV,KAAK8T,UAAUhV,OAAQ4B,IAGnC,GADAuwB,GADAb,EAAMpwB,KAAK8T,UAAUpT,IACN0N,MAAM2D,KAAKpE,GACtByiB,EAAIwB,QAAUtkB,MAAMC,QAAQ0jB,EAAS7iB,OAErC,IADA6iB,EAAWA,EAAS7iB,MACfjD,EAAI,EAAGA,EAAI8lB,EAASnyB,OAAQqM,IAC7BuF,EAAKlQ,KAAK,CAAC4N,MAAO6iB,EAAS9lB,UAG/BuF,EAAKlQ,KAAK,CAACoa,KAAMwV,EAAIxV,KAAMxM,MAAO6iB,IAM1C,IAFAM,EAAoB,SAASrR,GAAO,OAAOA,EAAKuB,UAAU,KAAM9T,IAE3DjN,EAAI,EAAGA,EAAIiN,EAAQ2P,OAAOxe,OAAQ4B,IACnC,IAAKowB,EAASnjB,EAAQ2P,OAAO5c,GAAGmiB,KAAK7iB,KAAK6f,SAAU,KAAM0R,IAAoBzyB,OAAS,EAAG,CAQtF,IAPAsyB,GAAa,EAORjmB,EAAI,EAAGA,EAAI2lB,EAAOhyB,OAAQqM,IAAK,CAIhC,IAHA4lB,EAAQD,EAAO3lB,GAAG+U,KAClB8Q,EAAYF,EAAO3lB,GAAGgS,KACtBgU,GAAc,EACTD,EAAI,EAAGA,EAAIvjB,EAAQ2P,OAAOxe,OAAQoyB,IACnC,KAAOH,aAAiBc,KAAqBd,KAAWpjB,EAAQ2P,OAAO4T,GAAG5Q,iBAAmB3S,EAAQ2P,OAAO4T,IAAK,CAC7GC,GAAc,EACd,MAGJA,GAIAJ,EAAMtP,UAAU/Q,EAAM/C,MA3EX,KA4EX0jB,EAAY,CAACN,QAAOtJ,MAAOiK,EAAaX,EAAOC,KAEjCvJ,OACV+J,EAAWhxB,KAAK6wB,GAGpBniB,GAAQ,GAOhB,IAHA8P,EAAYG,QAEZ4I,EAAQ,CAAC,EAAG,EAAG,GACV5c,EAAI,EAAGA,EAAIqmB,EAAW1yB,OAAQqM,IAC/B4c,EAAMyJ,EAAWrmB,GAAGsc,SAGxB,GAAIM,EA5FI,GA4Fa,EACjBuJ,EA3FK,OA8FL,GADAA,EA9FI,EA+FCvJ,EA/FD,GA+FkBA,EA9FjB,GA8FoC,EACrC,KAAM,CAAEnnB,KAAM,UACVsW,QAAS,yDAA4DlX,KAAK8xB,OAAOphB,OACjF1C,MAAOhO,KAAKiN,WAAY1L,SAAUvB,KAAKgN,WAAWzL,UAI9D,IAAK4J,EAAI,EAAGA,EAAIqmB,EAAW1yB,OAAQqM,IAE/B,GAzGI,KAwGJkmB,EAAYG,EAAWrmB,GAAGsc,QACM4J,IAAcC,EAC1C,KACIP,EAAQS,EAAWrmB,GAAG4lB,iBACCc,KACnBvR,EAAkByQ,EAAMzQ,iBAAmByQ,GAC3CA,EAAQ,IAAIc,GAAgB,GAAI,GAAId,EAAMzR,MAAO,MAAM,EAAO,KAAMgB,EAAgB3N,mBAC9E2N,gBAAkBA,GAE5B,IAAMyR,EAAWhB,EAAMP,SAAS7iB,EAAS+C,EAAM1Q,KAAK6a,WAAWyE,MAC/Dtf,KAAKgyB,4BAA4BD,GACjCzkB,MAAMyC,UAAUvP,KAAK6gB,MAAM/B,EAAOyS,GACpC,MAAOtyB,GACL,KAAM,CAAEyX,QAASzX,EAAEyX,QAASlJ,MAAOhO,KAAKiN,WAAY1L,SAAUvB,KAAKgN,WAAWzL,SAAU4V,MAAO1X,EAAE0X,OAK7G,GAAIjI,EACA,OAAOoQ,EAInB,MAAI8R,EACM,CAAExwB,KAAS,UACbsW,QAAS,yCAA0ClX,KAAK8xB,OAAOphB,OAC/D1C,MAAShO,KAAKiN,WAAY1L,SAAUvB,KAAKgN,WAAWzL,UAElD,CAAEX,KAAS,OACbsW,QAAYlX,KAAK6f,SAASxP,QAAQgC,uBAClCrE,MAAShO,KAAKiN,WAAY1L,SAAUvB,KAAKgN,WAAWzL,WAIhEywB,qCAA4BC,GACxB,IAAIvxB,EACJ,GAAIV,KAAKktB,mBACL,IAAKxsB,EAAI,EAAGA,EAAIuxB,EAAYnzB,OAAQ4B,IACzBuxB,EAAYvxB,GACdysB,sBAKjB2E,gBAAOphB,GACH,OAAU1Q,KAAK6f,SAASxP,QAAQgC,YAAU3B,EAAOA,EAAKvB,KAAI,SAAUX,GAChE,IAAIyiB,EAAW,GASf,OARIziB,EAAEoM,OACFqW,GAAeziB,EAAEoM,UAEjBpM,EAAEJ,MAAMiC,MACR4gB,GAAYziB,EAAEJ,MAAMiC,QAEpB4gB,GAAY,MAETA,KACR/iB,KAAK,MAAQ,kBCvKT,CACXhB,OAAM6B,QAAOkX,SAAQO,kBAAiBsC,aACtCd,aAAWtB,OAAMzM,UAASmQ,YAAUI,YACpCpL,UAAS7M,UAASwY,aAAW5Y,aAAYoG,WACzCyS,UAAQ/B,cAAYtO,cAAakP,QAAM+B,OAAKY,UAC5CpQ,UAAShC,YAAWJ,QAAO+T,cAAYE,cACvCC,aAAWpc,QAAOka,SAAOsC,qBAAmBC,YAC5CC,UAAQW,gBAAcE,kBACtB0B,MAAO,CACHlH,KAAMgH,GACNpB,WAAYoC,mBCjDpB,cAmIA,OAlIIK,oBAAA,SAAQ3wB,GACJ,IAAIyS,EAAIzS,EAAS4wB,YAAY,KAQ7B,OAPIne,EAAI,IACJzS,EAAWA,EAASsQ,MAAM,EAAGmC,KAEjCA,EAAIzS,EAAS4wB,YAAY,MACjB,IACJne,EAAIzS,EAAS4wB,YAAY,OAEzBne,EAAI,EACG,GAEJzS,EAASsQ,MAAM,EAAGmC,EAAI,IAGjCke,+BAAA,SAAmB/U,EAAMiV,GACrB,MAAO,yBAAyBjW,KAAKgB,GAAQA,EAAOA,EAAOiV,GAG/DF,mCAAA,SAAuB/U,GACnB,OAAOnd,KAAKqyB,mBAAmBlV,EAAM,UAGzC+U,yBAAA,WACI,OAAO,GAGXA,oCAAA,WACI,OAAO,GAGXA,2BAAA,SAAe3wB,GACX,MAAO,yBAA2B4a,KAAK5a,IAI3C2wB,iBAAA,SAAKI,EAAUC,GACX,OAAKD,EAGEA,EAAWC,EAFPA,GAKfL,qBAAA,SAASM,EAAKC,GAGV,IAGI/xB,EACAgP,EACAgjB,EACAC,EANEC,EAAW5yB,KAAK6yB,gBAAgBL,GAEhCM,EAAe9yB,KAAK6yB,gBAAgBJ,GAKtCM,EAAO,GACX,GAAIH,EAASI,WAAaF,EAAaE,SACnC,MAAO,GAGX,IADAtjB,EAAM3D,KAAK2D,IAAIojB,EAAaG,YAAYn0B,OAAQ8zB,EAASK,YAAYn0B,QAChE4B,EAAI,EAAGA,EAAIgP,GACRojB,EAAaG,YAAYvyB,KAAOkyB,EAASK,YAAYvyB,GADxCA,KAKrB,IAFAiyB,EAAqBG,EAAaG,YAAYphB,MAAMnR,GACpDgyB,EAAiBE,EAASK,YAAYphB,MAAMnR,GACvCA,EAAI,EAAGA,EAAIiyB,EAAmB7zB,OAAS,EAAG4B,IAC3CqyB,GAAQ,MAEZ,IAAKryB,EAAI,EAAGA,EAAIgyB,EAAe5zB,OAAS,EAAG4B,IACvCqyB,GAAWL,EAAehyB,OAE9B,OAAOqyB,GAIXb,4BAAA,SAAgBM,EAAKC,GAOjB,IAMI/xB,EACAoyB,EAPEI,EAAgB,kGAEhBN,EAAWJ,EAAItjB,MAAMgkB,GACrBC,EAAW,GACbC,EAAiB,GACfH,EAAc,GAIpB,IAAKL,EACD,MAAM,IAAIlzB,MAAM,iCAAiC8yB,OAIrD,GAAIC,KAAaG,EAAS,IAAMA,EAAS,IAAK,CAE1C,KADAE,EAAeL,EAAQvjB,MAAMgkB,IAEzB,MAAM,IAAIxzB,MAAM,+BAA+B+yB,OAEnDG,EAAS,GAAKA,EAAS,IAAME,EAAa,IAAM,GAC3CF,EAAS,KACVA,EAAS,GAAKE,EAAa,GAAKF,EAAS,IAIjD,GAAIA,EAAS,GAIT,IAHAQ,EAAiBR,EAAS,GAAGz1B,QAAQ,MAAO,KAAKoS,MAAM,KAGlD7O,EAAI,EAAGA,EAAI0yB,EAAet0B,OAAQ4B,IAET,OAAtB0yB,EAAe1yB,GACfuyB,EAAYzX,MAEe,MAAtB4X,EAAe1yB,IACpBuyB,EAAYzyB,KAAK4yB,EAAe1yB,IAa5C,OAPAyyB,EAASH,SAAWJ,EAAS,GAC7BO,EAASF,YAAcA,EACvBE,EAASE,SAAWT,EAAS,IAAM,IAAMQ,EAAellB,KAAK,KAC7DilB,EAAShW,MAAQyV,EAAS,IAAM,IAAMK,EAAY/kB,KAAK,KACvDilB,EAAS5xB,SAAWqxB,EAAS,GAC7BO,EAASG,QAAUH,EAAShW,MAAQyV,EAAS,IAAM,IACnDO,EAASX,IAAMW,EAASG,SAAWV,EAAS,IAAM,IAC3CO,sBC7HX,aAEInzB,KAAKuzB,QAAU,WACX,OAAO,MA8KnB,OA1KIC,uBAAA,SAAWnc,EAAU1J,EAAS0L,EAASoa,EAAezmB,GAElD,IAAYogB,EAAUsG,EAAWC,EAAa/xB,EAAeL,EAAUqV,EAEvEhV,EAAgB+L,EAAQ/L,cAEpBoL,IAEIzL,EADoB,iBAAbyL,EACIA,EAGAA,EAASzL,UAG5B,IAAMqyB,GAAY,IAAK5zB,KAAK0qB,KAAKmJ,aAAehB,gBAAgBtxB,GAAUA,SAE1E,GAAIA,IACAmyB,EAAY9xB,EAAcmL,IAAIxL,IAEf,CAEX,GADAqV,EAAS5W,KAAK8zB,cAAcJ,EAAWnyB,EAAUqyB,EAAWH,GAExD,OAAO7c,EAEX,IACQ8c,EAAUK,KACVL,EAAUK,IAAIvgB,KAAKxT,KAAK2N,QAAS+lB,GAGzC,MAAOj0B,GAEH,OADAA,EAAEyX,QAAUzX,EAAEyX,SAAW,4BAClB,IAAIH,EAAUtX,EAAG4Z,EAAS9X,GAErC,OAAOmyB,EAGfC,EAAc,CACVK,QAAS,GACTpyB,gBACAoL,YAEJogB,EAAW1M,EAAiBzI,SAM5B,IACa,IAAIJ,SAAS,SAAU,UAAW,iBAAkB,YAAa,OAAQ,OAAQ,WAAYR,EACtG4c,CAAON,EAAa3zB,KAAKuzB,QAAQhyB,IANd,SAASmU,GAC5Bge,EAAYhe,IAKgD0X,EAAUptB,KAAK0qB,KAAKwJ,KAAMl0B,KAAK0qB,KAAM1d,GAErG,MAAOvN,GACH,OAAO,IAAIsX,EAAUtX,EAAG4Z,EAAS9X,GAQrC,GALKmyB,IACDA,EAAYC,EAAYK,UAE5BN,EAAY1zB,KAAKm0B,eAAeT,EAAWnyB,EAAUqyB,cAE5B7c,EACrB,OAAO2c,EAGX,IAAIA,EAoCA,OAAO,IAAI3c,EAAU,CAAEG,QAAS,sBAAwBmC,EAAS9X,GA/BjE,GAJAmyB,EAAUra,QAAUA,EACpBqa,EAAUnyB,SAAWA,IAGhBmyB,EAAUU,YAAcp0B,KAAKq0B,eAAe,QAASX,EAAUU,YAAc,KAC9Exd,EAAS5W,KAAK8zB,cAAcJ,EAAWnyB,EAAUqyB,EAAWH,IAGxD,OAAO7c,EAUf,GALAhV,EAAc0yB,UAAUZ,EAAW1mB,EAASzL,SAAU6rB,GACtDsG,EAAUzyB,UAAYmsB,EAAStO,oBAG/BlI,EAAS5W,KAAK8zB,cAAcJ,EAAWnyB,EAAUqyB,EAAWH,GAExD,OAAO7c,EAIX,IACQ8c,EAAUK,KACVL,EAAUK,IAAIvgB,KAAKxT,KAAK2N,QAAS+lB,GAGzC,MAAOj0B,GAEH,OADAA,EAAEyX,QAAUzX,EAAEyX,SAAW,4BAClB,IAAIH,EAAUtX,EAAG4Z,EAAS9X,GAQzC,OAAOmyB,GAIXF,0BAAA,SAAce,EAAQhzB,EAAUqZ,EAAMvd,GAClC,GAAIA,IAAYk3B,EAAOC,WACnB,OAAO,IAAIzd,EAAU,CACjBG,QAAS,6CAA6C0D,qCAG9D,IACI2Z,EAAOC,YAAcD,EAAOC,WAAWn3B,GAE3C,MAAOoC,GACH,OAAO,IAAIsX,EAAUtX,KAI7B+zB,2BAAA,SAAee,EAAQhzB,EAAUqZ,GAC7B,OAAI2Z,GAGsB,mBAAXA,IACPA,EAAS,IAAIA,GAGbA,EAAOH,YACHp0B,KAAKq0B,eAAeE,EAAOH,WAAYp0B,KAAK0qB,KAAK+J,SAAW,EACrD,IAAI1d,EAAU,CACjBG,QAAS,UAAU0D,uBAAyB5a,KAAK00B,gBAAgBH,EAAOH,cAI7EG,GAEJ,MAGXf,2BAAA,SAAemB,EAAUC,GACG,iBAAbD,IACPA,EAAWA,EAASzlB,MAAM,6BACjB0K,QAEb,IAAK,IAAIlZ,EAAI,EAAGA,EAAIi0B,EAAS71B,OAAQ4B,IACjC,GAAIi0B,EAASj0B,KAAOk0B,EAASl0B,GACzB,OAAO2O,SAASslB,EAASj0B,IAAM2O,SAASulB,EAASl0B,KAAO,EAAI,EAGpE,OAAO,GAGX8yB,4BAAA,SAAgBiB,GAEZ,IADA,IAAII,EAAgB,GACXn0B,EAAI,EAAGA,EAAI+zB,EAAQ31B,OAAQ4B,IAChCm0B,IAAkBA,EAAgB,IAAM,IAAMJ,EAAQ/zB,GAE1D,OAAOm0B,GAGXrB,uBAAA,SAAWsB,GACP,IAAK,IAAIp0B,EAAI,EAAGA,EAAIo0B,EAAQh2B,OAAQ4B,IAAK,CACrC,IAAM6zB,EAASO,EAAQp0B,GACnB6zB,EAAOQ,YACPR,EAAOQ,oBC/KjBC,GAAa,CAAEC,aAAa,GAC9BC,IAAc,EAElB,SAASC,GAAM9nB,GACX,OAAOA,EA0BX,kBACI,WAAY+nB,GACRp1B,KAAKq1B,gBAAkBD,EACvBp1B,KAAKs1B,cAAgB,GACrBt1B,KAAKu1B,eAAiB,GAEjBL,MA7Bb,SAASM,EAAelpB,EAAQmpB,GAE5B,IAAI9jB,EAAK+jB,EACT,IAAK/jB,KAAOrF,EAGR,cADAopB,EAAQppB,EAAOqF,KAEX,IAAK,WAGG+jB,EAAM3lB,WAAa2lB,EAAM3lB,UAAUnP,OACnC80B,EAAM3lB,UAAU4lB,UAAYF,KAEhC,MACJ,IAAK,SACDA,EAASD,EAAeE,EAAOD,GAK3C,OAAOA,EAUCD,CAAetB,GAAM,GACrBgB,IAAc,GA0H1B,OAtHIU,kBAAA,SAAMvoB,GACF,IAAKA,EACD,OAAOA,EAGX,IAAMwoB,EAAgBxoB,EAAKsoB,UAC3B,IAAKE,EAKD,OAHIxoB,EAAKe,OAASf,EAAKe,MAAMunB,WACzB31B,KAAKsO,MAAMjB,EAAKe,OAEbf,EAGX,IAIIyoB,EAJEC,EAAO/1B,KAAKq1B,gBACdzd,EAAO5X,KAAKs1B,cAAcO,GAC1BG,EAAUh2B,KAAKu1B,eAAeM,GAC5BI,EAAYjB,GAalB,GAVAiB,EAAUhB,aAAc,EAEnBrd,IAEDA,EAAOme,EADPD,EAAS,QAAQzoB,EAAKzM,OACCu0B,GACvBa,EAAUD,EAAQD,UAAgBX,GAClCn1B,KAAKs1B,cAAcO,GAAiBje,EACpC5X,KAAKu1B,eAAeM,GAAiBG,GAGrCpe,IAASud,GAAO,CAChB,IAAMe,EAAUte,EAAKpE,KAAKuiB,EAAM1oB,EAAM4oB,GAClC5oB,GAAQ0oB,EAAKI,cACb9oB,EAAO6oB,GAIf,GAAID,EAAUhB,aAAe5nB,EACzB,GAAIA,EAAKvO,OACL,IAAK,IAAI4B,EAAI,EAAG01B,EAAM/oB,EAAKvO,OAAQ4B,EAAI01B,EAAK11B,IACpC2M,EAAK3M,GAAGoS,QACRzF,EAAK3M,GAAGoS,OAAO9S,WAGhBqN,EAAKyF,QACZzF,EAAKyF,OAAO9S,MAQpB,OAJIg2B,GAAWb,IACXa,EAAQxiB,KAAKuiB,EAAM1oB,GAGhBA,GAGXuoB,uBAAA,SAAWzoB,EAAOkpB,GACd,IAAKlpB,EACD,OAAOA,EAGX,IACIzM,EADE01B,EAAMjpB,EAAMrO,OAIlB,GAAIu3B,IAAiBr2B,KAAKq1B,gBAAgBc,YAAa,CACnD,IAAKz1B,EAAI,EAAGA,EAAI01B,EAAK11B,IACjBV,KAAKsO,MAAMnB,EAAMzM,IAErB,OAAOyM,EAIX,IAAMmpB,EAAM,GACZ,IAAK51B,EAAI,EAAGA,EAAI01B,EAAK11B,IAAK,CACtB,IAAM61B,EAAQv2B,KAAKsO,MAAMnB,EAAMzM,SACjB8L,IAAV+pB,IACCA,EAAM51B,OAEA41B,EAAMz3B,QACbkB,KAAKw2B,QAAQD,EAAOD,GAFpBA,EAAI91B,KAAK+1B,IAKjB,OAAOD,GAGXV,oBAAA,SAAQngB,EAAK6gB,GAKT,IAAIF,EAAK11B,EAAGipB,EAAM8M,EAAWziB,EAAG0iB,EAEhC,IANKJ,IACDA,EAAM,IAKL51B,EAAI,EAAG01B,EAAM3gB,EAAI3W,OAAQ4B,EAAI01B,EAAK11B,IAEnC,QAAa8L,KADbmd,EAAOlU,EAAI/U,IAIX,GAAKipB,EAAKhpB,OAKV,IAAKqT,EAAI,EAAGyiB,EAAY9M,EAAK7qB,OAAQkV,EAAIyiB,EAAWziB,SAE7BxH,KADnBkqB,EAAa/M,EAAK3V,MAIb0iB,EAAW/1B,OAEL+1B,EAAW53B,QAClBkB,KAAKw2B,QAAQE,EAAYJ,GAFzBA,EAAI91B,KAAKk2B,SAVbJ,EAAI91B,KAAKmpB,GAiBjB,OAAO2M,sBC/JX,WAAYK,GACR32B,KAAKqZ,QAAU,GACfrZ,KAAK42B,gBAAkB,GACvB52B,KAAK62B,kBAAoBF,EACzB32B,KAAK82B,cAAgB,EAgD7B,OA7CIC,sBAAA,SAAUxP,GACN,IAAMyP,EAAkBh3B,KACpBi3B,EAAa,CACT1P,WACA7W,KAAM,KACNwmB,SAAS,GAGjB,OADAl3B,KAAKqZ,QAAQ7Y,KAAKy2B,GACX,WACHA,EAAWvmB,KAAOpD,MAAMyC,UAAU8B,MAAM2B,KAAKM,UAAW,GACxDmjB,EAAWC,SAAU,EACrBF,EAAgBG,WAIxBJ,8BAAA,SAAkBxP,GACdvnB,KAAK42B,gBAAgBp2B,KAAK+mB,IAG9BwP,mBAAA,WACI/2B,KAAK82B,gBACL,IACI,OAAa,CACT,KAAO92B,KAAKqZ,QAAQva,OAAS,GAAG,CAC5B,IAAMm4B,EAAaj3B,KAAKqZ,QAAQ,GAChC,IAAK4d,EAAWC,QACZ,OAEJl3B,KAAKqZ,QAAUrZ,KAAKqZ,QAAQxH,MAAM,GAClColB,EAAW1P,SAASlG,MAAM,KAAM4V,EAAWvmB,MAE/C,GAAoC,IAAhC1Q,KAAK42B,gBAAgB93B,OACrB,MAEJ,IAAMs4B,EAAiBp3B,KAAK42B,gBAAgB,GAC5C52B,KAAK42B,gBAAkB52B,KAAK42B,gBAAgB/kB,MAAM,GAClDulB,aAGJp3B,KAAK82B,gBAEkB,IAAvB92B,KAAK82B,eAAuB92B,KAAK62B,mBACjC72B,KAAK62B,0BC7CXQ,GAAgB,SAASC,EAAUC,GAErCv3B,KAAKw3B,SAAW,IAAI5B,GAAQ51B,MAC5BA,KAAKy3B,UAAYH,EACjBt3B,KAAK03B,QAAUH,EACfv3B,KAAK2N,QAAU,IAAI8O,EAASY,KAC5Brd,KAAK23B,YAAc,EACnB33B,KAAK43B,qBAAuB,GAC5B53B,KAAK63B,kBAAoB,GACzB73B,KAAK83B,WAAa,IAAIf,GAAgB/2B,KAAK62B,kBAAkBx1B,KAAKrB,QAGtEq3B,GAActnB,UAAY,CACtBomB,aAAa,EACb4B,IAAK,SAAUxX,GACX,IAEIvgB,KAAKw3B,SAASlpB,MAAMiS,GAExB,MAAO9gB,GACHO,KAAKF,MAAQL,EAGjBO,KAAKg4B,YAAa,EAClBh4B,KAAK83B,WAAWX,UAEpBN,kBAAmB,WACV72B,KAAKg4B,YAGVh4B,KAAK03B,QAAQ13B,KAAKF,QAEtBm4B,YAAa,SAAUC,EAAYjC,GAC/B,IAAMkC,EAAYD,EAAW76B,QAAQ0d,OAErC,IAAKmd,EAAWzL,KAAO0L,EAAW,CAE9B,IAAMxqB,EAAU,IAAI8O,EAASY,KAAKrd,KAAK2N,QAASyS,EAAgBpgB,KAAK2N,QAAQ2P,SACvE8a,EAAezqB,EAAQ2P,OAAO,GAEpCtd,KAAK23B,cACDO,EAAWpL,mBACX9sB,KAAK83B,WAAWO,kBAAkBr4B,KAAKs4B,kBAAkBj3B,KAAKrB,KAAMk4B,EAAYvqB,EAASyqB,IAEzFp4B,KAAKs4B,kBAAkBJ,EAAYvqB,EAASyqB,GAGpDnC,EAAUhB,aAAc,GAE5BqD,kBAAmB,SAASJ,EAAYvqB,EAASyqB,GAC7C,IAAIG,EACEJ,EAAYD,EAAW76B,QAAQ0d,OAErC,IACIwd,EAAkBL,EAAWnL,cAAcpf,GAC7C,MAAOlO,GACAA,EAAE8B,WAAY9B,EAAEuO,MAAQkqB,EAAWjrB,WAAYxN,EAAE8B,SAAW22B,EAAWlrB,WAAWzL,UAEvF22B,EAAWzL,KAAM,EAEjByL,EAAWp4B,MAAQL,EAGvB,IAAI84B,GAAqBA,EAAgB9L,MAAO0L,EAqB5Cn4B,KAAK23B,cACD33B,KAAKg4B,YACLh4B,KAAK83B,WAAWX,aAvBoC,CAEpDoB,EAAgBl7B,QAAQm7B,WACxB7qB,EAAQ8qB,gBAAiB,GAM7B,IAFA,IAAMC,OAAiDlsB,IAAxB+rB,EAAgB9L,IAEtC/rB,EAAI,EAAGA,EAAI03B,EAAa9Y,MAAMxgB,OAAQ4B,IAC3C,GAAI03B,EAAa9Y,MAAM5e,KAAOw3B,EAAY,CACtCE,EAAa9Y,MAAM5e,GAAK63B,EACxB,MAIR,IAAMI,EAAa34B,KAAK24B,WAAWt3B,KAAKrB,KAAMu4B,EAAiB5qB,GAAUirB,EAAsB54B,KAAK83B,WAAWe,UAAUF,GAEzH34B,KAAKy3B,UAAUj3B,KAAK+3B,EAAgB5L,UAAW+L,EAAwBH,EAAgBvrB,WACnFurB,EAAgBl7B,QAASu7B,KAQrCD,WAAY,SAAUT,EAAYvqB,EAASlO,EAAG8gB,EAAMuY,EAAgBC,GAC5Dt5B,IACKA,EAAE8B,WACH9B,EAAEuO,MAAQkqB,EAAWjrB,WAAYxN,EAAE8B,SAAW22B,EAAWlrB,WAAWzL,UAExEvB,KAAKF,MAAQL,GAGjB,IAAMu5B,EAAgBh5B,KAClBm4B,EAAYD,EAAW76B,QAAQ0d,OAC/B6R,EAAWsL,EAAW76B,QAAQuvB,SAC9BqM,EAAaf,EAAW76B,QAAQ67B,SAChCC,EAAkBL,GAAkBC,KAAYC,EAAcnB,kBAoBlE,GAlBKlqB,EAAQ8qB,iBAELP,EAAW7K,OADX8L,GAGkB,WACd,OAAIJ,KAAYC,EAAcpB,uBAG9BoB,EAAcpB,qBAAqBmB,IAAY,GACxC,MAKdA,GAAYE,IACbf,EAAW7K,MAAO,GAGlB9M,IACA2X,EAAW3X,KAAOA,EAClB2X,EAAW5K,iBAAmByL,GAEzBZ,IAAcvL,IAAajf,EAAQ8qB,iBAAmBU,IAAkB,CACzEH,EAAcnB,kBAAkBkB,IAAY,EAE5C,IAAMK,EAAap5B,KAAK2N,QACxB3N,KAAK2N,QAAUA,EACf,IACI3N,KAAKw3B,SAASlpB,MAAMiS,GACtB,MAAO9gB,GACLO,KAAKF,MAAQL,EAEjBO,KAAK2N,QAAUyrB,EAIvBJ,EAAcrB,cAEVqB,EAAchB,YACdgB,EAAclB,WAAWX,UAGjCkC,iBAAkB,SAAUC,EAAUrD,GACN,oBAAxBqD,EAASlrB,MAAMxN,KACfZ,KAAK2N,QAAQ2P,OAAOuD,QAAQyY,GAE5BrD,EAAUhB,aAAc,GAGhCsE,oBAAqB,SAASD,GACE,oBAAxBA,EAASlrB,MAAMxN,MACfZ,KAAK2N,QAAQ2P,OAAO1D,SAG5B4f,YAAa,SAAUC,EAAYxD,GAC/Bj2B,KAAK2N,QAAQ2P,OAAOuD,QAAQ4Y,IAEhCC,eAAgB,SAAUD,GACtBz5B,KAAK2N,QAAQ2P,OAAO1D,SAExB+f,qBAAsB,SAAUC,EAAqB3D,GACjDj2B,KAAK2N,QAAQ2P,OAAOuD,QAAQ+Y,IAEhCC,wBAAyB,SAAUD,GAC/B55B,KAAK2N,QAAQ2P,OAAO1D,SAExBkgB,aAAc,SAAUC,EAAa9D,GACjCj2B,KAAK2N,QAAQ2P,OAAOuD,QAAQkZ,IAEhCC,gBAAiB,SAAUD,GACvB/5B,KAAK2N,QAAQ2P,OAAO1D,SAExBqgB,WAAY,SAAUC,EAAWjE,GAC7Bj2B,KAAK2N,QAAQ2P,OAAOuD,QAAQqZ,EAAU5a,MAAM,KAEhD6a,cAAe,SAAUD,GACrBl6B,KAAK2N,QAAQ2P,OAAO1D,UCzL5B,kBACI,WAAYwgB,GACRp6B,KAAKo6B,QAAUA,EAwCvB,OArCIC,gBAAA,SAAI9Z,GACAvgB,KAAKsO,MAAMiS,IAGf8Z,uBAAA,SAAWltB,GACP,IAAKA,EACD,OAAOA,EAGX,IACIzM,EADE01B,EAAMjpB,EAAMrO,OAElB,IAAK4B,EAAI,EAAGA,EAAI01B,EAAK11B,IACjBV,KAAKsO,MAAMnB,EAAMzM,IAErB,OAAOyM,GAGXktB,kBAAA,SAAMhtB,GACF,OAAKA,EAGDA,EAAKsG,cAAgBrG,MACdtN,KAAK8Y,WAAWzL,KAGtBA,EAAK6f,kBAAoB7f,EAAK6f,qBAG/BltB,KAAKo6B,QACL/sB,EAAKitB,mBAELjtB,EAAKktB,qBAGTltB,EAAKyF,OAAO9S,OARDqN,GAPAA,sBChBf,aACIrN,KAAKw3B,SAAW,IAAI5B,GAAQ51B,MAC5BA,KAAKyc,SAAW,GAChBzc,KAAKw6B,gBAAkB,CAAC,IAwFhC,OArFIC,gBAAA,SAAIla,GAGA,OAFAA,EAAOvgB,KAAKw3B,SAASlpB,MAAMiS,IACtBma,WAAa16B,KAAKw6B,gBAAgB,GAChCja,GAGXka,6BAAA,SAAiBnB,EAAUrD,GACvBA,EAAUhB,aAAc,GAG5BwF,iCAAA,SAAqBb,EAAqB3D,GACtCA,EAAUhB,aAAc,GAG5BwF,yBAAA,SAAaV,EAAa9D,GACtB,IAAI8D,EAAYxZ,KAAhB,CAIA,IAAI7f,EACAsT,EACA8F,EAEArB,EADEkiB,EAAyB,GAIzBrb,EAAQya,EAAYza,MAAOiH,EAAUjH,EAAQA,EAAMxgB,OAAS,EAClE,IAAK4B,EAAI,EAAGA,EAAI6lB,EAAS7lB,IACjBq5B,EAAYza,MAAM5e,aAAcwzB,GAAK1F,SACrCmM,EAAuBn6B,KAAK8e,EAAM5e,IAClCq5B,EAAYa,mBAAoB,GAMxC,IAAM5d,EAAQ+c,EAAY/c,MAC1B,IAAKtc,EAAI,EAAGA,EAAIsc,EAAMle,OAAQ4B,IAAK,CAC/B,IAAMm6B,EAAe7d,EAAMtc,GAAsDo6B,EAAvCD,EAAaA,EAAa/7B,OAAS,GAA6B2Z,WAW1G,KATAA,EAAaqiB,EAAgB1a,EAAgB0a,GAAe55B,OAAOy5B,GAC7DA,KAGFliB,EAAaA,EAAWtJ,KAAI,SAAS4rB,GACjC,OAAOA,EAAmBhoB,YAI7BiB,EAAI,EAAGA,EAAIyE,EAAW3Z,OAAQkV,IAC/BhU,KAAKg7B,cAAe,GACpBlhB,EAASrB,EAAWzE,IACb+a,kBAAkB8L,GACzB/gB,EAAOuG,QAAU0Z,EACP,IAAN/lB,IAAW8F,EAAOmhB,+BAAgC,GACtDj7B,KAAKw6B,gBAAgBx6B,KAAKw6B,gBAAgB17B,OAAS,GAAG0B,KAAKsZ,GAInE9Z,KAAKyc,SAASjc,KAAKu5B,EAAY1a,aAGnCob,4BAAA,SAAgBV,GACPA,EAAYxZ,OACbvgB,KAAKyc,SAAS3d,OAASkB,KAAKyc,SAAS3d,OAAS,IAItD27B,uBAAA,SAAWP,EAAWjE,GAClBiE,EAAUQ,WAAa,GACvB16B,KAAKw6B,gBAAgBh6B,KAAK05B,EAAUQ,aAGxCD,0BAAA,SAAcP,GACVl6B,KAAKw6B,gBAAgB17B,OAASkB,KAAKw6B,gBAAgB17B,OAAS,GAGhE27B,wBAAA,SAAYhB,EAAYxD,GACpBwD,EAAWiB,WAAa,GACxB16B,KAAKw6B,gBAAgBh6B,KAAKi5B,EAAWiB,aAGzCD,2BAAA,SAAehB,GACXz5B,KAAKw6B,gBAAgB17B,OAASkB,KAAKw6B,gBAAgB17B,OAAS,sBAKhE,aACIkB,KAAKw3B,SAAW,IAAI5B,GAAQ51B,MAwYpC,OArYIk7B,gBAAA,SAAI3a,GACA,IAAM4a,EAAe,IAAIV,GAGzB,GAFAz6B,KAAKo7B,cAAgB,GACrBD,EAAapD,IAAIxX,IACZ4a,EAAaH,aAAgB,OAAOza,EACzCA,EAAKma,WAAana,EAAKma,WAAWx5B,OAAOlB,KAAKq7B,iBAAiB9a,EAAKma,WAAYna,EAAKma,aACrF16B,KAAKw6B,gBAAkB,CAACja,EAAKma,YAC7B,IAAMY,EAAUt7B,KAAKw3B,SAASlpB,MAAMiS,GAEpC,OADAvgB,KAAKu7B,0BAA0Bhb,EAAKma,YAC7BY,GAGXJ,sCAAA,SAA0BziB,GACtB,IAAM+iB,EAAUx7B,KAAKo7B,cACrB3iB,EAAW2I,QAAO,SAAStH,GACvB,OAAQA,EAAO2hB,iBAA+C,GAA5B3hB,EAAO8U,WAAW9vB,UACrD0O,SAAQ,SAASsM,GAChB,IAAI+F,EAAW,YACf,IACIA,EAAW/F,EAAO+F,SAASxP,MAAM,IAErC,MAAOzS,IAEF49B,EAAW1hB,EAAO9L,UAAS6R,KAC5B2b,EAAW1hB,EAAO9L,UAAS6R,IAAc,EACzCle,EAAOzB,KAAK,WAAW2f,2BAKnCqb,6BAAA,SAAiBQ,EAAaC,EAAmBC,GAU7C,IAAIC,EAEAC,EACAC,EAEA/iB,EAEA6hB,EACA/gB,EACAkiB,EACAC,EANEC,EAAe,GAEfC,EAAgBn8B,KActB,IARA47B,EAAiBA,GAAkB,EAQ9BC,EAAc,EAAGA,EAAcH,EAAY58B,OAAQ+8B,IACpD,IAAKC,EAAoB,EAAGA,EAAoBH,EAAkB78B,OAAQg9B,IAEtEhiB,EAAS4hB,EAAYG,GACrBG,EAAeL,EAAkBG,GAG5BhiB,EAAO8U,WAAWhe,QAASorB,EAAatN,YAAe,IAG5DmM,EAAe,CAACmB,EAAa9M,cAAc,KAC3C6M,EAAUI,EAAcC,UAAUtiB,EAAQ+gB,IAE9B/7B,SACRgb,EAAO2hB,iBAAkB,EAGzB3hB,EAAOoV,cAAc1hB,SAAQ,SAAS6uB,GAClC,IAAMl8B,EAAO67B,EAAarpB,iBAG1BqG,EAAcmjB,EAAcG,eAAeP,EAASlB,EAAcwB,EAAcviB,EAAO4J,cAGvFuY,EAAY,IAAI/H,GAAW,OAAE8H,EAAanc,SAAUmc,EAAavN,OAAQ,EAAGuN,EAAahvB,WAAY7M,IAC3F+uB,cAAgBlW,EAG1BA,EAAYA,EAAYla,OAAS,GAAG2Z,WAAa,CAACwjB,GAGlDC,EAAa17B,KAAKy7B,GAClBA,EAAU5b,QAAU2b,EAAa3b,QAGjC4b,EAAUrN,WAAaqN,EAAUrN,WAAW1tB,OAAO86B,EAAapN,WAAY9U,EAAO8U,YAK/EoN,EAAaf,gCACbgB,EAAUhB,+BAAgC,EAC1Ce,EAAa3b,QAAQrD,MAAMxc,KAAKwY,SAOpD,GAAIkjB,EAAap9B,OAAQ,CAIrB,GADAkB,KAAKu8B,mBACDX,EAAiB,IAAK,CACtB,IAAIY,EAAc,wBACdC,EAAc,wBAClB,IACID,EAAcN,EAAa,GAAGhN,cAAc,GAAG7e,QAC/CosB,EAAcP,EAAa,GAAGrc,SAASxP,QAE3C,MAAO5Q,IACP,KAAM,CAAEyX,QAAS,gFAAgFslB,aAAsBC,OAK3H,OAAOP,EAAah7B,OAAOi7B,EAAcd,iBAAiBa,EAAcP,EAAmBC,EAAiB,IAE5G,OAAOM,GAIfhB,6BAAA,SAAiBwB,EAAUzG,GACvBA,EAAUhB,aAAc,GAG5BiG,iCAAA,SAAqBtB,EAAqB3D,GACtCA,EAAUhB,aAAc,GAG5BiG,0BAAA,SAAcyB,EAAc1G,GACxBA,EAAUhB,aAAc,GAG5BiG,yBAAA,SAAanB,EAAa9D,GACtB,IAAI8D,EAAYxZ,KAAhB,CAGA,IAAIwb,EACAa,EACAf,EAIAhB,EAHEH,EAAa16B,KAAKw6B,gBAAgBx6B,KAAKw6B,gBAAgB17B,OAAS,GAChE+9B,EAAiB,GACjBV,EAAgBn8B,KAKtB,IAAK67B,EAAc,EAAGA,EAAcnB,EAAW57B,OAAQ+8B,IACnD,IAAKe,EAAY,EAAGA,EAAY7C,EAAY/c,MAAMle,OAAQ89B,IAItD,GAHA/B,EAAed,EAAY/c,MAAM4f,IAG7B7C,EAAYa,kBAAhB,CACA,IAAMniB,EAAaoiB,EAAaA,EAAa/7B,OAAS,GAAG2Z,WACrDA,GAAcA,EAAW3Z,SAE7Bi9B,EAAU/7B,KAAKo8B,UAAU1B,EAAWmB,GAAchB,IAEtC/7B,SACR47B,EAAWmB,GAAaJ,iBAAkB,EAE1Cf,EAAWmB,GAAa3M,cAAc1hB,SAAQ,SAAS6uB,GACnD,IAAIS,EACJA,EAAoBX,EAAcG,eAAeP,EAASlB,EAAcwB,EAAc3B,EAAWmB,GAAanY,aAC9GmZ,EAAer8B,KAAKs8B,OAKpC/C,EAAY/c,MAAQ+c,EAAY/c,MAAM9b,OAAO27B,KAGjD3B,sBAAA,SAAUphB,EAAQijB,GAKd,IAAIC,EAEAC,EACAC,EACAC,EACAC,EACA18B,EAIA28B,EAFEC,EAAiBxjB,EAAO+F,SAASrH,SACjC+kB,EAAmB,GAEnBxB,EAAU,GAGhB,IAAKiB,EAAwB,EAAGA,EAAwBD,EAAqBj+B,OAAQk+B,IAGjF,IAFAC,EAAoBF,EAAqBC,GAEpCE,EAAwB,EAAGA,EAAwBD,EAAkBzkB,SAAS1Z,OAAQo+B,IAUvF,IARAC,EAAkBF,EAAkBzkB,SAAS0kB,IAGzCpjB,EAAO+U,aAA0C,IAA1BmO,GAAyD,IAA1BE,IACtDK,EAAiB/8B,KAAK,CAACo8B,UAAWI,EAAuBhvB,MAAOkvB,EAAuBM,QAAS,EAC5FC,kBAAmBN,EAAgB3qB,aAGtC9R,EAAI,EAAGA,EAAI68B,EAAiBz+B,OAAQ4B,IACrC28B,EAAiBE,EAAiB78B,GAMT,MADzB08B,EAAmBD,EAAgB3qB,WAAWpE,QACW,IAA1B8uB,IAC3BE,EAAmB,MA5Bbp9B,KAgCS09B,qBAAqBJ,EAAeD,EAAeG,SAASpvB,MAAO+uB,EAAgB/uB,QACjGivB,EAAeG,QAAU,GAAKF,EAAeD,EAAeG,SAAShrB,WAAWpE,QAAUgvB,EAC3FC,EAAiB,KAEjBA,EAAeG,UAIfH,IACAA,EAAeM,SAAWN,EAAeG,UAAYF,EAAex+B,OAChEu+B,EAAeM,WACb7jB,EAAOgV,aACJoO,EAAwB,EAAID,EAAkBzkB,SAAS1Z,QAAUk+B,EAAwB,EAAID,EAAqBj+B,UACvHu+B,EAAiB,OAIrBA,EACIA,EAAeM,WACfN,EAAev+B,OAASw+B,EAAex+B,OACvCu+B,EAAeO,aAAeZ,EAC9BK,EAAeQ,oBAAsBX,EAAwB,EAC7DK,EAAiBz+B,OAAS,EAC1Bi9B,EAAQv7B,KAAK68B,KAGjBE,EAAiB58B,OAAOD,EAAG,GAC3BA,KAKhB,OAAOq7B,GAGXb,iCAAA,SAAqB4C,EAAeC,GAChC,GAA6B,iBAAlBD,GAAuD,iBAAlBC,EAC5C,OAAOD,IAAkBC,EAE7B,GAAID,aAAyB5J,GAAKnJ,UAC9B,OAAI+S,EAAcvvB,KAAOwvB,EAAcxvB,IAAMuvB,EAAcnsB,MAAQosB,EAAcpsB,MAG5EmsB,EAAc1vB,OAAU2vB,EAAc3vB,OAM3C0vB,EAAgBA,EAAc1vB,MAAMA,OAAS0vB,EAAc1vB,UAC3D2vB,EAAgBA,EAAc3vB,MAAMA,OAAS2vB,EAAc3vB,QANnD0vB,EAAc1vB,QAAS2vB,EAAc3vB,OAWjD,GAFA0vB,EAAgBA,EAAc1vB,MAC9B2vB,EAAgBA,EAAc3vB,MAC1B0vB,aAAyB5J,GAAK3b,SAAU,CACxC,KAAMwlB,aAAyB7J,GAAK3b,WAAaulB,EAActlB,SAAS1Z,SAAWi/B,EAAcvlB,SAAS1Z,OACtG,OAAO,EAEX,IAAK,IAAI4B,EAAI,EAAGA,EAAKo9B,EAActlB,SAAS1Z,OAAQ4B,IAAK,CACrD,GAAIo9B,EAActlB,SAAS9X,GAAG8R,WAAWpE,QAAU2vB,EAAcvlB,SAAS9X,GAAG8R,WAAWpE,QAC1E,IAAN1N,IAAYo9B,EAActlB,SAAS9X,GAAG8R,WAAWpE,OAAS,QAAU2vB,EAAcvlB,SAAS9X,GAAG8R,WAAWpE,OAAS,MAClH,OAAO,EAGf,IAAKpO,KAAK09B,qBAAqBI,EAActlB,SAAS9X,GAAG0N,MAAO2vB,EAAcvlB,SAAS9X,GAAG0N,OACtF,OAAO,EAGf,OAAO,EAEX,OAAO,GAGX8sB,2BAAA,SAAea,EAASlB,EAAcmD,EAAqBta,GAIvD,IAAkFua,EAAYpe,EAAUqe,EAAchvB,EAAOivB,EAAzHC,EAA2B,EAAGC,EAAkC,EAAGlhB,EAAO,GAE9E,IAAK8gB,EAAa,EAAGA,EAAalC,EAAQj9B,OAAQm/B,IAE9Cpe,EAAWgb,GADX3rB,EAAQ6sB,EAAQkC,IACcrB,WAC9BsB,EAAe,IAAIhK,GAAK3hB,QACpBrD,EAAMuuB,kBACNO,EAAoBxlB,SAAS,GAAGpK,MAChC4vB,EAAoBxlB,SAAS,GAAG/F,WAChCurB,EAAoBxlB,SAAS,GAAGvL,WAChC+wB,EAAoBxlB,SAAS,GAAGxL,YAGhCkC,EAAM0tB,UAAYwB,GAA4BC,EAAkC,IAChFlhB,EAAKA,EAAKre,OAAS,GAAG0Z,SAAW2E,EAAKA,EAAKre,OAAS,GAC/C0Z,SAAStX,OAAO25B,EAAauD,GAA0B5lB,SAAS3G,MAAMwsB,IAC3EA,EAAkC,EAClCD,KAGJD,EAActe,EAASrH,SAClB3G,MAAMwsB,EAAiCnvB,EAAMlB,OAC7C9M,OAAO,CAACg9B,IACRh9B,OAAO88B,EAAoBxlB,SAAS3G,MAAM,IAE3CusB,IAA6BlvB,EAAM0tB,WAAaqB,EAAa,EAC7D9gB,EAAKA,EAAKre,OAAS,GAAG0Z,SAClB2E,EAAKA,EAAKre,OAAS,GAAG0Z,SAAStX,OAAOi9B,IAE1ChhB,EAAOA,EAAKjc,OAAO25B,EAAahpB,MAAMusB,EAA0BlvB,EAAM0tB,aAEjEp8B,KAAK,IAAI0zB,GAAK3b,SACf4lB,IAGRC,EAA2BlvB,EAAM0uB,cACjCS,EAAkCnvB,EAAM2uB,sBACDhD,EAAauD,GAA0B5lB,SAAS1Z,SACnFu/B,EAAkC,EAClCD,KAqBR,OAjBIA,EAA2BvD,EAAa/7B,QAAUu/B,EAAkC,IACpFlhB,EAAKA,EAAKre,OAAS,GAAG0Z,SAAW2E,EAAKA,EAAKre,OAAS,GAC/C0Z,SAAStX,OAAO25B,EAAauD,GAA0B5lB,SAAS3G,MAAMwsB,IAC3ED,KAIJjhB,GADAA,EAAOA,EAAKjc,OAAO25B,EAAahpB,MAAMusB,EAA0BvD,EAAa/7B,UACjEqQ,KAAI,SAAUmvB,GAEtB,IAAMC,EAAUD,EAAavlB,cAAculB,EAAa9lB,UAMxD,OALIkL,EACA6a,EAAQjE,mBAERiE,EAAQhE,qBAELgE,MAKfrD,uBAAA,SAAWhB,EAAWjE,GAClB,IAAIuI,EAAgBtE,EAAUQ,WAAWx5B,OAAOlB,KAAKw6B,gBAAgBx6B,KAAKw6B,gBAAgB17B,OAAS,IACnG0/B,EAAgBA,EAAct9B,OAAOlB,KAAKq7B,iBAAiBmD,EAAetE,EAAUQ,aACpF16B,KAAKw6B,gBAAgBh6B,KAAKg+B,IAG9BtD,0BAAA,SAAchB,GACV,IAAMuE,EAAYz+B,KAAKw6B,gBAAgB17B,OAAS,EAChDkB,KAAKw6B,gBAAgB17B,OAAS2/B,GAGlCvD,wBAAA,SAAYzB,EAAYxD,GACpB,IAAIuI,EAAgB/E,EAAWiB,WAAWx5B,OAAOlB,KAAKw6B,gBAAgBx6B,KAAKw6B,gBAAgB17B,OAAS,IACpG0/B,EAAgBA,EAAct9B,OAAOlB,KAAKq7B,iBAAiBmD,EAAe/E,EAAWiB,aACrF16B,KAAKw6B,gBAAgBh6B,KAAKg+B,IAG9BtD,2BAAA,SAAezB,GACX,IAAMgF,EAAYz+B,KAAKw6B,gBAAgB17B,OAAS,EAChDkB,KAAKw6B,gBAAgB17B,OAAS2/B,sBC1elC,aACIz+B,KAAKyc,SAAW,CAAC,IACjBzc,KAAKw3B,SAAW,IAAI5B,GAAQ51B,MAiDpC,OA9CI0+B,gBAAA,SAAIne,GACA,OAAOvgB,KAAKw3B,SAASlpB,MAAMiS,IAG/Bme,6BAAA,SAAiBpF,EAAUrD,GACvBA,EAAUhB,aAAc,GAG5ByJ,iCAAA,SAAqB9E,EAAqB3D,GACtCA,EAAUhB,aAAc,GAG5ByJ,yBAAA,SAAa3E,EAAa9D,GACtB,IAEI5W,EAFE1R,EAAU3N,KAAKyc,SAASzc,KAAKyc,SAAS3d,OAAS,GAC/Cke,EAAQ,GAGdhd,KAAKyc,SAASjc,KAAKwc,GAEd+c,EAAYxZ,QACblB,EAAY0a,EAAY1a,aAEpBA,EAAYA,EAAU+B,QAAO,SAASvB,GAAY,OAAOA,EAAS9F,iBAClEggB,EAAY1a,UAAYA,EAAUvgB,OAASugB,EAAaA,EAAY,KAChEA,GAAa0a,EAAYpW,cAAc3G,EAAOrP,EAAS0R,IAE1DA,IAAa0a,EAAYza,MAAQ,MACtCya,EAAY/c,MAAQA,IAI5B0hB,4BAAA,SAAgB3E,GACZ/5B,KAAKyc,SAAS3d,OAASkB,KAAKyc,SAAS3d,OAAS,GAGlD4/B,uBAAA,SAAWxE,EAAWjE,GAClB,IAAMtoB,EAAU3N,KAAKyc,SAASzc,KAAKyc,SAAS3d,OAAS,GACrDo7B,EAAU5a,MAAM,GAAGiB,KAA2B,IAAnB5S,EAAQ7O,QAAgB6O,EAAQ,GAAGye,YAGlEsS,wBAAA,SAAYjF,EAAYxD,GACpB,IAAMtoB,EAAU3N,KAAKyc,SAASzc,KAAKyc,SAAS3d,OAAS,GACjD26B,EAAWna,OAASma,EAAWna,MAAMxgB,SACrC26B,EAAWna,MAAM,GAAGiB,KAAQkZ,EAAWvT,UAA+B,IAAnBvY,EAAQ7O,QAAgB,0BC/CnF,WAAY6O,GACR3N,KAAKw3B,SAAW,IAAI5B,GAAQ51B,MAC5BA,KAAK2+B,SAAWhxB,EAwExB,OArEIixB,0CAAA,SAA8BC,GAC1B,IAAI3e,EACJ,IAAK2e,EACD,OAAO,EAEX,IAAK,IAAI3uB,EAAI,EAAGA,EAAI2uB,EAAU//B,OAAQoR,IAElC,IADAgQ,EAAO2e,EAAU3uB,IACRqM,UAAY2D,EAAK3D,SAASvc,KAAK2+B,YAAcze,EAAKgN,mBAGvD,OAAO,EAGf,OAAO,GAGX0R,kCAAA,SAAsBE,GACdA,GAASA,EAAMxf,QACfwf,EAAMxf,MAAQwf,EAAMxf,MAAM8B,QAAO,SAAA2d,GAAS,OAAAA,EAAMrb,iBAIxDkb,oBAAA,SAAQE,GACJ,OAAQA,IAASA,EAAMxf,OACO,IAAvBwf,EAAMxf,MAAMxgB,QAGvB8/B,+BAAA,SAAmB7E,GACf,SAAQA,IAAeA,EAAY/c,QAC5B+c,EAAY/c,MAAMle,OAAS,GAGtC8/B,8BAAA,SAAkBvxB,EAAM2xB,GACpB,IAAK3xB,EAAK6f,mBAAoB,CAC1B,GAAIltB,KAAKiO,QAAQZ,KAAUrN,KAAKi/B,8BAA8BD,GAC1D,OAGJ,OAAO3xB,EAGX,IAAM6xB,EAAoB7xB,EAAKiS,MAAM,GAGrC,GAFAtf,KAAKm/B,sBAAsBD,IAEvBl/B,KAAKiO,QAAQixB,GAOjB,OAHA7xB,EAAKitB,mBACLjtB,EAAK+xB,wBAEE/xB,GAGXuxB,6BAAA,SAAiB7E,GACb,QAAIA,EAAYvZ,YAIZxgB,KAAKiO,QAAQ8rB,OAIZA,EAAYxZ,OAASvgB,KAAKq/B,mBAAmBtF,UAQpDnP,GAAe,SAASjd,GAC1B3N,KAAKw3B,SAAW,IAAI5B,GAAQ51B,MAC5BA,KAAK2+B,SAAWhxB,EAChB3N,KAAKs/B,MAAQ,IAAIV,GAAgBjxB,IAGrCid,GAAa7a,UAAY,CACrBomB,aAAa,EACb4B,IAAK,SAAUxX,GACX,OAAOvgB,KAAKw3B,SAASlpB,MAAMiS,IAG/B8Y,iBAAkB,SAAUC,EAAUrD,GAClC,IAAIqD,EAASpM,qBAAsBoM,EAASte,SAG5C,OAAOse,GAGXK,qBAAsB,SAAU4F,EAAWtJ,GAGvCsJ,EAAUjiB,OAAS,IAGvBkiB,YAAa,SAAUC,EAAYxJ,KAGnCyJ,aAAc,SAAUC,EAAa1J,GACjC,IAAI0J,EAAYzS,qBAAsByS,EAAYpjB,SAASvc,KAAK2+B,UAGhE,OAAOgB,GAGX1F,WAAY,SAASC,EAAWjE,GAC5B,IAAM+I,EAAgB9E,EAAU5a,MAAM,GAAGA,MAIzC,OAHA4a,EAAUpnB,OAAO9S,KAAKw3B,UACtBvB,EAAUhB,aAAc,EAEjBj1B,KAAKs/B,MAAMM,kBAAkB1F,EAAW8E,IAGnD/G,YAAa,SAAUC,EAAYjC,GAC/B,IAAIiC,EAAWhL,mBAGf,OAAOgL,GAGXsB,YAAa,SAASC,EAAYxD,GAC9B,OAAIwD,EAAWna,OAASma,EAAWna,MAAMxgB,OAC9BkB,KAAK6/B,oBAAoBpG,EAAYxD,GAErCj2B,KAAK8/B,uBAAuBrG,EAAYxD,IAIvD8J,eAAgB,SAASC,EAAe/J,GACpC,IAAK+J,EAAc9S,mBAEf,OADA8S,EAAcltB,OAAO9S,KAAKw3B,UACnBwI,GAIfH,oBAAqB,SAASpG,EAAYxD,GAkBtC,IAAM+I,EAXN,SAAsBvF,GAClB,IAAMwG,EAAYxG,EAAWna,MAC7B,OANJ,SAAwBma,GACpB,IAAMoF,EAAYpF,EAAWna,MAC7B,OAA4B,IAArBuf,EAAU//B,UAAkB+/B,EAAU,GAAG7hB,OAAuC,IAA9B6hB,EAAU,GAAG7hB,MAAMle,QAIxEohC,CAAezG,GACRwG,EAAU,GAAG3gB,MAGjB2gB,EAKWE,CAAa1G,GAQnC,OAPAA,EAAW3mB,OAAO9S,KAAKw3B,UACvBvB,EAAUhB,aAAc,EAEnBj1B,KAAKs/B,MAAMrxB,QAAQwrB,IACpBz5B,KAAK6qB,YAAY4O,EAAWna,MAAM,GAAGA,OAGlCtf,KAAKs/B,MAAMM,kBAAkBnG,EAAYuF,IAGpDc,uBAAwB,SAASrG,EAAYxD,GACzC,IAAIwD,EAAWvM,mBAAf,CAIA,GAAwB,aAApBuM,EAAW7e,KAAqB,CAIhC,GAAI5a,KAAKogC,QAAS,CACd,GAAI3G,EAAW5d,UAAW,CACtB,IAAMwkB,EAAU,IAAInM,GAAK9X,QAAQ,MAAMqd,EAAWppB,MAAMrQ,KAAK2+B,UAAUxhC,QAAQ,MAAO,aAEtF,OADAkjC,EAAQxkB,UAAY4d,EAAW5d,UACxB7b,KAAKw3B,SAASlpB,MAAM+xB,GAE/B,OAEJrgC,KAAKogC,SAAU,EAGnB,OAAO3G,IAGX6G,gBAAiB,SAAShhB,EAAOihB,GAC7B,GAAKjhB,EAIL,IAAK,IAAI5e,EAAI,EAAGA,EAAI4e,EAAMxgB,OAAQ4B,IAAK,CACnC,IAAMg8B,EAAWpd,EAAM5e,GACvB,GAAI6/B,GAAU7D,aAAoBxI,GAAKvZ,cAAgB+hB,EAAS1hB,SAC5D,KAAM,CAAE9D,QAAS,wEACblJ,MAAO0uB,EAASzvB,WAAY1L,SAAUm7B,EAAS1vB,YAAc0vB,EAAS1vB,WAAWzL,UAEzF,GAAIm7B,aAAoBxI,GAAKrK,KACzB,KAAM,CAAE3S,QAAS,aAAawlB,EAAS9hB,oCACnC5M,MAAO0uB,EAASzvB,WAAY1L,SAAUm7B,EAAS1vB,YAAc0vB,EAAS1vB,WAAWzL,UAEzF,GAAIm7B,EAAS97B,OAAS87B,EAASniB,UAC3B,KAAM,CAAErD,QAAYwlB,EAAS97B,sDACzBoN,MAAO0uB,EAASzvB,WAAY1L,SAAUm7B,EAAS1vB,YAAc0vB,EAAS1vB,WAAWzL,YAKjGu4B,aAAc,SAAUC,EAAa9D,GAEjC,IAAI/V,EAEEwC,EAAW,GAIjB,GAFA1iB,KAAKsgC,gBAAgBvG,EAAYza,MAAOya,EAAYvZ,WAE/CuZ,EAAYxZ,KA6BbwZ,EAAYjnB,OAAO9S,KAAKw3B,UACxBvB,EAAUhB,aAAc,MA9BL,CAEnBj1B,KAAKwgC,qBAAqBzG,GAM1B,IAHA,IAAMkG,EAAYlG,EAAYza,MAE1BmhB,EAAcR,EAAYA,EAAUnhC,OAAS,EACxC4B,EAAI,EAAGA,EAAI+/B,IAChBvgB,EAAO+f,EAAUv/B,KACLwf,EAAKZ,OAEboD,EAASliB,KAAKR,KAAKw3B,SAASlpB,MAAM4R,IAClC+f,EAAUt/B,OAAOD,EAAG,GACpB+/B,KAGJ//B,IAKA+/B,EAAc,EACd1G,EAAYjnB,OAAO9S,KAAKw3B,UAExBuC,EAAYza,MAAQ,KAExB2W,EAAUhB,aAAc,EAiB5B,OAXI8E,EAAYza,QACZtf,KAAK6qB,YAAYkP,EAAYza,OAC7Btf,KAAK0gC,sBAAsB3G,EAAYza,QAIvCtf,KAAKs/B,MAAMqB,iBAAiB5G,KAC5BA,EAAYO,mBACZ5X,EAAS/hB,OAAO,EAAG,EAAGo5B,IAGF,IAApBrX,EAAS5jB,OACF4jB,EAAS,GAEbA,GAGX8d,qBAAsB,SAASzG,GACvBA,EAAY/c,QACZ+c,EAAY/c,MAAQ+c,EAAY/c,MAC3BoE,QAAO,SAAA2O,GACJ,IAAIrvB,EAIJ,IAH0C,MAAtCqvB,EAAE,GAAGvX,SAAS,GAAGhG,WAAWpE,QAC5B2hB,EAAE,GAAGvX,SAAS,GAAGhG,WAAa,IAAI0hB,GAAe,WAAE,KAElDxzB,EAAI,EAAGA,EAAIqvB,EAAEjxB,OAAQ4B,IACtB,GAAIqvB,EAAErvB,GAAGgjB,aAAeqM,EAAErvB,GAAGqZ,cACzB,OAAO,EAGf,OAAO,OAKvB2mB,sBAAuB,SAASphB,GAC5B,GAAKA,EAAL,CAGA,IAEIshB,EACA1gB,EACAxf,EAJEmgC,EAAY,GAMlB,IAAKngC,EAAI4e,EAAMxgB,OAAS,EAAG4B,GAAK,EAAIA,IAEhC,IADAwf,EAAOZ,EAAM5e,cACOwzB,GAAKvZ,YACrB,GAAKkmB,EAAU3gB,EAAKtF,MAEb,EACHgmB,EAAWC,EAAU3gB,EAAKtF,iBACFsZ,GAAKvZ,cACzBimB,EAAWC,EAAU3gB,EAAKtF,MAAQ,CAACimB,EAAU3gB,EAAKtF,MAAMvK,MAAMrQ,KAAK2+B,YAEvE,IAAMmC,EAAU5gB,EAAK7P,MAAMrQ,KAAK2+B,WACG,IAA/BiC,EAAShwB,QAAQkwB,GACjBxhB,EAAM3e,OAAOD,EAAG,GAEhBkgC,EAASpgC,KAAKsgC,QAVlBD,EAAU3gB,EAAKtF,MAAQsF,IAiBvC2K,YAAa,SAASvL,GAClB,GAAKA,EAAL,CAOA,IAHA,IAAMyhB,EAAY,GACZC,EAAY,GAETtgC,EAAI,EAAGA,EAAI4e,EAAMxgB,OAAQ4B,IAAK,CACnC,IAAMwf,EAAOZ,EAAM5e,GACnB,GAAIwf,EAAKpF,MAAO,CACZ,IAAMnJ,EAAMuO,EAAKtF,KACjBmmB,EAAOpvB,GAAO2N,EAAM3e,OAAOD,IAAK,GAC5BsgC,EAAUxgC,KAAKugC,EAAOpvB,GAAO,IACjCovB,EAAOpvB,GAAKnR,KAAK0f,IAIzB8gB,EAAUxzB,SAAQ,SAAAia,GACd,GAAIA,EAAM3oB,OAAS,EAAG,CAClB,IAAMmiC,EAASxZ,EAAM,GACjByZ,EAAS,GACPC,EAAS,CAAC,IAAIjN,GAAKjL,WAAWiY,IACpCzZ,EAAMja,SAAQ,SAAA0S,GACU,MAAfA,EAAKpF,OAAmBomB,EAAMpiC,OAAS,GACxCqiC,EAAM3gC,KAAK,IAAI0zB,GAAKjL,WAAWiY,EAAQ,KAE3CA,EAAM1gC,KAAK0f,EAAK9R,OAChB6yB,EAAOpmB,UAAYomB,EAAOpmB,WAAaqF,EAAKrF,aAEhDomB,EAAO7yB,MAAQ,IAAI8lB,GAAKla,MAAMmnB,iBC7V/B,CACXvL,WACAyB,iBACA+J,+BACAC,iBACA3C,uBACA9T,mCCVA,IACIxT,EAGApD,EAMAstB,EAGAC,EAGAC,EAGAC,EAGAC,EAfAC,EAAY,GAiBVC,EAAc,GAUpB,SAASC,EAAe/iC,GAWpB,IAVA,IAMIsQ,EACA0yB,EACAzB,EARE0B,EAAOH,EAAYlhC,EACnBshC,EAAOhuB,EACPiuB,EAAOL,EAAYlhC,EAAIghC,EACvBQ,EAAWN,EAAYlhC,EAAI+gC,EAAQ3iC,OAASmjC,EAC5CE,EAAOP,EAAYlhC,GAAK5B,EACxBsjC,EAAMhrB,EAKLwqB,EAAYlhC,EAAIwhC,EAAUN,EAAYlhC,IAAK,CAG9C,GAFA0O,EAAIgzB,EAAIC,WAAWT,EAAYlhC,GAE3BkhC,EAAYU,mBAjBO,KAiBclzB,EAA8B,CAE/D,GAAiB,OADjB0yB,EAAWM,EAAInvB,OAAO2uB,EAAYlhC,EAAI,IAChB,CAClB2/B,EAAU,CAACryB,MAAO4zB,EAAYlhC,EAAG2b,eAAe,GAChD,IAAIkmB,EAAcH,EAAIxxB,QAAQ,KAAMgxB,EAAYlhC,EAAI,GAChD6hC,EAAc,IACdA,EAAcL,GAElBN,EAAYlhC,EAAI6hC,EAChBlC,EAAQmC,KAAOJ,EAAI9pB,OAAO+nB,EAAQryB,MAAO4zB,EAAYlhC,EAAI2/B,EAAQryB,OACjE4zB,EAAYa,aAAajiC,KAAK6/B,GAC9B,SACG,GAAiB,MAAbyB,EAAkB,CACzB,IAAMY,EAAgBN,EAAIxxB,QAAQ,KAAMgxB,EAAYlhC,EAAI,GACxD,GAAIgiC,GAAiB,EAAG,CACpBrC,EAAU,CACNryB,MAAO4zB,EAAYlhC,EACnB8hC,KAAMJ,EAAI9pB,OAAOspB,EAAYlhC,EAAGgiC,EAAgB,EAAId,EAAYlhC,GAChE2b,eAAe,GAEnBulB,EAAYlhC,GAAK2/B,EAAQmC,KAAK1jC,OAAS,EACvC8iC,EAAYa,aAAajiC,KAAK6/B,GAC9B,UAGR,MAGJ,GAnDe,KAmDVjxB,GAjDO,KAiDmBA,GAlDlB,IAkDyCA,GAhD1C,KAgDkEA,EAC1E,MAOR,GAHAqyB,EAAUA,EAAQ5vB,MAAM/S,EAAS8iC,EAAYlhC,EAAIyhC,EAAMF,GACvDP,EAAaE,EAAYlhC,GAEpB+gC,EAAQ3iC,OAAQ,CACjB,GAAIkV,EAAIwtB,EAAO1iC,OAAS,EAGpB,OAFA2iC,EAAUD,IAASxtB,GACnB6tB,EAAe,IACR,EAEXD,EAAYjE,UAAW,EAG3B,OAAOoE,IAASH,EAAYlhC,GAAKshC,IAAShuB,EAoS9C,OAjSA4tB,EAAYe,KAAO,WACfjB,EAAaE,EAAYlhC,EACzBihC,EAAUnhC,KAAM,CAAEihC,UAAS/gC,EAAGkhC,EAAYlhC,EAAGsT,OAEjD4tB,EAAYgB,QAAU,SAAAC,IAEdjB,EAAYlhC,EAAI4gC,GAAaM,EAAYlhC,IAAM4gC,GAAYuB,IAAyBtB,KACpFD,EAAWM,EAAYlhC,EACvB6gC,EAA+BsB,GAEnC,IAAMC,EAAQnB,EAAUnmB,MACxBimB,EAAUqB,EAAMrB,QAChBC,EAAaE,EAAYlhC,EAAIoiC,EAAMpiC,EACnCsT,EAAI8uB,EAAM9uB,GAEd4tB,EAAYmB,OAAS,WACjBpB,EAAUnmB,OAEdomB,EAAYoB,aAAe,SAAAC,GACvB,IAAMC,EAAMtB,EAAYlhC,GAAKuiC,GAAU,GACjCE,EAAO/rB,EAAMirB,WAAWa,GAC9B,OA5FmB,KA4FXC,GAzFQ,KAyFmBA,GA3FlB,IA2F0CA,GA1F3C,KA0FoEA,GAIxFvB,EAAYwB,IAAM,SAAAC,GACVzB,EAAYlhC,EAAIghC,IAChBD,EAAUA,EAAQ5vB,MAAM+vB,EAAYlhC,EAAIghC,GACxCA,EAAaE,EAAYlhC,GAG7B,IAAMyK,EAAIk4B,EAAIC,KAAK7B,GACnB,OAAKt2B,GAIL02B,EAAe12B,EAAE,GAAGrM,QACH,iBAANqM,EACAA,EAGS,IAAbA,EAAErM,OAAeqM,EAAE,GAAKA,GARpB,MAWfy2B,EAAY2B,MAAQ,SAAAF,GAChB,OAAIjsB,EAAMnE,OAAO2uB,EAAYlhC,KAAO2iC,EACzB,MAEXxB,EAAe,GACRwB,IAGXzB,EAAY4B,KAAO,SAAAH,GAIf,IAHA,IAAMI,EAAYJ,EAAIvkC,OAGb4B,EAAI,EAAGA,EAAI+iC,EAAW/iC,IAC3B,GAAI0W,EAAMnE,OAAO2uB,EAAYlhC,EAAIA,KAAO2iC,EAAIpwB,OAAOvS,GAC/C,OAAO,KAKf,OADAmhC,EAAe4B,GACRJ,GAGXzB,EAAY8B,QAAU,SAAApsB,GAClB,IAAM4rB,EAAM5rB,GAAOsqB,EAAYlhC,EACzBijC,EAAYvsB,EAAMnE,OAAOiwB,GAE/B,GAAkB,MAAdS,GAAoC,MAAdA,EAA1B,CAMA,IAHA,IAAM7kC,EAASsY,EAAMtY,OACf8kC,EAAkBV,EAEfxiC,EAAI,EAAGA,EAAIkjC,EAAkB9kC,EAAQ4B,IAAK,CAE/C,OADiB0W,EAAMnE,OAAOvS,EAAIkjC,IAE9B,IAAK,KACDljC,IACA,SACJ,IAAK,KACL,IAAK,KACD,MACJ,KAAKijC,EACD,IAAMvrB,EAAMhB,EAAMkB,OAAOsrB,EAAiBljC,EAAI,GAC9C,OAAK4W,GAAe,IAARA,EAIL,CAACqsB,EAAWvrB,IAHfypB,EAAenhC,EAAI,GACZ0X,IAMvB,OAAO,OAOXwpB,EAAYiC,YAAc,SAAAR,GACtB,IAWIS,EAXA3Y,EAAQ,GACR4Y,EAAY,KACZC,GAAY,EACZC,EAAa,EACXC,EAAa,GACbC,EAAc,GACdrlC,EAASsY,EAAMtY,OACfslC,EAAWxC,EAAYlhC,EACzB2jC,EAAUzC,EAAYlhC,EACtBA,EAAIkhC,EAAYlhC,EAChB4jC,GAAO,EAIPR,EADe,iBAART,EACI,SAAAkB,GAAQ,OAAAA,IAASlB,GAEjB,SAAAkB,GAAQ,OAAAlB,EAAIlnB,KAAKooB,IAGhC,EAAG,CAEC,IAAIzC,EAAW1qB,EAAMnE,OAAOvS,GAC5B,GAAmB,IAAfujC,GAAoBH,EAAShC,IAC7BiC,EAAY3sB,EAAMkB,OAAO+rB,EAAS3jC,EAAI2jC,IAElCF,EAAY3jC,KAAKujC,GAGjBI,EAAY3jC,KAAK,KAErBujC,EAAYI,EACZtC,EAAenhC,EAAI0jC,GACnBE,GAAO,MACJ,CACH,GAAIN,EAAW,CACM,MAAblC,GACwB,MAAxB1qB,EAAMnE,OAAOvS,EAAI,KACjBA,IACAujC,IACAD,GAAY,GAEhBtjC,IACA,SAEJ,OAAQohC,GACJ,IAAK,KACDphC,IACAohC,EAAW1qB,EAAMnE,OAAOvS,GACxByjC,EAAY3jC,KAAK4W,EAAMkB,OAAO+rB,EAAS3jC,EAAI2jC,EAAU,IACrDA,EAAU3jC,EAAI,EACd,MACJ,IAAK,IAC2B,MAAxB0W,EAAMnE,OAAOvS,EAAI,KACjBA,IACAsjC,GAAY,EACZC,KAEJ,MACJ,IAAK,IACL,IAAK,KACD9Y,EAAQyW,EAAY8B,QAAQhjC,KAExByjC,EAAY3jC,KAAK4W,EAAMkB,OAAO+rB,EAAS3jC,EAAI2jC,GAAUlZ,GAErDkZ,GADA3jC,GAAKyqB,EAAM,GAAGrsB,OAAS,GACT,IAGd+iC,EAAenhC,EAAI0jC,GACnBL,EAAYjC,EACZwC,GAAO,GAEX,MACJ,IAAK,IACDJ,EAAW1jC,KAAK,KAChByjC,IACA,MACJ,IAAK,IACDC,EAAW1jC,KAAK,KAChByjC,IACA,MACJ,IAAK,IACDC,EAAW1jC,KAAK,KAChByjC,IACA,MACJ,IAAK,IACL,IAAK,IACL,IAAK,IACD,IAAMO,EAAWN,EAAW1oB,MACxBsmB,IAAa0C,EACbP,KAGApC,EAAenhC,EAAI0jC,GACnBL,EAAYS,EACZF,GAAO,KAGnB5jC,EACQ5B,IACJwlC,GAAO,UAIVA,GAET,OAAOP,GAAwB,MAGnCnC,EAAYU,mBAAoB,EAChCV,EAAYa,aAAe,GAC3Bb,EAAYjE,UAAW,EAIvBiE,EAAY6C,KAAO,SAAApB,GACf,GAAmB,iBAARA,EAAkB,CAEzB,IAAK,IAAI3iC,EAAI,EAAGA,EAAI2iC,EAAIvkC,OAAQ4B,IAC5B,GAAI0W,EAAMnE,OAAO2uB,EAAYlhC,EAAIA,KAAO2iC,EAAIpwB,OAAOvS,GAC/C,OAAO,EAGf,OAAO,EAEP,OAAO2iC,EAAIlnB,KAAKslB,IAMxBG,EAAY8C,SAAW,SAAArB,GAAO,OAAAjsB,EAAMnE,OAAO2uB,EAAYlhC,KAAO2iC,GAE9DzB,EAAY+C,YAAc,WAAM,OAAAvtB,EAAMnE,OAAO2uB,EAAYlhC,IAEzDkhC,EAAYgD,SAAW,WAAM,OAAAxtB,EAAMnE,OAAO2uB,EAAYlhC,EAAI,IAE1DkhC,EAAYiD,SAAW,WAAM,OAAAztB,GAE7BwqB,EAAYkD,eAAiB,WACzB,IAAM11B,EAAIgI,EAAMirB,WAAWT,EAAYlhC,GAEvC,OAAQ0O,EApTO,IAoTWA,EAvTR,IAES,KAqTqBA,GAtT7B,KAsT6DA,GAGpFwyB,EAAYmD,MAAQ,SAAC3sB,EAAK4sB,EAAYC,GAClC7tB,EAAQgB,EACRwpB,EAAYlhC,EAAIsT,EAAI0tB,EAAaJ,EAAW,EAaxCE,EADAwD,WCvWa5tB,EAAO8tB,GAC5B,IAGIC,EACAC,EACAC,EACAC,EAGAC,EACAC,EACAC,EACAC,EACAlI,EAbE9jB,EAAMtC,EAAMtY,OACd6mC,EAAQ,EACRC,EAAa,EAKXpE,EAAS,GACXqE,EAAW,EAOf,SAASC,EAAUC,GACf,IAAMrsB,EAAM6rB,EAAsBM,EAC5BnsB,EAAM,MAASqsB,IAAWrsB,IAGhC8nB,EAAOhhC,KAAK4W,EAAMvF,MAAMg0B,EAAUN,EAAsB,IACxDM,EAAWN,EAAsB,GAGrC,IAAKA,EAAsB,EAAGA,EAAsB7rB,EAAK6rB,IAErD,MADAE,EAAKruB,EAAMirB,WAAWkD,KACV,IAAQE,GAAM,KAAUA,EAAK,IAKzC,OAAQA,GACJ,KAAK,GACDG,IACAR,EAAmBG,EACnB,SACJ,KAAK,GACD,KAAMK,EAAa,EACf,OAAOV,EAAK,sBAAuBK,GAEvC,SACJ,KAAK,GACIK,GAAcE,IACnB,SACJ,KAAK,IACDH,IACAR,EAAcI,EACd,SACJ,KAAK,IACD,KAAMI,EAAQ,EACV,OAAOT,EAAK,sBAAuBK,GAElCI,GAAUC,GAAcE,IAC7B,SACJ,KAAK,GACD,GAAIP,EAAsB7rB,EAAM,EAAG,CAAE6rB,IAAuB,SAC5D,OAAOL,EAAK,iBAAkBK,GAClC,KAAK,GACL,KAAK,GACL,KAAK,GAGD,IAFA/H,EAAU,EACVgI,EAAyBD,EACpBA,GAA4C,EAAGA,EAAsB7rB,EAAK6rB,IAE3E,MADAG,EAAMtuB,EAAMirB,WAAWkD,IACb,IAAV,CACA,GAAIG,GAAOD,EAAI,CAAEjI,EAAU,EAAG,MAC9B,GAAW,IAAPkI,EAAW,CACX,GAAIH,GAAuB7rB,EAAM,EAC7B,OAAOwrB,EAAK,iBAAkBK,GAElCA,KAGR,GAAI/H,EAAW,SACf,OAAO0H,EAAK,cAAe5c,OAAO0d,aAAaP,OAASD,GAC5D,KAAK,GACD,GAAII,GAAeL,GAAuB7rB,EAAM,EAAM,SAEtD,GAAW,KADXgsB,EAAMtuB,EAAMirB,WAAWkD,EAAsB,IAGzC,IAAKA,GAA4C,EAAGA,EAAsB7rB,OACtEgsB,EAAMtuB,EAAMirB,WAAWkD,KACX,KAAgB,IAAPG,GAAsB,IAAPA,GAFuCH,UAI5E,GAAW,IAAPG,EAAW,CAGlB,IADAL,EAAmBG,EAAyBD,EACvCA,GAA4C,EAAGA,EAAsB7rB,EAAM,IAEjE,MADXgsB,EAAMtuB,EAAMirB,WAAWkD,MACLD,EAA2BC,GAClC,IAAPG,GAC6C,IAA7CtuB,EAAMirB,WAAWkD,EAAsB,IAJoCA,KAMnF,GAAIA,GAAuB7rB,EAAM,EAC7B,OAAOwrB,EAAK,uBAAwBM,GAExCD,IAEJ,SACJ,KAAK,GACD,GAAKA,EAAsB7rB,EAAM,GAAoD,IAA7CtC,EAAMirB,WAAWkD,EAAsB,GAC3E,OAAOL,EAAK,iBAAkBK,GAElC,SAIZ,OAAc,IAAVI,EAEWT,EADNG,EAAmBF,GAAiBG,EAA2BD,EACpD,8BAEA,sBAF+BF,GAIzB,IAAfS,EACAV,EAAK,sBAAuBE,IAGvCU,GAAU,GACHtE,GDiPUyE,CAAQ7tB,EAAK6sB,GAEb,CAAC7sB,GAGdqpB,EAAUD,EAAO,GAEjBK,EAAe,IAGnBD,EAAYsE,IAAM,WACd,IAAIhvB,EACE8gB,EAAa4J,EAAYlhC,GAAK0W,EAAMtY,OAM1C,OAJI8iC,EAAYlhC,EAAI4gC,IAChBpqB,EAAUqqB,EACVK,EAAYlhC,EAAI4gC,GAEb,CACHtJ,aACAsJ,SAAUM,EAAYlhC,EACtB6gC,6BAA8BrqB,EAC9BivB,mBAAoBvE,EAAYlhC,GAAK0W,EAAMtY,OAAS,EACpDsnC,aAAchvB,EAAMwqB,EAAYlhC,KAIjCkhC,GE5VLyE,GAAS,SAASA,EAAO14B,EAAS0L,EAASrM,GAC7C,IAAIs5B,EACE1E,EAAc2E,KAEpB,SAASzmC,EAAMC,EAAKa,GAChB,MAAM,IAAImW,EACN,CACI/I,MAAO4zB,EAAYlhC,EACnBa,SAAUyL,EAASzL,SACnBX,KAAMA,GAAQ,SACdsW,QAASnX,GAEbsZ,GAIR,SAASmtB,EAAOpW,EAAKrwB,GAEjB,IAAM6W,EAAUwZ,aAAevY,SAAYuY,EAAI5c,KAAK8yB,GAAW1E,EAAYwB,IAAIhT,GAC/E,GAAIxZ,EACA,OAAOA,EAGX9W,EAAMC,IAAuB,iBAARqwB,EACf,aAAaA,YAAawR,EAAY+C,kBACtC,qBAIV,SAAS8B,EAAWrW,EAAKrwB,GACrB,GAAI6hC,EAAY2B,MAAMnT,GAClB,OAAOA,EAEXtwB,EAAMC,GAAO,aAAaqwB,YAAawR,EAAY+C,mBAGvD,SAASroB,EAAatO,GAClB,IAAMzM,EAAWyL,EAASzL,SAE1B,MAAO,CACHya,WAAYzE,EAAkBvJ,EAAO4zB,EAAYiD,YAAYvvB,KAAO,EACpE2G,SAAU1a,GAyDlB,MAAO,CACHqgC,cACAvoB,UACArM,WACAmM,UAjDJ,SAAmBf,EAAKsuB,EAAWC,EAAc35B,EAAUua,GACvD,IAAI3Q,EACEgwB,EAAc,GACdC,EAASjF,EAEf,IACIiF,EAAO9B,MAAM3sB,GAAK,GAAO,SAAcrY,EAAKiO,GACxCuZ,EAAS,CACLrQ,QAASnX,EACTiO,MAAOA,EAAQ24B,OAGvB,IAAK,IAAIn1B,EAAI,EAAGue,SAAGrvB,SAAIqvB,EAAI2W,EAAUl1B,GAAKA,IAGtC,GAFA9Q,EAAImmC,EAAOnmC,EACXkW,EAAS0vB,EAAQvW,KACL,CACR,IACInZ,EAAOnJ,OAAS/M,EAAIimC,EACpB/vB,EAAOlJ,UAAYV,EACrB,MAAOvN,IACTmnC,EAAYpmC,KAAKoW,QAGjBgwB,EAAYpmC,KAAK,MAITqmC,EAAOX,MACXlO,WACRzQ,EAAS,KAAMqf,GAGfrf,GAAS,EAAM,MAErB,MAAO9nB,GACL,MAAM,IAAIsX,EAAU,CAChB/I,MAAOvO,EAAEuO,MAAQ24B,EACjBzvB,QAASzX,EAAEyX,SACZmC,EAASrM,EAASzL,YAkBzB5D,MAAO,SAAUya,EAAKmP,EAAUuf,GAC5B,IAAIvmB,EAEAwmB,EACAC,EACAC,EAHAnnC,EAAQ,KAIRonC,EAAU,GAKd,GAHAH,EAAcD,GAAkBA,EAAeC,WAAiBV,EAAOc,cAAcL,EAAeC,iBAAkB,GACtHC,EAAcF,GAAkBA,EAAeE,WAAc,KAAKX,EAAOc,cAAcL,EAAeE,YAAgB,GAElHr5B,EAAQ/L,cAER,IADA,IAAMwlC,EAAgBz5B,EAAQ/L,cAAcylC,mBACnC3mC,EAAI,EAAGA,EAAI0mC,EAActoC,OAAQ4B,IACtC0X,EAAMgvB,EAAc1mC,GAAG4mC,QAAQlvB,EAAK,CAAEzK,UAAS0L,UAASrM,cAI5D+5B,GAAeD,GAAkBA,EAAeS,UAChDL,GAAYJ,GAAkBA,EAAeS,OAAUT,EAAeS,OAAS,IAAMR,GACrFE,EAAU5tB,EAAQmuB,sBACVx6B,EAASzL,UAAY0lC,EAAQj6B,EAASzL,WAAa,EAC3D0lC,EAAQj6B,EAASzL,WAAa2lC,EAAQpoC,QAK1CsZ,EAAM8uB,GAFN9uB,EAAMA,EAAIjb,QAAQ,SAAU,OAERA,QAAQ,UAAW,IAAM6pC,EAC7C3tB,EAAQhC,SAASrK,EAASzL,UAAY6W,EAMtC,IACIwpB,EAAYmD,MAAM3sB,EAAKzK,EAAQq3B,YAAY,SAAcjlC,EAAKiO,GAC1D,MAAM,IAAI+I,EAAU,CAChB/I,QACApN,KAAM,QACNsW,QAASnX,EACTwB,SAAUyL,EAASzL,UACpB8X,MAGP6a,GAAKhnB,KAAK6C,UAAUpS,MAAQqC,KAC5BugB,EAAO,IAAI2T,GAAK9U,QAAQ,KAAMpf,KAAKsmC,QAAQmB,WAC3CvT,GAAKhnB,KAAK6C,UAAUrD,SAAW6T,EAC/BA,EAAKA,MAAO,EACZA,EAAKC,WAAY,EACjBD,EAAKG,iBAAmBA,EAAiB3B,UAE3C,MAAOtf,GACL,OAAO8nB,EAAS,IAAIxQ,EAAUtX,EAAG4Z,EAASrM,EAASzL,WAWvD,IAAMmmC,EAAU9F,EAAYsE,MAC5B,IAAKwB,EAAQ1P,WAAY,CAErB,IAAI9gB,EAAUwwB,EAAQnG,6BAEjBrqB,IACDA,EAAU,qBACmB,MAAzBwwB,EAAQtB,aACRlvB,GAAW,iCACqB,MAAzBwwB,EAAQtB,aACflvB,GAAW,iCACJwwB,EAAQvB,qBACfjvB,GAAW,iCAInBpX,EAAQ,IAAIiX,EAAU,CAClBnW,KAAM,QACNsW,UACAlJ,MAAO05B,EAAQpG,SACf//B,SAAUyL,EAASzL,UACpB8X,GAGP,IAAMke,EAAS,SAAA93B,GAGX,OAFAA,EAAIK,GAASL,GAAK4Z,EAAQvZ,QAGhBL,aAAasX,IACftX,EAAI,IAAIsX,EAAUtX,EAAG4Z,EAASrM,EAASzL,WAGpCgmB,EAAS9nB,IAGT8nB,EAAS,KAAMhH,IAI9B,IAA+B,IAA3B5S,EAAQg6B,eAIR,OAAOpQ,IAHP,IAAI5M,GAAS0M,cAAche,EAASke,GAC/BQ,IAAIxX,IAmCjB+lB,QAASA,EAAU,CAgBfmB,QAAS,WAKL,IAJA,IAEIp6B,EAFE0jB,EAAQ/wB,KAAK+wB,MACfxQ,EAAO,KAGE,CACT,KACIlT,EAAOrN,KAAKqgC,WAEZ9f,EAAK/f,KAAK6M,GAGd,GAAIu0B,EAAYjE,SACZ,MAEJ,GAAIiE,EAAY6C,KAAK,KACjB,MAIJ,GADAp3B,EAAOrN,KAAK4nC,aAERrnB,EAAOA,EAAKrf,OAAOmM,QAMvB,GAFAA,EAAO0jB,EAAM8W,cAAgB7nC,KAAK8nC,eAAiB/W,EAAMvd,MAAK,GAAO,IACjExT,KAAKqgB,WAAargB,KAAK+nC,gBAAkB/nC,KAAKgoC,SAASx0B,QAAUxT,KAAKioC,SAEtE1nB,EAAK/f,KAAK6M,OACP,CAEH,IADA,IAAI66B,GAAiB,EACdtG,EAAY2B,MAAM,MACrB2E,GAAiB,EAErB,IAAKA,EACD,OAKZ,OAAO3nB,GAKX8f,QAAS,WACL,GAAIuB,EAAYa,aAAa3jC,OAAQ,CACjC,IAAMuhC,EAAUuB,EAAYa,aAAa7oB,QACzC,OAAO,IAAIsa,GAAY,QAAEmM,EAAQmC,KAAMnC,EAAQhkB,cAAegkB,EAAQryB,MAAOhB,KAOrFg7B,SAAU,CACNG,YAAa,WACT,OAAO7B,EAAQvV,MAAMvd,MAAK,GAAM,IAOpC40B,OAAQ,SAAUC,GACd,IAAIjwB,EACEpK,EAAQ4zB,EAAYlhC,EACtB4nC,GAAY,EAGhB,GADA1G,EAAYe,OACRf,EAAY2B,MAAM,KAClB+E,GAAY,OACT,GAAID,EAEP,YADAzG,EAAYgB,UAKhB,GADAxqB,EAAMwpB,EAAY8B,UAOlB,OAFA9B,EAAYmB,SAEL,IAAI7O,GAAW,OAAE9b,EAAInF,OAAO,GAAImF,EAAIE,OAAO,EAAGF,EAAItZ,OAAS,GAAIwpC,EAAWt6B,EAAOhB,GALpF40B,EAAYgB,WAapBlxB,QAAS,WACL,IAAMqC,EAAI6tB,EAAY2B,MAAM,MAAQ3B,EAAYwB,IAAI,2DACpD,GAAIrvB,EACA,OAAOmgB,GAAKnlB,MAAM0C,YAAYsC,IAAM,IAAImgB,GAAY,QAAEngB,IAW9DP,KAAM,WACF,IAAIoH,EACAlK,EACAkH,EACE5J,EAAQ4zB,EAAYlhC,EAG1B,IAAIkhC,EAAY6C,KAAK,WAOrB,GAHA7C,EAAYe,OAEZ/nB,EAAOgnB,EAAYwB,IAAI,kCACvB,CAOA,GAFAxoB,EAAOA,EAAK,IACZhD,EAAO5X,KAAKuoC,eAAe3tB,MAEvBlK,EAAOkH,EAAKja,UACAia,EAAK4wB,KAEb,OADA5G,EAAYmB,SACLryB,EAMf,GAFAA,EAAO1Q,KAAK8T,UAAUpD,GAEjBkxB,EAAY2B,MAAM,KAOvB,OAFA3B,EAAYmB,SAEL,IAAI7O,GAAS,KAAEtZ,EAAMlK,EAAM1C,EAAOhB,GANrC40B,EAAYgB,QAAQ,sDAjBpBhB,EAAYmB,UAmCpBwF,eAAgB,SAAU3tB,GAItB,MAAO,CACHtL,MAAS4hB,EAAEoV,EAAQmC,SAAS,GAC5BC,QAASxX,EAAExY,GACXiwB,GAASzX,EAAExY,IACbkC,EAAKhJ,eAEP,SAASsf,EAAEvzB,EAAO6qC,GACd,MAAO,CACH7qC,QACA6qC,QAKR,SAAS9vB,IACL,MAAO,CAAC8tB,EAAOF,EAAQ5tB,UAAW,yBAI1C5E,UAAW,SAAU80B,GACjB,IAEIC,EACAz6B,EAHA06B,EAAYF,GAAY,GACtBG,EAAgB,GAMtB,IAFAnH,EAAYe,SAEC,CACT,GAAIiG,EACAA,GAAW,MACR,CAEH,KADAx6B,EAAQk4B,EAAQlX,mBAAqBpvB,KAAKgpC,cAAgB1C,EAAQ5Y,cAE9D,MAGAtf,EAAMA,OAA+B,GAAtBA,EAAMA,MAAMtP,SAC3BsP,EAAQA,EAAMA,MAAM,IAGxB06B,EAAUtoC,KAAK4N,GAGfwzB,EAAY2B,MAAM,OAIlB3B,EAAY2B,MAAM,MAAQsF,KAC1BA,GAAuB,EACvBz6B,EAAS06B,EAAUhqC,OAAS,EAAKgqC,EAAU,GACrC,IAAI5U,GAAKla,MAAM8uB,GACrBC,EAAcvoC,KAAK4N,GACnB06B,EAAY,IAKpB,OADAlH,EAAYmB,SACL8F,EAAuBE,EAAgBD,GAElDG,QAAS,WACL,OAAOjpC,KAAKkpC,aACLlpC,KAAKuQ,SACLvQ,KAAKooC,UACLpoC,KAAKmpC,qBAShBH,WAAY,WACR,IAAIr3B,EACAvD,EAGJ,GAFAwzB,EAAYe,OACZhxB,EAAMiwB,EAAYwB,IAAI,iBAKtB,GAAKxB,EAAY2B,MAAM,KAAvB,CAKA,GADAn1B,EAAQk4B,EAAQ8C,SAGZ,OADAxH,EAAYmB,SACL,IAAI7O,GAAe,WAAEviB,EAAKvD,GAEjCwzB,EAAYgB,eARZhB,EAAYgB,eAJZhB,EAAYgB,WAuBpBpQ,IAAK,WACD,IAAIpkB,EACEJ,EAAQ4zB,EAAYlhC,EAI1B,GAFAkhC,EAAYU,mBAAoB,EAE3BV,EAAY4B,KAAK,QAYtB,OAPAp1B,EAAQpO,KAAKooC,UAAYpoC,KAAKgb,YAAchb,KAAKqiB,YACzCuf,EAAYwB,IAAI,mCAAqC,GAE7DxB,EAAYU,mBAAoB,EAEhCmE,EAAW,KAEJ,IAAIvS,GAAQ,IAAkB,MAAf9lB,EAAMA,OACxBA,aAAiB8lB,GAAK9J,UACtBhc,aAAiB8lB,GAAK1J,SACtBpc,EAAQ,IAAI8lB,GAAc,UAAE9lB,EAAOJ,GAAQA,EAAOhB,GAdlD40B,EAAYU,mBAAoB,GAyBxCtnB,SAAU,WACN,IAAIquB,EACAzuB,EACE5M,EAAQ4zB,EAAYlhC,EAG1B,GADAkhC,EAAYe,OACsB,MAA9Bf,EAAY+C,gBAA0B/pB,EAAOgnB,EAAYwB,IAAI,eAAgB,CAE7E,GAAW,OADXiG,EAAKzH,EAAY+C,gBACQ,MAAP0E,IAAezH,EAAYgD,WAAW11B,MAAM,OAAQ,CAElE,IAAM0H,EAAS0vB,EAAQyB,aAAantB,GACpC,GAAIhE,EAEA,OADAgrB,EAAYmB,SACLnsB,EAIf,OADAgrB,EAAYmB,SACL,IAAI7O,GAAa,SAAEtZ,EAAM5M,EAAOhB,GAE3C40B,EAAYgB,WAIhB0G,cAAe,WACX,IAAIC,EACEv7B,EAAQ4zB,EAAYlhC,EAE1B,GAAkC,MAA9BkhC,EAAY+C,gBAA0B4E,EAAQ3H,EAAYwB,IAAI,mBAC9D,OAAO,IAAIlP,GAAa,SAAE,IAAIqV,EAAM,GAAMv7B,EAAOhB,IAQzDqV,SAAU,WACN,IAAIzH,EACE5M,EAAQ4zB,EAAYlhC,EAE1B,GAAkC,MAA9BkhC,EAAY+C,gBAA0B/pB,EAAOgnB,EAAYwB,IAAI,cAC7D,OAAO,IAAIlP,GAAa,SAAEtZ,EAAM5M,EAAOhB,IAK/Cw8B,cAAe,WACX,IAAID,EACEv7B,EAAQ4zB,EAAYlhC,EAE1B,GAAkC,MAA9BkhC,EAAY+C,gBAA0B4E,EAAQ3H,EAAYwB,IAAI,oBAC9D,OAAO,IAAIlP,GAAa,SAAE,IAAIqV,EAAM,GAAMv7B,EAAOhB,IAUzDuD,MAAO,WACH,IAAIvB,EAGJ,GAFA4yB,EAAYe,OAEsB,MAA9Bf,EAAY+C,gBAA0B31B,EAAM4yB,EAAYwB,IAAI,oEACvDp0B,EAAI,GAEL,OADA4yB,EAAYmB,SACL,IAAI7O,GAAU,MAAEllB,EAAI,QAAIxC,EAAWwC,EAAI,IAGtD4yB,EAAYgB,WAGhB6G,aAAc,WACV7H,EAAYe,OACZ,IAAML,EAAoBV,EAAYU,kBACtCV,EAAYU,mBAAoB,EAChC,IAAMvuB,EAAI6tB,EAAYwB,IAAI,6BAE1B,GADAxB,EAAYU,kBAAoBA,EAC3BvuB,EAAL,CAIA6tB,EAAYgB,UACZ,IAAMryB,EAAQ2jB,GAAKnlB,MAAM0C,YAAYsC,GACrC,OAAIxD,GACAqxB,EAAY4B,KAAKzvB,GACVxD,QAFX,EALIqxB,EAAYmB,UAgBpBmG,UAAW,WACP,IAAItH,EAAYkD,iBAAhB,CAIA,IAAM12B,EAAQwzB,EAAYwB,IAAI,kCAC9B,OAAIh1B,EACO,IAAI8lB,GAAc,UAAE9lB,EAAM,GAAIA,EAAM,SAD/C,IAUJ+6B,kBAAmB,WACf,IAAIO,EAGJ,GADAA,EAAK9H,EAAYwB,IAAI,uCAEjB,OAAO,IAAIlP,GAAsB,kBAAEwV,EAAG,KAS9CC,WAAY,WACR,IAAIC,EACE57B,EAAQ4zB,EAAYlhC,EAE1BkhC,EAAYe,OAEZ,IAAMkH,EAASjI,EAAY2B,MAAM,KAGjC,GAFgB3B,EAAY2B,MAAM,KAElC,CAMA,GADAqG,EAAKhI,EAAYwB,IAAI,WAGjB,OADAxB,EAAYmB,SACL,IAAI7O,GAAe,WAAE0V,EAAGtxB,OAAO,EAAGsxB,EAAG9qC,OAAS,GAAI2b,QAAQovB,GAAS77B,EAAOhB,GAErF40B,EAAYgB,QAAQ,sCAThBhB,EAAYgB,YAkBxB5nB,SAAU,WACN,IAAIJ,EAEJ,GAAkC,MAA9BgnB,EAAY+C,gBAA0B/pB,EAAOgnB,EAAYwB,IAAI,mBAAsB,OAAOxoB,EAAK,IAWvGmtB,aAAc,SAAU+B,GACpB,IAAIva,EACE7uB,EAAIkhC,EAAYlhC,EAChBqpC,IAAYD,EACdlvB,EAAOkvB,EAIX,GAFAlI,EAAYe,OAER/nB,GAAuC,MAA9BgnB,EAAY+C,gBACjB/pB,EAAOgnB,EAAYwB,IAAI,yBAA2B,CAItD,KAFA7T,EAAUvvB,KAAK+wB,MAAMiZ,iBAEHD,GAAsC,OAA3BnI,EAAY4B,KAAK,OAAgC,OAAZ5oB,EAAK,IAEnE,YADAgnB,EAAYgB,QAAQ,2CAInBmH,IACDnvB,EAAOA,EAAK,IAGhB,IAAMpH,EAAO,IAAI0gB,GAAK/E,aAAavU,EAAMla,EAAGsM,GAC5C,OAAK+8B,GAAWzD,EAAQJ,OACpBtE,EAAYmB,SACLvvB,IAGPouB,EAAYmB,SACL,IAAI7O,GAAK7E,eAAe7b,EAAM+b,EAAS7uB,EAAGsM,IAIzD40B,EAAYgB,WAMhB9oB,OAAQ,SAASmwB,GACb,IAAIzxB,EACA/Y,EAEAgvB,EACAhW,EACAqB,EAHE9L,EAAQ4zB,EAAYlhC,EAK1B,GAAKkhC,EAAY4B,KAAKyG,EAAS,YAAc,YAA7C,CAIA,EAAG,CAGC,IAFAxb,EAAS,KACTjW,EAAW,OACFiW,EAASmT,EAAYwB,IAAI,0BAC9B3jC,EAAIO,KAAKokB,YAIL5L,EACAA,EAAShY,KAAKf,GAEd+Y,EAAW,CAAE/Y,GAIrBgvB,EAASA,GAAUA,EAAO,GACrBjW,GACD1Y,EAAM,0CAEVga,EAAS,IAAIoa,GAAW,OAAE,IAAIA,GAAa,SAAE1b,GAAWiW,EAAQzgB,EAAOhB,GACnEyL,EACAA,EAAWjY,KAAKsZ,GAEhBrB,EAAa,CAAEqB,SAEd8nB,EAAY2B,MAAM,MAQ3B,OANAiD,EAAO,OAEHyD,GACAzD,EAAO,MAGJ/tB,IAMXmvB,WAAY,WACR,OAAO5nC,KAAK8Z,QAAO,IAMvBiX,MAAO,CAiBHvd,KAAM,SAAUu2B,EAASG,GACrB,IAEI3a,EAEA/W,EACA9H,EACAy5B,EANEx+B,EAAIi2B,EAAY+C,cAClB9pB,GAAY,EAEV7M,EAAQ4zB,EAAYlhC,EAK1B,GAAU,MAANiL,GAAmB,MAANA,EAAjB,CAMA,GAJAi2B,EAAYe,OAEZnqB,EAAWxY,KAAKwY,WAEF,CAUV,GATIopB,EAAY2B,MAAM,OAClB7yB,EAAO1Q,KAAK0Q,MAAK,GAAMA,KACvB+1B,EAAW,KACX0D,GAAY,IAGE,IAAdD,IACA3a,EAAUvvB,KAAKgqC,gBAED,IAAdE,IAAuB3a,EAEvB,YADAqS,EAAYgB,UAIhB,IAAKrT,IAAY4a,EAGb,YADAvI,EAAYgB,QAAQ,2DAQxB,IAJKmH,GAAWzD,EAAQzrB,cACpBA,GAAY,GAGZkvB,GAAWzD,EAAQJ,MAAO,CAC1BtE,EAAYmB,SACZ,IAAMhS,EAAQ,IAAImD,GAAKnD,MAAU,KAAEvY,EAAU9H,EAAM1C,EAAOhB,GAAWuiB,GAAW1U,GAChF,OAAI0U,EACO,IAAI2E,GAAK7E,eAAe0B,EAAOxB,GAG/BwB,GAKnB6Q,EAAYgB,YAMhBpqB,SAAU,WAON,IANA,IAAIA,EACA/Y,EACA2P,EACAg7B,EACAC,EACEC,EAAK,wDAEPD,EAAYzI,EAAYlhC,EACxBjB,EAAImiC,EAAYwB,IAAIkH,IAKpBF,EAAO,IAAIlW,GAAY,QAAE9kB,EAAG3P,GAAG,EAAO4qC,EAAWr9B,GAC7CwL,EACAA,EAAShY,KAAK4pC,GAEd5xB,EAAW,CAAE4xB,GAEjBh7B,EAAIwyB,EAAY2B,MAAM,KAE1B,OAAO/qB,GAEX9H,KAAM,SAAU65B,GACZ,IAKI1B,EACA2B,EACA5vB,EACA6vB,EACAr8B,EACAgiB,EACAwB,EAXEoW,EAAW1B,EAAQ0B,SACnB7U,EAAW,CAAEziB,KAAK,KAAMif,UAAU,GACpC+a,EAAc,GACZ3B,EAAgB,GAChBD,EAAY,GAQd6B,GAAS,EAIb,IAFA/I,EAAYe,SAEC,CACT,GAAI4H,EACAna,EAAMkW,EAAQlX,mBAAqBkX,EAAQ5Y,iBACxC,CAEH,GADAkU,EAAYa,aAAa3jC,OAAS,EAC9B8iC,EAAY4B,KAAK,OAAQ,CACzBrQ,EAASxD,UAAW,EAChBiS,EAAY2B,MAAM,OAASsF,IAC3BA,GAAuB,IAE1BA,EAAuBE,EAAgBD,GACnCtoC,KAAK,CAAEmvB,UAAU,IACtB,MAEJS,EAAM4X,EAAShtB,YAAcgtB,EAAS3lB,YAAc2lB,EAASiB,WAAajB,EAASt2B,WAAa1R,KAAKwT,MAAK,GAG9G,IAAK4c,IAAQua,EACT,MAGJF,EAAW,KACPra,EAAI7G,mBACJ6G,EAAI7G,oBAERnb,EAAQgiB,EACR,IAAIvE,EAAM,KAWV,GATI0e,EAEIna,EAAIhiB,OAA6B,GAApBgiB,EAAIhiB,MAAMtP,SACvB+sB,EAAMuE,EAAIhiB,MAAM,IAGpByd,EAAMuE,EAGNvE,IAAQA,aAAeqI,GAAK9J,UAAYyB,aAAeqI,GAAK1J,UAC5D,GAAIoX,EAAY2B,MAAM,KAAM,CAUxB,GATImH,EAAY5rC,OAAS,IACjB+pC,GACA/oC,EAAM,yCAEV0qC,GAA0B,KAG9Bp8B,EAAQk4B,EAAQlX,mBAAqBkX,EAAQ5Y,cAEjC,CACR,IAAI6c,EAKA,OAFA3I,EAAYgB,UACZzP,EAASziB,KAAO,GACTyiB,EAJPrzB,EAAM,iDAOd2qC,EAAY7vB,EAAOiR,EAAIjR,UACpB,GAAIgnB,EAAY4B,KAAK,OAAQ,CAChC,IAAK+G,EAAQ,CACTpX,EAASxD,UAAW,EAChBiS,EAAY2B,MAAM,OAASsF,IAC3BA,GAAuB,IAE1BA,EAAuBE,EAAgBD,GACnCtoC,KAAK,CAAEoa,KAAMwV,EAAIxV,KAAM+U,UAAU,IACtC,MAEAiC,GAAS,OAEL2Y,IACR3vB,EAAO6vB,EAAW5e,EAAIjR,KACtBxM,EAAQ,MAIZA,GACAs8B,EAAYlqC,KAAK4N,GAGrB06B,EAAUtoC,KAAK,CAAEoa,KAAK6vB,EAAUr8B,QAAOwjB,WAEnCgQ,EAAY2B,MAAM,KAClBoH,GAAS,IAGbA,EAAoC,MAA3B/I,EAAY2B,MAAM,OAEbsF,KAEN2B,GACA1qC,EAAM,yCAGV+oC,GAAuB,EAEnB6B,EAAY5rC,OAAS,IACrBsP,EAAQ,IAAI8lB,GAAU,MAAEwW,IAE5B3B,EAAcvoC,KAAK,CAAEoa,OAAMxM,QAAOwjB,WAElChX,EAAO,KACP8vB,EAAc,GACdF,GAA0B,GAMlC,OAFA5I,EAAYmB,SACZ5P,EAASziB,KAAOm4B,EAAuBE,EAAgBD,EAChD3V,GAqBX0U,WAAY,WACR,IAAIjtB,EAEA1L,EACAmR,EACAuqB,EAHAlb,EAAS,GAITC,GAAW,EACf,KAAmC,MAA9BiS,EAAY+C,eAAuD,MAA9B/C,EAAY+C,eAClD/C,EAAY6C,KAAK,aAOrB,GAHA7C,EAAYe,OAEZzzB,EAAQ0yB,EAAYwB,IAAI,gEACb,CACPxoB,EAAO1L,EAAM,GAEb,IAAM27B,EAAU7qC,KAAK0Q,MAAK,GAS1B,GARAgf,EAASmb,EAAQn6B,KACjBif,EAAWkb,EAAQlb,UAOdiS,EAAY2B,MAAM,KAEnB,YADA3B,EAAYgB,QAAQ,uBAYxB,GARAhB,EAAYa,aAAa3jC,OAAS,EAE9B8iC,EAAY4B,KAAK,UACjBoH,EAAOpE,EAAOF,EAAQwE,WAAY,uBAGtCzqB,EAAUimB,EAAQyE,QAId,OADAnJ,EAAYmB,SACL,IAAI7O,GAAKnD,MAAgB,WAAEnW,EAAM8U,EAAQrP,EAASuqB,EAAMjb,GAE/DiS,EAAYgB,eAGhBhB,EAAYgB,WAIpBoH,YAAa,WACT,IAAI9pB,EAEEqP,EAAU,GAEhB,GAAkC,MAA9BqS,EAAY+C,cAAhB,CAIA,OAAa,CAIT,GAHA/C,EAAYe,SAEZziB,EAAOlgB,KAAKgrC,gBACU,KAAT9qB,EAAa,CACtB0hB,EAAYgB,UACZ,MAEJrT,EAAQ/uB,KAAK0f,GACb0hB,EAAYmB,SAEhB,OAAIxT,EAAQzwB,OAAS,EACVywB,OADX,IAKJyb,YAAa,WAGT,GAFApJ,EAAYe,OAEPf,EAAY2B,MAAM,KAAvB,CAKA,IAAM3oB,EAAOgnB,EAAYwB,IAAI,gCAE7B,GAAKxB,EAAY2B,MAAM,KAKvB,OAAI3oB,GAAiB,KAATA,GACRgnB,EAAYmB,SACLnoB,QAGXgnB,EAAYgB,UATRhB,EAAYgB,eAPZhB,EAAYgB,YAuBxBwG,OAAQ,WACJ,IAAMpB,EAAWhoC,KAAKgoC,SAEtB,OAAOhoC,KAAKqgC,WAAa2H,EAASiB,WAAajB,EAAShtB,YAAcgtB,EAASxV,OAC3EwV,EAAS3lB,YAAc2lB,EAASx0B,QAAUw0B,EAASt2B,WAAa1R,KAAK+wB,MAAMvd,MAAK,IAChFw0B,EAAS2B,cAQjBzD,IAAK,WACD,OAAOtE,EAAY2B,MAAM,MAAQ3B,EAAY6C,KAAK,MAQtDgE,QAAS,WACL,IAAIr6B,EAGJ,GAAKwzB,EAAYwB,IAAI,cAOrB,OANAh1B,EAAQwzB,EAAYwB,IAAI,WAGpBh1B,EAAQ,MADRA,EAAQo4B,EAAOF,EAAQ0B,SAAShtB,SAAU,0BACvBJ,KAAK/I,MAAM,QAElC40B,EAAW,KACJ,IAAIvS,GAAKlJ,OAAO,GAAI,iBAAiB5c,QAehDgW,QAAS,WACL,IAAI3kB,EACA2P,EACAK,EACEzB,EAAQ4zB,EAAYlhC,EAwB1B,GAtBA0O,EAAIpP,KAAKwS,cAET/S,EAAImiC,EAAYwB,IAAI,uBAChBxB,EAAYwB,IAAI,+EAChBxB,EAAY2B,MAAM,MAAQ3B,EAAY2B,MAAM,MAAQvjC,KAAKirC,aACzDrJ,EAAYwB,IAAI,kBAAqBxB,EAAYwB,IAAI,iBACrDpjC,KAAKgoC,SAASsB,mBAGd1H,EAAYe,OACRf,EAAY2B,MAAM,MACb9zB,EAAIzP,KAAK6f,UAAS,KAAW+hB,EAAY2B,MAAM,MAChD9jC,EAAI,IAAIy0B,GAAU,MAAEzkB,GACpBmyB,EAAYmB,UAEZnB,EAAYgB,QAAQ,uBAGxBhB,EAAYmB,UAIhBtjC,EAAK,OAAO,IAAIy0B,GAAY,QAAE9kB,EAAG3P,EAAGA,aAAay0B,GAAK9J,SAAUpc,EAAOhB,IAY/EwF,WAAY,WACR,IAAIpD,EAAIwyB,EAAY+C,cAEpB,GAAU,MAANv1B,EAAW,CACXwyB,EAAYe,OACZ,IAAMuI,EAAoBtJ,EAAYwB,IAAI,gBAC1C,GAAI8H,EAEA,OADAtJ,EAAYmB,SACL,IAAI7O,GAAe,WAAEgX,GAEhCtJ,EAAYgB,UAGhB,GAAU,MAANxzB,GAAmB,MAANA,GAAmB,MAANA,GAAmB,MAANA,GAAmB,MAANA,EAAW,CAM/D,IALAwyB,EAAYlhC,IACF,MAAN0O,GAA2C,MAA9BwyB,EAAY+C,gBACzBv1B,EAAI,KACJwyB,EAAYlhC,KAETkhC,EAAYoB,gBAAkBpB,EAAYlhC,IACjD,OAAO,IAAIwzB,GAAe,WAAE9kB,GACzB,OAAIwyB,EAAYoB,cAAc,GAC1B,IAAI9O,GAAe,WAAE,KAErB,IAAIA,GAAe,WAAE,OAYpCrU,SAAU,SAAUsrB,GAChB,IACI3yB,EACAC,EACArJ,EACA3P,EACAi7B,EACA0Q,EACA1yB,EAPE1K,EAAQ4zB,EAAYlhC,EAS1B,IADAyqC,GAAoB,IAAXA,GACDA,IAAW1yB,EAAazY,KAAK8Z,WAAeqxB,IAAWC,EAAOxJ,EAAY4B,KAAK,WAAc/jC,EAAIO,KAAKokB,cACtGgnB,EACA1yB,EAAY8tB,EAAOxmC,KAAK8qC,WAAY,sBAC7BpyB,EACP5Y,EAAM,qDACC2Y,EAEHiiB,EADAA,EACaA,EAAWx5B,OAAOuX,GAElBA,GAGbiiB,GAAc56B,EAAM,kDACxBsP,EAAIwyB,EAAY+C,cACZnsB,EACAA,EAAShY,KAAKf,GAEd+Y,EAAW,CAAE/Y,GAEjBA,EAAI,MAEE,MAAN2P,GAAmB,MAANA,GAAmB,MAANA,GAAmB,MAANA,GAAmB,MAANA,KAK5D,GAAIoJ,EAAY,OAAO,IAAI0b,GAAa,SAAE1b,EAAUkiB,EAAYhiB,EAAW1K,EAAOhB,GAC9E0tB,GAAc56B,EAAM,2EAE5Buf,UAAW,WAGP,IAFA,IAAI1T,EACA0T,GAEA1T,EAAI3L,KAAK6f,cAILR,EACAA,EAAU7e,KAAKmL,GAEf0T,EAAY,CAAE1T,GAElBi2B,EAAYa,aAAa3jC,OAAS,EAC9B6M,EAAE+M,WAAa2G,EAAUvgB,OAAS,GAClCgB,EAAM,2DAEL8hC,EAAY2B,MAAM,OACnB53B,EAAE+M,WACF5Y,EAAM,2DAEV8hC,EAAYa,aAAa3jC,OAAS,EAEtC,OAAOugB,GAEX4rB,UAAW,WACP,GAAKrJ,EAAY2B,MAAM,KAAvB,CAEA,IACI5xB,EACAka,EACAtd,EAHEy5B,EAAWhoC,KAAKgoC,SAgBtB,OAXMr2B,EAAMq2B,EAASsB,mBACjB33B,EAAM60B,EAAO,oDAGjBj4B,EAAKqzB,EAAYwB,IAAI,iBAEjBvX,EAAMmc,EAASI,UAAYxG,EAAYwB,IAAI,aAAexB,EAAYwB,IAAI,YAAc4E,EAASsB,iBAGrG7C,EAAW,KAEJ,IAAIvS,GAAc,UAAEviB,EAAKpD,EAAIsd,KAOxCkf,MAAO,WACH,IAAI9f,EACJ,GAAI2W,EAAY2B,MAAM,OAAStY,EAAUjrB,KAAKynC,YAAc7F,EAAY2B,MAAM,KAC1E,OAAOtY,GAIfogB,aAAc,WACV,IAAIN,EAAQ/qC,KAAK+qC,QAKjB,OAHIA,IACAA,EAAQ,IAAI7W,GAAK9U,QAAQ,KAAM2rB,IAE5BA,GAGX3b,gBAAiB,WACb,IAAIyb,EACAnb,EACAC,EAGJ,GADAiS,EAAYe,QACRf,EAAYwB,IAAI,aAQhB1T,GADAmb,EAAU7qC,KAAK+wB,MAAMrgB,MAAK,IACTA,KACjBif,EAAWkb,EAAQlb,SACdiS,EAAY2B,MAAM,MAV3B,CAeA,IAAM8H,EAAerrC,KAAKqrC,eAC1B,GAAIA,EAEA,OADAzJ,EAAYmB,SACRrT,EACO,IAAIwE,GAAKnD,MAAMtB,WAAW,KAAMC,EAAQ2b,EAAc,KAAM1b,GAEhE,IAAIuE,GAAK1N,gBAAgB6kB,GAEpCzJ,EAAYgB,eAZJhB,EAAYgB,WAkBxBviB,QAAS,WACL,IAAIhB,EACAC,EACAzD,EAUJ,GARA+lB,EAAYe,OAERh1B,EAAQiO,kBACRC,EAAYS,EAAaslB,EAAYlhC,KAGzC2e,EAAYrf,KAAKqf,eAECC,EAAQtf,KAAK+qC,SAAU,CACrCnJ,EAAYmB,SACZ,IAAM1iB,EAAU,IAAI6T,GAAY,QAAE7U,EAAWC,EAAO3R,EAAQ4R,eAI5D,OAHI5R,EAAQiO,kBACRyE,EAAQxE,UAAYA,GAEjBwE,EAEPuhB,EAAYgB,WAGpBkF,YAAa,WACT,IAAIltB,EACAxM,EAEAk9B,EAEAzwB,EACAC,EACArI,EALEzE,EAAQ4zB,EAAYlhC,EAEpB0O,EAAIwyB,EAAY+C,cAKtB,GAAU,MAANv1B,GAAmB,MAANA,GAAmB,MAANA,GAAmB,MAANA,EAK3C,GAHAwyB,EAAYe,OAEZ/nB,EAAO5a,KAAKgb,YAAchb,KAAKurC,eACrB,CAWN,IAVA94B,EAA6B,iBAATmI,KAGhBxM,EAAQpO,KAAKovB,qBAETkc,GAAQ,GAIhB1J,EAAYa,aAAa3jC,OAAS,GAC7BsP,EAAO,CAeR,GAXA0M,GAASrI,GAAcmI,EAAK9b,OAAS,GAAK8b,EAAKY,MAAMpN,MAIjDA,EADAwM,EAAK,GAAGxM,OAAuC,OAA9BwM,EAAK,GAAGxM,MAAMyD,MAAM,EAAG,GAChC7R,KAAKwrC,kBAKLxrC,KAAKyrC,iBAKb,OAFA7J,EAAYmB,SAEL,IAAI7O,GAAgB,YAAEtZ,EAAMxM,GAAO,EAAO0M,EAAO9M,EAAOhB,GAG9DoB,IACDA,EAAQpO,KAAKoO,SAGbA,EACAyM,EAAY7a,KAAK6a,YACVpI,IAEPrE,EAAQpO,KAAKwrC,mBAIrB,GAAIp9B,IAAUpO,KAAKkmC,OAASoF,GAExB,OADA1J,EAAYmB,SACL,IAAI7O,GAAgB,YAAEtZ,EAAMxM,EAAOyM,EAAWC,EAAO9M,EAAOhB,GAGnE40B,EAAYgB,eAGhBhB,EAAYgB,WAGpB6I,eAAgB,WACZ,IAAMz9B,EAAQ4zB,EAAYlhC,EACpBwO,EAAQ0yB,EAAYwB,IAAI,6BAC9B,GAAIl0B,EACA,OAAO,IAAIglB,GAAc,UAAEhlB,EAAM,GAAIlB,IAY7Cw9B,gBAAiB,SAAUE,GACvB,IAAIhrC,EACAjB,EACAksC,EACAv9B,EACEi1B,EAAMqI,GAAe,IACrB19B,EAAQ4zB,EAAYlhC,EACpBkW,EAAS,GAEf,SAASg1B,IACL,IAAMrH,EAAO3C,EAAY+C,cACzB,MAAmB,iBAARtB,EACAkB,IAASlB,EAETA,EAAIlnB,KAAKooB,GAGxB,IAAIqH,IAAJ,CAGAx9B,EAAQ,GACR,KACI3O,EAAIO,KAAKqgC,aAKT5gC,EAAIO,KAAKopC,YAHLh7B,EAAM5N,KAAKf,SAOVA,GAIT,GAFAksC,EAAOC,IAEHx9B,EAAMtP,OAAS,EAAG,CAElB,GADAsP,EAAQ,IAAI8lB,GAAe,WAAE9lB,GACzBu9B,EACA,OAAOv9B,EAGPwI,EAAOpW,KAAK4N,GAGe,MAA3BwzB,EAAYgD,YACZhuB,EAAOpW,KAAK,IAAI0zB,GAAK9Z,UAAU,IAAKpM,IAO5C,GAJA4zB,EAAYe,OAEZv0B,EAAQwzB,EAAYiC,YAAYR,GAErB,CAIP,GAHqB,iBAAVj1B,GACPtO,EAAM,aAAasO,MAAU,SAEZ,IAAjBA,EAAMtP,QAA6B,MAAbsP,EAAM,GAE5B,OADAwzB,EAAYmB,SACL,IAAI7O,GAAK9Z,UAAU,GAAIpM,GAElC,IAAI2b,SACJ,IAAKjpB,EAAI,EAAGA,EAAI0N,EAAMtP,OAAQ4B,IAE1B,GADAipB,EAAOvb,EAAM1N,GACT4M,MAAMC,QAAQoc,GAEd/S,EAAOpW,KAAK,IAAI0zB,GAAKlJ,OAAOrB,EAAK,GAAIA,EAAK,IAAI,EAAM3b,EAAOhB,QAE1D,CACGtM,IAAM0N,EAAMtP,OAAS,IACrB6qB,EAAOA,EAAKtX,QAGhB,IAAM8Y,EAAQ,IAAI+I,GAAKlJ,OAAO,IAAMrB,GAAM,EAAM3b,EAAOhB,GACvDme,EAAMC,cAAgB,aACtBD,EAAME,UAAY,cAClBzU,EAAOpW,KAAK2qB,GAIpB,OADAyW,EAAYmB,SACL,IAAI7O,GAAKjL,WAAWrS,GAAQ,GAEvCgrB,EAAYgB,YAahBiJ,OAAU,WACN,IAAI1uB,EACA8O,EACEje,EAAQ4zB,EAAYlhC,EAEpBorC,EAAMlK,EAAYwB,IAAI,gBAE5B,GAAI0I,EAAK,CACL,IAAMzuC,GAAWyuC,EAAM9rC,KAAK+rC,gBAAkB,OAAS,GAEvD,GAAK5uB,EAAOnd,KAAKgoC,SAASI,UAAYpoC,KAAKgoC,SAASxV,MAQhD,OAPAvG,EAAWjsB,KAAKgsC,gBAEXpK,EAAY2B,MAAM,OACnB3B,EAAYlhC,EAAIsN,EAChBlO,EAAM,gEAEVmsB,EAAWA,GAAY,IAAIiI,GAAU,MAAEjI,GAChC,IAAIiI,GAAW,OAAE/W,EAAM8O,EAAU5uB,EAAS2Q,EAAOhB,GAGxD40B,EAAYlhC,EAAIsN,EAChBlO,EAAM,gCAKlBisC,cAAe,WACX,IAAIE,EAEAC,EACA99B,EAFE/Q,EAAU,GAKhB,IAAKukC,EAAY2B,MAAM,KAAQ,OAAO,KACtC,GAEI,GADA0I,EAAIjsC,KAAKmsC,eACF,CAGH,OADA/9B,GAAQ,EADR89B,EAAaD,GAGT,IAAK,MACDC,EAAa,OACb99B,GAAQ,EACR,MACJ,IAAK,OACD89B,EAAa,WACb99B,GAAQ,EAIhB,GADA/Q,EAAQ6uC,GAAc99B,GACjBwzB,EAAY2B,MAAM,KAAQ,aAE9B0I,GAET,OADAxF,EAAW,KACJppC,GAGX8uC,aAAc,WACV,IAAM5uC,EAAMqkC,EAAYwB,IAAI,uDAC5B,GAAI7lC,EACA,OAAOA,EAAI,IAInB6uC,aAAc,WACV,IAEI3sC,EACAswB,EAHEiY,EAAWhoC,KAAKgoC,SAChB76B,EAAQ,GAGdy0B,EAAYe,OACZ,IACIljC,EAAIuoC,EAASt2B,WAAas2B,EAAShtB,YAAcgtB,EAASG,eAEtDh7B,EAAM3M,KAAKf,GACJmiC,EAAY2B,MAAM,OACzBxT,EAAI/vB,KAAKqiB,WACT5iB,EAAIO,KAAKoO,QACLwzB,EAAY2B,MAAM,KACdxT,GAAKtwB,EACL0N,EAAM3M,KAAK,IAAI0zB,GAAU,MAAE,IAAIA,GAAgB,YAAEnE,EAAGtwB,EAAG,KAAM,KAAMmiC,EAAYlhC,EAAGsM,GAAU,KACrFvN,EACP0N,EAAM3M,KAAK,IAAI0zB,GAAU,MAAEz0B,IAE3BK,EAAM,yCAGVA,EAAM,sBAAyB,gBAGlCL,GAGT,GADAmiC,EAAYmB,SACR51B,EAAMrO,OAAS,EACf,OAAO,IAAIo1B,GAAe,WAAE/mB,IAIpC6+B,cAAe,WACX,IAEIvsC,EAFEuoC,EAAWhoC,KAAKgoC,SAChB/b,EAAW,GAEjB,GAEI,GADAxsB,EAAIO,KAAKosC,gBAGL,GADAngB,EAASzrB,KAAKf,IACTmiC,EAAY2B,MAAM,KAAQ,WAG/B,IADA9jC,EAAIuoC,EAAShtB,YAAcgtB,EAASG,iBAEhClc,EAASzrB,KAAKf,IACTmiC,EAAY2B,MAAM,MAAQ,YAGlC9jC,GAET,OAAOwsB,EAASntB,OAAS,EAAImtB,EAAW,MAG5CxtB,MAAO,WACH,IAAIwtB,EACA3M,EACA7gB,EACAod,EACE7N,EAAQ4zB,EAAYlhC,EAQ1B,GANIiN,EAAQiO,kBACRC,EAAYS,EAAatO,IAG7B4zB,EAAYe,OAERf,EAAY4B,KAAK,UAgBjB,OAfAvX,EAAWjsB,KAAKgsC,iBAEhB1sB,EAAQtf,KAAK+qC,UAGTjrC,EAAM,iEAGV8hC,EAAYmB,SAEZtkC,EAAQ,IAAIy1B,GAAU,MAAE5U,EAAO2M,EAAUje,EAAOhB,GAC5CW,EAAQiO,kBACRnd,EAAMod,UAAYA,GAGfpd,EAGXmjC,EAAYgB,WAShBrO,OAAQ,WACJ,IAAIpX,EACAzM,EACArT,EACE2Q,EAAQ4zB,EAAYlhC,EAG1B,GAFckhC,EAAYwB,IAAI,gBAErB,CAaL,GATI/lC,GAHJqT,EAAO1Q,KAAKqsC,cAGE,CACNA,WAAY37B,EACZkc,UAAU,GAIJ,CAAEA,UAAU,GAGrBzP,EAAOnd,KAAKgoC,SAASI,UAAYpoC,KAAKgoC,SAASxV,MAMhD,OAJKoP,EAAY2B,MAAM,OACnB3B,EAAYlhC,EAAIsN,EAChBlO,EAAM,kCAEH,IAAIo0B,GAAW,OAAE/W,EAAM,KAAM9f,EAAS2Q,EAAOhB,GAGpD40B,EAAYlhC,EAAIsN,EAChBlO,EAAM,iCAKlBusC,WAAY,WAGR,GADAzK,EAAYe,QACPf,EAAY2B,MAAM,KAEnB,OADA3B,EAAYgB,UACL,KAEX,IAAMlyB,EAAOkxB,EAAYwB,IAAI,sBAC7B,OAAI1yB,EAAK,IACLkxB,EAAYmB,SACLryB,EAAK,GAAG2B,SAGfuvB,EAAYgB,UACL,OASfqF,OAAQ,WACJ,IACIrtB,EACAxM,EACAkR,EACAgtB,EACAC,EACAC,EACAC,EAPEz+B,EAAQ4zB,EAAYlhC,EAQtBgsC,GAAW,EACXxmB,GAAW,EAEf,GAAkC,MAA9B0b,EAAY+C,cAAhB,CAGA,GADAv2B,EAAQpO,KAAa,UAAOA,KAAKu0B,UAAYv0B,KAAKvB,QAE9C,OAAO2P,EAOX,GAJAwzB,EAAYe,OAEZ/nB,EAAOgnB,EAAYwB,IAAI,aAEvB,CAOA,OALAkJ,EAAwB1xB,EACF,KAAlBA,EAAK3H,OAAO,IAAa2H,EAAKhK,QAAQ,IAAK,GAAK,IAChD07B,EAAwB,IAAI1xB,EAAK/I,MAAM+I,EAAKhK,QAAQ,IAAK,GAAK,IAG1D07B,GACJ,IAAK,WACDC,GAAgB,EAChBG,GAAW,EACX,MACJ,IAAK,aACDF,GAAgB,EAChBE,GAAW,EACX,MACJ,IAAK,aACL,IAAK,iBACDH,GAAgB,EAChB,MACJ,IAAK,YACL,IAAK,YACDE,GAAa,EACbvmB,GAAW,EACX,MACJ,QACIumB,GAAa,EAiCrB,GA7BA7K,EAAYa,aAAa3jC,OAAS,EAE9BytC,GACAn+B,EAAQpO,KAAKopC,WAETtpC,EAAM,YAAY8a,iBAEf4xB,GACPp+B,EAAQpO,KAAK0tB,eAET5tB,EAAM,YAAY8a,iBAEf6xB,IACPr+B,EAAQpO,KAAKwrC,gBAAgB,SAC7BkB,EAA0C,MAA9B9K,EAAY+C,cACnBv2B,EAKKA,EAAMA,QACZA,EAAQ,MALHs+B,GAA0C,MAA9B9K,EAAY+C,eACzB7kC,EAAS8a,kDAQjB8xB,IACAptB,EAAQtf,KAAKqrC,gBAGb/rB,IAAWotB,GAAYt+B,GAASwzB,EAAY2B,MAAM,KAElD,OADA3B,EAAYmB,SACL,IAAI7O,GAAW,OAAEtZ,EAAMxM,EAAOkR,EAAOtR,EAAOhB,EAC/CW,EAAQiO,gBAAkBU,EAAatO,GAAS,KAChDkY,GAIR0b,EAAYgB,QAAQ,qCAWxBx0B,MAAO,WACH,IAAI3O,EACEirC,EAAc,GACd18B,EAAQ4zB,EAAYlhC,EAE1B,GAEI,IADAjB,EAAIO,KAAK0tB,gBAELgd,EAAYlqC,KAAKf,IACZmiC,EAAY2B,MAAM,MAAQ,YAE9B9jC,GAET,GAAIirC,EAAY5rC,OAAS,EACrB,OAAO,IAAIo1B,GAAU,MAAEwW,EAAa18B,IAG5C6M,UAAW,WACP,GAAkC,MAA9B+mB,EAAY+C,cACZ,OAAO/C,EAAYwB,IAAI,kBAG/BuJ,IAAK,WACD,IAAIn+B,EACA/O,EAGJ,GADAmiC,EAAYe,OACRf,EAAY2B,MAAM,KAElB,OADA/0B,EAAIxO,KAAK4sC,aACAhL,EAAY2B,MAAM,MACvB3B,EAAYmB,UACZtjC,EAAI,IAAIy0B,GAAe,WAAE,CAAC1lB,KACxB4a,QAAS,EACJ3pB,QAEXmiC,EAAYgB,QAAQ,gBAGxBhB,EAAYgB,WAEhBiK,eAAgB,WACZ,IAAI1hC,EACAqD,EACAD,EACAu+B,EACA9jB,EAEJ,GADA7d,EAAInL,KAAK+sC,UACF,CAEH,IADA/jB,EAAW4Y,EAAYoB,cAAc,IAE7BpB,EAAY6C,KAAK,aADZ,CAST,GAJA7C,EAAYe,SAEZp0B,EAAKqzB,EAAY2B,MAAM,MAAQ3B,EAAY2B,MAAM,MAAQ3B,EAAY4B,KAAK,OAEjE,CAAE5B,EAAYmB,SAAU,MAIjC,KAFAv0B,EAAIxO,KAAK+sC,WAED,CAAEnL,EAAYgB,UAAW,MACjChB,EAAYmB,SAEZ53B,EAAEme,YAAa,EACf9a,EAAE8a,YAAa,EACfwjB,EAAY,IAAI5Y,GAAc,UAAE3lB,EAAI,CAACu+B,GAAa3hC,EAAGqD,GAAIwa,GACzDA,EAAW4Y,EAAYoB,cAAc,GAEzC,OAAO8J,GAAa3hC,IAG5ByhC,SAAU,WACN,IAAIzhC,EACAqD,EACAD,EACAu+B,EACA9jB,EAEJ,GADA7d,EAAInL,KAAK6sC,iBACF,CAEH,IADA7jB,EAAW4Y,EAAYoB,cAAc,IAEjCz0B,EAAKqzB,EAAYwB,IAAI,cAAiBpa,IAAa4Y,EAAY2B,MAAM,MAAQ3B,EAAY2B,MAAM,SAI/F/0B,EAAIxO,KAAK6sC,mBAKT1hC,EAAEme,YAAa,EACf9a,EAAE8a,YAAa,EACfwjB,EAAY,IAAI5Y,GAAc,UAAE3lB,EAAI,CAACu+B,GAAa3hC,EAAGqD,GAAIwa,GACzDA,EAAW4Y,EAAYoB,cAAc,GAEzC,OAAO8J,GAAa3hC,IAG5B2/B,WAAY,WACR,IAAIt8B,EACAC,EAEAiK,EADE1K,EAAQ4zB,EAAYlhC,EAI1B,GADA8N,EAAIxO,KAAK0Y,WAAU,GACZ,CACH,KACSkpB,EAAY6C,KAAK,qBAAwB7C,EAAY2B,MAAM,OAGhE90B,EAAIzO,KAAK0Y,WAAU,KAInBA,EAAY,IAAIwb,GAAc,UAAE,KAAMxb,GAAalK,EAAGC,EAAGT,GAE7D,OAAO0K,GAAalK,IAG5BkK,UAAW,SAAUs0B,GACjB,IAAIp2B,EACAq2B,EACAC,EAMJ,GADAt2B,EAAS5W,KAAKmtC,aAAaH,GAC3B,CAIA,GADAC,EAPWrL,EAAY4B,KAAK,MAQf,CAET,KADA0J,EAAOltC,KAAK0Y,UAAUs0B,IAIlB,OAFAp2B,EAAS,IAAIsd,GAAc,UAAE+Y,EAASr2B,EAAQs2B,GAKtD,OAAOt2B,IAEXu2B,aAAc,SAAUH,GACpB,IAAIp2B,EACAq2B,EACAC,EAGMtC,EAFJh+B,EAAO5M,KAab,GADA4W,GAVUg0B,EAAOh+B,EAAKwgC,iBAAiBJ,IAAgBpgC,EAAKygC,qBAAqBL,KAC/DA,EAGPpC,EAFIh+B,EAAK0gC,gBAAgBN,GASpC,CAIA,GADAC,EAPWrL,EAAY4B,KAAK,OAQf,CAET,KADA0J,EAAOltC,KAAKmtC,aAAaH,IAIrB,OAFAp2B,EAAS,IAAIsd,GAAc,UAAE+Y,EAASr2B,EAAQs2B,GAKtD,OAAOt2B,IAEXw2B,iBAAkB,SAAUJ,GACxB,GAAIpL,EAAY4B,KAAK,OAAQ,CACzB,IAAM5sB,EAAS5W,KAAKqtC,qBAAqBL,GAIzC,OAHIp2B,IACAA,EAAOuX,QAAUvX,EAAOuX,QAErBvX,IAGfy2B,qBAAsB,SAAUL,GAiB5B,IAAIO,EAEJ,GADA3L,EAAYe,OACPf,EAAY4B,KAAK,KAAtB,CAKA,GADA+J,EAtBA,SAA2CC,GACvC,IAAID,EAGJ,GAFA3L,EAAYe,OACZ4K,EAAOC,EAAG90B,UAAUs0B,GACpB,CAIA,GAAKpL,EAAY2B,MAAM,KAKvB,OADA3B,EAAYmB,SACLwK,EAJH3L,EAAYgB,eAJZhB,EAAYgB,UAiBb6K,CAAkCztC,MAGrC,OADA4hC,EAAYmB,SACLwK,EAIX,GADAA,EAAOvtC,KAAKstC,gBAAgBN,GAC5B,CAIA,GAAKpL,EAAY2B,MAAM,KAKvB,OADA3B,EAAYmB,SACLwK,EAJH3L,EAAYgB,QAAQ,qBAAqBhB,EAAY+C,wBAJrD/C,EAAYgB,eAXZhB,EAAYgB,WAqBpB0K,gBAAiB,SAAUN,GACvB,IAEIx+B,EACAC,EACAW,EACAb,EALEy5B,EAAWhoC,KAAKgoC,SAChBh6B,EAAQ4zB,EAAYlhC,EAM1B,SAASkqC,IACL,OAAO5qC,KAAK4sC,YAAc5E,EAASt2B,WAAas2B,EAASI,UAAYJ,EAASG,cAKlF,GADA35B,GAFAo8B,EAAOA,EAAKvpC,KAAKrB,SAqCb,OAjCI4hC,EAAY2B,MAAM,KAEdh1B,EADAqzB,EAAY2B,MAAM,KACb,KAEA,IAGT3B,EAAY2B,MAAM,KAEdh1B,EADAqzB,EAAY2B,MAAM,KACb,KAEA,IAGT3B,EAAY2B,MAAM,OAEdh1B,EADAqzB,EAAY2B,MAAM,KACb,KACE3B,EAAY2B,MAAM,KACpB,KAEA,KAGTh1B,GACAE,EAAIm8B,KAEAx7B,EAAI,IAAI8kB,GAAc,UAAE3lB,EAAIC,EAAGC,EAAGT,GAAO,GAEzClO,EAAM,uBAGVsP,EAAI,IAAI8kB,GAAc,UAAE,IAAK1lB,EAAG,IAAI0lB,GAAY,QAAE,QAASlmB,GAAO,GAE/DoB,GAQf29B,QAAS,WACL,IACI5e,EADE6Z,EAAWhoC,KAAKgoC,SAGlBpG,EAAY6C,KAAK,eACjBtW,EAASyT,EAAY2B,MAAM,MAG/B,IAAI0I,EAAIjsC,KAAK2sC,OAAS3E,EAASkB,aACvBlB,EAASz3B,SAAWy3B,EAAShtB,YAC7BgtB,EAAS3lB,YAAc2lB,EAASx0B,QAChCw0B,EAASI,QAAO,IAASJ,EAASyB,gBAClCzB,EAASG,cAOjB,OALIha,IACA8d,EAAE3iB,YAAa,EACf2iB,EAAI,IAAI/X,GAAa,SAAE+X,IAGpBA,GAUXve,WAAY,WACR,IACIjuB,EACAiuC,EAFE1F,EAAW,GAGXh6B,EAAQ4zB,EAAYlhC,EAE1B,IACIjB,EAAIO,KAAKqgC,WAEL2H,EAASxnC,KAAKf,KAGlBA,EAAIO,KAAK4sC,YAAc5sC,KAAKopC,oBAEXlV,GAAK9X,UAClB3c,EAAI,MAGJA,IACAuoC,EAASxnC,KAAKf,GAETmiC,EAAY6C,KAAK,cAClBiJ,EAAQ9L,EAAY2B,MAAM,OAEtByE,EAASxnC,KAAK,IAAI0zB,GAAc,UAAEwZ,EAAO1/B,YAIhDvO,GACT,GAAIuoC,EAASlpC,OAAS,EAClB,OAAO,IAAIo1B,GAAe,WAAE8T,IAGpC3lB,SAAU,WACN,IAAMzH,EAAOgnB,EAAYwB,IAAI,8BAC7B,GAAIxoB,EACA,OAAOA,EAAK,IAGpB2wB,aAAc,WACV,IAEI5/B,EACAoI,EAHA6G,EAAO,GACL5M,EAAQ,GAId4zB,EAAYe,OAEZ,IAAMgL,EAAiB/L,EAAYwB,IAAI,yBACvC,GAAIuK,EAGA,OAFA/yB,EAAO,CAAC,IAAIsZ,GAAY,QAAEyZ,EAAe,KACzC/L,EAAYmB,SACLnoB,EAGX,SAAS1L,EAAMo7B,GACX,IAAM5pC,EAAIkhC,EAAYlhC,EAChBqN,EAAQ6zB,EAAYwB,IAAIkH,GAC9B,GAAIv8B,EAEA,OADAC,EAAMxN,KAAKE,GACJka,EAAKpa,KAAKuN,EAAM,IAK/B,IADAmB,EAAM,UAEGA,EAAM,uCAKf,GAAK0L,EAAK9b,OAAS,GAAMoQ,EAAM,sBAAuB,CASlD,IARA0yB,EAAYmB,SAII,KAAZnoB,EAAK,KACLA,EAAKhB,QACL5L,EAAM4L,SAEL7F,EAAI,EAAGA,EAAI6G,EAAK9b,OAAQiV,IACzBpI,EAAIiP,EAAK7G,GACT6G,EAAK7G,GAAsB,MAAhBpI,EAAEsH,OAAO,IAA8B,MAAhBtH,EAAEsH,OAAO,GACvC,IAAIihB,GAAY,QAAEvoB,GACD,MAAhBA,EAAEsH,OAAO,GACN,IAAIihB,GAAa,SAAE,IAAIvoB,EAAEkG,MAAM,GAAI,GAAM7D,EAAM+F,GAAI/G,GACnD,IAAIknB,GAAa,SAAE,IAAIvoB,EAAEkG,MAAM,GAAI,GAAM7D,EAAM+F,GAAI/G,GAE/D,OAAO4N,EAEXgnB,EAAYgB,cCp1E5B,SAASgL,GAAGjgC,EAAS+K,EAAWm1B,EAAWC,GACvC,OAAOp1B,EAAU3G,KAAKpE,GAAWkgC,EAAU97B,KAAKpE,GACzCmgC,EAAaA,EAAW/7B,KAAKpE,GAAW,IAAIyM,EAIvD,SAAS2zB,GAAUpgC,EAASqN,GACxB,IAEI,OADAA,EAASjJ,KAAKpE,GACPsM,EAAQC,KACjB,MAAOza,GACL,OAAOwa,EAAQE,OD80EvBksB,GAAOc,cAAgB,SAAAplB,GACnB,IAAIpW,EAAI,GAER,IAAK,IAAMqW,KAAQD,EACf,GAAIlV,OAAOpP,eAAe+V,KAAKuO,EAAMC,GAAO,CACxC,IAAM5T,EAAQ2T,EAAKC,GACnBrW,IAAsB,MAAZqW,EAAK,GAAc,GAAK,KAAOA,OAAS5T,GAAqC,MAA5Bka,OAAOla,GAAOyD,OAAO,GAAc,GAAK,KAI3G,OAAOlG,GC/1EXiiC,GAAGnkB,UAAW,EAWdskB,GAAUtkB,UAAW,MCpBjBukB,MDsBW,CAAED,aAAWrF,QAzB5B,SAAiBhwB,GACb,OAAOA,EAAYuB,EAAQC,KAAOD,EAAQE,OAwBTwuB,GAAMiF,ICpB3C,SAASp+B,GAAMqc,GACX,OAAO9f,KAAK4D,IAAI,EAAG5D,KAAK2D,IAAI,EAAGmc,IAEnC,SAASoiB,GAAKC,EAAWC,GACrB,IAAM59B,EAAQy9B,GAAeC,KAAKE,EAAIr9B,EAAGq9B,EAAIxiC,EAAGwiC,EAAIp9B,EAAGo9B,EAAI3/B,GAC3D,GAAI+B,EAOA,OANI29B,EAAU9/B,OACV,aAAa+N,KAAK+xB,EAAU9/B,OAC5BmC,EAAMnC,MAAQ8/B,EAAU9/B,MAExBmC,EAAMnC,MAAQ,MAEXmC,EAGf,SAASM,GAAMN,GACX,GAAIA,EAAMM,MACN,OAAON,EAAMM,QAEb,MAAM,IAAInR,MAAM,2CAIxB,SAAS4R,GAAMf,GACX,GAAIA,EAAMe,MACN,OAAOf,EAAMe,QAEb,MAAM,IAAI5R,MAAM,2CAIxB,SAAS0uC,GAAO/4B,GACZ,GAAIA,aAAa2S,GACb,OAAOE,WAAW7S,EAAE4S,KAAKhB,GAAG,KAAO5R,EAAEjH,MAAQ,IAAMiH,EAAEjH,OAClD,GAAiB,iBAANiH,EACd,OAAOA,EAEP,KAAM,CACFzU,KAAM,WACNsW,QAAS,qDAWrB82B,GAAiB,CACbh/B,IAAK,SAAUkB,EAAGC,EAAG1B,GACjB,IAAID,EAAI,EAKR,GAAI0B,aAAa+Y,GAAY,CACzB,IAAM4C,EAAM3b,EAAE9B,MAQd,GAPA8B,EAAI2b,EAAI,GACR1b,EAAI0b,EAAI,IACRpd,EAAIod,EAAI,cAKS/C,GAAW,CACxB,IAAMva,EAAKE,EACXA,EAAIF,EAAGwa,SAAS,GAChBva,EAAID,EAAGwa,SAAS,IAGxB,IAAMxY,EAAQy9B,GAAeK,KAAKn+B,EAAGC,EAAG1B,EAAGD,GAC3C,GAAI+B,EAEA,OADAA,EAAMnC,MAAQ,MACPmC,GAGf89B,KAAM,SAAUn+B,EAAGC,EAAG1B,EAAGD,GACrB,IACI,GAAI0B,aAAanB,EAMb,OAJIP,EADA2B,EACIi+B,GAAOj+B,GAEPD,EAAEZ,MAEH,IAAIP,EAAMmB,EAAElB,IAAKR,EAAG,QAE/B,IAAMQ,EAAM,CAACkB,EAAGC,EAAG1B,GAAGU,KAAI,SAAAC,GAAK,OA7CxBk/B,EA6CkC,KA7CrCj5B,EA6CkCjG,aA5C7B4Y,IAAa3S,EAAE4S,KAAKhB,GAAG,KAC7BiB,WAAW7S,EAAEjH,MAAQkgC,EAAO,KAE5BF,GAAO/4B,GAJtB,IAAgBA,EAAGi5B,KA+CP,OADA9/B,EAAI4/B,GAAO5/B,GACJ,IAAIO,EAAMC,EAAKR,EAAG,QAE7B,MAAO/O,MAEX0uC,IAAK,SAAUr9B,EAAGnF,EAAGoF,GACjB,IAAIvC,EAAI,EACR,GAAIsC,aAAamY,GAAY,CACzB,IAAM4C,EAAM/a,EAAE1C,MAKd,GAJA0C,EAAI+a,EAAI,GACRlgB,EAAIkgB,EAAI,IACR9a,EAAI8a,EAAI,cAES/C,GAAW,CACxB,IAAMva,EAAKwC,EACXA,EAAIxC,EAAGwa,SAAS,GAChBva,EAAID,EAAGwa,SAAS,IAGxB,IAAMxY,EAAQy9B,GAAeC,KAAKn9B,EAAGnF,EAAGoF,EAAGvC,GAC3C,GAAI+B,EAEA,OADAA,EAAMnC,MAAQ,MACPmC,GAGf09B,KAAM,SAAUn9B,EAAGnF,EAAGoF,EAAGvC,GACrB,IACI,GAAIsC,aAAa/B,EAMb,OAJIP,EADA7C,EACIyiC,GAAOziC,GAEPmF,EAAExB,MAEH,IAAIP,EAAM+B,EAAE9B,IAAKR,EAAG,QAG/B,IAAI+/B,EACAC,EAEJ,SAASC,EAAI39B,GAET,OAAQ,GADRA,EAAIA,EAAI,EAAIA,EAAI,EAAKA,EAAI,EAAIA,EAAI,EAAIA,GACzB,EACDy9B,GAAMC,EAAKD,GAAMz9B,EAAI,EAEnB,EAAJA,EAAQ,EACN09B,EAEE,EAAJ19B,EAAQ,EACNy9B,GAAMC,EAAKD,IAAO,EAAI,EAAIz9B,GAAK,EAG/By9B,EAIfz9B,EAAKs9B,GAAOt9B,GAAK,IAAO,IACxBnF,EAAI6D,GAAM4+B,GAAOziC,IAAIoF,EAAIvB,GAAM4+B,GAAOr9B,IAAIvC,EAAIgB,GAAM4+B,GAAO5/B,IAG3D+/B,EAAS,EAAJx9B,GADLy9B,EAAKz9B,GAAK,GAAMA,GAAKpF,EAAI,GAAKoF,EAAIpF,EAAIoF,EAAIpF,GAG1C,IAAMqD,EAAM,CACS,IAAjBy/B,EAAI39B,EAAI,EAAI,GACG,IAAf29B,EAAI39B,GACa,IAAjB29B,EAAI39B,EAAI,EAAI,IAGhB,OADAtC,EAAI4/B,GAAO5/B,GACJ,IAAIO,EAAMC,EAAKR,EAAG,QAE7B,MAAO/O,MAGXivC,IAAK,SAAS59B,EAAGnF,EAAG8D,GAChB,OAAOu+B,GAAeW,KAAK79B,EAAGnF,EAAG8D,EAAG,IAGxCk/B,KAAM,SAAS79B,EAAGnF,EAAG8D,EAAGjB,GAIpB,IAAI9N,EACAwwB,EAJJpgB,EAAMs9B,GAAOt9B,GAAK,IAAO,IAAO,IAChCnF,EAAIyiC,GAAOziC,GAAG8D,EAAI2+B,GAAO3+B,GAAGjB,EAAI4/B,GAAO5/B,GAOvC,IAAMogC,EAAK,CAACn/B,EACRA,GAAK,EAAI9D,GACT8D,GAAK,GAJTyhB,EAAKpgB,EAAI,IADTpQ,EAAIqL,KAAK8iC,MAAO/9B,EAAI,GAAM,KAKTnF,GACb8D,GAAK,GAAK,EAAIyhB,GAAKvlB,IACjBmjC,EAAO,CAAC,CAAC,EAAG,EAAG,GACjB,CAAC,EAAG,EAAG,GACP,CAAC,EAAG,EAAG,GACP,CAAC,EAAG,EAAG,GACP,CAAC,EAAG,EAAG,GACP,CAAC,EAAG,EAAG,IAEX,OAAOd,GAAeK,KAAsB,IAAjBO,EAAGE,EAAKpuC,GAAG,IACjB,IAAjBkuC,EAAGE,EAAKpuC,GAAG,IACM,IAAjBkuC,EAAGE,EAAKpuC,GAAG,IACX8N,IAGRigC,IAAK,SAAUl+B,GACX,OAAO,IAAIyX,GAAUnX,GAAMN,GAAOO,IAEtCi+B,WAAY,SAAUx+B,GAClB,OAAO,IAAIyX,GAA2B,IAAjBnX,GAAMN,GAAO5E,EAAS,MAE/CqjC,UAAW,SAAUz+B,GACjB,OAAO,IAAIyX,GAA2B,IAAjBnX,GAAMN,GAAOQ,EAAS,MAE/Ck+B,OAAQ,SAAS1+B,GACb,OAAO,IAAIyX,GAAU1W,GAAMf,GAAOO,IAEtCo+B,cAAe,SAAU3+B,GACrB,OAAO,IAAIyX,GAA2B,IAAjB1W,GAAMf,GAAO5E,EAAS,MAE/CwjC,SAAU,SAAU5+B,GAChB,OAAO,IAAIyX,GAA2B,IAAjB1W,GAAMf,GAAOd,EAAS,MAE/ClG,IAAK,SAAUgH,GACX,OAAO,IAAIyX,GAAUzX,EAAMvB,IAAI,KAEnC1J,MAAO,SAAUiL,GACb,OAAO,IAAIyX,GAAUzX,EAAMvB,IAAI,KAEnCxM,KAAM,SAAU+N,GACZ,OAAO,IAAIyX,GAAUzX,EAAMvB,IAAI,KAEnCM,MAAO,SAAUiB,GACb,OAAO,IAAIyX,GAAUnX,GAAMN,GAAO/B,IAEtCyB,KAAM,SAAUM,GACZ,OAAO,IAAIyX,GAAUzX,EAAMN,OAASM,EAAMjB,MAAQ,IAAK,MAE3D8/B,UAAW,SAAU7+B,GACjB,IAAM6+B,EACD,MAAS7+B,EAAMvB,IAAI,GAAK,IACpB,MAASuB,EAAMvB,IAAI,GAAK,IACxB,MAASuB,EAAMvB,IAAI,GAAK,IAEjC,OAAO,IAAIgZ,GAAUonB,EAAY7+B,EAAMjB,MAAQ,IAAK,MAExD+/B,SAAU,SAAU9+B,EAAO++B,EAAQC,GAG/B,IAAKh/B,EAAMvB,IACP,OAAO,KAEX,IAAMm/B,EAAMt9B,GAAMN,GASlB,YAPsB,IAAXg/B,GAA2C,aAAjBA,EAAOnhC,MACxC+/B,EAAIxiC,GAAMwiC,EAAIxiC,EAAI2jC,EAAOlhC,MAAQ,IAGjC+/B,EAAIxiC,GAAK2jC,EAAOlhC,MAAQ,IAE5B+/B,EAAIxiC,EAAI6D,GAAM2+B,EAAIxiC,GACXsiC,GAAK19B,EAAO49B,IAEvBqB,WAAY,SAAUj/B,EAAO++B,EAAQC,GACjC,IAAMpB,EAAMt9B,GAAMN,GASlB,YAPsB,IAAXg/B,GAA2C,aAAjBA,EAAOnhC,MACxC+/B,EAAIxiC,GAAMwiC,EAAIxiC,EAAI2jC,EAAOlhC,MAAQ,IAGjC+/B,EAAIxiC,GAAK2jC,EAAOlhC,MAAQ,IAE5B+/B,EAAIxiC,EAAI6D,GAAM2+B,EAAIxiC,GACXsiC,GAAK19B,EAAO49B,IAEvBsB,QAAS,SAAUl/B,EAAO++B,EAAQC,GAC9B,IAAMpB,EAAMt9B,GAAMN,GASlB,YAPsB,IAAXg/B,GAA2C,aAAjBA,EAAOnhC,MACxC+/B,EAAIp9B,GAAMo9B,EAAIp9B,EAAIu+B,EAAOlhC,MAAQ,IAGjC+/B,EAAIp9B,GAAKu+B,EAAOlhC,MAAQ,IAE5B+/B,EAAIp9B,EAAIvB,GAAM2+B,EAAIp9B,GACXk9B,GAAK19B,EAAO49B,IAEvBuB,OAAQ,SAAUn/B,EAAO++B,EAAQC,GAC7B,IAAMpB,EAAMt9B,GAAMN,GASlB,YAPsB,IAAXg/B,GAA2C,aAAjBA,EAAOnhC,MACxC+/B,EAAIp9B,GAAMo9B,EAAIp9B,EAAIu+B,EAAOlhC,MAAQ,IAGjC+/B,EAAIp9B,GAAKu+B,EAAOlhC,MAAQ,IAE5B+/B,EAAIp9B,EAAIvB,GAAM2+B,EAAIp9B,GACXk9B,GAAK19B,EAAO49B,IAEvBwB,OAAQ,SAAUp/B,EAAO++B,EAAQC,GAC7B,IAAMpB,EAAMt9B,GAAMN,GASlB,YAPsB,IAAXg/B,GAA2C,aAAjBA,EAAOnhC,MACxC+/B,EAAI3/B,GAAM2/B,EAAI3/B,EAAI8gC,EAAOlhC,MAAQ,IAGjC+/B,EAAI3/B,GAAK8gC,EAAOlhC,MAAQ,IAE5B+/B,EAAI3/B,EAAIgB,GAAM2+B,EAAI3/B,GACXy/B,GAAK19B,EAAO49B,IAEvByB,QAAS,SAAUr/B,EAAO++B,EAAQC,GAC9B,IAAMpB,EAAMt9B,GAAMN,GASlB,YAPsB,IAAXg/B,GAA2C,aAAjBA,EAAOnhC,MACxC+/B,EAAI3/B,GAAM2/B,EAAI3/B,EAAI8gC,EAAOlhC,MAAQ,IAGjC+/B,EAAI3/B,GAAK8gC,EAAOlhC,MAAQ,IAE5B+/B,EAAI3/B,EAAIgB,GAAM2+B,EAAI3/B,GACXy/B,GAAK19B,EAAO49B,IAEvB0B,KAAM,SAAUt/B,EAAO++B,GACnB,IAAMnB,EAAMt9B,GAAMN,GAIlB,OAFA49B,EAAI3/B,EAAI8gC,EAAOlhC,MAAQ,IACvB+/B,EAAI3/B,EAAIgB,GAAM2+B,EAAI3/B,GACXy/B,GAAK19B,EAAO49B,IAEvB2B,KAAM,SAAUv/B,EAAO++B,GACnB,IAAMnB,EAAMt9B,GAAMN,GACZk+B,GAAON,EAAIr9B,EAAIw+B,EAAOlhC,OAAS,IAIrC,OAFA+/B,EAAIr9B,EAAI29B,EAAM,EAAI,IAAMA,EAAMA,EAEvBR,GAAK19B,EAAO49B,IAMvB4B,IAAK,SAAUC,EAAQC,EAAQC,GACtBA,IACDA,EAAS,IAAIloB,GAAU,KAE3B,IAAM+H,EAAImgB,EAAO9hC,MAAQ,IACnB+hC,EAAQ,EAAJpgB,EAAQ,EACZvhB,EAAIqC,GAAMm/B,GAAQxhC,EAAIqC,GAAMo/B,GAAQzhC,EAEpC4hC,IAAQD,EAAI3hC,IAAM,EAAK2hC,GAAKA,EAAI3hC,IAAM,EAAI2hC,EAAI3hC,IAAM,GAAK,EACzD6hC,EAAK,EAAID,EAETphC,EAAM,CAACghC,EAAOhhC,IAAI,GAAKohC,EAAKH,EAAOjhC,IAAI,GAAKqhC,EAC9CL,EAAOhhC,IAAI,GAAKohC,EAAKH,EAAOjhC,IAAI,GAAKqhC,EACrCL,EAAOhhC,IAAI,GAAKohC,EAAKH,EAAOjhC,IAAI,GAAKqhC,GAEnC/gC,EAAQ0gC,EAAO1gC,MAAQygB,EAAIkgB,EAAO3gC,OAAS,EAAIygB,GAErD,OAAO,IAAIhhB,EAAMC,EAAKM,IAE1BghC,UAAW,SAAU//B,GACjB,OAAOy9B,GAAewB,WAAWj/B,EAAO,IAAIyX,GAAU,OAE1DuoB,SAAU,SAAUhgC,EAAOigC,EAAMC,EAAOC,GAGpC,IAAKngC,EAAMvB,IACP,OAAO,KASX,QAPqB,IAAVyhC,IACPA,EAAQzC,GAAeK,KAAK,IAAK,IAAK,IAAK,SAE3B,IAATmC,IACPA,EAAOxC,GAAeK,KAAK,EAAG,EAAG,EAAG,IAGpCmC,EAAKvgC,OAASwgC,EAAMxgC,OAAQ,CAC5B,IAAM0gC,EAAIF,EACVA,EAAQD,EACRA,EAAOG,EAOX,OAJID,OADqB,IAAdA,EACK,IAEAtC,GAAOsC,GAEnBngC,EAAMN,OAASygC,EACRD,EAEAD,GAyCfI,KAAM,SAAUrgC,GACZ,OAAO,IAAI6J,EAAU7J,EAAMgB,WAE/BhB,MAAO,SAASnB,GACZ,GAAKA,aAAa4b,IACb,uDAAuD7O,KAAK/M,EAAEhB,OAAS,CACxE,IAAMyd,EAAMzc,EAAEhB,MAAMyD,MAAM,GAC1B,OAAO,IAAI9C,EAAM8c,OAAKrf,EAAW,IAAIqf,GAEzC,GAAKzc,aAAaL,IAAWK,EAAIL,EAAM0C,YAAYrC,EAAEhB,QAEjD,OADAgB,EAAEhB,WAAQ5B,EACH4C,EAEX,KAAM,CACFxO,KAAS,WACTsW,QAAS,oEAGjB25B,KAAM,SAAStgC,EAAO++B,GAClB,OAAOtB,GAAe+B,IAAI/B,GAAeh/B,IAAI,IAAK,IAAK,KAAMuB,EAAO++B,IAExEwB,MAAO,SAASvgC,EAAO++B,GACnB,OAAOtB,GAAe+B,IAAI/B,GAAeh/B,IAAI,EAAG,EAAG,GAAIuB,EAAO++B,KC1btE,SAASyB,GAAWC,EAAMhB,EAAQC,GAC9B,IAGIgB,EAKAC,EAEAC,EACAC,EAXEC,EAAKrB,EAAO1gC,MAKZgiC,EAAKrB,EAAO3gC,MAOZY,EAAI,GAEVihC,EAAKG,EAAKD,GAAM,EAAIC,GACpB,IAAK,IAAI5wC,EAAI,EAAGA,EAAI,EAAGA,IAGnB0wC,EAAKJ,EAFLC,EAAKjB,EAAOhhC,IAAItO,GAAK,IACrBwwC,EAAKjB,EAAOjhC,IAAItO,GAAK,KAEjBywC,IACAC,GAAME,EAAKJ,EAAKG,GAAMJ,EAChBK,GAAML,EAAKC,EAAKE,KAAQD,GAElCjhC,EAAExP,GAAU,IAAL0wC,EAGX,OAAO,IAAIriC,EAAMmB,EAAGihC,GAGxB,IAAMI,GAA0B,CAC5BC,SAAU,SAASP,EAAIC,GACnB,OAAOD,EAAKC,GAEhBO,OAAQ,SAASR,EAAIC,GACjB,OAAOD,EAAKC,EAAKD,EAAKC,GAE1BQ,QAAS,SAAST,EAAIC,GAElB,OADAD,GAAM,IACQ,EACVM,GAAwBC,SAASP,EAAIC,GACrCK,GAAwBE,OAAOR,EAAK,EAAGC,IAE/CS,UAAW,SAASV,EAAIC,GACpB,IAAI7/B,EAAI,EACJ5R,EAAIwxC,EAMR,OALIC,EAAK,KACLzxC,EAAI,EACJ4R,EAAK4/B,EAAK,IAAQllC,KAAK6lC,KAAKX,KACpB,GAAKA,EAAK,IAAMA,EAAK,GAAKA,GAE/BA,GAAM,EAAI,EAAIC,GAAMzxC,GAAK4R,EAAI4/B,IAExCY,UAAW,SAASZ,EAAIC,GACpB,OAAOK,GAAwBG,QAAQR,EAAID,IAE/Ca,WAAY,SAASb,EAAIC,GACrB,OAAOnlC,KAAKgmC,IAAId,EAAKC,IAEzBc,UAAW,SAASf,EAAIC,GACpB,OAAOD,EAAKC,EAAK,EAAID,EAAKC,GAI9Be,QAAS,SAAShB,EAAIC,GAClB,OAAQD,EAAKC,GAAM,GAEvBgB,SAAU,SAASjB,EAAIC,GACnB,OAAO,EAAInlC,KAAKgmC,IAAId,EAAKC,EAAK,KAItC,IAAK,IAAMhgB,MAAKqgB,GACRA,GAAwB9zC,eAAeyzB,MACvC6f,GAAW7f,IAAK6f,GAAW1vC,KAAK,KAAMkwC,GAAwBrgB,UCpEhEihB,GAAmB,SAAA9kC,GAMrB,OAHcC,MAAMC,QAAQF,EAAKe,OAC7Bf,EAAKe,MAAQd,MAAMD,OAKZ,CACX+kC,MAAO,SAAS/8B,GACZ,OAAOA,GAEXg9B,IAAK,eAAS,aAAAC,mBAAAA,IAAAC,kBACV,OAAoB,IAAhBA,EAAKzzC,OACEyzC,EAAK,GAET,IAAIv4B,EAAMu4B,IAErBv6B,QAAS,SAASw6B,EAAQxkC,GAItB,OAFAA,EAAQA,EAAMI,MAAQ,EAEf+jC,GAAiBK,GAAQxkC,IAEpClP,OAAQ,SAAS0zC,GACb,OAAO,IAAIxqB,GAAUmqB,GAAiBK,GAAQ1zC,SAUlD2zC,MAAO,SAAS1N,EAAOmB,EAAKwM,GACxB,IAAIC,EACAC,EACAC,EAAY,EACVC,EAAO,GACT5M,GACA0M,EAAK1M,EACLyM,EAAO5N,EAAM32B,MACTskC,IACAG,EAAYH,EAAKtkC,SAIrBukC,EAAO,EACPC,EAAK7N,GAGT,IAAK,IAAIrkC,EAAIiyC,EAAMjyC,GAAKkyC,EAAGxkC,MAAO1N,GAAKmyC,EACnCC,EAAKtyC,KAAK,IAAIwnB,GAAUtnB,EAAGkyC,EAAG3qB,OAGlC,OAAO,IAAIgB,GAAW6pB,IAE1BC,KAAM,SAASD,EAAME,GAAf,IAEEjhB,EACAkhB,SAFE3zB,EAAQ,GAIR4zB,EAAU,SAAArnB,GACZ,OAAIA,aAAe3e,EACR2e,EAAI9Z,KAAK8M,EAAKlR,SAElBke,GAUPonB,GAPAH,EAAK1kC,OAAW0kC,aAAgBK,GAMzBL,EAAKzyB,QACD6yB,EAAQJ,EAAKzyB,SAASf,MAC1BwzB,EAAKxzB,MACDwzB,EAAKxzB,MAAMnQ,IAAI+jC,GACnB5lC,MAAMC,QAAQulC,GACVA,EAAK3jC,IAAI+jC,GAET,CAACA,EAAQJ,IAZhBxlC,MAAMC,QAAQulC,EAAK1kC,OACR0kC,EAAK1kC,MAAMe,IAAI+jC,GAEf,CAACA,EAAQJ,EAAK1kC,QAYjC,IAAIglC,EAAY,SACZC,EAAU,OACVC,EAAY,SAEZN,EAAGtjB,QACH0jB,EAAYJ,EAAGtjB,OAAO,IAAMsjB,EAAGtjB,OAAO,GAAG9U,KACzCy4B,EAAUL,EAAGtjB,OAAO,IAAMsjB,EAAGtjB,OAAO,GAAG9U,KACvC04B,EAAYN,EAAGtjB,OAAO,IAAMsjB,EAAGtjB,OAAO,GAAG9U,KACzCo4B,EAAKA,EAAG1zB,OAER0zB,EAAKA,EAAG3yB,QAGZ,IAAK,IAAI3f,EAAI,EAAGA,EAAIuyC,EAASn0C,OAAQ4B,IAAK,CACtC,IAAIiR,SACAvD,SACEub,EAAOspB,EAASvyC,GAClBipB,aAAgBhP,GAChBhJ,EAA2B,iBAAdgY,EAAK/O,KAAoB+O,EAAK/O,KAAO+O,EAAK/O,KAAK,GAAGxM,MAC/DA,EAAQub,EAAKvb,QAEbuD,EAAM,IAAIqW,GAAUtnB,EAAI,GACxB0N,EAAQub,GAGRA,aAAgBvN,IAIpB2V,EAAWihB,EAAG1zB,MAAMzN,MAAM,GACtBuhC,GACArhB,EAASvxB,KAAK,IAAIma,EAAYy4B,EAC1BhlC,GACA,GAAO,EAAOpO,KAAKgO,MAAOhO,KAAK0S,kBAEnC4gC,GACAvhB,EAASvxB,KAAK,IAAIma,EAAY24B,EAC1B,IAAItrB,GAAUtnB,EAAI,IAClB,GAAO,EAAOV,KAAKgO,MAAOhO,KAAK0S,kBAEnC2gC,GACAthB,EAASvxB,KAAK,IAAIma,EAAY04B,EAC1B1hC,GACA,GAAO,EAAO3R,KAAKgO,MAAOhO,KAAK0S,kBAGvC4M,EAAM9e,KAAK,IAAI4e,EAAQ,CAAE,MAAc,CAAE,IAAI7M,EAAQ,GAAI,QACrDwf,EACAihB,EAAGzzB,cACHyzB,EAAGrgC,oBAIX,OAAO,IAAIyM,EAAQ,CAAE,MAAc,CAAE,IAAI7M,EAAQ,GAAI,QACjD+M,EACA0zB,EAAGzzB,cACHyzB,EAAGrgC,kBACLZ,KAAK/R,KAAK2N,WCzJd4lC,GAAa,SAACC,EAAIvrB,EAAM5S,GAC1B,KAAMA,aAAa2S,IACf,KAAM,CAAEpnB,KAAM,WAAYsW,QAAS,6BAOvC,OALY,MAAR+Q,EACAA,EAAO5S,EAAE4S,KAET5S,EAAIA,EAAEmT,QAEH,IAAIR,GAAUwrB,EAAGtrB,WAAW7S,EAAEjH,QAAS6Z,ICT5CwrB,GAAgB,CAElBC,KAAO,KACP7E,MAAO,KACP+C,KAAO,KACPG,IAAO,KACPvnC,IAAO,GACPmpC,IAAO,GACPC,IAAO,GACPC,KAAO,MACPC,KAAO,MACPC,KAAO,OAGX,IAAK,IAAM7iB,MAAKuiB,GACRA,GAAch2C,eAAeyzB,MAC7BuiB,GAAcviB,IAAK8iB,GAAW3yC,KAAK,KAAM0K,KAAKmlB,IAAIuiB,GAAcviB,MAIxEuiB,GAAc5jC,MAAQ,SAACwF,EAAG6b,GACtB,IAAM+iB,OAAwB,IAAN/iB,EAAoB,EAAIA,EAAE9iB,MAClD,OAAO4lC,IAAW,SAAAE,GAAO,OAAAA,EAAIrlC,QAAQolC,KAAW,KAAM5+B,ICpB1D,IAAM8+B,GAAS,SAAUC,EAAO1jC,GAE5B,QADAA,EAAOpD,MAAMyC,UAAU8B,MAAM2B,KAAK9C,IACrB5R,QACT,KAAK,EAAG,KAAM,CAAE8B,KAAM,WAAYsW,QAAS,kCAE/C,IAAIxW,EACAsT,EACAytB,EACA4S,EACAC,EACArsB,EACAssB,EACAC,EAGAC,EAAS,GAEPjC,EAAS,GAEf,IAAK9xC,EAAI,EAAGA,EAAIgQ,EAAK5R,OAAQ4B,IAEzB,IADA+gC,EAAU/wB,EAAKhQ,cACUsnB,GAWzB,GAHAusB,EAAsB,MADtBtsB,EAA0C,MAD1CosB,EAA6C,KAA5B5S,EAAQxZ,KAAKnY,iBAAmCtD,IAAdgoC,EAA0B,IAAIxsB,GAAUyZ,EAAQrzB,MAAOomC,GAAWhsB,QAAUiZ,EAAQjZ,SACjHP,KAAKnY,iBAAoCtD,IAAf+nC,EAA2BA,EAAaF,EAAepsB,KAAKnY,kBACjEtD,IAAf+nC,GAAqC,KAATtsB,GAAoD,KAArCwsB,EAAM,GAAGjsB,QAAQP,KAAKnY,WAAoBmY,EAAOssB,EACxHC,EAAqB,KAATvsB,QAA6Bzb,IAAdgoC,EAA0B/S,EAAQxZ,KAAKnY,WAAa0kC,OAErEhoC,KADVwH,OAAmBxH,IAAfgmC,EAAO,KAA8B,KAATvqB,GAAeA,IAASssB,EAAa/B,EAAO,IAAMA,EAAOvqB,IASzFqsB,EAAgD,KAA7BG,EAAMzgC,GAAGiU,KAAKnY,iBAAmCtD,IAAdgoC,EAA0B,IAAIxsB,GAAUysB,EAAMzgC,GAAG5F,MAAOomC,GAAWhsB,QAAUisB,EAAMzgC,GAAGwU,SACvI4rB,GAASC,EAAejmC,MAAQkmC,EAAiBlmC,QACjDgmC,GAASC,EAAejmC,MAAQkmC,EAAiBlmC,SAClDqmC,EAAMzgC,GAAKytB,OAXf,CACI,QAAmBj1B,IAAf+nC,GAA4BtsB,IAASssB,EACrC,KAAM,CAAE3zC,KAAM,WAAYsW,QAAS,sBAEvCs7B,EAAOvqB,GAAQwsB,EAAM31C,OACrB21C,EAAMj0C,KAAKihC,QAfPn0B,MAAMC,QAAQmD,EAAKhQ,GAAG0N,QACtBd,MAAMyC,UAAUvP,KAAK6gB,MAAM3Q,EAAMpD,MAAMyC,UAAU8B,MAAM2B,KAAK9C,EAAKhQ,GAAG0N,QAuBhF,OAAoB,GAAhBqmC,EAAM31C,OACC21C,EAAM,IAEjB/jC,EAAO+jC,EAAMtlC,KAAI,SAAUX,GAAK,OAAOA,EAAE6B,MAAMrQ,KAAK2N,YAAaO,KAAKlO,KAAK2N,QAAQ8C,SAAW,IAAM,MAC7F,IAAI2J,GAAag6B,EAAQ,MAAQ,WAAS1jC,YAGtC,CACXf,IAAK,eAAS,aAAA2iC,mBAAAA,IAAA5hC,kBACV,IACI,OAAOyjC,IAAO,EAAMzjC,GACtB,MAAOjR,MAEbiQ,IAAK,eAAS,aAAA4iC,mBAAAA,IAAA5hC,kBACV,IACI,OAAOyjC,IAAO,EAAOzjC,GACvB,MAAOjR,MAEbi1C,QAAS,SAAU7oB,EAAK5D,GACpB,OAAO4D,EAAItD,UAAUN,EAAK7Z,QAE9BumC,GAAI,WACA,OAAO,IAAI3sB,GAAUjc,KAAKC,KAE9B4oC,IAAK,SAASpmC,EAAGC,GACb,OAAO,IAAIuZ,GAAUxZ,EAAEJ,MAAQK,EAAEL,MAAOI,EAAEyZ,OAE9C7X,IAAK,SAASoB,EAAGqjC,GACb,GAAiB,iBAANrjC,GAA+B,iBAANqjC,EAChCrjC,EAAI,IAAIwW,GAAUxW,GAClBqjC,EAAI,IAAI7sB,GAAU6sB,QACf,KAAMrjC,aAAawW,IAAgB6sB,aAAa7sB,IACnD,KAAM,CAAEpnB,KAAM,WAAYsW,QAAS,6BAGvC,OAAO,IAAI8Q,GAAUjc,KAAKqE,IAAIoB,EAAEpD,MAAOymC,EAAEzmC,OAAQoD,EAAEyW,OAEvD6sB,WAAY,SAAUz/B,GAGlB,OAFe2+B,IAAW,SAAAE,GAAO,OAAM,IAANA,IAAW,IAAK7+B,QCpF1C,CACX5V,EAAG,SAAU2Y,GACT,OAAO,IAAI4S,GAAO,IAAK5S,aAAe2V,GAAa3V,EAAI28B,UAAY38B,EAAIhK,OAAO,IAElFy7B,OAAQ,SAAUzxB,GACd,OAAO,IAAIgC,EACP46B,UAAU58B,EAAIhK,OAAOjR,QAAQ,KAAM,OAAOA,QAAQ,KAAM,OAAOA,QAAQ,KAAM,OAAOA,QAAQ,KAAM,OAC7FA,QAAQ,MAAO,OAAOA,QAAQ,MAAO,SAElDA,QAAS,SAAU6wB,EAAQinB,EAAShjB,EAAaijB,GAC7C,IAAIt+B,EAASoX,EAAO5f,MAIpB,OAHA6jB,EAAoC,WAArBA,EAAYrxB,KACvBqxB,EAAY7jB,MAAQ6jB,EAAY5hB,QACpCuG,EAASA,EAAOzZ,QAAQ,IAAIkqB,OAAO4tB,EAAQ7mC,MAAO8mC,EAAQA,EAAM9mC,MAAQ,IAAK6jB,GACtE,IAAIjH,GAAOgD,EAAO7C,OAAS,GAAIvU,EAAQoX,EAAO9C,UAEzDiqB,IAAK,SAAUnnB,GAIX,IAHA,IAAMtd,EAAOpD,MAAMyC,UAAU8B,MAAM2B,KAAKM,UAAW,GAC/C8C,EAASoX,EAAO5f,iBAEX1N,GAELkW,EAASA,EAAOzZ,QAAQ,WAAW,SAAAi4C,GAC/B,IAAMhnC,EAA2B,WAAjBsC,EAAKhQ,GAAGE,MACpBw0C,EAAMlmC,MAAM,MAASwB,EAAKhQ,GAAG0N,MAAQsC,EAAKhQ,GAAG2P,QACjD,OAAO+kC,EAAMlmC,MAAM,UAAYmmC,mBAAmBjnC,GAASA,MAL1D1N,EAAI,EAAGA,EAAIgQ,EAAK5R,OAAQ4B,MAAxBA,GAST,OADAkW,EAASA,EAAOzZ,QAAQ,MAAO,KACxB,IAAI6tB,GAAOgD,EAAO7C,OAAS,GAAIvU,EAAQoX,EAAO9C,WCxBvDoqB,GAAM,SAACjgC,EAAGkgC,GAAS,OAAClgC,aAAakgC,EAAQt7B,EAAQC,KAAOD,EAAQE,OAChEq7B,GAAS,SAACngC,EAAG4S,GACf,QAAazb,IAATyb,EACA,KAAM,CAAErnB,KAAM,WAAYsW,QAAS,mDAGvC,GAAoB,iBADpB+Q,EAA6B,iBAAfA,EAAK7Z,MAAqB6Z,EAAK7Z,MAAQ6Z,GAEjD,KAAM,CAAErnB,KAAM,WAAYsW,QAAS,2DAEvC,OAAQ7B,aAAa2S,IAAc3S,EAAE4S,KAAKhB,GAAGgB,GAAQhO,EAAQC,KAAOD,EAAQE,UAGjE,CACXs7B,UAAW,SAAUpgC,GACjB,OAAOigC,GAAIjgC,EAAGmR,IAElBkvB,QAAS,SAAUrgC,GACf,OAAOigC,GAAIjgC,EAAGtG,IAElB4mC,SAAU,SAAUtgC,GAChB,OAAOigC,GAAIjgC,EAAG2S,KAElB4tB,SAAU,SAAUvgC,GAChB,OAAOigC,GAAIjgC,EAAG2V,KAElB6qB,UAAW,SAAUxgC,GACjB,OAAOigC,GAAIjgC,EAAG4E,IAElB67B,MAAO,SAAUzgC,GACb,OAAOigC,GAAIjgC,EAAGuW,KAElBmqB,QAAS,SAAU1gC,GACf,OAAOmgC,GAAOngC,EAAG,OAErB2gC,aAAc,SAAU3gC,GACpB,OAAOmgC,GAAOngC,EAAG,MAErB4gC,KAAM,SAAU5gC,GACZ,OAAOmgC,GAAOngC,EAAG,OAErBmgC,UACAvtB,KAAM,SAAU4D,EAAK5D,GACjB,KAAM4D,aAAe7D,IACjB,KAAM,CAAEpnB,KAAM,WACVsW,QAAS,+CAA8C2U,aAAe/C,GAAY,oCAAsC,KAWhI,OAPQb,EAFJA,EACIA,aAAgBhO,EACTgO,EAAK7Z,MAEL6Z,EAAK5X,QAGT,GAEJ,IAAI2X,GAAU6D,EAAIzd,MAAO6Z,IAEpCiuB,WAAY,SAAU7gC,GAClB,OAAO,IAAI+E,EAAU/E,EAAE4S,oBCpDhBxmB,GACX,IAAMR,EAAY,CAAEyf,mBAAkB8I,mBAetC,OAZA9I,EAAiB/B,YAAY+pB,IAC7BhoB,EAAiB5S,IAAI,UAAWkR,EAAYjN,KAAK1Q,KAAK2d,IACtD0B,EAAiB/B,YAAYpO,IAC7BmQ,EAAiB/B,YAAYw3B,IAC7Bz1B,EAAiB/B,qBClBNld,GAEX,IAAM20C,EAAW,SAACC,EAAchpC,GAAS,OAAA,IAAIue,GAAIve,EAAMgpC,EAAaroC,MAAOqoC,EAAa3jC,iBAAiBX,KAAKskC,EAAa1oC,UAE3H,MAAO,CAAE2oC,WAAY,SAASC,EAAcC,GAEnCA,IACDA,EAAeD,EACfA,EAAe,MAGnB,IAAIE,EAAWF,GAAgBA,EAAanoC,MACxCsoC,EAAWF,EAAapoC,MACtBsE,EAAkB1S,KAAK0S,gBACvBlR,EAAmBkR,EAAgB+D,YACrC/D,EAAgBlR,iBAAmBkR,EAAgBikC,UAEjDC,EAAgBF,EAAS9lC,QAAQ,KACnC0b,EAAW,IACQ,IAAnBsqB,IACAtqB,EAAWoqB,EAAS7kC,MAAM+kC,GAC1BF,EAAWA,EAAS7kC,MAAM,EAAG+kC,IAEjC,IAAMjpC,EAAUkpC,EAAY72C,KAAK2N,SACjCA,EAAQmpC,WAAY,EAEpB,IAAMh1C,EAAcL,EAAYs1C,eAAeL,EAAUl1C,EAAkBmM,EAASlM,GAAa,GAEjG,IAAKK,EACD,OAAOs0C,EAASp2C,KAAMw2C,GAG1B,IAAIQ,GAAY,EAGhB,GAAKT,EAcDS,EAAY,WAAW76B,KAAKs6B,OAdb,CAIf,GAAiB,mBAFjBA,EAAWh1C,EAAYw1C,WAAWP,IAG9BM,GAAY,MACT,CAEH,IAAM5W,EAAU3+B,EAAYy1C,cAAcT,GAC1CO,EAAY,CAAC,WAAY,SAASpmC,QAAQwvB,GAAW,EAErD4W,IAAaP,GAAY,WAMjC,IAAMU,EAAWr1C,EAAYs1C,aAAaV,EAAUl1C,EAAkBmM,EAASlM,GAC/E,IAAK01C,EAAS9/B,SAEV,OADA1V,EAAOzB,KAAK,iCAAiCw2C,6BACtCN,EAASp2C,KAAMw2C,GAAgBD,GAE1C,IAAIc,EAAMF,EAAS9/B,SACnB,GAAI2/B,IAAcv1C,EAAY61C,aAC1B,OAAOlB,EAASp2C,KAAMw2C,GAK1B,IAAMe,EAAM,QAAQd,OAFpBY,EAAML,EAAYv1C,EAAY61C,aAAaD,GAAOhC,mBAAmBgC,IAE/B/qB,EAEtC,OAAO,IAAIV,GAAI,IAAIZ,GAAO,IAAIusB,MAAQA,GAAK,EAAOv3C,KAAKgO,MAAOhO,KAAK0S,iBAAkB1S,KAAKgO,MAAOhO,KAAK0S,mBDhD7E8kC,CAAQ/1C,IACrCif,EAAiB/B,YAAYm0B,IAC7BpyB,EAAiB/B,YAAYrI,IAC7BoK,EAAiB/B,YAAYyvB,IAC7B1tB,EAAiB/B,YAAYqP,IAC7BtN,EAAiB/B,YErBV,CAAE84B,eAAgB,SAASC,GAC9B,IAAIC,EACAC,EAIAzkB,EAEAzyB,EACA6P,EACAsnC,EACAC,EACAxoC,EATAyoC,EAAe,SACfC,EAAqB,mCACnBC,EAAY,CAACxnC,UAAU,GAEvBynC,EAAiBR,EAAUrnC,MAAM4nC,GAOvC,SAASE,IACL,KAAM,CAAEv3C,KAAM,WACVsW,QAAS,yIAejB,OAXwB,GAApBpD,UAAUhV,QACNgV,UAAU,GAAG1F,MAAMtP,OAAS,GAC5Bq5C,IAEJR,EAAQ7jC,UAAU,GAAG1F,OACd0F,UAAUhV,OAAS,EAC1Bq5C,IAEAR,EAAQrqC,MAAMyC,UAAU8B,MAAM2B,KAAKM,UAAW,GAG1CokC,GACJ,IAAK,YACDN,EAAuB,oCACvB,MACJ,IAAK,WACDA,EAAuB,oCACvB,MACJ,IAAK,kBACDA,EAAuB,sCACvB,MACJ,IAAK,eACDA,EAAuB,sCACvB,MACJ,IAAK,UACL,IAAK,oBACDG,EAAe,SACfH,EAAuB,4BACvBI,EAAqB,2CACrB,MACJ,QACI,KAAM,CAAEp3C,KAAM,WAAYsW,QAAS,oHAK3C,IAFAic,EAAW,8DAA8D4kB,qBAA+BH,MAEnGl3C,EAAI,EAAGA,EAAIi3C,EAAM74C,OAAQ4B,GAAK,EAC3Bi3C,EAAMj3C,aAAcuoB,IACpB1Y,EAAQonC,EAAMj3C,GAAG0N,MAAM,GACvBypC,EAAWF,EAAMj3C,GAAG0N,MAAM,KAE1BmC,EAAQonC,EAAMj3C,GACdm3C,OAAWrrC,GAGT+D,aAAiBxB,KAAoB,IAANrO,GAAWA,EAAI,IAAMi3C,EAAM74C,cAAwB0N,IAAbqrC,GAA6BA,aAAoB7vB,KACxHmwB,IAEJL,EAAgBD,EAAWA,EAASxnC,MAAM4nC,GAAmB,IAANv3C,EAAU,KAAO,OACxE4O,EAAQiB,EAAMjB,MACd6jB,GAAY,iBAAiB2kB,mBAA8BvnC,EAAMS,aAAW1B,EAAQ,EAAI,kBAAkBA,MAAW,SAOzH,OALA6jB,GAAY,KAAK4kB,oBAA8BC,6BAE/C7kB,EAAWkiB,mBAAmBliB,GAGvB,IAAIvH,GAAI,IAAIZ,GAAO,KAD1BmI,EAAW,sBAAsBA,OACUA,GAAU,EAAOnzB,KAAKgO,MAAOhO,KAAK0S,iBAAkB1S,KAAKgO,MAAOhO,KAAK0S,oBFvDpHgO,EAAiB/B,YAAYy5B,IAEtBn3C,eG3Basf,EAAMljB,GAE1B,IAAIg7C,EACAx2B,GAFJxkB,EAAUA,GAAW,IAEGwkB,UAClBy2B,EAAU,IAAI77B,EAASY,KAAKhgB,GAeT,iBAAdwkB,GAA2BvU,MAAMC,QAAQsU,KAChDA,EAAYhV,OAAO+R,KAAKiD,GAAW1S,KAAI,SAAU4E,GAC7C,IAAI3F,EAAQyT,EAAU9N,GAQtB,OANM3F,aAAiB8lB,GAAKla,QAClB5L,aAAiB8lB,GAAKjL,aACxB7a,EAAQ,IAAI8lB,GAAKjL,WAAW,CAAC7a,KAEjCA,EAAQ,IAAI8lB,GAAKla,MAAM,CAAC5L,KAErB,IAAI8lB,GAAKvZ,YAAY,IAAI5G,EAAK3F,GAAO,EAAO,KAAM,MAE7DkqC,EAAQh7B,OAAS,CAAC,IAAI4W,GAAK9U,QAAQ,KAAMyC,KAG7C,IAQIpS,EACA8oC,EATE5tB,EAAW,CACb,IAAItc,GAAQqwB,oBACZ,IAAIrwB,GAAQ+yB,6BAA4B,GACxC,IAAI/yB,GAAQgzB,cACZ,IAAIhzB,GAAQuc,aAAa,CAACna,SAAUgK,QAAQpd,EAAQoT,aAGlD+nC,EAAkB,GASxB,GAAIn7C,EAAQuE,cAAe,CACvB22C,EAAkBl7C,EAAQuE,cAAcyM,UACxC,IAAK,IAAI3N,EAAI,EAAGA,EAAI,EAAGA,IAEnB,IADA63C,EAAgBE,QACRhpC,EAAI8oC,EAAgBxrC,OACpB0C,EAAEipC,iBACQ,IAANh4C,IAA2C,IAAhC83C,EAAgB5nC,QAAQnB,KACnC+oC,EAAgBh4C,KAAKiP,GACrBA,EAAEsoB,IAAIxX,IAIA,IAAN7f,IAAoC,IAAzBiqB,EAAS/Z,QAAQnB,KACxBA,EAAEkpC,aACFhuB,EAAS9J,QAAQpR,GAGjBkb,EAASnqB,KAAKiP,IAQtC4oC,EAAY93B,EAAKxO,KAAKumC,GAEtB,IAAS53C,EAAI,EAAGA,EAAIiqB,EAAS7rB,OAAQ4B,IACjCiqB,EAASjqB,GAAGq3B,IAAIsgB,GAIpB,GAAIh7C,EAAQuE,cAER,IADA22C,EAAgBE,QACRhpC,EAAI8oC,EAAgBxrC,QACK,IAAzB4d,EAAS/Z,QAAQnB,KAA6C,IAAhC+oC,EAAgB5nC,QAAQnB,IACtDA,EAAEsoB,IAAIsgB,GAKlB,OAAOA,EC5FX,IA0JIO,iBAzJA,WAAYluB,GACR1qB,KAAK0qB,KAAOA,EACZ1qB,KAAK2qB,SAAW,GAChB3qB,KAAKonC,cAAgB,GACrBpnC,KAAK64C,eAAiB,GACtB74C,KAAK84C,iBAAmB,GACxB94C,KAAKe,aAAe,GACpBf,KAAKizC,UAAY,EACjBjzC,KAAK+4C,YAAc,GACnB/4C,KAAKg5C,OAAS,IAAItuB,EAAKuuB,aAAavuB,GA8I5C,OAvIIwuB,uBAAA,SAAWpkB,GACP,GAAIA,EACA,IAAK,IAAIp0B,EAAI,EAAGA,EAAIo0B,EAAQh2B,OAAQ4B,IAChCV,KAAKs0B,UAAUQ,EAAQp0B,KAUnCw4C,sBAAA,SAAU3kB,EAAQhzB,EAAUmf,GACxB1gB,KAAK84C,iBAAiBt4C,KAAK+zB,GACvBhzB,IACAvB,KAAK+4C,YAAYx3C,GAAYgzB,GAE7BA,EAAO4kB,SACP5kB,EAAO4kB,QAAQn5C,KAAK0qB,KAAM1qB,KAAM0gB,GAAoB1gB,KAAK0qB,KAAKzpB,UAAUyf,mBAQhFw4B,gBAAA,SAAI33C,GACA,OAAOvB,KAAK+4C,YAAYx3C,IAQ5B23C,uBAAA,SAAW7qC,GACPrO,KAAK2qB,SAASnqB,KAAK6N,IAQvB6qC,4BAAA,SAAgBE,EAAcC,GAC1B,IAAIC,EACJ,IAAKA,EAAkB,EAAGA,EAAkBt5C,KAAKonC,cAActoC,UACvDkB,KAAKonC,cAAckS,GAAiBD,UAAYA,GADeC,KAKvEt5C,KAAKonC,cAAczmC,OAAO24C,EAAiB,EAAG,CAACF,eAAcC,cAQjEH,6BAAA,SAAiBK,EAAeF,GAC5B,IAAIC,EACJ,IAAKA,EAAkB,EAAGA,EAAkBt5C,KAAK64C,eAAe/5C,UACxDkB,KAAK64C,eAAeS,GAAiBD,UAAYA,GADeC,KAKxEt5C,KAAK64C,eAAel4C,OAAO24C,EAAiB,EAAG,CAACC,gBAAeF,cAOnEH,2BAAA,SAAeM,GACXx5C,KAAKe,aAAaP,KAAKg5C,IAQ3BN,6BAAA,WAEI,IADA,IAAM9R,EAAgB,GACb1mC,EAAI,EAAGA,EAAIV,KAAKonC,cAActoC,OAAQ4B,IAC3C0mC,EAAc5mC,KAAKR,KAAKonC,cAAc1mC,GAAG04C,cAE7C,OAAOhS,GAQX8R,8BAAA,WAEI,IADA,IAAML,EAAiB,GACdn4C,EAAI,EAAGA,EAAIV,KAAK64C,eAAe/5C,OAAQ4B,IAC5Cm4C,EAAer4C,KAAKR,KAAK64C,eAAen4C,GAAG64C,eAE/C,OAAOV,GAQXK,wBAAA,WACI,OAAOl5C,KAAK2qB,UAGhBuuB,oBAAA,WACI,IAAMtsC,EAAO5M,KACb,MAAO,CACHy4C,MAAO,WAEH,OADA7rC,EAAKqmC,UAAY,EACVrmC,EAAK+d,SAAS/d,EAAKqmC,WAE9BlmC,IAAK,WAED,OADAH,EAAKqmC,UAAY,EACVrmC,EAAK+d,SAAS/d,EAAKqmC,aAUtCiG,4BAAA,WACI,OAAOl5C,KAAKe,mBAMd04C,GAAuB,SAAS/uB,EAAMgvB,GAIxC,OAHIA,GAAed,KACfA,GAAK,IAAIM,GAAcxuB,IAEpBkuB,IChJX,ICfIv7C,GACAsE,MDHJ,SAA0B8yB,GACxB,IAAIvlB,EAAQulB,EAAQvlB,MAAM,mFAC1B,IAAKA,EACH,MAAM,IAAIxP,MAAM,oBAAsB+0B,GAWxC,MARU,CACRklB,MAAOtqC,SAASH,EAAM,GAAI,IAC1B0qC,MAAOvqC,SAASH,EAAM,GAAI,IAC1B2qC,MAAOxqC,SAASH,EAAM,GAAI,IAC1B4qC,IAAK5qC,EAAM,IAAM,GACjB6qC,MAAO7qC,EAAM,IAAM,iBEUCzN,EAAaV,GACjC,IAAIi5C,EAAiBC,EAAkBC,EAAWC,EAKlDD,WCzBoBE,GA4DpB,kBA1DI,WAAY75B,EAAMlH,GACdrZ,KAAKugB,KAAOA,EACZvgB,KAAKqZ,QAAUA,EAsDvB,OAnDIghC,kBAAA,SAAMh9C,GACF,IAAIg7C,EAEA4B,EADErjC,EAAS,GAEf,IACIyhC,EAAYiC,GAAct6C,KAAKugB,KAAMljB,GACvC,MAAOoC,GACL,MAAM,IAAIsX,EAAUtX,EAAGO,KAAKqZ,SAGhC,IACI,IAAM5I,EAAWgK,QAAQpd,EAAQoT,UAC7BA,GACA9O,EAAOzB,KAAK,mIAIhB,IAAMq6C,EAAe,CACjB9pC,WACAmL,gBAAiBve,EAAQue,gBACzBmL,YAAatM,QAAQpd,EAAQ0pB,aAC7BpY,aAAc,GAEdtR,EAAQm9C,WACRP,EAAmB,IAAIG,EAAiB/8C,EAAQm9C,WAChD5jC,EAAO6V,IAAMwtB,EAAiB5pC,MAAMgoC,EAAWkC,EAAcv6C,KAAKqZ,UAElEzC,EAAO6V,IAAM4rB,EAAUhoC,MAAMkqC,GAEnC,MAAO96C,GACL,MAAM,IAAIsX,EAAUtX,EAAGO,KAAKqZ,SAGhC,GAAIhc,EAAQuE,cAER,IADA,IAAMi3C,EAAiBx7C,EAAQuE,cAAc64C,oBACpC/5C,EAAI,EAAGA,EAAIm4C,EAAe/5C,OAAQ4B,IACvCkW,EAAO6V,IAAMosB,EAAen4C,GAAG4mC,QAAQ1wB,EAAO6V,IAAK,CAAE+tB,UAAWP,EAAkB58C,UAASgc,QAASrZ,KAAKqZ,UAQjH,IAAK,IAAMqhC,KALPr9C,EAAQm9C,YACR5jC,EAAOzH,IAAM8qC,EAAiBU,wBAGlC/jC,EAAOyC,QAAU,GACErZ,KAAKqZ,QAAQuhC,MACxB56C,KAAKqZ,QAAQuhC,MAAMn9C,eAAei9C,IAASA,IAAS16C,KAAKqZ,QAAQwhC,cACjEjkC,EAAOyC,QAAQ7Y,KAAKk6C,GAG5B,OAAO9jC,QD/BHyjC,CADZJ,WE5BqBa,EAAiBr5C,GAgFtC,kBA9EI,WAAYpE,GACR2C,KAAK3C,QAAUA,EA2EvB,OAxEI+8C,kBAAA,SAAM1tC,EAAUrP,EAASgc,GACrB,IAAM2gC,EAAkB,IAAIc,EACxB,CACIC,wBAAyB1hC,EAAQmuB,qBACjC96B,WACAsuC,YAAa3hC,EAAQhC,SACrB4jC,kBAAmBj7C,KAAK3C,QAAQ49C,kBAChCC,aAAcl7C,KAAK3C,QAAQ69C,aAC3BC,eAAgBn7C,KAAK3C,QAAQ+9C,wBAC7BC,kBAAmBr7C,KAAK3C,QAAQg+C,kBAChCC,kBAAmBt7C,KAAK3C,QAAQi+C,kBAChCC,kBAAmBv7C,KAAK3C,QAAQk+C,kBAChCC,mBAAoBx7C,KAAK3C,QAAQm+C,mBACjCC,oBAAqBz7C,KAAK3C,QAAQo+C,oBAClCC,2BAA4B17C,KAAK3C,QAAQq+C,6BAG3CjvB,EAAMutB,EAAgB3pC,MAAMhT,GASlC,OARA2C,KAAKw6C,UAAYR,EAAgBQ,UACjCx6C,KAAKk7C,aAAelB,EAAgBkB,aAChCl7C,KAAK3C,QAAQs+C,yBACb37C,KAAK27C,uBAAyB3B,EAAgB4B,kBAAkB57C,KAAK3C,QAAQs+C,8BAE1CnvC,IAAnCxM,KAAK3C,QAAQg+C,wBAAyD7uC,IAAtBxM,KAAKk7C,eACrDl7C,KAAKk7C,aAAelB,EAAgB6B,eAAe77C,KAAKk7C,eAErDzuB,EAAMzsB,KAAK87C,mBAGtB1B,4BAAA,WAEI,IAAIc,EAAel7C,KAAKk7C,aACxB,GAAIl7C,KAAK3C,QAAQo+C,oBAAqB,CAClC,QAAuBjvC,IAAnBxM,KAAKw6C,UACL,MAAO,GAEXU,EAAe,gCAAgCz5C,EAAY61C,aAAat3C,KAAKw6C,WAGjF,OAAIx6C,KAAK3C,QAAQq+C,2BACN,GAGPR,EACO,wBAAwBA,QAE5B,IAGXd,iCAAA,WACI,OAAOp6C,KAAKw6C,WAGhBJ,iCAAA,SAAqBI,GACjBx6C,KAAKw6C,UAAYA,GAGrBJ,qBAAA,WACI,OAAOp6C,KAAK3C,QAAQo+C,qBAGxBrB,4BAAA,WACI,OAAOp6C,KAAKk7C,cAGhBd,8BAAA,WACI,OAAOp6C,KAAK3C,QAAQ+9C,yBAGxBhB,6BAAA,WACI,OAAOp6C,KAAK27C,6BFhDDvB,CADnBJ,WG3BqBv4C,GAoJrB,kBAlJI,WAAYpE,GACR2C,KAAK+7C,KAAO,GACZ/7C,KAAKg8C,UAAY3+C,EAAQqP,SACzB1M,KAAKi8C,aAAe5+C,EAAQ29C,YAC5Bh7C,KAAKk8C,yBAA2B7+C,EAAQ09C,wBACpC19C,EAAQ49C,oBACRj7C,KAAKm8C,mBAAqB9+C,EAAQ49C,kBAAkB99C,QAAQ,MAAO,MAEvE6C,KAAKo8C,gBAAkB/+C,EAAQ89C,eAC/Bn7C,KAAKk7C,aAAe79C,EAAQ69C,aACxB79C,EAAQg+C,oBACRr7C,KAAKq8C,mBAAqBh/C,EAAQg+C,kBAAkBl+C,QAAQ,MAAO,MAEnEE,EAAQi+C,mBACRt7C,KAAKs8C,mBAAqBj/C,EAAQi+C,kBAAkBn+C,QAAQ,MAAO,KACQ,MAAvE6C,KAAKs8C,mBAAmBrpC,OAAOjT,KAAKs8C,mBAAmBx9C,OAAS,KAChEkB,KAAKs8C,oBAAsB,MAG/Bt8C,KAAKs8C,mBAAqB,GAE9Bt8C,KAAKu8C,mBAAqBl/C,EAAQk+C,kBAClCv7C,KAAKw8C,+BAAiC/6C,EAAYg7C,wBAElDz8C,KAAK08C,YAAc,EACnB18C,KAAK28C,QAAU,EAuHvB,OApHI7B,2BAAA,SAAe39B,GAQX,OAPInd,KAAKq8C,oBAAgE,IAA1Cl/B,EAAKvM,QAAQ5Q,KAAKq8C,sBAEtB,QADvBl/B,EAAOA,EAAKqS,UAAUxvB,KAAKq8C,mBAAmBv9C,SACrCmU,OAAO,IAAkC,MAAnBkK,EAAKlK,OAAO,KACvCkK,EAAOA,EAAKqS,UAAU,KAIvBrS,GAGX29B,8BAAA,SAAkBv5C,GAGd,OAFAA,EAAWA,EAASpE,QAAQ,MAAO,KACnCoE,EAAWvB,KAAK67C,eAAet6C,IACvBvB,KAAKs8C,oBAAsB,IAAM/6C,GAG7Cu5C,gBAAA,SAAI/sC,EAAOf,EAAUgB,EAAOqM,GAGxB,GAAKtM,EAAL,CAIA,IAAI2J,EAAOklC,EAAaC,EAASC,EAAep8C,EAEhD,GAAIsM,GAAYA,EAASzL,SAAU,CAC/B,IAAIw7C,EAAc/8C,KAAKi8C,aAAajvC,EAASzL,UAe7C,GAZIvB,KAAKk8C,yBAAyBlvC,EAASzL,aAEvCyM,GAAShO,KAAKk8C,yBAAyBlvC,EAASzL,WACpC,IAAKyM,EAAQ,GAEzB+uC,EAAcA,EAAYlrC,MAAM7R,KAAKk8C,yBAAyBlvC,EAASzL,iBAOvDiL,IAAhBuwC,EAEA,YADA/8C,KAAK+7C,KAAKv7C,KAAKuN,GAMnB+uC,GADAF,GADAG,EAAcA,EAAYvtB,UAAU,EAAGxhB,IACbuB,MAAM,OACJqtC,EAAY99C,OAAS,GAMrD,GAFA+9C,GADAnlC,EAAQ3J,EAAMwB,MAAM,OACJmI,EAAM5Y,OAAS,GAE3BkO,GAAYA,EAASzL,SACrB,GAAK8Y,EAKD,IAAK3Z,EAAI,EAAGA,EAAIgX,EAAM5Y,OAAQ4B,IAC1BV,KAAKg9C,oBAAoBC,WAAW,CAAEC,UAAW,CAAE5nC,KAAMtV,KAAK08C,YAAch8C,EAAI,EAAG6U,OAAc,IAAN7U,EAAUV,KAAK28C,QAAU,GAChHhgC,SAAU,CAAErH,KAAMsnC,EAAY99C,OAAS4B,EAAG6U,OAAc,IAAN7U,EAAUo8C,EAAch+C,OAAS,GACnFq+C,OAAQn9C,KAAK47C,kBAAkB5uC,EAASzL,iBAPhDvB,KAAKg9C,oBAAoBC,WAAW,CAAEC,UAAW,CAAE5nC,KAAMtV,KAAK08C,YAAc,EAAGnnC,OAAQvV,KAAK28C,SACxFhgC,SAAU,CAAErH,KAAMsnC,EAAY99C,OAAQyW,OAAQunC,EAAch+C,QAC5Dq+C,OAAQn9C,KAAK47C,kBAAkB5uC,EAASzL,YAU/B,IAAjBmW,EAAM5Y,OACNkB,KAAK28C,SAAWE,EAAQ/9C,QAExBkB,KAAK08C,aAAehlC,EAAM5Y,OAAS,EACnCkB,KAAK28C,QAAUE,EAAQ/9C,QAG3BkB,KAAK+7C,KAAKv7C,KAAKuN,KAGnB+sC,oBAAA,WACI,OAA4B,IAArB96C,KAAK+7C,KAAKj9C,QAGrBg8C,kBAAA,SAAMntC,GAGF,GAFA3N,KAAKg9C,oBAAsB,IAAIh9C,KAAKw8C,+BAA+B,CAAE9B,KAAM16C,KAAKo8C,gBAAiBgB,WAAY,OAEzGp9C,KAAKu8C,mBACL,IAAK,IAAMh7C,KAAYvB,KAAKi8C,aACxB,GAAIj8C,KAAKi8C,aAAax+C,eAAe8D,GAAW,CAC5C,IAAI47C,EAASn9C,KAAKi8C,aAAa16C,GAC3BvB,KAAKk8C,yBAAyB36C,KAC9B47C,EAASA,EAAOtrC,MAAM7R,KAAKk8C,yBAAyB36C,KAExDvB,KAAKg9C,oBAAoBK,iBAAiBr9C,KAAK47C,kBAAkBr6C,GAAW47C,GAOxF,GAFAn9C,KAAKg8C,UAAUnuC,OAAOF,EAAS3N,MAE3BA,KAAK+7C,KAAKj9C,OAAS,EAAG,CACtB,IAAIo8C,SACEoC,EAAmB5/C,KAAK6/C,UAAUv9C,KAAKg9C,oBAAoBQ,UAE7Dx9C,KAAKk7C,aACLA,EAAel7C,KAAKk7C,aACbl7C,KAAKm8C,qBACZjB,EAAel7C,KAAKm8C,oBAExBn8C,KAAKk7C,aAAeA,EAEpBl7C,KAAKw6C,UAAY8C,EAGrB,OAAOt9C,KAAK+7C,KAAK7tC,KAAK,UHrHZ4sC,CADlBr5C,EAAc,IAAIH,EAAYG,EAAaV,IAEUU,IAErD04C,WIxBoB14C,GA+KpB,kBApKI,WAAYipB,EAAM/c,EAAS8vC,GACvBz9C,KAAK0qB,KAAOA,EACZ1qB,KAAK66C,aAAe4C,EAAal8C,SACjCvB,KAAKgd,MAAQrP,EAAQqP,OAAS,GAC9Bhd,KAAKqX,SAAW,GAChBrX,KAAKwnC,qBAAuB,GAC5BxnC,KAAK09C,KAAO/vC,EAAQ+vC,KACpB19C,KAAKF,MAAQ,KACbE,KAAK2N,QAAUA,EAEf3N,KAAK29C,MAAQ,GACb39C,KAAK46C,MAAQ,GAuJrB,OA5IIgD,iBAAA,SAAKzgC,EAAMkV,EAAoB3f,EAAiBq5B,EAAexkB,GAC3D,IAAM4yB,EAAgBn6C,KAAM69C,EAAe79C,KAAK2N,QAAQ/L,cAAco3C,OAEtEh5C,KAAK29C,MAAMn9C,KAAK2c,GAEhB,IAAM2gC,EAAiB,SAAUr+C,EAAG8gB,EAAMwY,GACtCohB,EAAcwD,MAAMh9C,OAAOw5C,EAAcwD,MAAM/sC,QAAQuM,GAAO,GAE9D,IAAM4gC,EAAqBhlB,IAAaohB,EAAcU,aAClD9O,EAAc7S,UAAYz5B,GAC1B8nB,EAAS,KAAM,CAACjI,MAAM,KAAK,EAAO,MAClC3d,EAAOxB,KAAK,YAAY44B,iFAMnBohB,EAAcS,MAAM7hB,IAAcgT,EAAchxB,SACjDo/B,EAAcS,MAAM7hB,GAAY,CAAExY,OAAMljB,QAAS0uC,IAEjDtsC,IAAM06C,EAAcr6C,QAASq6C,EAAcr6C,MAAQL,GACvD8nB,EAAS9nB,EAAG8gB,EAAMw9B,EAAoBhlB,KAIxCilB,EAAc,CAChBvnC,YAAazW,KAAK2N,QAAQ8I,YAC1BkgC,UAAWjkC,EAAgBikC,UAC3Bz4B,SAAUxL,EAAgBwL,SAC1B28B,aAAcnoC,EAAgBmoC,cAG5B/4C,EAAcL,EAAYs1C,eAAe55B,EAAMzK,EAAgBlR,iBAAkBxB,KAAK2N,QAASlM,GAErG,GAAKK,EAAL,CAKA,IA4DIm8C,EACAC,EA7DEC,EAAmB,SAASF,GAC9B,IAAI1pB,EACE6pB,EAAmBH,EAAW18C,SAC9B8V,EAAW4mC,EAAW5mC,SAASla,QAAQ,UAAW,IAUxD6gD,EAAYx8C,iBAAmBM,EAAY6qB,QAAQyxB,GAC/CJ,EAAYvnC,cACZunC,EAAY9/B,SAAWpc,EAAYoM,KAC9BisC,EAAcxsC,QAAQuQ,UAAY,GACnCpc,EAAYu8C,SAASL,EAAYx8C,iBAAkBw8C,EAAYrH,aAE9D70C,EAAYw8C,eAAeN,EAAY9/B,WAAapc,EAAYy8C,4BACjEP,EAAY9/B,SAAWpc,EAAYoM,KAAK8vC,EAAYrH,UAAWqH,EAAY9/B,YAGnF8/B,EAAYz8C,SAAW68C,EAEvB,IAAMI,EAAS,IAAI/hC,EAASM,MAAMo9B,EAAcxsC,SAEhD6wC,EAAO7W,gBAAiB,EACxBwS,EAAc9iC,SAAS+mC,GAAoB/mC,GAEvC3E,EAAgBma,WAAakf,EAAclf,aAC3CmxB,EAAYnxB,WAAY,GAGxBkf,EAAcnf,UACd2H,EAASspB,EAAaY,WAAWpnC,EAAUmnC,EAAQrE,EAAepO,EAAcM,WAAY2R,cACtEjnC,EAClB+mC,EAAevpB,EAAQ,KAAM6pB,GAG7BN,EAAe,KAAMvpB,EAAQ6pB,GAE1BrS,EAAchxB,OACrB+iC,EAAe,KAAMzmC,EAAU+mC,IAI3BjE,EAAcS,MAAMwD,IAChBjE,EAAcS,MAAMwD,GAAkB/gD,QAAQm7B,UAC9CuT,EAAcvT,SAKlB,IAAI6N,GAAOmY,EAAQrE,EAAe6D,GAAargD,MAAM0Z,GAAU,SAAU5X,EAAG8gB,GACxEu9B,EAAer+C,EAAG8gB,EAAM69B,MAJ5BN,EAAe,KAAM3D,EAAcS,MAAMwD,GAAkB79B,KAAM69B,IAWvEzwC,EAAUkpC,EAAY72C,KAAK2N,SAE7B0kB,IACA1kB,EAAQykB,IAAM2Z,EAAcnf,SAAW,MAAQ,SAG/Cmf,EAAcnf,UACdjf,EAAQ+vC,KAAO,yBAEX/vC,EAAQ+wC,WACRT,EAAaJ,EAAac,eAAexhC,EAAMzK,EAAgBlR,iBAAkBmM,EAASlM,EAAaK,GAEvGo8C,EAAUL,EAAae,WAAWzhC,EAAMzK,EAAgBlR,iBAAkBmM,EAASlM,EAAaK,IAIhG6L,EAAQ+wC,WACRT,EAAan8C,EAAYs1C,aAAaj6B,EAAMzK,EAAgBlR,iBAAkBmM,EAASlM,GAEvFy8C,EAAUp8C,EAAY+8C,SAAS1hC,EAAMzK,EAAgBlR,iBAAkBmM,EAASlM,GAC5E,SAAC2X,EAAK6kC,GACE7kC,EACA0kC,EAAe1kC,GAEf+kC,EAAiBF,MAKjCA,EACKA,EAAW18C,SAGZ48C,EAAiBF,GAFjBH,EAAeG,GAIZC,GACPA,EAAQY,KAAKX,EAAkBL,QAtG/BA,EAAe,CAAE5mC,QAAS,qCAAqCiG,UJ5C3DygC,CAAcn8C,GAE9B,IAsCIkvC,EAtCEoO,WK9Bct9C,EAAa44C,EAAWuD,GAC5C,IAAMmB,EAAS,SAAU3nC,EAAO/Z,EAASkqB,GASrC,GARuB,mBAAZlqB,GACPkqB,EAAWlqB,EACXA,EAAU2hD,EAAkBh/C,KAAK3C,QAAS,KAG1CA,EAAU2hD,EAAkBh/C,KAAK3C,QAASA,GAAW,KAGpDkqB,EAAU,CACX,IAAM03B,EAAOj/C,KACb,OAAO,IAAIk/C,SAAQ,SAAUC,EAASC,GAClCL,EAAOvrC,KAAKyrC,EAAM7nC,EAAO/Z,GAAS,SAAS+b,EAAKjL,GACxCiL,EACAgmC,EAAOhmC,GAEP+lC,EAAQhxC,SAKpBnO,KAAKrC,MAAMyZ,EAAO/Z,GAAS,SAAS+b,EAAKmH,EAAMlH,EAAShc,GACpD,GAAI+b,EAAO,OAAOmO,EAASnO,GAE3B,IAAIxC,EACJ,IAEIA,EADkB,IAAIyjC,EAAU95B,EAAMlH,GACnBhJ,MAAMhT,GAE7B,MAAO+b,GAAO,OAAOmO,EAASnO,GAE9BmO,EAAS,KAAM3Q,OAK3B,OAAOmoC,ELPQM,CAAO59C,EAAay4C,GAC7Bv8C,WM3Bc8D,EAAa44C,EAAWuD,GAC5C,IAAMjgD,EAAQ,SAAUyZ,EAAO/Z,EAASkqB,GAUpC,GARuB,mBAAZlqB,GACPkqB,EAAWlqB,EACXA,EAAU2hD,EAAkBh/C,KAAK3C,QAAS,KAG1CA,EAAU2hD,EAAkBh/C,KAAK3C,QAASA,GAAW,KAGpDkqB,EAAU,CACX,IAAM03B,EAAOj/C,KACb,OAAO,IAAIk/C,SAAQ,SAAUC,EAASC,GAClCzhD,EAAM6V,KAAKyrC,EAAM7nC,EAAO/Z,GAAS,SAAS+b,EAAKjL,GACvCiL,EACAgmC,EAAOhmC,GAEP+lC,EAAQhxC,SAKpB,IAAImxC,EACA7B,SACE8B,EAAgB,IAAIrG,GAAcl5C,MAAO3C,EAAQmiD,oBAMvD,GAJAniD,EAAQuE,cAAgB29C,EAExBD,EAAU,IAAI7iC,EAASM,MAAM1f,GAEzBA,EAAQogD,aACRA,EAAepgD,EAAQogD,iBACpB,CACH,IAAMl8C,EAAWlE,EAAQkE,UAAY,QAC/Bo1C,EAAYp1C,EAASpE,QAAQ,YAAa,KAChDsgD,EAAe,CACXl8C,WACAkV,YAAa6oC,EAAQ7oC,YACrByH,SAAUohC,EAAQphC,UAAY,GAC9B1c,iBAAkBm1C,EAClBA,YACAkE,aAAct5C,IAGD2c,UAAgD,MAApCu/B,EAAav/B,SAASrM,OAAO,KACtD4rC,EAAav/B,UAAY,KAIjC,IAAMuhC,EAAU,IAAI7B,EAAc59C,KAAMs/C,EAAS7B,GACjDz9C,KAAKm6C,cAAgBsF,EAKjBpiD,EAAQy3B,SACRz3B,EAAQy3B,QAAQtnB,SAAQ,SAAS+mB,GAC7B,IAAImrB,EAAYroC,EAChB,GAAIkd,EAAOorB,aAGP,GAFAtoC,EAAWkd,EAAOorB,YAAYxiD,QAAQ,UAAW,KACjDuiD,EAAaH,EAAcvG,OAAOyF,WAAWpnC,EAAUioC,EAASG,EAASlrB,EAAOl3B,QAASk3B,EAAOhzB,qBACtEwV,EACtB,OAAOwQ,EAASm4B,QAIpBH,EAAcjrB,UAAUC,MAKpC,IAAI8R,GAAOiZ,EAASG,EAAShC,GACxB9/C,MAAMyZ,GAAO,SAAU3X,EAAG8gB,GACvB,GAAI9gB,EAAK,OAAO8nB,EAAS9nB,GACzB8nB,EAAS,KAAMhH,EAAMk/B,EAASpiD,KAC/BA,IAGf,OAAOM,ENpDOof,CAAMtb,EAAay4C,EAAWC,GAEtC1qC,EAAImwC,YACJC,EAAU,CACZprB,QAAS,CAAChlB,EAAEkqC,MAAOlqC,EAAEmqC,MAAOnqC,EAAEoqC,OAC9BiG,OACA5rB,QACA5yB,cACA4wB,uBACAsB,wBACA/xB,cACAkpB,YACA0b,UACAplC,UAAWA,GAAUQ,GACrBgb,WACAq+B,gBAAiBd,EACjBI,iBAAkBH,EAClBI,UAAWH,EACX0D,cAAezD,EACf4E,SACAphD,QACAoZ,YACAujC,iBACAhb,QACA4Z,iBACAv3C,UAKEo+C,EAAO,SAASpP,GAClB,OAAO,WACH,IAAMj7B,EAAM7I,OAAOoL,OAAO04B,EAAE5gC,WAE5B,OADA4gC,EAAEtvB,MAAM3L,EAAKpI,MAAMyC,UAAU8B,MAAM2B,KAAKM,UAAW,IAC5C4B,IAITsqC,EAAMnzC,OAAOoL,OAAO4nC,GAC1B,IAAK,IAAMxqC,KAAKwqC,EAAQ3rB,KAGpB,GAAiB,mBADjByc,EAAIkP,EAAQ3rB,KAAK7e,IAEb2qC,EAAI3qC,EAAEzD,eAAiBmuC,EAAKpP,QAI5B,IAAK,IAAM1E,KADX+T,EAAI3qC,GAAKxI,OAAOoL,OAAO,MACP04B,EAEZqP,EAAI3qC,GAAG42B,EAAEr6B,eAAiBmuC,EAAKpP,EAAE1E,IAc7C,OAHA4T,EAAQliD,MAAQkiD,EAAQliD,MAAM0D,KAAK2+C,GACnCH,EAAQd,OAASc,EAAQd,OAAO19C,KAAK2+C,GAE9BA,ED1FX,IAAIC,GAAY,GAGVpsB,GAAc,aACpBA,GAAY9jB,UAAYlD,OAAOmD,OAAO,IAAIkiB,GAAuB,CAC7DqsB,mCACI,OAAO,GAGXrwC,cAAKokB,EAAUC,GACX,OAAKD,EAGEtyB,KAAK6yB,gBAAgBN,EAAWD,GAAUnV,KAFtCoV,GAKf2tB,eAAM1tB,EAAK5xB,EAAM2mB,EAAU44B,GACvB,IAAMC,EAAM,IAAIC,eACVC,GAAQjjD,GAAQkjD,gBAAiBljD,GAAQmjD,UAU/C,SAASC,EAAeL,EAAK74B,EAAU44B,GAC/BC,EAAIM,QAAU,KAAON,EAAIM,OAAS,IAClCn5B,EAAS64B,EAAIO,aACTP,EAAIQ,kBAAkB,kBACA,mBAAZT,GACdA,EAAQC,EAAIM,OAAQluB,GAbQ,mBAAzB4tB,EAAIS,kBACXT,EAAIS,iBAAiB,YAEzBl/C,GAAOvB,MAAM,iBAAiBoyB,OAC9B4tB,EAAIU,KAAK,MAAOtuB,EAAK8tB,GACrBF,EAAIW,iBAAiB,SAAUngD,GAAQ,4CACvCw/C,EAAIY,KAAK,MAWL3jD,GAAQkjD,iBAAmBljD,GAAQmjD,UAChB,IAAfJ,EAAIM,QAAiBN,EAAIM,QAAU,KAAON,EAAIM,OAAS,IACvDn5B,EAAS64B,EAAIO,cAEbR,EAAQC,EAAIM,OAAQluB,GAEjB8tB,EACPF,EAAIa,mBAAqB,WACC,GAAlBb,EAAIc,YACJT,EAAeL,EAAK74B,EAAU44B,IAItCM,EAAeL,EAAK74B,EAAU44B,IAItCgB,oBACI,OAAO,GAGXC,0BACInB,GAAY,IAGhBpB,kBAASt9C,EAAUC,EAAkBnE,EAASoE,GAItCD,IAAqBxB,KAAKs+C,eAAe/8C,KACzCA,EAAWC,EAAmBD,GAGlCA,EAAWlE,EAAQ+0B,IAAMpyB,KAAKqyB,mBAAmB9wB,EAAUlE,EAAQ+0B,KAAO7wB,EAE1ElE,EAAUA,GAAW,GAIrB,IACMH,EADY8C,KAAK6yB,gBAAgBtxB,EAAU5B,OAAO0hD,SAASnkD,MACrCs1B,IACtB5lB,EAAY5M,KAElB,OAAO,IAAIk/C,SAAQ,SAACC,EAASC,GACzB,GAAI/hD,EAAQikD,cAAgBrB,GAAU/iD,GAClC,IACI,IAAMqkD,EAAWtB,GAAU/iD,GAC3B,OAAOiiD,EAAQ,CAAE9nC,SAAUkqC,EAAUhgD,SAAUrE,EAAMskD,QAAS,CAAEC,aAAc,IAAIC,QACpF,MAAOjiD,GACL,OAAO2/C,EAAO,CAAE79C,SAAUrE,EAAMga,QAAS,sBAAsBha,gBAAkBuC,EAAEyX,UAI3FtK,EAAKszC,MAAMhjD,EAAMG,EAAQqgD,MAAM,SAAuBoC,EAAM2B,GAExDxB,GAAU/iD,GAAQ4iD,EAGlBX,EAAQ,CAAE9nC,SAAUyoC,EAAMv+C,SAAUrE,EAAMskD,QAAS,CAAEC,qBACtD,SAAoBf,EAAQluB,GAC3B4sB,EAAO,CAAEx+C,KAAM,OAAQsW,QAAS,IAAIsb,qBAAsBkuB,MAAWxjD,kCAMrEkZ,EAAMurC,GAGlB,OAFAtkD,GAAU+Y,EACVzU,GAASggD,EACF9tB,IQxGLolB,GAAe,SAASvuB,GAC1B1qB,KAAK0qB,KAAOA,GAIhBuuB,GAAalpC,UAAYlD,OAAOmD,OAAO,IAAIwjB,GAAwB,CAC/DorB,oBAAWr9C,EAAU+wB,EAAU3kB,EAASlM,EAAaK,GACjD,OAAO,IAAIo9C,SAAQ,SAAC0C,EAASxC,GACzBt9C,EAAY+8C,SAASt9C,EAAU+wB,EAAU3kB,EAASlM,GAC7Cq9C,KAAK8C,GAASC,MAAMzC,yBCdrBz/C,EAAQ+qB,EAAMrtB,GAkK1B,MAAO,CACHyQ,IAXJ,SAAerO,EAAGqiD,GACTzkD,EAAQ0kD,gBAA6C,SAA3B1kD,EAAQ0kD,eAED,YAA3B1kD,EAAQ0kD,eA7BvB,SAAsBtiD,EAAGqiD,GACrB,IACMvgD,EAAW9B,EAAE8B,UAAYugD,EACzBE,EAAS,GACX/2B,GAAaxrB,EAAEmB,MAAQ,qBAAkBnB,EAAEyX,SAAW,+CAA6C3V,EAEjG0gD,EAAY,SAACxiD,EAAGiB,EAAGwhD,QACA11C,IAAjB/M,EAAEuY,QAAQtX,IACVshD,EAAOxhD,KAPE,mBAOYrD,QAAQ,YAAakS,SAAS5P,EAAE6V,KAAM,KAAO,IAAM5U,EAAI,IACvEvD,QAAQ,YAAa+kD,GACrB/kD,QAAQ,cAAesC,EAAEuY,QAAQtX,MAI1CjB,EAAE6V,OACF2sC,EAAUxiD,EAAG,EAAG,IAChBwiD,EAAUxiD,EAAG,EAAG,QAChBwiD,EAAUxiD,EAAG,EAAG,IAChBwrB,GAAW,YAAYxrB,EAAE6V,kBAAgB7V,EAAE8V,OAAS,SAAOysC,EAAO9zC,KAAK,OAEvEzO,EAAE0X,QAAU1X,EAAEuY,SAAW3a,EAAQ8kD,UAAY,KAC7Cl3B,GAAW,kBAAkBxrB,EAAE0X,OAEnCuT,EAAK/oB,OAAO7B,MAAMmrB,GAOdm3B,CAAa3iD,EAAGqiD,GACyB,mBAA3BzkD,EAAQ0kD,gBACtB1kD,EAAQ0kD,eAAe,MAAOtiD,EAAGqiD,GA5JzC,SAAmBriD,EAAGqiD,GAClB,IAGIO,EACAp3B,EAJEjtB,EAAK,sBAAsBE,EAAgB4jD,GAAY,IAEvD1X,EAAOzqC,EAAO9B,SAASU,cAAc,OAGrCyjD,EAAS,GACTzgD,EAAW9B,EAAE8B,UAAYugD,EACzBQ,EAAiB/gD,EAAS2N,MAAM,oBAAoB,GAE1Dk7B,EAAKpsC,GAAYA,EACjBosC,EAAKmY,UAAY,qBAEjBt3B,EAAU,QAAOxrB,EAAEmB,MAAQ,qBAAkBnB,EAAEyX,SAAW,wCACtD,uBAAuB3V,OAAa+gD,UAExC,IAAML,EAAY,SAACxiD,EAAGiB,EAAGwhD,QACA11C,IAAjB/M,EAAEuY,QAAQtX,IACVshD,EAAOxhD,KAhBE,qEAgBYrD,QAAQ,YAAakS,SAAS5P,EAAE6V,KAAM,KAAO,IAAM5U,EAAI,IACvEvD,QAAQ,YAAa+kD,GACrB/kD,QAAQ,cAAesC,EAAEuY,QAAQtX,MAI1CjB,EAAE6V,OACF2sC,EAAUxiD,EAAG,EAAG,IAChBwiD,EAAUxiD,EAAG,EAAG,QAChBwiD,EAAUxiD,EAAG,EAAG,IAChBwrB,GAAW,WAAWxrB,EAAE6V,kBAAgB7V,EAAE8V,OAAS,eAAaysC,EAAO9zC,KAAK,aAE5EzO,EAAE0X,QAAU1X,EAAEuY,SAAW3a,EAAQ8kD,UAAY,KAC7Cl3B,GAAW,0BAA0BxrB,EAAE0X,MAAM5H,MAAM,MAAMsC,MAAM,GAAG3D,KAAK,UAE3Ek8B,EAAKoY,UAAYv3B,EAGjBw3B,EAAkB9iD,EAAO9B,SAAU,CAC/B,mDACA,yBACA,sBACA,kBACA,aACA,IACA,8BACA,mBACA,sBACA,kBACA,kBACA,IACA,4BACA,kBACA,kBACA,aACA,yBACA,IACA,iCACA,kBACA,IACA,2BACA,mBACA,qBACA,yBACA,aACA,IACA,0BACA,cACA,IACA,+BACA,cACA,qBACA,uBACA,iCACA,KACFqQ,KAAK,MAAO,CAAEjQ,MAAO,kBAEvBmsC,EAAKsY,MAAMljD,QAAU,CACjB,iCACA,yBACA,yBACA,qBACA,6BACA,0BACA,cACA,gBACA,uBACF0O,KAAK,KAEa,gBAAhB7Q,EAAQslD,MACRN,EAAQO,aAAY,WAChB,IAAM/kD,EAAW8B,EAAO9B,SAClB0vC,EAAO1vC,EAAS0vC,KAClBA,IACI1vC,EAASO,eAAeJ,GACxBuvC,EAAKsV,aAAazY,EAAMvsC,EAASO,eAAeJ,IAEhDuvC,EAAKjuC,aAAa8qC,EAAMmD,EAAKxuC,YAEjC+jD,cAAcT,MAEnB,KAqDHU,CAAUtjD,EAAGqiD,IAUjBkB,OAhDJ,SAAqB7lC,GACZ9f,EAAQ0kD,gBAA6C,SAA3B1kD,EAAQ0kD,eAED,YAA3B1kD,EAAQ0kD,gBAE0B,mBAA3B1kD,EAAQ0kD,gBACtB1kD,EAAQ0kD,eAAe,SAAU5kC,GAjBzC,SAAyBA,GACrB,IAAM9P,EAAO1N,EAAO9B,SAASO,eAAe,sBAAsBF,EAAgBif,IAC9E9P,GACAA,EAAKhO,WAAWE,YAAY8N,GAU5B41C,CAAgB9lC,MC9GtB9f,GCTK,CAEHuwB,mBAAmB,EAGnBs1B,SAAS,EAKTzyC,UAAU,EAGV0yC,MAAM,EAONnmC,MAAO,GAGPzM,OAAO,EAKPgP,eAAe,EAGf6jC,UAAU,EAKVllC,SAAU,GAMVzH,aAAa,EAQbH,KAAM,EAGNyQ,aAAa,EAKbggB,WAAY,KAIZC,WAAY,KAGZjb,QAAS,IDtDjB,GAAIpsB,OAAO+qB,KACP,IAAK,IAAM/Y,MAAOhS,OAAO+qB,KACjB/qB,OAAO+qB,KAAKjtB,eAAekU,MAC3BtU,GAAQsU,IAAOhS,OAAO+qB,KAAK/Y,eEbvBhS,EAAQtC,GAGpBD,EAAYC,EAASolD,EAAsB9iD,SAEZ6M,IAA3BnP,EAAQkjD,iBACRljD,EAAQkjD,eAAiB,yDAAyDpkC,KAAKxc,EAAO0hD,SAASgC,WAS3GhmD,EAAQijD,MAAQjjD,EAAQijD,QAAS,EACjCjjD,EAAQmjD,UAAYnjD,EAAQmjD,YAAa,EAGzCnjD,EAAQimD,KAAOjmD,EAAQimD,OAASjmD,EAAQkjD,eAAiB,IAAO,MAEhEljD,EAAQslD,IAAMtlD,EAAQslD,MAAoC,aAA5BhjD,EAAO0hD,SAASkC,UACd,WAA5B5jD,EAAO0hD,SAASkC,UACY,aAA5B5jD,EAAO0hD,SAASkC,UACf5jD,EAAO0hD,SAASmC,MACb7jD,EAAO0hD,SAASmC,KAAK1kD,OAAS,GAClCzB,EAAQkjD,eAAmC,cACzC,cAEN,IAAM3kC,EAAkB,6CAA6C0nB,KAAK3jC,EAAO0hD,SAASv/B,MACtFlG,IACAve,EAAQue,gBAAkBA,EAAgB,SAGjBpP,IAAzBnP,EAAQikD,eACRjkD,EAAQikD,cAAe,QAGH90C,IAApBnP,EAAQomD,UACRpmD,EAAQomD,SAAU,GAGlBpmD,EAAQmZ,eACRnZ,EAAQoZ,YAAc,OF1B9BitC,CAAkB/jD,OAAQtC,OAElBy3B,QAAUz3B,GAAQy3B,SAAW,GAEjCn1B,OAAOgkD,eACPtmD,GAAQy3B,QAAUz3B,GAAQy3B,QAAQ5zB,OAAOvB,OAAOgkD,eAGpD,IAKIl3B,GACAxtB,GACAyjD,GAPEh4B,YGdU/qB,EAAQtC,GACpB,IAAMQ,EAAW8B,EAAO9B,SAClB6sB,EAAOk5B,KAEbl5B,EAAKrtB,QAAUA,EACf,IAAMoE,EAAcipB,EAAKjpB,YACnBoyB,EAAcgwB,GAAGxmD,EAASqtB,EAAK/oB,QAC/BG,EAAc,IAAI+xB,EACxBpyB,EAAYqiD,eAAehiD,GAC3B4oB,EAAKmJ,YAAcA,EACnBnJ,EAAKuuB,aAAeA,YCxBRvuB,EAAMrtB,GAYlBA,EAAQ8kD,cAAuC,IAArB9kD,EAAQ8kD,SAA2B9kD,EAAQ8kD,SAA4B,gBAAhB9kD,EAAQslD,IAVnE,EAEC,EAUlBtlD,EAAQ0mD,UACT1mD,EAAQ0mD,QAAU,CAAC,CACf3jD,MAAO,SAASL,GACR1C,EAAQ8kD,UAhBD,GAiBP6B,QAAQrC,IAAI5hD,IAGpBI,KAAM,SAASJ,GACP1C,EAAQ8kD,UApBF,GAqBN6B,QAAQrC,IAAI5hD,IAGpBG,KAAM,SAASH,GACP1C,EAAQ8kD,UAxBF,GAyBN6B,QAAQ9jD,KAAKH,IAGrBD,MAAO,SAASC,GACR1C,EAAQ8kD,UA5BD,GA6BP6B,QAAQlkD,MAAMC,OAK9B,IAAK,IAAIW,EAAI,EAAGA,EAAIrD,EAAQ0mD,QAAQjlD,OAAQ4B,IACxCgqB,EAAK/oB,OAAOtB,YAAYhD,EAAQ0mD,QAAQrjD,IDb5CujD,CAAYv5B,EAAMrtB,GAClB,IAAM2kD,EAASkC,GAAevkD,EAAQ+qB,EAAMrtB,GACtC8mD,EAAQz5B,EAAKy5B,MAAQ9mD,EAAQ8mD,gBE1BvBxkD,EAAQtC,EAASsE,GAC7B,IAAIwiD,EAAQ,KACZ,GAAoB,gBAAhB9mD,EAAQslD,IACR,IACIwB,OAAwC,IAAxBxkD,EAAOykD,aAAgC,KAAOzkD,EAAOykD,aACvE,MAAOxmD,IAEb,MAAO,CACHymD,OAAQ,SAASlnC,EAAMskC,EAAcza,EAAYlpC,GAC7C,GAAIqmD,EAAO,CACPxiD,EAAOxB,KAAK,UAAUgd,gBACtB,IACIgnC,EAAMG,QAAQnnC,EAAMrf,GACpBqmD,EAAMG,QAAWnnC,eAAkBskC,GAC/Bza,GACAmd,EAAMG,QAAWnnC,UAAazf,KAAK6/C,UAAUvW,IAEnD,MAAOvnC,GAELkC,EAAO7B,MAAM,mBAAmBqd,wCAI5ConC,OAAQ,SAASpnC,EAAMqkC,EAASxa,GAC5B,IAAMva,EAAY03B,GAASA,EAAMK,QAAQrnC,GACnCsnC,EAAYN,GAASA,EAAMK,QAAWrnC,gBACxC4E,EAAYoiC,GAASA,EAAMK,QAAWrnC,WAK1C,GAHA6pB,EAAaA,GAAc,GAC3BjlB,EAAOA,GAAQ,KAEX0iC,GAAajD,EAAQC,cACpB,IAAIC,KAAKF,EAAQC,cAAciD,YAC5B,IAAIhD,KAAK+C,GAAWC,WACxBhnD,KAAK6/C,UAAUvW,KAAgBjlB,EAE/B,OAAO0K,IFVyBk4B,CAAMhlD,EAAQtC,EAASqtB,EAAK/oB,oBGxBxE,SAASijD,IACL,KAAM,CACFhkD,KAAM,UACNsW,QAAS,qEAIjB,IAAM2tC,EAAiB,CACnBC,aAAc,SAAStO,GAEnB,OADAoO,KACQ,GAEZG,cAAe,SAASvO,GAEpB,OADAoO,KACQ,GAEZI,eAAgB,SAASxO,GAErB,OADAoO,KACQ,IAIhBlkC,EAAiB/B,YAAYkmC,GHG7BI,CAAUv6B,EAAKjpB,aAGXpE,EAAQ4D,WACRypB,EAAKzpB,UAAUyf,iBAAiB/B,YAAYthB,EAAQ4D,WAGxD,IAAMikD,EAAc,oBAEpB,SAASnyC,EAAM2C,GACX,IAAMC,EAAS,GACf,IAAK,IAAMC,KAAQF,EACXA,EAAIjY,eAAemY,KACnBD,EAAOC,GAAQF,EAAIE,IAG3B,OAAOD,EAIX,SAAStU,EAAKuW,EAAMutC,GAChB,IAAMC,EAAY93C,MAAMyC,UAAU8B,MAAM2B,KAAKM,UAAW,GACxD,OAAO,WACH,IAAMpD,EAAO00C,EAAUlkD,OAAOoM,MAAMyC,UAAU8B,MAAM2B,KAAKM,UAAW,IACpE,OAAO8D,EAAKyJ,MAAM8jC,EAASz0C,IAInC,SAAS20C,EAAWre,GAIhB,IAHA,IACI0b,EADE5kD,EAASD,EAASqB,qBAAqB,SAGpCwB,EAAI,EAAGA,EAAI5C,EAAOgB,OAAQ4B,IAE/B,IADAgiD,EAAQ5kD,EAAO4C,IACLE,KAAKsO,MAAMg2C,GAAc,CAC/B,IAAMI,EAAkBvyC,EAAM1V,GAC9BioD,EAAgBte,WAAaA,EAC7B,IAAMua,EAAWmB,EAAMF,WAAa,GACpC8C,EAAgB/jD,SAAW1D,EAASwjD,SAASnkD,KAAKC,QAAQ,OAAQ,IAIlEutB,EAAKq0B,OAAOwC,EAAU+D,EAClBjkD,GAAK,SAACqhD,EAAOjjD,EAAGmX,GACRnX,EACAuiD,EAAOl0C,IAAIrO,EAAG,WAEdijD,EAAM9hD,KAAO,WACT8hD,EAAMhkD,WACNgkD,EAAMhkD,WAAWc,QAAUoX,EAAO6V,IAElCi2B,EAAMF,UAAY5rC,EAAO6V,OAGlC,KAAMi2B,KAKzB,SAAS6C,EAAexnD,EAAOwpB,EAAUi+B,EAAQC,EAAWze,GAExD,IAAMse,EAAkBvyC,EAAM1V,GAC9BD,EAAYkoD,EAAiBvnD,GAC7BunD,EAAgB5H,KAAO3/C,EAAM6C,KAEzBomC,IACAse,EAAgBte,WAAaA,GA6CjCllC,EAAY+8C,SAAS9gD,EAAMb,KAAM,KAAMooD,EAAiB7jD,GACnDq9C,MAAK,SAAAb,IA3CV,SAAiCA,GAC7B,IAAM6B,EAAO7B,EAAW5mC,SAClB8F,EAAO8gC,EAAW18C,SAClBigD,EAAUvD,EAAWuD,QAErBxD,EAAc,CAChBx8C,iBAAkBM,EAAY6qB,QAAQxP,GACtC5b,SAAU4b,EACV09B,aAAc19B,EACd1G,YAAa6uC,EAAgB7uC,aAMjC,GAHAunC,EAAYrH,UAAYqH,EAAYx8C,iBACpCw8C,EAAY9/B,SAAWonC,EAAgBpnC,UAAY8/B,EAAYx8C,iBAE3DggD,EAAS,CACTA,EAAQiE,UAAYA,EAEpB,IAAMh5B,EAAM03B,EAAMI,OAAOpnC,EAAMqkC,EAAS8D,EAAgBte,YACxD,IAAKwe,GAAU/4B,EAGX,OAFA+0B,EAAQkE,OAAQ,OAChBn+B,EAAS,KAAMkF,EAAKqzB,EAAM/hD,EAAOyjD,EAASrkC,GAOlD6kC,EAAOgB,OAAO7lC,GAEdmoC,EAAgB7H,aAAeO,EAC/BtzB,EAAKq0B,OAAOe,EAAMwF,GAAiB,SAAC7lD,EAAGmX,GAC/BnX,GACAA,EAAEvC,KAAOigB,EACToK,EAAS9nB,KAET0kD,EAAME,OAAOtmD,EAAMb,KAAMskD,EAAQC,aAAc6D,EAAgBte,WAAYpwB,EAAO6V,KAClFlF,EAAS,KAAM3Q,EAAO6V,IAAKqzB,EAAM/hD,EAAOyjD,EAASrkC,OAOrDwoC,CAAwB1H,MACzB4D,OAAM,SAAAzoC,GACL4qC,QAAQrC,IAAIvoC,GACZmO,EAASnO,MAKrB,SAASwsC,EAAgBr+B,EAAUi+B,EAAQxe,GACvC,IAAK,IAAItmC,EAAI,EAAGA,EAAIgqB,EAAKm7B,OAAO/mD,OAAQ4B,IACpC6kD,EAAe76B,EAAKm7B,OAAOnlD,GAAI6mB,EAAUi+B,EAAQ96B,EAAKm7B,OAAO/mD,QAAU4B,EAAI,GAAIsmC,GAmIvF,OA3GAtc,EAAKo7B,MAAU,WAMX,OALKp7B,EAAKq7B,YACNr7B,EAAKi4B,IAAM,cArBE,gBAAbj4B,EAAKi4B,MACLj4B,EAAKs7B,WAAapD,aAAY,WACtBl4B,EAAKq7B,YACLjkD,EAAYs/C,iBACZwE,GAAgB,SAACnmD,EAAGgtB,EAAK7uB,EAAGG,EAAOyjD,GAC3B/hD,EACAuiD,EAAOl0C,IAAIrO,EAAGA,EAAEvC,MAAQa,EAAMb,MACvBuvB,GACPg2B,EAAkB9iD,EAAO9B,SAAU4uB,EAAK1uB,SAIrDV,EAAQimD,QAYftjD,KAAK+lD,WAAY,GACV,GAGXr7B,EAAKu7B,QAAU,WAAqE,OAAxDnD,cAAcp4B,EAAKs7B,YAAahmD,KAAK+lD,WAAY,GAAc,GAM3Fr7B,EAAKw7B,+BAAiC,WAClC,IAAMC,EAAQtoD,EAASqB,qBAAqB,QAC5CwrB,EAAKm7B,OAAS,GAEd,IAAK,IAAInlD,EAAI,EAAGA,EAAIylD,EAAMrnD,OAAQ4B,KACT,oBAAjBylD,EAAMzlD,GAAG0lD,KAA8BD,EAAMzlD,GAAG0lD,IAAIl3C,MAAM,eACzDi3C,EAAMzlD,GAAGE,KAAKsO,MAAMg2C,KACrBx6B,EAAKm7B,OAAOrlD,KAAK2lD,EAAMzlD,KASnCgqB,EAAK27B,oBAAsB,WAAM,OAAA,IAAInH,SAAQ,SAACC,EAASC,GACnD10B,EAAKw7B,iCACL/G,QAOJz0B,EAAKsc,WAAa,SAAAsf,GAAU,OAAA57B,EAAK67B,SAAQ,EAAMD,GAAQ,IAEvD57B,EAAK67B,QAAU,SAACf,EAAQxe,EAAYoa,GAIhC,OAHKoE,GAAUpE,KAAsC,IAAnBA,GAC9Bt/C,EAAYs/C,iBAET,IAAIlC,SAAQ,SAACC,EAASC,GACzB,IAAIoH,EACAC,EACAC,EACAC,EACJH,EAAYC,EAAU,IAAI/E,KAKF,KAFxBiF,EAAkBj8B,EAAKm7B,OAAO/mD,SAI1B2nD,EAAU,IAAI/E,KACdgF,EAAoBD,EAAUD,EAC9B97B,EAAK/oB,OAAOxB,KAAK,gDACjBg/C,EAAQ,CACJqH,YACAC,UACAC,oBACAb,OAAQn7B,EAAKm7B,OAAO/mD,UAKxB8mD,GAAgB,SAACnmD,EAAGgtB,EAAK7uB,EAAGG,EAAOyjD,GAC/B,GAAI/hD,EAGA,OAFAuiD,EAAOl0C,IAAIrO,EAAGA,EAAEvC,MAAQa,EAAMb,WAC9BkiD,EAAO3/C,GAGP+hD,EAAQkE,MACRh7B,EAAK/oB,OAAOxB,KAAK,WAAWpC,EAAMb,qBAElCwtB,EAAK/oB,OAAOxB,KAAK,YAAYpC,EAAMb,uBAEvCulD,EAAkB9iD,EAAO9B,SAAU4uB,EAAK1uB,GACxC2sB,EAAK/oB,OAAOxB,KAAK,WAAWpC,EAAMb,uBAAqB,IAAIwkD,KAAS+E,SAM5C,MAHxBE,IAIID,EAAoB,IAAIhF,KAAS8E,EACjC97B,EAAK/oB,OAAOxB,KAAK,uCAAuCumD,QACxDvH,EAAQ,CACJqH,YACAC,UACAC,oBACAb,OAAQn7B,EAAKm7B,OAAO/mD,UAG5B2nD,EAAU,IAAI/E,OACf8D,EAAQxe,GAGfqe,EAAWre,OAInBtc,EAAKk8B,cAAgBvB,EACd36B,EH/PEnK,CAAK5gB,OAAQtC,IAU1B,SAASwpD,GAAgB/G,GACjBA,EAAKv+C,UACLyiD,QAAQ9jD,KAAK4/C,GAEZziD,GAAQijD,OACTrhD,GAAKM,YAAYmjD,WAZzB/iD,OAAO+qB,KAAOA,GAgBVrtB,GAAQomD,UACJ,SAAStnC,KAAKxc,OAAO0hD,SAASv/B,OAC9B4I,GAAKo7B,QAGJzoD,GAAQijD,QACT7zB,GAAM,oCACNxtB,GAAOpB,SAASoB,MAAQpB,SAASqB,qBAAqB,QAAQ,IAC9DwjD,GAAQ7kD,SAASU,cAAc,UAEzBqC,KAAO,WACT8hD,GAAMhkD,WACNgkD,GAAMhkD,WAAWc,QAAUitB,GAE3Bi2B,GAAM/jD,YAAYd,SAASe,eAAe6tB,KAG9CxtB,GAAKN,YAAY+jD,KAErBh4B,GAAKw7B,iCACLx7B,GAAKo8B,iBAAmBp8B,GAAK67B,QAAqB,gBAAb77B,GAAKi4B,KAAuB7D,KAAK+H,GAAiBA"} \ No newline at end of file diff --git a/packages/less/build/rollup.js b/packages/less/build/rollup.js index 9f7e42e99..75fa660e7 100644 --- a/packages/less/build/rollup.js +++ b/packages/less/build/rollup.js @@ -1,6 +1,7 @@ const rollup = require('rollup'); const typescript = require('rollup-plugin-typescript2'); const commonjs = require('rollup-plugin-commonjs'); +const json = require('@rollup/plugin-json'); const resolve = require('rollup-plugin-node-resolve'); const terser = require('rollup-plugin-terser').terser; const banner = require('./banner'); @@ -28,6 +29,7 @@ async function buildBrowser() { plugins: [ resolve(), commonjs(), + json(), typescript({ verbosity: 2, tsconfigDefaults: { diff --git a/packages/less/dist/less.js b/packages/less/dist/less.js index d878afe48..e71e5fc5b 100644 --- a/packages/less/dist/less.js +++ b/packages/less/dist/less.js @@ -10511,6 +10511,24 @@ return render; } + var version = "4.0.0"; + + function parseNodeVersion(version) { + var match = version.match(/^v(\d{1,2})\.(\d{1,2})\.(\d{1,2})(?:-([0-9A-Za-z-.]+))?(?:\+([0-9A-Za-z-.]+))?$/); // eslint-disable-line max-len + if (!match) { + throw new Error('Unable to parse: ' + version); + } + var res = { + major: parseInt(match[1], 10), + minor: parseInt(match[2], 10), + patch: parseInt(match[3], 10), + pre: match[4] || '', + build: match[5] || '', + }; + return res; + } + var parseNodeVersion_1 = parseNodeVersion; + function lessRoot (environment, fileManagers) { var sourceMapOutput, sourceMapBuilder, parseTree, importManager; environment = new Environment(environment, fileManagers); @@ -10520,8 +10538,9 @@ importManager = ImportManager(environment); var render = Render(environment, parseTree); var parse = Parse(environment, parseTree, importManager); + var v = parseNodeVersion_1(version); var initial = { - version: [4, 0, 0], + version: [v.major, v.minor, v.patch], data: data, tree: tree, Environment: Environment, diff --git a/packages/less/dist/less.min.js b/packages/less/dist/less.min.js index a474c6d97..050af49bb 100644 --- a/packages/less/dist/less.min.js +++ b/packages/less/dist/less.min.js @@ -7,5 +7,5 @@ * * @license Apache-2.0 */ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).less=t()}(this,(function(){"use strict";function e(e){return e.replace(/^[a-z-]+:\/+?[^\/]+/,"").replace(/[\?\&]livereload=\w+/,"").replace(/^\//,"").replace(/\.[a-zA-Z]+$/,"").replace(/[^\.\w-]+/g,"-").replace(/\./g,":")}function t(e,t){for(var i in t.dataset)if(t.dataset.hasOwnProperty(i))if("env"===i||"dumpLineNumbers"===i||"rootpath"===i||"errorReporting"===i)e[i]=t.dataset[i];else try{e[i]=JSON.parse(t.dataset[i])}catch(e){}}var i=function(t,i,n){var r=n.href||"",s="less:"+(n.title||e(r)),o=t.getElementById(s),a=!1,l=t.createElement("style");l.setAttribute("type","text/css"),n.media&&l.setAttribute("media",n.media),l.id=s,l.styleSheet||(l.appendChild(t.createTextNode(i)),a=null!==o&&o.childNodes.length>0&&l.childNodes.length>0&&o.firstChild.nodeValue===l.firstChild.nodeValue);var u=t.getElementsByTagName("head")[0];if(null===o||!1===a){var c=n&&n.nextSibling||null;c?c.parentNode.insertBefore(l,c):u.appendChild(l)}if(o&&!1===a&&o.parentNode.removeChild(o),l.styleSheet)try{l.styleSheet.cssText=i}catch(e){throw new Error("Couldn't reassign styleSheet.cssText.")}},n=function(e){var t,i=e.document;return i.currentScript||(t=i.getElementsByTagName("script"))[t.length-1]},r={error:function(e){this._fireEvent("error",e)},warn:function(e){this._fireEvent("warn",e)},info:function(e){this._fireEvent("info",e)},debug:function(e){this._fireEvent("debug",e)},addListener:function(e){this._listeners.push(e)},removeListener:function(e){for(var t=0;t=0;a--){var l=o[a];if(l[s?"supportsSync":"supports"](e,t,i,n))return l}return null},e.prototype.addFileManager=function(e){this.fileManagers.push(e)},e.prototype.clearFileManagers=function(){this.fileManagers=[]},e}(),o={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",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:"#ff00ff",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:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",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:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",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:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},a={length:{m:1,cm:.01,mm:.001,in:.0254,px:.0254/96,pt:.0254/72,pc:.0254/72*12},duration:{s:1,ms:.001},angle:{rad:1/(2*Math.PI),deg:1/360,grad:1/400,turn:1}},l={colors:o,unitConversions:a},u=function(){function e(){this.parent=null,this.visibilityBlocks=void 0,this.nodeVisible=void 0,this.rootNode=null,this.parsed=null;var e=this;Object.defineProperty(this,"currentFileInfo",{get:function(){return e.fileInfo()}}),Object.defineProperty(this,"index",{get:function(){return e.getIndex()}})}return e.prototype.setParent=function(t,i){function n(t){t&&t instanceof e&&(t.parent=i)}Array.isArray(t)?t.forEach(n):n(t)},e.prototype.getIndex=function(){return this._index||this.parent&&this.parent.getIndex()||0},e.prototype.fileInfo=function(){return this._fileInfo||this.parent&&this.parent.fileInfo()||{}},e.prototype.isRulesetLike=function(){return!1},e.prototype.toCSS=function(e){var t=[];return this.genCSS(e,{add:function(e,i,n){t.push(e)},isEmpty:function(){return 0===t.length}}),t.join("")},e.prototype.genCSS=function(e,t){t.add(this.value)},e.prototype.accept=function(e){this.value=e.visit(this.value)},e.prototype.eval=function(){return this},e.prototype._operate=function(e,t,i,n){switch(t){case"+":return i+n;case"-":return i-n;case"*":return i*n;case"/":return i/n}},e.prototype.fround=function(e,t){var i=e&&e.numPrecision;return i?Number((t+2e-16).toFixed(i)):t},e.compare=function(t,i){if(t.compare&&"Quoted"!==i.type&&"Anonymous"!==i.type)return t.compare(i);if(i.compare)return-i.compare(t);if(t.type===i.type){if(t=t.value,i=i.value,!Array.isArray(t))return t===i?0:void 0;if(t.length===i.length){for(var n=0;nt?1:void 0},e.prototype.blocksVisibility=function(){return null==this.visibilityBlocks&&(this.visibilityBlocks=0),0!==this.visibilityBlocks},e.prototype.addVisibilityBlock=function(){null==this.visibilityBlocks&&(this.visibilityBlocks=0),this.visibilityBlocks=this.visibilityBlocks+1},e.prototype.removeVisibilityBlock=function(){null==this.visibilityBlocks&&(this.visibilityBlocks=0),this.visibilityBlocks=this.visibilityBlocks-1},e.prototype.ensureVisibility=function(){this.nodeVisible=!0},e.prototype.ensureInvisibility=function(){this.nodeVisible=!1},e.prototype.isVisible=function(){return this.nodeVisible},e.prototype.visibilityInfo=function(){return{visibilityBlocks:this.visibilityBlocks,nodeVisible:this.nodeVisible}},e.prototype.copyVisibilityInfo=function(e){e&&(this.visibilityBlocks=e.visibilityBlocks,this.nodeVisible=e.nodeVisible)},e}(),c=function(e,t,i){var n=this;Array.isArray(e)?this.rgb=e:e.length>=6?(this.rgb=[],e.match(/.{2}/g).map((function(e,t){t<3?n.rgb.push(parseInt(e,16)):n.alpha=parseInt(e,16)/255}))):(this.rgb=[],e.split("").map((function(e,t){t<3?n.rgb.push(parseInt(e+e,16)):n.alpha=parseInt(e+e,16)/255}))),this.alpha=this.alpha||("number"==typeof t?t:1),void 0!==i&&(this.value=i)};function h(e,t){return Math.min(Math.max(e,0),t)}function f(e){return"#"+e.map((function(e){return((e=h(Math.round(e),255))<16?"0":"")+e.toString(16)})).join("")}c.prototype=Object.assign(new u,{type:"Color",luma:function(){var e=this.rgb[0]/255,t=this.rgb[1]/255,i=this.rgb[2]/255;return.2126*(e=e<=.03928?e/12.92:Math.pow((e+.055)/1.055,2.4))+.7152*(t=t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4))+.0722*(i=i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4))},genCSS:function(e,t){t.add(this.toCSS(e))},toCSS:function(e,t){var i,n,r,s=e&&e.compress&&!t,o=[];if(n=this.fround(e,this.alpha),this.value)if(0===this.value.indexOf("rgb"))n<1&&(r="rgba");else{if(0!==this.value.indexOf("hsl"))return this.value;r=n<1?"hsla":"hsl"}else n<1&&(r="rgba");switch(r){case"rgba":o=this.rgb.map((function(e){return h(Math.round(e),255)})).concat(h(n,1));break;case"hsla":o.push(h(n,1));case"hsl":i=this.toHSL(),o=[this.fround(e,i.h),this.fround(e,100*i.s)+"%",this.fround(e,100*i.l)+"%"].concat(o)}if(r)return r+"("+o.join(","+(s?"":" "))+")";if(i=this.toRGB(),s){var a=i.split("");a[1]===a[2]&&a[3]===a[4]&&a[5]===a[6]&&(i="#"+a[1]+a[3]+a[5])}return i},operate:function(e,t,i){for(var n=new Array(3),r=this.alpha*(1-i.alpha)+i.alpha,s=0;s<3;s++)n[s]=this._operate(e,t,this.rgb[s],i.rgb[s]);return new c(n,r)},toRGB:function(){return f(this.rgb)},toHSL:function(){var e,t,i=this.rgb[0]/255,n=this.rgb[1]/255,r=this.rgb[2]/255,s=this.alpha,o=Math.max(i,n,r),a=Math.min(i,n,r),l=(o+a)/2,u=o-a;if(o===a)e=t=0;else{switch(t=l>.5?u/(2-o-a):u/(o+a),o){case i:e=(n-r)/u+(n=0&&"\n"!==t.charAt(i);)r++;return"number"==typeof e&&(n=(t.slice(0,e).match(/\n/g)||"").length),{line:n,column:r}}function k(e){var t,i=e.length,n=new Array(i);for(t=0;t|Function):(\d+):(\d+)/,O=function(e,t,i){Error.call(this);var n=e.filename||i;if(this.message=e.message,this.stack=e.stack,t&&n){var r=t.contents[n],s=C(e.index,r),o=s.line,a=s.column,l=e.call&&C(e.call,r).line,u=r?r.split("\n"):"";if(this.type=e.type||"Syntax",this.filename=n,this.index=e.index,this.line="number"==typeof o?o+1:null,this.column=a,!this.line&&this.stack){var c=this.stack.match(R),h=new Function("a","throw new Error()"),f=0;try{h()}catch(e){var p=e.stack.match(R);f=1-(o=parseInt(p[2]))}c&&(c[2]&&(this.line=parseInt(c[2])+f),c[3]&&(this.column=parseInt(c[3])))}this.callLine=l+1,this.callExtract=u[l],this.extract=[u[this.line-2],u[this.line-1],u[this.line]]}};if(void 0===Object.create){var V=function(){};V.prototype=Error.prototype,O.prototype=new V}else O.prototype=Object.create(Error.prototype);O.prototype.constructor=O,O.prototype.toString=function(e){e=e||{};var t="",i=this.extract||[],n=[],r=function(e){return e};if(e.stylize){var s=typeof e.stylize;if("function"!==s)throw Error("options.stylize should be a function, got a "+s+"!");r=e.stylize}if(null!==this.line){if("string"==typeof i[0]&&n.push(r(this.line-1+" "+i[0],"grey")),"string"==typeof i[1]){var o=this.line+" ";i[1]&&(o+=i[1].slice(0,this.column)+r(r(r(i[1].substr(this.column,1),"bold")+i[1].slice(this.column+1),"red"),"inverse")),n.push(o)}"string"==typeof i[2]&&n.push(r(this.line+1+" "+i[2],"grey")),n=n.join("\n")+r("","reset")+"\n"}return t+=r(this.type+"Error: "+this.message,"red"),this.filename&&(t+=r(" in ","red")+this.filename),this.line&&(t+=r(" on line "+this.line+", column "+(this.column+1)+":","grey")),t+="\n"+n,this.callLine&&(t+=r("from ","red")+(this.filename||"")+"/n",t+=r(this.callLine,"grey")+" "+this.callExtract+"/n"),t};var F=function(e,t,i,n,r,s){this.extendList=t,this.condition=i,this.evaldCondition=!i,this._index=n,this._fileInfo=r,this.elements=this.getElements(e),this.mixinElements_=void 0,this.copyVisibilityInfo(s),this.setParent(this.elements,this)};F.prototype=Object.assign(new u,{type:"Selector",accept:function(e){this.elements&&(this.elements=e.visitArray(this.elements)),this.extendList&&(this.extendList=e.visitArray(this.extendList)),this.condition&&(this.condition=e.visit(this.condition))},createDerived:function(e,t,i){e=this.getElements(e);var n=new F(e,t||this.extendList,null,this.getIndex(),this.fileInfo(),this.visibilityInfo());return n.evaldCondition=null!=i?i:this.evaldCondition,n.mediaEmpty=this.mediaEmpty,n},getElements:function(e){return e?("string"==typeof e&&this.parse.parseNode(e,["selector"],this._index,this._fileInfo,(function(t,i){if(t)throw new O({index:t.index,message:t.message},this.parse.imports,this._fileInfo.filename);e=i[0].elements})),e):[new m("","&",!1,this._index,this._fileInfo)]},createEmptySelectors:function(){var e=new m("","&",!1,this._index,this._fileInfo),t=[new F([e],null,null,this._index,this._fileInfo)];return t[0].mediaEmpty=!0,t},match:function(e){var t,i,n=this.elements,r=n.length;if(0===(t=(e=e.mixinElements()).length)||rg.PARENS_DIVISION)||this.parensStack&&this.parensStack.length))},q.Eval.prototype.pathRequiresRewrite=function(e){return(this.rewriteUrls===b?J:W)(e)},q.Eval.prototype.rewritePath=function(e,t){var i;return t=t||"",i=this.normalizePath(t+e),J(e)&&W(t)&&!1===J(i)&&(i="./"+i),i},q.Eval.prototype.normalizePath=function(e){var t,i=e.split("/").reverse();for(e=[];0!==i.length;)switch(t=i.pop()){case".":break;case"..":0===e.length||".."===e[e.length-1]?e.push(t):e.pop();break;default:e.push(t)}return e.join("/")};var H=function e(t){return{_data:{},add:function(e,t){e=e.toLowerCase(),this._data.hasOwnProperty(e),this._data[e]=t},addMultiple:function(e){var t=this;Object.keys(e).forEach((function(i){t.add(i,e[i])}))},get:function(e){return this._data[e]||t&&t.get(e)},getLocalFunctions:function(){return this._data},inherit:function(){return e(this)},create:function(t){return e(t)}}}(null),Q={eval:function(){var e=this.value_,t=this.error_;if(t)throw t;if(null!=e)return e?L.True:L.False},value:function(e){this.value_=e},error:function(e){this.error_=e},reset:function(){this.value_=this.error_=null}},K=function(e,t,i,n){this.selectors=e,this.rules=t,this._lookups={},this._variables=null,this._properties=null,this.strictImports=i,this.copyVisibilityInfo(n),this.allowRoot=!0,this.setParent(this.selectors,this),this.setParent(this.rules,this)};K.prototype=Object.assign(new u,{type:"Ruleset",isRuleset:!0,isRulesetLike:function(){return!0},accept:function(e){this.paths?this.paths=e.visitArray(this.paths,!0):this.selectors&&(this.selectors=e.visitArray(this.selectors)),this.rules&&this.rules.length&&(this.rules=e.visitArray(this.rules))},eval:function(e){var t,i,n,r,s,o=!1;if(this.selectors&&(i=this.selectors.length)){for(t=new Array(i),Q.error({type:"Syntax",message:"it is currently only allowed in parametric mixin guards,"}),r=0;r0;e--){var t=this.rules[e-1];if(t instanceof D)return this.parseValue(t)}},parseValue:function(e){var t=this;function i(e){return e.value instanceof j&&!e.parsed?("string"==typeof e.value.value?this.parse.parseNode(e.value.value,["value","important"],e.value.getIndex(),e.fileInfo(),(function(t,i){t&&(e.parsed=!0),i&&(e.value=i[0],e.important=i[1]||"",e.parsed=!0)})):e.parsed=!0,e):e}if(Array.isArray(e)){var n=[];return e.forEach((function(e){n.push(i.call(t,e))})),n}return i.call(t,e)},rulesets:function(){if(!this.rules)return[];var e,t,i=[],n=this.rules;for(e=0;t=n[e];e++)t.isRuleset&&i.push(t);return i},prependRule:function(e){var t=this.rules;t?t.unshift(e):this.rules=[e],this.setParent(e,this)},find:function(e,t,i){t=t||this;var n,r,s=[],o=e.toCSS();return o in this._lookups?this._lookups[o]:(this.rulesets().forEach((function(o){if(o!==t)for(var a=0;an){if(!i||i(o)){r=o.find(new F(e.elements.slice(n)),t,i);for(var l=0;l0&&t.add(l),e.firstSelector=!0,o[0].genCSS(e,t),e.firstSelector=!1,n=1;n0?(s=(r=k(e)).pop(),o=n.createDerived(k(s.elements))):o=n.createDerived([]),t.length>0){var a=i.combinator,l=t[0].elements[0];a.emptyOrWhitespace&&!l.combinator.emptyOrWhitespace&&(a=l.combinator),o.elements.push(new m(a,l.value,i.isVariable,i._index,i._fileInfo)),o.elements=o.elements.concat(t[0].elements.slice(1))}if(0!==o.elements.length&&r.push(o),t.length>1){var u=t.slice(1);u=u.map((function(e){return e.createDerived(e.elements,[])})),r=r.concat(u)}return r}function o(e,t,i,n,r){var o;for(o=0;o0?n[n.length-1]=n[n.length-1].createDerived(n[n.length-1].elements.concat(e)):n.push(new F(e));else t.push([new F(e)])}function l(e,t){var i=t.createDerived(t.elements,t.extendList,t.evaldCondition);return i.copyVisibilityInfo(e),i}var u,c;if(!function e(t,i,l){var u,c,h,f,v,d,g,y,b,w,x,S,I=!1;for(f=[],v=[[]],u=0;y=l.elements[u];u++)if("&"!==y.value){var C=(S=void 0,(x=y).value instanceof p&&(S=x.value.value)instanceof F?S:null);if(null!=C){a(f,v);var k,_=[],A=[];for(k=e(_,i,C),I=I||k,h=0;h<_.length;h++){o(v,[r(n(_[h],y),y)],y,l,A)}v=A,f=[]}else f.push(y)}else{for(I=!0,d=[],a(f,v),c=0;c0&&g[0].elements.push(new m(y.combinator,"",y.isVariable,y._index,y._fileInfo)),d.push(g);else for(h=0;h0&&(t.push(v[u]),w=v[u][b-1],v[u][b-1]=w.createDerived(w.elements,l.extendList));return I}(c=[],t,i))if(t.length>0)for(c=[],u=0;u0)for(t=0;t-1e-6&&(n=i.toFixed(20).replace(/0+$/,"")),e&&e.compress){if(0===i&&this.unit.isLength())return void t.add(n);i>0&&i<1&&(n=n.substr(1))}t.add(n),this.unit.genCSS(e,t)},operate:function(e,t,i){var n=this._operate(e,t,this.value,i.value),r=this.unit.clone();if("+"===t||"-"===t)if(0===r.numerator.length&&0===r.denominator.length)r=i.unit.clone(),this.unit.backupUnit&&(r.backupUnit=this.unit.backupUnit);else if(0===i.unit.numerator.length&&0===r.denominator.length);else{if(i=i.convertTo(this.unit.usedUnits()),e.strictUnits&&i.unit.toString()!==r.toString())throw new Error("Incompatible units. Change the units or use the unit function. Bad units: '"+r.toString()+"' and '"+i.unit.toString()+"'.");n=this._operate(e,t,this.value,i.value)}else"*"===t?(r.numerator=r.numerator.concat(i.unit.numerator).sort(),r.denominator=r.denominator.concat(i.unit.denominator).sort(),r.cancel()):"/"===t&&(r.numerator=r.numerator.concat(i.unit.denominator).sort(),r.denominator=r.denominator.concat(i.unit.numerator).sort(),r.cancel());return new ee(n,r)},compare:function(e){var t,i;if(e instanceof ee){if(this.unit.isEmpty()||e.unit.isEmpty())t=this,i=e;else if(t=this.unify(),i=e.unify(),0!==t.unit.compare(i.unit))return;return u.numericCompare(t.value,i.value)}},unify:function(){return this.convertTo({length:"px",duration:"s",angle:"rad"})},convertTo:function(e){var t,i,n,r,s,o=this.value,l=this.unit.clone(),u={};if("string"==typeof e){for(t in a)a[t].hasOwnProperty(e)&&((u={})[t]=e);e=u}for(i in s=function(e,t){return n.hasOwnProperty(e)?(t?o/=n[e]/n[r]:o*=n[e]/n[r],r):e},e)e.hasOwnProperty(i)&&(r=e[i],n=a[i],l.map(s));return l.cancel(),new ee(o,l)}});var te=g,ie=function(e,t,i){this.op=e.trim(),this.operands=t,this.isSpaced=i};ie.prototype=Object.assign(new u,{type:"Operation",accept:function(e){this.operands=e.visitArray(this.operands)},eval:function(e){var t,i=this.operands[0].eval(e),n=this.operands[1].eval(e);if(e.isMathOn(this.op)){if(t="./"===this.op?"/":this.op,i instanceof ee&&n instanceof c&&(i=i.toColor()),n instanceof ee&&i instanceof c&&(n=n.toColor()),!i.operate){if(i instanceof ie&&"/"===i.op&&e.math===te.PARENS_DIVISION)return new ie(this.op,[i,n],this.isSpaced);throw{type:"Operation",message:"Operation on an invalid type"}}return i.operate(e,t,n)}return new ie(this.op,[i,n],this.isSpaced)},genCSS:function(e,t){this.operands[0].genCSS(e,t),this.isSpaced&&t.add(" "),t.add(this.op),this.isSpaced&&t.add(" "),this.operands[1].genCSS(e,t)}});var ne=function(e,t){if(this.value=e,this.noSpacing=t,!e)throw new Error("Expression requires an array parameter")};ne.prototype=Object.assign(new u,{type:"Expression",accept:function(e){this.value=e.visitArray(this.value)},eval:function(e){var t,i=e.isMathOn(),n=this.parens,r=!1;return n&&e.inParenthesis(),this.value.length>1?t=new ne(this.value.map((function(t){return t.eval?t.eval(e):t})),this.noSpacing):1===this.value.length?(!this.value[0].parens||this.value[0].parensInOp||e.inCalc||(r=!0),t=this.value[0].eval(e)):t=this,n&&e.outOfParenthesis(),!this.parens||!this.parensInOp||i||r||t instanceof ee||(t=new p(t)),t},genCSS:function(e,t){for(var i=0;i1){var i=new F([],null,null,this.getIndex(),this.fileInfo()).createEmptySelectors();(t=new K(i,e.mediaBlocks)).multiMedia=!0,t.copyVisibilityInfo(this.visibilityInfo()),this.setParent(t,this)}return delete e.mediaBlocks,delete e.mediaPath,t},evalNested:function(e){var t,i,n=e.mediaPath.concat([this]);for(t=0;t0;t--)e.splice(t,0,new j("and"));return new ne(e)}))),this.setParent(this.features,this),new K([],[])},permute:function(e){if(0===e.length)return[];if(1===e.length)return e[0];for(var t=[],i=this.permute(e.slice(1)),n=0;n1?"["+e.value.map((function(e){return e.toCSS()})).join(", ")+"]":e.toCSS()}});var ve=function(e,t,i,n){this.escaped=t,this.expression=e,this._index=i,this._fileInfo=n};ve.prototype=Object.assign(new pe,{type:"JavaScript",eval:function(e){var t=this.evaluateJavaScript(this.expression,e),i=typeof t;return"number"!==i||isNaN(t)?"string"===i?new ue('"'+t+'"',t,this.escaped,this._index):Array.isArray(t)?new j(t.join(", ")):new j(t):new ee(t)}});var de=function(e,t){this.key=e,this.value=t};de.prototype=Object.assign(new u,{type:"Assignment",accept:function(e){this.value=e.visit(this.value)},eval:function(e){return this.value.eval?new de(this.key,this.value.eval(e)):this},genCSS:function(e,t){t.add(this.key+"="),this.value.genCSS?this.value.genCSS(e,t):t.add(this.value)}});var me=function(e,t,i,n,r){this.op=e.trim(),this.lvalue=t,this.rvalue=i,this._index=n,this.negate=r};me.prototype=Object.assign(new u,{type:"Condition",accept:function(e){this.lvalue=e.visit(this.lvalue),this.rvalue=e.visit(this.rvalue)},eval:function(e){var t=function(e,t,i){switch(e){case"and":return t&&i;case"or":return t||i;default:switch(u.compare(t,i)){case-1:return"<"===e||"=<"===e||"<="===e;case 0:return"="===e||">="===e||"=<"===e||"<="===e;case 1:return">"===e||">="===e;default:return!1}}}(this.op,this.lvalue.eval(e),this.rvalue.eval(e));return this.negate?!t:t}});var ge=function(e){this.value=e};ge.prototype=Object.assign(new u,{type:"UnicodeDescriptor"});var ye=function(e){this.value=e};ye.prototype=Object.assign(new u,{type:"Negative",genCSS:function(e,t){t.add("-"),this.value.genCSS(e,t)},eval:function(e){return e.isMathOn()?new ie("*",[new ee(-1),this.value]).eval(e):new ye(this.value.eval(e))}});var be=function(e,t,i,n,r){switch(this.selector=e,this.option=t,this.object_id=be.next_id++,this.parent_ids=[this.object_id],this._index=i,this._fileInfo=n,this.copyVisibilityInfo(r),this.allowRoot=!0,t){case"all":this.allowBefore=!0,this.allowAfter=!0;break;default:this.allowBefore=!1,this.allowAfter=!1}this.setParent(this.selector,this)};be.prototype=Object.assign(new u,{type:"Extend",accept:function(e){this.selector=e.visit(this.selector)},eval:function(e){return new be(this.selector.eval(e),this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},clone:function(e){return new be(this.selector,this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},findSelfSelectors:function(e){var t,i,n=[];for(t=0;t0&&i.length&&""===i[0].combinator.value&&(i[0].combinator.value=" "),n=n.concat(e[t].elements);this.selfSelectors=[new F(n)],this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo())}}),be.next_id=0;var we=function(e,t,i){this.variable=e,this._index=t,this._fileInfo=i,this.allowRoot=!0};we.prototype=Object.assign(new u,{type:"VariableCall",eval:function(e){var t,i=new oe(this.variable,this.getIndex(),this.fileInfo()).eval(e),n=new O({message:"Could not evaluate variable call "+this.variable});if(!i.ruleset){if(i.rules)t=i;else if(Array.isArray(i))t=new K("",i);else{if(!Array.isArray(i.value))throw n;t=new K("",i.value)}i=new X(t)}if(i.ruleset)return i.callEval(e);throw n}});var xe=function(e,t,i,n){this.value=e,this.lookups=t,this._index=i,this._fileInfo=n};xe.prototype=Object.assign(new u,{type:"NamespaceValue",eval:function(e){var t,i,n=this.value.eval(e);for(t=0;tthis.params.length)return!1}i=Math.min(s,this.arity);for(var o=0;o0){for(c=!0,a=0;a0)f=2;else if(f=1,p[1]+p[2]>1)throw{type:"Runtime",message:"Ambiguous use of `default()` found when matching for `"+this.format(m)+"`",index:this.getIndex(),filename:this.fileInfo().filename};for(a=0;a0&&(e=e.slice(0,t)),(t=e.lastIndexOf("/"))<0&&(t=e.lastIndexOf("\\")),t<0?"":e.slice(0,t+1)},e.prototype.tryAppendExtension=function(e,t){return/(\.[a-z]*$)|([\?;].*)$/.test(e)?e:e+t},e.prototype.tryAppendLessExtension=function(e){return this.tryAppendExtension(e,".less")},e.prototype.supportsSync=function(){return!1},e.prototype.alwaysMakePathsAbsolute=function(){return!1},e.prototype.isPathAbsolute=function(e){return/^(?:[a-z-]+:|\/|\\|#)/i.test(e)},e.prototype.join=function(e,t){return e?e+t:t},e.prototype.pathDiff=function(e,t){var i,n,r,s,o=this.extractUrlParts(e),a=this.extractUrlParts(t),l="";if(o.hostPart!==a.hostPart)return"";for(n=Math.max(a.directories.length,o.directories.length),i=0;iparseInt(t[i])?-1:1;return 0},e.prototype.versionToString=function(e){for(var t="",i=0;i0;){var e=this.imports[0];if(!e.isReady)return;this.imports=this.imports.slice(1),e.callback.apply(null,e.args)}if(0===this.variableImports.length)break;var t=this.variableImports[0];this.variableImports=this.variableImports.slice(1),t()}}finally{this._currentDepth--}0===this._currentDepth&&this._onSequencerEmpty&&this._onSequencerEmpty()},e}(),Oe=function(e,t){this._visitor=new Pe(this),this._importer=e,this._finish=t,this.context=new q.Eval,this.importCount=0,this.onceFileDetectionMap={},this.recursionDetector={},this._sequencer=new Re(this._onSequencerEmpty.bind(this))};Oe.prototype={isReplacing:!1,run:function(e){try{this._visitor.visit(e)}catch(e){this.error=e}this.isFinished=!0,this._sequencer.tryRun()},_onSequencerEmpty:function(){this.isFinished&&this._finish(this.error)},visitImport:function(e,t){var i=e.options.inline;if(!e.css||i){var n=new q.Eval(this.context,k(this.context.frames)),r=n.frames[0];this.importCount++,e.isVariableImport()?this._sequencer.addVariableImport(this.processImportNode.bind(this,e,n,r)):this.processImportNode(e,n,r)}t.visitDeeper=!1},processImportNode:function(e,t,i){var n,r=e.options.inline;try{n=e.evalForImport(t)}catch(t){t.filename||(t.index=e.getIndex(),t.filename=e.fileInfo().filename),e.css=!0,e.error=t}if(!n||n.css&&!r)this.importCount--,this.isFinished&&this._sequencer.tryRun();else{n.options.multiple&&(t.importMultiple=!0);for(var s=void 0===n.css,o=0;o=0||(a=[u.selfSelectors[0]],(s=f.findMatch(l,a)).length&&(l.hasFoundMatches=!0,l.selfSelectors.forEach((function(e){var t=u.visibilityInfo();o=f.extendSelector(s,a,e,l.isVisible()),(c=new Ce.Extend(u.selector,u.option,0,u.fileInfo(),t)).selfSelectors=o,o[o.length-1].extendList=[c],h.push(c),c.ruleset=u.ruleset,c.parent_ids=c.parent_ids.concat(u.parent_ids,l.parent_ids),u.firstExtendOnThisSelectorPath&&(c.firstExtendOnThisSelectorPath=!0,u.ruleset.paths.push(o))}))));if(h.length){if(this.extendChainCount++,i>100){var p="{unable to calculate}",v="{unable to calculate}";try{p=h[0].selfSelectors[0].toCSS(),v=h[0].selector.toCSS()}catch(e){}throw{message:"extend circular reference detected. One of the circular extends is currently:"+p+":extend("+v+")"}}return h.concat(f.doExtendChaining(h,t,i+1))}return h},e.prototype.visitDeclaration=function(e,t){t.visitDeeper=!1},e.prototype.visitMixinDefinition=function(e,t){t.visitDeeper=!1},e.prototype.visitSelector=function(e,t){t.visitDeeper=!1},e.prototype.visitRuleset=function(e,t){if(!e.root){var i,n,r,s,o=this.allExtendsStack[this.allExtendsStack.length-1],a=[],l=this;for(r=0;r0&&u[l.matched].combinator.value!==o?l=null:l.matched++,l&&(l.finished=l.matched===u.length,l.finished&&!e.allowAfter&&(r+1u&&c>0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[u].elements.slice(c)),c=0,u++),l=s.elements.slice(c,a.index).concat([o]).concat(i.elements.slice(1)),u===a.pathIndex&&r>0?h[h.length-1].elements=h[h.length-1].elements.concat(l):(h=h.concat(t.slice(u,a.pathIndex))).push(new Ce.Selector(l)),u=a.endPathIndex,(c=a.endPathElementIndex)>=t[u].elements.length&&(c=0,u++);return u0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[u].elements.slice(c)),u++),h=(h=h.concat(t.slice(u,t.length))).map((function(e){var t=e.createDerived(e.elements);return n?t.ensureVisibility():t.ensureInvisibility(),t}))},e.prototype.visitMedia=function(e,t){var i=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);i=i.concat(this.doExtendChaining(i,e.allExtends)),this.allExtendsStack.push(i)},e.prototype.visitMediaOut=function(e){var t=this.allExtendsStack.length-1;this.allExtendsStack.length=t},e.prototype.visitAtRule=function(e,t){var i=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);i=i.concat(this.doExtendChaining(i,e.allExtends)),this.allExtendsStack.push(i)},e.prototype.visitAtRuleOut=function(e){var t=this.allExtendsStack.length-1;this.allExtendsStack.length=t},e}(),Le=function(){function e(){this.contexts=[[]],this._visitor=new Pe(this)}return e.prototype.run=function(e){return this._visitor.visit(e)},e.prototype.visitDeclaration=function(e,t){t.visitDeeper=!1},e.prototype.visitMixinDefinition=function(e,t){t.visitDeeper=!1},e.prototype.visitRuleset=function(e,t){var i,n=this.contexts[this.contexts.length-1],r=[];this.contexts.push(r),e.root||((i=e.selectors)&&(i=i.filter((function(e){return e.getIsOutput()})),e.selectors=i.length?i:i=null,i&&e.joinSelectors(r,n,i)),i||(e.rules=null),e.paths=r)},e.prototype.visitRulesetOut=function(e){this.contexts.length=this.contexts.length-1},e.prototype.visitMedia=function(e,t){var i=this.contexts[this.contexts.length-1];e.rules[0].root=0===i.length||i[0].multiMedia},e.prototype.visitAtRule=function(e,t){var i=this.contexts[this.contexts.length-1];e.rules&&e.rules.length&&(e.rules[0].root=e.isRooted||0===i.length||null)},e}(),je=function(){function e(e){this._visitor=new Pe(this),this._context=e}return e.prototype.containsSilentNonBlockedChild=function(e){var t;if(!e)return!1;for(var i=0;i0},e.prototype.resolveVisibility=function(e,t){if(!e.blocksVisibility()){if(this.isEmpty(e)&&!this.containsSilentNonBlockedChild(t))return;return e}var i=e.rules[0];if(this.keepOnlyVisibleChilds(i),!this.isEmpty(i))return e.ensureVisibility(),e.removeVisibilityBlock(),e},e.prototype.isVisibleRuleset=function(e){return!!e.firstRoot||!this.isEmpty(e)&&!(!e.root&&!this.hasVisibleSelector(e))},e}(),Ne=function(e){this._visitor=new Pe(this),this._context=e,this.utils=new je(e)};Ne.prototype={isReplacing:!0,run:function(e){return this._visitor.visit(e)},visitDeclaration:function(e,t){if(!e.blocksVisibility()&&!e.variable)return e},visitMixinDefinition:function(e,t){e.frames=[]},visitExtend:function(e,t){},visitComment:function(e,t){if(!e.blocksVisibility()&&!e.isSilent(this._context))return e},visitMedia:function(e,t){var i=e.rules[0].rules;return e.accept(this._visitor),t.visitDeeper=!1,this.utils.resolveVisibility(e,i)},visitImport:function(e,t){if(!e.blocksVisibility())return e},visitAtRule:function(e,t){return e.rules&&e.rules.length?this.visitAtRuleWithBody(e,t):this.visitAtRuleWithoutBody(e,t)},visitAnonymous:function(e,t){if(!e.blocksVisibility())return e.accept(this._visitor),e},visitAtRuleWithBody:function(e,t){var i=function(e){var t=e.rules;return function(e){var t=e.rules;return 1===t.length&&(!t[0].paths||0===t[0].paths.length)}(e)?t[0].rules:t}(e);return e.accept(this._visitor),t.visitDeeper=!1,this.utils.isEmpty(e)||this._mergeRules(e.rules[0].rules),this.utils.resolveVisibility(e,i)},visitAtRuleWithoutBody:function(e,t){if(!e.blocksVisibility()){if("@charset"===e.name){if(this.charset){if(e.debugInfo){var i=new Ce.Comment("/* "+e.toCSS(this._context).replace(/\n/g,"")+" */\n");return i.debugInfo=e.debugInfo,this._visitor.visit(i)}return}this.charset=!0}return e}},checkValidNodes:function(e,t){if(e)for(var i=0;i0?e.accept(this._visitor):e.rules=null,t.visitDeeper=!1}return e.rules&&(this._mergeRules(e.rules),this._removeDuplicateRules(e.rules)),this.utils.isVisibleRuleset(e)&&(e.ensureVisibility(),n.splice(0,0,e)),1===n.length?n[0]:n},_compileRulesetPaths:function(e){e.paths&&(e.paths=e.paths.filter((function(e){var t;for(" "===e[0].elements[0].combinator.value&&(e[0].elements[0].combinator=new Ce.Combinator("")),t=0;t=0;n--)if((i=e[n])instanceof Ce.Declaration)if(r[i.name]){(t=r[i.name])instanceof Ce.Declaration&&(t=r[i.name]=[r[i.name].toCSS(this._context)]);var s=i.toCSS(this._context);-1!==t.indexOf(s)?e.splice(n,1):t.push(s)}else r[i.name]=i}},_mergeRules:function(e){if(e){for(var t={},i=[],n=0;n0){var t=e[0],i=[],n=[new Ce.Expression(i)];e.forEach((function(e){"+"===e.merge&&i.length>0&&n.push(new Ce.Expression(i=[])),i.push(e.value),t.important=t.important||e.important})),t.value=new Ce.Value(n)}}))}}};var De={Visitor:Pe,ImportVisitor:Oe,MarkVisibleSelectorsVisitor:Ve,ExtendVisitor:$e,JoinSelectorVisitor:Le,ToCSSVisitor:Ne};var Be=function(){var e,t,i,n,r,s,o,a=[],l={};function u(i){for(var n,a,c,h=l.i,f=t,p=l.i-o,v=l.i+s.length-p,d=l.i+=i,m=e;l.i=0){c={index:l.i,text:m.substr(l.i,y+2-l.i),isLineComment:!1},l.i+=c.text.length-1,l.commentStore.push(c);continue}}break}if(32!==n&&10!==n&&9!==n&&13!==n)break}if(s=s.slice(i+l.i-d+p),o=l.i,!s.length){if(ti||l.i===i&&e&&!n)&&(i=l.i,n=e);var r=a.pop();s=r.current,o=l.i=r.i,t=r.j},l.forget=function(){a.pop()},l.isWhitespace=function(t){var i=l.i+(t||0),n=e.charCodeAt(i);return 32===n||13===n||9===n||10===n},l.$re=function(e){l.i>o&&(s=s.slice(l.i-o),o=l.i);var t=e.exec(s);return t?(u(t[0].length),"string"==typeof t?t:1===t.length?t[0]:t):null},l.$char=function(t){return e.charAt(l.i)!==t?null:(u(1),t)},l.$str=function(t){for(var i=t.length,n=0;nh&&(d=!1)}}while(d);return r||null},l.autoCommentAbsorb=!0,l.commentStore=[],l.finished=!1,l.peek=function(t){if("string"==typeof t){for(var i=0;i57||t<43||47===t||44===t},l.start=function(n,a,c){e=n,l.i=t=o=i=0,r=a?function(e,t){var i,n,r,s,o,a,l,u,c,h=e.length,f=0,p=0,v=[],d=0;function m(t){var i=o-d;i<512&&!t||!i||(v.push(e.slice(d,o+1)),d=o+1)}for(o=0;o=97&&l<=122||l<34))switch(l){case 40:p++,n=o;continue;case 41:if(--p<0)return t("missing opening `(`",o);continue;case 59:p||m();continue;case 123:f++,i=o;continue;case 125:if(--f<0)return t("missing opening `{`",o);f||p||m();continue;case 92:if(o96)){if(u==l){c=1;break}if(92==u){if(o==h-1)return t("unescaped `\\`",o);o++}}if(c)continue;return t("unmatched `"+String.fromCharCode(l)+"`",a);case 47:if(p||o==h-1)continue;if(47==(u=e.charCodeAt(o+1)))for(o+=2;oi&&s>r?"missing closing `}` or `*/`":"missing closing `}`",i):0!==p?t("missing closing `)`",n):(m(!0),v)}(n,c):[n],s=r[0],u(0)},l.end=function(){var t,r=l.i>=e.length;return l.i=e.length-1,furthestChar:e[l.i]}},l},Ue=function e(t,i,n){var r,s=Be();function o(e,t){throw new O({index:s.i,filename:n.filename,type:t||"Syntax",message:e},i)}function a(e,t){var i=e instanceof Function?e.call(r):s.$re(e);if(i)return i;o(t||("string"==typeof e?"expected '"+e+"' got '"+s.currentChar()+"'":"unexpected token"))}function l(e,t){if(s.$char(e))return e;o(t||"expected '"+e+"' got '"+s.currentChar()+"'")}function u(e){var t=n.filename;return{lineNumber:C(e,s.getInput()).line+1,fileName:t}}return{parserInput:s,imports:i,fileInfo:n,parseNode:function(e,t,n,o,a){var l,u=[],c=s;try{c.start(e,!1,(function(e,t){a({message:e,index:t+n})}));for(var h=0,f=void 0,p=void 0;f=t[h];h++)if(p=c.i,l=r[f]()){try{l._index=p+n,l._fileInfo=o}catch(e){}u.push(l)}else u.push(null);c.end().isFinished?a(null,u):a(!0,null)}catch(e){throw new O({index:e.index+n,message:e.message},i,o.filename)}},parse:function(r,o,a){var l,u,c,h,f=null,p="";if(u=a&&a.globalVars?e.serializeVars(a.globalVars)+"\n":"",c=a&&a.modifyVars?"\n"+e.serializeVars(a.modifyVars):"",t.pluginManager)for(var v=t.pluginManager.getPreProcessors(),d=0;d");return e},args:function(e){var t,i,n,a,l,u,c,h=r.entities,f={args:null,variadic:!1},p=[],v=[],d=[],m=!0;for(s.save();;){if(e)u=r.detachedRuleset()||r.expression();else{if(s.commentStore.length=0,s.$str("...")){f.variadic=!0,s.$char(";")&&!t&&(t=!0),(t?v:d).push({variadic:!0});break}u=h.variable()||h.property()||h.literal()||h.keyword()||this.call(!0)}if(!u||!m)break;a=null,u.throwAwayComments&&u.throwAwayComments(),l=u;var g=null;if(e?u.value&&1==u.value.length&&(g=u.value[0]):g=u,g&&(g instanceof Ce.Variable||g instanceof Ce.Property))if(s.$char(":")){if(p.length>0&&(t&&o("Cannot mix ; and , as delimiter types"),i=!0),!(l=r.detachedRuleset()||r.expression())){if(!e)return s.restore(),f.args=[],f;o("could not understand value for named argument")}a=n=g.name}else if(s.$str("...")){if(!e){f.variadic=!0,s.$char(";")&&!t&&(t=!0),(t?v:d).push({name:u.name,variadic:!0});break}c=!0}else e||(n=a=g.name,l=null);l&&p.push(l),d.push({name:a,value:l,expand:c}),s.$char(",")?m=!0:((m=";"===s.$char(";"))||t)&&(i&&o("Cannot mix ; and , as delimiter types"),t=!0,p.length>1&&(l=new Ce.Value(p)),v.push({name:n,value:l,expand:c}),n=null,p=[],i=!1)}return s.forget(),f.args=t?v:d,f},definition:function(){var e,t,i,n,o=[],l=!1;if(!("."!==s.currentChar()&&"#"!==s.currentChar()||s.peek(/^[^{]*\}/)))if(s.save(),t=s.$re(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/)){e=t[1];var u=this.args(!1);if(o=u.args,l=u.variadic,!s.$char(")"))return void s.restore("Missing closing ')'");if(s.commentStore.length=0,s.$str("when")&&(n=a(r.conditions,"expected condition")),i=r.block())return s.forget(),new Ce.mixin.Definition(e,o,i,n,l);s.restore()}else s.restore()},ruleLookups:function(){var e,t=[];if("["===s.currentChar()){for(;;){if(s.save(),!(e=this.lookupValue())&&""!==e){s.restore();break}t.push(e),s.forget()}return t.length>0?t:void 0}},lookupValue:function(){if(s.save(),s.$char("[")){var e=s.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);if(s.$char("]"))return e||""===e?(s.forget(),e):void s.restore();s.restore()}else s.restore()}},entity:function(){var e=this.entities;return this.comment()||e.literal()||e.variable()||e.url()||e.property()||e.call()||e.keyword()||this.mixin.call(!0)||e.javascript()},end:function(){return s.$char(";")||s.peek("}")},ieAlpha:function(){var e;if(s.$re(/^opacity=/i))return(e=s.$re(/^\d+/))||(e="@{"+(e=a(r.entities.variable,"Could not parse alpha")).name.slice(1)+"}"),l(")"),new Ce.Quoted("","alpha(opacity="+e+")")},element:function(){var e,t,i,r=s.i;if(t=this.combinator(),(e=s.$re(/^(?:\d+\.\d+|\d+)%/)||s.$re(/^(?:[.#]?|:*)(?:[\w-]|[^\x00-\x9f]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/)||s.$char("*")||s.$char("&")||this.attribute()||s.$re(/^\([^&()@]+\)/)||s.$re(/^[\.#:](?=@)/)||this.entities.variableCurly())||(s.save(),s.$char("(")?(i=this.selector(!1))&&s.$char(")")?(e=new Ce.Paren(i),s.forget()):s.restore("Missing closing ')'"):s.forget()),e)return new Ce.Element(t,e,e instanceof Ce.Variable,r,n)},combinator:function(){var e=s.currentChar();if("/"===e){s.save();var t=s.$re(/^\/[a-z]+\//i);if(t)return s.forget(),new Ce.Combinator(t);s.restore()}if(">"===e||"+"===e||"~"===e||"|"===e||"^"===e){for(s.i++,"^"===e&&"^"===s.currentChar()&&(e="^^",s.i++);s.isWhitespace();)s.i++;return new Ce.Combinator(e)}return s.isWhitespace(-1)?new Ce.Combinator(" "):new Ce.Combinator(null)},selector:function(e){var t,i,r,l,u,c,h,f=s.i;for(e=!1!==e;(e&&(i=this.extend())||e&&(c=s.$str("when"))||(l=this.element()))&&(c?h=a(this.conditions,"expected condition"):h?o("CSS guard can only be used at the end of selector"):i?u=u?u.concat(i):i:(u&&o("Extend can only be used at the end of selector"),r=s.currentChar(),t?t.push(l):t=[l],l=null),"{"!==r&&"}"!==r&&";"!==r&&","!==r&&")"!==r););if(t)return new Ce.Selector(t,u,h,f,n);u&&o("Extend must be used to extend a selector, it cannot be used on its own")},selectors:function(){for(var e,t;(e=this.selector())&&(t?t.push(e):t=[e],s.commentStore.length=0,e.condition&&t.length>1&&o("Guards are only currently allowed on a single selector."),s.$char(","));)e.condition&&o("Guards are only currently allowed on a single selector."),s.commentStore.length=0;return t},attribute:function(){if(s.$char("[")){var e,t,i,n=this.entities;return(e=n.variableCurly())||(e=a(/^(?:[_A-Za-z0-9-\*]*\|)?(?:[_A-Za-z0-9-]|\\.)+/)),(i=s.$re(/^[|~*$^]?=/))&&(t=n.quoted()||s.$re(/^[0-9]+%/)||s.$re(/^[\w-]+/)||n.variableCurly()),l("]"),new Ce.Attribute(e,i,t)}},block:function(){var e;if(s.$char("{")&&(e=this.primary())&&s.$char("}"))return e},blockRuleset:function(){var e=this.block();return e&&(e=new Ce.Ruleset(null,e)),e},detachedRuleset:function(){var e,t,i;if(s.save(),!s.$re(/^[.#]\(/)||(t=(e=this.mixin.args(!1)).args,i=e.variadic,s.$char(")"))){var n=this.blockRuleset();if(n)return s.forget(),t?new Ce.mixin.Definition(null,t,n,null,i):new Ce.DetachedRuleset(n);s.restore()}else s.restore()},ruleset:function(){var e,i,n;if(s.save(),t.dumpLineNumbers&&(n=u(s.i)),(e=this.selectors())&&(i=this.block())){s.forget();var r=new Ce.Ruleset(e,i,t.strictImports);return t.dumpLineNumbers&&(r.debugInfo=n),r}s.restore()},declaration:function(){var e,t,i,r,o,a,l=s.i,u=s.currentChar();if("."!==u&&"#"!==u&&"&"!==u&&":"!==u)if(s.save(),e=this.variable()||this.ruleProperty()){if((a="string"==typeof e)&&(t=this.detachedRuleset())&&(i=!0),s.commentStore.length=0,!t){if(o=!a&&e.length>1&&e.pop().value,t=e[0].value&&"--"===e[0].value.slice(0,2)?this.permissiveValue():this.anonymousValue())return s.forget(),new Ce.Declaration(e,t,!1,o,l,n);t||(t=this.value()),t?r=this.important():a&&(t=this.permissiveValue())}if(t&&(this.end()||i))return s.forget(),new Ce.Declaration(e,t,r,o,l,n);s.restore()}else s.restore()},anonymousValue:function(){var e=s.i,t=s.$re(/^([^.#@\$+\/'"*`(;{}-]*);/);if(t)return new Ce.Anonymous(t[1],e)},permissiveValue:function(e){var t,i,r,a,l=e||";",u=s.i,c=[];function h(){var e=s.currentChar();return"string"==typeof l?e===l:l.test(e)}if(!h()){a=[];do{((i=this.comment())||(i=this.entity()))&&a.push(i)}while(i);if(r=h(),a.length>0){if(a=new Ce.Expression(a),r)return a;c.push(a)," "===s.prevChar()&&c.push(new Ce.Anonymous(" ",u))}if(s.save(),a=s.$parseUntil(l)){if("string"==typeof a&&o("Expected '"+a+"'","Parse"),1===a.length&&" "===a[0])return s.forget(),new Ce.Anonymous("",u);var f=void 0;for(t=0;t0)return new Ce.Expression(r)},mediaFeatures:function(){var e,t=this.entities,i=[];do{if(e=this.mediaFeature()){if(i.push(e),!s.$char(","))break}else if((e=t.variable()||t.mixinLookup())&&(i.push(e),!s.$char(",")))break}while(e);return i.length>0?i:null},media:function(){var e,i,r,a,l=s.i;if(t.dumpLineNumbers&&(a=u(l)),s.save(),s.$str("@media"))return e=this.mediaFeatures(),(i=this.block())||o("media definitions require block statements after any features"),s.forget(),r=new Ce.Media(i,e,l,n),t.dumpLineNumbers&&(r.debugInfo=a),r;s.restore()},plugin:function(){var e,t,i,r=s.i;if(s.$re(/^@plugin?\s+/)){if(i=(t=this.pluginArgs())?{pluginArgs:t,isPlugin:!0}:{isPlugin:!0},e=this.entities.quoted()||this.entities.url())return s.$char(";")||(s.i=r,o("missing semi-colon on @plugin")),new Ce.Import(e,null,i,r,n);s.i=r,o("malformed @plugin statement")}},pluginArgs:function(){if(s.save(),!s.$char("("))return s.restore(),null;var e=s.$re(/^\s*([^\);]+)\)\s*/);return e[1]?(s.forget(),e[1].trim()):(s.restore(),null)},atrule:function(){var e,i,r,a,l,c,h,f=s.i,p=!0,v=!0;if("@"===s.currentChar()){if(i=this.import()||this.plugin()||this.media())return i;if(s.save(),e=s.$re(/^@[a-z-]+/)){switch(a=e,"-"==e.charAt(1)&&e.indexOf("-",2)>0&&(a="@"+e.slice(e.indexOf("-",2)+1)),a){case"@charset":l=!0,p=!1;break;case"@namespace":c=!0,p=!1;break;case"@keyframes":case"@counter-style":l=!0;break;case"@document":case"@supports":h=!0,v=!1;break;default:h=!0}if(s.commentStore.length=0,l?(i=this.entity())||o("expected "+e+" identifier"):c?(i=this.expression())||o("expected "+e+" expression"):h&&(i=this.permissiveValue(/^[{;]/),p="{"===s.currentChar(),i?i.value||(i=null):p||";"===s.currentChar()||o(e+" rule is missing block or ending semi-colon")),p&&(r=this.blockRuleset()),r||!p&&i&&s.$char(";"))return s.forget(),new Ce.AtRule(e,i,r,f,n,t.dumpLineNumbers?u(f):null,v);s.restore("at-rule options not recognised")}}},value:function(){var e,t=[],i=s.i;do{if((e=this.expression())&&(t.push(e),!s.$char(",")))break}while(e);if(t.length>0)return new Ce.Value(t,i)},important:function(){if("!"===s.currentChar())return s.$re(/^! *important/)},sub:function(){var e,t;if(s.save(),s.$char("("))return(e=this.addition())&&s.$char(")")?(s.forget(),(t=new Ce.Expression([e])).parens=!0,t):void s.restore("Expected ')'");s.restore()},multiplication:function(){var e,t,i,n,r;if(e=this.operand()){for(r=s.isWhitespace(-1);!s.peek(/^\/[*\/]/);){if(s.save(),!(i=s.$char("/")||s.$char("*")||s.$str("./"))){s.forget();break}if(!(t=this.operand())){s.restore();break}s.forget(),e.parensInOp=!0,t.parensInOp=!0,n=new Ce.Operation(i,[n||e,t],r),r=s.isWhitespace(-1)}return n||e}},addition:function(){var e,t,i,n,r;if(e=this.multiplication()){for(r=s.isWhitespace(-1);(i=s.$re(/^[-+]\s+/)||!r&&(s.$char("+")||s.$char("-")))&&(t=this.multiplication());)e.parensInOp=!0,t.parensInOp=!0,n=new Ce.Operation(i,[n||e,t],r),r=s.isWhitespace(-1);return n||e}},conditions:function(){var e,t,i,n=s.i;if(e=this.condition(!0)){for(;s.peek(/^,\s*(not\s*)?\(/)&&s.$char(",")&&(t=this.condition(!0));)i=new Ce.Condition("or",i||e,t,n);return i||e}},condition:function(e){var t,i,n;if(t=this.conditionAnd(e)){if(i=s.$str("or")){if(!(n=this.condition(e)))return;t=new Ce.Condition(i,t,n)}return t}},conditionAnd:function(e){var t,i,n,r,o=this;if(t=(r=o.negatedCondition(e)||o.parenthesisCondition(e))||e?r:o.atomicCondition(e)){if(i=s.$str("and")){if(!(n=this.conditionAnd(e)))return;t=new Ce.Condition(i,t,n)}return t}},negatedCondition:function(e){if(s.$str("not")){var t=this.parenthesisCondition(e);return t&&(t.negate=!t.negate),t}},parenthesisCondition:function(e){var t;if(s.save(),s.$str("(")){if(t=function(t){var i;if(s.save(),i=t.condition(e)){if(s.$char(")"))return s.forget(),i;s.restore()}else s.restore()}(this))return s.forget(),t;if(t=this.atomicCondition(e)){if(s.$char(")"))return s.forget(),t;s.restore("expected ')' got '"+s.currentChar()+"'")}else s.restore()}else s.restore()},atomicCondition:function(e){var t,i,n,r,a=this.entities,l=s.i;function u(){return this.addition()||a.keyword()||a.quoted()||a.mixinLookup()}if(t=(u=u.bind(this))())return s.$char(">")?r=s.$char("=")?">=":">":s.$char("<")?r=s.$char("=")?"<=":"<":s.$char("=")&&(r=s.$char(">")?"=>":s.$char("<")?"=<":"="),r?(i=u())?n=new Ce.Condition(r,t,i,l,!1):o("expected expression"):n=new Ce.Condition("=",t,new Ce.Keyword("true"),l,!1),n},operand:function(){var e,t=this.entities;s.peek(/^-[@\$\(]/)&&(e=s.$char("-"));var i=this.sub()||t.dimension()||t.color()||t.variable()||t.property()||t.call()||t.quoted(!0)||t.colorKeyword()||t.mixinLookup();return e&&(i.parensInOp=!0,i=new Ce.Negative(i)),i},expression:function(){var e,t,i=[],n=s.i;do{(e=this.comment())?i.push(e):((e=this.addition()||this.entity())instanceof Ce.Comment&&(e=null),e&&(i.push(e),s.peek(/^\/[\/*]/)||(t=s.$char("/"))&&i.push(new Ce.Anonymous(t,n))))}while(e);if(i.length>0)return new Ce.Expression(i)},property:function(){var e=s.$re(/^(\*?-?[_a-zA-Z0-9-]+)\s*:/);if(e)return e[1]},ruleProperty:function(){var e,t,i=[],r=[];s.save();var o=s.$re(/^([_a-zA-Z0-9-]+)\s*:/);if(o)return i=[new Ce.Keyword(o[1])],s.forget(),i;function a(e){var t=s.i,n=s.$re(e);if(n)return r.push(t),i.push(n[1])}for(a(/^(\*?)/);a(/^((?:[\w-]+)|(?:[@\$]\{[\w-]+\}))/););if(i.length>1&&a(/^((?:\+_|\+)?)\s*:/)){for(s.forget(),""===i[0]&&(i.shift(),r.shift()),t=0;t1?e-1:e)<1?r+(s-r)*e*6:2*e<1?s:3*e<2?r+(s-r)*(2/3-e)*6:r}e=Ke(e)%360/360,t=We(Ke(t)),i=We(Ke(i)),n=We(Ke(n)),r=2*i-(s=i<=.5?i*(t+1):i+t-i*t);var a=[255*o(e+1/3),255*o(e),255*o(e-1/3)];return n=Ke(n),new c(a,n,"hsla")}catch(e){}},hsv:function(e,t,i){return ze.hsva(e,t,i,1)},hsva:function(e,t,i,n){var r,s;e=Ke(e)%360/360*360,t=Ke(t),i=Ke(i),n=Ke(n);var o=[i,i*(1-t),i*(1-(s=e/60-(r=Math.floor(e/60%6)))*t),i*(1-(1-s)*t)],a=[[0,3,1],[2,0,1],[1,0,3],[1,2,0],[3,1,0],[0,1,2]];return ze.rgba(255*o[a[r][0]],255*o[a[r][1]],255*o[a[r][2]],n)},hue:function(e){return new ee(He(e).h)},saturation:function(e){return new ee(100*He(e).s,"%")},lightness:function(e){return new ee(100*He(e).l,"%")},hsvhue:function(e){return new ee(Qe(e).h)},hsvsaturation:function(e){return new ee(100*Qe(e).s,"%")},hsvvalue:function(e){return new ee(100*Qe(e).v,"%")},red:function(e){return new ee(e.rgb[0])},green:function(e){return new ee(e.rgb[1])},blue:function(e){return new ee(e.rgb[2])},alpha:function(e){return new ee(He(e).a)},luma:function(e){return new ee(e.luma()*e.alpha*100,"%")},luminance:function(e){var t=.2126*e.rgb[0]/255+.7152*e.rgb[1]/255+.0722*e.rgb[2]/255;return new ee(t*e.alpha*100,"%")},saturate:function(e,t,i){if(!e.rgb)return null;var n=He(e);return void 0!==i&&"relative"===i.value?n.s+=n.s*t.value/100:n.s+=t.value/100,n.s=We(n.s),Je(e,n)},desaturate:function(e,t,i){var n=He(e);return void 0!==i&&"relative"===i.value?n.s-=n.s*t.value/100:n.s-=t.value/100,n.s=We(n.s),Je(e,n)},lighten:function(e,t,i){var n=He(e);return void 0!==i&&"relative"===i.value?n.l+=n.l*t.value/100:n.l+=t.value/100,n.l=We(n.l),Je(e,n)},darken:function(e,t,i){var n=He(e);return void 0!==i&&"relative"===i.value?n.l-=n.l*t.value/100:n.l-=t.value/100,n.l=We(n.l),Je(e,n)},fadein:function(e,t,i){var n=He(e);return void 0!==i&&"relative"===i.value?n.a+=n.a*t.value/100:n.a+=t.value/100,n.a=We(n.a),Je(e,n)},fadeout:function(e,t,i){var n=He(e);return void 0!==i&&"relative"===i.value?n.a-=n.a*t.value/100:n.a-=t.value/100,n.a=We(n.a),Je(e,n)},fade:function(e,t){var i=He(e);return i.a=t.value/100,i.a=We(i.a),Je(e,i)},spin:function(e,t){var i=He(e),n=(i.h+t.value)%360;return i.h=n<0?360+n:n,Je(e,i)},mix:function(e,t,i){i||(i=new ee(50));var n=i.value/100,r=2*n-1,s=He(e).a-He(t).a,o=((r*s==-1?r:(r+s)/(1+r*s))+1)/2,a=1-o,l=[e.rgb[0]*o+t.rgb[0]*a,e.rgb[1]*o+t.rgb[1]*a,e.rgb[2]*o+t.rgb[2]*a],u=e.alpha*n+t.alpha*(1-n);return new c(l,u)},greyscale:function(e){return ze.desaturate(e,new ee(100))},contrast:function(e,t,i,n){if(!e.rgb)return null;if(void 0===i&&(i=ze.rgba(255,255,255,1)),void 0===t&&(t=ze.rgba(0,0,0,1)),t.luma()>i.luma()){var r=i;i=t,t=r}return n=void 0===n?.43:Ke(n),e.luma().5&&(n=1,i=e>.25?Math.sqrt(e):((16*e-12)*e+4)*e),e-(1-2*t)*n*(i-e)},hardlight:function(e,t){return Ye.overlay(t,e)},difference:function(e,t){return Math.abs(e-t)},exclusion:function(e,t){return e+t-2*e*t},average:function(e,t){return(e+t)/2},negation:function(e,t){return 1-Math.abs(e+t-1)}};for(var et in Ye)Ye.hasOwnProperty(et)&&(Xe[et]=Xe.bind(null,Ye[et]));var tt=function(e){return Array.isArray(e.value)?e.value:Array(e)},it={_SELF:function(e){return e},"~":function(){for(var e=[],t=0;to.value)&&(c[n]=r);else{if(void 0!==l&&a!==l)throw{type:"Argument",message:"incompatible types"};h[a]=c.length,c.push(r)}else Array.isArray(t[i].value)&&Array.prototype.push.apply(t,Array.prototype.slice.call(t[i].value));return 1==c.length?c[0]:(t=c.map((function(e){return e.toCSS(this.context)})).join(this.context.compress?",":", "),new j((e?"min":"max")+"("+t+")"))},at={min:function(){for(var e=[],t=0;t",r=0;r";return n+="',n=encodeURIComponent(n),new ce(new ue("'"+(n="data:image/svg+xml,"+n)+"'",n,!1,this.index,this.currentFileInfo),this.index,this.currentFileInfo)}}),H.addMultiple(ht),t};function pt(e,t){var i,n=(t=t||{}).variables,r=new q.Eval(t);"object"!=typeof n||Array.isArray(n)||(n=Object.keys(n).map((function(e){var t=n[e];return t instanceof Ce.Value||(t instanceof Ce.Expression||(t=new Ce.Expression([t])),t=new Ce.Value([t])),new Ce.Declaration("@"+e,t,!1,null,0)})),r.frames=[new Ce.Ruleset(null,n)]);var s,o,a=[new De.JoinSelectorVisitor,new De.MarkVisibleSelectorsVisitor(!0),new De.ExtendVisitor,new De.ToCSSVisitor({compress:Boolean(t.compress)})],l=[];if(t.pluginManager){o=t.pluginManager.visitor();for(var u=0;u<2;u++)for(o.first();s=o.get();)s.isPreEvalVisitor?0!==u&&-1!==l.indexOf(s)||(l.push(s),s.run(e)):0!==u&&-1!==a.indexOf(s)||(s.isPreVisitor?a.unshift(s):a.push(s))}i=e.eval(r);for(u=0;u=t);i++);this.preProcessors.splice(i,0,{preProcessor:e,priority:t})},e.prototype.addPostProcessor=function(e,t){var i;for(i=0;i=t);i++);this.postProcessors.splice(i,0,{postProcessor:e,priority:t})},e.prototype.addFileManager=function(e){this.fileManagers.push(e)},e.prototype.getPreProcessors=function(){for(var e=[],t=0;t0){var n=void 0,r=JSON.stringify(this._sourceMapGenerator.toJSON());this.sourceMapURL?n=this.sourceMapURL:this._sourceMapFilename&&(n=this._sourceMapFilename),this.sourceMapURL=n,this.sourceMap=r}return this._css.join("")},t}()}(e=new s(e,t)),e)),a=function(e){return function(){function t(e,t,i){this.less=e,this.rootFilename=i.filename,this.paths=t.paths||[],this.contents={},this.contentsIgnoredChars={},this.mime=t.mime,this.error=null,this.context=t,this.queue=[],this.files={}}return t.prototype.push=function(t,i,n,s,o){var a=this,l=this.context.pluginManager.Loader;this.queue.push(t);var u=function(e,i,n){a.queue.splice(a.queue.indexOf(t),1);var l=n===a.rootFilename;s.optional&&e?(o(null,{rules:[]},!1,null),r.info("The file "+n+" was skipped because it was not found and the import was marked optional.")):(a.files[n]||s.inline||(a.files[n]={root:i,options:s}),e&&!a.error&&(a.error=e),o(e,i,l,n))},c={rewriteUrls:this.context.rewriteUrls,entryPath:n.entryPath,rootpath:n.rootpath,rootFilename:n.rootFilename},h=e.getFileManager(t,n.currentDirectory,this.context,e);if(h){var f,p,v=function(e){var t,i=e.filename,r=e.contents.replace(/^\uFEFF/,"");c.currentDirectory=h.getPath(i),c.rewriteUrls&&(c.rootpath=h.join(a.context.rootpath||"",h.pathDiff(c.currentDirectory,c.entryPath)),!h.isPathAbsolute(c.rootpath)&&h.alwaysMakePathsAbsolute()&&(c.rootpath=h.join(c.entryPath,c.rootpath))),c.filename=i;var o=new q.Parse(a.context);o.processImports=!1,a.contents[i]=r,(n.reference||s.reference)&&(c.reference=!0),s.isPlugin?(t=l.evalPlugin(r,o,a,s.pluginArgs,c))instanceof O?u(t,null,i):u(null,t,i):s.inline?u(null,r,i):!a.files[i]||a.files[i].options.multiple||s.multiple?new Ue(o,a,c).parse(r,(function(e,t){u(e,t,i)})):u(null,a.files[i].root,i)},d=_(this.context);i&&(d.ext=s.isPlugin?".js":".less"),s.isPlugin?(d.mime="application/javascript",d.syncImport?f=l.loadPluginSync(t,n.currentDirectory,d,e,h):p=l.loadPlugin(t,n.currentDirectory,d,e,h)):d.syncImport?f=h.loadFileSync(t,n.currentDirectory,d,e):p=h.loadFile(t,n.currentDirectory,d,e,(function(e,t){e?u(e):v(t)})),f?f.filename?v(f):u(f):p&&p.then(v,u)}else u({message:"Could not find a file-manager for "+t})},t}()}(e);var u,c=function(e,t,i){var n=function(e,i,r){if("function"==typeof i?(r=i,i=M(this.options,{})):i=M(this.options,i||{}),!r){var s=this;return new Promise((function(t,r){n.call(s,e,i,(function(e,i){e?r(e):t(i)}))}))}this.parse(e,i,(function(e,i,n,s){if(e)return r(e);var o;try{o=new t(i,n).toCSS(s)}catch(e){return r(e)}r(null,o)}))};return n}(0,o),h=function(e,t,i){var n=function(e,t,r){if("function"==typeof t?(r=t,t=M(this.options,{})):t=M(this.options,t||{}),!r){var s=this;return new Promise((function(i,r){n.call(s,e,t,(function(e,t){e?r(e):i(t)}))}))}var o,a=void 0,l=new yt(this,!t.reUsePluginManager);if(t.pluginManager=l,o=new q.Parse(t),t.rootFileInfo)a=t.rootFileInfo;else{var u=t.filename||"input",c=u.replace(/[^\/\\]*$/,"");(a={filename:u,rewriteUrls:o.rewriteUrls,rootpath:o.rootpath||"",currentDirectory:c,entryPath:c,rootFilename:u}).rootpath&&"/"!==a.rootpath.slice(-1)&&(a.rootpath+="/")}var h=new i(this,o,a);this.importManager=h,t.plugins&&t.plugins.forEach((function(e){var t,i;if(e.fileContent){if(i=e.fileContent.replace(/^\uFEFF/,""),(t=l.Loader.evalPlugin(i,o,h,e.options,e.filename))instanceof O)return r(t)}else l.addPlugin(e)})),new Ue(o,h,a).parse(e,(function(e,i){if(e)return r(e);r(null,i,h,t)}),t)};return n}(0,0,a),f={version:[4,0,0],data:l,tree:Ce,Environment:s,AbstractFileManager:ke,AbstractPluginLoader:_e,environment:e,visitors:De,Parser:Ue,functions:ft(e),contexts:q,SourceMapOutput:i,SourceMapBuilder:n,ParseTree:o,ImportManager:a,render:c,parse:h,LessError:O,transformTree:pt,utils:P,PluginManager:yt,logger:r},p=function(e){return function(){var t=Object.create(e.prototype);return e.apply(t,Array.prototype.slice.call(arguments,0)),t}},v=Object.create(f);for(var d in f.tree)if("function"==typeof(u=f.tree[d]))v[d.toLowerCase()]=p(u);else for(var m in v[d]=Object.create(null),u)v[d][m.toLowerCase()]=p(u[m]);return f.parse=f.parse.bind(v),f.render=f.render.bind(v),v}var wt={},xt=function(){};xt.prototype=Object.assign(new ke,{alwaysMakePathsAbsolute:function(){return!0},join:function(e,t){return e?this.extractUrlParts(t,e).path:t},doXHR:function(e,t,i,n){var r=new XMLHttpRequest,s=!dt.isFileProtocol||dt.fileAsync;function o(t,i,n){t.status>=200&&t.status<300?i(t.responseText,t.getResponseHeader("Last-Modified")):"function"==typeof n&&n(t.status,e)}"function"==typeof r.overrideMimeType&&r.overrideMimeType("text/css"),mt.debug("XHR: Getting '"+e+"'"),r.open("GET",e,s),r.setRequestHeader("Accept",t||"text/x-less, text/css; q=0.9, */*; q=0.5"),r.send(null),dt.isFileProtocol&&!dt.fileAsync?0===r.status||r.status>=200&&r.status<300?i(r.responseText):n(r.status,e):s?r.onreadystatechange=function(){4==r.readyState&&o(r,i,n)}:o(r,i,n)},supports:function(){return!0},clearFileCache:function(){wt={}},loadFile:function(e,t,i,n){t&&!this.isPathAbsolute(e)&&(e=t+e),e=i.ext?this.tryAppendExtension(e,i.ext):e,i=i||{};var r=this.extractUrlParts(e,window.location.href).url,s=this;return new Promise((function(e,t){if(i.useFileCache&&wt[r])try{var n=wt[r];return e({contents:n,filename:r,webInfo:{lastModified:new Date}})}catch(e){return t({filename:r,message:"Error loading file "+r+" error was "+e.message})}s.doXHR(r,i.mime,(function(t,i){wt[r]=t,e({contents:t,filename:r,webInfo:{lastModified:i}})}),(function(e,i){t({type:"File",message:"'"+i+"' wasn't found ("+e+")",href:r})}))}))}});var St=function(e,t){return dt=e,mt=t,xt},It=function(e){this.less=e};It.prototype=Object.assign(new _e,{loadPlugin:function(e,t,i,n,r){return new Promise((function(s,o){r.loadFile(e,t,i,n).then(s).catch(o)}))}});var Ct=function(t,n,r){return{add:function(s,o){r.errorReporting&&"html"!==r.errorReporting?"console"===r.errorReporting?function(e,t){var i=e.filename||t,s=[],o=(e.type||"Syntax")+"Error: "+(e.message||"There is an error in your .less file")+" in "+i,a=function(e,t,i){void 0!==e.extract[t]&&s.push("{line} {content}".replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,i).replace(/\{content\}/,e.extract[t]))};e.line&&(a(e,0,""),a(e,1,"line"),a(e,2,""),o+=" on line "+e.line+", column "+(e.column+1)+":\n"+s.join("\n")),e.stack&&(e.extract||r.logLevel>=4)&&(o+="\nStack Trace\n"+e.stack),n.logger.error(o)}(s,o):"function"==typeof r.errorReporting&&r.errorReporting("add",s,o):function(n,s){var o,a,l="less-error-message:"+e(s||""),u=t.document.createElement("div"),c=[],h=n.filename||s,f=h.match(/([^\/]+(\?.*)?)$/)[1];u.id=l,u.className="less-error-message",a="

    "+(n.type||"Syntax")+"Error: "+(n.message||"There is an error in your .less file")+'

    in '+f+" ";var p=function(e,t,i){void 0!==e.extract[t]&&c.push('

  • {content}
  • '.replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,i).replace(/\{content\}/,e.extract[t]))};n.line&&(p(n,0,""),p(n,1,"line"),p(n,2,""),a+="on line "+n.line+", column "+(n.column+1)+":

      "+c.join("")+"
    "),n.stack&&(n.extract||r.logLevel>=4)&&(a+="
    Stack Trace
    "+n.stack.split("\n").slice(1).join("
    ")),u.innerHTML=a,i(t.document,[".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #dd6666;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.line {","color: #ff0000;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),u.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),"development"===r.env&&(o=setInterval((function(){var e=t.document,i=e.body;i&&(e.getElementById(l)?i.replaceChild(u,e.getElementById(l)):i.insertBefore(u,i.firstChild),clearInterval(o))}),10))}(s,o)},remove:function(i){r.errorReporting&&"html"!==r.errorReporting?"console"===r.errorReporting||"function"==typeof r.errorReporting&&r.errorReporting("remove",i):function(i){var n=t.document.getElementById("less-error-message:"+e(i));n&&n.parentNode.removeChild(n)}(i)}}},kt={javascriptEnabled:!1,depends:!1,compress:!1,lint:!1,paths:[],color:!0,strictImports:!1,insecure:!1,rootpath:"",rewriteUrls:!1,math:1,strictUnits:!1,globalVars:null,modifyVars:null,urlArgs:""};if(window.less)for(var _t in window.less)window.less.hasOwnProperty(_t)&&(kt[_t]=window.less[_t]);!function(e,i){t(i,n(e)),void 0===i.isFileProtocol&&(i.isFileProtocol=/^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(e.location.protocol)),i.async=i.async||!1,i.fileAsync=i.fileAsync||!1,i.poll=i.poll||(i.isFileProtocol?1e3:1500),i.env=i.env||("127.0.0.1"==e.location.hostname||"0.0.0.0"==e.location.hostname||"localhost"==e.location.hostname||e.location.port&&e.location.port.length>0||i.isFileProtocol?"development":"production");var r=/!dumpLineNumbers:(comments|mediaquery|all)/.exec(e.location.hash);r&&(i.dumpLineNumbers=r[1]),void 0===i.useFileCache&&(i.useFileCache=!0),void 0===i.onReady&&(i.onReady=!0),i.relativeUrls&&(i.rewriteUrls="all")}(window,kt),kt.plugins=kt.plugins||[],window.LESS_PLUGINS&&(kt.plugins=kt.plugins.concat(window.LESS_PLUGINS));var At,Mt,Et,Pt=function(e,n){var r=e.document,s=bt();s.options=n;var o=s.environment,a=St(n,s.logger),l=new a;o.addFileManager(l),s.FileManager=a,s.PluginLoader=It,function(e,t){t.logLevel=void 0!==t.logLevel?t.logLevel:"development"===t.env?3:1,t.loggers||(t.loggers=[{debug:function(e){t.logLevel>=4&&console.log(e)},info:function(e){t.logLevel>=3&&console.log(e)},warn:function(e){t.logLevel>=2&&console.warn(e)},error:function(e){t.logLevel>=1&&console.error(e)}}]);for(var i=0;i0&&l.childNodes.length>0&&o.firstChild.nodeValue===l.firstChild.nodeValue);var u=t.getElementsByTagName("head")[0];if(null===o||!1===a){var c=n&&n.nextSibling||null;c?c.parentNode.insertBefore(l,c):u.appendChild(l)}if(o&&!1===a&&o.parentNode.removeChild(o),l.styleSheet)try{l.styleSheet.cssText=i}catch(e){throw new Error("Couldn't reassign styleSheet.cssText.")}},n=function(e){var t,i=e.document;return i.currentScript||(t=i.getElementsByTagName("script"))[t.length-1]},r={error:function(e){this._fireEvent("error",e)},warn:function(e){this._fireEvent("warn",e)},info:function(e){this._fireEvent("info",e)},debug:function(e){this._fireEvent("debug",e)},addListener:function(e){this._listeners.push(e)},removeListener:function(e){for(var t=0;t=0;a--){var l=o[a];if(l[s?"supportsSync":"supports"](e,t,i,n))return l}return null},e.prototype.addFileManager=function(e){this.fileManagers.push(e)},e.prototype.clearFileManagers=function(){this.fileManagers=[]},e}(),o={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",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:"#ff00ff",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:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",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:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",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:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},a={length:{m:1,cm:.01,mm:.001,in:.0254,px:.0254/96,pt:.0254/72,pc:.0254/72*12},duration:{s:1,ms:.001},angle:{rad:1/(2*Math.PI),deg:1/360,grad:1/400,turn:1}},l={colors:o,unitConversions:a},u=function(){function e(){this.parent=null,this.visibilityBlocks=void 0,this.nodeVisible=void 0,this.rootNode=null,this.parsed=null;var e=this;Object.defineProperty(this,"currentFileInfo",{get:function(){return e.fileInfo()}}),Object.defineProperty(this,"index",{get:function(){return e.getIndex()}})}return e.prototype.setParent=function(t,i){function n(t){t&&t instanceof e&&(t.parent=i)}Array.isArray(t)?t.forEach(n):n(t)},e.prototype.getIndex=function(){return this._index||this.parent&&this.parent.getIndex()||0},e.prototype.fileInfo=function(){return this._fileInfo||this.parent&&this.parent.fileInfo()||{}},e.prototype.isRulesetLike=function(){return!1},e.prototype.toCSS=function(e){var t=[];return this.genCSS(e,{add:function(e,i,n){t.push(e)},isEmpty:function(){return 0===t.length}}),t.join("")},e.prototype.genCSS=function(e,t){t.add(this.value)},e.prototype.accept=function(e){this.value=e.visit(this.value)},e.prototype.eval=function(){return this},e.prototype._operate=function(e,t,i,n){switch(t){case"+":return i+n;case"-":return i-n;case"*":return i*n;case"/":return i/n}},e.prototype.fround=function(e,t){var i=e&&e.numPrecision;return i?Number((t+2e-16).toFixed(i)):t},e.compare=function(t,i){if(t.compare&&"Quoted"!==i.type&&"Anonymous"!==i.type)return t.compare(i);if(i.compare)return-i.compare(t);if(t.type===i.type){if(t=t.value,i=i.value,!Array.isArray(t))return t===i?0:void 0;if(t.length===i.length){for(var n=0;nt?1:void 0},e.prototype.blocksVisibility=function(){return null==this.visibilityBlocks&&(this.visibilityBlocks=0),0!==this.visibilityBlocks},e.prototype.addVisibilityBlock=function(){null==this.visibilityBlocks&&(this.visibilityBlocks=0),this.visibilityBlocks=this.visibilityBlocks+1},e.prototype.removeVisibilityBlock=function(){null==this.visibilityBlocks&&(this.visibilityBlocks=0),this.visibilityBlocks=this.visibilityBlocks-1},e.prototype.ensureVisibility=function(){this.nodeVisible=!0},e.prototype.ensureInvisibility=function(){this.nodeVisible=!1},e.prototype.isVisible=function(){return this.nodeVisible},e.prototype.visibilityInfo=function(){return{visibilityBlocks:this.visibilityBlocks,nodeVisible:this.nodeVisible}},e.prototype.copyVisibilityInfo=function(e){e&&(this.visibilityBlocks=e.visibilityBlocks,this.nodeVisible=e.nodeVisible)},e}(),c=function(e,t,i){var n=this;Array.isArray(e)?this.rgb=e:e.length>=6?(this.rgb=[],e.match(/.{2}/g).map((function(e,t){t<3?n.rgb.push(parseInt(e,16)):n.alpha=parseInt(e,16)/255}))):(this.rgb=[],e.split("").map((function(e,t){t<3?n.rgb.push(parseInt(e+e,16)):n.alpha=parseInt(e+e,16)/255}))),this.alpha=this.alpha||("number"==typeof t?t:1),void 0!==i&&(this.value=i)};function h(e,t){return Math.min(Math.max(e,0),t)}function f(e){return"#"+e.map((function(e){return((e=h(Math.round(e),255))<16?"0":"")+e.toString(16)})).join("")}c.prototype=Object.assign(new u,{type:"Color",luma:function(){var e=this.rgb[0]/255,t=this.rgb[1]/255,i=this.rgb[2]/255;return.2126*(e=e<=.03928?e/12.92:Math.pow((e+.055)/1.055,2.4))+.7152*(t=t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4))+.0722*(i=i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4))},genCSS:function(e,t){t.add(this.toCSS(e))},toCSS:function(e,t){var i,n,r,s=e&&e.compress&&!t,o=[];if(n=this.fround(e,this.alpha),this.value)if(0===this.value.indexOf("rgb"))n<1&&(r="rgba");else{if(0!==this.value.indexOf("hsl"))return this.value;r=n<1?"hsla":"hsl"}else n<1&&(r="rgba");switch(r){case"rgba":o=this.rgb.map((function(e){return h(Math.round(e),255)})).concat(h(n,1));break;case"hsla":o.push(h(n,1));case"hsl":i=this.toHSL(),o=[this.fround(e,i.h),this.fround(e,100*i.s)+"%",this.fround(e,100*i.l)+"%"].concat(o)}if(r)return r+"("+o.join(","+(s?"":" "))+")";if(i=this.toRGB(),s){var a=i.split("");a[1]===a[2]&&a[3]===a[4]&&a[5]===a[6]&&(i="#"+a[1]+a[3]+a[5])}return i},operate:function(e,t,i){for(var n=new Array(3),r=this.alpha*(1-i.alpha)+i.alpha,s=0;s<3;s++)n[s]=this._operate(e,t,this.rgb[s],i.rgb[s]);return new c(n,r)},toRGB:function(){return f(this.rgb)},toHSL:function(){var e,t,i=this.rgb[0]/255,n=this.rgb[1]/255,r=this.rgb[2]/255,s=this.alpha,o=Math.max(i,n,r),a=Math.min(i,n,r),l=(o+a)/2,u=o-a;if(o===a)e=t=0;else{switch(t=l>.5?u/(2-o-a):u/(o+a),o){case i:e=(n-r)/u+(n=0&&"\n"!==t.charAt(i);)r++;return"number"==typeof e&&(n=(t.slice(0,e).match(/\n/g)||"").length),{line:n,column:r}}function k(e){var t,i=e.length,n=new Array(i);for(t=0;t|Function):(\d+):(\d+)/,O=function(e,t,i){Error.call(this);var n=e.filename||i;if(this.message=e.message,this.stack=e.stack,t&&n){var r=t.contents[n],s=C(e.index,r),o=s.line,a=s.column,l=e.call&&C(e.call,r).line,u=r?r.split("\n"):"";if(this.type=e.type||"Syntax",this.filename=n,this.index=e.index,this.line="number"==typeof o?o+1:null,this.column=a,!this.line&&this.stack){var c=this.stack.match(R),h=new Function("a","throw new Error()"),f=0;try{h()}catch(e){var p=e.stack.match(R);f=1-(o=parseInt(p[2]))}c&&(c[2]&&(this.line=parseInt(c[2])+f),c[3]&&(this.column=parseInt(c[3])))}this.callLine=l+1,this.callExtract=u[l],this.extract=[u[this.line-2],u[this.line-1],u[this.line]]}};if(void 0===Object.create){var V=function(){};V.prototype=Error.prototype,O.prototype=new V}else O.prototype=Object.create(Error.prototype);O.prototype.constructor=O,O.prototype.toString=function(e){e=e||{};var t="",i=this.extract||[],n=[],r=function(e){return e};if(e.stylize){var s=typeof e.stylize;if("function"!==s)throw Error("options.stylize should be a function, got a "+s+"!");r=e.stylize}if(null!==this.line){if("string"==typeof i[0]&&n.push(r(this.line-1+" "+i[0],"grey")),"string"==typeof i[1]){var o=this.line+" ";i[1]&&(o+=i[1].slice(0,this.column)+r(r(r(i[1].substr(this.column,1),"bold")+i[1].slice(this.column+1),"red"),"inverse")),n.push(o)}"string"==typeof i[2]&&n.push(r(this.line+1+" "+i[2],"grey")),n=n.join("\n")+r("","reset")+"\n"}return t+=r(this.type+"Error: "+this.message,"red"),this.filename&&(t+=r(" in ","red")+this.filename),this.line&&(t+=r(" on line "+this.line+", column "+(this.column+1)+":","grey")),t+="\n"+n,this.callLine&&(t+=r("from ","red")+(this.filename||"")+"/n",t+=r(this.callLine,"grey")+" "+this.callExtract+"/n"),t};var F=function(e,t,i,n,r,s){this.extendList=t,this.condition=i,this.evaldCondition=!i,this._index=n,this._fileInfo=r,this.elements=this.getElements(e),this.mixinElements_=void 0,this.copyVisibilityInfo(s),this.setParent(this.elements,this)};F.prototype=Object.assign(new u,{type:"Selector",accept:function(e){this.elements&&(this.elements=e.visitArray(this.elements)),this.extendList&&(this.extendList=e.visitArray(this.extendList)),this.condition&&(this.condition=e.visit(this.condition))},createDerived:function(e,t,i){e=this.getElements(e);var n=new F(e,t||this.extendList,null,this.getIndex(),this.fileInfo(),this.visibilityInfo());return n.evaldCondition=null!=i?i:this.evaldCondition,n.mediaEmpty=this.mediaEmpty,n},getElements:function(e){return e?("string"==typeof e&&this.parse.parseNode(e,["selector"],this._index,this._fileInfo,(function(t,i){if(t)throw new O({index:t.index,message:t.message},this.parse.imports,this._fileInfo.filename);e=i[0].elements})),e):[new m("","&",!1,this._index,this._fileInfo)]},createEmptySelectors:function(){var e=new m("","&",!1,this._index,this._fileInfo),t=[new F([e],null,null,this._index,this._fileInfo)];return t[0].mediaEmpty=!0,t},match:function(e){var t,i,n=this.elements,r=n.length;if(0===(t=(e=e.mixinElements()).length)||rg.PARENS_DIVISION)||this.parensStack&&this.parensStack.length))},q.Eval.prototype.pathRequiresRewrite=function(e){return(this.rewriteUrls===b?J:W)(e)},q.Eval.prototype.rewritePath=function(e,t){var i;return t=t||"",i=this.normalizePath(t+e),J(e)&&W(t)&&!1===J(i)&&(i="./"+i),i},q.Eval.prototype.normalizePath=function(e){var t,i=e.split("/").reverse();for(e=[];0!==i.length;)switch(t=i.pop()){case".":break;case"..":0===e.length||".."===e[e.length-1]?e.push(t):e.pop();break;default:e.push(t)}return e.join("/")};var H=function e(t){return{_data:{},add:function(e,t){e=e.toLowerCase(),this._data.hasOwnProperty(e),this._data[e]=t},addMultiple:function(e){var t=this;Object.keys(e).forEach((function(i){t.add(i,e[i])}))},get:function(e){return this._data[e]||t&&t.get(e)},getLocalFunctions:function(){return this._data},inherit:function(){return e(this)},create:function(t){return e(t)}}}(null),Q={eval:function(){var e=this.value_,t=this.error_;if(t)throw t;if(null!=e)return e?L.True:L.False},value:function(e){this.value_=e},error:function(e){this.error_=e},reset:function(){this.value_=this.error_=null}},K=function(e,t,i,n){this.selectors=e,this.rules=t,this._lookups={},this._variables=null,this._properties=null,this.strictImports=i,this.copyVisibilityInfo(n),this.allowRoot=!0,this.setParent(this.selectors,this),this.setParent(this.rules,this)};K.prototype=Object.assign(new u,{type:"Ruleset",isRuleset:!0,isRulesetLike:function(){return!0},accept:function(e){this.paths?this.paths=e.visitArray(this.paths,!0):this.selectors&&(this.selectors=e.visitArray(this.selectors)),this.rules&&this.rules.length&&(this.rules=e.visitArray(this.rules))},eval:function(e){var t,i,n,r,s,o=!1;if(this.selectors&&(i=this.selectors.length)){for(t=new Array(i),Q.error({type:"Syntax",message:"it is currently only allowed in parametric mixin guards,"}),r=0;r0;e--){var t=this.rules[e-1];if(t instanceof D)return this.parseValue(t)}},parseValue:function(e){var t=this;function i(e){return e.value instanceof j&&!e.parsed?("string"==typeof e.value.value?this.parse.parseNode(e.value.value,["value","important"],e.value.getIndex(),e.fileInfo(),(function(t,i){t&&(e.parsed=!0),i&&(e.value=i[0],e.important=i[1]||"",e.parsed=!0)})):e.parsed=!0,e):e}if(Array.isArray(e)){var n=[];return e.forEach((function(e){n.push(i.call(t,e))})),n}return i.call(t,e)},rulesets:function(){if(!this.rules)return[];var e,t,i=[],n=this.rules;for(e=0;t=n[e];e++)t.isRuleset&&i.push(t);return i},prependRule:function(e){var t=this.rules;t?t.unshift(e):this.rules=[e],this.setParent(e,this)},find:function(e,t,i){t=t||this;var n,r,s=[],o=e.toCSS();return o in this._lookups?this._lookups[o]:(this.rulesets().forEach((function(o){if(o!==t)for(var a=0;an){if(!i||i(o)){r=o.find(new F(e.elements.slice(n)),t,i);for(var l=0;l0&&t.add(l),e.firstSelector=!0,o[0].genCSS(e,t),e.firstSelector=!1,n=1;n0?(s=(r=k(e)).pop(),o=n.createDerived(k(s.elements))):o=n.createDerived([]),t.length>0){var a=i.combinator,l=t[0].elements[0];a.emptyOrWhitespace&&!l.combinator.emptyOrWhitespace&&(a=l.combinator),o.elements.push(new m(a,l.value,i.isVariable,i._index,i._fileInfo)),o.elements=o.elements.concat(t[0].elements.slice(1))}if(0!==o.elements.length&&r.push(o),t.length>1){var u=t.slice(1);u=u.map((function(e){return e.createDerived(e.elements,[])})),r=r.concat(u)}return r}function o(e,t,i,n,r){var o;for(o=0;o0?n[n.length-1]=n[n.length-1].createDerived(n[n.length-1].elements.concat(e)):n.push(new F(e));else t.push([new F(e)])}function l(e,t){var i=t.createDerived(t.elements,t.extendList,t.evaldCondition);return i.copyVisibilityInfo(e),i}var u,c;if(!function e(t,i,l){var u,c,h,f,v,d,g,y,b,w,x,S,I=!1;for(f=[],v=[[]],u=0;y=l.elements[u];u++)if("&"!==y.value){var C=(S=void 0,(x=y).value instanceof p&&(S=x.value.value)instanceof F?S:null);if(null!=C){a(f,v);var k,_=[],A=[];for(k=e(_,i,C),I=I||k,h=0;h<_.length;h++){o(v,[r(n(_[h],y),y)],y,l,A)}v=A,f=[]}else f.push(y)}else{for(I=!0,d=[],a(f,v),c=0;c0&&g[0].elements.push(new m(y.combinator,"",y.isVariable,y._index,y._fileInfo)),d.push(g);else for(h=0;h0&&(t.push(v[u]),w=v[u][b-1],v[u][b-1]=w.createDerived(w.elements,l.extendList));return I}(c=[],t,i))if(t.length>0)for(c=[],u=0;u0)for(t=0;t-1e-6&&(n=i.toFixed(20).replace(/0+$/,"")),e&&e.compress){if(0===i&&this.unit.isLength())return void t.add(n);i>0&&i<1&&(n=n.substr(1))}t.add(n),this.unit.genCSS(e,t)},operate:function(e,t,i){var n=this._operate(e,t,this.value,i.value),r=this.unit.clone();if("+"===t||"-"===t)if(0===r.numerator.length&&0===r.denominator.length)r=i.unit.clone(),this.unit.backupUnit&&(r.backupUnit=this.unit.backupUnit);else if(0===i.unit.numerator.length&&0===r.denominator.length);else{if(i=i.convertTo(this.unit.usedUnits()),e.strictUnits&&i.unit.toString()!==r.toString())throw new Error("Incompatible units. Change the units or use the unit function. Bad units: '"+r.toString()+"' and '"+i.unit.toString()+"'.");n=this._operate(e,t,this.value,i.value)}else"*"===t?(r.numerator=r.numerator.concat(i.unit.numerator).sort(),r.denominator=r.denominator.concat(i.unit.denominator).sort(),r.cancel()):"/"===t&&(r.numerator=r.numerator.concat(i.unit.denominator).sort(),r.denominator=r.denominator.concat(i.unit.numerator).sort(),r.cancel());return new ee(n,r)},compare:function(e){var t,i;if(e instanceof ee){if(this.unit.isEmpty()||e.unit.isEmpty())t=this,i=e;else if(t=this.unify(),i=e.unify(),0!==t.unit.compare(i.unit))return;return u.numericCompare(t.value,i.value)}},unify:function(){return this.convertTo({length:"px",duration:"s",angle:"rad"})},convertTo:function(e){var t,i,n,r,s,o=this.value,l=this.unit.clone(),u={};if("string"==typeof e){for(t in a)a[t].hasOwnProperty(e)&&((u={})[t]=e);e=u}for(i in s=function(e,t){return n.hasOwnProperty(e)?(t?o/=n[e]/n[r]:o*=n[e]/n[r],r):e},e)e.hasOwnProperty(i)&&(r=e[i],n=a[i],l.map(s));return l.cancel(),new ee(o,l)}});var te=g,ie=function(e,t,i){this.op=e.trim(),this.operands=t,this.isSpaced=i};ie.prototype=Object.assign(new u,{type:"Operation",accept:function(e){this.operands=e.visitArray(this.operands)},eval:function(e){var t,i=this.operands[0].eval(e),n=this.operands[1].eval(e);if(e.isMathOn(this.op)){if(t="./"===this.op?"/":this.op,i instanceof ee&&n instanceof c&&(i=i.toColor()),n instanceof ee&&i instanceof c&&(n=n.toColor()),!i.operate){if(i instanceof ie&&"/"===i.op&&e.math===te.PARENS_DIVISION)return new ie(this.op,[i,n],this.isSpaced);throw{type:"Operation",message:"Operation on an invalid type"}}return i.operate(e,t,n)}return new ie(this.op,[i,n],this.isSpaced)},genCSS:function(e,t){this.operands[0].genCSS(e,t),this.isSpaced&&t.add(" "),t.add(this.op),this.isSpaced&&t.add(" "),this.operands[1].genCSS(e,t)}});var ne=function(e,t){if(this.value=e,this.noSpacing=t,!e)throw new Error("Expression requires an array parameter")};ne.prototype=Object.assign(new u,{type:"Expression",accept:function(e){this.value=e.visitArray(this.value)},eval:function(e){var t,i=e.isMathOn(),n=this.parens,r=!1;return n&&e.inParenthesis(),this.value.length>1?t=new ne(this.value.map((function(t){return t.eval?t.eval(e):t})),this.noSpacing):1===this.value.length?(!this.value[0].parens||this.value[0].parensInOp||e.inCalc||(r=!0),t=this.value[0].eval(e)):t=this,n&&e.outOfParenthesis(),!this.parens||!this.parensInOp||i||r||t instanceof ee||(t=new p(t)),t},genCSS:function(e,t){for(var i=0;i1){var i=new F([],null,null,this.getIndex(),this.fileInfo()).createEmptySelectors();(t=new K(i,e.mediaBlocks)).multiMedia=!0,t.copyVisibilityInfo(this.visibilityInfo()),this.setParent(t,this)}return delete e.mediaBlocks,delete e.mediaPath,t},evalNested:function(e){var t,i,n=e.mediaPath.concat([this]);for(t=0;t0;t--)e.splice(t,0,new j("and"));return new ne(e)}))),this.setParent(this.features,this),new K([],[])},permute:function(e){if(0===e.length)return[];if(1===e.length)return e[0];for(var t=[],i=this.permute(e.slice(1)),n=0;n1?"["+e.value.map((function(e){return e.toCSS()})).join(", ")+"]":e.toCSS()}});var ve=function(e,t,i,n){this.escaped=t,this.expression=e,this._index=i,this._fileInfo=n};ve.prototype=Object.assign(new pe,{type:"JavaScript",eval:function(e){var t=this.evaluateJavaScript(this.expression,e),i=typeof t;return"number"!==i||isNaN(t)?"string"===i?new ue('"'+t+'"',t,this.escaped,this._index):Array.isArray(t)?new j(t.join(", ")):new j(t):new ee(t)}});var de=function(e,t){this.key=e,this.value=t};de.prototype=Object.assign(new u,{type:"Assignment",accept:function(e){this.value=e.visit(this.value)},eval:function(e){return this.value.eval?new de(this.key,this.value.eval(e)):this},genCSS:function(e,t){t.add(this.key+"="),this.value.genCSS?this.value.genCSS(e,t):t.add(this.value)}});var me=function(e,t,i,n,r){this.op=e.trim(),this.lvalue=t,this.rvalue=i,this._index=n,this.negate=r};me.prototype=Object.assign(new u,{type:"Condition",accept:function(e){this.lvalue=e.visit(this.lvalue),this.rvalue=e.visit(this.rvalue)},eval:function(e){var t=function(e,t,i){switch(e){case"and":return t&&i;case"or":return t||i;default:switch(u.compare(t,i)){case-1:return"<"===e||"=<"===e||"<="===e;case 0:return"="===e||">="===e||"=<"===e||"<="===e;case 1:return">"===e||">="===e;default:return!1}}}(this.op,this.lvalue.eval(e),this.rvalue.eval(e));return this.negate?!t:t}});var ge=function(e){this.value=e};ge.prototype=Object.assign(new u,{type:"UnicodeDescriptor"});var ye=function(e){this.value=e};ye.prototype=Object.assign(new u,{type:"Negative",genCSS:function(e,t){t.add("-"),this.value.genCSS(e,t)},eval:function(e){return e.isMathOn()?new ie("*",[new ee(-1),this.value]).eval(e):new ye(this.value.eval(e))}});var be=function(e,t,i,n,r){switch(this.selector=e,this.option=t,this.object_id=be.next_id++,this.parent_ids=[this.object_id],this._index=i,this._fileInfo=n,this.copyVisibilityInfo(r),this.allowRoot=!0,t){case"all":this.allowBefore=!0,this.allowAfter=!0;break;default:this.allowBefore=!1,this.allowAfter=!1}this.setParent(this.selector,this)};be.prototype=Object.assign(new u,{type:"Extend",accept:function(e){this.selector=e.visit(this.selector)},eval:function(e){return new be(this.selector.eval(e),this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},clone:function(e){return new be(this.selector,this.option,this.getIndex(),this.fileInfo(),this.visibilityInfo())},findSelfSelectors:function(e){var t,i,n=[];for(t=0;t0&&i.length&&""===i[0].combinator.value&&(i[0].combinator.value=" "),n=n.concat(e[t].elements);this.selfSelectors=[new F(n)],this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo())}}),be.next_id=0;var we=function(e,t,i){this.variable=e,this._index=t,this._fileInfo=i,this.allowRoot=!0};we.prototype=Object.assign(new u,{type:"VariableCall",eval:function(e){var t,i=new oe(this.variable,this.getIndex(),this.fileInfo()).eval(e),n=new O({message:"Could not evaluate variable call "+this.variable});if(!i.ruleset){if(i.rules)t=i;else if(Array.isArray(i))t=new K("",i);else{if(!Array.isArray(i.value))throw n;t=new K("",i.value)}i=new X(t)}if(i.ruleset)return i.callEval(e);throw n}});var xe=function(e,t,i,n){this.value=e,this.lookups=t,this._index=i,this._fileInfo=n};xe.prototype=Object.assign(new u,{type:"NamespaceValue",eval:function(e){var t,i,n=this.value.eval(e);for(t=0;tthis.params.length)return!1}i=Math.min(s,this.arity);for(var o=0;o0){for(c=!0,a=0;a0)f=2;else if(f=1,p[1]+p[2]>1)throw{type:"Runtime",message:"Ambiguous use of `default()` found when matching for `"+this.format(m)+"`",index:this.getIndex(),filename:this.fileInfo().filename};for(a=0;a0&&(e=e.slice(0,t)),(t=e.lastIndexOf("/"))<0&&(t=e.lastIndexOf("\\")),t<0?"":e.slice(0,t+1)},e.prototype.tryAppendExtension=function(e,t){return/(\.[a-z]*$)|([\?;].*)$/.test(e)?e:e+t},e.prototype.tryAppendLessExtension=function(e){return this.tryAppendExtension(e,".less")},e.prototype.supportsSync=function(){return!1},e.prototype.alwaysMakePathsAbsolute=function(){return!1},e.prototype.isPathAbsolute=function(e){return/^(?:[a-z-]+:|\/|\\|#)/i.test(e)},e.prototype.join=function(e,t){return e?e+t:t},e.prototype.pathDiff=function(e,t){var i,n,r,s,o=this.extractUrlParts(e),a=this.extractUrlParts(t),l="";if(o.hostPart!==a.hostPart)return"";for(n=Math.max(a.directories.length,o.directories.length),i=0;iparseInt(t[i])?-1:1;return 0},e.prototype.versionToString=function(e){for(var t="",i=0;i0;){var e=this.imports[0];if(!e.isReady)return;this.imports=this.imports.slice(1),e.callback.apply(null,e.args)}if(0===this.variableImports.length)break;var t=this.variableImports[0];this.variableImports=this.variableImports.slice(1),t()}}finally{this._currentDepth--}0===this._currentDepth&&this._onSequencerEmpty&&this._onSequencerEmpty()},e}(),Oe=function(e,t){this._visitor=new Pe(this),this._importer=e,this._finish=t,this.context=new q.Eval,this.importCount=0,this.onceFileDetectionMap={},this.recursionDetector={},this._sequencer=new Re(this._onSequencerEmpty.bind(this))};Oe.prototype={isReplacing:!1,run:function(e){try{this._visitor.visit(e)}catch(e){this.error=e}this.isFinished=!0,this._sequencer.tryRun()},_onSequencerEmpty:function(){this.isFinished&&this._finish(this.error)},visitImport:function(e,t){var i=e.options.inline;if(!e.css||i){var n=new q.Eval(this.context,k(this.context.frames)),r=n.frames[0];this.importCount++,e.isVariableImport()?this._sequencer.addVariableImport(this.processImportNode.bind(this,e,n,r)):this.processImportNode(e,n,r)}t.visitDeeper=!1},processImportNode:function(e,t,i){var n,r=e.options.inline;try{n=e.evalForImport(t)}catch(t){t.filename||(t.index=e.getIndex(),t.filename=e.fileInfo().filename),e.css=!0,e.error=t}if(!n||n.css&&!r)this.importCount--,this.isFinished&&this._sequencer.tryRun();else{n.options.multiple&&(t.importMultiple=!0);for(var s=void 0===n.css,o=0;o=0||(a=[u.selfSelectors[0]],(s=f.findMatch(l,a)).length&&(l.hasFoundMatches=!0,l.selfSelectors.forEach((function(e){var t=u.visibilityInfo();o=f.extendSelector(s,a,e,l.isVisible()),(c=new Ce.Extend(u.selector,u.option,0,u.fileInfo(),t)).selfSelectors=o,o[o.length-1].extendList=[c],h.push(c),c.ruleset=u.ruleset,c.parent_ids=c.parent_ids.concat(u.parent_ids,l.parent_ids),u.firstExtendOnThisSelectorPath&&(c.firstExtendOnThisSelectorPath=!0,u.ruleset.paths.push(o))}))));if(h.length){if(this.extendChainCount++,i>100){var p="{unable to calculate}",v="{unable to calculate}";try{p=h[0].selfSelectors[0].toCSS(),v=h[0].selector.toCSS()}catch(e){}throw{message:"extend circular reference detected. One of the circular extends is currently:"+p+":extend("+v+")"}}return h.concat(f.doExtendChaining(h,t,i+1))}return h},e.prototype.visitDeclaration=function(e,t){t.visitDeeper=!1},e.prototype.visitMixinDefinition=function(e,t){t.visitDeeper=!1},e.prototype.visitSelector=function(e,t){t.visitDeeper=!1},e.prototype.visitRuleset=function(e,t){if(!e.root){var i,n,r,s,o=this.allExtendsStack[this.allExtendsStack.length-1],a=[],l=this;for(r=0;r0&&u[l.matched].combinator.value!==o?l=null:l.matched++,l&&(l.finished=l.matched===u.length,l.finished&&!e.allowAfter&&(r+1u&&c>0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[u].elements.slice(c)),c=0,u++),l=s.elements.slice(c,a.index).concat([o]).concat(i.elements.slice(1)),u===a.pathIndex&&r>0?h[h.length-1].elements=h[h.length-1].elements.concat(l):(h=h.concat(t.slice(u,a.pathIndex))).push(new Ce.Selector(l)),u=a.endPathIndex,(c=a.endPathElementIndex)>=t[u].elements.length&&(c=0,u++);return u0&&(h[h.length-1].elements=h[h.length-1].elements.concat(t[u].elements.slice(c)),u++),h=(h=h.concat(t.slice(u,t.length))).map((function(e){var t=e.createDerived(e.elements);return n?t.ensureVisibility():t.ensureInvisibility(),t}))},e.prototype.visitMedia=function(e,t){var i=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);i=i.concat(this.doExtendChaining(i,e.allExtends)),this.allExtendsStack.push(i)},e.prototype.visitMediaOut=function(e){var t=this.allExtendsStack.length-1;this.allExtendsStack.length=t},e.prototype.visitAtRule=function(e,t){var i=e.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);i=i.concat(this.doExtendChaining(i,e.allExtends)),this.allExtendsStack.push(i)},e.prototype.visitAtRuleOut=function(e){var t=this.allExtendsStack.length-1;this.allExtendsStack.length=t},e}(),Le=function(){function e(){this.contexts=[[]],this._visitor=new Pe(this)}return e.prototype.run=function(e){return this._visitor.visit(e)},e.prototype.visitDeclaration=function(e,t){t.visitDeeper=!1},e.prototype.visitMixinDefinition=function(e,t){t.visitDeeper=!1},e.prototype.visitRuleset=function(e,t){var i,n=this.contexts[this.contexts.length-1],r=[];this.contexts.push(r),e.root||((i=e.selectors)&&(i=i.filter((function(e){return e.getIsOutput()})),e.selectors=i.length?i:i=null,i&&e.joinSelectors(r,n,i)),i||(e.rules=null),e.paths=r)},e.prototype.visitRulesetOut=function(e){this.contexts.length=this.contexts.length-1},e.prototype.visitMedia=function(e,t){var i=this.contexts[this.contexts.length-1];e.rules[0].root=0===i.length||i[0].multiMedia},e.prototype.visitAtRule=function(e,t){var i=this.contexts[this.contexts.length-1];e.rules&&e.rules.length&&(e.rules[0].root=e.isRooted||0===i.length||null)},e}(),je=function(){function e(e){this._visitor=new Pe(this),this._context=e}return e.prototype.containsSilentNonBlockedChild=function(e){var t;if(!e)return!1;for(var i=0;i0},e.prototype.resolveVisibility=function(e,t){if(!e.blocksVisibility()){if(this.isEmpty(e)&&!this.containsSilentNonBlockedChild(t))return;return e}var i=e.rules[0];if(this.keepOnlyVisibleChilds(i),!this.isEmpty(i))return e.ensureVisibility(),e.removeVisibilityBlock(),e},e.prototype.isVisibleRuleset=function(e){return!!e.firstRoot||!this.isEmpty(e)&&!(!e.root&&!this.hasVisibleSelector(e))},e}(),Ne=function(e){this._visitor=new Pe(this),this._context=e,this.utils=new je(e)};Ne.prototype={isReplacing:!0,run:function(e){return this._visitor.visit(e)},visitDeclaration:function(e,t){if(!e.blocksVisibility()&&!e.variable)return e},visitMixinDefinition:function(e,t){e.frames=[]},visitExtend:function(e,t){},visitComment:function(e,t){if(!e.blocksVisibility()&&!e.isSilent(this._context))return e},visitMedia:function(e,t){var i=e.rules[0].rules;return e.accept(this._visitor),t.visitDeeper=!1,this.utils.resolveVisibility(e,i)},visitImport:function(e,t){if(!e.blocksVisibility())return e},visitAtRule:function(e,t){return e.rules&&e.rules.length?this.visitAtRuleWithBody(e,t):this.visitAtRuleWithoutBody(e,t)},visitAnonymous:function(e,t){if(!e.blocksVisibility())return e.accept(this._visitor),e},visitAtRuleWithBody:function(e,t){var i=function(e){var t=e.rules;return function(e){var t=e.rules;return 1===t.length&&(!t[0].paths||0===t[0].paths.length)}(e)?t[0].rules:t}(e);return e.accept(this._visitor),t.visitDeeper=!1,this.utils.isEmpty(e)||this._mergeRules(e.rules[0].rules),this.utils.resolveVisibility(e,i)},visitAtRuleWithoutBody:function(e,t){if(!e.blocksVisibility()){if("@charset"===e.name){if(this.charset){if(e.debugInfo){var i=new Ce.Comment("/* "+e.toCSS(this._context).replace(/\n/g,"")+" */\n");return i.debugInfo=e.debugInfo,this._visitor.visit(i)}return}this.charset=!0}return e}},checkValidNodes:function(e,t){if(e)for(var i=0;i0?e.accept(this._visitor):e.rules=null,t.visitDeeper=!1}return e.rules&&(this._mergeRules(e.rules),this._removeDuplicateRules(e.rules)),this.utils.isVisibleRuleset(e)&&(e.ensureVisibility(),n.splice(0,0,e)),1===n.length?n[0]:n},_compileRulesetPaths:function(e){e.paths&&(e.paths=e.paths.filter((function(e){var t;for(" "===e[0].elements[0].combinator.value&&(e[0].elements[0].combinator=new Ce.Combinator("")),t=0;t=0;n--)if((i=e[n])instanceof Ce.Declaration)if(r[i.name]){(t=r[i.name])instanceof Ce.Declaration&&(t=r[i.name]=[r[i.name].toCSS(this._context)]);var s=i.toCSS(this._context);-1!==t.indexOf(s)?e.splice(n,1):t.push(s)}else r[i.name]=i}},_mergeRules:function(e){if(e){for(var t={},i=[],n=0;n0){var t=e[0],i=[],n=[new Ce.Expression(i)];e.forEach((function(e){"+"===e.merge&&i.length>0&&n.push(new Ce.Expression(i=[])),i.push(e.value),t.important=t.important||e.important})),t.value=new Ce.Value(n)}}))}}};var De={Visitor:Pe,ImportVisitor:Oe,MarkVisibleSelectorsVisitor:Ve,ExtendVisitor:$e,JoinSelectorVisitor:Le,ToCSSVisitor:Ne};var Ue=function(){var e,t,i,n,r,s,o,a=[],l={};function u(i){for(var n,a,c,h=l.i,f=t,p=l.i-o,v=l.i+s.length-p,d=l.i+=i,m=e;l.i=0){c={index:l.i,text:m.substr(l.i,y+2-l.i),isLineComment:!1},l.i+=c.text.length-1,l.commentStore.push(c);continue}}break}if(32!==n&&10!==n&&9!==n&&13!==n)break}if(s=s.slice(i+l.i-d+p),o=l.i,!s.length){if(ti||l.i===i&&e&&!n)&&(i=l.i,n=e);var r=a.pop();s=r.current,o=l.i=r.i,t=r.j},l.forget=function(){a.pop()},l.isWhitespace=function(t){var i=l.i+(t||0),n=e.charCodeAt(i);return 32===n||13===n||9===n||10===n},l.$re=function(e){l.i>o&&(s=s.slice(l.i-o),o=l.i);var t=e.exec(s);return t?(u(t[0].length),"string"==typeof t?t:1===t.length?t[0]:t):null},l.$char=function(t){return e.charAt(l.i)!==t?null:(u(1),t)},l.$str=function(t){for(var i=t.length,n=0;nh&&(d=!1)}}while(d);return r||null},l.autoCommentAbsorb=!0,l.commentStore=[],l.finished=!1,l.peek=function(t){if("string"==typeof t){for(var i=0;i57||t<43||47===t||44===t},l.start=function(n,a,c){e=n,l.i=t=o=i=0,r=a?function(e,t){var i,n,r,s,o,a,l,u,c,h=e.length,f=0,p=0,v=[],d=0;function m(t){var i=o-d;i<512&&!t||!i||(v.push(e.slice(d,o+1)),d=o+1)}for(o=0;o=97&&l<=122||l<34))switch(l){case 40:p++,n=o;continue;case 41:if(--p<0)return t("missing opening `(`",o);continue;case 59:p||m();continue;case 123:f++,i=o;continue;case 125:if(--f<0)return t("missing opening `{`",o);f||p||m();continue;case 92:if(o96)){if(u==l){c=1;break}if(92==u){if(o==h-1)return t("unescaped `\\`",o);o++}}if(c)continue;return t("unmatched `"+String.fromCharCode(l)+"`",a);case 47:if(p||o==h-1)continue;if(47==(u=e.charCodeAt(o+1)))for(o+=2;oi&&s>r?"missing closing `}` or `*/`":"missing closing `}`",i):0!==p?t("missing closing `)`",n):(m(!0),v)}(n,c):[n],s=r[0],u(0)},l.end=function(){var t,r=l.i>=e.length;return l.i=e.length-1,furthestChar:e[l.i]}},l},Be=function e(t,i,n){var r,s=Ue();function o(e,t){throw new O({index:s.i,filename:n.filename,type:t||"Syntax",message:e},i)}function a(e,t){var i=e instanceof Function?e.call(r):s.$re(e);if(i)return i;o(t||("string"==typeof e?"expected '"+e+"' got '"+s.currentChar()+"'":"unexpected token"))}function l(e,t){if(s.$char(e))return e;o(t||"expected '"+e+"' got '"+s.currentChar()+"'")}function u(e){var t=n.filename;return{lineNumber:C(e,s.getInput()).line+1,fileName:t}}return{parserInput:s,imports:i,fileInfo:n,parseNode:function(e,t,n,o,a){var l,u=[],c=s;try{c.start(e,!1,(function(e,t){a({message:e,index:t+n})}));for(var h=0,f=void 0,p=void 0;f=t[h];h++)if(p=c.i,l=r[f]()){try{l._index=p+n,l._fileInfo=o}catch(e){}u.push(l)}else u.push(null);c.end().isFinished?a(null,u):a(!0,null)}catch(e){throw new O({index:e.index+n,message:e.message},i,o.filename)}},parse:function(r,o,a){var l,u,c,h,f=null,p="";if(u=a&&a.globalVars?e.serializeVars(a.globalVars)+"\n":"",c=a&&a.modifyVars?"\n"+e.serializeVars(a.modifyVars):"",t.pluginManager)for(var v=t.pluginManager.getPreProcessors(),d=0;d");return e},args:function(e){var t,i,n,a,l,u,c,h=r.entities,f={args:null,variadic:!1},p=[],v=[],d=[],m=!0;for(s.save();;){if(e)u=r.detachedRuleset()||r.expression();else{if(s.commentStore.length=0,s.$str("...")){f.variadic=!0,s.$char(";")&&!t&&(t=!0),(t?v:d).push({variadic:!0});break}u=h.variable()||h.property()||h.literal()||h.keyword()||this.call(!0)}if(!u||!m)break;a=null,u.throwAwayComments&&u.throwAwayComments(),l=u;var g=null;if(e?u.value&&1==u.value.length&&(g=u.value[0]):g=u,g&&(g instanceof Ce.Variable||g instanceof Ce.Property))if(s.$char(":")){if(p.length>0&&(t&&o("Cannot mix ; and , as delimiter types"),i=!0),!(l=r.detachedRuleset()||r.expression())){if(!e)return s.restore(),f.args=[],f;o("could not understand value for named argument")}a=n=g.name}else if(s.$str("...")){if(!e){f.variadic=!0,s.$char(";")&&!t&&(t=!0),(t?v:d).push({name:u.name,variadic:!0});break}c=!0}else e||(n=a=g.name,l=null);l&&p.push(l),d.push({name:a,value:l,expand:c}),s.$char(",")?m=!0:((m=";"===s.$char(";"))||t)&&(i&&o("Cannot mix ; and , as delimiter types"),t=!0,p.length>1&&(l=new Ce.Value(p)),v.push({name:n,value:l,expand:c}),n=null,p=[],i=!1)}return s.forget(),f.args=t?v:d,f},definition:function(){var e,t,i,n,o=[],l=!1;if(!("."!==s.currentChar()&&"#"!==s.currentChar()||s.peek(/^[^{]*\}/)))if(s.save(),t=s.$re(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/)){e=t[1];var u=this.args(!1);if(o=u.args,l=u.variadic,!s.$char(")"))return void s.restore("Missing closing ')'");if(s.commentStore.length=0,s.$str("when")&&(n=a(r.conditions,"expected condition")),i=r.block())return s.forget(),new Ce.mixin.Definition(e,o,i,n,l);s.restore()}else s.restore()},ruleLookups:function(){var e,t=[];if("["===s.currentChar()){for(;;){if(s.save(),!(e=this.lookupValue())&&""!==e){s.restore();break}t.push(e),s.forget()}return t.length>0?t:void 0}},lookupValue:function(){if(s.save(),s.$char("[")){var e=s.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);if(s.$char("]"))return e||""===e?(s.forget(),e):void s.restore();s.restore()}else s.restore()}},entity:function(){var e=this.entities;return this.comment()||e.literal()||e.variable()||e.url()||e.property()||e.call()||e.keyword()||this.mixin.call(!0)||e.javascript()},end:function(){return s.$char(";")||s.peek("}")},ieAlpha:function(){var e;if(s.$re(/^opacity=/i))return(e=s.$re(/^\d+/))||(e="@{"+(e=a(r.entities.variable,"Could not parse alpha")).name.slice(1)+"}"),l(")"),new Ce.Quoted("","alpha(opacity="+e+")")},element:function(){var e,t,i,r=s.i;if(t=this.combinator(),(e=s.$re(/^(?:\d+\.\d+|\d+)%/)||s.$re(/^(?:[.#]?|:*)(?:[\w-]|[^\x00-\x9f]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/)||s.$char("*")||s.$char("&")||this.attribute()||s.$re(/^\([^&()@]+\)/)||s.$re(/^[\.#:](?=@)/)||this.entities.variableCurly())||(s.save(),s.$char("(")?(i=this.selector(!1))&&s.$char(")")?(e=new Ce.Paren(i),s.forget()):s.restore("Missing closing ')'"):s.forget()),e)return new Ce.Element(t,e,e instanceof Ce.Variable,r,n)},combinator:function(){var e=s.currentChar();if("/"===e){s.save();var t=s.$re(/^\/[a-z]+\//i);if(t)return s.forget(),new Ce.Combinator(t);s.restore()}if(">"===e||"+"===e||"~"===e||"|"===e||"^"===e){for(s.i++,"^"===e&&"^"===s.currentChar()&&(e="^^",s.i++);s.isWhitespace();)s.i++;return new Ce.Combinator(e)}return s.isWhitespace(-1)?new Ce.Combinator(" "):new Ce.Combinator(null)},selector:function(e){var t,i,r,l,u,c,h,f=s.i;for(e=!1!==e;(e&&(i=this.extend())||e&&(c=s.$str("when"))||(l=this.element()))&&(c?h=a(this.conditions,"expected condition"):h?o("CSS guard can only be used at the end of selector"):i?u=u?u.concat(i):i:(u&&o("Extend can only be used at the end of selector"),r=s.currentChar(),t?t.push(l):t=[l],l=null),"{"!==r&&"}"!==r&&";"!==r&&","!==r&&")"!==r););if(t)return new Ce.Selector(t,u,h,f,n);u&&o("Extend must be used to extend a selector, it cannot be used on its own")},selectors:function(){for(var e,t;(e=this.selector())&&(t?t.push(e):t=[e],s.commentStore.length=0,e.condition&&t.length>1&&o("Guards are only currently allowed on a single selector."),s.$char(","));)e.condition&&o("Guards are only currently allowed on a single selector."),s.commentStore.length=0;return t},attribute:function(){if(s.$char("[")){var e,t,i,n=this.entities;return(e=n.variableCurly())||(e=a(/^(?:[_A-Za-z0-9-\*]*\|)?(?:[_A-Za-z0-9-]|\\.)+/)),(i=s.$re(/^[|~*$^]?=/))&&(t=n.quoted()||s.$re(/^[0-9]+%/)||s.$re(/^[\w-]+/)||n.variableCurly()),l("]"),new Ce.Attribute(e,i,t)}},block:function(){var e;if(s.$char("{")&&(e=this.primary())&&s.$char("}"))return e},blockRuleset:function(){var e=this.block();return e&&(e=new Ce.Ruleset(null,e)),e},detachedRuleset:function(){var e,t,i;if(s.save(),!s.$re(/^[.#]\(/)||(t=(e=this.mixin.args(!1)).args,i=e.variadic,s.$char(")"))){var n=this.blockRuleset();if(n)return s.forget(),t?new Ce.mixin.Definition(null,t,n,null,i):new Ce.DetachedRuleset(n);s.restore()}else s.restore()},ruleset:function(){var e,i,n;if(s.save(),t.dumpLineNumbers&&(n=u(s.i)),(e=this.selectors())&&(i=this.block())){s.forget();var r=new Ce.Ruleset(e,i,t.strictImports);return t.dumpLineNumbers&&(r.debugInfo=n),r}s.restore()},declaration:function(){var e,t,i,r,o,a,l=s.i,u=s.currentChar();if("."!==u&&"#"!==u&&"&"!==u&&":"!==u)if(s.save(),e=this.variable()||this.ruleProperty()){if((a="string"==typeof e)&&(t=this.detachedRuleset())&&(i=!0),s.commentStore.length=0,!t){if(o=!a&&e.length>1&&e.pop().value,t=e[0].value&&"--"===e[0].value.slice(0,2)?this.permissiveValue():this.anonymousValue())return s.forget(),new Ce.Declaration(e,t,!1,o,l,n);t||(t=this.value()),t?r=this.important():a&&(t=this.permissiveValue())}if(t&&(this.end()||i))return s.forget(),new Ce.Declaration(e,t,r,o,l,n);s.restore()}else s.restore()},anonymousValue:function(){var e=s.i,t=s.$re(/^([^.#@\$+\/'"*`(;{}-]*);/);if(t)return new Ce.Anonymous(t[1],e)},permissiveValue:function(e){var t,i,r,a,l=e||";",u=s.i,c=[];function h(){var e=s.currentChar();return"string"==typeof l?e===l:l.test(e)}if(!h()){a=[];do{((i=this.comment())||(i=this.entity()))&&a.push(i)}while(i);if(r=h(),a.length>0){if(a=new Ce.Expression(a),r)return a;c.push(a)," "===s.prevChar()&&c.push(new Ce.Anonymous(" ",u))}if(s.save(),a=s.$parseUntil(l)){if("string"==typeof a&&o("Expected '"+a+"'","Parse"),1===a.length&&" "===a[0])return s.forget(),new Ce.Anonymous("",u);var f=void 0;for(t=0;t0)return new Ce.Expression(r)},mediaFeatures:function(){var e,t=this.entities,i=[];do{if(e=this.mediaFeature()){if(i.push(e),!s.$char(","))break}else if((e=t.variable()||t.mixinLookup())&&(i.push(e),!s.$char(",")))break}while(e);return i.length>0?i:null},media:function(){var e,i,r,a,l=s.i;if(t.dumpLineNumbers&&(a=u(l)),s.save(),s.$str("@media"))return e=this.mediaFeatures(),(i=this.block())||o("media definitions require block statements after any features"),s.forget(),r=new Ce.Media(i,e,l,n),t.dumpLineNumbers&&(r.debugInfo=a),r;s.restore()},plugin:function(){var e,t,i,r=s.i;if(s.$re(/^@plugin?\s+/)){if(i=(t=this.pluginArgs())?{pluginArgs:t,isPlugin:!0}:{isPlugin:!0},e=this.entities.quoted()||this.entities.url())return s.$char(";")||(s.i=r,o("missing semi-colon on @plugin")),new Ce.Import(e,null,i,r,n);s.i=r,o("malformed @plugin statement")}},pluginArgs:function(){if(s.save(),!s.$char("("))return s.restore(),null;var e=s.$re(/^\s*([^\);]+)\)\s*/);return e[1]?(s.forget(),e[1].trim()):(s.restore(),null)},atrule:function(){var e,i,r,a,l,c,h,f=s.i,p=!0,v=!0;if("@"===s.currentChar()){if(i=this.import()||this.plugin()||this.media())return i;if(s.save(),e=s.$re(/^@[a-z-]+/)){switch(a=e,"-"==e.charAt(1)&&e.indexOf("-",2)>0&&(a="@"+e.slice(e.indexOf("-",2)+1)),a){case"@charset":l=!0,p=!1;break;case"@namespace":c=!0,p=!1;break;case"@keyframes":case"@counter-style":l=!0;break;case"@document":case"@supports":h=!0,v=!1;break;default:h=!0}if(s.commentStore.length=0,l?(i=this.entity())||o("expected "+e+" identifier"):c?(i=this.expression())||o("expected "+e+" expression"):h&&(i=this.permissiveValue(/^[{;]/),p="{"===s.currentChar(),i?i.value||(i=null):p||";"===s.currentChar()||o(e+" rule is missing block or ending semi-colon")),p&&(r=this.blockRuleset()),r||!p&&i&&s.$char(";"))return s.forget(),new Ce.AtRule(e,i,r,f,n,t.dumpLineNumbers?u(f):null,v);s.restore("at-rule options not recognised")}}},value:function(){var e,t=[],i=s.i;do{if((e=this.expression())&&(t.push(e),!s.$char(",")))break}while(e);if(t.length>0)return new Ce.Value(t,i)},important:function(){if("!"===s.currentChar())return s.$re(/^! *important/)},sub:function(){var e,t;if(s.save(),s.$char("("))return(e=this.addition())&&s.$char(")")?(s.forget(),(t=new Ce.Expression([e])).parens=!0,t):void s.restore("Expected ')'");s.restore()},multiplication:function(){var e,t,i,n,r;if(e=this.operand()){for(r=s.isWhitespace(-1);!s.peek(/^\/[*\/]/);){if(s.save(),!(i=s.$char("/")||s.$char("*")||s.$str("./"))){s.forget();break}if(!(t=this.operand())){s.restore();break}s.forget(),e.parensInOp=!0,t.parensInOp=!0,n=new Ce.Operation(i,[n||e,t],r),r=s.isWhitespace(-1)}return n||e}},addition:function(){var e,t,i,n,r;if(e=this.multiplication()){for(r=s.isWhitespace(-1);(i=s.$re(/^[-+]\s+/)||!r&&(s.$char("+")||s.$char("-")))&&(t=this.multiplication());)e.parensInOp=!0,t.parensInOp=!0,n=new Ce.Operation(i,[n||e,t],r),r=s.isWhitespace(-1);return n||e}},conditions:function(){var e,t,i,n=s.i;if(e=this.condition(!0)){for(;s.peek(/^,\s*(not\s*)?\(/)&&s.$char(",")&&(t=this.condition(!0));)i=new Ce.Condition("or",i||e,t,n);return i||e}},condition:function(e){var t,i,n;if(t=this.conditionAnd(e)){if(i=s.$str("or")){if(!(n=this.condition(e)))return;t=new Ce.Condition(i,t,n)}return t}},conditionAnd:function(e){var t,i,n,r,o=this;if(t=(r=o.negatedCondition(e)||o.parenthesisCondition(e))||e?r:o.atomicCondition(e)){if(i=s.$str("and")){if(!(n=this.conditionAnd(e)))return;t=new Ce.Condition(i,t,n)}return t}},negatedCondition:function(e){if(s.$str("not")){var t=this.parenthesisCondition(e);return t&&(t.negate=!t.negate),t}},parenthesisCondition:function(e){var t;if(s.save(),s.$str("(")){if(t=function(t){var i;if(s.save(),i=t.condition(e)){if(s.$char(")"))return s.forget(),i;s.restore()}else s.restore()}(this))return s.forget(),t;if(t=this.atomicCondition(e)){if(s.$char(")"))return s.forget(),t;s.restore("expected ')' got '"+s.currentChar()+"'")}else s.restore()}else s.restore()},atomicCondition:function(e){var t,i,n,r,a=this.entities,l=s.i;function u(){return this.addition()||a.keyword()||a.quoted()||a.mixinLookup()}if(t=(u=u.bind(this))())return s.$char(">")?r=s.$char("=")?">=":">":s.$char("<")?r=s.$char("=")?"<=":"<":s.$char("=")&&(r=s.$char(">")?"=>":s.$char("<")?"=<":"="),r?(i=u())?n=new Ce.Condition(r,t,i,l,!1):o("expected expression"):n=new Ce.Condition("=",t,new Ce.Keyword("true"),l,!1),n},operand:function(){var e,t=this.entities;s.peek(/^-[@\$\(]/)&&(e=s.$char("-"));var i=this.sub()||t.dimension()||t.color()||t.variable()||t.property()||t.call()||t.quoted(!0)||t.colorKeyword()||t.mixinLookup();return e&&(i.parensInOp=!0,i=new Ce.Negative(i)),i},expression:function(){var e,t,i=[],n=s.i;do{(e=this.comment())?i.push(e):((e=this.addition()||this.entity())instanceof Ce.Comment&&(e=null),e&&(i.push(e),s.peek(/^\/[\/*]/)||(t=s.$char("/"))&&i.push(new Ce.Anonymous(t,n))))}while(e);if(i.length>0)return new Ce.Expression(i)},property:function(){var e=s.$re(/^(\*?-?[_a-zA-Z0-9-]+)\s*:/);if(e)return e[1]},ruleProperty:function(){var e,t,i=[],r=[];s.save();var o=s.$re(/^([_a-zA-Z0-9-]+)\s*:/);if(o)return i=[new Ce.Keyword(o[1])],s.forget(),i;function a(e){var t=s.i,n=s.$re(e);if(n)return r.push(t),i.push(n[1])}for(a(/^(\*?)/);a(/^((?:[\w-]+)|(?:[@\$]\{[\w-]+\}))/););if(i.length>1&&a(/^((?:\+_|\+)?)\s*:/)){for(s.forget(),""===i[0]&&(i.shift(),r.shift()),t=0;t1?e-1:e)<1?r+(s-r)*e*6:2*e<1?s:3*e<2?r+(s-r)*(2/3-e)*6:r}e=Ke(e)%360/360,t=We(Ke(t)),i=We(Ke(i)),n=We(Ke(n)),r=2*i-(s=i<=.5?i*(t+1):i+t-i*t);var a=[255*o(e+1/3),255*o(e),255*o(e-1/3)];return n=Ke(n),new c(a,n,"hsla")}catch(e){}},hsv:function(e,t,i){return ze.hsva(e,t,i,1)},hsva:function(e,t,i,n){var r,s;e=Ke(e)%360/360*360,t=Ke(t),i=Ke(i),n=Ke(n);var o=[i,i*(1-t),i*(1-(s=e/60-(r=Math.floor(e/60%6)))*t),i*(1-(1-s)*t)],a=[[0,3,1],[2,0,1],[1,0,3],[1,2,0],[3,1,0],[0,1,2]];return ze.rgba(255*o[a[r][0]],255*o[a[r][1]],255*o[a[r][2]],n)},hue:function(e){return new ee(He(e).h)},saturation:function(e){return new ee(100*He(e).s,"%")},lightness:function(e){return new ee(100*He(e).l,"%")},hsvhue:function(e){return new ee(Qe(e).h)},hsvsaturation:function(e){return new ee(100*Qe(e).s,"%")},hsvvalue:function(e){return new ee(100*Qe(e).v,"%")},red:function(e){return new ee(e.rgb[0])},green:function(e){return new ee(e.rgb[1])},blue:function(e){return new ee(e.rgb[2])},alpha:function(e){return new ee(He(e).a)},luma:function(e){return new ee(e.luma()*e.alpha*100,"%")},luminance:function(e){var t=.2126*e.rgb[0]/255+.7152*e.rgb[1]/255+.0722*e.rgb[2]/255;return new ee(t*e.alpha*100,"%")},saturate:function(e,t,i){if(!e.rgb)return null;var n=He(e);return void 0!==i&&"relative"===i.value?n.s+=n.s*t.value/100:n.s+=t.value/100,n.s=We(n.s),Je(e,n)},desaturate:function(e,t,i){var n=He(e);return void 0!==i&&"relative"===i.value?n.s-=n.s*t.value/100:n.s-=t.value/100,n.s=We(n.s),Je(e,n)},lighten:function(e,t,i){var n=He(e);return void 0!==i&&"relative"===i.value?n.l+=n.l*t.value/100:n.l+=t.value/100,n.l=We(n.l),Je(e,n)},darken:function(e,t,i){var n=He(e);return void 0!==i&&"relative"===i.value?n.l-=n.l*t.value/100:n.l-=t.value/100,n.l=We(n.l),Je(e,n)},fadein:function(e,t,i){var n=He(e);return void 0!==i&&"relative"===i.value?n.a+=n.a*t.value/100:n.a+=t.value/100,n.a=We(n.a),Je(e,n)},fadeout:function(e,t,i){var n=He(e);return void 0!==i&&"relative"===i.value?n.a-=n.a*t.value/100:n.a-=t.value/100,n.a=We(n.a),Je(e,n)},fade:function(e,t){var i=He(e);return i.a=t.value/100,i.a=We(i.a),Je(e,i)},spin:function(e,t){var i=He(e),n=(i.h+t.value)%360;return i.h=n<0?360+n:n,Je(e,i)},mix:function(e,t,i){i||(i=new ee(50));var n=i.value/100,r=2*n-1,s=He(e).a-He(t).a,o=((r*s==-1?r:(r+s)/(1+r*s))+1)/2,a=1-o,l=[e.rgb[0]*o+t.rgb[0]*a,e.rgb[1]*o+t.rgb[1]*a,e.rgb[2]*o+t.rgb[2]*a],u=e.alpha*n+t.alpha*(1-n);return new c(l,u)},greyscale:function(e){return ze.desaturate(e,new ee(100))},contrast:function(e,t,i,n){if(!e.rgb)return null;if(void 0===i&&(i=ze.rgba(255,255,255,1)),void 0===t&&(t=ze.rgba(0,0,0,1)),t.luma()>i.luma()){var r=i;i=t,t=r}return n=void 0===n?.43:Ke(n),e.luma().5&&(n=1,i=e>.25?Math.sqrt(e):((16*e-12)*e+4)*e),e-(1-2*t)*n*(i-e)},hardlight:function(e,t){return Ye.overlay(t,e)},difference:function(e,t){return Math.abs(e-t)},exclusion:function(e,t){return e+t-2*e*t},average:function(e,t){return(e+t)/2},negation:function(e,t){return 1-Math.abs(e+t-1)}};for(var et in Ye)Ye.hasOwnProperty(et)&&(Xe[et]=Xe.bind(null,Ye[et]));var tt=function(e){return Array.isArray(e.value)?e.value:Array(e)},it={_SELF:function(e){return e},"~":function(){for(var e=[],t=0;to.value)&&(c[n]=r);else{if(void 0!==l&&a!==l)throw{type:"Argument",message:"incompatible types"};h[a]=c.length,c.push(r)}else Array.isArray(t[i].value)&&Array.prototype.push.apply(t,Array.prototype.slice.call(t[i].value));return 1==c.length?c[0]:(t=c.map((function(e){return e.toCSS(this.context)})).join(this.context.compress?",":", "),new j((e?"min":"max")+"("+t+")"))},at={min:function(){for(var e=[],t=0;t",r=0;r";return n+="',n=encodeURIComponent(n),new ce(new ue("'"+(n="data:image/svg+xml,"+n)+"'",n,!1,this.index,this.currentFileInfo),this.index,this.currentFileInfo)}}),H.addMultiple(ht),t};function pt(e,t){var i,n=(t=t||{}).variables,r=new q.Eval(t);"object"!=typeof n||Array.isArray(n)||(n=Object.keys(n).map((function(e){var t=n[e];return t instanceof Ce.Value||(t instanceof Ce.Expression||(t=new Ce.Expression([t])),t=new Ce.Value([t])),new Ce.Declaration("@"+e,t,!1,null,0)})),r.frames=[new Ce.Ruleset(null,n)]);var s,o,a=[new De.JoinSelectorVisitor,new De.MarkVisibleSelectorsVisitor(!0),new De.ExtendVisitor,new De.ToCSSVisitor({compress:Boolean(t.compress)})],l=[];if(t.pluginManager){o=t.pluginManager.visitor();for(var u=0;u<2;u++)for(o.first();s=o.get();)s.isPreEvalVisitor?0!==u&&-1!==l.indexOf(s)||(l.push(s),s.run(e)):0!==u&&-1!==a.indexOf(s)||(s.isPreVisitor?a.unshift(s):a.push(s))}i=e.eval(r);for(u=0;u=t);i++);this.preProcessors.splice(i,0,{preProcessor:e,priority:t})},e.prototype.addPostProcessor=function(e,t){var i;for(i=0;i=t);i++);this.postProcessors.splice(i,0,{postProcessor:e,priority:t})},e.prototype.addFileManager=function(e){this.fileManagers.push(e)},e.prototype.getPreProcessors=function(){for(var e=[],t=0;t0){var n=void 0,r=JSON.stringify(this._sourceMapGenerator.toJSON());this.sourceMapURL?n=this.sourceMapURL:this._sourceMapFilename&&(n=this._sourceMapFilename),this.sourceMapURL=n,this.sourceMap=r}return this._css.join("")},t}()}(e=new s(e,t)),e)),a=function(e){return function(){function t(e,t,i){this.less=e,this.rootFilename=i.filename,this.paths=t.paths||[],this.contents={},this.contentsIgnoredChars={},this.mime=t.mime,this.error=null,this.context=t,this.queue=[],this.files={}}return t.prototype.push=function(t,i,n,s,o){var a=this,l=this.context.pluginManager.Loader;this.queue.push(t);var u=function(e,i,n){a.queue.splice(a.queue.indexOf(t),1);var l=n===a.rootFilename;s.optional&&e?(o(null,{rules:[]},!1,null),r.info("The file "+n+" was skipped because it was not found and the import was marked optional.")):(a.files[n]||s.inline||(a.files[n]={root:i,options:s}),e&&!a.error&&(a.error=e),o(e,i,l,n))},c={rewriteUrls:this.context.rewriteUrls,entryPath:n.entryPath,rootpath:n.rootpath,rootFilename:n.rootFilename},h=e.getFileManager(t,n.currentDirectory,this.context,e);if(h){var f,p,v=function(e){var t,i=e.filename,r=e.contents.replace(/^\uFEFF/,"");c.currentDirectory=h.getPath(i),c.rewriteUrls&&(c.rootpath=h.join(a.context.rootpath||"",h.pathDiff(c.currentDirectory,c.entryPath)),!h.isPathAbsolute(c.rootpath)&&h.alwaysMakePathsAbsolute()&&(c.rootpath=h.join(c.entryPath,c.rootpath))),c.filename=i;var o=new q.Parse(a.context);o.processImports=!1,a.contents[i]=r,(n.reference||s.reference)&&(c.reference=!0),s.isPlugin?(t=l.evalPlugin(r,o,a,s.pluginArgs,c))instanceof O?u(t,null,i):u(null,t,i):s.inline?u(null,r,i):!a.files[i]||a.files[i].options.multiple||s.multiple?new Be(o,a,c).parse(r,(function(e,t){u(e,t,i)})):u(null,a.files[i].root,i)},d=_(this.context);i&&(d.ext=s.isPlugin?".js":".less"),s.isPlugin?(d.mime="application/javascript",d.syncImport?f=l.loadPluginSync(t,n.currentDirectory,d,e,h):p=l.loadPlugin(t,n.currentDirectory,d,e,h)):d.syncImport?f=h.loadFileSync(t,n.currentDirectory,d,e):p=h.loadFile(t,n.currentDirectory,d,e,(function(e,t){e?u(e):v(t)})),f?f.filename?v(f):u(f):p&&p.then(v,u)}else u({message:"Could not find a file-manager for "+t})},t}()}(e);var u,c=function(e,t,i){var n=function(e,i,r){if("function"==typeof i?(r=i,i=M(this.options,{})):i=M(this.options,i||{}),!r){var s=this;return new Promise((function(t,r){n.call(s,e,i,(function(e,i){e?r(e):t(i)}))}))}this.parse(e,i,(function(e,i,n,s){if(e)return r(e);var o;try{o=new t(i,n).toCSS(s)}catch(e){return r(e)}r(null,o)}))};return n}(0,o),h=function(e,t,i){var n=function(e,t,r){if("function"==typeof t?(r=t,t=M(this.options,{})):t=M(this.options,t||{}),!r){var s=this;return new Promise((function(i,r){n.call(s,e,t,(function(e,t){e?r(e):i(t)}))}))}var o,a=void 0,l=new mt(this,!t.reUsePluginManager);if(t.pluginManager=l,o=new q.Parse(t),t.rootFileInfo)a=t.rootFileInfo;else{var u=t.filename||"input",c=u.replace(/[^\/\\]*$/,"");(a={filename:u,rewriteUrls:o.rewriteUrls,rootpath:o.rootpath||"",currentDirectory:c,entryPath:c,rootFilename:u}).rootpath&&"/"!==a.rootpath.slice(-1)&&(a.rootpath+="/")}var h=new i(this,o,a);this.importManager=h,t.plugins&&t.plugins.forEach((function(e){var t,i;if(e.fileContent){if(i=e.fileContent.replace(/^\uFEFF/,""),(t=l.Loader.evalPlugin(i,o,h,e.options,e.filename))instanceof O)return r(t)}else l.addPlugin(e)})),new Be(o,h,a).parse(e,(function(e,i){if(e)return r(e);r(null,i,h,t)}),t)};return n}(0,0,a),f=bt("4.0.0"),p={version:[f.major,f.minor,f.patch],data:l,tree:Ce,Environment:s,AbstractFileManager:ke,AbstractPluginLoader:_e,environment:e,visitors:De,Parser:Be,functions:ft(e),contexts:q,SourceMapOutput:i,SourceMapBuilder:n,ParseTree:o,ImportManager:a,render:c,parse:h,LessError:O,transformTree:pt,utils:P,PluginManager:mt,logger:r},v=function(e){return function(){var t=Object.create(e.prototype);return e.apply(t,Array.prototype.slice.call(arguments,0)),t}},d=Object.create(p);for(var m in p.tree)if("function"==typeof(u=p.tree[m]))d[m.toLowerCase()]=v(u);else for(var g in d[m]=Object.create(null),u)d[m][g.toLowerCase()]=v(u[g]);return p.parse=p.parse.bind(d),p.render=p.render.bind(d),d}var xt={},St=function(){};St.prototype=Object.assign(new ke,{alwaysMakePathsAbsolute:function(){return!0},join:function(e,t){return e?this.extractUrlParts(t,e).path:t},doXHR:function(e,t,i,n){var r=new XMLHttpRequest,s=!gt.isFileProtocol||gt.fileAsync;function o(t,i,n){t.status>=200&&t.status<300?i(t.responseText,t.getResponseHeader("Last-Modified")):"function"==typeof n&&n(t.status,e)}"function"==typeof r.overrideMimeType&&r.overrideMimeType("text/css"),yt.debug("XHR: Getting '"+e+"'"),r.open("GET",e,s),r.setRequestHeader("Accept",t||"text/x-less, text/css; q=0.9, */*; q=0.5"),r.send(null),gt.isFileProtocol&&!gt.fileAsync?0===r.status||r.status>=200&&r.status<300?i(r.responseText):n(r.status,e):s?r.onreadystatechange=function(){4==r.readyState&&o(r,i,n)}:o(r,i,n)},supports:function(){return!0},clearFileCache:function(){xt={}},loadFile:function(e,t,i,n){t&&!this.isPathAbsolute(e)&&(e=t+e),e=i.ext?this.tryAppendExtension(e,i.ext):e,i=i||{};var r=this.extractUrlParts(e,window.location.href).url,s=this;return new Promise((function(e,t){if(i.useFileCache&&xt[r])try{var n=xt[r];return e({contents:n,filename:r,webInfo:{lastModified:new Date}})}catch(e){return t({filename:r,message:"Error loading file "+r+" error was "+e.message})}s.doXHR(r,i.mime,(function(t,i){xt[r]=t,e({contents:t,filename:r,webInfo:{lastModified:i}})}),(function(e,i){t({type:"File",message:"'"+i+"' wasn't found ("+e+")",href:r})}))}))}});var It=function(e,t){return gt=e,yt=t,St},Ct=function(e){this.less=e};Ct.prototype=Object.assign(new _e,{loadPlugin:function(e,t,i,n,r){return new Promise((function(s,o){r.loadFile(e,t,i,n).then(s).catch(o)}))}});var kt=function(t,n,r){return{add:function(s,o){r.errorReporting&&"html"!==r.errorReporting?"console"===r.errorReporting?function(e,t){var i=e.filename||t,s=[],o=(e.type||"Syntax")+"Error: "+(e.message||"There is an error in your .less file")+" in "+i,a=function(e,t,i){void 0!==e.extract[t]&&s.push("{line} {content}".replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,i).replace(/\{content\}/,e.extract[t]))};e.line&&(a(e,0,""),a(e,1,"line"),a(e,2,""),o+=" on line "+e.line+", column "+(e.column+1)+":\n"+s.join("\n")),e.stack&&(e.extract||r.logLevel>=4)&&(o+="\nStack Trace\n"+e.stack),n.logger.error(o)}(s,o):"function"==typeof r.errorReporting&&r.errorReporting("add",s,o):function(n,s){var o,a,l="less-error-message:"+e(s||""),u=t.document.createElement("div"),c=[],h=n.filename||s,f=h.match(/([^\/]+(\?.*)?)$/)[1];u.id=l,u.className="less-error-message",a="

    "+(n.type||"Syntax")+"Error: "+(n.message||"There is an error in your .less file")+'

    in '+f+" ";var p=function(e,t,i){void 0!==e.extract[t]&&c.push('

  • {content}
  • '.replace(/\{line\}/,(parseInt(e.line,10)||0)+(t-1)).replace(/\{class\}/,i).replace(/\{content\}/,e.extract[t]))};n.line&&(p(n,0,""),p(n,1,"line"),p(n,2,""),a+="on line "+n.line+", column "+(n.column+1)+":

      "+c.join("")+"
    "),n.stack&&(n.extract||r.logLevel>=4)&&(a+="
    Stack Trace
    "+n.stack.split("\n").slice(1).join("
    ")),u.innerHTML=a,i(t.document,[".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #dd6666;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.line {","color: #ff0000;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),u.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),"development"===r.env&&(o=setInterval((function(){var e=t.document,i=e.body;i&&(e.getElementById(l)?i.replaceChild(u,e.getElementById(l)):i.insertBefore(u,i.firstChild),clearInterval(o))}),10))}(s,o)},remove:function(i){r.errorReporting&&"html"!==r.errorReporting?"console"===r.errorReporting||"function"==typeof r.errorReporting&&r.errorReporting("remove",i):function(i){var n=t.document.getElementById("less-error-message:"+e(i));n&&n.parentNode.removeChild(n)}(i)}}},_t={javascriptEnabled:!1,depends:!1,compress:!1,lint:!1,paths:[],color:!0,strictImports:!1,insecure:!1,rootpath:"",rewriteUrls:!1,math:1,strictUnits:!1,globalVars:null,modifyVars:null,urlArgs:""};if(window.less)for(var At in window.less)window.less.hasOwnProperty(At)&&(_t[At]=window.less[At]);!function(e,i){t(i,n(e)),void 0===i.isFileProtocol&&(i.isFileProtocol=/^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(e.location.protocol)),i.async=i.async||!1,i.fileAsync=i.fileAsync||!1,i.poll=i.poll||(i.isFileProtocol?1e3:1500),i.env=i.env||("127.0.0.1"==e.location.hostname||"0.0.0.0"==e.location.hostname||"localhost"==e.location.hostname||e.location.port&&e.location.port.length>0||i.isFileProtocol?"development":"production");var r=/!dumpLineNumbers:(comments|mediaquery|all)/.exec(e.location.hash);r&&(i.dumpLineNumbers=r[1]),void 0===i.useFileCache&&(i.useFileCache=!0),void 0===i.onReady&&(i.onReady=!0),i.relativeUrls&&(i.rewriteUrls="all")}(window,_t),_t.plugins=_t.plugins||[],window.LESS_PLUGINS&&(_t.plugins=_t.plugins.concat(window.LESS_PLUGINS));var Mt,Et,Pt,Rt=function(e,n){var r=e.document,s=wt();s.options=n;var o=s.environment,a=It(n,s.logger),l=new a;o.addFileManager(l),s.FileManager=a,s.PluginLoader=Ct,function(e,t){t.logLevel=void 0!==t.logLevel?t.logLevel:"development"===t.env?3:1,t.loggers||(t.loggers=[{debug:function(e){t.logLevel>=4&&console.log(e)},info:function(e){t.logLevel>=3&&console.log(e)},warn:function(e){t.logLevel>=2&&console.warn(e)},error:function(e){t.logLevel>=1&&console.error(e)}}]);for(var i=0;i 0 && styleNode.childNodes.length > 0 &&\n oldStyleNode.firstChild.nodeValue === styleNode.firstChild.nodeValue);\n }\n\n const head = document.getElementsByTagName('head')[0];\n\n // If there is no oldStyleNode, just append; otherwise, only append if we need\n // to replace oldStyleNode with an updated stylesheet\n if (oldStyleNode === null || keepOldStyleNode === false) {\n const nextEl = sheet && sheet.nextSibling || null;\n if (nextEl) {\n nextEl.parentNode.insertBefore(styleNode, nextEl);\n } else {\n head.appendChild(styleNode);\n }\n }\n if (oldStyleNode && keepOldStyleNode === false) {\n oldStyleNode.parentNode.removeChild(oldStyleNode);\n }\n\n // For IE.\n // This needs to happen *after* the style element is added to the DOM, otherwise IE 7 and 8 may crash.\n // See http://social.msdn.microsoft.com/Forums/en-US/7e081b65-878a-4c22-8e68-c10d39c2ed32/internet-explorer-crashes-appending-style-element-to-head\n if (styleNode.styleSheet) {\n try {\n styleNode.styleSheet.cssText = styles;\n } catch (e) {\n throw new Error('Couldn\\'t reassign styleSheet.cssText.');\n }\n }\n },\n currentScript: function(window) {\n const document = window.document;\n return document.currentScript || (() => {\n const scripts = document.getElementsByTagName('script');\n return scripts[scripts.length - 1];\n })();\n }\n};\n","export default {\n error: function(msg) {\n this._fireEvent('error', msg);\n },\n warn: function(msg) {\n this._fireEvent('warn', msg);\n },\n info: function(msg) {\n this._fireEvent('info', msg);\n },\n debug: function(msg) {\n this._fireEvent('debug', msg);\n },\n addListener: function(listener) {\n this._listeners.push(listener);\n },\n removeListener: function(listener) {\n for (let i = 0; i < this._listeners.length; i++) {\n if (this._listeners[i] === listener) {\n this._listeners.splice(i, 1);\n return;\n }\n }\n },\n _fireEvent: function(type, msg) {\n for (let i = 0; i < this._listeners.length; i++) {\n const logFunction = this._listeners[i][type];\n if (logFunction) {\n logFunction(msg);\n }\n }\n },\n _listeners: []\n};\n","/**\n * @todo Document why this abstraction exists, and the relationship between\n * environment, file managers, and plugin manager\n */\n\nimport logger from '../logger';\n\nclass Environment {\n constructor(externalEnvironment, fileManagers) {\n this.fileManagers = fileManagers || [];\n externalEnvironment = externalEnvironment || {};\n\n const optionalFunctions = ['encodeBase64', 'mimeLookup', 'charsetLookup', 'getSourceMapGenerator'];\n const requiredFunctions = [];\n const functions = requiredFunctions.concat(optionalFunctions);\n\n for (let i = 0; i < functions.length; i++) {\n const propName = functions[i];\n const environmentFunc = externalEnvironment[propName];\n if (environmentFunc) {\n this[propName] = environmentFunc.bind(externalEnvironment);\n } else if (i < requiredFunctions.length) {\n this.warn(`missing required function in environment - ${propName}`);\n }\n }\n }\n\n getFileManager(filename, currentDirectory, options, environment, isSync) {\n\n if (!filename) {\n logger.warn('getFileManager called with no filename.. Please report this issue. continuing.');\n }\n if (currentDirectory == null) {\n logger.warn('getFileManager called with null directory.. Please report this issue. continuing.');\n }\n\n let fileManagers = this.fileManagers;\n if (options.pluginManager) {\n fileManagers = [].concat(fileManagers).concat(options.pluginManager.getFileManagers());\n }\n for (let i = fileManagers.length - 1; i >= 0 ; i--) {\n const fileManager = fileManagers[i];\n if (fileManager[isSync ? 'supportsSync' : 'supports'](filename, currentDirectory, options, environment)) {\n return fileManager;\n }\n }\n return null;\n }\n\n addFileManager(fileManager) {\n this.fileManagers.push(fileManager);\n }\n\n clearFileManagers() {\n this.fileManagers = [];\n }\n}\n\nexport default Environment;\n","export default {\n 'aliceblue':'#f0f8ff',\n 'antiquewhite':'#faebd7',\n 'aqua':'#00ffff',\n 'aquamarine':'#7fffd4',\n 'azure':'#f0ffff',\n 'beige':'#f5f5dc',\n 'bisque':'#ffe4c4',\n 'black':'#000000',\n 'blanchedalmond':'#ffebcd',\n 'blue':'#0000ff',\n 'blueviolet':'#8a2be2',\n 'brown':'#a52a2a',\n 'burlywood':'#deb887',\n 'cadetblue':'#5f9ea0',\n 'chartreuse':'#7fff00',\n 'chocolate':'#d2691e',\n 'coral':'#ff7f50',\n 'cornflowerblue':'#6495ed',\n 'cornsilk':'#fff8dc',\n 'crimson':'#dc143c',\n 'cyan':'#00ffff',\n 'darkblue':'#00008b',\n 'darkcyan':'#008b8b',\n 'darkgoldenrod':'#b8860b',\n 'darkgray':'#a9a9a9',\n 'darkgrey':'#a9a9a9',\n 'darkgreen':'#006400',\n 'darkkhaki':'#bdb76b',\n 'darkmagenta':'#8b008b',\n 'darkolivegreen':'#556b2f',\n 'darkorange':'#ff8c00',\n 'darkorchid':'#9932cc',\n 'darkred':'#8b0000',\n 'darksalmon':'#e9967a',\n 'darkseagreen':'#8fbc8f',\n 'darkslateblue':'#483d8b',\n 'darkslategray':'#2f4f4f',\n 'darkslategrey':'#2f4f4f',\n 'darkturquoise':'#00ced1',\n 'darkviolet':'#9400d3',\n 'deeppink':'#ff1493',\n 'deepskyblue':'#00bfff',\n 'dimgray':'#696969',\n 'dimgrey':'#696969',\n 'dodgerblue':'#1e90ff',\n 'firebrick':'#b22222',\n 'floralwhite':'#fffaf0',\n 'forestgreen':'#228b22',\n 'fuchsia':'#ff00ff',\n 'gainsboro':'#dcdcdc',\n 'ghostwhite':'#f8f8ff',\n 'gold':'#ffd700',\n 'goldenrod':'#daa520',\n 'gray':'#808080',\n 'grey':'#808080',\n 'green':'#008000',\n 'greenyellow':'#adff2f',\n 'honeydew':'#f0fff0',\n 'hotpink':'#ff69b4',\n 'indianred':'#cd5c5c',\n 'indigo':'#4b0082',\n 'ivory':'#fffff0',\n 'khaki':'#f0e68c',\n 'lavender':'#e6e6fa',\n 'lavenderblush':'#fff0f5',\n 'lawngreen':'#7cfc00',\n 'lemonchiffon':'#fffacd',\n 'lightblue':'#add8e6',\n 'lightcoral':'#f08080',\n 'lightcyan':'#e0ffff',\n 'lightgoldenrodyellow':'#fafad2',\n 'lightgray':'#d3d3d3',\n 'lightgrey':'#d3d3d3',\n 'lightgreen':'#90ee90',\n 'lightpink':'#ffb6c1',\n 'lightsalmon':'#ffa07a',\n 'lightseagreen':'#20b2aa',\n 'lightskyblue':'#87cefa',\n 'lightslategray':'#778899',\n 'lightslategrey':'#778899',\n 'lightsteelblue':'#b0c4de',\n 'lightyellow':'#ffffe0',\n 'lime':'#00ff00',\n 'limegreen':'#32cd32',\n 'linen':'#faf0e6',\n 'magenta':'#ff00ff',\n 'maroon':'#800000',\n 'mediumaquamarine':'#66cdaa',\n 'mediumblue':'#0000cd',\n 'mediumorchid':'#ba55d3',\n 'mediumpurple':'#9370d8',\n 'mediumseagreen':'#3cb371',\n 'mediumslateblue':'#7b68ee',\n 'mediumspringgreen':'#00fa9a',\n 'mediumturquoise':'#48d1cc',\n 'mediumvioletred':'#c71585',\n 'midnightblue':'#191970',\n 'mintcream':'#f5fffa',\n 'mistyrose':'#ffe4e1',\n 'moccasin':'#ffe4b5',\n 'navajowhite':'#ffdead',\n 'navy':'#000080',\n 'oldlace':'#fdf5e6',\n 'olive':'#808000',\n 'olivedrab':'#6b8e23',\n 'orange':'#ffa500',\n 'orangered':'#ff4500',\n 'orchid':'#da70d6',\n 'palegoldenrod':'#eee8aa',\n 'palegreen':'#98fb98',\n 'paleturquoise':'#afeeee',\n 'palevioletred':'#d87093',\n 'papayawhip':'#ffefd5',\n 'peachpuff':'#ffdab9',\n 'peru':'#cd853f',\n 'pink':'#ffc0cb',\n 'plum':'#dda0dd',\n 'powderblue':'#b0e0e6',\n 'purple':'#800080',\n 'rebeccapurple':'#663399',\n 'red':'#ff0000',\n 'rosybrown':'#bc8f8f',\n 'royalblue':'#4169e1',\n 'saddlebrown':'#8b4513',\n 'salmon':'#fa8072',\n 'sandybrown':'#f4a460',\n 'seagreen':'#2e8b57',\n 'seashell':'#fff5ee',\n 'sienna':'#a0522d',\n 'silver':'#c0c0c0',\n 'skyblue':'#87ceeb',\n 'slateblue':'#6a5acd',\n 'slategray':'#708090',\n 'slategrey':'#708090',\n 'snow':'#fffafa',\n 'springgreen':'#00ff7f',\n 'steelblue':'#4682b4',\n 'tan':'#d2b48c',\n 'teal':'#008080',\n 'thistle':'#d8bfd8',\n 'tomato':'#ff6347',\n 'turquoise':'#40e0d0',\n 'violet':'#ee82ee',\n 'wheat':'#f5deb3',\n 'white':'#ffffff',\n 'whitesmoke':'#f5f5f5',\n 'yellow':'#ffff00',\n 'yellowgreen':'#9acd32'\n};","export default {\n length: {\n 'm': 1,\n 'cm': 0.01,\n 'mm': 0.001,\n 'in': 0.0254,\n 'px': 0.0254 / 96,\n 'pt': 0.0254 / 72,\n 'pc': 0.0254 / 72 * 12\n },\n duration: {\n 's': 1,\n 'ms': 0.001\n },\n angle: {\n 'rad': 1 / (2 * Math.PI),\n 'deg': 1 / 360,\n 'grad': 1 / 400,\n 'turn': 1\n }\n};","import colors from './colors';\nimport unitConversions from './unit-conversions';\n\nexport default { colors, unitConversions };\n","/**\n * The reason why Node is a class and other nodes simply do not extend\n * from Node (since we're transpiling) is due to this issue:\n * \n * https://github.com/less/less.js/issues/3434\n */\nclass Node {\n constructor() {\n this.parent = null;\n this.visibilityBlocks = undefined;\n this.nodeVisible = undefined;\n this.rootNode = null;\n this.parsed = null;\n\n const self = this;\n Object.defineProperty(this, 'currentFileInfo', {\n get: function() { return self.fileInfo(); }\n });\n Object.defineProperty(this, 'index', {\n get: function() { return self.getIndex(); }\n });\n\n }\n\n setParent(nodes, parent) {\n function set(node) {\n if (node && node instanceof Node) {\n node.parent = parent;\n }\n }\n if (Array.isArray(nodes)) {\n nodes.forEach(set);\n }\n else {\n set(nodes);\n }\n }\n\n getIndex() {\n return this._index || (this.parent && this.parent.getIndex()) || 0;\n }\n\n fileInfo() {\n return this._fileInfo || (this.parent && this.parent.fileInfo()) || {};\n }\n\n isRulesetLike() { return false; }\n\n toCSS(context) {\n const strs = [];\n this.genCSS(context, {\n add: function(chunk, fileInfo, index) {\n strs.push(chunk);\n },\n isEmpty: function () {\n return strs.length === 0;\n }\n });\n return strs.join('');\n }\n\n genCSS(context, output) {\n output.add(this.value);\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n eval() { return this; }\n\n _operate(context, op, a, b) {\n switch (op) {\n case '+': return a + b;\n case '-': return a - b;\n case '*': return a * b;\n case '/': return a / b;\n }\n }\n\n fround(context, value) {\n const precision = context && context.numPrecision;\n // add \"epsilon\" to ensure numbers like 1.000000005 (represented as 1.000000004999...) are properly rounded:\n return (precision) ? Number((value + 2e-16).toFixed(precision)) : value;\n }\n\n static compare(a, b) {\n /* returns:\n -1: a < b\n 0: a = b\n 1: a > b\n and *any* other value for a != b (e.g. undefined, NaN, -2 etc.) */\n\n if ((a.compare) &&\n // for \"symmetric results\" force toCSS-based comparison\n // of Quoted or Anonymous if either value is one of those\n !(b.type === 'Quoted' || b.type === 'Anonymous')) {\n return a.compare(b);\n } else if (b.compare) {\n return -b.compare(a);\n } else if (a.type !== b.type) {\n return undefined;\n }\n\n a = a.value;\n b = b.value;\n if (!Array.isArray(a)) {\n return a === b ? 0 : undefined;\n }\n if (a.length !== b.length) {\n return undefined;\n }\n for (let i = 0; i < a.length; i++) {\n if (Node.compare(a[i], b[i]) !== 0) {\n return undefined;\n }\n }\n return 0;\n }\n\n static numericCompare(a, b) {\n return a < b ? -1\n : a === b ? 0\n : a > b ? 1 : undefined;\n }\n\n // Returns true if this node represents root of ast imported by reference\n blocksVisibility() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n return this.visibilityBlocks !== 0;\n }\n\n addVisibilityBlock() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks + 1;\n }\n\n removeVisibilityBlock() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks - 1;\n }\n\n // Turns on node visibility - if called node will be shown in output regardless\n // of whether it comes from import by reference or not\n ensureVisibility() {\n this.nodeVisible = true;\n }\n\n // Turns off node visibility - if called node will NOT be shown in output regardless\n // of whether it comes from import by reference or not\n ensureInvisibility() {\n this.nodeVisible = false;\n }\n\n // return values:\n // false - the node must not be visible\n // true - the node must be visible\n // undefined or null - the node has the same visibility as its parent\n isVisible() {\n return this.nodeVisible;\n }\n\n visibilityInfo() {\n return {\n visibilityBlocks: this.visibilityBlocks,\n nodeVisible: this.nodeVisible\n };\n }\n\n copyVisibilityInfo(info) {\n if (!info) {\n return;\n }\n this.visibilityBlocks = info.visibilityBlocks;\n this.nodeVisible = info.nodeVisible;\n }\n}\n\nexport default Node;\n","import Node from './node';\nimport colors from '../data/colors';\n\n//\n// RGB Colors - #ff0014, #eee\n//\nconst Color = function(rgb, a, originalForm) {\n const self = this;\n //\n // The end goal here, is to parse the arguments\n // into an integer triplet, such as `128, 255, 0`\n //\n // This facilitates operations and conversions.\n //\n if (Array.isArray(rgb)) {\n this.rgb = rgb;\n } else if (rgb.length >= 6) {\n this.rgb = [];\n rgb.match(/.{2}/g).map(function (c, i) {\n if (i < 3) {\n self.rgb.push(parseInt(c, 16));\n } else {\n self.alpha = (parseInt(c, 16)) / 255;\n }\n });\n } else {\n this.rgb = [];\n rgb.split('').map(function (c, i) {\n if (i < 3) {\n self.rgb.push(parseInt(c + c, 16));\n } else {\n self.alpha = (parseInt(c + c, 16)) / 255;\n }\n });\n }\n this.alpha = this.alpha || (typeof a === 'number' ? a : 1);\n if (typeof originalForm !== 'undefined') {\n this.value = originalForm;\n }\n}\n\nColor.prototype = Object.assign(new Node(), {\n type: 'Color',\n\n luma() {\n let r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255;\n\n r = (r <= 0.03928) ? r / 12.92 : Math.pow(((r + 0.055) / 1.055), 2.4);\n g = (g <= 0.03928) ? g / 12.92 : Math.pow(((g + 0.055) / 1.055), 2.4);\n b = (b <= 0.03928) ? b / 12.92 : Math.pow(((b + 0.055) / 1.055), 2.4);\n\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n },\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n },\n\n toCSS(context, doNotCompress) {\n const compress = context && context.compress && !doNotCompress;\n let color;\n let alpha;\n let colorFunction;\n let args = [];\n\n // `value` is set if this color was originally\n // converted from a named color string so we need\n // to respect this and try to output named color too.\n alpha = this.fround(context, this.alpha);\n\n if (this.value) {\n if (this.value.indexOf('rgb') === 0) {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n } else if (this.value.indexOf('hsl') === 0) {\n if (alpha < 1) {\n colorFunction = 'hsla';\n } else {\n colorFunction = 'hsl';\n }\n } else {\n return this.value;\n }\n } else {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n }\n\n switch (colorFunction) {\n case 'rgba':\n args = this.rgb.map(function (c) {\n return clamp(Math.round(c), 255);\n }).concat(clamp(alpha, 1));\n break;\n case 'hsla':\n args.push(clamp(alpha, 1));\n case 'hsl':\n color = this.toHSL();\n args = [\n this.fround(context, color.h),\n `${this.fround(context, color.s * 100)}%`,\n `${this.fround(context, color.l * 100)}%`\n ].concat(args);\n }\n\n if (colorFunction) {\n // Values are capped between `0` and `255`, rounded and zero-padded.\n return `${colorFunction}(${args.join(`,${compress ? '' : ' '}`)})`;\n }\n\n color = this.toRGB();\n\n if (compress) {\n const splitcolor = color.split('');\n\n // Convert color to short format\n if (splitcolor[1] === splitcolor[2] && splitcolor[3] === splitcolor[4] && splitcolor[5] === splitcolor[6]) {\n color = `#${splitcolor[1]}${splitcolor[3]}${splitcolor[5]}`;\n }\n }\n\n return color;\n },\n\n //\n // Operations have to be done per-channel, if not,\n // channels will spill onto each other. Once we have\n // our result, in the form of an integer triplet,\n // we create a new Color node to hold the result.\n //\n operate(context, op, other) {\n const rgb = new Array(3);\n const alpha = this.alpha * (1 - other.alpha) + other.alpha;\n for (let c = 0; c < 3; c++) {\n rgb[c] = this._operate(context, op, this.rgb[c], other.rgb[c]);\n }\n return new Color(rgb, alpha);\n },\n\n toRGB() {\n return toHex(this.rgb);\n },\n\n toHSL() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h;\n let s;\n const l = (max + min) / 2;\n const d = max - min;\n\n if (max === min) {\n h = s = 0;\n } else {\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, l, a };\n },\n\n // Adapted from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript\n toHSV() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h;\n let s;\n const v = max;\n\n const d = max - min;\n if (max === 0) {\n s = 0;\n } else {\n s = d / max;\n }\n\n if (max === min) {\n h = 0;\n } else {\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, v, a };\n },\n\n toARGB() {\n return toHex([this.alpha * 255].concat(this.rgb));\n },\n\n compare(x) {\n return (x.rgb &&\n x.rgb[0] === this.rgb[0] &&\n x.rgb[1] === this.rgb[1] &&\n x.rgb[2] === this.rgb[2] &&\n x.alpha === this.alpha) ? 0 : undefined;\n }\n});\n\nColor.fromKeyword = function(keyword) {\n let c;\n const key = keyword.toLowerCase();\n if (colors.hasOwnProperty(key)) {\n c = new Color(colors[key].slice(1));\n }\n else if (key === 'transparent') {\n c = new Color([0, 0, 0], 0);\n }\n\n if (c) {\n c.value = keyword;\n return c;\n }\n};\n\nfunction clamp(v, max) {\n return Math.min(Math.max(v, 0), max);\n}\n\nfunction toHex(v) {\n return `#${v.map(function (c) {\n c = clamp(Math.round(c), 255);\n return (c < 16 ? '0' : '') + c.toString(16);\n }).join('')}`;\n}\n\nexport default Color;\n","import Node from './node';\n\nconst Paren = function(node) {\n this.value = node;\n};\n\nParen.prototype = Object.assign(new Node(), {\n type: 'Paren',\n\n genCSS(context, output) {\n output.add('(');\n this.value.genCSS(context, output);\n output.add(')');\n },\n\n eval(context) {\n return new Paren(this.value.eval(context));\n }\n});\n\nexport default Paren;\n","import Node from './node';\nconst _noSpaceCombinators = {\n '': true,\n ' ': true,\n '|': true\n};\n\nconst Combinator = function(value) {\n if (value === ' ') {\n this.value = ' ';\n this.emptyOrWhitespace = true;\n } else {\n this.value = value ? value.trim() : '';\n this.emptyOrWhitespace = this.value === '';\n }\n}\n\nCombinator.prototype = Object.assign(new Node(), {\n type: 'Combinator',\n\n genCSS(context, output) {\n const spaceOrEmpty = (context.compress || _noSpaceCombinators[this.value]) ? '' : ' ';\n output.add(spaceOrEmpty + this.value + spaceOrEmpty);\n }\n});\n\nexport default Combinator;\n","import Node from './node';\nimport Paren from './paren';\nimport Combinator from './combinator';\n\nconst Element = function(combinator, value, isVariable, index, currentFileInfo, visibilityInfo) {\n this.combinator = combinator instanceof Combinator ?\n combinator : new Combinator(combinator);\n\n if (typeof value === 'string') {\n this.value = value.trim();\n } else if (value) {\n this.value = value;\n } else {\n this.value = '';\n }\n this.isVariable = isVariable;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.combinator, this);\n}\n\nElement.prototype = Object.assign(new Node(), {\n type: 'Element',\n\n accept(visitor) {\n const value = this.value;\n this.combinator = visitor.visit(this.combinator);\n if (typeof value === 'object') {\n this.value = visitor.visit(value);\n }\n },\n\n eval(context) {\n return new Element(this.combinator,\n this.value.eval ? this.value.eval(context) : this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n },\n\n clone() {\n return new Element(this.combinator,\n this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n },\n\n genCSS(context, output) {\n output.add(this.toCSS(context), this.fileInfo(), this.getIndex());\n },\n\n toCSS(context) {\n context = context || {};\n let value = this.value;\n const firstSelector = context.firstSelector;\n if (value instanceof Paren) {\n // selector in parens should not be affected by outer selector\n // flags (breaks only interpolated selectors - see #1973)\n context.firstSelector = true;\n }\n value = value.toCSS ? value.toCSS(context) : value;\n context.firstSelector = firstSelector;\n if (value === '' && this.combinator.value.charAt(0) === '&') {\n return '';\n } else {\n return this.combinator.toCSS(context) + value;\n }\n }\n});\n\nexport default Element;\n","\nexport const Math = {\n ALWAYS: 0,\n PARENS_DIVISION: 1,\n PARENS: 2\n // removed - STRICT_LEGACY: 3\n};\n\nexport const RewriteUrls = {\n OFF: 0,\n LOCAL: 1,\n ALL: 2\n};","/**\r\n * Returns the object type of the given payload\r\n *\r\n * @param {*} payload\r\n * @returns {string}\r\n */\r\nfunction getType(payload) {\r\n return Object.prototype.toString.call(payload).slice(8, -1);\r\n}\r\n/**\r\n * Returns whether the payload is undefined\r\n *\r\n * @param {*} payload\r\n * @returns {payload is undefined}\r\n */\r\nfunction isUndefined(payload) {\r\n return getType(payload) === 'Undefined';\r\n}\r\n/**\r\n * Returns whether the payload is null\r\n *\r\n * @param {*} payload\r\n * @returns {payload is null}\r\n */\r\nfunction isNull(payload) {\r\n return getType(payload) === 'Null';\r\n}\r\n/**\r\n * Returns whether the payload is a plain JavaScript object (excluding special classes or objects with other prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Record}\r\n */\r\nfunction isPlainObject(payload) {\r\n if (getType(payload) !== 'Object')\r\n return false;\r\n return payload.constructor === Object && Object.getPrototypeOf(payload) === Object.prototype;\r\n}\r\n/**\r\n * Returns whether the payload is a plain JavaScript object (excluding special classes or objects with other prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Record}\r\n */\r\nfunction isObject(payload) {\r\n return isPlainObject(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a an empty object (excluding special classes or objects with other prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is { [K in any]: never }}\r\n */\r\nfunction isEmptyObject(payload) {\r\n return isPlainObject(payload) && Object.keys(payload).length === 0;\r\n}\r\n/**\r\n * Returns whether the payload is an any kind of object (including special classes or objects with different prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Record}\r\n */\r\nfunction isAnyObject(payload) {\r\n return getType(payload) === 'Object';\r\n}\r\n/**\r\n * Returns whether the payload is an object like a type passed in < >\r\n *\r\n * Usage: isObjectLike<{id: any}>(payload) // will make sure it's an object and has an `id` prop.\r\n *\r\n * @template T this must be passed in < >\r\n * @param {*} payload\r\n * @returns {payload is T}\r\n */\r\nfunction isObjectLike(payload) {\r\n return isAnyObject(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a function (regular or async)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is AnyFunction}\r\n */\r\nfunction isFunction(payload) {\r\n return typeof payload === \"function\";\r\n}\r\n/**\r\n * Returns whether the payload is an array\r\n *\r\n * @param {any} payload\r\n * @returns {payload is any[]}\r\n */\r\nfunction isArray(payload) {\r\n return getType(payload) === 'Array';\r\n}\r\n/**\r\n * Returns whether the payload is a an array with at least 1 item\r\n *\r\n * @param {*} payload\r\n * @returns {payload is any[]}\r\n */\r\nfunction isFullArray(payload) {\r\n return isArray(payload) && payload.length > 0;\r\n}\r\n/**\r\n * Returns whether the payload is a an empty array\r\n *\r\n * @param {*} payload\r\n * @returns {payload is []}\r\n */\r\nfunction isEmptyArray(payload) {\r\n return isArray(payload) && payload.length === 0;\r\n}\r\n/**\r\n * Returns whether the payload is a string\r\n *\r\n * @param {*} payload\r\n * @returns {payload is string}\r\n */\r\nfunction isString(payload) {\r\n return getType(payload) === 'String';\r\n}\r\n/**\r\n * Returns whether the payload is a string, BUT returns false for ''\r\n *\r\n * @param {*} payload\r\n * @returns {payload is string}\r\n */\r\nfunction isFullString(payload) {\r\n return isString(payload) && payload !== '';\r\n}\r\n/**\r\n * Returns whether the payload is ''\r\n *\r\n * @param {*} payload\r\n * @returns {payload is string}\r\n */\r\nfunction isEmptyString(payload) {\r\n return payload === '';\r\n}\r\n/**\r\n * Returns whether the payload is a number (but not NaN)\r\n *\r\n * This will return `false` for `NaN`!!\r\n *\r\n * @param {*} payload\r\n * @returns {payload is number}\r\n */\r\nfunction isNumber(payload) {\r\n return getType(payload) === 'Number' && !isNaN(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a boolean\r\n *\r\n * @param {*} payload\r\n * @returns {payload is boolean}\r\n */\r\nfunction isBoolean(payload) {\r\n return getType(payload) === 'Boolean';\r\n}\r\n/**\r\n * Returns whether the payload is a regular expression (RegExp)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is RegExp}\r\n */\r\nfunction isRegExp(payload) {\r\n return getType(payload) === 'RegExp';\r\n}\r\n/**\r\n * Returns whether the payload is a Map\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Map}\r\n */\r\nfunction isMap(payload) {\r\n return getType(payload) === 'Map';\r\n}\r\n/**\r\n * Returns whether the payload is a WeakMap\r\n *\r\n * @param {*} payload\r\n * @returns {payload is WeakMap}\r\n */\r\nfunction isWeakMap(payload) {\r\n return getType(payload) === 'WeakMap';\r\n}\r\n/**\r\n * Returns whether the payload is a Set\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Set}\r\n */\r\nfunction isSet(payload) {\r\n return getType(payload) === 'Set';\r\n}\r\n/**\r\n * Returns whether the payload is a WeakSet\r\n *\r\n * @param {*} payload\r\n * @returns {payload is WeakSet}\r\n */\r\nfunction isWeakSet(payload) {\r\n return getType(payload) === 'WeakSet';\r\n}\r\n/**\r\n * Returns whether the payload is a Symbol\r\n *\r\n * @param {*} payload\r\n * @returns {payload is symbol}\r\n */\r\nfunction isSymbol(payload) {\r\n return getType(payload) === 'Symbol';\r\n}\r\n/**\r\n * Returns whether the payload is a Date, and that the date is valid\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Date}\r\n */\r\nfunction isDate(payload) {\r\n return getType(payload) === 'Date' && !isNaN(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a Blob\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Blob}\r\n */\r\nfunction isBlob(payload) {\r\n return getType(payload) === 'Blob';\r\n}\r\n/**\r\n * Returns whether the payload is a File\r\n *\r\n * @param {*} payload\r\n * @returns {payload is File}\r\n */\r\nfunction isFile(payload) {\r\n return getType(payload) === 'File';\r\n}\r\n/**\r\n * Returns whether the payload is a Promise\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Promise}\r\n */\r\nfunction isPromise(payload) {\r\n return getType(payload) === 'Promise';\r\n}\r\n/**\r\n * Returns whether the payload is an Error\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Error}\r\n */\r\nfunction isError(payload) {\r\n return getType(payload) === 'Error';\r\n}\r\n/**\r\n * Returns whether the payload is literally the value `NaN` (it's `NaN` and also a `number`)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is typeof NaN}\r\n */\r\nfunction isNaNValue(payload) {\r\n return getType(payload) === 'Number' && isNaN(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a primitive type (eg. Boolean | Null | Undefined | Number | String | Symbol)\r\n *\r\n * @param {*} payload\r\n * @returns {(payload is boolean | null | undefined | number | string | symbol)}\r\n */\r\nfunction isPrimitive(payload) {\r\n return (isBoolean(payload) ||\r\n isNull(payload) ||\r\n isUndefined(payload) ||\r\n isNumber(payload) ||\r\n isString(payload) ||\r\n isSymbol(payload));\r\n}\r\n/**\r\n * Returns true whether the payload is null or undefined\r\n *\r\n * @param {*} payload\r\n * @returns {(payload is null | undefined)}\r\n */\r\nfunction isNullOrUndefined(payload) {\r\n return isNull(payload) || isUndefined(payload);\r\n}\r\n/**\r\n * Does a generic check to check that the given payload is of a given type.\r\n * In cases like Number, it will return true for NaN as NaN is a Number (thanks javascript!);\r\n * It will, however, differentiate between object and null\r\n *\r\n * @template T\r\n * @param {*} payload\r\n * @param {T} type\r\n * @throws {TypeError} Will throw type error if type is an invalid type\r\n * @returns {payload is T}\r\n */\r\nfunction isType(payload, type) {\r\n if (!(type instanceof Function)) {\r\n throw new TypeError('Type must be a function');\r\n }\r\n if (!Object.prototype.hasOwnProperty.call(type, 'prototype')) {\r\n throw new TypeError('Type is not a class');\r\n }\r\n // Classes usually have names (as functions usually have names)\r\n var name = type.name;\r\n return getType(payload) === name || Boolean(payload && payload.constructor === type);\r\n}\n\nexport { getType, isAnyObject, isArray, isBlob, isBoolean, isDate, isEmptyArray, isEmptyObject, isEmptyString, isError, isFile, isFullArray, isFullString, isFunction, isMap, isNaNValue, isNull, isNullOrUndefined, isNumber, isObject, isObjectLike, isPlainObject, isPrimitive, isPromise, isRegExp, isSet, isString, isSymbol, isType, isUndefined, isWeakMap, isWeakSet };\n","import { isArray, isPlainObject } from 'is-what';\n\n/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n\r\nfunction __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\n\nfunction assignProp(carry, key, newVal, originalObject, includeNonenumerable) {\r\n var propType = {}.propertyIsEnumerable.call(originalObject, key)\r\n ? 'enumerable'\r\n : 'nonenumerable';\r\n if (propType === 'enumerable')\r\n carry[key] = newVal;\r\n if (includeNonenumerable && propType === 'nonenumerable') {\r\n Object.defineProperty(carry, key, {\r\n value: newVal,\r\n enumerable: false,\r\n writable: true,\r\n configurable: true,\r\n });\r\n }\r\n}\r\n/**\r\n * Copy (clone) an object and all its props recursively to get rid of any prop referenced of the original object. Arrays are also cloned, however objects inside arrays are still linked.\r\n *\r\n * @export\r\n * @template T\r\n * @param {T} target Target can be anything\r\n * @param {Options} [options={}] Options can be `props` or `nonenumerable`\r\n * @returns {T} the target with replaced values\r\n * @export\r\n */\r\nfunction copy(target, options) {\r\n if (options === void 0) { options = {}; }\r\n if (isArray(target))\r\n return target.map(function (i) { return copy(i, options); });\r\n if (!isPlainObject(target))\r\n return target;\r\n var props = Object.getOwnPropertyNames(target);\r\n var symbols = Object.getOwnPropertySymbols(target);\r\n return __spreadArrays(props, symbols).reduce(function (carry, key) {\r\n if (isArray(options.props) && !options.props.includes(key)) {\r\n return carry;\r\n }\r\n var val = target[key];\r\n var newVal = copy(val, options);\r\n assignProp(carry, key, newVal, target, options.nonenumerable);\r\n return carry;\r\n }, {});\r\n}\n\nexport { copy };\n","/* jshint proto: true */\nimport * as Constants from './constants';\nimport { copy } from 'copy-anything';\n\nexport function getLocation(index, inputStream) {\n let n = index + 1;\n let line = null;\n let column = -1;\n\n while (--n >= 0 && inputStream.charAt(n) !== '\\n') {\n column++;\n }\n\n if (typeof index === 'number') {\n line = (inputStream.slice(0, index).match(/\\n/g) || '').length;\n }\n\n return {\n line,\n column\n };\n}\n\nexport function copyArray(arr) {\n let i;\n const length = arr.length;\n const copy = new Array(length);\n\n for (i = 0; i < length; i++) {\n copy[i] = arr[i];\n }\n return copy;\n}\n\nexport function clone(obj) {\n const cloned = {};\n for (const prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n cloned[prop] = obj[prop];\n }\n }\n return cloned;\n}\n\nexport function defaults(obj1, obj2) {\n let newObj = obj2 || {};\n if (!obj2._defaults) {\n newObj = {};\n const defaults = copy(obj1);\n newObj._defaults = defaults;\n const cloned = obj2 ? copy(obj2) : {};\n Object.assign(newObj, defaults, cloned);\n }\n return newObj;\n}\n\nexport function copyOptions(obj1, obj2) {\n if (obj2 && obj2._defaults) {\n return obj2;\n }\n const opts = defaults(obj1, obj2);\n if (opts.strictMath) {\n opts.math = Constants.Math.PARENS;\n }\n // Back compat with changed relativeUrls option\n if (opts.relativeUrls) {\n opts.rewriteUrls = Constants.RewriteUrls.ALL;\n }\n if (typeof opts.math === 'string') {\n switch (opts.math.toLowerCase()) {\n case 'always':\n opts.math = Constants.Math.ALWAYS;\n break;\n case 'parens-division':\n opts.math = Constants.Math.PARENS_DIVISION;\n break;\n case 'strict':\n case 'parens':\n opts.math = Constants.Math.PARENS;\n break;\n default:\n opts.math = Constants.Math.PARENS;\n }\n }\n if (typeof opts.rewriteUrls === 'string') {\n switch (opts.rewriteUrls.toLowerCase()) {\n case 'off':\n opts.rewriteUrls = Constants.RewriteUrls.OFF;\n break;\n case 'local':\n opts.rewriteUrls = Constants.RewriteUrls.LOCAL;\n break;\n case 'all':\n opts.rewriteUrls = Constants.RewriteUrls.ALL;\n break;\n }\n }\n return opts;\n}\n\nexport function merge(obj1, obj2) {\n for (const prop in obj2) {\n if (obj2.hasOwnProperty(prop)) {\n obj1[prop] = obj2[prop];\n }\n }\n return obj1;\n}\n\nexport function flattenArray(arr, result = []) {\n for (let i = 0, length = arr.length; i < length; i++) {\n const value = arr[i];\n if (Array.isArray(value)) {\n flattenArray(value, result);\n } else {\n if (value !== undefined) {\n result.push(value);\n }\n }\n }\n return result;\n}","import * as utils from './utils';\n\nconst anonymousFunc = /(|Function):(\\d+):(\\d+)/;\n\n/**\n * This is a centralized class of any error that could be thrown internally (mostly by the parser).\n * Besides standard .message it keeps some additional data like a path to the file where the error\n * occurred along with line and column numbers.\n *\n * @class\n * @extends Error\n * @type {module.LessError}\n *\n * @prop {string} type\n * @prop {string} filename\n * @prop {number} index\n * @prop {number} line\n * @prop {number} column\n * @prop {number} callLine\n * @prop {number} callExtract\n * @prop {string[]} extract\n *\n * @param {Object} e - An error object to wrap around or just a descriptive object\n * @param {Object} fileContentMap - An object with file contents in 'contents' property (like importManager) @todo - move to fileManager?\n * @param {string} [currentFilename]\n */\nconst LessError = function(e, fileContentMap, currentFilename) {\n Error.call(this);\n\n const filename = e.filename || currentFilename;\n\n this.message = e.message;\n this.stack = e.stack;\n\n if (fileContentMap && filename) {\n const input = fileContentMap.contents[filename];\n const loc = utils.getLocation(e.index, input);\n var line = loc.line;\n const col = loc.column;\n const callLine = e.call && utils.getLocation(e.call, input).line;\n const lines = input ? input.split('\\n') : '';\n\n this.type = e.type || 'Syntax';\n this.filename = filename;\n this.index = e.index;\n this.line = typeof line === 'number' ? line + 1 : null;\n this.column = col;\n\n if (!this.line && this.stack) {\n const found = this.stack.match(anonymousFunc);\n\n /**\n * We have to figure out how this environment stringifies anonymous functions\n * so we can correctly map plugin errors.\n * \n * Note, in Node 8, the output of anonymous funcs varied based on parameters\n * being present or not, so we inject dummy params.\n */\n const func = new Function('a', 'throw new Error()');\n let lineAdjust = 0;\n try {\n func();\n } catch (e) {\n const match = e.stack.match(anonymousFunc);\n var line = parseInt(match[2]);\n lineAdjust = 1 - line;\n }\n\n if (found) {\n if (found[2]) {\n this.line = parseInt(found[2]) + lineAdjust;\n }\n if (found[3]) {\n this.column = parseInt(found[3]);\n }\n }\n }\n\n this.callLine = callLine + 1;\n this.callExtract = lines[callLine];\n\n this.extract = [\n lines[this.line - 2],\n lines[this.line - 1],\n lines[this.line]\n ];\n }\n\n};\n\nif (typeof Object.create === 'undefined') {\n const F = function () {};\n F.prototype = Error.prototype;\n LessError.prototype = new F();\n} else {\n LessError.prototype = Object.create(Error.prototype);\n}\n\nLessError.prototype.constructor = LessError;\n\n/**\n * An overridden version of the default Object.prototype.toString\n * which uses additional information to create a helpful message.\n *\n * @param {Object} options\n * @returns {string}\n */\nLessError.prototype.toString = function(options) {\n options = options || {};\n\n let message = '';\n const extract = this.extract || [];\n let error = [];\n let stylize = function (str) { return str; };\n if (options.stylize) {\n const type = typeof options.stylize;\n if (type !== 'function') {\n throw Error(`options.stylize should be a function, got a ${type}!`);\n }\n stylize = options.stylize;\n }\n\n if (this.line !== null) {\n if (typeof extract[0] === 'string') {\n error.push(stylize(`${this.line - 1} ${extract[0]}`, 'grey'));\n }\n\n if (typeof extract[1] === 'string') {\n let errorTxt = `${this.line} `;\n if (extract[1]) {\n errorTxt += extract[1].slice(0, this.column) +\n stylize(stylize(stylize(extract[1].substr(this.column, 1), 'bold') +\n extract[1].slice(this.column + 1), 'red'), 'inverse');\n }\n error.push(errorTxt);\n }\n\n if (typeof extract[2] === 'string') {\n error.push(stylize(`${this.line + 1} ${extract[2]}`, 'grey'));\n }\n error = `${error.join('\\n') + stylize('', 'reset')}\\n`;\n }\n\n message += stylize(`${this.type}Error: ${this.message}`, 'red');\n if (this.filename) {\n message += stylize(' in ', 'red') + this.filename;\n }\n if (this.line) {\n message += stylize(` on line ${this.line}, column ${this.column + 1}:`, 'grey');\n }\n\n message += `\\n${error}`;\n\n if (this.callLine) {\n message += `${stylize('from ', 'red') + (this.filename || '')}/n`;\n message += `${stylize(this.callLine, 'grey')} ${this.callExtract}/n`;\n }\n\n return message;\n};\n\nexport default LessError;","import Node from './node';\nimport Element from './element';\nimport LessError from '../less-error';\n\nconst Selector = function(elements, extendList, condition, index, currentFileInfo, visibilityInfo) {\n this.extendList = extendList;\n this.condition = condition;\n this.evaldCondition = !condition;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.elements = this.getElements(elements);\n this.mixinElements_ = undefined;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.elements, this);\n};\n\nSelector.prototype = Object.assign(new Node(), {\n type: 'Selector',\n\n accept(visitor) {\n if (this.elements) {\n this.elements = visitor.visitArray(this.elements);\n }\n if (this.extendList) {\n this.extendList = visitor.visitArray(this.extendList);\n }\n if (this.condition) {\n this.condition = visitor.visit(this.condition);\n }\n },\n\n createDerived(elements, extendList, evaldCondition) {\n elements = this.getElements(elements);\n const newSelector = new Selector(elements, extendList || this.extendList,\n null, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n newSelector.evaldCondition = (evaldCondition != null) ? evaldCondition : this.evaldCondition;\n newSelector.mediaEmpty = this.mediaEmpty;\n return newSelector;\n },\n\n getElements(els) {\n if (!els) {\n return [new Element('', '&', false, this._index, this._fileInfo)];\n }\n if (typeof els === 'string') {\n this.parse.parseNode(\n els, \n ['selector'],\n this._index, \n this._fileInfo, \n function(err, result) {\n if (err) {\n throw new LessError({\n index: err.index,\n message: err.message\n }, this.parse.imports, this._fileInfo.filename);\n }\n els = result[0].elements;\n });\n }\n return els;\n },\n\n createEmptySelectors() {\n const el = new Element('', '&', false, this._index, this._fileInfo), sels = [new Selector([el], null, null, this._index, this._fileInfo)];\n sels[0].mediaEmpty = true;\n return sels;\n },\n\n match(other) {\n const elements = this.elements;\n const len = elements.length;\n let olen;\n let i;\n\n other = other.mixinElements();\n olen = other.length;\n if (olen === 0 || len < olen) {\n return 0;\n } else {\n for (i = 0; i < olen; i++) {\n if (elements[i].value !== other[i]) {\n return 0;\n }\n }\n }\n\n return olen; // return number of matched elements\n },\n\n mixinElements() {\n if (this.mixinElements_) {\n return this.mixinElements_;\n }\n\n let elements = this.elements.map( function(v) {\n return v.combinator.value + (v.value.value || v.value);\n }).join('').match(/[,&#\\*\\.\\w-]([\\w-]|(\\\\.))*/g);\n\n if (elements) {\n if (elements[0] === '&') {\n elements.shift();\n }\n } else {\n elements = [];\n }\n\n return (this.mixinElements_ = elements);\n },\n\n isJustParentSelector() {\n return !this.mediaEmpty &&\n this.elements.length === 1 &&\n this.elements[0].value === '&' &&\n (this.elements[0].combinator.value === ' ' || this.elements[0].combinator.value === '');\n },\n\n eval(context) {\n const evaldCondition = this.condition && this.condition.eval(context);\n let elements = this.elements;\n let extendList = this.extendList;\n\n elements = elements && elements.map(function (e) { return e.eval(context); });\n extendList = extendList && extendList.map(function(extend) { return extend.eval(context); });\n\n return this.createDerived(elements, extendList, evaldCondition);\n },\n\n genCSS(context, output) {\n let i, element;\n if ((!context || !context.firstSelector) && this.elements[0].combinator.value === '') {\n output.add(' ', this.fileInfo(), this.getIndex());\n }\n for (i = 0; i < this.elements.length; i++) {\n element = this.elements[i];\n element.genCSS(context, output);\n }\n },\n\n getIsOutput() {\n return this.evaldCondition;\n }\n});\n\nexport default Selector;\n","import Node from './node';\n\nconst Value = function(value) {\n if (!value) {\n throw new Error('Value requires an array argument');\n }\n if (!Array.isArray(value)) {\n this.value = [ value ];\n }\n else {\n this.value = value;\n }\n};\n\nValue.prototype = Object.assign(new Node(), {\n type: 'Value',\n\n accept(visitor) {\n if (this.value) {\n this.value = visitor.visitArray(this.value);\n }\n },\n\n eval(context) {\n if (this.value.length === 1) {\n return this.value[0].eval(context);\n } else {\n return new Value(this.value.map(function (v) {\n return v.eval(context);\n }));\n }\n },\n\n genCSS(context, output) {\n let i;\n for (i = 0; i < this.value.length; i++) {\n this.value[i].genCSS(context, output);\n if (i + 1 < this.value.length) {\n output.add((context && context.compress) ? ',' : ', ');\n }\n }\n }\n});\n\nexport default Value;\n","import Node from './node';\n\nconst Keyword = function(value) {\n this.value = value;\n};\n\nKeyword.prototype = Object.assign(new Node(), {\n type: 'Keyword',\n\n genCSS(context, output) {\n if (this.value === '%') { throw { type: 'Syntax', message: 'Invalid % without number' }; }\n output.add(this.value);\n }\n});\n\nKeyword.True = new Keyword('true');\nKeyword.False = new Keyword('false');\n\nexport default Keyword;\n","import Node from './node';\n\nconst Anonymous = function(value, index, currentFileInfo, mapLines, rulesetLike, visibilityInfo) {\n this.value = value;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.mapLines = mapLines;\n this.rulesetLike = (typeof rulesetLike === 'undefined') ? false : rulesetLike;\n this.allowRoot = true;\n this.copyVisibilityInfo(visibilityInfo);\n}\n\nAnonymous.prototype = Object.assign(new Node(), {\n type: 'Anonymous',\n eval() {\n return new Anonymous(this.value, this._index, this._fileInfo, this.mapLines, this.rulesetLike, this.visibilityInfo());\n },\n compare(other) {\n return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n },\n isRulesetLike() {\n return this.rulesetLike;\n },\n genCSS(context, output) {\n this.nodeVisible = Boolean(this.value);\n if (this.nodeVisible) {\n output.add(this.value, this._fileInfo, this._index, this.mapLines);\n }\n }\n})\n\nexport default Anonymous;\n","import Node from './node';\nimport Value from './value';\nimport Keyword from './keyword';\nimport Anonymous from './anonymous';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\nfunction evalName(context, name) {\n let value = '';\n let i;\n const n = name.length;\n const output = {add: function (s) {value += s;}};\n for (i = 0; i < n; i++) {\n name[i].eval(context).genCSS(context, output);\n }\n return value;\n}\n\nconst Declaration = function(name, value, important, merge, index, currentFileInfo, inline, variable) {\n this.name = name;\n this.value = (value instanceof Node) ? value : new Value([value ? new Anonymous(value) : null]);\n this.important = important ? ` ${important.trim()}` : '';\n this.merge = merge;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.inline = inline || false;\n this.variable = (variable !== undefined) ? variable\n : (name.charAt && (name.charAt(0) === '@'));\n this.allowRoot = true;\n this.setParent(this.value, this);\n};\n\nDeclaration.prototype = Object.assign(new Node(), {\n type: 'Declaration',\n\n genCSS(context, output) {\n output.add(this.name + (context.compress ? ':' : ': '), this.fileInfo(), this.getIndex());\n try {\n this.value.genCSS(context, output);\n }\n catch (e) {\n e.index = this._index;\n e.filename = this._fileInfo.filename;\n throw e;\n }\n output.add(this.important + ((this.inline || (context.lastRule && context.compress)) ? '' : ';'), this._fileInfo, this._index);\n },\n\n eval(context) {\n let mathBypass = false, prevMath, name = this.name, evaldValue, variable = this.variable;\n if (typeof name !== 'string') {\n // expand 'primitive' name directly to get\n // things faster (~10% for benchmark.less):\n name = (name.length === 1) && (name[0] instanceof Keyword) ?\n name[0].value : evalName(context, name);\n variable = false; // never treat expanded interpolation as new variable name\n }\n\n // @todo remove when parens-division is default\n if (name === 'font' && context.math === MATH.ALWAYS) {\n mathBypass = true;\n prevMath = context.math;\n context.math = MATH.PARENS_DIVISION;\n }\n try {\n context.importantScope.push({});\n evaldValue = this.value.eval(context);\n\n if (!this.variable && evaldValue.type === 'DetachedRuleset') {\n throw { message: 'Rulesets cannot be evaluated on a property.',\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n let important = this.important;\n const importantResult = context.importantScope.pop();\n if (!important && importantResult.important) {\n important = importantResult.important;\n }\n\n return new Declaration(name,\n evaldValue,\n important,\n this.merge,\n this.getIndex(), this.fileInfo(), this.inline,\n variable);\n }\n catch (e) {\n if (typeof e.index !== 'number') {\n e.index = this.getIndex();\n e.filename = this.fileInfo().filename;\n }\n throw e;\n }\n finally {\n if (mathBypass) {\n context.math = prevMath;\n }\n }\n },\n\n makeImportant() {\n return new Declaration(this.name,\n this.value,\n '!important',\n this.merge,\n this.getIndex(), this.fileInfo(), this.inline);\n }\n});\n\nexport default Declaration;","class debugInfo {\n constructor(context, ctx, lineSeparator) {\n let result = '';\n if (context.dumpLineNumbers && !context.compress) {\n switch (context.dumpLineNumbers) {\n case 'comments':\n result = debugInfo.asComment(ctx);\n break;\n case 'mediaquery':\n result = debugInfo.asMediaQuery(ctx);\n break;\n case 'all':\n result = debugInfo.asComment(ctx) + (lineSeparator || '') + debugInfo.asMediaQuery(ctx);\n break;\n }\n }\n return result;\n }\n\n static asComment(ctx) {\n return `/* line ${ctx.debugInfo.lineNumber}, ${ctx.debugInfo.fileName} */\\n`;\n }\n\n static asMediaQuery(ctx) {\n let filenameWithProtocol = ctx.debugInfo.fileName;\n if (!/^[a-z]+:\\/\\//i.test(filenameWithProtocol)) {\n filenameWithProtocol = `file://${filenameWithProtocol}`;\n }\n return `@media -sass-debug-info{filename{font-family:${filenameWithProtocol.replace(/([.:\\/\\\\])/g, function (a) {\n if (a == '\\\\') {\n a = '\\/';\n }\n return `\\\\${a}`;\n })}}line{font-family:\\\\00003${ctx.debugInfo.lineNumber}}}\\n`;\n }\n}\n\nexport default debugInfo;\n","import Node from './node';\nimport getDebugInfo from './debug-info';\n\nconst Comment = function(value, isLineComment, index, currentFileInfo) {\n this.value = value;\n this.isLineComment = isLineComment;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.allowRoot = true;\n}\n\nComment.prototype = Object.assign(new Node(), {\n type: 'Comment',\n\n genCSS(context, output) {\n if (this.debugInfo) {\n output.add(getDebugInfo(context, this), this.fileInfo(), this.getIndex());\n }\n output.add(this.value);\n },\n\n isSilent(context) {\n const isCompressed = context.compress && this.value[2] !== '!';\n return this.isLineComment || isCompressed;\n }\n});\n\nexport default Comment;\n","const contexts = {};\nexport default contexts;\nimport * as Constants from './constants';\n\nconst copyFromOriginal = function copyFromOriginal(original, destination, propertiesToCopy) {\n if (!original) { return; }\n\n for (let i = 0; i < propertiesToCopy.length; i++) {\n if (original.hasOwnProperty(propertiesToCopy[i])) {\n destination[propertiesToCopy[i]] = original[propertiesToCopy[i]];\n }\n }\n};\n\n/*\n parse is used whilst parsing\n */\nconst parseCopyProperties = [\n // options\n 'paths', // option - unmodified - paths to search for imports on\n 'rewriteUrls', // option - whether to adjust URL's to be relative\n 'rootpath', // option - rootpath to append to URL's\n 'strictImports', // option -\n 'insecure', // option - whether to allow imports from insecure ssl hosts\n 'dumpLineNumbers', // option - whether to dump line numbers\n 'compress', // option - whether to compress\n 'syncImport', // option - whether to import synchronously\n 'chunkInput', // option - whether to chunk input. more performant but causes parse issues.\n 'mime', // browser only - mime type for sheet import\n 'useFileCache', // browser only - whether to use the per file session cache\n // context\n 'processImports', // option & context - whether to process imports. if false then imports will not be imported.\n // Used by the import manager to stop multiple import visitors being created.\n 'pluginManager' // Used as the plugin manager for the session\n];\n\ncontexts.Parse = function(options) {\n copyFromOriginal(options, this, parseCopyProperties);\n\n if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n};\n\nconst evalCopyProperties = [\n 'paths', // additional include paths\n 'compress', // whether to compress\n 'math', // whether math has to be within parenthesis\n 'strictUnits', // whether units need to evaluate correctly\n 'sourceMap', // whether to output a source map\n 'importMultiple', // whether we are currently importing multiple copies\n 'urlArgs', // whether to add args into url tokens\n 'javascriptEnabled', // option - whether Inline JavaScript is enabled. if undefined, defaults to false\n 'pluginManager', // Used as the plugin manager for the session\n 'importantScope', // used to bubble up !important statements\n 'rewriteUrls' // option - whether to adjust URL's to be relative\n];\n\ncontexts.Eval = function(options, frames) {\n copyFromOriginal(options, this, evalCopyProperties);\n\n if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n\n this.frames = frames || [];\n this.importantScope = this.importantScope || [];\n};\n\ncontexts.Eval.prototype.enterCalc = function () {\n if (!this.calcStack) {\n this.calcStack = [];\n }\n this.calcStack.push(true);\n this.inCalc = true;\n};\n\ncontexts.Eval.prototype.exitCalc = function () {\n this.calcStack.pop();\n if (!this.calcStack.length) {\n this.inCalc = false;\n }\n};\n\ncontexts.Eval.prototype.inParenthesis = function () {\n if (!this.parensStack) {\n this.parensStack = [];\n }\n this.parensStack.push(true);\n};\n\ncontexts.Eval.prototype.outOfParenthesis = function () {\n this.parensStack.pop();\n};\n\ncontexts.Eval.prototype.inCalc = false;\ncontexts.Eval.prototype.mathOn = true;\ncontexts.Eval.prototype.isMathOn = function (op) {\n if (!this.mathOn) {\n return false;\n }\n if (op === '/' && this.math !== Constants.Math.ALWAYS && (!this.parensStack || !this.parensStack.length)) {\n return false;\n }\n if (this.math > Constants.Math.PARENS_DIVISION) {\n return this.parensStack && this.parensStack.length;\n }\n return true;\n};\n\ncontexts.Eval.prototype.pathRequiresRewrite = function (path) {\n const isRelative = this.rewriteUrls === Constants.RewriteUrls.LOCAL ? isPathLocalRelative : isPathRelative;\n\n return isRelative(path);\n};\n\ncontexts.Eval.prototype.rewritePath = function (path, rootpath) {\n let newPath;\n\n rootpath = rootpath || '';\n newPath = this.normalizePath(rootpath + path);\n\n // If a path was explicit relative and the rootpath was not an absolute path\n // we must ensure that the new path is also explicit relative.\n if (isPathLocalRelative(path) &&\n isPathRelative(rootpath) &&\n isPathLocalRelative(newPath) === false) {\n newPath = `./${newPath}`;\n }\n\n return newPath;\n};\n\ncontexts.Eval.prototype.normalizePath = function (path) {\n const segments = path.split('/').reverse();\n let segment;\n\n path = [];\n while (segments.length !== 0) {\n segment = segments.pop();\n switch ( segment ) {\n case '.':\n break;\n case '..':\n if ((path.length === 0) || (path[path.length - 1] === '..')) {\n path.push( segment );\n } else {\n path.pop();\n }\n break;\n default:\n path.push(segment);\n break;\n }\n }\n\n return path.join('/');\n};\n\nfunction isPathRelative(path) {\n return !/^(?:[a-z-]+:|\\/|#)/i.test(path);\n}\n\nfunction isPathLocalRelative(path) {\n return path.charAt(0) === '.';\n}\n\n// todo - do the same for the toCSS ?\n","function makeRegistry( base ) {\n return {\n _data: {},\n add: function(name, func) {\n // precautionary case conversion, as later querying of\n // the registry by function-caller uses lower case as well.\n name = name.toLowerCase();\n\n if (this._data.hasOwnProperty(name)) {\n // TODO warn\n }\n this._data[name] = func;\n },\n addMultiple: function(functions) {\n Object.keys(functions).forEach(\n name => {\n this.add(name, functions[name]);\n });\n },\n get: function(name) {\n return this._data[name] || ( base && base.get( name ));\n },\n getLocalFunctions: function() {\n return this._data;\n },\n inherit: function() {\n return makeRegistry( this );\n },\n create: function(base) {\n return makeRegistry(base);\n }\n };\n}\n\nexport default makeRegistry( null );","import Keyword from '../tree/keyword';\n\nconst defaultFunc = {\n eval: function () {\n const v = this.value_;\n const e = this.error_;\n if (e) {\n throw e;\n }\n if (v != null) {\n return v ? Keyword.True : Keyword.False;\n }\n },\n value: function (v) {\n this.value_ = v;\n },\n error: function (e) {\n this.error_ = e;\n },\n reset: function () {\n this.value_ = this.error_ = null;\n }\n};\n\nexport default defaultFunc;\n","import Node from './node';\nimport Declaration from './declaration';\nimport Keyword from './keyword';\nimport Comment from './comment';\nimport Paren from './paren';\nimport Selector from './selector';\nimport Element from './element';\nimport Anonymous from './anonymous';\nimport contexts from '../contexts';\nimport globalFunctionRegistry from '../functions/function-registry';\nimport defaultFunc from '../functions/default';\nimport getDebugInfo from './debug-info';\nimport * as utils from '../utils';\n\nconst Ruleset = function(selectors, rules, strictImports, visibilityInfo) {\n this.selectors = selectors;\n this.rules = rules;\n this._lookups = {};\n this._variables = null;\n this._properties = null;\n this.strictImports = strictImports;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n\n this.setParent(this.selectors, this);\n this.setParent(this.rules, this);\n}\n\nRuleset.prototype = Object.assign(new Node(), {\n type: 'Ruleset',\n isRuleset: true,\n\n isRulesetLike() { return true; },\n\n accept(visitor) {\n if (this.paths) {\n this.paths = visitor.visitArray(this.paths, true);\n } else if (this.selectors) {\n this.selectors = visitor.visitArray(this.selectors);\n }\n if (this.rules && this.rules.length) {\n this.rules = visitor.visitArray(this.rules);\n }\n },\n\n eval(context) {\n const that = this;\n let selectors;\n let selCnt;\n let selector;\n let i;\n let hasVariable;\n let hasOnePassingSelector = false;\n\n if (this.selectors && (selCnt = this.selectors.length)) {\n selectors = new Array(selCnt);\n defaultFunc.error({\n type: 'Syntax',\n message: 'it is currently only allowed in parametric mixin guards,'\n });\n\n for (i = 0; i < selCnt; i++) {\n selector = this.selectors[i].eval(context);\n for (var j = 0; j < selector.elements.length; j++) {\n if (selector.elements[j].isVariable) {\n hasVariable = true;\n break;\n }\n }\n selectors[i] = selector;\n if (selector.evaldCondition) {\n hasOnePassingSelector = true;\n }\n }\n\n if (hasVariable) {\n const toParseSelectors = new Array(selCnt);\n for (i = 0; i < selCnt; i++) {\n selector = selectors[i];\n toParseSelectors[i] = selector.toCSS(context);\n }\n this.parse.parseNode(\n toParseSelectors.join(','),\n [\"selectors\"], \n selectors[0].getIndex(), \n selectors[0].fileInfo(), \n function(err, result) {\n if (result) {\n selectors = utils.flattenArray(result);\n }\n });\n }\n\n defaultFunc.reset();\n } else {\n hasOnePassingSelector = true;\n }\n\n let rules = this.rules ? utils.copyArray(this.rules) : null;\n const ruleset = new Ruleset(selectors, rules, this.strictImports, this.visibilityInfo());\n let rule;\n let subRule;\n\n ruleset.originalRuleset = this;\n ruleset.root = this.root;\n ruleset.firstRoot = this.firstRoot;\n ruleset.allowImports = this.allowImports;\n\n if (this.debugInfo) {\n ruleset.debugInfo = this.debugInfo;\n }\n\n if (!hasOnePassingSelector) {\n rules.length = 0;\n }\n\n // inherit a function registry from the frames stack when possible;\n // otherwise from the global registry\n ruleset.functionRegistry = (function (frames) {\n let i = 0;\n const n = frames.length;\n let found;\n for ( ; i !== n ; ++i ) {\n found = frames[ i ].functionRegistry;\n if ( found ) { return found; }\n }\n return globalFunctionRegistry;\n }(context.frames)).inherit();\n\n // push the current ruleset to the frames stack\n const ctxFrames = context.frames;\n ctxFrames.unshift(ruleset);\n\n // currrent selectors\n let ctxSelectors = context.selectors;\n if (!ctxSelectors) {\n context.selectors = ctxSelectors = [];\n }\n ctxSelectors.unshift(this.selectors);\n\n // Evaluate imports\n if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) {\n ruleset.evalImports(context);\n }\n\n // Store the frames around mixin definitions,\n // so they can be evaluated like closures when the time comes.\n const rsRules = ruleset.rules;\n for (i = 0; (rule = rsRules[i]); i++) {\n if (rule.evalFirst) {\n rsRules[i] = rule.eval(context);\n }\n }\n\n const mediaBlockCount = (context.mediaBlocks && context.mediaBlocks.length) || 0;\n\n // Evaluate mixin calls.\n for (i = 0; (rule = rsRules[i]); i++) {\n if (rule.type === 'MixinCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).filter(function(r) {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope if the variable is\n // already there. consider returning false here\n // but we need a way to \"return\" variable from mixins\n return !(ruleset.variable(r.name));\n }\n return true;\n });\n rsRules.splice.apply(rsRules, [i, 1].concat(rules));\n i += rules.length - 1;\n ruleset.resetCache();\n } else if (rule.type === 'VariableCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).rules.filter(function(r) {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope at all\n return false;\n }\n return true;\n });\n rsRules.splice.apply(rsRules, [i, 1].concat(rules));\n i += rules.length - 1;\n ruleset.resetCache();\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n if (!rule.evalFirst) {\n rsRules[i] = rule = rule.eval ? rule.eval(context) : rule;\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n // for rulesets, check if it is a css guard and can be removed\n if (rule instanceof Ruleset && rule.selectors && rule.selectors.length === 1) {\n // check if it can be folded in (e.g. & where)\n if (rule.selectors[0] && rule.selectors[0].isJustParentSelector()) {\n rsRules.splice(i--, 1);\n\n for (var j = 0; (subRule = rule.rules[j]); j++) {\n if (subRule instanceof Node) {\n subRule.copyVisibilityInfo(rule.visibilityInfo());\n if (!(subRule instanceof Declaration) || !subRule.variable) {\n rsRules.splice(++i, 0, subRule);\n }\n }\n }\n }\n }\n }\n\n // Pop the stack\n ctxFrames.shift();\n ctxSelectors.shift();\n\n if (context.mediaBlocks) {\n for (i = mediaBlockCount; i < context.mediaBlocks.length; i++) {\n context.mediaBlocks[i].bubbleSelectors(selectors);\n }\n }\n\n return ruleset;\n },\n\n evalImports(context) {\n const rules = this.rules;\n let i;\n let importRules;\n if (!rules) { return; }\n\n for (i = 0; i < rules.length; i++) {\n if (rules[i].type === 'Import') {\n importRules = rules[i].eval(context);\n if (importRules && (importRules.length || importRules.length === 0)) {\n rules.splice.apply(rules, [i, 1].concat(importRules));\n i += importRules.length - 1;\n } else {\n rules.splice(i, 1, importRules);\n }\n this.resetCache();\n }\n }\n },\n\n makeImportant() {\n const result = new Ruleset(this.selectors, this.rules.map(function (r) {\n if (r.makeImportant) {\n return r.makeImportant();\n } else {\n return r;\n }\n }), this.strictImports, this.visibilityInfo());\n\n return result;\n },\n\n matchArgs(args) {\n return !args || args.length === 0;\n },\n\n // lets you call a css selector with a guard\n matchCondition(args, context) {\n const lastSelector = this.selectors[this.selectors.length - 1];\n if (!lastSelector.evaldCondition) {\n return false;\n }\n if (lastSelector.condition &&\n !lastSelector.condition.eval(\n new contexts.Eval(context,\n context.frames))) {\n return false;\n }\n return true;\n },\n\n resetCache() {\n this._rulesets = null;\n this._variables = null;\n this._properties = null;\n this._lookups = {};\n },\n\n variables() {\n if (!this._variables) {\n this._variables = !this.rules ? {} : this.rules.reduce(function (hash, r) {\n if (r instanceof Declaration && r.variable === true) {\n hash[r.name] = r;\n }\n // when evaluating variables in an import statement, imports have not been eval'd\n // so we need to go inside import statements.\n // guard against root being a string (in the case of inlined less)\n if (r.type === 'Import' && r.root && r.root.variables) {\n const vars = r.root.variables();\n for (const name in vars) {\n if (vars.hasOwnProperty(name)) {\n hash[name] = r.root.variable(name);\n }\n }\n }\n return hash;\n }, {});\n }\n return this._variables;\n },\n\n properties() {\n if (!this._properties) {\n this._properties = !this.rules ? {} : this.rules.reduce(function (hash, r) {\n if (r instanceof Declaration && r.variable !== true) {\n const name = (r.name.length === 1) && (r.name[0] instanceof Keyword) ?\n r.name[0].value : r.name;\n // Properties don't overwrite as they can merge\n if (!hash[`$${name}`]) {\n hash[`$${name}`] = [ r ];\n }\n else {\n hash[`$${name}`].push(r);\n }\n }\n return hash;\n }, {});\n }\n return this._properties;\n },\n\n variable(name) {\n const decl = this.variables()[name];\n if (decl) {\n return this.parseValue(decl);\n }\n },\n\n property(name) {\n const decl = this.properties()[name];\n if (decl) {\n return this.parseValue(decl);\n }\n },\n\n lastDeclaration() {\n for (let i = this.rules.length; i > 0; i--) {\n const decl = this.rules[i - 1];\n if (decl instanceof Declaration) {\n return this.parseValue(decl);\n }\n }\n },\n\n parseValue(toParse) {\n const self = this;\n function transformDeclaration(decl) {\n if (decl.value instanceof Anonymous && !decl.parsed) {\n if (typeof decl.value.value === 'string') {\n this.parse.parseNode(\n decl.value.value,\n ['value', 'important'], \n decl.value.getIndex(), \n decl.fileInfo(), \n function(err, result) {\n if (err) {\n decl.parsed = true;\n }\n if (result) {\n decl.value = result[0];\n decl.important = result[1] || '';\n decl.parsed = true;\n }\n });\n } else {\n decl.parsed = true;\n }\n\n return decl;\n }\n else {\n return decl;\n }\n }\n if (!Array.isArray(toParse)) {\n return transformDeclaration.call(self, toParse);\n }\n else {\n const nodes = [];\n toParse.forEach(function(n) {\n nodes.push(transformDeclaration.call(self, n));\n });\n return nodes;\n }\n },\n\n rulesets() {\n if (!this.rules) { return []; }\n\n const filtRules = [];\n const rules = this.rules;\n let i;\n let rule;\n\n for (i = 0; (rule = rules[i]); i++) {\n if (rule.isRuleset) {\n filtRules.push(rule);\n }\n }\n\n return filtRules;\n },\n\n prependRule(rule) {\n const rules = this.rules;\n if (rules) {\n rules.unshift(rule);\n } else {\n this.rules = [ rule ];\n }\n this.setParent(rule, this);\n },\n\n find(selector, self, filter) {\n self = self || this;\n const rules = [];\n let match;\n let foundMixins;\n const key = selector.toCSS();\n\n if (key in this._lookups) { return this._lookups[key]; }\n\n this.rulesets().forEach(function (rule) {\n if (rule !== self) {\n for (let j = 0; j < rule.selectors.length; j++) {\n match = selector.match(rule.selectors[j]);\n if (match) {\n if (selector.elements.length > match) {\n if (!filter || filter(rule)) {\n foundMixins = rule.find(new Selector(selector.elements.slice(match)), self, filter);\n for (let i = 0; i < foundMixins.length; ++i) {\n foundMixins[i].path.push(rule);\n }\n Array.prototype.push.apply(rules, foundMixins);\n }\n } else {\n rules.push({ rule, path: []});\n }\n break;\n }\n }\n }\n });\n this._lookups[key] = rules;\n return rules;\n },\n\n genCSS(context, output) {\n let i;\n let j;\n const charsetRuleNodes = [];\n let ruleNodes = [];\n\n let // Line number debugging\n debugInfo;\n\n let rule;\n let path;\n\n context.tabLevel = (context.tabLevel || 0);\n\n if (!this.root) {\n context.tabLevel++;\n }\n\n const tabRuleStr = context.compress ? '' : Array(context.tabLevel + 1).join(' ');\n const tabSetStr = context.compress ? '' : Array(context.tabLevel).join(' ');\n let sep;\n\n let charsetNodeIndex = 0;\n let importNodeIndex = 0;\n for (i = 0; (rule = this.rules[i]); i++) {\n if (rule instanceof Comment) {\n if (importNodeIndex === i) {\n importNodeIndex++;\n }\n ruleNodes.push(rule);\n } else if (rule.isCharset && rule.isCharset()) {\n ruleNodes.splice(charsetNodeIndex, 0, rule);\n charsetNodeIndex++;\n importNodeIndex++;\n } else if (rule.type === 'Import') {\n ruleNodes.splice(importNodeIndex, 0, rule);\n importNodeIndex++;\n } else {\n ruleNodes.push(rule);\n }\n }\n ruleNodes = charsetRuleNodes.concat(ruleNodes);\n\n // If this is the root node, we don't render\n // a selector, or {}.\n if (!this.root) {\n debugInfo = getDebugInfo(context, this, tabSetStr);\n\n if (debugInfo) {\n output.add(debugInfo);\n output.add(tabSetStr);\n }\n\n const paths = this.paths;\n const pathCnt = paths.length;\n let pathSubCnt;\n\n sep = context.compress ? ',' : (`,\\n${tabSetStr}`);\n\n for (i = 0; i < pathCnt; i++) {\n path = paths[i];\n if (!(pathSubCnt = path.length)) { continue; }\n if (i > 0) { output.add(sep); }\n\n context.firstSelector = true;\n path[0].genCSS(context, output);\n\n context.firstSelector = false;\n for (j = 1; j < pathSubCnt; j++) {\n path[j].genCSS(context, output);\n }\n }\n\n output.add((context.compress ? '{' : ' {\\n') + tabRuleStr);\n }\n\n // Compile rules and rulesets\n for (i = 0; (rule = ruleNodes[i]); i++) {\n\n if (i + 1 === ruleNodes.length) {\n context.lastRule = true;\n }\n\n const currentLastRule = context.lastRule;\n if (rule.isRulesetLike(rule)) {\n context.lastRule = false;\n }\n\n if (rule.genCSS) {\n rule.genCSS(context, output);\n } else if (rule.value) {\n output.add(rule.value.toString());\n }\n\n context.lastRule = currentLastRule;\n\n if (!context.lastRule && rule.isVisible()) {\n output.add(context.compress ? '' : (`\\n${tabRuleStr}`));\n } else {\n context.lastRule = false;\n }\n }\n\n if (!this.root) {\n output.add((context.compress ? '}' : `\\n${tabSetStr}}`));\n context.tabLevel--;\n }\n\n if (!output.isEmpty() && !context.compress && this.firstRoot) {\n output.add('\\n');\n }\n },\n\n joinSelectors(paths, context, selectors) {\n for (let s = 0; s < selectors.length; s++) {\n this.joinSelector(paths, context, selectors[s]);\n }\n },\n\n joinSelector(paths, context, selector) {\n\n function createParenthesis(elementsToPak, originalElement) {\n let replacementParen, j;\n if (elementsToPak.length === 0) {\n replacementParen = new Paren(elementsToPak[0]);\n } else {\n const insideParent = new Array(elementsToPak.length);\n for (j = 0; j < elementsToPak.length; j++) {\n insideParent[j] = new Element(\n null,\n elementsToPak[j],\n originalElement.isVariable,\n originalElement._index,\n originalElement._fileInfo\n );\n }\n replacementParen = new Paren(new Selector(insideParent));\n }\n return replacementParen;\n }\n\n function createSelector(containedElement, originalElement) {\n let element, selector;\n element = new Element(null, containedElement, originalElement.isVariable, originalElement._index, originalElement._fileInfo);\n selector = new Selector([element]);\n return selector;\n }\n\n // joins selector path from `beginningPath` with selector path in `addPath`\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns concatenated path\n function addReplacementIntoPath(beginningPath, addPath, replacedElement, originalSelector) {\n let newSelectorPath, lastSelector, newJoinedSelector;\n // our new selector path\n newSelectorPath = [];\n\n // construct the joined selector - if & is the first thing this will be empty,\n // if not newJoinedSelector will be the last set of elements in the selector\n if (beginningPath.length > 0) {\n newSelectorPath = utils.copyArray(beginningPath);\n lastSelector = newSelectorPath.pop();\n newJoinedSelector = originalSelector.createDerived(utils.copyArray(lastSelector.elements));\n }\n else {\n newJoinedSelector = originalSelector.createDerived([]);\n }\n\n if (addPath.length > 0) {\n // /deep/ is a CSS4 selector - (removed, so should deprecate)\n // that is valid without anything in front of it\n // so if the & does not have a combinator that is \"\" or \" \" then\n // and there is a combinator on the parent, then grab that.\n // this also allows + a { & .b { .a & { ... though not sure why you would want to do that\n let combinator = replacedElement.combinator;\n\n const parentEl = addPath[0].elements[0];\n if (combinator.emptyOrWhitespace && !parentEl.combinator.emptyOrWhitespace) {\n combinator = parentEl.combinator;\n }\n // join the elements so far with the first part of the parent\n newJoinedSelector.elements.push(new Element(\n combinator,\n parentEl.value,\n replacedElement.isVariable,\n replacedElement._index,\n replacedElement._fileInfo\n ));\n newJoinedSelector.elements = newJoinedSelector.elements.concat(addPath[0].elements.slice(1));\n }\n\n // now add the joined selector - but only if it is not empty\n if (newJoinedSelector.elements.length !== 0) {\n newSelectorPath.push(newJoinedSelector);\n }\n\n // put together the parent selectors after the join (e.g. the rest of the parent)\n if (addPath.length > 1) {\n let restOfPath = addPath.slice(1);\n restOfPath = restOfPath.map(function (selector) {\n return selector.createDerived(selector.elements, []);\n });\n newSelectorPath = newSelectorPath.concat(restOfPath);\n }\n return newSelectorPath;\n }\n\n // joins selector path from `beginningPath` with every selector path in `addPaths` array\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns array with all concatenated paths\n function addAllReplacementsIntoPath( beginningPath, addPaths, replacedElement, originalSelector, result) {\n let j;\n for (j = 0; j < beginningPath.length; j++) {\n const newSelectorPath = addReplacementIntoPath(beginningPath[j], addPaths, replacedElement, originalSelector);\n result.push(newSelectorPath);\n }\n return result;\n }\n\n function mergeElementsOnToSelectors(elements, selectors) {\n let i, sel;\n\n if (elements.length === 0) {\n return ;\n }\n if (selectors.length === 0) {\n selectors.push([ new Selector(elements) ]);\n return;\n }\n\n for (i = 0; (sel = selectors[i]); i++) {\n // if the previous thing in sel is a parent this needs to join on to it\n if (sel.length > 0) {\n sel[sel.length - 1] = sel[sel.length - 1].createDerived(sel[sel.length - 1].elements.concat(elements));\n }\n else {\n sel.push(new Selector(elements));\n }\n }\n }\n\n // replace all parent selectors inside `inSelector` by content of `context` array\n // resulting selectors are returned inside `paths` array\n // returns true if `inSelector` contained at least one parent selector\n function replaceParentSelector(paths, context, inSelector) {\n // The paths are [[Selector]]\n // The first list is a list of comma separated selectors\n // The inner list is a list of inheritance separated selectors\n // e.g.\n // .a, .b {\n // .c {\n // }\n // }\n // == [[.a] [.c]] [[.b] [.c]]\n //\n let i, j, k, currentElements, newSelectors, selectorsMultiplied, sel, el, hadParentSelector = false, length, lastSelector;\n function findNestedSelector(element) {\n let maybeSelector;\n if (!(element.value instanceof Paren)) {\n return null;\n }\n\n maybeSelector = element.value.value;\n if (!(maybeSelector instanceof Selector)) {\n return null;\n }\n\n return maybeSelector;\n }\n\n // the elements from the current selector so far\n currentElements = [];\n // the current list of new selectors to add to the path.\n // We will build it up. We initiate it with one empty selector as we \"multiply\" the new selectors\n // by the parents\n newSelectors = [\n []\n ];\n\n for (i = 0; (el = inSelector.elements[i]); i++) {\n // non parent reference elements just get added\n if (el.value !== '&') {\n const nestedSelector = findNestedSelector(el);\n if (nestedSelector != null) {\n // merge the current list of non parent selector elements\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n const nestedPaths = [];\n let replaced;\n const replacedNewSelectors = [];\n replaced = replaceParentSelector(nestedPaths, context, nestedSelector);\n hadParentSelector = hadParentSelector || replaced;\n // the nestedPaths array should have only one member - replaceParentSelector does not multiply selectors\n for (k = 0; k < nestedPaths.length; k++) {\n const replacementSelector = createSelector(createParenthesis(nestedPaths[k], el), el);\n addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors);\n }\n newSelectors = replacedNewSelectors;\n currentElements = [];\n } else {\n currentElements.push(el);\n }\n\n } else {\n hadParentSelector = true;\n // the new list of selectors to add\n selectorsMultiplied = [];\n\n // merge the current list of non parent selector elements\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n // loop through our current selectors\n for (j = 0; j < newSelectors.length; j++) {\n sel = newSelectors[j];\n // if we don't have any parent paths, the & might be in a mixin so that it can be used\n // whether there are parents or not\n if (context.length === 0) {\n // the combinator used on el should now be applied to the next element instead so that\n // it is not lost\n if (sel.length > 0) {\n sel[0].elements.push(new Element(el.combinator, '', el.isVariable, el._index, el._fileInfo));\n }\n selectorsMultiplied.push(sel);\n }\n else {\n // and the parent selectors\n for (k = 0; k < context.length; k++) {\n // We need to put the current selectors\n // then join the last selector's elements on to the parents selectors\n const newSelectorPath = addReplacementIntoPath(sel, context[k], el, inSelector);\n // add that to our new set of selectors\n selectorsMultiplied.push(newSelectorPath);\n }\n }\n }\n\n // our new selectors has been multiplied, so reset the state\n newSelectors = selectorsMultiplied;\n currentElements = [];\n }\n }\n\n // if we have any elements left over (e.g. .a& .b == .b)\n // add them on to all the current selectors\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n for (i = 0; i < newSelectors.length; i++) {\n length = newSelectors[i].length;\n if (length > 0) {\n paths.push(newSelectors[i]);\n lastSelector = newSelectors[i][length - 1];\n newSelectors[i][length - 1] = lastSelector.createDerived(lastSelector.elements, inSelector.extendList);\n }\n }\n\n return hadParentSelector;\n }\n\n function deriveSelector(visibilityInfo, deriveFrom) {\n const newSelector = deriveFrom.createDerived(deriveFrom.elements, deriveFrom.extendList, deriveFrom.evaldCondition);\n newSelector.copyVisibilityInfo(visibilityInfo);\n return newSelector;\n }\n\n // joinSelector code follows\n let i, newPaths, hadParentSelector;\n\n newPaths = [];\n hadParentSelector = replaceParentSelector(newPaths, context, selector);\n\n if (!hadParentSelector) {\n if (context.length > 0) {\n newPaths = [];\n for (i = 0; i < context.length; i++) {\n\n const concatenated = context[i].map(deriveSelector.bind(this, selector.visibilityInfo()));\n\n concatenated.push(selector);\n newPaths.push(concatenated);\n }\n }\n else {\n newPaths = [[selector]];\n }\n }\n\n for (i = 0; i < newPaths.length; i++) {\n paths.push(newPaths[i]);\n }\n\n }\n});\n\nexport default Ruleset;\n","import Node from './node';\nimport Selector from './selector';\nimport Ruleset from './ruleset';\nimport Anonymous from './anonymous';\n\nconst AtRule = function(\n name,\n value,\n rules,\n index,\n currentFileInfo,\n debugInfo,\n isRooted,\n visibilityInfo\n) {\n let i;\n\n this.name = name;\n this.value = (value instanceof Node) ? value : (value ? new Anonymous(value) : value);\n if (rules) {\n if (Array.isArray(rules)) {\n this.rules = rules;\n } else {\n this.rules = [rules];\n this.rules[0].selectors = (new Selector([], null, null, index, currentFileInfo)).createEmptySelectors();\n }\n for (i = 0; i < this.rules.length; i++) {\n this.rules[i].allowImports = true;\n }\n this.setParent(this.rules, this);\n }\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.debugInfo = debugInfo;\n this.isRooted = isRooted || false;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n}\n\nAtRule.prototype = Object.assign(new Node(), {\n type: 'AtRule',\n accept(visitor) {\n const value = this.value, rules = this.rules;\n if (rules) {\n this.rules = visitor.visitArray(rules);\n }\n if (value) {\n this.value = visitor.visit(value);\n }\n },\n\n isRulesetLike() {\n return this.rules || !this.isCharset();\n },\n\n isCharset() {\n return '@charset' === this.name;\n },\n\n genCSS(context, output) {\n const value = this.value, rules = this.rules;\n output.add(this.name, this.fileInfo(), this.getIndex());\n if (value) {\n output.add(' ');\n value.genCSS(context, output);\n }\n if (rules) {\n this.outputRuleset(context, output, rules);\n } else {\n output.add(';');\n }\n },\n\n eval(context) {\n let mediaPathBackup, mediaBlocksBackup, value = this.value, rules = this.rules;\n\n // media stored inside other atrule should not bubble over it\n // backpup media bubbling information\n mediaPathBackup = context.mediaPath;\n mediaBlocksBackup = context.mediaBlocks;\n // deleted media bubbling information\n context.mediaPath = [];\n context.mediaBlocks = [];\n\n if (value) {\n value = value.eval(context);\n }\n if (rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n rules = [rules[0].eval(context)];\n rules[0].root = true;\n }\n // restore media bubbling information\n context.mediaPath = mediaPathBackup;\n context.mediaBlocks = mediaBlocksBackup;\n\n return new AtRule(this.name, value, rules,\n this.getIndex(), this.fileInfo(), this.debugInfo, this.isRooted, this.visibilityInfo());\n },\n\n variable(name) {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.variable.call(this.rules[0], name);\n }\n },\n\n find() {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.find.apply(this.rules[0], arguments);\n }\n },\n\n rulesets() {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.rulesets.apply(this.rules[0]);\n }\n },\n\n outputRuleset(context, output, rules) {\n const ruleCnt = rules.length;\n let i;\n context.tabLevel = (context.tabLevel | 0) + 1;\n\n // Compressed\n if (context.compress) {\n output.add('{');\n for (i = 0; i < ruleCnt; i++) {\n rules[i].genCSS(context, output);\n }\n output.add('}');\n context.tabLevel--;\n return;\n }\n\n // Non-compressed\n const tabSetStr = `\\n${Array(context.tabLevel).join(' ')}`, tabRuleStr = `${tabSetStr} `;\n if (!ruleCnt) {\n output.add(` {${tabSetStr}}`);\n } else {\n output.add(` {${tabRuleStr}`);\n rules[0].genCSS(context, output);\n for (i = 1; i < ruleCnt; i++) {\n output.add(tabRuleStr);\n rules[i].genCSS(context, output);\n }\n output.add(`${tabSetStr}}`);\n }\n\n context.tabLevel--;\n }\n});\n\nexport default AtRule;\n","import Node from './node';\nimport contexts from '../contexts';\nimport * as utils from '../utils';\n\nconst DetachedRuleset = function(ruleset, frames) {\n this.ruleset = ruleset;\n this.frames = frames;\n this.setParent(this.ruleset, this);\n};\n\nDetachedRuleset.prototype = Object.assign(new Node(), {\n type: 'DetachedRuleset',\n evalFirst: true,\n\n accept(visitor) {\n this.ruleset = visitor.visit(this.ruleset);\n },\n\n eval(context) {\n const frames = this.frames || utils.copyArray(context.frames);\n return new DetachedRuleset(this.ruleset, frames);\n },\n\n callEval(context) {\n return this.ruleset.eval(this.frames ? new contexts.Eval(context, this.frames.concat(context.frames)) : context);\n }\n});\n\nexport default DetachedRuleset;\n","import Node from './node';\nimport unitConversions from '../data/unit-conversions';\nimport * as utils from '../utils';\n\nconst Unit = function(numerator, denominator, backupUnit) {\n this.numerator = numerator ? utils.copyArray(numerator).sort() : [];\n this.denominator = denominator ? utils.copyArray(denominator).sort() : [];\n if (backupUnit) {\n this.backupUnit = backupUnit;\n } else if (numerator && numerator.length) {\n this.backupUnit = numerator[0];\n }\n};\n\nUnit.prototype = Object.assign(new Node(), {\n type: 'Unit',\n\n clone() {\n return new Unit(utils.copyArray(this.numerator), utils.copyArray(this.denominator), this.backupUnit);\n },\n\n genCSS(context, output) {\n // Dimension checks the unit is singular and throws an error if in strict math mode.\n const strictUnits = context && context.strictUnits;\n if (this.numerator.length === 1) {\n output.add(this.numerator[0]); // the ideal situation\n } else if (!strictUnits && this.backupUnit) {\n output.add(this.backupUnit);\n } else if (!strictUnits && this.denominator.length) {\n output.add(this.denominator[0]);\n }\n },\n\n toString() {\n let i, returnStr = this.numerator.join('*');\n for (i = 0; i < this.denominator.length; i++) {\n returnStr += `/${this.denominator[i]}`;\n }\n return returnStr;\n },\n\n compare(other) {\n return this.is(other.toString()) ? 0 : undefined;\n },\n\n is(unitString) {\n return this.toString().toUpperCase() === unitString.toUpperCase();\n },\n\n isLength() {\n return RegExp('^(px|em|ex|ch|rem|in|cm|mm|pc|pt|ex|vw|vh|vmin|vmax)$', 'gi').test(this.toCSS());\n },\n\n isEmpty() {\n return this.numerator.length === 0 && this.denominator.length === 0;\n },\n\n isSingular() {\n return this.numerator.length <= 1 && this.denominator.length === 0;\n },\n\n map(callback) {\n let i;\n\n for (i = 0; i < this.numerator.length; i++) {\n this.numerator[i] = callback(this.numerator[i], false);\n }\n\n for (i = 0; i < this.denominator.length; i++) {\n this.denominator[i] = callback(this.denominator[i], true);\n }\n },\n\n usedUnits() {\n let group;\n const result = {};\n let mapUnit;\n let groupName;\n\n mapUnit = function (atomicUnit) {\n /* jshint loopfunc:true */\n if (group.hasOwnProperty(atomicUnit) && !result[groupName]) {\n result[groupName] = atomicUnit;\n }\n\n return atomicUnit;\n };\n\n for (groupName in unitConversions) {\n if (unitConversions.hasOwnProperty(groupName)) {\n group = unitConversions[groupName];\n\n this.map(mapUnit);\n }\n }\n\n return result;\n },\n\n cancel() {\n const counter = {};\n let atomicUnit;\n let i;\n\n for (i = 0; i < this.numerator.length; i++) {\n atomicUnit = this.numerator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) + 1;\n }\n\n for (i = 0; i < this.denominator.length; i++) {\n atomicUnit = this.denominator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) - 1;\n }\n\n this.numerator = [];\n this.denominator = [];\n\n for (atomicUnit in counter) {\n if (counter.hasOwnProperty(atomicUnit)) {\n const count = counter[atomicUnit];\n\n if (count > 0) {\n for (i = 0; i < count; i++) {\n this.numerator.push(atomicUnit);\n }\n } else if (count < 0) {\n for (i = 0; i < -count; i++) {\n this.denominator.push(atomicUnit);\n }\n }\n }\n }\n\n this.numerator.sort();\n this.denominator.sort();\n }\n});\n\nexport default Unit;\n","import Node from './node';\nimport unitConversions from '../data/unit-conversions';\nimport Unit from './unit';\nimport Color from './color';\n\n//\n// A number with a unit\n//\nconst Dimension = function(value, unit) {\n this.value = parseFloat(value);\n if (isNaN(this.value)) {\n throw new Error('Dimension is not a number.');\n }\n this.unit = (unit && unit instanceof Unit) ? unit :\n new Unit(unit ? [unit] : undefined);\n this.setParent(this.unit, this);\n};\n\nDimension.prototype = Object.assign(new Node(), {\n type: 'Dimension',\n\n accept(visitor) {\n this.unit = visitor.visit(this.unit);\n },\n\n eval(context) {\n return this;\n },\n\n toColor() {\n return new Color([this.value, this.value, this.value]);\n },\n\n genCSS(context, output) {\n if ((context && context.strictUnits) && !this.unit.isSingular()) {\n throw new Error(`Multiple units in dimension. Correct the units or use the unit function. Bad unit: ${this.unit.toString()}`);\n }\n\n const value = this.fround(context, this.value);\n let strValue = String(value);\n\n if (value !== 0 && value < 0.000001 && value > -0.000001) {\n // would be output 1e-6 etc.\n strValue = value.toFixed(20).replace(/0+$/, '');\n }\n\n if (context && context.compress) {\n // Zero values doesn't need a unit\n if (value === 0 && this.unit.isLength()) {\n output.add(strValue);\n return;\n }\n\n // Float values doesn't need a leading zero\n if (value > 0 && value < 1) {\n strValue = (strValue).substr(1);\n }\n }\n\n output.add(strValue);\n this.unit.genCSS(context, output);\n },\n\n // In an operation between two Dimensions,\n // we default to the first Dimension's unit,\n // so `1px + 2` will yield `3px`.\n operate(context, op, other) {\n /* jshint noempty:false */\n let value = this._operate(context, op, this.value, other.value), unit = this.unit.clone();\n\n if (op === '+' || op === '-') {\n if (unit.numerator.length === 0 && unit.denominator.length === 0) {\n unit = other.unit.clone();\n if (this.unit.backupUnit) {\n unit.backupUnit = this.unit.backupUnit;\n }\n } else if (other.unit.numerator.length === 0 && unit.denominator.length === 0) {\n // do nothing\n } else {\n other = other.convertTo(this.unit.usedUnits());\n\n if (context.strictUnits && other.unit.toString() !== unit.toString()) {\n throw new Error(`Incompatible units. Change the units or use the unit function. `\n + `Bad units: '${unit.toString()}' and '${other.unit.toString()}'.`);\n }\n\n value = this._operate(context, op, this.value, other.value);\n }\n } else if (op === '*') {\n unit.numerator = unit.numerator.concat(other.unit.numerator).sort();\n unit.denominator = unit.denominator.concat(other.unit.denominator).sort();\n unit.cancel();\n } else if (op === '/') {\n unit.numerator = unit.numerator.concat(other.unit.denominator).sort();\n unit.denominator = unit.denominator.concat(other.unit.numerator).sort();\n unit.cancel();\n }\n return new Dimension(value, unit);\n },\n\n compare(other) {\n let a, b;\n\n if (!(other instanceof Dimension)) {\n return undefined;\n }\n\n if (this.unit.isEmpty() || other.unit.isEmpty()) {\n a = this;\n b = other;\n } else {\n a = this.unify();\n b = other.unify();\n if (a.unit.compare(b.unit) !== 0) {\n return undefined;\n }\n }\n\n return Node.numericCompare(a.value, b.value);\n },\n\n unify() {\n return this.convertTo({ length: 'px', duration: 's', angle: 'rad' });\n },\n\n convertTo(conversions) {\n let value = this.value;\n const unit = this.unit.clone();\n let i;\n let groupName;\n let group;\n let targetUnit;\n let derivedConversions = {};\n let applyUnit;\n\n if (typeof conversions === 'string') {\n for (i in unitConversions) {\n if (unitConversions[i].hasOwnProperty(conversions)) {\n derivedConversions = {};\n derivedConversions[i] = conversions;\n }\n }\n conversions = derivedConversions;\n }\n applyUnit = function (atomicUnit, denominator) {\n /* jshint loopfunc:true */\n if (group.hasOwnProperty(atomicUnit)) {\n if (denominator) {\n value = value / (group[atomicUnit] / group[targetUnit]);\n } else {\n value = value * (group[atomicUnit] / group[targetUnit]);\n }\n\n return targetUnit;\n }\n\n return atomicUnit;\n };\n\n for (groupName in conversions) {\n if (conversions.hasOwnProperty(groupName)) {\n targetUnit = conversions[groupName];\n group = unitConversions[groupName];\n\n unit.map(applyUnit);\n }\n }\n\n unit.cancel();\n\n return new Dimension(value, unit);\n }\n});\n\nexport default Dimension;\n","import Node from './node';\nimport Color from './color';\nimport Dimension from './dimension';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\n\nconst Operation = function(op, operands, isSpaced) {\n this.op = op.trim();\n this.operands = operands;\n this.isSpaced = isSpaced;\n};\n\nOperation.prototype = Object.assign(new Node(), {\n type: 'Operation',\n\n accept(visitor) {\n this.operands = visitor.visitArray(this.operands);\n },\n\n eval(context) {\n let a = this.operands[0].eval(context), b = this.operands[1].eval(context), op;\n\n if (context.isMathOn(this.op)) {\n op = this.op === './' ? '/' : this.op;\n if (a instanceof Dimension && b instanceof Color) {\n a = a.toColor();\n }\n if (b instanceof Dimension && a instanceof Color) {\n b = b.toColor();\n }\n if (!a.operate) {\n if (a instanceof Operation && a.op === '/' && context.math === MATH.PARENS_DIVISION) {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n throw { type: 'Operation',\n message: 'Operation on an invalid type' };\n }\n\n return a.operate(context, op, b);\n } else {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n },\n\n genCSS(context, output) {\n this.operands[0].genCSS(context, output);\n if (this.isSpaced) {\n output.add(' ');\n }\n output.add(this.op);\n if (this.isSpaced) {\n output.add(' ');\n }\n this.operands[1].genCSS(context, output);\n }\n});\n\nexport default Operation;\n","import Node from './node';\nimport Paren from './paren';\nimport Comment from './comment';\nimport Dimension from './dimension';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\nconst Expression = function(value, noSpacing) {\n this.value = value;\n this.noSpacing = noSpacing;\n if (!value) {\n throw new Error('Expression requires an array parameter');\n }\n};\n\nExpression.prototype = Object.assign(new Node(), {\n type: 'Expression',\n\n accept(visitor) {\n this.value = visitor.visitArray(this.value);\n },\n\n eval(context) {\n let returnValue;\n const mathOn = context.isMathOn();\n const inParenthesis = this.parens;\n\n let doubleParen = false;\n if (inParenthesis) {\n context.inParenthesis();\n }\n if (this.value.length > 1) {\n returnValue = new Expression(this.value.map(function (e) {\n if (!e.eval) {\n return e;\n }\n return e.eval(context);\n }), this.noSpacing);\n } else if (this.value.length === 1) {\n if (this.value[0].parens && !this.value[0].parensInOp && !context.inCalc) {\n doubleParen = true;\n }\n returnValue = this.value[0].eval(context);\n } else {\n returnValue = this;\n }\n if (inParenthesis) {\n context.outOfParenthesis();\n }\n if (this.parens && this.parensInOp && !mathOn && !doubleParen \n && (!(returnValue instanceof Dimension))) {\n returnValue = new Paren(returnValue);\n }\n return returnValue;\n },\n\n genCSS(context, output) {\n for (let i = 0; i < this.value.length; i++) {\n this.value[i].genCSS(context, output);\n if (!this.noSpacing && i + 1 < this.value.length) {\n output.add(' ');\n }\n }\n },\n\n throwAwayComments() {\n this.value = this.value.filter(function(v) {\n return !(v instanceof Comment);\n });\n }\n});\n\nexport default Expression;\n","import Expression from '../tree/expression';\n\nclass functionCaller {\n constructor(name, context, index, currentFileInfo) {\n this.name = name.toLowerCase();\n this.index = index;\n this.context = context;\n this.currentFileInfo = currentFileInfo;\n\n this.func = context.frames[0].functionRegistry.get(this.name);\n }\n\n isValid() {\n return Boolean(this.func);\n }\n\n call(args) {\n if (!(Array.isArray(args))) {\n args = [args];\n }\n const evalArgs = this.func.evalArgs;\n if (evalArgs !== false) {\n args = args.map(a => a.eval(this.context));\n }\n const commentFilter = item => !(item.type === 'Comment');\n\n // This code is terrible and should be replaced as per this issue...\n // https://github.com/less/less.js/issues/2477\n args = args\n .filter(commentFilter)\n .map(item => {\n if (item.type === 'Expression') {\n const subNodes = item.value.filter(commentFilter);\n if (subNodes.length === 1) {\n return subNodes[0];\n } else {\n return new Expression(subNodes);\n }\n }\n return item;\n });\n\n if (evalArgs === false) {\n return this.func(this.context, ...args);\n }\n\n return this.func(...args);\n }\n}\n\nexport default functionCaller;\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import Node from './node';\nimport Anonymous from './anonymous';\nimport FunctionCaller from '../functions/function-caller';\n\n//\n// A function call node.\n//\nconst Call = function(name, args, index, currentFileInfo) {\n this.name = name;\n this.args = args;\n this.calc = name === 'calc';\n this._index = index;\n this._fileInfo = currentFileInfo;\n}\n\nCall.prototype = Object.assign(new Node(), {\n type: 'Call',\n\n accept(visitor) {\n if (this.args) {\n this.args = visitor.visitArray(this.args);\n }\n },\n\n //\n // When evaluating a function call,\n // we either find the function in the functionRegistry,\n // in which case we call it, passing the evaluated arguments,\n // if this returns null or we cannot find the function, we\n // simply print it out as it appeared originally [2].\n //\n // The reason why we evaluate the arguments, is in the case where\n // we try to pass a variable to a function, like: `saturate(@color)`.\n // The function should receive the value, not the variable.\n //\n eval(context) {\n /**\n * Turn off math for calc(), and switch back on for evaluating nested functions\n */\n const currentMathContext = context.mathOn;\n context.mathOn = !this.calc;\n if (this.calc || context.inCalc) {\n context.enterCalc();\n }\n\n const exitCalc = () => {\n if (this.calc || context.inCalc) {\n context.exitCalc();\n }\n context.mathOn = currentMathContext;\n };\n\n let result;\n const funcCaller = new FunctionCaller(this.name, context, this.getIndex(), this.fileInfo());\n\n if (funcCaller.isValid()) {\n try {\n result = funcCaller.call(this.args);\n exitCalc();\n } catch (e) {\n if (e.hasOwnProperty('line') && e.hasOwnProperty('column')) {\n throw e;\n }\n throw { \n type: e.type || 'Runtime',\n message: `Error evaluating function \\`${this.name}\\`${e.message ? `: ${e.message}` : ''}`,\n index: this.getIndex(), \n filename: this.fileInfo().filename,\n line: e.lineNumber,\n column: e.columnNumber\n };\n }\n }\n\n if (result !== null && result !== undefined) {\n // Results that that are not nodes are cast as Anonymous nodes\n // Falsy values or booleans are returned as empty nodes\n if (!(result instanceof Node)) {\n if (!result || result === true) {\n result = new Anonymous(null); \n }\n else {\n result = new Anonymous(result.toString()); \n }\n \n }\n result._index = this._index;\n result._fileInfo = this._fileInfo;\n return result;\n }\n\n const args = this.args.map(a => a.eval(context));\n exitCalc();\n\n return new Call(this.name, args, this.getIndex(), this.fileInfo());\n },\n\n genCSS(context, output) {\n output.add(`${this.name}(`, this.fileInfo(), this.getIndex());\n\n for (let i = 0; i < this.args.length; i++) {\n this.args[i].genCSS(context, output);\n if (i + 1 < this.args.length) {\n output.add(', ');\n }\n }\n\n output.add(')');\n }\n});\n\nexport default Call;\n","import Node from './node';\nimport Call from './call';\n\nconst Variable = function(name, index, currentFileInfo) {\n this.name = name;\n this._index = index;\n this._fileInfo = currentFileInfo;\n};\n\nVariable.prototype = Object.assign(new Node(), {\n type: 'Variable',\n\n eval(context) {\n let variable, name = this.name;\n\n if (name.indexOf('@@') === 0) {\n name = `@${new Variable(name.slice(1), this.getIndex(), this.fileInfo()).eval(context).value}`;\n }\n\n if (this.evaluating) {\n throw { type: 'Name',\n message: `Recursive variable definition for ${name}`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n variable = this.find(context.frames, function (frame) {\n const v = frame.variable(name);\n if (v) {\n if (v.important) {\n const importantScope = context.importantScope[context.importantScope.length - 1];\n importantScope.important = v.important;\n }\n // If in calc, wrap vars in a function call to cascade evaluate args first\n if (context.inCalc) {\n return (new Call('_SELF', [v.value])).eval(context);\n }\n else {\n return v.value.eval(context);\n }\n }\n });\n if (variable) {\n this.evaluating = false;\n return variable;\n } else {\n throw { type: 'Name',\n message: `variable ${name} is undefined`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n },\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n});\n\nexport default Variable;\n","import Node from './node';\nimport Declaration from './declaration';\n\nconst Property = function(name, index, currentFileInfo) {\n this.name = name;\n this._index = index;\n this._fileInfo = currentFileInfo;\n};\n\nProperty.prototype = Object.assign(new Node(), {\n type: 'Property',\n\n eval(context) {\n let property;\n const name = this.name;\n // TODO: shorten this reference\n const mergeRules = context.pluginManager.less.visitors.ToCSSVisitor.prototype._mergeRules;\n\n if (this.evaluating) {\n throw { type: 'Name',\n message: `Recursive property reference for ${name}`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n property = this.find(context.frames, function (frame) {\n let v;\n const vArr = frame.property(name);\n if (vArr) {\n for (let i = 0; i < vArr.length; i++) {\n v = vArr[i];\n\n vArr[i] = new Declaration(v.name,\n v.value,\n v.important,\n v.merge,\n v.index,\n v.currentFileInfo,\n v.inline,\n v.variable\n );\n }\n mergeRules(vArr);\n\n v = vArr[vArr.length - 1];\n if (v.important) {\n const importantScope = context.importantScope[context.importantScope.length - 1];\n importantScope.important = v.important;\n }\n v = v.value.eval(context);\n return v;\n }\n });\n if (property) {\n this.evaluating = false;\n return property;\n } else {\n throw { type: 'Name',\n message: `Property '${name}' is undefined`,\n filename: this.currentFileInfo.filename,\n index: this.index };\n }\n },\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n});\n\nexport default Property;\n","import Node from './node';\n\nconst Attribute = function(key, op, value) {\n this.key = key;\n this.op = op;\n this.value = value;\n}\n\nAttribute.prototype = Object.assign(new Node(), {\n type: 'Attribute',\n\n eval(context) {\n return new Attribute(this.key.eval ? this.key.eval(context) : this.key,\n this.op, (this.value && this.value.eval) ? this.value.eval(context) : this.value);\n },\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n },\n\n toCSS(context) {\n let value = this.key.toCSS ? this.key.toCSS(context) : this.key;\n\n if (this.op) {\n value += this.op;\n value += (this.value.toCSS ? this.value.toCSS(context) : this.value);\n }\n\n return `[${value}]`;\n }\n});\n\nexport default Attribute;\n","import Node from './node';\nimport Variable from './variable';\nimport Property from './property';\n\n\nconst Quoted = function(str, content, escaped, index, currentFileInfo) {\n this.escaped = (escaped == null) ? true : escaped;\n this.value = content || '';\n this.quote = str.charAt(0);\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.variableRegex = /@\\{([\\w-]+)\\}/g;\n this.propRegex = /\\$\\{([\\w-]+)\\}/g;\n this.allowRoot = escaped;\n};\n\nQuoted.prototype = Object.assign(new Node(), {\n type: 'Quoted',\n\n genCSS(context, output) {\n if (!this.escaped) {\n output.add(this.quote, this.fileInfo(), this.getIndex());\n }\n output.add(this.value);\n if (!this.escaped) {\n output.add(this.quote);\n }\n },\n\n containsVariables() {\n return this.value.match(this.variableRegex);\n },\n\n eval(context) {\n const that = this;\n let value = this.value;\n const variableReplacement = function (_, name) {\n const v = new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v.value : v.toCSS();\n };\n const propertyReplacement = function (_, name) {\n const v = new Property(`$${name}`, that.getIndex(), that.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v.value : v.toCSS();\n };\n function iterativeReplace(value, regexp, replacementFnc) {\n let evaluatedValue = value;\n do {\n value = evaluatedValue.toString();\n evaluatedValue = value.replace(regexp, replacementFnc);\n } while (value !== evaluatedValue);\n return evaluatedValue;\n }\n value = iterativeReplace(value, this.variableRegex, variableReplacement);\n value = iterativeReplace(value, this.propRegex, propertyReplacement);\n return new Quoted(this.quote + value + this.quote, value, this.escaped, this.getIndex(), this.fileInfo());\n },\n\n compare(other) {\n // when comparing quoted strings allow the quote to differ\n if (other.type === 'Quoted' && !this.escaped && !other.escaped) {\n return Node.numericCompare(this.value, other.value);\n } else {\n return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n }\n }\n});\n\nexport default Quoted;\n","import Node from './node';\n\nfunction escapePath(path) {\n return path.replace(/[\\(\\)'\"\\s]/g, function(match) { return `\\\\${match}`; });\n}\n\nconst URL = function(val, index, currentFileInfo, isEvald) {\n this.value = val;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.isEvald = isEvald;\n};\n\nURL.prototype = Object.assign(new Node(), {\n type: 'Url',\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n },\n\n genCSS(context, output) {\n output.add('url(');\n this.value.genCSS(context, output);\n output.add(')');\n },\n\n eval(context) {\n const val = this.value.eval(context);\n let rootpath;\n\n if (!this.isEvald) {\n // Add the rootpath if the URL requires a rewrite\n rootpath = this.fileInfo() && this.fileInfo().rootpath;\n if (typeof rootpath === 'string' &&\n typeof val.value === 'string' &&\n context.pathRequiresRewrite(val.value)) {\n if (!val.quote) {\n rootpath = escapePath(rootpath);\n }\n val.value = context.rewritePath(val.value, rootpath);\n } else {\n val.value = context.normalizePath(val.value);\n }\n\n // Add url args if enabled\n if (context.urlArgs) {\n if (!val.value.match(/^\\s*data:/)) {\n const delimiter = val.value.indexOf('?') === -1 ? '?' : '&';\n const urlArgs = delimiter + context.urlArgs;\n if (val.value.indexOf('#') !== -1) {\n val.value = val.value.replace('#', `${urlArgs}#`);\n } else {\n val.value += urlArgs;\n }\n }\n }\n }\n\n return new URL(val, this.getIndex(), this.fileInfo(), true);\n }\n});\n\nexport default URL;\n","import Ruleset from './ruleset';\nimport Value from './value';\nimport Selector from './selector';\nimport Anonymous from './anonymous';\nimport Expression from './expression';\nimport AtRule from './atrule';\nimport * as utils from '../utils';\n\nconst Media = function(value, features, index, currentFileInfo, visibilityInfo) {\n this._index = index;\n this._fileInfo = currentFileInfo;\n\n const selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors();\n\n this.features = new Value(features);\n this.rules = [new Ruleset(selectors, value)];\n this.rules[0].allowImports = true;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n this.setParent(selectors, this);\n this.setParent(this.features, this);\n this.setParent(this.rules, this);\n};\n\nMedia.prototype = Object.assign(new AtRule(), {\n type: 'Media',\n\n isRulesetLike() {\n return true;\n },\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this.features);\n }\n if (this.rules) {\n this.rules = visitor.visitArray(this.rules);\n }\n },\n\n genCSS(context, output) {\n output.add('@media ', this._fileInfo, this._index);\n this.features.genCSS(context, output);\n this.outputRuleset(context, output, this.rules);\n },\n\n eval(context) {\n if (!context.mediaBlocks) {\n context.mediaBlocks = [];\n context.mediaPath = [];\n }\n\n const media = new Media(null, [], this._index, this._fileInfo, this.visibilityInfo());\n if (this.debugInfo) {\n this.rules[0].debugInfo = this.debugInfo;\n media.debugInfo = this.debugInfo;\n }\n \n media.features = this.features.eval(context);\n\n context.mediaPath.push(media);\n context.mediaBlocks.push(media);\n\n this.rules[0].functionRegistry = context.frames[0].functionRegistry.inherit();\n context.frames.unshift(this.rules[0]);\n media.rules = [this.rules[0].eval(context)];\n context.frames.shift();\n\n context.mediaPath.pop();\n\n return context.mediaPath.length === 0 ? media.evalTop(context) :\n media.evalNested(context);\n },\n\n evalTop(context) {\n let result = this;\n\n // Render all dependent Media blocks.\n if (context.mediaBlocks.length > 1) {\n const selectors = (new Selector([], null, null, this.getIndex(), this.fileInfo())).createEmptySelectors();\n result = new Ruleset(selectors, context.mediaBlocks);\n result.multiMedia = true;\n result.copyVisibilityInfo(this.visibilityInfo());\n this.setParent(result, this);\n }\n\n delete context.mediaBlocks;\n delete context.mediaPath;\n\n return result;\n },\n\n evalNested(context) {\n let i;\n let value;\n const path = context.mediaPath.concat([this]);\n\n // Extract the media-query conditions separated with `,` (OR).\n for (i = 0; i < path.length; i++) {\n value = path[i].features instanceof Value ?\n path[i].features.value : path[i].features;\n path[i] = Array.isArray(value) ? value : [value];\n }\n\n // Trace all permutations to generate the resulting media-query.\n //\n // (a, b and c) with nested (d, e) ->\n // a and d\n // a and e\n // b and c and d\n // b and c and e\n this.features = new Value(this.permute(path).map(path => {\n path = path.map(fragment => fragment.toCSS ? fragment : new Anonymous(fragment));\n\n for (i = path.length - 1; i > 0; i--) {\n path.splice(i, 0, new Anonymous('and'));\n }\n\n return new Expression(path);\n }));\n this.setParent(this.features, this);\n\n // Fake a tree-node that doesn't output anything.\n return new Ruleset([], []);\n },\n\n permute(arr) {\n if (arr.length === 0) {\n return [];\n } else if (arr.length === 1) {\n return arr[0];\n } else {\n const result = [];\n const rest = this.permute(arr.slice(1));\n for (let i = 0; i < rest.length; i++) {\n for (let j = 0; j < arr[0].length; j++) {\n result.push([arr[0][j]].concat(rest[i]));\n }\n }\n return result;\n }\n },\n\n bubbleSelectors(selectors) {\n if (!selectors) {\n return;\n }\n this.rules = [new Ruleset(utils.copyArray(selectors), [this.rules[0]])];\n this.setParent(this.rules, this);\n }\n});\n\nexport default Media;\n","import Node from './node';\nimport Media from './media';\nimport URL from './url';\nimport Quoted from './quoted';\nimport Ruleset from './ruleset';\nimport Anonymous from './anonymous';\nimport * as utils from '../utils';\nimport LessError from '../less-error';\n\n//\n// CSS @import node\n//\n// The general strategy here is that we don't want to wait\n// for the parsing to be completed, before we start importing\n// the file. That's because in the context of a browser,\n// most of the time will be spent waiting for the server to respond.\n//\n// On creation, we push the import path to our import queue, though\n// `import,push`, we also pass it a callback, which it'll call once\n// the file has been fetched, and parsed.\n//\nconst Import = function(path, features, options, index, currentFileInfo, visibilityInfo) {\n this.options = options;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.path = path;\n this.features = features;\n this.allowRoot = true;\n\n if (this.options.less !== undefined || this.options.inline) {\n this.css = !this.options.less || this.options.inline;\n } else {\n const pathValue = this.getPath();\n if (pathValue && /[#\\.\\&\\?]css([\\?;].*)?$/.test(pathValue)) {\n this.css = true;\n }\n }\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.features, this);\n this.setParent(this.path, this);\n};\n\nImport.prototype = Object.assign(new Node(), {\n type: 'Import',\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this.features);\n }\n this.path = visitor.visit(this.path);\n if (!this.options.isPlugin && !this.options.inline && this.root) {\n this.root = visitor.visit(this.root);\n }\n },\n\n genCSS(context, output) {\n if (this.css && this.path._fileInfo.reference === undefined) {\n output.add('@import ', this._fileInfo, this._index);\n this.path.genCSS(context, output);\n if (this.features) {\n output.add(' ');\n this.features.genCSS(context, output);\n }\n output.add(';');\n }\n },\n\n getPath() {\n return (this.path instanceof URL) ?\n this.path.value.value : this.path.value;\n },\n\n isVariableImport() {\n let path = this.path;\n if (path instanceof URL) {\n path = path.value;\n }\n if (path instanceof Quoted) {\n return path.containsVariables();\n }\n\n return true;\n },\n\n evalForImport(context) {\n let path = this.path;\n\n if (path instanceof URL) {\n path = path.value;\n }\n\n return new Import(path.eval(context), this.features, this.options, this._index, this._fileInfo, this.visibilityInfo());\n },\n\n evalPath(context) {\n const path = this.path.eval(context);\n const fileInfo = this._fileInfo;\n\n if (!(path instanceof URL)) {\n // Add the rootpath if the URL requires a rewrite\n const pathValue = path.value;\n if (fileInfo &&\n pathValue &&\n context.pathRequiresRewrite(pathValue)) {\n path.value = context.rewritePath(pathValue, fileInfo.rootpath);\n } else {\n path.value = context.normalizePath(path.value);\n }\n }\n\n return path;\n },\n\n eval(context) {\n const result = this.doEval(context);\n if (this.options.reference || this.blocksVisibility()) {\n if (result.length || result.length === 0) {\n result.forEach(function (node) {\n node.addVisibilityBlock();\n }\n );\n } else {\n result.addVisibilityBlock();\n }\n }\n return result;\n },\n\n doEval(context) {\n let ruleset;\n let registry;\n const features = this.features && this.features.eval(context);\n\n if (this.options.isPlugin) {\n if (this.root && this.root.eval) {\n try {\n this.root.eval(context);\n }\n catch (e) {\n e.message = 'Plugin error during evaluation';\n throw new LessError(e, this.root.imports, this.root.filename);\n }\n }\n registry = context.frames[0] && context.frames[0].functionRegistry;\n if ( registry && this.root && this.root.functions ) {\n registry.addMultiple( this.root.functions );\n }\n\n return [];\n }\n\n if (this.skip) {\n if (typeof this.skip === 'function') {\n this.skip = this.skip();\n }\n if (this.skip) {\n return [];\n }\n }\n if (this.options.inline) {\n const contents = new Anonymous(this.root, 0,\n {\n filename: this.importedFilename,\n reference: this.path._fileInfo && this.path._fileInfo.reference\n }, true, true);\n\n return this.features ? new Media([contents], this.features.value) : [contents];\n } else if (this.css) {\n const newImport = new Import(this.evalPath(context), features, this.options, this._index);\n if (!newImport.css && this.error) {\n throw this.error;\n }\n return newImport;\n } else if (this.root) {\n ruleset = new Ruleset(null, utils.copyArray(this.root.rules));\n ruleset.evalImports(context);\n\n return this.features ? new Media(ruleset.rules, this.features.value) : ruleset.rules;\n } else {\n return [];\n }\n }\n});\n\nexport default Import;\n","import Node from './node';\nimport Variable from './variable';\n\nconst JsEvalNode = function() {};\n\nJsEvalNode.prototype = Object.assign(new Node(), {\n evaluateJavaScript(expression, context) {\n let result;\n const that = this;\n const evalContext = {};\n\n if (!context.javascriptEnabled) {\n throw { message: 'Inline JavaScript is not enabled. Is it set in your options?',\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n expression = expression.replace(/@\\{([\\w-]+)\\}/g, function (_, name) {\n return that.jsify(new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context));\n });\n\n try {\n expression = new Function(`return (${expression})`);\n } catch (e) {\n throw { message: `JavaScript evaluation error: ${e.message} from \\`${expression}\\`` ,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n const variables = context.frames[0].variables();\n for (const k in variables) {\n if (variables.hasOwnProperty(k)) {\n /* jshint loopfunc:true */\n evalContext[k.slice(1)] = {\n value: variables[k].value,\n toJS: function () {\n return this.value.eval(context).toCSS();\n }\n };\n }\n }\n\n try {\n result = expression.call(evalContext);\n } catch (e) {\n throw { message: `JavaScript evaluation error: '${e.name}: ${e.message.replace(/[\"]/g, '\\'')}'` ,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n return result;\n },\n\n jsify(obj) {\n if (Array.isArray(obj.value) && (obj.value.length > 1)) {\n return `[${obj.value.map(function (v) { return v.toCSS(); }).join(', ')}]`;\n } else {\n return obj.toCSS();\n }\n }\n});\n\nexport default JsEvalNode;\n","import JsEvalNode from './js-eval-node';\nimport Dimension from './dimension';\nimport Quoted from './quoted';\nimport Anonymous from './anonymous';\n\nconst JavaScript = function(string, escaped, index, currentFileInfo) {\n this.escaped = escaped;\n this.expression = string;\n this._index = index;\n this._fileInfo = currentFileInfo;\n}\n\nJavaScript.prototype = Object.assign(new JsEvalNode(), {\n type: 'JavaScript',\n\n eval(context) {\n const result = this.evaluateJavaScript(this.expression, context);\n const type = typeof result;\n\n if (type === 'number' && !isNaN(result)) {\n return new Dimension(result);\n } else if (type === 'string') {\n return new Quoted(`\"${result}\"`, result, this.escaped, this._index);\n } else if (Array.isArray(result)) {\n return new Anonymous(result.join(', '));\n } else {\n return new Anonymous(result);\n }\n }\n});\n\nexport default JavaScript;\n","import Node from './node';\n\nconst Assignment = function(key, val) {\n this.key = key;\n this.value = val;\n}\n\nAssignment.prototype = Object.assign(new Node(), {\n type: 'Assignment',\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n },\n\n eval(context) {\n if (this.value.eval) {\n return new Assignment(this.key, this.value.eval(context));\n }\n return this;\n },\n\n genCSS(context, output) {\n output.add(`${this.key}=`);\n if (this.value.genCSS) {\n this.value.genCSS(context, output);\n } else {\n output.add(this.value);\n }\n }\n});\n\nexport default Assignment;\n","import Node from './node';\n\nconst Condition = function(op, l, r, i, negate) {\n this.op = op.trim();\n this.lvalue = l;\n this.rvalue = r;\n this._index = i;\n this.negate = negate;\n};\n\nCondition.prototype = Object.assign(new Node(), {\n type: 'Condition',\n\n accept(visitor) {\n this.lvalue = visitor.visit(this.lvalue);\n this.rvalue = visitor.visit(this.rvalue);\n },\n\n eval(context) {\n const result = (function (op, a, b) {\n switch (op) {\n case 'and': return a && b;\n case 'or': return a || b;\n default:\n switch (Node.compare(a, b)) {\n case -1:\n return op === '<' || op === '=<' || op === '<=';\n case 0:\n return op === '=' || op === '>=' || op === '=<' || op === '<=';\n case 1:\n return op === '>' || op === '>=';\n default:\n return false;\n }\n }\n })(this.op, this.lvalue.eval(context), this.rvalue.eval(context));\n\n return this.negate ? !result : result;\n }\n});\n\nexport default Condition;\n","import Node from './node';\n\nconst UnicodeDescriptor = function(value) {\n this.value = value;\n}\n\nUnicodeDescriptor.prototype = Object.assign(new Node(), {\n type: 'UnicodeDescriptor'\n})\n\nexport default UnicodeDescriptor;\n","import Node from './node';\nimport Operation from './operation';\nimport Dimension from './dimension';\n\nconst Negative = function(node) {\n this.value = node;\n};\n\nNegative.prototype = Object.assign(new Node(), {\n type: 'Negative',\n\n genCSS(context, output) {\n output.add('-');\n this.value.genCSS(context, output);\n },\n\n eval(context) {\n if (context.isMathOn()) {\n return (new Operation('*', [new Dimension(-1), this.value])).eval(context);\n }\n return new Negative(this.value.eval(context));\n }\n});\n\nexport default Negative;\n","import Node from './node';\nimport Selector from './selector';\n\nconst Extend = function(selector, option, index, currentFileInfo, visibilityInfo) {\n this.selector = selector;\n this.option = option;\n this.object_id = Extend.next_id++;\n this.parent_ids = [this.object_id];\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n\n switch (option) {\n case 'all':\n this.allowBefore = true;\n this.allowAfter = true;\n break;\n default:\n this.allowBefore = false;\n this.allowAfter = false;\n break;\n }\n this.setParent(this.selector, this);\n};\n\nExtend.prototype = Object.assign(new Node(), {\n type: 'Extend',\n\n accept(visitor) {\n this.selector = visitor.visit(this.selector);\n },\n\n eval(context) {\n return new Extend(this.selector.eval(context), this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n },\n\n clone(context) {\n return new Extend(this.selector, this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n },\n\n // it concatenates (joins) all selectors in selector array\n findSelfSelectors(selectors) {\n let selfElements = [], i, selectorElements;\n\n for (i = 0; i < selectors.length; i++) {\n selectorElements = selectors[i].elements;\n // duplicate the logic in genCSS function inside the selector node.\n // future TODO - move both logics into the selector joiner visitor\n if (i > 0 && selectorElements.length && selectorElements[0].combinator.value === '') {\n selectorElements[0].combinator.value = ' ';\n }\n selfElements = selfElements.concat(selectors[i].elements);\n }\n\n this.selfSelectors = [new Selector(selfElements)];\n this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo());\n }\n});\n\nExtend.next_id = 0;\nexport default Extend;\n","import Node from './node';\nimport Variable from './variable';\nimport Ruleset from './ruleset';\nimport DetachedRuleset from './detached-ruleset';\nimport LessError from '../less-error';\n\nconst VariableCall = function(variable, index, currentFileInfo) {\n this.variable = variable;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.allowRoot = true;\n};\n\nVariableCall.prototype = Object.assign(new Node(), {\n type: 'VariableCall',\n\n eval(context) {\n let rules;\n let detachedRuleset = new Variable(this.variable, this.getIndex(), this.fileInfo()).eval(context);\n const error = new LessError({message: `Could not evaluate variable call ${this.variable}`});\n\n if (!detachedRuleset.ruleset) {\n if (detachedRuleset.rules) {\n rules = detachedRuleset;\n }\n else if (Array.isArray(detachedRuleset)) {\n rules = new Ruleset('', detachedRuleset);\n }\n else if (Array.isArray(detachedRuleset.value)) {\n rules = new Ruleset('', detachedRuleset.value);\n }\n else {\n throw error;\n }\n detachedRuleset = new DetachedRuleset(rules);\n }\n\n if (detachedRuleset.ruleset) {\n return detachedRuleset.callEval(context);\n }\n throw error;\n }\n});\n\nexport default VariableCall;\n","import Node from './node';\nimport Variable from './variable';\nimport Ruleset from './ruleset';\nimport Selector from './selector';\n\nconst NamespaceValue = function(ruleCall, lookups, index, fileInfo) {\n this.value = ruleCall;\n this.lookups = lookups;\n this._index = index;\n this._fileInfo = fileInfo;\n};\n\nNamespaceValue.prototype = Object.assign(new Node(), {\n type: 'NamespaceValue',\n\n eval(context) {\n let i, j, name, rules = this.value.eval(context);\n \n for (i = 0; i < this.lookups.length; i++) {\n name = this.lookups[i];\n\n /**\n * Eval'd DRs return rulesets.\n * Eval'd mixins return rules, so let's make a ruleset if we need it.\n * We need to do this because of late parsing of values\n */\n if (Array.isArray(rules)) {\n rules = new Ruleset([new Selector()], rules);\n }\n\n if (name === '') {\n rules = rules.lastDeclaration();\n }\n else if (name.charAt(0) === '@') {\n if (name.charAt(1) === '@') {\n name = `@${new Variable(name.substr(1)).eval(context).value}`;\n }\n if (rules.variables) {\n rules = rules.variable(name);\n }\n \n if (!rules) {\n throw { type: 'Name',\n message: `variable ${name} not found`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n }\n else {\n if (name.substring(0, 2) === '$@') {\n name = `$${new Variable(name.substr(1)).eval(context).value}`;\n }\n else {\n name = name.charAt(0) === '$' ? name : `$${name}`;\n }\n if (rules.properties) {\n rules = rules.property(name);\n }\n \n if (!rules) {\n throw { type: 'Name',\n message: `property \"${name.substr(1)}\" not found`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n // Properties are an array of values, since a ruleset can have multiple props.\n // We pick the last one (the \"cascaded\" value)\n rules = rules[rules.length - 1];\n }\n\n if (rules.value) {\n rules = rules.eval(context).value;\n }\n if (rules.ruleset) {\n rules = rules.ruleset.eval(context);\n }\n }\n return rules;\n }\n});\n\nexport default NamespaceValue;\n","import Selector from './selector';\nimport Element from './element';\nimport Ruleset from './ruleset';\nimport Declaration from './declaration';\nimport DetachedRuleset from './detached-ruleset';\nimport Expression from './expression';\nimport contexts from '../contexts';\nimport * as utils from '../utils';\n\nconst Definition = function(name, params, rules, condition, variadic, frames, visibilityInfo) {\n this.name = name || 'anonymous mixin';\n this.selectors = [new Selector([new Element(null, name, false, this._index, this._fileInfo)])];\n this.params = params;\n this.condition = condition;\n this.variadic = variadic;\n this.arity = params.length;\n this.rules = rules;\n this._lookups = {};\n const optionalParameters = [];\n this.required = params.reduce(function (count, p) {\n if (!p.name || (p.name && !p.value)) {\n return count + 1;\n }\n else {\n optionalParameters.push(p.name);\n return count;\n }\n }, 0);\n this.optionalParameters = optionalParameters;\n this.frames = frames;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n}\n\nDefinition.prototype = Object.assign(new Ruleset(), {\n type: 'MixinDefinition',\n evalFirst: true,\n\n accept(visitor) {\n if (this.params && this.params.length) {\n this.params = visitor.visitArray(this.params);\n }\n this.rules = visitor.visitArray(this.rules);\n if (this.condition) {\n this.condition = visitor.visit(this.condition);\n }\n },\n\n evalParams(context, mixinEnv, args, evaldArguments) {\n /* jshint boss:true */\n const frame = new Ruleset(null, null);\n\n let varargs;\n let arg;\n const params = utils.copyArray(this.params);\n let i;\n let j;\n let val;\n let name;\n let isNamedFound;\n let argIndex;\n let argsLength = 0;\n\n if (mixinEnv.frames && mixinEnv.frames[0] && mixinEnv.frames[0].functionRegistry) {\n frame.functionRegistry = mixinEnv.frames[0].functionRegistry.inherit();\n }\n mixinEnv = new contexts.Eval(mixinEnv, [frame].concat(mixinEnv.frames));\n\n if (args) {\n args = utils.copyArray(args);\n argsLength = args.length;\n\n for (i = 0; i < argsLength; i++) {\n arg = args[i];\n if (name = (arg && arg.name)) {\n isNamedFound = false;\n for (j = 0; j < params.length; j++) {\n if (!evaldArguments[j] && name === params[j].name) {\n evaldArguments[j] = arg.value.eval(context);\n frame.prependRule(new Declaration(name, arg.value.eval(context)));\n isNamedFound = true;\n break;\n }\n }\n if (isNamedFound) {\n args.splice(i, 1);\n i--;\n continue;\n } else {\n throw { type: 'Runtime', message: `Named argument for ${this.name} ${args[i].name} not found` };\n }\n }\n }\n }\n argIndex = 0;\n for (i = 0; i < params.length; i++) {\n if (evaldArguments[i]) { continue; }\n\n arg = args && args[argIndex];\n\n if (name = params[i].name) {\n if (params[i].variadic) {\n varargs = [];\n for (j = argIndex; j < argsLength; j++) {\n varargs.push(args[j].value.eval(context));\n }\n frame.prependRule(new Declaration(name, new Expression(varargs).eval(context)));\n } else {\n val = arg && arg.value;\n if (val) {\n // This was a mixin call, pass in a detached ruleset of it's eval'd rules\n if (Array.isArray(val)) {\n val = new DetachedRuleset(new Ruleset('', val));\n }\n else {\n val = val.eval(context);\n }\n } else if (params[i].value) {\n val = params[i].value.eval(mixinEnv);\n frame.resetCache();\n } else {\n throw { type: 'Runtime', message: `wrong number of arguments for ${this.name} (${argsLength} for ${this.arity})` };\n }\n\n frame.prependRule(new Declaration(name, val));\n evaldArguments[i] = val;\n }\n }\n\n if (params[i].variadic && args) {\n for (j = argIndex; j < argsLength; j++) {\n evaldArguments[j] = args[j].value.eval(context);\n }\n }\n argIndex++;\n }\n\n return frame;\n },\n\n makeImportant() {\n const rules = !this.rules ? this.rules : this.rules.map(function (r) {\n if (r.makeImportant) {\n return r.makeImportant(true);\n } else {\n return r;\n }\n });\n const result = new Definition(this.name, this.params, rules, this.condition, this.variadic, this.frames);\n return result;\n },\n\n eval(context) {\n return new Definition(this.name, this.params, this.rules, this.condition, this.variadic, this.frames || utils.copyArray(context.frames));\n },\n\n evalCall(context, args, important) {\n const _arguments = [];\n const mixinFrames = this.frames ? this.frames.concat(context.frames) : context.frames;\n const frame = this.evalParams(context, new contexts.Eval(context, mixinFrames), args, _arguments);\n let rules;\n let ruleset;\n\n frame.prependRule(new Declaration('@arguments', new Expression(_arguments).eval(context)));\n\n rules = utils.copyArray(this.rules);\n\n ruleset = new Ruleset(null, rules);\n ruleset.originalRuleset = this;\n ruleset = ruleset.eval(new contexts.Eval(context, [this, frame].concat(mixinFrames)));\n if (important) {\n ruleset = ruleset.makeImportant();\n }\n return ruleset;\n },\n\n matchCondition(args, context) {\n if (this.condition && !this.condition.eval(\n new contexts.Eval(context,\n [this.evalParams(context, /* the parameter variables */\n new contexts.Eval(context, this.frames ? this.frames.concat(context.frames) : context.frames), args, [])]\n .concat(this.frames || []) // the parent namespace/mixin frames\n .concat(context.frames)))) { // the current environment frames\n return false;\n }\n return true;\n },\n\n matchArgs(args, context) {\n const allArgsCnt = (args && args.length) || 0;\n let len;\n const optionalParameters = this.optionalParameters;\n const requiredArgsCnt = !args ? 0 : args.reduce(function (count, p) {\n if (optionalParameters.indexOf(p.name) < 0) {\n return count + 1;\n } else {\n return count;\n }\n }, 0);\n\n if (!this.variadic) {\n if (requiredArgsCnt < this.required) {\n return false;\n }\n if (allArgsCnt > this.params.length) {\n return false;\n }\n } else {\n if (requiredArgsCnt < (this.required - 1)) {\n return false;\n }\n }\n\n // check patterns\n len = Math.min(requiredArgsCnt, this.arity);\n\n for (let i = 0; i < len; i++) {\n if (!this.params[i].name && !this.params[i].variadic) {\n if (args[i].value.eval(context).toCSS() != this.params[i].value.eval(context).toCSS()) {\n return false;\n }\n }\n }\n return true;\n }\n});\n\nexport default Definition;\n","import Node from './node';\nimport Selector from './selector';\nimport MixinDefinition from './mixin-definition';\nimport defaultFunc from '../functions/default';\n\nconst MixinCall = function(elements, args, index, currentFileInfo, important) {\n this.selector = new Selector(elements);\n this.arguments = args || [];\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.important = important;\n this.allowRoot = true;\n this.setParent(this.selector, this);\n};\n\nMixinCall.prototype = Object.assign(new Node(), {\n type: 'MixinCall',\n\n accept(visitor) {\n if (this.selector) {\n this.selector = visitor.visit(this.selector);\n }\n if (this.arguments.length) {\n this.arguments = visitor.visitArray(this.arguments);\n }\n },\n\n eval(context) {\n let mixins;\n let mixin;\n let mixinPath;\n const args = [];\n let arg;\n let argValue;\n const rules = [];\n let match = false;\n let i;\n let m;\n let f;\n let isRecursive;\n let isOneFound;\n const candidates = [];\n let candidate;\n const conditionResult = [];\n let defaultResult;\n const defFalseEitherCase = -1;\n const defNone = 0;\n const defTrue = 1;\n const defFalse = 2;\n let count;\n let originalRuleset;\n let noArgumentsFilter;\n\n this.selector = this.selector.eval(context);\n\n function calcDefGroup(mixin, mixinPath) {\n let f, p, namespace;\n\n for (f = 0; f < 2; f++) {\n conditionResult[f] = true;\n defaultFunc.value(f);\n for (p = 0; p < mixinPath.length && conditionResult[f]; p++) {\n namespace = mixinPath[p];\n if (namespace.matchCondition) {\n conditionResult[f] = conditionResult[f] && namespace.matchCondition(null, context);\n }\n }\n if (mixin.matchCondition) {\n conditionResult[f] = conditionResult[f] && mixin.matchCondition(args, context);\n }\n }\n if (conditionResult[0] || conditionResult[1]) {\n if (conditionResult[0] != conditionResult[1]) {\n return conditionResult[1] ?\n defTrue : defFalse;\n }\n\n return defNone;\n }\n return defFalseEitherCase;\n }\n\n for (i = 0; i < this.arguments.length; i++) {\n arg = this.arguments[i];\n argValue = arg.value.eval(context);\n if (arg.expand && Array.isArray(argValue.value)) {\n argValue = argValue.value;\n for (m = 0; m < argValue.length; m++) {\n args.push({value: argValue[m]});\n }\n } else {\n args.push({name: arg.name, value: argValue});\n }\n }\n\n noArgumentsFilter = function(rule) {return rule.matchArgs(null, context);};\n\n for (i = 0; i < context.frames.length; i++) {\n if ((mixins = context.frames[i].find(this.selector, null, noArgumentsFilter)).length > 0) {\n isOneFound = true;\n\n // To make `default()` function independent of definition order we have two \"subpasses\" here.\n // At first we evaluate each guard *twice* (with `default() == true` and `default() == false`),\n // and build candidate list with corresponding flags. Then, when we know all possible matches,\n // we make a final decision.\n\n for (m = 0; m < mixins.length; m++) {\n mixin = mixins[m].rule;\n mixinPath = mixins[m].path;\n isRecursive = false;\n for (f = 0; f < context.frames.length; f++) {\n if ((!(mixin instanceof MixinDefinition)) && mixin === (context.frames[f].originalRuleset || context.frames[f])) {\n isRecursive = true;\n break;\n }\n }\n if (isRecursive) {\n continue;\n }\n\n if (mixin.matchArgs(args, context)) {\n candidate = {mixin, group: calcDefGroup(mixin, mixinPath)};\n\n if (candidate.group !== defFalseEitherCase) {\n candidates.push(candidate);\n }\n\n match = true;\n }\n }\n\n defaultFunc.reset();\n\n count = [0, 0, 0];\n for (m = 0; m < candidates.length; m++) {\n count[candidates[m].group]++;\n }\n\n if (count[defNone] > 0) {\n defaultResult = defFalse;\n } else {\n defaultResult = defTrue;\n if ((count[defTrue] + count[defFalse]) > 1) {\n throw { type: 'Runtime',\n message: `Ambiguous use of \\`default()\\` found when matching for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n }\n\n for (m = 0; m < candidates.length; m++) {\n candidate = candidates[m].group;\n if ((candidate === defNone) || (candidate === defaultResult)) {\n try {\n mixin = candidates[m].mixin;\n if (!(mixin instanceof MixinDefinition)) {\n originalRuleset = mixin.originalRuleset || mixin;\n mixin = new MixinDefinition('', [], mixin.rules, null, false, null, originalRuleset.visibilityInfo());\n mixin.originalRuleset = originalRuleset;\n }\n const newRules = mixin.evalCall(context, args, this.important).rules;\n this._setVisibilityToReplacement(newRules);\n Array.prototype.push.apply(rules, newRules);\n } catch (e) {\n throw { message: e.message, index: this.getIndex(), filename: this.fileInfo().filename, stack: e.stack };\n }\n }\n }\n\n if (match) {\n return rules;\n }\n }\n }\n if (isOneFound) {\n throw { type: 'Runtime',\n message: `No matching definition was found for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n } else {\n throw { type: 'Name',\n message: `${this.selector.toCSS().trim()} is undefined`,\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n },\n\n _setVisibilityToReplacement(replacement) {\n let i, rule;\n if (this.blocksVisibility()) {\n for (i = 0; i < replacement.length; i++) {\n rule = replacement[i];\n rule.addVisibilityBlock();\n }\n }\n },\n\n format(args) {\n return `${this.selector.toCSS().trim()}(${args ? args.map(function (a) {\n let argValue = '';\n if (a.name) {\n argValue += `${a.name}:`;\n }\n if (a.value.toCSS) {\n argValue += a.value.toCSS();\n } else {\n argValue += '???';\n }\n return argValue;\n }).join(', ') : ''})`;\n }\n});\n\nexport default MixinCall;\n","import Node from './node';\nimport Color from './color';\nimport AtRule from './atrule';\nimport DetachedRuleset from './detached-ruleset';\nimport Operation from './operation';\nimport Dimension from './dimension';\nimport Unit from './unit';\nimport Keyword from './keyword';\nimport Variable from './variable';\nimport Property from './property';\nimport Ruleset from './ruleset';\nimport Element from './element';\nimport Attribute from './attribute';\nimport Combinator from './combinator';\nimport Selector from './selector';\nimport Quoted from './quoted';\nimport Expression from './expression';\nimport Declaration from './declaration';\nimport Call from './call';\nimport URL from './url';\nimport Import from './import';\nimport Comment from './comment';\nimport Anonymous from './anonymous';\nimport Value from './value';\nimport JavaScript from './javascript';\nimport Assignment from './assignment';\nimport Condition from './condition';\nimport Paren from './paren';\nimport Media from './media';\nimport UnicodeDescriptor from './unicode-descriptor';\nimport Negative from './negative';\nimport Extend from './extend';\nimport VariableCall from './variable-call';\nimport NamespaceValue from './namespace-value';\n\n// mixins\nimport MixinCall from './mixin-call';\nimport MixinDefinition from './mixin-definition';\n\nexport default {\n Node, Color, AtRule, DetachedRuleset, Operation,\n Dimension, Unit, Keyword, Variable, Property,\n Ruleset, Element, Attribute, Combinator, Selector,\n Quoted, Expression, Declaration, Call, URL, Import,\n Comment, Anonymous, Value, JavaScript, Assignment,\n Condition, Paren, Media, UnicodeDescriptor, Negative,\n Extend, VariableCall, NamespaceValue,\n mixin: {\n Call: MixinCall,\n Definition: MixinDefinition\n }\n};","class AbstractFileManager {\n getPath(filename) {\n let j = filename.lastIndexOf('?');\n if (j > 0) {\n filename = filename.slice(0, j);\n }\n j = filename.lastIndexOf('/');\n if (j < 0) {\n j = filename.lastIndexOf('\\\\');\n }\n if (j < 0) {\n return '';\n }\n return filename.slice(0, j + 1);\n }\n\n tryAppendExtension(path, ext) {\n return /(\\.[a-z]*$)|([\\?;].*)$/.test(path) ? path : path + ext;\n }\n\n tryAppendLessExtension(path) {\n return this.tryAppendExtension(path, '.less');\n }\n\n supportsSync() {\n return false;\n }\n\n alwaysMakePathsAbsolute() {\n return false;\n }\n\n isPathAbsolute(filename) {\n return (/^(?:[a-z-]+:|\\/|\\\\|#)/i).test(filename);\n }\n\n // TODO: pull out / replace?\n join(basePath, laterPath) {\n if (!basePath) {\n return laterPath;\n }\n return basePath + laterPath;\n }\n\n pathDiff(url, baseUrl) {\n // diff between two paths to create a relative path\n\n const urlParts = this.extractUrlParts(url);\n\n const baseUrlParts = this.extractUrlParts(baseUrl);\n let i;\n let max;\n let urlDirectories;\n let baseUrlDirectories;\n let diff = '';\n if (urlParts.hostPart !== baseUrlParts.hostPart) {\n return '';\n }\n max = Math.max(baseUrlParts.directories.length, urlParts.directories.length);\n for (i = 0; i < max; i++) {\n if (baseUrlParts.directories[i] !== urlParts.directories[i]) { break; }\n }\n baseUrlDirectories = baseUrlParts.directories.slice(i);\n urlDirectories = urlParts.directories.slice(i);\n for (i = 0; i < baseUrlDirectories.length - 1; i++) {\n diff += '../';\n }\n for (i = 0; i < urlDirectories.length - 1; i++) {\n diff += `${urlDirectories[i]}/`;\n }\n return diff;\n }\n\n // helper function, not part of API\n extractUrlParts(url, baseUrl) {\n // urlParts[1] = protocol://hostname/ OR /\n // urlParts[2] = / if path relative to host base\n // urlParts[3] = directories\n // urlParts[4] = filename\n // urlParts[5] = parameters\n\n const urlPartsRegex = /^((?:[a-z-]+:)?\\/{2}(?:[^\\/\\?#]*\\/)|([\\/\\\\]))?((?:[^\\/\\\\\\?#]*[\\/\\\\])*)([^\\/\\\\\\?#]*)([#\\?].*)?$/i;\n\n const urlParts = url.match(urlPartsRegex);\n const returner = {};\n let rawDirectories = [];\n const directories = [];\n let i;\n let baseUrlParts;\n\n if (!urlParts) {\n throw new Error(`Could not parse sheet href - '${url}'`);\n }\n\n // Stylesheets in IE don't always return the full path\n if (baseUrl && (!urlParts[1] || urlParts[2])) {\n baseUrlParts = baseUrl.match(urlPartsRegex);\n if (!baseUrlParts) {\n throw new Error(`Could not parse page url - '${baseUrl}'`);\n }\n urlParts[1] = urlParts[1] || baseUrlParts[1] || '';\n if (!urlParts[2]) {\n urlParts[3] = baseUrlParts[3] + urlParts[3];\n }\n }\n\n if (urlParts[3]) {\n rawDirectories = urlParts[3].replace(/\\\\/g, '/').split('/');\n\n // collapse '..' and skip '.'\n for (i = 0; i < rawDirectories.length; i++) {\n\n if (rawDirectories[i] === '..') {\n directories.pop();\n }\n else if (rawDirectories[i] !== '.') {\n directories.push(rawDirectories[i]);\n }\n \n }\n }\n\n returner.hostPart = urlParts[1];\n returner.directories = directories;\n returner.rawPath = (urlParts[1] || '') + rawDirectories.join('/');\n returner.path = (urlParts[1] || '') + directories.join('/');\n returner.filename = urlParts[4];\n returner.fileUrl = returner.path + (urlParts[4] || '');\n returner.url = returner.fileUrl + (urlParts[5] || '');\n return returner;\n }\n}\n\nexport default AbstractFileManager;\n","import functionRegistry from '../functions/function-registry';\nimport LessError from '../less-error';\n\nclass AbstractPluginLoader {\n constructor() {\n // Implemented by Node.js plugin loader\n this.require = function() {\n return null;\n }\n }\n\n evalPlugin(contents, context, imports, pluginOptions, fileInfo) {\n\n let loader, registry, pluginObj, localModule, pluginManager, filename, result;\n\n pluginManager = context.pluginManager;\n\n if (fileInfo) {\n if (typeof fileInfo === 'string') {\n filename = fileInfo;\n }\n else {\n filename = fileInfo.filename;\n }\n }\n const shortname = (new this.less.FileManager()).extractUrlParts(filename).filename;\n\n if (filename) {\n pluginObj = pluginManager.get(filename);\n\n if (pluginObj) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imports, filename);\n }\n return pluginObj;\n }\n }\n localModule = {\n exports: {},\n pluginManager,\n fileInfo\n };\n registry = functionRegistry.create();\n\n const registerPlugin = function(obj) {\n pluginObj = obj;\n };\n\n try {\n loader = new Function('module', 'require', 'registerPlugin', 'functions', 'tree', 'less', 'fileInfo', contents);\n loader(localModule, this.require(filename), registerPlugin, registry, this.less.tree, this.less, fileInfo);\n }\n catch (e) {\n return new LessError(e, imports, filename);\n }\n\n if (!pluginObj) {\n pluginObj = localModule.exports;\n }\n pluginObj = this.validatePlugin(pluginObj, filename, shortname);\n\n if (pluginObj instanceof LessError) {\n return pluginObj;\n }\n\n if (pluginObj) {\n pluginObj.imports = imports;\n pluginObj.filename = filename;\n\n // For < 3.x (or unspecified minVersion) - setOptions() before install()\n if (!pluginObj.minVersion || this.compareVersion('3.0.0', pluginObj.minVersion) < 0) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n\n if (result) {\n return result;\n }\n }\n\n // Run on first load\n pluginManager.addPlugin(pluginObj, fileInfo.filename, registry);\n pluginObj.functions = registry.getLocalFunctions();\n\n // Need to call setOptions again because the pluginObj might have functions\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n\n // Run every @plugin call\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imports, filename);\n }\n\n }\n else {\n return new LessError({ message: 'Not a valid plugin' }, imports, filename);\n }\n\n return pluginObj;\n\n }\n\n trySetOptions(plugin, filename, name, options) {\n if (options && !plugin.setOptions) {\n return new LessError({\n message: `Options have been provided but the plugin ${name} does not support any options.`\n });\n }\n try {\n plugin.setOptions && plugin.setOptions(options);\n }\n catch (e) {\n return new LessError(e);\n }\n }\n\n validatePlugin(plugin, filename, name) {\n if (plugin) {\n // support plugins being a function\n // so that the plugin can be more usable programmatically\n if (typeof plugin === 'function') {\n plugin = new plugin();\n }\n\n if (plugin.minVersion) {\n if (this.compareVersion(plugin.minVersion, this.less.version) < 0) {\n return new LessError({\n message: `Plugin ${name} requires version ${this.versionToString(plugin.minVersion)}`\n });\n }\n }\n return plugin;\n }\n return null;\n }\n\n compareVersion(aVersion, bVersion) {\n if (typeof aVersion === 'string') {\n aVersion = aVersion.match(/^(\\d+)\\.?(\\d+)?\\.?(\\d+)?/);\n aVersion.shift();\n }\n for (let i = 0; i < aVersion.length; i++) {\n if (aVersion[i] !== bVersion[i]) {\n return parseInt(aVersion[i]) > parseInt(bVersion[i]) ? -1 : 1;\n }\n }\n return 0;\n }\n\n versionToString(version) {\n let versionString = '';\n for (let i = 0; i < version.length; i++) {\n versionString += (versionString ? '.' : '') + version[i];\n }\n return versionString;\n }\n\n printUsage(plugins) {\n for (let i = 0; i < plugins.length; i++) {\n const plugin = plugins[i];\n if (plugin.printUsage) {\n plugin.printUsage();\n }\n }\n }\n}\n\nexport default AbstractPluginLoader;\n\n","import tree from '../tree';\n\nconst _visitArgs = { visitDeeper: true };\nlet _hasIndexed = false;\n\nfunction _noop(node) {\n return node;\n}\n\nfunction indexNodeTypes(parent, ticker) {\n // add .typeIndex to tree node types for lookup table\n let key, child;\n for (key in parent) { \n /* eslint guard-for-in: 0 */\n child = parent[key];\n switch (typeof child) {\n case 'function':\n // ignore bound functions directly on tree which do not have a prototype\n // or aren't nodes\n if (child.prototype && child.prototype.type) {\n child.prototype.typeIndex = ticker++;\n }\n break;\n case 'object':\n ticker = indexNodeTypes(child, ticker);\n break;\n \n }\n }\n return ticker;\n}\n\nclass Visitor {\n constructor(implementation) {\n this._implementation = implementation;\n this._visitInCache = {};\n this._visitOutCache = {};\n\n if (!_hasIndexed) {\n indexNodeTypes(tree, 1);\n _hasIndexed = true;\n }\n }\n\n visit(node) {\n if (!node) {\n return node;\n }\n\n const nodeTypeIndex = node.typeIndex;\n if (!nodeTypeIndex) {\n // MixinCall args aren't a node type?\n if (node.value && node.value.typeIndex) {\n this.visit(node.value);\n }\n return node;\n }\n\n const impl = this._implementation;\n let func = this._visitInCache[nodeTypeIndex];\n let funcOut = this._visitOutCache[nodeTypeIndex];\n const visitArgs = _visitArgs;\n let fnName;\n\n visitArgs.visitDeeper = true;\n\n if (!func) {\n fnName = `visit${node.type}`;\n func = impl[fnName] || _noop;\n funcOut = impl[`${fnName}Out`] || _noop;\n this._visitInCache[nodeTypeIndex] = func;\n this._visitOutCache[nodeTypeIndex] = funcOut;\n }\n\n if (func !== _noop) {\n const newNode = func.call(impl, node, visitArgs);\n if (node && impl.isReplacing) {\n node = newNode;\n }\n }\n\n if (visitArgs.visitDeeper && node) {\n if (node.length) {\n for (let i = 0, cnt = node.length; i < cnt; i++) {\n if (node[i].accept) {\n node[i].accept(this);\n }\n }\n } else if (node.accept) {\n node.accept(this);\n }\n }\n\n if (funcOut != _noop) {\n funcOut.call(impl, node);\n }\n\n return node;\n }\n\n visitArray(nodes, nonReplacing) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.length;\n let i;\n\n // Non-replacing\n if (nonReplacing || !this._implementation.isReplacing) {\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n // Replacing\n const out = [];\n for (i = 0; i < cnt; i++) {\n const evald = this.visit(nodes[i]);\n if (evald === undefined) { continue; }\n if (!evald.splice) {\n out.push(evald);\n } else if (evald.length) {\n this.flatten(evald, out);\n }\n }\n return out;\n }\n\n flatten(arr, out) {\n if (!out) {\n out = [];\n }\n\n let cnt, i, item, nestedCnt, j, nestedItem;\n\n for (i = 0, cnt = arr.length; i < cnt; i++) {\n item = arr[i];\n if (item === undefined) {\n continue;\n }\n if (!item.splice) {\n out.push(item);\n continue;\n }\n\n for (j = 0, nestedCnt = item.length; j < nestedCnt; j++) {\n nestedItem = item[j];\n if (nestedItem === undefined) {\n continue;\n }\n if (!nestedItem.splice) {\n out.push(nestedItem);\n } else if (nestedItem.length) {\n this.flatten(nestedItem, out);\n }\n }\n }\n\n return out;\n }\n}\n\nexport default Visitor;\n","class ImportSequencer {\n constructor(onSequencerEmpty) {\n this.imports = [];\n this.variableImports = [];\n this._onSequencerEmpty = onSequencerEmpty;\n this._currentDepth = 0;\n }\n\n addImport(callback) {\n const importSequencer = this,\n importItem = {\n callback,\n args: null,\n isReady: false\n };\n this.imports.push(importItem);\n return function() {\n importItem.args = Array.prototype.slice.call(arguments, 0);\n importItem.isReady = true;\n importSequencer.tryRun();\n };\n }\n\n addVariableImport(callback) {\n this.variableImports.push(callback);\n }\n\n tryRun() {\n this._currentDepth++;\n try {\n while (true) {\n while (this.imports.length > 0) {\n const importItem = this.imports[0];\n if (!importItem.isReady) {\n return;\n }\n this.imports = this.imports.slice(1);\n importItem.callback.apply(null, importItem.args);\n }\n if (this.variableImports.length === 0) {\n break;\n }\n const variableImport = this.variableImports[0];\n this.variableImports = this.variableImports.slice(1);\n variableImport();\n }\n } finally {\n this._currentDepth--;\n }\n if (this._currentDepth === 0 && this._onSequencerEmpty) {\n this._onSequencerEmpty();\n }\n }\n}\n\nexport default ImportSequencer;\n","import contexts from '../contexts';\nimport Visitor from './visitor';\nimport ImportSequencer from './import-sequencer';\nimport * as utils from '../utils';\n\nconst ImportVisitor = function(importer, finish) {\n\n this._visitor = new Visitor(this);\n this._importer = importer;\n this._finish = finish;\n this.context = new contexts.Eval();\n this.importCount = 0;\n this.onceFileDetectionMap = {};\n this.recursionDetector = {};\n this._sequencer = new ImportSequencer(this._onSequencerEmpty.bind(this));\n};\n\nImportVisitor.prototype = {\n isReplacing: false,\n run: function (root) {\n try {\n // process the contents\n this._visitor.visit(root);\n }\n catch (e) {\n this.error = e;\n }\n\n this.isFinished = true;\n this._sequencer.tryRun();\n },\n _onSequencerEmpty: function() {\n if (!this.isFinished) {\n return;\n }\n this._finish(this.error);\n },\n visitImport: function (importNode, visitArgs) {\n const inlineCSS = importNode.options.inline;\n\n if (!importNode.css || inlineCSS) {\n\n const context = new contexts.Eval(this.context, utils.copyArray(this.context.frames));\n const importParent = context.frames[0];\n\n this.importCount++;\n if (importNode.isVariableImport()) {\n this._sequencer.addVariableImport(this.processImportNode.bind(this, importNode, context, importParent));\n } else {\n this.processImportNode(importNode, context, importParent);\n }\n }\n visitArgs.visitDeeper = false;\n },\n processImportNode: function(importNode, context, importParent) {\n let evaldImportNode;\n const inlineCSS = importNode.options.inline;\n\n try {\n evaldImportNode = importNode.evalForImport(context);\n } catch (e) {\n if (!e.filename) { e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename; }\n // attempt to eval properly and treat as css\n importNode.css = true;\n // if that fails, this error will be thrown\n importNode.error = e;\n }\n\n if (evaldImportNode && (!evaldImportNode.css || inlineCSS)) {\n\n if (evaldImportNode.options.multiple) {\n context.importMultiple = true;\n }\n\n // try appending if we haven't determined if it is css or not\n const tryAppendLessExtension = evaldImportNode.css === undefined;\n\n for (let i = 0; i < importParent.rules.length; i++) {\n if (importParent.rules[i] === importNode) {\n importParent.rules[i] = evaldImportNode;\n break;\n }\n }\n\n const onImported = this.onImported.bind(this, evaldImportNode, context), sequencedOnImported = this._sequencer.addImport(onImported);\n\n this._importer.push(evaldImportNode.getPath(), tryAppendLessExtension, evaldImportNode.fileInfo(),\n evaldImportNode.options, sequencedOnImported);\n } else {\n this.importCount--;\n if (this.isFinished) {\n this._sequencer.tryRun();\n }\n }\n },\n onImported: function (importNode, context, e, root, importedAtRoot, fullPath) {\n if (e) {\n if (!e.filename) {\n e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename;\n }\n this.error = e;\n }\n\n const importVisitor = this,\n inlineCSS = importNode.options.inline,\n isPlugin = importNode.options.isPlugin,\n isOptional = importNode.options.optional,\n duplicateImport = importedAtRoot || fullPath in importVisitor.recursionDetector;\n\n if (!context.importMultiple) {\n if (duplicateImport) {\n importNode.skip = true;\n } else {\n importNode.skip = function() {\n if (fullPath in importVisitor.onceFileDetectionMap) {\n return true;\n }\n importVisitor.onceFileDetectionMap[fullPath] = true;\n return false;\n };\n }\n }\n\n if (!fullPath && isOptional) {\n importNode.skip = true;\n }\n\n if (root) {\n importNode.root = root;\n importNode.importedFilename = fullPath;\n\n if (!inlineCSS && !isPlugin && (context.importMultiple || !duplicateImport)) {\n importVisitor.recursionDetector[fullPath] = true;\n\n const oldContext = this.context;\n this.context = context;\n try {\n this._visitor.visit(root);\n } catch (e) {\n this.error = e;\n }\n this.context = oldContext;\n }\n }\n\n importVisitor.importCount--;\n\n if (importVisitor.isFinished) {\n importVisitor._sequencer.tryRun();\n }\n },\n visitDeclaration: function (declNode, visitArgs) {\n if (declNode.value.type === 'DetachedRuleset') {\n this.context.frames.unshift(declNode);\n } else {\n visitArgs.visitDeeper = false;\n }\n },\n visitDeclarationOut: function(declNode) {\n if (declNode.value.type === 'DetachedRuleset') {\n this.context.frames.shift();\n }\n },\n visitAtRule: function (atRuleNode, visitArgs) {\n this.context.frames.unshift(atRuleNode);\n },\n visitAtRuleOut: function (atRuleNode) {\n this.context.frames.shift();\n },\n visitMixinDefinition: function (mixinDefinitionNode, visitArgs) {\n this.context.frames.unshift(mixinDefinitionNode);\n },\n visitMixinDefinitionOut: function (mixinDefinitionNode) {\n this.context.frames.shift();\n },\n visitRuleset: function (rulesetNode, visitArgs) {\n this.context.frames.unshift(rulesetNode);\n },\n visitRulesetOut: function (rulesetNode) {\n this.context.frames.shift();\n },\n visitMedia: function (mediaNode, visitArgs) {\n this.context.frames.unshift(mediaNode.rules[0]);\n },\n visitMediaOut: function (mediaNode) {\n this.context.frames.shift();\n }\n};\nexport default ImportVisitor;\n","class SetTreeVisibilityVisitor {\n constructor(visible) {\n this.visible = visible;\n }\n\n run(root) {\n this.visit(root);\n }\n\n visitArray(nodes) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.length;\n let i;\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n visit(node) {\n if (!node) {\n return node;\n }\n if (node.constructor === Array) {\n return this.visitArray(node);\n }\n\n if (!node.blocksVisibility || node.blocksVisibility()) {\n return node;\n }\n if (this.visible) {\n node.ensureVisibility();\n } else {\n node.ensureInvisibility();\n }\n\n node.accept(this);\n return node;\n }\n}\n\nexport default SetTreeVisibilityVisitor;","import tree from '../tree';\nimport Visitor from './visitor';\nimport logger from '../logger';\nimport * as utils from '../utils';\n\n/* jshint loopfunc:true */\n\nclass ExtendFinderVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n this.contexts = [];\n this.allExtendsStack = [[]];\n }\n\n run(root) {\n root = this._visitor.visit(root);\n root.allExtends = this.allExtendsStack[0];\n return root;\n }\n\n visitDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n\n let i;\n let j;\n let extend;\n const allSelectorsExtendList = [];\n let extendList;\n\n // get &:extend(.a); rules which apply to all selectors in this ruleset\n const rules = rulesetNode.rules, ruleCnt = rules ? rules.length : 0;\n for (i = 0; i < ruleCnt; i++) {\n if (rulesetNode.rules[i] instanceof tree.Extend) {\n allSelectorsExtendList.push(rules[i]);\n rulesetNode.extendOnEveryPath = true;\n }\n }\n\n // now find every selector and apply the extends that apply to all extends\n // and the ones which apply to an individual extend\n const paths = rulesetNode.paths;\n for (i = 0; i < paths.length; i++) {\n const selectorPath = paths[i], selector = selectorPath[selectorPath.length - 1], selExtendList = selector.extendList;\n\n extendList = selExtendList ? utils.copyArray(selExtendList).concat(allSelectorsExtendList)\n : allSelectorsExtendList;\n\n if (extendList) {\n extendList = extendList.map(function(allSelectorsExtend) {\n return allSelectorsExtend.clone();\n });\n }\n\n for (j = 0; j < extendList.length; j++) {\n this.foundExtends = true;\n extend = extendList[j];\n extend.findSelfSelectors(selectorPath);\n extend.ruleset = rulesetNode;\n if (j === 0) { extend.firstExtendOnThisSelectorPath = true; }\n this.allExtendsStack[this.allExtendsStack.length - 1].push(extend);\n }\n }\n\n this.contexts.push(rulesetNode.selectors);\n }\n\n visitRulesetOut(rulesetNode) {\n if (!rulesetNode.root) {\n this.contexts.length = this.contexts.length - 1;\n }\n }\n\n visitMedia(mediaNode, visitArgs) {\n mediaNode.allExtends = [];\n this.allExtendsStack.push(mediaNode.allExtends);\n }\n\n visitMediaOut(mediaNode) {\n this.allExtendsStack.length = this.allExtendsStack.length - 1;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n atRuleNode.allExtends = [];\n this.allExtendsStack.push(atRuleNode.allExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n this.allExtendsStack.length = this.allExtendsStack.length - 1;\n }\n}\n\nclass ProcessExtendsVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n }\n\n run(root) {\n const extendFinder = new ExtendFinderVisitor();\n this.extendIndices = {};\n extendFinder.run(root);\n if (!extendFinder.foundExtends) { return root; }\n root.allExtends = root.allExtends.concat(this.doExtendChaining(root.allExtends, root.allExtends));\n this.allExtendsStack = [root.allExtends];\n const newRoot = this._visitor.visit(root);\n this.checkExtendsForNonMatched(root.allExtends);\n return newRoot;\n }\n\n checkExtendsForNonMatched(extendList) {\n const indices = this.extendIndices;\n extendList.filter(function(extend) {\n return !extend.hasFoundMatches && extend.parent_ids.length == 1;\n }).forEach(function(extend) {\n let selector = '_unknown_';\n try {\n selector = extend.selector.toCSS({});\n }\n catch (_) {}\n\n if (!indices[`${extend.index} ${selector}`]) {\n indices[`${extend.index} ${selector}`] = true;\n logger.warn(`extend '${selector}' has no matches`);\n }\n });\n }\n\n doExtendChaining(extendsList, extendsListTarget, iterationCount) {\n //\n // chaining is different from normal extension.. if we extend an extend then we are not just copying, altering\n // and pasting the selector we would do normally, but we are also adding an extend with the same target selector\n // this means this new extend can then go and alter other extends\n //\n // this method deals with all the chaining work - without it, extend is flat and doesn't work on other extend selectors\n // this is also the most expensive.. and a match on one selector can cause an extension of a selector we had already\n // processed if we look at each selector at a time, as is done in visitRuleset\n\n let extendIndex;\n\n let targetExtendIndex;\n let matches;\n const extendsToAdd = [];\n let newSelector;\n const extendVisitor = this;\n let selectorPath;\n let extend;\n let targetExtend;\n let newExtend;\n\n iterationCount = iterationCount || 0;\n\n // loop through comparing every extend with every target extend.\n // a target extend is the one on the ruleset we are looking at copy/edit/pasting in place\n // e.g. .a:extend(.b) {} and .b:extend(.c) {} then the first extend extends the second one\n // and the second is the target.\n // the separation into two lists allows us to process a subset of chains with a bigger set, as is the\n // case when processing media queries\n for (extendIndex = 0; extendIndex < extendsList.length; extendIndex++) {\n for (targetExtendIndex = 0; targetExtendIndex < extendsListTarget.length; targetExtendIndex++) {\n\n extend = extendsList[extendIndex];\n targetExtend = extendsListTarget[targetExtendIndex];\n\n // look for circular references\n if ( extend.parent_ids.indexOf( targetExtend.object_id ) >= 0 ) { continue; }\n\n // find a match in the target extends self selector (the bit before :extend)\n selectorPath = [targetExtend.selfSelectors[0]];\n matches = extendVisitor.findMatch(extend, selectorPath);\n\n if (matches.length) {\n extend.hasFoundMatches = true;\n\n // we found a match, so for each self selector..\n extend.selfSelectors.forEach(function(selfSelector) {\n const info = targetExtend.visibilityInfo();\n\n // process the extend as usual\n newSelector = extendVisitor.extendSelector(matches, selectorPath, selfSelector, extend.isVisible());\n\n // but now we create a new extend from it\n newExtend = new(tree.Extend)(targetExtend.selector, targetExtend.option, 0, targetExtend.fileInfo(), info);\n newExtend.selfSelectors = newSelector;\n\n // add the extend onto the list of extends for that selector\n newSelector[newSelector.length - 1].extendList = [newExtend];\n\n // record that we need to add it.\n extendsToAdd.push(newExtend);\n newExtend.ruleset = targetExtend.ruleset;\n\n // remember its parents for circular references\n newExtend.parent_ids = newExtend.parent_ids.concat(targetExtend.parent_ids, extend.parent_ids);\n\n // only process the selector once.. if we have :extend(.a,.b) then multiple\n // extends will look at the same selector path, so when extending\n // we know that any others will be duplicates in terms of what is added to the css\n if (targetExtend.firstExtendOnThisSelectorPath) {\n newExtend.firstExtendOnThisSelectorPath = true;\n targetExtend.ruleset.paths.push(newSelector);\n }\n });\n }\n }\n }\n\n if (extendsToAdd.length) {\n // try to detect circular references to stop a stack overflow.\n // may no longer be needed.\n this.extendChainCount++;\n if (iterationCount > 100) {\n let selectorOne = '{unable to calculate}';\n let selectorTwo = '{unable to calculate}';\n try {\n selectorOne = extendsToAdd[0].selfSelectors[0].toCSS();\n selectorTwo = extendsToAdd[0].selector.toCSS();\n }\n catch (e) {}\n throw { message: `extend circular reference detected. One of the circular extends is currently:${selectorOne}:extend(${selectorTwo})`};\n }\n\n // now process the new extends on the existing rules so that we can handle a extending b extending c extending\n // d extending e...\n return extendsToAdd.concat(extendVisitor.doExtendChaining(extendsToAdd, extendsListTarget, iterationCount + 1));\n } else {\n return extendsToAdd;\n }\n }\n\n visitDeclaration(ruleNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitSelector(selectorNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n let matches;\n let pathIndex;\n let extendIndex;\n const allExtends = this.allExtendsStack[this.allExtendsStack.length - 1];\n const selectorsToAdd = [];\n const extendVisitor = this;\n let selectorPath;\n\n // look at each selector path in the ruleset, find any extend matches and then copy, find and replace\n\n for (extendIndex = 0; extendIndex < allExtends.length; extendIndex++) {\n for (pathIndex = 0; pathIndex < rulesetNode.paths.length; pathIndex++) {\n selectorPath = rulesetNode.paths[pathIndex];\n\n // extending extends happens initially, before the main pass\n if (rulesetNode.extendOnEveryPath) { continue; }\n const extendList = selectorPath[selectorPath.length - 1].extendList;\n if (extendList && extendList.length) { continue; }\n\n matches = this.findMatch(allExtends[extendIndex], selectorPath);\n\n if (matches.length) {\n allExtends[extendIndex].hasFoundMatches = true;\n\n allExtends[extendIndex].selfSelectors.forEach(function(selfSelector) {\n let extendedSelectors;\n extendedSelectors = extendVisitor.extendSelector(matches, selectorPath, selfSelector, allExtends[extendIndex].isVisible());\n selectorsToAdd.push(extendedSelectors);\n });\n }\n }\n }\n rulesetNode.paths = rulesetNode.paths.concat(selectorsToAdd);\n }\n\n findMatch(extend, haystackSelectorPath) {\n //\n // look through the haystack selector path to try and find the needle - extend.selector\n // returns an array of selector matches that can then be replaced\n //\n let haystackSelectorIndex;\n\n let hackstackSelector;\n let hackstackElementIndex;\n let haystackElement;\n let targetCombinator;\n let i;\n const extendVisitor = this;\n const needleElements = extend.selector.elements;\n const potentialMatches = [];\n let potentialMatch;\n const matches = [];\n\n // loop through the haystack elements\n for (haystackSelectorIndex = 0; haystackSelectorIndex < haystackSelectorPath.length; haystackSelectorIndex++) {\n hackstackSelector = haystackSelectorPath[haystackSelectorIndex];\n\n for (hackstackElementIndex = 0; hackstackElementIndex < hackstackSelector.elements.length; hackstackElementIndex++) {\n\n haystackElement = hackstackSelector.elements[hackstackElementIndex];\n\n // if we allow elements before our match we can add a potential match every time. otherwise only at the first element.\n if (extend.allowBefore || (haystackSelectorIndex === 0 && hackstackElementIndex === 0)) {\n potentialMatches.push({pathIndex: haystackSelectorIndex, index: hackstackElementIndex, matched: 0,\n initialCombinator: haystackElement.combinator});\n }\n\n for (i = 0; i < potentialMatches.length; i++) {\n potentialMatch = potentialMatches[i];\n\n // selectors add \" \" onto the first element. When we use & it joins the selectors together, but if we don't\n // then each selector in haystackSelectorPath has a space before it added in the toCSS phase. so we need to\n // work out what the resulting combinator will be\n targetCombinator = haystackElement.combinator.value;\n if (targetCombinator === '' && hackstackElementIndex === 0) {\n targetCombinator = ' ';\n }\n\n // if we don't match, null our match to indicate failure\n if (!extendVisitor.isElementValuesEqual(needleElements[potentialMatch.matched].value, haystackElement.value) ||\n (potentialMatch.matched > 0 && needleElements[potentialMatch.matched].combinator.value !== targetCombinator)) {\n potentialMatch = null;\n } else {\n potentialMatch.matched++;\n }\n\n // if we are still valid and have finished, test whether we have elements after and whether these are allowed\n if (potentialMatch) {\n potentialMatch.finished = potentialMatch.matched === needleElements.length;\n if (potentialMatch.finished &&\n (!extend.allowAfter &&\n (hackstackElementIndex + 1 < hackstackSelector.elements.length || haystackSelectorIndex + 1 < haystackSelectorPath.length))) {\n potentialMatch = null;\n }\n }\n // if null we remove, if not, we are still valid, so either push as a valid match or continue\n if (potentialMatch) {\n if (potentialMatch.finished) {\n potentialMatch.length = needleElements.length;\n potentialMatch.endPathIndex = haystackSelectorIndex;\n potentialMatch.endPathElementIndex = hackstackElementIndex + 1; // index after end of match\n potentialMatches.length = 0; // we don't allow matches to overlap, so start matching again\n matches.push(potentialMatch);\n }\n } else {\n potentialMatches.splice(i, 1);\n i--;\n }\n }\n }\n }\n return matches;\n }\n\n isElementValuesEqual(elementValue1, elementValue2) {\n if (typeof elementValue1 === 'string' || typeof elementValue2 === 'string') {\n return elementValue1 === elementValue2;\n }\n if (elementValue1 instanceof tree.Attribute) {\n if (elementValue1.op !== elementValue2.op || elementValue1.key !== elementValue2.key) {\n return false;\n }\n if (!elementValue1.value || !elementValue2.value) {\n if (elementValue1.value || elementValue2.value) {\n return false;\n }\n return true;\n }\n elementValue1 = elementValue1.value.value || elementValue1.value;\n elementValue2 = elementValue2.value.value || elementValue2.value;\n return elementValue1 === elementValue2;\n }\n elementValue1 = elementValue1.value;\n elementValue2 = elementValue2.value;\n if (elementValue1 instanceof tree.Selector) {\n if (!(elementValue2 instanceof tree.Selector) || elementValue1.elements.length !== elementValue2.elements.length) {\n return false;\n }\n for (let i = 0; i < elementValue1.elements.length; i++) {\n if (elementValue1.elements[i].combinator.value !== elementValue2.elements[i].combinator.value) {\n if (i !== 0 || (elementValue1.elements[i].combinator.value || ' ') !== (elementValue2.elements[i].combinator.value || ' ')) {\n return false;\n }\n }\n if (!this.isElementValuesEqual(elementValue1.elements[i].value, elementValue2.elements[i].value)) {\n return false;\n }\n }\n return true;\n }\n return false;\n }\n\n extendSelector(matches, selectorPath, replacementSelector, isVisible) {\n\n // for a set of matches, replace each match with the replacement selector\n\n let currentSelectorPathIndex = 0, currentSelectorPathElementIndex = 0, path = [], matchIndex, selector, firstElement, match, newElements;\n\n for (matchIndex = 0; matchIndex < matches.length; matchIndex++) {\n match = matches[matchIndex];\n selector = selectorPath[match.pathIndex];\n firstElement = new tree.Element(\n match.initialCombinator,\n replacementSelector.elements[0].value,\n replacementSelector.elements[0].isVariable,\n replacementSelector.elements[0].getIndex(),\n replacementSelector.elements[0].fileInfo()\n );\n\n if (match.pathIndex > currentSelectorPathIndex && currentSelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n\n newElements = selector.elements\n .slice(currentSelectorPathElementIndex, match.index)\n .concat([firstElement])\n .concat(replacementSelector.elements.slice(1));\n\n if (currentSelectorPathIndex === match.pathIndex && matchIndex > 0) {\n path[path.length - 1].elements =\n path[path.length - 1].elements.concat(newElements);\n } else {\n path = path.concat(selectorPath.slice(currentSelectorPathIndex, match.pathIndex));\n\n path.push(new tree.Selector(\n newElements\n ));\n }\n currentSelectorPathIndex = match.endPathIndex;\n currentSelectorPathElementIndex = match.endPathElementIndex;\n if (currentSelectorPathElementIndex >= selectorPath[currentSelectorPathIndex].elements.length) {\n currentSelectorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n }\n\n if (currentSelectorPathIndex < selectorPath.length && currentSelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathIndex++;\n }\n\n path = path.concat(selectorPath.slice(currentSelectorPathIndex, selectorPath.length));\n path = path.map(function (currentValue) {\n // we can re-use elements here, because the visibility property matters only for selectors\n const derived = currentValue.createDerived(currentValue.elements);\n if (isVisible) {\n derived.ensureVisibility();\n } else {\n derived.ensureInvisibility();\n }\n return derived;\n });\n return path;\n }\n\n visitMedia(mediaNode, visitArgs) {\n let newAllExtends = mediaNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, mediaNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitMediaOut(mediaNode) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStack.length = lastIndex;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n let newAllExtends = atRuleNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, atRuleNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStack.length = lastIndex;\n }\n}\n\nexport default ProcessExtendsVisitor;\n","import Visitor from './visitor';\n\nclass JoinSelectorVisitor {\n constructor() {\n this.contexts = [[]];\n this._visitor = new Visitor(this);\n }\n\n run(root) {\n return this._visitor.visit(root);\n }\n\n visitDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n const paths = [];\n let selectors;\n\n this.contexts.push(paths);\n\n if (!rulesetNode.root) {\n selectors = rulesetNode.selectors;\n if (selectors) {\n selectors = selectors.filter(function(selector) { return selector.getIsOutput(); });\n rulesetNode.selectors = selectors.length ? selectors : (selectors = null);\n if (selectors) { rulesetNode.joinSelectors(paths, context, selectors); }\n }\n if (!selectors) { rulesetNode.rules = null; }\n rulesetNode.paths = paths;\n }\n }\n\n visitRulesetOut(rulesetNode) {\n this.contexts.length = this.contexts.length - 1;\n }\n\n visitMedia(mediaNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n mediaNode.rules[0].root = (context.length === 0 || context[0].multiMedia);\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n if (atRuleNode.rules && atRuleNode.rules.length) {\n atRuleNode.rules[0].root = (atRuleNode.isRooted || context.length === 0 || null);\n }\n }\n}\n\nexport default JoinSelectorVisitor;\n","import tree from '../tree';\nimport Visitor from './visitor';\n\nclass CSSVisitorUtils {\n constructor(context) {\n this._visitor = new Visitor(this);\n this._context = context;\n }\n\n containsSilentNonBlockedChild(bodyRules) {\n let rule;\n if (!bodyRules) {\n return false;\n }\n for (let r = 0; r < bodyRules.length; r++) {\n rule = bodyRules[r];\n if (rule.isSilent && rule.isSilent(this._context) && !rule.blocksVisibility()) {\n // the atrule contains something that was referenced (likely by extend)\n // therefore it needs to be shown in output too\n return true;\n }\n }\n return false;\n }\n\n keepOnlyVisibleChilds(owner) {\n if (owner && owner.rules) {\n owner.rules = owner.rules.filter(thing => thing.isVisible());\n }\n }\n\n isEmpty(owner) {\n return (owner && owner.rules) \n ? (owner.rules.length === 0) : true;\n }\n\n hasVisibleSelector(rulesetNode) {\n return (rulesetNode && rulesetNode.paths)\n ? (rulesetNode.paths.length > 0) : false;\n }\n\n resolveVisibility(node, originalRules) {\n if (!node.blocksVisibility()) {\n if (this.isEmpty(node) && !this.containsSilentNonBlockedChild(originalRules)) {\n return ;\n }\n\n return node;\n }\n\n const compiledRulesBody = node.rules[0];\n this.keepOnlyVisibleChilds(compiledRulesBody);\n\n if (this.isEmpty(compiledRulesBody)) {\n return ;\n }\n\n node.ensureVisibility();\n node.removeVisibilityBlock();\n\n return node;\n }\n\n isVisibleRuleset(rulesetNode) {\n if (rulesetNode.firstRoot) {\n return true;\n }\n\n if (this.isEmpty(rulesetNode)) {\n return false;\n }\n\n if (!rulesetNode.root && !this.hasVisibleSelector(rulesetNode)) {\n return false;\n }\n\n return true;\n }\n}\n\nconst ToCSSVisitor = function(context) {\n this._visitor = new Visitor(this);\n this._context = context;\n this.utils = new CSSVisitorUtils(context);\n};\n\nToCSSVisitor.prototype = {\n isReplacing: true,\n run: function (root) {\n return this._visitor.visit(root);\n },\n\n visitDeclaration: function (declNode, visitArgs) {\n if (declNode.blocksVisibility() || declNode.variable) {\n return;\n }\n return declNode;\n },\n\n visitMixinDefinition: function (mixinNode, visitArgs) {\n // mixin definitions do not get eval'd - this means they keep state\n // so we have to clear that state here so it isn't used if toCSS is called twice\n mixinNode.frames = [];\n },\n\n visitExtend: function (extendNode, visitArgs) {\n },\n\n visitComment: function (commentNode, visitArgs) {\n if (commentNode.blocksVisibility() || commentNode.isSilent(this._context)) {\n return;\n }\n return commentNode;\n },\n\n visitMedia: function(mediaNode, visitArgs) {\n const originalRules = mediaNode.rules[0].rules;\n mediaNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n\n return this.utils.resolveVisibility(mediaNode, originalRules);\n },\n\n visitImport: function (importNode, visitArgs) {\n if (importNode.blocksVisibility()) {\n return ;\n }\n return importNode;\n },\n\n visitAtRule: function(atRuleNode, visitArgs) {\n if (atRuleNode.rules && atRuleNode.rules.length) {\n return this.visitAtRuleWithBody(atRuleNode, visitArgs);\n } else {\n return this.visitAtRuleWithoutBody(atRuleNode, visitArgs);\n }\n },\n\n visitAnonymous: function(anonymousNode, visitArgs) {\n if (!anonymousNode.blocksVisibility()) {\n anonymousNode.accept(this._visitor);\n return anonymousNode;\n }\n },\n\n visitAtRuleWithBody: function(atRuleNode, visitArgs) {\n // if there is only one nested ruleset and that one has no path, then it is\n // just fake ruleset\n function hasFakeRuleset(atRuleNode) {\n const bodyRules = atRuleNode.rules;\n return bodyRules.length === 1 && (!bodyRules[0].paths || bodyRules[0].paths.length === 0);\n }\n function getBodyRules(atRuleNode) {\n const nodeRules = atRuleNode.rules;\n if (hasFakeRuleset(atRuleNode)) {\n return nodeRules[0].rules;\n }\n\n return nodeRules;\n }\n // it is still true that it is only one ruleset in array\n // this is last such moment\n // process childs\n const originalRules = getBodyRules(atRuleNode);\n atRuleNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n\n if (!this.utils.isEmpty(atRuleNode)) {\n this._mergeRules(atRuleNode.rules[0].rules);\n }\n\n return this.utils.resolveVisibility(atRuleNode, originalRules);\n },\n\n visitAtRuleWithoutBody: function(atRuleNode, visitArgs) {\n if (atRuleNode.blocksVisibility()) {\n return;\n }\n\n if (atRuleNode.name === '@charset') {\n // Only output the debug info together with subsequent @charset definitions\n // a comment (or @media statement) before the actual @charset atrule would\n // be considered illegal css as it has to be on the first line\n if (this.charset) {\n if (atRuleNode.debugInfo) {\n const comment = new tree.Comment(`/* ${atRuleNode.toCSS(this._context).replace(/\\n/g, '')} */\\n`);\n comment.debugInfo = atRuleNode.debugInfo;\n return this._visitor.visit(comment);\n }\n return;\n }\n this.charset = true;\n }\n\n return atRuleNode;\n },\n\n checkValidNodes: function(rules, isRoot) {\n if (!rules) {\n return;\n }\n\n for (let i = 0; i < rules.length; i++) {\n const ruleNode = rules[i];\n if (isRoot && ruleNode instanceof tree.Declaration && !ruleNode.variable) {\n throw { message: 'Properties must be inside selector blocks. They cannot be in the root',\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n if (ruleNode instanceof tree.Call) {\n throw { message: `Function '${ruleNode.name}' did not return a root node`,\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n if (ruleNode.type && !ruleNode.allowRoot) {\n throw { message: `${ruleNode.type} node returned by a function is not valid here`,\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n }\n },\n\n visitRuleset: function (rulesetNode, visitArgs) {\n // at this point rulesets are nested into each other\n let rule;\n\n const rulesets = [];\n\n this.checkValidNodes(rulesetNode.rules, rulesetNode.firstRoot);\n\n if (!rulesetNode.root) {\n // remove invisible paths\n this._compileRulesetPaths(rulesetNode);\n\n // remove rulesets from this ruleset body and compile them separately\n const nodeRules = rulesetNode.rules;\n\n let nodeRuleCnt = nodeRules ? nodeRules.length : 0;\n for (let i = 0; i < nodeRuleCnt; ) {\n rule = nodeRules[i];\n if (rule && rule.rules) {\n // visit because we are moving them out from being a child\n rulesets.push(this._visitor.visit(rule));\n nodeRules.splice(i, 1);\n nodeRuleCnt--;\n continue;\n }\n i++;\n }\n // accept the visitor to remove rules and refactor itself\n // then we can decide nogw whether we want it or not\n // compile body\n if (nodeRuleCnt > 0) {\n rulesetNode.accept(this._visitor);\n } else {\n rulesetNode.rules = null;\n }\n visitArgs.visitDeeper = false;\n } else { // if (! rulesetNode.root) {\n rulesetNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n }\n\n if (rulesetNode.rules) {\n this._mergeRules(rulesetNode.rules);\n this._removeDuplicateRules(rulesetNode.rules);\n }\n\n // now decide whether we keep the ruleset\n if (this.utils.isVisibleRuleset(rulesetNode)) {\n rulesetNode.ensureVisibility();\n rulesets.splice(0, 0, rulesetNode);\n }\n\n if (rulesets.length === 1) {\n return rulesets[0];\n }\n return rulesets;\n },\n\n _compileRulesetPaths: function(rulesetNode) {\n if (rulesetNode.paths) {\n rulesetNode.paths = rulesetNode.paths\n .filter(p => {\n let i;\n if (p[0].elements[0].combinator.value === ' ') {\n p[0].elements[0].combinator = new(tree.Combinator)('');\n }\n for (i = 0; i < p.length; i++) {\n if (p[i].isVisible() && p[i].getIsOutput()) {\n return true;\n }\n }\n return false;\n });\n }\n },\n\n _removeDuplicateRules: function(rules) {\n if (!rules) { return; }\n\n // remove duplicates\n const ruleCache = {};\n\n let ruleList;\n let rule;\n let i;\n\n for (i = rules.length - 1; i >= 0 ; i--) {\n rule = rules[i];\n if (rule instanceof tree.Declaration) {\n if (!ruleCache[rule.name]) {\n ruleCache[rule.name] = rule;\n } else {\n ruleList = ruleCache[rule.name];\n if (ruleList instanceof tree.Declaration) {\n ruleList = ruleCache[rule.name] = [ruleCache[rule.name].toCSS(this._context)];\n }\n const ruleCSS = rule.toCSS(this._context);\n if (ruleList.indexOf(ruleCSS) !== -1) {\n rules.splice(i, 1);\n } else {\n ruleList.push(ruleCSS);\n }\n }\n }\n }\n },\n\n _mergeRules: function(rules) {\n if (!rules) {\n return; \n }\n\n const groups = {};\n const groupsArr = [];\n\n for (let i = 0; i < rules.length; i++) {\n const rule = rules[i];\n if (rule.merge) {\n const key = rule.name;\n groups[key] ? rules.splice(i--, 1) : \n groupsArr.push(groups[key] = []);\n groups[key].push(rule);\n }\n }\n\n groupsArr.forEach(group => {\n if (group.length > 0) {\n const result = group[0];\n let space = [];\n const comma = [new tree.Expression(space)];\n group.forEach(rule => {\n if ((rule.merge === '+') && (space.length > 0)) {\n comma.push(new tree.Expression(space = []));\n }\n space.push(rule.value);\n result.important = result.important || rule.important;\n });\n result.value = new tree.Value(comma);\n }\n });\n }\n};\n\nexport default ToCSSVisitor;\n","import Visitor from './visitor';\nimport ImportVisitor from './import-visitor';\nimport MarkVisibleSelectorsVisitor from './set-tree-visibility-visitor';\nimport ExtendVisitor from './extend-visitor';\nimport JoinSelectorVisitor from './join-selector-visitor';\nimport ToCSSVisitor from './to-css-visitor';\n\nexport default {\n Visitor,\n ImportVisitor,\n MarkVisibleSelectorsVisitor,\n ExtendVisitor,\n JoinSelectorVisitor,\n ToCSSVisitor\n};\n","import chunker from './chunker';\n\nexport default () => {\n let // Less input string\n input;\n\n let // current chunk\n j;\n\n const // holds state for backtracking\n saveStack = [];\n\n let // furthest index the parser has gone to\n furthest;\n\n let // if this is furthest we got to, this is the probably cause\n furthestPossibleErrorMessage;\n\n let // chunkified input\n chunks;\n\n let // current chunk\n current;\n\n let // index of current chunk, in `input`\n currentPos;\n\n const parserInput = {};\n const CHARCODE_SPACE = 32;\n const CHARCODE_TAB = 9;\n const CHARCODE_LF = 10;\n const CHARCODE_CR = 13;\n const CHARCODE_PLUS = 43;\n const CHARCODE_COMMA = 44;\n const CHARCODE_FORWARD_SLASH = 47;\n const CHARCODE_9 = 57;\n\n function skipWhitespace(length) {\n const oldi = parserInput.i;\n const oldj = j;\n const curr = parserInput.i - currentPos;\n const endIndex = parserInput.i + current.length - curr;\n const mem = (parserInput.i += length);\n const inp = input;\n let c;\n let nextChar;\n let comment;\n\n for (; parserInput.i < endIndex; parserInput.i++) {\n c = inp.charCodeAt(parserInput.i);\n\n if (parserInput.autoCommentAbsorb && c === CHARCODE_FORWARD_SLASH) {\n nextChar = inp.charAt(parserInput.i + 1);\n if (nextChar === '/') {\n comment = {index: parserInput.i, isLineComment: true};\n let nextNewLine = inp.indexOf('\\n', parserInput.i + 2);\n if (nextNewLine < 0) {\n nextNewLine = endIndex;\n }\n parserInput.i = nextNewLine;\n comment.text = inp.substr(comment.index, parserInput.i - comment.index);\n parserInput.commentStore.push(comment);\n continue;\n } else if (nextChar === '*') {\n const nextStarSlash = inp.indexOf('*/', parserInput.i + 2);\n if (nextStarSlash >= 0) {\n comment = {\n index: parserInput.i,\n text: inp.substr(parserInput.i, nextStarSlash + 2 - parserInput.i),\n isLineComment: false\n };\n parserInput.i += comment.text.length - 1;\n parserInput.commentStore.push(comment);\n continue;\n }\n }\n break;\n }\n\n if ((c !== CHARCODE_SPACE) && (c !== CHARCODE_LF) && (c !== CHARCODE_TAB) && (c !== CHARCODE_CR)) {\n break;\n }\n }\n\n current = current.slice(length + parserInput.i - mem + curr);\n currentPos = parserInput.i;\n\n if (!current.length) {\n if (j < chunks.length - 1) {\n current = chunks[++j];\n skipWhitespace(0); // skip space at the beginning of a chunk\n return true; // things changed\n }\n parserInput.finished = true;\n }\n\n return oldi !== parserInput.i || oldj !== j;\n }\n\n parserInput.save = () => {\n currentPos = parserInput.i;\n saveStack.push( { current, i: parserInput.i, j });\n };\n parserInput.restore = possibleErrorMessage => {\n\n if (parserInput.i > furthest || (parserInput.i === furthest && possibleErrorMessage && !furthestPossibleErrorMessage)) {\n furthest = parserInput.i;\n furthestPossibleErrorMessage = possibleErrorMessage;\n }\n const state = saveStack.pop();\n current = state.current;\n currentPos = parserInput.i = state.i;\n j = state.j;\n };\n parserInput.forget = () => {\n saveStack.pop();\n };\n parserInput.isWhitespace = offset => {\n const pos = parserInput.i + (offset || 0);\n const code = input.charCodeAt(pos);\n return (code === CHARCODE_SPACE || code === CHARCODE_CR || code === CHARCODE_TAB || code === CHARCODE_LF);\n };\n\n // Specialization of $(tok)\n parserInput.$re = tok => {\n if (parserInput.i > currentPos) {\n current = current.slice(parserInput.i - currentPos);\n currentPos = parserInput.i;\n }\n\n const m = tok.exec(current);\n if (!m) {\n return null;\n }\n\n skipWhitespace(m[0].length);\n if (typeof m === 'string') {\n return m;\n }\n\n return m.length === 1 ? m[0] : m;\n };\n\n parserInput.$char = tok => {\n if (input.charAt(parserInput.i) !== tok) {\n return null;\n }\n skipWhitespace(1);\n return tok;\n };\n\n parserInput.$str = tok => {\n const tokLength = tok.length;\n\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tokLength; i++) {\n if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n return null;\n }\n }\n\n skipWhitespace(tokLength);\n return tok;\n };\n\n parserInput.$quoted = loc => {\n const pos = loc || parserInput.i;\n const startChar = input.charAt(pos);\n\n if (startChar !== '\\'' && startChar !== '\"') {\n return;\n }\n const length = input.length;\n const currentPosition = pos;\n\n for (let i = 1; i + currentPosition < length; i++) {\n const nextChar = input.charAt(i + currentPosition);\n switch (nextChar) {\n case '\\\\':\n i++;\n continue;\n case '\\r':\n case '\\n':\n break;\n case startChar:\n const str = input.substr(currentPosition, i + 1);\n if (!loc && loc !== 0) {\n skipWhitespace(i + 1);\n return str\n }\n return [startChar, str];\n default:\n }\n }\n return null;\n };\n\n /**\n * Permissive parsing. Ignores everything except matching {} [] () and quotes\n * until matching token (outside of blocks)\n */\n parserInput.$parseUntil = tok => {\n let quote = '';\n let returnVal = null;\n let inComment = false;\n let blockDepth = 0;\n const blockStack = [];\n const parseGroups = [];\n const length = input.length;\n const startPos = parserInput.i;\n let lastPos = parserInput.i;\n let i = parserInput.i;\n let loop = true;\n let testChar;\n\n if (typeof tok === 'string') {\n testChar = char => char === tok\n } else {\n testChar = char => tok.test(char)\n }\n\n do {\n let prevChar;\n let nextChar = input.charAt(i);\n if (blockDepth === 0 && testChar(nextChar)) {\n returnVal = input.substr(lastPos, i - lastPos);\n if (returnVal) {\n parseGroups.push(returnVal);\n }\n else {\n parseGroups.push(' ');\n }\n returnVal = parseGroups;\n skipWhitespace(i - startPos);\n loop = false\n } else {\n if (inComment) {\n if (nextChar === '*' && \n input.charAt(i + 1) === '/') {\n i++;\n blockDepth--;\n inComment = false;\n }\n i++;\n continue;\n }\n switch (nextChar) {\n case '\\\\':\n i++;\n nextChar = input.charAt(i);\n parseGroups.push(input.substr(lastPos, i - lastPos + 1));\n lastPos = i + 1;\n break;\n case '/':\n if (input.charAt(i + 1) === '*') {\n i++;\n inComment = true;\n blockDepth++;\n }\n break;\n case '\\'':\n case '\"':\n quote = parserInput.$quoted(i);\n if (quote) {\n parseGroups.push(input.substr(lastPos, i - lastPos), quote);\n i += quote[1].length - 1;\n lastPos = i + 1;\n }\n else {\n skipWhitespace(i - startPos);\n returnVal = nextChar;\n loop = false;\n }\n break;\n case '{':\n blockStack.push('}');\n blockDepth++;\n break;\n case '(':\n blockStack.push(')');\n blockDepth++;\n break;\n case '[':\n blockStack.push(']');\n blockDepth++;\n break;\n case '}':\n case ')':\n case ']':\n const expected = blockStack.pop();\n if (nextChar === expected) {\n blockDepth--;\n } else {\n // move the parser to the error and return expected\n skipWhitespace(i - startPos);\n returnVal = expected;\n loop = false;\n }\n }\n i++;\n if (i > length) {\n loop = false;\n }\n }\n prevChar = nextChar;\n } while (loop);\n\n return returnVal ? returnVal : null;\n }\n\n parserInput.autoCommentAbsorb = true;\n parserInput.commentStore = [];\n parserInput.finished = false;\n\n // Same as $(), but don't change the state of the parser,\n // just return the match.\n parserInput.peek = tok => {\n if (typeof tok === 'string') {\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tok.length; i++) {\n if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n return false;\n }\n }\n return true;\n } else {\n return tok.test(current);\n }\n };\n\n // Specialization of peek()\n // TODO remove or change some currentChar calls to peekChar\n parserInput.peekChar = tok => input.charAt(parserInput.i) === tok;\n\n parserInput.currentChar = () => input.charAt(parserInput.i);\n\n parserInput.prevChar = () => input.charAt(parserInput.i - 1);\n\n parserInput.getInput = () => input;\n\n parserInput.peekNotNumeric = () => {\n const c = input.charCodeAt(parserInput.i);\n // Is the first char of the dimension 0-9, '.', '+' or '-'\n return (c > CHARCODE_9 || c < CHARCODE_PLUS) || c === CHARCODE_FORWARD_SLASH || c === CHARCODE_COMMA;\n };\n\n parserInput.start = (str, chunkInput, failFunction) => {\n input = str;\n parserInput.i = j = currentPos = furthest = 0;\n\n // chunking apparently makes things quicker (but my tests indicate\n // it might actually make things slower in node at least)\n // and it is a non-perfect parse - it can't recognise\n // unquoted urls, meaning it can't distinguish comments\n // meaning comments with quotes or {}() in them get 'counted'\n // and then lead to parse errors.\n // In addition if the chunking chunks in the wrong place we might\n // not be able to parse a parser statement in one go\n // this is officially deprecated but can be switched on via an option\n // in the case it causes too much performance issues.\n if (chunkInput) {\n chunks = chunker(str, failFunction);\n } else {\n chunks = [str];\n }\n\n current = chunks[0];\n\n skipWhitespace(0);\n };\n\n parserInput.end = () => {\n let message;\n const isFinished = parserInput.i >= input.length;\n\n if (parserInput.i < furthest) {\n message = furthestPossibleErrorMessage;\n parserInput.i = furthest;\n }\n return {\n isFinished,\n furthest: parserInput.i,\n furthestPossibleErrorMessage: message,\n furthestReachedEnd: parserInput.i >= input.length - 1,\n furthestChar: input[parserInput.i]\n };\n };\n\n return parserInput;\n};\n","// Split the input into chunks.\nexport default function (input, fail) {\n const len = input.length;\n let level = 0;\n let parenLevel = 0;\n let lastOpening;\n let lastOpeningParen;\n let lastMultiComment;\n let lastMultiCommentEndBrace;\n const chunks = [];\n let emitFrom = 0;\n let chunkerCurrentIndex;\n let currentChunkStartIndex;\n let cc;\n let cc2;\n let matched;\n\n function emitChunk(force) {\n const len = chunkerCurrentIndex - emitFrom;\n if (((len < 512) && !force) || !len) {\n return;\n }\n chunks.push(input.slice(emitFrom, chunkerCurrentIndex + 1));\n emitFrom = chunkerCurrentIndex + 1;\n }\n\n for (chunkerCurrentIndex = 0; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc = input.charCodeAt(chunkerCurrentIndex);\n if (((cc >= 97) && (cc <= 122)) || (cc < 34)) {\n // a-z or whitespace\n continue;\n }\n\n switch (cc) {\n case 40: // (\n parenLevel++;\n lastOpeningParen = chunkerCurrentIndex;\n continue;\n case 41: // )\n if (--parenLevel < 0) {\n return fail('missing opening `(`', chunkerCurrentIndex);\n }\n continue;\n case 59: // ;\n if (!parenLevel) { emitChunk(); }\n continue;\n case 123: // {\n level++;\n lastOpening = chunkerCurrentIndex;\n continue;\n case 125: // }\n if (--level < 0) {\n return fail('missing opening `{`', chunkerCurrentIndex);\n }\n if (!level && !parenLevel) { emitChunk(); }\n continue;\n case 92: // \\\n if (chunkerCurrentIndex < len - 1) { chunkerCurrentIndex++; continue; }\n return fail('unescaped `\\\\`', chunkerCurrentIndex);\n case 34:\n case 39:\n case 96: // \", ' and `\n matched = 0;\n currentChunkStartIndex = chunkerCurrentIndex;\n for (chunkerCurrentIndex = chunkerCurrentIndex + 1; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if (cc2 > 96) { continue; }\n if (cc2 == cc) { matched = 1; break; }\n if (cc2 == 92) { // \\\n if (chunkerCurrentIndex == len - 1) {\n return fail('unescaped `\\\\`', chunkerCurrentIndex);\n }\n chunkerCurrentIndex++;\n }\n }\n if (matched) { continue; }\n return fail(`unmatched \\`${String.fromCharCode(cc)}\\``, currentChunkStartIndex);\n case 47: // /, check for comment\n if (parenLevel || (chunkerCurrentIndex == len - 1)) { continue; }\n cc2 = input.charCodeAt(chunkerCurrentIndex + 1);\n if (cc2 == 47) {\n // //, find lnfeed\n for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if ((cc2 <= 13) && ((cc2 == 10) || (cc2 == 13))) { break; }\n }\n } else if (cc2 == 42) {\n // /*, find */\n lastMultiComment = currentChunkStartIndex = chunkerCurrentIndex;\n for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len - 1; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if (cc2 == 125) { lastMultiCommentEndBrace = chunkerCurrentIndex; }\n if (cc2 != 42) { continue; }\n if (input.charCodeAt(chunkerCurrentIndex + 1) == 47) { break; }\n }\n if (chunkerCurrentIndex == len - 1) {\n return fail('missing closing `*/`', currentChunkStartIndex);\n }\n chunkerCurrentIndex++;\n }\n continue;\n case 42: // *, check for unmatched */\n if ((chunkerCurrentIndex < len - 1) && (input.charCodeAt(chunkerCurrentIndex + 1) == 47)) {\n return fail('unmatched `/*`', chunkerCurrentIndex);\n }\n continue;\n }\n }\n\n if (level !== 0) {\n if ((lastMultiComment > lastOpening) && (lastMultiCommentEndBrace > lastMultiComment)) {\n return fail('missing closing `}` or `*/`', lastOpening);\n } else {\n return fail('missing closing `}`', lastOpening);\n }\n } else if (parenLevel !== 0) {\n return fail('missing closing `)`', lastOpeningParen);\n }\n\n emitChunk(true);\n return chunks;\n};\n","import LessError from '../less-error';\nimport tree from '../tree';\nimport visitors from '../visitors';\nimport getParserInput from './parser-input';\nimport * as utils from '../utils';\nimport functionRegistry from '../functions/function-registry';\n\n//\n// less.js - parser\n//\n// A relatively straight-forward predictive parser.\n// There is no tokenization/lexing stage, the input is parsed\n// in one sweep.\n//\n// To make the parser fast enough to run in the browser, several\n// optimization had to be made:\n//\n// - Matching and slicing on a huge input is often cause of slowdowns.\n// The solution is to chunkify the input into smaller strings.\n// The chunks are stored in the `chunks` var,\n// `j` holds the current chunk index, and `currentPos` holds\n// the index of the current chunk in relation to `input`.\n// This gives us an almost 4x speed-up.\n//\n// - In many cases, we don't need to match individual tokens;\n// for example, if a value doesn't hold any variables, operations\n// or dynamic references, the parser can effectively 'skip' it,\n// treating it as a literal.\n// An example would be '1px solid #000' - which evaluates to itself,\n// we don't need to know what the individual components are.\n// The drawback, of course is that you don't get the benefits of\n// syntax-checking on the CSS. This gives us a 50% speed-up in the parser,\n// and a smaller speed-up in the code-gen.\n//\n//\n// Token matching is done with the `$` function, which either takes\n// a terminal string or regexp, or a non-terminal function to call.\n// It also takes care of moving all the indices forwards.\n//\n\nconst Parser = function Parser(context, imports, fileInfo) {\n let parsers;\n const parserInput = getParserInput();\n\n function error(msg, type) {\n throw new LessError(\n {\n index: parserInput.i,\n filename: fileInfo.filename,\n type: type || 'Syntax',\n message: msg\n },\n imports\n );\n }\n\n function expect(arg, msg) {\n // some older browsers return typeof 'function' for RegExp\n const result = (arg instanceof Function) ? arg.call(parsers) : parserInput.$re(arg);\n if (result) {\n return result;\n }\n \n error(msg || (typeof arg === 'string'\n ? `expected '${arg}' got '${parserInput.currentChar()}'`\n : 'unexpected token'));\n }\n\n // Specialization of expect()\n function expectChar(arg, msg) {\n if (parserInput.$char(arg)) {\n return arg;\n }\n error(msg || `expected '${arg}' got '${parserInput.currentChar()}'`);\n }\n\n function getDebugInfo(index) {\n const filename = fileInfo.filename;\n\n return {\n lineNumber: utils.getLocation(index, parserInput.getInput()).line + 1,\n fileName: filename\n };\n }\n\n /**\n * Used after initial parsing to create nodes on the fly\n * \n * @param {String} str - string to parse \n * @param {Array} parseList - array of parsers to run input through e.g. [\"value\", \"important\"]\n * @param {Number} currentIndex - start number to begin indexing\n * @param {Object} fileInfo - fileInfo to attach to created nodes\n */\n function parseNode(str, parseList, currentIndex, fileInfo, callback) {\n let result;\n const returnNodes = [];\n const parser = parserInput;\n\n try {\n parser.start(str, false, function fail(msg, index) {\n callback({\n message: msg,\n index: index + currentIndex\n });\n });\n for (let x = 0, p, i; (p = parseList[x]); x++) {\n i = parser.i;\n result = parsers[p]();\n if (result) {\n try {\n result._index = i + currentIndex;\n result._fileInfo = fileInfo;\n } catch (e) {}\n returnNodes.push(result);\n }\n else {\n returnNodes.push(null);\n }\n }\n\n const endInfo = parser.end();\n if (endInfo.isFinished) {\n callback(null, returnNodes);\n }\n else {\n callback(true, null);\n }\n } catch (e) {\n throw new LessError({\n index: e.index + currentIndex,\n message: e.message\n }, imports, fileInfo.filename);\n }\n }\n\n //\n // The Parser\n //\n return {\n parserInput,\n imports,\n fileInfo,\n parseNode,\n //\n // Parse an input string into an abstract syntax tree,\n // @param str A string containing 'less' markup\n // @param callback call `callback` when done.\n // @param [additionalData] An optional map which can contains vars - a map (key, value) of variables to apply\n //\n parse: function (str, callback, additionalData) {\n let root;\n let error = null;\n let globalVars;\n let modifyVars;\n let ignored;\n let preText = '';\n\n globalVars = (additionalData && additionalData.globalVars) ? `${Parser.serializeVars(additionalData.globalVars)}\\n` : '';\n modifyVars = (additionalData && additionalData.modifyVars) ? `\\n${Parser.serializeVars(additionalData.modifyVars)}` : '';\n\n if (context.pluginManager) {\n const preProcessors = context.pluginManager.getPreProcessors();\n for (let i = 0; i < preProcessors.length; i++) {\n str = preProcessors[i].process(str, { context, imports, fileInfo });\n }\n }\n\n if (globalVars || (additionalData && additionalData.banner)) {\n preText = ((additionalData && additionalData.banner) ? additionalData.banner : '') + globalVars;\n ignored = imports.contentsIgnoredChars;\n ignored[fileInfo.filename] = ignored[fileInfo.filename] || 0;\n ignored[fileInfo.filename] += preText.length;\n }\n\n str = str.replace(/\\r\\n?/g, '\\n');\n // Remove potential UTF Byte Order Mark\n str = preText + str.replace(/^\\uFEFF/, '') + modifyVars;\n imports.contents[fileInfo.filename] = str;\n\n // Start with the primary rule.\n // The whole syntax tree is held under a Ruleset node,\n // with the `root` property set to true, so no `{}` are\n // output. The callback is called when the input is parsed.\n try {\n parserInput.start(str, context.chunkInput, function fail(msg, index) {\n throw new LessError({\n index,\n type: 'Parse',\n message: msg,\n filename: fileInfo.filename\n }, imports);\n });\n\n tree.Node.prototype.parse = this;\n root = new tree.Ruleset(null, this.parsers.primary());\n tree.Node.prototype.rootNode = root;\n root.root = true;\n root.firstRoot = true;\n root.functionRegistry = functionRegistry.inherit();\n \n } catch (e) {\n return callback(new LessError(e, imports, fileInfo.filename));\n }\n\n // If `i` is smaller than the `input.length - 1`,\n // it means the parser wasn't able to parse the whole\n // string, so we've got a parsing error.\n //\n // We try to extract a \\n delimited string,\n // showing the line where the parse error occurred.\n // We split it up into two parts (the part which parsed,\n // and the part which didn't), so we can color them differently.\n const endInfo = parserInput.end();\n if (!endInfo.isFinished) {\n\n let message = endInfo.furthestPossibleErrorMessage;\n\n if (!message) {\n message = 'Unrecognised input';\n if (endInfo.furthestChar === '}') {\n message += '. Possibly missing opening \\'{\\'';\n } else if (endInfo.furthestChar === ')') {\n message += '. Possibly missing opening \\'(\\'';\n } else if (endInfo.furthestReachedEnd) {\n message += '. Possibly missing something';\n }\n }\n\n error = new LessError({\n type: 'Parse',\n message,\n index: endInfo.furthest,\n filename: fileInfo.filename\n }, imports);\n }\n\n const finish = e => {\n e = error || e || imports.error;\n\n if (e) {\n if (!(e instanceof LessError)) {\n e = new LessError(e, imports, fileInfo.filename);\n }\n\n return callback(e);\n }\n else {\n return callback(null, root);\n }\n };\n\n if (context.processImports !== false) {\n new visitors.ImportVisitor(imports, finish)\n .run(root);\n } else {\n return finish();\n }\n },\n\n //\n // Here in, the parsing rules/functions\n //\n // The basic structure of the syntax tree generated is as follows:\n //\n // Ruleset -> Declaration -> Value -> Expression -> Entity\n //\n // Here's some Less code:\n //\n // .class {\n // color: #fff;\n // border: 1px solid #000;\n // width: @w + 4px;\n // > .child {...}\n // }\n //\n // And here's what the parse tree might look like:\n //\n // Ruleset (Selector '.class', [\n // Declaration (\"color\", Value ([Expression [Color #fff]]))\n // Declaration (\"border\", Value ([Expression [Dimension 1px][Keyword \"solid\"][Color #000]]))\n // Declaration (\"width\", Value ([Expression [Operation \" + \" [Variable \"@w\"][Dimension 4px]]]))\n // Ruleset (Selector [Element '>', '.child'], [...])\n // ])\n //\n // In general, most rules will try to parse a token with the `$re()` function, and if the return\n // value is truly, will return a new node, of the relevant type. Sometimes, we need to check\n // first, before parsing, that's when we use `peek()`.\n //\n parsers: parsers = {\n //\n // The `primary` rule is the *entry* and *exit* point of the parser.\n // The rules here can appear at any level of the parse tree.\n //\n // The recursive nature of the grammar is an interplay between the `block`\n // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule,\n // as represented by this simplified grammar:\n //\n // primary → (ruleset | declaration)+\n // ruleset → selector+ block\n // block → '{' primary '}'\n //\n // Only at one point is the primary rule not called from the\n // block rule: at the root level.\n //\n primary: function () {\n const mixin = this.mixin;\n let root = [];\n let node;\n\n while (true) {\n while (true) {\n node = this.comment();\n if (!node) { break; }\n root.push(node);\n }\n // always process comments before deciding if finished\n if (parserInput.finished) {\n break;\n }\n if (parserInput.peek('}')) {\n break;\n }\n\n node = this.extendRule();\n if (node) {\n root = root.concat(node);\n continue;\n }\n\n node = mixin.definition() || this.declaration() || mixin.call(false, false) || \n this.ruleset() || this.variableCall() || this.entities.call() || this.atrule();\n if (node) {\n root.push(node);\n } else {\n let foundSemiColon = false;\n while (parserInput.$char(';')) {\n foundSemiColon = true;\n }\n if (!foundSemiColon) {\n break;\n }\n }\n }\n\n return root;\n },\n\n // comments are collected by the main parsing mechanism and then assigned to nodes\n // where the current structure allows it\n comment: function () {\n if (parserInput.commentStore.length) {\n const comment = parserInput.commentStore.shift();\n return new(tree.Comment)(comment.text, comment.isLineComment, comment.index, fileInfo);\n }\n },\n\n //\n // Entities are tokens which can be found inside an Expression\n //\n entities: {\n mixinLookup: function() {\n return parsers.mixin.call(true, true);\n },\n //\n // A string, which supports escaping \" and '\n //\n // \"milky way\" 'he\\'s the one!'\n //\n quoted: function (forceEscaped) {\n let str;\n const index = parserInput.i;\n let isEscaped = false;\n\n parserInput.save();\n if (parserInput.$char('~')) {\n isEscaped = true;\n } else if (forceEscaped) {\n parserInput.restore();\n return;\n }\n\n str = parserInput.$quoted();\n if (!str) {\n parserInput.restore();\n return;\n }\n parserInput.forget();\n\n return new(tree.Quoted)(str.charAt(0), str.substr(1, str.length - 2), isEscaped, index, fileInfo);\n },\n\n //\n // A catch-all word, such as:\n //\n // black border-collapse\n //\n keyword: function () {\n const k = parserInput.$char('%') || parserInput.$re(/^\\[?(?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+\\]?/);\n if (k) {\n return tree.Color.fromKeyword(k) || new(tree.Keyword)(k);\n }\n },\n\n //\n // A function call\n //\n // rgb(255, 0, 255)\n //\n // The arguments are parsed with the `entities.arguments` parser.\n //\n call: function () {\n let name;\n let args;\n let func;\n const index = parserInput.i;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (parserInput.peek(/^url\\(/i)) {\n return;\n }\n\n parserInput.save();\n\n name = parserInput.$re(/^([\\w-]+|%|~|progid:[\\w\\.]+)\\(/);\n if (!name) {\n parserInput.forget(); \n return;\n }\n\n name = name[1];\n func = this.customFuncCall(name);\n if (func) {\n args = func.parse();\n if (args && func.stop) {\n parserInput.forget();\n return args;\n }\n }\n\n args = this.arguments(args);\n\n if (!parserInput.$char(')')) {\n parserInput.restore('Could not parse call arguments or missing \\')\\'');\n return;\n }\n\n parserInput.forget();\n\n return new(tree.Call)(name, args, index, fileInfo);\n },\n \n //\n // Parsing rules for functions with non-standard args, e.g.:\n //\n // boolean(not(2 > 1))\n //\n // This is a quick prototype, to be modified/improved when\n // more custom-parsed funcs come (e.g. `selector(...)`)\n //\n\n customFuncCall: function (name) {\n /* Ideally the table is to be moved out of here for faster perf.,\n but it's quite tricky since it relies on all these `parsers`\n and `expect` available only here */\n return {\n alpha: f(parsers.ieAlpha, true),\n boolean: f(condition),\n 'if': f(condition)\n }[name.toLowerCase()];\n\n function f(parse, stop) {\n return {\n parse, // parsing function\n stop // when true - stop after parse() and return its result, \n // otherwise continue for plain args\n };\n }\n \n function condition() {\n return [expect(parsers.condition, 'expected condition')];\n }\n },\n\n arguments: function (prevArgs) {\n let argsComma = prevArgs || [];\n const argsSemiColon = [];\n let isSemiColonSeparated;\n let value;\n\n parserInput.save();\n\n while (true) {\n if (prevArgs) {\n prevArgs = false;\n } else {\n value = parsers.detachedRuleset() || this.assignment() || parsers.expression();\n if (!value) {\n break;\n }\n\n if (value.value && value.value.length == 1) {\n value = value.value[0];\n }\n\n argsComma.push(value);\n }\n\n if (parserInput.$char(',')) {\n continue;\n }\n\n if (parserInput.$char(';') || isSemiColonSeparated) {\n isSemiColonSeparated = true;\n value = (argsComma.length < 1) ? argsComma[0]\n : new tree.Value(argsComma);\n argsSemiColon.push(value);\n argsComma = [];\n }\n }\n\n parserInput.forget();\n return isSemiColonSeparated ? argsSemiColon : argsComma;\n },\n literal: function () {\n return this.dimension() ||\n this.color() ||\n this.quoted() ||\n this.unicodeDescriptor();\n },\n\n // Assignments are argument entities for calls.\n // They are present in ie filter properties as shown below.\n //\n // filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* )\n //\n\n assignment: function () {\n let key;\n let value;\n parserInput.save();\n key = parserInput.$re(/^\\w+(?=\\s?=)/i);\n if (!key) {\n parserInput.restore();\n return;\n }\n if (!parserInput.$char('=')) {\n parserInput.restore();\n return;\n }\n value = parsers.entity();\n if (value) {\n parserInput.forget();\n return new(tree.Assignment)(key, value);\n } else {\n parserInput.restore();\n }\n },\n\n //\n // Parse url() tokens\n //\n // We use a specific rule for urls, because they don't really behave like\n // standard function calls. The difference is that the argument doesn't have\n // to be enclosed within a string, so it can't be parsed as an Expression.\n //\n url: function () {\n let value;\n const index = parserInput.i;\n\n parserInput.autoCommentAbsorb = false;\n\n if (!parserInput.$str('url(')) {\n parserInput.autoCommentAbsorb = true;\n return;\n }\n\n value = this.quoted() || this.variable() || this.property() ||\n parserInput.$re(/^(?:(?:\\\\[\\(\\)'\"])|[^\\(\\)'\"])+/) || '';\n\n parserInput.autoCommentAbsorb = true;\n\n expectChar(')');\n\n return new(tree.URL)((value.value != null || \n value instanceof tree.Variable || \n value instanceof tree.Property) ?\n value : new(tree.Anonymous)(value, index), index, fileInfo);\n },\n\n //\n // A Variable entity, such as `@fink`, in\n //\n // width: @fink + 2px\n //\n // We use a different parser for variable definitions,\n // see `parsers.variable`.\n //\n variable: function () {\n let ch;\n let name;\n const index = parserInput.i;\n\n parserInput.save();\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^@@?[\\w-]+/))) {\n ch = parserInput.currentChar();\n if (ch === '(' || ch === '[' && !parserInput.prevChar().match(/^\\s/)) {\n // this may be a VariableCall lookup\n const result = parsers.variableCall(name);\n if (result) {\n parserInput.forget();\n return result;\n }\n }\n parserInput.forget();\n return new(tree.Variable)(name, index, fileInfo);\n }\n parserInput.restore();\n },\n\n // A variable entity using the protective {} e.g. @{var}\n variableCurly: function () {\n let curly;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '@' && (curly = parserInput.$re(/^@\\{([\\w-]+)\\}/))) {\n return new(tree.Variable)(`@${curly[1]}`, index, fileInfo);\n }\n },\n //\n // A Property accessor, such as `$color`, in\n //\n // background-color: $color\n //\n property: function () {\n let name;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' && (name = parserInput.$re(/^\\$[\\w-]+/))) {\n return new(tree.Property)(name, index, fileInfo);\n }\n },\n\n // A property entity useing the protective {} e.g. ${prop}\n propertyCurly: function () {\n let curly;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' && (curly = parserInput.$re(/^\\$\\{([\\w-]+)\\}/))) {\n return new(tree.Property)(`$${curly[1]}`, index, fileInfo);\n }\n },\n //\n // A Hexadecimal color\n //\n // #4F3C2F\n //\n // `rgb` and `hsl` colors are parsed through the `entities.call` parser.\n //\n color: function () {\n let rgb;\n parserInput.save();\n\n if (parserInput.currentChar() === '#' && (rgb = parserInput.$re(/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})([\\w.#\\[])?/))) {\n if (!rgb[2]) {\n parserInput.forget();\n return new(tree.Color)(rgb[1], undefined, rgb[0]);\n } \n }\n parserInput.restore();\n },\n\n colorKeyword: function () {\n parserInput.save();\n const autoCommentAbsorb = parserInput.autoCommentAbsorb;\n parserInput.autoCommentAbsorb = false;\n const k = parserInput.$re(/^[_A-Za-z-][_A-Za-z0-9-]+/);\n parserInput.autoCommentAbsorb = autoCommentAbsorb;\n if (!k) {\n parserInput.forget();\n return;\n }\n parserInput.restore();\n const color = tree.Color.fromKeyword(k);\n if (color) {\n parserInput.$str(k);\n return color;\n }\n },\n\n //\n // A Dimension, that is, a number and a unit\n //\n // 0.5em 95%\n //\n dimension: function () {\n if (parserInput.peekNotNumeric()) {\n return;\n }\n\n const value = parserInput.$re(/^([+-]?\\d*\\.?\\d+)(%|[a-z_]+)?/i);\n if (value) {\n return new(tree.Dimension)(value[1], value[2]);\n }\n },\n\n //\n // A unicode descriptor, as is used in unicode-range\n //\n // U+0?? or U+00A1-00A9\n //\n unicodeDescriptor: function () {\n let ud;\n\n ud = parserInput.$re(/^U\\+[0-9a-fA-F?]+(\\-[0-9a-fA-F?]+)?/);\n if (ud) {\n return new(tree.UnicodeDescriptor)(ud[0]);\n }\n },\n\n //\n // JavaScript code to be evaluated\n //\n // `window.location.href`\n //\n javascript: function () {\n let js;\n const index = parserInput.i;\n\n parserInput.save();\n\n const escape = parserInput.$char('~');\n const jsQuote = parserInput.$char('`');\n\n if (!jsQuote) {\n parserInput.restore();\n return;\n }\n\n js = parserInput.$re(/^[^`]*`/);\n if (js) {\n parserInput.forget();\n return new(tree.JavaScript)(js.substr(0, js.length - 1), Boolean(escape), index, fileInfo);\n }\n parserInput.restore('invalid javascript definition');\n }\n },\n\n //\n // The variable part of a variable definition. Used in the `rule` parser\n //\n // @fink:\n //\n variable: function () {\n let name;\n\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^(@[\\w-]+)\\s*:/))) { return name[1]; }\n },\n\n //\n // Call a variable value to retrieve a detached ruleset\n // or a value from a detached ruleset's rules.\n //\n // @fink();\n // @fink;\n // color: @fink[@color];\n //\n variableCall: function (parsedName) {\n let lookups;\n const i = parserInput.i;\n const inValue = !!parsedName;\n let name = parsedName;\n\n parserInput.save();\n\n if (name || (parserInput.currentChar() === '@'\n && (name = parserInput.$re(/^(@[\\w-]+)(\\(\\s*\\))?/)))) {\n\n lookups = this.mixin.ruleLookups();\n\n if (!lookups && ((inValue && parserInput.$str('()') !== '()') || (name[2] !== '()'))) {\n parserInput.restore('Missing \\'[...]\\' lookup in variable call');\n return;\n }\n\n if (!inValue) {\n name = name[1];\n }\n\n const call = new tree.VariableCall(name, i, fileInfo);\n if (!inValue && parsers.end()) {\n parserInput.forget();\n return call;\n }\n else {\n parserInput.forget();\n return new tree.NamespaceValue(call, lookups, i, fileInfo);\n }\n }\n\n parserInput.restore();\n },\n\n //\n // extend syntax - used to extend selectors\n //\n extend: function(isRule) {\n let elements;\n let e;\n const index = parserInput.i;\n let option;\n let extendList;\n let extend;\n\n if (!parserInput.$str(isRule ? '&:extend(' : ':extend(')) {\n return;\n }\n\n do {\n option = null;\n elements = null;\n while (!(option = parserInput.$re(/^(all)(?=\\s*(\\)|,))/))) {\n e = this.element();\n if (!e) {\n break;\n }\n if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n }\n\n option = option && option[1];\n if (!elements) {\n error('Missing target selector for :extend().');\n }\n extend = new(tree.Extend)(new(tree.Selector)(elements), option, index, fileInfo);\n if (extendList) {\n extendList.push(extend);\n } else {\n extendList = [ extend ];\n }\n } while (parserInput.$char(','));\n\n expect(/^\\)/);\n\n if (isRule) {\n expect(/^;/);\n }\n\n return extendList;\n },\n\n //\n // extendRule - used in a rule to extend all the parent selectors\n //\n extendRule: function() {\n return this.extend(true);\n },\n\n //\n // Mixins\n //\n mixin: {\n //\n // A Mixin call, with an optional argument list\n //\n // #mixins > .square(#fff);\n // #mixins.square(#fff);\n // .rounded(4px, black);\n // .button;\n //\n // We can lookup / return a value using the lookup syntax:\n //\n // color: #mixin.square(#fff)[@color];\n //\n // The `while` loop is there because mixins can be\n // namespaced, but we only support the child and descendant\n // selector for now.\n //\n call: function (inValue, getLookup) {\n const s = parserInput.currentChar();\n let important = false;\n let lookups;\n const index = parserInput.i;\n let elements;\n let args;\n let hasParens;\n\n if (s !== '.' && s !== '#') { return; }\n\n parserInput.save(); // stop us absorbing part of an invalid selector\n\n elements = this.elements();\n\n if (elements) {\n if (parserInput.$char('(')) {\n args = this.args(true).args;\n expectChar(')');\n hasParens = true;\n }\n\n if (getLookup !== false) {\n lookups = this.ruleLookups();\n }\n if (getLookup === true && !lookups) {\n parserInput.restore();\n return;\n }\n\n if (!lookups && !hasParens) {\n // This isn't a valid mixin call\n parserInput.restore('Unrecognized input. Possibly missing \\'(\\' in mixin call.');\n return;\n }\n\n if (!inValue && parsers.important()) {\n important = true;\n }\n\n if (inValue || parsers.end()) {\n parserInput.forget();\n const mixin = new(tree.mixin.Call)(elements, args, index, fileInfo, !lookups && important);\n if (lookups) {\n return new tree.NamespaceValue(mixin, lookups);\n }\n else {\n return mixin;\n }\n }\n }\n\n parserInput.restore();\n },\n /**\n * Matching elements for mixins\n * (Start with . or # and can have > )\n */\n elements: function() {\n let elements;\n let e;\n let c;\n let elem;\n let elemIndex;\n const re = /^[#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/;\n while (true) {\n elemIndex = parserInput.i;\n e = parserInput.$re(re);\n \n if (!e) {\n break;\n }\n elem = new(tree.Element)(c, e, false, elemIndex, fileInfo);\n if (elements) {\n elements.push(elem);\n } else {\n elements = [ elem ];\n }\n c = parserInput.$char('>');\n }\n return elements;\n },\n args: function (isCall) {\n const entities = parsers.entities;\n const returner = { args:null, variadic: false };\n let expressions = [];\n const argsSemiColon = [];\n const argsComma = [];\n let isSemiColonSeparated;\n let expressionContainsNamed;\n let name;\n let nameLoop;\n let value;\n let arg;\n let expand;\n let hasSep = true;\n\n parserInput.save();\n\n while (true) {\n if (isCall) {\n arg = parsers.detachedRuleset() || parsers.expression();\n } else {\n parserInput.commentStore.length = 0;\n if (parserInput.$str('...')) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ variadic: true });\n break;\n }\n arg = entities.variable() || entities.property() || entities.literal() || entities.keyword() || this.call(true);\n }\n\n if (!arg || !hasSep) {\n break;\n }\n\n nameLoop = null;\n if (arg.throwAwayComments) {\n arg.throwAwayComments();\n }\n value = arg;\n let val = null;\n\n if (isCall) {\n // Variable\n if (arg.value && arg.value.length == 1) {\n val = arg.value[0];\n }\n } else {\n val = arg;\n }\n\n if (val && (val instanceof tree.Variable || val instanceof tree.Property)) {\n if (parserInput.$char(':')) {\n if (expressions.length > 0) {\n if (isSemiColonSeparated) {\n error('Cannot mix ; and , as delimiter types');\n }\n expressionContainsNamed = true;\n }\n\n value = parsers.detachedRuleset() || parsers.expression();\n\n if (!value) {\n if (isCall) {\n error('could not understand value for named argument');\n } else {\n parserInput.restore();\n returner.args = [];\n return returner;\n }\n }\n nameLoop = (name = val.name);\n } else if (parserInput.$str('...')) {\n if (!isCall) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ name: arg.name, variadic: true });\n break;\n } else {\n expand = true;\n }\n } else if (!isCall) {\n name = nameLoop = val.name;\n value = null;\n }\n }\n\n if (value) {\n expressions.push(value);\n }\n\n argsComma.push({ name:nameLoop, value, expand });\n\n if (parserInput.$char(',')) {\n hasSep = true;\n continue;\n }\n hasSep = parserInput.$char(';') === ';';\n\n if (hasSep || isSemiColonSeparated) {\n\n if (expressionContainsNamed) {\n error('Cannot mix ; and , as delimiter types');\n }\n\n isSemiColonSeparated = true;\n\n if (expressions.length > 1) {\n value = new(tree.Value)(expressions);\n }\n argsSemiColon.push({ name, value, expand });\n\n name = null;\n expressions = [];\n expressionContainsNamed = false;\n }\n }\n\n parserInput.forget();\n returner.args = isSemiColonSeparated ? argsSemiColon : argsComma;\n return returner;\n },\n //\n // A Mixin definition, with a list of parameters\n //\n // .rounded (@radius: 2px, @color) {\n // ...\n // }\n //\n // Until we have a finer grained state-machine, we have to\n // do a look-ahead, to make sure we don't have a mixin call.\n // See the `rule` function for more information.\n //\n // We start by matching `.rounded (`, and then proceed on to\n // the argument list, which has optional default values.\n // We store the parameters in `params`, with a `value` key,\n // if there is a value, such as in the case of `@radius`.\n //\n // Once we've got our params list, and a closing `)`, we parse\n // the `{...}` block.\n //\n definition: function () {\n let name;\n let params = [];\n let match;\n let ruleset;\n let cond;\n let variadic = false;\n if ((parserInput.currentChar() !== '.' && parserInput.currentChar() !== '#') ||\n parserInput.peek(/^[^{]*\\}/)) {\n return;\n }\n\n parserInput.save();\n\n match = parserInput.$re(/^([#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\\s*\\(/);\n if (match) {\n name = match[1];\n\n const argInfo = this.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n\n // .mixincall(\"@{a}\");\n // looks a bit like a mixin definition..\n // also\n // .mixincall(@a: {rule: set;});\n // so we have to be nice and restore\n if (!parserInput.$char(')')) {\n parserInput.restore('Missing closing \\')\\'');\n return;\n }\n\n parserInput.commentStore.length = 0;\n\n if (parserInput.$str('when')) { // Guard\n cond = expect(parsers.conditions, 'expected condition');\n }\n\n ruleset = parsers.block();\n\n if (ruleset) {\n parserInput.forget();\n return new(tree.mixin.Definition)(name, params, ruleset, cond, variadic);\n } else {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n }\n },\n \n ruleLookups: function() {\n let rule;\n let args;\n const lookups = [];\n\n if (parserInput.currentChar() !== '[') { \n return;\n }\n\n while (true) {\n parserInput.save();\n args = null;\n rule = this.lookupValue();\n if (!rule && rule !== '') {\n parserInput.restore();\n break;\n }\n lookups.push(rule);\n parserInput.forget();\n }\n if (lookups.length > 0) {\n return lookups;\n }\n },\n \n lookupValue: function() {\n parserInput.save();\n \n if (!parserInput.$char('[')) { \n parserInput.restore();\n return;\n }\n \n const name = parserInput.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);\n \n if (!parserInput.$char(']')) {\n parserInput.restore();\n return;\n } \n\n if (name || name === '') {\n parserInput.forget();\n return name;\n }\n \n parserInput.restore();\n }\n },\n //\n // Entities are the smallest recognized token,\n // and can be found inside a rule's value.\n //\n entity: function () {\n const entities = this.entities;\n\n return this.comment() || entities.literal() || entities.variable() || entities.url() ||\n entities.property() || entities.call() || entities.keyword() || this.mixin.call(true) ||\n entities.javascript();\n },\n\n //\n // A Declaration terminator. Note that we use `peek()` to check for '}',\n // because the `block` rule will be expecting it, but we still need to make sure\n // it's there, if ';' was omitted.\n //\n end: function () {\n return parserInput.$char(';') || parserInput.peek('}');\n },\n\n //\n // IE's alpha function\n //\n // alpha(opacity=88)\n //\n ieAlpha: function () {\n let value;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (!parserInput.$re(/^opacity=/i)) { return; }\n value = parserInput.$re(/^\\d+/);\n if (!value) {\n value = expect(parsers.entities.variable, 'Could not parse alpha');\n value = `@{${value.name.slice(1)}}`;\n }\n expectChar(')');\n return new tree.Quoted('', `alpha(opacity=${value})`);\n },\n\n //\n // A Selector Element\n //\n // div\n // + h1\n // #socks\n // input[type=\"text\"]\n //\n // Elements are the building blocks for Selectors,\n // they are made out of a `Combinator` (see combinator rule),\n // and an element name, such as a tag a class, or `*`.\n //\n element: function () {\n let e;\n let c;\n let v;\n const index = parserInput.i;\n\n c = this.combinator();\n\n e = parserInput.$re(/^(?:\\d+\\.\\d+|\\d+)%/) ||\n parserInput.$re(/^(?:[.#]?|:*)(?:[\\w-]|[^\\x00-\\x9f]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/) ||\n parserInput.$char('*') || parserInput.$char('&') || this.attribute() ||\n parserInput.$re(/^\\([^&()@]+\\)/) || parserInput.$re(/^[\\.#:](?=@)/) ||\n this.entities.variableCurly();\n\n if (!e) {\n parserInput.save();\n if (parserInput.$char('(')) {\n if ((v = this.selector(false)) && parserInput.$char(')')) {\n e = new(tree.Paren)(v);\n parserInput.forget();\n } else {\n parserInput.restore('Missing closing \\')\\'');\n }\n } else {\n parserInput.forget();\n }\n }\n\n if (e) { return new(tree.Element)(c, e, e instanceof tree.Variable, index, fileInfo); }\n },\n\n //\n // Combinators combine elements together, in a Selector.\n //\n // Because our parser isn't white-space sensitive, special care\n // has to be taken, when parsing the descendant combinator, ` `,\n // as it's an empty space. We have to check the previous character\n // in the input, to see if it's a ` ` character. More info on how\n // we deal with this in *combinator.js*.\n //\n combinator: function () {\n let c = parserInput.currentChar();\n\n if (c === '/') {\n parserInput.save();\n const slashedCombinator = parserInput.$re(/^\\/[a-z]+\\//i);\n if (slashedCombinator) {\n parserInput.forget();\n return new(tree.Combinator)(slashedCombinator);\n }\n parserInput.restore();\n }\n\n if (c === '>' || c === '+' || c === '~' || c === '|' || c === '^') {\n parserInput.i++;\n if (c === '^' && parserInput.currentChar() === '^') {\n c = '^^';\n parserInput.i++;\n }\n while (parserInput.isWhitespace()) { parserInput.i++; }\n return new(tree.Combinator)(c);\n } else if (parserInput.isWhitespace(-1)) {\n return new(tree.Combinator)(' ');\n } else {\n return new(tree.Combinator)(null);\n }\n },\n //\n // A CSS Selector\n // with less extensions e.g. the ability to extend and guard\n //\n // .class > div + h1\n // li a:hover\n //\n // Selectors are made out of one or more Elements, see above.\n //\n selector: function (isLess) {\n const index = parserInput.i;\n let elements;\n let extendList;\n let c;\n let e;\n let allExtends;\n let when;\n let condition;\n isLess = isLess !== false;\n while ((isLess && (extendList = this.extend())) || (isLess && (when = parserInput.$str('when'))) || (e = this.element())) {\n if (when) {\n condition = expect(this.conditions, 'expected condition');\n } else if (condition) {\n error('CSS guard can only be used at the end of selector');\n } else if (extendList) {\n if (allExtends) {\n allExtends = allExtends.concat(extendList);\n } else {\n allExtends = extendList;\n }\n } else {\n if (allExtends) { error('Extend can only be used at the end of selector'); }\n c = parserInput.currentChar();\n if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n e = null;\n }\n if (c === '{' || c === '}' || c === ';' || c === ',' || c === ')') {\n break;\n }\n }\n\n if (elements) { return new(tree.Selector)(elements, allExtends, condition, index, fileInfo); }\n if (allExtends) { error('Extend must be used to extend a selector, it cannot be used on its own'); }\n },\n selectors: function () {\n let s;\n let selectors;\n while (true) {\n s = this.selector();\n if (!s) {\n break;\n }\n if (selectors) {\n selectors.push(s);\n } else {\n selectors = [ s ];\n }\n parserInput.commentStore.length = 0;\n if (s.condition && selectors.length > 1) {\n error(\"Guards are only currently allowed on a single selector.\");\n }\n if (!parserInput.$char(',')) { break; }\n if (s.condition) {\n error(\"Guards are only currently allowed on a single selector.\");\n }\n parserInput.commentStore.length = 0;\n }\n return selectors;\n },\n attribute: function () {\n if (!parserInput.$char('[')) { return; }\n\n const entities = this.entities;\n let key;\n let val;\n let op;\n\n if (!(key = entities.variableCurly())) {\n key = expect(/^(?:[_A-Za-z0-9-\\*]*\\|)?(?:[_A-Za-z0-9-]|\\\\.)+/);\n }\n\n op = parserInput.$re(/^[|~*$^]?=/);\n if (op) {\n val = entities.quoted() || parserInput.$re(/^[0-9]+%/) || parserInput.$re(/^[\\w-]+/) || entities.variableCurly();\n }\n\n expectChar(']');\n\n return new(tree.Attribute)(key, op, val);\n },\n\n //\n // The `block` rule is used by `ruleset` and `mixin.definition`.\n // It's a wrapper around the `primary` rule, with added `{}`.\n //\n block: function () {\n let content;\n if (parserInput.$char('{') && (content = this.primary()) && parserInput.$char('}')) {\n return content;\n }\n },\n\n blockRuleset: function() {\n let block = this.block();\n\n if (block) {\n block = new tree.Ruleset(null, block);\n }\n return block;\n },\n\n detachedRuleset: function() {\n let argInfo;\n let params;\n let variadic;\n\n parserInput.save();\n if (parserInput.$re(/^[.#]\\(/)) {\n /**\n * DR args currently only implemented for each() function, and not \n * yet settable as `@dr: #(@arg) {}`\n * This should be done when DRs are merged with mixins.\n * See: https://github.com/less/less-meta/issues/16\n */\n argInfo = this.mixin.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n if (!parserInput.$char(')')) {\n parserInput.restore();\n return;\n }\n }\n const blockRuleset = this.blockRuleset();\n if (blockRuleset) {\n parserInput.forget();\n if (params) {\n return new tree.mixin.Definition(null, params, blockRuleset, null, variadic);\n }\n return new tree.DetachedRuleset(blockRuleset);\n }\n parserInput.restore();\n },\n\n //\n // div, .class, body > p {...}\n //\n ruleset: function () {\n let selectors;\n let rules;\n let debugInfo;\n\n parserInput.save();\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(parserInput.i);\n }\n\n selectors = this.selectors();\n\n if (selectors && (rules = this.block())) {\n parserInput.forget();\n const ruleset = new(tree.Ruleset)(selectors, rules, context.strictImports);\n if (context.dumpLineNumbers) {\n ruleset.debugInfo = debugInfo;\n }\n return ruleset;\n } else {\n parserInput.restore();\n }\n },\n declaration: function () {\n let name;\n let value;\n const index = parserInput.i;\n let hasDR;\n const c = parserInput.currentChar();\n let important;\n let merge;\n let isVariable;\n\n if (c === '.' || c === '#' || c === '&' || c === ':') { return; }\n\n parserInput.save();\n\n name = this.variable() || this.ruleProperty();\n if (name) {\n isVariable = typeof name === 'string';\n\n if (isVariable) {\n value = this.detachedRuleset();\n if (value) {\n hasDR = true;\n }\n }\n\n parserInput.commentStore.length = 0;\n if (!value) {\n // a name returned by this.ruleProperty() is always an array of the form:\n // [string-1, ..., string-n, \"\"] or [string-1, ..., string-n, \"+\"]\n // where each item is a tree.Keyword or tree.Variable\n merge = !isVariable && name.length > 1 && name.pop().value;\n\n // Custom property values get permissive parsing\n if (name[0].value && name[0].value.slice(0, 2) === '--') {\n value = this.permissiveValue();\n }\n // Try to store values as anonymous\n // If we need the value later we'll re-parse it in ruleset.parseValue\n else {\n value = this.anonymousValue();\n }\n if (value) {\n parserInput.forget();\n // anonymous values absorb the end ';' which is required for them to work\n return new(tree.Declaration)(name, value, false, merge, index, fileInfo);\n }\n\n if (!value) {\n value = this.value();\n }\n\n if (value) {\n important = this.important();\n } else if (isVariable) {\n // As a last resort, try permissiveValue\n value = this.permissiveValue();\n }\n }\n\n if (value && (this.end() || hasDR)) {\n parserInput.forget();\n return new(tree.Declaration)(name, value, important, merge, index, fileInfo);\n }\n else {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n }\n },\n anonymousValue: function () {\n const index = parserInput.i;\n const match = parserInput.$re(/^([^.#@\\$+\\/'\"*`(;{}-]*);/);\n if (match) {\n return new(tree.Anonymous)(match[1], index);\n }\n },\n /**\n * Used for custom properties, at-rules, and variables (as fallback)\n * Parses almost anything inside of {} [] () \"\" blocks\n * until it reaches outer-most tokens.\n * \n * First, it will try to parse comments and entities to reach\n * the end. This is mostly like the Expression parser except no\n * math is allowed.\n */\n permissiveValue: function (untilTokens) {\n let i;\n let e;\n let done;\n let value;\n const tok = untilTokens || ';';\n const index = parserInput.i;\n const result = [];\n\n function testCurrentChar() {\n const char = parserInput.currentChar();\n if (typeof tok === 'string') {\n return char === tok;\n } else {\n return tok.test(char);\n }\n }\n if (testCurrentChar()) {\n return;\n }\n value = [];\n do {\n e = this.comment();\n if (e) {\n value.push(e);\n continue;\n }\n e = this.entity();\n if (e) {\n value.push(e);\n }\n } while (e);\n\n done = testCurrentChar();\n\n if (value.length > 0) {\n value = new(tree.Expression)(value);\n if (done) {\n return value;\n }\n else {\n result.push(value);\n }\n // Preserve space before $parseUntil as it will not\n if (parserInput.prevChar() === ' ') {\n result.push(new tree.Anonymous(' ', index));\n }\n }\n parserInput.save();\n\n value = parserInput.$parseUntil(tok);\n\n if (value) {\n if (typeof value === 'string') {\n error(`Expected '${value}'`, 'Parse');\n }\n if (value.length === 1 && value[0] === ' ') {\n parserInput.forget();\n return new tree.Anonymous('', index);\n }\n let item;\n for (i = 0; i < value.length; i++) {\n item = value[i];\n if (Array.isArray(item)) {\n // Treat actual quotes as normal quoted values\n result.push(new tree.Quoted(item[0], item[1], true, index, fileInfo));\n }\n else {\n if (i === value.length - 1) {\n item = item.trim();\n }\n // Treat like quoted values, but replace vars like unquoted expressions\n const quote = new tree.Quoted('\\'', item, true, index, fileInfo);\n quote.variableRegex = /@([\\w-]+)/g;\n quote.propRegex = /\\$([\\w-]+)/g;\n result.push(quote);\n }\n }\n parserInput.forget();\n return new tree.Expression(result, true);\n }\n parserInput.restore();\n },\n\n //\n // An @import atrule\n //\n // @import \"lib\";\n //\n // Depending on our environment, importing is done differently:\n // In the browser, it's an XHR request, in Node, it would be a\n // file-system operation. The function used for importing is\n // stored in `import`, which we pass to the Import constructor.\n //\n 'import': function () {\n let path;\n let features;\n const index = parserInput.i;\n\n const dir = parserInput.$re(/^@import?\\s+/);\n\n if (dir) {\n const options = (dir ? this.importOptions() : null) || {};\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n features = this.mediaFeatures();\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon or unrecognised media features on import');\n }\n features = features && new(tree.Value)(features);\n return new(tree.Import)(path, features, options, index, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed import statement');\n }\n }\n },\n\n importOptions: function() {\n let o;\n const options = {};\n let optionName;\n let value;\n\n // list of options, surrounded by parens\n if (!parserInput.$char('(')) { return null; }\n do {\n o = this.importOption();\n if (o) {\n optionName = o;\n value = true;\n switch (optionName) {\n case 'css':\n optionName = 'less';\n value = false;\n break;\n case 'once':\n optionName = 'multiple';\n value = false;\n break;\n }\n options[optionName] = value;\n if (!parserInput.$char(',')) { break; }\n }\n } while (o);\n expectChar(')');\n return options;\n },\n\n importOption: function() {\n const opt = parserInput.$re(/^(less|css|multiple|once|inline|reference|optional)/);\n if (opt) {\n return opt[1];\n }\n },\n\n mediaFeature: function () {\n const entities = this.entities;\n const nodes = [];\n let e;\n let p;\n parserInput.save();\n do {\n e = entities.keyword() || entities.variable() || entities.mixinLookup();\n if (e) {\n nodes.push(e);\n } else if (parserInput.$char('(')) {\n p = this.property();\n e = this.value();\n if (parserInput.$char(')')) {\n if (p && e) {\n nodes.push(new(tree.Paren)(new(tree.Declaration)(p, e, null, null, parserInput.i, fileInfo, true)));\n } else if (e) {\n nodes.push(new(tree.Paren)(e));\n } else {\n error('badly formed media feature definition');\n }\n } else {\n error('Missing closing \\')\\'', 'Parse');\n }\n }\n } while (e);\n\n parserInput.forget();\n if (nodes.length > 0) {\n return new(tree.Expression)(nodes);\n }\n },\n\n mediaFeatures: function () {\n const entities = this.entities;\n const features = [];\n let e;\n do {\n e = this.mediaFeature();\n if (e) {\n features.push(e);\n if (!parserInput.$char(',')) { break; }\n } else {\n e = entities.variable() || entities.mixinLookup();\n if (e) {\n features.push(e);\n if (!parserInput.$char(',')) { break; }\n }\n }\n } while (e);\n\n return features.length > 0 ? features : null;\n },\n\n media: function () {\n let features;\n let rules;\n let media;\n let debugInfo;\n const index = parserInput.i;\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(index);\n }\n\n parserInput.save();\n\n if (parserInput.$str('@media')) {\n features = this.mediaFeatures();\n\n rules = this.block();\n\n if (!rules) {\n error('media definitions require block statements after any features');\n }\n\n parserInput.forget();\n\n media = new(tree.Media)(rules, features, index, fileInfo);\n if (context.dumpLineNumbers) {\n media.debugInfo = debugInfo;\n }\n\n return media;\n }\n\n parserInput.restore();\n },\n\n //\n\n // A @plugin directive, used to import plugins dynamically.\n //\n // @plugin (args) \"lib\";\n //\n plugin: function () {\n let path;\n let args;\n let options;\n const index = parserInput.i;\n const dir = parserInput.$re(/^@plugin?\\s+/);\n\n if (dir) {\n args = this.pluginArgs();\n\n if (args) {\n options = {\n pluginArgs: args,\n isPlugin: true\n };\n }\n else {\n options = { isPlugin: true };\n }\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon on @plugin');\n }\n return new(tree.Import)(path, null, options, index, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed @plugin statement');\n }\n }\n },\n\n pluginArgs: function() {\n // list of options, surrounded by parens\n parserInput.save();\n if (!parserInput.$char('(')) {\n parserInput.restore();\n return null;\n }\n const args = parserInput.$re(/^\\s*([^\\);]+)\\)\\s*/);\n if (args[1]) {\n parserInput.forget();\n return args[1].trim();\n }\n else { \n parserInput.restore();\n return null;\n }\n },\n\n //\n // A CSS AtRule\n //\n // @charset \"utf-8\";\n //\n atrule: function () {\n const index = parserInput.i;\n let name;\n let value;\n let rules;\n let nonVendorSpecificName;\n let hasIdentifier;\n let hasExpression;\n let hasUnknown;\n let hasBlock = true;\n let isRooted = true;\n\n if (parserInput.currentChar() !== '@') { return; }\n\n value = this['import']() || this.plugin() || this.media();\n if (value) {\n return value;\n }\n\n parserInput.save();\n\n name = parserInput.$re(/^@[a-z-]+/);\n\n if (!name) { return; }\n\n nonVendorSpecificName = name;\n if (name.charAt(1) == '-' && name.indexOf('-', 2) > 0) {\n nonVendorSpecificName = `@${name.slice(name.indexOf('-', 2) + 1)}`;\n }\n\n switch (nonVendorSpecificName) {\n case '@charset':\n hasIdentifier = true;\n hasBlock = false;\n break;\n case '@namespace':\n hasExpression = true;\n hasBlock = false;\n break;\n case '@keyframes':\n case '@counter-style':\n hasIdentifier = true;\n break;\n case '@document':\n case '@supports':\n hasUnknown = true;\n isRooted = false;\n break;\n default:\n hasUnknown = true;\n break;\n }\n\n parserInput.commentStore.length = 0;\n\n if (hasIdentifier) {\n value = this.entity();\n if (!value) {\n error(`expected ${name} identifier`);\n }\n } else if (hasExpression) {\n value = this.expression();\n if (!value) {\n error(`expected ${name} expression`);\n }\n } else if (hasUnknown) {\n value = this.permissiveValue(/^[{;]/);\n hasBlock = (parserInput.currentChar() === '{');\n if (!value) {\n if (!hasBlock && parserInput.currentChar() !== ';') {\n error(`${name} rule is missing block or ending semi-colon`);\n }\n }\n else if (!value.value) {\n value = null;\n }\n }\n\n if (hasBlock) {\n rules = this.blockRuleset();\n }\n\n if (rules || (!hasBlock && value && parserInput.$char(';'))) {\n parserInput.forget();\n return new(tree.AtRule)(name, value, rules, index, fileInfo,\n context.dumpLineNumbers ? getDebugInfo(index) : null,\n isRooted\n );\n }\n\n parserInput.restore('at-rule options not recognised');\n },\n\n //\n // A Value is a comma-delimited list of Expressions\n //\n // font-family: Baskerville, Georgia, serif;\n //\n // In a Rule, a Value represents everything after the `:`,\n // and before the `;`.\n //\n value: function () {\n let e;\n const expressions = [];\n const index = parserInput.i;\n\n do {\n e = this.expression();\n if (e) {\n expressions.push(e);\n if (!parserInput.$char(',')) { break; }\n }\n } while (e);\n\n if (expressions.length > 0) {\n return new(tree.Value)(expressions, index);\n }\n },\n important: function () {\n if (parserInput.currentChar() === '!') {\n return parserInput.$re(/^! *important/);\n }\n },\n sub: function () {\n let a;\n let e;\n\n parserInput.save();\n if (parserInput.$char('(')) {\n a = this.addition();\n if (a && parserInput.$char(')')) {\n parserInput.forget();\n e = new(tree.Expression)([a]);\n e.parens = true;\n return e;\n }\n parserInput.restore('Expected \\')\\'');\n return;\n }\n parserInput.restore();\n },\n multiplication: function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.operand();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1);\n while (true) {\n if (parserInput.peek(/^\\/[*\\/]/)) {\n break;\n }\n\n parserInput.save();\n\n op = parserInput.$char('/') || parserInput.$char('*') || parserInput.$str('./');\n\n if (!op) { parserInput.forget(); break; }\n\n a = this.operand();\n\n if (!a) { parserInput.restore(); break; }\n parserInput.forget();\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n isSpaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n addition: function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.multiplication();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1);\n while (true) {\n op = parserInput.$re(/^[-+]\\s+/) || (!isSpaced && (parserInput.$char('+') || parserInput.$char('-')));\n if (!op) {\n break;\n }\n a = this.multiplication();\n if (!a) {\n break;\n }\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n isSpaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n conditions: function () {\n let a;\n let b;\n const index = parserInput.i;\n let condition;\n\n a = this.condition(true);\n if (a) {\n while (true) {\n if (!parserInput.peek(/^,\\s*(not\\s*)?\\(/) || !parserInput.$char(',')) {\n break;\n }\n b = this.condition(true);\n if (!b) {\n break;\n }\n condition = new(tree.Condition)('or', condition || a, b, index);\n }\n return condition || a;\n }\n },\n condition: function (needsParens) {\n let result;\n let logical;\n let next;\n function or() {\n return parserInput.$str('or');\n }\n\n result = this.conditionAnd(needsParens);\n if (!result) {\n return ;\n }\n logical = or();\n if (logical) {\n next = this.condition(needsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n }\n }\n return result;\n },\n conditionAnd: function (needsParens) {\n let result;\n let logical;\n let next;\n const self = this;\n function insideCondition() {\n const cond = self.negatedCondition(needsParens) || self.parenthesisCondition(needsParens);\n if (!cond && !needsParens) {\n return self.atomicCondition(needsParens);\n }\n return cond;\n }\n function and() {\n return parserInput.$str('and');\n }\n\n result = insideCondition();\n if (!result) {\n return ;\n }\n logical = and();\n if (logical) {\n next = this.conditionAnd(needsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n }\n }\n return result;\n },\n negatedCondition: function (needsParens) {\n if (parserInput.$str('not')) {\n const result = this.parenthesisCondition(needsParens);\n if (result) {\n result.negate = !result.negate;\n }\n return result;\n }\n },\n parenthesisCondition: function (needsParens) {\n function tryConditionFollowedByParenthesis(me) {\n let body;\n parserInput.save();\n body = me.condition(needsParens);\n if (!body) {\n parserInput.restore();\n return ;\n }\n if (!parserInput.$char(')')) {\n parserInput.restore();\n return ;\n }\n parserInput.forget();\n return body;\n }\n\n let body;\n parserInput.save();\n if (!parserInput.$str('(')) {\n parserInput.restore();\n return ;\n }\n body = tryConditionFollowedByParenthesis(this);\n if (body) {\n parserInput.forget();\n return body;\n }\n\n body = this.atomicCondition(needsParens);\n if (!body) {\n parserInput.restore();\n return ;\n }\n if (!parserInput.$char(')')) {\n parserInput.restore(`expected ')' got '${parserInput.currentChar()}'`);\n return ;\n }\n parserInput.forget();\n return body;\n },\n atomicCondition: function (needsParens) {\n const entities = this.entities;\n const index = parserInput.i;\n let a;\n let b;\n let c;\n let op;\n\n function cond() {\n return this.addition() || entities.keyword() || entities.quoted() || entities.mixinLookup();\n }\n cond = cond.bind(this);\n\n a = cond();\n if (a) {\n if (parserInput.$char('>')) {\n if (parserInput.$char('=')) {\n op = '>=';\n } else {\n op = '>';\n }\n } else\n if (parserInput.$char('<')) {\n if (parserInput.$char('=')) {\n op = '<=';\n } else {\n op = '<';\n }\n } else\n if (parserInput.$char('=')) {\n if (parserInput.$char('>')) {\n op = '=>';\n } else if (parserInput.$char('<')) {\n op = '=<';\n } else {\n op = '=';\n }\n }\n if (op) {\n b = cond();\n if (b) {\n c = new(tree.Condition)(op, a, b, index, false);\n } else {\n error('expected expression');\n }\n } else {\n c = new(tree.Condition)('=', a, new(tree.Keyword)('true'), index, false);\n }\n return c;\n }\n },\n\n //\n // An operand is anything that can be part of an operation,\n // such as a Color, or a Variable\n //\n operand: function () {\n const entities = this.entities;\n let negate;\n\n if (parserInput.peek(/^-[@\\$\\(]/)) {\n negate = parserInput.$char('-');\n }\n\n let o = this.sub() || entities.dimension() ||\n entities.color() || entities.variable() ||\n entities.property() || entities.call() ||\n entities.quoted(true) || entities.colorKeyword() ||\n entities.mixinLookup();\n\n if (negate) {\n o.parensInOp = true;\n o = new(tree.Negative)(o);\n }\n\n return o;\n },\n\n //\n // Expressions either represent mathematical operations,\n // or white-space delimited Entities.\n //\n // 1px solid black\n // @var * 2\n //\n expression: function () {\n const entities = [];\n let e;\n let delim;\n const index = parserInput.i;\n\n do {\n e = this.comment();\n if (e) {\n entities.push(e);\n continue;\n }\n e = this.addition() || this.entity();\n\n if (e instanceof tree.Comment) {\n e = null;\n }\n\n if (e) {\n entities.push(e);\n // operations do not allow keyword \"/\" dimension (e.g. small/20px) so we support that here\n if (!parserInput.peek(/^\\/[\\/*]/)) {\n delim = parserInput.$char('/');\n if (delim) {\n entities.push(new(tree.Anonymous)(delim, index));\n }\n }\n }\n } while (e);\n if (entities.length > 0) {\n return new(tree.Expression)(entities);\n }\n },\n property: function () {\n const name = parserInput.$re(/^(\\*?-?[_a-zA-Z0-9-]+)\\s*:/);\n if (name) {\n return name[1];\n }\n },\n ruleProperty: function () {\n let name = [];\n const index = [];\n let s;\n let k;\n\n parserInput.save();\n\n const simpleProperty = parserInput.$re(/^([_a-zA-Z0-9-]+)\\s*:/);\n if (simpleProperty) {\n name = [new(tree.Keyword)(simpleProperty[1])];\n parserInput.forget();\n return name;\n }\n\n function match(re) {\n const i = parserInput.i;\n const chunk = parserInput.$re(re);\n if (chunk) {\n index.push(i);\n return name.push(chunk[1]);\n }\n }\n\n match(/^(\\*?)/);\n while (true) {\n if (!match(/^((?:[\\w-]+)|(?:[@\\$]\\{[\\w-]+\\}))/)) {\n break;\n }\n }\n\n if ((name.length > 1) && match(/^((?:\\+_|\\+)?)\\s*:/)) {\n parserInput.forget();\n\n // at last, we have the complete match now. move forward,\n // convert name particles to tree objects and return:\n if (name[0] === '') {\n name.shift();\n index.shift();\n }\n for (k = 0; k < name.length; k++) {\n s = name[k];\n name[k] = (s.charAt(0) !== '@' && s.charAt(0) !== '$') ?\n new(tree.Keyword)(s) :\n (s.charAt(0) === '@' ?\n new(tree.Variable)(`@${s.slice(2, -1)}`, index[k], fileInfo) :\n new(tree.Property)(`$${s.slice(2, -1)}`, index[k], fileInfo));\n }\n return name;\n }\n parserInput.restore();\n }\n }\n };\n};\nParser.serializeVars = vars => {\n let s = '';\n\n for (const name in vars) {\n if (Object.hasOwnProperty.call(vars, name)) {\n const value = vars[name];\n s += `${((name[0] === '@') ? '' : '@') + name}: ${value}${(String(value).slice(-1) === ';') ? '' : ';'}`;\n }\n }\n\n return s;\n};\n\nexport default Parser;\n","import Anonymous from '../tree/anonymous';\nimport Keyword from '../tree/keyword';\n\nfunction boolean(condition) {\n return condition ? Keyword.True : Keyword.False;\n}\n\n/**\n * Functions with evalArgs set to false are sent context\n * as the first argument.\n */\nfunction If(context, condition, trueValue, falseValue) {\n return condition.eval(context) ? trueValue.eval(context)\n : (falseValue ? falseValue.eval(context) : new Anonymous);\n}\nIf.evalArgs = false;\n\nfunction isdefined(context, variable) {\n try {\n variable.eval(context);\n return Keyword.True;\n } catch (e) {\n return Keyword.False;\n }\n}\n\nisdefined.evalArgs = false;\n\nexport default { isdefined, boolean, 'if': If };\n","import Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport Expression from '../tree/expression';\nimport Operation from '../tree/operation';\nlet colorFunctions;\n\nfunction clamp(val) {\n return Math.min(1, Math.max(0, val));\n}\nfunction hsla(origColor, hsl) {\n const color = colorFunctions.hsla(hsl.h, hsl.s, hsl.l, hsl.a);\n if (color) {\n if (origColor.value && \n /^(rgb|hsl)/.test(origColor.value)) {\n color.value = origColor.value;\n } else {\n color.value = 'rgb';\n }\n return color;\n }\n}\nfunction toHSL(color) {\n if (color.toHSL) {\n return color.toHSL();\n } else {\n throw new Error('Argument cannot be evaluated to a color');\n }\n}\n\nfunction toHSV(color) {\n if (color.toHSV) {\n return color.toHSV();\n } else {\n throw new Error('Argument cannot be evaluated to a color');\n }\n}\n\nfunction number(n) {\n if (n instanceof Dimension) {\n return parseFloat(n.unit.is('%') ? n.value / 100 : n.value);\n } else if (typeof n === 'number') {\n return n;\n } else {\n throw {\n type: 'Argument',\n message: 'color functions take numbers as parameters'\n };\n }\n}\nfunction scaled(n, size) {\n if (n instanceof Dimension && n.unit.is('%')) {\n return parseFloat(n.value * size / 100);\n } else {\n return number(n);\n }\n}\ncolorFunctions = {\n rgb: function (r, g, b) {\n let a = 1\n /**\n * Comma-less syntax\n * e.g. rgb(0 128 255 / 50%)\n */\n if (r instanceof Expression) {\n const val = r.value\n r = val[0]\n g = val[1]\n b = val[2]\n /** \n * @todo - should this be normalized in\n * function caller? Or parsed differently?\n */\n if (b instanceof Operation) {\n const op = b\n b = op.operands[0]\n a = op.operands[1]\n }\n }\n const color = colorFunctions.rgba(r, g, b, a);\n if (color) {\n color.value = 'rgb';\n return color;\n }\n },\n rgba: function (r, g, b, a) {\n try {\n if (r instanceof Color) {\n if (g) {\n a = number(g);\n } else {\n a = r.alpha;\n }\n return new Color(r.rgb, a, 'rgba');\n }\n const rgb = [r, g, b].map(c => scaled(c, 255));\n a = number(a);\n return new Color(rgb, a, 'rgba');\n }\n catch (e) {}\n },\n hsl: function (h, s, l) {\n let a = 1\n if (h instanceof Expression) {\n const val = h.value\n h = val[0]\n s = val[1]\n l = val[2]\n\n if (l instanceof Operation) {\n const op = l\n l = op.operands[0]\n a = op.operands[1]\n }\n }\n const color = colorFunctions.hsla(h, s, l, a);\n if (color) {\n color.value = 'hsl';\n return color;\n }\n },\n hsla: function (h, s, l, a) {\n try {\n if (h instanceof Color) {\n if (s) {\n a = number(s);\n } else {\n a = h.alpha;\n }\n return new Color(h.rgb, a, 'hsla');\n }\n\n let m1;\n let m2;\n\n function hue(h) {\n h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h);\n if (h * 6 < 1) {\n return m1 + (m2 - m1) * h * 6;\n }\n else if (h * 2 < 1) {\n return m2;\n }\n else if (h * 3 < 2) {\n return m1 + (m2 - m1) * (2 / 3 - h) * 6;\n }\n else {\n return m1;\n }\n }\n\n h = (number(h) % 360) / 360;\n s = clamp(number(s));l = clamp(number(l));a = clamp(number(a));\n\n m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n m1 = l * 2 - m2;\n\n const rgb = [\n hue(h + 1 / 3) * 255,\n hue(h) * 255,\n hue(h - 1 / 3) * 255\n ];\n a = number(a);\n return new Color(rgb, a, 'hsla');\n }\n catch (e) {}\n },\n\n hsv: function(h, s, v) {\n return colorFunctions.hsva(h, s, v, 1.0);\n },\n\n hsva: function(h, s, v, a) {\n h = ((number(h) % 360) / 360) * 360;\n s = number(s);v = number(v);a = number(a);\n\n let i;\n let f;\n i = Math.floor((h / 60) % 6);\n f = (h / 60) - i;\n\n const vs = [v,\n v * (1 - s),\n v * (1 - f * s),\n v * (1 - (1 - f) * s)];\n const perm = [[0, 3, 1],\n [2, 0, 1],\n [1, 0, 3],\n [1, 2, 0],\n [3, 1, 0],\n [0, 1, 2]];\n\n return colorFunctions.rgba(vs[perm[i][0]] * 255,\n vs[perm[i][1]] * 255,\n vs[perm[i][2]] * 255,\n a);\n },\n\n hue: function (color) {\n return new Dimension(toHSL(color).h);\n },\n saturation: function (color) {\n return new Dimension(toHSL(color).s * 100, '%');\n },\n lightness: function (color) {\n return new Dimension(toHSL(color).l * 100, '%');\n },\n hsvhue: function(color) {\n return new Dimension(toHSV(color).h);\n },\n hsvsaturation: function (color) {\n return new Dimension(toHSV(color).s * 100, '%');\n },\n hsvvalue: function (color) {\n return new Dimension(toHSV(color).v * 100, '%');\n },\n red: function (color) {\n return new Dimension(color.rgb[0]);\n },\n green: function (color) {\n return new Dimension(color.rgb[1]);\n },\n blue: function (color) {\n return new Dimension(color.rgb[2]);\n },\n alpha: function (color) {\n return new Dimension(toHSL(color).a);\n },\n luma: function (color) {\n return new Dimension(color.luma() * color.alpha * 100, '%');\n },\n luminance: function (color) {\n const luminance =\n (0.2126 * color.rgb[0] / 255) +\n (0.7152 * color.rgb[1] / 255) +\n (0.0722 * color.rgb[2] / 255);\n\n return new Dimension(luminance * color.alpha * 100, '%');\n },\n saturate: function (color, amount, method) {\n // filter: saturate(3.2);\n // should be kept as is, so check for color\n if (!color.rgb) {\n return null;\n }\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.s += hsl.s * amount.value / 100;\n }\n else {\n hsl.s += amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n return hsla(color, hsl);\n },\n desaturate: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.s -= hsl.s * amount.value / 100;\n }\n else {\n hsl.s -= amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n return hsla(color, hsl);\n },\n lighten: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.l += hsl.l * amount.value / 100;\n }\n else {\n hsl.l += amount.value / 100;\n }\n hsl.l = clamp(hsl.l);\n return hsla(color, hsl);\n },\n darken: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.l -= hsl.l * amount.value / 100;\n }\n else {\n hsl.l -= amount.value / 100;\n }\n hsl.l = clamp(hsl.l);\n return hsla(color, hsl);\n },\n fadein: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.a += hsl.a * amount.value / 100;\n }\n else {\n hsl.a += amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fadeout: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.a -= hsl.a * amount.value / 100;\n }\n else {\n hsl.a -= amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fade: function (color, amount) {\n const hsl = toHSL(color);\n\n hsl.a = amount.value / 100;\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n spin: function (color, amount) {\n const hsl = toHSL(color);\n const hue = (hsl.h + amount.value) % 360;\n\n hsl.h = hue < 0 ? 360 + hue : hue;\n\n return hsla(color, hsl);\n },\n //\n // Copyright (c) 2006-2009 Hampton Catlin, Natalie Weizenbaum, and Chris Eppstein\n // http://sass-lang.com\n //\n mix: function (color1, color2, weight) {\n if (!weight) {\n weight = new Dimension(50);\n }\n const p = weight.value / 100.0;\n const w = p * 2 - 1;\n const a = toHSL(color1).a - toHSL(color2).a;\n\n const w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n const w2 = 1 - w1;\n\n const rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2,\n color1.rgb[1] * w1 + color2.rgb[1] * w2,\n color1.rgb[2] * w1 + color2.rgb[2] * w2];\n\n const alpha = color1.alpha * p + color2.alpha * (1 - p);\n\n return new Color(rgb, alpha);\n },\n greyscale: function (color) {\n return colorFunctions.desaturate(color, new Dimension(100));\n },\n contrast: function (color, dark, light, threshold) {\n // filter: contrast(3.2);\n // should be kept as is, so check for color\n if (!color.rgb) {\n return null;\n }\n if (typeof light === 'undefined') {\n light = colorFunctions.rgba(255, 255, 255, 1.0);\n }\n if (typeof dark === 'undefined') {\n dark = colorFunctions.rgba(0, 0, 0, 1.0);\n }\n // Figure out which is actually light and dark:\n if (dark.luma() > light.luma()) {\n const t = light;\n light = dark;\n dark = t;\n }\n if (typeof threshold === 'undefined') {\n threshold = 0.43;\n } else {\n threshold = number(threshold);\n }\n if (color.luma() < threshold) {\n return light;\n } else {\n return dark;\n }\n },\n // Changes made in 2.7.0 - Reverted in 3.0.0\n // contrast: function (color, color1, color2, threshold) {\n // // Return which of `color1` and `color2` has the greatest contrast with `color`\n // // according to the standard WCAG contrast ratio calculation.\n // // http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n // // The threshold param is no longer used, in line with SASS.\n // // filter: contrast(3.2);\n // // should be kept as is, so check for color\n // if (!color.rgb) {\n // return null;\n // }\n // if (typeof color1 === 'undefined') {\n // color1 = colorFunctions.rgba(0, 0, 0, 1.0);\n // }\n // if (typeof color2 === 'undefined') {\n // color2 = colorFunctions.rgba(255, 255, 255, 1.0);\n // }\n // var contrast1, contrast2;\n // var luma = color.luma();\n // var luma1 = color1.luma();\n // var luma2 = color2.luma();\n // // Calculate contrast ratios for each color\n // if (luma > luma1) {\n // contrast1 = (luma + 0.05) / (luma1 + 0.05);\n // } else {\n // contrast1 = (luma1 + 0.05) / (luma + 0.05);\n // }\n // if (luma > luma2) {\n // contrast2 = (luma + 0.05) / (luma2 + 0.05);\n // } else {\n // contrast2 = (luma2 + 0.05) / (luma + 0.05);\n // }\n // if (contrast1 > contrast2) {\n // return color1;\n // } else {\n // return color2;\n // }\n // },\n argb: function (color) {\n return new Anonymous(color.toARGB());\n },\n color: function(c) {\n if ((c instanceof Quoted) &&\n (/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})$/i.test(c.value))) {\n const val = c.value.slice(1);\n return new Color(val, undefined, `#${val}`);\n }\n if ((c instanceof Color) || (c = Color.fromKeyword(c.value))) {\n c.value = undefined;\n return c;\n }\n throw {\n type: 'Argument',\n message: 'argument must be a color keyword or 3|4|6|8 digit hex e.g. #FFF'\n };\n },\n tint: function(color, amount) {\n return colorFunctions.mix(colorFunctions.rgb(255, 255, 255), color, amount);\n },\n shade: function(color, amount) {\n return colorFunctions.mix(colorFunctions.rgb(0, 0, 0), color, amount);\n }\n};\n\nexport default colorFunctions;\n","import Color from '../tree/color';\n\n// Color Blending\n// ref: http://www.w3.org/TR/compositing-1\n\nfunction colorBlend(mode, color1, color2) {\n const ab = color1.alpha; // result\n\n let // backdrop\n cb;\n\n const as = color2.alpha;\n\n let // source\n cs;\n\n let ar;\n let cr;\n const r = [];\n\n ar = as + ab * (1 - as);\n for (let i = 0; i < 3; i++) {\n cb = color1.rgb[i] / 255;\n cs = color2.rgb[i] / 255;\n cr = mode(cb, cs);\n if (ar) {\n cr = (as * cs + ab * (cb -\n as * (cb + cs - cr))) / ar;\n }\n r[i] = cr * 255;\n }\n\n return new Color(r, ar);\n}\n\nconst colorBlendModeFunctions = {\n multiply: function(cb, cs) {\n return cb * cs;\n },\n screen: function(cb, cs) {\n return cb + cs - cb * cs;\n },\n overlay: function(cb, cs) {\n cb *= 2;\n return (cb <= 1) ?\n colorBlendModeFunctions.multiply(cb, cs) :\n colorBlendModeFunctions.screen(cb - 1, cs);\n },\n softlight: function(cb, cs) {\n let d = 1;\n let e = cb;\n if (cs > 0.5) {\n e = 1;\n d = (cb > 0.25) ? Math.sqrt(cb)\n : ((16 * cb - 12) * cb + 4) * cb;\n }\n return cb - (1 - 2 * cs) * e * (d - cb);\n },\n hardlight: function(cb, cs) {\n return colorBlendModeFunctions.overlay(cs, cb);\n },\n difference: function(cb, cs) {\n return Math.abs(cb - cs);\n },\n exclusion: function(cb, cs) {\n return cb + cs - 2 * cb * cs;\n },\n\n // non-w3c functions:\n average: function(cb, cs) {\n return (cb + cs) / 2;\n },\n negation: function(cb, cs) {\n return 1 - Math.abs(cb + cs - 1);\n }\n};\n\nfor (const f in colorBlendModeFunctions) {\n if (colorBlendModeFunctions.hasOwnProperty(f)) {\n colorBlend[f] = colorBlend.bind(null, colorBlendModeFunctions[f]);\n }\n}\n\nexport default colorBlend;\n","import Comment from '../tree/comment';\nimport Node from '../tree/node';\nimport Dimension from '../tree/dimension';\nimport Declaration from '../tree/declaration';\nimport Expression from '../tree/expression';\nimport Ruleset from '../tree/ruleset';\nimport Selector from '../tree/selector';\nimport Element from '../tree/element';\nimport Quote from '../tree/quoted';\nimport Value from '../tree/value';\n\nconst getItemsFromNode = node => {\n // handle non-array values as an array of length 1\n // return 'undefined' if index is invalid\n const items = Array.isArray(node.value) ?\n node.value : Array(node);\n\n return items;\n};\n\nexport default {\n _SELF: function(n) {\n return n;\n },\n '~': function(...expr) {\n if (expr.length === 1) {\n return expr[0];\n }\n return new Value(expr);\n },\n extract: function(values, index) {\n // (1-based index)\n index = index.value - 1;\n\n return getItemsFromNode(values)[index];\n },\n length: function(values) {\n return new Dimension(getItemsFromNode(values).length);\n },\n /**\n * Creates a Less list of incremental values.\n * Modeled after Lodash's range function, also exists natively in PHP\n * \n * @param {Dimension} [start=1]\n * @param {Dimension} end - e.g. 10 or 10px - unit is added to output\n * @param {Dimension} [step=1] \n */\n range: function(start, end, step) {\n let from;\n let to;\n let stepValue = 1;\n const list = [];\n if (end) {\n to = end;\n from = start.value;\n if (step) {\n stepValue = step.value;\n }\n }\n else {\n from = 1;\n to = start;\n }\n\n for (let i = from; i <= to.value; i += stepValue) {\n list.push(new Dimension(i, to.unit));\n }\n\n return new Expression(list);\n },\n each: function(list, rs) {\n const rules = [];\n let newRules;\n let iterator;\n\n const tryEval = val => {\n if (val instanceof Node) {\n return val.eval(this.context);\n }\n return val;\n };\n\n if (list.value && !(list instanceof Quote)) {\n if (Array.isArray(list.value)) {\n iterator = list.value.map(tryEval);\n } else {\n iterator = [tryEval(list.value)];\n }\n } else if (list.ruleset) {\n iterator = tryEval(list.ruleset).rules;\n } else if (list.rules) {\n iterator = list.rules.map(tryEval);\n } else if (Array.isArray(list)) {\n iterator = list.map(tryEval);\n } else {\n iterator = [tryEval(list)];\n }\n\n let valueName = '@value';\n let keyName = '@key';\n let indexName = '@index';\n\n if (rs.params) {\n valueName = rs.params[0] && rs.params[0].name;\n keyName = rs.params[1] && rs.params[1].name;\n indexName = rs.params[2] && rs.params[2].name;\n rs = rs.rules;\n } else {\n rs = rs.ruleset;\n }\n\n for (let i = 0; i < iterator.length; i++) {\n let key;\n let value;\n const item = iterator[i];\n if (item instanceof Declaration) {\n key = typeof item.name === 'string' ? item.name : item.name[0].value;\n value = item.value;\n } else {\n key = new Dimension(i + 1);\n value = item;\n }\n\n if (item instanceof Comment) {\n continue;\n }\n\n newRules = rs.rules.slice(0);\n if (valueName) {\n newRules.push(new Declaration(valueName,\n value,\n false, false, this.index, this.currentFileInfo));\n }\n if (indexName) {\n newRules.push(new Declaration(indexName,\n new Dimension(i + 1),\n false, false, this.index, this.currentFileInfo));\n }\n if (keyName) {\n newRules.push(new Declaration(keyName,\n key,\n false, false, this.index, this.currentFileInfo));\n }\n\n rules.push(new Ruleset([ new(Selector)([ new Element(\"\", '&') ]) ],\n newRules,\n rs.strictImports,\n rs.visibilityInfo()\n ));\n }\n\n return new Ruleset([ new(Selector)([ new Element(\"\", '&') ]) ],\n rules,\n rs.strictImports,\n rs.visibilityInfo()\n ).eval(this.context);\n }\n};\n","import Dimension from '../tree/dimension';\n\nconst MathHelper = (fn, unit, n) => {\n if (!(n instanceof Dimension)) {\n throw { type: 'Argument', message: 'argument must be a number' };\n }\n if (unit == null) {\n unit = n.unit;\n } else {\n n = n.unify();\n }\n return new Dimension(fn(parseFloat(n.value)), unit);\n};\n\nexport default MathHelper;","import mathHelper from './math-helper.js';\n\nconst mathFunctions = {\n // name, unit\n ceil: null,\n floor: null,\n sqrt: null,\n abs: null,\n tan: '',\n sin: '',\n cos: '',\n atan: 'rad',\n asin: 'rad',\n acos: 'rad'\n};\n\nfor (const f in mathFunctions) {\n if (mathFunctions.hasOwnProperty(f)) {\n mathFunctions[f] = mathHelper.bind(null, Math[f], mathFunctions[f]);\n }\n}\n\nmathFunctions.round = (n, f) => {\n const fraction = typeof f === 'undefined' ? 0 : f.value;\n return mathHelper(num => num.toFixed(fraction), null, n);\n};\n\nexport default mathFunctions;\n","import Dimension from '../tree/dimension';\nimport Anonymous from '../tree/anonymous';\nimport mathHelper from './math-helper.js';\n\nconst minMax = function (isMin, args) {\n args = Array.prototype.slice.call(args);\n switch (args.length) {\n case 0: throw { type: 'Argument', message: 'one or more arguments required' };\n }\n let i; // key is the unit.toString() for unified Dimension values,\n let j;\n let current;\n let currentUnified;\n let referenceUnified;\n let unit;\n let unitStatic;\n let unitClone;\n\n const // elems only contains original argument values.\n order = [];\n\n const values = {};\n // value is the index into the order array.\n for (i = 0; i < args.length; i++) {\n current = args[i];\n if (!(current instanceof Dimension)) {\n if (Array.isArray(args[i].value)) {\n Array.prototype.push.apply(args, Array.prototype.slice.call(args[i].value));\n }\n continue;\n }\n currentUnified = current.unit.toString() === '' && unitClone !== undefined ? new Dimension(current.value, unitClone).unify() : current.unify();\n unit = currentUnified.unit.toString() === '' && unitStatic !== undefined ? unitStatic : currentUnified.unit.toString();\n unitStatic = unit !== '' && unitStatic === undefined || unit !== '' && order[0].unify().unit.toString() === '' ? unit : unitStatic;\n unitClone = unit !== '' && unitClone === undefined ? current.unit.toString() : unitClone;\n j = values[''] !== undefined && unit !== '' && unit === unitStatic ? values[''] : values[unit];\n if (j === undefined) {\n if (unitStatic !== undefined && unit !== unitStatic) {\n throw { type: 'Argument', message: 'incompatible types' };\n }\n values[unit] = order.length;\n order.push(current);\n continue;\n }\n referenceUnified = order[j].unit.toString() === '' && unitClone !== undefined ? new Dimension(order[j].value, unitClone).unify() : order[j].unify();\n if ( isMin && currentUnified.value < referenceUnified.value ||\n !isMin && currentUnified.value > referenceUnified.value) {\n order[j] = current;\n }\n }\n if (order.length == 1) {\n return order[0];\n }\n args = order.map(function (a) { return a.toCSS(this.context); }).join(this.context.compress ? ',' : ', ');\n return new Anonymous(`${isMin ? 'min' : 'max'}(${args})`);\n};\n\nexport default {\n min: function(...args) {\n try {\n return minMax(true, args);\n } catch (e) {}\n },\n max: function(...args) {\n try {\n return minMax(false, args);\n } catch (e) {}\n },\n convert: function (val, unit) {\n return val.convertTo(unit.value);\n },\n pi: function () {\n return new Dimension(Math.PI);\n },\n mod: function(a, b) {\n return new Dimension(a.value % b.value, a.unit);\n },\n pow: function(x, y) {\n if (typeof x === 'number' && typeof y === 'number') {\n x = new Dimension(x);\n y = new Dimension(y);\n } else if (!(x instanceof Dimension) || !(y instanceof Dimension)) {\n throw { type: 'Argument', message: 'arguments must be numbers' };\n }\n\n return new Dimension(Math.pow(x.value, y.value), x.unit);\n },\n percentage: function (n) {\n const result = mathHelper(num => num * 100, '%', n);\n\n return result;\n }\n};\n","import Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport JavaScript from '../tree/javascript';\n\nexport default {\n e: function (str) {\n return new Quoted('\"', str instanceof JavaScript ? str.evaluated : str.value, true);\n },\n escape: function (str) {\n return new Anonymous(\n encodeURI(str.value).replace(/=/g, '%3D').replace(/:/g, '%3A').replace(/#/g, '%23').replace(/;/g, '%3B')\n .replace(/\\(/g, '%28').replace(/\\)/g, '%29'));\n },\n replace: function (string, pattern, replacement, flags) {\n let result = string.value;\n replacement = (replacement.type === 'Quoted') ?\n replacement.value : replacement.toCSS();\n result = result.replace(new RegExp(pattern.value, flags ? flags.value : ''), replacement);\n return new Quoted(string.quote || '', result, string.escaped);\n },\n '%': function (string /* arg, arg, ... */) {\n const args = Array.prototype.slice.call(arguments, 1);\n let result = string.value;\n\n for (let i = 0; i < args.length; i++) {\n /* jshint loopfunc:true */\n result = result.replace(/%[sda]/i, token => {\n const value = ((args[i].type === 'Quoted') &&\n token.match(/s/i)) ? args[i].value : args[i].toCSS();\n return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value;\n });\n }\n result = result.replace(/%%/g, '%');\n return new Quoted(string.quote || '', result, string.escaped);\n }\n};\n","import Keyword from '../tree/keyword';\nimport DetachedRuleset from '../tree/detached-ruleset';\nimport Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport URL from '../tree/url';\nimport Operation from '../tree/operation';\n\nconst isa = (n, Type) => (n instanceof Type) ? Keyword.True : Keyword.False;\nconst isunit = (n, unit) => {\n if (unit === undefined) {\n throw { type: 'Argument', message: 'missing the required second argument to isunit.' };\n }\n unit = typeof unit.value === 'string' ? unit.value : unit;\n if (typeof unit !== 'string') {\n throw { type: 'Argument', message: 'Second argument to isunit should be a unit or a string.' };\n }\n return (n instanceof Dimension) && n.unit.is(unit) ? Keyword.True : Keyword.False;\n};\n\nexport default {\n isruleset: function (n) {\n return isa(n, DetachedRuleset);\n },\n iscolor: function (n) {\n return isa(n, Color);\n },\n isnumber: function (n) {\n return isa(n, Dimension);\n },\n isstring: function (n) {\n return isa(n, Quoted);\n },\n iskeyword: function (n) {\n return isa(n, Keyword);\n },\n isurl: function (n) {\n return isa(n, URL);\n },\n ispixel: function (n) {\n return isunit(n, 'px');\n },\n ispercentage: function (n) {\n return isunit(n, '%');\n },\n isem: function (n) {\n return isunit(n, 'em');\n },\n isunit,\n unit: function (val, unit) {\n if (!(val instanceof Dimension)) {\n throw { type: 'Argument',\n message: `the first argument to unit must be a number${val instanceof Operation ? '. Have you forgotten parenthesis?' : ''}` };\n }\n if (unit) {\n if (unit instanceof Keyword) {\n unit = unit.value;\n } else {\n unit = unit.toCSS();\n }\n } else {\n unit = '';\n }\n return new Dimension(val.value, unit);\n },\n 'get-unit': function (n) {\n return new Anonymous(n.unit);\n }\n};\n","import functionRegistry from './function-registry';\nimport functionCaller from './function-caller';\n\nimport boolean from './boolean';\nimport defaultFunc from './default';\nimport color from './color';\nimport colorBlending from './color-blending';\nimport dataUri from './data-uri';\nimport list from './list';\nimport math from './math';\nimport number from './number';\nimport string from './string';\nimport svg from './svg';\nimport types from './types';\n\nexport default environment => {\n const functions = { functionRegistry, functionCaller };\n\n // register functions\n functionRegistry.addMultiple(boolean);\n functionRegistry.add('default', defaultFunc.eval.bind(defaultFunc));\n functionRegistry.addMultiple(color);\n functionRegistry.addMultiple(colorBlending);\n functionRegistry.addMultiple(dataUri(environment));\n functionRegistry.addMultiple(list);\n functionRegistry.addMultiple(math);\n functionRegistry.addMultiple(number);\n functionRegistry.addMultiple(string);\n functionRegistry.addMultiple(svg(environment));\n functionRegistry.addMultiple(types);\n\n return functions;\n};\n","import Quoted from '../tree/quoted';\nimport URL from '../tree/url';\nimport * as utils from '../utils';\nimport logger from '../logger';\n\nexport default environment => {\n \n const fallback = (functionThis, node) => new URL(node, functionThis.index, functionThis.currentFileInfo).eval(functionThis.context); \n\n return { 'data-uri': function(mimetypeNode, filePathNode) {\n\n if (!filePathNode) {\n filePathNode = mimetypeNode;\n mimetypeNode = null;\n }\n\n let mimetype = mimetypeNode && mimetypeNode.value;\n let filePath = filePathNode.value;\n const currentFileInfo = this.currentFileInfo;\n const currentDirectory = currentFileInfo.rewriteUrls ?\n currentFileInfo.currentDirectory : currentFileInfo.entryPath;\n\n const fragmentStart = filePath.indexOf('#');\n let fragment = '';\n if (fragmentStart !== -1) {\n fragment = filePath.slice(fragmentStart);\n filePath = filePath.slice(0, fragmentStart);\n }\n const context = utils.clone(this.context);\n context.rawBuffer = true;\n\n const fileManager = environment.getFileManager(filePath, currentDirectory, context, environment, true);\n\n if (!fileManager) {\n return fallback(this, filePathNode);\n }\n\n let useBase64 = false;\n\n // detect the mimetype if not given\n if (!mimetypeNode) {\n\n mimetype = environment.mimeLookup(filePath);\n\n if (mimetype === 'image/svg+xml') {\n useBase64 = false;\n } else {\n // use base 64 unless it's an ASCII or UTF-8 format\n const charset = environment.charsetLookup(mimetype);\n useBase64 = ['US-ASCII', 'UTF-8'].indexOf(charset) < 0;\n }\n if (useBase64) { mimetype += ';base64'; }\n }\n else {\n useBase64 = /;base64$/.test(mimetype);\n }\n\n const fileSync = fileManager.loadFileSync(filePath, currentDirectory, context, environment);\n if (!fileSync.contents) {\n logger.warn(`Skipped data-uri embedding of ${filePath} because file not found`);\n return fallback(this, filePathNode || mimetypeNode);\n }\n let buf = fileSync.contents;\n if (useBase64 && !environment.encodeBase64) {\n return fallback(this, filePathNode);\n }\n\n buf = useBase64 ? environment.encodeBase64(buf) : encodeURIComponent(buf);\n\n const uri = `data:${mimetype},${buf}${fragment}`;\n\n return new URL(new Quoted(`\"${uri}\"`, uri, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n }};\n};\n","import Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Expression from '../tree/expression';\nimport Quoted from '../tree/quoted';\nimport URL from '../tree/url';\n\nexport default environment => {\n return { 'svg-gradient': function(direction) {\n let stops;\n let gradientDirectionSvg;\n let gradientType = 'linear';\n let rectangleDimension = 'x=\"0\" y=\"0\" width=\"1\" height=\"1\"';\n const renderEnv = {compress: false};\n let returner;\n const directionValue = direction.toCSS(renderEnv);\n let i;\n let color;\n let position;\n let positionValue;\n let alpha;\n\n function throwArgumentDescriptor() {\n throw { type: 'Argument',\n message: 'svg-gradient expects direction, start_color [start_position], [color position,]...,' +\n ' end_color [end_position] or direction, color list' };\n }\n\n if (arguments.length == 2) {\n if (arguments[1].value.length < 2) {\n throwArgumentDescriptor();\n }\n stops = arguments[1].value;\n } else if (arguments.length < 3) {\n throwArgumentDescriptor();\n } else {\n stops = Array.prototype.slice.call(arguments, 1);\n }\n\n switch (directionValue) {\n case 'to bottom':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\"';\n break;\n case 'to right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'to bottom right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\"';\n break;\n case 'to top right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"100%\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'ellipse':\n case 'ellipse at center':\n gradientType = 'radial';\n gradientDirectionSvg = 'cx=\"50%\" cy=\"50%\" r=\"75%\"';\n rectangleDimension = 'x=\"-50\" y=\"-50\" width=\"101\" height=\"101\"';\n break;\n default:\n throw { type: 'Argument', message: 'svg-gradient direction must be \\'to bottom\\', \\'to right\\',' +\n ' \\'to bottom right\\', \\'to top right\\' or \\'ellipse at center\\'' };\n }\n returner = `<${gradientType}Gradient id=\"g\" ${gradientDirectionSvg}>`;\n\n for (i = 0; i < stops.length; i += 1) {\n if (stops[i] instanceof Expression) {\n color = stops[i].value[0];\n position = stops[i].value[1];\n } else {\n color = stops[i];\n position = undefined;\n }\n\n if (!(color instanceof Color) || (!((i === 0 || i + 1 === stops.length) && position === undefined) && !(position instanceof Dimension))) {\n throwArgumentDescriptor();\n }\n positionValue = position ? position.toCSS(renderEnv) : i === 0 ? '0%' : '100%';\n alpha = color.alpha;\n returner += ``;\n }\n returner += ``;\n\n returner = encodeURIComponent(returner);\n\n returner = `data:image/svg+xml,${returner}`;\n return new URL(new Quoted(`'${returner}'`, returner, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n }};\n};\n","import contexts from './contexts';\nimport visitor from './visitors';\nimport tree from './tree';\n\nexport default function(root, options) {\n options = options || {};\n let evaldRoot;\n let variables = options.variables;\n const evalEnv = new contexts.Eval(options);\n\n //\n // Allows setting variables with a hash, so:\n //\n // `{ color: new tree.Color('#f01') }` will become:\n //\n // new tree.Declaration('@color',\n // new tree.Value([\n // new tree.Expression([\n // new tree.Color('#f01')\n // ])\n // ])\n // )\n //\n if (typeof variables === 'object' && !Array.isArray(variables)) {\n variables = Object.keys(variables).map(function (k) {\n let value = variables[k];\n\n if (!(value instanceof tree.Value)) {\n if (!(value instanceof tree.Expression)) {\n value = new tree.Expression([value]);\n }\n value = new tree.Value([value]);\n }\n return new tree.Declaration(`@${k}`, value, false, null, 0);\n });\n evalEnv.frames = [new tree.Ruleset(null, variables)];\n }\n\n const visitors = [\n new visitor.JoinSelectorVisitor(),\n new visitor.MarkVisibleSelectorsVisitor(true),\n new visitor.ExtendVisitor(),\n new visitor.ToCSSVisitor({compress: Boolean(options.compress)})\n ];\n\n const preEvalVisitors = [];\n let v;\n let visitorIterator;\n\n /**\n * first() / get() allows visitors to be added while visiting\n * \n * @todo Add scoping for visitors just like functions for @plugin; right now they're global\n */\n if (options.pluginManager) {\n visitorIterator = options.pluginManager.visitor();\n for (var i = 0; i < 2; i++) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (v.isPreEvalVisitor) {\n if (i === 0 || preEvalVisitors.indexOf(v) === -1) {\n preEvalVisitors.push(v);\n v.run(root);\n }\n }\n else {\n if (i === 0 || visitors.indexOf(v) === -1) {\n if (v.isPreVisitor) {\n visitors.unshift(v);\n }\n else {\n visitors.push(v);\n }\n }\n }\n }\n }\n }\n\n evaldRoot = root.eval(evalEnv);\n\n for (var i = 0; i < visitors.length; i++) {\n visitors[i].run(evaldRoot);\n }\n\n // Run any remaining visitors added after eval pass\n if (options.pluginManager) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (visitors.indexOf(v) === -1 && preEvalVisitors.indexOf(v) === -1) {\n v.run(evaldRoot);\n }\n }\n }\n\n return evaldRoot;\n};\n","/**\n * Plugin Manager\n */\nclass PluginManager {\n constructor(less) {\n this.less = less;\n this.visitors = [];\n this.preProcessors = [];\n this.postProcessors = [];\n this.installedPlugins = [];\n this.fileManagers = [];\n this.iterator = -1;\n this.pluginCache = {};\n this.Loader = new less.PluginLoader(less);\n }\n\n /**\n * Adds all the plugins in the array\n * @param {Array} plugins\n */\n addPlugins(plugins) {\n if (plugins) {\n for (let i = 0; i < plugins.length; i++) {\n this.addPlugin(plugins[i]);\n }\n }\n }\n\n /**\n *\n * @param plugin\n * @param {String} filename\n */\n addPlugin(plugin, filename, functionRegistry) {\n this.installedPlugins.push(plugin);\n if (filename) {\n this.pluginCache[filename] = plugin;\n }\n if (plugin.install) {\n plugin.install(this.less, this, functionRegistry || this.less.functions.functionRegistry);\n }\n }\n\n /**\n *\n * @param filename\n */\n get(filename) {\n return this.pluginCache[filename];\n }\n\n /**\n * Adds a visitor. The visitor object has options on itself to determine\n * when it should run.\n * @param visitor\n */\n addVisitor(visitor) {\n this.visitors.push(visitor);\n }\n\n /**\n * Adds a pre processor object\n * @param {object} preProcessor\n * @param {number} priority - guidelines 1 = before import, 1000 = import, 2000 = after import\n */\n addPreProcessor(preProcessor, priority) {\n let indexToInsertAt;\n for (indexToInsertAt = 0; indexToInsertAt < this.preProcessors.length; indexToInsertAt++) {\n if (this.preProcessors[indexToInsertAt].priority >= priority) {\n break;\n }\n }\n this.preProcessors.splice(indexToInsertAt, 0, {preProcessor, priority});\n }\n\n /**\n * Adds a post processor object\n * @param {object} postProcessor\n * @param {number} priority - guidelines 1 = before compression, 1000 = compression, 2000 = after compression\n */\n addPostProcessor(postProcessor, priority) {\n let indexToInsertAt;\n for (indexToInsertAt = 0; indexToInsertAt < this.postProcessors.length; indexToInsertAt++) {\n if (this.postProcessors[indexToInsertAt].priority >= priority) {\n break;\n }\n }\n this.postProcessors.splice(indexToInsertAt, 0, {postProcessor, priority});\n }\n\n /**\n *\n * @param manager\n */\n addFileManager(manager) {\n this.fileManagers.push(manager);\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getPreProcessors() {\n const preProcessors = [];\n for (let i = 0; i < this.preProcessors.length; i++) {\n preProcessors.push(this.preProcessors[i].preProcessor);\n }\n return preProcessors;\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getPostProcessors() {\n const postProcessors = [];\n for (let i = 0; i < this.postProcessors.length; i++) {\n postProcessors.push(this.postProcessors[i].postProcessor);\n }\n return postProcessors;\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getVisitors() {\n return this.visitors;\n }\n\n visitor() {\n const self = this;\n return {\n first: function() {\n self.iterator = -1;\n return self.visitors[self.iterator];\n },\n get: function() {\n self.iterator += 1;\n return self.visitors[self.iterator];\n }\n };\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getFileManagers() {\n return this.fileManagers;\n }\n}\n\nlet pm;\n\nconst PluginManagerFactory = function(less, newFactory) {\n if (newFactory || !pm) {\n pm = new PluginManager(less);\n }\n return pm;\n};\n\n//\nexport default PluginManagerFactory;\n","/* global window, XMLHttpRequest */\n\nimport AbstractFileManager from '../less/environment/abstract-file-manager.js';\n\nlet options;\nlet logger;\nlet fileCache = {};\n\n// TODOS - move log somewhere. pathDiff and doing something similar in node. use pathDiff in the other browser file for the initial load\nconst FileManager = function() {}\nFileManager.prototype = Object.assign(new AbstractFileManager(), {\n alwaysMakePathsAbsolute() {\n return true;\n },\n\n join(basePath, laterPath) {\n if (!basePath) {\n return laterPath;\n }\n return this.extractUrlParts(laterPath, basePath).path;\n },\n\n doXHR(url, type, callback, errback) {\n const xhr = new XMLHttpRequest();\n const async = options.isFileProtocol ? options.fileAsync : true;\n\n if (typeof xhr.overrideMimeType === 'function') {\n xhr.overrideMimeType('text/css');\n }\n logger.debug(`XHR: Getting '${url}'`);\n xhr.open('GET', url, async);\n xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5');\n xhr.send(null);\n\n function handleResponse(xhr, callback, errback) {\n if (xhr.status >= 200 && xhr.status < 300) {\n callback(xhr.responseText,\n xhr.getResponseHeader('Last-Modified'));\n } else if (typeof errback === 'function') {\n errback(xhr.status, url);\n }\n }\n\n if (options.isFileProtocol && !options.fileAsync) {\n if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) {\n callback(xhr.responseText);\n } else {\n errback(xhr.status, url);\n }\n } else if (async) {\n xhr.onreadystatechange = () => {\n if (xhr.readyState == 4) {\n handleResponse(xhr, callback, errback);\n }\n };\n } else {\n handleResponse(xhr, callback, errback);\n }\n },\n\n supports() {\n return true;\n },\n\n clearFileCache() {\n fileCache = {};\n },\n\n loadFile(filename, currentDirectory, options, environment) {\n // TODO: Add prefix support like less-node?\n // What about multiple paths?\n\n if (currentDirectory && !this.isPathAbsolute(filename)) {\n filename = currentDirectory + filename;\n }\n\n filename = options.ext ? this.tryAppendExtension(filename, options.ext) : filename;\n\n options = options || {};\n\n // sheet may be set to the stylesheet for the initial load or a collection of properties including\n // some context variables for imports\n const hrefParts = this.extractUrlParts(filename, window.location.href);\n const href = hrefParts.url;\n const self = this;\n \n return new Promise((resolve, reject) => {\n if (options.useFileCache && fileCache[href]) {\n try {\n const lessText = fileCache[href];\n return resolve({ contents: lessText, filename: href, webInfo: { lastModified: new Date() }});\n } catch (e) {\n return reject({ filename: href, message: `Error loading file ${href} error was ${e.message}` });\n }\n }\n\n self.doXHR(href, options.mime, function doXHRCallback(data, lastModified) {\n // per file cache\n fileCache[href] = data;\n\n // Use remote copy (re-parse)\n resolve({ contents: data, filename: href, webInfo: { lastModified }});\n }, function doXHRError(status, url) {\n reject({ type: 'File', message: `'${url}' wasn't found (${status})`, href });\n });\n });\n }\n});\n\nexport default (opts, log) => {\n options = opts;\n logger = log;\n return FileManager;\n}\n","import Environment from './environment/environment';\nimport data from './data';\nimport tree from './tree';\nimport AbstractFileManager from './environment/abstract-file-manager';\nimport AbstractPluginLoader from './environment/abstract-plugin-loader';\nimport visitors from './visitors';\nimport Parser from './parser/parser';\nimport functions from './functions';\nimport contexts from './contexts';\nimport LessError from './less-error';\nimport transformTree from './transform-tree';\nimport * as utils from './utils';\nimport PluginManager from './plugin-manager';\nimport logger from './logger';\nimport SourceMapOutput from './source-map-output';\nimport SourceMapBuilder from './source-map-builder';\nimport ParseTree from './parse-tree';\nimport ImportManager from './import-manager';\nimport Parse from './parse';\nimport Render from './render';\n\nexport default function(environment, fileManagers) {\n let sourceMapOutput, sourceMapBuilder, parseTree, importManager;\n\n environment = new Environment(environment, fileManagers);\n sourceMapOutput = SourceMapOutput(environment);\n sourceMapBuilder = SourceMapBuilder(sourceMapOutput, environment);\n parseTree = ParseTree(sourceMapBuilder);\n importManager = ImportManager(environment);\n\n const render = Render(environment, parseTree, importManager);\n const parse = Parse(environment, parseTree, importManager);\n\n const initial = {\n version: [4, 0, 0],\n data,\n tree,\n Environment,\n AbstractFileManager,\n AbstractPluginLoader,\n environment,\n visitors,\n Parser,\n functions: functions(environment),\n contexts,\n SourceMapOutput: sourceMapOutput,\n SourceMapBuilder: sourceMapBuilder,\n ParseTree: parseTree,\n ImportManager: importManager,\n render,\n parse,\n LessError,\n transformTree,\n utils,\n PluginManager,\n logger\n };\n\n // Create a public API\n\n const ctor = function(t) {\n return function() {\n const obj = Object.create(t.prototype);\n t.apply(obj, Array.prototype.slice.call(arguments, 0));\n return obj;\n };\n };\n let t;\n const api = Object.create(initial);\n for (const n in initial.tree) {\n /* eslint guard-for-in: 0 */\n t = initial.tree[n];\n if (typeof t === 'function') {\n api[n.toLowerCase()] = ctor(t);\n }\n else {\n api[n] = Object.create(null);\n for (const o in t) {\n /* eslint guard-for-in: 0 */\n api[n][o.toLowerCase()] = ctor(t[o]);\n }\n }\n }\n\n /**\n * Some of the functions assume a `this` context of the API object,\n * which causes it to fail when wrapped for ES6 imports.\n * \n * An assumed `this` should be removed in the future.\n */\n initial.parse = initial.parse.bind(api);\n initial.render = initial.render.bind(api);\n\n return api;\n};\n","import LessError from './less-error';\nimport transformTree from './transform-tree';\nimport logger from './logger';\n\nexport default function(SourceMapBuilder) {\n class ParseTree {\n constructor(root, imports) {\n this.root = root;\n this.imports = imports;\n }\n\n toCSS(options) {\n let evaldRoot;\n const result = {};\n let sourceMapBuilder;\n try {\n evaldRoot = transformTree(this.root, options);\n } catch (e) {\n throw new LessError(e, this.imports);\n }\n\n try {\n const compress = Boolean(options.compress);\n if (compress) {\n logger.warn('The compress option has been deprecated. ' + \n 'We recommend you use a dedicated css minifier, for instance see less-plugin-clean-css.');\n }\n\n const toCSSOptions = {\n compress,\n dumpLineNumbers: options.dumpLineNumbers,\n strictUnits: Boolean(options.strictUnits),\n numPrecision: 8};\n\n if (options.sourceMap) {\n sourceMapBuilder = new SourceMapBuilder(options.sourceMap);\n result.css = sourceMapBuilder.toCSS(evaldRoot, toCSSOptions, this.imports);\n } else {\n result.css = evaldRoot.toCSS(toCSSOptions);\n }\n } catch (e) {\n throw new LessError(e, this.imports);\n }\n\n if (options.pluginManager) {\n const postProcessors = options.pluginManager.getPostProcessors();\n for (let i = 0; i < postProcessors.length; i++) {\n result.css = postProcessors[i].process(result.css, { sourceMap: sourceMapBuilder, options, imports: this.imports });\n }\n }\n if (options.sourceMap) {\n result.map = sourceMapBuilder.getExternalSourceMap();\n }\n\n result.imports = [];\n for (const file in this.imports.files) {\n if (this.imports.files.hasOwnProperty(file) && file !== this.imports.rootFilename) {\n result.imports.push(file);\n }\n }\n return result;\n }\n }\n\n return ParseTree;\n};\n","export default function (SourceMapOutput, environment) {\n class SourceMapBuilder {\n constructor(options) {\n this.options = options;\n }\n\n toCSS(rootNode, options, imports) {\n const sourceMapOutput = new SourceMapOutput(\n {\n contentsIgnoredCharsMap: imports.contentsIgnoredChars,\n rootNode,\n contentsMap: imports.contents,\n sourceMapFilename: this.options.sourceMapFilename,\n sourceMapURL: this.options.sourceMapURL,\n outputFilename: this.options.sourceMapOutputFilename,\n sourceMapBasepath: this.options.sourceMapBasepath,\n sourceMapRootpath: this.options.sourceMapRootpath,\n outputSourceFiles: this.options.outputSourceFiles,\n sourceMapGenerator: this.options.sourceMapGenerator,\n sourceMapFileInline: this.options.sourceMapFileInline, \n disableSourcemapAnnotation: this.options.disableSourcemapAnnotation\n });\n\n const css = sourceMapOutput.toCSS(options);\n this.sourceMap = sourceMapOutput.sourceMap;\n this.sourceMapURL = sourceMapOutput.sourceMapURL;\n if (this.options.sourceMapInputFilename) {\n this.sourceMapInputFilename = sourceMapOutput.normalizeFilename(this.options.sourceMapInputFilename);\n }\n if (this.options.sourceMapBasepath !== undefined && this.sourceMapURL !== undefined) {\n this.sourceMapURL = sourceMapOutput.removeBasepath(this.sourceMapURL);\n }\n return css + this.getCSSAppendage();\n }\n\n getCSSAppendage() {\n\n let sourceMapURL = this.sourceMapURL;\n if (this.options.sourceMapFileInline) {\n if (this.sourceMap === undefined) {\n return '';\n }\n sourceMapURL = `data:application/json;base64,${environment.encodeBase64(this.sourceMap)}`;\n }\n\n if (this.options.disableSourcemapAnnotation) {\n return '';\n }\n\n if (sourceMapURL) {\n return `/*# sourceMappingURL=${sourceMapURL} */`;\n }\n return '';\n }\n\n getExternalSourceMap() {\n return this.sourceMap;\n }\n\n setExternalSourceMap(sourceMap) {\n this.sourceMap = sourceMap;\n }\n\n isInline() {\n return this.options.sourceMapFileInline;\n }\n\n getSourceMapURL() {\n return this.sourceMapURL;\n }\n\n getOutputFilename() {\n return this.options.sourceMapOutputFilename;\n }\n\n getInputFilename() {\n return this.sourceMapInputFilename;\n }\n }\n\n return SourceMapBuilder;\n};\n","export default function (environment) {\n class SourceMapOutput {\n constructor(options) {\n this._css = [];\n this._rootNode = options.rootNode;\n this._contentsMap = options.contentsMap;\n this._contentsIgnoredCharsMap = options.contentsIgnoredCharsMap;\n if (options.sourceMapFilename) {\n this._sourceMapFilename = options.sourceMapFilename.replace(/\\\\/g, '/');\n }\n this._outputFilename = options.outputFilename;\n this.sourceMapURL = options.sourceMapURL;\n if (options.sourceMapBasepath) {\n this._sourceMapBasepath = options.sourceMapBasepath.replace(/\\\\/g, '/');\n }\n if (options.sourceMapRootpath) {\n this._sourceMapRootpath = options.sourceMapRootpath.replace(/\\\\/g, '/');\n if (this._sourceMapRootpath.charAt(this._sourceMapRootpath.length - 1) !== '/') {\n this._sourceMapRootpath += '/';\n }\n } else {\n this._sourceMapRootpath = '';\n }\n this._outputSourceFiles = options.outputSourceFiles;\n this._sourceMapGeneratorConstructor = environment.getSourceMapGenerator();\n\n this._lineNumber = 0;\n this._column = 0;\n }\n\n removeBasepath(path) {\n if (this._sourceMapBasepath && path.indexOf(this._sourceMapBasepath) === 0) {\n path = path.substring(this._sourceMapBasepath.length);\n if (path.charAt(0) === '\\\\' || path.charAt(0) === '/') {\n path = path.substring(1);\n }\n }\n\n return path;\n }\n\n normalizeFilename(filename) {\n filename = filename.replace(/\\\\/g, '/');\n filename = this.removeBasepath(filename);\n return (this._sourceMapRootpath || '') + filename;\n }\n\n add(chunk, fileInfo, index, mapLines) {\n\n // ignore adding empty strings\n if (!chunk) {\n return;\n }\n\n let lines, sourceLines, columns, sourceColumns, i;\n\n if (fileInfo && fileInfo.filename) {\n let inputSource = this._contentsMap[fileInfo.filename];\n\n // remove vars/banner added to the top of the file\n if (this._contentsIgnoredCharsMap[fileInfo.filename]) {\n // adjust the index\n index -= this._contentsIgnoredCharsMap[fileInfo.filename];\n if (index < 0) { index = 0; }\n // adjust the source\n inputSource = inputSource.slice(this._contentsIgnoredCharsMap[fileInfo.filename]);\n }\n\n /** \n * ignore empty content, or failsafe\n * if contents map is incorrect\n */\n if (inputSource === undefined) {\n this._css.push(chunk);\n return;\n }\n\n inputSource = inputSource.substring(0, index);\n sourceLines = inputSource.split('\\n');\n sourceColumns = sourceLines[sourceLines.length - 1];\n }\n\n lines = chunk.split('\\n');\n columns = lines[lines.length - 1];\n\n if (fileInfo && fileInfo.filename) {\n if (!mapLines) {\n this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + 1, column: this._column},\n original: { line: sourceLines.length, column: sourceColumns.length},\n source: this.normalizeFilename(fileInfo.filename)});\n } else {\n for (i = 0; i < lines.length; i++) {\n this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + i + 1, column: i === 0 ? this._column : 0},\n original: { line: sourceLines.length + i, column: i === 0 ? sourceColumns.length : 0},\n source: this.normalizeFilename(fileInfo.filename)});\n }\n }\n }\n\n if (lines.length === 1) {\n this._column += columns.length;\n } else {\n this._lineNumber += lines.length - 1;\n this._column = columns.length;\n }\n\n this._css.push(chunk);\n }\n\n isEmpty() {\n return this._css.length === 0;\n }\n\n toCSS(context) {\n this._sourceMapGenerator = new this._sourceMapGeneratorConstructor({ file: this._outputFilename, sourceRoot: null });\n\n if (this._outputSourceFiles) {\n for (const filename in this._contentsMap) {\n if (this._contentsMap.hasOwnProperty(filename)) {\n let source = this._contentsMap[filename];\n if (this._contentsIgnoredCharsMap[filename]) {\n source = source.slice(this._contentsIgnoredCharsMap[filename]);\n }\n this._sourceMapGenerator.setSourceContent(this.normalizeFilename(filename), source);\n }\n }\n }\n\n this._rootNode.genCSS(context, this);\n\n if (this._css.length > 0) {\n let sourceMapURL;\n const sourceMapContent = JSON.stringify(this._sourceMapGenerator.toJSON());\n\n if (this.sourceMapURL) {\n sourceMapURL = this.sourceMapURL;\n } else if (this._sourceMapFilename) {\n sourceMapURL = this._sourceMapFilename;\n }\n this.sourceMapURL = sourceMapURL;\n\n this.sourceMap = sourceMapContent;\n }\n\n return this._css.join('');\n }\n }\n\n return SourceMapOutput;\n};\n","import contexts from './contexts';\nimport Parser from './parser/parser';\nimport LessError from './less-error';\nimport * as utils from './utils';\nimport logger from './logger';\n\nexport default function(environment) {\n // FileInfo = {\n // 'rewriteUrls' - option - whether to adjust URL's to be relative\n // 'filename' - full resolved filename of current file\n // 'rootpath' - path to append to normal URLs for this node\n // 'currentDirectory' - path to the current file, absolute\n // 'rootFilename' - filename of the base file\n // 'entryPath' - absolute path to the entry file\n // 'reference' - whether the file should not be output and only output parts that are referenced\n\n class ImportManager {\n constructor(less, context, rootFileInfo) {\n this.less = less;\n this.rootFilename = rootFileInfo.filename;\n this.paths = context.paths || []; // Search paths, when importing\n this.contents = {}; // map - filename to contents of all the files\n this.contentsIgnoredChars = {}; // map - filename to lines at the beginning of each file to ignore\n this.mime = context.mime;\n this.error = null;\n this.context = context;\n // Deprecated? Unused outside of here, could be useful.\n this.queue = []; // Files which haven't been imported yet\n this.files = {}; // Holds the imported parse trees.\n }\n\n /**\n * Add an import to be imported\n * @param path - the raw path\n * @param tryAppendExtension - whether to try appending a file extension (.less or .js if the path has no extension)\n * @param currentFileInfo - the current file info (used for instance to work out relative paths)\n * @param importOptions - import options\n * @param callback - callback for when it is imported\n */\n push(path, tryAppendExtension, currentFileInfo, importOptions, callback) {\n const importManager = this, pluginLoader = this.context.pluginManager.Loader;\n\n this.queue.push(path);\n\n const fileParsedFunc = function (e, root, fullPath) {\n importManager.queue.splice(importManager.queue.indexOf(path), 1); // Remove the path from the queue\n\n const importedEqualsRoot = fullPath === importManager.rootFilename;\n if (importOptions.optional && e) {\n callback(null, {rules:[]}, false, null);\n logger.info(`The file ${fullPath} was skipped because it was not found and the import was marked optional.`);\n }\n else {\n // Inline imports aren't cached here.\n // If we start to cache them, please make sure they won't conflict with non-inline imports of the\n // same name as they used to do before this comment and the condition below have been added.\n if (!importManager.files[fullPath] && !importOptions.inline) {\n importManager.files[fullPath] = { root, options: importOptions };\n }\n if (e && !importManager.error) { importManager.error = e; }\n callback(e, root, importedEqualsRoot, fullPath);\n }\n };\n\n const newFileInfo = {\n rewriteUrls: this.context.rewriteUrls,\n entryPath: currentFileInfo.entryPath,\n rootpath: currentFileInfo.rootpath,\n rootFilename: currentFileInfo.rootFilename\n };\n\n const fileManager = environment.getFileManager(path, currentFileInfo.currentDirectory, this.context, environment);\n\n if (!fileManager) {\n fileParsedFunc({ message: `Could not find a file-manager for ${path}` });\n return;\n }\n\n const loadFileCallback = function(loadedFile) {\n let plugin;\n const resolvedFilename = loadedFile.filename;\n const contents = loadedFile.contents.replace(/^\\uFEFF/, '');\n\n // Pass on an updated rootpath if path of imported file is relative and file\n // is in a (sub|sup) directory\n //\n // Examples:\n // - If path of imported file is 'module/nav/nav.less' and rootpath is 'less/',\n // then rootpath should become 'less/module/nav/'\n // - If path of imported file is '../mixins.less' and rootpath is 'less/',\n // then rootpath should become 'less/../'\n newFileInfo.currentDirectory = fileManager.getPath(resolvedFilename);\n if (newFileInfo.rewriteUrls) {\n newFileInfo.rootpath = fileManager.join(\n (importManager.context.rootpath || ''),\n fileManager.pathDiff(newFileInfo.currentDirectory, newFileInfo.entryPath));\n\n if (!fileManager.isPathAbsolute(newFileInfo.rootpath) && fileManager.alwaysMakePathsAbsolute()) {\n newFileInfo.rootpath = fileManager.join(newFileInfo.entryPath, newFileInfo.rootpath);\n }\n }\n newFileInfo.filename = resolvedFilename;\n\n const newEnv = new contexts.Parse(importManager.context);\n\n newEnv.processImports = false;\n importManager.contents[resolvedFilename] = contents;\n\n if (currentFileInfo.reference || importOptions.reference) {\n newFileInfo.reference = true;\n }\n\n if (importOptions.isPlugin) {\n plugin = pluginLoader.evalPlugin(contents, newEnv, importManager, importOptions.pluginArgs, newFileInfo);\n if (plugin instanceof LessError) {\n fileParsedFunc(plugin, null, resolvedFilename);\n }\n else {\n fileParsedFunc(null, plugin, resolvedFilename);\n }\n } else if (importOptions.inline) {\n fileParsedFunc(null, contents, resolvedFilename);\n } else {\n // import (multiple) parse trees apparently get altered and can't be cached.\n // TODO: investigate why this is\n if (importManager.files[resolvedFilename]\n && !importManager.files[resolvedFilename].options.multiple\n && !importOptions.multiple) {\n\n fileParsedFunc(null, importManager.files[resolvedFilename].root, resolvedFilename);\n }\n else {\n new Parser(newEnv, importManager, newFileInfo).parse(contents, function (e, root) {\n fileParsedFunc(e, root, resolvedFilename);\n });\n }\n }\n };\n let loadedFile;\n let promise;\n const context = utils.clone(this.context);\n\n if (tryAppendExtension) {\n context.ext = importOptions.isPlugin ? '.js' : '.less';\n }\n\n if (importOptions.isPlugin) {\n context.mime = 'application/javascript';\n\n if (context.syncImport) {\n loadedFile = pluginLoader.loadPluginSync(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n } else {\n promise = pluginLoader.loadPlugin(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n }\n }\n else {\n if (context.syncImport) {\n loadedFile = fileManager.loadFileSync(path, currentFileInfo.currentDirectory, context, environment);\n } else {\n promise = fileManager.loadFile(path, currentFileInfo.currentDirectory, context, environment,\n (err, loadedFile) => {\n if (err) {\n fileParsedFunc(err);\n } else {\n loadFileCallback(loadedFile);\n }\n });\n }\n }\n if (loadedFile) {\n if (!loadedFile.filename) {\n fileParsedFunc(loadedFile);\n } else {\n loadFileCallback(loadedFile);\n }\n } else if (promise) {\n promise.then(loadFileCallback, fileParsedFunc);\n }\n }\n }\n\n return ImportManager;\n};\n","import * as utils from './utils';\n\nexport default function(environment, ParseTree, ImportManager) {\n const render = function (input, options, callback) {\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(this.options, {});\n }\n else {\n options = utils.copyOptions(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n return new Promise(function (resolve, reject) {\n render.call(self, input, options, function(err, output) {\n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n this.parse(input, options, function(err, root, imports, options) {\n if (err) { return callback(err); }\n\n let result;\n try {\n const parseTree = new ParseTree(root, imports);\n result = parseTree.toCSS(options);\n }\n catch (err) { return callback(err); }\n\n callback(null, result);\n });\n }\n };\n\n return render;\n};\n","import contexts from './contexts';\nimport Parser from './parser/parser';\nimport PluginManager from './plugin-manager';\nimport LessError from './less-error';\nimport * as utils from './utils';\n\nexport default function(environment, ParseTree, ImportManager) {\n const parse = function (input, options, callback) {\n\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(this.options, {});\n }\n else {\n options = utils.copyOptions(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n return new Promise(function (resolve, reject) {\n parse.call(self, input, options, function(err, output) {\n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n let context;\n let rootFileInfo;\n const pluginManager = new PluginManager(this, !options.reUsePluginManager);\n\n options.pluginManager = pluginManager;\n\n context = new contexts.Parse(options);\n\n if (options.rootFileInfo) {\n rootFileInfo = options.rootFileInfo;\n } else {\n const filename = options.filename || 'input';\n const entryPath = filename.replace(/[^\\/\\\\]*$/, '');\n rootFileInfo = {\n filename,\n rewriteUrls: context.rewriteUrls,\n rootpath: context.rootpath || '',\n currentDirectory: entryPath,\n entryPath,\n rootFilename: filename\n };\n // add in a missing trailing slash\n if (rootFileInfo.rootpath && rootFileInfo.rootpath.slice(-1) !== '/') {\n rootFileInfo.rootpath += '/';\n }\n }\n\n const imports = new ImportManager(this, context, rootFileInfo);\n this.importManager = imports;\n\n // TODO: allow the plugins to be just a list of paths or names\n // Do an async plugin queue like lessc\n\n if (options.plugins) {\n options.plugins.forEach(function(plugin) {\n let evalResult, contents;\n if (plugin.fileContent) {\n contents = plugin.fileContent.replace(/^\\uFEFF/, '');\n evalResult = pluginManager.Loader.evalPlugin(contents, context, imports, plugin.options, plugin.filename);\n if (evalResult instanceof LessError) {\n return callback(evalResult);\n }\n }\n else {\n pluginManager.addPlugin(plugin);\n }\n });\n }\n\n new Parser(context, imports, rootFileInfo)\n .parse(input, function (e, root) {\n if (e) { return callback(e); }\n callback(null, root, imports, options);\n }, options);\n }\n };\n return parse;\n};\n","// TODO: Add tests for browser @plugin\n/* global window */\n\nimport AbstractPluginLoader from '../less/environment/abstract-plugin-loader.js';\n\n/**\n * Browser Plugin Loader\n */\nconst PluginLoader = function(less) {\n this.less = less;\n // Should we shim this.require for browser? Probably not?\n};\n\nPluginLoader.prototype = Object.assign(new AbstractPluginLoader(), {\n loadPlugin(filename, basePath, context, environment, fileManager) {\n return new Promise((fulfill, reject) => {\n fileManager.loadFile(filename, basePath, context, environment)\n .then(fulfill).catch(reject);\n });\n }\n});\n\nexport default PluginLoader;\n\n","import * as utils from './utils';\nimport browser from './browser';\n\nexport default (window, less, options) => {\n\n function errorHTML(e, rootHref) {\n const id = `less-error-message:${utils.extractId(rootHref || '')}`;\n const template = '
  • {content}
  • ';\n const elem = window.document.createElement('div');\n let timer;\n let content;\n const errors = [];\n const filename = e.filename || rootHref;\n const filenameNoPath = filename.match(/([^\\/]+(\\?.*)?)$/)[1];\n\n elem.id = id;\n elem.className = 'less-error-message';\n\n content = `

    ${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'}` + \n `

    in ${filenameNoPath} `;\n\n const errorline = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\{content\\}/, e.extract[i]));\n }\n };\n\n if (e.line) {\n errorline(e, 0, '');\n errorline(e, 1, 'line');\n errorline(e, 2, '');\n content += `on line ${e.line}, column ${e.column + 1}:

      ${errors.join('')}
    `;\n }\n if (e.stack && (e.extract || options.logLevel >= 4)) {\n content += `
    Stack Trace
    ${e.stack.split('\\n').slice(1).join('
    ')}`;\n }\n elem.innerHTML = content;\n\n // CSS for error messages\n browser.createCSS(window.document, [\n '.less-error-message ul, .less-error-message li {',\n 'list-style-type: none;',\n 'margin-right: 15px;',\n 'padding: 4px 0;',\n 'margin: 0;',\n '}',\n '.less-error-message label {',\n 'font-size: 12px;',\n 'margin-right: 15px;',\n 'padding: 4px 0;',\n 'color: #cc7777;',\n '}',\n '.less-error-message pre {',\n 'color: #dd6666;',\n 'padding: 4px 0;',\n 'margin: 0;',\n 'display: inline-block;',\n '}',\n '.less-error-message pre.line {',\n 'color: #ff0000;',\n '}',\n '.less-error-message h3 {',\n 'font-size: 20px;',\n 'font-weight: bold;',\n 'padding: 15px 0 5px 0;',\n 'margin: 0;',\n '}',\n '.less-error-message a {',\n 'color: #10a',\n '}',\n '.less-error-message .error {',\n 'color: red;',\n 'font-weight: bold;',\n 'padding-bottom: 2px;',\n 'border-bottom: 1px dashed red;',\n '}'\n ].join('\\n'), { title: 'error-message' });\n\n elem.style.cssText = [\n 'font-family: Arial, sans-serif',\n 'border: 1px solid #e00',\n 'background-color: #eee',\n 'border-radius: 5px',\n '-webkit-border-radius: 5px',\n '-moz-border-radius: 5px',\n 'color: #e00',\n 'padding: 15px',\n 'margin-bottom: 15px'\n ].join(';');\n\n if (options.env === 'development') {\n timer = setInterval(() => {\n const document = window.document;\n const body = document.body;\n if (body) {\n if (document.getElementById(id)) {\n body.replaceChild(elem, document.getElementById(id));\n } else {\n body.insertBefore(elem, body.firstChild);\n }\n clearInterval(timer);\n }\n }, 10);\n }\n }\n\n function removeErrorHTML(path) {\n const node = window.document.getElementById(`less-error-message:${utils.extractId(path)}`);\n if (node) {\n node.parentNode.removeChild(node);\n }\n }\n\n function removeErrorConsole(path) {\n // no action\n }\n\n function removeError(path) {\n if (!options.errorReporting || options.errorReporting === 'html') {\n removeErrorHTML(path);\n } else if (options.errorReporting === 'console') {\n removeErrorConsole(path);\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('remove', path);\n }\n }\n\n function errorConsole(e, rootHref) {\n const template = '{line} {content}';\n const filename = e.filename || rootHref;\n const errors = [];\n let content = `${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'} in ${filename}`;\n\n const errorline = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\{content\\}/, e.extract[i]));\n }\n };\n\n if (e.line) {\n errorline(e, 0, '');\n errorline(e, 1, 'line');\n errorline(e, 2, '');\n content += ` on line ${e.line}, column ${e.column + 1}:\\n${errors.join('\\n')}`;\n }\n if (e.stack && (e.extract || options.logLevel >= 4)) {\n content += `\\nStack Trace\\n${e.stack}`;\n }\n less.logger.error(content);\n }\n\n function error(e, rootHref) {\n if (!options.errorReporting || options.errorReporting === 'html') {\n errorHTML(e, rootHref);\n } else if (options.errorReporting === 'console') {\n errorConsole(e, rootHref);\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('add', e, rootHref);\n }\n }\n\n return {\n add: error,\n remove: removeError\n };\n};\n","/**\n * Kicks off less and compiles any stylesheets\n * used in the browser distributed version of less\n * to kick-start less using the browser api\n */\n/* global window, document */\n\nimport defaultOptions from '../less/default-options';\nimport addDefaultOptions from './add-default-options';\nimport root from './index';\n\nconst options = defaultOptions();\n\nif (window.less) {\n for (const key in window.less) {\n if (window.less.hasOwnProperty(key)) {\n options[key] = window.less[key];\n }\n }\n}\naddDefaultOptions(window, options);\n\noptions.plugins = options.plugins || [];\n\nif (window.LESS_PLUGINS) {\n options.plugins = options.plugins.concat(window.LESS_PLUGINS);\n}\n\nconst less = root(window, options);\nexport default less;\n\nwindow.less = less;\n\nlet css;\nlet head;\nlet style;\n\n// Always restore page visibility\nfunction resolveOrReject(data) {\n if (data.filename) {\n console.warn(data);\n }\n if (!options.async) {\n head.removeChild(style);\n }\n}\n\nif (options.onReady) {\n if (/!watch/.test(window.location.hash)) {\n less.watch();\n }\n // Simulate synchronous stylesheet loading by hiding page rendering\n if (!options.async) {\n css = 'body { display: none !important }';\n head = document.head || document.getElementsByTagName('head')[0];\n style = document.createElement('style');\n\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n\n head.appendChild(style);\n }\n less.registerStylesheetsImmediately();\n less.pageLoadFinished = less.refresh(less.env === 'development').then(resolveOrReject, resolveOrReject);\n}\n","// Export a new default each time\nexport default function() {\n return {\n /* Inline Javascript - @plugin still allowed */\n javascriptEnabled: false,\n\n /* Outputs a makefile import dependency list to stdout. */\n depends: false,\n\n /* (DEPRECATED) Compress using less built-in compression. \n * This does an okay job but does not utilise all the tricks of \n * dedicated css compression. */\n compress: false,\n\n /* Runs the less parser and just reports errors without any output. */\n lint: false,\n\n /* Sets available include paths.\n * If the file in an @import rule does not exist at that exact location, \n * less will look for it at the location(s) passed to this option. \n * You might use this for instance to specify a path to a library which \n * you want to be referenced simply and relatively in the less files. */\n paths: [],\n\n /* color output in the terminal */\n color: true,\n\n /* The strictImports controls whether the compiler will allow an @import inside of either \n * @media blocks or (a later addition) other selector blocks.\n * See: https://github.com/less/less.js/issues/656 */\n strictImports: false,\n\n /* Allow Imports from Insecure HTTPS Hosts */\n insecure: false,\n\n /* Allows you to add a path to every generated import and url in your css. \n * This does not affect less import statements that are processed, just ones \n * that are left in the output css. */\n rootpath: '',\n\n /* By default URLs are kept as-is, so if you import a file in a sub-directory \n * that references an image, exactly the same URL will be output in the css. \n * This option allows you to re-write URL's in imported files so that the \n * URL is always relative to the base imported file */\n rewriteUrls: false,\n\n /* How to process math \n * 0 always - eagerly try to solve all operations\n * 1 parens-division - require parens for division \"/\"\n * 2 parens | strict - require parens for all operations\n * 3 strict-legacy - legacy strict behavior (super-strict)\n */\n math: 1,\n\n /* Without this option, less attempts to guess at the output unit when it does maths. */\n strictUnits: false,\n\n /* Effectively the declaration is put at the top of your base Less file, \n * meaning it can be used but it also can be overridden if this variable \n * is defined in the file. */\n globalVars: null,\n\n /* As opposed to the global variable option, this puts the declaration at the\n * end of your base file, meaning it will override anything defined in your Less file. */\n modifyVars: null,\n\n /* This option allows you to specify a argument to go on to every URL. */\n urlArgs: ''\n }\n};","import {addDataAttr} from './utils';\nimport browser from './browser';\n\nexport default (window, options) => {\n\n // use options from the current script tag data attribues\n addDataAttr(options, browser.currentScript(window));\n\n if (options.isFileProtocol === undefined) {\n options.isFileProtocol = /^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(window.location.protocol);\n }\n\n // Load styles asynchronously (default: false)\n //\n // This is set to `false` by default, so that the body\n // doesn't start loading before the stylesheets are parsed.\n // Setting this to `true` can result in flickering.\n //\n options.async = options.async || false;\n options.fileAsync = options.fileAsync || false;\n\n // Interval between watch polls\n options.poll = options.poll || (options.isFileProtocol ? 1000 : 1500);\n\n options.env = options.env || (window.location.hostname == '127.0.0.1' ||\n window.location.hostname == '0.0.0.0' ||\n window.location.hostname == 'localhost' ||\n (window.location.port &&\n window.location.port.length > 0) ||\n options.isFileProtocol ? 'development'\n : 'production');\n\n const dumpLineNumbers = /!dumpLineNumbers:(comments|mediaquery|all)/.exec(window.location.hash);\n if (dumpLineNumbers) {\n options.dumpLineNumbers = dumpLineNumbers[1];\n }\n\n if (options.useFileCache === undefined) {\n options.useFileCache = true;\n }\n\n if (options.onReady === undefined) {\n options.onReady = true;\n }\n\n if (options.relativeUrls) {\n options.rewriteUrls = 'all';\n }\n};\n","//\n// index.js\n// Should expose the additional browser functions on to the less object\n//\nimport {addDataAttr} from './utils';\nimport lessRoot from '../less';\nimport browser from './browser';\nimport FM from './file-manager';\nimport PluginLoader from './plugin-loader';\nimport LogListener from './log-listener';\nimport ErrorReporting from './error-reporting';\nimport Cache from './cache';\nimport ImageSize from './image-size';\n\nexport default (window, options) => {\n const document = window.document;\n const less = lessRoot();\n\n less.options = options;\n const environment = less.environment;\n const FileManager = FM(options, less.logger);\n const fileManager = new FileManager();\n environment.addFileManager(fileManager);\n less.FileManager = FileManager;\n less.PluginLoader = PluginLoader;\n\n LogListener(less, options);\n const errors = ErrorReporting(window, less, options);\n const cache = less.cache = options.cache || Cache(window, options, less.logger);\n ImageSize(less.environment);\n\n // Setup user functions - Deprecate?\n if (options.functions) {\n less.functions.functionRegistry.addMultiple(options.functions);\n }\n\n const typePattern = /^text\\/(x-)?less$/;\n\n function clone(obj) {\n const cloned = {};\n for (const prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n cloned[prop] = obj[prop];\n }\n }\n return cloned;\n }\n\n // only really needed for phantom\n function bind(func, thisArg) {\n const curryArgs = Array.prototype.slice.call(arguments, 2);\n return function() {\n const args = curryArgs.concat(Array.prototype.slice.call(arguments, 0));\n return func.apply(thisArg, args);\n };\n }\n\n function loadStyles(modifyVars) {\n const styles = document.getElementsByTagName('style');\n let style;\n\n for (let i = 0; i < styles.length; i++) {\n style = styles[i];\n if (style.type.match(typePattern)) {\n const instanceOptions = clone(options);\n instanceOptions.modifyVars = modifyVars;\n const lessText = style.innerHTML || '';\n instanceOptions.filename = document.location.href.replace(/#.*$/, '');\n\n /* jshint loopfunc:true */\n // use closure to store current style\n less.render(lessText, instanceOptions,\n bind((style, e, result) => {\n if (e) {\n errors.add(e, 'inline');\n } else {\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = result.css;\n } else {\n style.innerHTML = result.css;\n }\n }\n }, null, style));\n }\n }\n }\n\n function loadStyleSheet(sheet, callback, reload, remaining, modifyVars) {\n\n const instanceOptions = clone(options);\n addDataAttr(instanceOptions, sheet);\n instanceOptions.mime = sheet.type;\n\n if (modifyVars) {\n instanceOptions.modifyVars = modifyVars;\n }\n\n function loadInitialFileCallback(loadedFile) {\n const data = loadedFile.contents;\n const path = loadedFile.filename;\n const webInfo = loadedFile.webInfo;\n\n const newFileInfo = {\n currentDirectory: fileManager.getPath(path),\n filename: path,\n rootFilename: path,\n rewriteUrls: instanceOptions.rewriteUrls\n };\n\n newFileInfo.entryPath = newFileInfo.currentDirectory;\n newFileInfo.rootpath = instanceOptions.rootpath || newFileInfo.currentDirectory;\n\n if (webInfo) {\n webInfo.remaining = remaining;\n\n const css = cache.getCSS(path, webInfo, instanceOptions.modifyVars);\n if (!reload && css) {\n webInfo.local = true;\n callback(null, css, data, sheet, webInfo, path);\n return;\n }\n\n }\n\n // TODO add tests around how this behaves when reloading\n errors.remove(path);\n\n instanceOptions.rootFileInfo = newFileInfo;\n less.render(data, instanceOptions, (e, result) => {\n if (e) {\n e.href = path;\n callback(e);\n } else {\n cache.setCSS(sheet.href, webInfo.lastModified, instanceOptions.modifyVars, result.css);\n callback(null, result.css, data, sheet, webInfo, path);\n }\n });\n }\n\n fileManager.loadFile(sheet.href, null, instanceOptions, environment)\n .then(loadedFile => {\n loadInitialFileCallback(loadedFile);\n }).catch(err => {\n console.log(err);\n callback(err);\n });\n\n }\n\n function loadStyleSheets(callback, reload, modifyVars) {\n for (let i = 0; i < less.sheets.length; i++) {\n loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1), modifyVars);\n }\n }\n\n function initRunningMode() {\n if (less.env === 'development') {\n less.watchTimer = setInterval(() => {\n if (less.watchMode) {\n fileManager.clearFileCache();\n loadStyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n } else if (css) {\n browser.createCSS(window.document, css, sheet);\n }\n });\n }\n }, options.poll);\n }\n }\n\n //\n // Watch mode\n //\n less.watch = function () {\n if (!less.watchMode ) {\n less.env = 'development';\n initRunningMode();\n }\n this.watchMode = true;\n return true;\n };\n\n less.unwatch = function () {clearInterval(less.watchTimer); this.watchMode = false; return false; };\n\n //\n // Synchronously get all tags with the 'rel' attribute set to\n // \"stylesheet/less\".\n //\n less.registerStylesheetsImmediately = () => {\n const links = document.getElementsByTagName('link');\n less.sheets = [];\n\n for (let i = 0; i < links.length; i++) {\n if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) &&\n (links[i].type.match(typePattern)))) {\n less.sheets.push(links[i]);\n }\n }\n };\n\n //\n // Asynchronously get all tags with the 'rel' attribute set to\n // \"stylesheet/less\", returning a Promise.\n //\n less.registerStylesheets = () => new Promise((resolve, reject) => {\n less.registerStylesheetsImmediately();\n resolve();\n });\n\n //\n // With this function, it's possible to alter variables and re-render\n // CSS without reloading less-files\n //\n less.modifyVars = record => less.refresh(true, record, false);\n\n less.refresh = (reload, modifyVars, clearFileCache) => {\n if ((reload || clearFileCache) && clearFileCache !== false) {\n fileManager.clearFileCache();\n }\n return new Promise((resolve, reject) => {\n let startTime;\n let endTime;\n let totalMilliseconds;\n let remainingSheets;\n startTime = endTime = new Date();\n\n // Set counter for remaining unprocessed sheets\n remainingSheets = less.sheets.length;\n\n if (remainingSheets === 0) {\n\n endTime = new Date();\n totalMilliseconds = endTime - startTime;\n less.logger.info('Less has finished and no sheets were loaded.');\n resolve({\n startTime,\n endTime,\n totalMilliseconds,\n sheets: less.sheets.length\n });\n\n } else {\n // Relies on less.sheets array, callback seems to be guaranteed to be called for every element of the array\n loadStyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n reject(e);\n return;\n }\n if (webInfo.local) {\n less.logger.info(`Loading ${sheet.href} from cache.`);\n } else {\n less.logger.info(`Rendered ${sheet.href} successfully.`);\n }\n browser.createCSS(window.document, css, sheet);\n less.logger.info(`CSS for ${sheet.href} generated in ${new Date() - endTime}ms`);\n\n // Count completed sheet\n remainingSheets--;\n\n // Check if the last remaining sheet was processed and then call the promise\n if (remainingSheets === 0) {\n totalMilliseconds = new Date() - startTime;\n less.logger.info(`Less has finished. CSS generated in ${totalMilliseconds}ms`);\n resolve({\n startTime,\n endTime,\n totalMilliseconds,\n sheets: less.sheets.length\n });\n }\n endTime = new Date();\n }, reload, modifyVars);\n }\n\n loadStyles(modifyVars);\n });\n };\n\n less.refreshStyles = loadStyles;\n return less;\n};\n","export default (less, options) => {\n const logLevel_debug = 4;\n const logLevel_info = 3;\n const logLevel_warn = 2;\n const logLevel_error = 1;\n\n // The amount of logging in the javascript console.\n // 3 - Debug, information and errors\n // 2 - Information and errors\n // 1 - Errors\n // 0 - None\n // Defaults to 2\n options.logLevel = typeof options.logLevel !== 'undefined' ? options.logLevel : (options.env === 'development' ? logLevel_info : logLevel_error);\n\n if (!options.loggers) {\n options.loggers = [{\n debug: function(msg) {\n if (options.logLevel >= logLevel_debug) {\n console.log(msg);\n }\n },\n info: function(msg) {\n if (options.logLevel >= logLevel_info) {\n console.log(msg);\n }\n },\n warn: function(msg) {\n if (options.logLevel >= logLevel_warn) {\n console.warn(msg);\n }\n },\n error: function(msg) {\n if (options.logLevel >= logLevel_error) {\n console.error(msg);\n }\n }\n }];\n }\n for (let i = 0; i < options.loggers.length; i++) {\n less.logger.addListener(options.loggers[i]);\n }\n};\n","// Cache system is a bit outdated and could do with work\n\nexport default (window, options, logger) => {\n let cache = null;\n if (options.env !== 'development') {\n try {\n cache = (typeof window.localStorage === 'undefined') ? null : window.localStorage;\n } catch (_) {}\n }\n return {\n setCSS: function(path, lastModified, modifyVars, styles) {\n if (cache) {\n logger.info(`saving ${path} to cache.`);\n try {\n cache.setItem(path, styles);\n cache.setItem(`${path}:timestamp`, lastModified);\n if (modifyVars) {\n cache.setItem(`${path}:vars`, JSON.stringify(modifyVars));\n }\n } catch (e) {\n // TODO - could do with adding more robust error handling\n logger.error(`failed to save \"${path}\" to local storage for caching.`);\n }\n }\n },\n getCSS: function(path, webInfo, modifyVars) {\n const css = cache && cache.getItem(path);\n const timestamp = cache && cache.getItem(`${path}:timestamp`);\n let vars = cache && cache.getItem(`${path}:vars`);\n\n modifyVars = modifyVars || {};\n vars = vars || \"{}\"; // if not set, treat as the JSON representation of an empty object\n\n if (timestamp && webInfo.lastModified &&\n (new Date(webInfo.lastModified).valueOf() ===\n new Date(timestamp).valueOf()) &&\n JSON.stringify(modifyVars) === vars) {\n // Use local copy\n return css;\n }\n }\n };\n};\n","\nimport functionRegistry from './../less/functions/function-registry';\n\nexport default () => {\n function imageSize() {\n throw {\n type: 'Runtime',\n message: 'Image size functions are not supported in browser version of less'\n };\n }\n\n const imageFunctions = {\n 'image-size': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n },\n 'image-width': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n },\n 'image-height': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n }\n };\n\n functionRegistry.addMultiple(imageFunctions);\n};\n"],"names":["extractId","href","replace","addDataAttr","options","tag","opt","dataset","hasOwnProperty","JSON","parse","_","document","styles","sheet","id","title","utils.extractId","oldStyleNode","getElementById","keepOldStyleNode","styleNode","createElement","setAttribute","media","styleSheet","appendChild","createTextNode","childNodes","length","firstChild","nodeValue","head","getElementsByTagName","nextEl","nextSibling","parentNode","insertBefore","removeChild","cssText","e","Error","window","scripts","currentScript","error","msg","this","_fireEvent","warn","info","debug","addListener","listener","_listeners","push","removeListener","i","splice","type","logFunction","externalEnvironment","fileManagers","requiredFunctions","functions","concat","propName","environmentFunc","bind","Environment","filename","currentDirectory","environment","isSync","logger","pluginManager","getFileManagers","fileManager","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","darkgrey","darkgreen","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","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","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","m","cm","mm","in","px","pt","pc","duration","s","ms","angle","rad","Math","PI","deg","grad","turn","colors","unitConversions","parent","visibilityBlocks","undefined","nodeVisible","rootNode","parsed","self","Object","defineProperty","get","fileInfo","getIndex","Node","nodes","set","node","Array","isArray","forEach","_index","_fileInfo","context","strs","genCSS","add","chunk","index","isEmpty","join","output","value","visitor","visit","op","a","b","precision","numPrecision","Number","toFixed","compare","Color","rgb","originalForm","match","map","c","parseInt","alpha","split","clamp","v","max","min","toHex","round","toString","prototype","assign","luma","r","g","pow","toCSS","doNotCompress","color","colorFunction","compress","args","fround","indexOf","toHSL","h","l","toRGB","splitcolor","operate","other","_operate","d","toHSV","toARGB","x","fromKeyword","keyword","key","toLowerCase","slice","Paren","eval","_noSpaceCombinators"," ","|","Combinator","emptyOrWhitespace","trim","spaceOrEmpty","Element","combinator","isVariable","currentFileInfo","visibilityInfo","copyVisibilityInfo","setParent","accept","clone","firstSelector","charAt","ALWAYS","PARENS_DIVISION","PARENS","RewriteUrls","getType","payload","call","copy","target","constructor","getPrototypeOf","il","arguments","k","j","jl","__spreadArrays","getOwnPropertyNames","getOwnPropertySymbols","reduce","carry","props","includes","newVal","originalObject","includeNonenumerable","propType","propertyIsEnumerable","enumerable","writable","configurable","assignProp","nonenumerable","getLocation","inputStream","n","line","column","copyArray","arr","obj","cloned","prop","defaults","obj1","obj2","newObj","_defaults","defaults_1","copyOptions","opts","strictMath","math","Constants.Math","relativeUrls","rewriteUrls","Constants.RewriteUrls","flattenArray","result","length_1","anonymousFunc","LessError","fileContentMap","currentFilename","message","stack","input","contents","loc","utils.getLocation","col","callLine","lines","found","func","Function","lineAdjust","callExtract","extract","create","F","stylize","str","errorTxt","substr","Selector","elements","extendList","condition","evaldCondition","getElements","mixinElements_","visitArray","createDerived","newSelector","mediaEmpty","els","parseNode","err","imports","createEmptySelectors","el","sels","olen","len","mixinElements","shift","isJustParentSelector","extend","getIsOutput","Value","Keyword","True","False","Anonymous","mapLines","rulesetLike","allowRoot","isRulesetLike","Boolean","MATH","Declaration","name","important","merge","inline","variable","lastRule","prevMath","evaldValue","mathBypass","evalName","importantScope","importantResult","pop","makeImportant","ctx","lineSeparator","dumpLineNumbers","debugInfo","asComment","asMediaQuery","lineNumber","fileName","filenameWithProtocol","test","Comment","isLineComment","getDebugInfo","isSilent","isCompressed","contexts","copyFromOriginal","original","destination","propertiesToCopy","parseCopyProperties","Parse","paths","evalCopyProperties","isPathRelative","path","isPathLocalRelative","Eval","frames","enterCalc","calcStack","inCalc","exitCalc","inParenthesis","parensStack","outOfParenthesis","mathOn","isMathOn","pathRequiresRewrite","rewritePath","rootpath","newPath","normalizePath","segment","segments","reverse","makeRegistry","base","_data","addMultiple","keys","_this","getLocalFunctions","inherit","defaultFunc","value_","error_","reset","Ruleset","selectors","rules","strictImports","_lookups","_variables","_properties","isRuleset","selCnt","selector","hasVariable","hasOnePassingSelector","toParseSelectors","utils.flattenArray","rule","subRule","utils.copyArray","ruleset","originalRuleset","root","firstRoot","allowImports","functionRegistry","globalFunctionRegistry","ctxFrames","unshift","ctxSelectors","evalImports","rsRules","evalFirst","mediaBlockCount","mediaBlocks","filter","apply","resetCache","bubbleSelectors","importRules","matchArgs","matchCondition","lastSelector","_rulesets","variables","hash","vars","name_1","properties","name_2","decl","parseValue","property","lastDeclaration","toParse","transformDeclaration","nodes_1","rulesets","filtRules","prependRule","find","foundMixins","ruleNodes","tabLevel","sep","tabRuleStr","tabSetStr","charsetNodeIndex","importNodeIndex","isCharset","pathCnt","pathSubCnt","currentLastRule","isVisible","joinSelectors","joinSelector","createParenthesis","elementsToPak","originalElement","replacementParen","insideParent","createSelector","containedElement","element","addReplacementIntoPath","beginningPath","addPath","replacedElement","originalSelector","newSelectorPath","newJoinedSelector","parentEl","restOfPath","addAllReplacementsIntoPath","addPaths","mergeElementsOnToSelectors","sel","deriveSelector","deriveFrom","newPaths","replaceParentSelector","inSelector","currentElements","newSelectors","selectorsMultiplied","maybeSelector","hadParentSelector","nestedSelector","replaced","nestedPaths","replacedNewSelectors","concatenated","AtRule","isRooted","outputRuleset","mediaPathBackup","mediaBlocksBackup","mediaPath","ruleCnt","DetachedRuleset","callEval","Unit","numerator","denominator","backupUnit","sort","strictUnits","returnStr","is","unitString","toUpperCase","isLength","RegExp","isSingular","callback","usedUnits","group","mapUnit","groupName","atomicUnit","cancel","counter","count","Dimension","unit","parseFloat","isNaN","toColor","strValue","String","convertTo","unify","numericCompare","conversions","targetUnit","applyUnit","derivedConversions","Operation","operands","isSpaced","Expression","noSpacing","returnValue","parens","doubleParen","parensInOp","throwAwayComments","functionCaller","evalArgs","commentFilter","item","subNodes","Call","calc","currentMathContext","funcCaller","FunctionCaller","isValid","columnNumber","Variable","evaluating","frame","fun","Property","mergeRules","less","visitors","ToCSSVisitor","_mergeRules","vArr","Attribute","Quoted","content","escaped","quote","variableRegex","propRegex","containsVariables","that","iterativeReplace","regexp","replacementFnc","evaluatedValue","URL","val","isEvald","urlArgs","Media","features","evalTop","evalNested","multiMedia","permute","fragment","rest","Import","css","pathValue","getPath","isPlugin","reference","isVariableImport","evalForImport","evalPath","doEval","blocksVisibility","addVisibilityBlock","registry","skip","importedFilename","newImport","JsEvalNode","evaluateJavaScript","expression","evalContext","javascriptEnabled","jsify","toJS","JavaScript","string","Assignment","Condition","negate","lvalue","rvalue","UnicodeDescriptor","Negative","Extend","option","object_id","next_id","parent_ids","allowBefore","allowAfter","findSelfSelectors","selectorElements","selfElements","selfSelectors","VariableCall","detachedRuleset","NamespaceValue","ruleCall","lookups","substring","Definition","params","variadic","arity","optionalParameters","required","p","evalParams","mixinEnv","evaldArguments","varargs","arg","isNamedFound","argIndex","argsLength","evalCall","_arguments","mixinFrames","allArgsCnt","requiredArgsCnt","MixinCall","mixins","mixin","mixinPath","argValue","f","isRecursive","isOneFound","candidate","defaultResult","noArgumentsFilter","candidates","conditionResult","calcDefGroup","namespace","expand","MixinDefinition","format","newRules","_setVisibilityToReplacement","replacement","AbstractFileManager","lastIndexOf","ext","tryAppendExtension","basePath","laterPath","url","baseUrl","urlDirectories","baseUrlDirectories","urlParts","extractUrlParts","baseUrlParts","diff","hostPart","directories","urlPartsRegex","returner","rawDirectories","rawPath","fileUrl","require","AbstractPluginLoader","pluginOptions","pluginObj","localModule","shortname","FileManager","trySetOptions","use","exports","loader","tree","validatePlugin","minVersion","compareVersion","addPlugin","plugin","setOptions","version","versionToString","aVersion","bVersion","versionString","plugins","printUsage","_visitArgs","visitDeeper","_hasIndexed","_noop","implementation","_implementation","_visitInCache","_visitOutCache","indexNodeTypes","ticker","child","typeIndex","Visitor","nodeTypeIndex","fnName","impl","funcOut","visitArgs","newNode","isReplacing","cnt","nonReplacing","out","evald","flatten","nestedCnt","nestedItem","onSequencerEmpty","variableImports","_onSequencerEmpty","_currentDepth","ImportSequencer","importSequencer","importItem","isReady","tryRun","variableImport","ImportVisitor","importer","finish","_visitor","_importer","_finish","importCount","onceFileDetectionMap","recursionDetector","_sequencer","run","isFinished","visitImport","importNode","inlineCSS","importParent","addVariableImport","processImportNode","evaldImportNode","multiple","importMultiple","tryAppendLessExtension","onImported","sequencedOnImported","addImport","importedAtRoot","fullPath","importVisitor","isOptional","optional","duplicateImport","oldContext","visitDeclaration","declNode","visitDeclarationOut","visitAtRule","atRuleNode","visitAtRuleOut","visitMixinDefinition","mixinDefinitionNode","visitMixinDefinitionOut","visitRuleset","rulesetNode","visitRulesetOut","visitMedia","mediaNode","visitMediaOut","visible","SetTreeVisibilityVisitor","ensureVisibility","ensureInvisibility","allExtendsStack","ExtendFinderVisitor","allExtends","allSelectorsExtendList","extendOnEveryPath","selectorPath","selExtendList","allSelectorsExtend","foundExtends","firstExtendOnThisSelectorPath","ProcessExtendsVisitor","extendFinder","extendIndices","doExtendChaining","newRoot","checkExtendsForNonMatched","indices","hasFoundMatches","extendsList","extendsListTarget","iterationCount","extendIndex","targetExtendIndex","matches","targetExtend","newExtend","extendsToAdd","extendVisitor","findMatch","selfSelector","extendSelector","extendChainCount","selectorOne","selectorTwo","ruleNode","selectorNode","pathIndex","selectorsToAdd","extendedSelectors","haystackSelectorPath","haystackSelectorIndex","hackstackSelector","hackstackElementIndex","haystackElement","targetCombinator","potentialMatch","needleElements","potentialMatches","matched","initialCombinator","isElementValuesEqual","finished","endPathIndex","endPathElementIndex","elementValue1","elementValue2","replacementSelector","matchIndex","firstElement","newElements","currentSelectorPathIndex","currentSelectorPathElementIndex","currentValue","derived","newAllExtends","lastIndex","JoinSelectorVisitor","_context","CSSVisitorUtils","bodyRules","owner","thing","originalRules","containsSilentNonBlockedChild","compiledRulesBody","keepOnlyVisibleChilds","removeVisibilityBlock","hasVisibleSelector","utils","mixinNode","visitExtend","extendNode","visitComment","commentNode","resolveVisibility","visitAtRuleWithBody","visitAtRuleWithoutBody","visitAnonymous","anonymousNode","nodeRules","hasFakeRuleset","getBodyRules","charset","comment","checkValidNodes","isRoot","_compileRulesetPaths","nodeRuleCnt","_removeDuplicateRules","isVisibleRuleset","ruleList","ruleCache","ruleCSS","groups","groupsArr","result_1","space_1","comma_1","MarkVisibleSelectorsVisitor","ExtendVisitor","furthest","furthestPossibleErrorMessage","chunks","current","currentPos","saveStack","parserInput","skipWhitespace","nextChar","oldi","oldj","curr","endIndex","mem","inp","charCodeAt","autoCommentAbsorb","nextNewLine","text","commentStore","nextStarSlash","save","restore","possibleErrorMessage","state","forget","isWhitespace","offset","pos","code","$re","tok","exec","$char","$str","tokLength","$quoted","startChar","currentPosition","$parseUntil","testChar","returnVal","inComment","blockDepth","blockStack","parseGroups","startPos","lastPos","loop","char","expected","peek","peekChar","currentChar","prevChar","getInput","peekNotNumeric","start","chunkInput","failFunction","fail","lastOpening","lastOpeningParen","lastMultiComment","lastMultiCommentEndBrace","chunkerCurrentIndex","currentChunkStartIndex","cc","cc2","level","parenLevel","emitFrom","emitChunk","force","fromCharCode","chunker","end","furthestReachedEnd","furthestChar","Parser","parsers","getParserInput","expect","expectChar","parseList","currentIndex","returnNodes","parser","additionalData","globalVars","modifyVars","ignored","preText","serializeVars","preProcessors","getPreProcessors","process","banner","contentsIgnoredChars","primary","endInfo","processImports","extendRule","definition","declaration","variableCall","entities","atrule","foundSemiColon","mixinLookup","quoted","forceEscaped","isEscaped","customFuncCall","stop","ieAlpha","boolean","if","prevArgs","isSemiColonSeparated","argsComma","argsSemiColon","assignment","literal","dimension","unicodeDescriptor","entity","ch","variableCurly","curly","propertyCurly","colorKeyword","ud","javascript","js","escape","parsedName","inValue","ruleLookups","isRule","getLookup","hasParens","elem","elemIndex","re","isCall","expressionContainsNamed","nameLoop","expressions","hasSep","cond","argInfo","conditions","block","lookupValue","attribute","slashedCombinator","isLess","when","blockRuleset","hasDR","ruleProperty","permissiveValue","anonymousValue","untilTokens","done","testCurrentChar","import","dir","importOptions","mediaFeatures","o","optionName","importOption","mediaFeature","pluginArgs","nonVendorSpecificName","hasIdentifier","hasExpression","hasUnknown","hasBlock","sub","addition","multiplication","operation","operand","needsParens","logical","next","conditionAnd","negatedCondition","parenthesisCondition","atomicCondition","body","me","tryConditionFollowedByParenthesis","delim","simpleProperty","If","trueValue","falseValue","isdefined","colorFunctions","hsla","origColor","hsl","number","rgba","size","m1_1","m2_1","hue","hsv","hsva","vs","floor","perm","saturation","lightness","hsvhue","hsvsaturation","hsvvalue","luminance","saturate","amount","method","desaturate","lighten","darken","fadein","fadeout","fade","spin","mix","color1","color2","weight","w","w1","w2","greyscale","contrast","dark","light","threshold","t","argb","tint","shade","colorBlend","mode","cb","cs","ar","cr","ab","as","colorBlendModeFunctions","multiply","screen","overlay","softlight","sqrt","hardlight","difference","abs","exclusion","average","negation","getItemsFromNode","_SELF","~","_i","expr","values","range","step","from","to","stepValue","list","each","rs","iterator","tryEval","Quote","valueName","keyName","indexName","MathHelper","fn","mathFunctions","ceil","sin","cos","atan","asin","acos","mathHelper","fraction","num","minMax","isMin","currentUnified","referenceUnified","unitStatic","unitClone","order","convert","pi","mod","y","percentage","evaluated","encodeURI","pattern","flags","%","token","encodeURIComponent","isa","Type","isunit","isruleset","iscolor","isnumber","isstring","iskeyword","isurl","ispixel","ispercentage","isem","get-unit","colorBlending","fallback","functionThis","data-uri","mimetypeNode","filePathNode","mimetype","filePath","entryPath","fragmentStart","utils.clone","rawBuffer","getFileManager","useBase64","mimeLookup","charsetLookup","fileSync","loadFileSync","buf","encodeBase64","uri","dataUri","svg-gradient","direction","stops","gradientDirectionSvg","position","positionValue","gradientType","rectangleDimension","renderEnv","directionValue","throwArgumentDescriptor","types","evaldRoot","evalEnv","visitorIterator","preEvalVisitors","first","isPreEvalVisitor","isPreVisitor","pm","postProcessors","installedPlugins","pluginCache","Loader","PluginLoader","PluginManager","install","preProcessor","priority","indexToInsertAt","postProcessor","manager","PluginManagerFactory","newFactory","sourceMapOutput","sourceMapBuilder","parseTree","importManager","SourceMapBuilder","ParseTree","transformTree","toCSSOptions","sourceMap","getPostProcessors","file","getExternalSourceMap","files","rootFilename","SourceMapOutput","contentsIgnoredCharsMap","contentsMap","sourceMapFilename","sourceMapURL","outputFilename","sourceMapOutputFilename","sourceMapBasepath","sourceMapRootpath","outputSourceFiles","sourceMapGenerator","sourceMapFileInline","disableSourcemapAnnotation","sourceMapInputFilename","normalizeFilename","removeBasepath","getCSSAppendage","_css","_rootNode","_contentsMap","_contentsIgnoredCharsMap","_sourceMapFilename","_outputFilename","_sourceMapBasepath","_sourceMapRootpath","_outputSourceFiles","_sourceMapGeneratorConstructor","getSourceMapGenerator","_lineNumber","_column","sourceLines","columns","sourceColumns","inputSource","_sourceMapGenerator","addMapping","generated","source","sourceRoot","setSourceContent","sourceMapContent","stringify","toJSON","rootFileInfo","mime","queue","ImportManager","pluginLoader","fileParsedFunc","importedEqualsRoot","newFileInfo","loadedFile","promise","loadFileCallback","resolvedFilename","pathDiff","isPathAbsolute","alwaysMakePathsAbsolute","newEnv","evalPlugin","syncImport","loadPluginSync","loadPlugin","loadFile","then","render","utils.copyOptions","self_1","Promise","resolve","reject","Render","context_1","pluginManager_1","reUsePluginManager","imports_1","evalResult","fileContent","initial","data","ctor","api","fileCache","doXHR","errback","xhr","XMLHttpRequest","async","isFileProtocol","fileAsync","handleResponse","status","responseText","getResponseHeader","overrideMimeType","open","setRequestHeader","send","onreadystatechange","readyState","supports","clearFileCache","location","useFileCache","lessText","webInfo","lastModified","Date","log","fulfill","catch","rootHref","errorReporting","errors","errorline","classname","logLevel","errorConsole","timer","filenameNoPath","className","innerHTML","browser","style","env","setInterval","replaceChild","clearInterval","errorHTML","remove","removeErrorHTML","depends","lint","insecure","protocol","poll","hostname","port","onReady","addDefaultOptions","LESS_PLUGINS","lessRoot","FM","addFileManager","loggers","console","LogListener","ErrorReporting","cache","localStorage","setCSS","setItem","getCSS","getItem","timestamp","valueOf","Cache","imageSize","imageFunctions","image-size","image-width","image-height","ImageSize","typePattern","thisArg","curryArgs","loadStyles","instanceOptions","loadStyleSheet","reload","remaining","local","loadInitialFileCallback","loadStyleSheets","sheets","watch","watchMode","watchTimer","unwatch","registerStylesheetsImmediately","links","rel","registerStylesheets","record","refresh","startTime","endTime","totalMilliseconds","remainingSheets","refreshStyles","resolveOrReject","pageLoadFinished"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"less.min.js","sources":["../src/less-browser/utils.js","../src/less-browser/browser.js","../src/less/logger.js","../src/less/environment/environment.js","../src/less/data/colors.js","../src/less/data/unit-conversions.js","../src/less/data/index.js","../src/less/tree/node.js","../src/less/tree/color.js","../src/less/tree/paren.js","../src/less/tree/combinator.js","../src/less/tree/element.js","../src/less/constants.js","../node_modules/is-what/dist/index.esm.js","../node_modules/copy-anything/dist/index.esm.js","../src/less/utils.js","../src/less/less-error.js","../src/less/tree/selector.js","../src/less/tree/value.js","../src/less/tree/keyword.js","../src/less/tree/anonymous.js","../src/less/tree/declaration.js","../src/less/tree/debug-info.js","../src/less/tree/comment.js","../src/less/contexts.js","../src/less/functions/function-registry.js","../src/less/functions/default.js","../src/less/tree/ruleset.js","../src/less/tree/atrule.js","../src/less/tree/detached-ruleset.js","../src/less/tree/unit.js","../src/less/tree/dimension.js","../src/less/tree/operation.js","../src/less/tree/expression.js","../src/less/functions/function-caller.js","../node_modules/tslib/tslib.es6.js","../src/less/tree/call.js","../src/less/tree/variable.js","../src/less/tree/property.js","../src/less/tree/attribute.js","../src/less/tree/quoted.js","../src/less/tree/url.js","../src/less/tree/media.js","../src/less/tree/import.js","../src/less/tree/js-eval-node.js","../src/less/tree/javascript.js","../src/less/tree/assignment.js","../src/less/tree/condition.js","../src/less/tree/unicode-descriptor.js","../src/less/tree/negative.js","../src/less/tree/extend.js","../src/less/tree/variable-call.js","../src/less/tree/namespace-value.js","../src/less/tree/mixin-definition.js","../src/less/tree/mixin-call.js","../src/less/tree/index.js","../src/less/environment/abstract-file-manager.js","../src/less/environment/abstract-plugin-loader.js","../src/less/visitors/visitor.js","../src/less/visitors/import-sequencer.js","../src/less/visitors/import-visitor.js","../src/less/visitors/set-tree-visibility-visitor.js","../src/less/visitors/extend-visitor.js","../src/less/visitors/join-selector-visitor.js","../src/less/visitors/to-css-visitor.js","../src/less/visitors/index.js","../src/less/parser/parser-input.js","../src/less/parser/chunker.js","../src/less/parser/parser.js","../src/less/functions/boolean.js","../src/less/functions/color.js","../src/less/functions/color-blending.js","../src/less/functions/list.js","../src/less/functions/math-helper.js","../src/less/functions/math.js","../src/less/functions/number.js","../src/less/functions/string.js","../src/less/functions/types.js","../src/less/functions/index.js","../src/less/functions/data-uri.js","../src/less/functions/svg.js","../src/less/transform-tree.js","../src/less/plugin-manager.js","../node_modules/parse-node-version/index.js","../src/less-browser/file-manager.js","../src/less/index.js","../src/less/parse-tree.js","../src/less/source-map-builder.js","../src/less/source-map-output.js","../src/less/import-manager.js","../src/less/render.js","../src/less/parse.js","../src/less-browser/plugin-loader.js","../src/less-browser/error-reporting.js","../src/less-browser/bootstrap.js","../src/less/default-options.js","../src/less-browser/add-default-options.js","../src/less-browser/index.js","../src/less-browser/log-listener.js","../src/less-browser/cache.js","../src/less-browser/image-size.js"],"sourcesContent":["\nexport function extractId(href) {\n return href.replace(/^[a-z-]+:\\/+?[^\\/]+/, '') // Remove protocol & domain\n .replace(/[\\?\\&]livereload=\\w+/, '') // Remove LiveReload cachebuster\n .replace(/^\\//, '') // Remove root /\n .replace(/\\.[a-zA-Z]+$/, '') // Remove simple extension\n .replace(/[^\\.\\w-]+/g, '-') // Replace illegal characters\n .replace(/\\./g, ':'); // Replace dots with colons(for valid id)\n}\n\nexport function addDataAttr(options, tag) {\n for (const opt in tag.dataset) {\n if (tag.dataset.hasOwnProperty(opt)) {\n if (opt === 'env' || opt === 'dumpLineNumbers' || opt === 'rootpath' || opt === 'errorReporting') {\n options[opt] = tag.dataset[opt];\n } else {\n try {\n options[opt] = JSON.parse(tag.dataset[opt]);\n }\n catch (_) {}\n }\n }\n }\n}\n","import * as utils from './utils';\n\nexport default {\n createCSS: function (document, styles, sheet) {\n // Strip the query-string\n const href = sheet.href || '';\n\n // If there is no title set, use the filename, minus the extension\n const id = `less:${sheet.title || utils.extractId(href)}`;\n\n // If this has already been inserted into the DOM, we may need to replace it\n const oldStyleNode = document.getElementById(id);\n let keepOldStyleNode = false;\n\n // Create a new stylesheet node for insertion or (if necessary) replacement\n const styleNode = document.createElement('style');\n styleNode.setAttribute('type', 'text/css');\n if (sheet.media) {\n styleNode.setAttribute('media', sheet.media);\n }\n styleNode.id = id;\n\n if (!styleNode.styleSheet) {\n styleNode.appendChild(document.createTextNode(styles));\n\n // If new contents match contents of oldStyleNode, don't replace oldStyleNode\n keepOldStyleNode = (oldStyleNode !== null && oldStyleNode.childNodes.length > 0 && styleNode.childNodes.length > 0 &&\n oldStyleNode.firstChild.nodeValue === styleNode.firstChild.nodeValue);\n }\n\n const head = document.getElementsByTagName('head')[0];\n\n // If there is no oldStyleNode, just append; otherwise, only append if we need\n // to replace oldStyleNode with an updated stylesheet\n if (oldStyleNode === null || keepOldStyleNode === false) {\n const nextEl = sheet && sheet.nextSibling || null;\n if (nextEl) {\n nextEl.parentNode.insertBefore(styleNode, nextEl);\n } else {\n head.appendChild(styleNode);\n }\n }\n if (oldStyleNode && keepOldStyleNode === false) {\n oldStyleNode.parentNode.removeChild(oldStyleNode);\n }\n\n // For IE.\n // This needs to happen *after* the style element is added to the DOM, otherwise IE 7 and 8 may crash.\n // See http://social.msdn.microsoft.com/Forums/en-US/7e081b65-878a-4c22-8e68-c10d39c2ed32/internet-explorer-crashes-appending-style-element-to-head\n if (styleNode.styleSheet) {\n try {\n styleNode.styleSheet.cssText = styles;\n } catch (e) {\n throw new Error('Couldn\\'t reassign styleSheet.cssText.');\n }\n }\n },\n currentScript: function(window) {\n const document = window.document;\n return document.currentScript || (() => {\n const scripts = document.getElementsByTagName('script');\n return scripts[scripts.length - 1];\n })();\n }\n};\n","export default {\n error: function(msg) {\n this._fireEvent('error', msg);\n },\n warn: function(msg) {\n this._fireEvent('warn', msg);\n },\n info: function(msg) {\n this._fireEvent('info', msg);\n },\n debug: function(msg) {\n this._fireEvent('debug', msg);\n },\n addListener: function(listener) {\n this._listeners.push(listener);\n },\n removeListener: function(listener) {\n for (let i = 0; i < this._listeners.length; i++) {\n if (this._listeners[i] === listener) {\n this._listeners.splice(i, 1);\n return;\n }\n }\n },\n _fireEvent: function(type, msg) {\n for (let i = 0; i < this._listeners.length; i++) {\n const logFunction = this._listeners[i][type];\n if (logFunction) {\n logFunction(msg);\n }\n }\n },\n _listeners: []\n};\n","/**\n * @todo Document why this abstraction exists, and the relationship between\n * environment, file managers, and plugin manager\n */\n\nimport logger from '../logger';\n\nclass Environment {\n constructor(externalEnvironment, fileManagers) {\n this.fileManagers = fileManagers || [];\n externalEnvironment = externalEnvironment || {};\n\n const optionalFunctions = ['encodeBase64', 'mimeLookup', 'charsetLookup', 'getSourceMapGenerator'];\n const requiredFunctions = [];\n const functions = requiredFunctions.concat(optionalFunctions);\n\n for (let i = 0; i < functions.length; i++) {\n const propName = functions[i];\n const environmentFunc = externalEnvironment[propName];\n if (environmentFunc) {\n this[propName] = environmentFunc.bind(externalEnvironment);\n } else if (i < requiredFunctions.length) {\n this.warn(`missing required function in environment - ${propName}`);\n }\n }\n }\n\n getFileManager(filename, currentDirectory, options, environment, isSync) {\n\n if (!filename) {\n logger.warn('getFileManager called with no filename.. Please report this issue. continuing.');\n }\n if (currentDirectory == null) {\n logger.warn('getFileManager called with null directory.. Please report this issue. continuing.');\n }\n\n let fileManagers = this.fileManagers;\n if (options.pluginManager) {\n fileManagers = [].concat(fileManagers).concat(options.pluginManager.getFileManagers());\n }\n for (let i = fileManagers.length - 1; i >= 0 ; i--) {\n const fileManager = fileManagers[i];\n if (fileManager[isSync ? 'supportsSync' : 'supports'](filename, currentDirectory, options, environment)) {\n return fileManager;\n }\n }\n return null;\n }\n\n addFileManager(fileManager) {\n this.fileManagers.push(fileManager);\n }\n\n clearFileManagers() {\n this.fileManagers = [];\n }\n}\n\nexport default Environment;\n","export default {\n 'aliceblue':'#f0f8ff',\n 'antiquewhite':'#faebd7',\n 'aqua':'#00ffff',\n 'aquamarine':'#7fffd4',\n 'azure':'#f0ffff',\n 'beige':'#f5f5dc',\n 'bisque':'#ffe4c4',\n 'black':'#000000',\n 'blanchedalmond':'#ffebcd',\n 'blue':'#0000ff',\n 'blueviolet':'#8a2be2',\n 'brown':'#a52a2a',\n 'burlywood':'#deb887',\n 'cadetblue':'#5f9ea0',\n 'chartreuse':'#7fff00',\n 'chocolate':'#d2691e',\n 'coral':'#ff7f50',\n 'cornflowerblue':'#6495ed',\n 'cornsilk':'#fff8dc',\n 'crimson':'#dc143c',\n 'cyan':'#00ffff',\n 'darkblue':'#00008b',\n 'darkcyan':'#008b8b',\n 'darkgoldenrod':'#b8860b',\n 'darkgray':'#a9a9a9',\n 'darkgrey':'#a9a9a9',\n 'darkgreen':'#006400',\n 'darkkhaki':'#bdb76b',\n 'darkmagenta':'#8b008b',\n 'darkolivegreen':'#556b2f',\n 'darkorange':'#ff8c00',\n 'darkorchid':'#9932cc',\n 'darkred':'#8b0000',\n 'darksalmon':'#e9967a',\n 'darkseagreen':'#8fbc8f',\n 'darkslateblue':'#483d8b',\n 'darkslategray':'#2f4f4f',\n 'darkslategrey':'#2f4f4f',\n 'darkturquoise':'#00ced1',\n 'darkviolet':'#9400d3',\n 'deeppink':'#ff1493',\n 'deepskyblue':'#00bfff',\n 'dimgray':'#696969',\n 'dimgrey':'#696969',\n 'dodgerblue':'#1e90ff',\n 'firebrick':'#b22222',\n 'floralwhite':'#fffaf0',\n 'forestgreen':'#228b22',\n 'fuchsia':'#ff00ff',\n 'gainsboro':'#dcdcdc',\n 'ghostwhite':'#f8f8ff',\n 'gold':'#ffd700',\n 'goldenrod':'#daa520',\n 'gray':'#808080',\n 'grey':'#808080',\n 'green':'#008000',\n 'greenyellow':'#adff2f',\n 'honeydew':'#f0fff0',\n 'hotpink':'#ff69b4',\n 'indianred':'#cd5c5c',\n 'indigo':'#4b0082',\n 'ivory':'#fffff0',\n 'khaki':'#f0e68c',\n 'lavender':'#e6e6fa',\n 'lavenderblush':'#fff0f5',\n 'lawngreen':'#7cfc00',\n 'lemonchiffon':'#fffacd',\n 'lightblue':'#add8e6',\n 'lightcoral':'#f08080',\n 'lightcyan':'#e0ffff',\n 'lightgoldenrodyellow':'#fafad2',\n 'lightgray':'#d3d3d3',\n 'lightgrey':'#d3d3d3',\n 'lightgreen':'#90ee90',\n 'lightpink':'#ffb6c1',\n 'lightsalmon':'#ffa07a',\n 'lightseagreen':'#20b2aa',\n 'lightskyblue':'#87cefa',\n 'lightslategray':'#778899',\n 'lightslategrey':'#778899',\n 'lightsteelblue':'#b0c4de',\n 'lightyellow':'#ffffe0',\n 'lime':'#00ff00',\n 'limegreen':'#32cd32',\n 'linen':'#faf0e6',\n 'magenta':'#ff00ff',\n 'maroon':'#800000',\n 'mediumaquamarine':'#66cdaa',\n 'mediumblue':'#0000cd',\n 'mediumorchid':'#ba55d3',\n 'mediumpurple':'#9370d8',\n 'mediumseagreen':'#3cb371',\n 'mediumslateblue':'#7b68ee',\n 'mediumspringgreen':'#00fa9a',\n 'mediumturquoise':'#48d1cc',\n 'mediumvioletred':'#c71585',\n 'midnightblue':'#191970',\n 'mintcream':'#f5fffa',\n 'mistyrose':'#ffe4e1',\n 'moccasin':'#ffe4b5',\n 'navajowhite':'#ffdead',\n 'navy':'#000080',\n 'oldlace':'#fdf5e6',\n 'olive':'#808000',\n 'olivedrab':'#6b8e23',\n 'orange':'#ffa500',\n 'orangered':'#ff4500',\n 'orchid':'#da70d6',\n 'palegoldenrod':'#eee8aa',\n 'palegreen':'#98fb98',\n 'paleturquoise':'#afeeee',\n 'palevioletred':'#d87093',\n 'papayawhip':'#ffefd5',\n 'peachpuff':'#ffdab9',\n 'peru':'#cd853f',\n 'pink':'#ffc0cb',\n 'plum':'#dda0dd',\n 'powderblue':'#b0e0e6',\n 'purple':'#800080',\n 'rebeccapurple':'#663399',\n 'red':'#ff0000',\n 'rosybrown':'#bc8f8f',\n 'royalblue':'#4169e1',\n 'saddlebrown':'#8b4513',\n 'salmon':'#fa8072',\n 'sandybrown':'#f4a460',\n 'seagreen':'#2e8b57',\n 'seashell':'#fff5ee',\n 'sienna':'#a0522d',\n 'silver':'#c0c0c0',\n 'skyblue':'#87ceeb',\n 'slateblue':'#6a5acd',\n 'slategray':'#708090',\n 'slategrey':'#708090',\n 'snow':'#fffafa',\n 'springgreen':'#00ff7f',\n 'steelblue':'#4682b4',\n 'tan':'#d2b48c',\n 'teal':'#008080',\n 'thistle':'#d8bfd8',\n 'tomato':'#ff6347',\n 'turquoise':'#40e0d0',\n 'violet':'#ee82ee',\n 'wheat':'#f5deb3',\n 'white':'#ffffff',\n 'whitesmoke':'#f5f5f5',\n 'yellow':'#ffff00',\n 'yellowgreen':'#9acd32'\n};","export default {\n length: {\n 'm': 1,\n 'cm': 0.01,\n 'mm': 0.001,\n 'in': 0.0254,\n 'px': 0.0254 / 96,\n 'pt': 0.0254 / 72,\n 'pc': 0.0254 / 72 * 12\n },\n duration: {\n 's': 1,\n 'ms': 0.001\n },\n angle: {\n 'rad': 1 / (2 * Math.PI),\n 'deg': 1 / 360,\n 'grad': 1 / 400,\n 'turn': 1\n }\n};","import colors from './colors';\nimport unitConversions from './unit-conversions';\n\nexport default { colors, unitConversions };\n","/**\n * The reason why Node is a class and other nodes simply do not extend\n * from Node (since we're transpiling) is due to this issue:\n * \n * https://github.com/less/less.js/issues/3434\n */\nclass Node {\n constructor() {\n this.parent = null;\n this.visibilityBlocks = undefined;\n this.nodeVisible = undefined;\n this.rootNode = null;\n this.parsed = null;\n\n const self = this;\n Object.defineProperty(this, 'currentFileInfo', {\n get: function() { return self.fileInfo(); }\n });\n Object.defineProperty(this, 'index', {\n get: function() { return self.getIndex(); }\n });\n\n }\n\n setParent(nodes, parent) {\n function set(node) {\n if (node && node instanceof Node) {\n node.parent = parent;\n }\n }\n if (Array.isArray(nodes)) {\n nodes.forEach(set);\n }\n else {\n set(nodes);\n }\n }\n\n getIndex() {\n return this._index || (this.parent && this.parent.getIndex()) || 0;\n }\n\n fileInfo() {\n return this._fileInfo || (this.parent && this.parent.fileInfo()) || {};\n }\n\n isRulesetLike() { return false; }\n\n toCSS(context) {\n const strs = [];\n this.genCSS(context, {\n add: function(chunk, fileInfo, index) {\n strs.push(chunk);\n },\n isEmpty: function () {\n return strs.length === 0;\n }\n });\n return strs.join('');\n }\n\n genCSS(context, output) {\n output.add(this.value);\n }\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n }\n\n eval() { return this; }\n\n _operate(context, op, a, b) {\n switch (op) {\n case '+': return a + b;\n case '-': return a - b;\n case '*': return a * b;\n case '/': return a / b;\n }\n }\n\n fround(context, value) {\n const precision = context && context.numPrecision;\n // add \"epsilon\" to ensure numbers like 1.000000005 (represented as 1.000000004999...) are properly rounded:\n return (precision) ? Number((value + 2e-16).toFixed(precision)) : value;\n }\n\n static compare(a, b) {\n /* returns:\n -1: a < b\n 0: a = b\n 1: a > b\n and *any* other value for a != b (e.g. undefined, NaN, -2 etc.) */\n\n if ((a.compare) &&\n // for \"symmetric results\" force toCSS-based comparison\n // of Quoted or Anonymous if either value is one of those\n !(b.type === 'Quoted' || b.type === 'Anonymous')) {\n return a.compare(b);\n } else if (b.compare) {\n return -b.compare(a);\n } else if (a.type !== b.type) {\n return undefined;\n }\n\n a = a.value;\n b = b.value;\n if (!Array.isArray(a)) {\n return a === b ? 0 : undefined;\n }\n if (a.length !== b.length) {\n return undefined;\n }\n for (let i = 0; i < a.length; i++) {\n if (Node.compare(a[i], b[i]) !== 0) {\n return undefined;\n }\n }\n return 0;\n }\n\n static numericCompare(a, b) {\n return a < b ? -1\n : a === b ? 0\n : a > b ? 1 : undefined;\n }\n\n // Returns true if this node represents root of ast imported by reference\n blocksVisibility() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n return this.visibilityBlocks !== 0;\n }\n\n addVisibilityBlock() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks + 1;\n }\n\n removeVisibilityBlock() {\n if (this.visibilityBlocks == null) {\n this.visibilityBlocks = 0;\n }\n this.visibilityBlocks = this.visibilityBlocks - 1;\n }\n\n // Turns on node visibility - if called node will be shown in output regardless\n // of whether it comes from import by reference or not\n ensureVisibility() {\n this.nodeVisible = true;\n }\n\n // Turns off node visibility - if called node will NOT be shown in output regardless\n // of whether it comes from import by reference or not\n ensureInvisibility() {\n this.nodeVisible = false;\n }\n\n // return values:\n // false - the node must not be visible\n // true - the node must be visible\n // undefined or null - the node has the same visibility as its parent\n isVisible() {\n return this.nodeVisible;\n }\n\n visibilityInfo() {\n return {\n visibilityBlocks: this.visibilityBlocks,\n nodeVisible: this.nodeVisible\n };\n }\n\n copyVisibilityInfo(info) {\n if (!info) {\n return;\n }\n this.visibilityBlocks = info.visibilityBlocks;\n this.nodeVisible = info.nodeVisible;\n }\n}\n\nexport default Node;\n","import Node from './node';\nimport colors from '../data/colors';\n\n//\n// RGB Colors - #ff0014, #eee\n//\nconst Color = function(rgb, a, originalForm) {\n const self = this;\n //\n // The end goal here, is to parse the arguments\n // into an integer triplet, such as `128, 255, 0`\n //\n // This facilitates operations and conversions.\n //\n if (Array.isArray(rgb)) {\n this.rgb = rgb;\n } else if (rgb.length >= 6) {\n this.rgb = [];\n rgb.match(/.{2}/g).map(function (c, i) {\n if (i < 3) {\n self.rgb.push(parseInt(c, 16));\n } else {\n self.alpha = (parseInt(c, 16)) / 255;\n }\n });\n } else {\n this.rgb = [];\n rgb.split('').map(function (c, i) {\n if (i < 3) {\n self.rgb.push(parseInt(c + c, 16));\n } else {\n self.alpha = (parseInt(c + c, 16)) / 255;\n }\n });\n }\n this.alpha = this.alpha || (typeof a === 'number' ? a : 1);\n if (typeof originalForm !== 'undefined') {\n this.value = originalForm;\n }\n}\n\nColor.prototype = Object.assign(new Node(), {\n type: 'Color',\n\n luma() {\n let r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255;\n\n r = (r <= 0.03928) ? r / 12.92 : Math.pow(((r + 0.055) / 1.055), 2.4);\n g = (g <= 0.03928) ? g / 12.92 : Math.pow(((g + 0.055) / 1.055), 2.4);\n b = (b <= 0.03928) ? b / 12.92 : Math.pow(((b + 0.055) / 1.055), 2.4);\n\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n },\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n },\n\n toCSS(context, doNotCompress) {\n const compress = context && context.compress && !doNotCompress;\n let color;\n let alpha;\n let colorFunction;\n let args = [];\n\n // `value` is set if this color was originally\n // converted from a named color string so we need\n // to respect this and try to output named color too.\n alpha = this.fround(context, this.alpha);\n\n if (this.value) {\n if (this.value.indexOf('rgb') === 0) {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n } else if (this.value.indexOf('hsl') === 0) {\n if (alpha < 1) {\n colorFunction = 'hsla';\n } else {\n colorFunction = 'hsl';\n }\n } else {\n return this.value;\n }\n } else {\n if (alpha < 1) {\n colorFunction = 'rgba';\n }\n }\n\n switch (colorFunction) {\n case 'rgba':\n args = this.rgb.map(function (c) {\n return clamp(Math.round(c), 255);\n }).concat(clamp(alpha, 1));\n break;\n case 'hsla':\n args.push(clamp(alpha, 1));\n case 'hsl':\n color = this.toHSL();\n args = [\n this.fround(context, color.h),\n `${this.fround(context, color.s * 100)}%`,\n `${this.fround(context, color.l * 100)}%`\n ].concat(args);\n }\n\n if (colorFunction) {\n // Values are capped between `0` and `255`, rounded and zero-padded.\n return `${colorFunction}(${args.join(`,${compress ? '' : ' '}`)})`;\n }\n\n color = this.toRGB();\n\n if (compress) {\n const splitcolor = color.split('');\n\n // Convert color to short format\n if (splitcolor[1] === splitcolor[2] && splitcolor[3] === splitcolor[4] && splitcolor[5] === splitcolor[6]) {\n color = `#${splitcolor[1]}${splitcolor[3]}${splitcolor[5]}`;\n }\n }\n\n return color;\n },\n\n //\n // Operations have to be done per-channel, if not,\n // channels will spill onto each other. Once we have\n // our result, in the form of an integer triplet,\n // we create a new Color node to hold the result.\n //\n operate(context, op, other) {\n const rgb = new Array(3);\n const alpha = this.alpha * (1 - other.alpha) + other.alpha;\n for (let c = 0; c < 3; c++) {\n rgb[c] = this._operate(context, op, this.rgb[c], other.rgb[c]);\n }\n return new Color(rgb, alpha);\n },\n\n toRGB() {\n return toHex(this.rgb);\n },\n\n toHSL() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h;\n let s;\n const l = (max + min) / 2;\n const d = max - min;\n\n if (max === min) {\n h = s = 0;\n } else {\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, l, a };\n },\n\n // Adapted from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript\n toHSV() {\n const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;\n\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h;\n let s;\n const v = max;\n\n const d = max - min;\n if (max === 0) {\n s = 0;\n } else {\n s = d / max;\n }\n\n if (max === min) {\n h = 0;\n } else {\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h * 360, s, v, a };\n },\n\n toARGB() {\n return toHex([this.alpha * 255].concat(this.rgb));\n },\n\n compare(x) {\n return (x.rgb &&\n x.rgb[0] === this.rgb[0] &&\n x.rgb[1] === this.rgb[1] &&\n x.rgb[2] === this.rgb[2] &&\n x.alpha === this.alpha) ? 0 : undefined;\n }\n});\n\nColor.fromKeyword = function(keyword) {\n let c;\n const key = keyword.toLowerCase();\n if (colors.hasOwnProperty(key)) {\n c = new Color(colors[key].slice(1));\n }\n else if (key === 'transparent') {\n c = new Color([0, 0, 0], 0);\n }\n\n if (c) {\n c.value = keyword;\n return c;\n }\n};\n\nfunction clamp(v, max) {\n return Math.min(Math.max(v, 0), max);\n}\n\nfunction toHex(v) {\n return `#${v.map(function (c) {\n c = clamp(Math.round(c), 255);\n return (c < 16 ? '0' : '') + c.toString(16);\n }).join('')}`;\n}\n\nexport default Color;\n","import Node from './node';\n\nconst Paren = function(node) {\n this.value = node;\n};\n\nParen.prototype = Object.assign(new Node(), {\n type: 'Paren',\n\n genCSS(context, output) {\n output.add('(');\n this.value.genCSS(context, output);\n output.add(')');\n },\n\n eval(context) {\n return new Paren(this.value.eval(context));\n }\n});\n\nexport default Paren;\n","import Node from './node';\nconst _noSpaceCombinators = {\n '': true,\n ' ': true,\n '|': true\n};\n\nconst Combinator = function(value) {\n if (value === ' ') {\n this.value = ' ';\n this.emptyOrWhitespace = true;\n } else {\n this.value = value ? value.trim() : '';\n this.emptyOrWhitespace = this.value === '';\n }\n}\n\nCombinator.prototype = Object.assign(new Node(), {\n type: 'Combinator',\n\n genCSS(context, output) {\n const spaceOrEmpty = (context.compress || _noSpaceCombinators[this.value]) ? '' : ' ';\n output.add(spaceOrEmpty + this.value + spaceOrEmpty);\n }\n});\n\nexport default Combinator;\n","import Node from './node';\nimport Paren from './paren';\nimport Combinator from './combinator';\n\nconst Element = function(combinator, value, isVariable, index, currentFileInfo, visibilityInfo) {\n this.combinator = combinator instanceof Combinator ?\n combinator : new Combinator(combinator);\n\n if (typeof value === 'string') {\n this.value = value.trim();\n } else if (value) {\n this.value = value;\n } else {\n this.value = '';\n }\n this.isVariable = isVariable;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.combinator, this);\n}\n\nElement.prototype = Object.assign(new Node(), {\n type: 'Element',\n\n accept(visitor) {\n const value = this.value;\n this.combinator = visitor.visit(this.combinator);\n if (typeof value === 'object') {\n this.value = visitor.visit(value);\n }\n },\n\n eval(context) {\n return new Element(this.combinator,\n this.value.eval ? this.value.eval(context) : this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n },\n\n clone() {\n return new Element(this.combinator,\n this.value,\n this.isVariable,\n this.getIndex(),\n this.fileInfo(), this.visibilityInfo());\n },\n\n genCSS(context, output) {\n output.add(this.toCSS(context), this.fileInfo(), this.getIndex());\n },\n\n toCSS(context) {\n context = context || {};\n let value = this.value;\n const firstSelector = context.firstSelector;\n if (value instanceof Paren) {\n // selector in parens should not be affected by outer selector\n // flags (breaks only interpolated selectors - see #1973)\n context.firstSelector = true;\n }\n value = value.toCSS ? value.toCSS(context) : value;\n context.firstSelector = firstSelector;\n if (value === '' && this.combinator.value.charAt(0) === '&') {\n return '';\n } else {\n return this.combinator.toCSS(context) + value;\n }\n }\n});\n\nexport default Element;\n","\nexport const Math = {\n ALWAYS: 0,\n PARENS_DIVISION: 1,\n PARENS: 2\n // removed - STRICT_LEGACY: 3\n};\n\nexport const RewriteUrls = {\n OFF: 0,\n LOCAL: 1,\n ALL: 2\n};","/**\r\n * Returns the object type of the given payload\r\n *\r\n * @param {*} payload\r\n * @returns {string}\r\n */\r\nfunction getType(payload) {\r\n return Object.prototype.toString.call(payload).slice(8, -1);\r\n}\r\n/**\r\n * Returns whether the payload is undefined\r\n *\r\n * @param {*} payload\r\n * @returns {payload is undefined}\r\n */\r\nfunction isUndefined(payload) {\r\n return getType(payload) === 'Undefined';\r\n}\r\n/**\r\n * Returns whether the payload is null\r\n *\r\n * @param {*} payload\r\n * @returns {payload is null}\r\n */\r\nfunction isNull(payload) {\r\n return getType(payload) === 'Null';\r\n}\r\n/**\r\n * Returns whether the payload is a plain JavaScript object (excluding special classes or objects with other prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Record}\r\n */\r\nfunction isPlainObject(payload) {\r\n if (getType(payload) !== 'Object')\r\n return false;\r\n return payload.constructor === Object && Object.getPrototypeOf(payload) === Object.prototype;\r\n}\r\n/**\r\n * Returns whether the payload is a plain JavaScript object (excluding special classes or objects with other prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Record}\r\n */\r\nfunction isObject(payload) {\r\n return isPlainObject(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a an empty object (excluding special classes or objects with other prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is { [K in any]: never }}\r\n */\r\nfunction isEmptyObject(payload) {\r\n return isPlainObject(payload) && Object.keys(payload).length === 0;\r\n}\r\n/**\r\n * Returns whether the payload is an any kind of object (including special classes or objects with different prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Record}\r\n */\r\nfunction isAnyObject(payload) {\r\n return getType(payload) === 'Object';\r\n}\r\n/**\r\n * Returns whether the payload is an object like a type passed in < >\r\n *\r\n * Usage: isObjectLike<{id: any}>(payload) // will make sure it's an object and has an `id` prop.\r\n *\r\n * @template T this must be passed in < >\r\n * @param {*} payload\r\n * @returns {payload is T}\r\n */\r\nfunction isObjectLike(payload) {\r\n return isAnyObject(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a function (regular or async)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is AnyFunction}\r\n */\r\nfunction isFunction(payload) {\r\n return typeof payload === \"function\";\r\n}\r\n/**\r\n * Returns whether the payload is an array\r\n *\r\n * @param {any} payload\r\n * @returns {payload is any[]}\r\n */\r\nfunction isArray(payload) {\r\n return getType(payload) === 'Array';\r\n}\r\n/**\r\n * Returns whether the payload is a an array with at least 1 item\r\n *\r\n * @param {*} payload\r\n * @returns {payload is any[]}\r\n */\r\nfunction isFullArray(payload) {\r\n return isArray(payload) && payload.length > 0;\r\n}\r\n/**\r\n * Returns whether the payload is a an empty array\r\n *\r\n * @param {*} payload\r\n * @returns {payload is []}\r\n */\r\nfunction isEmptyArray(payload) {\r\n return isArray(payload) && payload.length === 0;\r\n}\r\n/**\r\n * Returns whether the payload is a string\r\n *\r\n * @param {*} payload\r\n * @returns {payload is string}\r\n */\r\nfunction isString(payload) {\r\n return getType(payload) === 'String';\r\n}\r\n/**\r\n * Returns whether the payload is a string, BUT returns false for ''\r\n *\r\n * @param {*} payload\r\n * @returns {payload is string}\r\n */\r\nfunction isFullString(payload) {\r\n return isString(payload) && payload !== '';\r\n}\r\n/**\r\n * Returns whether the payload is ''\r\n *\r\n * @param {*} payload\r\n * @returns {payload is string}\r\n */\r\nfunction isEmptyString(payload) {\r\n return payload === '';\r\n}\r\n/**\r\n * Returns whether the payload is a number (but not NaN)\r\n *\r\n * This will return `false` for `NaN`!!\r\n *\r\n * @param {*} payload\r\n * @returns {payload is number}\r\n */\r\nfunction isNumber(payload) {\r\n return getType(payload) === 'Number' && !isNaN(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a boolean\r\n *\r\n * @param {*} payload\r\n * @returns {payload is boolean}\r\n */\r\nfunction isBoolean(payload) {\r\n return getType(payload) === 'Boolean';\r\n}\r\n/**\r\n * Returns whether the payload is a regular expression (RegExp)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is RegExp}\r\n */\r\nfunction isRegExp(payload) {\r\n return getType(payload) === 'RegExp';\r\n}\r\n/**\r\n * Returns whether the payload is a Map\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Map}\r\n */\r\nfunction isMap(payload) {\r\n return getType(payload) === 'Map';\r\n}\r\n/**\r\n * Returns whether the payload is a WeakMap\r\n *\r\n * @param {*} payload\r\n * @returns {payload is WeakMap}\r\n */\r\nfunction isWeakMap(payload) {\r\n return getType(payload) === 'WeakMap';\r\n}\r\n/**\r\n * Returns whether the payload is a Set\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Set}\r\n */\r\nfunction isSet(payload) {\r\n return getType(payload) === 'Set';\r\n}\r\n/**\r\n * Returns whether the payload is a WeakSet\r\n *\r\n * @param {*} payload\r\n * @returns {payload is WeakSet}\r\n */\r\nfunction isWeakSet(payload) {\r\n return getType(payload) === 'WeakSet';\r\n}\r\n/**\r\n * Returns whether the payload is a Symbol\r\n *\r\n * @param {*} payload\r\n * @returns {payload is symbol}\r\n */\r\nfunction isSymbol(payload) {\r\n return getType(payload) === 'Symbol';\r\n}\r\n/**\r\n * Returns whether the payload is a Date, and that the date is valid\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Date}\r\n */\r\nfunction isDate(payload) {\r\n return getType(payload) === 'Date' && !isNaN(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a Blob\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Blob}\r\n */\r\nfunction isBlob(payload) {\r\n return getType(payload) === 'Blob';\r\n}\r\n/**\r\n * Returns whether the payload is a File\r\n *\r\n * @param {*} payload\r\n * @returns {payload is File}\r\n */\r\nfunction isFile(payload) {\r\n return getType(payload) === 'File';\r\n}\r\n/**\r\n * Returns whether the payload is a Promise\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Promise}\r\n */\r\nfunction isPromise(payload) {\r\n return getType(payload) === 'Promise';\r\n}\r\n/**\r\n * Returns whether the payload is an Error\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Error}\r\n */\r\nfunction isError(payload) {\r\n return getType(payload) === 'Error';\r\n}\r\n/**\r\n * Returns whether the payload is literally the value `NaN` (it's `NaN` and also a `number`)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is typeof NaN}\r\n */\r\nfunction isNaNValue(payload) {\r\n return getType(payload) === 'Number' && isNaN(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a primitive type (eg. Boolean | Null | Undefined | Number | String | Symbol)\r\n *\r\n * @param {*} payload\r\n * @returns {(payload is boolean | null | undefined | number | string | symbol)}\r\n */\r\nfunction isPrimitive(payload) {\r\n return (isBoolean(payload) ||\r\n isNull(payload) ||\r\n isUndefined(payload) ||\r\n isNumber(payload) ||\r\n isString(payload) ||\r\n isSymbol(payload));\r\n}\r\n/**\r\n * Returns true whether the payload is null or undefined\r\n *\r\n * @param {*} payload\r\n * @returns {(payload is null | undefined)}\r\n */\r\nfunction isNullOrUndefined(payload) {\r\n return isNull(payload) || isUndefined(payload);\r\n}\r\n/**\r\n * Does a generic check to check that the given payload is of a given type.\r\n * In cases like Number, it will return true for NaN as NaN is a Number (thanks javascript!);\r\n * It will, however, differentiate between object and null\r\n *\r\n * @template T\r\n * @param {*} payload\r\n * @param {T} type\r\n * @throws {TypeError} Will throw type error if type is an invalid type\r\n * @returns {payload is T}\r\n */\r\nfunction isType(payload, type) {\r\n if (!(type instanceof Function)) {\r\n throw new TypeError('Type must be a function');\r\n }\r\n if (!Object.prototype.hasOwnProperty.call(type, 'prototype')) {\r\n throw new TypeError('Type is not a class');\r\n }\r\n // Classes usually have names (as functions usually have names)\r\n var name = type.name;\r\n return getType(payload) === name || Boolean(payload && payload.constructor === type);\r\n}\n\nexport { getType, isAnyObject, isArray, isBlob, isBoolean, isDate, isEmptyArray, isEmptyObject, isEmptyString, isError, isFile, isFullArray, isFullString, isFunction, isMap, isNaNValue, isNull, isNullOrUndefined, isNumber, isObject, isObjectLike, isPlainObject, isPrimitive, isPromise, isRegExp, isSet, isString, isSymbol, isType, isUndefined, isWeakMap, isWeakSet };\n","import { isArray, isPlainObject } from 'is-what';\n\n/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n\r\nfunction __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\n\nfunction assignProp(carry, key, newVal, originalObject, includeNonenumerable) {\r\n var propType = {}.propertyIsEnumerable.call(originalObject, key)\r\n ? 'enumerable'\r\n : 'nonenumerable';\r\n if (propType === 'enumerable')\r\n carry[key] = newVal;\r\n if (includeNonenumerable && propType === 'nonenumerable') {\r\n Object.defineProperty(carry, key, {\r\n value: newVal,\r\n enumerable: false,\r\n writable: true,\r\n configurable: true,\r\n });\r\n }\r\n}\r\n/**\r\n * Copy (clone) an object and all its props recursively to get rid of any prop referenced of the original object. Arrays are also cloned, however objects inside arrays are still linked.\r\n *\r\n * @export\r\n * @template T\r\n * @param {T} target Target can be anything\r\n * @param {Options} [options={}] Options can be `props` or `nonenumerable`\r\n * @returns {T} the target with replaced values\r\n * @export\r\n */\r\nfunction copy(target, options) {\r\n if (options === void 0) { options = {}; }\r\n if (isArray(target))\r\n return target.map(function (i) { return copy(i, options); });\r\n if (!isPlainObject(target))\r\n return target;\r\n var props = Object.getOwnPropertyNames(target);\r\n var symbols = Object.getOwnPropertySymbols(target);\r\n return __spreadArrays(props, symbols).reduce(function (carry, key) {\r\n if (isArray(options.props) && !options.props.includes(key)) {\r\n return carry;\r\n }\r\n var val = target[key];\r\n var newVal = copy(val, options);\r\n assignProp(carry, key, newVal, target, options.nonenumerable);\r\n return carry;\r\n }, {});\r\n}\n\nexport { copy };\n","/* jshint proto: true */\nimport * as Constants from './constants';\nimport { copy } from 'copy-anything';\n\nexport function getLocation(index, inputStream) {\n let n = index + 1;\n let line = null;\n let column = -1;\n\n while (--n >= 0 && inputStream.charAt(n) !== '\\n') {\n column++;\n }\n\n if (typeof index === 'number') {\n line = (inputStream.slice(0, index).match(/\\n/g) || '').length;\n }\n\n return {\n line,\n column\n };\n}\n\nexport function copyArray(arr) {\n let i;\n const length = arr.length;\n const copy = new Array(length);\n\n for (i = 0; i < length; i++) {\n copy[i] = arr[i];\n }\n return copy;\n}\n\nexport function clone(obj) {\n const cloned = {};\n for (const prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n cloned[prop] = obj[prop];\n }\n }\n return cloned;\n}\n\nexport function defaults(obj1, obj2) {\n let newObj = obj2 || {};\n if (!obj2._defaults) {\n newObj = {};\n const defaults = copy(obj1);\n newObj._defaults = defaults;\n const cloned = obj2 ? copy(obj2) : {};\n Object.assign(newObj, defaults, cloned);\n }\n return newObj;\n}\n\nexport function copyOptions(obj1, obj2) {\n if (obj2 && obj2._defaults) {\n return obj2;\n }\n const opts = defaults(obj1, obj2);\n if (opts.strictMath) {\n opts.math = Constants.Math.PARENS;\n }\n // Back compat with changed relativeUrls option\n if (opts.relativeUrls) {\n opts.rewriteUrls = Constants.RewriteUrls.ALL;\n }\n if (typeof opts.math === 'string') {\n switch (opts.math.toLowerCase()) {\n case 'always':\n opts.math = Constants.Math.ALWAYS;\n break;\n case 'parens-division':\n opts.math = Constants.Math.PARENS_DIVISION;\n break;\n case 'strict':\n case 'parens':\n opts.math = Constants.Math.PARENS;\n break;\n default:\n opts.math = Constants.Math.PARENS;\n }\n }\n if (typeof opts.rewriteUrls === 'string') {\n switch (opts.rewriteUrls.toLowerCase()) {\n case 'off':\n opts.rewriteUrls = Constants.RewriteUrls.OFF;\n break;\n case 'local':\n opts.rewriteUrls = Constants.RewriteUrls.LOCAL;\n break;\n case 'all':\n opts.rewriteUrls = Constants.RewriteUrls.ALL;\n break;\n }\n }\n return opts;\n}\n\nexport function merge(obj1, obj2) {\n for (const prop in obj2) {\n if (obj2.hasOwnProperty(prop)) {\n obj1[prop] = obj2[prop];\n }\n }\n return obj1;\n}\n\nexport function flattenArray(arr, result = []) {\n for (let i = 0, length = arr.length; i < length; i++) {\n const value = arr[i];\n if (Array.isArray(value)) {\n flattenArray(value, result);\n } else {\n if (value !== undefined) {\n result.push(value);\n }\n }\n }\n return result;\n}","import * as utils from './utils';\n\nconst anonymousFunc = /(|Function):(\\d+):(\\d+)/;\n\n/**\n * This is a centralized class of any error that could be thrown internally (mostly by the parser).\n * Besides standard .message it keeps some additional data like a path to the file where the error\n * occurred along with line and column numbers.\n *\n * @class\n * @extends Error\n * @type {module.LessError}\n *\n * @prop {string} type\n * @prop {string} filename\n * @prop {number} index\n * @prop {number} line\n * @prop {number} column\n * @prop {number} callLine\n * @prop {number} callExtract\n * @prop {string[]} extract\n *\n * @param {Object} e - An error object to wrap around or just a descriptive object\n * @param {Object} fileContentMap - An object with file contents in 'contents' property (like importManager) @todo - move to fileManager?\n * @param {string} [currentFilename]\n */\nconst LessError = function(e, fileContentMap, currentFilename) {\n Error.call(this);\n\n const filename = e.filename || currentFilename;\n\n this.message = e.message;\n this.stack = e.stack;\n\n if (fileContentMap && filename) {\n const input = fileContentMap.contents[filename];\n const loc = utils.getLocation(e.index, input);\n var line = loc.line;\n const col = loc.column;\n const callLine = e.call && utils.getLocation(e.call, input).line;\n const lines = input ? input.split('\\n') : '';\n\n this.type = e.type || 'Syntax';\n this.filename = filename;\n this.index = e.index;\n this.line = typeof line === 'number' ? line + 1 : null;\n this.column = col;\n\n if (!this.line && this.stack) {\n const found = this.stack.match(anonymousFunc);\n\n /**\n * We have to figure out how this environment stringifies anonymous functions\n * so we can correctly map plugin errors.\n * \n * Note, in Node 8, the output of anonymous funcs varied based on parameters\n * being present or not, so we inject dummy params.\n */\n const func = new Function('a', 'throw new Error()');\n let lineAdjust = 0;\n try {\n func();\n } catch (e) {\n const match = e.stack.match(anonymousFunc);\n var line = parseInt(match[2]);\n lineAdjust = 1 - line;\n }\n\n if (found) {\n if (found[2]) {\n this.line = parseInt(found[2]) + lineAdjust;\n }\n if (found[3]) {\n this.column = parseInt(found[3]);\n }\n }\n }\n\n this.callLine = callLine + 1;\n this.callExtract = lines[callLine];\n\n this.extract = [\n lines[this.line - 2],\n lines[this.line - 1],\n lines[this.line]\n ];\n }\n\n};\n\nif (typeof Object.create === 'undefined') {\n const F = function () {};\n F.prototype = Error.prototype;\n LessError.prototype = new F();\n} else {\n LessError.prototype = Object.create(Error.prototype);\n}\n\nLessError.prototype.constructor = LessError;\n\n/**\n * An overridden version of the default Object.prototype.toString\n * which uses additional information to create a helpful message.\n *\n * @param {Object} options\n * @returns {string}\n */\nLessError.prototype.toString = function(options) {\n options = options || {};\n\n let message = '';\n const extract = this.extract || [];\n let error = [];\n let stylize = function (str) { return str; };\n if (options.stylize) {\n const type = typeof options.stylize;\n if (type !== 'function') {\n throw Error(`options.stylize should be a function, got a ${type}!`);\n }\n stylize = options.stylize;\n }\n\n if (this.line !== null) {\n if (typeof extract[0] === 'string') {\n error.push(stylize(`${this.line - 1} ${extract[0]}`, 'grey'));\n }\n\n if (typeof extract[1] === 'string') {\n let errorTxt = `${this.line} `;\n if (extract[1]) {\n errorTxt += extract[1].slice(0, this.column) +\n stylize(stylize(stylize(extract[1].substr(this.column, 1), 'bold') +\n extract[1].slice(this.column + 1), 'red'), 'inverse');\n }\n error.push(errorTxt);\n }\n\n if (typeof extract[2] === 'string') {\n error.push(stylize(`${this.line + 1} ${extract[2]}`, 'grey'));\n }\n error = `${error.join('\\n') + stylize('', 'reset')}\\n`;\n }\n\n message += stylize(`${this.type}Error: ${this.message}`, 'red');\n if (this.filename) {\n message += stylize(' in ', 'red') + this.filename;\n }\n if (this.line) {\n message += stylize(` on line ${this.line}, column ${this.column + 1}:`, 'grey');\n }\n\n message += `\\n${error}`;\n\n if (this.callLine) {\n message += `${stylize('from ', 'red') + (this.filename || '')}/n`;\n message += `${stylize(this.callLine, 'grey')} ${this.callExtract}/n`;\n }\n\n return message;\n};\n\nexport default LessError;","import Node from './node';\nimport Element from './element';\nimport LessError from '../less-error';\n\nconst Selector = function(elements, extendList, condition, index, currentFileInfo, visibilityInfo) {\n this.extendList = extendList;\n this.condition = condition;\n this.evaldCondition = !condition;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.elements = this.getElements(elements);\n this.mixinElements_ = undefined;\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.elements, this);\n};\n\nSelector.prototype = Object.assign(new Node(), {\n type: 'Selector',\n\n accept(visitor) {\n if (this.elements) {\n this.elements = visitor.visitArray(this.elements);\n }\n if (this.extendList) {\n this.extendList = visitor.visitArray(this.extendList);\n }\n if (this.condition) {\n this.condition = visitor.visit(this.condition);\n }\n },\n\n createDerived(elements, extendList, evaldCondition) {\n elements = this.getElements(elements);\n const newSelector = new Selector(elements, extendList || this.extendList,\n null, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n newSelector.evaldCondition = (evaldCondition != null) ? evaldCondition : this.evaldCondition;\n newSelector.mediaEmpty = this.mediaEmpty;\n return newSelector;\n },\n\n getElements(els) {\n if (!els) {\n return [new Element('', '&', false, this._index, this._fileInfo)];\n }\n if (typeof els === 'string') {\n this.parse.parseNode(\n els, \n ['selector'],\n this._index, \n this._fileInfo, \n function(err, result) {\n if (err) {\n throw new LessError({\n index: err.index,\n message: err.message\n }, this.parse.imports, this._fileInfo.filename);\n }\n els = result[0].elements;\n });\n }\n return els;\n },\n\n createEmptySelectors() {\n const el = new Element('', '&', false, this._index, this._fileInfo), sels = [new Selector([el], null, null, this._index, this._fileInfo)];\n sels[0].mediaEmpty = true;\n return sels;\n },\n\n match(other) {\n const elements = this.elements;\n const len = elements.length;\n let olen;\n let i;\n\n other = other.mixinElements();\n olen = other.length;\n if (olen === 0 || len < olen) {\n return 0;\n } else {\n for (i = 0; i < olen; i++) {\n if (elements[i].value !== other[i]) {\n return 0;\n }\n }\n }\n\n return olen; // return number of matched elements\n },\n\n mixinElements() {\n if (this.mixinElements_) {\n return this.mixinElements_;\n }\n\n let elements = this.elements.map( function(v) {\n return v.combinator.value + (v.value.value || v.value);\n }).join('').match(/[,&#\\*\\.\\w-]([\\w-]|(\\\\.))*/g);\n\n if (elements) {\n if (elements[0] === '&') {\n elements.shift();\n }\n } else {\n elements = [];\n }\n\n return (this.mixinElements_ = elements);\n },\n\n isJustParentSelector() {\n return !this.mediaEmpty &&\n this.elements.length === 1 &&\n this.elements[0].value === '&' &&\n (this.elements[0].combinator.value === ' ' || this.elements[0].combinator.value === '');\n },\n\n eval(context) {\n const evaldCondition = this.condition && this.condition.eval(context);\n let elements = this.elements;\n let extendList = this.extendList;\n\n elements = elements && elements.map(function (e) { return e.eval(context); });\n extendList = extendList && extendList.map(function(extend) { return extend.eval(context); });\n\n return this.createDerived(elements, extendList, evaldCondition);\n },\n\n genCSS(context, output) {\n let i, element;\n if ((!context || !context.firstSelector) && this.elements[0].combinator.value === '') {\n output.add(' ', this.fileInfo(), this.getIndex());\n }\n for (i = 0; i < this.elements.length; i++) {\n element = this.elements[i];\n element.genCSS(context, output);\n }\n },\n\n getIsOutput() {\n return this.evaldCondition;\n }\n});\n\nexport default Selector;\n","import Node from './node';\n\nconst Value = function(value) {\n if (!value) {\n throw new Error('Value requires an array argument');\n }\n if (!Array.isArray(value)) {\n this.value = [ value ];\n }\n else {\n this.value = value;\n }\n};\n\nValue.prototype = Object.assign(new Node(), {\n type: 'Value',\n\n accept(visitor) {\n if (this.value) {\n this.value = visitor.visitArray(this.value);\n }\n },\n\n eval(context) {\n if (this.value.length === 1) {\n return this.value[0].eval(context);\n } else {\n return new Value(this.value.map(function (v) {\n return v.eval(context);\n }));\n }\n },\n\n genCSS(context, output) {\n let i;\n for (i = 0; i < this.value.length; i++) {\n this.value[i].genCSS(context, output);\n if (i + 1 < this.value.length) {\n output.add((context && context.compress) ? ',' : ', ');\n }\n }\n }\n});\n\nexport default Value;\n","import Node from './node';\n\nconst Keyword = function(value) {\n this.value = value;\n};\n\nKeyword.prototype = Object.assign(new Node(), {\n type: 'Keyword',\n\n genCSS(context, output) {\n if (this.value === '%') { throw { type: 'Syntax', message: 'Invalid % without number' }; }\n output.add(this.value);\n }\n});\n\nKeyword.True = new Keyword('true');\nKeyword.False = new Keyword('false');\n\nexport default Keyword;\n","import Node from './node';\n\nconst Anonymous = function(value, index, currentFileInfo, mapLines, rulesetLike, visibilityInfo) {\n this.value = value;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.mapLines = mapLines;\n this.rulesetLike = (typeof rulesetLike === 'undefined') ? false : rulesetLike;\n this.allowRoot = true;\n this.copyVisibilityInfo(visibilityInfo);\n}\n\nAnonymous.prototype = Object.assign(new Node(), {\n type: 'Anonymous',\n eval() {\n return new Anonymous(this.value, this._index, this._fileInfo, this.mapLines, this.rulesetLike, this.visibilityInfo());\n },\n compare(other) {\n return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n },\n isRulesetLike() {\n return this.rulesetLike;\n },\n genCSS(context, output) {\n this.nodeVisible = Boolean(this.value);\n if (this.nodeVisible) {\n output.add(this.value, this._fileInfo, this._index, this.mapLines);\n }\n }\n})\n\nexport default Anonymous;\n","import Node from './node';\nimport Value from './value';\nimport Keyword from './keyword';\nimport Anonymous from './anonymous';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\nfunction evalName(context, name) {\n let value = '';\n let i;\n const n = name.length;\n const output = {add: function (s) {value += s;}};\n for (i = 0; i < n; i++) {\n name[i].eval(context).genCSS(context, output);\n }\n return value;\n}\n\nconst Declaration = function(name, value, important, merge, index, currentFileInfo, inline, variable) {\n this.name = name;\n this.value = (value instanceof Node) ? value : new Value([value ? new Anonymous(value) : null]);\n this.important = important ? ` ${important.trim()}` : '';\n this.merge = merge;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.inline = inline || false;\n this.variable = (variable !== undefined) ? variable\n : (name.charAt && (name.charAt(0) === '@'));\n this.allowRoot = true;\n this.setParent(this.value, this);\n};\n\nDeclaration.prototype = Object.assign(new Node(), {\n type: 'Declaration',\n\n genCSS(context, output) {\n output.add(this.name + (context.compress ? ':' : ': '), this.fileInfo(), this.getIndex());\n try {\n this.value.genCSS(context, output);\n }\n catch (e) {\n e.index = this._index;\n e.filename = this._fileInfo.filename;\n throw e;\n }\n output.add(this.important + ((this.inline || (context.lastRule && context.compress)) ? '' : ';'), this._fileInfo, this._index);\n },\n\n eval(context) {\n let mathBypass = false, prevMath, name = this.name, evaldValue, variable = this.variable;\n if (typeof name !== 'string') {\n // expand 'primitive' name directly to get\n // things faster (~10% for benchmark.less):\n name = (name.length === 1) && (name[0] instanceof Keyword) ?\n name[0].value : evalName(context, name);\n variable = false; // never treat expanded interpolation as new variable name\n }\n\n // @todo remove when parens-division is default\n if (name === 'font' && context.math === MATH.ALWAYS) {\n mathBypass = true;\n prevMath = context.math;\n context.math = MATH.PARENS_DIVISION;\n }\n try {\n context.importantScope.push({});\n evaldValue = this.value.eval(context);\n\n if (!this.variable && evaldValue.type === 'DetachedRuleset') {\n throw { message: 'Rulesets cannot be evaluated on a property.',\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n let important = this.important;\n const importantResult = context.importantScope.pop();\n if (!important && importantResult.important) {\n important = importantResult.important;\n }\n\n return new Declaration(name,\n evaldValue,\n important,\n this.merge,\n this.getIndex(), this.fileInfo(), this.inline,\n variable);\n }\n catch (e) {\n if (typeof e.index !== 'number') {\n e.index = this.getIndex();\n e.filename = this.fileInfo().filename;\n }\n throw e;\n }\n finally {\n if (mathBypass) {\n context.math = prevMath;\n }\n }\n },\n\n makeImportant() {\n return new Declaration(this.name,\n this.value,\n '!important',\n this.merge,\n this.getIndex(), this.fileInfo(), this.inline);\n }\n});\n\nexport default Declaration;","class debugInfo {\n constructor(context, ctx, lineSeparator) {\n let result = '';\n if (context.dumpLineNumbers && !context.compress) {\n switch (context.dumpLineNumbers) {\n case 'comments':\n result = debugInfo.asComment(ctx);\n break;\n case 'mediaquery':\n result = debugInfo.asMediaQuery(ctx);\n break;\n case 'all':\n result = debugInfo.asComment(ctx) + (lineSeparator || '') + debugInfo.asMediaQuery(ctx);\n break;\n }\n }\n return result;\n }\n\n static asComment(ctx) {\n return `/* line ${ctx.debugInfo.lineNumber}, ${ctx.debugInfo.fileName} */\\n`;\n }\n\n static asMediaQuery(ctx) {\n let filenameWithProtocol = ctx.debugInfo.fileName;\n if (!/^[a-z]+:\\/\\//i.test(filenameWithProtocol)) {\n filenameWithProtocol = `file://${filenameWithProtocol}`;\n }\n return `@media -sass-debug-info{filename{font-family:${filenameWithProtocol.replace(/([.:\\/\\\\])/g, function (a) {\n if (a == '\\\\') {\n a = '\\/';\n }\n return `\\\\${a}`;\n })}}line{font-family:\\\\00003${ctx.debugInfo.lineNumber}}}\\n`;\n }\n}\n\nexport default debugInfo;\n","import Node from './node';\nimport getDebugInfo from './debug-info';\n\nconst Comment = function(value, isLineComment, index, currentFileInfo) {\n this.value = value;\n this.isLineComment = isLineComment;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.allowRoot = true;\n}\n\nComment.prototype = Object.assign(new Node(), {\n type: 'Comment',\n\n genCSS(context, output) {\n if (this.debugInfo) {\n output.add(getDebugInfo(context, this), this.fileInfo(), this.getIndex());\n }\n output.add(this.value);\n },\n\n isSilent(context) {\n const isCompressed = context.compress && this.value[2] !== '!';\n return this.isLineComment || isCompressed;\n }\n});\n\nexport default Comment;\n","const contexts = {};\nexport default contexts;\nimport * as Constants from './constants';\n\nconst copyFromOriginal = function copyFromOriginal(original, destination, propertiesToCopy) {\n if (!original) { return; }\n\n for (let i = 0; i < propertiesToCopy.length; i++) {\n if (original.hasOwnProperty(propertiesToCopy[i])) {\n destination[propertiesToCopy[i]] = original[propertiesToCopy[i]];\n }\n }\n};\n\n/*\n parse is used whilst parsing\n */\nconst parseCopyProperties = [\n // options\n 'paths', // option - unmodified - paths to search for imports on\n 'rewriteUrls', // option - whether to adjust URL's to be relative\n 'rootpath', // option - rootpath to append to URL's\n 'strictImports', // option -\n 'insecure', // option - whether to allow imports from insecure ssl hosts\n 'dumpLineNumbers', // option - whether to dump line numbers\n 'compress', // option - whether to compress\n 'syncImport', // option - whether to import synchronously\n 'chunkInput', // option - whether to chunk input. more performant but causes parse issues.\n 'mime', // browser only - mime type for sheet import\n 'useFileCache', // browser only - whether to use the per file session cache\n // context\n 'processImports', // option & context - whether to process imports. if false then imports will not be imported.\n // Used by the import manager to stop multiple import visitors being created.\n 'pluginManager' // Used as the plugin manager for the session\n];\n\ncontexts.Parse = function(options) {\n copyFromOriginal(options, this, parseCopyProperties);\n\n if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n};\n\nconst evalCopyProperties = [\n 'paths', // additional include paths\n 'compress', // whether to compress\n 'math', // whether math has to be within parenthesis\n 'strictUnits', // whether units need to evaluate correctly\n 'sourceMap', // whether to output a source map\n 'importMultiple', // whether we are currently importing multiple copies\n 'urlArgs', // whether to add args into url tokens\n 'javascriptEnabled', // option - whether Inline JavaScript is enabled. if undefined, defaults to false\n 'pluginManager', // Used as the plugin manager for the session\n 'importantScope', // used to bubble up !important statements\n 'rewriteUrls' // option - whether to adjust URL's to be relative\n];\n\ncontexts.Eval = function(options, frames) {\n copyFromOriginal(options, this, evalCopyProperties);\n\n if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n\n this.frames = frames || [];\n this.importantScope = this.importantScope || [];\n};\n\ncontexts.Eval.prototype.enterCalc = function () {\n if (!this.calcStack) {\n this.calcStack = [];\n }\n this.calcStack.push(true);\n this.inCalc = true;\n};\n\ncontexts.Eval.prototype.exitCalc = function () {\n this.calcStack.pop();\n if (!this.calcStack.length) {\n this.inCalc = false;\n }\n};\n\ncontexts.Eval.prototype.inParenthesis = function () {\n if (!this.parensStack) {\n this.parensStack = [];\n }\n this.parensStack.push(true);\n};\n\ncontexts.Eval.prototype.outOfParenthesis = function () {\n this.parensStack.pop();\n};\n\ncontexts.Eval.prototype.inCalc = false;\ncontexts.Eval.prototype.mathOn = true;\ncontexts.Eval.prototype.isMathOn = function (op) {\n if (!this.mathOn) {\n return false;\n }\n if (op === '/' && this.math !== Constants.Math.ALWAYS && (!this.parensStack || !this.parensStack.length)) {\n return false;\n }\n if (this.math > Constants.Math.PARENS_DIVISION) {\n return this.parensStack && this.parensStack.length;\n }\n return true;\n};\n\ncontexts.Eval.prototype.pathRequiresRewrite = function (path) {\n const isRelative = this.rewriteUrls === Constants.RewriteUrls.LOCAL ? isPathLocalRelative : isPathRelative;\n\n return isRelative(path);\n};\n\ncontexts.Eval.prototype.rewritePath = function (path, rootpath) {\n let newPath;\n\n rootpath = rootpath || '';\n newPath = this.normalizePath(rootpath + path);\n\n // If a path was explicit relative and the rootpath was not an absolute path\n // we must ensure that the new path is also explicit relative.\n if (isPathLocalRelative(path) &&\n isPathRelative(rootpath) &&\n isPathLocalRelative(newPath) === false) {\n newPath = `./${newPath}`;\n }\n\n return newPath;\n};\n\ncontexts.Eval.prototype.normalizePath = function (path) {\n const segments = path.split('/').reverse();\n let segment;\n\n path = [];\n while (segments.length !== 0) {\n segment = segments.pop();\n switch ( segment ) {\n case '.':\n break;\n case '..':\n if ((path.length === 0) || (path[path.length - 1] === '..')) {\n path.push( segment );\n } else {\n path.pop();\n }\n break;\n default:\n path.push(segment);\n break;\n }\n }\n\n return path.join('/');\n};\n\nfunction isPathRelative(path) {\n return !/^(?:[a-z-]+:|\\/|#)/i.test(path);\n}\n\nfunction isPathLocalRelative(path) {\n return path.charAt(0) === '.';\n}\n\n// todo - do the same for the toCSS ?\n","function makeRegistry( base ) {\n return {\n _data: {},\n add: function(name, func) {\n // precautionary case conversion, as later querying of\n // the registry by function-caller uses lower case as well.\n name = name.toLowerCase();\n\n if (this._data.hasOwnProperty(name)) {\n // TODO warn\n }\n this._data[name] = func;\n },\n addMultiple: function(functions) {\n Object.keys(functions).forEach(\n name => {\n this.add(name, functions[name]);\n });\n },\n get: function(name) {\n return this._data[name] || ( base && base.get( name ));\n },\n getLocalFunctions: function() {\n return this._data;\n },\n inherit: function() {\n return makeRegistry( this );\n },\n create: function(base) {\n return makeRegistry(base);\n }\n };\n}\n\nexport default makeRegistry( null );","import Keyword from '../tree/keyword';\n\nconst defaultFunc = {\n eval: function () {\n const v = this.value_;\n const e = this.error_;\n if (e) {\n throw e;\n }\n if (v != null) {\n return v ? Keyword.True : Keyword.False;\n }\n },\n value: function (v) {\n this.value_ = v;\n },\n error: function (e) {\n this.error_ = e;\n },\n reset: function () {\n this.value_ = this.error_ = null;\n }\n};\n\nexport default defaultFunc;\n","import Node from './node';\nimport Declaration from './declaration';\nimport Keyword from './keyword';\nimport Comment from './comment';\nimport Paren from './paren';\nimport Selector from './selector';\nimport Element from './element';\nimport Anonymous from './anonymous';\nimport contexts from '../contexts';\nimport globalFunctionRegistry from '../functions/function-registry';\nimport defaultFunc from '../functions/default';\nimport getDebugInfo from './debug-info';\nimport * as utils from '../utils';\n\nconst Ruleset = function(selectors, rules, strictImports, visibilityInfo) {\n this.selectors = selectors;\n this.rules = rules;\n this._lookups = {};\n this._variables = null;\n this._properties = null;\n this.strictImports = strictImports;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n\n this.setParent(this.selectors, this);\n this.setParent(this.rules, this);\n}\n\nRuleset.prototype = Object.assign(new Node(), {\n type: 'Ruleset',\n isRuleset: true,\n\n isRulesetLike() { return true; },\n\n accept(visitor) {\n if (this.paths) {\n this.paths = visitor.visitArray(this.paths, true);\n } else if (this.selectors) {\n this.selectors = visitor.visitArray(this.selectors);\n }\n if (this.rules && this.rules.length) {\n this.rules = visitor.visitArray(this.rules);\n }\n },\n\n eval(context) {\n const that = this;\n let selectors;\n let selCnt;\n let selector;\n let i;\n let hasVariable;\n let hasOnePassingSelector = false;\n\n if (this.selectors && (selCnt = this.selectors.length)) {\n selectors = new Array(selCnt);\n defaultFunc.error({\n type: 'Syntax',\n message: 'it is currently only allowed in parametric mixin guards,'\n });\n\n for (i = 0; i < selCnt; i++) {\n selector = this.selectors[i].eval(context);\n for (var j = 0; j < selector.elements.length; j++) {\n if (selector.elements[j].isVariable) {\n hasVariable = true;\n break;\n }\n }\n selectors[i] = selector;\n if (selector.evaldCondition) {\n hasOnePassingSelector = true;\n }\n }\n\n if (hasVariable) {\n const toParseSelectors = new Array(selCnt);\n for (i = 0; i < selCnt; i++) {\n selector = selectors[i];\n toParseSelectors[i] = selector.toCSS(context);\n }\n this.parse.parseNode(\n toParseSelectors.join(','),\n [\"selectors\"], \n selectors[0].getIndex(), \n selectors[0].fileInfo(), \n function(err, result) {\n if (result) {\n selectors = utils.flattenArray(result);\n }\n });\n }\n\n defaultFunc.reset();\n } else {\n hasOnePassingSelector = true;\n }\n\n let rules = this.rules ? utils.copyArray(this.rules) : null;\n const ruleset = new Ruleset(selectors, rules, this.strictImports, this.visibilityInfo());\n let rule;\n let subRule;\n\n ruleset.originalRuleset = this;\n ruleset.root = this.root;\n ruleset.firstRoot = this.firstRoot;\n ruleset.allowImports = this.allowImports;\n\n if (this.debugInfo) {\n ruleset.debugInfo = this.debugInfo;\n }\n\n if (!hasOnePassingSelector) {\n rules.length = 0;\n }\n\n // inherit a function registry from the frames stack when possible;\n // otherwise from the global registry\n ruleset.functionRegistry = (function (frames) {\n let i = 0;\n const n = frames.length;\n let found;\n for ( ; i !== n ; ++i ) {\n found = frames[ i ].functionRegistry;\n if ( found ) { return found; }\n }\n return globalFunctionRegistry;\n }(context.frames)).inherit();\n\n // push the current ruleset to the frames stack\n const ctxFrames = context.frames;\n ctxFrames.unshift(ruleset);\n\n // currrent selectors\n let ctxSelectors = context.selectors;\n if (!ctxSelectors) {\n context.selectors = ctxSelectors = [];\n }\n ctxSelectors.unshift(this.selectors);\n\n // Evaluate imports\n if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) {\n ruleset.evalImports(context);\n }\n\n // Store the frames around mixin definitions,\n // so they can be evaluated like closures when the time comes.\n const rsRules = ruleset.rules;\n for (i = 0; (rule = rsRules[i]); i++) {\n if (rule.evalFirst) {\n rsRules[i] = rule.eval(context);\n }\n }\n\n const mediaBlockCount = (context.mediaBlocks && context.mediaBlocks.length) || 0;\n\n // Evaluate mixin calls.\n for (i = 0; (rule = rsRules[i]); i++) {\n if (rule.type === 'MixinCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).filter(function(r) {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope if the variable is\n // already there. consider returning false here\n // but we need a way to \"return\" variable from mixins\n return !(ruleset.variable(r.name));\n }\n return true;\n });\n rsRules.splice.apply(rsRules, [i, 1].concat(rules));\n i += rules.length - 1;\n ruleset.resetCache();\n } else if (rule.type === 'VariableCall') {\n /* jshint loopfunc:true */\n rules = rule.eval(context).rules.filter(function(r) {\n if ((r instanceof Declaration) && r.variable) {\n // do not pollute the scope at all\n return false;\n }\n return true;\n });\n rsRules.splice.apply(rsRules, [i, 1].concat(rules));\n i += rules.length - 1;\n ruleset.resetCache();\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n if (!rule.evalFirst) {\n rsRules[i] = rule = rule.eval ? rule.eval(context) : rule;\n }\n }\n\n // Evaluate everything else\n for (i = 0; (rule = rsRules[i]); i++) {\n // for rulesets, check if it is a css guard and can be removed\n if (rule instanceof Ruleset && rule.selectors && rule.selectors.length === 1) {\n // check if it can be folded in (e.g. & where)\n if (rule.selectors[0] && rule.selectors[0].isJustParentSelector()) {\n rsRules.splice(i--, 1);\n\n for (var j = 0; (subRule = rule.rules[j]); j++) {\n if (subRule instanceof Node) {\n subRule.copyVisibilityInfo(rule.visibilityInfo());\n if (!(subRule instanceof Declaration) || !subRule.variable) {\n rsRules.splice(++i, 0, subRule);\n }\n }\n }\n }\n }\n }\n\n // Pop the stack\n ctxFrames.shift();\n ctxSelectors.shift();\n\n if (context.mediaBlocks) {\n for (i = mediaBlockCount; i < context.mediaBlocks.length; i++) {\n context.mediaBlocks[i].bubbleSelectors(selectors);\n }\n }\n\n return ruleset;\n },\n\n evalImports(context) {\n const rules = this.rules;\n let i;\n let importRules;\n if (!rules) { return; }\n\n for (i = 0; i < rules.length; i++) {\n if (rules[i].type === 'Import') {\n importRules = rules[i].eval(context);\n if (importRules && (importRules.length || importRules.length === 0)) {\n rules.splice.apply(rules, [i, 1].concat(importRules));\n i += importRules.length - 1;\n } else {\n rules.splice(i, 1, importRules);\n }\n this.resetCache();\n }\n }\n },\n\n makeImportant() {\n const result = new Ruleset(this.selectors, this.rules.map(function (r) {\n if (r.makeImportant) {\n return r.makeImportant();\n } else {\n return r;\n }\n }), this.strictImports, this.visibilityInfo());\n\n return result;\n },\n\n matchArgs(args) {\n return !args || args.length === 0;\n },\n\n // lets you call a css selector with a guard\n matchCondition(args, context) {\n const lastSelector = this.selectors[this.selectors.length - 1];\n if (!lastSelector.evaldCondition) {\n return false;\n }\n if (lastSelector.condition &&\n !lastSelector.condition.eval(\n new contexts.Eval(context,\n context.frames))) {\n return false;\n }\n return true;\n },\n\n resetCache() {\n this._rulesets = null;\n this._variables = null;\n this._properties = null;\n this._lookups = {};\n },\n\n variables() {\n if (!this._variables) {\n this._variables = !this.rules ? {} : this.rules.reduce(function (hash, r) {\n if (r instanceof Declaration && r.variable === true) {\n hash[r.name] = r;\n }\n // when evaluating variables in an import statement, imports have not been eval'd\n // so we need to go inside import statements.\n // guard against root being a string (in the case of inlined less)\n if (r.type === 'Import' && r.root && r.root.variables) {\n const vars = r.root.variables();\n for (const name in vars) {\n if (vars.hasOwnProperty(name)) {\n hash[name] = r.root.variable(name);\n }\n }\n }\n return hash;\n }, {});\n }\n return this._variables;\n },\n\n properties() {\n if (!this._properties) {\n this._properties = !this.rules ? {} : this.rules.reduce(function (hash, r) {\n if (r instanceof Declaration && r.variable !== true) {\n const name = (r.name.length === 1) && (r.name[0] instanceof Keyword) ?\n r.name[0].value : r.name;\n // Properties don't overwrite as they can merge\n if (!hash[`$${name}`]) {\n hash[`$${name}`] = [ r ];\n }\n else {\n hash[`$${name}`].push(r);\n }\n }\n return hash;\n }, {});\n }\n return this._properties;\n },\n\n variable(name) {\n const decl = this.variables()[name];\n if (decl) {\n return this.parseValue(decl);\n }\n },\n\n property(name) {\n const decl = this.properties()[name];\n if (decl) {\n return this.parseValue(decl);\n }\n },\n\n lastDeclaration() {\n for (let i = this.rules.length; i > 0; i--) {\n const decl = this.rules[i - 1];\n if (decl instanceof Declaration) {\n return this.parseValue(decl);\n }\n }\n },\n\n parseValue(toParse) {\n const self = this;\n function transformDeclaration(decl) {\n if (decl.value instanceof Anonymous && !decl.parsed) {\n if (typeof decl.value.value === 'string') {\n this.parse.parseNode(\n decl.value.value,\n ['value', 'important'], \n decl.value.getIndex(), \n decl.fileInfo(), \n function(err, result) {\n if (err) {\n decl.parsed = true;\n }\n if (result) {\n decl.value = result[0];\n decl.important = result[1] || '';\n decl.parsed = true;\n }\n });\n } else {\n decl.parsed = true;\n }\n\n return decl;\n }\n else {\n return decl;\n }\n }\n if (!Array.isArray(toParse)) {\n return transformDeclaration.call(self, toParse);\n }\n else {\n const nodes = [];\n toParse.forEach(function(n) {\n nodes.push(transformDeclaration.call(self, n));\n });\n return nodes;\n }\n },\n\n rulesets() {\n if (!this.rules) { return []; }\n\n const filtRules = [];\n const rules = this.rules;\n let i;\n let rule;\n\n for (i = 0; (rule = rules[i]); i++) {\n if (rule.isRuleset) {\n filtRules.push(rule);\n }\n }\n\n return filtRules;\n },\n\n prependRule(rule) {\n const rules = this.rules;\n if (rules) {\n rules.unshift(rule);\n } else {\n this.rules = [ rule ];\n }\n this.setParent(rule, this);\n },\n\n find(selector, self, filter) {\n self = self || this;\n const rules = [];\n let match;\n let foundMixins;\n const key = selector.toCSS();\n\n if (key in this._lookups) { return this._lookups[key]; }\n\n this.rulesets().forEach(function (rule) {\n if (rule !== self) {\n for (let j = 0; j < rule.selectors.length; j++) {\n match = selector.match(rule.selectors[j]);\n if (match) {\n if (selector.elements.length > match) {\n if (!filter || filter(rule)) {\n foundMixins = rule.find(new Selector(selector.elements.slice(match)), self, filter);\n for (let i = 0; i < foundMixins.length; ++i) {\n foundMixins[i].path.push(rule);\n }\n Array.prototype.push.apply(rules, foundMixins);\n }\n } else {\n rules.push({ rule, path: []});\n }\n break;\n }\n }\n }\n });\n this._lookups[key] = rules;\n return rules;\n },\n\n genCSS(context, output) {\n let i;\n let j;\n const charsetRuleNodes = [];\n let ruleNodes = [];\n\n let // Line number debugging\n debugInfo;\n\n let rule;\n let path;\n\n context.tabLevel = (context.tabLevel || 0);\n\n if (!this.root) {\n context.tabLevel++;\n }\n\n const tabRuleStr = context.compress ? '' : Array(context.tabLevel + 1).join(' ');\n const tabSetStr = context.compress ? '' : Array(context.tabLevel).join(' ');\n let sep;\n\n let charsetNodeIndex = 0;\n let importNodeIndex = 0;\n for (i = 0; (rule = this.rules[i]); i++) {\n if (rule instanceof Comment) {\n if (importNodeIndex === i) {\n importNodeIndex++;\n }\n ruleNodes.push(rule);\n } else if (rule.isCharset && rule.isCharset()) {\n ruleNodes.splice(charsetNodeIndex, 0, rule);\n charsetNodeIndex++;\n importNodeIndex++;\n } else if (rule.type === 'Import') {\n ruleNodes.splice(importNodeIndex, 0, rule);\n importNodeIndex++;\n } else {\n ruleNodes.push(rule);\n }\n }\n ruleNodes = charsetRuleNodes.concat(ruleNodes);\n\n // If this is the root node, we don't render\n // a selector, or {}.\n if (!this.root) {\n debugInfo = getDebugInfo(context, this, tabSetStr);\n\n if (debugInfo) {\n output.add(debugInfo);\n output.add(tabSetStr);\n }\n\n const paths = this.paths;\n const pathCnt = paths.length;\n let pathSubCnt;\n\n sep = context.compress ? ',' : (`,\\n${tabSetStr}`);\n\n for (i = 0; i < pathCnt; i++) {\n path = paths[i];\n if (!(pathSubCnt = path.length)) { continue; }\n if (i > 0) { output.add(sep); }\n\n context.firstSelector = true;\n path[0].genCSS(context, output);\n\n context.firstSelector = false;\n for (j = 1; j < pathSubCnt; j++) {\n path[j].genCSS(context, output);\n }\n }\n\n output.add((context.compress ? '{' : ' {\\n') + tabRuleStr);\n }\n\n // Compile rules and rulesets\n for (i = 0; (rule = ruleNodes[i]); i++) {\n\n if (i + 1 === ruleNodes.length) {\n context.lastRule = true;\n }\n\n const currentLastRule = context.lastRule;\n if (rule.isRulesetLike(rule)) {\n context.lastRule = false;\n }\n\n if (rule.genCSS) {\n rule.genCSS(context, output);\n } else if (rule.value) {\n output.add(rule.value.toString());\n }\n\n context.lastRule = currentLastRule;\n\n if (!context.lastRule && rule.isVisible()) {\n output.add(context.compress ? '' : (`\\n${tabRuleStr}`));\n } else {\n context.lastRule = false;\n }\n }\n\n if (!this.root) {\n output.add((context.compress ? '}' : `\\n${tabSetStr}}`));\n context.tabLevel--;\n }\n\n if (!output.isEmpty() && !context.compress && this.firstRoot) {\n output.add('\\n');\n }\n },\n\n joinSelectors(paths, context, selectors) {\n for (let s = 0; s < selectors.length; s++) {\n this.joinSelector(paths, context, selectors[s]);\n }\n },\n\n joinSelector(paths, context, selector) {\n\n function createParenthesis(elementsToPak, originalElement) {\n let replacementParen, j;\n if (elementsToPak.length === 0) {\n replacementParen = new Paren(elementsToPak[0]);\n } else {\n const insideParent = new Array(elementsToPak.length);\n for (j = 0; j < elementsToPak.length; j++) {\n insideParent[j] = new Element(\n null,\n elementsToPak[j],\n originalElement.isVariable,\n originalElement._index,\n originalElement._fileInfo\n );\n }\n replacementParen = new Paren(new Selector(insideParent));\n }\n return replacementParen;\n }\n\n function createSelector(containedElement, originalElement) {\n let element, selector;\n element = new Element(null, containedElement, originalElement.isVariable, originalElement._index, originalElement._fileInfo);\n selector = new Selector([element]);\n return selector;\n }\n\n // joins selector path from `beginningPath` with selector path in `addPath`\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns concatenated path\n function addReplacementIntoPath(beginningPath, addPath, replacedElement, originalSelector) {\n let newSelectorPath, lastSelector, newJoinedSelector;\n // our new selector path\n newSelectorPath = [];\n\n // construct the joined selector - if & is the first thing this will be empty,\n // if not newJoinedSelector will be the last set of elements in the selector\n if (beginningPath.length > 0) {\n newSelectorPath = utils.copyArray(beginningPath);\n lastSelector = newSelectorPath.pop();\n newJoinedSelector = originalSelector.createDerived(utils.copyArray(lastSelector.elements));\n }\n else {\n newJoinedSelector = originalSelector.createDerived([]);\n }\n\n if (addPath.length > 0) {\n // /deep/ is a CSS4 selector - (removed, so should deprecate)\n // that is valid without anything in front of it\n // so if the & does not have a combinator that is \"\" or \" \" then\n // and there is a combinator on the parent, then grab that.\n // this also allows + a { & .b { .a & { ... though not sure why you would want to do that\n let combinator = replacedElement.combinator;\n\n const parentEl = addPath[0].elements[0];\n if (combinator.emptyOrWhitespace && !parentEl.combinator.emptyOrWhitespace) {\n combinator = parentEl.combinator;\n }\n // join the elements so far with the first part of the parent\n newJoinedSelector.elements.push(new Element(\n combinator,\n parentEl.value,\n replacedElement.isVariable,\n replacedElement._index,\n replacedElement._fileInfo\n ));\n newJoinedSelector.elements = newJoinedSelector.elements.concat(addPath[0].elements.slice(1));\n }\n\n // now add the joined selector - but only if it is not empty\n if (newJoinedSelector.elements.length !== 0) {\n newSelectorPath.push(newJoinedSelector);\n }\n\n // put together the parent selectors after the join (e.g. the rest of the parent)\n if (addPath.length > 1) {\n let restOfPath = addPath.slice(1);\n restOfPath = restOfPath.map(function (selector) {\n return selector.createDerived(selector.elements, []);\n });\n newSelectorPath = newSelectorPath.concat(restOfPath);\n }\n return newSelectorPath;\n }\n\n // joins selector path from `beginningPath` with every selector path in `addPaths` array\n // `replacedElement` contains element that is being replaced by `addPath`\n // returns array with all concatenated paths\n function addAllReplacementsIntoPath( beginningPath, addPaths, replacedElement, originalSelector, result) {\n let j;\n for (j = 0; j < beginningPath.length; j++) {\n const newSelectorPath = addReplacementIntoPath(beginningPath[j], addPaths, replacedElement, originalSelector);\n result.push(newSelectorPath);\n }\n return result;\n }\n\n function mergeElementsOnToSelectors(elements, selectors) {\n let i, sel;\n\n if (elements.length === 0) {\n return ;\n }\n if (selectors.length === 0) {\n selectors.push([ new Selector(elements) ]);\n return;\n }\n\n for (i = 0; (sel = selectors[i]); i++) {\n // if the previous thing in sel is a parent this needs to join on to it\n if (sel.length > 0) {\n sel[sel.length - 1] = sel[sel.length - 1].createDerived(sel[sel.length - 1].elements.concat(elements));\n }\n else {\n sel.push(new Selector(elements));\n }\n }\n }\n\n // replace all parent selectors inside `inSelector` by content of `context` array\n // resulting selectors are returned inside `paths` array\n // returns true if `inSelector` contained at least one parent selector\n function replaceParentSelector(paths, context, inSelector) {\n // The paths are [[Selector]]\n // The first list is a list of comma separated selectors\n // The inner list is a list of inheritance separated selectors\n // e.g.\n // .a, .b {\n // .c {\n // }\n // }\n // == [[.a] [.c]] [[.b] [.c]]\n //\n let i, j, k, currentElements, newSelectors, selectorsMultiplied, sel, el, hadParentSelector = false, length, lastSelector;\n function findNestedSelector(element) {\n let maybeSelector;\n if (!(element.value instanceof Paren)) {\n return null;\n }\n\n maybeSelector = element.value.value;\n if (!(maybeSelector instanceof Selector)) {\n return null;\n }\n\n return maybeSelector;\n }\n\n // the elements from the current selector so far\n currentElements = [];\n // the current list of new selectors to add to the path.\n // We will build it up. We initiate it with one empty selector as we \"multiply\" the new selectors\n // by the parents\n newSelectors = [\n []\n ];\n\n for (i = 0; (el = inSelector.elements[i]); i++) {\n // non parent reference elements just get added\n if (el.value !== '&') {\n const nestedSelector = findNestedSelector(el);\n if (nestedSelector != null) {\n // merge the current list of non parent selector elements\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n const nestedPaths = [];\n let replaced;\n const replacedNewSelectors = [];\n replaced = replaceParentSelector(nestedPaths, context, nestedSelector);\n hadParentSelector = hadParentSelector || replaced;\n // the nestedPaths array should have only one member - replaceParentSelector does not multiply selectors\n for (k = 0; k < nestedPaths.length; k++) {\n const replacementSelector = createSelector(createParenthesis(nestedPaths[k], el), el);\n addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors);\n }\n newSelectors = replacedNewSelectors;\n currentElements = [];\n } else {\n currentElements.push(el);\n }\n\n } else {\n hadParentSelector = true;\n // the new list of selectors to add\n selectorsMultiplied = [];\n\n // merge the current list of non parent selector elements\n // on to the current list of selectors to add\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n // loop through our current selectors\n for (j = 0; j < newSelectors.length; j++) {\n sel = newSelectors[j];\n // if we don't have any parent paths, the & might be in a mixin so that it can be used\n // whether there are parents or not\n if (context.length === 0) {\n // the combinator used on el should now be applied to the next element instead so that\n // it is not lost\n if (sel.length > 0) {\n sel[0].elements.push(new Element(el.combinator, '', el.isVariable, el._index, el._fileInfo));\n }\n selectorsMultiplied.push(sel);\n }\n else {\n // and the parent selectors\n for (k = 0; k < context.length; k++) {\n // We need to put the current selectors\n // then join the last selector's elements on to the parents selectors\n const newSelectorPath = addReplacementIntoPath(sel, context[k], el, inSelector);\n // add that to our new set of selectors\n selectorsMultiplied.push(newSelectorPath);\n }\n }\n }\n\n // our new selectors has been multiplied, so reset the state\n newSelectors = selectorsMultiplied;\n currentElements = [];\n }\n }\n\n // if we have any elements left over (e.g. .a& .b == .b)\n // add them on to all the current selectors\n mergeElementsOnToSelectors(currentElements, newSelectors);\n\n for (i = 0; i < newSelectors.length; i++) {\n length = newSelectors[i].length;\n if (length > 0) {\n paths.push(newSelectors[i]);\n lastSelector = newSelectors[i][length - 1];\n newSelectors[i][length - 1] = lastSelector.createDerived(lastSelector.elements, inSelector.extendList);\n }\n }\n\n return hadParentSelector;\n }\n\n function deriveSelector(visibilityInfo, deriveFrom) {\n const newSelector = deriveFrom.createDerived(deriveFrom.elements, deriveFrom.extendList, deriveFrom.evaldCondition);\n newSelector.copyVisibilityInfo(visibilityInfo);\n return newSelector;\n }\n\n // joinSelector code follows\n let i, newPaths, hadParentSelector;\n\n newPaths = [];\n hadParentSelector = replaceParentSelector(newPaths, context, selector);\n\n if (!hadParentSelector) {\n if (context.length > 0) {\n newPaths = [];\n for (i = 0; i < context.length; i++) {\n\n const concatenated = context[i].map(deriveSelector.bind(this, selector.visibilityInfo()));\n\n concatenated.push(selector);\n newPaths.push(concatenated);\n }\n }\n else {\n newPaths = [[selector]];\n }\n }\n\n for (i = 0; i < newPaths.length; i++) {\n paths.push(newPaths[i]);\n }\n\n }\n});\n\nexport default Ruleset;\n","import Node from './node';\nimport Selector from './selector';\nimport Ruleset from './ruleset';\nimport Anonymous from './anonymous';\n\nconst AtRule = function(\n name,\n value,\n rules,\n index,\n currentFileInfo,\n debugInfo,\n isRooted,\n visibilityInfo\n) {\n let i;\n\n this.name = name;\n this.value = (value instanceof Node) ? value : (value ? new Anonymous(value) : value);\n if (rules) {\n if (Array.isArray(rules)) {\n this.rules = rules;\n } else {\n this.rules = [rules];\n this.rules[0].selectors = (new Selector([], null, null, index, currentFileInfo)).createEmptySelectors();\n }\n for (i = 0; i < this.rules.length; i++) {\n this.rules[i].allowImports = true;\n }\n this.setParent(this.rules, this);\n }\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.debugInfo = debugInfo;\n this.isRooted = isRooted || false;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n}\n\nAtRule.prototype = Object.assign(new Node(), {\n type: 'AtRule',\n accept(visitor) {\n const value = this.value, rules = this.rules;\n if (rules) {\n this.rules = visitor.visitArray(rules);\n }\n if (value) {\n this.value = visitor.visit(value);\n }\n },\n\n isRulesetLike() {\n return this.rules || !this.isCharset();\n },\n\n isCharset() {\n return '@charset' === this.name;\n },\n\n genCSS(context, output) {\n const value = this.value, rules = this.rules;\n output.add(this.name, this.fileInfo(), this.getIndex());\n if (value) {\n output.add(' ');\n value.genCSS(context, output);\n }\n if (rules) {\n this.outputRuleset(context, output, rules);\n } else {\n output.add(';');\n }\n },\n\n eval(context) {\n let mediaPathBackup, mediaBlocksBackup, value = this.value, rules = this.rules;\n\n // media stored inside other atrule should not bubble over it\n // backpup media bubbling information\n mediaPathBackup = context.mediaPath;\n mediaBlocksBackup = context.mediaBlocks;\n // deleted media bubbling information\n context.mediaPath = [];\n context.mediaBlocks = [];\n\n if (value) {\n value = value.eval(context);\n }\n if (rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n rules = [rules[0].eval(context)];\n rules[0].root = true;\n }\n // restore media bubbling information\n context.mediaPath = mediaPathBackup;\n context.mediaBlocks = mediaBlocksBackup;\n\n return new AtRule(this.name, value, rules,\n this.getIndex(), this.fileInfo(), this.debugInfo, this.isRooted, this.visibilityInfo());\n },\n\n variable(name) {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.variable.call(this.rules[0], name);\n }\n },\n\n find() {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.find.apply(this.rules[0], arguments);\n }\n },\n\n rulesets() {\n if (this.rules) {\n // assuming that there is only one rule at this point - that is how parser constructs the rule\n return Ruleset.prototype.rulesets.apply(this.rules[0]);\n }\n },\n\n outputRuleset(context, output, rules) {\n const ruleCnt = rules.length;\n let i;\n context.tabLevel = (context.tabLevel | 0) + 1;\n\n // Compressed\n if (context.compress) {\n output.add('{');\n for (i = 0; i < ruleCnt; i++) {\n rules[i].genCSS(context, output);\n }\n output.add('}');\n context.tabLevel--;\n return;\n }\n\n // Non-compressed\n const tabSetStr = `\\n${Array(context.tabLevel).join(' ')}`, tabRuleStr = `${tabSetStr} `;\n if (!ruleCnt) {\n output.add(` {${tabSetStr}}`);\n } else {\n output.add(` {${tabRuleStr}`);\n rules[0].genCSS(context, output);\n for (i = 1; i < ruleCnt; i++) {\n output.add(tabRuleStr);\n rules[i].genCSS(context, output);\n }\n output.add(`${tabSetStr}}`);\n }\n\n context.tabLevel--;\n }\n});\n\nexport default AtRule;\n","import Node from './node';\nimport contexts from '../contexts';\nimport * as utils from '../utils';\n\nconst DetachedRuleset = function(ruleset, frames) {\n this.ruleset = ruleset;\n this.frames = frames;\n this.setParent(this.ruleset, this);\n};\n\nDetachedRuleset.prototype = Object.assign(new Node(), {\n type: 'DetachedRuleset',\n evalFirst: true,\n\n accept(visitor) {\n this.ruleset = visitor.visit(this.ruleset);\n },\n\n eval(context) {\n const frames = this.frames || utils.copyArray(context.frames);\n return new DetachedRuleset(this.ruleset, frames);\n },\n\n callEval(context) {\n return this.ruleset.eval(this.frames ? new contexts.Eval(context, this.frames.concat(context.frames)) : context);\n }\n});\n\nexport default DetachedRuleset;\n","import Node from './node';\nimport unitConversions from '../data/unit-conversions';\nimport * as utils from '../utils';\n\nconst Unit = function(numerator, denominator, backupUnit) {\n this.numerator = numerator ? utils.copyArray(numerator).sort() : [];\n this.denominator = denominator ? utils.copyArray(denominator).sort() : [];\n if (backupUnit) {\n this.backupUnit = backupUnit;\n } else if (numerator && numerator.length) {\n this.backupUnit = numerator[0];\n }\n};\n\nUnit.prototype = Object.assign(new Node(), {\n type: 'Unit',\n\n clone() {\n return new Unit(utils.copyArray(this.numerator), utils.copyArray(this.denominator), this.backupUnit);\n },\n\n genCSS(context, output) {\n // Dimension checks the unit is singular and throws an error if in strict math mode.\n const strictUnits = context && context.strictUnits;\n if (this.numerator.length === 1) {\n output.add(this.numerator[0]); // the ideal situation\n } else if (!strictUnits && this.backupUnit) {\n output.add(this.backupUnit);\n } else if (!strictUnits && this.denominator.length) {\n output.add(this.denominator[0]);\n }\n },\n\n toString() {\n let i, returnStr = this.numerator.join('*');\n for (i = 0; i < this.denominator.length; i++) {\n returnStr += `/${this.denominator[i]}`;\n }\n return returnStr;\n },\n\n compare(other) {\n return this.is(other.toString()) ? 0 : undefined;\n },\n\n is(unitString) {\n return this.toString().toUpperCase() === unitString.toUpperCase();\n },\n\n isLength() {\n return RegExp('^(px|em|ex|ch|rem|in|cm|mm|pc|pt|ex|vw|vh|vmin|vmax)$', 'gi').test(this.toCSS());\n },\n\n isEmpty() {\n return this.numerator.length === 0 && this.denominator.length === 0;\n },\n\n isSingular() {\n return this.numerator.length <= 1 && this.denominator.length === 0;\n },\n\n map(callback) {\n let i;\n\n for (i = 0; i < this.numerator.length; i++) {\n this.numerator[i] = callback(this.numerator[i], false);\n }\n\n for (i = 0; i < this.denominator.length; i++) {\n this.denominator[i] = callback(this.denominator[i], true);\n }\n },\n\n usedUnits() {\n let group;\n const result = {};\n let mapUnit;\n let groupName;\n\n mapUnit = function (atomicUnit) {\n /* jshint loopfunc:true */\n if (group.hasOwnProperty(atomicUnit) && !result[groupName]) {\n result[groupName] = atomicUnit;\n }\n\n return atomicUnit;\n };\n\n for (groupName in unitConversions) {\n if (unitConversions.hasOwnProperty(groupName)) {\n group = unitConversions[groupName];\n\n this.map(mapUnit);\n }\n }\n\n return result;\n },\n\n cancel() {\n const counter = {};\n let atomicUnit;\n let i;\n\n for (i = 0; i < this.numerator.length; i++) {\n atomicUnit = this.numerator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) + 1;\n }\n\n for (i = 0; i < this.denominator.length; i++) {\n atomicUnit = this.denominator[i];\n counter[atomicUnit] = (counter[atomicUnit] || 0) - 1;\n }\n\n this.numerator = [];\n this.denominator = [];\n\n for (atomicUnit in counter) {\n if (counter.hasOwnProperty(atomicUnit)) {\n const count = counter[atomicUnit];\n\n if (count > 0) {\n for (i = 0; i < count; i++) {\n this.numerator.push(atomicUnit);\n }\n } else if (count < 0) {\n for (i = 0; i < -count; i++) {\n this.denominator.push(atomicUnit);\n }\n }\n }\n }\n\n this.numerator.sort();\n this.denominator.sort();\n }\n});\n\nexport default Unit;\n","import Node from './node';\nimport unitConversions from '../data/unit-conversions';\nimport Unit from './unit';\nimport Color from './color';\n\n//\n// A number with a unit\n//\nconst Dimension = function(value, unit) {\n this.value = parseFloat(value);\n if (isNaN(this.value)) {\n throw new Error('Dimension is not a number.');\n }\n this.unit = (unit && unit instanceof Unit) ? unit :\n new Unit(unit ? [unit] : undefined);\n this.setParent(this.unit, this);\n};\n\nDimension.prototype = Object.assign(new Node(), {\n type: 'Dimension',\n\n accept(visitor) {\n this.unit = visitor.visit(this.unit);\n },\n\n eval(context) {\n return this;\n },\n\n toColor() {\n return new Color([this.value, this.value, this.value]);\n },\n\n genCSS(context, output) {\n if ((context && context.strictUnits) && !this.unit.isSingular()) {\n throw new Error(`Multiple units in dimension. Correct the units or use the unit function. Bad unit: ${this.unit.toString()}`);\n }\n\n const value = this.fround(context, this.value);\n let strValue = String(value);\n\n if (value !== 0 && value < 0.000001 && value > -0.000001) {\n // would be output 1e-6 etc.\n strValue = value.toFixed(20).replace(/0+$/, '');\n }\n\n if (context && context.compress) {\n // Zero values doesn't need a unit\n if (value === 0 && this.unit.isLength()) {\n output.add(strValue);\n return;\n }\n\n // Float values doesn't need a leading zero\n if (value > 0 && value < 1) {\n strValue = (strValue).substr(1);\n }\n }\n\n output.add(strValue);\n this.unit.genCSS(context, output);\n },\n\n // In an operation between two Dimensions,\n // we default to the first Dimension's unit,\n // so `1px + 2` will yield `3px`.\n operate(context, op, other) {\n /* jshint noempty:false */\n let value = this._operate(context, op, this.value, other.value), unit = this.unit.clone();\n\n if (op === '+' || op === '-') {\n if (unit.numerator.length === 0 && unit.denominator.length === 0) {\n unit = other.unit.clone();\n if (this.unit.backupUnit) {\n unit.backupUnit = this.unit.backupUnit;\n }\n } else if (other.unit.numerator.length === 0 && unit.denominator.length === 0) {\n // do nothing\n } else {\n other = other.convertTo(this.unit.usedUnits());\n\n if (context.strictUnits && other.unit.toString() !== unit.toString()) {\n throw new Error(`Incompatible units. Change the units or use the unit function. `\n + `Bad units: '${unit.toString()}' and '${other.unit.toString()}'.`);\n }\n\n value = this._operate(context, op, this.value, other.value);\n }\n } else if (op === '*') {\n unit.numerator = unit.numerator.concat(other.unit.numerator).sort();\n unit.denominator = unit.denominator.concat(other.unit.denominator).sort();\n unit.cancel();\n } else if (op === '/') {\n unit.numerator = unit.numerator.concat(other.unit.denominator).sort();\n unit.denominator = unit.denominator.concat(other.unit.numerator).sort();\n unit.cancel();\n }\n return new Dimension(value, unit);\n },\n\n compare(other) {\n let a, b;\n\n if (!(other instanceof Dimension)) {\n return undefined;\n }\n\n if (this.unit.isEmpty() || other.unit.isEmpty()) {\n a = this;\n b = other;\n } else {\n a = this.unify();\n b = other.unify();\n if (a.unit.compare(b.unit) !== 0) {\n return undefined;\n }\n }\n\n return Node.numericCompare(a.value, b.value);\n },\n\n unify() {\n return this.convertTo({ length: 'px', duration: 's', angle: 'rad' });\n },\n\n convertTo(conversions) {\n let value = this.value;\n const unit = this.unit.clone();\n let i;\n let groupName;\n let group;\n let targetUnit;\n let derivedConversions = {};\n let applyUnit;\n\n if (typeof conversions === 'string') {\n for (i in unitConversions) {\n if (unitConversions[i].hasOwnProperty(conversions)) {\n derivedConversions = {};\n derivedConversions[i] = conversions;\n }\n }\n conversions = derivedConversions;\n }\n applyUnit = function (atomicUnit, denominator) {\n /* jshint loopfunc:true */\n if (group.hasOwnProperty(atomicUnit)) {\n if (denominator) {\n value = value / (group[atomicUnit] / group[targetUnit]);\n } else {\n value = value * (group[atomicUnit] / group[targetUnit]);\n }\n\n return targetUnit;\n }\n\n return atomicUnit;\n };\n\n for (groupName in conversions) {\n if (conversions.hasOwnProperty(groupName)) {\n targetUnit = conversions[groupName];\n group = unitConversions[groupName];\n\n unit.map(applyUnit);\n }\n }\n\n unit.cancel();\n\n return new Dimension(value, unit);\n }\n});\n\nexport default Dimension;\n","import Node from './node';\nimport Color from './color';\nimport Dimension from './dimension';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\n\nconst Operation = function(op, operands, isSpaced) {\n this.op = op.trim();\n this.operands = operands;\n this.isSpaced = isSpaced;\n};\n\nOperation.prototype = Object.assign(new Node(), {\n type: 'Operation',\n\n accept(visitor) {\n this.operands = visitor.visitArray(this.operands);\n },\n\n eval(context) {\n let a = this.operands[0].eval(context), b = this.operands[1].eval(context), op;\n\n if (context.isMathOn(this.op)) {\n op = this.op === './' ? '/' : this.op;\n if (a instanceof Dimension && b instanceof Color) {\n a = a.toColor();\n }\n if (b instanceof Dimension && a instanceof Color) {\n b = b.toColor();\n }\n if (!a.operate) {\n if (a instanceof Operation && a.op === '/' && context.math === MATH.PARENS_DIVISION) {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n throw { type: 'Operation',\n message: 'Operation on an invalid type' };\n }\n\n return a.operate(context, op, b);\n } else {\n return new Operation(this.op, [a, b], this.isSpaced);\n }\n },\n\n genCSS(context, output) {\n this.operands[0].genCSS(context, output);\n if (this.isSpaced) {\n output.add(' ');\n }\n output.add(this.op);\n if (this.isSpaced) {\n output.add(' ');\n }\n this.operands[1].genCSS(context, output);\n }\n});\n\nexport default Operation;\n","import Node from './node';\nimport Paren from './paren';\nimport Comment from './comment';\nimport Dimension from './dimension';\nimport * as Constants from '../constants';\nconst MATH = Constants.Math;\n\nconst Expression = function(value, noSpacing) {\n this.value = value;\n this.noSpacing = noSpacing;\n if (!value) {\n throw new Error('Expression requires an array parameter');\n }\n};\n\nExpression.prototype = Object.assign(new Node(), {\n type: 'Expression',\n\n accept(visitor) {\n this.value = visitor.visitArray(this.value);\n },\n\n eval(context) {\n let returnValue;\n const mathOn = context.isMathOn();\n const inParenthesis = this.parens;\n\n let doubleParen = false;\n if (inParenthesis) {\n context.inParenthesis();\n }\n if (this.value.length > 1) {\n returnValue = new Expression(this.value.map(function (e) {\n if (!e.eval) {\n return e;\n }\n return e.eval(context);\n }), this.noSpacing);\n } else if (this.value.length === 1) {\n if (this.value[0].parens && !this.value[0].parensInOp && !context.inCalc) {\n doubleParen = true;\n }\n returnValue = this.value[0].eval(context);\n } else {\n returnValue = this;\n }\n if (inParenthesis) {\n context.outOfParenthesis();\n }\n if (this.parens && this.parensInOp && !mathOn && !doubleParen \n && (!(returnValue instanceof Dimension))) {\n returnValue = new Paren(returnValue);\n }\n return returnValue;\n },\n\n genCSS(context, output) {\n for (let i = 0; i < this.value.length; i++) {\n this.value[i].genCSS(context, output);\n if (!this.noSpacing && i + 1 < this.value.length) {\n output.add(' ');\n }\n }\n },\n\n throwAwayComments() {\n this.value = this.value.filter(function(v) {\n return !(v instanceof Comment);\n });\n }\n});\n\nexport default Expression;\n","import Expression from '../tree/expression';\n\nclass functionCaller {\n constructor(name, context, index, currentFileInfo) {\n this.name = name.toLowerCase();\n this.index = index;\n this.context = context;\n this.currentFileInfo = currentFileInfo;\n\n this.func = context.frames[0].functionRegistry.get(this.name);\n }\n\n isValid() {\n return Boolean(this.func);\n }\n\n call(args) {\n if (!(Array.isArray(args))) {\n args = [args];\n }\n const evalArgs = this.func.evalArgs;\n if (evalArgs !== false) {\n args = args.map(a => a.eval(this.context));\n }\n const commentFilter = item => !(item.type === 'Comment');\n\n // This code is terrible and should be replaced as per this issue...\n // https://github.com/less/less.js/issues/2477\n args = args\n .filter(commentFilter)\n .map(item => {\n if (item.type === 'Expression') {\n const subNodes = item.value.filter(commentFilter);\n if (subNodes.length === 1) {\n return subNodes[0];\n } else {\n return new Expression(subNodes);\n }\n }\n return item;\n });\n\n if (evalArgs === false) {\n return this.func(this.context, ...args);\n }\n\n return this.func(...args);\n }\n}\n\nexport default functionCaller;\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import Node from './node';\nimport Anonymous from './anonymous';\nimport FunctionCaller from '../functions/function-caller';\n\n//\n// A function call node.\n//\nconst Call = function(name, args, index, currentFileInfo) {\n this.name = name;\n this.args = args;\n this.calc = name === 'calc';\n this._index = index;\n this._fileInfo = currentFileInfo;\n}\n\nCall.prototype = Object.assign(new Node(), {\n type: 'Call',\n\n accept(visitor) {\n if (this.args) {\n this.args = visitor.visitArray(this.args);\n }\n },\n\n //\n // When evaluating a function call,\n // we either find the function in the functionRegistry,\n // in which case we call it, passing the evaluated arguments,\n // if this returns null or we cannot find the function, we\n // simply print it out as it appeared originally [2].\n //\n // The reason why we evaluate the arguments, is in the case where\n // we try to pass a variable to a function, like: `saturate(@color)`.\n // The function should receive the value, not the variable.\n //\n eval(context) {\n /**\n * Turn off math for calc(), and switch back on for evaluating nested functions\n */\n const currentMathContext = context.mathOn;\n context.mathOn = !this.calc;\n if (this.calc || context.inCalc) {\n context.enterCalc();\n }\n\n const exitCalc = () => {\n if (this.calc || context.inCalc) {\n context.exitCalc();\n }\n context.mathOn = currentMathContext;\n };\n\n let result;\n const funcCaller = new FunctionCaller(this.name, context, this.getIndex(), this.fileInfo());\n\n if (funcCaller.isValid()) {\n try {\n result = funcCaller.call(this.args);\n exitCalc();\n } catch (e) {\n if (e.hasOwnProperty('line') && e.hasOwnProperty('column')) {\n throw e;\n }\n throw { \n type: e.type || 'Runtime',\n message: `Error evaluating function \\`${this.name}\\`${e.message ? `: ${e.message}` : ''}`,\n index: this.getIndex(), \n filename: this.fileInfo().filename,\n line: e.lineNumber,\n column: e.columnNumber\n };\n }\n }\n\n if (result !== null && result !== undefined) {\n // Results that that are not nodes are cast as Anonymous nodes\n // Falsy values or booleans are returned as empty nodes\n if (!(result instanceof Node)) {\n if (!result || result === true) {\n result = new Anonymous(null); \n }\n else {\n result = new Anonymous(result.toString()); \n }\n \n }\n result._index = this._index;\n result._fileInfo = this._fileInfo;\n return result;\n }\n\n const args = this.args.map(a => a.eval(context));\n exitCalc();\n\n return new Call(this.name, args, this.getIndex(), this.fileInfo());\n },\n\n genCSS(context, output) {\n output.add(`${this.name}(`, this.fileInfo(), this.getIndex());\n\n for (let i = 0; i < this.args.length; i++) {\n this.args[i].genCSS(context, output);\n if (i + 1 < this.args.length) {\n output.add(', ');\n }\n }\n\n output.add(')');\n }\n});\n\nexport default Call;\n","import Node from './node';\nimport Call from './call';\n\nconst Variable = function(name, index, currentFileInfo) {\n this.name = name;\n this._index = index;\n this._fileInfo = currentFileInfo;\n};\n\nVariable.prototype = Object.assign(new Node(), {\n type: 'Variable',\n\n eval(context) {\n let variable, name = this.name;\n\n if (name.indexOf('@@') === 0) {\n name = `@${new Variable(name.slice(1), this.getIndex(), this.fileInfo()).eval(context).value}`;\n }\n\n if (this.evaluating) {\n throw { type: 'Name',\n message: `Recursive variable definition for ${name}`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n variable = this.find(context.frames, function (frame) {\n const v = frame.variable(name);\n if (v) {\n if (v.important) {\n const importantScope = context.importantScope[context.importantScope.length - 1];\n importantScope.important = v.important;\n }\n // If in calc, wrap vars in a function call to cascade evaluate args first\n if (context.inCalc) {\n return (new Call('_SELF', [v.value])).eval(context);\n }\n else {\n return v.value.eval(context);\n }\n }\n });\n if (variable) {\n this.evaluating = false;\n return variable;\n } else {\n throw { type: 'Name',\n message: `variable ${name} is undefined`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n },\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n});\n\nexport default Variable;\n","import Node from './node';\nimport Declaration from './declaration';\n\nconst Property = function(name, index, currentFileInfo) {\n this.name = name;\n this._index = index;\n this._fileInfo = currentFileInfo;\n};\n\nProperty.prototype = Object.assign(new Node(), {\n type: 'Property',\n\n eval(context) {\n let property;\n const name = this.name;\n // TODO: shorten this reference\n const mergeRules = context.pluginManager.less.visitors.ToCSSVisitor.prototype._mergeRules;\n\n if (this.evaluating) {\n throw { type: 'Name',\n message: `Recursive property reference for ${name}`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n this.evaluating = true;\n\n property = this.find(context.frames, function (frame) {\n let v;\n const vArr = frame.property(name);\n if (vArr) {\n for (let i = 0; i < vArr.length; i++) {\n v = vArr[i];\n\n vArr[i] = new Declaration(v.name,\n v.value,\n v.important,\n v.merge,\n v.index,\n v.currentFileInfo,\n v.inline,\n v.variable\n );\n }\n mergeRules(vArr);\n\n v = vArr[vArr.length - 1];\n if (v.important) {\n const importantScope = context.importantScope[context.importantScope.length - 1];\n importantScope.important = v.important;\n }\n v = v.value.eval(context);\n return v;\n }\n });\n if (property) {\n this.evaluating = false;\n return property;\n } else {\n throw { type: 'Name',\n message: `Property '${name}' is undefined`,\n filename: this.currentFileInfo.filename,\n index: this.index };\n }\n },\n\n find(obj, fun) {\n for (let i = 0, r; i < obj.length; i++) {\n r = fun.call(obj, obj[i]);\n if (r) { return r; }\n }\n return null;\n }\n});\n\nexport default Property;\n","import Node from './node';\n\nconst Attribute = function(key, op, value) {\n this.key = key;\n this.op = op;\n this.value = value;\n}\n\nAttribute.prototype = Object.assign(new Node(), {\n type: 'Attribute',\n\n eval(context) {\n return new Attribute(this.key.eval ? this.key.eval(context) : this.key,\n this.op, (this.value && this.value.eval) ? this.value.eval(context) : this.value);\n },\n\n genCSS(context, output) {\n output.add(this.toCSS(context));\n },\n\n toCSS(context) {\n let value = this.key.toCSS ? this.key.toCSS(context) : this.key;\n\n if (this.op) {\n value += this.op;\n value += (this.value.toCSS ? this.value.toCSS(context) : this.value);\n }\n\n return `[${value}]`;\n }\n});\n\nexport default Attribute;\n","import Node from './node';\nimport Variable from './variable';\nimport Property from './property';\n\n\nconst Quoted = function(str, content, escaped, index, currentFileInfo) {\n this.escaped = (escaped == null) ? true : escaped;\n this.value = content || '';\n this.quote = str.charAt(0);\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.variableRegex = /@\\{([\\w-]+)\\}/g;\n this.propRegex = /\\$\\{([\\w-]+)\\}/g;\n this.allowRoot = escaped;\n};\n\nQuoted.prototype = Object.assign(new Node(), {\n type: 'Quoted',\n\n genCSS(context, output) {\n if (!this.escaped) {\n output.add(this.quote, this.fileInfo(), this.getIndex());\n }\n output.add(this.value);\n if (!this.escaped) {\n output.add(this.quote);\n }\n },\n\n containsVariables() {\n return this.value.match(this.variableRegex);\n },\n\n eval(context) {\n const that = this;\n let value = this.value;\n const variableReplacement = function (_, name) {\n const v = new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v.value : v.toCSS();\n };\n const propertyReplacement = function (_, name) {\n const v = new Property(`$${name}`, that.getIndex(), that.fileInfo()).eval(context, true);\n return (v instanceof Quoted) ? v.value : v.toCSS();\n };\n function iterativeReplace(value, regexp, replacementFnc) {\n let evaluatedValue = value;\n do {\n value = evaluatedValue.toString();\n evaluatedValue = value.replace(regexp, replacementFnc);\n } while (value !== evaluatedValue);\n return evaluatedValue;\n }\n value = iterativeReplace(value, this.variableRegex, variableReplacement);\n value = iterativeReplace(value, this.propRegex, propertyReplacement);\n return new Quoted(this.quote + value + this.quote, value, this.escaped, this.getIndex(), this.fileInfo());\n },\n\n compare(other) {\n // when comparing quoted strings allow the quote to differ\n if (other.type === 'Quoted' && !this.escaped && !other.escaped) {\n return Node.numericCompare(this.value, other.value);\n } else {\n return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;\n }\n }\n});\n\nexport default Quoted;\n","import Node from './node';\n\nfunction escapePath(path) {\n return path.replace(/[\\(\\)'\"\\s]/g, function(match) { return `\\\\${match}`; });\n}\n\nconst URL = function(val, index, currentFileInfo, isEvald) {\n this.value = val;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.isEvald = isEvald;\n};\n\nURL.prototype = Object.assign(new Node(), {\n type: 'Url',\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n },\n\n genCSS(context, output) {\n output.add('url(');\n this.value.genCSS(context, output);\n output.add(')');\n },\n\n eval(context) {\n const val = this.value.eval(context);\n let rootpath;\n\n if (!this.isEvald) {\n // Add the rootpath if the URL requires a rewrite\n rootpath = this.fileInfo() && this.fileInfo().rootpath;\n if (typeof rootpath === 'string' &&\n typeof val.value === 'string' &&\n context.pathRequiresRewrite(val.value)) {\n if (!val.quote) {\n rootpath = escapePath(rootpath);\n }\n val.value = context.rewritePath(val.value, rootpath);\n } else {\n val.value = context.normalizePath(val.value);\n }\n\n // Add url args if enabled\n if (context.urlArgs) {\n if (!val.value.match(/^\\s*data:/)) {\n const delimiter = val.value.indexOf('?') === -1 ? '?' : '&';\n const urlArgs = delimiter + context.urlArgs;\n if (val.value.indexOf('#') !== -1) {\n val.value = val.value.replace('#', `${urlArgs}#`);\n } else {\n val.value += urlArgs;\n }\n }\n }\n }\n\n return new URL(val, this.getIndex(), this.fileInfo(), true);\n }\n});\n\nexport default URL;\n","import Ruleset from './ruleset';\nimport Value from './value';\nimport Selector from './selector';\nimport Anonymous from './anonymous';\nimport Expression from './expression';\nimport AtRule from './atrule';\nimport * as utils from '../utils';\n\nconst Media = function(value, features, index, currentFileInfo, visibilityInfo) {\n this._index = index;\n this._fileInfo = currentFileInfo;\n\n const selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors();\n\n this.features = new Value(features);\n this.rules = [new Ruleset(selectors, value)];\n this.rules[0].allowImports = true;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n this.setParent(selectors, this);\n this.setParent(this.features, this);\n this.setParent(this.rules, this);\n};\n\nMedia.prototype = Object.assign(new AtRule(), {\n type: 'Media',\n\n isRulesetLike() {\n return true;\n },\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this.features);\n }\n if (this.rules) {\n this.rules = visitor.visitArray(this.rules);\n }\n },\n\n genCSS(context, output) {\n output.add('@media ', this._fileInfo, this._index);\n this.features.genCSS(context, output);\n this.outputRuleset(context, output, this.rules);\n },\n\n eval(context) {\n if (!context.mediaBlocks) {\n context.mediaBlocks = [];\n context.mediaPath = [];\n }\n\n const media = new Media(null, [], this._index, this._fileInfo, this.visibilityInfo());\n if (this.debugInfo) {\n this.rules[0].debugInfo = this.debugInfo;\n media.debugInfo = this.debugInfo;\n }\n \n media.features = this.features.eval(context);\n\n context.mediaPath.push(media);\n context.mediaBlocks.push(media);\n\n this.rules[0].functionRegistry = context.frames[0].functionRegistry.inherit();\n context.frames.unshift(this.rules[0]);\n media.rules = [this.rules[0].eval(context)];\n context.frames.shift();\n\n context.mediaPath.pop();\n\n return context.mediaPath.length === 0 ? media.evalTop(context) :\n media.evalNested(context);\n },\n\n evalTop(context) {\n let result = this;\n\n // Render all dependent Media blocks.\n if (context.mediaBlocks.length > 1) {\n const selectors = (new Selector([], null, null, this.getIndex(), this.fileInfo())).createEmptySelectors();\n result = new Ruleset(selectors, context.mediaBlocks);\n result.multiMedia = true;\n result.copyVisibilityInfo(this.visibilityInfo());\n this.setParent(result, this);\n }\n\n delete context.mediaBlocks;\n delete context.mediaPath;\n\n return result;\n },\n\n evalNested(context) {\n let i;\n let value;\n const path = context.mediaPath.concat([this]);\n\n // Extract the media-query conditions separated with `,` (OR).\n for (i = 0; i < path.length; i++) {\n value = path[i].features instanceof Value ?\n path[i].features.value : path[i].features;\n path[i] = Array.isArray(value) ? value : [value];\n }\n\n // Trace all permutations to generate the resulting media-query.\n //\n // (a, b and c) with nested (d, e) ->\n // a and d\n // a and e\n // b and c and d\n // b and c and e\n this.features = new Value(this.permute(path).map(path => {\n path = path.map(fragment => fragment.toCSS ? fragment : new Anonymous(fragment));\n\n for (i = path.length - 1; i > 0; i--) {\n path.splice(i, 0, new Anonymous('and'));\n }\n\n return new Expression(path);\n }));\n this.setParent(this.features, this);\n\n // Fake a tree-node that doesn't output anything.\n return new Ruleset([], []);\n },\n\n permute(arr) {\n if (arr.length === 0) {\n return [];\n } else if (arr.length === 1) {\n return arr[0];\n } else {\n const result = [];\n const rest = this.permute(arr.slice(1));\n for (let i = 0; i < rest.length; i++) {\n for (let j = 0; j < arr[0].length; j++) {\n result.push([arr[0][j]].concat(rest[i]));\n }\n }\n return result;\n }\n },\n\n bubbleSelectors(selectors) {\n if (!selectors) {\n return;\n }\n this.rules = [new Ruleset(utils.copyArray(selectors), [this.rules[0]])];\n this.setParent(this.rules, this);\n }\n});\n\nexport default Media;\n","import Node from './node';\nimport Media from './media';\nimport URL from './url';\nimport Quoted from './quoted';\nimport Ruleset from './ruleset';\nimport Anonymous from './anonymous';\nimport * as utils from '../utils';\nimport LessError from '../less-error';\n\n//\n// CSS @import node\n//\n// The general strategy here is that we don't want to wait\n// for the parsing to be completed, before we start importing\n// the file. That's because in the context of a browser,\n// most of the time will be spent waiting for the server to respond.\n//\n// On creation, we push the import path to our import queue, though\n// `import,push`, we also pass it a callback, which it'll call once\n// the file has been fetched, and parsed.\n//\nconst Import = function(path, features, options, index, currentFileInfo, visibilityInfo) {\n this.options = options;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.path = path;\n this.features = features;\n this.allowRoot = true;\n\n if (this.options.less !== undefined || this.options.inline) {\n this.css = !this.options.less || this.options.inline;\n } else {\n const pathValue = this.getPath();\n if (pathValue && /[#\\.\\&\\?]css([\\?;].*)?$/.test(pathValue)) {\n this.css = true;\n }\n }\n this.copyVisibilityInfo(visibilityInfo);\n this.setParent(this.features, this);\n this.setParent(this.path, this);\n};\n\nImport.prototype = Object.assign(new Node(), {\n type: 'Import',\n\n accept(visitor) {\n if (this.features) {\n this.features = visitor.visit(this.features);\n }\n this.path = visitor.visit(this.path);\n if (!this.options.isPlugin && !this.options.inline && this.root) {\n this.root = visitor.visit(this.root);\n }\n },\n\n genCSS(context, output) {\n if (this.css && this.path._fileInfo.reference === undefined) {\n output.add('@import ', this._fileInfo, this._index);\n this.path.genCSS(context, output);\n if (this.features) {\n output.add(' ');\n this.features.genCSS(context, output);\n }\n output.add(';');\n }\n },\n\n getPath() {\n return (this.path instanceof URL) ?\n this.path.value.value : this.path.value;\n },\n\n isVariableImport() {\n let path = this.path;\n if (path instanceof URL) {\n path = path.value;\n }\n if (path instanceof Quoted) {\n return path.containsVariables();\n }\n\n return true;\n },\n\n evalForImport(context) {\n let path = this.path;\n\n if (path instanceof URL) {\n path = path.value;\n }\n\n return new Import(path.eval(context), this.features, this.options, this._index, this._fileInfo, this.visibilityInfo());\n },\n\n evalPath(context) {\n const path = this.path.eval(context);\n const fileInfo = this._fileInfo;\n\n if (!(path instanceof URL)) {\n // Add the rootpath if the URL requires a rewrite\n const pathValue = path.value;\n if (fileInfo &&\n pathValue &&\n context.pathRequiresRewrite(pathValue)) {\n path.value = context.rewritePath(pathValue, fileInfo.rootpath);\n } else {\n path.value = context.normalizePath(path.value);\n }\n }\n\n return path;\n },\n\n eval(context) {\n const result = this.doEval(context);\n if (this.options.reference || this.blocksVisibility()) {\n if (result.length || result.length === 0) {\n result.forEach(function (node) {\n node.addVisibilityBlock();\n }\n );\n } else {\n result.addVisibilityBlock();\n }\n }\n return result;\n },\n\n doEval(context) {\n let ruleset;\n let registry;\n const features = this.features && this.features.eval(context);\n\n if (this.options.isPlugin) {\n if (this.root && this.root.eval) {\n try {\n this.root.eval(context);\n }\n catch (e) {\n e.message = 'Plugin error during evaluation';\n throw new LessError(e, this.root.imports, this.root.filename);\n }\n }\n registry = context.frames[0] && context.frames[0].functionRegistry;\n if ( registry && this.root && this.root.functions ) {\n registry.addMultiple( this.root.functions );\n }\n\n return [];\n }\n\n if (this.skip) {\n if (typeof this.skip === 'function') {\n this.skip = this.skip();\n }\n if (this.skip) {\n return [];\n }\n }\n if (this.options.inline) {\n const contents = new Anonymous(this.root, 0,\n {\n filename: this.importedFilename,\n reference: this.path._fileInfo && this.path._fileInfo.reference\n }, true, true);\n\n return this.features ? new Media([contents], this.features.value) : [contents];\n } else if (this.css) {\n const newImport = new Import(this.evalPath(context), features, this.options, this._index);\n if (!newImport.css && this.error) {\n throw this.error;\n }\n return newImport;\n } else if (this.root) {\n ruleset = new Ruleset(null, utils.copyArray(this.root.rules));\n ruleset.evalImports(context);\n\n return this.features ? new Media(ruleset.rules, this.features.value) : ruleset.rules;\n } else {\n return [];\n }\n }\n});\n\nexport default Import;\n","import Node from './node';\nimport Variable from './variable';\n\nconst JsEvalNode = function() {};\n\nJsEvalNode.prototype = Object.assign(new Node(), {\n evaluateJavaScript(expression, context) {\n let result;\n const that = this;\n const evalContext = {};\n\n if (!context.javascriptEnabled) {\n throw { message: 'Inline JavaScript is not enabled. Is it set in your options?',\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n expression = expression.replace(/@\\{([\\w-]+)\\}/g, function (_, name) {\n return that.jsify(new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context));\n });\n\n try {\n expression = new Function(`return (${expression})`);\n } catch (e) {\n throw { message: `JavaScript evaluation error: ${e.message} from \\`${expression}\\`` ,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n\n const variables = context.frames[0].variables();\n for (const k in variables) {\n if (variables.hasOwnProperty(k)) {\n /* jshint loopfunc:true */\n evalContext[k.slice(1)] = {\n value: variables[k].value,\n toJS: function () {\n return this.value.eval(context).toCSS();\n }\n };\n }\n }\n\n try {\n result = expression.call(evalContext);\n } catch (e) {\n throw { message: `JavaScript evaluation error: '${e.name}: ${e.message.replace(/[\"]/g, '\\'')}'` ,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n return result;\n },\n\n jsify(obj) {\n if (Array.isArray(obj.value) && (obj.value.length > 1)) {\n return `[${obj.value.map(function (v) { return v.toCSS(); }).join(', ')}]`;\n } else {\n return obj.toCSS();\n }\n }\n});\n\nexport default JsEvalNode;\n","import JsEvalNode from './js-eval-node';\nimport Dimension from './dimension';\nimport Quoted from './quoted';\nimport Anonymous from './anonymous';\n\nconst JavaScript = function(string, escaped, index, currentFileInfo) {\n this.escaped = escaped;\n this.expression = string;\n this._index = index;\n this._fileInfo = currentFileInfo;\n}\n\nJavaScript.prototype = Object.assign(new JsEvalNode(), {\n type: 'JavaScript',\n\n eval(context) {\n const result = this.evaluateJavaScript(this.expression, context);\n const type = typeof result;\n\n if (type === 'number' && !isNaN(result)) {\n return new Dimension(result);\n } else if (type === 'string') {\n return new Quoted(`\"${result}\"`, result, this.escaped, this._index);\n } else if (Array.isArray(result)) {\n return new Anonymous(result.join(', '));\n } else {\n return new Anonymous(result);\n }\n }\n});\n\nexport default JavaScript;\n","import Node from './node';\n\nconst Assignment = function(key, val) {\n this.key = key;\n this.value = val;\n}\n\nAssignment.prototype = Object.assign(new Node(), {\n type: 'Assignment',\n\n accept(visitor) {\n this.value = visitor.visit(this.value);\n },\n\n eval(context) {\n if (this.value.eval) {\n return new Assignment(this.key, this.value.eval(context));\n }\n return this;\n },\n\n genCSS(context, output) {\n output.add(`${this.key}=`);\n if (this.value.genCSS) {\n this.value.genCSS(context, output);\n } else {\n output.add(this.value);\n }\n }\n});\n\nexport default Assignment;\n","import Node from './node';\n\nconst Condition = function(op, l, r, i, negate) {\n this.op = op.trim();\n this.lvalue = l;\n this.rvalue = r;\n this._index = i;\n this.negate = negate;\n};\n\nCondition.prototype = Object.assign(new Node(), {\n type: 'Condition',\n\n accept(visitor) {\n this.lvalue = visitor.visit(this.lvalue);\n this.rvalue = visitor.visit(this.rvalue);\n },\n\n eval(context) {\n const result = (function (op, a, b) {\n switch (op) {\n case 'and': return a && b;\n case 'or': return a || b;\n default:\n switch (Node.compare(a, b)) {\n case -1:\n return op === '<' || op === '=<' || op === '<=';\n case 0:\n return op === '=' || op === '>=' || op === '=<' || op === '<=';\n case 1:\n return op === '>' || op === '>=';\n default:\n return false;\n }\n }\n })(this.op, this.lvalue.eval(context), this.rvalue.eval(context));\n\n return this.negate ? !result : result;\n }\n});\n\nexport default Condition;\n","import Node from './node';\n\nconst UnicodeDescriptor = function(value) {\n this.value = value;\n}\n\nUnicodeDescriptor.prototype = Object.assign(new Node(), {\n type: 'UnicodeDescriptor'\n})\n\nexport default UnicodeDescriptor;\n","import Node from './node';\nimport Operation from './operation';\nimport Dimension from './dimension';\n\nconst Negative = function(node) {\n this.value = node;\n};\n\nNegative.prototype = Object.assign(new Node(), {\n type: 'Negative',\n\n genCSS(context, output) {\n output.add('-');\n this.value.genCSS(context, output);\n },\n\n eval(context) {\n if (context.isMathOn()) {\n return (new Operation('*', [new Dimension(-1), this.value])).eval(context);\n }\n return new Negative(this.value.eval(context));\n }\n});\n\nexport default Negative;\n","import Node from './node';\nimport Selector from './selector';\n\nconst Extend = function(selector, option, index, currentFileInfo, visibilityInfo) {\n this.selector = selector;\n this.option = option;\n this.object_id = Extend.next_id++;\n this.parent_ids = [this.object_id];\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n\n switch (option) {\n case 'all':\n this.allowBefore = true;\n this.allowAfter = true;\n break;\n default:\n this.allowBefore = false;\n this.allowAfter = false;\n break;\n }\n this.setParent(this.selector, this);\n};\n\nExtend.prototype = Object.assign(new Node(), {\n type: 'Extend',\n\n accept(visitor) {\n this.selector = visitor.visit(this.selector);\n },\n\n eval(context) {\n return new Extend(this.selector.eval(context), this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n },\n\n clone(context) {\n return new Extend(this.selector, this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n },\n\n // it concatenates (joins) all selectors in selector array\n findSelfSelectors(selectors) {\n let selfElements = [], i, selectorElements;\n\n for (i = 0; i < selectors.length; i++) {\n selectorElements = selectors[i].elements;\n // duplicate the logic in genCSS function inside the selector node.\n // future TODO - move both logics into the selector joiner visitor\n if (i > 0 && selectorElements.length && selectorElements[0].combinator.value === '') {\n selectorElements[0].combinator.value = ' ';\n }\n selfElements = selfElements.concat(selectors[i].elements);\n }\n\n this.selfSelectors = [new Selector(selfElements)];\n this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo());\n }\n});\n\nExtend.next_id = 0;\nexport default Extend;\n","import Node from './node';\nimport Variable from './variable';\nimport Ruleset from './ruleset';\nimport DetachedRuleset from './detached-ruleset';\nimport LessError from '../less-error';\n\nconst VariableCall = function(variable, index, currentFileInfo) {\n this.variable = variable;\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.allowRoot = true;\n};\n\nVariableCall.prototype = Object.assign(new Node(), {\n type: 'VariableCall',\n\n eval(context) {\n let rules;\n let detachedRuleset = new Variable(this.variable, this.getIndex(), this.fileInfo()).eval(context);\n const error = new LessError({message: `Could not evaluate variable call ${this.variable}`});\n\n if (!detachedRuleset.ruleset) {\n if (detachedRuleset.rules) {\n rules = detachedRuleset;\n }\n else if (Array.isArray(detachedRuleset)) {\n rules = new Ruleset('', detachedRuleset);\n }\n else if (Array.isArray(detachedRuleset.value)) {\n rules = new Ruleset('', detachedRuleset.value);\n }\n else {\n throw error;\n }\n detachedRuleset = new DetachedRuleset(rules);\n }\n\n if (detachedRuleset.ruleset) {\n return detachedRuleset.callEval(context);\n }\n throw error;\n }\n});\n\nexport default VariableCall;\n","import Node from './node';\nimport Variable from './variable';\nimport Ruleset from './ruleset';\nimport Selector from './selector';\n\nconst NamespaceValue = function(ruleCall, lookups, index, fileInfo) {\n this.value = ruleCall;\n this.lookups = lookups;\n this._index = index;\n this._fileInfo = fileInfo;\n};\n\nNamespaceValue.prototype = Object.assign(new Node(), {\n type: 'NamespaceValue',\n\n eval(context) {\n let i, j, name, rules = this.value.eval(context);\n \n for (i = 0; i < this.lookups.length; i++) {\n name = this.lookups[i];\n\n /**\n * Eval'd DRs return rulesets.\n * Eval'd mixins return rules, so let's make a ruleset if we need it.\n * We need to do this because of late parsing of values\n */\n if (Array.isArray(rules)) {\n rules = new Ruleset([new Selector()], rules);\n }\n\n if (name === '') {\n rules = rules.lastDeclaration();\n }\n else if (name.charAt(0) === '@') {\n if (name.charAt(1) === '@') {\n name = `@${new Variable(name.substr(1)).eval(context).value}`;\n }\n if (rules.variables) {\n rules = rules.variable(name);\n }\n \n if (!rules) {\n throw { type: 'Name',\n message: `variable ${name} not found`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n }\n else {\n if (name.substring(0, 2) === '$@') {\n name = `$${new Variable(name.substr(1)).eval(context).value}`;\n }\n else {\n name = name.charAt(0) === '$' ? name : `$${name}`;\n }\n if (rules.properties) {\n rules = rules.property(name);\n }\n \n if (!rules) {\n throw { type: 'Name',\n message: `property \"${name.substr(1)}\" not found`,\n filename: this.fileInfo().filename,\n index: this.getIndex() };\n }\n // Properties are an array of values, since a ruleset can have multiple props.\n // We pick the last one (the \"cascaded\" value)\n rules = rules[rules.length - 1];\n }\n\n if (rules.value) {\n rules = rules.eval(context).value;\n }\n if (rules.ruleset) {\n rules = rules.ruleset.eval(context);\n }\n }\n return rules;\n }\n});\n\nexport default NamespaceValue;\n","import Selector from './selector';\nimport Element from './element';\nimport Ruleset from './ruleset';\nimport Declaration from './declaration';\nimport DetachedRuleset from './detached-ruleset';\nimport Expression from './expression';\nimport contexts from '../contexts';\nimport * as utils from '../utils';\n\nconst Definition = function(name, params, rules, condition, variadic, frames, visibilityInfo) {\n this.name = name || 'anonymous mixin';\n this.selectors = [new Selector([new Element(null, name, false, this._index, this._fileInfo)])];\n this.params = params;\n this.condition = condition;\n this.variadic = variadic;\n this.arity = params.length;\n this.rules = rules;\n this._lookups = {};\n const optionalParameters = [];\n this.required = params.reduce(function (count, p) {\n if (!p.name || (p.name && !p.value)) {\n return count + 1;\n }\n else {\n optionalParameters.push(p.name);\n return count;\n }\n }, 0);\n this.optionalParameters = optionalParameters;\n this.frames = frames;\n this.copyVisibilityInfo(visibilityInfo);\n this.allowRoot = true;\n}\n\nDefinition.prototype = Object.assign(new Ruleset(), {\n type: 'MixinDefinition',\n evalFirst: true,\n\n accept(visitor) {\n if (this.params && this.params.length) {\n this.params = visitor.visitArray(this.params);\n }\n this.rules = visitor.visitArray(this.rules);\n if (this.condition) {\n this.condition = visitor.visit(this.condition);\n }\n },\n\n evalParams(context, mixinEnv, args, evaldArguments) {\n /* jshint boss:true */\n const frame = new Ruleset(null, null);\n\n let varargs;\n let arg;\n const params = utils.copyArray(this.params);\n let i;\n let j;\n let val;\n let name;\n let isNamedFound;\n let argIndex;\n let argsLength = 0;\n\n if (mixinEnv.frames && mixinEnv.frames[0] && mixinEnv.frames[0].functionRegistry) {\n frame.functionRegistry = mixinEnv.frames[0].functionRegistry.inherit();\n }\n mixinEnv = new contexts.Eval(mixinEnv, [frame].concat(mixinEnv.frames));\n\n if (args) {\n args = utils.copyArray(args);\n argsLength = args.length;\n\n for (i = 0; i < argsLength; i++) {\n arg = args[i];\n if (name = (arg && arg.name)) {\n isNamedFound = false;\n for (j = 0; j < params.length; j++) {\n if (!evaldArguments[j] && name === params[j].name) {\n evaldArguments[j] = arg.value.eval(context);\n frame.prependRule(new Declaration(name, arg.value.eval(context)));\n isNamedFound = true;\n break;\n }\n }\n if (isNamedFound) {\n args.splice(i, 1);\n i--;\n continue;\n } else {\n throw { type: 'Runtime', message: `Named argument for ${this.name} ${args[i].name} not found` };\n }\n }\n }\n }\n argIndex = 0;\n for (i = 0; i < params.length; i++) {\n if (evaldArguments[i]) { continue; }\n\n arg = args && args[argIndex];\n\n if (name = params[i].name) {\n if (params[i].variadic) {\n varargs = [];\n for (j = argIndex; j < argsLength; j++) {\n varargs.push(args[j].value.eval(context));\n }\n frame.prependRule(new Declaration(name, new Expression(varargs).eval(context)));\n } else {\n val = arg && arg.value;\n if (val) {\n // This was a mixin call, pass in a detached ruleset of it's eval'd rules\n if (Array.isArray(val)) {\n val = new DetachedRuleset(new Ruleset('', val));\n }\n else {\n val = val.eval(context);\n }\n } else if (params[i].value) {\n val = params[i].value.eval(mixinEnv);\n frame.resetCache();\n } else {\n throw { type: 'Runtime', message: `wrong number of arguments for ${this.name} (${argsLength} for ${this.arity})` };\n }\n\n frame.prependRule(new Declaration(name, val));\n evaldArguments[i] = val;\n }\n }\n\n if (params[i].variadic && args) {\n for (j = argIndex; j < argsLength; j++) {\n evaldArguments[j] = args[j].value.eval(context);\n }\n }\n argIndex++;\n }\n\n return frame;\n },\n\n makeImportant() {\n const rules = !this.rules ? this.rules : this.rules.map(function (r) {\n if (r.makeImportant) {\n return r.makeImportant(true);\n } else {\n return r;\n }\n });\n const result = new Definition(this.name, this.params, rules, this.condition, this.variadic, this.frames);\n return result;\n },\n\n eval(context) {\n return new Definition(this.name, this.params, this.rules, this.condition, this.variadic, this.frames || utils.copyArray(context.frames));\n },\n\n evalCall(context, args, important) {\n const _arguments = [];\n const mixinFrames = this.frames ? this.frames.concat(context.frames) : context.frames;\n const frame = this.evalParams(context, new contexts.Eval(context, mixinFrames), args, _arguments);\n let rules;\n let ruleset;\n\n frame.prependRule(new Declaration('@arguments', new Expression(_arguments).eval(context)));\n\n rules = utils.copyArray(this.rules);\n\n ruleset = new Ruleset(null, rules);\n ruleset.originalRuleset = this;\n ruleset = ruleset.eval(new contexts.Eval(context, [this, frame].concat(mixinFrames)));\n if (important) {\n ruleset = ruleset.makeImportant();\n }\n return ruleset;\n },\n\n matchCondition(args, context) {\n if (this.condition && !this.condition.eval(\n new contexts.Eval(context,\n [this.evalParams(context, /* the parameter variables */\n new contexts.Eval(context, this.frames ? this.frames.concat(context.frames) : context.frames), args, [])]\n .concat(this.frames || []) // the parent namespace/mixin frames\n .concat(context.frames)))) { // the current environment frames\n return false;\n }\n return true;\n },\n\n matchArgs(args, context) {\n const allArgsCnt = (args && args.length) || 0;\n let len;\n const optionalParameters = this.optionalParameters;\n const requiredArgsCnt = !args ? 0 : args.reduce(function (count, p) {\n if (optionalParameters.indexOf(p.name) < 0) {\n return count + 1;\n } else {\n return count;\n }\n }, 0);\n\n if (!this.variadic) {\n if (requiredArgsCnt < this.required) {\n return false;\n }\n if (allArgsCnt > this.params.length) {\n return false;\n }\n } else {\n if (requiredArgsCnt < (this.required - 1)) {\n return false;\n }\n }\n\n // check patterns\n len = Math.min(requiredArgsCnt, this.arity);\n\n for (let i = 0; i < len; i++) {\n if (!this.params[i].name && !this.params[i].variadic) {\n if (args[i].value.eval(context).toCSS() != this.params[i].value.eval(context).toCSS()) {\n return false;\n }\n }\n }\n return true;\n }\n});\n\nexport default Definition;\n","import Node from './node';\nimport Selector from './selector';\nimport MixinDefinition from './mixin-definition';\nimport defaultFunc from '../functions/default';\n\nconst MixinCall = function(elements, args, index, currentFileInfo, important) {\n this.selector = new Selector(elements);\n this.arguments = args || [];\n this._index = index;\n this._fileInfo = currentFileInfo;\n this.important = important;\n this.allowRoot = true;\n this.setParent(this.selector, this);\n};\n\nMixinCall.prototype = Object.assign(new Node(), {\n type: 'MixinCall',\n\n accept(visitor) {\n if (this.selector) {\n this.selector = visitor.visit(this.selector);\n }\n if (this.arguments.length) {\n this.arguments = visitor.visitArray(this.arguments);\n }\n },\n\n eval(context) {\n let mixins;\n let mixin;\n let mixinPath;\n const args = [];\n let arg;\n let argValue;\n const rules = [];\n let match = false;\n let i;\n let m;\n let f;\n let isRecursive;\n let isOneFound;\n const candidates = [];\n let candidate;\n const conditionResult = [];\n let defaultResult;\n const defFalseEitherCase = -1;\n const defNone = 0;\n const defTrue = 1;\n const defFalse = 2;\n let count;\n let originalRuleset;\n let noArgumentsFilter;\n\n this.selector = this.selector.eval(context);\n\n function calcDefGroup(mixin, mixinPath) {\n let f, p, namespace;\n\n for (f = 0; f < 2; f++) {\n conditionResult[f] = true;\n defaultFunc.value(f);\n for (p = 0; p < mixinPath.length && conditionResult[f]; p++) {\n namespace = mixinPath[p];\n if (namespace.matchCondition) {\n conditionResult[f] = conditionResult[f] && namespace.matchCondition(null, context);\n }\n }\n if (mixin.matchCondition) {\n conditionResult[f] = conditionResult[f] && mixin.matchCondition(args, context);\n }\n }\n if (conditionResult[0] || conditionResult[1]) {\n if (conditionResult[0] != conditionResult[1]) {\n return conditionResult[1] ?\n defTrue : defFalse;\n }\n\n return defNone;\n }\n return defFalseEitherCase;\n }\n\n for (i = 0; i < this.arguments.length; i++) {\n arg = this.arguments[i];\n argValue = arg.value.eval(context);\n if (arg.expand && Array.isArray(argValue.value)) {\n argValue = argValue.value;\n for (m = 0; m < argValue.length; m++) {\n args.push({value: argValue[m]});\n }\n } else {\n args.push({name: arg.name, value: argValue});\n }\n }\n\n noArgumentsFilter = function(rule) {return rule.matchArgs(null, context);};\n\n for (i = 0; i < context.frames.length; i++) {\n if ((mixins = context.frames[i].find(this.selector, null, noArgumentsFilter)).length > 0) {\n isOneFound = true;\n\n // To make `default()` function independent of definition order we have two \"subpasses\" here.\n // At first we evaluate each guard *twice* (with `default() == true` and `default() == false`),\n // and build candidate list with corresponding flags. Then, when we know all possible matches,\n // we make a final decision.\n\n for (m = 0; m < mixins.length; m++) {\n mixin = mixins[m].rule;\n mixinPath = mixins[m].path;\n isRecursive = false;\n for (f = 0; f < context.frames.length; f++) {\n if ((!(mixin instanceof MixinDefinition)) && mixin === (context.frames[f].originalRuleset || context.frames[f])) {\n isRecursive = true;\n break;\n }\n }\n if (isRecursive) {\n continue;\n }\n\n if (mixin.matchArgs(args, context)) {\n candidate = {mixin, group: calcDefGroup(mixin, mixinPath)};\n\n if (candidate.group !== defFalseEitherCase) {\n candidates.push(candidate);\n }\n\n match = true;\n }\n }\n\n defaultFunc.reset();\n\n count = [0, 0, 0];\n for (m = 0; m < candidates.length; m++) {\n count[candidates[m].group]++;\n }\n\n if (count[defNone] > 0) {\n defaultResult = defFalse;\n } else {\n defaultResult = defTrue;\n if ((count[defTrue] + count[defFalse]) > 1) {\n throw { type: 'Runtime',\n message: `Ambiguous use of \\`default()\\` found when matching for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n }\n\n for (m = 0; m < candidates.length; m++) {\n candidate = candidates[m].group;\n if ((candidate === defNone) || (candidate === defaultResult)) {\n try {\n mixin = candidates[m].mixin;\n if (!(mixin instanceof MixinDefinition)) {\n originalRuleset = mixin.originalRuleset || mixin;\n mixin = new MixinDefinition('', [], mixin.rules, null, false, null, originalRuleset.visibilityInfo());\n mixin.originalRuleset = originalRuleset;\n }\n const newRules = mixin.evalCall(context, args, this.important).rules;\n this._setVisibilityToReplacement(newRules);\n Array.prototype.push.apply(rules, newRules);\n } catch (e) {\n throw { message: e.message, index: this.getIndex(), filename: this.fileInfo().filename, stack: e.stack };\n }\n }\n }\n\n if (match) {\n return rules;\n }\n }\n }\n if (isOneFound) {\n throw { type: 'Runtime',\n message: `No matching definition was found for \\`${this.format(args)}\\``,\n index: this.getIndex(), filename: this.fileInfo().filename };\n } else {\n throw { type: 'Name',\n message: `${this.selector.toCSS().trim()} is undefined`,\n index: this.getIndex(), filename: this.fileInfo().filename };\n }\n },\n\n _setVisibilityToReplacement(replacement) {\n let i, rule;\n if (this.blocksVisibility()) {\n for (i = 0; i < replacement.length; i++) {\n rule = replacement[i];\n rule.addVisibilityBlock();\n }\n }\n },\n\n format(args) {\n return `${this.selector.toCSS().trim()}(${args ? args.map(function (a) {\n let argValue = '';\n if (a.name) {\n argValue += `${a.name}:`;\n }\n if (a.value.toCSS) {\n argValue += a.value.toCSS();\n } else {\n argValue += '???';\n }\n return argValue;\n }).join(', ') : ''})`;\n }\n});\n\nexport default MixinCall;\n","import Node from './node';\nimport Color from './color';\nimport AtRule from './atrule';\nimport DetachedRuleset from './detached-ruleset';\nimport Operation from './operation';\nimport Dimension from './dimension';\nimport Unit from './unit';\nimport Keyword from './keyword';\nimport Variable from './variable';\nimport Property from './property';\nimport Ruleset from './ruleset';\nimport Element from './element';\nimport Attribute from './attribute';\nimport Combinator from './combinator';\nimport Selector from './selector';\nimport Quoted from './quoted';\nimport Expression from './expression';\nimport Declaration from './declaration';\nimport Call from './call';\nimport URL from './url';\nimport Import from './import';\nimport Comment from './comment';\nimport Anonymous from './anonymous';\nimport Value from './value';\nimport JavaScript from './javascript';\nimport Assignment from './assignment';\nimport Condition from './condition';\nimport Paren from './paren';\nimport Media from './media';\nimport UnicodeDescriptor from './unicode-descriptor';\nimport Negative from './negative';\nimport Extend from './extend';\nimport VariableCall from './variable-call';\nimport NamespaceValue from './namespace-value';\n\n// mixins\nimport MixinCall from './mixin-call';\nimport MixinDefinition from './mixin-definition';\n\nexport default {\n Node, Color, AtRule, DetachedRuleset, Operation,\n Dimension, Unit, Keyword, Variable, Property,\n Ruleset, Element, Attribute, Combinator, Selector,\n Quoted, Expression, Declaration, Call, URL, Import,\n Comment, Anonymous, Value, JavaScript, Assignment,\n Condition, Paren, Media, UnicodeDescriptor, Negative,\n Extend, VariableCall, NamespaceValue,\n mixin: {\n Call: MixinCall,\n Definition: MixinDefinition\n }\n};","class AbstractFileManager {\n getPath(filename) {\n let j = filename.lastIndexOf('?');\n if (j > 0) {\n filename = filename.slice(0, j);\n }\n j = filename.lastIndexOf('/');\n if (j < 0) {\n j = filename.lastIndexOf('\\\\');\n }\n if (j < 0) {\n return '';\n }\n return filename.slice(0, j + 1);\n }\n\n tryAppendExtension(path, ext) {\n return /(\\.[a-z]*$)|([\\?;].*)$/.test(path) ? path : path + ext;\n }\n\n tryAppendLessExtension(path) {\n return this.tryAppendExtension(path, '.less');\n }\n\n supportsSync() {\n return false;\n }\n\n alwaysMakePathsAbsolute() {\n return false;\n }\n\n isPathAbsolute(filename) {\n return (/^(?:[a-z-]+:|\\/|\\\\|#)/i).test(filename);\n }\n\n // TODO: pull out / replace?\n join(basePath, laterPath) {\n if (!basePath) {\n return laterPath;\n }\n return basePath + laterPath;\n }\n\n pathDiff(url, baseUrl) {\n // diff between two paths to create a relative path\n\n const urlParts = this.extractUrlParts(url);\n\n const baseUrlParts = this.extractUrlParts(baseUrl);\n let i;\n let max;\n let urlDirectories;\n let baseUrlDirectories;\n let diff = '';\n if (urlParts.hostPart !== baseUrlParts.hostPart) {\n return '';\n }\n max = Math.max(baseUrlParts.directories.length, urlParts.directories.length);\n for (i = 0; i < max; i++) {\n if (baseUrlParts.directories[i] !== urlParts.directories[i]) { break; }\n }\n baseUrlDirectories = baseUrlParts.directories.slice(i);\n urlDirectories = urlParts.directories.slice(i);\n for (i = 0; i < baseUrlDirectories.length - 1; i++) {\n diff += '../';\n }\n for (i = 0; i < urlDirectories.length - 1; i++) {\n diff += `${urlDirectories[i]}/`;\n }\n return diff;\n }\n\n // helper function, not part of API\n extractUrlParts(url, baseUrl) {\n // urlParts[1] = protocol://hostname/ OR /\n // urlParts[2] = / if path relative to host base\n // urlParts[3] = directories\n // urlParts[4] = filename\n // urlParts[5] = parameters\n\n const urlPartsRegex = /^((?:[a-z-]+:)?\\/{2}(?:[^\\/\\?#]*\\/)|([\\/\\\\]))?((?:[^\\/\\\\\\?#]*[\\/\\\\])*)([^\\/\\\\\\?#]*)([#\\?].*)?$/i;\n\n const urlParts = url.match(urlPartsRegex);\n const returner = {};\n let rawDirectories = [];\n const directories = [];\n let i;\n let baseUrlParts;\n\n if (!urlParts) {\n throw new Error(`Could not parse sheet href - '${url}'`);\n }\n\n // Stylesheets in IE don't always return the full path\n if (baseUrl && (!urlParts[1] || urlParts[2])) {\n baseUrlParts = baseUrl.match(urlPartsRegex);\n if (!baseUrlParts) {\n throw new Error(`Could not parse page url - '${baseUrl}'`);\n }\n urlParts[1] = urlParts[1] || baseUrlParts[1] || '';\n if (!urlParts[2]) {\n urlParts[3] = baseUrlParts[3] + urlParts[3];\n }\n }\n\n if (urlParts[3]) {\n rawDirectories = urlParts[3].replace(/\\\\/g, '/').split('/');\n\n // collapse '..' and skip '.'\n for (i = 0; i < rawDirectories.length; i++) {\n\n if (rawDirectories[i] === '..') {\n directories.pop();\n }\n else if (rawDirectories[i] !== '.') {\n directories.push(rawDirectories[i]);\n }\n \n }\n }\n\n returner.hostPart = urlParts[1];\n returner.directories = directories;\n returner.rawPath = (urlParts[1] || '') + rawDirectories.join('/');\n returner.path = (urlParts[1] || '') + directories.join('/');\n returner.filename = urlParts[4];\n returner.fileUrl = returner.path + (urlParts[4] || '');\n returner.url = returner.fileUrl + (urlParts[5] || '');\n return returner;\n }\n}\n\nexport default AbstractFileManager;\n","import functionRegistry from '../functions/function-registry';\nimport LessError from '../less-error';\n\nclass AbstractPluginLoader {\n constructor() {\n // Implemented by Node.js plugin loader\n this.require = function() {\n return null;\n }\n }\n\n evalPlugin(contents, context, imports, pluginOptions, fileInfo) {\n\n let loader, registry, pluginObj, localModule, pluginManager, filename, result;\n\n pluginManager = context.pluginManager;\n\n if (fileInfo) {\n if (typeof fileInfo === 'string') {\n filename = fileInfo;\n }\n else {\n filename = fileInfo.filename;\n }\n }\n const shortname = (new this.less.FileManager()).extractUrlParts(filename).filename;\n\n if (filename) {\n pluginObj = pluginManager.get(filename);\n\n if (pluginObj) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imports, filename);\n }\n return pluginObj;\n }\n }\n localModule = {\n exports: {},\n pluginManager,\n fileInfo\n };\n registry = functionRegistry.create();\n\n const registerPlugin = function(obj) {\n pluginObj = obj;\n };\n\n try {\n loader = new Function('module', 'require', 'registerPlugin', 'functions', 'tree', 'less', 'fileInfo', contents);\n loader(localModule, this.require(filename), registerPlugin, registry, this.less.tree, this.less, fileInfo);\n }\n catch (e) {\n return new LessError(e, imports, filename);\n }\n\n if (!pluginObj) {\n pluginObj = localModule.exports;\n }\n pluginObj = this.validatePlugin(pluginObj, filename, shortname);\n\n if (pluginObj instanceof LessError) {\n return pluginObj;\n }\n\n if (pluginObj) {\n pluginObj.imports = imports;\n pluginObj.filename = filename;\n\n // For < 3.x (or unspecified minVersion) - setOptions() before install()\n if (!pluginObj.minVersion || this.compareVersion('3.0.0', pluginObj.minVersion) < 0) {\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n\n if (result) {\n return result;\n }\n }\n\n // Run on first load\n pluginManager.addPlugin(pluginObj, fileInfo.filename, registry);\n pluginObj.functions = registry.getLocalFunctions();\n\n // Need to call setOptions again because the pluginObj might have functions\n result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n if (result) {\n return result;\n }\n\n // Run every @plugin call\n try {\n if (pluginObj.use) {\n pluginObj.use.call(this.context, pluginObj);\n }\n }\n catch (e) {\n e.message = e.message || 'Error during @plugin call';\n return new LessError(e, imports, filename);\n }\n\n }\n else {\n return new LessError({ message: 'Not a valid plugin' }, imports, filename);\n }\n\n return pluginObj;\n\n }\n\n trySetOptions(plugin, filename, name, options) {\n if (options && !plugin.setOptions) {\n return new LessError({\n message: `Options have been provided but the plugin ${name} does not support any options.`\n });\n }\n try {\n plugin.setOptions && plugin.setOptions(options);\n }\n catch (e) {\n return new LessError(e);\n }\n }\n\n validatePlugin(plugin, filename, name) {\n if (plugin) {\n // support plugins being a function\n // so that the plugin can be more usable programmatically\n if (typeof plugin === 'function') {\n plugin = new plugin();\n }\n\n if (plugin.minVersion) {\n if (this.compareVersion(plugin.minVersion, this.less.version) < 0) {\n return new LessError({\n message: `Plugin ${name} requires version ${this.versionToString(plugin.minVersion)}`\n });\n }\n }\n return plugin;\n }\n return null;\n }\n\n compareVersion(aVersion, bVersion) {\n if (typeof aVersion === 'string') {\n aVersion = aVersion.match(/^(\\d+)\\.?(\\d+)?\\.?(\\d+)?/);\n aVersion.shift();\n }\n for (let i = 0; i < aVersion.length; i++) {\n if (aVersion[i] !== bVersion[i]) {\n return parseInt(aVersion[i]) > parseInt(bVersion[i]) ? -1 : 1;\n }\n }\n return 0;\n }\n\n versionToString(version) {\n let versionString = '';\n for (let i = 0; i < version.length; i++) {\n versionString += (versionString ? '.' : '') + version[i];\n }\n return versionString;\n }\n\n printUsage(plugins) {\n for (let i = 0; i < plugins.length; i++) {\n const plugin = plugins[i];\n if (plugin.printUsage) {\n plugin.printUsage();\n }\n }\n }\n}\n\nexport default AbstractPluginLoader;\n\n","import tree from '../tree';\n\nconst _visitArgs = { visitDeeper: true };\nlet _hasIndexed = false;\n\nfunction _noop(node) {\n return node;\n}\n\nfunction indexNodeTypes(parent, ticker) {\n // add .typeIndex to tree node types for lookup table\n let key, child;\n for (key in parent) { \n /* eslint guard-for-in: 0 */\n child = parent[key];\n switch (typeof child) {\n case 'function':\n // ignore bound functions directly on tree which do not have a prototype\n // or aren't nodes\n if (child.prototype && child.prototype.type) {\n child.prototype.typeIndex = ticker++;\n }\n break;\n case 'object':\n ticker = indexNodeTypes(child, ticker);\n break;\n \n }\n }\n return ticker;\n}\n\nclass Visitor {\n constructor(implementation) {\n this._implementation = implementation;\n this._visitInCache = {};\n this._visitOutCache = {};\n\n if (!_hasIndexed) {\n indexNodeTypes(tree, 1);\n _hasIndexed = true;\n }\n }\n\n visit(node) {\n if (!node) {\n return node;\n }\n\n const nodeTypeIndex = node.typeIndex;\n if (!nodeTypeIndex) {\n // MixinCall args aren't a node type?\n if (node.value && node.value.typeIndex) {\n this.visit(node.value);\n }\n return node;\n }\n\n const impl = this._implementation;\n let func = this._visitInCache[nodeTypeIndex];\n let funcOut = this._visitOutCache[nodeTypeIndex];\n const visitArgs = _visitArgs;\n let fnName;\n\n visitArgs.visitDeeper = true;\n\n if (!func) {\n fnName = `visit${node.type}`;\n func = impl[fnName] || _noop;\n funcOut = impl[`${fnName}Out`] || _noop;\n this._visitInCache[nodeTypeIndex] = func;\n this._visitOutCache[nodeTypeIndex] = funcOut;\n }\n\n if (func !== _noop) {\n const newNode = func.call(impl, node, visitArgs);\n if (node && impl.isReplacing) {\n node = newNode;\n }\n }\n\n if (visitArgs.visitDeeper && node) {\n if (node.length) {\n for (let i = 0, cnt = node.length; i < cnt; i++) {\n if (node[i].accept) {\n node[i].accept(this);\n }\n }\n } else if (node.accept) {\n node.accept(this);\n }\n }\n\n if (funcOut != _noop) {\n funcOut.call(impl, node);\n }\n\n return node;\n }\n\n visitArray(nodes, nonReplacing) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.length;\n let i;\n\n // Non-replacing\n if (nonReplacing || !this._implementation.isReplacing) {\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n // Replacing\n const out = [];\n for (i = 0; i < cnt; i++) {\n const evald = this.visit(nodes[i]);\n if (evald === undefined) { continue; }\n if (!evald.splice) {\n out.push(evald);\n } else if (evald.length) {\n this.flatten(evald, out);\n }\n }\n return out;\n }\n\n flatten(arr, out) {\n if (!out) {\n out = [];\n }\n\n let cnt, i, item, nestedCnt, j, nestedItem;\n\n for (i = 0, cnt = arr.length; i < cnt; i++) {\n item = arr[i];\n if (item === undefined) {\n continue;\n }\n if (!item.splice) {\n out.push(item);\n continue;\n }\n\n for (j = 0, nestedCnt = item.length; j < nestedCnt; j++) {\n nestedItem = item[j];\n if (nestedItem === undefined) {\n continue;\n }\n if (!nestedItem.splice) {\n out.push(nestedItem);\n } else if (nestedItem.length) {\n this.flatten(nestedItem, out);\n }\n }\n }\n\n return out;\n }\n}\n\nexport default Visitor;\n","class ImportSequencer {\n constructor(onSequencerEmpty) {\n this.imports = [];\n this.variableImports = [];\n this._onSequencerEmpty = onSequencerEmpty;\n this._currentDepth = 0;\n }\n\n addImport(callback) {\n const importSequencer = this,\n importItem = {\n callback,\n args: null,\n isReady: false\n };\n this.imports.push(importItem);\n return function() {\n importItem.args = Array.prototype.slice.call(arguments, 0);\n importItem.isReady = true;\n importSequencer.tryRun();\n };\n }\n\n addVariableImport(callback) {\n this.variableImports.push(callback);\n }\n\n tryRun() {\n this._currentDepth++;\n try {\n while (true) {\n while (this.imports.length > 0) {\n const importItem = this.imports[0];\n if (!importItem.isReady) {\n return;\n }\n this.imports = this.imports.slice(1);\n importItem.callback.apply(null, importItem.args);\n }\n if (this.variableImports.length === 0) {\n break;\n }\n const variableImport = this.variableImports[0];\n this.variableImports = this.variableImports.slice(1);\n variableImport();\n }\n } finally {\n this._currentDepth--;\n }\n if (this._currentDepth === 0 && this._onSequencerEmpty) {\n this._onSequencerEmpty();\n }\n }\n}\n\nexport default ImportSequencer;\n","import contexts from '../contexts';\nimport Visitor from './visitor';\nimport ImportSequencer from './import-sequencer';\nimport * as utils from '../utils';\n\nconst ImportVisitor = function(importer, finish) {\n\n this._visitor = new Visitor(this);\n this._importer = importer;\n this._finish = finish;\n this.context = new contexts.Eval();\n this.importCount = 0;\n this.onceFileDetectionMap = {};\n this.recursionDetector = {};\n this._sequencer = new ImportSequencer(this._onSequencerEmpty.bind(this));\n};\n\nImportVisitor.prototype = {\n isReplacing: false,\n run: function (root) {\n try {\n // process the contents\n this._visitor.visit(root);\n }\n catch (e) {\n this.error = e;\n }\n\n this.isFinished = true;\n this._sequencer.tryRun();\n },\n _onSequencerEmpty: function() {\n if (!this.isFinished) {\n return;\n }\n this._finish(this.error);\n },\n visitImport: function (importNode, visitArgs) {\n const inlineCSS = importNode.options.inline;\n\n if (!importNode.css || inlineCSS) {\n\n const context = new contexts.Eval(this.context, utils.copyArray(this.context.frames));\n const importParent = context.frames[0];\n\n this.importCount++;\n if (importNode.isVariableImport()) {\n this._sequencer.addVariableImport(this.processImportNode.bind(this, importNode, context, importParent));\n } else {\n this.processImportNode(importNode, context, importParent);\n }\n }\n visitArgs.visitDeeper = false;\n },\n processImportNode: function(importNode, context, importParent) {\n let evaldImportNode;\n const inlineCSS = importNode.options.inline;\n\n try {\n evaldImportNode = importNode.evalForImport(context);\n } catch (e) {\n if (!e.filename) { e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename; }\n // attempt to eval properly and treat as css\n importNode.css = true;\n // if that fails, this error will be thrown\n importNode.error = e;\n }\n\n if (evaldImportNode && (!evaldImportNode.css || inlineCSS)) {\n\n if (evaldImportNode.options.multiple) {\n context.importMultiple = true;\n }\n\n // try appending if we haven't determined if it is css or not\n const tryAppendLessExtension = evaldImportNode.css === undefined;\n\n for (let i = 0; i < importParent.rules.length; i++) {\n if (importParent.rules[i] === importNode) {\n importParent.rules[i] = evaldImportNode;\n break;\n }\n }\n\n const onImported = this.onImported.bind(this, evaldImportNode, context), sequencedOnImported = this._sequencer.addImport(onImported);\n\n this._importer.push(evaldImportNode.getPath(), tryAppendLessExtension, evaldImportNode.fileInfo(),\n evaldImportNode.options, sequencedOnImported);\n } else {\n this.importCount--;\n if (this.isFinished) {\n this._sequencer.tryRun();\n }\n }\n },\n onImported: function (importNode, context, e, root, importedAtRoot, fullPath) {\n if (e) {\n if (!e.filename) {\n e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename;\n }\n this.error = e;\n }\n\n const importVisitor = this,\n inlineCSS = importNode.options.inline,\n isPlugin = importNode.options.isPlugin,\n isOptional = importNode.options.optional,\n duplicateImport = importedAtRoot || fullPath in importVisitor.recursionDetector;\n\n if (!context.importMultiple) {\n if (duplicateImport) {\n importNode.skip = true;\n } else {\n importNode.skip = function() {\n if (fullPath in importVisitor.onceFileDetectionMap) {\n return true;\n }\n importVisitor.onceFileDetectionMap[fullPath] = true;\n return false;\n };\n }\n }\n\n if (!fullPath && isOptional) {\n importNode.skip = true;\n }\n\n if (root) {\n importNode.root = root;\n importNode.importedFilename = fullPath;\n\n if (!inlineCSS && !isPlugin && (context.importMultiple || !duplicateImport)) {\n importVisitor.recursionDetector[fullPath] = true;\n\n const oldContext = this.context;\n this.context = context;\n try {\n this._visitor.visit(root);\n } catch (e) {\n this.error = e;\n }\n this.context = oldContext;\n }\n }\n\n importVisitor.importCount--;\n\n if (importVisitor.isFinished) {\n importVisitor._sequencer.tryRun();\n }\n },\n visitDeclaration: function (declNode, visitArgs) {\n if (declNode.value.type === 'DetachedRuleset') {\n this.context.frames.unshift(declNode);\n } else {\n visitArgs.visitDeeper = false;\n }\n },\n visitDeclarationOut: function(declNode) {\n if (declNode.value.type === 'DetachedRuleset') {\n this.context.frames.shift();\n }\n },\n visitAtRule: function (atRuleNode, visitArgs) {\n this.context.frames.unshift(atRuleNode);\n },\n visitAtRuleOut: function (atRuleNode) {\n this.context.frames.shift();\n },\n visitMixinDefinition: function (mixinDefinitionNode, visitArgs) {\n this.context.frames.unshift(mixinDefinitionNode);\n },\n visitMixinDefinitionOut: function (mixinDefinitionNode) {\n this.context.frames.shift();\n },\n visitRuleset: function (rulesetNode, visitArgs) {\n this.context.frames.unshift(rulesetNode);\n },\n visitRulesetOut: function (rulesetNode) {\n this.context.frames.shift();\n },\n visitMedia: function (mediaNode, visitArgs) {\n this.context.frames.unshift(mediaNode.rules[0]);\n },\n visitMediaOut: function (mediaNode) {\n this.context.frames.shift();\n }\n};\nexport default ImportVisitor;\n","class SetTreeVisibilityVisitor {\n constructor(visible) {\n this.visible = visible;\n }\n\n run(root) {\n this.visit(root);\n }\n\n visitArray(nodes) {\n if (!nodes) {\n return nodes;\n }\n\n const cnt = nodes.length;\n let i;\n for (i = 0; i < cnt; i++) {\n this.visit(nodes[i]);\n }\n return nodes;\n }\n\n visit(node) {\n if (!node) {\n return node;\n }\n if (node.constructor === Array) {\n return this.visitArray(node);\n }\n\n if (!node.blocksVisibility || node.blocksVisibility()) {\n return node;\n }\n if (this.visible) {\n node.ensureVisibility();\n } else {\n node.ensureInvisibility();\n }\n\n node.accept(this);\n return node;\n }\n}\n\nexport default SetTreeVisibilityVisitor;","import tree from '../tree';\nimport Visitor from './visitor';\nimport logger from '../logger';\nimport * as utils from '../utils';\n\n/* jshint loopfunc:true */\n\nclass ExtendFinderVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n this.contexts = [];\n this.allExtendsStack = [[]];\n }\n\n run(root) {\n root = this._visitor.visit(root);\n root.allExtends = this.allExtendsStack[0];\n return root;\n }\n\n visitDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n\n let i;\n let j;\n let extend;\n const allSelectorsExtendList = [];\n let extendList;\n\n // get &:extend(.a); rules which apply to all selectors in this ruleset\n const rules = rulesetNode.rules, ruleCnt = rules ? rules.length : 0;\n for (i = 0; i < ruleCnt; i++) {\n if (rulesetNode.rules[i] instanceof tree.Extend) {\n allSelectorsExtendList.push(rules[i]);\n rulesetNode.extendOnEveryPath = true;\n }\n }\n\n // now find every selector and apply the extends that apply to all extends\n // and the ones which apply to an individual extend\n const paths = rulesetNode.paths;\n for (i = 0; i < paths.length; i++) {\n const selectorPath = paths[i], selector = selectorPath[selectorPath.length - 1], selExtendList = selector.extendList;\n\n extendList = selExtendList ? utils.copyArray(selExtendList).concat(allSelectorsExtendList)\n : allSelectorsExtendList;\n\n if (extendList) {\n extendList = extendList.map(function(allSelectorsExtend) {\n return allSelectorsExtend.clone();\n });\n }\n\n for (j = 0; j < extendList.length; j++) {\n this.foundExtends = true;\n extend = extendList[j];\n extend.findSelfSelectors(selectorPath);\n extend.ruleset = rulesetNode;\n if (j === 0) { extend.firstExtendOnThisSelectorPath = true; }\n this.allExtendsStack[this.allExtendsStack.length - 1].push(extend);\n }\n }\n\n this.contexts.push(rulesetNode.selectors);\n }\n\n visitRulesetOut(rulesetNode) {\n if (!rulesetNode.root) {\n this.contexts.length = this.contexts.length - 1;\n }\n }\n\n visitMedia(mediaNode, visitArgs) {\n mediaNode.allExtends = [];\n this.allExtendsStack.push(mediaNode.allExtends);\n }\n\n visitMediaOut(mediaNode) {\n this.allExtendsStack.length = this.allExtendsStack.length - 1;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n atRuleNode.allExtends = [];\n this.allExtendsStack.push(atRuleNode.allExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n this.allExtendsStack.length = this.allExtendsStack.length - 1;\n }\n}\n\nclass ProcessExtendsVisitor {\n constructor() {\n this._visitor = new Visitor(this);\n }\n\n run(root) {\n const extendFinder = new ExtendFinderVisitor();\n this.extendIndices = {};\n extendFinder.run(root);\n if (!extendFinder.foundExtends) { return root; }\n root.allExtends = root.allExtends.concat(this.doExtendChaining(root.allExtends, root.allExtends));\n this.allExtendsStack = [root.allExtends];\n const newRoot = this._visitor.visit(root);\n this.checkExtendsForNonMatched(root.allExtends);\n return newRoot;\n }\n\n checkExtendsForNonMatched(extendList) {\n const indices = this.extendIndices;\n extendList.filter(function(extend) {\n return !extend.hasFoundMatches && extend.parent_ids.length == 1;\n }).forEach(function(extend) {\n let selector = '_unknown_';\n try {\n selector = extend.selector.toCSS({});\n }\n catch (_) {}\n\n if (!indices[`${extend.index} ${selector}`]) {\n indices[`${extend.index} ${selector}`] = true;\n logger.warn(`extend '${selector}' has no matches`);\n }\n });\n }\n\n doExtendChaining(extendsList, extendsListTarget, iterationCount) {\n //\n // chaining is different from normal extension.. if we extend an extend then we are not just copying, altering\n // and pasting the selector we would do normally, but we are also adding an extend with the same target selector\n // this means this new extend can then go and alter other extends\n //\n // this method deals with all the chaining work - without it, extend is flat and doesn't work on other extend selectors\n // this is also the most expensive.. and a match on one selector can cause an extension of a selector we had already\n // processed if we look at each selector at a time, as is done in visitRuleset\n\n let extendIndex;\n\n let targetExtendIndex;\n let matches;\n const extendsToAdd = [];\n let newSelector;\n const extendVisitor = this;\n let selectorPath;\n let extend;\n let targetExtend;\n let newExtend;\n\n iterationCount = iterationCount || 0;\n\n // loop through comparing every extend with every target extend.\n // a target extend is the one on the ruleset we are looking at copy/edit/pasting in place\n // e.g. .a:extend(.b) {} and .b:extend(.c) {} then the first extend extends the second one\n // and the second is the target.\n // the separation into two lists allows us to process a subset of chains with a bigger set, as is the\n // case when processing media queries\n for (extendIndex = 0; extendIndex < extendsList.length; extendIndex++) {\n for (targetExtendIndex = 0; targetExtendIndex < extendsListTarget.length; targetExtendIndex++) {\n\n extend = extendsList[extendIndex];\n targetExtend = extendsListTarget[targetExtendIndex];\n\n // look for circular references\n if ( extend.parent_ids.indexOf( targetExtend.object_id ) >= 0 ) { continue; }\n\n // find a match in the target extends self selector (the bit before :extend)\n selectorPath = [targetExtend.selfSelectors[0]];\n matches = extendVisitor.findMatch(extend, selectorPath);\n\n if (matches.length) {\n extend.hasFoundMatches = true;\n\n // we found a match, so for each self selector..\n extend.selfSelectors.forEach(function(selfSelector) {\n const info = targetExtend.visibilityInfo();\n\n // process the extend as usual\n newSelector = extendVisitor.extendSelector(matches, selectorPath, selfSelector, extend.isVisible());\n\n // but now we create a new extend from it\n newExtend = new(tree.Extend)(targetExtend.selector, targetExtend.option, 0, targetExtend.fileInfo(), info);\n newExtend.selfSelectors = newSelector;\n\n // add the extend onto the list of extends for that selector\n newSelector[newSelector.length - 1].extendList = [newExtend];\n\n // record that we need to add it.\n extendsToAdd.push(newExtend);\n newExtend.ruleset = targetExtend.ruleset;\n\n // remember its parents for circular references\n newExtend.parent_ids = newExtend.parent_ids.concat(targetExtend.parent_ids, extend.parent_ids);\n\n // only process the selector once.. if we have :extend(.a,.b) then multiple\n // extends will look at the same selector path, so when extending\n // we know that any others will be duplicates in terms of what is added to the css\n if (targetExtend.firstExtendOnThisSelectorPath) {\n newExtend.firstExtendOnThisSelectorPath = true;\n targetExtend.ruleset.paths.push(newSelector);\n }\n });\n }\n }\n }\n\n if (extendsToAdd.length) {\n // try to detect circular references to stop a stack overflow.\n // may no longer be needed.\n this.extendChainCount++;\n if (iterationCount > 100) {\n let selectorOne = '{unable to calculate}';\n let selectorTwo = '{unable to calculate}';\n try {\n selectorOne = extendsToAdd[0].selfSelectors[0].toCSS();\n selectorTwo = extendsToAdd[0].selector.toCSS();\n }\n catch (e) {}\n throw { message: `extend circular reference detected. One of the circular extends is currently:${selectorOne}:extend(${selectorTwo})`};\n }\n\n // now process the new extends on the existing rules so that we can handle a extending b extending c extending\n // d extending e...\n return extendsToAdd.concat(extendVisitor.doExtendChaining(extendsToAdd, extendsListTarget, iterationCount + 1));\n } else {\n return extendsToAdd;\n }\n }\n\n visitDeclaration(ruleNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitSelector(selectorNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n if (rulesetNode.root) {\n return;\n }\n let matches;\n let pathIndex;\n let extendIndex;\n const allExtends = this.allExtendsStack[this.allExtendsStack.length - 1];\n const selectorsToAdd = [];\n const extendVisitor = this;\n let selectorPath;\n\n // look at each selector path in the ruleset, find any extend matches and then copy, find and replace\n\n for (extendIndex = 0; extendIndex < allExtends.length; extendIndex++) {\n for (pathIndex = 0; pathIndex < rulesetNode.paths.length; pathIndex++) {\n selectorPath = rulesetNode.paths[pathIndex];\n\n // extending extends happens initially, before the main pass\n if (rulesetNode.extendOnEveryPath) { continue; }\n const extendList = selectorPath[selectorPath.length - 1].extendList;\n if (extendList && extendList.length) { continue; }\n\n matches = this.findMatch(allExtends[extendIndex], selectorPath);\n\n if (matches.length) {\n allExtends[extendIndex].hasFoundMatches = true;\n\n allExtends[extendIndex].selfSelectors.forEach(function(selfSelector) {\n let extendedSelectors;\n extendedSelectors = extendVisitor.extendSelector(matches, selectorPath, selfSelector, allExtends[extendIndex].isVisible());\n selectorsToAdd.push(extendedSelectors);\n });\n }\n }\n }\n rulesetNode.paths = rulesetNode.paths.concat(selectorsToAdd);\n }\n\n findMatch(extend, haystackSelectorPath) {\n //\n // look through the haystack selector path to try and find the needle - extend.selector\n // returns an array of selector matches that can then be replaced\n //\n let haystackSelectorIndex;\n\n let hackstackSelector;\n let hackstackElementIndex;\n let haystackElement;\n let targetCombinator;\n let i;\n const extendVisitor = this;\n const needleElements = extend.selector.elements;\n const potentialMatches = [];\n let potentialMatch;\n const matches = [];\n\n // loop through the haystack elements\n for (haystackSelectorIndex = 0; haystackSelectorIndex < haystackSelectorPath.length; haystackSelectorIndex++) {\n hackstackSelector = haystackSelectorPath[haystackSelectorIndex];\n\n for (hackstackElementIndex = 0; hackstackElementIndex < hackstackSelector.elements.length; hackstackElementIndex++) {\n\n haystackElement = hackstackSelector.elements[hackstackElementIndex];\n\n // if we allow elements before our match we can add a potential match every time. otherwise only at the first element.\n if (extend.allowBefore || (haystackSelectorIndex === 0 && hackstackElementIndex === 0)) {\n potentialMatches.push({pathIndex: haystackSelectorIndex, index: hackstackElementIndex, matched: 0,\n initialCombinator: haystackElement.combinator});\n }\n\n for (i = 0; i < potentialMatches.length; i++) {\n potentialMatch = potentialMatches[i];\n\n // selectors add \" \" onto the first element. When we use & it joins the selectors together, but if we don't\n // then each selector in haystackSelectorPath has a space before it added in the toCSS phase. so we need to\n // work out what the resulting combinator will be\n targetCombinator = haystackElement.combinator.value;\n if (targetCombinator === '' && hackstackElementIndex === 0) {\n targetCombinator = ' ';\n }\n\n // if we don't match, null our match to indicate failure\n if (!extendVisitor.isElementValuesEqual(needleElements[potentialMatch.matched].value, haystackElement.value) ||\n (potentialMatch.matched > 0 && needleElements[potentialMatch.matched].combinator.value !== targetCombinator)) {\n potentialMatch = null;\n } else {\n potentialMatch.matched++;\n }\n\n // if we are still valid and have finished, test whether we have elements after and whether these are allowed\n if (potentialMatch) {\n potentialMatch.finished = potentialMatch.matched === needleElements.length;\n if (potentialMatch.finished &&\n (!extend.allowAfter &&\n (hackstackElementIndex + 1 < hackstackSelector.elements.length || haystackSelectorIndex + 1 < haystackSelectorPath.length))) {\n potentialMatch = null;\n }\n }\n // if null we remove, if not, we are still valid, so either push as a valid match or continue\n if (potentialMatch) {\n if (potentialMatch.finished) {\n potentialMatch.length = needleElements.length;\n potentialMatch.endPathIndex = haystackSelectorIndex;\n potentialMatch.endPathElementIndex = hackstackElementIndex + 1; // index after end of match\n potentialMatches.length = 0; // we don't allow matches to overlap, so start matching again\n matches.push(potentialMatch);\n }\n } else {\n potentialMatches.splice(i, 1);\n i--;\n }\n }\n }\n }\n return matches;\n }\n\n isElementValuesEqual(elementValue1, elementValue2) {\n if (typeof elementValue1 === 'string' || typeof elementValue2 === 'string') {\n return elementValue1 === elementValue2;\n }\n if (elementValue1 instanceof tree.Attribute) {\n if (elementValue1.op !== elementValue2.op || elementValue1.key !== elementValue2.key) {\n return false;\n }\n if (!elementValue1.value || !elementValue2.value) {\n if (elementValue1.value || elementValue2.value) {\n return false;\n }\n return true;\n }\n elementValue1 = elementValue1.value.value || elementValue1.value;\n elementValue2 = elementValue2.value.value || elementValue2.value;\n return elementValue1 === elementValue2;\n }\n elementValue1 = elementValue1.value;\n elementValue2 = elementValue2.value;\n if (elementValue1 instanceof tree.Selector) {\n if (!(elementValue2 instanceof tree.Selector) || elementValue1.elements.length !== elementValue2.elements.length) {\n return false;\n }\n for (let i = 0; i < elementValue1.elements.length; i++) {\n if (elementValue1.elements[i].combinator.value !== elementValue2.elements[i].combinator.value) {\n if (i !== 0 || (elementValue1.elements[i].combinator.value || ' ') !== (elementValue2.elements[i].combinator.value || ' ')) {\n return false;\n }\n }\n if (!this.isElementValuesEqual(elementValue1.elements[i].value, elementValue2.elements[i].value)) {\n return false;\n }\n }\n return true;\n }\n return false;\n }\n\n extendSelector(matches, selectorPath, replacementSelector, isVisible) {\n\n // for a set of matches, replace each match with the replacement selector\n\n let currentSelectorPathIndex = 0, currentSelectorPathElementIndex = 0, path = [], matchIndex, selector, firstElement, match, newElements;\n\n for (matchIndex = 0; matchIndex < matches.length; matchIndex++) {\n match = matches[matchIndex];\n selector = selectorPath[match.pathIndex];\n firstElement = new tree.Element(\n match.initialCombinator,\n replacementSelector.elements[0].value,\n replacementSelector.elements[0].isVariable,\n replacementSelector.elements[0].getIndex(),\n replacementSelector.elements[0].fileInfo()\n );\n\n if (match.pathIndex > currentSelectorPathIndex && currentSelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n\n newElements = selector.elements\n .slice(currentSelectorPathElementIndex, match.index)\n .concat([firstElement])\n .concat(replacementSelector.elements.slice(1));\n\n if (currentSelectorPathIndex === match.pathIndex && matchIndex > 0) {\n path[path.length - 1].elements =\n path[path.length - 1].elements.concat(newElements);\n } else {\n path = path.concat(selectorPath.slice(currentSelectorPathIndex, match.pathIndex));\n\n path.push(new tree.Selector(\n newElements\n ));\n }\n currentSelectorPathIndex = match.endPathIndex;\n currentSelectorPathElementIndex = match.endPathElementIndex;\n if (currentSelectorPathElementIndex >= selectorPath[currentSelectorPathIndex].elements.length) {\n currentSelectorPathElementIndex = 0;\n currentSelectorPathIndex++;\n }\n }\n\n if (currentSelectorPathIndex < selectorPath.length && currentSelectorPathElementIndex > 0) {\n path[path.length - 1].elements = path[path.length - 1]\n .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n currentSelectorPathIndex++;\n }\n\n path = path.concat(selectorPath.slice(currentSelectorPathIndex, selectorPath.length));\n path = path.map(function (currentValue) {\n // we can re-use elements here, because the visibility property matters only for selectors\n const derived = currentValue.createDerived(currentValue.elements);\n if (isVisible) {\n derived.ensureVisibility();\n } else {\n derived.ensureInvisibility();\n }\n return derived;\n });\n return path;\n }\n\n visitMedia(mediaNode, visitArgs) {\n let newAllExtends = mediaNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, mediaNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitMediaOut(mediaNode) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStack.length = lastIndex;\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n let newAllExtends = atRuleNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, atRuleNode.allExtends));\n this.allExtendsStack.push(newAllExtends);\n }\n\n visitAtRuleOut(atRuleNode) {\n const lastIndex = this.allExtendsStack.length - 1;\n this.allExtendsStack.length = lastIndex;\n }\n}\n\nexport default ProcessExtendsVisitor;\n","import Visitor from './visitor';\n\nclass JoinSelectorVisitor {\n constructor() {\n this.contexts = [[]];\n this._visitor = new Visitor(this);\n }\n\n run(root) {\n return this._visitor.visit(root);\n }\n\n visitDeclaration(declNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n visitArgs.visitDeeper = false;\n }\n\n visitRuleset(rulesetNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n const paths = [];\n let selectors;\n\n this.contexts.push(paths);\n\n if (!rulesetNode.root) {\n selectors = rulesetNode.selectors;\n if (selectors) {\n selectors = selectors.filter(function(selector) { return selector.getIsOutput(); });\n rulesetNode.selectors = selectors.length ? selectors : (selectors = null);\n if (selectors) { rulesetNode.joinSelectors(paths, context, selectors); }\n }\n if (!selectors) { rulesetNode.rules = null; }\n rulesetNode.paths = paths;\n }\n }\n\n visitRulesetOut(rulesetNode) {\n this.contexts.length = this.contexts.length - 1;\n }\n\n visitMedia(mediaNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n mediaNode.rules[0].root = (context.length === 0 || context[0].multiMedia);\n }\n\n visitAtRule(atRuleNode, visitArgs) {\n const context = this.contexts[this.contexts.length - 1];\n if (atRuleNode.rules && atRuleNode.rules.length) {\n atRuleNode.rules[0].root = (atRuleNode.isRooted || context.length === 0 || null);\n }\n }\n}\n\nexport default JoinSelectorVisitor;\n","import tree from '../tree';\nimport Visitor from './visitor';\n\nclass CSSVisitorUtils {\n constructor(context) {\n this._visitor = new Visitor(this);\n this._context = context;\n }\n\n containsSilentNonBlockedChild(bodyRules) {\n let rule;\n if (!bodyRules) {\n return false;\n }\n for (let r = 0; r < bodyRules.length; r++) {\n rule = bodyRules[r];\n if (rule.isSilent && rule.isSilent(this._context) && !rule.blocksVisibility()) {\n // the atrule contains something that was referenced (likely by extend)\n // therefore it needs to be shown in output too\n return true;\n }\n }\n return false;\n }\n\n keepOnlyVisibleChilds(owner) {\n if (owner && owner.rules) {\n owner.rules = owner.rules.filter(thing => thing.isVisible());\n }\n }\n\n isEmpty(owner) {\n return (owner && owner.rules) \n ? (owner.rules.length === 0) : true;\n }\n\n hasVisibleSelector(rulesetNode) {\n return (rulesetNode && rulesetNode.paths)\n ? (rulesetNode.paths.length > 0) : false;\n }\n\n resolveVisibility(node, originalRules) {\n if (!node.blocksVisibility()) {\n if (this.isEmpty(node) && !this.containsSilentNonBlockedChild(originalRules)) {\n return ;\n }\n\n return node;\n }\n\n const compiledRulesBody = node.rules[0];\n this.keepOnlyVisibleChilds(compiledRulesBody);\n\n if (this.isEmpty(compiledRulesBody)) {\n return ;\n }\n\n node.ensureVisibility();\n node.removeVisibilityBlock();\n\n return node;\n }\n\n isVisibleRuleset(rulesetNode) {\n if (rulesetNode.firstRoot) {\n return true;\n }\n\n if (this.isEmpty(rulesetNode)) {\n return false;\n }\n\n if (!rulesetNode.root && !this.hasVisibleSelector(rulesetNode)) {\n return false;\n }\n\n return true;\n }\n}\n\nconst ToCSSVisitor = function(context) {\n this._visitor = new Visitor(this);\n this._context = context;\n this.utils = new CSSVisitorUtils(context);\n};\n\nToCSSVisitor.prototype = {\n isReplacing: true,\n run: function (root) {\n return this._visitor.visit(root);\n },\n\n visitDeclaration: function (declNode, visitArgs) {\n if (declNode.blocksVisibility() || declNode.variable) {\n return;\n }\n return declNode;\n },\n\n visitMixinDefinition: function (mixinNode, visitArgs) {\n // mixin definitions do not get eval'd - this means they keep state\n // so we have to clear that state here so it isn't used if toCSS is called twice\n mixinNode.frames = [];\n },\n\n visitExtend: function (extendNode, visitArgs) {\n },\n\n visitComment: function (commentNode, visitArgs) {\n if (commentNode.blocksVisibility() || commentNode.isSilent(this._context)) {\n return;\n }\n return commentNode;\n },\n\n visitMedia: function(mediaNode, visitArgs) {\n const originalRules = mediaNode.rules[0].rules;\n mediaNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n\n return this.utils.resolveVisibility(mediaNode, originalRules);\n },\n\n visitImport: function (importNode, visitArgs) {\n if (importNode.blocksVisibility()) {\n return ;\n }\n return importNode;\n },\n\n visitAtRule: function(atRuleNode, visitArgs) {\n if (atRuleNode.rules && atRuleNode.rules.length) {\n return this.visitAtRuleWithBody(atRuleNode, visitArgs);\n } else {\n return this.visitAtRuleWithoutBody(atRuleNode, visitArgs);\n }\n },\n\n visitAnonymous: function(anonymousNode, visitArgs) {\n if (!anonymousNode.blocksVisibility()) {\n anonymousNode.accept(this._visitor);\n return anonymousNode;\n }\n },\n\n visitAtRuleWithBody: function(atRuleNode, visitArgs) {\n // if there is only one nested ruleset and that one has no path, then it is\n // just fake ruleset\n function hasFakeRuleset(atRuleNode) {\n const bodyRules = atRuleNode.rules;\n return bodyRules.length === 1 && (!bodyRules[0].paths || bodyRules[0].paths.length === 0);\n }\n function getBodyRules(atRuleNode) {\n const nodeRules = atRuleNode.rules;\n if (hasFakeRuleset(atRuleNode)) {\n return nodeRules[0].rules;\n }\n\n return nodeRules;\n }\n // it is still true that it is only one ruleset in array\n // this is last such moment\n // process childs\n const originalRules = getBodyRules(atRuleNode);\n atRuleNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n\n if (!this.utils.isEmpty(atRuleNode)) {\n this._mergeRules(atRuleNode.rules[0].rules);\n }\n\n return this.utils.resolveVisibility(atRuleNode, originalRules);\n },\n\n visitAtRuleWithoutBody: function(atRuleNode, visitArgs) {\n if (atRuleNode.blocksVisibility()) {\n return;\n }\n\n if (atRuleNode.name === '@charset') {\n // Only output the debug info together with subsequent @charset definitions\n // a comment (or @media statement) before the actual @charset atrule would\n // be considered illegal css as it has to be on the first line\n if (this.charset) {\n if (atRuleNode.debugInfo) {\n const comment = new tree.Comment(`/* ${atRuleNode.toCSS(this._context).replace(/\\n/g, '')} */\\n`);\n comment.debugInfo = atRuleNode.debugInfo;\n return this._visitor.visit(comment);\n }\n return;\n }\n this.charset = true;\n }\n\n return atRuleNode;\n },\n\n checkValidNodes: function(rules, isRoot) {\n if (!rules) {\n return;\n }\n\n for (let i = 0; i < rules.length; i++) {\n const ruleNode = rules[i];\n if (isRoot && ruleNode instanceof tree.Declaration && !ruleNode.variable) {\n throw { message: 'Properties must be inside selector blocks. They cannot be in the root',\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n if (ruleNode instanceof tree.Call) {\n throw { message: `Function '${ruleNode.name}' did not return a root node`,\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n if (ruleNode.type && !ruleNode.allowRoot) {\n throw { message: `${ruleNode.type} node returned by a function is not valid here`,\n index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n }\n }\n },\n\n visitRuleset: function (rulesetNode, visitArgs) {\n // at this point rulesets are nested into each other\n let rule;\n\n const rulesets = [];\n\n this.checkValidNodes(rulesetNode.rules, rulesetNode.firstRoot);\n\n if (!rulesetNode.root) {\n // remove invisible paths\n this._compileRulesetPaths(rulesetNode);\n\n // remove rulesets from this ruleset body and compile them separately\n const nodeRules = rulesetNode.rules;\n\n let nodeRuleCnt = nodeRules ? nodeRules.length : 0;\n for (let i = 0; i < nodeRuleCnt; ) {\n rule = nodeRules[i];\n if (rule && rule.rules) {\n // visit because we are moving them out from being a child\n rulesets.push(this._visitor.visit(rule));\n nodeRules.splice(i, 1);\n nodeRuleCnt--;\n continue;\n }\n i++;\n }\n // accept the visitor to remove rules and refactor itself\n // then we can decide nogw whether we want it or not\n // compile body\n if (nodeRuleCnt > 0) {\n rulesetNode.accept(this._visitor);\n } else {\n rulesetNode.rules = null;\n }\n visitArgs.visitDeeper = false;\n } else { // if (! rulesetNode.root) {\n rulesetNode.accept(this._visitor);\n visitArgs.visitDeeper = false;\n }\n\n if (rulesetNode.rules) {\n this._mergeRules(rulesetNode.rules);\n this._removeDuplicateRules(rulesetNode.rules);\n }\n\n // now decide whether we keep the ruleset\n if (this.utils.isVisibleRuleset(rulesetNode)) {\n rulesetNode.ensureVisibility();\n rulesets.splice(0, 0, rulesetNode);\n }\n\n if (rulesets.length === 1) {\n return rulesets[0];\n }\n return rulesets;\n },\n\n _compileRulesetPaths: function(rulesetNode) {\n if (rulesetNode.paths) {\n rulesetNode.paths = rulesetNode.paths\n .filter(p => {\n let i;\n if (p[0].elements[0].combinator.value === ' ') {\n p[0].elements[0].combinator = new(tree.Combinator)('');\n }\n for (i = 0; i < p.length; i++) {\n if (p[i].isVisible() && p[i].getIsOutput()) {\n return true;\n }\n }\n return false;\n });\n }\n },\n\n _removeDuplicateRules: function(rules) {\n if (!rules) { return; }\n\n // remove duplicates\n const ruleCache = {};\n\n let ruleList;\n let rule;\n let i;\n\n for (i = rules.length - 1; i >= 0 ; i--) {\n rule = rules[i];\n if (rule instanceof tree.Declaration) {\n if (!ruleCache[rule.name]) {\n ruleCache[rule.name] = rule;\n } else {\n ruleList = ruleCache[rule.name];\n if (ruleList instanceof tree.Declaration) {\n ruleList = ruleCache[rule.name] = [ruleCache[rule.name].toCSS(this._context)];\n }\n const ruleCSS = rule.toCSS(this._context);\n if (ruleList.indexOf(ruleCSS) !== -1) {\n rules.splice(i, 1);\n } else {\n ruleList.push(ruleCSS);\n }\n }\n }\n }\n },\n\n _mergeRules: function(rules) {\n if (!rules) {\n return; \n }\n\n const groups = {};\n const groupsArr = [];\n\n for (let i = 0; i < rules.length; i++) {\n const rule = rules[i];\n if (rule.merge) {\n const key = rule.name;\n groups[key] ? rules.splice(i--, 1) : \n groupsArr.push(groups[key] = []);\n groups[key].push(rule);\n }\n }\n\n groupsArr.forEach(group => {\n if (group.length > 0) {\n const result = group[0];\n let space = [];\n const comma = [new tree.Expression(space)];\n group.forEach(rule => {\n if ((rule.merge === '+') && (space.length > 0)) {\n comma.push(new tree.Expression(space = []));\n }\n space.push(rule.value);\n result.important = result.important || rule.important;\n });\n result.value = new tree.Value(comma);\n }\n });\n }\n};\n\nexport default ToCSSVisitor;\n","import Visitor from './visitor';\nimport ImportVisitor from './import-visitor';\nimport MarkVisibleSelectorsVisitor from './set-tree-visibility-visitor';\nimport ExtendVisitor from './extend-visitor';\nimport JoinSelectorVisitor from './join-selector-visitor';\nimport ToCSSVisitor from './to-css-visitor';\n\nexport default {\n Visitor,\n ImportVisitor,\n MarkVisibleSelectorsVisitor,\n ExtendVisitor,\n JoinSelectorVisitor,\n ToCSSVisitor\n};\n","import chunker from './chunker';\n\nexport default () => {\n let // Less input string\n input;\n\n let // current chunk\n j;\n\n const // holds state for backtracking\n saveStack = [];\n\n let // furthest index the parser has gone to\n furthest;\n\n let // if this is furthest we got to, this is the probably cause\n furthestPossibleErrorMessage;\n\n let // chunkified input\n chunks;\n\n let // current chunk\n current;\n\n let // index of current chunk, in `input`\n currentPos;\n\n const parserInput = {};\n const CHARCODE_SPACE = 32;\n const CHARCODE_TAB = 9;\n const CHARCODE_LF = 10;\n const CHARCODE_CR = 13;\n const CHARCODE_PLUS = 43;\n const CHARCODE_COMMA = 44;\n const CHARCODE_FORWARD_SLASH = 47;\n const CHARCODE_9 = 57;\n\n function skipWhitespace(length) {\n const oldi = parserInput.i;\n const oldj = j;\n const curr = parserInput.i - currentPos;\n const endIndex = parserInput.i + current.length - curr;\n const mem = (parserInput.i += length);\n const inp = input;\n let c;\n let nextChar;\n let comment;\n\n for (; parserInput.i < endIndex; parserInput.i++) {\n c = inp.charCodeAt(parserInput.i);\n\n if (parserInput.autoCommentAbsorb && c === CHARCODE_FORWARD_SLASH) {\n nextChar = inp.charAt(parserInput.i + 1);\n if (nextChar === '/') {\n comment = {index: parserInput.i, isLineComment: true};\n let nextNewLine = inp.indexOf('\\n', parserInput.i + 2);\n if (nextNewLine < 0) {\n nextNewLine = endIndex;\n }\n parserInput.i = nextNewLine;\n comment.text = inp.substr(comment.index, parserInput.i - comment.index);\n parserInput.commentStore.push(comment);\n continue;\n } else if (nextChar === '*') {\n const nextStarSlash = inp.indexOf('*/', parserInput.i + 2);\n if (nextStarSlash >= 0) {\n comment = {\n index: parserInput.i,\n text: inp.substr(parserInput.i, nextStarSlash + 2 - parserInput.i),\n isLineComment: false\n };\n parserInput.i += comment.text.length - 1;\n parserInput.commentStore.push(comment);\n continue;\n }\n }\n break;\n }\n\n if ((c !== CHARCODE_SPACE) && (c !== CHARCODE_LF) && (c !== CHARCODE_TAB) && (c !== CHARCODE_CR)) {\n break;\n }\n }\n\n current = current.slice(length + parserInput.i - mem + curr);\n currentPos = parserInput.i;\n\n if (!current.length) {\n if (j < chunks.length - 1) {\n current = chunks[++j];\n skipWhitespace(0); // skip space at the beginning of a chunk\n return true; // things changed\n }\n parserInput.finished = true;\n }\n\n return oldi !== parserInput.i || oldj !== j;\n }\n\n parserInput.save = () => {\n currentPos = parserInput.i;\n saveStack.push( { current, i: parserInput.i, j });\n };\n parserInput.restore = possibleErrorMessage => {\n\n if (parserInput.i > furthest || (parserInput.i === furthest && possibleErrorMessage && !furthestPossibleErrorMessage)) {\n furthest = parserInput.i;\n furthestPossibleErrorMessage = possibleErrorMessage;\n }\n const state = saveStack.pop();\n current = state.current;\n currentPos = parserInput.i = state.i;\n j = state.j;\n };\n parserInput.forget = () => {\n saveStack.pop();\n };\n parserInput.isWhitespace = offset => {\n const pos = parserInput.i + (offset || 0);\n const code = input.charCodeAt(pos);\n return (code === CHARCODE_SPACE || code === CHARCODE_CR || code === CHARCODE_TAB || code === CHARCODE_LF);\n };\n\n // Specialization of $(tok)\n parserInput.$re = tok => {\n if (parserInput.i > currentPos) {\n current = current.slice(parserInput.i - currentPos);\n currentPos = parserInput.i;\n }\n\n const m = tok.exec(current);\n if (!m) {\n return null;\n }\n\n skipWhitespace(m[0].length);\n if (typeof m === 'string') {\n return m;\n }\n\n return m.length === 1 ? m[0] : m;\n };\n\n parserInput.$char = tok => {\n if (input.charAt(parserInput.i) !== tok) {\n return null;\n }\n skipWhitespace(1);\n return tok;\n };\n\n parserInput.$str = tok => {\n const tokLength = tok.length;\n\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tokLength; i++) {\n if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n return null;\n }\n }\n\n skipWhitespace(tokLength);\n return tok;\n };\n\n parserInput.$quoted = loc => {\n const pos = loc || parserInput.i;\n const startChar = input.charAt(pos);\n\n if (startChar !== '\\'' && startChar !== '\"') {\n return;\n }\n const length = input.length;\n const currentPosition = pos;\n\n for (let i = 1; i + currentPosition < length; i++) {\n const nextChar = input.charAt(i + currentPosition);\n switch (nextChar) {\n case '\\\\':\n i++;\n continue;\n case '\\r':\n case '\\n':\n break;\n case startChar:\n const str = input.substr(currentPosition, i + 1);\n if (!loc && loc !== 0) {\n skipWhitespace(i + 1);\n return str\n }\n return [startChar, str];\n default:\n }\n }\n return null;\n };\n\n /**\n * Permissive parsing. Ignores everything except matching {} [] () and quotes\n * until matching token (outside of blocks)\n */\n parserInput.$parseUntil = tok => {\n let quote = '';\n let returnVal = null;\n let inComment = false;\n let blockDepth = 0;\n const blockStack = [];\n const parseGroups = [];\n const length = input.length;\n const startPos = parserInput.i;\n let lastPos = parserInput.i;\n let i = parserInput.i;\n let loop = true;\n let testChar;\n\n if (typeof tok === 'string') {\n testChar = char => char === tok\n } else {\n testChar = char => tok.test(char)\n }\n\n do {\n let prevChar;\n let nextChar = input.charAt(i);\n if (blockDepth === 0 && testChar(nextChar)) {\n returnVal = input.substr(lastPos, i - lastPos);\n if (returnVal) {\n parseGroups.push(returnVal);\n }\n else {\n parseGroups.push(' ');\n }\n returnVal = parseGroups;\n skipWhitespace(i - startPos);\n loop = false\n } else {\n if (inComment) {\n if (nextChar === '*' && \n input.charAt(i + 1) === '/') {\n i++;\n blockDepth--;\n inComment = false;\n }\n i++;\n continue;\n }\n switch (nextChar) {\n case '\\\\':\n i++;\n nextChar = input.charAt(i);\n parseGroups.push(input.substr(lastPos, i - lastPos + 1));\n lastPos = i + 1;\n break;\n case '/':\n if (input.charAt(i + 1) === '*') {\n i++;\n inComment = true;\n blockDepth++;\n }\n break;\n case '\\'':\n case '\"':\n quote = parserInput.$quoted(i);\n if (quote) {\n parseGroups.push(input.substr(lastPos, i - lastPos), quote);\n i += quote[1].length - 1;\n lastPos = i + 1;\n }\n else {\n skipWhitespace(i - startPos);\n returnVal = nextChar;\n loop = false;\n }\n break;\n case '{':\n blockStack.push('}');\n blockDepth++;\n break;\n case '(':\n blockStack.push(')');\n blockDepth++;\n break;\n case '[':\n blockStack.push(']');\n blockDepth++;\n break;\n case '}':\n case ')':\n case ']':\n const expected = blockStack.pop();\n if (nextChar === expected) {\n blockDepth--;\n } else {\n // move the parser to the error and return expected\n skipWhitespace(i - startPos);\n returnVal = expected;\n loop = false;\n }\n }\n i++;\n if (i > length) {\n loop = false;\n }\n }\n prevChar = nextChar;\n } while (loop);\n\n return returnVal ? returnVal : null;\n }\n\n parserInput.autoCommentAbsorb = true;\n parserInput.commentStore = [];\n parserInput.finished = false;\n\n // Same as $(), but don't change the state of the parser,\n // just return the match.\n parserInput.peek = tok => {\n if (typeof tok === 'string') {\n // https://jsperf.com/string-startswith/21\n for (let i = 0; i < tok.length; i++) {\n if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n return false;\n }\n }\n return true;\n } else {\n return tok.test(current);\n }\n };\n\n // Specialization of peek()\n // TODO remove or change some currentChar calls to peekChar\n parserInput.peekChar = tok => input.charAt(parserInput.i) === tok;\n\n parserInput.currentChar = () => input.charAt(parserInput.i);\n\n parserInput.prevChar = () => input.charAt(parserInput.i - 1);\n\n parserInput.getInput = () => input;\n\n parserInput.peekNotNumeric = () => {\n const c = input.charCodeAt(parserInput.i);\n // Is the first char of the dimension 0-9, '.', '+' or '-'\n return (c > CHARCODE_9 || c < CHARCODE_PLUS) || c === CHARCODE_FORWARD_SLASH || c === CHARCODE_COMMA;\n };\n\n parserInput.start = (str, chunkInput, failFunction) => {\n input = str;\n parserInput.i = j = currentPos = furthest = 0;\n\n // chunking apparently makes things quicker (but my tests indicate\n // it might actually make things slower in node at least)\n // and it is a non-perfect parse - it can't recognise\n // unquoted urls, meaning it can't distinguish comments\n // meaning comments with quotes or {}() in them get 'counted'\n // and then lead to parse errors.\n // In addition if the chunking chunks in the wrong place we might\n // not be able to parse a parser statement in one go\n // this is officially deprecated but can be switched on via an option\n // in the case it causes too much performance issues.\n if (chunkInput) {\n chunks = chunker(str, failFunction);\n } else {\n chunks = [str];\n }\n\n current = chunks[0];\n\n skipWhitespace(0);\n };\n\n parserInput.end = () => {\n let message;\n const isFinished = parserInput.i >= input.length;\n\n if (parserInput.i < furthest) {\n message = furthestPossibleErrorMessage;\n parserInput.i = furthest;\n }\n return {\n isFinished,\n furthest: parserInput.i,\n furthestPossibleErrorMessage: message,\n furthestReachedEnd: parserInput.i >= input.length - 1,\n furthestChar: input[parserInput.i]\n };\n };\n\n return parserInput;\n};\n","// Split the input into chunks.\nexport default function (input, fail) {\n const len = input.length;\n let level = 0;\n let parenLevel = 0;\n let lastOpening;\n let lastOpeningParen;\n let lastMultiComment;\n let lastMultiCommentEndBrace;\n const chunks = [];\n let emitFrom = 0;\n let chunkerCurrentIndex;\n let currentChunkStartIndex;\n let cc;\n let cc2;\n let matched;\n\n function emitChunk(force) {\n const len = chunkerCurrentIndex - emitFrom;\n if (((len < 512) && !force) || !len) {\n return;\n }\n chunks.push(input.slice(emitFrom, chunkerCurrentIndex + 1));\n emitFrom = chunkerCurrentIndex + 1;\n }\n\n for (chunkerCurrentIndex = 0; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc = input.charCodeAt(chunkerCurrentIndex);\n if (((cc >= 97) && (cc <= 122)) || (cc < 34)) {\n // a-z or whitespace\n continue;\n }\n\n switch (cc) {\n case 40: // (\n parenLevel++;\n lastOpeningParen = chunkerCurrentIndex;\n continue;\n case 41: // )\n if (--parenLevel < 0) {\n return fail('missing opening `(`', chunkerCurrentIndex);\n }\n continue;\n case 59: // ;\n if (!parenLevel) { emitChunk(); }\n continue;\n case 123: // {\n level++;\n lastOpening = chunkerCurrentIndex;\n continue;\n case 125: // }\n if (--level < 0) {\n return fail('missing opening `{`', chunkerCurrentIndex);\n }\n if (!level && !parenLevel) { emitChunk(); }\n continue;\n case 92: // \\\n if (chunkerCurrentIndex < len - 1) { chunkerCurrentIndex++; continue; }\n return fail('unescaped `\\\\`', chunkerCurrentIndex);\n case 34:\n case 39:\n case 96: // \", ' and `\n matched = 0;\n currentChunkStartIndex = chunkerCurrentIndex;\n for (chunkerCurrentIndex = chunkerCurrentIndex + 1; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if (cc2 > 96) { continue; }\n if (cc2 == cc) { matched = 1; break; }\n if (cc2 == 92) { // \\\n if (chunkerCurrentIndex == len - 1) {\n return fail('unescaped `\\\\`', chunkerCurrentIndex);\n }\n chunkerCurrentIndex++;\n }\n }\n if (matched) { continue; }\n return fail(`unmatched \\`${String.fromCharCode(cc)}\\``, currentChunkStartIndex);\n case 47: // /, check for comment\n if (parenLevel || (chunkerCurrentIndex == len - 1)) { continue; }\n cc2 = input.charCodeAt(chunkerCurrentIndex + 1);\n if (cc2 == 47) {\n // //, find lnfeed\n for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if ((cc2 <= 13) && ((cc2 == 10) || (cc2 == 13))) { break; }\n }\n } else if (cc2 == 42) {\n // /*, find */\n lastMultiComment = currentChunkStartIndex = chunkerCurrentIndex;\n for (chunkerCurrentIndex = chunkerCurrentIndex + 2; chunkerCurrentIndex < len - 1; chunkerCurrentIndex++) {\n cc2 = input.charCodeAt(chunkerCurrentIndex);\n if (cc2 == 125) { lastMultiCommentEndBrace = chunkerCurrentIndex; }\n if (cc2 != 42) { continue; }\n if (input.charCodeAt(chunkerCurrentIndex + 1) == 47) { break; }\n }\n if (chunkerCurrentIndex == len - 1) {\n return fail('missing closing `*/`', currentChunkStartIndex);\n }\n chunkerCurrentIndex++;\n }\n continue;\n case 42: // *, check for unmatched */\n if ((chunkerCurrentIndex < len - 1) && (input.charCodeAt(chunkerCurrentIndex + 1) == 47)) {\n return fail('unmatched `/*`', chunkerCurrentIndex);\n }\n continue;\n }\n }\n\n if (level !== 0) {\n if ((lastMultiComment > lastOpening) && (lastMultiCommentEndBrace > lastMultiComment)) {\n return fail('missing closing `}` or `*/`', lastOpening);\n } else {\n return fail('missing closing `}`', lastOpening);\n }\n } else if (parenLevel !== 0) {\n return fail('missing closing `)`', lastOpeningParen);\n }\n\n emitChunk(true);\n return chunks;\n};\n","import LessError from '../less-error';\nimport tree from '../tree';\nimport visitors from '../visitors';\nimport getParserInput from './parser-input';\nimport * as utils from '../utils';\nimport functionRegistry from '../functions/function-registry';\n\n//\n// less.js - parser\n//\n// A relatively straight-forward predictive parser.\n// There is no tokenization/lexing stage, the input is parsed\n// in one sweep.\n//\n// To make the parser fast enough to run in the browser, several\n// optimization had to be made:\n//\n// - Matching and slicing on a huge input is often cause of slowdowns.\n// The solution is to chunkify the input into smaller strings.\n// The chunks are stored in the `chunks` var,\n// `j` holds the current chunk index, and `currentPos` holds\n// the index of the current chunk in relation to `input`.\n// This gives us an almost 4x speed-up.\n//\n// - In many cases, we don't need to match individual tokens;\n// for example, if a value doesn't hold any variables, operations\n// or dynamic references, the parser can effectively 'skip' it,\n// treating it as a literal.\n// An example would be '1px solid #000' - which evaluates to itself,\n// we don't need to know what the individual components are.\n// The drawback, of course is that you don't get the benefits of\n// syntax-checking on the CSS. This gives us a 50% speed-up in the parser,\n// and a smaller speed-up in the code-gen.\n//\n//\n// Token matching is done with the `$` function, which either takes\n// a terminal string or regexp, or a non-terminal function to call.\n// It also takes care of moving all the indices forwards.\n//\n\nconst Parser = function Parser(context, imports, fileInfo) {\n let parsers;\n const parserInput = getParserInput();\n\n function error(msg, type) {\n throw new LessError(\n {\n index: parserInput.i,\n filename: fileInfo.filename,\n type: type || 'Syntax',\n message: msg\n },\n imports\n );\n }\n\n function expect(arg, msg) {\n // some older browsers return typeof 'function' for RegExp\n const result = (arg instanceof Function) ? arg.call(parsers) : parserInput.$re(arg);\n if (result) {\n return result;\n }\n \n error(msg || (typeof arg === 'string'\n ? `expected '${arg}' got '${parserInput.currentChar()}'`\n : 'unexpected token'));\n }\n\n // Specialization of expect()\n function expectChar(arg, msg) {\n if (parserInput.$char(arg)) {\n return arg;\n }\n error(msg || `expected '${arg}' got '${parserInput.currentChar()}'`);\n }\n\n function getDebugInfo(index) {\n const filename = fileInfo.filename;\n\n return {\n lineNumber: utils.getLocation(index, parserInput.getInput()).line + 1,\n fileName: filename\n };\n }\n\n /**\n * Used after initial parsing to create nodes on the fly\n * \n * @param {String} str - string to parse \n * @param {Array} parseList - array of parsers to run input through e.g. [\"value\", \"important\"]\n * @param {Number} currentIndex - start number to begin indexing\n * @param {Object} fileInfo - fileInfo to attach to created nodes\n */\n function parseNode(str, parseList, currentIndex, fileInfo, callback) {\n let result;\n const returnNodes = [];\n const parser = parserInput;\n\n try {\n parser.start(str, false, function fail(msg, index) {\n callback({\n message: msg,\n index: index + currentIndex\n });\n });\n for (let x = 0, p, i; (p = parseList[x]); x++) {\n i = parser.i;\n result = parsers[p]();\n if (result) {\n try {\n result._index = i + currentIndex;\n result._fileInfo = fileInfo;\n } catch (e) {}\n returnNodes.push(result);\n }\n else {\n returnNodes.push(null);\n }\n }\n\n const endInfo = parser.end();\n if (endInfo.isFinished) {\n callback(null, returnNodes);\n }\n else {\n callback(true, null);\n }\n } catch (e) {\n throw new LessError({\n index: e.index + currentIndex,\n message: e.message\n }, imports, fileInfo.filename);\n }\n }\n\n //\n // The Parser\n //\n return {\n parserInput,\n imports,\n fileInfo,\n parseNode,\n //\n // Parse an input string into an abstract syntax tree,\n // @param str A string containing 'less' markup\n // @param callback call `callback` when done.\n // @param [additionalData] An optional map which can contains vars - a map (key, value) of variables to apply\n //\n parse: function (str, callback, additionalData) {\n let root;\n let error = null;\n let globalVars;\n let modifyVars;\n let ignored;\n let preText = '';\n\n globalVars = (additionalData && additionalData.globalVars) ? `${Parser.serializeVars(additionalData.globalVars)}\\n` : '';\n modifyVars = (additionalData && additionalData.modifyVars) ? `\\n${Parser.serializeVars(additionalData.modifyVars)}` : '';\n\n if (context.pluginManager) {\n const preProcessors = context.pluginManager.getPreProcessors();\n for (let i = 0; i < preProcessors.length; i++) {\n str = preProcessors[i].process(str, { context, imports, fileInfo });\n }\n }\n\n if (globalVars || (additionalData && additionalData.banner)) {\n preText = ((additionalData && additionalData.banner) ? additionalData.banner : '') + globalVars;\n ignored = imports.contentsIgnoredChars;\n ignored[fileInfo.filename] = ignored[fileInfo.filename] || 0;\n ignored[fileInfo.filename] += preText.length;\n }\n\n str = str.replace(/\\r\\n?/g, '\\n');\n // Remove potential UTF Byte Order Mark\n str = preText + str.replace(/^\\uFEFF/, '') + modifyVars;\n imports.contents[fileInfo.filename] = str;\n\n // Start with the primary rule.\n // The whole syntax tree is held under a Ruleset node,\n // with the `root` property set to true, so no `{}` are\n // output. The callback is called when the input is parsed.\n try {\n parserInput.start(str, context.chunkInput, function fail(msg, index) {\n throw new LessError({\n index,\n type: 'Parse',\n message: msg,\n filename: fileInfo.filename\n }, imports);\n });\n\n tree.Node.prototype.parse = this;\n root = new tree.Ruleset(null, this.parsers.primary());\n tree.Node.prototype.rootNode = root;\n root.root = true;\n root.firstRoot = true;\n root.functionRegistry = functionRegistry.inherit();\n \n } catch (e) {\n return callback(new LessError(e, imports, fileInfo.filename));\n }\n\n // If `i` is smaller than the `input.length - 1`,\n // it means the parser wasn't able to parse the whole\n // string, so we've got a parsing error.\n //\n // We try to extract a \\n delimited string,\n // showing the line where the parse error occurred.\n // We split it up into two parts (the part which parsed,\n // and the part which didn't), so we can color them differently.\n const endInfo = parserInput.end();\n if (!endInfo.isFinished) {\n\n let message = endInfo.furthestPossibleErrorMessage;\n\n if (!message) {\n message = 'Unrecognised input';\n if (endInfo.furthestChar === '}') {\n message += '. Possibly missing opening \\'{\\'';\n } else if (endInfo.furthestChar === ')') {\n message += '. Possibly missing opening \\'(\\'';\n } else if (endInfo.furthestReachedEnd) {\n message += '. Possibly missing something';\n }\n }\n\n error = new LessError({\n type: 'Parse',\n message,\n index: endInfo.furthest,\n filename: fileInfo.filename\n }, imports);\n }\n\n const finish = e => {\n e = error || e || imports.error;\n\n if (e) {\n if (!(e instanceof LessError)) {\n e = new LessError(e, imports, fileInfo.filename);\n }\n\n return callback(e);\n }\n else {\n return callback(null, root);\n }\n };\n\n if (context.processImports !== false) {\n new visitors.ImportVisitor(imports, finish)\n .run(root);\n } else {\n return finish();\n }\n },\n\n //\n // Here in, the parsing rules/functions\n //\n // The basic structure of the syntax tree generated is as follows:\n //\n // Ruleset -> Declaration -> Value -> Expression -> Entity\n //\n // Here's some Less code:\n //\n // .class {\n // color: #fff;\n // border: 1px solid #000;\n // width: @w + 4px;\n // > .child {...}\n // }\n //\n // And here's what the parse tree might look like:\n //\n // Ruleset (Selector '.class', [\n // Declaration (\"color\", Value ([Expression [Color #fff]]))\n // Declaration (\"border\", Value ([Expression [Dimension 1px][Keyword \"solid\"][Color #000]]))\n // Declaration (\"width\", Value ([Expression [Operation \" + \" [Variable \"@w\"][Dimension 4px]]]))\n // Ruleset (Selector [Element '>', '.child'], [...])\n // ])\n //\n // In general, most rules will try to parse a token with the `$re()` function, and if the return\n // value is truly, will return a new node, of the relevant type. Sometimes, we need to check\n // first, before parsing, that's when we use `peek()`.\n //\n parsers: parsers = {\n //\n // The `primary` rule is the *entry* and *exit* point of the parser.\n // The rules here can appear at any level of the parse tree.\n //\n // The recursive nature of the grammar is an interplay between the `block`\n // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule,\n // as represented by this simplified grammar:\n //\n // primary → (ruleset | declaration)+\n // ruleset → selector+ block\n // block → '{' primary '}'\n //\n // Only at one point is the primary rule not called from the\n // block rule: at the root level.\n //\n primary: function () {\n const mixin = this.mixin;\n let root = [];\n let node;\n\n while (true) {\n while (true) {\n node = this.comment();\n if (!node) { break; }\n root.push(node);\n }\n // always process comments before deciding if finished\n if (parserInput.finished) {\n break;\n }\n if (parserInput.peek('}')) {\n break;\n }\n\n node = this.extendRule();\n if (node) {\n root = root.concat(node);\n continue;\n }\n\n node = mixin.definition() || this.declaration() || mixin.call(false, false) || \n this.ruleset() || this.variableCall() || this.entities.call() || this.atrule();\n if (node) {\n root.push(node);\n } else {\n let foundSemiColon = false;\n while (parserInput.$char(';')) {\n foundSemiColon = true;\n }\n if (!foundSemiColon) {\n break;\n }\n }\n }\n\n return root;\n },\n\n // comments are collected by the main parsing mechanism and then assigned to nodes\n // where the current structure allows it\n comment: function () {\n if (parserInput.commentStore.length) {\n const comment = parserInput.commentStore.shift();\n return new(tree.Comment)(comment.text, comment.isLineComment, comment.index, fileInfo);\n }\n },\n\n //\n // Entities are tokens which can be found inside an Expression\n //\n entities: {\n mixinLookup: function() {\n return parsers.mixin.call(true, true);\n },\n //\n // A string, which supports escaping \" and '\n //\n // \"milky way\" 'he\\'s the one!'\n //\n quoted: function (forceEscaped) {\n let str;\n const index = parserInput.i;\n let isEscaped = false;\n\n parserInput.save();\n if (parserInput.$char('~')) {\n isEscaped = true;\n } else if (forceEscaped) {\n parserInput.restore();\n return;\n }\n\n str = parserInput.$quoted();\n if (!str) {\n parserInput.restore();\n return;\n }\n parserInput.forget();\n\n return new(tree.Quoted)(str.charAt(0), str.substr(1, str.length - 2), isEscaped, index, fileInfo);\n },\n\n //\n // A catch-all word, such as:\n //\n // black border-collapse\n //\n keyword: function () {\n const k = parserInput.$char('%') || parserInput.$re(/^\\[?(?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+\\]?/);\n if (k) {\n return tree.Color.fromKeyword(k) || new(tree.Keyword)(k);\n }\n },\n\n //\n // A function call\n //\n // rgb(255, 0, 255)\n //\n // The arguments are parsed with the `entities.arguments` parser.\n //\n call: function () {\n let name;\n let args;\n let func;\n const index = parserInput.i;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (parserInput.peek(/^url\\(/i)) {\n return;\n }\n\n parserInput.save();\n\n name = parserInput.$re(/^([\\w-]+|%|~|progid:[\\w\\.]+)\\(/);\n if (!name) {\n parserInput.forget(); \n return;\n }\n\n name = name[1];\n func = this.customFuncCall(name);\n if (func) {\n args = func.parse();\n if (args && func.stop) {\n parserInput.forget();\n return args;\n }\n }\n\n args = this.arguments(args);\n\n if (!parserInput.$char(')')) {\n parserInput.restore('Could not parse call arguments or missing \\')\\'');\n return;\n }\n\n parserInput.forget();\n\n return new(tree.Call)(name, args, index, fileInfo);\n },\n \n //\n // Parsing rules for functions with non-standard args, e.g.:\n //\n // boolean(not(2 > 1))\n //\n // This is a quick prototype, to be modified/improved when\n // more custom-parsed funcs come (e.g. `selector(...)`)\n //\n\n customFuncCall: function (name) {\n /* Ideally the table is to be moved out of here for faster perf.,\n but it's quite tricky since it relies on all these `parsers`\n and `expect` available only here */\n return {\n alpha: f(parsers.ieAlpha, true),\n boolean: f(condition),\n 'if': f(condition)\n }[name.toLowerCase()];\n\n function f(parse, stop) {\n return {\n parse, // parsing function\n stop // when true - stop after parse() and return its result, \n // otherwise continue for plain args\n };\n }\n \n function condition() {\n return [expect(parsers.condition, 'expected condition')];\n }\n },\n\n arguments: function (prevArgs) {\n let argsComma = prevArgs || [];\n const argsSemiColon = [];\n let isSemiColonSeparated;\n let value;\n\n parserInput.save();\n\n while (true) {\n if (prevArgs) {\n prevArgs = false;\n } else {\n value = parsers.detachedRuleset() || this.assignment() || parsers.expression();\n if (!value) {\n break;\n }\n\n if (value.value && value.value.length == 1) {\n value = value.value[0];\n }\n\n argsComma.push(value);\n }\n\n if (parserInput.$char(',')) {\n continue;\n }\n\n if (parserInput.$char(';') || isSemiColonSeparated) {\n isSemiColonSeparated = true;\n value = (argsComma.length < 1) ? argsComma[0]\n : new tree.Value(argsComma);\n argsSemiColon.push(value);\n argsComma = [];\n }\n }\n\n parserInput.forget();\n return isSemiColonSeparated ? argsSemiColon : argsComma;\n },\n literal: function () {\n return this.dimension() ||\n this.color() ||\n this.quoted() ||\n this.unicodeDescriptor();\n },\n\n // Assignments are argument entities for calls.\n // They are present in ie filter properties as shown below.\n //\n // filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* )\n //\n\n assignment: function () {\n let key;\n let value;\n parserInput.save();\n key = parserInput.$re(/^\\w+(?=\\s?=)/i);\n if (!key) {\n parserInput.restore();\n return;\n }\n if (!parserInput.$char('=')) {\n parserInput.restore();\n return;\n }\n value = parsers.entity();\n if (value) {\n parserInput.forget();\n return new(tree.Assignment)(key, value);\n } else {\n parserInput.restore();\n }\n },\n\n //\n // Parse url() tokens\n //\n // We use a specific rule for urls, because they don't really behave like\n // standard function calls. The difference is that the argument doesn't have\n // to be enclosed within a string, so it can't be parsed as an Expression.\n //\n url: function () {\n let value;\n const index = parserInput.i;\n\n parserInput.autoCommentAbsorb = false;\n\n if (!parserInput.$str('url(')) {\n parserInput.autoCommentAbsorb = true;\n return;\n }\n\n value = this.quoted() || this.variable() || this.property() ||\n parserInput.$re(/^(?:(?:\\\\[\\(\\)'\"])|[^\\(\\)'\"])+/) || '';\n\n parserInput.autoCommentAbsorb = true;\n\n expectChar(')');\n\n return new(tree.URL)((value.value != null || \n value instanceof tree.Variable || \n value instanceof tree.Property) ?\n value : new(tree.Anonymous)(value, index), index, fileInfo);\n },\n\n //\n // A Variable entity, such as `@fink`, in\n //\n // width: @fink + 2px\n //\n // We use a different parser for variable definitions,\n // see `parsers.variable`.\n //\n variable: function () {\n let ch;\n let name;\n const index = parserInput.i;\n\n parserInput.save();\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^@@?[\\w-]+/))) {\n ch = parserInput.currentChar();\n if (ch === '(' || ch === '[' && !parserInput.prevChar().match(/^\\s/)) {\n // this may be a VariableCall lookup\n const result = parsers.variableCall(name);\n if (result) {\n parserInput.forget();\n return result;\n }\n }\n parserInput.forget();\n return new(tree.Variable)(name, index, fileInfo);\n }\n parserInput.restore();\n },\n\n // A variable entity using the protective {} e.g. @{var}\n variableCurly: function () {\n let curly;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '@' && (curly = parserInput.$re(/^@\\{([\\w-]+)\\}/))) {\n return new(tree.Variable)(`@${curly[1]}`, index, fileInfo);\n }\n },\n //\n // A Property accessor, such as `$color`, in\n //\n // background-color: $color\n //\n property: function () {\n let name;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' && (name = parserInput.$re(/^\\$[\\w-]+/))) {\n return new(tree.Property)(name, index, fileInfo);\n }\n },\n\n // A property entity useing the protective {} e.g. ${prop}\n propertyCurly: function () {\n let curly;\n const index = parserInput.i;\n\n if (parserInput.currentChar() === '$' && (curly = parserInput.$re(/^\\$\\{([\\w-]+)\\}/))) {\n return new(tree.Property)(`$${curly[1]}`, index, fileInfo);\n }\n },\n //\n // A Hexadecimal color\n //\n // #4F3C2F\n //\n // `rgb` and `hsl` colors are parsed through the `entities.call` parser.\n //\n color: function () {\n let rgb;\n parserInput.save();\n\n if (parserInput.currentChar() === '#' && (rgb = parserInput.$re(/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})([\\w.#\\[])?/))) {\n if (!rgb[2]) {\n parserInput.forget();\n return new(tree.Color)(rgb[1], undefined, rgb[0]);\n } \n }\n parserInput.restore();\n },\n\n colorKeyword: function () {\n parserInput.save();\n const autoCommentAbsorb = parserInput.autoCommentAbsorb;\n parserInput.autoCommentAbsorb = false;\n const k = parserInput.$re(/^[_A-Za-z-][_A-Za-z0-9-]+/);\n parserInput.autoCommentAbsorb = autoCommentAbsorb;\n if (!k) {\n parserInput.forget();\n return;\n }\n parserInput.restore();\n const color = tree.Color.fromKeyword(k);\n if (color) {\n parserInput.$str(k);\n return color;\n }\n },\n\n //\n // A Dimension, that is, a number and a unit\n //\n // 0.5em 95%\n //\n dimension: function () {\n if (parserInput.peekNotNumeric()) {\n return;\n }\n\n const value = parserInput.$re(/^([+-]?\\d*\\.?\\d+)(%|[a-z_]+)?/i);\n if (value) {\n return new(tree.Dimension)(value[1], value[2]);\n }\n },\n\n //\n // A unicode descriptor, as is used in unicode-range\n //\n // U+0?? or U+00A1-00A9\n //\n unicodeDescriptor: function () {\n let ud;\n\n ud = parserInput.$re(/^U\\+[0-9a-fA-F?]+(\\-[0-9a-fA-F?]+)?/);\n if (ud) {\n return new(tree.UnicodeDescriptor)(ud[0]);\n }\n },\n\n //\n // JavaScript code to be evaluated\n //\n // `window.location.href`\n //\n javascript: function () {\n let js;\n const index = parserInput.i;\n\n parserInput.save();\n\n const escape = parserInput.$char('~');\n const jsQuote = parserInput.$char('`');\n\n if (!jsQuote) {\n parserInput.restore();\n return;\n }\n\n js = parserInput.$re(/^[^`]*`/);\n if (js) {\n parserInput.forget();\n return new(tree.JavaScript)(js.substr(0, js.length - 1), Boolean(escape), index, fileInfo);\n }\n parserInput.restore('invalid javascript definition');\n }\n },\n\n //\n // The variable part of a variable definition. Used in the `rule` parser\n //\n // @fink:\n //\n variable: function () {\n let name;\n\n if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^(@[\\w-]+)\\s*:/))) { return name[1]; }\n },\n\n //\n // Call a variable value to retrieve a detached ruleset\n // or a value from a detached ruleset's rules.\n //\n // @fink();\n // @fink;\n // color: @fink[@color];\n //\n variableCall: function (parsedName) {\n let lookups;\n const i = parserInput.i;\n const inValue = !!parsedName;\n let name = parsedName;\n\n parserInput.save();\n\n if (name || (parserInput.currentChar() === '@'\n && (name = parserInput.$re(/^(@[\\w-]+)(\\(\\s*\\))?/)))) {\n\n lookups = this.mixin.ruleLookups();\n\n if (!lookups && ((inValue && parserInput.$str('()') !== '()') || (name[2] !== '()'))) {\n parserInput.restore('Missing \\'[...]\\' lookup in variable call');\n return;\n }\n\n if (!inValue) {\n name = name[1];\n }\n\n const call = new tree.VariableCall(name, i, fileInfo);\n if (!inValue && parsers.end()) {\n parserInput.forget();\n return call;\n }\n else {\n parserInput.forget();\n return new tree.NamespaceValue(call, lookups, i, fileInfo);\n }\n }\n\n parserInput.restore();\n },\n\n //\n // extend syntax - used to extend selectors\n //\n extend: function(isRule) {\n let elements;\n let e;\n const index = parserInput.i;\n let option;\n let extendList;\n let extend;\n\n if (!parserInput.$str(isRule ? '&:extend(' : ':extend(')) {\n return;\n }\n\n do {\n option = null;\n elements = null;\n while (!(option = parserInput.$re(/^(all)(?=\\s*(\\)|,))/))) {\n e = this.element();\n if (!e) {\n break;\n }\n if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n }\n\n option = option && option[1];\n if (!elements) {\n error('Missing target selector for :extend().');\n }\n extend = new(tree.Extend)(new(tree.Selector)(elements), option, index, fileInfo);\n if (extendList) {\n extendList.push(extend);\n } else {\n extendList = [ extend ];\n }\n } while (parserInput.$char(','));\n\n expect(/^\\)/);\n\n if (isRule) {\n expect(/^;/);\n }\n\n return extendList;\n },\n\n //\n // extendRule - used in a rule to extend all the parent selectors\n //\n extendRule: function() {\n return this.extend(true);\n },\n\n //\n // Mixins\n //\n mixin: {\n //\n // A Mixin call, with an optional argument list\n //\n // #mixins > .square(#fff);\n // #mixins.square(#fff);\n // .rounded(4px, black);\n // .button;\n //\n // We can lookup / return a value using the lookup syntax:\n //\n // color: #mixin.square(#fff)[@color];\n //\n // The `while` loop is there because mixins can be\n // namespaced, but we only support the child and descendant\n // selector for now.\n //\n call: function (inValue, getLookup) {\n const s = parserInput.currentChar();\n let important = false;\n let lookups;\n const index = parserInput.i;\n let elements;\n let args;\n let hasParens;\n\n if (s !== '.' && s !== '#') { return; }\n\n parserInput.save(); // stop us absorbing part of an invalid selector\n\n elements = this.elements();\n\n if (elements) {\n if (parserInput.$char('(')) {\n args = this.args(true).args;\n expectChar(')');\n hasParens = true;\n }\n\n if (getLookup !== false) {\n lookups = this.ruleLookups();\n }\n if (getLookup === true && !lookups) {\n parserInput.restore();\n return;\n }\n\n if (!lookups && !hasParens) {\n // This isn't a valid mixin call\n parserInput.restore('Unrecognized input. Possibly missing \\'(\\' in mixin call.');\n return;\n }\n\n if (!inValue && parsers.important()) {\n important = true;\n }\n\n if (inValue || parsers.end()) {\n parserInput.forget();\n const mixin = new(tree.mixin.Call)(elements, args, index, fileInfo, !lookups && important);\n if (lookups) {\n return new tree.NamespaceValue(mixin, lookups);\n }\n else {\n return mixin;\n }\n }\n }\n\n parserInput.restore();\n },\n /**\n * Matching elements for mixins\n * (Start with . or # and can have > )\n */\n elements: function() {\n let elements;\n let e;\n let c;\n let elem;\n let elemIndex;\n const re = /^[#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/;\n while (true) {\n elemIndex = parserInput.i;\n e = parserInput.$re(re);\n \n if (!e) {\n break;\n }\n elem = new(tree.Element)(c, e, false, elemIndex, fileInfo);\n if (elements) {\n elements.push(elem);\n } else {\n elements = [ elem ];\n }\n c = parserInput.$char('>');\n }\n return elements;\n },\n args: function (isCall) {\n const entities = parsers.entities;\n const returner = { args:null, variadic: false };\n let expressions = [];\n const argsSemiColon = [];\n const argsComma = [];\n let isSemiColonSeparated;\n let expressionContainsNamed;\n let name;\n let nameLoop;\n let value;\n let arg;\n let expand;\n let hasSep = true;\n\n parserInput.save();\n\n while (true) {\n if (isCall) {\n arg = parsers.detachedRuleset() || parsers.expression();\n } else {\n parserInput.commentStore.length = 0;\n if (parserInput.$str('...')) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ variadic: true });\n break;\n }\n arg = entities.variable() || entities.property() || entities.literal() || entities.keyword() || this.call(true);\n }\n\n if (!arg || !hasSep) {\n break;\n }\n\n nameLoop = null;\n if (arg.throwAwayComments) {\n arg.throwAwayComments();\n }\n value = arg;\n let val = null;\n\n if (isCall) {\n // Variable\n if (arg.value && arg.value.length == 1) {\n val = arg.value[0];\n }\n } else {\n val = arg;\n }\n\n if (val && (val instanceof tree.Variable || val instanceof tree.Property)) {\n if (parserInput.$char(':')) {\n if (expressions.length > 0) {\n if (isSemiColonSeparated) {\n error('Cannot mix ; and , as delimiter types');\n }\n expressionContainsNamed = true;\n }\n\n value = parsers.detachedRuleset() || parsers.expression();\n\n if (!value) {\n if (isCall) {\n error('could not understand value for named argument');\n } else {\n parserInput.restore();\n returner.args = [];\n return returner;\n }\n }\n nameLoop = (name = val.name);\n } else if (parserInput.$str('...')) {\n if (!isCall) {\n returner.variadic = true;\n if (parserInput.$char(';') && !isSemiColonSeparated) {\n isSemiColonSeparated = true;\n }\n (isSemiColonSeparated ? argsSemiColon : argsComma)\n .push({ name: arg.name, variadic: true });\n break;\n } else {\n expand = true;\n }\n } else if (!isCall) {\n name = nameLoop = val.name;\n value = null;\n }\n }\n\n if (value) {\n expressions.push(value);\n }\n\n argsComma.push({ name:nameLoop, value, expand });\n\n if (parserInput.$char(',')) {\n hasSep = true;\n continue;\n }\n hasSep = parserInput.$char(';') === ';';\n\n if (hasSep || isSemiColonSeparated) {\n\n if (expressionContainsNamed) {\n error('Cannot mix ; and , as delimiter types');\n }\n\n isSemiColonSeparated = true;\n\n if (expressions.length > 1) {\n value = new(tree.Value)(expressions);\n }\n argsSemiColon.push({ name, value, expand });\n\n name = null;\n expressions = [];\n expressionContainsNamed = false;\n }\n }\n\n parserInput.forget();\n returner.args = isSemiColonSeparated ? argsSemiColon : argsComma;\n return returner;\n },\n //\n // A Mixin definition, with a list of parameters\n //\n // .rounded (@radius: 2px, @color) {\n // ...\n // }\n //\n // Until we have a finer grained state-machine, we have to\n // do a look-ahead, to make sure we don't have a mixin call.\n // See the `rule` function for more information.\n //\n // We start by matching `.rounded (`, and then proceed on to\n // the argument list, which has optional default values.\n // We store the parameters in `params`, with a `value` key,\n // if there is a value, such as in the case of `@radius`.\n //\n // Once we've got our params list, and a closing `)`, we parse\n // the `{...}` block.\n //\n definition: function () {\n let name;\n let params = [];\n let match;\n let ruleset;\n let cond;\n let variadic = false;\n if ((parserInput.currentChar() !== '.' && parserInput.currentChar() !== '#') ||\n parserInput.peek(/^[^{]*\\}/)) {\n return;\n }\n\n parserInput.save();\n\n match = parserInput.$re(/^([#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\\s*\\(/);\n if (match) {\n name = match[1];\n\n const argInfo = this.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n\n // .mixincall(\"@{a}\");\n // looks a bit like a mixin definition..\n // also\n // .mixincall(@a: {rule: set;});\n // so we have to be nice and restore\n if (!parserInput.$char(')')) {\n parserInput.restore('Missing closing \\')\\'');\n return;\n }\n\n parserInput.commentStore.length = 0;\n\n if (parserInput.$str('when')) { // Guard\n cond = expect(parsers.conditions, 'expected condition');\n }\n\n ruleset = parsers.block();\n\n if (ruleset) {\n parserInput.forget();\n return new(tree.mixin.Definition)(name, params, ruleset, cond, variadic);\n } else {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n }\n },\n \n ruleLookups: function() {\n let rule;\n let args;\n const lookups = [];\n\n if (parserInput.currentChar() !== '[') { \n return;\n }\n\n while (true) {\n parserInput.save();\n args = null;\n rule = this.lookupValue();\n if (!rule && rule !== '') {\n parserInput.restore();\n break;\n }\n lookups.push(rule);\n parserInput.forget();\n }\n if (lookups.length > 0) {\n return lookups;\n }\n },\n \n lookupValue: function() {\n parserInput.save();\n \n if (!parserInput.$char('[')) { \n parserInput.restore();\n return;\n }\n \n const name = parserInput.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);\n \n if (!parserInput.$char(']')) {\n parserInput.restore();\n return;\n } \n\n if (name || name === '') {\n parserInput.forget();\n return name;\n }\n \n parserInput.restore();\n }\n },\n //\n // Entities are the smallest recognized token,\n // and can be found inside a rule's value.\n //\n entity: function () {\n const entities = this.entities;\n\n return this.comment() || entities.literal() || entities.variable() || entities.url() ||\n entities.property() || entities.call() || entities.keyword() || this.mixin.call(true) ||\n entities.javascript();\n },\n\n //\n // A Declaration terminator. Note that we use `peek()` to check for '}',\n // because the `block` rule will be expecting it, but we still need to make sure\n // it's there, if ';' was omitted.\n //\n end: function () {\n return parserInput.$char(';') || parserInput.peek('}');\n },\n\n //\n // IE's alpha function\n //\n // alpha(opacity=88)\n //\n ieAlpha: function () {\n let value;\n\n // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n if (!parserInput.$re(/^opacity=/i)) { return; }\n value = parserInput.$re(/^\\d+/);\n if (!value) {\n value = expect(parsers.entities.variable, 'Could not parse alpha');\n value = `@{${value.name.slice(1)}}`;\n }\n expectChar(')');\n return new tree.Quoted('', `alpha(opacity=${value})`);\n },\n\n //\n // A Selector Element\n //\n // div\n // + h1\n // #socks\n // input[type=\"text\"]\n //\n // Elements are the building blocks for Selectors,\n // they are made out of a `Combinator` (see combinator rule),\n // and an element name, such as a tag a class, or `*`.\n //\n element: function () {\n let e;\n let c;\n let v;\n const index = parserInput.i;\n\n c = this.combinator();\n\n e = parserInput.$re(/^(?:\\d+\\.\\d+|\\d+)%/) ||\n parserInput.$re(/^(?:[.#]?|:*)(?:[\\w-]|[^\\x00-\\x9f]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/) ||\n parserInput.$char('*') || parserInput.$char('&') || this.attribute() ||\n parserInput.$re(/^\\([^&()@]+\\)/) || parserInput.$re(/^[\\.#:](?=@)/) ||\n this.entities.variableCurly();\n\n if (!e) {\n parserInput.save();\n if (parserInput.$char('(')) {\n if ((v = this.selector(false)) && parserInput.$char(')')) {\n e = new(tree.Paren)(v);\n parserInput.forget();\n } else {\n parserInput.restore('Missing closing \\')\\'');\n }\n } else {\n parserInput.forget();\n }\n }\n\n if (e) { return new(tree.Element)(c, e, e instanceof tree.Variable, index, fileInfo); }\n },\n\n //\n // Combinators combine elements together, in a Selector.\n //\n // Because our parser isn't white-space sensitive, special care\n // has to be taken, when parsing the descendant combinator, ` `,\n // as it's an empty space. We have to check the previous character\n // in the input, to see if it's a ` ` character. More info on how\n // we deal with this in *combinator.js*.\n //\n combinator: function () {\n let c = parserInput.currentChar();\n\n if (c === '/') {\n parserInput.save();\n const slashedCombinator = parserInput.$re(/^\\/[a-z]+\\//i);\n if (slashedCombinator) {\n parserInput.forget();\n return new(tree.Combinator)(slashedCombinator);\n }\n parserInput.restore();\n }\n\n if (c === '>' || c === '+' || c === '~' || c === '|' || c === '^') {\n parserInput.i++;\n if (c === '^' && parserInput.currentChar() === '^') {\n c = '^^';\n parserInput.i++;\n }\n while (parserInput.isWhitespace()) { parserInput.i++; }\n return new(tree.Combinator)(c);\n } else if (parserInput.isWhitespace(-1)) {\n return new(tree.Combinator)(' ');\n } else {\n return new(tree.Combinator)(null);\n }\n },\n //\n // A CSS Selector\n // with less extensions e.g. the ability to extend and guard\n //\n // .class > div + h1\n // li a:hover\n //\n // Selectors are made out of one or more Elements, see above.\n //\n selector: function (isLess) {\n const index = parserInput.i;\n let elements;\n let extendList;\n let c;\n let e;\n let allExtends;\n let when;\n let condition;\n isLess = isLess !== false;\n while ((isLess && (extendList = this.extend())) || (isLess && (when = parserInput.$str('when'))) || (e = this.element())) {\n if (when) {\n condition = expect(this.conditions, 'expected condition');\n } else if (condition) {\n error('CSS guard can only be used at the end of selector');\n } else if (extendList) {\n if (allExtends) {\n allExtends = allExtends.concat(extendList);\n } else {\n allExtends = extendList;\n }\n } else {\n if (allExtends) { error('Extend can only be used at the end of selector'); }\n c = parserInput.currentChar();\n if (elements) {\n elements.push(e);\n } else {\n elements = [ e ];\n }\n e = null;\n }\n if (c === '{' || c === '}' || c === ';' || c === ',' || c === ')') {\n break;\n }\n }\n\n if (elements) { return new(tree.Selector)(elements, allExtends, condition, index, fileInfo); }\n if (allExtends) { error('Extend must be used to extend a selector, it cannot be used on its own'); }\n },\n selectors: function () {\n let s;\n let selectors;\n while (true) {\n s = this.selector();\n if (!s) {\n break;\n }\n if (selectors) {\n selectors.push(s);\n } else {\n selectors = [ s ];\n }\n parserInput.commentStore.length = 0;\n if (s.condition && selectors.length > 1) {\n error(\"Guards are only currently allowed on a single selector.\");\n }\n if (!parserInput.$char(',')) { break; }\n if (s.condition) {\n error(\"Guards are only currently allowed on a single selector.\");\n }\n parserInput.commentStore.length = 0;\n }\n return selectors;\n },\n attribute: function () {\n if (!parserInput.$char('[')) { return; }\n\n const entities = this.entities;\n let key;\n let val;\n let op;\n\n if (!(key = entities.variableCurly())) {\n key = expect(/^(?:[_A-Za-z0-9-\\*]*\\|)?(?:[_A-Za-z0-9-]|\\\\.)+/);\n }\n\n op = parserInput.$re(/^[|~*$^]?=/);\n if (op) {\n val = entities.quoted() || parserInput.$re(/^[0-9]+%/) || parserInput.$re(/^[\\w-]+/) || entities.variableCurly();\n }\n\n expectChar(']');\n\n return new(tree.Attribute)(key, op, val);\n },\n\n //\n // The `block` rule is used by `ruleset` and `mixin.definition`.\n // It's a wrapper around the `primary` rule, with added `{}`.\n //\n block: function () {\n let content;\n if (parserInput.$char('{') && (content = this.primary()) && parserInput.$char('}')) {\n return content;\n }\n },\n\n blockRuleset: function() {\n let block = this.block();\n\n if (block) {\n block = new tree.Ruleset(null, block);\n }\n return block;\n },\n\n detachedRuleset: function() {\n let argInfo;\n let params;\n let variadic;\n\n parserInput.save();\n if (parserInput.$re(/^[.#]\\(/)) {\n /**\n * DR args currently only implemented for each() function, and not \n * yet settable as `@dr: #(@arg) {}`\n * This should be done when DRs are merged with mixins.\n * See: https://github.com/less/less-meta/issues/16\n */\n argInfo = this.mixin.args(false);\n params = argInfo.args;\n variadic = argInfo.variadic;\n if (!parserInput.$char(')')) {\n parserInput.restore();\n return;\n }\n }\n const blockRuleset = this.blockRuleset();\n if (blockRuleset) {\n parserInput.forget();\n if (params) {\n return new tree.mixin.Definition(null, params, blockRuleset, null, variadic);\n }\n return new tree.DetachedRuleset(blockRuleset);\n }\n parserInput.restore();\n },\n\n //\n // div, .class, body > p {...}\n //\n ruleset: function () {\n let selectors;\n let rules;\n let debugInfo;\n\n parserInput.save();\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(parserInput.i);\n }\n\n selectors = this.selectors();\n\n if (selectors && (rules = this.block())) {\n parserInput.forget();\n const ruleset = new(tree.Ruleset)(selectors, rules, context.strictImports);\n if (context.dumpLineNumbers) {\n ruleset.debugInfo = debugInfo;\n }\n return ruleset;\n } else {\n parserInput.restore();\n }\n },\n declaration: function () {\n let name;\n let value;\n const index = parserInput.i;\n let hasDR;\n const c = parserInput.currentChar();\n let important;\n let merge;\n let isVariable;\n\n if (c === '.' || c === '#' || c === '&' || c === ':') { return; }\n\n parserInput.save();\n\n name = this.variable() || this.ruleProperty();\n if (name) {\n isVariable = typeof name === 'string';\n\n if (isVariable) {\n value = this.detachedRuleset();\n if (value) {\n hasDR = true;\n }\n }\n\n parserInput.commentStore.length = 0;\n if (!value) {\n // a name returned by this.ruleProperty() is always an array of the form:\n // [string-1, ..., string-n, \"\"] or [string-1, ..., string-n, \"+\"]\n // where each item is a tree.Keyword or tree.Variable\n merge = !isVariable && name.length > 1 && name.pop().value;\n\n // Custom property values get permissive parsing\n if (name[0].value && name[0].value.slice(0, 2) === '--') {\n value = this.permissiveValue();\n }\n // Try to store values as anonymous\n // If we need the value later we'll re-parse it in ruleset.parseValue\n else {\n value = this.anonymousValue();\n }\n if (value) {\n parserInput.forget();\n // anonymous values absorb the end ';' which is required for them to work\n return new(tree.Declaration)(name, value, false, merge, index, fileInfo);\n }\n\n if (!value) {\n value = this.value();\n }\n\n if (value) {\n important = this.important();\n } else if (isVariable) {\n // As a last resort, try permissiveValue\n value = this.permissiveValue();\n }\n }\n\n if (value && (this.end() || hasDR)) {\n parserInput.forget();\n return new(tree.Declaration)(name, value, important, merge, index, fileInfo);\n }\n else {\n parserInput.restore();\n }\n } else {\n parserInput.restore();\n }\n },\n anonymousValue: function () {\n const index = parserInput.i;\n const match = parserInput.$re(/^([^.#@\\$+\\/'\"*`(;{}-]*);/);\n if (match) {\n return new(tree.Anonymous)(match[1], index);\n }\n },\n /**\n * Used for custom properties, at-rules, and variables (as fallback)\n * Parses almost anything inside of {} [] () \"\" blocks\n * until it reaches outer-most tokens.\n * \n * First, it will try to parse comments and entities to reach\n * the end. This is mostly like the Expression parser except no\n * math is allowed.\n */\n permissiveValue: function (untilTokens) {\n let i;\n let e;\n let done;\n let value;\n const tok = untilTokens || ';';\n const index = parserInput.i;\n const result = [];\n\n function testCurrentChar() {\n const char = parserInput.currentChar();\n if (typeof tok === 'string') {\n return char === tok;\n } else {\n return tok.test(char);\n }\n }\n if (testCurrentChar()) {\n return;\n }\n value = [];\n do {\n e = this.comment();\n if (e) {\n value.push(e);\n continue;\n }\n e = this.entity();\n if (e) {\n value.push(e);\n }\n } while (e);\n\n done = testCurrentChar();\n\n if (value.length > 0) {\n value = new(tree.Expression)(value);\n if (done) {\n return value;\n }\n else {\n result.push(value);\n }\n // Preserve space before $parseUntil as it will not\n if (parserInput.prevChar() === ' ') {\n result.push(new tree.Anonymous(' ', index));\n }\n }\n parserInput.save();\n\n value = parserInput.$parseUntil(tok);\n\n if (value) {\n if (typeof value === 'string') {\n error(`Expected '${value}'`, 'Parse');\n }\n if (value.length === 1 && value[0] === ' ') {\n parserInput.forget();\n return new tree.Anonymous('', index);\n }\n let item;\n for (i = 0; i < value.length; i++) {\n item = value[i];\n if (Array.isArray(item)) {\n // Treat actual quotes as normal quoted values\n result.push(new tree.Quoted(item[0], item[1], true, index, fileInfo));\n }\n else {\n if (i === value.length - 1) {\n item = item.trim();\n }\n // Treat like quoted values, but replace vars like unquoted expressions\n const quote = new tree.Quoted('\\'', item, true, index, fileInfo);\n quote.variableRegex = /@([\\w-]+)/g;\n quote.propRegex = /\\$([\\w-]+)/g;\n result.push(quote);\n }\n }\n parserInput.forget();\n return new tree.Expression(result, true);\n }\n parserInput.restore();\n },\n\n //\n // An @import atrule\n //\n // @import \"lib\";\n //\n // Depending on our environment, importing is done differently:\n // In the browser, it's an XHR request, in Node, it would be a\n // file-system operation. The function used for importing is\n // stored in `import`, which we pass to the Import constructor.\n //\n 'import': function () {\n let path;\n let features;\n const index = parserInput.i;\n\n const dir = parserInput.$re(/^@import?\\s+/);\n\n if (dir) {\n const options = (dir ? this.importOptions() : null) || {};\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n features = this.mediaFeatures();\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon or unrecognised media features on import');\n }\n features = features && new(tree.Value)(features);\n return new(tree.Import)(path, features, options, index, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed import statement');\n }\n }\n },\n\n importOptions: function() {\n let o;\n const options = {};\n let optionName;\n let value;\n\n // list of options, surrounded by parens\n if (!parserInput.$char('(')) { return null; }\n do {\n o = this.importOption();\n if (o) {\n optionName = o;\n value = true;\n switch (optionName) {\n case 'css':\n optionName = 'less';\n value = false;\n break;\n case 'once':\n optionName = 'multiple';\n value = false;\n break;\n }\n options[optionName] = value;\n if (!parserInput.$char(',')) { break; }\n }\n } while (o);\n expectChar(')');\n return options;\n },\n\n importOption: function() {\n const opt = parserInput.$re(/^(less|css|multiple|once|inline|reference|optional)/);\n if (opt) {\n return opt[1];\n }\n },\n\n mediaFeature: function () {\n const entities = this.entities;\n const nodes = [];\n let e;\n let p;\n parserInput.save();\n do {\n e = entities.keyword() || entities.variable() || entities.mixinLookup();\n if (e) {\n nodes.push(e);\n } else if (parserInput.$char('(')) {\n p = this.property();\n e = this.value();\n if (parserInput.$char(')')) {\n if (p && e) {\n nodes.push(new(tree.Paren)(new(tree.Declaration)(p, e, null, null, parserInput.i, fileInfo, true)));\n } else if (e) {\n nodes.push(new(tree.Paren)(e));\n } else {\n error('badly formed media feature definition');\n }\n } else {\n error('Missing closing \\')\\'', 'Parse');\n }\n }\n } while (e);\n\n parserInput.forget();\n if (nodes.length > 0) {\n return new(tree.Expression)(nodes);\n }\n },\n\n mediaFeatures: function () {\n const entities = this.entities;\n const features = [];\n let e;\n do {\n e = this.mediaFeature();\n if (e) {\n features.push(e);\n if (!parserInput.$char(',')) { break; }\n } else {\n e = entities.variable() || entities.mixinLookup();\n if (e) {\n features.push(e);\n if (!parserInput.$char(',')) { break; }\n }\n }\n } while (e);\n\n return features.length > 0 ? features : null;\n },\n\n media: function () {\n let features;\n let rules;\n let media;\n let debugInfo;\n const index = parserInput.i;\n\n if (context.dumpLineNumbers) {\n debugInfo = getDebugInfo(index);\n }\n\n parserInput.save();\n\n if (parserInput.$str('@media')) {\n features = this.mediaFeatures();\n\n rules = this.block();\n\n if (!rules) {\n error('media definitions require block statements after any features');\n }\n\n parserInput.forget();\n\n media = new(tree.Media)(rules, features, index, fileInfo);\n if (context.dumpLineNumbers) {\n media.debugInfo = debugInfo;\n }\n\n return media;\n }\n\n parserInput.restore();\n },\n\n //\n\n // A @plugin directive, used to import plugins dynamically.\n //\n // @plugin (args) \"lib\";\n //\n plugin: function () {\n let path;\n let args;\n let options;\n const index = parserInput.i;\n const dir = parserInput.$re(/^@plugin?\\s+/);\n\n if (dir) {\n args = this.pluginArgs();\n\n if (args) {\n options = {\n pluginArgs: args,\n isPlugin: true\n };\n }\n else {\n options = { isPlugin: true };\n }\n\n if ((path = this.entities.quoted() || this.entities.url())) {\n\n if (!parserInput.$char(';')) {\n parserInput.i = index;\n error('missing semi-colon on @plugin');\n }\n return new(tree.Import)(path, null, options, index, fileInfo);\n }\n else {\n parserInput.i = index;\n error('malformed @plugin statement');\n }\n }\n },\n\n pluginArgs: function() {\n // list of options, surrounded by parens\n parserInput.save();\n if (!parserInput.$char('(')) {\n parserInput.restore();\n return null;\n }\n const args = parserInput.$re(/^\\s*([^\\);]+)\\)\\s*/);\n if (args[1]) {\n parserInput.forget();\n return args[1].trim();\n }\n else { \n parserInput.restore();\n return null;\n }\n },\n\n //\n // A CSS AtRule\n //\n // @charset \"utf-8\";\n //\n atrule: function () {\n const index = parserInput.i;\n let name;\n let value;\n let rules;\n let nonVendorSpecificName;\n let hasIdentifier;\n let hasExpression;\n let hasUnknown;\n let hasBlock = true;\n let isRooted = true;\n\n if (parserInput.currentChar() !== '@') { return; }\n\n value = this['import']() || this.plugin() || this.media();\n if (value) {\n return value;\n }\n\n parserInput.save();\n\n name = parserInput.$re(/^@[a-z-]+/);\n\n if (!name) { return; }\n\n nonVendorSpecificName = name;\n if (name.charAt(1) == '-' && name.indexOf('-', 2) > 0) {\n nonVendorSpecificName = `@${name.slice(name.indexOf('-', 2) + 1)}`;\n }\n\n switch (nonVendorSpecificName) {\n case '@charset':\n hasIdentifier = true;\n hasBlock = false;\n break;\n case '@namespace':\n hasExpression = true;\n hasBlock = false;\n break;\n case '@keyframes':\n case '@counter-style':\n hasIdentifier = true;\n break;\n case '@document':\n case '@supports':\n hasUnknown = true;\n isRooted = false;\n break;\n default:\n hasUnknown = true;\n break;\n }\n\n parserInput.commentStore.length = 0;\n\n if (hasIdentifier) {\n value = this.entity();\n if (!value) {\n error(`expected ${name} identifier`);\n }\n } else if (hasExpression) {\n value = this.expression();\n if (!value) {\n error(`expected ${name} expression`);\n }\n } else if (hasUnknown) {\n value = this.permissiveValue(/^[{;]/);\n hasBlock = (parserInput.currentChar() === '{');\n if (!value) {\n if (!hasBlock && parserInput.currentChar() !== ';') {\n error(`${name} rule is missing block or ending semi-colon`);\n }\n }\n else if (!value.value) {\n value = null;\n }\n }\n\n if (hasBlock) {\n rules = this.blockRuleset();\n }\n\n if (rules || (!hasBlock && value && parserInput.$char(';'))) {\n parserInput.forget();\n return new(tree.AtRule)(name, value, rules, index, fileInfo,\n context.dumpLineNumbers ? getDebugInfo(index) : null,\n isRooted\n );\n }\n\n parserInput.restore('at-rule options not recognised');\n },\n\n //\n // A Value is a comma-delimited list of Expressions\n //\n // font-family: Baskerville, Georgia, serif;\n //\n // In a Rule, a Value represents everything after the `:`,\n // and before the `;`.\n //\n value: function () {\n let e;\n const expressions = [];\n const index = parserInput.i;\n\n do {\n e = this.expression();\n if (e) {\n expressions.push(e);\n if (!parserInput.$char(',')) { break; }\n }\n } while (e);\n\n if (expressions.length > 0) {\n return new(tree.Value)(expressions, index);\n }\n },\n important: function () {\n if (parserInput.currentChar() === '!') {\n return parserInput.$re(/^! *important/);\n }\n },\n sub: function () {\n let a;\n let e;\n\n parserInput.save();\n if (parserInput.$char('(')) {\n a = this.addition();\n if (a && parserInput.$char(')')) {\n parserInput.forget();\n e = new(tree.Expression)([a]);\n e.parens = true;\n return e;\n }\n parserInput.restore('Expected \\')\\'');\n return;\n }\n parserInput.restore();\n },\n multiplication: function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.operand();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1);\n while (true) {\n if (parserInput.peek(/^\\/[*\\/]/)) {\n break;\n }\n\n parserInput.save();\n\n op = parserInput.$char('/') || parserInput.$char('*') || parserInput.$str('./');\n\n if (!op) { parserInput.forget(); break; }\n\n a = this.operand();\n\n if (!a) { parserInput.restore(); break; }\n parserInput.forget();\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n isSpaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n addition: function () {\n let m;\n let a;\n let op;\n let operation;\n let isSpaced;\n m = this.multiplication();\n if (m) {\n isSpaced = parserInput.isWhitespace(-1);\n while (true) {\n op = parserInput.$re(/^[-+]\\s+/) || (!isSpaced && (parserInput.$char('+') || parserInput.$char('-')));\n if (!op) {\n break;\n }\n a = this.multiplication();\n if (!a) {\n break;\n }\n\n m.parensInOp = true;\n a.parensInOp = true;\n operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n isSpaced = parserInput.isWhitespace(-1);\n }\n return operation || m;\n }\n },\n conditions: function () {\n let a;\n let b;\n const index = parserInput.i;\n let condition;\n\n a = this.condition(true);\n if (a) {\n while (true) {\n if (!parserInput.peek(/^,\\s*(not\\s*)?\\(/) || !parserInput.$char(',')) {\n break;\n }\n b = this.condition(true);\n if (!b) {\n break;\n }\n condition = new(tree.Condition)('or', condition || a, b, index);\n }\n return condition || a;\n }\n },\n condition: function (needsParens) {\n let result;\n let logical;\n let next;\n function or() {\n return parserInput.$str('or');\n }\n\n result = this.conditionAnd(needsParens);\n if (!result) {\n return ;\n }\n logical = or();\n if (logical) {\n next = this.condition(needsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n }\n }\n return result;\n },\n conditionAnd: function (needsParens) {\n let result;\n let logical;\n let next;\n const self = this;\n function insideCondition() {\n const cond = self.negatedCondition(needsParens) || self.parenthesisCondition(needsParens);\n if (!cond && !needsParens) {\n return self.atomicCondition(needsParens);\n }\n return cond;\n }\n function and() {\n return parserInput.$str('and');\n }\n\n result = insideCondition();\n if (!result) {\n return ;\n }\n logical = and();\n if (logical) {\n next = this.conditionAnd(needsParens);\n if (next) {\n result = new(tree.Condition)(logical, result, next);\n } else {\n return ;\n }\n }\n return result;\n },\n negatedCondition: function (needsParens) {\n if (parserInput.$str('not')) {\n const result = this.parenthesisCondition(needsParens);\n if (result) {\n result.negate = !result.negate;\n }\n return result;\n }\n },\n parenthesisCondition: function (needsParens) {\n function tryConditionFollowedByParenthesis(me) {\n let body;\n parserInput.save();\n body = me.condition(needsParens);\n if (!body) {\n parserInput.restore();\n return ;\n }\n if (!parserInput.$char(')')) {\n parserInput.restore();\n return ;\n }\n parserInput.forget();\n return body;\n }\n\n let body;\n parserInput.save();\n if (!parserInput.$str('(')) {\n parserInput.restore();\n return ;\n }\n body = tryConditionFollowedByParenthesis(this);\n if (body) {\n parserInput.forget();\n return body;\n }\n\n body = this.atomicCondition(needsParens);\n if (!body) {\n parserInput.restore();\n return ;\n }\n if (!parserInput.$char(')')) {\n parserInput.restore(`expected ')' got '${parserInput.currentChar()}'`);\n return ;\n }\n parserInput.forget();\n return body;\n },\n atomicCondition: function (needsParens) {\n const entities = this.entities;\n const index = parserInput.i;\n let a;\n let b;\n let c;\n let op;\n\n function cond() {\n return this.addition() || entities.keyword() || entities.quoted() || entities.mixinLookup();\n }\n cond = cond.bind(this);\n\n a = cond();\n if (a) {\n if (parserInput.$char('>')) {\n if (parserInput.$char('=')) {\n op = '>=';\n } else {\n op = '>';\n }\n } else\n if (parserInput.$char('<')) {\n if (parserInput.$char('=')) {\n op = '<=';\n } else {\n op = '<';\n }\n } else\n if (parserInput.$char('=')) {\n if (parserInput.$char('>')) {\n op = '=>';\n } else if (parserInput.$char('<')) {\n op = '=<';\n } else {\n op = '=';\n }\n }\n if (op) {\n b = cond();\n if (b) {\n c = new(tree.Condition)(op, a, b, index, false);\n } else {\n error('expected expression');\n }\n } else {\n c = new(tree.Condition)('=', a, new(tree.Keyword)('true'), index, false);\n }\n return c;\n }\n },\n\n //\n // An operand is anything that can be part of an operation,\n // such as a Color, or a Variable\n //\n operand: function () {\n const entities = this.entities;\n let negate;\n\n if (parserInput.peek(/^-[@\\$\\(]/)) {\n negate = parserInput.$char('-');\n }\n\n let o = this.sub() || entities.dimension() ||\n entities.color() || entities.variable() ||\n entities.property() || entities.call() ||\n entities.quoted(true) || entities.colorKeyword() ||\n entities.mixinLookup();\n\n if (negate) {\n o.parensInOp = true;\n o = new(tree.Negative)(o);\n }\n\n return o;\n },\n\n //\n // Expressions either represent mathematical operations,\n // or white-space delimited Entities.\n //\n // 1px solid black\n // @var * 2\n //\n expression: function () {\n const entities = [];\n let e;\n let delim;\n const index = parserInput.i;\n\n do {\n e = this.comment();\n if (e) {\n entities.push(e);\n continue;\n }\n e = this.addition() || this.entity();\n\n if (e instanceof tree.Comment) {\n e = null;\n }\n\n if (e) {\n entities.push(e);\n // operations do not allow keyword \"/\" dimension (e.g. small/20px) so we support that here\n if (!parserInput.peek(/^\\/[\\/*]/)) {\n delim = parserInput.$char('/');\n if (delim) {\n entities.push(new(tree.Anonymous)(delim, index));\n }\n }\n }\n } while (e);\n if (entities.length > 0) {\n return new(tree.Expression)(entities);\n }\n },\n property: function () {\n const name = parserInput.$re(/^(\\*?-?[_a-zA-Z0-9-]+)\\s*:/);\n if (name) {\n return name[1];\n }\n },\n ruleProperty: function () {\n let name = [];\n const index = [];\n let s;\n let k;\n\n parserInput.save();\n\n const simpleProperty = parserInput.$re(/^([_a-zA-Z0-9-]+)\\s*:/);\n if (simpleProperty) {\n name = [new(tree.Keyword)(simpleProperty[1])];\n parserInput.forget();\n return name;\n }\n\n function match(re) {\n const i = parserInput.i;\n const chunk = parserInput.$re(re);\n if (chunk) {\n index.push(i);\n return name.push(chunk[1]);\n }\n }\n\n match(/^(\\*?)/);\n while (true) {\n if (!match(/^((?:[\\w-]+)|(?:[@\\$]\\{[\\w-]+\\}))/)) {\n break;\n }\n }\n\n if ((name.length > 1) && match(/^((?:\\+_|\\+)?)\\s*:/)) {\n parserInput.forget();\n\n // at last, we have the complete match now. move forward,\n // convert name particles to tree objects and return:\n if (name[0] === '') {\n name.shift();\n index.shift();\n }\n for (k = 0; k < name.length; k++) {\n s = name[k];\n name[k] = (s.charAt(0) !== '@' && s.charAt(0) !== '$') ?\n new(tree.Keyword)(s) :\n (s.charAt(0) === '@' ?\n new(tree.Variable)(`@${s.slice(2, -1)}`, index[k], fileInfo) :\n new(tree.Property)(`$${s.slice(2, -1)}`, index[k], fileInfo));\n }\n return name;\n }\n parserInput.restore();\n }\n }\n };\n};\nParser.serializeVars = vars => {\n let s = '';\n\n for (const name in vars) {\n if (Object.hasOwnProperty.call(vars, name)) {\n const value = vars[name];\n s += `${((name[0] === '@') ? '' : '@') + name}: ${value}${(String(value).slice(-1) === ';') ? '' : ';'}`;\n }\n }\n\n return s;\n};\n\nexport default Parser;\n","import Anonymous from '../tree/anonymous';\nimport Keyword from '../tree/keyword';\n\nfunction boolean(condition) {\n return condition ? Keyword.True : Keyword.False;\n}\n\n/**\n * Functions with evalArgs set to false are sent context\n * as the first argument.\n */\nfunction If(context, condition, trueValue, falseValue) {\n return condition.eval(context) ? trueValue.eval(context)\n : (falseValue ? falseValue.eval(context) : new Anonymous);\n}\nIf.evalArgs = false;\n\nfunction isdefined(context, variable) {\n try {\n variable.eval(context);\n return Keyword.True;\n } catch (e) {\n return Keyword.False;\n }\n}\n\nisdefined.evalArgs = false;\n\nexport default { isdefined, boolean, 'if': If };\n","import Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport Expression from '../tree/expression';\nimport Operation from '../tree/operation';\nlet colorFunctions;\n\nfunction clamp(val) {\n return Math.min(1, Math.max(0, val));\n}\nfunction hsla(origColor, hsl) {\n const color = colorFunctions.hsla(hsl.h, hsl.s, hsl.l, hsl.a);\n if (color) {\n if (origColor.value && \n /^(rgb|hsl)/.test(origColor.value)) {\n color.value = origColor.value;\n } else {\n color.value = 'rgb';\n }\n return color;\n }\n}\nfunction toHSL(color) {\n if (color.toHSL) {\n return color.toHSL();\n } else {\n throw new Error('Argument cannot be evaluated to a color');\n }\n}\n\nfunction toHSV(color) {\n if (color.toHSV) {\n return color.toHSV();\n } else {\n throw new Error('Argument cannot be evaluated to a color');\n }\n}\n\nfunction number(n) {\n if (n instanceof Dimension) {\n return parseFloat(n.unit.is('%') ? n.value / 100 : n.value);\n } else if (typeof n === 'number') {\n return n;\n } else {\n throw {\n type: 'Argument',\n message: 'color functions take numbers as parameters'\n };\n }\n}\nfunction scaled(n, size) {\n if (n instanceof Dimension && n.unit.is('%')) {\n return parseFloat(n.value * size / 100);\n } else {\n return number(n);\n }\n}\ncolorFunctions = {\n rgb: function (r, g, b) {\n let a = 1\n /**\n * Comma-less syntax\n * e.g. rgb(0 128 255 / 50%)\n */\n if (r instanceof Expression) {\n const val = r.value\n r = val[0]\n g = val[1]\n b = val[2]\n /** \n * @todo - should this be normalized in\n * function caller? Or parsed differently?\n */\n if (b instanceof Operation) {\n const op = b\n b = op.operands[0]\n a = op.operands[1]\n }\n }\n const color = colorFunctions.rgba(r, g, b, a);\n if (color) {\n color.value = 'rgb';\n return color;\n }\n },\n rgba: function (r, g, b, a) {\n try {\n if (r instanceof Color) {\n if (g) {\n a = number(g);\n } else {\n a = r.alpha;\n }\n return new Color(r.rgb, a, 'rgba');\n }\n const rgb = [r, g, b].map(c => scaled(c, 255));\n a = number(a);\n return new Color(rgb, a, 'rgba');\n }\n catch (e) {}\n },\n hsl: function (h, s, l) {\n let a = 1\n if (h instanceof Expression) {\n const val = h.value\n h = val[0]\n s = val[1]\n l = val[2]\n\n if (l instanceof Operation) {\n const op = l\n l = op.operands[0]\n a = op.operands[1]\n }\n }\n const color = colorFunctions.hsla(h, s, l, a);\n if (color) {\n color.value = 'hsl';\n return color;\n }\n },\n hsla: function (h, s, l, a) {\n try {\n if (h instanceof Color) {\n if (s) {\n a = number(s);\n } else {\n a = h.alpha;\n }\n return new Color(h.rgb, a, 'hsla');\n }\n\n let m1;\n let m2;\n\n function hue(h) {\n h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h);\n if (h * 6 < 1) {\n return m1 + (m2 - m1) * h * 6;\n }\n else if (h * 2 < 1) {\n return m2;\n }\n else if (h * 3 < 2) {\n return m1 + (m2 - m1) * (2 / 3 - h) * 6;\n }\n else {\n return m1;\n }\n }\n\n h = (number(h) % 360) / 360;\n s = clamp(number(s));l = clamp(number(l));a = clamp(number(a));\n\n m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n m1 = l * 2 - m2;\n\n const rgb = [\n hue(h + 1 / 3) * 255,\n hue(h) * 255,\n hue(h - 1 / 3) * 255\n ];\n a = number(a);\n return new Color(rgb, a, 'hsla');\n }\n catch (e) {}\n },\n\n hsv: function(h, s, v) {\n return colorFunctions.hsva(h, s, v, 1.0);\n },\n\n hsva: function(h, s, v, a) {\n h = ((number(h) % 360) / 360) * 360;\n s = number(s);v = number(v);a = number(a);\n\n let i;\n let f;\n i = Math.floor((h / 60) % 6);\n f = (h / 60) - i;\n\n const vs = [v,\n v * (1 - s),\n v * (1 - f * s),\n v * (1 - (1 - f) * s)];\n const perm = [[0, 3, 1],\n [2, 0, 1],\n [1, 0, 3],\n [1, 2, 0],\n [3, 1, 0],\n [0, 1, 2]];\n\n return colorFunctions.rgba(vs[perm[i][0]] * 255,\n vs[perm[i][1]] * 255,\n vs[perm[i][2]] * 255,\n a);\n },\n\n hue: function (color) {\n return new Dimension(toHSL(color).h);\n },\n saturation: function (color) {\n return new Dimension(toHSL(color).s * 100, '%');\n },\n lightness: function (color) {\n return new Dimension(toHSL(color).l * 100, '%');\n },\n hsvhue: function(color) {\n return new Dimension(toHSV(color).h);\n },\n hsvsaturation: function (color) {\n return new Dimension(toHSV(color).s * 100, '%');\n },\n hsvvalue: function (color) {\n return new Dimension(toHSV(color).v * 100, '%');\n },\n red: function (color) {\n return new Dimension(color.rgb[0]);\n },\n green: function (color) {\n return new Dimension(color.rgb[1]);\n },\n blue: function (color) {\n return new Dimension(color.rgb[2]);\n },\n alpha: function (color) {\n return new Dimension(toHSL(color).a);\n },\n luma: function (color) {\n return new Dimension(color.luma() * color.alpha * 100, '%');\n },\n luminance: function (color) {\n const luminance =\n (0.2126 * color.rgb[0] / 255) +\n (0.7152 * color.rgb[1] / 255) +\n (0.0722 * color.rgb[2] / 255);\n\n return new Dimension(luminance * color.alpha * 100, '%');\n },\n saturate: function (color, amount, method) {\n // filter: saturate(3.2);\n // should be kept as is, so check for color\n if (!color.rgb) {\n return null;\n }\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.s += hsl.s * amount.value / 100;\n }\n else {\n hsl.s += amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n return hsla(color, hsl);\n },\n desaturate: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.s -= hsl.s * amount.value / 100;\n }\n else {\n hsl.s -= amount.value / 100;\n }\n hsl.s = clamp(hsl.s);\n return hsla(color, hsl);\n },\n lighten: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.l += hsl.l * amount.value / 100;\n }\n else {\n hsl.l += amount.value / 100;\n }\n hsl.l = clamp(hsl.l);\n return hsla(color, hsl);\n },\n darken: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.l -= hsl.l * amount.value / 100;\n }\n else {\n hsl.l -= amount.value / 100;\n }\n hsl.l = clamp(hsl.l);\n return hsla(color, hsl);\n },\n fadein: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.a += hsl.a * amount.value / 100;\n }\n else {\n hsl.a += amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fadeout: function (color, amount, method) {\n const hsl = toHSL(color);\n\n if (typeof method !== 'undefined' && method.value === 'relative') {\n hsl.a -= hsl.a * amount.value / 100;\n }\n else {\n hsl.a -= amount.value / 100;\n }\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n fade: function (color, amount) {\n const hsl = toHSL(color);\n\n hsl.a = amount.value / 100;\n hsl.a = clamp(hsl.a);\n return hsla(color, hsl);\n },\n spin: function (color, amount) {\n const hsl = toHSL(color);\n const hue = (hsl.h + amount.value) % 360;\n\n hsl.h = hue < 0 ? 360 + hue : hue;\n\n return hsla(color, hsl);\n },\n //\n // Copyright (c) 2006-2009 Hampton Catlin, Natalie Weizenbaum, and Chris Eppstein\n // http://sass-lang.com\n //\n mix: function (color1, color2, weight) {\n if (!weight) {\n weight = new Dimension(50);\n }\n const p = weight.value / 100.0;\n const w = p * 2 - 1;\n const a = toHSL(color1).a - toHSL(color2).a;\n\n const w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n const w2 = 1 - w1;\n\n const rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2,\n color1.rgb[1] * w1 + color2.rgb[1] * w2,\n color1.rgb[2] * w1 + color2.rgb[2] * w2];\n\n const alpha = color1.alpha * p + color2.alpha * (1 - p);\n\n return new Color(rgb, alpha);\n },\n greyscale: function (color) {\n return colorFunctions.desaturate(color, new Dimension(100));\n },\n contrast: function (color, dark, light, threshold) {\n // filter: contrast(3.2);\n // should be kept as is, so check for color\n if (!color.rgb) {\n return null;\n }\n if (typeof light === 'undefined') {\n light = colorFunctions.rgba(255, 255, 255, 1.0);\n }\n if (typeof dark === 'undefined') {\n dark = colorFunctions.rgba(0, 0, 0, 1.0);\n }\n // Figure out which is actually light and dark:\n if (dark.luma() > light.luma()) {\n const t = light;\n light = dark;\n dark = t;\n }\n if (typeof threshold === 'undefined') {\n threshold = 0.43;\n } else {\n threshold = number(threshold);\n }\n if (color.luma() < threshold) {\n return light;\n } else {\n return dark;\n }\n },\n // Changes made in 2.7.0 - Reverted in 3.0.0\n // contrast: function (color, color1, color2, threshold) {\n // // Return which of `color1` and `color2` has the greatest contrast with `color`\n // // according to the standard WCAG contrast ratio calculation.\n // // http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n // // The threshold param is no longer used, in line with SASS.\n // // filter: contrast(3.2);\n // // should be kept as is, so check for color\n // if (!color.rgb) {\n // return null;\n // }\n // if (typeof color1 === 'undefined') {\n // color1 = colorFunctions.rgba(0, 0, 0, 1.0);\n // }\n // if (typeof color2 === 'undefined') {\n // color2 = colorFunctions.rgba(255, 255, 255, 1.0);\n // }\n // var contrast1, contrast2;\n // var luma = color.luma();\n // var luma1 = color1.luma();\n // var luma2 = color2.luma();\n // // Calculate contrast ratios for each color\n // if (luma > luma1) {\n // contrast1 = (luma + 0.05) / (luma1 + 0.05);\n // } else {\n // contrast1 = (luma1 + 0.05) / (luma + 0.05);\n // }\n // if (luma > luma2) {\n // contrast2 = (luma + 0.05) / (luma2 + 0.05);\n // } else {\n // contrast2 = (luma2 + 0.05) / (luma + 0.05);\n // }\n // if (contrast1 > contrast2) {\n // return color1;\n // } else {\n // return color2;\n // }\n // },\n argb: function (color) {\n return new Anonymous(color.toARGB());\n },\n color: function(c) {\n if ((c instanceof Quoted) &&\n (/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})$/i.test(c.value))) {\n const val = c.value.slice(1);\n return new Color(val, undefined, `#${val}`);\n }\n if ((c instanceof Color) || (c = Color.fromKeyword(c.value))) {\n c.value = undefined;\n return c;\n }\n throw {\n type: 'Argument',\n message: 'argument must be a color keyword or 3|4|6|8 digit hex e.g. #FFF'\n };\n },\n tint: function(color, amount) {\n return colorFunctions.mix(colorFunctions.rgb(255, 255, 255), color, amount);\n },\n shade: function(color, amount) {\n return colorFunctions.mix(colorFunctions.rgb(0, 0, 0), color, amount);\n }\n};\n\nexport default colorFunctions;\n","import Color from '../tree/color';\n\n// Color Blending\n// ref: http://www.w3.org/TR/compositing-1\n\nfunction colorBlend(mode, color1, color2) {\n const ab = color1.alpha; // result\n\n let // backdrop\n cb;\n\n const as = color2.alpha;\n\n let // source\n cs;\n\n let ar;\n let cr;\n const r = [];\n\n ar = as + ab * (1 - as);\n for (let i = 0; i < 3; i++) {\n cb = color1.rgb[i] / 255;\n cs = color2.rgb[i] / 255;\n cr = mode(cb, cs);\n if (ar) {\n cr = (as * cs + ab * (cb -\n as * (cb + cs - cr))) / ar;\n }\n r[i] = cr * 255;\n }\n\n return new Color(r, ar);\n}\n\nconst colorBlendModeFunctions = {\n multiply: function(cb, cs) {\n return cb * cs;\n },\n screen: function(cb, cs) {\n return cb + cs - cb * cs;\n },\n overlay: function(cb, cs) {\n cb *= 2;\n return (cb <= 1) ?\n colorBlendModeFunctions.multiply(cb, cs) :\n colorBlendModeFunctions.screen(cb - 1, cs);\n },\n softlight: function(cb, cs) {\n let d = 1;\n let e = cb;\n if (cs > 0.5) {\n e = 1;\n d = (cb > 0.25) ? Math.sqrt(cb)\n : ((16 * cb - 12) * cb + 4) * cb;\n }\n return cb - (1 - 2 * cs) * e * (d - cb);\n },\n hardlight: function(cb, cs) {\n return colorBlendModeFunctions.overlay(cs, cb);\n },\n difference: function(cb, cs) {\n return Math.abs(cb - cs);\n },\n exclusion: function(cb, cs) {\n return cb + cs - 2 * cb * cs;\n },\n\n // non-w3c functions:\n average: function(cb, cs) {\n return (cb + cs) / 2;\n },\n negation: function(cb, cs) {\n return 1 - Math.abs(cb + cs - 1);\n }\n};\n\nfor (const f in colorBlendModeFunctions) {\n if (colorBlendModeFunctions.hasOwnProperty(f)) {\n colorBlend[f] = colorBlend.bind(null, colorBlendModeFunctions[f]);\n }\n}\n\nexport default colorBlend;\n","import Comment from '../tree/comment';\nimport Node from '../tree/node';\nimport Dimension from '../tree/dimension';\nimport Declaration from '../tree/declaration';\nimport Expression from '../tree/expression';\nimport Ruleset from '../tree/ruleset';\nimport Selector from '../tree/selector';\nimport Element from '../tree/element';\nimport Quote from '../tree/quoted';\nimport Value from '../tree/value';\n\nconst getItemsFromNode = node => {\n // handle non-array values as an array of length 1\n // return 'undefined' if index is invalid\n const items = Array.isArray(node.value) ?\n node.value : Array(node);\n\n return items;\n};\n\nexport default {\n _SELF: function(n) {\n return n;\n },\n '~': function(...expr) {\n if (expr.length === 1) {\n return expr[0];\n }\n return new Value(expr);\n },\n extract: function(values, index) {\n // (1-based index)\n index = index.value - 1;\n\n return getItemsFromNode(values)[index];\n },\n length: function(values) {\n return new Dimension(getItemsFromNode(values).length);\n },\n /**\n * Creates a Less list of incremental values.\n * Modeled after Lodash's range function, also exists natively in PHP\n * \n * @param {Dimension} [start=1]\n * @param {Dimension} end - e.g. 10 or 10px - unit is added to output\n * @param {Dimension} [step=1] \n */\n range: function(start, end, step) {\n let from;\n let to;\n let stepValue = 1;\n const list = [];\n if (end) {\n to = end;\n from = start.value;\n if (step) {\n stepValue = step.value;\n }\n }\n else {\n from = 1;\n to = start;\n }\n\n for (let i = from; i <= to.value; i += stepValue) {\n list.push(new Dimension(i, to.unit));\n }\n\n return new Expression(list);\n },\n each: function(list, rs) {\n const rules = [];\n let newRules;\n let iterator;\n\n const tryEval = val => {\n if (val instanceof Node) {\n return val.eval(this.context);\n }\n return val;\n };\n\n if (list.value && !(list instanceof Quote)) {\n if (Array.isArray(list.value)) {\n iterator = list.value.map(tryEval);\n } else {\n iterator = [tryEval(list.value)];\n }\n } else if (list.ruleset) {\n iterator = tryEval(list.ruleset).rules;\n } else if (list.rules) {\n iterator = list.rules.map(tryEval);\n } else if (Array.isArray(list)) {\n iterator = list.map(tryEval);\n } else {\n iterator = [tryEval(list)];\n }\n\n let valueName = '@value';\n let keyName = '@key';\n let indexName = '@index';\n\n if (rs.params) {\n valueName = rs.params[0] && rs.params[0].name;\n keyName = rs.params[1] && rs.params[1].name;\n indexName = rs.params[2] && rs.params[2].name;\n rs = rs.rules;\n } else {\n rs = rs.ruleset;\n }\n\n for (let i = 0; i < iterator.length; i++) {\n let key;\n let value;\n const item = iterator[i];\n if (item instanceof Declaration) {\n key = typeof item.name === 'string' ? item.name : item.name[0].value;\n value = item.value;\n } else {\n key = new Dimension(i + 1);\n value = item;\n }\n\n if (item instanceof Comment) {\n continue;\n }\n\n newRules = rs.rules.slice(0);\n if (valueName) {\n newRules.push(new Declaration(valueName,\n value,\n false, false, this.index, this.currentFileInfo));\n }\n if (indexName) {\n newRules.push(new Declaration(indexName,\n new Dimension(i + 1),\n false, false, this.index, this.currentFileInfo));\n }\n if (keyName) {\n newRules.push(new Declaration(keyName,\n key,\n false, false, this.index, this.currentFileInfo));\n }\n\n rules.push(new Ruleset([ new(Selector)([ new Element(\"\", '&') ]) ],\n newRules,\n rs.strictImports,\n rs.visibilityInfo()\n ));\n }\n\n return new Ruleset([ new(Selector)([ new Element(\"\", '&') ]) ],\n rules,\n rs.strictImports,\n rs.visibilityInfo()\n ).eval(this.context);\n }\n};\n","import Dimension from '../tree/dimension';\n\nconst MathHelper = (fn, unit, n) => {\n if (!(n instanceof Dimension)) {\n throw { type: 'Argument', message: 'argument must be a number' };\n }\n if (unit == null) {\n unit = n.unit;\n } else {\n n = n.unify();\n }\n return new Dimension(fn(parseFloat(n.value)), unit);\n};\n\nexport default MathHelper;","import mathHelper from './math-helper.js';\n\nconst mathFunctions = {\n // name, unit\n ceil: null,\n floor: null,\n sqrt: null,\n abs: null,\n tan: '',\n sin: '',\n cos: '',\n atan: 'rad',\n asin: 'rad',\n acos: 'rad'\n};\n\nfor (const f in mathFunctions) {\n if (mathFunctions.hasOwnProperty(f)) {\n mathFunctions[f] = mathHelper.bind(null, Math[f], mathFunctions[f]);\n }\n}\n\nmathFunctions.round = (n, f) => {\n const fraction = typeof f === 'undefined' ? 0 : f.value;\n return mathHelper(num => num.toFixed(fraction), null, n);\n};\n\nexport default mathFunctions;\n","import Dimension from '../tree/dimension';\nimport Anonymous from '../tree/anonymous';\nimport mathHelper from './math-helper.js';\n\nconst minMax = function (isMin, args) {\n args = Array.prototype.slice.call(args);\n switch (args.length) {\n case 0: throw { type: 'Argument', message: 'one or more arguments required' };\n }\n let i; // key is the unit.toString() for unified Dimension values,\n let j;\n let current;\n let currentUnified;\n let referenceUnified;\n let unit;\n let unitStatic;\n let unitClone;\n\n const // elems only contains original argument values.\n order = [];\n\n const values = {};\n // value is the index into the order array.\n for (i = 0; i < args.length; i++) {\n current = args[i];\n if (!(current instanceof Dimension)) {\n if (Array.isArray(args[i].value)) {\n Array.prototype.push.apply(args, Array.prototype.slice.call(args[i].value));\n }\n continue;\n }\n currentUnified = current.unit.toString() === '' && unitClone !== undefined ? new Dimension(current.value, unitClone).unify() : current.unify();\n unit = currentUnified.unit.toString() === '' && unitStatic !== undefined ? unitStatic : currentUnified.unit.toString();\n unitStatic = unit !== '' && unitStatic === undefined || unit !== '' && order[0].unify().unit.toString() === '' ? unit : unitStatic;\n unitClone = unit !== '' && unitClone === undefined ? current.unit.toString() : unitClone;\n j = values[''] !== undefined && unit !== '' && unit === unitStatic ? values[''] : values[unit];\n if (j === undefined) {\n if (unitStatic !== undefined && unit !== unitStatic) {\n throw { type: 'Argument', message: 'incompatible types' };\n }\n values[unit] = order.length;\n order.push(current);\n continue;\n }\n referenceUnified = order[j].unit.toString() === '' && unitClone !== undefined ? new Dimension(order[j].value, unitClone).unify() : order[j].unify();\n if ( isMin && currentUnified.value < referenceUnified.value ||\n !isMin && currentUnified.value > referenceUnified.value) {\n order[j] = current;\n }\n }\n if (order.length == 1) {\n return order[0];\n }\n args = order.map(function (a) { return a.toCSS(this.context); }).join(this.context.compress ? ',' : ', ');\n return new Anonymous(`${isMin ? 'min' : 'max'}(${args})`);\n};\n\nexport default {\n min: function(...args) {\n try {\n return minMax(true, args);\n } catch (e) {}\n },\n max: function(...args) {\n try {\n return minMax(false, args);\n } catch (e) {}\n },\n convert: function (val, unit) {\n return val.convertTo(unit.value);\n },\n pi: function () {\n return new Dimension(Math.PI);\n },\n mod: function(a, b) {\n return new Dimension(a.value % b.value, a.unit);\n },\n pow: function(x, y) {\n if (typeof x === 'number' && typeof y === 'number') {\n x = new Dimension(x);\n y = new Dimension(y);\n } else if (!(x instanceof Dimension) || !(y instanceof Dimension)) {\n throw { type: 'Argument', message: 'arguments must be numbers' };\n }\n\n return new Dimension(Math.pow(x.value, y.value), x.unit);\n },\n percentage: function (n) {\n const result = mathHelper(num => num * 100, '%', n);\n\n return result;\n }\n};\n","import Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport JavaScript from '../tree/javascript';\n\nexport default {\n e: function (str) {\n return new Quoted('\"', str instanceof JavaScript ? str.evaluated : str.value, true);\n },\n escape: function (str) {\n return new Anonymous(\n encodeURI(str.value).replace(/=/g, '%3D').replace(/:/g, '%3A').replace(/#/g, '%23').replace(/;/g, '%3B')\n .replace(/\\(/g, '%28').replace(/\\)/g, '%29'));\n },\n replace: function (string, pattern, replacement, flags) {\n let result = string.value;\n replacement = (replacement.type === 'Quoted') ?\n replacement.value : replacement.toCSS();\n result = result.replace(new RegExp(pattern.value, flags ? flags.value : ''), replacement);\n return new Quoted(string.quote || '', result, string.escaped);\n },\n '%': function (string /* arg, arg, ... */) {\n const args = Array.prototype.slice.call(arguments, 1);\n let result = string.value;\n\n for (let i = 0; i < args.length; i++) {\n /* jshint loopfunc:true */\n result = result.replace(/%[sda]/i, token => {\n const value = ((args[i].type === 'Quoted') &&\n token.match(/s/i)) ? args[i].value : args[i].toCSS();\n return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value;\n });\n }\n result = result.replace(/%%/g, '%');\n return new Quoted(string.quote || '', result, string.escaped);\n }\n};\n","import Keyword from '../tree/keyword';\nimport DetachedRuleset from '../tree/detached-ruleset';\nimport Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Quoted from '../tree/quoted';\nimport Anonymous from '../tree/anonymous';\nimport URL from '../tree/url';\nimport Operation from '../tree/operation';\n\nconst isa = (n, Type) => (n instanceof Type) ? Keyword.True : Keyword.False;\nconst isunit = (n, unit) => {\n if (unit === undefined) {\n throw { type: 'Argument', message: 'missing the required second argument to isunit.' };\n }\n unit = typeof unit.value === 'string' ? unit.value : unit;\n if (typeof unit !== 'string') {\n throw { type: 'Argument', message: 'Second argument to isunit should be a unit or a string.' };\n }\n return (n instanceof Dimension) && n.unit.is(unit) ? Keyword.True : Keyword.False;\n};\n\nexport default {\n isruleset: function (n) {\n return isa(n, DetachedRuleset);\n },\n iscolor: function (n) {\n return isa(n, Color);\n },\n isnumber: function (n) {\n return isa(n, Dimension);\n },\n isstring: function (n) {\n return isa(n, Quoted);\n },\n iskeyword: function (n) {\n return isa(n, Keyword);\n },\n isurl: function (n) {\n return isa(n, URL);\n },\n ispixel: function (n) {\n return isunit(n, 'px');\n },\n ispercentage: function (n) {\n return isunit(n, '%');\n },\n isem: function (n) {\n return isunit(n, 'em');\n },\n isunit,\n unit: function (val, unit) {\n if (!(val instanceof Dimension)) {\n throw { type: 'Argument',\n message: `the first argument to unit must be a number${val instanceof Operation ? '. Have you forgotten parenthesis?' : ''}` };\n }\n if (unit) {\n if (unit instanceof Keyword) {\n unit = unit.value;\n } else {\n unit = unit.toCSS();\n }\n } else {\n unit = '';\n }\n return new Dimension(val.value, unit);\n },\n 'get-unit': function (n) {\n return new Anonymous(n.unit);\n }\n};\n","import functionRegistry from './function-registry';\nimport functionCaller from './function-caller';\n\nimport boolean from './boolean';\nimport defaultFunc from './default';\nimport color from './color';\nimport colorBlending from './color-blending';\nimport dataUri from './data-uri';\nimport list from './list';\nimport math from './math';\nimport number from './number';\nimport string from './string';\nimport svg from './svg';\nimport types from './types';\n\nexport default environment => {\n const functions = { functionRegistry, functionCaller };\n\n // register functions\n functionRegistry.addMultiple(boolean);\n functionRegistry.add('default', defaultFunc.eval.bind(defaultFunc));\n functionRegistry.addMultiple(color);\n functionRegistry.addMultiple(colorBlending);\n functionRegistry.addMultiple(dataUri(environment));\n functionRegistry.addMultiple(list);\n functionRegistry.addMultiple(math);\n functionRegistry.addMultiple(number);\n functionRegistry.addMultiple(string);\n functionRegistry.addMultiple(svg(environment));\n functionRegistry.addMultiple(types);\n\n return functions;\n};\n","import Quoted from '../tree/quoted';\nimport URL from '../tree/url';\nimport * as utils from '../utils';\nimport logger from '../logger';\n\nexport default environment => {\n \n const fallback = (functionThis, node) => new URL(node, functionThis.index, functionThis.currentFileInfo).eval(functionThis.context); \n\n return { 'data-uri': function(mimetypeNode, filePathNode) {\n\n if (!filePathNode) {\n filePathNode = mimetypeNode;\n mimetypeNode = null;\n }\n\n let mimetype = mimetypeNode && mimetypeNode.value;\n let filePath = filePathNode.value;\n const currentFileInfo = this.currentFileInfo;\n const currentDirectory = currentFileInfo.rewriteUrls ?\n currentFileInfo.currentDirectory : currentFileInfo.entryPath;\n\n const fragmentStart = filePath.indexOf('#');\n let fragment = '';\n if (fragmentStart !== -1) {\n fragment = filePath.slice(fragmentStart);\n filePath = filePath.slice(0, fragmentStart);\n }\n const context = utils.clone(this.context);\n context.rawBuffer = true;\n\n const fileManager = environment.getFileManager(filePath, currentDirectory, context, environment, true);\n\n if (!fileManager) {\n return fallback(this, filePathNode);\n }\n\n let useBase64 = false;\n\n // detect the mimetype if not given\n if (!mimetypeNode) {\n\n mimetype = environment.mimeLookup(filePath);\n\n if (mimetype === 'image/svg+xml') {\n useBase64 = false;\n } else {\n // use base 64 unless it's an ASCII or UTF-8 format\n const charset = environment.charsetLookup(mimetype);\n useBase64 = ['US-ASCII', 'UTF-8'].indexOf(charset) < 0;\n }\n if (useBase64) { mimetype += ';base64'; }\n }\n else {\n useBase64 = /;base64$/.test(mimetype);\n }\n\n const fileSync = fileManager.loadFileSync(filePath, currentDirectory, context, environment);\n if (!fileSync.contents) {\n logger.warn(`Skipped data-uri embedding of ${filePath} because file not found`);\n return fallback(this, filePathNode || mimetypeNode);\n }\n let buf = fileSync.contents;\n if (useBase64 && !environment.encodeBase64) {\n return fallback(this, filePathNode);\n }\n\n buf = useBase64 ? environment.encodeBase64(buf) : encodeURIComponent(buf);\n\n const uri = `data:${mimetype},${buf}${fragment}`;\n\n return new URL(new Quoted(`\"${uri}\"`, uri, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n }};\n};\n","import Dimension from '../tree/dimension';\nimport Color from '../tree/color';\nimport Expression from '../tree/expression';\nimport Quoted from '../tree/quoted';\nimport URL from '../tree/url';\n\nexport default environment => {\n return { 'svg-gradient': function(direction) {\n let stops;\n let gradientDirectionSvg;\n let gradientType = 'linear';\n let rectangleDimension = 'x=\"0\" y=\"0\" width=\"1\" height=\"1\"';\n const renderEnv = {compress: false};\n let returner;\n const directionValue = direction.toCSS(renderEnv);\n let i;\n let color;\n let position;\n let positionValue;\n let alpha;\n\n function throwArgumentDescriptor() {\n throw { type: 'Argument',\n message: 'svg-gradient expects direction, start_color [start_position], [color position,]...,' +\n ' end_color [end_position] or direction, color list' };\n }\n\n if (arguments.length == 2) {\n if (arguments[1].value.length < 2) {\n throwArgumentDescriptor();\n }\n stops = arguments[1].value;\n } else if (arguments.length < 3) {\n throwArgumentDescriptor();\n } else {\n stops = Array.prototype.slice.call(arguments, 1);\n }\n\n switch (directionValue) {\n case 'to bottom':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\"';\n break;\n case 'to right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'to bottom right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\"';\n break;\n case 'to top right':\n gradientDirectionSvg = 'x1=\"0%\" y1=\"100%\" x2=\"100%\" y2=\"0%\"';\n break;\n case 'ellipse':\n case 'ellipse at center':\n gradientType = 'radial';\n gradientDirectionSvg = 'cx=\"50%\" cy=\"50%\" r=\"75%\"';\n rectangleDimension = 'x=\"-50\" y=\"-50\" width=\"101\" height=\"101\"';\n break;\n default:\n throw { type: 'Argument', message: 'svg-gradient direction must be \\'to bottom\\', \\'to right\\',' +\n ' \\'to bottom right\\', \\'to top right\\' or \\'ellipse at center\\'' };\n }\n returner = `<${gradientType}Gradient id=\"g\" ${gradientDirectionSvg}>`;\n\n for (i = 0; i < stops.length; i += 1) {\n if (stops[i] instanceof Expression) {\n color = stops[i].value[0];\n position = stops[i].value[1];\n } else {\n color = stops[i];\n position = undefined;\n }\n\n if (!(color instanceof Color) || (!((i === 0 || i + 1 === stops.length) && position === undefined) && !(position instanceof Dimension))) {\n throwArgumentDescriptor();\n }\n positionValue = position ? position.toCSS(renderEnv) : i === 0 ? '0%' : '100%';\n alpha = color.alpha;\n returner += ``;\n }\n returner += ``;\n\n returner = encodeURIComponent(returner);\n\n returner = `data:image/svg+xml,${returner}`;\n return new URL(new Quoted(`'${returner}'`, returner, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n }};\n};\n","import contexts from './contexts';\nimport visitor from './visitors';\nimport tree from './tree';\n\nexport default function(root, options) {\n options = options || {};\n let evaldRoot;\n let variables = options.variables;\n const evalEnv = new contexts.Eval(options);\n\n //\n // Allows setting variables with a hash, so:\n //\n // `{ color: new tree.Color('#f01') }` will become:\n //\n // new tree.Declaration('@color',\n // new tree.Value([\n // new tree.Expression([\n // new tree.Color('#f01')\n // ])\n // ])\n // )\n //\n if (typeof variables === 'object' && !Array.isArray(variables)) {\n variables = Object.keys(variables).map(function (k) {\n let value = variables[k];\n\n if (!(value instanceof tree.Value)) {\n if (!(value instanceof tree.Expression)) {\n value = new tree.Expression([value]);\n }\n value = new tree.Value([value]);\n }\n return new tree.Declaration(`@${k}`, value, false, null, 0);\n });\n evalEnv.frames = [new tree.Ruleset(null, variables)];\n }\n\n const visitors = [\n new visitor.JoinSelectorVisitor(),\n new visitor.MarkVisibleSelectorsVisitor(true),\n new visitor.ExtendVisitor(),\n new visitor.ToCSSVisitor({compress: Boolean(options.compress)})\n ];\n\n const preEvalVisitors = [];\n let v;\n let visitorIterator;\n\n /**\n * first() / get() allows visitors to be added while visiting\n * \n * @todo Add scoping for visitors just like functions for @plugin; right now they're global\n */\n if (options.pluginManager) {\n visitorIterator = options.pluginManager.visitor();\n for (var i = 0; i < 2; i++) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (v.isPreEvalVisitor) {\n if (i === 0 || preEvalVisitors.indexOf(v) === -1) {\n preEvalVisitors.push(v);\n v.run(root);\n }\n }\n else {\n if (i === 0 || visitors.indexOf(v) === -1) {\n if (v.isPreVisitor) {\n visitors.unshift(v);\n }\n else {\n visitors.push(v);\n }\n }\n }\n }\n }\n }\n\n evaldRoot = root.eval(evalEnv);\n\n for (var i = 0; i < visitors.length; i++) {\n visitors[i].run(evaldRoot);\n }\n\n // Run any remaining visitors added after eval pass\n if (options.pluginManager) {\n visitorIterator.first();\n while ((v = visitorIterator.get())) {\n if (visitors.indexOf(v) === -1 && preEvalVisitors.indexOf(v) === -1) {\n v.run(evaldRoot);\n }\n }\n }\n\n return evaldRoot;\n};\n","/**\n * Plugin Manager\n */\nclass PluginManager {\n constructor(less) {\n this.less = less;\n this.visitors = [];\n this.preProcessors = [];\n this.postProcessors = [];\n this.installedPlugins = [];\n this.fileManagers = [];\n this.iterator = -1;\n this.pluginCache = {};\n this.Loader = new less.PluginLoader(less);\n }\n\n /**\n * Adds all the plugins in the array\n * @param {Array} plugins\n */\n addPlugins(plugins) {\n if (plugins) {\n for (let i = 0; i < plugins.length; i++) {\n this.addPlugin(plugins[i]);\n }\n }\n }\n\n /**\n *\n * @param plugin\n * @param {String} filename\n */\n addPlugin(plugin, filename, functionRegistry) {\n this.installedPlugins.push(plugin);\n if (filename) {\n this.pluginCache[filename] = plugin;\n }\n if (plugin.install) {\n plugin.install(this.less, this, functionRegistry || this.less.functions.functionRegistry);\n }\n }\n\n /**\n *\n * @param filename\n */\n get(filename) {\n return this.pluginCache[filename];\n }\n\n /**\n * Adds a visitor. The visitor object has options on itself to determine\n * when it should run.\n * @param visitor\n */\n addVisitor(visitor) {\n this.visitors.push(visitor);\n }\n\n /**\n * Adds a pre processor object\n * @param {object} preProcessor\n * @param {number} priority - guidelines 1 = before import, 1000 = import, 2000 = after import\n */\n addPreProcessor(preProcessor, priority) {\n let indexToInsertAt;\n for (indexToInsertAt = 0; indexToInsertAt < this.preProcessors.length; indexToInsertAt++) {\n if (this.preProcessors[indexToInsertAt].priority >= priority) {\n break;\n }\n }\n this.preProcessors.splice(indexToInsertAt, 0, {preProcessor, priority});\n }\n\n /**\n * Adds a post processor object\n * @param {object} postProcessor\n * @param {number} priority - guidelines 1 = before compression, 1000 = compression, 2000 = after compression\n */\n addPostProcessor(postProcessor, priority) {\n let indexToInsertAt;\n for (indexToInsertAt = 0; indexToInsertAt < this.postProcessors.length; indexToInsertAt++) {\n if (this.postProcessors[indexToInsertAt].priority >= priority) {\n break;\n }\n }\n this.postProcessors.splice(indexToInsertAt, 0, {postProcessor, priority});\n }\n\n /**\n *\n * @param manager\n */\n addFileManager(manager) {\n this.fileManagers.push(manager);\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getPreProcessors() {\n const preProcessors = [];\n for (let i = 0; i < this.preProcessors.length; i++) {\n preProcessors.push(this.preProcessors[i].preProcessor);\n }\n return preProcessors;\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getPostProcessors() {\n const postProcessors = [];\n for (let i = 0; i < this.postProcessors.length; i++) {\n postProcessors.push(this.postProcessors[i].postProcessor);\n }\n return postProcessors;\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getVisitors() {\n return this.visitors;\n }\n\n visitor() {\n const self = this;\n return {\n first: function() {\n self.iterator = -1;\n return self.visitors[self.iterator];\n },\n get: function() {\n self.iterator += 1;\n return self.visitors[self.iterator];\n }\n };\n }\n\n /**\n *\n * @returns {Array}\n * @private\n */\n getFileManagers() {\n return this.fileManagers;\n }\n}\n\nlet pm;\n\nconst PluginManagerFactory = function(less, newFactory) {\n if (newFactory || !pm) {\n pm = new PluginManager(less);\n }\n return pm;\n};\n\n//\nexport default PluginManagerFactory;\n","'use strict';\n\nfunction parseNodeVersion(version) {\n var match = version.match(/^v(\\d{1,2})\\.(\\d{1,2})\\.(\\d{1,2})(?:-([0-9A-Za-z-.]+))?(?:\\+([0-9A-Za-z-.]+))?$/); // eslint-disable-line max-len\n if (!match) {\n throw new Error('Unable to parse: ' + version);\n }\n\n var res = {\n major: parseInt(match[1], 10),\n minor: parseInt(match[2], 10),\n patch: parseInt(match[3], 10),\n pre: match[4] || '',\n build: match[5] || '',\n };\n\n return res;\n}\n\nmodule.exports = parseNodeVersion;\n","/* global window, XMLHttpRequest */\n\nimport AbstractFileManager from '../less/environment/abstract-file-manager.js';\n\nlet options;\nlet logger;\nlet fileCache = {};\n\n// TODOS - move log somewhere. pathDiff and doing something similar in node. use pathDiff in the other browser file for the initial load\nconst FileManager = function() {}\nFileManager.prototype = Object.assign(new AbstractFileManager(), {\n alwaysMakePathsAbsolute() {\n return true;\n },\n\n join(basePath, laterPath) {\n if (!basePath) {\n return laterPath;\n }\n return this.extractUrlParts(laterPath, basePath).path;\n },\n\n doXHR(url, type, callback, errback) {\n const xhr = new XMLHttpRequest();\n const async = options.isFileProtocol ? options.fileAsync : true;\n\n if (typeof xhr.overrideMimeType === 'function') {\n xhr.overrideMimeType('text/css');\n }\n logger.debug(`XHR: Getting '${url}'`);\n xhr.open('GET', url, async);\n xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5');\n xhr.send(null);\n\n function handleResponse(xhr, callback, errback) {\n if (xhr.status >= 200 && xhr.status < 300) {\n callback(xhr.responseText,\n xhr.getResponseHeader('Last-Modified'));\n } else if (typeof errback === 'function') {\n errback(xhr.status, url);\n }\n }\n\n if (options.isFileProtocol && !options.fileAsync) {\n if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) {\n callback(xhr.responseText);\n } else {\n errback(xhr.status, url);\n }\n } else if (async) {\n xhr.onreadystatechange = () => {\n if (xhr.readyState == 4) {\n handleResponse(xhr, callback, errback);\n }\n };\n } else {\n handleResponse(xhr, callback, errback);\n }\n },\n\n supports() {\n return true;\n },\n\n clearFileCache() {\n fileCache = {};\n },\n\n loadFile(filename, currentDirectory, options, environment) {\n // TODO: Add prefix support like less-node?\n // What about multiple paths?\n\n if (currentDirectory && !this.isPathAbsolute(filename)) {\n filename = currentDirectory + filename;\n }\n\n filename = options.ext ? this.tryAppendExtension(filename, options.ext) : filename;\n\n options = options || {};\n\n // sheet may be set to the stylesheet for the initial load or a collection of properties including\n // some context variables for imports\n const hrefParts = this.extractUrlParts(filename, window.location.href);\n const href = hrefParts.url;\n const self = this;\n \n return new Promise((resolve, reject) => {\n if (options.useFileCache && fileCache[href]) {\n try {\n const lessText = fileCache[href];\n return resolve({ contents: lessText, filename: href, webInfo: { lastModified: new Date() }});\n } catch (e) {\n return reject({ filename: href, message: `Error loading file ${href} error was ${e.message}` });\n }\n }\n\n self.doXHR(href, options.mime, function doXHRCallback(data, lastModified) {\n // per file cache\n fileCache[href] = data;\n\n // Use remote copy (re-parse)\n resolve({ contents: data, filename: href, webInfo: { lastModified }});\n }, function doXHRError(status, url) {\n reject({ type: 'File', message: `'${url}' wasn't found (${status})`, href });\n });\n });\n }\n});\n\nexport default (opts, log) => {\n options = opts;\n logger = log;\n return FileManager;\n}\n","import Environment from './environment/environment';\nimport data from './data';\nimport tree from './tree';\nimport AbstractFileManager from './environment/abstract-file-manager';\nimport AbstractPluginLoader from './environment/abstract-plugin-loader';\nimport visitors from './visitors';\nimport Parser from './parser/parser';\nimport functions from './functions';\nimport contexts from './contexts';\nimport LessError from './less-error';\nimport transformTree from './transform-tree';\nimport * as utils from './utils';\nimport PluginManager from './plugin-manager';\nimport logger from './logger';\nimport SourceMapOutput from './source-map-output';\nimport SourceMapBuilder from './source-map-builder';\nimport ParseTree from './parse-tree';\nimport ImportManager from './import-manager';\nimport Parse from './parse';\nimport Render from './render';\nimport { version } from '../../package.json';\nimport parseVersion from 'parse-node-version';\n\nexport default function(environment, fileManagers) {\n let sourceMapOutput, sourceMapBuilder, parseTree, importManager;\n\n environment = new Environment(environment, fileManagers);\n sourceMapOutput = SourceMapOutput(environment);\n sourceMapBuilder = SourceMapBuilder(sourceMapOutput, environment);\n parseTree = ParseTree(sourceMapBuilder);\n importManager = ImportManager(environment);\n\n const render = Render(environment, parseTree, importManager);\n const parse = Parse(environment, parseTree, importManager);\n\n const v = parseVersion(version);\n const initial = {\n version: [v.major, v.minor, v.patch],\n data,\n tree,\n Environment,\n AbstractFileManager,\n AbstractPluginLoader,\n environment,\n visitors,\n Parser,\n functions: functions(environment),\n contexts,\n SourceMapOutput: sourceMapOutput,\n SourceMapBuilder: sourceMapBuilder,\n ParseTree: parseTree,\n ImportManager: importManager,\n render,\n parse,\n LessError,\n transformTree,\n utils,\n PluginManager,\n logger\n };\n\n // Create a public API\n\n const ctor = function(t) {\n return function() {\n const obj = Object.create(t.prototype);\n t.apply(obj, Array.prototype.slice.call(arguments, 0));\n return obj;\n };\n };\n let t;\n const api = Object.create(initial);\n for (const n in initial.tree) {\n /* eslint guard-for-in: 0 */\n t = initial.tree[n];\n if (typeof t === 'function') {\n api[n.toLowerCase()] = ctor(t);\n }\n else {\n api[n] = Object.create(null);\n for (const o in t) {\n /* eslint guard-for-in: 0 */\n api[n][o.toLowerCase()] = ctor(t[o]);\n }\n }\n }\n\n /**\n * Some of the functions assume a `this` context of the API object,\n * which causes it to fail when wrapped for ES6 imports.\n * \n * An assumed `this` should be removed in the future.\n */\n initial.parse = initial.parse.bind(api);\n initial.render = initial.render.bind(api);\n\n return api;\n};\n","import LessError from './less-error';\nimport transformTree from './transform-tree';\nimport logger from './logger';\n\nexport default function(SourceMapBuilder) {\n class ParseTree {\n constructor(root, imports) {\n this.root = root;\n this.imports = imports;\n }\n\n toCSS(options) {\n let evaldRoot;\n const result = {};\n let sourceMapBuilder;\n try {\n evaldRoot = transformTree(this.root, options);\n } catch (e) {\n throw new LessError(e, this.imports);\n }\n\n try {\n const compress = Boolean(options.compress);\n if (compress) {\n logger.warn('The compress option has been deprecated. ' + \n 'We recommend you use a dedicated css minifier, for instance see less-plugin-clean-css.');\n }\n\n const toCSSOptions = {\n compress,\n dumpLineNumbers: options.dumpLineNumbers,\n strictUnits: Boolean(options.strictUnits),\n numPrecision: 8};\n\n if (options.sourceMap) {\n sourceMapBuilder = new SourceMapBuilder(options.sourceMap);\n result.css = sourceMapBuilder.toCSS(evaldRoot, toCSSOptions, this.imports);\n } else {\n result.css = evaldRoot.toCSS(toCSSOptions);\n }\n } catch (e) {\n throw new LessError(e, this.imports);\n }\n\n if (options.pluginManager) {\n const postProcessors = options.pluginManager.getPostProcessors();\n for (let i = 0; i < postProcessors.length; i++) {\n result.css = postProcessors[i].process(result.css, { sourceMap: sourceMapBuilder, options, imports: this.imports });\n }\n }\n if (options.sourceMap) {\n result.map = sourceMapBuilder.getExternalSourceMap();\n }\n\n result.imports = [];\n for (const file in this.imports.files) {\n if (this.imports.files.hasOwnProperty(file) && file !== this.imports.rootFilename) {\n result.imports.push(file);\n }\n }\n return result;\n }\n }\n\n return ParseTree;\n};\n","export default function (SourceMapOutput, environment) {\n class SourceMapBuilder {\n constructor(options) {\n this.options = options;\n }\n\n toCSS(rootNode, options, imports) {\n const sourceMapOutput = new SourceMapOutput(\n {\n contentsIgnoredCharsMap: imports.contentsIgnoredChars,\n rootNode,\n contentsMap: imports.contents,\n sourceMapFilename: this.options.sourceMapFilename,\n sourceMapURL: this.options.sourceMapURL,\n outputFilename: this.options.sourceMapOutputFilename,\n sourceMapBasepath: this.options.sourceMapBasepath,\n sourceMapRootpath: this.options.sourceMapRootpath,\n outputSourceFiles: this.options.outputSourceFiles,\n sourceMapGenerator: this.options.sourceMapGenerator,\n sourceMapFileInline: this.options.sourceMapFileInline, \n disableSourcemapAnnotation: this.options.disableSourcemapAnnotation\n });\n\n const css = sourceMapOutput.toCSS(options);\n this.sourceMap = sourceMapOutput.sourceMap;\n this.sourceMapURL = sourceMapOutput.sourceMapURL;\n if (this.options.sourceMapInputFilename) {\n this.sourceMapInputFilename = sourceMapOutput.normalizeFilename(this.options.sourceMapInputFilename);\n }\n if (this.options.sourceMapBasepath !== undefined && this.sourceMapURL !== undefined) {\n this.sourceMapURL = sourceMapOutput.removeBasepath(this.sourceMapURL);\n }\n return css + this.getCSSAppendage();\n }\n\n getCSSAppendage() {\n\n let sourceMapURL = this.sourceMapURL;\n if (this.options.sourceMapFileInline) {\n if (this.sourceMap === undefined) {\n return '';\n }\n sourceMapURL = `data:application/json;base64,${environment.encodeBase64(this.sourceMap)}`;\n }\n\n if (this.options.disableSourcemapAnnotation) {\n return '';\n }\n\n if (sourceMapURL) {\n return `/*# sourceMappingURL=${sourceMapURL} */`;\n }\n return '';\n }\n\n getExternalSourceMap() {\n return this.sourceMap;\n }\n\n setExternalSourceMap(sourceMap) {\n this.sourceMap = sourceMap;\n }\n\n isInline() {\n return this.options.sourceMapFileInline;\n }\n\n getSourceMapURL() {\n return this.sourceMapURL;\n }\n\n getOutputFilename() {\n return this.options.sourceMapOutputFilename;\n }\n\n getInputFilename() {\n return this.sourceMapInputFilename;\n }\n }\n\n return SourceMapBuilder;\n};\n","export default function (environment) {\n class SourceMapOutput {\n constructor(options) {\n this._css = [];\n this._rootNode = options.rootNode;\n this._contentsMap = options.contentsMap;\n this._contentsIgnoredCharsMap = options.contentsIgnoredCharsMap;\n if (options.sourceMapFilename) {\n this._sourceMapFilename = options.sourceMapFilename.replace(/\\\\/g, '/');\n }\n this._outputFilename = options.outputFilename;\n this.sourceMapURL = options.sourceMapURL;\n if (options.sourceMapBasepath) {\n this._sourceMapBasepath = options.sourceMapBasepath.replace(/\\\\/g, '/');\n }\n if (options.sourceMapRootpath) {\n this._sourceMapRootpath = options.sourceMapRootpath.replace(/\\\\/g, '/');\n if (this._sourceMapRootpath.charAt(this._sourceMapRootpath.length - 1) !== '/') {\n this._sourceMapRootpath += '/';\n }\n } else {\n this._sourceMapRootpath = '';\n }\n this._outputSourceFiles = options.outputSourceFiles;\n this._sourceMapGeneratorConstructor = environment.getSourceMapGenerator();\n\n this._lineNumber = 0;\n this._column = 0;\n }\n\n removeBasepath(path) {\n if (this._sourceMapBasepath && path.indexOf(this._sourceMapBasepath) === 0) {\n path = path.substring(this._sourceMapBasepath.length);\n if (path.charAt(0) === '\\\\' || path.charAt(0) === '/') {\n path = path.substring(1);\n }\n }\n\n return path;\n }\n\n normalizeFilename(filename) {\n filename = filename.replace(/\\\\/g, '/');\n filename = this.removeBasepath(filename);\n return (this._sourceMapRootpath || '') + filename;\n }\n\n add(chunk, fileInfo, index, mapLines) {\n\n // ignore adding empty strings\n if (!chunk) {\n return;\n }\n\n let lines, sourceLines, columns, sourceColumns, i;\n\n if (fileInfo && fileInfo.filename) {\n let inputSource = this._contentsMap[fileInfo.filename];\n\n // remove vars/banner added to the top of the file\n if (this._contentsIgnoredCharsMap[fileInfo.filename]) {\n // adjust the index\n index -= this._contentsIgnoredCharsMap[fileInfo.filename];\n if (index < 0) { index = 0; }\n // adjust the source\n inputSource = inputSource.slice(this._contentsIgnoredCharsMap[fileInfo.filename]);\n }\n\n /** \n * ignore empty content, or failsafe\n * if contents map is incorrect\n */\n if (inputSource === undefined) {\n this._css.push(chunk);\n return;\n }\n\n inputSource = inputSource.substring(0, index);\n sourceLines = inputSource.split('\\n');\n sourceColumns = sourceLines[sourceLines.length - 1];\n }\n\n lines = chunk.split('\\n');\n columns = lines[lines.length - 1];\n\n if (fileInfo && fileInfo.filename) {\n if (!mapLines) {\n this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + 1, column: this._column},\n original: { line: sourceLines.length, column: sourceColumns.length},\n source: this.normalizeFilename(fileInfo.filename)});\n } else {\n for (i = 0; i < lines.length; i++) {\n this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + i + 1, column: i === 0 ? this._column : 0},\n original: { line: sourceLines.length + i, column: i === 0 ? sourceColumns.length : 0},\n source: this.normalizeFilename(fileInfo.filename)});\n }\n }\n }\n\n if (lines.length === 1) {\n this._column += columns.length;\n } else {\n this._lineNumber += lines.length - 1;\n this._column = columns.length;\n }\n\n this._css.push(chunk);\n }\n\n isEmpty() {\n return this._css.length === 0;\n }\n\n toCSS(context) {\n this._sourceMapGenerator = new this._sourceMapGeneratorConstructor({ file: this._outputFilename, sourceRoot: null });\n\n if (this._outputSourceFiles) {\n for (const filename in this._contentsMap) {\n if (this._contentsMap.hasOwnProperty(filename)) {\n let source = this._contentsMap[filename];\n if (this._contentsIgnoredCharsMap[filename]) {\n source = source.slice(this._contentsIgnoredCharsMap[filename]);\n }\n this._sourceMapGenerator.setSourceContent(this.normalizeFilename(filename), source);\n }\n }\n }\n\n this._rootNode.genCSS(context, this);\n\n if (this._css.length > 0) {\n let sourceMapURL;\n const sourceMapContent = JSON.stringify(this._sourceMapGenerator.toJSON());\n\n if (this.sourceMapURL) {\n sourceMapURL = this.sourceMapURL;\n } else if (this._sourceMapFilename) {\n sourceMapURL = this._sourceMapFilename;\n }\n this.sourceMapURL = sourceMapURL;\n\n this.sourceMap = sourceMapContent;\n }\n\n return this._css.join('');\n }\n }\n\n return SourceMapOutput;\n};\n","import contexts from './contexts';\nimport Parser from './parser/parser';\nimport LessError from './less-error';\nimport * as utils from './utils';\nimport logger from './logger';\n\nexport default function(environment) {\n // FileInfo = {\n // 'rewriteUrls' - option - whether to adjust URL's to be relative\n // 'filename' - full resolved filename of current file\n // 'rootpath' - path to append to normal URLs for this node\n // 'currentDirectory' - path to the current file, absolute\n // 'rootFilename' - filename of the base file\n // 'entryPath' - absolute path to the entry file\n // 'reference' - whether the file should not be output and only output parts that are referenced\n\n class ImportManager {\n constructor(less, context, rootFileInfo) {\n this.less = less;\n this.rootFilename = rootFileInfo.filename;\n this.paths = context.paths || []; // Search paths, when importing\n this.contents = {}; // map - filename to contents of all the files\n this.contentsIgnoredChars = {}; // map - filename to lines at the beginning of each file to ignore\n this.mime = context.mime;\n this.error = null;\n this.context = context;\n // Deprecated? Unused outside of here, could be useful.\n this.queue = []; // Files which haven't been imported yet\n this.files = {}; // Holds the imported parse trees.\n }\n\n /**\n * Add an import to be imported\n * @param path - the raw path\n * @param tryAppendExtension - whether to try appending a file extension (.less or .js if the path has no extension)\n * @param currentFileInfo - the current file info (used for instance to work out relative paths)\n * @param importOptions - import options\n * @param callback - callback for when it is imported\n */\n push(path, tryAppendExtension, currentFileInfo, importOptions, callback) {\n const importManager = this, pluginLoader = this.context.pluginManager.Loader;\n\n this.queue.push(path);\n\n const fileParsedFunc = function (e, root, fullPath) {\n importManager.queue.splice(importManager.queue.indexOf(path), 1); // Remove the path from the queue\n\n const importedEqualsRoot = fullPath === importManager.rootFilename;\n if (importOptions.optional && e) {\n callback(null, {rules:[]}, false, null);\n logger.info(`The file ${fullPath} was skipped because it was not found and the import was marked optional.`);\n }\n else {\n // Inline imports aren't cached here.\n // If we start to cache them, please make sure they won't conflict with non-inline imports of the\n // same name as they used to do before this comment and the condition below have been added.\n if (!importManager.files[fullPath] && !importOptions.inline) {\n importManager.files[fullPath] = { root, options: importOptions };\n }\n if (e && !importManager.error) { importManager.error = e; }\n callback(e, root, importedEqualsRoot, fullPath);\n }\n };\n\n const newFileInfo = {\n rewriteUrls: this.context.rewriteUrls,\n entryPath: currentFileInfo.entryPath,\n rootpath: currentFileInfo.rootpath,\n rootFilename: currentFileInfo.rootFilename\n };\n\n const fileManager = environment.getFileManager(path, currentFileInfo.currentDirectory, this.context, environment);\n\n if (!fileManager) {\n fileParsedFunc({ message: `Could not find a file-manager for ${path}` });\n return;\n }\n\n const loadFileCallback = function(loadedFile) {\n let plugin;\n const resolvedFilename = loadedFile.filename;\n const contents = loadedFile.contents.replace(/^\\uFEFF/, '');\n\n // Pass on an updated rootpath if path of imported file is relative and file\n // is in a (sub|sup) directory\n //\n // Examples:\n // - If path of imported file is 'module/nav/nav.less' and rootpath is 'less/',\n // then rootpath should become 'less/module/nav/'\n // - If path of imported file is '../mixins.less' and rootpath is 'less/',\n // then rootpath should become 'less/../'\n newFileInfo.currentDirectory = fileManager.getPath(resolvedFilename);\n if (newFileInfo.rewriteUrls) {\n newFileInfo.rootpath = fileManager.join(\n (importManager.context.rootpath || ''),\n fileManager.pathDiff(newFileInfo.currentDirectory, newFileInfo.entryPath));\n\n if (!fileManager.isPathAbsolute(newFileInfo.rootpath) && fileManager.alwaysMakePathsAbsolute()) {\n newFileInfo.rootpath = fileManager.join(newFileInfo.entryPath, newFileInfo.rootpath);\n }\n }\n newFileInfo.filename = resolvedFilename;\n\n const newEnv = new contexts.Parse(importManager.context);\n\n newEnv.processImports = false;\n importManager.contents[resolvedFilename] = contents;\n\n if (currentFileInfo.reference || importOptions.reference) {\n newFileInfo.reference = true;\n }\n\n if (importOptions.isPlugin) {\n plugin = pluginLoader.evalPlugin(contents, newEnv, importManager, importOptions.pluginArgs, newFileInfo);\n if (plugin instanceof LessError) {\n fileParsedFunc(plugin, null, resolvedFilename);\n }\n else {\n fileParsedFunc(null, plugin, resolvedFilename);\n }\n } else if (importOptions.inline) {\n fileParsedFunc(null, contents, resolvedFilename);\n } else {\n // import (multiple) parse trees apparently get altered and can't be cached.\n // TODO: investigate why this is\n if (importManager.files[resolvedFilename]\n && !importManager.files[resolvedFilename].options.multiple\n && !importOptions.multiple) {\n\n fileParsedFunc(null, importManager.files[resolvedFilename].root, resolvedFilename);\n }\n else {\n new Parser(newEnv, importManager, newFileInfo).parse(contents, function (e, root) {\n fileParsedFunc(e, root, resolvedFilename);\n });\n }\n }\n };\n let loadedFile;\n let promise;\n const context = utils.clone(this.context);\n\n if (tryAppendExtension) {\n context.ext = importOptions.isPlugin ? '.js' : '.less';\n }\n\n if (importOptions.isPlugin) {\n context.mime = 'application/javascript';\n\n if (context.syncImport) {\n loadedFile = pluginLoader.loadPluginSync(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n } else {\n promise = pluginLoader.loadPlugin(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n }\n }\n else {\n if (context.syncImport) {\n loadedFile = fileManager.loadFileSync(path, currentFileInfo.currentDirectory, context, environment);\n } else {\n promise = fileManager.loadFile(path, currentFileInfo.currentDirectory, context, environment,\n (err, loadedFile) => {\n if (err) {\n fileParsedFunc(err);\n } else {\n loadFileCallback(loadedFile);\n }\n });\n }\n }\n if (loadedFile) {\n if (!loadedFile.filename) {\n fileParsedFunc(loadedFile);\n } else {\n loadFileCallback(loadedFile);\n }\n } else if (promise) {\n promise.then(loadFileCallback, fileParsedFunc);\n }\n }\n }\n\n return ImportManager;\n};\n","import * as utils from './utils';\n\nexport default function(environment, ParseTree, ImportManager) {\n const render = function (input, options, callback) {\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(this.options, {});\n }\n else {\n options = utils.copyOptions(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n return new Promise(function (resolve, reject) {\n render.call(self, input, options, function(err, output) {\n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n this.parse(input, options, function(err, root, imports, options) {\n if (err) { return callback(err); }\n\n let result;\n try {\n const parseTree = new ParseTree(root, imports);\n result = parseTree.toCSS(options);\n }\n catch (err) { return callback(err); }\n\n callback(null, result);\n });\n }\n };\n\n return render;\n};\n","import contexts from './contexts';\nimport Parser from './parser/parser';\nimport PluginManager from './plugin-manager';\nimport LessError from './less-error';\nimport * as utils from './utils';\n\nexport default function(environment, ParseTree, ImportManager) {\n const parse = function (input, options, callback) {\n\n if (typeof options === 'function') {\n callback = options;\n options = utils.copyOptions(this.options, {});\n }\n else {\n options = utils.copyOptions(this.options, options || {});\n }\n\n if (!callback) {\n const self = this;\n return new Promise(function (resolve, reject) {\n parse.call(self, input, options, function(err, output) {\n if (err) {\n reject(err);\n } else {\n resolve(output);\n }\n });\n });\n } else {\n let context;\n let rootFileInfo;\n const pluginManager = new PluginManager(this, !options.reUsePluginManager);\n\n options.pluginManager = pluginManager;\n\n context = new contexts.Parse(options);\n\n if (options.rootFileInfo) {\n rootFileInfo = options.rootFileInfo;\n } else {\n const filename = options.filename || 'input';\n const entryPath = filename.replace(/[^\\/\\\\]*$/, '');\n rootFileInfo = {\n filename,\n rewriteUrls: context.rewriteUrls,\n rootpath: context.rootpath || '',\n currentDirectory: entryPath,\n entryPath,\n rootFilename: filename\n };\n // add in a missing trailing slash\n if (rootFileInfo.rootpath && rootFileInfo.rootpath.slice(-1) !== '/') {\n rootFileInfo.rootpath += '/';\n }\n }\n\n const imports = new ImportManager(this, context, rootFileInfo);\n this.importManager = imports;\n\n // TODO: allow the plugins to be just a list of paths or names\n // Do an async plugin queue like lessc\n\n if (options.plugins) {\n options.plugins.forEach(function(plugin) {\n let evalResult, contents;\n if (plugin.fileContent) {\n contents = plugin.fileContent.replace(/^\\uFEFF/, '');\n evalResult = pluginManager.Loader.evalPlugin(contents, context, imports, plugin.options, plugin.filename);\n if (evalResult instanceof LessError) {\n return callback(evalResult);\n }\n }\n else {\n pluginManager.addPlugin(plugin);\n }\n });\n }\n\n new Parser(context, imports, rootFileInfo)\n .parse(input, function (e, root) {\n if (e) { return callback(e); }\n callback(null, root, imports, options);\n }, options);\n }\n };\n return parse;\n};\n","// TODO: Add tests for browser @plugin\n/* global window */\n\nimport AbstractPluginLoader from '../less/environment/abstract-plugin-loader.js';\n\n/**\n * Browser Plugin Loader\n */\nconst PluginLoader = function(less) {\n this.less = less;\n // Should we shim this.require for browser? Probably not?\n};\n\nPluginLoader.prototype = Object.assign(new AbstractPluginLoader(), {\n loadPlugin(filename, basePath, context, environment, fileManager) {\n return new Promise((fulfill, reject) => {\n fileManager.loadFile(filename, basePath, context, environment)\n .then(fulfill).catch(reject);\n });\n }\n});\n\nexport default PluginLoader;\n\n","import * as utils from './utils';\nimport browser from './browser';\n\nexport default (window, less, options) => {\n\n function errorHTML(e, rootHref) {\n const id = `less-error-message:${utils.extractId(rootHref || '')}`;\n const template = '
  • {content}
  • ';\n const elem = window.document.createElement('div');\n let timer;\n let content;\n const errors = [];\n const filename = e.filename || rootHref;\n const filenameNoPath = filename.match(/([^\\/]+(\\?.*)?)$/)[1];\n\n elem.id = id;\n elem.className = 'less-error-message';\n\n content = `

    ${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'}` + \n `

    in ${filenameNoPath} `;\n\n const errorline = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\{content\\}/, e.extract[i]));\n }\n };\n\n if (e.line) {\n errorline(e, 0, '');\n errorline(e, 1, 'line');\n errorline(e, 2, '');\n content += `on line ${e.line}, column ${e.column + 1}:

      ${errors.join('')}
    `;\n }\n if (e.stack && (e.extract || options.logLevel >= 4)) {\n content += `
    Stack Trace
    ${e.stack.split('\\n').slice(1).join('
    ')}`;\n }\n elem.innerHTML = content;\n\n // CSS for error messages\n browser.createCSS(window.document, [\n '.less-error-message ul, .less-error-message li {',\n 'list-style-type: none;',\n 'margin-right: 15px;',\n 'padding: 4px 0;',\n 'margin: 0;',\n '}',\n '.less-error-message label {',\n 'font-size: 12px;',\n 'margin-right: 15px;',\n 'padding: 4px 0;',\n 'color: #cc7777;',\n '}',\n '.less-error-message pre {',\n 'color: #dd6666;',\n 'padding: 4px 0;',\n 'margin: 0;',\n 'display: inline-block;',\n '}',\n '.less-error-message pre.line {',\n 'color: #ff0000;',\n '}',\n '.less-error-message h3 {',\n 'font-size: 20px;',\n 'font-weight: bold;',\n 'padding: 15px 0 5px 0;',\n 'margin: 0;',\n '}',\n '.less-error-message a {',\n 'color: #10a',\n '}',\n '.less-error-message .error {',\n 'color: red;',\n 'font-weight: bold;',\n 'padding-bottom: 2px;',\n 'border-bottom: 1px dashed red;',\n '}'\n ].join('\\n'), { title: 'error-message' });\n\n elem.style.cssText = [\n 'font-family: Arial, sans-serif',\n 'border: 1px solid #e00',\n 'background-color: #eee',\n 'border-radius: 5px',\n '-webkit-border-radius: 5px',\n '-moz-border-radius: 5px',\n 'color: #e00',\n 'padding: 15px',\n 'margin-bottom: 15px'\n ].join(';');\n\n if (options.env === 'development') {\n timer = setInterval(() => {\n const document = window.document;\n const body = document.body;\n if (body) {\n if (document.getElementById(id)) {\n body.replaceChild(elem, document.getElementById(id));\n } else {\n body.insertBefore(elem, body.firstChild);\n }\n clearInterval(timer);\n }\n }, 10);\n }\n }\n\n function removeErrorHTML(path) {\n const node = window.document.getElementById(`less-error-message:${utils.extractId(path)}`);\n if (node) {\n node.parentNode.removeChild(node);\n }\n }\n\n function removeErrorConsole(path) {\n // no action\n }\n\n function removeError(path) {\n if (!options.errorReporting || options.errorReporting === 'html') {\n removeErrorHTML(path);\n } else if (options.errorReporting === 'console') {\n removeErrorConsole(path);\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('remove', path);\n }\n }\n\n function errorConsole(e, rootHref) {\n const template = '{line} {content}';\n const filename = e.filename || rootHref;\n const errors = [];\n let content = `${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'} in ${filename}`;\n\n const errorline = (e, i, classname) => {\n if (e.extract[i] !== undefined) {\n errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n .replace(/\\{class\\}/, classname)\n .replace(/\\{content\\}/, e.extract[i]));\n }\n };\n\n if (e.line) {\n errorline(e, 0, '');\n errorline(e, 1, 'line');\n errorline(e, 2, '');\n content += ` on line ${e.line}, column ${e.column + 1}:\\n${errors.join('\\n')}`;\n }\n if (e.stack && (e.extract || options.logLevel >= 4)) {\n content += `\\nStack Trace\\n${e.stack}`;\n }\n less.logger.error(content);\n }\n\n function error(e, rootHref) {\n if (!options.errorReporting || options.errorReporting === 'html') {\n errorHTML(e, rootHref);\n } else if (options.errorReporting === 'console') {\n errorConsole(e, rootHref);\n } else if (typeof options.errorReporting === 'function') {\n options.errorReporting('add', e, rootHref);\n }\n }\n\n return {\n add: error,\n remove: removeError\n };\n};\n","/**\n * Kicks off less and compiles any stylesheets\n * used in the browser distributed version of less\n * to kick-start less using the browser api\n */\n/* global window, document */\n\nimport defaultOptions from '../less/default-options';\nimport addDefaultOptions from './add-default-options';\nimport root from './index';\n\nconst options = defaultOptions();\n\nif (window.less) {\n for (const key in window.less) {\n if (window.less.hasOwnProperty(key)) {\n options[key] = window.less[key];\n }\n }\n}\naddDefaultOptions(window, options);\n\noptions.plugins = options.plugins || [];\n\nif (window.LESS_PLUGINS) {\n options.plugins = options.plugins.concat(window.LESS_PLUGINS);\n}\n\nconst less = root(window, options);\nexport default less;\n\nwindow.less = less;\n\nlet css;\nlet head;\nlet style;\n\n// Always restore page visibility\nfunction resolveOrReject(data) {\n if (data.filename) {\n console.warn(data);\n }\n if (!options.async) {\n head.removeChild(style);\n }\n}\n\nif (options.onReady) {\n if (/!watch/.test(window.location.hash)) {\n less.watch();\n }\n // Simulate synchronous stylesheet loading by hiding page rendering\n if (!options.async) {\n css = 'body { display: none !important }';\n head = document.head || document.getElementsByTagName('head')[0];\n style = document.createElement('style');\n\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n\n head.appendChild(style);\n }\n less.registerStylesheetsImmediately();\n less.pageLoadFinished = less.refresh(less.env === 'development').then(resolveOrReject, resolveOrReject);\n}\n","// Export a new default each time\nexport default function() {\n return {\n /* Inline Javascript - @plugin still allowed */\n javascriptEnabled: false,\n\n /* Outputs a makefile import dependency list to stdout. */\n depends: false,\n\n /* (DEPRECATED) Compress using less built-in compression. \n * This does an okay job but does not utilise all the tricks of \n * dedicated css compression. */\n compress: false,\n\n /* Runs the less parser and just reports errors without any output. */\n lint: false,\n\n /* Sets available include paths.\n * If the file in an @import rule does not exist at that exact location, \n * less will look for it at the location(s) passed to this option. \n * You might use this for instance to specify a path to a library which \n * you want to be referenced simply and relatively in the less files. */\n paths: [],\n\n /* color output in the terminal */\n color: true,\n\n /* The strictImports controls whether the compiler will allow an @import inside of either \n * @media blocks or (a later addition) other selector blocks.\n * See: https://github.com/less/less.js/issues/656 */\n strictImports: false,\n\n /* Allow Imports from Insecure HTTPS Hosts */\n insecure: false,\n\n /* Allows you to add a path to every generated import and url in your css. \n * This does not affect less import statements that are processed, just ones \n * that are left in the output css. */\n rootpath: '',\n\n /* By default URLs are kept as-is, so if you import a file in a sub-directory \n * that references an image, exactly the same URL will be output in the css. \n * This option allows you to re-write URL's in imported files so that the \n * URL is always relative to the base imported file */\n rewriteUrls: false,\n\n /* How to process math \n * 0 always - eagerly try to solve all operations\n * 1 parens-division - require parens for division \"/\"\n * 2 parens | strict - require parens for all operations\n * 3 strict-legacy - legacy strict behavior (super-strict)\n */\n math: 1,\n\n /* Without this option, less attempts to guess at the output unit when it does maths. */\n strictUnits: false,\n\n /* Effectively the declaration is put at the top of your base Less file, \n * meaning it can be used but it also can be overridden if this variable \n * is defined in the file. */\n globalVars: null,\n\n /* As opposed to the global variable option, this puts the declaration at the\n * end of your base file, meaning it will override anything defined in your Less file. */\n modifyVars: null,\n\n /* This option allows you to specify a argument to go on to every URL. */\n urlArgs: ''\n }\n};","import {addDataAttr} from './utils';\nimport browser from './browser';\n\nexport default (window, options) => {\n\n // use options from the current script tag data attribues\n addDataAttr(options, browser.currentScript(window));\n\n if (options.isFileProtocol === undefined) {\n options.isFileProtocol = /^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(window.location.protocol);\n }\n\n // Load styles asynchronously (default: false)\n //\n // This is set to `false` by default, so that the body\n // doesn't start loading before the stylesheets are parsed.\n // Setting this to `true` can result in flickering.\n //\n options.async = options.async || false;\n options.fileAsync = options.fileAsync || false;\n\n // Interval between watch polls\n options.poll = options.poll || (options.isFileProtocol ? 1000 : 1500);\n\n options.env = options.env || (window.location.hostname == '127.0.0.1' ||\n window.location.hostname == '0.0.0.0' ||\n window.location.hostname == 'localhost' ||\n (window.location.port &&\n window.location.port.length > 0) ||\n options.isFileProtocol ? 'development'\n : 'production');\n\n const dumpLineNumbers = /!dumpLineNumbers:(comments|mediaquery|all)/.exec(window.location.hash);\n if (dumpLineNumbers) {\n options.dumpLineNumbers = dumpLineNumbers[1];\n }\n\n if (options.useFileCache === undefined) {\n options.useFileCache = true;\n }\n\n if (options.onReady === undefined) {\n options.onReady = true;\n }\n\n if (options.relativeUrls) {\n options.rewriteUrls = 'all';\n }\n};\n","//\n// index.js\n// Should expose the additional browser functions on to the less object\n//\nimport {addDataAttr} from './utils';\nimport lessRoot from '../less';\nimport browser from './browser';\nimport FM from './file-manager';\nimport PluginLoader from './plugin-loader';\nimport LogListener from './log-listener';\nimport ErrorReporting from './error-reporting';\nimport Cache from './cache';\nimport ImageSize from './image-size';\n\nexport default (window, options) => {\n const document = window.document;\n const less = lessRoot();\n\n less.options = options;\n const environment = less.environment;\n const FileManager = FM(options, less.logger);\n const fileManager = new FileManager();\n environment.addFileManager(fileManager);\n less.FileManager = FileManager;\n less.PluginLoader = PluginLoader;\n\n LogListener(less, options);\n const errors = ErrorReporting(window, less, options);\n const cache = less.cache = options.cache || Cache(window, options, less.logger);\n ImageSize(less.environment);\n\n // Setup user functions - Deprecate?\n if (options.functions) {\n less.functions.functionRegistry.addMultiple(options.functions);\n }\n\n const typePattern = /^text\\/(x-)?less$/;\n\n function clone(obj) {\n const cloned = {};\n for (const prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n cloned[prop] = obj[prop];\n }\n }\n return cloned;\n }\n\n // only really needed for phantom\n function bind(func, thisArg) {\n const curryArgs = Array.prototype.slice.call(arguments, 2);\n return function() {\n const args = curryArgs.concat(Array.prototype.slice.call(arguments, 0));\n return func.apply(thisArg, args);\n };\n }\n\n function loadStyles(modifyVars) {\n const styles = document.getElementsByTagName('style');\n let style;\n\n for (let i = 0; i < styles.length; i++) {\n style = styles[i];\n if (style.type.match(typePattern)) {\n const instanceOptions = clone(options);\n instanceOptions.modifyVars = modifyVars;\n const lessText = style.innerHTML || '';\n instanceOptions.filename = document.location.href.replace(/#.*$/, '');\n\n /* jshint loopfunc:true */\n // use closure to store current style\n less.render(lessText, instanceOptions,\n bind((style, e, result) => {\n if (e) {\n errors.add(e, 'inline');\n } else {\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = result.css;\n } else {\n style.innerHTML = result.css;\n }\n }\n }, null, style));\n }\n }\n }\n\n function loadStyleSheet(sheet, callback, reload, remaining, modifyVars) {\n\n const instanceOptions = clone(options);\n addDataAttr(instanceOptions, sheet);\n instanceOptions.mime = sheet.type;\n\n if (modifyVars) {\n instanceOptions.modifyVars = modifyVars;\n }\n\n function loadInitialFileCallback(loadedFile) {\n const data = loadedFile.contents;\n const path = loadedFile.filename;\n const webInfo = loadedFile.webInfo;\n\n const newFileInfo = {\n currentDirectory: fileManager.getPath(path),\n filename: path,\n rootFilename: path,\n rewriteUrls: instanceOptions.rewriteUrls\n };\n\n newFileInfo.entryPath = newFileInfo.currentDirectory;\n newFileInfo.rootpath = instanceOptions.rootpath || newFileInfo.currentDirectory;\n\n if (webInfo) {\n webInfo.remaining = remaining;\n\n const css = cache.getCSS(path, webInfo, instanceOptions.modifyVars);\n if (!reload && css) {\n webInfo.local = true;\n callback(null, css, data, sheet, webInfo, path);\n return;\n }\n\n }\n\n // TODO add tests around how this behaves when reloading\n errors.remove(path);\n\n instanceOptions.rootFileInfo = newFileInfo;\n less.render(data, instanceOptions, (e, result) => {\n if (e) {\n e.href = path;\n callback(e);\n } else {\n cache.setCSS(sheet.href, webInfo.lastModified, instanceOptions.modifyVars, result.css);\n callback(null, result.css, data, sheet, webInfo, path);\n }\n });\n }\n\n fileManager.loadFile(sheet.href, null, instanceOptions, environment)\n .then(loadedFile => {\n loadInitialFileCallback(loadedFile);\n }).catch(err => {\n console.log(err);\n callback(err);\n });\n\n }\n\n function loadStyleSheets(callback, reload, modifyVars) {\n for (let i = 0; i < less.sheets.length; i++) {\n loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1), modifyVars);\n }\n }\n\n function initRunningMode() {\n if (less.env === 'development') {\n less.watchTimer = setInterval(() => {\n if (less.watchMode) {\n fileManager.clearFileCache();\n loadStyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n } else if (css) {\n browser.createCSS(window.document, css, sheet);\n }\n });\n }\n }, options.poll);\n }\n }\n\n //\n // Watch mode\n //\n less.watch = function () {\n if (!less.watchMode ) {\n less.env = 'development';\n initRunningMode();\n }\n this.watchMode = true;\n return true;\n };\n\n less.unwatch = function () {clearInterval(less.watchTimer); this.watchMode = false; return false; };\n\n //\n // Synchronously get all tags with the 'rel' attribute set to\n // \"stylesheet/less\".\n //\n less.registerStylesheetsImmediately = () => {\n const links = document.getElementsByTagName('link');\n less.sheets = [];\n\n for (let i = 0; i < links.length; i++) {\n if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) &&\n (links[i].type.match(typePattern)))) {\n less.sheets.push(links[i]);\n }\n }\n };\n\n //\n // Asynchronously get all tags with the 'rel' attribute set to\n // \"stylesheet/less\", returning a Promise.\n //\n less.registerStylesheets = () => new Promise((resolve, reject) => {\n less.registerStylesheetsImmediately();\n resolve();\n });\n\n //\n // With this function, it's possible to alter variables and re-render\n // CSS without reloading less-files\n //\n less.modifyVars = record => less.refresh(true, record, false);\n\n less.refresh = (reload, modifyVars, clearFileCache) => {\n if ((reload || clearFileCache) && clearFileCache !== false) {\n fileManager.clearFileCache();\n }\n return new Promise((resolve, reject) => {\n let startTime;\n let endTime;\n let totalMilliseconds;\n let remainingSheets;\n startTime = endTime = new Date();\n\n // Set counter for remaining unprocessed sheets\n remainingSheets = less.sheets.length;\n\n if (remainingSheets === 0) {\n\n endTime = new Date();\n totalMilliseconds = endTime - startTime;\n less.logger.info('Less has finished and no sheets were loaded.');\n resolve({\n startTime,\n endTime,\n totalMilliseconds,\n sheets: less.sheets.length\n });\n\n } else {\n // Relies on less.sheets array, callback seems to be guaranteed to be called for every element of the array\n loadStyleSheets((e, css, _, sheet, webInfo) => {\n if (e) {\n errors.add(e, e.href || sheet.href);\n reject(e);\n return;\n }\n if (webInfo.local) {\n less.logger.info(`Loading ${sheet.href} from cache.`);\n } else {\n less.logger.info(`Rendered ${sheet.href} successfully.`);\n }\n browser.createCSS(window.document, css, sheet);\n less.logger.info(`CSS for ${sheet.href} generated in ${new Date() - endTime}ms`);\n\n // Count completed sheet\n remainingSheets--;\n\n // Check if the last remaining sheet was processed and then call the promise\n if (remainingSheets === 0) {\n totalMilliseconds = new Date() - startTime;\n less.logger.info(`Less has finished. CSS generated in ${totalMilliseconds}ms`);\n resolve({\n startTime,\n endTime,\n totalMilliseconds,\n sheets: less.sheets.length\n });\n }\n endTime = new Date();\n }, reload, modifyVars);\n }\n\n loadStyles(modifyVars);\n });\n };\n\n less.refreshStyles = loadStyles;\n return less;\n};\n","export default (less, options) => {\n const logLevel_debug = 4;\n const logLevel_info = 3;\n const logLevel_warn = 2;\n const logLevel_error = 1;\n\n // The amount of logging in the javascript console.\n // 3 - Debug, information and errors\n // 2 - Information and errors\n // 1 - Errors\n // 0 - None\n // Defaults to 2\n options.logLevel = typeof options.logLevel !== 'undefined' ? options.logLevel : (options.env === 'development' ? logLevel_info : logLevel_error);\n\n if (!options.loggers) {\n options.loggers = [{\n debug: function(msg) {\n if (options.logLevel >= logLevel_debug) {\n console.log(msg);\n }\n },\n info: function(msg) {\n if (options.logLevel >= logLevel_info) {\n console.log(msg);\n }\n },\n warn: function(msg) {\n if (options.logLevel >= logLevel_warn) {\n console.warn(msg);\n }\n },\n error: function(msg) {\n if (options.logLevel >= logLevel_error) {\n console.error(msg);\n }\n }\n }];\n }\n for (let i = 0; i < options.loggers.length; i++) {\n less.logger.addListener(options.loggers[i]);\n }\n};\n","// Cache system is a bit outdated and could do with work\n\nexport default (window, options, logger) => {\n let cache = null;\n if (options.env !== 'development') {\n try {\n cache = (typeof window.localStorage === 'undefined') ? null : window.localStorage;\n } catch (_) {}\n }\n return {\n setCSS: function(path, lastModified, modifyVars, styles) {\n if (cache) {\n logger.info(`saving ${path} to cache.`);\n try {\n cache.setItem(path, styles);\n cache.setItem(`${path}:timestamp`, lastModified);\n if (modifyVars) {\n cache.setItem(`${path}:vars`, JSON.stringify(modifyVars));\n }\n } catch (e) {\n // TODO - could do with adding more robust error handling\n logger.error(`failed to save \"${path}\" to local storage for caching.`);\n }\n }\n },\n getCSS: function(path, webInfo, modifyVars) {\n const css = cache && cache.getItem(path);\n const timestamp = cache && cache.getItem(`${path}:timestamp`);\n let vars = cache && cache.getItem(`${path}:vars`);\n\n modifyVars = modifyVars || {};\n vars = vars || \"{}\"; // if not set, treat as the JSON representation of an empty object\n\n if (timestamp && webInfo.lastModified &&\n (new Date(webInfo.lastModified).valueOf() ===\n new Date(timestamp).valueOf()) &&\n JSON.stringify(modifyVars) === vars) {\n // Use local copy\n return css;\n }\n }\n };\n};\n","\nimport functionRegistry from './../less/functions/function-registry';\n\nexport default () => {\n function imageSize() {\n throw {\n type: 'Runtime',\n message: 'Image size functions are not supported in browser version of less'\n };\n }\n\n const imageFunctions = {\n 'image-size': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n },\n 'image-width': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n },\n 'image-height': function(filePathNode) {\n imageSize(this, filePathNode);\n return -1;\n }\n };\n\n functionRegistry.addMultiple(imageFunctions);\n};\n"],"names":["extractId","href","replace","addDataAttr","options","tag","opt","dataset","hasOwnProperty","JSON","parse","_","document","styles","sheet","id","title","utils.extractId","oldStyleNode","getElementById","keepOldStyleNode","styleNode","createElement","setAttribute","media","styleSheet","appendChild","createTextNode","childNodes","length","firstChild","nodeValue","head","getElementsByTagName","nextEl","nextSibling","parentNode","insertBefore","removeChild","cssText","e","Error","window","scripts","currentScript","error","msg","this","_fireEvent","warn","info","debug","addListener","listener","_listeners","push","removeListener","i","splice","type","logFunction","externalEnvironment","fileManagers","requiredFunctions","functions","concat","propName","environmentFunc","bind","Environment","filename","currentDirectory","environment","isSync","logger","pluginManager","getFileManagers","fileManager","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","darkgrey","darkgreen","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","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","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","m","cm","mm","in","px","pt","pc","duration","s","ms","angle","rad","Math","PI","deg","grad","turn","colors","unitConversions","parent","visibilityBlocks","undefined","nodeVisible","rootNode","parsed","self","Object","defineProperty","get","fileInfo","getIndex","Node","nodes","set","node","Array","isArray","forEach","_index","_fileInfo","context","strs","genCSS","add","chunk","index","isEmpty","join","output","value","visitor","visit","op","a","b","precision","numPrecision","Number","toFixed","compare","Color","rgb","originalForm","match","map","c","parseInt","alpha","split","clamp","v","max","min","toHex","round","toString","prototype","assign","luma","r","g","pow","toCSS","doNotCompress","color","colorFunction","compress","args","fround","indexOf","toHSL","h","l","toRGB","splitcolor","operate","other","_operate","d","toHSV","toARGB","x","fromKeyword","keyword","key","toLowerCase","slice","Paren","eval","_noSpaceCombinators"," ","|","Combinator","emptyOrWhitespace","trim","spaceOrEmpty","Element","combinator","isVariable","currentFileInfo","visibilityInfo","copyVisibilityInfo","setParent","accept","clone","firstSelector","charAt","ALWAYS","PARENS_DIVISION","PARENS","RewriteUrls","getType","payload","call","copy","target","constructor","getPrototypeOf","il","arguments","k","j","jl","__spreadArrays","getOwnPropertyNames","getOwnPropertySymbols","reduce","carry","props","includes","newVal","originalObject","includeNonenumerable","propType","propertyIsEnumerable","enumerable","writable","configurable","assignProp","nonenumerable","getLocation","inputStream","n","line","column","copyArray","arr","obj","cloned","prop","defaults","obj1","obj2","newObj","_defaults","defaults_1","copyOptions","opts","strictMath","math","Constants.Math","relativeUrls","rewriteUrls","Constants.RewriteUrls","flattenArray","result","length_1","anonymousFunc","LessError","fileContentMap","currentFilename","message","stack","input","contents","loc","utils.getLocation","col","callLine","lines","found","func","Function","lineAdjust","callExtract","extract","create","F","stylize","str","errorTxt","substr","Selector","elements","extendList","condition","evaldCondition","getElements","mixinElements_","visitArray","createDerived","newSelector","mediaEmpty","els","parseNode","err","imports","createEmptySelectors","el","sels","olen","len","mixinElements","shift","isJustParentSelector","extend","getIsOutput","Value","Keyword","True","False","Anonymous","mapLines","rulesetLike","allowRoot","isRulesetLike","Boolean","MATH","Declaration","name","important","merge","inline","variable","lastRule","prevMath","evaldValue","mathBypass","evalName","importantScope","importantResult","pop","makeImportant","ctx","lineSeparator","dumpLineNumbers","debugInfo","asComment","asMediaQuery","lineNumber","fileName","filenameWithProtocol","test","Comment","isLineComment","getDebugInfo","isSilent","isCompressed","contexts","copyFromOriginal","original","destination","propertiesToCopy","parseCopyProperties","Parse","paths","evalCopyProperties","isPathRelative","path","isPathLocalRelative","Eval","frames","enterCalc","calcStack","inCalc","exitCalc","inParenthesis","parensStack","outOfParenthesis","mathOn","isMathOn","pathRequiresRewrite","rewritePath","rootpath","newPath","normalizePath","segment","segments","reverse","makeRegistry","base","_data","addMultiple","keys","_this","getLocalFunctions","inherit","defaultFunc","value_","error_","reset","Ruleset","selectors","rules","strictImports","_lookups","_variables","_properties","isRuleset","selCnt","selector","hasVariable","hasOnePassingSelector","toParseSelectors","utils.flattenArray","rule","subRule","utils.copyArray","ruleset","originalRuleset","root","firstRoot","allowImports","functionRegistry","globalFunctionRegistry","ctxFrames","unshift","ctxSelectors","evalImports","rsRules","evalFirst","mediaBlockCount","mediaBlocks","filter","apply","resetCache","bubbleSelectors","importRules","matchArgs","matchCondition","lastSelector","_rulesets","variables","hash","vars","name_1","properties","name_2","decl","parseValue","property","lastDeclaration","toParse","transformDeclaration","nodes_1","rulesets","filtRules","prependRule","find","foundMixins","ruleNodes","tabLevel","sep","tabRuleStr","tabSetStr","charsetNodeIndex","importNodeIndex","isCharset","pathCnt","pathSubCnt","currentLastRule","isVisible","joinSelectors","joinSelector","createParenthesis","elementsToPak","originalElement","replacementParen","insideParent","createSelector","containedElement","element","addReplacementIntoPath","beginningPath","addPath","replacedElement","originalSelector","newSelectorPath","newJoinedSelector","parentEl","restOfPath","addAllReplacementsIntoPath","addPaths","mergeElementsOnToSelectors","sel","deriveSelector","deriveFrom","newPaths","replaceParentSelector","inSelector","currentElements","newSelectors","selectorsMultiplied","maybeSelector","hadParentSelector","nestedSelector","replaced","nestedPaths","replacedNewSelectors","concatenated","AtRule","isRooted","outputRuleset","mediaPathBackup","mediaBlocksBackup","mediaPath","ruleCnt","DetachedRuleset","callEval","Unit","numerator","denominator","backupUnit","sort","strictUnits","returnStr","is","unitString","toUpperCase","isLength","RegExp","isSingular","callback","usedUnits","group","mapUnit","groupName","atomicUnit","cancel","counter","count","Dimension","unit","parseFloat","isNaN","toColor","strValue","String","convertTo","unify","numericCompare","conversions","targetUnit","applyUnit","derivedConversions","Operation","operands","isSpaced","Expression","noSpacing","returnValue","parens","doubleParen","parensInOp","throwAwayComments","functionCaller","evalArgs","commentFilter","item","subNodes","Call","calc","currentMathContext","funcCaller","FunctionCaller","isValid","columnNumber","Variable","evaluating","frame","fun","Property","mergeRules","less","visitors","ToCSSVisitor","_mergeRules","vArr","Attribute","Quoted","content","escaped","quote","variableRegex","propRegex","containsVariables","that","iterativeReplace","regexp","replacementFnc","evaluatedValue","URL","val","isEvald","urlArgs","Media","features","evalTop","evalNested","multiMedia","permute","fragment","rest","Import","css","pathValue","getPath","isPlugin","reference","isVariableImport","evalForImport","evalPath","doEval","blocksVisibility","addVisibilityBlock","registry","skip","importedFilename","newImport","JsEvalNode","evaluateJavaScript","expression","evalContext","javascriptEnabled","jsify","toJS","JavaScript","string","Assignment","Condition","negate","lvalue","rvalue","UnicodeDescriptor","Negative","Extend","option","object_id","next_id","parent_ids","allowBefore","allowAfter","findSelfSelectors","selectorElements","selfElements","selfSelectors","VariableCall","detachedRuleset","NamespaceValue","ruleCall","lookups","substring","Definition","params","variadic","arity","optionalParameters","required","p","evalParams","mixinEnv","evaldArguments","varargs","arg","isNamedFound","argIndex","argsLength","evalCall","_arguments","mixinFrames","allArgsCnt","requiredArgsCnt","MixinCall","mixins","mixin","mixinPath","argValue","f","isRecursive","isOneFound","candidate","defaultResult","noArgumentsFilter","candidates","conditionResult","calcDefGroup","namespace","expand","MixinDefinition","format","newRules","_setVisibilityToReplacement","replacement","AbstractFileManager","lastIndexOf","ext","tryAppendExtension","basePath","laterPath","url","baseUrl","urlDirectories","baseUrlDirectories","urlParts","extractUrlParts","baseUrlParts","diff","hostPart","directories","urlPartsRegex","returner","rawDirectories","rawPath","fileUrl","require","AbstractPluginLoader","pluginOptions","pluginObj","localModule","shortname","FileManager","trySetOptions","use","exports","loader","tree","validatePlugin","minVersion","compareVersion","addPlugin","plugin","setOptions","version","versionToString","aVersion","bVersion","versionString","plugins","printUsage","_visitArgs","visitDeeper","_hasIndexed","_noop","implementation","_implementation","_visitInCache","_visitOutCache","indexNodeTypes","ticker","child","typeIndex","Visitor","nodeTypeIndex","fnName","impl","funcOut","visitArgs","newNode","isReplacing","cnt","nonReplacing","out","evald","flatten","nestedCnt","nestedItem","onSequencerEmpty","variableImports","_onSequencerEmpty","_currentDepth","ImportSequencer","importSequencer","importItem","isReady","tryRun","variableImport","ImportVisitor","importer","finish","_visitor","_importer","_finish","importCount","onceFileDetectionMap","recursionDetector","_sequencer","run","isFinished","visitImport","importNode","inlineCSS","importParent","addVariableImport","processImportNode","evaldImportNode","multiple","importMultiple","tryAppendLessExtension","onImported","sequencedOnImported","addImport","importedAtRoot","fullPath","importVisitor","isOptional","optional","duplicateImport","oldContext","visitDeclaration","declNode","visitDeclarationOut","visitAtRule","atRuleNode","visitAtRuleOut","visitMixinDefinition","mixinDefinitionNode","visitMixinDefinitionOut","visitRuleset","rulesetNode","visitRulesetOut","visitMedia","mediaNode","visitMediaOut","visible","SetTreeVisibilityVisitor","ensureVisibility","ensureInvisibility","allExtendsStack","ExtendFinderVisitor","allExtends","allSelectorsExtendList","extendOnEveryPath","selectorPath","selExtendList","allSelectorsExtend","foundExtends","firstExtendOnThisSelectorPath","ProcessExtendsVisitor","extendFinder","extendIndices","doExtendChaining","newRoot","checkExtendsForNonMatched","indices","hasFoundMatches","extendsList","extendsListTarget","iterationCount","extendIndex","targetExtendIndex","matches","targetExtend","newExtend","extendsToAdd","extendVisitor","findMatch","selfSelector","extendSelector","extendChainCount","selectorOne","selectorTwo","ruleNode","selectorNode","pathIndex","selectorsToAdd","extendedSelectors","haystackSelectorPath","haystackSelectorIndex","hackstackSelector","hackstackElementIndex","haystackElement","targetCombinator","potentialMatch","needleElements","potentialMatches","matched","initialCombinator","isElementValuesEqual","finished","endPathIndex","endPathElementIndex","elementValue1","elementValue2","replacementSelector","matchIndex","firstElement","newElements","currentSelectorPathIndex","currentSelectorPathElementIndex","currentValue","derived","newAllExtends","lastIndex","JoinSelectorVisitor","_context","CSSVisitorUtils","bodyRules","owner","thing","originalRules","containsSilentNonBlockedChild","compiledRulesBody","keepOnlyVisibleChilds","removeVisibilityBlock","hasVisibleSelector","utils","mixinNode","visitExtend","extendNode","visitComment","commentNode","resolveVisibility","visitAtRuleWithBody","visitAtRuleWithoutBody","visitAnonymous","anonymousNode","nodeRules","hasFakeRuleset","getBodyRules","charset","comment","checkValidNodes","isRoot","_compileRulesetPaths","nodeRuleCnt","_removeDuplicateRules","isVisibleRuleset","ruleList","ruleCache","ruleCSS","groups","groupsArr","result_1","space_1","comma_1","MarkVisibleSelectorsVisitor","ExtendVisitor","furthest","furthestPossibleErrorMessage","chunks","current","currentPos","saveStack","parserInput","skipWhitespace","nextChar","oldi","oldj","curr","endIndex","mem","inp","charCodeAt","autoCommentAbsorb","nextNewLine","text","commentStore","nextStarSlash","save","restore","possibleErrorMessage","state","forget","isWhitespace","offset","pos","code","$re","tok","exec","$char","$str","tokLength","$quoted","startChar","currentPosition","$parseUntil","testChar","returnVal","inComment","blockDepth","blockStack","parseGroups","startPos","lastPos","loop","char","expected","peek","peekChar","currentChar","prevChar","getInput","peekNotNumeric","start","chunkInput","failFunction","fail","lastOpening","lastOpeningParen","lastMultiComment","lastMultiCommentEndBrace","chunkerCurrentIndex","currentChunkStartIndex","cc","cc2","level","parenLevel","emitFrom","emitChunk","force","fromCharCode","chunker","end","furthestReachedEnd","furthestChar","Parser","parsers","getParserInput","expect","expectChar","parseList","currentIndex","returnNodes","parser","additionalData","globalVars","modifyVars","ignored","preText","serializeVars","preProcessors","getPreProcessors","process","banner","contentsIgnoredChars","primary","endInfo","processImports","extendRule","definition","declaration","variableCall","entities","atrule","foundSemiColon","mixinLookup","quoted","forceEscaped","isEscaped","customFuncCall","stop","ieAlpha","boolean","if","prevArgs","isSemiColonSeparated","argsComma","argsSemiColon","assignment","literal","dimension","unicodeDescriptor","entity","ch","variableCurly","curly","propertyCurly","colorKeyword","ud","javascript","js","escape","parsedName","inValue","ruleLookups","isRule","getLookup","hasParens","elem","elemIndex","re","isCall","expressionContainsNamed","nameLoop","expressions","hasSep","cond","argInfo","conditions","block","lookupValue","attribute","slashedCombinator","isLess","when","blockRuleset","hasDR","ruleProperty","permissiveValue","anonymousValue","untilTokens","done","testCurrentChar","import","dir","importOptions","mediaFeatures","o","optionName","importOption","mediaFeature","pluginArgs","nonVendorSpecificName","hasIdentifier","hasExpression","hasUnknown","hasBlock","sub","addition","multiplication","operation","operand","needsParens","logical","next","conditionAnd","negatedCondition","parenthesisCondition","atomicCondition","body","me","tryConditionFollowedByParenthesis","delim","simpleProperty","If","trueValue","falseValue","isdefined","colorFunctions","hsla","origColor","hsl","number","rgba","size","m1_1","m2_1","hue","hsv","hsva","vs","floor","perm","saturation","lightness","hsvhue","hsvsaturation","hsvvalue","luminance","saturate","amount","method","desaturate","lighten","darken","fadein","fadeout","fade","spin","mix","color1","color2","weight","w","w1","w2","greyscale","contrast","dark","light","threshold","t","argb","tint","shade","colorBlend","mode","cb","cs","ar","cr","ab","as","colorBlendModeFunctions","multiply","screen","overlay","softlight","sqrt","hardlight","difference","abs","exclusion","average","negation","getItemsFromNode","_SELF","~","_i","expr","values","range","step","from","to","stepValue","list","each","rs","iterator","tryEval","Quote","valueName","keyName","indexName","MathHelper","fn","mathFunctions","ceil","sin","cos","atan","asin","acos","mathHelper","fraction","num","minMax","isMin","currentUnified","referenceUnified","unitStatic","unitClone","order","convert","pi","mod","y","percentage","evaluated","encodeURI","pattern","flags","%","token","encodeURIComponent","isa","Type","isunit","isruleset","iscolor","isnumber","isstring","iskeyword","isurl","ispixel","ispercentage","isem","get-unit","colorBlending","fallback","functionThis","data-uri","mimetypeNode","filePathNode","mimetype","filePath","entryPath","fragmentStart","utils.clone","rawBuffer","getFileManager","useBase64","mimeLookup","charsetLookup","fileSync","loadFileSync","buf","encodeBase64","uri","dataUri","svg-gradient","direction","stops","gradientDirectionSvg","position","positionValue","gradientType","rectangleDimension","renderEnv","directionValue","throwArgumentDescriptor","types","evaldRoot","evalEnv","visitorIterator","preEvalVisitors","first","isPreEvalVisitor","isPreVisitor","pm","postProcessors","installedPlugins","pluginCache","Loader","PluginLoader","PluginManager","install","preProcessor","priority","indexToInsertAt","postProcessor","manager","PluginManagerFactory","newFactory","major","minor","patch","pre","build","sourceMapOutput","sourceMapBuilder","parseTree","importManager","SourceMapBuilder","ParseTree","transformTree","toCSSOptions","sourceMap","getPostProcessors","file","getExternalSourceMap","files","rootFilename","SourceMapOutput","contentsIgnoredCharsMap","contentsMap","sourceMapFilename","sourceMapURL","outputFilename","sourceMapOutputFilename","sourceMapBasepath","sourceMapRootpath","outputSourceFiles","sourceMapGenerator","sourceMapFileInline","disableSourcemapAnnotation","sourceMapInputFilename","normalizeFilename","removeBasepath","getCSSAppendage","_css","_rootNode","_contentsMap","_contentsIgnoredCharsMap","_sourceMapFilename","_outputFilename","_sourceMapBasepath","_sourceMapRootpath","_outputSourceFiles","_sourceMapGeneratorConstructor","getSourceMapGenerator","_lineNumber","_column","sourceLines","columns","sourceColumns","inputSource","_sourceMapGenerator","addMapping","generated","source","sourceRoot","setSourceContent","sourceMapContent","stringify","toJSON","rootFileInfo","mime","queue","ImportManager","pluginLoader","fileParsedFunc","importedEqualsRoot","newFileInfo","loadedFile","promise","loadFileCallback","resolvedFilename","pathDiff","isPathAbsolute","alwaysMakePathsAbsolute","newEnv","evalPlugin","syncImport","loadPluginSync","loadPlugin","loadFile","then","render","utils.copyOptions","self_1","Promise","resolve","reject","Render","context_1","pluginManager_1","reUsePluginManager","imports_1","evalResult","fileContent","parseVersion","initial","data","ctor","api","fileCache","doXHR","errback","xhr","XMLHttpRequest","async","isFileProtocol","fileAsync","handleResponse","status","responseText","getResponseHeader","overrideMimeType","open","setRequestHeader","send","onreadystatechange","readyState","supports","clearFileCache","location","useFileCache","lessText","webInfo","lastModified","Date","log","fulfill","catch","rootHref","errorReporting","errors","errorline","classname","logLevel","errorConsole","timer","filenameNoPath","className","innerHTML","browser","style","env","setInterval","replaceChild","clearInterval","errorHTML","remove","removeErrorHTML","depends","lint","insecure","protocol","poll","hostname","port","onReady","addDefaultOptions","LESS_PLUGINS","lessRoot","FM","addFileManager","loggers","console","LogListener","ErrorReporting","cache","localStorage","setCSS","setItem","getCSS","getItem","timestamp","valueOf","Cache","imageSize","imageFunctions","image-size","image-width","image-height","ImageSize","typePattern","thisArg","curryArgs","loadStyles","instanceOptions","loadStyleSheet","reload","remaining","local","loadInitialFileCallback","loadStyleSheets","sheets","watch","watchMode","watchTimer","unwatch","registerStylesheetsImmediately","links","rel","registerStylesheets","record","refresh","startTime","endTime","totalMilliseconds","remainingSheets","refreshStyles","resolveOrReject","pageLoadFinished"],"mappings":"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"} \ No newline at end of file diff --git a/packages/less/package-lock.json b/packages/less/package-lock.json index b9b7fe856..cfd7e22a4 100644 --- a/packages/less/package-lock.json +++ b/packages/less/package-lock.json @@ -98,6 +98,40 @@ "fastq": "^1.6.0" } }, + "@rollup/plugin-json": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-4.1.0.tgz", + "integrity": "sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.0.8" + } + }, + "@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "requires": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "dependencies": { + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + } + } + }, "@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", @@ -4306,6 +4340,11 @@ "integrity": "sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0=", "dev": true }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==" + }, "parse-passwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", diff --git a/packages/less/package.json b/packages/less/package.json index 311cc3bac..dffd6d776 100644 --- a/packages/less/package.json +++ b/packages/less/package.json @@ -56,6 +56,7 @@ "devDependencies": { "@less/test-data": "^4.0.0", "@less/test-import-module": "^4.0.0", + "@rollup/plugin-json": "^4.1.0", "@typescript-eslint/eslint-plugin": "^3.3.0", "@typescript-eslint/parser": "^3.3.0", "benny": "^3.6.12", @@ -128,6 +129,7 @@ "sourcearchive": "https://github.com/less/less.js/archive/v", "dependencies": { "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", "tslib": "^1.10.0" } } diff --git a/packages/less/src/less/index.js b/packages/less/src/less/index.js index ab7f7e411..4873f0b31 100644 --- a/packages/less/src/less/index.js +++ b/packages/less/src/less/index.js @@ -18,6 +18,8 @@ import ParseTree from './parse-tree'; import ImportManager from './import-manager'; import Parse from './parse'; import Render from './render'; +import { version } from '../../package.json'; +import parseVersion from 'parse-node-version'; export default function(environment, fileManagers) { let sourceMapOutput, sourceMapBuilder, parseTree, importManager; @@ -31,8 +33,9 @@ export default function(environment, fileManagers) { const render = Render(environment, parseTree, importManager); const parse = Parse(environment, parseTree, importManager); + const v = parseVersion(`v${version}`); const initial = { - version: [4, 0, 0], + version: [v.major, v.minor, v.patch], data, tree, Environment,